Day-to-Day Tools

I have a ton of little programs I use on a day-to-day basis just to make my life easier. I figured it would be fun to share them so other people could either copy them or be inspired to make there own. I have blogged about some of these tools before and will link to the appropriate full posts when applicable.

Posted Fri, Apr 7, 2017

Converting a Slow Shell Script to golang

We have a handy little shell script at work that we can use to figure out what an IP address is. It could be an EC2 instance, or someone’s laptop, or a few other random things. I’ve been using it a lot lately and got annoyed that it was so slow. I ported it to Go over the weekend and wanted to share my experience.

Posted Mon, Mar 27, 2017 Updated Mon, Mar 27, 2017

My Set of Vim Plugins

I use a lot of plugins for vim. I’d like to go through all of my vim settings in a post at some point, but plugins are nicely isolated for the most part so describing their functionality seems more approachable. I am listing (nearly) all of my plugins and various things I know about each.

Posted Fri, Mar 17, 2017

Inspiration: DIY Operating System

Last Friday I blogged about some things that inspire me and mentioned a missing link; how to build your own operating system from scratch. I found it!

Posted Sat, Mar 11, 2017

Adding Features to Git the Easy Way

I have added a handful of features to git. The features are not perfect and most people can’t use them, but they are easy to prototype and I can polish them before writing and submitting a proper patch to git.git.

Posted Fri, Mar 10, 2017

My Mobile (shell) Home

At work I ssh into a lot of machines. I recently came up with a script that would ensure that my dotfiles would be deployed to any server I have access to quickly and reliably.

Posted Wed, Mar 8, 2017

MSSQL ODBC Client and Server on Ubuntu

Many years ago some coworkers and I collaborated on a document that would describe how to install the ODBC drivers from Microsoft on Debian, instead of RedHat as they were intended. Recently Microsoft has made this a much simpler task, so I decided to write a new version.

Posted Mon, Mar 6, 2017

Miscellaneous Inspiration

I thought it would be cool to share a list of things that are inspiring to me. I haven’t done much with any of these things, but I’d like to.

Posted Fri, Mar 3, 2017

The Great S3 Outage of 2017

At 9:36 am, Los Angeles time, my friend sent me a link about GCE vs AWS. It all went downhill from there.

Posted Tue, Feb 28, 2017

The fREW Schmidt Interview Experience

I keep reading tweets about how interviews should be done, almost entirely from the job seeker point of view. Having done (by my coarse count in google calendar) nearly ninety interviews at ZipRecruiter, I think that I can speak from a bit more experience than most about the interview process. I am not going to expose all of the gory details of the ZipRecruiter interview process, just how I (and my interview partner) administer it.

Posted Mon, Feb 27, 2017

Advanced Vim Sessions

I have blogged before about vim sessions and how useful they are. This post is about a pattern I discovered (though I’m likely not the first to discover it) at work when frustrated that certain settings were not stored in the session.

Posted Fri, Feb 10, 2017

The Dreaded Missing WHERE Clause

I recently had a bug in some of my personal software and found it both interesting and horrifying. The software in question is what allows me to mute some kind of email (usually based on subject but it could be anything really) and unmute it on a given day. It’s great for stuff at work that will continue spewing until we are able to release a new build.

Posted Wed, Jan 11, 2017

DIY Coffee Roasting and Coffee Setup

Lately I have been roasting my own coffee. I am certainly not the first person to do this nor even document it, but I tend to use my own blog as reference, so here we go!

Posted Mon, Dec 19, 2016

Gumbo v1

I grew up in the deep south and had gumbo pretty regularly. It’s delicious and I miss it. This past Saturday I decided to make some from scratch which we rarely did even at home because there were starters available in supermarkets (unlike in Santa Monica.) Read how I did it here!

Posted Sun, Nov 6, 2016

Email Threading for Professionals

Continuing my (likely unending) series of posts on email I want to talk about my latest in a Sisyphean line of tools to make the world suit my preferences.

As mentioned before I am a mutt user. Mutt, being not-Gmail, acts differently than what people have come to expect in 2016, though normally I can ignore other people’s expectations and move on. But I finally had to act in this case: email from the issue tracker we use at ZipRecruiter was not threading properly.

Posted Wed, Nov 2, 2016

The Ultimate Email Filtering

I’ve posted plenty about email before, so it might not be surprising that along with all of my other tooling, I have some email filtering tools as well. I recently rewrote most of my filtering tools after being inspired by my friend and coworker Meredith’s email filtering. It’s pretty cool!

Posted Sat, Oct 29, 2016

Linux Clocks

At ZipRecruiter we have an awesome access log that includes information about each request, like a measure of the response time, the increase in rss, and lots of other details. Before I joined we had a measure of how much CPU was used, but it was a little coarse. Read about how I increased the granularity here!

Posted Thu, Oct 13, 2016 Updated Fri, Oct 14, 2016

Announcing Digest::MurmurHash2::Neutral

This week I released Digest::MurmurHash2::Neutral.

Posted Fri, Sep 23, 2016

Defining Custom URI Schemata on Linux

For years I’ve wanted a way to link to emails without being tied to some specific provider. All emails have a header, Message-ID, that is supposed to be unique. I think it would be incredibly useful if there could be links based on these ids. I implemented that this past week!

Posted Thu, Sep 15, 2016

Perl, Linux Namespaces, and Pedestrian Problems

At ZipRecruiter we have a problem that I suspect is fairly common. We use cronjobs for various tasks and sometimes a cronjob will fail to clean up after itself and end up filling up a partition. It’s annoying. I solved this by using some simple but poorly supported Linux features.

Posted Mon, Sep 12, 2016

Blood Pressure Research

My doctor recently told me I probably have some high blood pressure issues. That may or may not be the case, because apparently isolated measurements are not to be trusted, but I did a bunch of research anyway, because that’s my deal.

Posted Thu, Sep 1, 2016

DIY Seltzer, Club Soda, Soda, etc

While I’ve been on paternity leave I have increased the amount of club soda that I drink hugely. This is mostly because I wanted to have a refreshing beverage while in the non-air conditioned apartment. I did a little research and found out how to make my own so I could have as much as I wanted, and because Googling for how to do it was hard, I figured I’d document it clearly here.

Posted Tue, Aug 23, 2016

The Pomodoro Technique: Three Years Later

A few years ago I posted about my use of The Pomodoro Technique. I’ve been asked more than once for an update on if I still use it and how. Answers are here.

Posted Thu, Aug 18, 2016

Docker pstree: From The Inside

I recently posted about my docker-pstree tool and in the post mentioned that at some point I might port the tool to be 100% “in-container.” Well I couldn’t help myself and figured out how.

Posted Mon, Aug 15, 2016

Linux Containers and Docker pstree

Once in a while I find myself wanting to see the state of a container from a bird’s eye view. My favorite way to do this is with a special tool I wrote called docker-pstree. Here is how it works. (Stay tuned for angst at the end.)

Posted Fri, Aug 12, 2016

Open Source Infrastructure and DBIx::Class Diagnostics Improvements

Many people know that Peter Rabbitson has been wrapping up his time with DBIx::Class after his attempt to get funding for working on it didn’t work out. I have long had some scraps of notes on a post about that whole situation and how troubling it is but I could just never make it happen. The following is the gigantic commit message of the merge of a large chunk of his work. I offered to host it since I think that it should actually get read. I have left it almost completely unchanged, except to make things proper links. More thoughts after the post.

Posted Mon, Aug 1, 2016

Building Secure UserAgents

I have been working on making an HTTP client (also known as a user agent) that is safe for end-users to control. I investigated building it in Perl, Python, asynchronous Perl, and Go.

Posted Mon, Jul 25, 2016

A visit to the Workshop: Hugo/Unix/Vim integration

I write a lot of little tools and take pride in thinking of myself as a toolsmith. This is the first post of hopefully many specifically highlighting the process of the creation of a new tool.

I wanted to do some tag normalization and tag pruning on my blog, to make the tags more useful (eg instead of having all of dbic, dbix-class, and dbixclass just pick one.) Here’s how I did it.

Posted Wed, Jul 20, 2016

Development with Docker

I have not seen a lot of great examples of how to use Docker as a developer. There are tons of examples of how to build images; how to use existing images; etc. Writing code that will end up running inside of a container and more so writing code that gets compiled, debugged, and developed in a container is a bit tricker. This post dives into my personal usage of containers for development. I don’t know if this is normal or even good, but I can definitely vouch that it works.

Posted Mon, Jul 18, 2016

Set-based DBIx::Class

This was originally posted to the 2012 Perl Advent Calendar. I refer people to this article so often that I decided to repost it here in case anything happens to the server it was originally hosted on.

Posted Sat, Jul 16, 2016

Investigation: Why Can't Perl Read From TMPDIR?

On Wednesday afternoon my esteemed colleague Mark Jason Dominus (who already blogged this very story, but from his perspective), showed me that he had run into a weird issue. Here was how it manifested:

$ export TMPDIR='/mnt/tmp'
$ env | grep TMPDIR
$ /usr/bin/perl -le 'print $ENV{TMPDIR}'

So to be clear, nothing was printed by Perl.

Posted Thu, Jun 30, 2016

Reap slow and bloated plack workers

As mentioned before at ZipRecruiter we are trying to scale our system. Here are a couple ways we are trying to ensure we maintain good performance:

  1. Add timeouts to everything
  2. Have as many workers as possible

Posted Wed, Jun 29, 2016

AWS Retirement Notification Bot

If you use AWS a lot you will be familiar with the “AWS Retirement Notification” emails. At ZipRecruiter, when we send our many emails, we spin up tens of servers in the middle of the night. There was a period for a week or two where I’d wake up to one or two notifications each morning. Thankfully those servers are totally ephemeral. By the time anyone even noticed the notification the server was completely gone. Before I go further, here’s an example of the beginning of that email (the rest is static:)

Posted Wed, Jun 22, 2016

Vim: Goto File

Vim has an awesome feature that I think is not shown off enough. It’s pretty easy to use and configure, but thankfully many languages have a sensible configuration out of the box.

Posted Tue, Jun 21, 2016

Staring into the Void

Monday of this week either Gmail or OfflineIMAP had a super rare transient bug and duplicated all of the emails in my inbox, twice. I had three copies of every email! It was annoying, but I figured it would be pretty easy to fix with a simple Perl script. I was right; here’s how I did it:

Posted Thu, Jun 16, 2016

Vim Session Workflow

Nearly a year ago I started using a new vim workflow leveraging sessions. I’m very pleased with it and would love to share it with anyone who is interested.

Posted Thu, Jun 9, 2016

DBI Caller Info

At ZipRecruiter we have a system for appending metadata to queries generated by DBIx::Class. About a month ago I posted about bolting timeouts onto MySQL and in the referenced code I mentioned parsing said metadata. We are depending on that metadata more and more to set accurate timeouts on certain page types.

Posted Wed, Jun 8, 2016

My Custom Keyboard

A few years ago I made my own keyboard, specifically an ErgoDox. I’ve been very pleased with it in general and I have finally decided to write about it.

Posted Sat, Jun 4, 2016


A big trend lately has been the rise of “serverless” software. I’m not sure I’m the best person to define that term, but my use of the term generally revolves around avoiding a virtual machine (or a real machine I guess.) I have a server on Linode that I’ve been slowly removing services from in an effort to get more “serverless.”

Posted Wed, Jun 1, 2016

Iterating over Chunks of a Diff in Vim

Every now and then at work I’ll make broad, sweeping changes in the codebase. The one I did recently was replacing all instances of print STDERR "foo\n" with warn "foo\n". There were about 160 instances in all that I changed. After discussing more with my boss, we discussed that instead of blindly replacing all those print statements with warns (which, for those who don’t know, are easier to intercept and log) we should just log to the right log level.

Posted Wed, May 25, 2016

OSCON 2016

ZipRecruiter, where I work, generously pays for each engineer to go at least one conference a year. I have gone to YAPC every year since 2009 and would not skip it, except my wife is pregnant with our second child and will be due much too close to this year’s YAPC (or should I say instead: The Perl Conference?) for me to go.

Posted Fri, May 20, 2016

Faster DBI Profiling

Nearly two months ago I blogged about how to do profiling with DBI, which of course was about the same time we did this at work.

Posted Wed, May 18, 2016

Setting up Let's Encrypt and Piwik

Late last week I decided that I wanted to set up Piwik on my blog. I’ll go into how to do that later in the post, but first I ran into a frustraing snag: I needed another TLS certificate. Normally I use StartSSL, because I’ve used them in the past, and I actually started to attempt to go down the path of getting another certificate through them this time, but I ran into technical difficulties that aren’t interesting enough to go into.

Posted Sat, May 14, 2016

Rage Inducing Bugs

I have run into a lot of bugs lately. Maybe it’s actually a normal amount, but these bugs, especially taken together, have caused me quite a bit of rage. Writing is an outlet for me and at the very least you can all enjoy the show, so here goes!

Posted Tue, May 10, 2016

Putting MySQL in Timeout

At work we are working hard to scale our service to serve more users and have fewer outages. Exciting times! One of the main problems we’ve had since I arrived is that MySQL 5.6 doesn’t really support query timeouts. It has stall timeouts, but if a query takes too long there’s not a great way to cancel it. I worked on resolving this a few months ago and was disapointed that I couldn’t seem to come up with a good solution that was simple enough to not scare me.

Posted Sun, May 8, 2016

A new Join Prune in DBIx::Class

At work a coworker and I recently went on a rampage cleaning up our git branches. Part of that means I need to clean up my own small pile of unmerged work. One of those branches is an unmerged change to our subclass of the DBIx::Class Storage Layer to add a new kind of join prune. If you didn’t know, good databases can avoid doing joins at all by looking at the query and seeing where (or if) the joined in table was used at all.

Posted Fri, Apr 29, 2016

Python: Taking the Good with the Bad

For the past few months I’ve been working on a side project using Python. I’ll post about that project some other time, but now that I’ve used Python a little bit I think I can more reasonably consider it (so not just “meaningful whitespace?!?“) It’s much too easy to write a bunch of stuff that is merely justification of the status quo (in my case that is the use of Perl.) I’m making an effort to consider all of the good things about Python and only mentioning Perl when there is a lack.

Posted Thu, Apr 21, 2016

Humane Interfaces

In this post I just want to briefly discuss and demonstrate a humane user interface that I invented at work. At ZipRecruiter, where I work, we use a third party system called Each employee is given $20 in the form of 100 Zip Points at the beginning of each month. These points can be given to any other employee for any reason, and then redeemed for gift cards basically anywhere (Amazon, Starbucks, Steam, REI, and even as cash with Paypal, just to name a few.) Of course the vast majority of users give bonusly by using the web interface, where you pick a user with an autocompleter, you select the amount with a dropdown, and you type the reason and hashtag (you must include a hashtag) in a textfield.

Posted Sat, Apr 9, 2016

CloudFront Migration Update

When I migrated my blog to CloudFront I mentioned that I’d post about how it is going in late March. Well it’s late March now so here goes! First off, I switched from using the awscli tools and am using s3cmd because it does the smart thing and only syncs if the md5 checksum is different. Not only does this make a sync significantly faster, it also reduces PUTs which are a major part of the cost of this endeavour.

Posted Sat, Mar 26, 2016

DBI Logging and Profiling

If you use Perl and connect to traditional relational databases, you use DBI. Most of the Perl shops I know of nowadays use DBIx::Class to interact with a database. This blog post is how I “downported” some of my DBIx::Class ideas to DBI. Before I say much more I have to thank my boss Bill Hamlin, for showing me how to do this. Ok so when debugging queries, with DBIx::Class you can set the DBIC_TRACE environment variable and see the queries that the storage layer is running.

Posted Thu, Mar 24, 2016