<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Automation on Andrew Quinn&#39;s TILs</title>
    <link>https://til.andrew-quinn.me/tags/automation/</link>
    <description>Recent content in Automation on Andrew Quinn&#39;s TILs</description>
    <image>
      <title>Andrew Quinn&#39;s TILs</title>
      <url>https://til.andrew-quinn.me/papermod-cover.png</url>
      <link>https://til.andrew-quinn.me/papermod-cover.png</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 09 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://til.andrew-quinn.me/tags/automation/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>I still like Jenkins</title>
      <link>https://til.andrew-quinn.me/posts/i-still-like-jenkins/</link>
      <pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/i-still-like-jenkins/</guid>
      <description>&lt;p&gt;Before &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;,
before &lt;a href=&#34;https://docs.gitlab.com/ee/ci/&#34;&gt;GitLab CI/CD&lt;/a&gt;,
and before the panoply of startups all promising
to help you build your software faster and with
less hassle, there was the humble,
open source
&lt;a href=&#34;https://www.jenkins.io/&#34;&gt;Jenkins&lt;/a&gt;.
Or perhaps I should say is: Jenkins is still actively
maintained to this day, and has actually been in use
in basically every single place I have worked since
graduating from high school, although not everyone
who was using it was exactly happy with it.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The long death of programming languages</title>
      <link>https://til.andrew-quinn.me/posts/the-long-death-of-programming-languages/</link>
      <pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/the-long-death-of-programming-languages/</guid>
      <description>&lt;p&gt;I wrote my first Clojure program in anger a few months ago.
Only, it&amp;rsquo;s not accurate to
say that I wrote it; AI did most of the writing, and I directed it on what my
design goals were and why.
Architecturally, you could call it was a stateless
&lt;a href=&#34;https://learn.microsoft.com/en-us/azure/architecture/patterns/anti-corruption-layer&#34;&gt;anti-corruption layer&lt;/a&gt;,
yapping between some REST endpoints and some ancient proprietary serialization.&lt;/p&gt;
&lt;p&gt;I had never written a Clojure program of nontrivial size before. Indeed I had
barely touched any Lisp at all
since working through &lt;a href=&#34;https://mitp-content-server.mit.edu/books/content/sectbyfn/books_pres_0/6515/sicp.zip/index.html&#34;&gt;SICP&lt;/a&gt;
during a high school summer vacation, over a decade ago.
That didn&amp;rsquo;t matter. Much more important was emphasizing certain invariants from
the start, like the aforementioned statelessness, which made it very easy to
unit and integration test, which was the true challenge.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Claude Code and executive function</title>
      <link>https://til.andrew-quinn.me/posts/claude-code-and-executive-function/</link>
      <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/claude-code-and-executive-function/</guid>
      <description>&lt;p&gt;I have a suspicion - and let me be clear, that&amp;rsquo;s all this is, a suspicion,
I am taking my own claims even more lightly than usual here - that Claude Code
makes most people&amp;rsquo;s lives better, but it makes the lives of those who struggle with executive
function &lt;em&gt;much&lt;/em&gt; better.&lt;/p&gt;
&lt;p&gt;When I have a problem to solve nowadays, I type &lt;code&gt;c&lt;/code&gt;, then &lt;code&gt;Enter&lt;/code&gt;. This alias opens up a fresh tmux
window with 4 separate instances of Claude Code. Then I just&amp;hellip; pick one and describe the problem
I&amp;rsquo;m thinking about, and hit &lt;code&gt;Enter&lt;/code&gt; again. The loop begins, and suddenly I am collaborating alongside
the closest thing to an IRL &lt;em&gt;deus ex machina&lt;/em&gt; I&amp;rsquo;ve ever seen, for the cost of a few keystrokes.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>It&#39;s okay to solve a problem twice</title>
      <link>https://til.andrew-quinn.me/posts/it-s-okay-to-solve-a-problem-twice/</link>
      <pubDate>Fri, 22 Aug 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/it-s-okay-to-solve-a-problem-twice/</guid>
      <description>&lt;p&gt;Quoth
&lt;a href=&#34;https://www.catb.org/~esr/faqs/hacker-howto.html#believe2&#34;&gt;&amp;ldquo;How to Become a Hacker&amp;rdquo;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2. No problem should ever have to be solved twice.
Creative brains are a valuable, limited resource. They shouldn&#39;t be wasted on re-inventing the wheel when there are so many fascinating new problems waiting out there.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Much more at the original post, including preemptive rebuttals to what
I&amp;rsquo;m about to describe. This post is entirely about cataloguing my own
error.&lt;/p&gt;
&lt;p&gt;I took this maxim, perhaps, a little too close to heart when I was
starting out as a software guy, 15-odd years ago. This is my
apology to past me. Past me, I apologize.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Switching Vim colorschemes based on which keyboard layout I have active</title>
      <link>https://til.andrew-quinn.me/posts/switching-vim-colorschemes-based-on-which-keyboard-layout-i-have-active/</link>
      <pubDate>Sun, 06 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/switching-vim-colorschemes-based-on-which-keyboard-layout-i-have-active/</guid>
      <description>&lt;p&gt;Did you know Vim has a client-server model baked in? Of course it does. If you run&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim --servername LOVE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;, then in another terminal something like&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-1-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-1-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim --servername LOVE --remote-send &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;Cmd&amp;gt;colorscheme peachpuff&amp;lt;CR&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;, you&amp;rsquo;ll find your Vim terminal switch to the creamy default theme all true gangsters
love - without you actually having to do anything.&lt;/p&gt;
&lt;p&gt;I frequently flip between a US- and Finnish-based keyboard while doing
my language studies.
I already had
&lt;a href=&#34;https://news.ycombinator.com/item?id=41519046&#34;&gt;a tiny shell script in place which plays a seventh major chord every time they switch&lt;/a&gt;,
courtesy of
&lt;a href=&#34;https://swaywm.org/&#34;&gt;Sway WM&lt;/a&gt;:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Consider the cronslave</title>
      <link>https://til.andrew-quinn.me/posts/consider-the-cronslave/</link>
      <pubDate>Fri, 30 May 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/consider-the-cronslave/</guid>
      <description>&lt;p&gt;As a nerdy, working-class kid who grew up in the 1990s, knowing what time it
actually was was a luxury I rarely had access to before I was 12 or so and my
parents finally got an Internet connection with its attendant link to the
Network Time Protocol. If you had told me I could have not just a watch but an
entire &lt;em&gt;machine&lt;/em&gt; that&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Never lost the time,&lt;/li&gt;
&lt;li&gt;Did what I wanted, how I wanted it, and&lt;/li&gt;
&lt;li&gt;Could be programmed to do what I want, how I want it &lt;em&gt;on a schedule&lt;/em&gt;,&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I would have had to substantially revise my Christmas wishlist.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Things you should never do: Use Expect to autotype SSH passwords in scripts</title>
      <link>https://til.andrew-quinn.me/posts/things-you-should-never-do-use-tcl-expect-to-type-in-ssh-passwords/</link>
      <pubDate>Wed, 26 Feb 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/things-you-should-never-do-use-tcl-expect-to-type-in-ssh-passwords/</guid>
      <description>&lt;p&gt;Before I moved to Finland, I spent some time in the
Hobbesian war of all against all that is
&lt;a href=&#34;https://gutenberg.org/cache/epub/1156/pg1156-images.html#CHAPTER_I&#34;&gt;Wisconsin&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.
Men were &lt;em&gt;men&lt;/em&gt; back in that less civilized age,
and &amp;ldquo;cybersecurity&amp;rdquo; a ninny-word dreamt up by
social harmony types who honestly
thought they had anything worth stealing in their
servers. For those of us doing &lt;em&gt;real&lt;/em&gt; work, which
I must emphasize &lt;em&gt;you should never do&lt;/em&gt;,
we had
&lt;a href=&#34;https://core.tcl-lang.org/expect/index&#34;&gt;Expect&lt;/a&gt;.
And to SSH automatically into servers
where we didn&amp;rsquo;t have fancy accoutrements like
&amp;ldquo;keys&amp;rdquo; or &amp;ldquo;audit requirements&amp;rdquo;, we did stuff like&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>How I ask GPT-4 to make tiny Python scripts in practice</title>
      <link>https://til.andrew-quinn.me/posts/how-i-ask-gpt-4-to-make-tiny-python-scripts-in-practice/</link>
      <pubDate>Thu, 22 Aug 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/how-i-ask-gpt-4-to-make-tiny-python-scripts-in-practice/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;First get a working script. &amp;ldquo;Hey GPT-4, write me a ChatGPT script that does &lt;X&gt;.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Manually check over the script and iterate until it&amp;rsquo;s giving me what I want.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Now wrap the script into a &lt;a href=&#34;https://click.palletsprojects.com/en/8.1.x/&#34;&gt;&lt;code&gt;click&lt;/code&gt;&lt;/a&gt; command-line interface.&amp;rdquo; I almost always specify to use an &lt;code&gt;--input&lt;/code&gt; flag and an &lt;code&gt;--output&lt;/code&gt; flag.&lt;/li&gt;
&lt;li&gt;If the data it&amp;rsquo;s working with is human-readable, &amp;ldquo;Make it so that if &lt;code&gt;--input&lt;/code&gt; is not specified, it reads data from stdin.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;If the data it&amp;rsquo;s writing is human-readable, &amp;ldquo;Make it so that if &lt;code&gt;--output&lt;/code&gt; is not specified, it emits data to stdout.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;If the script is complicated enough that error logging is warranted: &amp;ldquo;Add logging and &lt;a href=&#34;https://pypi.org/project/colorlog/&#34;&gt;&lt;code&gt;colorlog&lt;/code&gt;&lt;/a&gt;. Ensure all error messages are written to &lt;code&gt;stderr&lt;/code&gt; so that it does not clash with output.&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This advice is optimized for &lt;strong&gt;small&lt;/strong&gt; Python scripts, usually under 200 lines in total,
for automating semi-mundane tasks like&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The highest personal ROI program I have written so far</title>
      <link>https://til.andrew-quinn.me/posts/the-highest-personal-roi-program-i-have-written-so-far/</link>
      <pubDate>Tue, 30 Jul 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/the-highest-personal-roi-program-i-have-written-so-far/</guid>
      <description>&lt;p&gt;It would have to be
&lt;a href=&#34;https://github.com/hiAndrewQuinn/finstem&#34;&gt;finstem&lt;/a&gt;,
a simple command-line program I wrote to
reduce Finnish words down to their root form.&lt;/p&gt;
&lt;p&gt;Finnish is a lot like Latin or Russian in that its words
often become lumbering behemoths of rewritten consonants,
suffixes upon suffixes, and this makes it hard to look up
in a dictionary &amp;ndash; that is, until you factor in its
very regular orthography and the phenomenal
efforts of the Finnish programming industry: &lt;code&gt;finstem&lt;/code&gt; is
basically a very specialized UI for
&lt;a href=&#34;https://voikko.puimula.org/&#34;&gt;the OpenOffice spell checker&lt;/a&gt;,
and I have no shame in admitting that.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Language learning treated as breadth-first search</title>
      <link>https://til.andrew-quinn.me/posts/language-learning-treated-as-breadth-first-search/</link>
      <pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/language-learning-treated-as-breadth-first-search/</guid>
      <description>&lt;p&gt;I am, emphatically, &lt;em&gt;not&lt;/em&gt; the language learning type. I&amp;rsquo;ve done enough of it over my life to know this. It&amp;rsquo;s certainly one of the better hobbies out there: You can do it for free (in principle), you can sink as many hours as you care to into it, and if you get good enough at it you get to reap some unique cultural and economic&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; benefits. But there&amp;rsquo;s a reason I picked up Python when 14 year old me decided he wanted to get ahead in life instead of (say) German.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Check my math - NixOS vs the Most Complicated Program on Earth (MCPOE)</title>
      <link>https://til.andrew-quinn.me/posts/check-my-math-nixos-vs-the-most-complicated-program-on-earth-mcpoe/</link>
      <pubDate>Sun, 14 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/check-my-math-nixos-vs-the-most-complicated-program-on-earth-mcpoe/</guid>
      <description>&lt;p&gt;Imagine you had the &lt;strong&gt;Most Complicated Program On Earth (MCPOE)&lt;/strong&gt;, with
1,000,000 dependencies.&lt;/p&gt;
&lt;p&gt;Every dependency must be build correctly &lt;em&gt;exactly right&lt;/em&gt; or the MCPOE will
fail to compile. MCPOE&amp;rsquo;s 10x dev team chose their packages so
that each dependency has only a 1/1,000,000 chance of having something go wrong
when you&amp;rsquo;re installing them - maybe a whitespace character snuck into the wrong
build script, maybe
&lt;a href=&#34;https://www.bbc.com/future/article/20221011-how-space-weather-causes-computer-errors&#34;&gt;solar wind hit the build computer&lt;/a&gt;.  What are the chances that you will install MCPOE correctly?&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>fd &#43; xargs &#43; bat = quick document review</title>
      <link>https://til.andrew-quinn.me/posts/fd-bat-quick-document-review/</link>
      <pubDate>Sun, 25 Feb 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/fd-bat-quick-document-review/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://github.com/hiAndrewQuinn/til/assets/53230903/0573fe37-3552-464a-adc6-4458b61df612&#34; alt=&#34;output&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been on vacation this week, and part of what I&amp;rsquo;ve been up to is fixing up
the &lt;a href=&#34;https://hiandrewquinn.github.io/selkouutiset-archive/&#34;&gt;Selkouutiset Archive&lt;/a&gt;.
Like &lt;a href=&#34;https://www.build-100-websites.fun/&#34;&gt;most&lt;/a&gt; of my websites these days, SA
is powered by Hugo, which means handling a lot of Markdown documents, which
means I opted to use an &lt;a href=&#34;https://github.com/hiAndrewQuinn/selkouutiset-scrape-cleaned&#34;&gt;intermediate Git repo as a
submodule&lt;/a&gt; to
actually store the custom-processed documents.&lt;/p&gt;
&lt;p&gt;After a few tweaks here and there, I found myself wanting to quickly flip
through all of the Markdown documents I had generated for each news day. I
wasn&amp;rsquo;t &lt;em&gt;exactly&lt;/em&gt; sure what I was looking for, just that I would know it when I
saw it. So:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Getting `fzf` to print the preview pane</title>
      <link>https://til.andrew-quinn.me/posts/getting-fzf-to-print-the-preview-pane/</link>
      <pubDate>Wed, 06 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/getting-fzf-to-print-the-preview-pane/</guid>
      <description>&lt;p&gt;&lt;code&gt;fzf&lt;/code&gt; is an incredibly useful bit of software, &lt;a href=&#34;https://andrew-quinn.me/fzf/&#34;&gt;if someone shows you how to use it&lt;/a&gt;. There&amp;rsquo;s a lot more to it than just fuzzy-switching directories and fuzzy-searching you shell history &amp;ndash; it also comes with a preview pane that updates on every keystroke. Try&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; | fzf --preview &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;echo {q} {q}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;and typing something to see how it works. (&lt;code&gt;{q}&lt;/code&gt; is the &lt;code&gt;q&lt;/code&gt;uery you type in at the bottom of the screen.)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Vagrant lets you wrap VDI images</title>
      <link>https://til.andrew-quinn.me/posts/vagrant-lets-you-wrap-vdi-images/</link>
      <pubDate>Tue, 05 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/vagrant-lets-you-wrap-vdi-images/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://teleste.com/&#34;&gt;At work&lt;/a&gt; I&amp;rsquo;m currently experimenting with using &lt;a href=&#34;https://www.vagrantup.com/&#34;&gt;Vagrant&lt;/a&gt; to automate getting an entire local network of our tiny embedded Linux systems running all on my local box.&lt;/p&gt;
&lt;p&gt;Alas! One of our devices uses a custom Yocto distribution! But wait, we have scripts to run these as VDI images, and apparently that&amp;rsquo;s enough for Vagrant to get to work!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant package --base my-virtual-machine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Further reading materials for future me: &lt;a href=&#34;https://developer.hashicorp.com/vagrant/docs/boxes/base&#34;&gt;Creating a Base Box&lt;/a&gt;, and the &lt;a href=&#34;https://developer.hashicorp.com/vagrant/docs/boxes/format&#34;&gt;Box File Format&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Git aliases for fun and profit</title>
      <link>https://til.andrew-quinn.me/posts/git-aliases-for-fun-and-profit/</link>
      <pubDate>Sun, 03 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/git-aliases-for-fun-and-profit/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/hiAndrewQuinn/haskell-kata&#34;&gt;haskell-kata&lt;/a&gt;&amp;rsquo;s Quickstart now has this neat little ditty at the start:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --local alias.build &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;!sh -c \&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; file in *.hs; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; ghc -o &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;file%.hs&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-bin&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$file&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Git is the gift that keeps on giving. I was on the hunt for a subdirectory-scoped alias, and I just discovered this incredibly flexible way to create new Git subcommands.&lt;/p&gt;
&lt;p&gt;History: 2 years ago I read through the 1200 page behemoth &lt;a href=&#34;https://haskellbook.com/&#34;&gt;&lt;em&gt;Haskell Programming from First Principles&lt;/em&gt;&lt;/a&gt;. (Recommended!) I walked out of that with some 1300 &lt;a href=&#34;https://ankiweb.net/&#34;&gt;Anki flashcards&lt;/a&gt; that I have been chewing through ever since.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Outage postmortem: Why didn&#39;t SelkoArchive get today&#39;s news?</title>
      <link>https://til.andrew-quinn.me/posts/outage-postmortem-why-didn-t-selkoarchive-get-today-s-news/</link>
      <pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/outage-postmortem-why-didn-t-selkoarchive-get-today-s-news/</guid>
      <description>&lt;p&gt;For some reason, my &lt;a href=&#34;https://hiandrewquinn.github.io/selkouutiset-archive/&#34;&gt;daily archive of Finland&amp;rsquo;s &amp;ldquo;clear news&amp;rdquo; broadcast&lt;/a&gt; didn&amp;rsquo;t work today. Why not? TL;DR: Just a Git snafu.&lt;/p&gt;
&lt;p&gt;Quick recap of the archive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There are 3 Git repos:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/hiAndrewQuinn/selkouutiset-scrape&#34;&gt;selkouutiset-scrape&lt;/a&gt; simply scrapes the HTML &lt;a href=&#34;https://yle.fi/selkouutiset&#34;&gt;https://yle.fi/selkouutiset&lt;/a&gt; at 6 PM every day via a Github Action.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/hiAndrewQuinn/selkouutiset-scrape-cleaned&#34;&gt;selkouutiset-scrape-cleaned&lt;/a&gt; pulls in &lt;code&gt;scrape&lt;/code&gt; and turns it into a stack of translated, properly-named Markdown files, by the magic of shell scripts, &lt;code&gt;systemd&lt;/code&gt; timers, and a tiny VM in a datacenter somewhere.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/hiAndrewQuinn/selkouutiset-archive&#34;&gt;selkouutiset-archive&lt;/a&gt; wraps &lt;code&gt;scrape-cleaned&lt;/code&gt; into a comfy Hugo theme, again with the magic of &lt;code&gt;systemd&lt;/code&gt; timers and a tiny VM, and publishes it to Github Pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Which part of the chain broke?&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>One problem with user-scoped `systemd` timers</title>
      <link>https://til.andrew-quinn.me/posts/one-problem-with-user-scoped-systemd-timers/</link>
      <pubDate>Sun, 26 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/one-problem-with-user-scoped-systemd-timers/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve discovered one big downside of [putting &lt;code&gt;systemd&lt;/code&gt; times into &lt;code&gt;~/.config/systemd/user/&lt;/code&gt;][1]: They stop running when you log out.&lt;/p&gt;
&lt;p&gt;Two ways around this problem:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bite the bullet, and install the timers into &lt;code&gt;/etc/systemd/&lt;/code&gt;. This means giving up &lt;a href=&#34;https://www.chezmoi.io/&#34;&gt;chezmoi version control&lt;/a&gt;, making the overall system more snowflake-y. I&amp;rsquo;m not crazy about it.&lt;/li&gt;
&lt;li&gt;Remote in with &lt;code&gt;tmux&lt;/code&gt;, instead of ever logging out, just use &lt;code&gt;C-b d&lt;/code&gt; to detach from the session.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;m going with #2. The lead developer of &lt;code&gt;ktty&lt;/code&gt; is known not to like &lt;code&gt;tmux&lt;/code&gt;, so there&amp;rsquo;s probably a way to detach long-running SSH sections inside of &lt;code&gt;kitty&lt;/code&gt; itself &amp;ndash; but I haven&amp;rsquo;t found it yet. Have you?&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Promoting Blog Tag Reuse with `fzf`</title>
      <link>https://til.andrew-quinn.me/posts/promoting-blog-tag-reuse-with-fzf/</link>
      <pubDate>Sat, 25 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/promoting-blog-tag-reuse-with-fzf/</guid>
      <description>&lt;p&gt;Some more updates to &lt;a href=&#34;https://github.com/hiAndrewQuinn/til&#34;&gt;the main repo&lt;/a&gt; of this TIL site today, in particular I have added a new &lt;code&gt;fzf-tags.fish&lt;/code&gt; script.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;til&lt;/code&gt; uses this script to&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Scrapes all the YAML &lt;code&gt;tags:&lt;/code&gt; frontmatter from all current Markdown posts,&lt;/li&gt;
&lt;li&gt;Puts me into a &lt;a href=&#34;https://github.com/junegunn/fzf#using-the-finder&#34;&gt;multi-select&lt;/a&gt; &lt;code&gt;fzf&lt;/code&gt; menu containing them, and&lt;/li&gt;
&lt;li&gt;Puts anything I select into the &lt;code&gt;tags:&lt;/code&gt; of the new blog post.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tags form natural breadcrumb trails throughout a blog as it grows organically over time. Many an afternoon have I spent reading one or two particular tags of interest from a prolific blog. But, if you don&amp;rsquo;t remember to reuse the tags in the first place, you&amp;rsquo;ll never build the trail in the first place.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>No such thing as a Post-Push Hook</title>
      <link>https://til.andrew-quinn.me/posts/no-such-thing-as-a-post-push-hook/</link>
      <pubDate>Sat, 18 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/no-such-thing-as-a-post-push-hook/</guid>
      <description>&lt;p&gt;Tonight I was hacking away at some more little automations to make this TIL nice and
presentable over at &lt;a href=&#34;https://til.andrew-quinn.me/&#34;&gt;https://til.andrew-quinn.me/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Git has a wonderful system called &amp;ldquo;hooks&amp;rdquo; which live under &lt;code&gt;.git/hooks/&lt;/code&gt;, come loaded
with examples so you can remember how they all work, and &amp;ndash; surprisingly &amp;ndash; don&amp;rsquo;t
contain a local &lt;code&gt;post-push&lt;/code&gt; hook! There&amp;rsquo;s post-receive, but that expects to be able
to run a script on the &lt;em&gt;server&lt;/em&gt; side &amp;ndash; not helpful when I&amp;rsquo;m pushing to one of
Github&amp;rsquo;s many, many anonymous boxes.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
