davidmerrick
.me
Home
Blog
Projects
About
Schedule
Search
Writing
The full archive
233 posts since 2010.
2026
The Kinshasa Manifesto
Jun 25
Hello Distributed System, My Old Friend
Jun 1
Agentic Fundamentals
May 21
The Fellowship of the Smart Things
May 12
Shire: 10G Home Network Buildout
Apr 25
Meet Luke and Leia
Mar 29
First Ascent (Agentic Mountain)
Mar 7
2025
How I built a 111 kWh home battery system for 35% of retail
Nov 12
2024
Why I'll still use 1Password over Apple's new password manager
Jul 22
How to print a Notion page
Jul 22
2023
2023 Europe Cycling Trip
Oct 1
Wallowas Backpacking, July 2023
Jul 21
Sabbatical Week 4 - Cat Ba Island, Hanoi, Da Nang, and Seoul
May 21
Sabbatical Week 3 - Ninh Binh, Hanoi, and Ha Long Bay
May 14
Sabbatical Week 2 - Hoi An, Hue, Phong Nha, and Ninh Binh
May 7
Sabbatical Week 1 - Vietnam Visa Nightmares and Salvaging the Trip
May 1
Revisiting Vietnam after 23 years
Apr 21
How to upscale video with AI
Apr 4
Working with text in IntelliJ
Mar 23
How I digitized hundreds of old MiniDV tapes
Mar 8
How I'm doing backups in 2023
Mar 1
How to quickly convert HEIC to JPEG in macOS
Jan 31
Pro Tip - Boolean Searches in the Google Photos Web UI
Jan 23
State of my smart home, 2023
Jan 11
How to digitize old family photos with the Epson FastFoto
Jan 2
2022
Best of 2022
Dec 26
Advent of Code 2022 in Kotlin
Dec 16
Costa Rica 2022
Dec 8
Ride Report: Trail of the Couer d'Alenes, September 2022
Sep 13
San Juan Islands Bike Trip, October 2021
Jan 24
A look back on 2021
Jan 18
2020
Review: "Java: Concurrency in Practice"
Jul 5
Best of 2020
Jul 4
Bowflex C6 Spin Bike Review
Jun 24
The Corona Chronicles, Week 4
Mar 31
The Corona-cles of Narnia: Week 3
Mar 28
The Corona Diaries, Week 2
Mar 22
"Working Effectively with Legacy Code" Summary
Feb 17
Useful git hooks
Feb 8
2019
Fix for "move to trash" option disabled in Hazel
Nov 14
The Information Diet
Oct 28
Hiking the Entire Wildwood Trail in One Day
Oct 27
The Perks of Solo Travel
Oct 26
A Quick Intro to GitHub Actions
Oct 24
On Digital Minimalism
Jun 15
How to make a repository read-only in Sonatype Nexus 2
Jan 28
Favorite Podcasts 2019
Jan 27
2018
Enchantments Backpacking Trip
Sep 24
Running MySQL in Docker with automatic restart
Sep 6
McKenzie River Trip 2018
Sep 5
Java convention of naming things after islands
Aug 18
2017
CompletableFutures: A Primer
Dec 20
How to remap Alfred file search hotkey
Dec 18
Useful Paw commands
Dec 15
How to Replace the Power Supply on the IKEA Bekant
Dec 9
Useful Bash commands
Dec 8
Branch parity after a git merge
Dec 4
Git Quirks
Dec 4
Useful Java snippets
Nov 29
Good Java practices for clarity
Nov 28
Useful IntelliJ Defaults
Nov 21
Visual Representation of SQL Joins
Nov 20
How to defensively code Optional parameters in Java
Nov 19
Transitioning Swagger 1.5 to 2.0 annotations
Nov 15
How to securely share AWS keys
Nov 12
How to fix "invalid target release" error in IntelliJ
Nov 3
What's in a name?
Nov 2
What's up with the "clazz" convention in Java?
Oct 25
Fluent Interfaces and the Builder Pattern
Oct 24
My macOS workflows
Oct 24
How to fix Chrome not opening links in High Sierra
Oct 23
Boston Trip
Oct 9
Fun Facts
Sep 26
Duplicate Content-Type headers sent in Paw on macOS
Sep 25
Useful IntelliJ hotkeys and workflows on macOS
Sep 25
Useful macOS Lightroom keyboard shortcuts
Sep 25
Word of the day: Skeuomorphism
Sep 21
Favorite Podcasts 2017
Sep 20
What is Type Erasure?
Sep 19
Python quirk with negative list indices
Sep 17
What is Dependency Injection?
Sep 15
Software Engineering Principles
Sep 15
Favorite engineers and designers
Sep 7
Visualizing Running Activity
Sep 7
How to blend action shots in Photoshop
Sep 7
Git alias to generate .gitignore file
Aug 26
Handy GitHub Workflow Tricks
Aug 25
Holden Village 2017 Photos
Aug 20
Holden Village Drone Flights
Aug 7
How to remove the .idea folder from git
Aug 4
Software Engineering Interviewee Questions
Aug 1
Software Engineering Interview Resources
Jul 27
CSS Specificity
Jul 21
Zig Zag Mountain Hike
Jul 9
Lolo Pass to Bald Mountain Hike
Jul 7
Why is Nagios called Nagios?
Jul 7
How to install XDebug with PHP 5.6 on MacOS 10.12
Jul 3
Serene Lake Backpacking Trip
Jul 3
Dickerson's Hierarchy of Service Reliability
Jun 26
Working with Stacks in Java
Jun 25
Training an RNN to generate Trump Tweets
Jun 12
Trump Tweets that didn't age well
Jun 12
JIRA template creator bookmarklet
Jun 7
How to use NIST's ACTS tool for Combinatorics testing
Jun 6
Hillsboro Airplane home drone flight
May 28
Useful git aliases
May 27
About this site
May 24
Moving my Jekyll website from GitHub Pages to S3
May 24
Alexa Sonos Intercom
May 17
Setting up a Node Sonos API using Resin.io
May 16
Using an AWS IoT button to control Sonos speakers
May 16
Alexa Skill for TriMet Arrivals
Apr 26
Olympic Beach Backpacking
Apr 24
Monitoring your Internet speed with Resin.io and DataDog
Apr 17
Weekend Project: Bluetooth headphones for the TV
Feb 12
2016
How to back up your custom Lightroom presets with git
Nov 14
How to generate heatmaps from geotagged images
Oct 30
Greece Trip
Oct 14
Exploring the Abandoned Tillamook Railroad
Sep 26
Indian Heaven Weekend
Aug 10
Wine Tasting in the Columbia Gorge
Jul 25
Building a Raspberry Pi-Powered Kubernetes Cluster
Feb 16
2015
How to freeze page Javascript execution in Chrome
Aug 20
Reification vs. Erasure in Java Collections
Jul 19
Jetta vs. Rock Pile: our backpacking trip to Waucoma Lakes
Jun 12
Generic method for filtering lists with Google Guava
Apr 22
How to persistently set environment variables on OSX 10.10
Apr 15
jQuery: make selection from sub-tree
Apr 7
On the HTML 5 "data" attribute
Apr 7
Object-oriented design principles
Mar 20
How to cleanly construct HTML with jQuery
Mar 17
Python class for TriMet train arrivals
Mar 1
Referencing Chrome Extension resources in CSS
Feb 20
Linus Torvalds on Design
Jan 13
Advantages of Immutability in Java
Jan 6
Using Imagemagick to remove GoPro fisheye distortion
Jan 5
2014
On Runtime Exceptions in Java
Dec 19
History of the wheel user in Linux
Dec 18
Linux: Add a user to have sudo privileges
Dec 18
OSX HotCorners Alternative
Dec 9
Advantages of Primitives in Java
Dec 3
How to return an array to a Robot variable
Dec 3
Useful Intellij HotKeys and tricks in OSX
Dec 3
Chrome plugins for automated web browser testing
Nov 27
Securing a Linux server with port knocking
Nov 27
Implementing a sleep() function in JavaScript
Nov 26
Let's Encrypt: Free, automated SSL for the entire Web
Nov 26
How to escape digits in CSS selectors
Nov 22
Origin of the command key symbol in OSX
Nov 22
Florida man drives around with cell phone signal jammer for 2 years
Nov 20
Git trick: shortcut to cherry-pick the last commit to a repo
Nov 20
Testing xpath selectors with FireFinder
Nov 18
"Grepping" in Finder
Nov 13
Adding a custom search engine to Chrome
Nov 13
Controlling iTunes from the OSX terminal
Nov 13
Generating a pop-up alert from OSX terminal
Nov 13
Software engineering abbreviations
Nov 13
Adding color back to the Mac terminal
Nov 12
Fetching fresh image preview data from Facebook
Nov 12
Removing a file from staging in git
Nov 11
How to grayscale an image with CSS
Nov 10
How to secure a Linux server from unauthorized SSH access
Nov 9
How to setup SSH key-based authentication
Nov 9
How to view the octal permissions of a file or folder in Linux
Nov 9
Mac Adware removal
Nov 9
How to tunnel VNC over SSH
Nov 8
Normalizing uploaded image rotation in Java
Nov 8
The HTML "Marquee" tag
Nov 6
Bash shell script to check the stock price of a company
Nov 5
TIL: Browsers do not pass the referer string when on an HTTPS page
Nov 5
How to change the default screenshot directory on OSX
Nov 4
How to use a keyboard shortcut to switch keyboard layouts in OSX
Oct 31
How to add tab-completion to git commands and branches
Oct 27
Reflection in Java
Oct 27
Warm Springs Hike
Oct 26
Java trick: Use an implicit "finally" block to automatically close a stream
Oct 24
How to move files securely through a multi-hop SSH proxy chain
Oct 23
Assign a keyboard shortcut to quickly fullscreen an OSX window
Oct 22
My summer at Holden Village
Oct 22
Java Generics
Oct 21
The Google Guava Optional class
Oct 21
Creating an ad hoc VPN on OSX using reverse SSH tunneling and a launch daemon
Oct 19
The Singleton design pattern in Java
Oct 18
Using meta classes in Python to create a Constants class
Oct 15
Experimenting with static methods in Python
Oct 14
Functional programming in Java: using Predicates
Oct 10
Use Object.equals() instead of String.equalsIgnoreCase() to avoid a NullPointerException in Java
Oct 9
Buck Lake camping trip
Oct 6
Battle-testing waterproof iPhone armbands
Sep 24
Configuring MiniDLNA on FreeNAS
Sep 22
Installing FreeNAS 9.2.1 on a USB drive using the ISO
Sep 21
Holden highlights from Summer 2014
Sep 8
Hummingbird shot at 1/4000"
Sep 8
Paragliding in Tillamook [video]
Sep 8
Bike ride from the Portland Zoo to the Waterfront [video]
Sep 7
Mountain biking in Forest Park
Sep 7
Find files modified recently in Linux and OSX
Sep 6
High-speed dog photography
Sep 6
Todd Lake to Broken Top hike
Aug 31
How to cleanly merge panorama photos in Photoshop
Aug 22
Working with thread events in Python
Aug 21
Automating SFTP authentication with SSH keys
Aug 20
Daemonizing a Python script
Aug 20
How to import GPX data from a legacy Garmin 60CSX
Aug 20
Performing DNS lookups with Dig
Aug 20
How to resize VirtualBox virtual machine storage on OSX
Aug 19
Image Lake Hike
Aug 19
How to use a camcorder battery to triple your DSLR's battery life
Aug 15
Essential gear for the technologically-inclined backpacker
Aug 13
My favorite quotes
Aug 4
My favorite quotes about the outdoors
Aug 3
Funniest iOS 8 text suggestions
Jun 5
The FCC's meeting on net neutrality
May 14
This Saturday, I tried Google Glass
May 13
Modifying the X10 DS10A sensor
May 10
Replacing my MacBook's hard disk with an SSD
Apr 16
Meeting Alexis Ohanian, Reddit's co-founder
Apr 15
OSX terminal tricks
Feb 18
2013
Ales on trails: Eleven epic hikes I did this summer
Sep 26
2012
HAL: Building the poor man's smarthome
Dec 31
How to build a standing desk on the cheap with galvanized pipe
Dec 30
2010
Six essential Google Analytics metrics
Jul 18
How to edit a public Google map
Jul 16
How to use Google as your own free content distribution network
Jul 10
How to automate your Adwords Editor login with AutoHotkey
Jul 9
How to install Cacti 0.7.8D plugin architecture on Ubuntu 9.10
Jun 28
Piggybacking Google Apps proxy servers for free
Jun 21
2 simple ways to get a real person on the phone
Jun 21
Remixing the Web, part 2: Using Yahoo Pipes
Jun 19
Setting up and configuring a local Wordpress installation with mod\_rewrite
Jun 10
Remixing the web, part 1: Pulling RSS feeds from static pages
Jun 4
VoIP hacks: how to spoof your caller ID as the White House's phone number
May 30
8 essential (and free) "cloud" apps for small businesses
May 25