Howdy!

Welcome to my blog where I write about software development, cycling, and other random nonsense. This is not the only place I write, you can find more words I typed on the Buoyant Data blog, Scribd tech blog, and GitHub.

You should blog more

Some time ago, whenever I started the draft for this blog post, I was discussing with my colleague Kathy why I feel it’s important for people to write out their thoughts in long-form, ideally sharing them via a blog such as this. My reasoning is not to build “your brand”, share information, or anything else like that per se. I find that fundamentally, taking the time to write my thoughts down long-form helps draw more reasoned and nuanced thoughts out, and allows the cultivation of a richer inner mental landscape.

Read more →

It's all about the dirt

Last season I wrote down some of what I’ve learned about growing tomatoes and made certain to highlight the importance of soil health. Unfortunately this season’s tomatoes aren’t doing as well as I would like, and I’m relatively certain I know the culprit, despite not having the time to correct it: soil health.

Read more →

Working with JavaScript callback APIs from async/await

To ignore Node.js as a possibility in certain problem domains, for which it is the best tool for the job, is a tremendously silly and at times unprofessional decision. While I don’t delight in writing JavaScript, I must acknowledge that JavaScript has matured quite nicely over the past ten years. Perhaps the most helpful addition, for me at least, are the async and await keywords which aim to prevent the callback nightmare many casual JavaScript developers may dread.

Read more →

Support Escalations to Engineering are Outages

I have been thinking a lot about customer support over the past two years. My role as “Director of Evangelism” has placed me at the leading edge of what could be referred to as “customer success” or “user education.” What I have come to appreciate, especially in Enterprise-focused startup companies, is the connected and complimentary roles between Product, Engineering, Quality, Evangelism, Customer Support, and Sales. In an Enterprise-focused organization what defines the success for each of these groups is fundamentally the same, but they are not all equally “connected” to the customer’s feedback and concerns.

Read more →

Provision a personal Kubernetes in 3 minutes on Azure

At my previous company one frequent request made by developers was along the lines of “I want to be able to run a development stack on my machine.” Frankly, I never understood this desire, and still don’t. While I would agree that my laptop is underpowered, running a stack of JVMs and other applications, in addition to a web browser, would bring most machines to a crawl. An ideal alternative, is to simply operate a personal Kubernetes environment in a public cloud. Fortunately, that is now a genuinely simple task.

Read more →

Enforcing administrative policy in Jenkins, the hard way

One foggy morning a few weeks ago, I received a disk usage alert courtesy of the Jenkins project’s infrastructure on-call rotation. In every infrastructure ever, disk usage alerts seem to be the most common alert to crop up, something somewhere is not properly cleaning up after itself. This time, the alert was from our own Jenkins environment. The logging filesystem wasn’t the problem, the filesystem hosting JENKINS_HOME was perilously close to running out of space. The local time, about 6:20 in the morning, and yours truly was quietly furious at the back of a bus headed into San Francisco for the day.

Read more →

Transparently supporting external Artifacts in Jenkins

One of the first pain points many organizations endure when scaling Jenkins is the rapid accumulation of artifacts on their master’s filesystem. Artifacts are typically built packages such as .jar, .tar.gz, or .img files, which are useful to persist after a Pipeline Run has completed for later review as necessary. The problem that manifests over time, is quite predictable, archived artifacts incur significant disk usage on the master’s filesystem and the network traffic necessary to store and serve the artifacts becomes a non-trivial problem for the availability of the Jenkins master.

Read more →

Google Hangouts is dead, long live Google Hangouts

In this post I would like to share a handy little workaround for returning to Google Hangouts, despite Google Meet. Having narrowly escaped working at Google via acquisitions twice, I have stood by and watched as the Ad Words money-pipe funded rewrite after boondoggle after rewrite. When Google announced “Google Meet” earlier this year as an “enterprise-friendly version” of Google Hangouts, I was annoyed, but not surprised.

Read more →

Implementing Virtual Hosts across Namespaces in Kubernetes

After learning how to build my first terrible website, in ye olden days, perhaps the second useful thing I ever really learned was to run multiple websites on a single server using Apache VirtualHosts. The novelty of being able to run more than one application on a server was among the earliest things I recall being excited about. Fast forward to the very different deployment environments we have available today, and I find myself excited about the same basic kinds of things. Today I thought I would share how one can implement a concept similar to Apache’s VirtualHosts across Namespaces in Kubernetes.

Read more →