Recent Posts

d-p-why?

My Qt apps looked broken for months. Buttons clipped, scrollbars half-invisible, canvas artifacts. The culprit: my monitors report 94 DPI via EDID, and Qt’s ...

MZ gone ROGUE

What does it take to load and run a 40-year-old DOS executable? A 28-byte header, a linked list memory allocator, a giant interrupt handler, and more patienc...

Getting intimate with x86

When you write a compiler, your work is usually done somewhere around the generation of machine-dependent assembly. But if you are like me, leaving cans of w...

Custom commands for gitk

I love extensible tools. Things that are simple and easy to learn, and yet support power user usage patterns. One thing that I particularly like when tools...

Make Kitty look like Xfce Terminal

I love Xfce. In fact, Xfce is the reason I am still using X11, despite being one of Wayland’s earliest contributors. But two weeks ago I made the switch from...

The std::map antipattern

Here is an antipattern I see every now and then in C++ codebases, and have even written myself: cpp std::map<int, Widget> where the map of the key is r...

TIL: git absorb

git absorb looks at your unstaged changes, figures out which commits on your feature branch they belong to, and creates the right --fixup commits automatic...

The msr files are weird

Have you ever read from or written to the /dev/cpu/*/msr files? If you aren’t in virtualization, RAPL monitoring tools, or performance analysis tools, chance...

Dipping my toes into FPGA development

I recently came across the “Sipeed Tang Primer 20k”, an entry-level FPGA. The internet claims that it can be programmed and used with an all-open-source too...

Podman: two minutes to sub-second

If your Podman containers take over two minutes to start, check your storage driver: $ podman info --debug | grep graphDriverName graphDriverName: vfs If ...