Posts
Modernizing an aging PHP stack
In April 2009, I was a junior at the now defunct Mountain State University in West Virginia. At the time I made a modest freelance income customizing themes and plugins for some of the common PHP CMSes at the time, especially WordPress. I took on a project to customize WordPress for a church website: normal CMS functions with a member directory, job scheduling and reminders, a calendar and members’ listing. It was hard work and severely tested, and perhaps contributed to my ability to find answers to questions. Stack Overflow was very new, so in some cases I was the one answering questions, a lot of which haven’t held up over the years 😅.
November 2, 2025
At GopherCon
“Sorry, I’ll have to drop in 8 minutes” I typed into a dedicated Slack channel at work for a group bug fixing session. I was at GopherCon , not quite bright-eyed from a night of wrestling with my hotel’s internet connection, but looking forward to a Keynote talk about proposed changes to the encoding/json package .
September 28, 2023
Fun with php deployer and ssh
A long, long time ago when my daily driver was a Windows machine, I used to deploy websites over ftp, then sftp. I remember SmartFTP being one of the first software tools I ever purchased. In time (around 2011), I got introduced to Capistrano when I started doing continuous integration/delivery and setting up multiple environments for my projects. Getting a consistent ruby ecosystem working for mostly php projects was annoying as I moved between Jenkins, Wercker (pre-Oracle), Shippable (before they got acquired by JFrog) and finally CircleCI. I did have Ruby dependencies because Compass was all the rage, but eventually, it became annoying as browsers stopped needing prefixes, and Sass got ported to other languages.
December 19, 2022
A billing problem based on assumptions
My partner and I started SingleSend a little over a year ago. Everything we knew about SMS messages was that we had a 160-character limit, so dividing the number of characters in a message by 160 and rounding up would tell us how many messages to bill for. That held true until we got a $750 bill from Twilio last month which didn’t quite match the sending statistics we saw.
May 23, 2021
That Minor SNAFU With Go Types
Today’s specimen: type expectedError struct { error } func (e *expectedError) Cause() error { return e.error } func IsExpectedError(err error) bool { _, ok := err.(*expectedError) return ok } In one of my projects, I’m using consul for distributed locking , to prevent processing an item twice from a queue worker.
February 28, 2020
A Poor Guy's Local PHP Apm
I’ve seen the benefits of instrumenting code for a very long time: with PHP, Go, Frontend Javascript, and more recently, NodeJS. When you have access to a full APM solution like I do at work (Newrelic), or on the side (with Elastic APM ), it becomes easy to see at a glance not only what transactions (API calls, queued jobs, asynchronous processes, etc) are taking a long time, but also why.
December 18, 2019