It’s been a few weeks of feeling under the weather. Tired in the evenings, shortness of breath, a runny nose, and a scratchy and painful throat. It appears to be correlated to the atrocious Berlin air quality and likely related to the unwinnable fight against the dust in my apartment.
I, for one, welcome the sunny weather! But outside, I can taste the dust in the air. Occasionally the dust clouds are visible, even. No wonder this is affecting my health.
I’m also mentally under the weather because of World Events.
Quick bits
-
I keep getting up earlier and earlier, even before 6 AM. I am certainly a morning person, but it makes evening activities (like my acting class) rather difficult.
-
SoundCloud has become so enshittified, full of ads and interruptions and upsells. It’s a loss.
-
I have blocked WhatsApp on WhatsApp. I despise how WhatsApp uses a fake user account to send news updates.
-
My code editor, Zed, has updated terms of use that say “You must be 18 or older to use Zed.” Wild.
-
I removed my home row mods. I didn’t find them particularly useful.
-
YouTube has started recommending me videos on how to regain control and stop being distracted by my phone. It made me realize how I don’t really use my phone much. I don’t have a lot of social media at all!
-
Claude Code bizarrely started writing its agent interaction to a
.rbfile with example shell commands enclosed in backticks and then tried to execute the.rbfile. Military-grade remote code execution. I am very glad that I’ve set Claude Code to require manual approval for every command to be executed.I’m fucking done with trying out LLM-assisted code generation; it’s been a dangerous waste of time at the very least. I’m repeating myself, but it is well beyond me why people think this is good tech.
More nanoc optimization work
Last week, I mentioned further Nanoc optimization opportunities. This week, I looked into using dbm and variants for storing temporary data, with no luck:
-
My implementation with
dbmkeeps segfaulting. It’s been proven so unreliable that I won’t look into it further. -
I tried sdbm but that wasn’t a success because values are limited to about 1 KiB. I need more!
-
I considered SQLite, but I suspect it wouldn’t perform that great.
There are other key-value stores that might work well, but nearly all of them would add an external, non-gem dependency to Nanoc, which isn’t acceptable. Also, most of these key-value stores seem to be unmaintained. I suspect that the golden age of key-value stores is over. RIP.
Then I got an idea: I can avoid data recompression altogether, and avoid decompression until it’s needed (which might be never). The resulting PR brings a nice speedup and doesn’t meaningfully increase storage requirements.
With this change, my own site recompiles in about 0.9s. That’s down from about 1.0s before this change; down from about 1.25s from last release, and down from 1.7–1.8s in December. Overall, an almost 50% reduction in compilation time with no changed items.
The performance regression I mentioned last week isn’t real, so there was nothing left to stop me from doing a Nanoc release — and so Nanoc 4.14.7 is out now.
So what’s next for Nanoc?
On a site with no changes, most time is now taken up by the DependencyStore — loading and storing its data takes about 35% of the entire runtime. That could be the next one to tackle, but it’ll need a different approach; I don’t see how I could lazily load parts of a directed graph.
My focus, I think, needs to be on improving incremental compilation, eliminating needless recalculation. There’s still quite a bit of that; for example, changing a layout currently leads to the injected body (via e.g. <%= yield %>) being recomputed too — and if the site has pretty much only one layout, that means recompiling everything. Making the incremental compilation more fine-grained will have the biggest impact in terms of (re)compilation speed, so that’ll be my next focus.
As always, no promises on when that’ll be done, because I’ve got plenty of other things on my plate as well.
Car traffic hell
Car traffic in my area is hell to the point that I don’t go for walks anymore. Car drivers will make use of pedestrian paths. They’ll park on designated pedestrian areas with clear “no stopping” signs. They often no longer stop at zebra crossings; you better make sure you as a pedestrian are not in the way. Drivers will remarkably often ignore the red light at intersections. It just keeps happening.
I live right next to a street that is supposed to be a 30 km/h street. But it’s not a local road: it’s a straight road with multiple lanes. It’s more of an arterial: it is officially designated as a federal highway, so it’s not entirely surprising that car drivers occasionally go well over 100 km/h on there. Right next to daycares. Right next to bikes on unprotected bicycle lanes.
This whole area was developed only recently — in the last then years. It is bizarre how atrocious German city planning is. But it’s consistent with other planning disasters, like the new obscenely expensive highway (the extension to the A100) that dumps its traffic on a local road. The chaos there is palpable.
With all the car chaos, it is perhaps no wonder, then, that cyclists claim the sidewalks as their own.
Git branch naming
I’ve settled on a Git branch naming scheme that I rather like. Here’s how I create my branches:
git checkout -b denis/(date +"%Y-%m-%d")/speedup
Here are the parts:
-
denisis my name, and I use it as a namespace. (I have never had a coworker with the same name as me.) -
(date +"%Y-%m-%d")1 is the date in YYYY-MM-DD format. Sometimes, branches remain unfinished and get old; having a date allows me to filter out ancient branches. -
speedupis a short summary of the change in this branch. I’m often a little terser than is perhaps reasonable.
If I’m using a ticketing system, I might add the ticket/bug/issue/card ID to the branch name as well. Linear connects it up automatically, which is nice.2
When a branch has become irrelevant before it’s merged, I’ll rename the branch to add the archive/ prefix. This approach allows me to filter out ancient branches.
Links
-
The Best Movies Of 2025 (The Vito Awards) (Patrick (H) Willems):
-
Weird Al Yankovic is a Lesbian: a PSA: A strong point.
-
A new California law says all operating systems, including Linux, need to have some form of age verification at account setup (Andy Edser for PC Gamer): This sure is dumb.
-
North American English Dialects, Based on Pronunciation Patterns (Rick Aschmann): Fascinating. A little dense — just a little.
-
Language learning methods that actually work #1: The binge (Overthinking the apocalypse): I’ve been quite aware of how bad Duolingo is. After years of doing Spanish on Duolingo, I barely know the language. It hasn’t been entirely useless, just deeply ineffective.
Tech links:
-
The Government Uses Targeted Advertising to Track Your Location. Here's What We Need to Do. (Lena Cohen and Hudson Hongo for EFF): Ad blockers are an essential privacy feature. I swear by uBlock Origin and Blocky.
-
Ars Technica Fires Reporter After AI Controversy Involving Fabricated Quotes (Maggie Harrison Dupré for Futurism): Good.
-
Propellant. (Ethan Marcotte)