Sorting Books

I wrote a little program to sort lists of books.

Posted Thu, Mar 21, 2019

Automating Email

I just automated a couple common email tasks.

Posted Mon, Mar 18, 2019

How to Add a Subscription Service to Your Blog

I used to use a service to email subscribers updates to my blog. The service broke, but I automated my way around it.

Posted Thu, Mar 7, 2019

Fixing Buggy Haskell Programs with Go

I recently ran into a stupid bug in a program written in Haskell and found it much easier to paper over with a few lines of Go than to properly fix.

Posted Wed, Feb 27, 2019

Learning Day 2: DIY Games

Today I did my second Learning Day; the subject was DIY Games.

Posted Sat, Feb 23, 2019

Busting the Cloudflare Cache

I automated blowing the cache for this blog. Read on to see how I did it.

Posted Wed, Feb 20, 2019

graphviz describing multi-stage docker builds

I recently decided I should learn to use Graphviz more, as a great tool for making certain kinds of plots. Less than a week later a great use case surfaced.

Posted Mon, Feb 11, 2019


This past weekend I started re-creating a tool I used to have, using new tools, techniques, and infrastructure. The tool allows, at least, adding to my own todo list via SMS. It’s working great!

Posted Tue, Feb 5, 2019

Deploying to Kubernetes at ZipRecruiter

At ZR we are working hard to get stuff migrated to Kubernetes, and a big part of that is our cicd pipeline. We have that stable enough that I can explain the major parts.

Posted Wed, Jan 30, 2019

Full Text Search for ebooks

This past weekend I did a learning day that inspired me to try SQLite for indexing my ebooks; it worked!

Posted Mon, Jan 28, 2019

Learning Day 1: go

This is the first Learning Day Log I’m publishing, and it’s about Go.

Posted Sat, Jan 26, 2019

Go Interfaces

I did some work recently that depended on Go interfaces and I found it both straightforward and elegant.

Posted Wed, Jan 23, 2019

The Evolution of The Minotaur

I have a tool called The Minotaur that I just rewrote for the third time, and I think, maybe, it’s done.

Posted Mon, Jan 14, 2019

Self-Control on a Phone

Today I discovered that a lot of people feel alone in how they feel chained, in one way or another, to their phones. I started the fight against that recently and thought my findings might help other people.

Posted Thu, Jan 10, 2019

Updates to my Notes Linking Tools

I recently improved some of my notes tools, most especially around linking to emails.

Posted Tue, Jan 8, 2019

Goals for 2019

As many do, I am attempting to affect 2019 by picking skills to improve, subjects to learn, ways I hope to improve as a person, and then deriving (hopefully) concrete milestones to benchmark that progress.

Posted Sun, Dec 30, 2018

Self-Signed and Pinned Certificates in Go

I recently needed to generate some TLS certificates in Go and trust them. Here’s how I did it.

Posted Sun, Dec 23, 2018

Validating Kubernetes Manifests

At ZipRecruiter my team is hard at work making Kubernetes our production platform. This is an incredible effort and I can only take the credit for very small parts of it. The issue that I was tasked with most recently was to verify and transform Kubernetes manifests; this post demonstrates how to do that reliably.

Posted Tue, Dec 18, 2018

go generate: barely a framework

I’ve been leaning on go generate at work a lot lately and, when discussing it with friends, found that they had trouble understanding it. I figured I’d show some examples to help.

Posted Mon, Nov 19, 2018

Go Doesn't Have Generics

Go doesn’t have generics. This isn’t news, but it’s more foundational than many might realize.

Posted Mon, Nov 12, 2018

Go Concurrency Patterns

I’ve been spending some time the past couple of weeks playing with some of my personal Go tools. Nearly everything I did involved concurrency, for a change. I’ll document how I did it and some of the wisdom I’ve gathered from others here.

Posted Mon, Oct 22, 2018

Atomically Directory Population in Go

At work I’m building a little tool to write data from AWS Secrets Manager to a directory on disk. I wrote a little package to write the secrets atomically, because that seemed safest at the time. In retrospect just writing each file atomically probably would have been good enough. Code and discussion are below.

Posted Tue, Sep 18, 2018

GopherCon 2018

This year I went to GopherCon. This post is a grab bag of what I thought was interesting and some thoughts on this conference vs others and conferences in general.

Posted Tue, Sep 4, 2018

Log Loss Detection

We spent hours debugging a logging issue Friday and Monday. If you use UUIDs in Perl, you should read this post.

Posted Wed, Jul 25, 2018

Some Cool New Tools

I’ve written (and ported) some new tools and thought others might find them useful or inspiring.

Posted Tue, Jul 17, 2018


I’ve always wanted to carefully measure my activity on the computer and recently built a tool called unproductive to make it happen.

Posted Thu, Jul 12, 2018

Announcing shellquote

In my effort to port certain tools to go I’ve authored another package:

Posted Thu, Jul 5, 2018

Detecting who used the EC2 metadata server with BCC

Recently at work we had a minor incident involving exhaustion of the EC2 metadata server on some of our hosts. I was able to get enough detail to delegate the rest to a team to fix the issue.

Posted Thu, Jun 21, 2018

Centralized known_hosts for ssh

I just wrote some code to make a (hopefully) trustworthy, shared known_hosts file for our whole company. A handy side benefit is that it also grant us hostname tab completion.

Posted Fri, Jun 1, 2018

Buffered Channels in Golang

(The following includes affiliate links.)

A few weeks ago when I was reading The Go Programming Language I was reading about buffered channels and had a gut instinct that I could write some code taking advantage of them in a precise way. This was the comical code that came out of it.

Posted Mon, May 14, 2018

C, Golang, Perl, and Unix

Over the past couple months I have had the somewhat uncomfortable realization that some of my assumptions about all programs are wrong. Read all about the journey involving Unix, C, Perl, and Go.

Posted Tue, May 1, 2018

Announcing mozcookiejar

I built a little package for loading Firefox cookies into my Go tools!

Posted Fri, Apr 20, 2018

Reflections on Ng's Machine Learning

I recently took Andrew Ng’s Machine Learning class on Coursera; here were my takeaways.

Posted Tue, Feb 27, 2018

Categorically Solving Cronspam

For a little over a year at ZipRecruiter we have had some tooling that “fixes” a non-trivial amount of cronspam. Read on to see what I mean and how.

Posted Mon, Feb 26, 2018

Exponential Backoff in Service Startup

I recently added exponential backoff to service startup. Read how here.

Posted Thu, Feb 22, 2018

Some Code I Deleted

I recently deleted a couple non-trivial scripts from my dotfiles and I’m proud of that.

Posted Tue, Feb 20, 2018

Full Disk, What's Next?

I recently automated yet another part of my disk usage tool. Read about it here.

Posted Mon, Feb 19, 2018

gnuplot is Super Handy

Yesterday I wanted to graph some data by date but I didn’t want to mess with spreadsheet software or other graphing libraries. I reached for gnuplot after hearing good things over the years. The results were great.

Posted Fri, Feb 16, 2018

Benefits of using Golang for ad-hoc code: Leatherman

I recently stumbled upon a pattern that motivates me to write little scripts in Go instead of my normal default. I was surprised at some of the benefits.

Posted Fri, Jan 12, 2018

A Love Letter to Plain Text

I have used Hugo, the blog engine this blog runs on top of, more and more lately for less and less typical use cases. Hopefully this post will inspire others in similar ways.

Posted Tue, Jan 2, 2018

Editing Registers in Vim: RegEdit.vim

I recently came up with the most satisfying way to edit registers in Vim I’ve ever seen. I hope you like it as much as I do.

Posted Fri, Oct 20, 2017

Advanced Projectionist Templates

This week I migrated some of the vim tooling I use for my blog from UltiSnips to projectionist. The result is a lighter weight and a more user friendly (for me) interface.

Posted Mon, Oct 16, 2017

Monitoring Service start/stop in Upstart

Recently at ZipRecruiter I implemented a tool to ensure that we know if some service is crashlooping. It was really easy thanks to Upstart but it took almost a whole day to get just right.

Posted Mon, Sep 25, 2017

Content Based Filetype Detection in Vim

Yesterday I spent a little over an hour finally figuring out how to detect a file based on its contents in vim. It’s pretty easy!

Posted Wed, Sep 20, 2017

JSON on the Command Line

Recently my coworker Andy Ruder was complaining that he often reached for grep when filtering JSON, and I offered to give him some tips. This post is an expansion of what I told him.

Posted Mon, Sep 18, 2017

Vim Debugging

I use Vim quite a bit and fairly heavily, so I run into a good amount of bugs. I’ll share a couple tricks I’ve learned that help debug vim.

Posted Fri, Sep 8, 2017

Investigation: Why is SQS so slow?

Recently I spent time figuring out why sending items to our message queue often took absurdly long. I am really pleased with both my solutions and my methodogy, maybe you will be too.

Posted Sun, Aug 20, 2017

Supervisors and Init Systems: Part 7

This post is the seventh in my series about supervisors and I’m discussing some ideas that I’ve had while writing this series.

Posted Wed, Aug 2, 2017

Supervisors and Init Systems: Part 6

This post is the sixth in my series about supervisors. I’ll spare you the recap since it’s getting silly at this point. This post is about readiness protocols.

Posted Mon, Jul 31, 2017

Supervisors and Init Systems: Part 5

This post is the fifth in my series about supervisors. The first two posts were about traditional supervisors. The third was about some more unusual options. The fourth was about the current most popular choices. This post is about some of the unusual trends I’ve noticed during my three year long obsession with supervisors.

Posted Wed, Jul 26, 2017