posts
- The Build Was Green the Whole Time
The migration compiled and its tests passed. Then the software ran, and five failures turned up that no build step had reported.
- Upgrade Errors That Named the Wrong Layer
Five Maven repos, three framework families, one JDK 25. Most errors pointed at a layer the fix didn't live in. The first failure printed nothing.
- Hardening the box you're logged in through
Earlier that night I killed the poller that would have proved me wrong. Under twenty minutes later, the changes went in with their tests written first.
- Six gotchas deep in RouterOS containers
RouterOS containers use the same vocabulary as Docker. The meanings diverge in six specific, time-consuming ways.
- 572,000 domains and the router barely notices
Network-wide ad blocking on a MikroTik hAP ax3 with blocky in a container — no Pi-hole, no separate box, and a DNS trick that defeats client DoH bypass.
- Two libavcodecs behind one soname
mpv plays HEVC fine. Haruna, built on libmpv, says no decoder exists. Same soname, different library — and the dynamic linker picks the wrong one.
- Designing alerts you'll actually understand at 3am
The first SMART digest was technically complete and humanly useless. re=344 means nothing at 3am. Here's the redesign that does the thinking for you.
- Salvaging a dying disk by partitioning around the wound
A drive SMART calls dead had all 58 bad blocks in the first 5% of the platter. Read the map, partition past the wound, reclaim 6.7 TiB.
- Reallocated sectors: is your drive dying or just scarred?
One drive had 344 reallocated sectors, the other had zero. The one with zero was dying. The raw count lies; the delta under a forced write pass tells the truth.
- Stop chasing a sensor that doesn't exist
The LSI SAS2008 HBA cooking itself has no temperature sensor. No tool, driver, or root binary conjures a number that was never wired to the die.