<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>Practicalli Software Engineering Guides</title><description>Practical software engineering guides, including Lean and Agile principles and practices, with a focus on Clojure programming language and Clojure REPL driven development</description><link>https://practical.li/</link><atom:link href="https://practical.li/feed_rss_created.xml" rel="self" type="application/rss+xml" /> <managingEditor>Practicalli</managingEditor><docs>https://github.com/practicalli/practicalli.github.io</docs><language>en</language> <pubDate>Sun, 15 Feb 2026 01:53:25 -0000</pubDate> <lastBuildDate>Sun, 15 Feb 2026 01:53:25 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.17.9</generator> <image> <url>https://github.com/practicalli/graphic-design/blob/live/logos/practicalli-logo.png?raw=true</url> <title>Practicalli Software Engineering Guides</title> <link>https://practical.li/</link> </image> <item> <title>Advantages of writing documentation for code</title> <author>Practicalli Johnny</author> <category>documentation</category> <category>documentation</category> <description>&lt;p&gt;Code that executes correctly and provides only limited value to the business can still be a huge maintenance burden.&lt;/p&gt; &lt;p&gt;Code is very rarely written to include why is was added, what is the purpose of this code.&lt;/p&gt; &lt;p&gt;Dismiss the value of adding documentation that describes the why of the code significantly increases the cost of maintaining and extending that code. Skipping documentation adds to the engineering debt of any solution (even when the intention is to re-write that code).&lt;/p&gt;</description> <link>https://practical.li/blog/advantages-of-writing-documentation-for-code/</link> <pubDate>Wed, 16 Apr 2025 23:14:53 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/advantages-of-writing-documentation-for-code/</guid> <enclosure url="https://practical.li/assets/images/social/blog/advantages-of-writing-documentation-for-code.png" type="image/png" length="70571" /> </item> <item> <title>Essential tooling for Clojure development</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>clojure</category> <description>&lt;p&gt;&lt;img alt=&#34;alternative text&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/clojure-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;Clojure development benefits from great tooling focused around an editor.&lt;/p&gt; &lt;p&gt;Autocomplete, refactor tools, diagnostics feedback and syntax highlighting enhance the creation and modification of code. &lt;/p&gt; &lt;p&gt;Evaluating in source code and using data inspectors for the results provides an effective interaction with the REPL.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Practicalli encourages editors that provide user actions driven exclusively via the keyboard and an uncluttered user interface.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Practicalli Clojure provides &lt;a href=&#34;https://practical.li/clojure/clojure-editors/&#34;&gt;:fontawesome-solid-book-open: an overview of Clojure editors&lt;/a&gt; and the plugins that provide Clojure support, e.g. Emacs, Neovim, VS Code, Pulsar and Sublime. &lt;/p&gt; &lt;p&gt;??? HINT &#34;Practicalli preferred editors&#34; LightTable was the editor used in the early years of learning Clojure as it was simple to use and provided instant feedback as code was typed.&lt;/p&gt; &lt;pre&gt;&lt;code&gt;Once Spacemacs was release, Emacs with CIDER became the predominant editor for many years. Treemacs and LSP have matured so [Neovim and Conjure](https://practical.li/neovim/) has been adopted to provide a fast editing environment with streamlined key bindings for Clojure development. &lt;/code&gt;&lt;/pre&gt;</description> <link>https://practical.li/blog/essential-tooling-for-clojure-development/</link> <pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/essential-tooling-for-clojure-development/</guid> <enclosure url="https://practical.li/assets/images/social/blog/essential-tooling-for-clojure-development.png" type="image/png" length="64905" /> </item> <item> <title>Safeguard against Git Commit Spoofing</title> <author>Practicalli Johnny</author> <category>git</category> <category>git</category> <description>&lt;p&gt;&lt;img alt=&#34;alternative text&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/github-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;Git Commit Spoofing is where a person uses the Git identity of another person to modify commits pushed to GitHub, assuming they can obtain write permission to a branch or via a PR.&lt;/p&gt; &lt;p&gt;Signing is especially useful for those contributing changes via a pull request. Signing provides greater confidence that the contribution is from a verifyable account.&lt;/p&gt; &lt;p&gt;Working in the Financial sector for many years, signing of commits has become manditory to reduce risk and increase traceability for audit trails.&lt;/p&gt; &lt;p&gt;All Practicalli commits are now signed using a passphrase protected SSH key, registered as a signing key with the GitHub account. All contributions via pull request should be also be signed, either with GPG or SSH keys.&lt;/p&gt;</description> <link>https://practical.li/blog/safeguard-against-git-commit-spoofing/</link> <pubDate>Sat, 20 Jan 2024 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/safeguard-against-git-commit-spoofing/</guid> <enclosure url="https://practical.li/assets/images/social/blog/safeguard-against-git-commit-spoofing.png" type="image/png" length="68179" /> </item> <item> <title>Build Emacs from source on Debian Linux</title> <author>Practicalli Johnny</author> <category>debian</category> <category>emacs</category> <category>emacs</category> <category>spacemacs</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Emacs Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/emacs-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;Emacs 29 is the current stable release, adding major features: Eglot LSP client, Tree-Sitter language parser and &lt;code&gt;package.el&lt;/code&gt; package install from Git repositories. &lt;/p&gt; &lt;p&gt;Building from source is a convenient way to try Emacs features in advance, especially useful for those maintaining or developing new tools on top of Emacs.&lt;/p&gt; &lt;p&gt;??? INFO &#34;Emacs 29 Features&#34; &lt;a href=&#34;https://blog.phundrak.com/emacs-29-what-can-we-expect/&#34;&gt;Emacs 29 - what to expect&lt;/a&gt; - a brief summary of the major features&lt;/p&gt;</description> <link>https://practical.li/blog/build-emacs-from-source-on-debian-linux/</link> <pubDate>Sat, 21 Oct 2023 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/build-emacs-from-source-on-debian-linux/</guid> <enclosure url="https://practical.li/assets/images/social/blog/build-emacs-from-source-on-debian-linux.png" type="image/png" length="67625" /> </item> <item> <title>Expose Clojure Service using Ngrok</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>clojure</category> <category>ngrok</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/clojure-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;Exposing a local running services can be valuable when writing apps and web-hooks for Cloud API products, e.g. Slack, Atlassian Confluence, Hasura, Salesforce, etc.&lt;/p&gt; &lt;p&gt;ngrok exposes local networked services behinds NATs and firewalls to the public internet over a secure tunnel.&lt;/p&gt; &lt;p&gt;&lt;a href=&#34;https://ngrok.com/signup&#34;&gt;Create a free ngrok account&lt;/a&gt; to get an authorisation token for use with the ngrok agent to create a secure tunnel. Or add an SSH public key to use SSH reverse tunnel with the ngrok service.&lt;/p&gt;</description> <link>https://practical.li/blog/expose-clojure-service-using-ngrok/</link> <pubDate>Thu, 24 Aug 2023 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/expose-clojure-service-using-ngrok/</guid> <enclosure url="https://practical.li/assets/images/social/blog/expose-clojure-service-using-ngrok.png" type="image/png" length="67975" /> </item> <item> <title>Pin Emacs packages to manage issues</title> <author>Practicalli Johnny</author> <category>emacs</category> <category>emacs</category> <category>spacemacs</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/emacs-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;Emacs provides a huge amount of features via packages. Community configurations like Spacmacs orchestrate packages so they work seemlessly together. It is rare, but sometimes a package will have a breaking issue.&lt;/p&gt; &lt;p&gt;&lt;a href=&#34;https://melpa.org/#/&#34;&gt;Melpa&lt;/a&gt; provides (5,544) up-to-date packages automatically built from each projects Git repository. Builds are defined by a recipe for each package.&lt;/p&gt; &lt;p&gt;A custom recipe can be used to control which version of a package is used with the Emacs configuration, to work around issues or changes to a package.&lt;/p&gt;</description> <link>https://practical.li/blog/pin-emacs-packages-to-manage-issues/</link> <pubDate>Tue, 15 Aug 2023 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/pin-emacs-packages-to-manage-issues/</guid> <enclosure url="https://practical.li/assets/images/social/blog/pin-emacs-packages-to-manage-issues.png" type="image/png" length="66242" /> </item> <item> <title>Accessing AWS with Clojure from scratch - simple approach</title> <category>aws</category> <category>clojure</category> <category>cognitect-labs</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli AWS topic logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/aws-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;&lt;a href=&#34;https://github.com/cognitect-labs/aws-api&#34;&gt;:fontawesome-brands-github: Cognitect Labs AWS API&lt;/a&gt;{target=_blank} is an excellent data driven Clojure library for interacting with AWS from code. The project includes working code examples.&lt;/p&gt; &lt;p&gt;The biggest challenge for those new to AWS is to configuring suitable AWS accounts, programmatic access and service permissions.&lt;/p&gt; &lt;p&gt;This article starts with nothing and steps through the simplest and quickest AWS account and permission setup, using the &lt;a href=&#34;https://aws.amazon.com/free/&#34;&gt;:globe_with_meridians: AWS Free Tier&lt;/a&gt;{target=_blank}. &lt;/p&gt; &lt;p&gt;!!! INFO &#34;Service quota limits&#34; Each service has itos own quota limits and some services are only free for a period of time (free trials &amp;amp; 12 months free).&lt;/p&gt; &lt;p&gt;The approach outlined is not intended for commercial work, only the bare essentials to start exploring what is possible with the Cognitect Labs library. Or try &lt;a href=&#34;https://localstack.cloud/&#34;&gt;:globe_with_meridians: LocalStack if docker is installed locally&lt;/a&gt;{target=_blank}.&lt;/p&gt;</description> <link>https://practical.li/blog/accessing-aws-with-clojure-from-scratch---simple-approach/</link> <pubDate>Wed, 17 May 2023 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/accessing-aws-with-clojure-from-scratch---simple-approach/</guid> <enclosure url="https://practical.li/assets/images/social/blog/accessing-aws-with-clojure-from-scratch---simple-approach.png" type="image/png" length="81363" /> </item> <item> <title>Docker: a simple workflow for Clojure</title> <author>Practicalli Johnny</author> <category>docker</category> <category>docker</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/docker-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;Docker enables a consistent approach to building and running Clojure projects along with a range of other services locally (database, cache, streams, etc.), The Clojure project is built from source when starting services (a &lt;code&gt;watch&lt;/code&gt; feature can rebuild on code changes). Heath checks and conditions are set to ensure dependant services start in the correct order.&lt;/p&gt; &lt;p&gt;Running Docker is relatively fast once image overlays (layers) are cached on their first run, so its a viable approach for local system integration testing and acceptance testing, before pushing changes to a remote Continuous Integration service.&lt;/p&gt; &lt;p&gt;A Docker workflow complements a &lt;a href=&#34;https://practical.li/clojure/introduction/repl-workflow/&#34;&gt;:fontawesome-solid-book-open: REPL Driven Development workflow&lt;/a&gt;{target=_blank}, it does not replace it. The main development effort should be more effective via a REPL connected editor with Docker Compose focused on orchestration of services.&lt;/p&gt; &lt;p&gt;!!! HINT &#34;Deeper into Docker&#34; &lt;a href=&#34;https://practical.li/engineering-playbook/continuous-integration/docker/clojure-multi-stage-dockerfile/&#34;&gt;:fontawesome-solid-book-open: Practicalli Engineering Playbook&lt;/a&gt;{target=_blank} covers Docker and Compose in more detail&lt;/p&gt;</description> <link>https://practical.li/blog/docker-a-simple-workflow-for-clojure/</link> <pubDate>Mon, 15 May 2023 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/docker-a-simple-workflow-for-clojure/</guid> <enclosure url="https://practical.li/assets/images/social/blog/docker-a-simple-workflow-for-clojure.png" type="image/png" length="65774" /> </item> <item> <title>Create deps-new templates for Clojure CLI projects</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>clojure-cli</category> <category>clojure-cli</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/clojure-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;Templates are great way to learn how to assemble Clojure libraries into a working project and can save considerable time when creating new projects by providing common configuration, development tools, dependencies and code used by the engineering team.&lt;/p&gt; &lt;p&gt;&lt;a href=&#34;https://github.com/seancorfield/deps-new&#34;&gt;:fontawesome-brands-github: seancorfield/deps-new&lt;/a&gt; provides a simple to understand approach to defining templates. Declarative rules express how file templates are copied to create a new project. Substitution values are passed to &lt;code&gt;{{unique-key}}&lt;/code&gt; placeholders in template files creating a specific project each time. Programmatic transformation is also supported for significant customisation, e.g. adding options to templates.&lt;/p&gt; &lt;p&gt;&lt;a href=&#34;https://github.com/practicalli/project-templates&#34;&gt;:fontawesome-brands-github: practicalli/project-templates&lt;/a&gt; is a new project to provide comprehensive templates to support production level workflows, including Dockerfile configuration, GitHub continuous integration workflows, etc . Read on to see how the first template was built and learn tips to building your own templates.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;deps-new provides a &lt;a href=&#34;https://github.com/seancorfield/deps-new/blob/develop/doc/templates.md#programmatic-transformation&#34;&gt;:fontawesome-brands-github: guide to writing templates&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;</description> <link>https://practical.li/blog/create-deps-new-templates-for-clojure-cli-projects/</link> <pubDate>Thu, 30 Mar 2023 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/create-deps-new-templates-for-clojure-cli-projects/</guid> <enclosure url="https://practical.li/assets/images/social/blog/create-deps-new-templates-for-clojure-cli-projects.png" type="image/png" length="74491" /> </item> <item> <title>London Clojurians Community - a relatively brief history</title> <author>Practicalli Johnny</author> <category>community</category> <category>events</category> <category>london-clojurians</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Community Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/community-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;The London Clojurian community started in 2009 when Robert Rees tricked Bruce Durling into organsing monthly events. From those humble beginnings the community has grown close to 4,000 members with several monthly events taking place fairly consistently over the last 14 years (5 events in 1 month was the record).&lt;/p&gt; &lt;p&gt;The community has thrived due to the hard work of a great many people and this article probably misses out on a lot of activities (especially in the early years). I would like to thank everyone involved in organising events, hosting events and attending events. Without you there would not be a community.&lt;/p&gt; &lt;p&gt;I steped down as one of the main organisers having delegated all of the work to many other people. The last decade of community work has been very rewarding, but its time for other to continue the work. I now focus on the &lt;a href=&#34;https://practical.li/&#34;&gt;:fontawesome-solid-book-open: Practicalli educational websites&lt;/a&gt;{target=_blank} for learning and using Clojure effectively.&lt;/p&gt;</description> <link>https://practical.li/blog/london-clojurians-community---a-relatively-brief-history/</link> <pubDate>Fri, 10 Mar 2023 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/london-clojurians-community---a-relatively-brief-history/</guid> <enclosure url="https://practical.li/assets/images/social/blog/london-clojurians-community---a-relatively-brief-history.png" type="image/png" length="70197" /> </item> <item> <title>Build and run Clojure with Multi-stage Dockerfile</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>docker</category> <category>docker</category> <category>java</category> <category>jvm</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/docker-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;Deployment of a Clojure service is very simple, requiring only an Uberjar (archive file containing the Clojure Project and Clojure run-time) and the Java Run-time Environment (JRE).&lt;/p&gt; &lt;p&gt;A Clojure service rarely works in isolation and although many services are access via a network connection (defined in Environment Variables), provisioning containers to build and run Clojure along with any other services can be valuable as complexity of the architecture grows.&lt;/p&gt; &lt;p&gt;A &lt;a href=&#34;https://github.com/practicalli/clojure-app-template/blob/main/Dockerfile&#34;&gt;Multi-stage &lt;code&gt;Dockerfile&lt;/code&gt;&lt;/a&gt; is an effective way to build and run Clojure projects in continuous integration pipelines and during local development where multiple services are required for testing.&lt;/p&gt; &lt;p&gt;&lt;a href=&#34;https://hub.docker.com/&#34;&gt;Docker Hub&lt;/a&gt; provides a wide range of images, supporting development, continuous integration and system integration testing.&lt;/p&gt;</description> <link>https://practical.li/blog/build-and-run-clojure-with-multi-stage-dockerfile/</link> <pubDate>Sun, 30 Oct 2022 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/build-and-run-clojure-with-multi-stage-dockerfile/</guid> <enclosure url="https://practical.li/assets/images/social/blog/build-and-run-clojure-with-multi-stage-dockerfile.png" type="image/png" length="71877" /> </item> <item> <title>FreeDesktop.org XDG standard for Clojure development tools</title> <author>Practicalli Johnny</author> <category>clojure-cli</category> <category>debian</category> <category>debian</category> <category>emacs</category> <category>neovim</category> <description>&lt;p&gt;&lt;img alt=&#34;Debian Linux Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/debian-linux-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;The &lt;a href=&#34;https://www.freedesktop.org/wiki/Specifications/basedir-spec/&#34;&gt;:globe_with_meridians: FreeDesktop.org XDG basedir standard&lt;/a&gt;{target=_blank} defines specific locations to store all user configuration, data files and caches.&lt;/p&gt; &lt;p&gt;Without the XDG standard, these files and directories are often mixed together and stored in the &lt;code&gt;$HOME&lt;/code&gt; of the users account, making it more challenging to backup or version control.&lt;/p&gt; &lt;p&gt;Development tools such as NeoVim, Emacs, Clojure CLI and Clojure LSP support the XDG specification, although some tools like Leiningen required a little help. There are simple approaches to work-around the limitations of tools that don&#39;t conform.&lt;/p&gt;</description> <link>https://practical.li/blog/freedesktoporg-xdg-standard-for-clojure-development-tools/</link> <pubDate>Mon, 16 May 2022 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/freedesktoporg-xdg-standard-for-clojure-development-tools/</guid> <enclosure url="https://practical.li/assets/images/social/blog/freedesktoporg-xdg-standard-for-clojure-development-tools.png" type="image/png" length="72370" /> </item> <item> <title>Building Emacs 28 on Ubuntu Linux</title> <author>Practicalli Johnny</author> <category>emacs</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/emacs-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;Emacs 28.1 is &lt;a href=&#34;https://www.masteringemacs.org/article/whats-new-in-emacs-28-1&#34; title=&#34;What is new in Emacs 28.1&#34;&gt;a feature packed release&lt;/a&gt; and includes native compilation to significantly increase the speed of all Emacs software packages installed. This is a very noticeable difference, especially when Emacs is at the center of your developer workflow.&lt;/p&gt; &lt;p&gt;Ubuntu hasn&#39;t packaged Emacs 28.1 yet, although its &lt;em&gt;usually&lt;/em&gt; straight forward to build Emacs yourself.&lt;/p&gt;</description> <link>https://practical.li/blog/building-emacs-28-on-ubuntu-linux/</link> <pubDate>Mon, 16 May 2022 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/building-emacs-28-on-ubuntu-linux/</guid> <enclosure url="https://practical.li/assets/images/social/blog/building-emacs-28-on-ubuntu-linux.png" type="image/png" length="63705" /> </item> <item> <title>Automate Cryogen Clojure blog with GitHub Actions</title> <author>Practicalli Johnny</author> <category>cryogen</category> <category>github-action</category> <category>static-site</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/cryogen-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;&lt;a href=&#34;./clojure-powered-blogging-with-cryogen.md&#34;&gt;Practicalli uses Cryogen static site generator for its blog website&lt;/a&gt;. Cryogen is fast and simple to use thanks to the Clojure EDN file used for configuration.&lt;/p&gt; &lt;p&gt;Cryogen documentation shows &lt;a href=&#34;https://cryogenweb.org/docs/deploying-to-github-pages.html&#34;&gt;how to publish a Cryogen blog to GitHub pages&lt;/a&gt; using Git command. The deployment can be automated using GitHub actions, so that a new version of the site is deployed when Pull Requests are merged to the specified branch (or on direct commits to that branch).&lt;/p&gt;</description> <link>https://practical.li/blog/automate-cryogen-clojure-blog-with-github-actions/</link> <pubDate>Sat, 28 Aug 2021 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/automate-cryogen-clojure-blog-with-github-actions/</guid> <enclosure url="https://practical.li/assets/images/social/blog/automate-cryogen-clojure-blog-with-github-actions.png" type="image/png" length="77926" /> </item> <item> <title>Web Scraping with Clojure - Scraping Hacker News</title> <author>Practicalli Johnny</author> <category>clojure</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/clojure-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;&lt;a href=&#34;https://github.com/cgrand/enlive&#34;&gt;Enlive&lt;/a&gt;{target=_blank} is a Clojure library that can be used for generating dynamic server-side content as well as scraping websites.&lt;/p&gt; &lt;p&gt;Scraping websites is sometimes required when they do not provide an API. Although Hacker News does have an API, will show how to scrape its website using Enlive&#39;s selectors.&lt;/p&gt;</description> <link>https://practical.li/blog/web-scraping-with-clojure---scraping-hacker-news/</link> <pubDate>Fri, 13 Mar 2020 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/web-scraping-with-clojure---scraping-hacker-news/</guid> <enclosure url="https://practical.li/assets/images/social/blog/web-scraping-with-clojure---scraping-hacker-news.png" type="image/png" length="81461" /> </item> <item> <title>Clojure Advent Of Code - a fun way to learn</title> <author>Practicalli Johnny</author> <category>clojure</category> <category>code-challenge</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/clojure-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;Advent of Code is the annual coding challenge with a festive theme. Each day there is a new challenge in two parts, the first fairly easy the second a little more involved. The challenges are an investment of your time to complete them all, although even trying just a few is enough to help you think in different ways.&lt;/p&gt; &lt;p&gt;Every programming language requires regular practice to maintain your skills. A full time developer role gives you lots of opportunities to practice every day, however, its often focused in around solving problems within a specific business domain, with little time to explore others. The Advent of Code puts you in a different domain, so its great for extending your coding experiences.&lt;/p&gt; &lt;p&gt;Solving challenges in a different language is another great way to extend your experiences, so here are some tips and examples for solving the advent of code in Clojure.&lt;/p&gt; &lt;!-- GitHub issue --&gt; &lt;!-- https://github.com/practicalli/blog-content/issues/22 --&gt;</description> <link>https://practical.li/blog/clojure-advent-of-code---a-fun-way-to-learn/</link> <pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/clojure-advent-of-code---a-fun-way-to-learn/</guid> <enclosure url="https://practical.li/assets/images/social/blog/clojure-advent-of-code---a-fun-way-to-learn.png" type="image/png" length="71318" /> </item> <item> <title>Advent Of Parens 2019 - feast on Clojure this holiday season</title> <author>Practicalli Johnny</author> <category>advent-of-parens</category> <category>clojure</category> <category>clojure</category> <description>&lt;!-- GitHub issue: --&gt; &lt;!-- https://github.com/practicalli/blog-content/issues/34 --&gt; &lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/clojure-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;The holiday season is know for over indulge, so why not stuff your head full of Clojure and functional programming. Its far healthier than the alternatives :)&lt;/p&gt; &lt;p&gt;To help you indulge, &lt;a href=&#34;https://lambdaisland.com/blog/2019-11-25-advent-of-parens&#34;&gt;Arne from LambdaIsland&lt;/a&gt;{target=_blank}, &lt;a href=&#34;https://porkostomus.gitlab.io/&#34;&gt;Bobby Towers&lt;/a&gt;{target=_blank}, &lt;a href=&#34;https://alexanderoloo.com/&#34;&gt;Alexander Oloo&lt;/a&gt;{target=_blank} and I are writing a blog post each day as part of the Advent Of Parens 2019 celebration. Every day we plan to publish a short posts that share tips and experiences with functional programming and Clojure.&lt;/p&gt; &lt;p&gt;You can find the articles I am planning to write on the &lt;a href=&#34;https://github.com/practicalli/blog-content/projects/1?card_filter_query=label%3Aadvent-of-parens&#34;&gt;:fontawesome-brands-github: practicalli blog project board&lt;/a&gt;{target=_blank}.&lt;/p&gt; &lt;p&gt;While you wait to open these posts each day of December, I am kickstarting your feast of Clojure in this article.&lt;/p&gt; &lt;p&gt;I also encourage you to take some time over the holiday season to practice Clojure&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;./clojure-advent-of-code-2019.md&#34;&gt;Clojure Advent of Code&lt;/a&gt;{target=_blank}&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=MZcuL4lRw5E&amp;amp;list=PLpr9V-R8ZxiDjyU7cQYWOEFBDR1t7t0wv&#34;&gt;:fontawesome-brands-youtube: Practicalli Clojure study group&lt;/a&gt;{target=_blank}&lt;/li&gt; &lt;/ul&gt;</description> <link>https://practical.li/blog/advent-of-parens-2019---feast-on-clojure-this-holiday-season/</link> <pubDate>Sun, 01 Dec 2019 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/advent-of-parens-2019---feast-on-clojure-this-holiday-season/</guid> <enclosure url="https://practical.li/assets/images/social/blog/advent-of-parens-2019---feast-on-clojure-this-holiday-season.png" type="image/png" length="76336" /> </item> <item> <title>Clojure powered blogging with Cryogen</title> <author>Practicalli Johnny</author> <category>blogging</category> <category>cryogen</category> <category>cryogen</category> <category>static-site</category> <description>&lt;p&gt;&lt;img alt=&#34;Practicalli Clojure Logo&#34; src=&#34;https://github.com/practicalli/graphic-design/blob/live/topic-images/cryogen-logo-name.png?raw=true&#34;&gt;{align=right loading=lazy style=&#34;width:240px&#34;}&lt;/p&gt; &lt;p&gt;A blog website shouldnt need a complex content management system. A simple and lightweight static website generator can create engaging websites that are simple to manage with Git.&lt;/p&gt; &lt;p&gt;Cryogen is a static site generator written in Clojure, allowing content to be written in either markdown or asciidoc. Posts and pages are configured with Clojure hash-maps to manage the meta-data and layout information for each post.&lt;/p&gt; &lt;p&gt;Cryogen seems very quick to generate a site and a local server can be run to automatically generate an updated website when changes to posts and pages are saved.&lt;/p&gt;</description> <link>https://practical.li/blog/clojure-powered-blogging-with-cryogen/</link> <pubDate>Sun, 20 Oct 2019 00:00:00 +0000</pubDate> <source url="https://practical.li/feed_rss_created.xml">Practicalli Software Engineering Guides</source><guid isPermaLink="true">https://practical.li/blog/clojure-powered-blogging-with-cryogen/</guid> <enclosure url="https://practical.li/assets/images/social/blog/clojure-powered-blogging-with-cryogen.png" type="image/png" length="69787" /> </item> </channel> </rss>