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: github.com/frioux/shellquote.

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

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

Supervisors and Init Systems: Part 4

This is the latest in my apparently unending series about supervisors. While the first two posts were about “traditional supervisors,” the third was about a few odd variants, both good and bad. This post is about the current reigning champions: Upstart and systemd.

Posted Mon, Jul 24, 2017

Supervisors and Init Systems: Part 3

This post is a continuation of my series about suprevisors. The first post was about the most basic supervisors. The second post was about some more advanced, but still basically traditional supervisors. This post is about some more unusual options.

Posted Fri, Jul 21, 2017

Supervisors and Init Systems: Part 2

On Monday I began a series about supervisors. It mostly covered the most basic Supervisors out there, daemontools, daemontools-encore, runit, and perp. This post will cover the more advanced generation, which includes s6 and nosh.

Posted Wed, Jul 19, 2017

Supervisors and Init Systems: Part 1

In 2014 Mike Conrad, of Perl Delorean fame, did a lightning talk about supervisors, including one he wrote. It was a watershed moment for me and since then I have found supervisors interesting.

Posted Mon, Jul 17, 2017


I say “station” all the time and people never seem to know why. Here’s why.

Posted Fri, Jul 14, 2017

The Read Write Splitter at ZipRecruiter

At my talk at YAPC a few weeks ago I discussed some technology at ZipRecruiter that’s called the read/write splitter (or more often the rwsplitter or simply the splitter.) I have intended to write about this for a long time and the fact that I was unable to refer to a blog post for the talk finally convinced me that I must.

Posted Wed, Jul 12, 2017

Getting Things Done

A year ago, when I was on paternity leave, I decided that I needed to be better at time management. I think that my inspiration was simply the recommendation of the book, Getting Things Done by Alfie John. Having used the GTD system for about a year, I feel comfortable writing about it.

Posted Mon, Jul 10, 2017

YAPC::NA 2017 Recap

A couple of weeks ago I went to YAPC::NA 2017. I already wrote about my own talk, but I still want to highlight a few other talks that I think people should see.

Posted Fri, Jul 7, 2017

Scalablity, Reliability, and Performance at ZipRecruiter

I did a talk at YAPC this year, and while I am really proud of it and think that it went well, I think it could have gone better. This post is a retrospective on what I could do better next time.

Posted Wed, Jul 5, 2017

Ten Years Behind the Screen

I started this blog ten years ago today!

Posted Mon, Jul 3, 2017

CSV Databases in Perl

On Monday I wrote about using Amazon Athena from Perl. That’s only step one though, because often I find myself needing to dig further.

Posted Wed, Jun 14, 2017

Using Amazon Athena from Perl

At ZipRecruiter we write “a lot” of logs, so actually looking at the logs can be a lot of work. Amazon Athena provides a nice solution, and recently an API was (finally) provided to allow us to use it in our code. I wrote some code recently to leverage the API.

Posted Mon, Jun 12, 2017

Vim Slow Buffers

On Monday I wrote about how QuickFix and friends are slow. I was legitimately chasitized on reddit for giving up too soon in trying to find a solution, so I did some more digging.

Posted Fri, May 26, 2017

Vim Advanced Sessions: Corrected

Last time I blogged about vim sessions I showed a cool pattern for making sessions more generally useful. There was a bug in my example that hamstrung the technique, so I’ll be sharing and updated version here.

Posted Wed, May 24, 2017

Vim File Lists

I have recently been working on honing a lot of my tools, and a coworker, Andrew Ruder, mentioned using Denite.nvim for selecting more than simple directories. I decided to investigate using it instead of builtin file selection mechanisms. I was surprised at the result.

Note: while this post is still worth looking at for comparing how you can define various lists for vim, the performance issues turned out to be unrelated. See my new post for more details.

Posted Mon, May 22, 2017

Hello XMonad, Goodbye AwesomeWM

After using the aptly named AwesomeWM for nearly five years I have switched back to XMonad.

Posted Fri, May 19, 2017

lost.vim: for when you're lost in a file

I wrote a plugin on Friday to making orienting yourself in a large piece of code easier. The short version is that with the new plugin lost.vim you can call :Lost or use the gL mapping to find your bearings.

Posted Mon, May 15, 2017

AWS IAM at ZipRecruiter

At ZipRecruiter we use AWS for nearly all of our infrastructure, so securing our usage of AWS is important for obvious reasons. In this article I will go over some of the things that I had to do (with help) to go from “pretty insecure” to “pretty secure” with respect to AWS permissions.

Posted Thu, May 11, 2017