Plume Demo Official demo of the Plume publishing platform http://demo.plume.pub/ Plume Configuration Closures http://demo.plume.pub/post/configuration-closures Mon, 16 Mar 2026 00:12:24 +0000 configuration-closures <p>Nearly every application in existence requires some form of configuration. After all, no two instances of the same app are exactly the same. The &quot;tried and true&quot; (read &quot;quick and dirty&quot;) 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.</p> Run Composer Binaries From Project Directories http://demo.plume.pub/post/run-composer-binaries-from-project-directories Mon, 16 Mar 2026 00:12:24 +0000 run-composer-binaries-from-project-directories <p>As a PHP developer I often find myself having to run executable files installed to a project via Composer (e.g. <code>php-cs-fixer</code>, <code>phpunit</code>, <code>psysh</code>, etc.). These binary files typically reside in <code>vendor/bin</code> relative to the root of a project and in order to run these binary files from the project root I would need to <code>cd</code> into the <code>vendor/bin</code> directory first or type out the relative path (e.g. <code>vendor/bin/php-cs-fixer fix</code>) every time I wanted to run one of these executables.</p> Scheduled Tasks with Systemd Timers http://demo.plume.pub/post/scheduled-tasks-with-systemd-timers Mon, 16 Mar 2026 00:12:24 +0000 scheduled-tasks-with-systemd-timers <p>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:</p> azPHP Presentation: Don't Fear the RegEx http://demo.plume.pub/post/azphp-presentation-dont-fear-the-regex Mon, 16 Mar 2026 00:12:24 +0000 azphp-presentation-dont-fear-the-regex <p>Check out my presentation from the October 2020 <a href="https://www.meetup.com/azPHPUG">azPHP</a> meetup: Don't Fear the RegEx, a crash corse on regular expressions.</p> <p align="center"> <iframe class="video" src="https://www.youtube.com/embed/BBspmonJ2rg" title="azPHP October, 2020: Don&#39;t Fear the RegEx" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> </p> Directory Lister 3 (beta) is here! http://demo.plume.pub/post/directory-lister-3-beta-is-here Mon, 16 Mar 2026 00:12:24 +0000 directory-lister-3-beta-is-here <p>I'm excited to announce the immediate availability of <strong>Directory Lister 3 Beta</strong> for testing and feedback. Everyone is encouraged to download the Directory Lister 3 beta and start testing today. Head on over to <a href="https://beta.directorylister.com">beta.directorylister.com</a> to get started.</p> <p><img src="/files/directory-lister.png" alt="Directory Lister 3" /></p> Embrace the Framework http://demo.plume.pub/post/embrace-the-framework Mon, 16 Mar 2026 00:12:24 +0000 embrace-the-framework <p>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.</p> azPHP Presentation: PsySh http://demo.plume.pub/post/azphp-presentation-psysh Mon, 16 Mar 2026 00:12:24 +0000 azphp-presentation-psysh <p>My presentation from the June 2019 <a href="https://www.meetup.com/azPHPUG">azPHP</a> meeting on <a href="https://psysh.org/">PsySH</a>, the terminal-based interactive PHP debugger and REPL.</p> <p align="center"> <iframe class="video" src="https://www.youtube.com/embed/lblQtfwlVls" title="azPHP June, 2019: psysh" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> </p Seeding is Hard http://demo.plume.pub/post/seeding-is-hard Mon, 16 Mar 2026 00:12:24 +0000 seeding-is-hard <p>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:</p> <pre class="shiki" style="background-color: #303446"><code><span class="line"><span style="color:#8CAAEE;font-style: italic">$</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">php</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">artisan</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">migrate</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">--seed</span></span> <span class="line"><span style="color:#8CAAEE;font-style: italic">Migration</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">table</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">created</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">successfully.</span></span> <span class="line"><span style="color:#8CAAEE;font-style: italic">Migrating:</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">1996_02_27_123456_create_pokemon_table</span></span> <span class="line"><span style="color:#8CAAEE;font-style: italic">Migrated:</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">1996_02_27_123456_create_pokemon_table</span></span> <span class="line"><span style="color:#8CAAEE;font-style: italic">Seeding:</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">PokemonSeederReflectionException</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">:</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">Class</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">PokemonSeeder</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">does</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">not</span><span style="color:#C6D0F5"> </span><span style="color:#A6D189">exist</span></span> <span class="line"></span></code></pre> A small personal accomplishment http://demo.plume.pub/post/a-small-personal-accomplishment Mon, 16 Mar 2026 00:12:24 +0000 a-small-personal-accomplishment <p>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 <a href="http://developer.okta.com/docs/sdk/core/api.html">official</a> 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.</p> The Witness http://demo.plume.pub/post/the-witness Mon, 16 Mar 2026 00:12:24 +0000 the-witness <p>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.</p> CactusCon 2014 CTF Writeup http://demo.plume.pub/post/cactuscon-2014-ctf-writeup Mon, 16 Mar 2026 00:12:24 +0000 cactuscon-2014-ctf-writeup <p>This is a write up to the 2014 CactusCon web application (SpookiLeaks) challenge. You can grab the SpookiLeaks-VM <del>here</del> and try the challenge yourself before reading the solution.</p> Postfix: Using Gmail as a Relay Host http://demo.plume.pub/post/postfix-using-gmail-as-a-relay-host Mon, 16 Mar 2026 00:12:24 +0000 postfix-using-gmail-as-a-relay-host <p>I maintain several Linux servers at any given moment. Every server has postfix installed for sending emails, usually notifications or warning messages of some sort and most of these servers are professionally hosted allowing outbound emails with little to no configuration beyond installing postfix. However, my home server lies behind my ISP and they block all outbound emails citing SPAM as the reason. Regardless of their reasoning I had to find a workaround to allow me to send email notifications from behind my ISP. Well, it turns out this is rather painless with postfix and a Gmail account.</p> Setting Up an Ubuntu Web Server http://demo.plume.pub/post/setting-up-an-ubuntu-web-server Mon, 16 Mar 2026 00:12:24 +0000 setting-up-an-ubuntu-web-server <p>Having set up several Debian and Ubuntu web servers in the past I thought it would be a good idea to share my process. The following is a relatively comprehensive guide to installing and configuring an Apache based web server with some optimizations and basic resource monitoring. I primarily work with Ubuntu servers, but most of the commands here should work exactly the same in Debian or Ubuntu. I've tried to note where differences may occur.</p> Increasing the Size of a Virtual Hard Drive in VirtualBox http://demo.plume.pub/post/increasing-the-size-of-a-virtual-hard-drive-in-virtualbox Mon, 16 Mar 2026 00:12:24 +0000 increasing-the-size-of-a-virtual-hard-drive-in-virtualbox <p>I work in Linux primarily but run a Windows 7 virtual machine in VirtualBox so I can use Photoshop and do some necessary testing. Today my VM ran out of space. Silly me thought 20GB would be enough, but after installing service pack 1, dozens of Windows updates and a few programs I had less than 1GB of space left. After a little searching I found an easy way to increase the size of a virtual disk.</p> Windows 7 Activation Hack http://demo.plume.pub/post/windows-7-activation-hack Mon, 16 Mar 2026 00:12:24 +0000 windows-7-activation-hack <p>When installing Windows 7 it's very picky about which installation disc you use (Full vs. Upgrade) and if improperly matched with your key can prevent you from activating your copy of Windows usually returning an &quot;Invalid Product Key&quot; error message. You may also see the same or similar error when you do a full, clean installation with an upgrade disc. This can be very annoying, especially when you have a legitimate key and disc but just didn't install it the way Microsoft thinks you should. In the event that you are having trouble activating your Windows 7 installation with a legitimate key, try the following registry hack:</p> The 3-2-1 Backup Rule http://demo.plume.pub/post/3-2-1-backup-rule Mon, 16 Mar 2026 00:12:24 +0000 3-2-1-backup-rule <p>Too many people today don't backup their files. And of those that do, many don't do it well. An easy way to remember a &quot;safe&quot; way to backup your data is with the &quot;3-2-1 Backup Rule&quot; which goes like this:</p> <ul> <li>Keep 3 copies of any important files (your primary/working copy counts as one)</li> <li>Store your files on 2 different media types (Example: Hard drive and in the Cloud)</li> <li>Always have 1 copy off site</li> </ul> Join multiple .avi files in Ubuntu http://demo.plume.pub/post/join-multiple-avi-files-in-ubuntu Mon, 16 Mar 2026 00:12:24 +0000 join-multiple-avi-files-in-ubuntu <p>I was just in a bit of a pickle and needed to join two .avi files together while in Ubuntu. There are a number of solutions out there, but the most simple solution I could find was via avimerge. Here's how I did it.</p> Gaming, Then and Now http://demo.plume.pub/post/gaming-then-and-now Mon, 16 Mar 2026 00:12:24 +0000 gaming-then-and-now <p>My brother is currently attending the DigiPen School of Technology working on a degree in video game programming / design. He's an avid gamer but has missed some of (IMO) the best games of all time, specifically, the Half-Life saga. Naturally, I email him recommending these games in the hope of inspiring him or, at the very least, giving him a better understanding of some of the good games he's missed out on and where the industry came from. I even offered to buy the games for him if he didn't want to pay for them himself. Well, he acquired the first Half-Life game and started playing it. This was his response:</p> Search Engine Optimization Tips http://demo.plume.pub/post/search-engine-optimization-tips Mon, 16 Mar 2026 00:12:24 +0000 search-engine-optimization-tips <p>Search engine ranking and your web sites traffic are directly influenced by four main areas:</p> <h2>Content, Links, Popularity and Reputation</h2>