Andrew Quinn’s TILs

A place to keep track of things I’ve learned. Inspired by Simon Willison’s TILs.

All thoughts, opinions, etc. expressed herein are strictly my own and not of my employer’s.

Consulting available under the business name Siilikuin. For inquiries please email my first name at siilikuin.com.

Comments at the bottom of every page, including this one - check it out!

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 ## (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 ~25 MBps -78% rsync (WSL 2) ~13 MBps -88% I feel like I’m losing my mind. ...

December 6, 2025

"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 surprisingly scriptable MMORPG I was into 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 “He’s an egghead, and we like that, but we really need someone who actually does things” and more “He’s a meathead, but inside of that meathead is an egghead waiting to be revealed. We need this kind of junior dev yesterday.” I would have done this even though an objectively far superior tool had already existed for quite some time, making this project “feel like” dead weight in the wide world of software! But why? ...

November 29, 2025

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 news archive. I stand by those points, and have some more to add here at the 24-month mark. ...

October 27, 2025

Four things that help me avoid / manage mild RSI

October 10, 2025

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 infrastructure (sorry, Nix, I’m not in love with you, I’m in love with the idea of you). ...

September 27, 2025

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 phrases and moving gradually up in difficulty.) ...

September 25, 2025

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 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 liquid death of another kind. What to do? ...

September 20, 2025

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 the vault. Its creator, Dr. Colin Percival, is a really smart and interesting dude for a whole bunch of reasons. I’m led to believe the whole business is basically a two-man show between him and his brother these days. ...

September 10, 2025

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 cataloguing my own error. 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. ...

August 22, 2025

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 ship it: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # This can all happen on the same box! export CGO_ENABLED=0 # no c cross-compilation please export GOOS=linux GOARCH=amd64 go build -o hello-linux-amd64 hello.go GOARCH=arm64 go build -o hello-linux-arm64 hello.go export GOOS=darwin # aka mac GOARCH=amd64 go build -o hello-darwin-amd64 hello.go GOARCH=arm64 go build -o hello-darwin-arm64 hello.go export GOOS=windows GOARCH=amd64 go build -o hello-windows-amd64.exe hello.go GOARCH=arm64 go build -o hello-windows-arm64.exe hello.go This was the real reason I chose Go over Python for tsk, my instant-search Finnish to English pocket dictionary. I wanted to be able to give Windows users a single .exe they could just run and have work out of the box. ...

July 18, 2025