I am a maker.

I make websites as a full-stack senior web application developer; I make podcasts/audio short stories; I make photographic scenes of miniatures; I make disc golf stats.

I am the creator of the tech-fantasy and fiction-crime podcasts series Dist1nc7ive Stories, and produce other audio short stories.

I'm a freelance full stack web geek, and I blog about it, including my favorite toys of late: automation with Playwright/Puppeteer, PHP Goutte, and I leave myself notes-to-self to remember.

I am a co-founder of StatMando, a disc golf side-project that helped revolutionize stats in disc golf.

I used to run, and currently have, HuckfaceDG and a few other, um, interesting side projects.


PHP framework experience includes Laravel, Yii, Symfony, WordPress, CodeIgniter, and custom PHP projects.
Have an old legacy PHP site that needs to be carefully updated? I have experience working with older codebases, updating both the code, and the systems they run on, carefully, while maintaining the important system. I've worked with Apache, Nginx, Internet Information Server, MySQL, PostgreSQL and MS-SQL.


Disc golf stats. In early 2021, a few of us were on twitter, bemoaning the lack of stats in disc golf. We decided to try to help. We met, we planned, we built. The result: StatMando.

Distinctive Stories Podcast

I'm the creator of the tech-fantasy and fiction-crime podcasts series Distinctive Stories.
Visit site

Rufus & Anna are villains in "Computronium"

Blog Posts

May 25, 2024

xargs tips

XARGS things to remember xargs -p will show the command find . -name "foo" -print0 | xargs -0 (<<< print0 null, xarg uses null instead of space, in case file...


May 24, 2024

Code Coverage VSCode With PHPUnit

Need: Get some code coverage up for unit tests in vscode. PHPUnit can handle outputting the necessary coverage information. Coverage Gutters can read the outputting coverage file (in xml). I'm...


May 22, 2024

VSCode settings.json file

My settings.json file as of 2024-05-22, mostly for backup purposes:


May 20, 2024

Hacky php file to do some auto-checks for pull requests

I wrote this hacky PHP file to assist me in doing pull request reviews as well as to check my own, to make the best use of my team's time. These are just things I wanted to examine every time without...


May 18, 2024

Big O Notation

Used to analyze worst-case (usually) complexity to check resource requirements for runtime as inputs increase. Not about the hardware, etc. High level view. How long: time complexity. Memory...


May 18, 2024

SOLID Progamming Principles

The Principles: Single Responsibility - the class should do one thing and thus would only have one stakeholder with a reason to change it. Open-Closed - add functionality without changing the...


May 18, 2024

Redis client commands I want to remember

In laravel local, while devving vendor/bin/sail redis redis-cli (command, container, client) In forge/prod: Delete keys based on a part:


May 17, 2024

Brew (homebrew) commands and tips

Homebrew/brew MacOSX:


May 13, 2024

Mocking in Unit Tests

In testing a specific class, you mock it's dependencies to make sure that class calls the dependency correctly. Mock the dependency. shouldReceive - declare what should be called...


February 4, 2024

How to do an SQL Delete based on a Join

I'm mostly used to simple deletes using where clauses, but I know a DBA who prefers to use joins. To get more familiar, I've been doing simple stuff like that. The syntax between MS-SQL and MySQL is...


February 1, 2024

A Simple PHP Benchmarking function

I recently needed to find where some performance issues were and didn't have the time to download and figure out any real-life tools, but this basic system helped. I could just sprinkle...


January 31, 2024

MySQL - Find What Tables Have a Column Name

How to find out what tables in a MySQL database have a specific column, by name.