Underwhelmed by Bash functions? Maybe you're using them wrong. I was.

Tools You Should Know About: nix-shell

"The Genuine Sieve of Eratosthenes" in Clojure

Tools You Should Know About: direnv

Circular Programming in Clojure

Why the Church-Turing equivalence matters to the practicing programmer

Bash functions are better than I thought

Tools You Should Know About: Terraform

Forwarding emails with SES and Terraform

Monads for Clojure Programmers

A short overview of DNS

Cheap interpreter, part 1: overview

The Elements of Git

Monads, part six: But, really, what is a monad?

Laziness: Clojure vs Haskell

Tools You Should Know About: jq

Review: Why FP Matters (Hughes)

Removing a directory

Data-first API design

Cheap interpreter, part 8: faster register machines

Safer Bash: fail on pipes

Two weeks ago I showed how to build a simple, slow stack machine. This week I make it fast.

Limits of errexit and pipefail: why you should avoid nesting Bash commands.

Build your own JIT with eval

This is so hard to post: why my last three blog posts are wrong and how I screwed up trying to benchmark Haskell code.

When writing Bash, you should always set nounset. Here's why.

You should let your Bash scripts die. Encourage them, even: Bash doesn't die often enough by itself.