Wayback
Docker transfer settings in kOps
1 min Exposing Docker transfer settings in kOps required carrying them through internal types, versioned APIs, conversions, copies, and the CRD.
Another father and son
1 min A paintball seller wanted his equipment to go to someone who would make more memories with it.
Only Four
2 min Returning to paintball with my son, accumulating too much gear, and deciding what was fit to pass on.
A Book We Could Hold
2 min Emily wrote Braving Uncertainty, Nick Purvis drew it, and I helped turn the pages into a printed book.
Two commas and no error
1 min A nil embedded Go pointer made one JSON encoder emit an extra comma; comparing the same value with the standard encoder isolated it.
Circle inside a triangle
3 min Emily and I got our first tattoos on Leap Day 2020. Mine was the Fano plane, and the artist did not do geometric work, so I had to say which part of the shape mattered.
The target was already there
1 min One Makefile alias exposed Kubernetes’ existing OpenAPI generator without adding another implementation.
More Than the Printer
4 min Why a tiny resin printer needed a room full of washing, trimming, inspection, and curing.
The type disappeared
2 min Inlining OpenAPI references preserved fields while removing the type identity that policy transforms needed.
Pushing terminfo over ssh’s stdin
2 min Fixing ‘unknown terminal type’ by streaming terminfo through ssh’s stdin and compiling it remotely, with no separate copy step.
A desk that stops
1 min A dual-motor standing frame under a butcher-block top from Menards. The memory buttons stop it dead. I am still sitting at it.
Between teams
2 min From judging Technovation apps to helping teams at Wayzata Central Middle School make their own.
Which coordinate changed?
2 min Two Mini Delta leveling defects came from different numerical mistakes: applying a delta as an absolute value and forgetting to square one axis.
Printer profile as source
3 min I kept my Mini Delta’s slicer profile in Git, with derived settings and calibration changes recorded as diffs.
td
2 min A tmux session keyed by a raw directory path, with extra commands smuggled through a trailing semicolon.
Maintaining the invariant
2 min The cost of coordination does not disappear when a meeting does.
atexit for bash
3 min A LIFO exit-handler stack from jira-nice, with a nonstandard signal map and a broken pop-by-count path.
The repo is the .jira.d
2 min jira-nice makes its own checkout the go-jira config directory with one symlink, and inherits a parent repo’s Jira defaults with one extra glob path.
shutils.jq
3 min Turning jira-nice’s JSON options into Bash declarations, with a saved JSON copy and some sharp limits on what can cross the boundary.
Escaped spaces in tmux’s terminfo
1 min Twelve escaped spaces interrupted tmux’s SGR capability; removing them restored the intended terminal control sequence.
Truecolor escapes in diff-so-fancy
1 min Bold plus truecolor foreground and background exceeded diff-so-fancy’s seven-field escape-sequence limit.
The q Family
2 min About thirty git aliases built on a grammar: q queries, suffix letters add verbs, doubling escalates, a trailing q quiets, and a bang means force.
diff-so-fancy Without the Pipeline
2 min A git pager that runs diff-so-fancy inside less via LESSOPEN and degrades to plain less on machines that don’t have it.
Exit 99
2 min Dotfiles that fast-forward themselves at login and re-exec the running shell, coordinated by one exit code.
The FETCH_HEAD Throttle
2 min date -r FETCH_HEAD as the entire last-fetch database: no state file, a 12-hour window, and an epoch backdate to force retries.
cognito
3 min A tiny shell private mode that stops history, makes up-arrow forget, and hides its own switches.
mkdir elects one builder
3 min Atomic directory creation elects one builder, but every error is treated as a lost race and losers continue before the winner is ready.
The socket car
3 min My son’s Pinewood Derby car was a pine plank with a chrome socket at the tail. Number 40 finished one spot out of the trophies.
The deferred namespace
3 min A custom Python namespace records imports, then resolves deferred names on first lookup.
Source ready to distribute
2 min A source release can include generated C, headers, and version data without requiring those artifacts to live in the original checkout.
Why not ZIP?
1 min In the packaging discussion I favored ZIP’s mechanics and Python’s existing use of it; the source-distribution contract chose tar.gz.
Assume physical access
7 min An Exosite webinar on connected-device security: what a datacenter’s layers of protection become when the device is in someone else’s hands.
Let the client carry the bytes
1 min An S3 upload proxy became unnecessary once the service could authorize an upload by returning a presigned URL.
The old certificate still matters
1 min A Convox proposal left certificate replacement to CloudFormation and kept the previous certificate available for rollback.
The stack’s other name
2 min Convox needed rack-scoped cloud identities while keeping short application names and recognizing stacks created under the old naming scheme.
D is for dog
1 min A little Python program I wrote with my first-grade son: type a letter, hear an animal.
Materializing a default
1 min settingsd copied a mutable fallback correctly, then lost edits because the copy had never become namespace state.
Static Python
7 min zippy: a PGO-built CPython with every C extension statically folded in, the application zipped onto the tail of the binary, and the interpreter treated as just another dependency.
Logging after the fact
3 min retrospect instrumented already-compiled Python functions by swapping in rewritten code objects at runtime—and restored the exact original on request.
Validation before initialization
1 min Python-SAML checked for embedded certificates through state its constructor had not assigned yet.
settingsd
3 min conf.d for Python settings, with ordered executable fragments and a record of where assignments came from.
Reading a kernel version out of a bzImage
2 min hexdump plus strings pulls the version string from a kernel image via the x86 boot protocol’s version pointer at offset 0x20E.
Where Shell Hides Bugs
4 min Three latent shell bugs from my own repos: a config knob wired to nothing, a readability cleanup that inverted a boot flow, and a bashism hidden by discarded error output.
The polyglot activate script
2 min zippy’s bin/activate was six lines valid in both bash and Python, and sourcing it executed itself to print its own exports.
NUL-joined argv
2 min Write a readable Python argv literal with NUL separators, provided every formatted value is NUL-free.
The settrace ambush
3 min CPython 2 had no general hook after PySys_SetArgv finalized startup state but before user code, so zippy’s site.py armed a one-shot trace function.
Couch Multiseat
4 min Five weeks to build a from-scratch X11 window manager that gave each gamepad an independent pointer so several Minecraft clients could share one TV.
Xacto
4 min Deriving a command tree from Python modules and signatures, then making tool discovery work across deferred imports and ZIP files.
Callable modules
2 min A CPython experiment put a module body inside a function, made attributes share its globals, and used a call to execute it again.
A file with size zero
1 min uWSGI read a procfs setting as empty because its file reader trusted stat size instead of reading to EOF.
Returning the fault
1 min Suds could return different fault types through different paths; I proposed returning the same WebFault object callers could otherwise catch.
The other serializer
1 min A Celery event setting failed despite an explicit accept list, and embedding the worker in uWSGI amplified the retry loop.
A Desk at Schlitz Park
2 min A desk at Corvisa’s Schlitz Park office, and the team where I learned to stop building past the problem.
Quotes for the next parser
2 min A Distil build exposed two separate needs: keep the compiler argument together, and preserve the quotes inside its C macro value.
The mapping constructor
1 min A one-line Spyne change let the configured mapping type receive the member pairs the serializer already produced.
Building against the metadata
5 min Distlib and Distil exposed the practical edges of a static Python build: incompatible local candidates, ZIP resources, changing schemas, and executable build steps.
python32.3
1 min A bulk shebang rewrite left gprof2html.py asking for an interpreter that never existed. Arch was patching it with sed, so I sent the report upstream.
GridFUSE
4 min A filesystem experiment over MongoDB GridFS: directories as queries, new versions on overwrite, and deletion through a visibility flag.
A Rack of My Own
2 min A rolling workstation that kept the screens, computers, and cabling together whenever I moved.
Threesixty
4 min Xbox 360 through a compressed VPN to DigitalOcean, with a live player map, traffic-based host estimates, and replayable captures.
[b]in
2 min Wrapping one letter in a character class turns every PATH candidate into an existence test.
The VPython Years
2 min I learned Python for a 3D library, then kept following its imports and build machinery into the language itself.
uWSGI
5 min Learning through a server I wanted to use for almost everything: embedded files, Python entry points, packet boundaries, and the order things came alive.
Before partialmethod
2 min The Python 2 recipe for binding a functools.partial as a method—three-argument MethodType plus update_wrapper—and the stdlib name that replaced it.
A paste from the terminal
2 min Adding multipart uploads to pastie-sane meant accepting files, recognizing compressed text, and returning a link a shell user could use.
Nested AMQP tables through librabbitmq
2 min An unmerged librabbitmq patch taught a Python/C boundary to carry nested AMQP tables and arrays instead of flattening their structure.
A logo that was a glyph
2 min Drawing the pyjs logo into a font, then losing it during conversion.
Relocatable Python with $ORIGIN
3 min A runtime library path relative to the executable lets a built interpreter move as a tree—verified in the ELF policy and the loader’s result.
bcrypt in the auth query
2 min A pam_pgsql path could not verify Django’s bc$ bcrypt value directly, so SQL performs the check and returns the submitted password as its own answer.
Before the handler
1 min Missing AMQP properties could trap Kombu in a delivery-time KeyError before user code received the message.
Converting a daemon by deleting machinery
2 min The systemd conversion checklist from a mailing-list reply: forking, pidfiles, private logs, and stop scripts all come out.
$JAVA_OPTS is an argv problem
2 min One variable string becomes one argument or several depending on who tokenizes it—verify the argv, not the config text.
After the image is built
2 min A PandaBoard needed one more image-wrapping step after mkinitcpio, and the available extension points ran at the wrong stage.
A missing zero in fwknop
1 min An idle fwknop daemon kept waking because a microsecond constant disagreed with the fraction written beside it.
The self:// Remote
2 min A made-up URL scheme as the dotfiles origin, resolved per machine by layered insteadOf rewrites—local mirror for fetches, GitHub for pushes.
The type of infinity
1 min Spyne’s unbounded defaults used float infinity, which made Decimal validation depend on the Python version.
Comments at the parser boundary
1 min XML comments were becoming empty RPC models; configuring the parser removed them before either decoder saw them.
Optional and nil
2 min Two Spyne fixes separated whether an XML element must appear from whether its value may be nil.
Never Boot the Real Root
5 min The __active/__snapshot/__rollback scheme: snapshot-and-rollback boot for Arch, with a conversion wizard living inside the initramfs.
What Happened With pyjs
7 min Working on a Python-to-JavaScript toolkit, the 2012 split, and what I would do differently.
/proc/self/tags
4 min Proposing process-relative cgroup tags after an earlier namespace question exposed an isolation guarantee that never existed.
Process substitution as a pipe endpoint
2 min A successful read-write open retains a process substitution’s pipe for independently launched producers and consumers.
Dropping a job from Bash’s table
2 min A Bash idiom let an outer subshell finish while a grandchild kept running; it was a narrow SSH workaround, not portable daemonization.
Sourcing generated shell is still execution
2 min Using /dev/stdin avoids eval’s call-site quoting hazard and keeps generated code inspectable; it does not reduce the injection surface.
Callback identity for WebKit DOM events
2 min Making WebKit’s DOM events usable from Python required callback types, lifetime information, and an identity the remove operation could recognize.
A Train World
1 min A quieter tabletop, a collection of Target train pieces, and one connected wooden railway.
Appending compressed logs
1 min An old mirror script appended complete gzip members, letting each run add compressed output without reopening the previous stream.
The CR-48’s developer switch
3 min An exchange with Richard Stallman about whether Chrome OS notebooks let their owners replace the software, after I had put Arch on a CR-48.
Pushing Into a Live Home Directory
2 min receive.denyCurrentBranch = ignore plus a post-update hook let one machine push straight into another’s checked-out $HOME.
Propagation is a direction
3 min Mount propagation is two separate trust decisions, not one switch—the argument from an lxc-users thread about read-only roots.
Read mountinfo first
3 min Before explaining a mount, read /proc/self/mountinfo—the kernel’s live table shows what mount(8) output hides.
The missing python2 shebang
1 min Pygments recognized python and python2.7 but missed python2, just as Arch made the major-version name useful.
The 2011 KVM diagnostic
2 min Checking QEMU’s arguments and open KVM descriptors to distinguish configured acceleration from the running process.
The shape of a successful build
1 min Comparing file lists and sizes between successful builds can catch packaging regressions that exit codes never will.
Omitted for Brevity
3 min My current résumé compresses seven years into three lines. The 2010 résumé it replaced still remembers what they hold.
Borders only inside the table
2 min Internal table borders with no outer border—border-collapse plus border-style: hidden, and the conflict-resolution rule that does the work.
The prompt that asks the kernel
2 min A bashrc derived container identity from /proc/self/cgroup and prefixed the prompt with VPS[name]—no environment variable involved.
The directory is the dispatch table
3 min vps-lxc discovered its subcommands by listing a directory, with one sed filter as the entire registration policy.
Containers in 2010
6 min vps-lxc: templates as btrfs subvolumes, containers as writable snapshots, and the host-local image model I built around them.
A cleanup stack in Bash
3 min vps-lxc registers cleanup handlers in an array and unwinds them newest-first on fatal errors or signals.
runlevel(8) reads whatever utmp you point it at
2 min A container supervisor read a guest’s shutdown intent from the guest’s own utmp, because runlevel accepts an alternate path.
pacproxy
4 min A caching proxy for Arch packages that streamed and cached in one pass, kept HTTP validators as sidecar state, and published its own caveat list.
Two Import Interfaces
2 min A teaching library’s wildcard namespace and an integrator’s explicit namespace are different interfaces, and a module can carry both on purpose.
Pinning a HUD to a Moving Camera
2 min A label pinned to the viewport exposes the difference between world, camera, and screen coordinates.
Learning Python by Debugging Boost.Python
2 min A VPython crash took me through Python versions, word sizes, and Boost builds to find a working combination.
Teaching Aliasing with Streams
1 min Open streams and database connections gave me a useful way to explain Python assignment: another name refers to the same live resource.
A Dependency Edit Does Not Change an ABI
1 min Changing package metadata changes what the package manager accepts; it does not establish that a compiled artifact can run against a new interpreter.
Threading Film at the State Theatre
3 min A projectionist job in high school, and the website I came back to build years later—my first commercial development project.
Broadband for the Bakken
3 min Installing satellite broadband at drilling sites and helping build a fixed-wireless ISP on the Montana–North Dakota line.
We Rode the Robot
2 min Programming Sidney High School’s omni-wheel robot for FIRST Triple Play, then testing the drive by sitting on it.
This stuff is very cold!
2 min Sidney won the Montana Science Olympiad in November 2003 and went to nationals in Pennsylvania. I do not remember my events. I remember a Nobel laureate stuffing balloons into liquid nitrogen.










