Things Word has that SSGs, by and large, don't

Recommendations appreciated. Disclaimer: Most of these make little sense in an Internet medium anyway. An index. An index simply lists the terms and topics discussed in a document, along with the pages they are listed on. A glossary. Could be as simple as a CSV file of terms and definitions, or as complex as a whole extra glossary/ folder. Related: A “Acronyms and Abbreviations” section. Even moreso than the last, this could be a simple CSV. A built-in site-wide search function. Word gets around this by having everything open at once. A list of tables. Huge if you want your dead-trees books to match your shiny new website. A list of figures. Ditto. A list of referenced external documents. CSV! Say it with me! The reason I compiled this list was because I decided to investigate whether I could use Hugo at work to generate our client-facing documentation. Currently we are using an unholy combination of Word and Confluence, and I figured that the magic of Git might help us keep our docs updated in a more sane way. ...

November 30, 2023

traceroute uses UDP by default, not ICMP

At least on Linux. Don’t believe me? Run tcpdump -nn -i <interface> 'host example.com' in one shell and traceroute example.com in another. tcpdump will pick up all 3 of {ICMP, UDP, TCP}, and on my machine the pattern is clear: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20:58:47.187086 IP 1.2.3.4.41369 > 93.184.216.34.33434: UDP, length 32 20:58:47.187160 IP 1.2.3.4.39830 > 93.184.216.34.33435: UDP, length 32 20:58:47.187190 IP 1.2.3.4.43467 > 93.184.216.34.33436: UDP, length 32 20:58:47.187221 IP 1.2.3.4.50462 > 93.184.216.34.33437: UDP, length 32 20:58:47.187254 IP 1.2.3.4.35842 > 93.184.216.34.33438: UDP, length 32 20:58:47.187285 IP 1.2.3.4.44146 > 93.184.216.34.33439: UDP, length 32 20:58:47.187318 IP 1.2.3.4.50311 > 93.184.216.34.33440: UDP, length 32 20:58:47.187346 IP 1.2.3.4.34388 > 93.184.216.34.33441: UDP, length 32 20:58:47.187375 IP 1.2.3.4.43703 > 93.184.216.34.33442: UDP, length 32 20:58:47.187405 IP 1.2.3.4.35304 > 93.184.216.34.33443: UDP, length 32 20:58:47.187448 IP 1.2.3.4.50157 > 93.184.216.34.33444: UDP, length 32 20:58:47.187474 IP 1.2.3.4.58392 > 93.184.216.34.33445: UDP, length 32 20:58:47.187503 IP 1.2.3.4.45918 > 93.184.216.34.33446: UDP, length 32 20:58:47.187530 IP 1.2.3.4.38313 > 93.184.216.34.33447: UDP, length 32 20:58:47.187556 IP 1.2.3.4.41520 > 93.184.216.34.33448: UDP, length 32 20:58:47.187582 IP 1.2.3.4.55240 > 93.184.216.34.33449: UDP, length 32 20:58:47.225929 IP 1.2.3.4.60724 > 93.184.216.34.33450: UDP, length 32 20:58:47.225970 IP 1.2.3.4.43648 > 93.184.216.34.33451: UDP, length 32 20:58:47.226016 IP 1.2.3.4.52561 > 93.184.216.34.33452: UDP, length 32 I have no idea why. Performance? Getting around sysadmins who unwitting block all ICMP packets? It surprised me, at least. ...

November 29, 2023

Cloud translation is more expensive than I thought

Example from yesterday’s news. Count ’em yourself – there’s 76 of them there. Mass i18n efforts like this are I think an underappreciated benefit of what static site generators like Hugo can give you. Actually, especialy Hugo – it’s multi-language support is very good, like darn near everything about the platform once you get past the initial learning curve. Another underappreciated benefit: When building HTML pages is fast, you can afford to build a lot of them. A quick hugo && cd public/ && fd html | wc -l tells us that there are about 2700 HTML files on the site, which Hugo builds in under 3000 ms on my machine. The Github Action run which built the site as of today took a glacial 35 seconds by comparison. ...

November 28, 2023

Pomodoros and leverage ratios

I love pomodoros 🍅. But I have to admit, most of the time when I reach for them, it’s because I"m already having trouble staying on task with whatever I’m doing. I generally don’t get a lot of value out of the ’longer break’ option, a steady beat of work and breaks is enough for me. In those circumstances I often find solace in the idea that a well-constructed pomodoro creates a certain lower bound on my work-to-play leverage ratio. The classic 25 minutes on, 5 minutes off gives you a 5:1 ratio. ...

November 27, 2023

One problem with user-scoped `systemd` timers

I’ve discovered one big downside of [putting systemd times into ~/.config/systemd/user/][1]: They stop running when you log out. Two ways around this problem: Bite the bullet, and install the timers into /etc/systemd/. This means giving up chezmoi version control, making the overall system more snowflake-y. I’m not crazy about it. Remote in with tmux, instead of ever logging out, just use C-b d to detach from the session. I’m going with #2. The lead developer of ktty is known not to like tmux, so there’s probably a way to detach long-running SSH sections inside of kitty itself – but I haven’t found it yet. Have you? ...

November 26, 2023

Promoting Blog Tag Reuse with `fzf`

Some more updates to the main repo of this TIL site today, in particular I have added a new fzf-tags.fish script. til uses this script to Scrapes all the YAML tags: frontmatter from all current Markdown posts, Puts me into a multi-select fzf menu containing them, and Puts anything I select into the tags: of the new blog post. Tags form natural breadcrumb trails throughout a blog as it grows organically over time. Many an afternoon have I spent reading one or two particular tags of interest from a prolific blog. But, if you don’t remember to reuse the tags in the first place, you’ll never build the trail in the first place. ...

November 25, 2023

The Rule of Four

A communication heuristic, optimized for asynchronous communication of detailed concepts between human beings. Not really a TIL, I’ve been sitting on this one for a while. Rationale Existence “proof” Our short term memory can hold at best about 7 +/- 2 chunks of information at a time. Start with the lower end of that: 5 chunks. Assume that whatever someone is “really” trying to do takes up 1 of those 5. We’re left with 4 chunks. Conclusion Organize your work processes as much as possible so that they can be effectively understood using at most 4 chunks of short-term memory. If you feel a process is too complicated to be held like that, find conceptual fault lines to hack against until it’s true. ...

November 24, 2023

Hugo's Secret RSS Feeds

This blog now has a swanky new RSS feed button right on the front page, courtesy of the well-designed PaperMod theme powering things on the backend. Hugo newbies often don’t know that Hugo usually generates these RSS feeds automatically for new websites. You usually have to go out of your way to turn them off. Example: https://andrew-quinn.me/index.xml exists, and has existed for quite some time, without me needing to lift a finger (although I might want to put a button on my home site too!). ...

November 23, 2023

Hosting on Azure? Don't forget to declare UTF-8

For a long time after moving my website from Netlify to Azure, none of my fancy emoji or weird umlaut characters would display properly. Today I fixed that by popping back into the the Hugo theme I built off of minimum-viable-hugo and adding 1 <meta charset="utf-8"> to themes/minimum-viable-hugo/layouts/index.html and themes/minimum-viable-hugo/layouts/partial/head.html. (There’s probably a way to intimidate Azure Static Web Apps into using UTF-8 by default too, but I didn’t bother to look.) ...

November 22, 2023

Git controlled, user-scoped, recoverable-after-install `systemd` services and timers

TL;DR systemd timers are a serious upgrade from cron. Accept no substitutes. ~/.config/systemd/user lets you run user-scoped timers and services, in a place where you can version control them with Git easily, and even keep a handy backup with chezmoi! Story We had the great honor of having our friend Tri Phung (LinkedIn, GitHub) over for dinner yesterday. As is often the case the conversation turned to work. I’ve been on a kick of using Github Actions remotely and shell scripts + systemd services/timers locally to sketch out some ideas for new websites in Hugo. ...

November 21, 2023