<?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>Installing-Software on Andrew Quinn&#39;s TILs</title>
    <link>https://til.andrew-quinn.me/tags/installing-software/</link>
    <description>Recent content in Installing-Software on Andrew Quinn&#39;s TILs</description>
    <image>
      <title>Andrew Quinn&#39;s TILs</title>
      <url>https://til.andrew-quinn.me/papermod-cover.png</url>
      <link>https://til.andrew-quinn.me/papermod-cover.png</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 20 Sep 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://til.andrew-quinn.me/tags/installing-software/index.xml" rel="self" type="application/rss+xml" />
    <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>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>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;amp;m=159041121804486&amp;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>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 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>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>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>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>
    
  </channel>
</rss>
