<?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>Andrew Quinn&#39;s TILs</title>
    <link>https://til.andrew-quinn.me/</link>
    <description>Recent content 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</language>
    <lastBuildDate>Wed, 01 Jan 3000 00:00:00 +0000</lastBuildDate><atom:link href="https://til.andrew-quinn.me/index.xml" rel="self" type="application/rss+xml" />
    <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>Claude Code disproportionately benefits those who touch type</title>
      <link>https://til.andrew-quinn.me/posts/claude-code-disproportionately-benefits-those-who-touch-type/</link>
      <pubDate>Sat, 24 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/claude-code-disproportionately-benefits-those-who-touch-type/</guid>
      <description>&lt;p&gt;I use Claude Code. I like Claude Code. According to
&lt;a href=&#34;https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04&#34;&gt;Steve Yegge&amp;rsquo;s&lt;/a&gt;
&lt;a href=&#34;http://www.timothyleary.info/8circuit.html&#34;&gt;Eight-Circuit Model of Claudesciousness&lt;/a&gt;,
I&amp;rsquo;m a pretty solid Stage 6, edging into 7 on heavy days.
I think most engineers, most of the time, can get most of
their work done faster with one of these tools than not,
although the force multiplier of that speedup is probably
not as extreme as it is in my case. Why is that?&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Lua is a pretty good config language</title>
      <link>https://til.andrew-quinn.me/posts/lua-is-a-pretty-good-config-language/</link>
      <pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/lua-is-a-pretty-good-config-language/</guid>
      <description>&lt;p&gt;Lua and Scheme occupy curiously similar places in my noggin, becuase my
primary use case for both has been as scripting languages embedded into other,
larger projects. Lua of course is basically designed for this job, but it&amp;rsquo;s
a solid intermediate format to target even if you have no immediate intentions
to use the programming language parts at all. A TSV file 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;&#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;&#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;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10.0.0.5  192.168.1.1 80  tcp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10.0.0.6  192.168.1l.1  443 tcp
&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;can be given a lot more structure on the cheap
by writing a small transpiler of sorts to turn it into&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Copy-Item is 27 percent slower than File Explorer drag and drop on Windows</title>
      <link>https://til.andrew-quinn.me/posts/copy-item-is-27-percent-slower-than-file-explorer-drag-and-drop-on-windows/</link>
      <pubDate>Sat, 06 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/copy-item-is-27-percent-slower-than-file-explorer-drag-and-drop-on-windows/</guid>
      <description>&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;&#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;&#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;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-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-3&#34;&gt;3&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-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-4&#34;&gt;4&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-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-5&#34;&gt;5&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;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;File Explorer drag &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&lt;/span&gt; drop     ########## (112 MBps)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Copy-Item                     #######    (82 MBps)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Built in SFTP client          ######     (70 MBps)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Built in robocopy (/MT:32)    ##         (25 MBps)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WSL 2 rsync                   #          (13 MBps)
&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;In table form:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Tool&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Speed (MBps)&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Difference&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Drag and drop&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~112&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&amp;mdash;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Copy-Item&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~82&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-27%&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;sftp&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~70&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-37%&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;robocopy&lt;/code&gt; (with &lt;code&gt;/MT:32&lt;/code&gt;)&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~25 MBps&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-78%&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rsync&lt;/code&gt; (WSL 2)&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;~13 MBps&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;-88%&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I feel like I&amp;rsquo;m losing my mind.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>&#34;Courage to quit&#34; matters more for seniors, less for juniors</title>
      <link>https://til.andrew-quinn.me/posts/courage-to-quit-matters-more-for-seniors-less-for-juniors/</link>
      <pubDate>Sat, 29 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/courage-to-quit-matters-more-for-seniors-less-for-juniors/</guid>
      <description>&lt;p&gt;As a teenager first getting into computers in the late 2000s I spent a lot of
time reading old
revered tomes like
&lt;a href=&#34;https://www.catb.org/~esr/writings/taoup/html/&#34;&gt;ESR&amp;rsquo;s &lt;em&gt;The Art of Unix Programming&lt;/em&gt;&lt;/a&gt;
and
&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;
.
If present-day me were to isekai back in time and lose all of the technical
knowledge I had but retain my current instincts, however, I would have left
all of this on the table and just built a terrible new automation tool for
&lt;a href=&#34;https://www.kingdomofloathing.com/login.php?loginid=09ca9334301941af8f94438812a5e6f0&#34;&gt;the surprisingly scriptable MMORPG I was into&lt;/a&gt;
in PHP 5, with as much disregard for clean code and security practices
that I could muster[^1].
Then I would have put that tool online, continued to add new features to the
ball of mud, and kept it running for 5-10 years before my first post-college
interview. And then the vibe that would come across is less &amp;ldquo;He&amp;rsquo;s an egghead,
and we like that, but we really need someone who actually does things&amp;rdquo; and
more &amp;ldquo;He&amp;rsquo;s a meathead, but inside of that meathead is an egghead waiting to
be revealed. We need this kind of junior dev yesterday.&amp;rdquo;
I would have done this even though
&lt;a href=&#34;https://github.com/kolmafia/kolmafia&#34;&gt;an objectively far superior tool&lt;/a&gt;
had already existed for quite some time,
making this project &amp;ldquo;feel like&amp;rdquo; dead weight in the wide world of software!
But why?&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Lessons learned from 2 years of operating a teensy-tiny news archive</title>
      <link>https://til.andrew-quinn.me/posts/lessons-learned-from-2-years-of-operating-a-tiny-news-archive/</link>
      <pubDate>Mon, 27 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/lessons-learned-from-2-years-of-operating-a-tiny-news-archive/</guid>
      <description>&lt;p&gt;I began running
&lt;a href=&#34;https://hiandrewquinn.github.io/selkouutiset-archive/&#34;&gt;Andrew&amp;rsquo;s Selkouutiset Archive&lt;/a&gt;
almost exactly two years ago, with a simple goal:
Create a straightforward way for Finnish language learners
to access the simple news broadcast by YYYY-MM-DD.
It has basically accomplished that goal, with only a few tweaks here
and there to keep everything running.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://til.andrew-quinn.me/posts/lessons-learned-from-6-months-of-operating-a-teensy-tiny-news-archive/&#34;&gt;Earlier in the series: Lessons learned from 6 months of operating a teensy-tiny news archive&lt;/a&gt;.
I stand by those points, and have some more to add here at the 24-month
mark.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Four things that help me avoid / manage mild RSI</title>
      <link>https://til.andrew-quinn.me/posts/four-things-that-help-me-avoid-manage-mild-rsi/</link>
      <pubDate>Fri, 10 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/four-things-that-help-me-avoid-manage-mild-rsi/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Where is the DevOps for Yocto?</title>
      <link>https://til.andrew-quinn.me/posts/where-is-the-devops-for-yocto/</link>
      <pubDate>Sat, 27 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/where-is-the-devops-for-yocto/</guid>
      <description>&lt;p&gt;The cozy world of DevOps has spoiled me with tools like Ansible,
Terraform, and Packer. In the situations where I have a Linux machine
already booted up, and sometimes already connected to the Internet, I
can make things really easy on myself by slinging these tools in my
usual way for repeatable, reproducible machines that may or may not come
with the attendant headaches of immutable infrastructure (sorry, Nix,
I&amp;rsquo;m not in love with you, I&amp;rsquo;m in love with the idea of you).&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>LLMs solve the biggest problem with language textbooks</title>
      <link>https://til.andrew-quinn.me/posts/llms-solve-the-biggest-problem-with-language-textbooks/</link>
      <pubDate>Thu, 25 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/llms-solve-the-biggest-problem-with-language-textbooks/</guid>
      <description>&lt;p&gt;Most languages have at least one high quality textbook written for
secondary learners of the language. (This is no guarantee that one will
be able to read the language &lt;em&gt;that&lt;/em&gt; textbook is written in, but English
to X is quite common, and some intrepid textbook writers have solved
this problem by writing the textbook in the very language it is being
taught in, starting with the simplest possible phrases and moving
gradually up in difficulty.)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Code should be clean because business isn&#39;t</title>
      <link>https://til.andrew-quinn.me/posts/code-should-be-clean-because-business-isn-t/</link>
      <pubDate>Sat, 20 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/code-should-be-clean-because-business-isn-t/</guid>
      <description>&lt;p&gt;I am an &lt;a href=&#34;http://www.daviddfriedman.com/The_Machinery_of_Freedom_.pdf&#34;&gt;ardent&lt;/a&gt; capitalist.
I am also an &lt;a href=&#34;https://www.catb.org/esr/writings/taoup/html/ch01s07.html&#34;&gt;ardent&lt;/a&gt; Unix philosopher.
I have long percieved there to be some &lt;em&gt;interesting&lt;/em&gt; tensions between
these &lt;a href=&#34;https://knowyourmeme.com/memes/inside-you-there-are-two-wolves&#34;&gt;two wolves inside me&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Unix philosopher in me wants my code to
be as simple and flexible as possible, and - not always, but often -
to minimize the number of lines of code I need to sling to solve a
given problem.&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; The capitalist in me wants to cover as many edge
cases as possible, make every transition as smooth as possible, and
apply as much napalm to the fire of user acquisition and douse its twin
flame user churn in &lt;a href=&#34;https://liquiddeath.com/en-se/products/mountainwater&#34;&gt;liquid death of another kind&lt;/a&gt;. What to do?&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>tarsnap is cozy</title>
      <link>https://til.andrew-quinn.me/posts/tarsnap-is-cozy/</link>
      <pubDate>Wed, 10 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/tarsnap-is-cozy/</guid>
      <description>&lt;p&gt;I have been aware of
&lt;a href=&#34;https://www.tarsnap.com/&#34;&gt;tarsnap&lt;/a&gt;
for a long time, but only recently did I actually
&lt;a href=&#34;https://andrew-quinn.me/digital-resiliency-2025/#backing-up-the-crown-jewels-with-tarsnap-mac-linux&#34;&gt;get around to using it&lt;/a&gt;
for anything, as a result of my big
&lt;a href=&#34;https://andrew-quinn.me/digital-resiliency-2025/&#34;&gt;personal digital resiliency audit for 2025&lt;/a&gt;.
For those of you not in the know, tarsnap is
&amp;ldquo;online backups for the truly paranoid&amp;rdquo;, and
&lt;code&gt;tarsnap&lt;/code&gt; the command-line program is the client-side
tool you invoke to actually zip up and push your
archives into the vault. Its creator,
&lt;a href=&#34;https://www.daemonology.net/&#34;&gt;Dr. Colin Percival&lt;/a&gt;,
is a really smart and interesting dude for a whole
bunch of reasons. I&amp;rsquo;m led to believe the whole
business is basically a two-man show between him and
his brother these days.&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>You don&#39;t need CGO to use SQLite in your Go binary</title>
      <link>https://til.andrew-quinn.me/posts/you-don-t-need-cgo-to-use-sqlite-in-your-go-binary/</link>
      <pubDate>Fri, 18 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/you-don-t-need-cgo-to-use-sqlite-in-your-go-binary/</guid>
      <description>&lt;p&gt;At least not for most use cases. You can just use
&lt;a href=&#34;https://pkg.go.dev/modernc.org/sqlite#section-readme&#34;&gt;modernc.org/sqlite&lt;/a&gt;
instead as your SQLite driver.&lt;/p&gt;
&lt;p&gt;For people who aren&amp;rsquo;t in the Go know, &amp;ldquo;pure&amp;rdquo; Go programs are trivially
easy to compile cross-platform to all the major platforms by default.
You read that right - you can just &lt;code&gt;go build&lt;/code&gt; a single Windows
executable, Mac executable, and Linux executable &lt;em&gt;on the same machine&lt;/em&gt;
and just ship it:&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;&#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;&#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;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-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-3&#34;&gt; 3&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-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-4&#34;&gt; 4&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-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-5&#34;&gt; 5&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-6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-6&#34;&gt; 6&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-7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-7&#34;&gt; 7&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-8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-8&#34;&gt; 8&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-9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-9&#34;&gt; 9&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-10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-10&#34;&gt;10&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-11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-11&#34;&gt;11&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-12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-12&#34;&gt;12&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-13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-13&#34;&gt;13&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-14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-14&#34;&gt;14&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;&#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;&lt;span style=&#34;color:#75715e&#34;&gt;# This can all happen on the same box!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export CGO_ENABLED&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# no c cross-compilation please&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export GOOS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;linux
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GOARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;amd64 go build -o hello-linux-amd64 hello.go
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GOARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm64 go build -o hello-linux-arm64 hello.go
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export GOOS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;darwin   &lt;span style=&#34;color:#75715e&#34;&gt;# aka mac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GOARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;amd64 go build -o hello-darwin-amd64 hello.go
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GOARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm64 go build -o hello-darwin-arm64 hello.go
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export GOOS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;windows
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GOARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;amd64 go build -o hello-windows-amd64.exe hello.go
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GOARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;arm64 go build -o hello-windows-arm64.exe hello.go
&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;This was the real reason I chose Go over Python for
&lt;a href=&#34;https://github.com/hiAndrewQuinn/tsk/&#34;&gt;&lt;code&gt;tsk&lt;/code&gt;, my instant-search Finnish to English pocket dictionary&lt;/a&gt;.
I wanted to be able to give Windows users a single &lt;code&gt;.exe&lt;/code&gt; they could
just &lt;em&gt;run&lt;/em&gt; and have work out of the box.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Incentivize grandchildren by writing them into your will</title>
      <link>https://til.andrew-quinn.me/posts/incentivize-grandchildren-by-writing-them-into-your-will/</link>
      <pubDate>Wed, 16 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/incentivize-grandchildren-by-writing-them-into-your-will/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s no secret that I&amp;rsquo;m a fan of
economics-inspired solutions to otherwise hard problems.
The other day I happened across an old post by GMU economist
&lt;a href=&#34;https://www.betonit.ai/p/a_natalist_provhtml&#34;&gt;Bryan Caplan&lt;/a&gt; which
I think does this very elegantly, for a problem of some interest to me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The vast majority of wills evenly divide the residuary estate between children.  Mine evenly divides the residuary estate between (children and grandchildren).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I like this a lot. It makes it unambiguously clear where your priorities
in the case of your untimely demise lie. It is also self-reinforcing;
children of yours who have no children themselves will recieve less,
but when it comes time to write their own wills, they won&amp;rsquo;t have any
children or grandchildren to bequeath to anyway. Children of yours who
have many children themselves, perhaps inspired by this very policy,
might decide in the end they were duped - but it seems far more likely
to me they&amp;rsquo;ll cite it as one of the biggest reasons they ultimately
went for 4 instead of 3, or 2 instead of 1, or 1 instead of none. After
seeing it work in practice on themselves, they might decide they want
to incentivize bringing their own grandchildren into being in kind.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The second wave of spaced repetition apps</title>
      <link>https://til.andrew-quinn.me/posts/the-second-wave-of-spaced-repetition-apps/</link>
      <pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/the-second-wave-of-spaced-repetition-apps/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;gwern.net/spaced-repetition&#34;&gt;Spaced repetition&lt;/a&gt;
has been around for a long time.
If you&amp;rsquo;ve never heard the term before, it&amp;rsquo;s best described as
&lt;em&gt;flashcards on timers&lt;/em&gt;.
an algorithm such as
&lt;a href=&#34;https://github.com/thyagoluciano/sm2&#34;&gt;SM-2&lt;/a&gt;
or the more recent
&lt;a href=&#34;https://github.com/open-spaced-repetition/fsrs4anki&#34;&gt;FSRS&lt;/a&gt;
keeps track of how you did on the flashcard,
makes a guess as to how long it could possibly wait
to show you the flashcard again before you below, say,
a 90% chance of getting it right the next time,
and then schedules the flashcard for a new day.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Experiment registry: Can I simply enjoy everything I do?</title>
      <link>https://til.andrew-quinn.me/posts/experiment-registry-can-i-simply-enjoy-everything-i-do/</link>
      <pubDate>Mon, 07 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/experiment-registry-can-i-simply-enjoy-everything-i-do/</guid>
      <description>&lt;p&gt;&lt;strong&gt;N.B.&lt;/strong&gt;: If I link you to this personally, it is to
explain why I usually seem to be in a great mood.
It&amp;rsquo;s an experiment.
I&amp;rsquo;m normally in merely a good mood,
and I am pushing myself to be great.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is an unusual entry for a Today I Learned site,
even by my standards.
But I think it&amp;rsquo;s
something I would prefer to pre-register ahead of time.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always been predisposed to mirth. I laugh easily; I rarely get
depressed; I&amp;rsquo;m just about always in a content mood these days, in no
small part because I have actually succeeded on the meager goals I set
for myself as a teenager (soulmate: check, child: check,
sujuvuus vieraalla kielellä: yhä työn alla mutta kyllä se siitä, give
me maybe five more years). Yet for some reason I have always felt it is,
I don&amp;rsquo;t know, low status to be so effortlessly joyful and opulent. Like
people will take you less seriously or something. So I&amp;rsquo;ve been reluctant
to push my naturally good mood into the realm of &lt;em&gt;actively loving life&lt;/em&gt;
as my default state.&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;&#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;&#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;&#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;&#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;&#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;&#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>Using LLMs to generate small semantic perturbations for language learning writing practice</title>
      <link>https://til.andrew-quinn.me/posts/using-llms-to-generate-small-semantic-perturbations-for-language-learning-writing-practice/</link>
      <pubDate>Fri, 04 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/using-llms-to-generate-small-semantic-perturbations-for-language-learning-writing-practice/</guid>
      <description>&lt;p&gt;Still images of this GIF are at the bottom.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://github.com/user-attachments/assets/3022e8c0-81db-4aa6-9af4-72b26ad6aebc&#34; alt=&#34;output-sentence-perturbations&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;Learning to read a language is mostly a game of getting massive quantities of
comprehensible input. Learning to &lt;em&gt;write&lt;/em&gt; that same language is a whole &amp;rsquo;nother
ballgame. But, using the
&lt;a href=&#34;https://til.andrew-quinn.me/posts/the-language-learning-delta-anki-card-pattern/&#34;&gt;4-quadrant Anki card setup from my earlier post&lt;/a&gt;,
I think I&amp;rsquo;m finding more and more ways to make this as amenable to spaced
repetition as possible.&lt;/p&gt;
&lt;p&gt;One thing I&amp;rsquo;ve been experimenting with with surprising success is the idea of
using LLMs to generate &amp;ldquo;semantic perturbations&amp;rdquo; on sentences I already &amp;ldquo;know&amp;rdquo;
how to write, where &amp;ldquo;know&amp;rdquo; = &amp;ldquo;have in active review in Anki&amp;rdquo;, for our purposes.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The language learning &#34;Delta&#34; Anki card pattern</title>
      <link>https://til.andrew-quinn.me/posts/the-language-learning-delta-anki-card-pattern/</link>
      <pubDate>Sat, 28 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/the-language-learning-delta-anki-card-pattern/</guid>
      <description>&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;&#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;&#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;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-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-3&#34;&gt;3&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-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-4&#34;&gt;4&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-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-5&#34;&gt;5&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;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------------------------+------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|       L2, fixable        |              L1, intention               |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------------------------+------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|        L2, fixed         |   L1, (fixable -&amp;gt; fixed) explanation     |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&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;The above 2x2 layout for Anki cards, which I call a &amp;ldquo;comprehensible
delta&amp;rdquo;, is one of the best things I&amp;rsquo;ve happened upon in a while for
learning another language. Let&amp;rsquo;s say you are learning Finnish, and you
want to say&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Save your disk, write files directly into RAM with /dev/shm</title>
      <link>https://til.andrew-quinn.me/posts/save-your-disk-write-files-directly-into-ram-with-dev-shm/</link>
      <pubDate>Thu, 26 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/save-your-disk-write-files-directly-into-ram-with-dev-shm/</guid>
      <description>&lt;p&gt;Given my interest in extending the life of my SD cards and hard drives
as much as possible,
I&amp;rsquo;m surprised I haven&amp;rsquo;t come across &lt;code&gt;/dev/shm&lt;/code&gt; before.
In a word
it&amp;rsquo;s a world-accessible RAM scratchpad, which seems baked right into POSIX,
so that virtually every &lt;del&gt;Unix&lt;/del&gt; EDIT: &lt;em&gt;Linux&lt;/em&gt;
system already has it mounted as a
&lt;code&gt;tmpfs&lt;/code&gt; by default:&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;&#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;&#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;&#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;❯ mount | grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/dev/shm&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tmpfs on /dev/shm type tmpfs &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;rw,nosuid,nodev,inode64&lt;span style=&#34;color:#f92672&#34;&gt;)&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;&lt;a href=&#34;https://xkcd.com/1053/&#34;&gt;Today&amp;rsquo;s lucky 10,000, indeed&lt;/a&gt;.
It gets mentioned often in Hacker News comments, but surprisingly I couldn&amp;rsquo;t
find any actual articles talking about it.
The existence of &lt;code&gt;/dev/shm&lt;/code&gt; is a boon for me mostly because it means I never
have to worry about whether &lt;code&gt;/tmp&lt;/code&gt; is &lt;em&gt;really&lt;/em&gt; RAM-based again.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>LLM, JavaScript, GitHub Pages, localStorage: A recipe for free apps anyone can use</title>
      <link>https://til.andrew-quinn.me/posts/llm-javascript-github-pages-localstorage-a-recipe-for-free-apps-anyone-can-use/</link>
      <pubDate>Wed, 18 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/llm-javascript-github-pages-localstorage-a-recipe-for-free-apps-anyone-can-use/</guid>
      <description>&lt;p&gt;Earlier today on Hacker News
&lt;a href=&#34;https://pontus.granstrom.me/scrappy/&#34;&gt;Scrappy made the rounds&lt;/a&gt;,
with the explicit tagline &amp;ldquo;make little apps for you and your friends&amp;rdquo;.
I always like to see new projects in this vein.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s why I&amp;rsquo;d like to outline my alternative approach, which&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Works cross-platform and on mobile devices by default,&lt;/li&gt;
&lt;li&gt;Doesn&amp;rsquo;t require any app store tomfoolery,&lt;/li&gt;
&lt;li&gt;Has great uptime built in,&lt;/li&gt;
&lt;li&gt;Gives you just enough data persistence to not get in your way, and&lt;/li&gt;
&lt;li&gt;Is owned by you, forever.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the stack I used to build
&lt;a href=&#34;https://hiandrewquinn.github.io/diet-checklist/&#34;&gt;my diet checklist&lt;/a&gt;,
which I keep as a little icon on my phone&amp;rsquo;s home page.
Here it is:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Create multi-stage Anki card answers with HTML&#39;s &lt;details&gt; tag</title>
      <link>https://til.andrew-quinn.me/posts/create-multi-stage-anki-card-answers-with-html-s-details-tag/</link>
      <pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/create-multi-stage-anki-card-answers-with-html-s-details-tag/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://github.com/user-attachments/assets/1df394d2-5590-46a0-a125-633a5dfe20fa&#34; alt=&#34;image&#34;  /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This works as of, at least, Anki 24.06.3.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;According to the
&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/details&#34;&gt;Mozilla Developer Network&lt;/a&gt;,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &amp;lt;details&amp;gt; HTML element creates a disclosure widget in which information is
visible only when the widget is toggled into an open state.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In standard web browsers, absent any CSS to the contrary, a &amp;lt;details&amp;gt; tag
starts &lt;em&gt;closed&lt;/em&gt; until further notice. Since Anki is basically a local web
browser on top of a timer, this also works there.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>LLM tutored writing practice for secondary language acquisition</title>
      <link>https://til.andrew-quinn.me/posts/llm-tutored-writing-practice-for-secondary-language-acquisition/</link>
      <pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/llm-tutored-writing-practice-for-secondary-language-acquisition/</guid>
      <description>&lt;p&gt;Language learning for the contemporary adult learner can be broken down roughly
into four highly correlated, but distinct, skillsets.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;Passive understanding&lt;/th&gt;
          &lt;th&gt;Active production&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;The written word&lt;/td&gt;
          &lt;td&gt;Reading&lt;/td&gt;
          &lt;td&gt;Writing&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;The spoken word&lt;/td&gt;
          &lt;td&gt;Listening&lt;/td&gt;
          &lt;td&gt;Speaking&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You may know from &lt;a href=&#34;https://finbug.xyz/&#34;&gt;my FOSS software&lt;/a&gt; that I have been
learning Finnish for the past 4 years or so. For the first few years I pretty
much focused exclusively on reading comprehension, as I consider that to be the
easiest quadrant to skill up in first. This focus put me in the interesting
position for some time of being able to read most YA fiction and tax documents
while being unable to order a pizza for myself on the phone.&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>LLMs make Perl great again</title>
      <link>https://til.andrew-quinn.me/posts/llms-make-perl-great-again/</link>
      <pubDate>Sat, 24 May 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/llms-make-perl-great-again/</guid>
      <description>&lt;p&gt;Perl 5 went through a long nadir of unpopularity due in large part to its
deserved &amp;ldquo;Write Once, Read Never&amp;rdquo; reputation. So I was surprised to find out
not only is it
&lt;a href=&#34;https://til.andrew-quinn.me/posts/what-programming-languages-come-out-of-the-box-on-debian-12/&#34;&gt;installed by default on Debian&lt;/a&gt;,
it&amp;rsquo;s installed nearly &lt;em&gt;everywhere&lt;/em&gt; by default.
It&amp;rsquo;s even the non-shell scripting language of choice on
&lt;a href=&#34;https://marc.info/?l=openbsd-misc&amp;m=159041121804486&amp;w=2&#34;&gt;OpenBSD&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Perhaps the only thing more impressive than Perl&amp;rsquo;s utter ubiquity is its
longevity. The latest major version of Perl was first released in
&lt;a href=&#34;https://en.wikipedia.org/wiki/Perl_5_version_history&#34;&gt;&lt;em&gt;1994&lt;/em&gt;&lt;/a&gt;. It came into
existence on this planet less than a year after I did. It&amp;rsquo;s even arguably more
portable than the median shell script - different Unices might use Bash, Zsh,
Ksh, or even something newfangled like
&lt;a href=&#34;https://fishshell.com/&#34;&gt;Fish&lt;/a&gt;,
but for the most part a Perl 5 program is a Perl 5 program is a Perl 5 program.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Cross-platform TUIs are easier than cross-platform GUIs</title>
      <link>https://til.andrew-quinn.me/posts/cross-platform-tuis-are-easier-than-cross-platform-guis/</link>
      <pubDate>Tue, 20 May 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/cross-platform-tuis-are-easier-than-cross-platform-guis/</guid>
      <description>&lt;p&gt;Below is a GIF of
&lt;a href=&#34;https://github.com/hiAndrewQuinn/tsk&#34;&gt;&lt;code&gt;tsk&lt;/code&gt;, my pocket Finnish-to-English dictionary&lt;/a&gt;,
running in my terminal emulator of choice under Linux.
It&amp;rsquo;s what the kids call a
&lt;a href=&#34;https://github.com/rothgar/awesome-tuis&#34;&gt;TUI&lt;/a&gt;,
a graphical program that just happens to drive its graphics
using terminal graphics instead of graphics-graphics.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Insert GIF here.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You can probably tell that this program fits neatly into the
&lt;a href=&#34;https://bradfrost.com/blog/link/an-app-can-be-a-home-cooked-meal/&#34;&gt;&amp;ldquo;home-cooked meal&amp;rdquo;&lt;/a&gt;
clade of programs. There is a very straightforward problem I want solved -
fast, single-executable-portable dictionary lookup, with a few conveniences
for the busy language learner layered on top. I am quite happy with &lt;code&gt;tsk&lt;/code&gt; in
its current iteration and don&amp;rsquo;t plan to add much more to it anytime soon.
It would still save me a lot of time and hassle if I were the only person who
could use it.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Vibe coding and complementary goods</title>
      <link>https://til.andrew-quinn.me/posts/vibe-coding-and-complementary-goods/</link>
      <pubDate>Wed, 12 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/vibe-coding-and-complementary-goods/</guid>
      <description>&lt;p&gt;Peanut butter and jelly are
&lt;a href=&#34;https://en.wikipedia.org/wiki/Complementary_good&#34;&gt;complementary goods&lt;/a&gt;,
as are cars and gasoline,
newer cars and electricity,
electricity and basically everything else.&lt;/p&gt;
&lt;p&gt;We don&amp;rsquo;t normally think of, say,
Docker and Kubernetes as
complementary goods in software engineering,
because you can get both for the low price
of free. Or can you? You still have to
invest &lt;em&gt;time&lt;/em&gt; in learning both, and
as the famous saying goes&amp;hellip;&lt;/p&gt;
&lt;p&gt;Say it takes X hours to learn Docker
adequately. If Docker suddenly becomes
easier to learn, such that it now takes
only X / 2 hours, it&amp;rsquo;s reasonable to assume
Kubernetes will become more popular in tandem,
because one of its complements now costs
less and is hence supplied in greater
quantities anyway. You don&amp;rsquo;t
want a peanut butter only sandwich, do you?&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Binary search isn&#39;t about search III. Loop invariant of rightmost element search</title>
      <link>https://til.andrew-quinn.me/posts/binary-search-isn-t-about-search-iii-loop-invariant-of-rightmost-element-search/</link>
      <pubDate>Sun, 09 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/binary-search-isn-t-about-search-iii-loop-invariant-of-rightmost-element-search/</guid>
      <description>&lt;p&gt;If you followed
&lt;a href=&#34;https://til.andrew-quinn.me/posts/binary-search-isn-t-about-search/&#34;&gt;&amp;ldquo;Binary search isn&amp;rsquo;t about search&amp;rdquo;&lt;/a&gt;
and
&lt;a href=&#34;https://til.andrew-quinn.me/posts/binary-search-isn-t-about-search-ii-loop-invariant-of-leftmost-element-search/&#34;&gt;&amp;ldquo;Binary search isn&amp;rsquo;t about search II&amp;rdquo;&lt;/a&gt;
properly, the following statements should suffice as a summary:&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;&#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;&#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;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;L[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:l] &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; T &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; L[r:len(L)]    &lt;span style=&#34;color:#75715e&#34;&gt;# ordinary binary search loop invariant&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;L[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:l] &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; T &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; L[r:len(L)]   &lt;span style=&#34;color:#75715e&#34;&gt;# leftwise binary search loop invariant&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;Let&amp;rsquo;s complete the triptych. Take a wild guess what invariant we use for &lt;em&gt;rightmost&lt;/em&gt; element binary search:&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;&#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;&#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;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;L[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:l] &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; T &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; L[r:len(L)]   &lt;span style=&#34;color:#75715e&#34;&gt;# rightwise binary search loop invariant&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;h2 id=&#34;a-motivating-example&#34;&gt;A motivating example&lt;/h2&gt;
&lt;p&gt;Consider again an array like&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Binary search isn&#39;t about search II. Loop invariant of leftmost element search</title>
      <link>https://til.andrew-quinn.me/posts/binary-search-isn-t-about-search-ii-loop-invariant-of-leftmost-element-search/</link>
      <pubDate>Sat, 08 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/binary-search-isn-t-about-search-ii-loop-invariant-of-leftmost-element-search/</guid>
      <description>&lt;p&gt;In the first
&lt;a href=&#34;https://til.andrew-quinn.me/posts/binary-search-isn-t-about-search/&#34;&gt;&amp;ldquo;Binary search isn&amp;rsquo;t about search&amp;rdquo;&lt;/a&gt;
post, we spoke about
&lt;a href=&#34;https://til.andrew-quinn.me/posts/binary-search-isn-t-about-search/#hl-2-5&#34;&gt;using &lt;code&gt;assert&lt;/code&gt; statements to enforce your loop invariants&lt;/a&gt;.
Our plain old everyday binary search invariant can be summarized as such:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;For all x in &lt;code&gt;L[0:l]&lt;/code&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;, x is &lt;em&gt;strictly&lt;/em&gt; less than &lt;code&gt;T&lt;/code&gt;, the element we are searching for.&lt;/li&gt;
&lt;li&gt;For all y in &lt;code&gt;L[r:len(L)]&lt;/code&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;, y is &lt;em&gt;strictly&lt;/em&gt; greater than &lt;code&gt;T&lt;/code&gt;, the element we are searching for.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Or, if we want to be even terser, we could note this as simply&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Binary search isn&#39;t about search</title>
      <link>https://til.andrew-quinn.me/posts/binary-search-isn-t-about-search/</link>
      <pubDate>Fri, 07 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/binary-search-isn-t-about-search/</guid>
      <description>&lt;p&gt;Suppose you&amp;rsquo;re trying to track down a bug that appeared in a series of Git commits.
You&amp;rsquo;ve been idly keeping track of where this bug appears in your
&lt;a href=&#34;https://github.com/not-an-aardvark/lucky-commit&#34;&gt;lucky&lt;/a&gt;
commits by hand, while busy with other things. So far you&amp;rsquo;ve compiled this table:&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;&#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;&#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;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-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-3&#34;&gt; 3&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-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-4&#34;&gt; 4&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-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-5&#34;&gt; 5&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-6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-6&#34;&gt; 6&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-7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-7&#34;&gt; 7&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-8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-8&#34;&gt; 8&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-9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-9&#34;&gt; 9&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-10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-10&#34;&gt;10&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;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000000    🧼 clean, no bug.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000001    🧼
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000002    🧼
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000003    🧼
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000004    🧼
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000005    🧼
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000006    🐛 bug first appears here.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000007    🐛
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000008    🐛
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0000009    🤔 bug mysteriously disappears...
&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 an EMP explodes in your vicinity and scrambles your memory circuits. The Internet
is down, you don&amp;rsquo;t have the
&lt;a href=&#34;https://git-scm.com/docs/git-bisect&#34;&gt;git-bisect man pages&lt;/a&gt;
downloaded locally, and all you remember is that your first commit was good, your last
commit was good but for reasons you don&amp;rsquo;t understand, and &lt;em&gt;something&lt;/em&gt; bad is probably
still lurking in there. But where?&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>SQLite is learnable</title>
      <link>https://til.andrew-quinn.me/posts/the-learnability-of-sqlite/</link>
      <pubDate>Tue, 18 Feb 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/the-learnability-of-sqlite/</guid>
      <description>&lt;p&gt;This is a response to
&lt;a href=&#34;https://pid1.dev/posts/siren-call-of-sqlite-on-the-server/&#34;&gt;pid1.call&amp;rsquo;s &amp;ldquo;Siren Call of SQlite on the Server&amp;rdquo;&lt;/a&gt;,
which itself is a response to articles like
&lt;a href=&#34;https://blog.wesleyac.com/posts/consider-sqlite&#34;&gt;Wesley Aptekar-Cassels&amp;rsquo;s &amp;ldquo;Consider SQLite&amp;rdquo;&lt;/a&gt;
espousing SQLite as a server-side technology.
Cards on the table, I both love SQLite &lt;em&gt;and&lt;/em&gt;
think pid1 has the more correct take here.&lt;/p&gt;
&lt;p&gt;When I decided on a dime after college to move countries
and be with my wife, part of the package deal was that
I had to throw away my dreams of easing into the software
industry by resting on the laurels of my
&lt;a href=&#34;https://www.northwestern.edu/&#34;&gt;strong, but not MIT-level-known-worldwide-strong, alma mater&lt;/a&gt;
(sorry Wildcats).
Electrical engineering was just not going to be
feasible for a then-monolingual
English speaker in Finland, and besides,
I majored in it 90% out of curiosity anyway. I always intended
to return to my once and future home, the shell, after my
&lt;a href=&#34;https://en.wikipedia.org/wiki/Rumspringa&#34;&gt;Rumspringa with electrons&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>`python -m http.server` as ephemeral Dropbox</title>
      <link>https://til.andrew-quinn.me/posts/python-m-http-server-as-ephemeral-dropbox/</link>
      <pubDate>Tue, 21 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/python-m-http-server-as-ephemeral-dropbox/</guid>
      <description>&lt;p&gt;Ever need to download a file from a server &amp;ndash; or get
someone &lt;em&gt;else&lt;/em&gt; to download a file from a server, who
may not be comfortable with or should have access to
&lt;code&gt;scp&lt;/code&gt; or &lt;code&gt;sftp&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Turns out, if you have Python installed &amp;ndash; and
&lt;a href=&#34;https://til.andrew-quinn.me/posts/what-programming-languages-come-out-of-the-box-on-debian-12/&#34;&gt;you probably do&lt;/a&gt; &amp;ndash;
it comes with a handy one-liner file server for just
such an occasion:&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;&#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;&#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;&#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;python -m http.server &lt;span style=&#34;color:#ae81ff&#34;&gt;12345&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# or whatever port you prefer&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;&lt;img loading=&#34;lazy&#34; src=&#34;https://github.com/user-attachments/assets/1d352ba6-f9d3-4167-955b-93a5efb283c7&#34; alt=&#34;image&#34;  /&gt;
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Common-sense security for SSH on a new Debian server</title>
      <link>https://til.andrew-quinn.me/posts/common-sense-security-for-ssh-on-a-new-debian-server/</link>
      <pubDate>Tue, 24 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/common-sense-security-for-ssh-on-a-new-debian-server/</guid>
      <description>&lt;p&gt;Last night I went to DigitalOcean and spun up a tiny new, $4/month droplet &amp;ndash;
on my own dime! It sounds crazy, but I&amp;rsquo;ve never actually wanted to pay for
hosting myself before. But I have a fun little web app cooking up, one that
might eventually pay that $4/month back with interests, and I decided, why not,
it&amp;rsquo;s time to finally put some of my &lt;em&gt;own&lt;/em&gt; skin in the game with this whole
sysadmin thing.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Enforce GPL compliance by offering bounties?</title>
      <link>https://til.andrew-quinn.me/posts/enforce-gpl-compliance-by-offering-bounties/</link>
      <pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/enforce-gpl-compliance-by-offering-bounties/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Epistemic status:&lt;/strong&gt; Very unclear, also I Am Not A Lawyer This Is Not Legal
Advice Get Off My Lawn&lt;/p&gt;
&lt;p&gt;(N.B.: I&amp;quot;m using &amp;ldquo;GPL&amp;rdquo; with broad strokes here, to point at &amp;ldquo;open source
licenses it&amp;rsquo;s straightforward to run afoul of&amp;rdquo;.)&lt;/p&gt;
&lt;p&gt;Policing is always hard in a world of limited resources. Especially when one
is targeting sophisticated, well-monied criminal organizations, it can take an
awful lot of time and effort merely to &lt;em&gt;credibly reveal&lt;/em&gt; that wrongdoing has
taken place. Would it surprise you if I said the average criminal software
organization is probably, on the margin, more sophisticated than the average
criminal organization? If so, you should probably expect that the former&amp;rsquo;s
crimes are brought to life even less often than the latter&amp;rsquo;s.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The self-hosted to DevOps engineer pipeline</title>
      <link>https://til.andrew-quinn.me/posts/the-self-hosted-to-devops-engineer-pipeline/</link>
      <pubDate>Wed, 18 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/the-self-hosted-to-devops-engineer-pipeline/</guid>
      <description>&lt;p&gt;What&amp;rsquo;s the best way to get a job? Show someone with a job to do that you
can do the job within their
&lt;a href=&#34;https://en.wikipedia.org/wiki/Project_management_triangle&#34;&gt;iron triangle&lt;/a&gt;.
What&amp;rsquo;s the best way you can show someone you can handle a complicated
k8s deployment, with 7 different CNCF-approved add-ons, zero-downtime
rollouts and a whole bunch of YAML files? Probably by competently and
publicly running &lt;em&gt;your own&lt;/em&gt; complicated k8s infrastructure.&lt;/p&gt;
&lt;p&gt;Self-hosters remind me a lot of the sysadmins of yore, who mostly ended
up in the profession because they just &lt;em&gt;couldn&amp;rsquo;t help&lt;/em&gt; but mess around with
their underlying computing machine until they knew all kinds of weird
nooks and crannies within it. I trace my own lineage in software
deveopment back to the day my parents finally purchased a Dell laptop
and a 300 Kbps Internet connection (residential wiring in Boston left
something to be desired), and promptly broke the Windows registry and
installed Ubuntu without them ever realizing anything had changed.
The next year I got my first internship through a high school program
as a Unix admin intern at
&lt;a href=&#34;https://www.akamai.com/&#34;&gt;Akamai&lt;/a&gt;, and the rest is history.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>PHP, Go, and Braindead Deployment</title>
      <link>https://til.andrew-quinn.me/posts/php-go-and-braindead-deployment/</link>
      <pubDate>Mon, 16 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/php-go-and-braindead-deployment/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;ve been
&lt;a href=&#34;,./php-is-web-shell/&#34;&gt;following my posts&lt;/a&gt;
recently, you might have noticed that I&amp;rsquo;ve been working more and more with PHP
lately. As someone who was curiously allergic to
web dev as a teenager, it has been
&lt;a href=&#34;../php-and-web-dev-phobia/&#34;&gt;a strangely healing experience&lt;/a&gt;
for me.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to say it&amp;rsquo;s because my experiments with
&lt;a href=&#34;https://laravel.com/&#34;&gt;Laravel&lt;/a&gt;,
the only OSS work of which I can point to is testing
&lt;a href=&#34;https://github.com/hiAndrewQuinn/shell-bling-ubuntu?tab=readme-ov-file#where-else-does-this-work&#34;&gt;the Homestead VM&amp;rsquo;s compatibility for Shell Bling Ubuntu&lt;/a&gt;,
convinced me. But no &amp;ndash; Laravel is &lt;em&gt;pretty sweet&lt;/em&gt;, but so is
&lt;a href=&#34;https://www.djangoproject.com/&#34;&gt;Django&lt;/a&gt;, but Django
has the advantage of using an underlying language that&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>What I would recommend to teens in 2024 who want to get into development</title>
      <link>https://til.andrew-quinn.me/posts/what-i-would-recommend-to-teens-in-2024-who-want-to-get-into-development/</link>
      <pubDate>Sun, 08 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/what-i-would-recommend-to-teens-in-2024-who-want-to-get-into-development/</guid>
      <description></description>
    </item>
    
    <item>
      <title>PHP and Web Dev Phobia</title>
      <link>https://til.andrew-quinn.me/posts/php-and-web-dev-phobia/</link>
      <pubDate>Tue, 03 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/php-and-web-dev-phobia/</guid>
      <description>&lt;p&gt;PHP is, for better and for worse, the Python of web dev
in my eyes. It is exceptionally easy to get started, in
a way which I think younger developers may not be fully
aware of.&lt;/p&gt;
&lt;p&gt;So here I&amp;rsquo;d like to make them aware of it!
That&amp;rsquo;s right, this is a
&lt;a href=&#34;https://til.andrew-quinn.me/posts/quickstarts-and-slowstarts/&#34;&gt;Slowstart&lt;/a&gt;
for people who have never touched PHP or web dev before.&lt;/p&gt;
&lt;p&gt;Start
&lt;a href=&#34;../the-unreasonable-effectiveness-of-vms-in-hacker-pedagogy/&#34;&gt;the way we usually do&lt;/a&gt; on this blog,
with the &amp;ldquo;tutorial-in-a-box&amp;rdquo;
by installing
&lt;a href=&#34;https://www.vagrantup.com/&#34;&gt;Vagrant&lt;/a&gt;
and
&lt;a href=&#34;https://www.virtualbox.org/&#34;&gt;Virtualbox&lt;/a&gt;
so you can create a disposable virtual machine with
just a few commands.&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>My pet theory of how great software gets started</title>
      <link>https://til.andrew-quinn.me/posts/my-pet-theory-of-how-great-software-gets-started/</link>
      <pubDate>Tue, 16 Jul 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/my-pet-theory-of-how-great-software-gets-started/</guid>
      <description>&lt;p&gt;(Inspired by
&lt;a href=&#34;https://news.ycombinator.com/item?id=40974768&#34;&gt;yungporko&amp;rsquo;s Ask HN post&lt;/a&gt;,
which got me thinking.)&lt;/p&gt;
&lt;p&gt;Pretty much every community, dojo, workplace, subculture, scene you can imagine
in the modern day had a software sub-scene embedded within it. It can be as
small as &amp;ldquo;that guy who does our Excel&amp;rdquo;, or as large as
&lt;a href=&#34;https://www.pouet.net/&#34;&gt;the scene itself&lt;/a&gt;
. This is owing to the fantastic generality of software as a way to make almost
anything more efficient, but we won&amp;rsquo;t go on that tangent now.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>What scripting languages come out of the box on Debian 12?</title>
      <link>https://til.andrew-quinn.me/posts/what-programming-languages-come-out-of-the-box-on-debian-12/</link>
      <pubDate>Sun, 23 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/what-programming-languages-come-out-of-the-box-on-debian-12/</guid>
      <description>&lt;p&gt;Poking around in a
&lt;a href=&#34;https://til.andrew-quinn.me/posts/the-unreasonable-effectiveness-of-vms-in-hacker-pedagogy/&#34;&gt;fresh VM in Vagrant&lt;/a&gt;,
I see&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;bash&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dash&lt;/code&gt;, a POSIX compliant shell linked under &lt;code&gt;sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python3&lt;/code&gt;, 3.11.2 at the time of writing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;awk&lt;/code&gt;, specifically &lt;code&gt;mawk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sed&lt;/code&gt;, if you count that (I do)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;perl&lt;/code&gt;, specifically Perl 5&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There may be others I missed.&lt;/p&gt;
&lt;p&gt;Why I&amp;rsquo;m curious: Knowing that a language is installed by default on the most
popular Linux distribution can simplify certain concerns considerably, which
are of special interest to
&lt;a href=&#34;https://til.andrew-quinn.me/posts/openbsd-the-computer-appliance-maker-s-secret-weapon/&#34;&gt;people who don&amp;rsquo;t work on Internet-connected boxes&lt;/a&gt;.
Knowing that Python/Perl is already on there means that,
provided your script only
relies on the standard library, you should be able to just &lt;code&gt;scp&lt;/code&gt; it over in a
pinch and have it &amp;ldquo;just work&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Valuable software is about letting people do new things</title>
      <link>https://til.andrew-quinn.me/posts/valuable-software-is-about-doing-new-things/</link>
      <pubDate>Fri, 21 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/valuable-software-is-about-doing-new-things/</guid>
      <description>&lt;p&gt;Today I released a dump of
&lt;a href=&#34;https://github.com/Selkouutiset-Archive/selkokortti/releases/tag/summer-2024&#34;&gt;six months of flashcards&lt;/a&gt;
I autogenerated from
&lt;a href=&#34;../lessons-learned-from-6-months-of-operating-a-teensy-tiny-news-archive/&#34;&gt;my tiny Finnish news archive&lt;/a&gt;
to make the lives of my fellow language learners easier.
The actual code which generates this archive is
&lt;a href=&#34;https://github.com/Selkouutiset-Archive/selkokortti/blob/main/main.py&#34;&gt;about 300 lines of Python&lt;/a&gt;
.
The basic value add for the user:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What you want&lt;/strong&gt;: Better fluency in Finnish.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What you need&lt;/strong&gt;: Practice. Lots of it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What this gives you&lt;/strong&gt;: GOTO 2.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is emphatically &lt;em&gt;not&lt;/em&gt; the kind of product, or use case,
I would stumble upon as a brain-in-the-vat developer. It is
a niche offering, one I only found because I actually
got out into the world and tried to &lt;em&gt;do something hard&lt;/em&gt;.
In so doing, I recognized the possibility of building a tool
that could help me in this &lt;em&gt;non-programming&lt;/em&gt; endeavour.
So I built it. And I&amp;rsquo;m proud of it.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Layers of abstraction for me, not for thee</title>
      <link>https://til.andrew-quinn.me/posts/layers-of-abstraction-for-me-not-for-thee/</link>
      <pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/layers-of-abstraction-for-me-not-for-thee/</guid>
      <description>&lt;p&gt;Consider the problem of &amp;ldquo;how do I run more than 1 terminal at a time&amp;rdquo;.
At this moment, I have at least 5 different ways I can effectively
solve this issue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can, from a different physical computer, SSH in to a new session.&lt;/li&gt;
&lt;li&gt;I can, from the same physical computer, switch to a different &lt;code&gt;tty&lt;/code&gt;
session with &amp;hellip; &lt;code&gt;C-S-F2&lt;/code&gt; through &lt;code&gt;6&lt;/code&gt; or something. (Rare, but
sometimes it comes in really handy.)&lt;/li&gt;
&lt;li&gt;I can, in the same user session, open 2 separate windows of a terminal
emulator.&lt;/li&gt;
&lt;li&gt;I can, in the same terminal emulator, open a new tab.&lt;/li&gt;
&lt;li&gt;I can, in the same emulated terminal, run &lt;code&gt;tmux&lt;/code&gt; and open a new
pane.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are yet more exotic options like
&lt;a href=&#34;https://en.wikipedia.org/wiki/Serial_over_LAN&#34;&gt;Serial over LAN&lt;/a&gt;
that I&amp;rsquo;m only theoretically aware of.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Software engineers as mental athletes</title>
      <link>https://til.andrew-quinn.me/posts/software-engineers-as-mental-athletes/</link>
      <pubDate>Sat, 15 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/software-engineers-as-mental-athletes/</guid>
      <description>&lt;p&gt;This week I achieved a modest personal dream of mine I&amp;rsquo;ve had since I was a
high schooler: I purchased a proper standing desk, with a low-profile treadmill
underneath.&lt;/p&gt;
&lt;p&gt;The total cost for a setup here in Finland came out to only about
$350, something I can easily afford with a week&amp;rsquo;s take-home pay. The primary
hurdle for me was psychological: How could I justify spending so much money on
a more ergonomic setup when I&amp;rsquo;m not even sure this whole &amp;ldquo;software engineering&amp;rdquo;
thing will work out for me? Nevermind that I taught myself to program at 14 from
&lt;a href=&#34;http://sthurlow.com/python/&#34;&gt;a Civ 4 hacking tutorial&lt;/a&gt;,
nevermind that I&amp;rsquo;ve been living my life as a budget cyborg for the last 15
years, nevermind that every job I&amp;rsquo;ve ever had post-college has been at least
60% WFH &amp;ndash; how could I be sure this investment in my home office will pay itself
back?&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>OpenBSD, the computer appliance maker&#39;s secret weapon</title>
      <link>https://til.andrew-quinn.me/posts/openbsd-the-computer-appliance-maker-s-secret-weapon/</link>
      <pubDate>Wed, 05 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/openbsd-the-computer-appliance-maker-s-secret-weapon/</guid>
      <description>&lt;p&gt;Between our ESP32 prokaryotic organisms and our 24/7 Internet-enabled
megafauna servers, there exists a vast and loosely-defined ecosystem of things
the
B2B world likes to call &lt;strong&gt;computer appliances&lt;/strong&gt;. Picture a bespoke Pi 4 packaged
up neatly with some Python scripts, a little fancy plastic embossing, and maybe
a well-guarded &lt;code&gt;id_ed25519.pub&lt;/code&gt; in case you end up in hot water during the
(long - very long, stable cash flow for generations long) maintenance contract,
and you&amp;rsquo;re in the ballpark.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Quickstarts and Slowstarts</title>
      <link>https://til.andrew-quinn.me/posts/quickstarts-and-slowstarts/</link>
      <pubDate>Tue, 04 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/quickstarts-and-slowstarts/</guid>
      <description>&lt;p&gt;A while back I stirred up some controversy on Hacker News
by talking about why I liked it when
&lt;a href=&#34;https://news.ycombinator.com/item?id=39882810&#34;&gt;tutorials take you from clean VM to working, installed software&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve since taken to calling this the &amp;ldquo;tutorial-in-a-box&amp;rdquo; method.
When I write them myself, I usually put them under the
header &lt;strong&gt;Slowstart&lt;/strong&gt;, a riff on the proverbial Quickstart.
Two examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://andrew-quinn.me/reposurgeon&#34;&gt;A gentle introduction to &lt;code&gt;reposurgeon&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://github.com/Selkouutiset-Archive/selkokortti?tab=readme-ov-file#slowstart&#34;&gt;Slowstart&lt;/a&gt; for &lt;code&gt;selkokortti&lt;/code&gt;, some flashcard generating software based around &lt;a href=&#34;https://hiandrewquinn.github.io/selkouutiset-archive/&#34;&gt;my Finnish language news archive&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The point of a Slowstart is to make it so that &lt;em&gt;even absolute beginners&lt;/em&gt;
can start to pick up some pointers about how people &amp;ldquo;in the know&amp;rdquo; of
your chosen software ecosystem actually get things done. Instead of a
Dockerfile or a shell script, you take them by the hand, spin up a
&lt;em&gt;totally fresh&lt;/em&gt; virtual machine from the ground up using something like
&lt;a href=&#34;https://www.vagrantup.com/&#34;&gt;Vagrant&lt;/a&gt;
or
&lt;a href=&#34;https://developer.fedoraproject.org/tools/virt-builder/about.html&#34;&gt;virt-builder&lt;/a&gt;,
and walk them through &lt;strong&gt;each and every command&lt;/strong&gt; they need to execute
in order to get to a working install.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Lessons learned from 6 months of operating a teensy-tiny news archive</title>
      <link>https://til.andrew-quinn.me/posts/lessons-learned-from-6-months-of-operating-a-teensy-tiny-news-archive/</link>
      <pubDate>Sat, 01 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/lessons-learned-from-6-months-of-operating-a-teensy-tiny-news-archive/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The best websites are &lt;a href=&#34;https://www.robinsloan.com/notes/home-cooked-app/&#34;&gt;home-cooked meals&lt;/a&gt;.&lt;/strong&gt; &lt;a href=&#34;https://hiandrewquinn.github.io/selkouutiset-archive/&#34;&gt;Andrew&amp;rsquo;s Selkouutiset Archive&lt;/a&gt; was birthed after I realized there was no obvious way to fetch the &lt;em&gt;previous&lt;/em&gt; articles of the &amp;ldquo;Easy Finnish&amp;rdquo; daily news broadcast. This annoyed me as a student of the language. &amp;ldquo;Here we have a stream&amp;rdquo;, I thought, &amp;ldquo;of high-quality, human-written, interesting practice material, and no easy way to access it!&amp;rdquo; So I went out of my way to create such a way, and me and my language skills have been profiting off of it ever since. A very small website, for a very specific need, just leaves a delightful aftertaste in the mouth.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Doing is normally distributed, learning is log-normal</title>
      <link>https://til.andrew-quinn.me/posts/doing-is-normally-distributed-learning-is-log-normal/</link>
      <pubDate>Tue, 28 May 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/doing-is-normally-distributed-learning-is-log-normal/</guid>
      <description>&lt;p&gt;There are few things I think about more than the essays on
&lt;a href=&#34;https://gwern.net/index&#34;&gt;gwern.net&lt;/a&gt;,
and there are few with as satisfying a theoretical payout
to contemplate in my orb as
&lt;a href=&#34;https://gwern.net/note/pipeline&#34;&gt;his essay on &amp;ldquo;leaky pipelines&amp;rdquo;&lt;/a&gt;,
aka log-normal distributions.&lt;/p&gt;
&lt;p&gt;The skulk: Say you&amp;rsquo;re working on a Laravel web app.
You&amp;rsquo;re about 90% sure you know how to start the app. You&amp;rsquo;re
80% sure you know how to handle the infra you&amp;rsquo;ll need to
get it online. And you&amp;rsquo;re 70% sure you know how to get your
first customer. What is your chance of successfully going
from zero to first customer? 0.9 * 0.8 * 0.7 = a little over
0.5. That&amp;rsquo;s &amp;hellip; a lot less encouraging than any of the
previous numbers, if you buy my multi-step modelling.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Trackballs are great for the mostly-mouseless</title>
      <link>https://til.andrew-quinn.me/posts/trackballs-are-great-for-the-mostly-mouseless/</link>
      <pubDate>Sun, 26 May 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/trackballs-are-great-for-the-mostly-mouseless/</guid>
      <description>&lt;p&gt;I was 100% mouseless back before it was cool.
Between dropping out of high school and enrolling
in community college, I replaced my laptop with a
$80 HP EliteBook I found on eBay; when I discovered its
trackpad didn&amp;rsquo;t work anyway, I went all in on a no-X
setup.
I eventually concluded that going 90% mouseless got me almost
all of the benefits, with almost none of the downsides.
It&amp;rsquo;s almost as if
&lt;a href=&#34;https://stevenshang.com/things-i-learned-today-april-25-2020&#34;&gt;returns are usually diminishing&lt;/a&gt;!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>tmux is worse is better</title>
      <link>https://til.andrew-quinn.me/posts/tmux-is-worse-is-better/</link>
      <pubDate>Thu, 23 May 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/tmux-is-worse-is-better/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/tmux/tmux/wiki&#34;&gt;tmux&lt;/a&gt;
(short for &amp;ldquo;terminal mux&amp;rdquo; (short for &amp;ldquo;multiplexer&amp;rdquo;))
is
&lt;a href=&#34;https://i3wm.org/&#34;&gt;i3&lt;/a&gt;
for your terminal.
Oh, it&amp;rsquo;s so much more than that, and I recently discovered with
some joy that it is installed by default on
&lt;a href=&#34;https://www.openbsd.org/&#34;&gt;OpenBSD&lt;/a&gt;,
but its fundamental value add to any programmer who has to
SSH into servers more than once a week is it allows you to
split your screen up into multiple independent shells
&lt;em&gt;without needing a graphical environment at all&lt;/em&gt;.
If you want to walk the path of true digital minimalism,
&lt;a href=&#34;https://www.vim.org/&#34;&gt;vanilla Vim&lt;/a&gt;
and tmux or its spiritual grandfather
&lt;a href=&#34;https://www.gnu.org/software/screen/&#34;&gt;screen&lt;/a&gt;
are all you need.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Disable your browser history to write better internal docs</title>
      <link>https://til.andrew-quinn.me/posts/disable-your-browser-history-to-write-better-internal-docs/</link>
      <pubDate>Tue, 14 May 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/disable-your-browser-history-to-write-better-internal-docs/</guid>
      <description>&lt;p&gt;Most of us work in companies with something approximating a shared
online
internal wiki, be it
&lt;a href=&#34;https://www.atlassian.com/software/confluence&#34;&gt;Confluence&lt;/a&gt;
or
&lt;a href=&#34;https://www.mediawiki.org/wiki/MediaWiki&#34;&gt;MediaWiki&lt;/a&gt;
or even
&lt;a href=&#34;https://docs.readthedocs.io/en/stable/&#34;&gt;a searchable, static website custom built for the task&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A common problem with these sites is &lt;em&gt;making what you write discoverable&lt;/em&gt; to
other people on the site. &lt;em&gt;Your&lt;/em&gt; chosen title might tell you, a person fully in
the weeds of whatever you were just doing, exactly enough to know this is the
article you were looking for. Another human being, who might be searching for help
on how to do this for the first time? Not so much.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>I&#39;m turning 30 so naturally I&#39;m switching to OpenBSD</title>
      <link>https://til.andrew-quinn.me/posts/i-m-turning-30-so-i-m-switching-to-openbsd/</link>
      <pubDate>Sat, 04 May 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/i-m-turning-30-so-i-m-switching-to-openbsd/</guid>
      <description>&lt;p&gt;&lt;em&gt;I&amp;rsquo;m kidding&lt;/em&gt;, I&amp;rsquo;m switching to OpenBSD because I like security or code
quality or something.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s totally not because the inexorable march of aging is starting to show its
effects on my ability to down necessary-evil trivia like me and my friends
used to down forties in &lt;a href=&#34;https://arboretum.harvard.edu/&#34;&gt;the Ahhhnald&lt;/a&gt; after dark,
and so I&amp;rsquo;d like to settle down with a software ecosystem I can study in real
depth &lt;em&gt;once&lt;/em&gt; without feeling like 20% of what I absorb in year X will be
deprecated by year X+10.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>PHP is Web Shell</title>
      <link>https://til.andrew-quinn.me/posts/php-is-web-shell/</link>
      <pubDate>Mon, 29 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/php-is-web-shell/</guid>
      <description>&lt;p&gt;One of the cooler things about working in a firm founded
and run by a lot of dyed-in-the-wool Linux hackers like
my current place is that there is &lt;em&gt;a lot&lt;/em&gt; of Bash lying
around, accumulated over a good 25 years or so. For all
their faults, pure shell solutions still set the silver
standard for programs which appear almost entirely
immune to bit rot.&lt;/p&gt;
&lt;p&gt;But you know what? &lt;em&gt;So does vanilla PHP.&lt;/em&gt;
That pink stuff that was made from the ground up to get you
from zero to working dynamic web page as fast as possible.&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>Most &#34;life lessons&#34; you hear are about scaling back</title>
      <link>https://til.andrew-quinn.me/posts/why-most-life-lessons-you-hear-are-about-scaling-back/</link>
      <pubDate>Sat, 20 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/why-most-life-lessons-you-hear-are-about-scaling-back/</guid>
      <description>&lt;h1 id=&#34;i&#34;&gt;I&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://rawilson.com/&#34;&gt;Robert Anton Wilson&lt;/a&gt; was, is, and always will be a fascinating and hiliarious writer to me. I first read &lt;em&gt;The Illuminatus! Trilogy&lt;/em&gt; when I was 13, and while it was coincident with &lt;a href=&#34;https://www.mctb.org/mctb2/table-of-contents/part-iv-insight/30-the-progress-of-insight/5-dissolution-entrance-to-the-dark-night/&#34;&gt;a total and suffocating blackout of meaning&lt;/a&gt;, I no longer think reading it actually &lt;em&gt;caused&lt;/em&gt; that to happen in any significant sense. Au contraire: Teen me found refuge in his absurdity - it felt bedrock nihilstic, sure, but a far more artfully and deeply buried nihilism than I was able to find elsewhere at the time. (My words, not his. RAW wouldn&amp;rsquo;t describe himself as anywhere close to a nihilist. I think the glove fits.)&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>Beware those who promise increasing marginal returns</title>
      <link>https://til.andrew-quinn.me/posts/beware-those-who-promise-increasing-marginal-returns/</link>
      <pubDate>Tue, 09 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/beware-those-who-promise-increasing-marginal-returns/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Diminishing_returns&#34;&gt;law of diminishing returns&lt;/a&gt; needs no introduction. Your second slice of pizza is less satisfying than your first. Your second million dollars is less valuable to you, personally. If you think econ 101 has any life wisdom to impart, it deserves being elevated to the status of &amp;ldquo;life heuristic&amp;rdquo; - especially because, unlike some other concepts in econ 101 (comparative advantage anyone?) it feels true in a boring way, not in an actively counterintuitive way.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The 10 sentences heuristic for foreign vocabulary acquisition</title>
      <link>https://til.andrew-quinn.me/posts/the-10-sentences-heuristic-for-foreign-vocabulary-acquisition/</link>
      <pubDate>Mon, 01 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/the-10-sentences-heuristic-for-foreign-vocabulary-acquisition/</guid>
      <description>&lt;pre&gt;&lt;code&gt;In order to learn a word, we need to come across it several times.
It seems that the minimum amount of times we need to meet a word is
somehwere around 7 or 8 meetings, but it&#39;s very hard to put a figure
on it.

-- Paul Nation, [2020 Victorial University of Wellington](https://www.youtube.com/watch?v=FlJj8vpJxfE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;He&amp;rsquo;s right, but that never stopped me. I say &lt;strong&gt;10 sentences&lt;/strong&gt; in a specific practice: When you come across a word you don&amp;rsquo;t know enough times for it to bother you,&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The unreasonable effectiveness of VMs in hacker pedagogy</title>
      <link>https://til.andrew-quinn.me/posts/the-unreasonable-effectiveness-of-vms-in-hacker-pedagogy/</link>
      <pubDate>Sun, 31 Mar 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/the-unreasonable-effectiveness-of-vms-in-hacker-pedagogy/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a secret. If you have &lt;a href=&#34;https://www.vagrantup.com/&#34;&gt;Vagrant&lt;/a&gt; and &lt;a href=&#34;https://www.virtualbox.org/&#34;&gt;VirtualBox&lt;/a&gt; installed, and your colleague does too, then you can both bring up an near-totally identical blank slate Debian 12 Linux VM by running&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;&#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;&#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;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-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-3&#34;&gt;3&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-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-4&#34;&gt;4&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-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-5&#34;&gt;5&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-6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-6&#34;&gt;6&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;&#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;mkdir tutorial/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd tutorial/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant init debian/bookworm64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant up
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant ssh
&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;. This works regardless of whether you or they are on Linux, Mac&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;, BSD, or even Windows. (Through the magic of aliasing, &lt;code&gt;mkdir&lt;/code&gt; and &lt;code&gt;cd&lt;/code&gt; even work in PowerShell.)&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>wall: Broadcast message all Linux users</title>
      <link>https://til.andrew-quinn.me/posts/wall-broadcast-message-all-linux-users/</link>
      <pubDate>Thu, 01 Feb 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/wall-broadcast-message-all-linux-users/</guid>
      <description>&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;&#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;&#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;&#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;wall &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello, world!&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;will send a message that looks 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;&#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;&#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;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-2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-1-2&#34;&gt;2&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-1-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-1-3&#34;&gt;3&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;&#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;Broadcast message from root@localhost &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;pts/0&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Sat Feb  &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; 14:50:14 2024&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hello world!
&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;to every user currently logged in to the system.&lt;/p&gt;
&lt;p&gt;When might this be relevant? When you&amp;rsquo;re working in a small team, by remoting into custom hardware, and constantly reflashing the device, to give everyone a heads up, for instance:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Some New Year experiments</title>
      <link>https://til.andrew-quinn.me/posts/some-new-year-experiments/</link>
      <pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/some-new-year-experiments/</guid>
      <description>&lt;p&gt;Hyvää uuttaa vuottaa! As stated before, my TIL is up and running once more.&lt;/p&gt;
&lt;p&gt;Some things I&amp;rsquo;m going to be experimenting with this year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Self-hosted stuff, speficially on the Raspberry Pi.&lt;/li&gt;
&lt;li&gt;One of those fancy new split keyboards I keep hearing everyone talk about.&lt;/li&gt;
&lt;li&gt;Coding more, and thinking about coding less.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Been quiet - studying Finnish</title>
      <link>https://til.andrew-quinn.me/posts/been-quiet-studying-finnish/</link>
      <pubDate>Tue, 12 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/been-quiet-studying-finnish/</guid>
      <description>&lt;p&gt;Hei kaikki. I&amp;rsquo;m going dark for the rest of the year as I switch my attention to reading a lot of
Finnish, since Free Voluntary Reading is the best way to learn a language.&lt;/p&gt;
&lt;p&gt;Hyvää joulua ja onnellista uutta vuotta!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Speed paint videos for software installations</title>
      <link>https://til.andrew-quinn.me/posts/speed-paint-videos-for-github-project-installations/</link>
      <pubDate>Thu, 07 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/speed-paint-videos-for-github-project-installations/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/hiAndrewQuinn/shell-bling-ubuntu#-video---silent-install-20231206&#34;&gt;Shell Bling Ubuntu&lt;/a&gt; and &lt;a href=&#34;https://github.com/hiAndrewQuinn/finstem/tree/master#-video---silent-install-20231207&#34;&gt;finstem&lt;/a&gt; now have what I&amp;rsquo;m calling &amp;ldquo;speed paints&amp;rdquo; of how someone, starting from scratch on a standard Ubuntu VM, might install the programs.&lt;/p&gt;
&lt;p&gt;This came out of me realizing &lt;code&gt;ffmpeg&lt;/code&gt; makes speeding up a video recording of a VirtualBox session a one-line operation:&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;&#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;&#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;&#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;ffmpeg -i output.webm -filter:v &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;setpts=0.1*PTS&amp;#34;&lt;/span&gt; -an output-fast.webm
&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;When I watched them back, I realized it gave me a really good sense of what the installation should feel and look like, even if I hadn&amp;rsquo;t actually tried it yet. That in turn made me think &amp;ldquo;Oh, installing this thing really isn&amp;rsquo;t that bad after all.&amp;rdquo; So I decided it was worth including.&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;&#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;&#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;&#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;&#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;&#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;&#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>Most 2 digit numbers not divisible by 2, 3, or 5 are prime</title>
      <link>https://til.andrew-quinn.me/posts/most-2-digit-numbers-not-divisible-by-2-3-or-5-are-prime/</link>
      <pubDate>Mon, 04 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/most-2-digit-numbers-not-divisible-by-2-3-or-5-are-prime/</guid>
      <description>&lt;p&gt;There are only four single-digit primes: 2, 3, 5, and 7. So all two-digit numbers are either prime, or divisible by one of these four numbers.&lt;/p&gt;
&lt;p&gt;Of the four, 2, 3 and 5 are all very easy to spot check whether a number is divisible by them or not (for 3, add the digits first, and see if that sum is divisible by 3). If a given 2-digit number doesn&amp;rsquo;t fall into this category, 7 times out of 8, it&amp;rsquo;s prime.&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;&#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;&#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;&#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>Haskell has a rustup now?</title>
      <link>https://til.andrew-quinn.me/posts/haskell-has-a-rustup-now/</link>
      <pubDate>Sat, 02 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/haskell-has-a-rustup-now/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.haskell.org/ghcup/&#34;&gt;Apparently so.&lt;/a&gt;. &lt;a href=&#34;https://rustup.rs/&#34;&gt;The resemblence is uncanny.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve apparently been out of the FP game too long, I thought Stack was the latest and greatest in abstracting over the toolchain.&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>Things Word has that SSGs, by and large, don&#39;t</title>
      <link>https://til.andrew-quinn.me/posts/things-word-has-that-ssgs-by-and-large-don-t/</link>
      <pubDate>Thu, 30 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/things-word-has-that-ssgs-by-and-large-don-t/</guid>
      <description>&lt;p&gt;Recommendations appreciated.&lt;/p&gt;
&lt;p&gt;Disclaimer: Most of these make little sense in an Internet medium anyway.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;em&gt;index&lt;/em&gt;. An index simply lists the terms and topics discussed in a document, along with the pages they are listed on.&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;glossary&lt;/em&gt;. Could be as simple as a CSV file of terms and definitions, or as complex as a whole extra &lt;code&gt;glossary/&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Related: A &amp;ldquo;Acronyms and Abbreviations&amp;rdquo; section. Even moreso than the last, this could be a simple CSV.&lt;/li&gt;
&lt;li&gt;A built-in &lt;em&gt;site-wide search&lt;/em&gt; function. Word gets around this by having everything open at once.&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;list of tables&lt;/em&gt;. Huge if you want your dead-trees books to match your shiny new website.&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;list of figures&lt;/em&gt;. Ditto.&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;list of referenced external documents.&lt;/em&gt; CSV! Say it with me!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reason I compiled this list was because I decided to investigate whether I could use Hugo at work to generate our client-facing documentation. Currently we are using an unholy combination of Word and Confluence, and I figured that the magic of Git might help us keep our docs updated in a more sane way.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>traceroute uses UDP by default, not ICMP</title>
      <link>https://til.andrew-quinn.me/posts/traceroute-uses-udp-by-default-not-icmp/</link>
      <pubDate>Wed, 29 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/traceroute-uses-udp-by-default-not-icmp/</guid>
      <description>&lt;p&gt;At least on Linux.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t believe me? Run &lt;code&gt;tcpdump -nn -i &amp;lt;interface&amp;gt; &#39;host example.com&#39;&lt;/code&gt; in one shell and &lt;code&gt;traceroute example.com&lt;/code&gt; in another. &lt;code&gt;tcpdump&lt;/code&gt; will pick up all 3 of {ICMP, UDP, TCP}, and on my machine the pattern is clear:&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;&#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;&#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;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-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-3&#34;&gt; 3&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-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-4&#34;&gt; 4&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-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-5&#34;&gt; 5&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-6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-6&#34;&gt; 6&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-7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-7&#34;&gt; 7&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-8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-8&#34;&gt; 8&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-9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-9&#34;&gt; 9&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-10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-10&#34;&gt;10&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-11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-11&#34;&gt;11&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-12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-12&#34;&gt;12&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-13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-13&#34;&gt;13&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-14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-14&#34;&gt;14&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-15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-15&#34;&gt;15&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-16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-16&#34;&gt;16&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-17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-17&#34;&gt;17&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-18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-18&#34;&gt;18&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-19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-19&#34;&gt;19&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;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187086 IP 1.2.3.4.41369 &amp;gt; 93.184.216.34.33434: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187160 IP 1.2.3.4.39830 &amp;gt; 93.184.216.34.33435: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187190 IP 1.2.3.4.43467 &amp;gt; 93.184.216.34.33436: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187221 IP 1.2.3.4.50462 &amp;gt; 93.184.216.34.33437: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187254 IP 1.2.3.4.35842 &amp;gt; 93.184.216.34.33438: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187285 IP 1.2.3.4.44146 &amp;gt; 93.184.216.34.33439: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187318 IP 1.2.3.4.50311 &amp;gt; 93.184.216.34.33440: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187346 IP 1.2.3.4.34388 &amp;gt; 93.184.216.34.33441: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187375 IP 1.2.3.4.43703 &amp;gt; 93.184.216.34.33442: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187405 IP 1.2.3.4.35304 &amp;gt; 93.184.216.34.33443: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187448 IP 1.2.3.4.50157 &amp;gt; 93.184.216.34.33444: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187474 IP 1.2.3.4.58392 &amp;gt; 93.184.216.34.33445: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187503 IP 1.2.3.4.45918 &amp;gt; 93.184.216.34.33446: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187530 IP 1.2.3.4.38313 &amp;gt; 93.184.216.34.33447: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187556 IP 1.2.3.4.41520 &amp;gt; 93.184.216.34.33448: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.187582 IP 1.2.3.4.55240 &amp;gt; 93.184.216.34.33449: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.225929 IP 1.2.3.4.60724 &amp;gt; 93.184.216.34.33450: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.225970 IP 1.2.3.4.43648 &amp;gt; 93.184.216.34.33451: UDP, length 32
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20:58:47.226016 IP 1.2.3.4.52561 &amp;gt; 93.184.216.34.33452: UDP, length 32
&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;I have no idea why. Performance? Getting around sysadmins who unwitting block all ICMP packets? It surprised me, at least.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Cloud translation is more expensive than I thought</title>
      <link>https://til.andrew-quinn.me/posts/selkouutiset-archive-now-supports-77-languages/</link>
      <pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/selkouutiset-archive-now-supports-77-languages/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://hiandrewquinn.github.io/selkouutiset-archive///2023/11/27/&#34;&gt;Example from yesterday&amp;rsquo;s news.&lt;/a&gt; Count &amp;rsquo;em yourself &amp;ndash; there&amp;rsquo;s 76 of them there.&lt;/p&gt;
&lt;p&gt;Mass i18n efforts like this are I think an underappreciated benefit of what static site generators like Hugo can give you. Actually, &lt;em&gt;especialy&lt;/em&gt; Hugo &amp;ndash; it&amp;rsquo;s multi-language support is very good, like darn near everything about the platform once you get past the initial learning curve.&lt;/p&gt;
&lt;p&gt;Another underappreciated benefit: When building HTML pages is fast, you can afford to build &lt;em&gt;a lot&lt;/em&gt; of them. A quick &lt;code&gt;hugo &amp;amp;&amp;amp; cd public/ &amp;amp;&amp;amp; fd html | wc -l&lt;/code&gt; tells us that there are about 2700 HTML files on the site, which Hugo builds in under 3000 ms on my machine. The &lt;a href=&#34;https://github.com/hiAndrewQuinn/selkouutiset-archive/actions/runs/7009764040/job/19068916472&#34;&gt;Github Action run&lt;/a&gt; which built the site as of today took a glacial 35 seconds by comparison.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Pomodoros and leverage ratios</title>
      <link>https://til.andrew-quinn.me/posts/pomodoros-and-leverage-ratios/</link>
      <pubDate>Mon, 27 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/pomodoros-and-leverage-ratios/</guid>
      <description>&lt;p&gt;I love pomodoros 🍅. But I have to admit, most of the time when I reach for them, it&amp;rsquo;s because I&amp;quot;m already having trouble staying on task with whatever I&amp;rsquo;m doing. I generally don&amp;rsquo;t get a lot of value out of the &amp;rsquo;longer break&amp;rsquo; option, a steady beat of work and breaks is enough for me.&lt;/p&gt;
&lt;p&gt;In those circumstances I often find solace in the idea that a well-constructed pomodoro creates a certain &lt;em&gt;lower bound&lt;/em&gt; on my work-to-play &lt;a href=&#34;https://www.investopedia.com/terms/l/leverageratio.asp&#34;&gt;leverage ratio&lt;/a&gt;. The classic 25 minutes on, 5 minutes off gives you a 5:1 ratio.&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>The Rule of Four</title>
      <link>https://til.andrew-quinn.me/posts/the-rule-of-four/</link>
      <pubDate>Fri, 24 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/the-rule-of-four/</guid>
      <description>&lt;p&gt;A communication heuristic, optimized for &lt;strong&gt;asynchronous communication of detailed concepts between human beings.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not really a TIL, I&amp;rsquo;ve been sitting on this one for a while.&lt;/p&gt;
&lt;h2 id=&#34;rationale&#34;&gt;Rationale&lt;/h2&gt;
&lt;h3 id=&#34;existence-proof&#34;&gt;Existence “proof”&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Our short term memory can hold &lt;a href=&#34;https://www.quantamagazine.org/overtaxed-working-memory-knocks-the-brain-out-of-sync-20180606/&#34;&gt;at best&lt;/a&gt; about 7 +/- 2 chunks of information at a time.&lt;/li&gt;
&lt;li&gt;Start with the lower end of that: 5 chunks.&lt;/li&gt;
&lt;li&gt;Assume that whatever someone is “really” trying to do takes up 1 of those 5.&lt;/li&gt;
&lt;li&gt;We’re left with 4 chunks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Organize your work processes as much as possible so that they can be effectively understood using &lt;strong&gt;at most 4 chunks of short-term memory&lt;/strong&gt;. If you feel a process is too complicated to be held like that, find conceptual fault lines to hack against until it’s true.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Hugo&#39;s Secret RSS Feeds</title>
      <link>https://til.andrew-quinn.me/posts/hugo-s-secret-rss-feeds/</link>
      <pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/hugo-s-secret-rss-feeds/</guid>
      <description>&lt;p&gt;This blog now has a swanky new RSS feed button right on the front page, courtesy of the well-designed &lt;a href=&#34;https://github.com/adityatelange/hugo-PaperMod/&#34;&gt;PaperMod theme&lt;/a&gt; powering things on the backend.&lt;/p&gt;
&lt;p&gt;Hugo newbies often don&amp;rsquo;t know that Hugo usually generates these RSS feeds &lt;em&gt;automatically&lt;/em&gt; for new websites. You usually have to go out of your way to turn them off. Example: &lt;a href=&#34;https://andrew-quinn.me/index.xml&#34;&gt;https://andrew-quinn.me/index.xml&lt;/a&gt; exists, and has existed for quite some time, without me needing to lift a finger (although I might want to put a button on my home site too!).&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Hosting on Azure? Don&#39;t forget to declare UTF-8</title>
      <link>https://til.andrew-quinn.me/posts/hosting-on-azure-don-t-forget-to-declare-utf-8/</link>
      <pubDate>Wed, 22 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/hosting-on-azure-don-t-forget-to-declare-utf-8/</guid>
      <description>&lt;p&gt;For a long time after &lt;a href=&#34;https://andrew-quinn.me/azure/&#34;&gt;moving my website from Netlify to Azure&lt;/a&gt;, none of my fancy emoji or weird umlaut characters would display properly. Today I fixed that by popping back into the the Hugo theme I built off of &lt;a href=&#34;https://github.com/Siilikuin/minimum-viable-hugo&#34;&gt;minimum-viable-hugo&lt;/a&gt; and adding&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;&#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;&#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;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&amp;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;to &lt;code&gt;themes/minimum-viable-hugo/layouts/index.html&lt;/code&gt; and &lt;code&gt;themes/minimum-viable-hugo/layouts/partial/head.html&lt;/code&gt;. (There&amp;rsquo;s probably a way to intimidate &lt;a href=&#34;https://learn.microsoft.com/en-us/azure/static-web-apps/overview&#34;&gt;Azure Static Web Apps&lt;/a&gt; into using UTF-8 by default too, but I didn&amp;rsquo;t bother to look.)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Git controlled, user-scoped, recoverable-after-install `systemd` services and timers</title>
      <link>https://til.andrew-quinn.me/posts/user-facing-services-and-timers-with-systemd/</link>
      <pubDate>Tue, 21 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/user-facing-services-and-timers-with-systemd/</guid>
      <description>&lt;h1 id=&#34;tldr&#34;&gt;TL;DR&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;systemd&lt;/code&gt; timers are a serious upgrade from &lt;code&gt;cron&lt;/code&gt;. Accept no substitutes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.config/systemd/user&lt;/code&gt; lets you run &lt;em&gt;user-scoped&lt;/em&gt; timers and services,
&lt;ul&gt;
&lt;li&gt;in a place where you can version control them with Git easily,
&lt;ul&gt;
&lt;li&gt;and even keep a handy backup with &lt;a href=&#34;https://www.chezmoi.io/&#34;&gt;chezmoi&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;story&#34;&gt;Story&lt;/h1&gt;
&lt;p&gt;We had the great honor of having our friend Tri Phung
(&lt;a href=&#34;https://www.linkedin.com/in/tri-anh-phung/&#34;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&#34;https://github.com/json-todd&#34;&gt;GitHub&lt;/a&gt;) over for dinner yesterday. As is
often the case the conversation turned to work. I&amp;rsquo;ve been on
a kick of using Github Actions remotely and shell scripts + &lt;code&gt;systemd&lt;/code&gt;
services/timers locally to sketch out some ideas for &lt;a href=&#34;https://www.build-100-websites.fun/&#34;&gt;new websites&lt;/a&gt; in Hugo.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>That damned Debian 10 one-liner I always need to let me `sudo`</title>
      <link>https://til.andrew-quinn.me/posts/that-damned-debian-10-one-liner/</link>
      <pubDate>Mon, 20 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/that-damned-debian-10-one-liner/</guid>
      <description>&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;&#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;&#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;&#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;&lt;span style=&#34;color:#75715e&#34;&gt;# ⚠️: Reboots your VM.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;su -c &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;whereis adduser | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;whoami&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; sudo &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;whereis reboot | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&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;In all its glory! For &lt;strong&gt;Debian 10 and up&lt;/strong&gt;, because Debian 10 is where the &lt;code&gt;sysv&lt;/code&gt; to &lt;code&gt;systemd&lt;/code&gt; conversion became totalizing.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s break down quickly why each part of this is needed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Since we are trying to add ourselves to the &lt;code&gt;sudo&lt;/code&gt; group right now, we obviously can&amp;rsquo;t use &lt;code&gt;sudo&lt;/code&gt;. Enter &lt;code&gt;su -c&lt;/code&gt; to switch to &lt;code&gt;root&lt;/code&gt;, run a command, and then switch back out.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;whereis adduser&lt;/code&gt; instead of simply &lt;code&gt;adduser&lt;/code&gt; because &lt;code&gt;adduser&lt;/code&gt; is no longer in the &lt;code&gt;$PATH&lt;/code&gt; by default anymore.
&lt;ul&gt;
&lt;li&gt;Tempted to try &lt;code&gt;which adduser&lt;/code&gt;? No dice &amp;ndash; &lt;code&gt;which&lt;/code&gt; only gets you things in the &lt;code&gt;$PATH&lt;/code&gt; as well:
&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;&#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;&#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;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-2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-1-2&#34;&gt;2&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-1-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-1-3&#34;&gt;3&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;&#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;andrew@debian-10:~$ which adduser    &lt;span style=&#34;color:#75715e&#34;&gt;# zip, zilch, nada.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;andrew@debian-10:~$ whereis adduser
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adduser: /usr/sbin/adduser /etc/adduser.conf /usr/share/adduser /usr/share/man/man8/adduser.8.gz
&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;awk&lt;/code&gt; to rip out &lt;code&gt;/usr/sbin/adduser&lt;/code&gt;, which - thankfully - at least is still executable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$(whoami)&lt;/code&gt; because your name might not be &lt;code&gt;andrew&lt;/code&gt;!&lt;/li&gt;
&lt;li&gt;&lt;code&gt;whereis reboot&lt;/code&gt; because I don&amp;rsquo;t want to have to manually remember to logout and login again.&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    
    <item>
      <title>Art of the dotflag -- `.nojekyll`, `.gitkeep` and their ilk</title>
      <link>https://til.andrew-quinn.me/posts/the-art-of-dotflags-nojekyll/</link>
      <pubDate>Sun, 19 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/the-art-of-dotflags-nojekyll/</guid>
      <description>&lt;p&gt;This weekend I&amp;rsquo;ve been &lt;del&gt;procrastinating&lt;/del&gt; playing the long game by getting some nice workflows set up for my &lt;a href=&#34;https://github.com/hiAndrewQuinn/til&#34;&gt;TIL content repository&lt;/a&gt; and its associated &lt;a href=&#34;https://github.com/hiAndrewQuinn/til-site&#34;&gt;website&lt;/a&gt; (cf &lt;a href=&#34;https://til.andrew-quinn.me/posts/the-art-of-dotflags-nojekyll/#context&#34;&gt;Context&lt;/a&gt;, below). If all goes well, by the time I hit &lt;code&gt;:wq&lt;/code&gt; on this TIL, it should invisibly trigger 2 Git commits, a Hugo build, and then appear on the site fully-birthed.&lt;/p&gt;
&lt;p&gt;One of the more interesting patterns I noticed was the &lt;a href=&#34;https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/&#34;&gt;&lt;code&gt;.nojekyll&lt;/code&gt; empty file&lt;/a&gt; which I had to build to get GH Pages to stop tussling with my Hugo Action for turf. &lt;code&gt;.nojekyll&lt;/code&gt; is &lt;em&gt;technically&lt;/em&gt; a dotfile, but it doesn&amp;rsquo;t actually contain any content - its mere existence is enough to change behavior. And that makes their existence a really interesting &lt;a href=&#34;https://en.wikipedia.org/wiki/Affordance&#34;&gt;design affordance&lt;/a&gt; offered to us developers by the filesystems we use every day but rarely think about.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>A good place to symlink local builds</title>
      <link>https://til.andrew-quinn.me/posts/a-good-place-to-symlink-local-builds/</link>
      <pubDate>Sat, 18 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/a-good-place-to-symlink-local-builds/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been a big fan of both &lt;a href=&#34;https://gwern.net/spaced-repetition&#34;&gt;spaced repetition&lt;/a&gt; in general and the &lt;a href=&#34;https://github.com/ankitects/anki&#34;&gt;Anki spaced repetition system&lt;/a&gt; in particular for a long time now. So today, after a fresh new install and &lt;a href=&#34;https://github.com/hiAndrewQuinn/shell-bling-ubuntu&#34;&gt;blinging out&lt;/a&gt; of Ubuntu 23.10, I decided to take the next step, as I often do with programs I use a lot, and try to build and compile it myself.&lt;/p&gt;
&lt;p&gt;This turned out to be pretty easy! The &lt;a href=&#34;https://github.com/ankitects/anki/blob/main/docs/development.md#running-anki-during-development&#34;&gt;docs&lt;/a&gt; warn that &lt;code&gt;./run&lt;/code&gt; is slower than the non-optimized build, but I don&amp;rsquo;t notice much of a difference on my machine. It did however leave me with the question: Where should I put the &lt;code&gt;anki&lt;/code&gt; symlink to &lt;code&gt;./run&lt;/code&gt;?&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>
    
    <item>
      <title>Multi-line string literals in Fish</title>
      <link>https://til.andrew-quinn.me/posts/multi-line-string-literals-in-fish/</link>
      <pubDate>Fri, 17 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/multi-line-string-literals-in-fish/</guid>
      <description>&lt;p&gt;The Fish shell has&amp;hellip; &lt;em&gt;interesting&lt;/em&gt; syntax for multi-line string literals. The
only way I can reliably remember is to literally write them as multi-line
literals, which does make a certain kind of brutalist sense:&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;&#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;&#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;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-3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-3&#34;&gt;3&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-4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-4&#34;&gt;4&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-5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-5&#34;&gt;5&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-6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-6&#34;&gt;6&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-7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-7&#34;&gt;7&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-8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-8&#34;&gt;8&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-9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-9&#34;&gt;9&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;&#34;&gt;&lt;code class=&#34;language-fish&#34; data-lang=&#34;fish&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;kiitos&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; thankyou &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;kiitos kaynnista
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;ja tervetuloa uduelleen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;---&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; $thankyou
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;kiitos&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;reliably prints&lt;/p&gt;</description>
    </item>
    
    <item>
      <title></title>
      <link>https://til.andrew-quinn.me/posts/readme/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://til.andrew-quinn.me/posts/readme/</guid>
      <description>&lt;h1 id=&#34;today-i-learned-til&#34;&gt;Today I Learned (TIL)&lt;/h1&gt;
&lt;p&gt;I learn a lot of new things every day. At some point I decided I wanted to have
a public record of some of them, so I wrote a &lt;a href=&#34;./til.fish&#34;&gt;shell script&lt;/a&gt; to let
me open a terminal, type &lt;code&gt;til&lt;/code&gt;, and immediately jot down whatever little tidbit
I just came across. This repo is the result of that.&lt;/p&gt;
&lt;h2 id=&#34;quickstart&#34;&gt;Quickstart&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Trouble with all the programs I run in my various &lt;code&gt;.fish&lt;/code&gt; scripts? Try &lt;a href=&#34;https://github.com/hiAndrewQuinn/shell-bling-ubuntu&#34;&gt;Shell Bling Ubuntu&lt;/a&gt;, that should contain most of &amp;rsquo;em.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
