|
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
|