All Blog Posts

Date Title
RIP: Aircraft Radar Skill for Amazon Alexa
Some TODOs for the new site
Great Moments in Modern Apple User Experience Design
Know Your Birds: Red-Headed Woodpecker
My eBird Profile
More Severance Michigan Connections
A Selection of Complex CSS Selectors
Sunset over Canyonlands National Park, viewed from BLM's Needles Overlook in Utah.
Birds in Moab and Arches & Canyonlands National Parks
Brief Review: Tamron 28-300mm F/3.5-6.3 Di VC PZD
My (Only) Two Complaints about the Canon 10x42 L IS WP Binoculars
Automating Ghost Routes & Redirects Deployment
Dust Caps for Oxygen/Acetylene Hoses
Solar Water Preheater Goals & Design Considerations
A migration to Ghost from Jekyll
Some new DNS-related tools
Everything I know about the YK-1000H NTP Server
Cloning Raspberry Pi SD cards
Faking the fan rotor lock signal in a Tripp Lite SU1000RTXLCD2U UPS
Letter of Recommendation: Quality Binoculars
Freeing disk space on GitHub Actions runners
Improved low-battery shutoff for my DIY Ego-powered 12V supply
Fixing Ego batteries in a low-voltage "defective" state
Making a Docker container depend on a disk being properly mounted
Moving fake-hwclock to a separate partition on a read-only Raspberry Pi
Raspberry Pi Use Cases
Letter of Recommendation: Where to start with Alastair Reynolds
Keeping a SMB share mounted on macOS (version 2)
Monitoring for NAS data corruption on ext4 with cshatag
Photographing an unusual aurora in southeastern Michigan
Linux: start an mdraid check even though bash's noclobber is set
Alfred workflows for searching Bear notes and Docker Hub images
Some recent bird photos
Pi Reliability: Reduce writes to your SD card
The 12v portable power supply Ego needs to make
Running a Raspberry Pi with a read-only root filesystem
Setting net.netfilter.nf_conntrack_max on Ubuntu 22.04
Pi Reliability over WiFi: 'Temporary failure in name resolution'
Keeping a SMB share mounted on macOS (and alerting when it does down)
More Koyaanisqatsi desktop wallpaper (sunrise clouds this time)
Socket organizers, end caps, and 3D-printed friction fits
Making 3D-printed end caps for sharp aluminum extrusions
Blocking disposable email domains in Mastodon
Reliable WiFi for the Bambu X1C 3D printer
Desert stills from Koyaanisqatsi as desktop wallpaper
Automated generator load-shedding for the house
Fixing bad design with a label maker
OpenList is no longer available in the Chrome Web Store
Recycling a pallet into an Adirondack-ish-style footrest
Setting up a secondary Pi-Hole on my home network
Setting up KVM virtual machines using a bridge network on an Ubuntu host
How to move Docker's data directory from /var/lib
Considerations for a long-running Raspberry Pi
Stop using the Raspberry Pi's SD card for swap
Remote logging for easier Raspberry Pi debugging
Raspberry Pi SD cards: fsck them often
Mitigating hardware/firmware/driver instability on the Raspberry Pi
Maintaining a solid WiFi connection on Raspberry Pi
Keep your software up and running on the Raspberry Pi
Disable or remove unneeded services and software to help keep your Raspberry Pi online
Consider the risks before making any dramatic changes to your Raspberry Pi setup
Choosing the right SD card for your Pi
Fixing excessive Pi-hole lighttpd access log size when Netdata is installed
A complete table of Nikon 1 system battery compatibility
From Pinboard to Raindrop
Photo sequence of Bald Eagles hunting, from Nov. 2022
A simple, reasonably verbose URL shortener.
New IDs resulted in many “new” posts in Ann Arbor FOIA RSS feed
Thinking about cardboard
Hacking slightly better sum types without Go generics
3D Printing Recommendation: Plasti-Dip Spray Rubberized Coating
Reconsidering Netdata
TDS220 Oscilloscope Refurbishment: Rotary Encoders & Backlight
Building the atomic clock I’ve always wanted
3D Printing Project: Tiny Trays for Screws, etc.
Embracing a ruthless approach to email spam
macOS Scripting: How to tell if the Terminal app has Full Disk Access
Patron-only Fatal Error episodes are becoming public
Reducing SD Card Wear on a Raspberry Pi or Armbian Device
PiKVM Build
Expanding the Ubiquiti Cloud Key Gen 2+ with a 3.5” Hard Drive
Thermal Camera Photos of Wemos D1 Mini ESP8266 Board
HTTPS Requests with a Small Set of Root Certificates on ESP8266 + Arduino
HTTPS Requests with a Root Certificate Store on ESP8266 + Arduino
Shipping Data to InfluxDB using Arduino + ESP8266
Initial Impressions of ESP8266 + Arduino
Environmental Data Logging to InfluxDB using BME280/AM2301 Sensors on Raspberry Pi
Log your Ecobee data in InfluxDB with ecobee_influx_connector
Working around the “Untrusted Developer” bug on iOS 15
Checking in on iOS 15 bugs, as of 15.0.2
Reusing an ESP8266HTTPClient
How to enable debug logging for Arduino's ESP8266HTTPClient with PlatformIO
ESP8266 + PlatformIO Serial Console Monitoring with Exception Decoding
Debugging an Intermittent Arduino/ESP8266 ISR Crash
Small commands, big consequences
More Bugs in iPhone 13 & iOS 15
iOS 15 & Safari 15
Integrating URLs into the Finder file-browsing experience
I wrote ‘hosts-timer’ to help quit my (desktop) Twitter and Facebook habits
Tiny Side Project: Lofi Cafe.app
I got into 3D printing, and it feels like magic
LAKE.app
LAKE.app GitHub repository
Michigan COVID Vaccine Links
Deferred Tasks, Project Templates, and More: Customizing Things with AppleScript
Now: Feb. 2021
Redirecting Hacker News traffic away from your site via Nginx configuration
Why I use Arq instead of restic for macOS backups
Ship electricity usage data from an Energy Bridge to InfluxDB
Replacing iTunes, Music.app, iTunes Match, and iCloud Music Library
Securing my personal SSH infrastructure with Yubikeys
Using Flickr Again
Letters of Recommendation: Where to start with Peter F. Hamilton, Mastodon iPhone apps, and Domain Registrars
Now, Jan. 2021
A lightweight service health check tool written in Bash
Simple programs that make Things.app better
Introducing Runner: a lightweight wrapper for cron jobs
Letter to Ann Arbor City Council regarding the failed Y Lot vote
Ann Arbor iPhone X Wallpaper
Dashcam & Crash Report from March 2017 AAPD Diag Crash
Deploying Let’s Encrypt with Nginx on Ubuntu 16.04
Takeaways from Vox’s post on malicious ads
Reading List: Meltdown and Spectre
What Ali Ramlawi Gets Wrong About Development and Quality of Life
API Design Reading List
Recommended Equifax Breach Resources
Failing Actors Reading Series
Quick ADS-B monitoring on OS X
ALPRs in Ann Arbor
DRYing up duplicate code into helper functions
Monitoring aircraft via ADS-B on OS X
Statically-Typechecked Duck Types in Swift
Choosing a Version Number for a CocoaPod with Updated Dependencies
Parent-Child Communication in a Coordinator/View Model Application
Fatal Error, Season 2
Fatal Error
Why Comcast injecting messages into web traffic is dangerous
The hard problem in decentralized social networks
Let’s Encrypt vs. iTunes: anatomy of an error delivering Fatal Error
Fixing Storyboard Segues: Only Apple Can Do This
Radio in Ann Arbor: Scanning KARB
Over-Reactive?
A brief index of many neat Ann Arbor things
Ad networks in their current incarnation are too dangerous to be allowed to exist.
Modeling polymorphic relationships in Swift (spoiler: enums seem pretty cool)
Does everything need to be HTTPS?
App Transport Security: What, Why, How?
Ad-light, Malware-heavy
Quotes
‘Obviously super complex’: evaluating software architecture as simple vs. easy
String is not a sufficient type: how using your type system can help you make better software
Writing good commit messages
Why I’m selling my Apple Watch
Working with custom UIView designated initializers
Nobody is using App Transport Security; what’s next?
Ad blockers aren’t killing the web; ad networks are killing the web
Multiple Inheritance vs. Traits or Protocol Extensions
Cocoa’s mutable-subclass pattern is an antipattern
Be Proactive: Use Reactive
Casting in Swift 1.2: a brief summary
IBOutlet declarations in Swift
Subjective-C: I use property (dot) syntax liberally
Why use GitHub Wikis?
Tiny Swift idioms in ObjC
A list of Auto Layout DSLs, Categories, Etc.
The problems with due-process-compatible cryptography
Why non-engineers should care about “Technical Debt”
Why Reactive programming techniques are valuable
Notes on Initialization in Swift
Physics in Interstellar
Back Buttons for Web View Controllers
Real World Singleton Design
Greg Titus on NSFileCoordination and Extensions
iOS 8 Extensions Roundup
Let’s talk about Optionals
Benefits of Cocoa: Still here in Swift
It’s Not Exploitable
Code Optional
Tech Debt and Refactoring
Explicit Programming
↗ Avoiding Singleton Abuse
Follow me on Pinboard
Quick followup on singletons
Including your Pods directory in source control
Singletons in Cocoa applications
The Value of ReactiveCocoa
Objective-C
Serving from your Dropbox folder with nginx
I FOIA'd Myself with the FBI
Do programmers use serial commas more often than other people? (No.)
ArborWX
CDZLinkOpenManager
Where is this awesome airplane playground?
CDZPinger
The UGLi
Elegant UITableView row selection behavior based on edit state
Collaborating with Git and Github
1.5 Years of UMich Magic Bus Data
Shooting Theatre, Dance, and Music
Fixing 'Corrupted MAC On Input' Error with Git/SSH/VirtualBox 4.1.6
UMich Google Calendar Updated for Winter 2012
Capturing Lightning
UMich Google Calendar Updated for Fall 2011
How Rdio Can Kill Spotify (and vice-versa)
Removing AT&T Mobile Web Bookmark from Android Phones
Making a Private Gist Public
Shooting Concerts with Strobe Lights
The Twitter Busyness Average
Find open CAEN computers using your phone
Moving from Wordpress to Jekyll (and a new design)
UMich Google Calendar Updated for Winter 2011
Michigan Asst. AG Shirvell appeared at protest in May to defame Armstrong
Datasheet for RadioShack Phototransistor
Perfect ViewVC On Dreamhost
University of Michigan Google Calendar
Very Simple Dynamic DNS Client
↗ Singletons are Pathological Liars