RSSAmplifier

Blog

Andrew Quinn's TILs

Recent content on Andrew Quinn's TILs

til.andrew-quinn.meRSS feed ↗94 posts

Latest posts

Back up your TOTP codes by just printing them

Scan the Quick Response (QR) code above with your favorite Two-Factor Authentication (2FA) app. You should get a six digit number, rotating every 30 seconds, that looks something like 1 2 237601 # as of Wed May 20 09:44:53 AM EEST 2026 If you then take the secret key that QR code maps to, say

Replacing a 3 GB SQLite database with a 10 MB FST (finite state transducer) binary

Note for numberphiles : all numbers have been rounded to their first significant digit, because I’m a fan of Rob Eastaway’s “zequals” method of getting to the point when it comes to estimation. It’s much more valuable to walk away with the heuristic “some dude got a 300x memory reduction by swapping out a database he hacked together for a tiny, static,…

I still like Jenkins

Before GitHub Actions , before GitLab CI/CD , and before the panoply of startups all promising to help you build your software faster and with less hassle, there was the humble, open source Jenkins . Or perhaps I should say is: Jenkins is still actively maintained to this day, and has actually been in use in basically every single place I have worked since graduating from high school, although not…

The --i-tell-you-shut-up flag

Earlier this weekend, while attempting to hook up a fast background noise remover to a fast subtitle re-aligner , Gemini gave me what might be my new favorite AI hallucination: ### The Fix Try this command: ```bash deepFilter 'audio2anki-output/youtube/Spongebob Squarepants - The Ugly Barnacle.mp3' -o - --i-tell-you-shut-up | mpv --no-video - ``` Why this version works: * `--i-tell-you-shut-up`:…

Claude Mythos and the EU Cyber Resilience Act

As of writing this I can find no Hacker News comments containing both the words “mythos” and “CRA” , which suggests I might have a first-mover advantage in writing something interesting. At last! Anthropic announced Claude Mythos Preview on 2026-04-07. Supposedly it was asked to discover thousands of zero-days across many software packages, a task which it acceded to, but…

The long death of programming languages

I wrote my first Clojure program in anger a few months ago. Only, it’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 anti-corruption layer , yapping between some REST endpoints and some ancient proprietary serialization. I had never written a Clojure program of…

Claude Code and executive function

I have a suspicion - and let me be clear, that’s all this is, a suspicion, I am taking my own claims even more lightly than usual here - that Claude Code makes most people’s lives better, but it makes the lives of those who struggle with executive function much better. When I have a problem to solve nowadays, I type c , then Enter . This alias opens up a fresh tmux window with 4…

Claude Code disproportionately benefits those who touch type

I use Claude Code. I like Claude Code. According to Steve Yegge’s Eight-Circuit Model of Claudesciousness , I’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?

Lua is a pretty good config language

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’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 1 2 10.0.0.5 192.168.1.1…

Copy-Item is 27 percent slower than File Explorer drag and drop on Windows

1 2 3 4 5 File Explorer drag & drop ########## (112 MBps) Copy-Item ####### (82 MBps) Built in SFTP client ###### (70 MBps) Built in robocopy (/MT:32) ## (25 MBps) WSL 2 rsync # (13 MBps) In table form: Tool Speed (MBps) Difference Drag and drop ~112 — Copy-Item ~82 -27% sftp ~70 -37% robocopy (with /MT:32 ) ~25 MBps -78% rsync (WSL 2) ~13 MBps -88% I feel like I’m losing my mind.

"Courage to quit" matters more for seniors, less for juniors

As a teenager first getting into computers in the late 2000s I spent a lot of time reading old revered tomes like ESR’s The Art of Unix Programming and SICP . 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 the…

Lessons learned from 2 years of operating a teensy-tiny news archive

I began running Andrew’s Selkouutiset Archive 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. Earlier in the series: Lessons learned from 6 months of operating a teensy-tiny…

Four things that help me avoid / manage mild RSI

Where is the DevOps for Yocto?

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…

LLMs solve the biggest problem with language textbooks

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 that 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…

Code should be clean because business isn't

I am an ardent capitalist. I am also an ardent Unix philosopher. I have long percieved there to be some interesting tensions between these two wolves inside me . 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. 1 The capitalist in me wants to cover as…

tarsnap is cozy

I have been aware of tarsnap for a long time, but only recently did I actually get around to using it for anything, as a result of my big personal digital resiliency audit for 2025 . For those of you not in the know, tarsnap is “online backups for the truly paranoid”, and tarsnap the command-line program is the client-side tool you invoke to actually zip up and push your archives into…

It's okay to solve a problem twice

Quoth “How to Become a Hacker” : 2. No problem should ever have to be solved twice. Creative brains are a valuable, limited resource. They shouldn't be wasted on re-inventing the wheel when there are so many fascinating new problems waiting out there. Much more at the original post, including preemptive rebuttals to what I’m about to describe. This post is entirely about…

You don't need CGO to use SQLite in your Go binary

At least not for most use cases. You can just use modernc.org/sqlite instead as your SQLite driver. For people who aren’t in the Go know, “pure” Go programs are trivially easy to compile cross-platform to all the major platforms by default. You read that right - you can just go build a single Windows executable, Mac executable, and Linux executable on the same machine and just…

Incentivize grandchildren by writing them into your will

It’s no secret that I’m a fan of economics-inspired solutions to otherwise hard problems. The other day I happened across an old post by GMU economist Bryan Caplan which I think does this very elegantly, for a problem of some interest to me. The vast majority of wills evenly divide the residuary estate between children. Mine evenly divides the residuary estate between (children and…

The second wave of spaced repetition apps

Spaced repetition has been around for a long time. If you’ve never heard the term before, it’s best described as flashcards on timers . an algorithm such as SM-2 or the more recent FSRS 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,…

Experiment registry: Can I simply enjoy everything I do?

N.B. : If I link you to this personally, it is to explain why I usually seem to be in a great mood. It’s an experiment. I’m normally in merely a good mood, and I am pushing myself to be great. This is an unusual entry for a Today I Learned site, even by my standards. But I think it’s something I would prefer to pre-register ahead of time. I’ve always been predisposed to…

Switching Vim colorschemes based on which keyboard layout I have active

Did you know Vim has a client-server model baked in? Of course it does. If you run 1 vim --servername LOVE , then in another terminal something like 1 vim --servername LOVE --remote-send '<Cmd>colorscheme peachpuff<CR>' , you&rsquo;ll find your Vim terminal switch to the creamy default theme all true gangsters love - without you actually having to do anything. I frequently flip between a US- and…

Using LLMs to generate small semantic perturbations for language learning writing practice

Still images of this GIF are at the bottom. Learning to read a language is mostly a game of getting massive quantities of comprehensible input. Learning to write that same language is a whole &rsquo;nother ballgame. But, using the 4-quadrant Anki card setup from my earlier post , I think I&rsquo;m finding more and more ways to make this as amenable to spaced repetition as possible. One thing…

The language learning &#34;Delta&#34; Anki card pattern

1 2 3 4 5 +--------------------------+------------------------------------------+ | L2, fixable | L1, intention | +--------------------------+------------------------------------------+ | L2, fixed | L1, (fixable -> fixed) explanation | +--------------------------+------------------------------------------+ The above 2x2 layout for Anki cards, which I call a &ldquo;comprehensible delta&rdquo;, is…

Save your disk, write files directly into RAM with /dev/shm

Given my interest in extending the life of my SD cards and hard drives as much as possible, I&rsquo;m surprised I haven&rsquo;t come across /dev/shm before. In a word it&rsquo;s a world-accessible RAM scratchpad, which seems baked right into POSIX, so that virtually every Unix EDIT: Linux system already has it mounted as a tmpfs by default: 1 2 ❯ mount | grep '/dev/shm' tmpfs on /dev/shm type…

LLM, JavaScript, GitHub Pages, localStorage: A recipe for free apps anyone can use

Earlier today on Hacker News Scrappy made the rounds , with the explicit tagline &ldquo;make little apps for you and your friends&rdquo;. I always like to see new projects in this vein. That&rsquo;s why I&rsquo;d like to outline my alternative approach, which Works cross-platform and on mobile devices by default, Doesn&rsquo;t require any app store tomfoolery, Has great uptime built in, Gives you…

Create multi-stage Anki card answers with HTML&#39;s <details> tag

This works as of, at least, Anki 24.06.3. According to the Mozilla Developer Network , The <details> HTML element creates a disclosure widget in which information is visible only when the widget is toggled into an open state. In standard web browsers, absent any CSS to the contrary, a <details> tag starts closed until further notice. Since Anki is basically a local web browser on top of a timer,…

LLM tutored writing practice for secondary language acquisition

Language learning for the contemporary adult learner can be broken down roughly into four highly correlated, but distinct, skillsets. Passive understanding Active production The written word Reading Writing The spoken word Listening Speaking You may know from my FOSS software that I have been learning Finnish for the past 4 years or so. For the first few years I pretty much focused exclusively on…

Consider the cronslave

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 machine that Never lost the time, Did what I wanted, how I wanted it, and Could be…

LLMs make Perl great again

Perl 5 went through a long nadir of unpopularity due in large part to its deserved &ldquo;Write Once, Read Never&rdquo; reputation. So I was surprised to find out not only is it installed by default on Debian , it&rsquo;s installed nearly everywhere by default. It&rsquo;s even the non-shell scripting language of choice on OpenBSD ! Perhaps the only thing more impressive than Perl&rsquo;s utter…

Cross-platform TUIs are easier than cross-platform GUIs

Below is a GIF of tsk , my pocket Finnish-to-English dictionary , running in my terminal emulator of choice under Linux. It&rsquo;s what the kids call a TUI , a graphical program that just happens to drive its graphics using terminal graphics instead of graphics-graphics. Insert GIF here. You can probably tell that this program fits neatly into the &ldquo;home-cooked meal&rdquo; clade of programs.…

Vibe coding and complementary goods

Peanut butter and jelly are complementary goods , as are cars and gasoline, newer cars and electricity, electricity and basically everything else. We don&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 time in learning both, and as the famous saying…

Binary search isn&#39;t about search III. Loop invariant of rightmost element search

If you followed &ldquo;Binary search isn&rsquo;t about search&rdquo; and &ldquo;Binary search isn&rsquo;t about search II&rdquo; properly, the following statements should suffice as a summary: 1 2 L[ 0 :l] < T < L[r:len(L)] # ordinary binary search loop invariant L[ 0 :l] < T <= L[r:len(L)] # leftwise binary search loop invariant Let&rsquo;s complete the triptych. Take a wild guess what invariant…

Binary search isn&#39;t about search II. Loop invariant of leftmost element search

In the first &ldquo;Binary search isn&rsquo;t about search&rdquo; post, we spoke about using assert statements to enforce your loop invariants . Our plain old everyday binary search invariant can be summarized as such: For all x in L[0:l] 1 , x is strictly less than T , the element we are searching for. For all y in L[r:len(L)] 2 , y is strictly greater than T , the element we are searching for.…

Binary search isn&#39;t about search

Suppose you&rsquo;re trying to track down a bug that appeared in a series of Git commits. You&rsquo;ve been idly keeping track of where this bug appears in your lucky commits by hand, while busy with other things. So far you&rsquo;ve compiled this table: 1 2 3 4 5 6 7 8 9 10 0000000 🧼 clean, no bug. 0000001 🧼 0000002 🧼 0000003 🧼 0000004 🧼 0000005 🧼 0000006 🐛 bug first appears here. 0000007…

Things you should never do: Use Expect to autotype SSH passwords in scripts

Before I moved to Finland, I spent some time in the Hobbesian war of all against all that is Wisconsin 1 . Men were men back in that less civilized age, and &ldquo;cybersecurity&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 real work, which I must emphasize you should never do , we had Expect .…

SQLite is learnable

This is a response to pid1.call&rsquo;s &ldquo;Siren Call of SQlite on the Server&rdquo; , which itself is a response to articles like Wesley Aptekar-Cassels&rsquo;s &ldquo;Consider SQLite&rdquo; espousing SQLite as a server-side technology. Cards on the table, I both love SQLite and think pid1 has the more correct take here. When I decided on a dime after college to move countries and be with my…

`python -m http.server` as ephemeral Dropbox

Ever need to download a file from a server &ndash; or get someone else to download a file from a server, who may not be comfortable with or should have access to scp or sftp ? Turns out, if you have Python installed &ndash; and you probably do &ndash; it comes with a handy one-liner file server for just such an occasion: 1 python -m http.server 12345 # or whatever port you prefer

Common-sense security for SSH on a new Debian server

Last night I went to DigitalOcean and spun up a tiny new, $4/month droplet &ndash; on my own dime! It sounds crazy, but I&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&rsquo;s time to finally put some of my own skin in the game with this whole…

Enforce GPL compliance by offering bounties?

Epistemic status: Very unclear, also I Am Not A Lawyer This Is Not Legal Advice Get Off My Lawn (N.B.: I"m using &ldquo;GPL&rdquo; with broad strokes here, to point at &ldquo;open source licenses it&rsquo;s straightforward to run afoul of&rdquo;.) Policing is always hard in a world of limited resources. Especially when one is targeting sophisticated, well-monied criminal organizations, it can take…

The self-hosted to DevOps engineer pipeline

What&rsquo;s the best way to get a job? Show someone with a job to do that you can do the job within their iron triangle . What&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 your own complicated k8s infrastructure.…

PHP, Go, and Braindead Deployment

If you&rsquo;ve been following my posts recently, you might have noticed that I&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 a strangely healing experience for me. I&rsquo;d like to say it&rsquo;s because my experiments with Laravel , the only OSS work of which I can point to is testing the Homestead VM&rsquo;s…

What I would recommend to teens in 2024 who want to get into development

PHP and Web Dev Phobia

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. So here I&rsquo;d like to make them aware of it! That&rsquo;s right, this is a Slowstart for people who have never touched PHP or web dev before. Start the way we usually do on this blog, with the…

How I ask GPT-4 to make tiny Python scripts in practice

First get a working script. &ldquo;Hey GPT-4, write me a ChatGPT script that does .&rdquo; Manually check over the script and iterate until it&rsquo;s giving me what I want. &ldquo;Now wrap the script into a click command-line interface.&rdquo; I almost always specify to use an --input flag and an --output flag. If the data it&rsquo;s working with is human-readable, &ldquo;Make it so that if…

The highest personal ROI program I have written so far

It would have to be finstem , a simple command-line program I wrote to reduce Finnish words down to their root form. 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 &ndash; that is, until you factor in its very regular orthography and the phenomenal efforts…

My pet theory of how great software gets started

(Inspired by yungporko&rsquo;s Ask HN post , which got me thinking.) 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 &ldquo;that guy who does our Excel&rdquo;, or as large as the scene itself . This is owing to the fantastic generality of software as a way to make almost anything…

What scripting languages come out of the box on Debian 12?

Poking around in a fresh VM in Vagrant , I see bash dash , a POSIX compliant shell linked under sh python3 , 3.11.2 at the time of writing awk , specifically mawk sed , if you count that (I do) perl , specifically Perl 5 There may be others I missed. Why I&rsquo;m curious: Knowing that a language is installed by default on the most popular Linux distribution can simplify certain concerns…

Valuable software is about letting people do new things

Today I released a dump of six months of flashcards I autogenerated from my tiny Finnish news archive to make the lives of my fellow language learners easier. The actual code which generates this archive is about 300 lines of Python . The basic value add for the user: What you want : Better fluency in Finnish. What you need : Practice. Lots of it. What this gives you : GOTO 2. This is emphatically…