<?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>Design-Affordances on Andrew Quinn&#39;s TILs</title>
    <link>https://til.andrew-quinn.me/tags/design-affordances/</link>
    <description>Recent content in Design-Affordances on Andrew Quinn&#39;s TILs</description>
    <image>
      <title>Andrew Quinn&#39;s TILs</title>
      <url>https://til.andrew-quinn.me/papermod-cover.png</url>
      <link>https://til.andrew-quinn.me/papermod-cover.png</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 25 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://til.andrew-quinn.me/tags/design-affordances/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>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;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&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>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;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;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;-webkit-text-size-adjust:none;&#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>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>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>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>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>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>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>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>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>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>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;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;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>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;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34; id=&#34;hl-0-1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#hl-0-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;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>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>
    
  </channel>
</rss>
