Inklings: a tumblelog


kind is a tool for running local Kubernetes clusters using Docker container “nodes”. kind was primarily designed for testing Kubernetes itself, but may be used for local development or CI.

Looks like a good alternative to microk8s without the issues associated with minikube, k3s (which is a great project, but not 100% k8s compatible), &c.

CS 007: Personal Finance for Engineers

What Is the Difference Between a Restricted Stock Unit and a Restricted Stock Award?

I need to figure out the situation with my stock. The whole thing is a bit of a mystery to me, and I’ve treated it like money that doesn’t exist until now. While not a bad thing in principle—it’s volatile enough that you can’t depend on it—it’s still something I should understand better.

Google's Technical Writing Courses for Engineers

Zettelkasten: How One German Scholar Was So Freakishly Productive

Mermaid Diagrams

A notation for describing various kinds of graph and diagram that embeds well into Markdown and the like.

Joplin recently gained support for it, making learning this useful for me.

How to do High-Bar Code Review Without Being a Jerk

Migrating from cgit to stagit

I currently use cgit for, but stagit looks like a good option.


An in-browser Markdown editor. This site uses Markdown the the notes fields, so it’d be a quality of life upgrade to add something like this.

Edit: Maybe not. The component doesn’t include everything out of the box, and the actual editor is hosted elsewhere, which I’m not exactly gone on. I guess I could self-host, but it looks a bit of a pain.

What I Wish I Knew When Learning Haskell

Working with strings in Rust

The Teamwork Kit

The Teamwork Kit is a collection of methods that helps teams build trust and deliver great work together. You can download the handbook, facilitator’s guides, sample presentations, and template posters and use them with your team. With the right mindset, any group can become a creative, resilient team.

Haven’t read this. Might be interesting.

Easy 6502

Learn 6502 assembly language by building Snake. There’s a built-in assembler and simulator.

Agda by Example: λ-calculus

If you thought that Haskell was strongly typed, think again. Languages like Agda employ a type system embodying a very powerful logic, which lets us express the meaning of our programs much more precisely. Computers can understand our programs better too, allowing for tools that are more helpful than in average languages.

In this session we will interactively develop a type checker for a simple language, then give the language semantics by embedding it into Agda. This will allow us to prove a simple optimization on the language safe, by verifying that it preserves the meaning of programs.

Is TDD Worth It?

Programming Language Examples Alike Cookbook: OCaml

PLEAC is a good set of representative code in different langauge.

Celery - Best Practices

Though Celery’s always been a pain to deal with because it’s so heavyweight.

The USE Method

The Utilization Saturation and Errors (USE) Method is a methodology for analyzing the performance of any system. It directs the construction of a checklist, which for server analysis can be used for quickly identifying resource bottlenecks or errors. It begins by posing questions, and then seeks answers, instead of beginning with given metrics (partial answers) and trying to work backwards.

Here are the checklists for:

Logs Are Streams, Not Files

Server daemons (such as PostgreSQL or Nginx) and applications (such as a Rails or Django app) sometimes offer a configuration parameter for a path to the program’s logfile. This can lead us to think of logs as files.

But a better conceptual model is to treat logs as time-ordered streams: there is no beginning or end, but rather an ongoing, collated collection of events which we may wish to view in realtime as they happen (e.g. via tail -f or heroku logs --tail) or which we may wish to search in some time window (e.g. via grep or Splunk).

What ORMs have taught me: just learn SQL

I’ve come to the conclusion that, for me, ORMs are more detriment than benefit. In short, they can be used to nicely augment working with SQL in a program, but they should not replace it.

99 Problems (solved) in OCaml

The original Lisp version, and some OCaml implementations in a git repo.

Backpack: Retrofitting Haskell with Interfaces

This gives Haskell an ML-like module system.

Physicists Should Stop Saying Silly Things about Philosophy

Roughly speaking, physicists tend to have three different kinds of lazy critiques of philosophy: one that is totally dopey, one that is frustratingly annoying, and one that is deeply depressing.

Why you should take notes by hand, not on a laptop

TL;DR: you have to think more about what your writing, which causes it to stick better.

When done with pen and paper, that act involves active listening, trying to figure out what information is most important, and putting it down. When done on a laptop, it generally involves robotically taking in spoken words and converting them into typed text.

vmm - a virtual mail manager

vmm is the easy to use and configurable command line tool for administrators and postmasters, to manage domains, alias-domains, accounts and relocated mail users.

I have a hacky scripts that does something like this, but could do with something a little better. The original project is dead, but there’s a friendly fork that’s still maintained. I’d like an SQLite backend.


Modulario is a distinctive geometric sans with a dignified, Roman-inspired uppercase designed for clarity. The influence of handwriting can be detected in a lowercase which includes a uniquely scripty ‘s’.

It’s free for personal use, and the commercial version is quite reasonably priced.

Coding Principles Every Engineer Should Know


On Explaining Monads

Wilson’s Algorithm: maze generation via random walk

Wilson’s algorithm uses loop-erased random walks to generate a uniform spanning tree — an unbiased sample of all possible spanning trees. Most other maze generation algorithms, such as Prim’s, random traversal and randomized depth-first traversal, do not have this beautiful property.

If you look at the colourised version, the patterns kind of remind me of a dragon curve.

Criticism and Ineffective Feedback

Learn Prolog Now!

Learn Prolog Now! is an introductory course to programming in Prolog.

Practical Foundations for Programming Languages (Second Edition) by Robert Harper

An abbreviated version in PDF form is available for download from that page.

Notes on the M4 Macro Language

Minimalist Living: When a Lot Less Is More

Programmer Competency Matrix

Mind, there’s a certain degree of bias here: depending on the area you work on, not all of those area may need to be as strong as if you were working in others.

Conquering Folds

Plain Text Accounting, a Guide to Ledger and Friends

If I ever decide to use ledger or the like.

Also: The accounting quest: Ledger.

Why Dependently Typed Programming Will (One Day) Rock Your World

Irmin - A distributed database built on the same principles as Git

Irmin is a library to persist and synchronize distributed data structures both on-disk and in-memory. It enables a style of programming very similar to the Git workflow, where distributed nodes fork, fetch, merge and push data between each other. The general idea is that you want every active node to get a local (partial) copy of a global database and always be very explicit about how and when data is shared and migrated.

Why Go Is Not Good

Go has yet to fix any of these problems in any substantial way in the six years since this article was written. Make of that what you will, but they’re all real issues.

Mature Optimization

The trickiest part of speeding up a program is not doing it, but deciding whether it’s worth doing at all. There are few clear principles, only rules of thumb.

The Tyranny of the Forced Smile

The Fourier Transform, explained in one sentence

Also good is this Fourier Transform visualisation.

Type systems and logic

An important result in computer science and type theory is that a type system corresponds to a particular logic system.

Thinking in Types

A colleague of mine was stuck attempting to do something in Haskell that seemed conceptually simple but resulted in a type error. While a particular form of polymorphism, common in object-oriented languages, translated very well to Haskell, a related technique was not permitted by the language’s type system.

In this post, I’d like to outline a simplified version of the task and how this limitation was overcome. Hopefully you’ll see that by working with the type system rather than against it, we find unexpected benefits in the resulting design.

Finding bugs in SQLite, the easy way

Fuzzing SQLite with afl and seeing what falls out.

Inside the Intel 1405: die photos of a shift register memory from 1970

10 Technical Papers Every Programmer Should Read (At Least Twice)

The True Size of...

Compare countries by dragging them around a map, removing the distortions of the usual Mercator projection.

Landmark Computer Science Proof Cascades Through Physics and Math

I only understand a tiny fraction of this, and the paper is well beyond me. I’m only half way through the article, and it’s a very interesting read.

The Lava Layer Anti-Pattern

TL;DR: Successive, well intentioned, changes to architecture and technology throughout the lifetime of an application can lead to a fragmented and hard to maintain code base. Sometimes it is better to favour consistent legacy technology over fragmentation.

Frequentism and Bayesianism: A Practical Introduction


And Frequentism and Bayesianism: A Python-driven Primer.

Learn You an Agda

Agda Tutorial

Building a simple VGA-adapter for 8-bit self made computer

Suture: Supervisor Trees for Go

Supervisor trees are one of the core ingredients in Erlang’s reliability and let it crash philosophy. A well-structured Erlang program is broken into multiple independent pieces that communicate via messages, and when a piece crashes, the supervisor of that piece automatically restarts it.

This may not sound very impressive if you’ve never used it. But I have witnessed systems that I have written experience dozens of crashes per minute, but function correctly for 99% of the users. Even as I have been writing suture, I have on occasion been astonished to flip my screen over to the console of Go program I’ve written with suture, and been surprised to discover that it’s actually been merrily crashing away during my manual testing, but soldiering on so well I didn’t even know.

SSH: Best practices

A bit old, but this is still mostly relevant. It could certainly do with some updating in places. For instance, these days, you’re better off using ProxyJump rather than ProxyCommand.

Applied Crypto Hardening

Write code that is easy to delete, not easy to extend