Nearly every application in existence requires some form of configuration. After all, no two instances of the same app are exactly the same. The "tried and true" (read "quick and dirty") way of doing this has conventionally been with arrays. This works well for most basic configuration values of scalar types, however, sometimes it may be necessary to configure complex objects.
Run Composer Binaries From Project Directories
As a PHP developer I often find myself having to run executable files installed to a project via Composer (e.g. php-cs-fixer, phpunit, psysh, etc.). These binary files typically reside in vendor/bin relative to the root of a project and in order to run these binary files from the project root I would need to cd into the vendor/bin directory first or type out the relative path (e.g. vendor/bin/php-cs-fixer fix) every time I wanted to run one of these executables.
Scheduled Tasks with Systemd Timers
Use a Linux system long enough and eventually you'll need to schedule a recurring task. Of course the defacto scheduler is cron (and there's nothing inherently wrong with it) but I've grown to like the flexibility and features of systemd timers. Some of the benefits they provide over cron include:
azPHP Presentation: Don't Fear the RegEx
Check out my presentation from the October 2020 azPHP meetup: Don't Fear the RegEx, a crash corse on regular expressions.
Directory Lister 3 (beta) is here!
I'm excited to announce the immediate availability of Directory Lister 3 Beta for testing and feedback. Everyone is encouraged to download the Directory Lister 3 beta and start testing today. Head on over to beta.directorylister.com to get started.

Embrace the Framework
Frameworks are among the most important tools we developers have and yet they are often taken for granted. The way I see it is a framework has two primary benefits: 1) saving individual developers time by providing predefined solutions to common problems and 2) allowing teams to work more efficiently by giving them a common model for coding standards, file organization, design language and more. However, these benefits quickly break down when framework conventions are broken or ignored, intentionally or otherwise.
azPHP Presentation: PsySh
My presentation from the June 2019 azPHP meeting on PsySH, the terminal-based interactive PHP debugger and REPL.
Read More
Seeding is Hard
We've all been there... banging our heads against a wall for 20 minutes wondering why our app isn't working before we realize we forgot to seed our database when running migrations. Okay, easy fix:
$ php artisan migrate --seed
Migration table created successfully.
Migrating: 1996_02_27_123456_create_pokemon_table
Migrated: 1996_02_27_123456_create_pokemon_table
Seeding: PokemonSeederReflectionException : Class PokemonSeeder does not exist
A small personal accomplishment
While working on a project at work it was necessary to interface with the Okta API for user authentication and authorization. To accomplish this I created, an independent PHP client library. As it stood there were no official or unofficial PHP libraries available for working with the Okta API and I felt it would be beneficial to the community, as well as my employer, to publish this library as an open source project on the company GitHub account. So I talked to some people, sent some emails and ultimately got the legal department to okay it.
The Witness
I'm loving The Witness. It's a beautiful game, and challenges me in a way very different from just about any other puzzle game I can think of. I highly recommend it to anyone looking for a brain teaser and something off the beaten path of modern games.