Welcome to my website!
What asyncio is and how it works underneath — coroutines, the send protocol, the event loop, futures and tasks. Then a concrete problem: running a graph of tasks where some wait on others. Three hand-rolled solutions, where each breaks, and the standard-library answer real engineers reach for: graphlib.TopologicalSorter driving an asyncio.TaskGroup.
Migrating the site from Zensical to Quarto, and what it took to get it building on Cloudflare Pages.
How I solved Jane Street’s March 2026 puzzle by turning a sky full of planets into great circles, counting regions with Euler’s formula, and taking a single derivative.
A high-level tour of how CPython turns a .py file into running code — tokenizer, PEG parser, AST, compiler, the eval loop — and the runtime underneath it: the GIL, memory, the garbage collector, and concurrency. Plus what changed in 3.13, 3.14, and 3.15.
How I solved Jane Street’s December 2025 puzzle with one indifference equation, one threshold shift, and a single derivative.
How I solved Jane Street’s October 2025 puzzle with one symmetry, a backward induction, and a 1D root-find.
How I solved Jane Street’s July 2025 puzzle with a parallelogram, a quadratic cost, and one transcendental equation.
How I solved Jane Street’s April 2025 puzzle with two recursive equations, one branch choice, and a tidy little cubic.
How I solved Jane Street’s November 2024 puzzle with one symmetry argument, two circles, and a single integral.