Where my thoughts end up if they stay inside my head for too long.


A type system for RCL: Implementing a typechecker in Rust

I am adding a type system to RCL, my configuration language. In part 4, we look at how the typechecker is implemented in Rust, and at how it is able to generate good error messages. Read full post

A type system for RCL: Related work

I am adding a type system to RCL, my configuration language. The type system is based on ideas from other systems. In part 3, I highlight prior work, and I contrast RCL’s type system with that of other configuration languages. Read full post

A type system for RCL: The type system

I am adding a type system to RCL, my configuration language. In part 2, I explain how the type system works. It is based on lattices and features a generalized subtype check. Read full post

A type system for RCL: Introduction

I am adding a type system to RCL, my configuration language. In part 1, I explain what I want from the type system. Read full post

AI alignment starter pack

In this post I share resources for learning more about AI alignment, and why misalignment is a risk that I take seriously. Read full post

A reasonable configuration language

I was fed up with the poor opportunities for abstraction in configuration formats. The many configuration languages that exist already were not invented here, so I wrote my own, at first just for fun. But then it became useful. Read full post


An algorithm for shuffling playlists

When shuffling a playlist, a true shuffle is rarely what we want, because it might play the same artist twice in a row. In this post I introduce an algorithm that avoids this when possible. Read full post

The yaml document from hell

As a data format, yaml is extremely complicated and it has many footguns. In this post I explain some of those pitfalls by means of an example, and I suggest a few simpler and safer yaml alternatives. Read full post


Please put units in names

Using strong types, or putting units in names, is a small effort that can make a tremendous difference for code readability. Read full post


A perspective shift on automated market makers through MEV

A swap at an automated market maker is not like a market order, it behaves more like a limit order. This is the change of perspective that MEV is forcing us to make. Read full post


Model facts, not your problem domain

When requirements change, an append-only data model of immutable facts is more useful than a mutable data model that models the problem domain. Read full post


Build system insights

I like to share a few insights about build systems, some deep and some superficial. In particular, immutability and purity are tremendously beneficial for a build system. Read full post


An API for my Christmas tree

With a tiny server, and an Arduino to drive the lights, I connected my Christmas tree to the internet. Read full post

Building Elm with Stack

The Haskell tool Stack enables simple reproducible builds. I used it to build the Elm compiler from source. Read full post

On benchmarking

Measuring performance is hard. Presenting measurements may be even harder. Here is my advice on judging software performance data. Read full post

A language for designing slides

No existing tool allowed me to design slides in the way I would like. So I built my own. Read full post


Zero-cost abstractions

Rust claims to enable abstraction without overhead. How does that claim hold up in practice? Read full post

Working on a virtualenv without magic

The standard way of activating a Python virtualenv has a number of issues. Here is a simpler, understandable method. Read full post

Git’s push url

Here’s a little-known feature of Git that allows you to fetch over https but push with SSH. Read full post


Neither necessary nor sufficient

A garbage collector is neither necessary nor sufficient for quality software because it does not solve the problem of resource management. Read full post

Exceptional results: error handling with C# and Rust

Monadic error handling is an alternative to exception-based systems that can prevent many programming errors at compile time. Read full post

Global Game Jam 2015

This year’s Global Game Jam we built our most beautiful gam jam game yet. Read full post

Encryption by default

You should encrypt all of your internet traffic. I am helping by making my site available over https. Read full post


Writing a path tracer in Rust, part 7: conclusion

After porting a reasonably-sized application to Rust, I still like the language a lot. C++ has a worthy opponent here. Read full post

Writing a path tracer in Rust, part 6: multithreading

Instead of doing proper algorithmic optimisation, I made my path tracer faster the lazy way. Read full post

Writing a path tracer in Rust, part 5: tonemapping

Rust’s advanced type system can express a rendering pipeline in a safer way than C++. Read full post

Writing a path tracer in Rust, part 4: tracing rays

Tracing rays is at the core of a path tracer. Implementing the algorithm in Rust is a great way to get a feel for the language. Read full post

Writing a path tracer in Rust, part 3: operators

Operator overloading can do wonders to make vector math readable. How does Rust compare to C++ here? Read full post

Writing a path tracer in Rust, part 2: first impressions

After setting my first baby steps in the Rust programming language, these are my initial impressions. Read full post

Writing a path tracer in Rust, part 1

As a learning exercise, I am going to port my spectral path tracer Luculentus from C++ to Rust. Read full post

One year with Colemak

After typing in Colemak for a year I am still convinced that it was worth the switch. Read full post

Fibonacci numbers in finite fields

With a bit of algebra, Fibonacci numbers can be computed efficiently using only integer arithmetic. Read full post

Global Game Jam 2014

During the Global Game Jam 2014 I used Unity to build a game in 48 hours. Read full post


C# await is the Haskell do notation

When writing asynchronous code in C# with the await keyword, the emerging structure resembles the Haskell do notation. Read full post

Continuations revisited

Observables are a different take on asynchronous programming that can be more powerful than tasks for some scenarios. Read full post

Git music

I cross-referenced my Git commit history with my Last.fm scrobbles. Read full post

The task monad in C#

When you are composing asynchronous code, you are using monads. This posts reveals the form the task monad takes in C#. Read full post

The Small Bang Theory in San Francisco

A game that I worked on will be on display during the Game Developers Conference next week. Read full post


Geomancer at Indigo

One of the games that I worked on will be presented at Indigo 2012. Read full post

Passphrase entropy

Using longer encryption keys does not improve security unless you increase the length of your password too. Read full post

Global Game Jam 2012

During the Global Game Jam 2012 I made an award-winning game about a particle accelerator. Read full post


Yaose is now free software

I made my editor for Ogre script files available as free software. Read full post