Posts are listed in reverse chronological order.
You may also browse blog posts by series or tags.
- Keeping a SMB share mounted on macOS (and alerting when it does down) (11 Mar 2024)
- More Koyaanisqatsi desktop wallpaper (sunrise clouds this time) (22 Feb 2024)
- Socket organizers, end caps, and 3D-printed friction fits (20 Feb 2024)
- Making 3D-printed end caps for sharp aluminum extrusions (16 Feb 2024)
- Blocking disposable email domains in Mastodon (16 Feb 2024)
- Reliable WiFi for the Bambu X1C 3D printer (15 Feb 2024)
- Desert stills from Koyaanisqatsi as desktop wallpaper (13 Feb 2024)
- Automated generator load-shedding for the house (12 Feb 2024)
- Fixing bad design with a label maker (12 Feb 2024)
- OpenList is no longer available in the Chrome Web Store (08 Feb 2024)
- Recycling a pallet into an Adirondack-ish-style footrest (06 Feb 2024)
- Setting up a secondary Pi-Hole on my home network (06 Feb 2024)
- Setting up KVM virtual machines using a bridge network on an Ubuntu host (02 Feb 2024)
- How to move Docker's data directory from /var/lib (16 Jan 2024)
- Considerations for a long-running Raspberry Pi (29 Dec 2023)
- Stop using the Raspberry Pi's SD card for swap (29 Dec 2023)
- Remote logging for easier Raspberry Pi debugging (29 Dec 2023)
- Raspberry Pi SD cards: fsck them often (29 Dec 2023)
- Mitigating hardware/firmware/driver instability on the Raspberry Pi (29 Dec 2023)
- Maintaining a solid WiFi connection on Raspberry Pi (29 Dec 2023)
- Keep your software up and running on the Raspberry Pi (29 Dec 2023)
- Disable or remove unneeded services and software to help keep your Raspberry Pi online (29 Dec 2023)
- Consider the risks before making any dramatic changes to your Raspberry Pi setup (29 Dec 2023)
- Choosing the right SD card for your Pi (29 Dec 2023)
- Fixing excessive Pi-hole lighttpd access log size when Netdata is installed (08 Nov 2023)
- A complete table of Nikon 1 system battery compatibility (24 Oct 2023)
- From Pinboard to Raindrop (06 Apr 2023)
- Photo sequence of Bald Eagles hunting, from Nov. 2022 (28 Jan 2023)
- Thinking about cardboard (18 Mar 2022)
- Hacking slightly better sum types without Go generics (14 Mar 2022)
- 3D Printing Recommendation: Plasti-Dip Spray Rubberized Coating (16 Dec 2021)
- Reconsidering Netdata (14 Dec 2021)
- TDS220 Oscilloscope Refurbishment: Rotary Encoders & Backlight (13 Dec 2021)
- Building the atomic clock I’ve always wanted (07 Dec 2021)
- 3D Printing Project: Tiny Trays for Screws, etc. (07 Dec 2021)
- Embracing a ruthless approach to email spam (16 Nov 2021)
- macOS Scripting: How to tell if the Terminal app has Full Disk Access (11 Nov 2021)
- Patron-only Fatal Error episodes are becoming public (10 Nov 2021)
- Reducing SD Card Wear on a Raspberry Pi or Armbian Device (09 Nov 2021)
- PiKVM Build (09 Nov 2021)
- Expanding the Ubiquiti Cloud Key Gen 2+ with a 3.5” Hard Drive (04 Nov 2021)
- Thermal Camera Photos of Wemos D1 Mini ESP8266 Board (03 Nov 2021)
- HTTPS Requests with a Small Set of Root Certificates on ESP8266 + Arduino (29 Oct 2021)
- HTTPS Requests with a Root Certificate Store on ESP8266 + Arduino (28 Oct 2021)
- Shipping Data to InfluxDB using Arduino + ESP8266 (15 Oct 2021)
- Initial Impressions of ESP8266 + Arduino (15 Oct 2021)
- Environmental Data Logging to InfluxDB using BME280/AM2301 Sensors on Raspberry Pi (14 Oct 2021)
- Log your Ecobee data in InfluxDB with ecobee_influx_connector (13 Oct 2021)
- Working around the “Untrusted Developer” bug on iOS 15 (13 Oct 2021)
- Checking in on iOS 15 bugs, as of 15.0.2 (12 Oct 2021)
- Reusing an ESP8266HTTPClient (08 Oct 2021)
- How to enable debug logging for Arduino's ESP8266HTTPClient with PlatformIO (08 Oct 2021)
- ESP8266 + PlatformIO Serial Console Monitoring with Exception Decoding (07 Oct 2021)
- Debugging an Intermittent Arduino/ESP8266 ISR Crash (07 Oct 2021)
- Small commands, big consequences (06 Oct 2021)
- More Bugs in iPhone 13 & iOS 15 (27 Sep 2021)
- iOS 15 & Safari 15 (22 Sep 2021)
- Integrating URLs into the Finder file-browsing experience (21 Sep 2021)
- I wrote ‘hosts-timer’ to help quit my (desktop) Twitter and Facebook habits (09 Sep 2021)
- Tiny Side Project: Lofi Cafe.app (09 Sep 2021)
- I got into 3D printing, and it feels like magic (08 Sep 2021)
- LAKE.app (31 Aug 2021)
- Deferred Tasks, Project Templates, and More: Customizing Things with AppleScript (15 Mar 2021)
- Now: Feb. 2021 (23 Feb 2021)
- Redirecting Hacker News traffic away from your site via Nginx configuration (23 Feb 2021)
- Why I use Arq instead of restic for macOS backups (22 Feb 2021)
- Ship electricity usage data from an Energy Bridge to InfluxDB (22 Feb 2021)
- Replacing iTunes, Music.app, iTunes Match, and iCloud Music Library (11 Feb 2021)
- Securing my personal SSH infrastructure with Yubikeys (08 Feb 2021)
- Using Flickr Again (03 Feb 2021)
- Letters of Recommendation: Where to start with Peter F. Hamilton, Mastodon iPhone apps, and Domain Registrars (01 Feb 2021)
- Now, Jan. 2021 (31 Jan 2021)
- A lightweight service health check tool written in Bash (06 Jan 2021)
- Simple programs that make Things.app better (07 Dec 2020)
- Introducing Runner: a lightweight wrapper for cron jobs (04 Dec 2020)
- Deploying Let’s Encrypt with Nginx on Ubuntu 16.04 (25 Jan 2018)
- Takeaways from Vox’s post on malicious ads (22 Jan 2018)
- Reading List: Meltdown and Spectre (07 Jan 2018)
- API Design Reading List (24 Sep 2017)
- Recommended Equifax Breach Resources (14 Sep 2017)
- Failing Actors Reading Series (11 Sep 2017)
- Quick ADS-B monitoring on OS X (09 Aug 2017)
- DRYing up duplicate code into helper functions (12 Jun 2017)
- Monitoring aircraft via ADS-B on OS X (29 Jan 2017)
- Statically-Typechecked Duck Types in Swift (18 Jan 2017)
- Choosing a Version Number for a CocoaPod with Updated Dependencies (16 Jan 2017)
- Parent-Child Communication in a Coordinator/View Model Application (16 Jan 2017)
- Fatal Error, Season 2 (16 Jan 2017)
- Fatal Error (09 Dec 2016)
- Why Comcast injecting messages into web traffic is dangerous (22 Nov 2016)
- The hard problem in decentralized social networks (21 Nov 2016)
- Let’s Encrypt vs. iTunes: anatomy of an error delivering Fatal Error (07 Nov 2016)
- Fixing Storyboard Segues: Only Apple Can Do This (03 Sep 2016)
- Over-Reactive? (05 Apr 2016)
- Ad networks in their current incarnation are too dangerous to be allowed to exist. (15 Mar 2016)
- Modeling polymorphic relationships in Swift (spoiler: enums seem pretty cool) (04 Mar 2016)
- Does everything need to be HTTPS? (27 Jan 2016)
- App Transport Security: What, Why, How? (14 Jan 2016)
- Ad-light, Malware-heavy (06 Jan 2016)
- Quotes (15 Dec 2015)
- ‘Obviously super complex’: evaluating software architecture as simple vs. easy (14 Dec 2015)
- String is not a sufficient type: how using your type system can help you make better software (10 Dec 2015)
- Writing good commit messages (27 Oct 2015)
- Why I’m selling my Apple Watch (14 Oct 2015)
- Working with custom UIView designated initializers (01 Oct 2015)
- Nobody is using App Transport Security; what’s next? (18 Sep 2015)
- Ad blockers aren’t killing the web; ad networks are killing the web (17 Sep 2015)
- Multiple Inheritance vs. Traits or Protocol Extensions (15 Jun 2015)
- Cocoa’s mutable-subclass pattern is an antipattern (21 May 2015)
- Be Proactive: Use Reactive (17 Apr 2015)
- Casting in Swift 1.2: a brief summary (21 Mar 2015)
- IBOutlet declarations in Swift (21 Mar 2015)
- Subjective-C: I use property (dot) syntax liberally (20 Mar 2015)
- Why use GitHub Wikis? (19 Mar 2015)
- Tiny Swift idioms in ObjC (26 Feb 2015)
- A list of Auto Layout DSLs, Categories, Etc. (12 Feb 2015)
- The problems with due-process-compatible cryptography (19 Jan 2015)
- Why non-engineers should care about “Technical Debt” (12 Jan 2015)
- Why Reactive programming techniques are valuable (04 Jan 2015)
- Notes on Initialization in Swift (15 Dec 2014)
- Physics in Interstellar (18 Nov 2014)
- Back Buttons for Web View Controllers (24 Sep 2014)
- Real World Singleton Design (22 Sep 2014)
- Greg Titus on NSFileCoordination and Extensions (16 Sep 2014)
- iOS 8 Extensions Roundup (16 Sep 2014)
- Let’s talk about Optionals (26 Aug 2014)
- It’s Not Exploitable (26 Aug 2014)
- Code Optional (26 Aug 2014)
- Benefits of Cocoa: Still here in Swift (26 Aug 2014)
- Tech Debt and Refactoring (25 Aug 2014)
- Explicit Programming (25 Jul 2014)
- Follow me on Pinboard (28 Mar 2014)
- Quick followup on singletons (27 Mar 2014)
- Including your Pods directory in source control (25 Mar 2014)
- Singletons in Cocoa applications (07 Mar 2014)
- The Value of ReactiveCocoa (15 Feb 2014)
- Objective-C (14 Feb 2014)
- Serving from your Dropbox folder with nginx (12 Jan 2014)
- Do programmers use serial commas more often than other people? (No.) (16 Jul 2013)
- CDZLinkOpenManager (02 Apr 2013)
- Where is this awesome airplane playground? (21 Mar 2013)
- CDZPinger (15 Mar 2013)
- Elegant UITableView row selection behavior based on edit state (09 Oct 2012)
- Collaborating with Git and Github (19 Sep 2012)
- 1.5 Years of UMich Magic Bus Data (02 Jul 2012)
- Shooting Theatre, Dance, and Music (22 Apr 2012)
- Fixing 'Corrupted MAC On Input' Error with Git/SSH/VirtualBox 4.1.6 (19 Dec 2011)
- UMich Google Calendar Updated for Winter 2012 (07 Dec 2011)
- Capturing Lightning (18 Oct 2011)
- UMich Google Calendar Updated for Fall 2011 (12 Aug 2011)
- How Rdio Can Kill Spotify (and vice-versa) (03 Aug 2011)
- Removing AT&T Mobile Web Bookmark from Android Phones (02 Aug 2011)
- Making a Private Gist Public (11 May 2011)
- The Twitter Busyness Average (06 Apr 2011)
- Shooting Concerts with Strobe Lights (06 Apr 2011)
- Find open CAEN computers using your phone (23 Feb 2011)
- Moving from Wordpress to Jekyll (and a new design) (09 Feb 2011)
- UMich Google Calendar Updated for Winter 2011 (09 Dec 2010)
- Datasheet for RadioShack Phototransistor (19 Aug 2010)
- Perfect ViewVC On Dreamhost (07 Jul 2009)
- University of Michigan Google Calendar (26 Jun 2009)
- Very Simple Dynamic DNS Client (25 Jan 2009)