McGarrah Technical Blog

Posts in category "technical"

Five Stages of a Successful Cloud Data Science Platform

The standard SDLC model breaks for data science because model training requires production data. Here is a five-stage promotion framework that resolves the conflict between data scientist flexibility and production security controls.

Rebuilding My Resume Site From the Ground Up

I gutted a 2017 Bootstrap template and rebuilt my resume site with modern CSS, four purpose-built views, a Jinja2/XeLaTeX PDF pipeline, company logos, and machine-readable structured data. Here is what I kept, what I dropped, and why.

Visual Indicators for Draft and Future Posts in Jekyll

When previewing a Jekyll site locally with --drafts and --future, it's hard to tell which posts are live and which are still unpublished. I added Font Awesome icons and italic styling to the archive and home pages so drafts get a pencil and future posts get a robot — visible only during local development.

Jekyll Run Plugin: Local Development Settings That Actually Work

The Jekyll Run VS Code extension is convenient for local development, but its settings live in four different places and the defaults won't show your future-dated posts. Here's how to configure it properly, where the settings actually come from, and the _config.yml trap that silently overrides your CLI flags.

The CI/CD Pipeline Behind This Jekyll Blog

Three GitHub Actions workflows, Dependabot, and a Lighthouse config — here's the full CI/CD pipeline that builds, deploys, secures, and monitors this Jekyll blog. Including the bugs I shipped along the way.

Kiro IDE on Windows: WSL2 Support via Open Remote Extension

Kiro doesn't ship with Microsoft's WSL extension, and the official extension isn't available on Open VSX. The Open Remote - WSL extension by jeanp413 bridges the gap — but it requires an easy-to-miss argv.json configuration step, breaks predictably on Kiro updates, and has terminal routing quirks that will cost you an hour if you don't know about them. Here's the complete setup, the failure modes, and the recovery procedures.

Kiro IDE: Running Parallel Personas for Director and Developer Workflows

Kiro's ~/.kiro directory stores powers, hooks, agents, and MCP server configs globally — but there's no built-in way to switch between profiles. If you need a Senior Director persona loaded with Atlassian, GitLab, and observability MCPs running alongside a stripped-down developer persona focused on code, you have to get creative. Here's how the path resolution actually works and three approaches to running both simultaneously on macOS and Windows.

The Small Things: Polish Features That Make a Jekyll Blog Feel Professional

Dark mode, print stylesheets, haiku error pages, author bios, and the archive page — none of these are glamorous features. Each one took less than a day. Together they're the difference between a blog that looks like a default template and one that feels like someone cares about it.

Jekyll Content Plumbing: Permalinks, Reading Time, Excerpts, and Redirects

The invisible infrastructure behind a Jekyll blog — how permalink structure, reading time estimates, custom excerpt separators, pagination, and redirect handling all work together. These aren't glamorous features, but getting them wrong breaks SEO, confuses readers, and creates maintenance headaches.

Upgrading Jekyll: Two Years of Cascading Breakage

Every Jekyll upgrade broke something downstream. Ruby 3.0 dropped webrick. Jekyll 4.3 broke SASS imports. Dart Sass 3.0 deprecated color functions. Node.js 24 forced all GitHub Actions to update. Here's the full upgrade timeline and what each one taught me.

Your Jekyll Sitemap Is 60% Garbage

I audited my Jekyll sitemap and found that 262 of 434 URLs were auto-generated tag pages, category pages, and pagination — most with a single post. Here's how to clean it up without losing anything.

USB Drive SMART Updates: Fast-Track to the GRUB Solution

New Seagate USB drives arrived for the Ceph cluster and predictably won't report SMART data. After months of production use, GRUB boot parameters are the only method that reliably survives kernel updates and cluster reboots.

Generate Git Timesheet from Commit Logs

A Python tool that generates timesheets from git commit history — because your commits are already timestamped and reflect when you were actually working.

Dell Wyse 3040 eMMC Storage Health Monitoring

eMMC storage doesn't support SMART, but the JEDEC health reporting built into mmc-utils gives you life time estimation and pre-EOL status for Dell Wyse 3040 boot drives.

Proxmox 8 Lessons Learned in the Homelab

Hard-won lessons from running Proxmox since version 7.4 through 8.2.2 — upgrade gotchas, Ceph integration tips, and the patterns that apply at any scale.

Adding Ceph Dashboard to Your Proxmox Cluster

The Ceph Dashboard is essential for monitoring cluster health without SSH, but setting it up on Proxmox isn't straightforward. Here's how to get it working with SSL and proper authentication.

Windows Sandbox for Safe Testing

Windows Sandbox provides a disposable, isolated VM that resets on close — ideal for testing scripts and software without risking the host system.

Windows 11 Upgrade Challenges on ThinkPad T480

Upgrading two ThinkPad T480 laptops to Windows 11 exposed hardware-specific performance regressions, a broken Logitech C930e webcam, and the counterintuitive fix of switching from Best Performance to Balanced power mode.

Power Supply upgrade for GPUs in the Homelab

Evaluating a 750W Dell OptiPlex PSU upgrade to support a discrete GPU in an aging Proxmox homelab node, with a breakdown of PCIe and connector power limits.

Linux Disk I/O Performance in the Homelab

Quick disk I/O benchmarks comparing eMMC and USB3 storage on Dell Wyse 3040s — understanding the performance characteristics of your storage tier before making capacity decisions.

Google Wifi running OpenWRT

Repurposing first-generation Google Wifi units by flashing OpenWRT using the SuzyQ CCD cable and Closed Case Debugging.

MacOS Outlook Calendar Copy Events

Microsoft removed copy/paste for Outlook calendar events. Here's the workaround on macOS and the registry fix for Windows.

HP ProCurve Switch Java WebUI

Getting the HP ProCurve Java WebUI working in 2024 using Firefox 51.0.1 Portable and Java 8 Update 121 Portable — the last versions with NPAPI support before it was removed from browsers.

Powerline Networking for the Homelabs

Powerline networking repeatedly tripped the AFCI breakers in a modern house — turns out arc fault interrupters and powerline adapters are fundamentally incompatible.

Proxmox VE 8.1 to 8.2 upgrade issues in the Homelabs

An extended power outage plus a remote kernel upgrade left half the cluster unbootable, video outputs dead, and Ceph unstable — a crash cart recovery story with four overlapping root causes.

ProxMox 8.2.4 Upgrade on Dell Wyse 3040s

Ceph Monitor refuses to start after a Proxmox 8.2.4 upgrade because root partitions hit 95% — fixed by clearing apt cache, removing atop logs, and purging old PVE and Debian kernels.

Google Documents - copy an image

Google Docs uses URL-based clipboard for images, which breaks when you need an actual file. Double-click then Shift+right-click forces the browser to expose the raw image.

Proxmox Ceph settings for the Homelab

Tuning Ceph scrub and deep-scrub intervals to reduce wear on spinning rust drives in a homelab cluster — spreading daily scrubs over 7 days and weekly deep scrubs over 28 days.

ProxMox 8.2.2 Cluster on Dell Wyse 3040s

Building a three-node Proxmox 8 + Ceph test cluster on Dell Wyse 3040 thin clients to safely evaluate SDN and Ceph configuration changes without risking the semi-production cluster.

Debian 12 on Dell Wyse 3040s

Installing Debian 12 on Dell Wyse 3040 thin clients: BIOS setup, Ventoy boot, the GRUB EFI removable media fix for the bad BIOS, and the dw_dmac blacklist that prevents lockups on shutdown.

Dell Wyse 3040 CMOS CR2032 Battery Replacement

Replacing the proprietary CMOS battery connector on Dell Wyse 3040 thin clients using heat shrink tubing and standard CR2032 cells — $23 for nine units versus $90 for pre-made replacements.

Hard Drives for the Homelabs

Storage has hit a penny per GB. A 20TB renewed drive for $200 and a 20TB USB-C enclosure for $220 make the math work for a Ceph offsite backup strategy.

ProxMox 8.2 for the Homelabs

Building a Proxmox 8 + Ceph HA cluster on decade-old Dell OptiPlex 990 hardware with Seagate USB drives — the background, the hardware inventory, and why Ceph beat a Synology NAS.

Thinkpad T480 WWAN SSD

Adding a 1TB NVMe SSD to the ThinkPad T480's WWAN M.2 slot using a 2230-to-2242 B+M key adapter — a cheap way to get a separate data volume for LLM models.

Running Github Pages locally

Getting Jekyll and GitHub Pages running locally in WSL2 Ubuntu, including the missing webrick fix for Ruby 3.0+ and using VS Code for markdown editing.

HP ProCurve 2800 initial setup

Getting into an HP ProCurve 2810-24 via serial console, clearing the password with the Reset+Clear button combo, and doing initial configuration including IP, SNTP, and SSH setup.

Ceph Cluster rebalance issue

Fixing a severely imbalanced Ceph cluster where OSDs added in batches left the first three drives at 75-85% while newer ones sat nearly empty — by tuning backfill and recovery parallelism.

Aggregated Network Connections with LAG/LACP

Attempting to use LAG/LACP on a Netgear GS105Ev2 for Ceph SAN throughput, discovering the feature is disabled on 5/8-port models, and landing on HP ProCurve 2800 switches as the real solution.

Buying a 10Gbps or higher network on a homelab budget

Evaluating the options for 10Gbps homelab networking on a budget: DAC point-to-point rings, affordable MikroTik SFP+ switches, and the HP ProCurve 5406zl chassis — with no decision reached yet.

PhotoSynth Export and Visualizer

I have developed something interesting for my graduate class in Computations Photography for the final project. As background, for the class we had an assignment in which we used the Microsoft Photosynth service to generate a 3D walk thru of an area by uploading several hundred photographs. On the back-end the Photosynth web service does feature extraction on all the photos and then related the photos in three dimensions to each other and the feature points. This generated a point cloud of related points between the photos.

PhotoSynth

LetsEncrypt Certificates go live

I’m live with the Lets Encrypt certificates for the blog.mcgarrah.org website. This has been awhile in the making and I’m kind of excited. I’m on a legacy environment with Ubuntu 12.04 LTS so part of the process is manual but certificate update just happens nicely. Updating the Apache config files has a little bit of effort but nothing too bad.

Artificial Intelligence for Robotics (CS8803-001)

Artificial Intelligence for Robotics (CS8803-001)

Associated with Georgia Institute of Technology

Fall Semester 2015

The goal for the final project in CS6475 AI for Robotics was to create a robotic platform to investigate computer vision technology. The platform included an Arduino with sensors and motors and a Raspberry Pi 2 for the vision and primary control system. The project URL is a video channel that shows the progress and challenges.

Raspberry Pi 2 built-in LED

For an assignment in my robotics class, I need to have an autonomous system react to the environment around it. Reacting can be as simple as flashing a LED if a sensor detects a change.

I have two objectives for the Raspberry Pi 2 (RasPi2) and those are to take a picture using the 5mp webcam and flash a LED. I could use the standard GPIO pins and setup a separate LED but noticed we have two perfectly good LEDs built into the board.

Reading on these built-in LED did not elicit any clear way of interacting with them from the regular Linux documentation. I informally called them the Red Power and Green DiskIO LEDs. It was by reading the headers to the source for Windows 10 for Raspberry Pi 2 that I found the GPIO pinouts for these two LEDs. They are:

35 Red Power LED
47 Yellow DiskIO LED

Python TimeDate functions

I needed a quick understanding of the Python 3.3.0 datetime functionality to do a difference in times across days. Python make it amazingly easy.

import datetime
from datetime import timedelta

# get current timedate
now = datetime.datetime.now()
print "now: " + str(now)
# get one day of time oneday = timedelta(days=1)
# make one day in the future and past
tomorrow = now + oneday
yesterday = now - oneday
print "tomorrow: " + str(tomorrow)
print "yesterday: " + str(yesterday)
# compare times
if now < tomorrow:
  print "now < tomorrow"
elif now > tomorrow:
  print "now > tomorrow"
else:
  print "now must be equal tomorrow"
if now > yesterday:
 print "now > yesterday"
elif now < yesterday:
 print "now < yesterday"
else:
 print "now = yesterday"

The expected results are:

CMD> python time.py
now: 2015-03-19 14:30:31.083000
tomorrow: 2015-03-20 14:30:31.083000
yesterday: 2015-03-18 14:30:31.083000
now < tomorrow
now > yesterday

I hope this helps someone.

Rackspace Cloud Load Balancer with Windows 2012 IIS

I’m working on a problem with Windows 2012 RTM server running an IIS web service. To load balance it, we decided to use Rackspace Cloud Load Balancers. Periodically we receive some errors that appear in the system event logs.

"A fatal alert was generated and sent to the remote endpoint. This may result in termination of the connection. The TLS protocol defined fatal error code is 40. The Windows SChannel error state is 1205."

Wildcard SSL Certificates

I’m beginning to setup enough infrastructure that a wildcard certificate would be nice but I’m uninterested in paying several hundred dollars a year for that certificate. The free certs that used to be around just are not there anymore so far as I can see. My goal is to setup SSL certificates for both my email server and all the virtual host web sites I’m hosting under my mcgarrah.org domain for less than a hundred dollars a year.

Skype 7.0 Upgrade UI Annoyance

Okay, full disclosure, I hate change or at least useless change. Skip over the rant to the HowTo fix Skype if you want.

Doctor of Applied Psuedoscience

I found a fun little website to make fake diplomas. This struck my funny bone.

Doctorate in Smartass

I hung it in my office next to my Bachelors degree in Computer Science and waited for someone to read it. It is the gift that keeps on giving.

Mininet network simulator

I’m taking a graduate course in computer networking at Georgia Tech. The tools they are asking us to use are all open source and allow for some pretty interesting projects.

One such tool is the Mininet software that allows for building realistic virtual networks with real switches, routers and applications running on a single system. We are using a virtual machine that contains a copy of the Linux operating system and the virtual networking software. So far we are encountering minor issues with the OS and VM software.

Downgrading VMware ESXi 5.5 virtual machine hardware

One of this issues I ran into with bouncing between VMware Player 6.0.3 and my VMware ESXi 5.5u1 server is the hardware level of the virtual machines. ESXi 5.5 without the vSphere licence will not manage the newer virtualHW.version = “10″ virtual machines.

More WordPress plugins

Some addition research into WP plugins have a couple more worth reviewing.

VMware ESXi toolchain build

I’ve been back to the toolchain for ESXi again and had some success.

I was really getting frustrated with my lack of success in building the VMware ESXi 5.5 toolchain and compilers. It was a multi-week effort and I’m usually able to get something like that working eventually. I took a couple of month break from it while I worked on some other things including this website(WordPress) and my email servers. This gave me some perspective.

WordPress Plugins

Researching plugins and extensions for WordPress has been an experience.

Certifications

I’ve got a pile of certifications that I’ve accumulated over the years.

Below are my Redhat Linux, Microsoft, Sun Solaris, Nortel Networking and ITIL cert logos. I think the RHCE and Sun Solaris certs were probably the hardest of this bunch.

RHCE MCP SCSA NNCDS ITIL

Here are my SAS certifications that took me six months to complete on my own time. The Clinical Trials Programmer exam was by far the hardest of this set of tests. I mostly use my SAS experience now to port software to R.

SAS BASE CDI STAT BI CLINICAL TRIALS REGRESSION MODELING

I’m interested in the security CISSP and VMware VCP5 certification but have not had the inclination to spend the money or time yet.

Debian on BA NAS 110

Hajo on the BlackArmor Forums has an older posting about getting Debian Linux 5.0 (Lenny) installed on BA NAS 110/220/4x0 (archived — Seagate forums shut down). This is not a port that includes the kernel but simply a minimum install that gets the system setup to install binaries out of the Lenny EABI ARM platform. The kernel that comes with the BA NAS is compatible with those binaries. The newer kernel for the Debian 6 or higher is not compatible with the BA NAS. This has some limitations but offers a way to get to some newer software pre-compiled. I don’t want to loose the existing functionality on my test system but the draw to DLNA services is pretty strong right now.

To top it off, Debian has a nicely setup cross-compilation setup documented for people working on non-Intel platforms. This offers a way to compile newer software without killing myself anymore on building the entire compiler and supporting software myself.

The goal has always been to make the NAS device useful and I want to play my movies off it to my TV upstairs so this might be the next thing I play with on the development NAS.

Rsync on Black Armor NAS 110

I figured out something simple but neat on the Black Armor NAS 110 (BA-NAS110) device. It has rsync a powerful file-system replication tool from UNIX.

Caveats are that in order to do this you must have root on the device and a ssh connection with the command line. I’ll write a friendly doc on how to get ‘root’ later. (Just search for Hajo Noerenberg’s work on the subject sans the friendly write up if you want to do it now.)

So, the BA-NAS110 is capable of using rsync from the command line to replicate its data to another NAS or Linux system if you have root on the system. Getting it setup was simple enough but knowing that the rsync daemon and client were on the systems was the trick.

You have to create a rsyncd.conf file since there isn’t one pre-built. Syntax is common to the typical rsync 3.0.4 version.

Seagate Black Armor 110 NAS

I found something fun.

The Seagate NAS (Network Attached Storage) that I’ve been using at my house is running an embedded Linux. A NAS is a big network hard drive you can share between computers. I got a root account on it and have found a whole world of fun that could be done in there. Root is the master administrative account for UNIX systems that let you do extra things beyond the normal.

First steps is getting a functional toolchain and then build some trivial tools. The goal would be to have a full set of GNU tools available in a package format for people to use. I want to publish a full working OpenSSH with scp support and rsync for this thing as a starting point. Maybe add some features for NFS. Just digging around on this thing reminded me how much I enjoy hacking on hardware.

NetApp iSER Performance Evaluation Project Continuation

NC State University - Computer Science

Senior Design Project

“Senior Design: NetApp iSCSI with RDMA/TOE” (Fall 2010 Capstone Project)

Aug 2010 - Dec 2010

Summary: Develop a methodology for 10Gbps iSCSI that utilized RDMA and TOE to reduce primary CPU and memory usage. Document and managed the project as a team leader. The resulting iSER implementation was utilized in a related NetApp Phd project at the University of Bangalore India.

Microsoft Developer Studio 6.0 Patches

This is a very old set of notes but might be useful for a developer dealing with Microsoft Visual Studio 6.0 for DOS and Windows 16-bit coding. This is from the era of Borland and Zortech Compilers being in play. I migrated this from my defunct darkmagic.org website.