<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Robert Johnson</title><link>https://robjohnson.dev/</link><description>Recent content on Robert Johnson</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 05 Jul 2024 23:43:00 +0100</lastBuildDate><atom:link href="https://robjohnson.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting Started in Clojure Meta-Guide</title><link>https://robjohnson.dev/posts/clojure-meta-guide/</link><pubDate>Fri, 05 Jul 2024 23:43:00 +0100</pubDate><guid>https://robjohnson.dev/posts/clojure-meta-guide/</guid><description>&lt;p>There are plenty of good guides for Clojure out there but they vary in learning
styles and topics covered. Here I&amp;rsquo;m going to take you through the various guides
you could use to make sure you&amp;rsquo;re not missing any gaps.&lt;/p></description></item><item><title>Bulletproof App Settings with Malli &amp; Aero</title><link>https://robjohnson.dev/posts/malli-and-aero/</link><pubDate>Fri, 21 Jun 2024 17:45:00 +0100</pubDate><guid>https://robjohnson.dev/posts/malli-and-aero/</guid><description>&lt;p>&lt;a href="https://github.com/juxt/aero">Aero&lt;/a> is a great library for pulling external
application settings into your application, but &lt;a href="https://robjohnson.dev/posts/aero-and-integrant/">even if you don&amp;rsquo;t go overboard
with what you put in your config files&lt;/a>, it has
weaknesses. But pairing it together with
&lt;a href="https://github.com/metosin/malli">Malli&lt;/a> we have a recipe for bulletproof
application settings; let&amp;rsquo;s take a look at how they can work together&amp;hellip;&lt;/p></description></item><item><title>Clojure Macro Cheat Sheet</title><link>https://robjohnson.dev/posts/clojure-macro-cheat-sheet/</link><pubDate>Fri, 16 Feb 2024 17:00:00 +0000</pubDate><guid>https://robjohnson.dev/posts/clojure-macro-cheat-sheet/</guid><description>For when you want to remember the key parts of writing Clojure macros,
here&amp;rsquo;s a handy cheat sheet.</description></item><item><title>A Practical Guide to test.check</title><link>https://robjohnson.dev/posts/test-check-guide/</link><pubDate>Fri, 05 Jan 2024 18:10:00 +0000</pubDate><guid>https://robjohnson.dev/posts/test-check-guide/</guid><description>&lt;p>Here&amp;rsquo;s a pragmatic guide to generative testing in Clojure using
&lt;a href="https://github.com/clojure/test.check">test.check&lt;/a>, oriented around
&lt;a href="https://clojure.org/guides/spec">spec&lt;/a>.&lt;/p></description></item><item><title>Better exception output for test.check</title><link>https://robjohnson.dev/posts/better-test-check-ex-output/</link><pubDate>Fri, 29 Sep 2023 18:27:00 +0100</pubDate><guid>https://robjohnson.dev/posts/better-test-check-ex-output/</guid><description>&lt;p>Here&amp;rsquo;s a hack for getting better output when &lt;code>test.check&lt;/code> tests run via
&lt;code>clojure.test&lt;/code> throw exceptions, &lt;a href="https://clojure.atlassian.net/jira/software/c/projects/TCHECK/issues/TCHECK-159">thanks to Dominic Monroe&lt;/a>.&lt;/p></description></item><item><title>Rethinking Config with Aero &amp; Integrant</title><link>https://robjohnson.dev/posts/aero-and-integrant/</link><pubDate>Fri, 22 Sep 2023 17:43:00 +0100</pubDate><guid>https://robjohnson.dev/posts/aero-and-integrant/</guid><description>&lt;p>&lt;a href="https://github.com/juxt/aero">Aero&lt;/a> &amp;amp;
&lt;a href="https://github.com/weavejester/integrant">Integrant&lt;/a> are two fantastic Clojure
libraries used to configure applications. However, I think that there are issues
with the way they often get used; today I&amp;rsquo;m going to look at how they&amp;rsquo;re actually
used best together by keeping them apart.&lt;/p></description></item><item><title>How to Create Responsive Code Blocks</title><link>https://robjohnson.dev/posts/responsive-code-blocks/</link><pubDate>Wed, 23 Aug 2023 17:51:00 +0100</pubDate><guid>https://robjohnson.dev/posts/responsive-code-blocks/</guid><description>A guide on how to adapt code samples for mobile, and why it&amp;rsquo;s worth the effort.</description></item><item><title>A Developer's Guide to Blogging</title><link>https://robjohnson.dev/posts/dev-blogging-guide/</link><pubDate>Tue, 15 Aug 2023 23:33:00 +0100</pubDate><guid>https://robjohnson.dev/posts/dev-blogging-guide/</guid><description>&lt;p>So you&amp;rsquo;re a developer looking to start a blog? In this guide I&amp;rsquo;m going to take
you through running your own blog site, from domain names &amp;amp; site creation to SEO
&amp;amp; syndication.&lt;/p></description></item><item><title>Emacs Lisp Cheat Sheet for Clojure Developers</title><link>https://robjohnson.dev/posts/elisp-cheat-sheet-for-clojure-devs/</link><pubDate>Fri, 21 Jul 2023 18:30:00 +0100</pubDate><guid>https://robjohnson.dev/posts/elisp-cheat-sheet-for-clojure-devs/</guid><description>&lt;p>If you&amp;rsquo;re a Clojure dev and you&amp;rsquo;re looking to learn Elisp, you have a great head
start since you know a lisp dialect already. Here&amp;rsquo;s a concise guide which
focuses on the main differences between the two languages.&lt;/p></description></item><item><title>Everyday Editor Extensions in Emacs</title><link>https://robjohnson.dev/posts/everyday-editor-extensions-in-emacs/</link><pubDate>Thu, 01 Jun 2023 08:43:04 +0100</pubDate><guid>https://robjohnson.dev/posts/everyday-editor-extensions-in-emacs/</guid><description>&lt;p>I had always assumed that it would be too hard and boring to get to grips with Elisp. But I don&amp;rsquo;t know why I held off for so long - you can get a lot of bang for your back with just a little Elisp, and what&amp;rsquo;s more it&amp;rsquo;s pretty fun too!
In this post I want to do a few things:&lt;/p>
&lt;ol>
&lt;li>Encourage any Emacs users that haven&amp;rsquo;t used Elisp yet to give it a try&lt;/li>
&lt;li>Highlight some key useful Elisp functions&lt;/li>
&lt;li>Provide some examples &amp;amp; inspiration for creating your own extensions (whether you&amp;rsquo;re an Elisp newbie or not)&lt;/li>
&lt;/ol></description></item><item><title>Thin (ish) Clojure jars for better docker containers</title><link>https://robjohnson.dev/posts/thin-clj-jars/</link><pubDate>Mon, 22 May 2023 18:00:00 +0100</pubDate><guid>https://robjohnson.dev/posts/thin-clj-jars/</guid><description>&lt;p>Recently &lt;a href="https://robjohnson.dev/posts/thin-jars/">I&amp;rsquo;ve been creating &amp;ldquo;thin&amp;rdquo; jars for my Java
applications&lt;/a>,
in order to avoid the waste caused by putting uberjars in containers.
I thought I&amp;rsquo;d try the same for Clojure AOT-compiled uberjars.&lt;/p>
&lt;p>The bad news: we can&amp;rsquo;t get &lt;em>all&lt;/em> the way there; the good news: we can get pretty
close - at the very least, a concrete improvement over containerized uberjars.&lt;/p></description></item><item><title>How to create thin jars for better Docker caching</title><link>https://robjohnson.dev/posts/thin-jars/</link><pubDate>Fri, 12 May 2023 15:23:00 +0000</pubDate><guid>https://robjohnson.dev/posts/thin-jars/</guid><description>&lt;p>There&amp;rsquo;s plenty of advice around on how to create small Docker containers, but
what is often missed is the value of making your main application layer as small
as possible. In this article I&amp;rsquo;m going to show you how to how to do this for a
Java application, and why it matters.&lt;/p></description></item></channel></rss>