Welcome to my personal site. In addition to the posts you see below, feel free to explore other places where I stash content here. The now page is an occasionally-updated page about long-term plans and activities. I try to post several times a week and those updates appear on the journal page. Sometimes I post tidbits about things I learn in the til page. More info in: toolkit, readings, to learn, gallery, and colophon.

Consolidated advice for respiratory virus immunization 2026-2027

Preview of the AMA respiratory virus immunization recommendations chart There is a lot of misinformation coming out of the Trump administration about immunizations. In fact, the vast majority of what they are saying and what they have published is utter nonsense. For example, Robert F. Kennedy, Jr. claims that vaccines may cause autism. There’s not a shred of quality evidence that backs up this claim.

Since government sources in the U.S. can no longer be trusted for accurate health-related advice, the American Medical Association (AMA) has collected respiratory virus immunization recommendations into a single-page reference covering influenza, COVID-19, and respiratory syncytial virus (RSV), organized by age and risk group.

Here’s the deal with immunizations: they don’t necessarily prevent you from getting sick. They reduce the chances that you will contract the diseases that they are protecting against. But the main effect is to reduce the chances of severe infection. It’s really stupid not to protect yourself and help preserve the public health. Anyway, would you take medical advice from a guy that collects and eats roadkill?!

Download the PDF saved with this post, or view the original PDF on the American Medical Association website.

Exporting Indigo device list to CSV

Indigo device list

Sometimes I find myself needing to code something for Indigo, the macOS home automation application, and I would like to have my list of devices available. Rather than connect to my Indigo server to look up each device’s name or ID, it would be convenient to have a list at hand whenever I need it.

You can run the following script in the Indigo scripting shell, opened via Plugins > Open Scripting Shell in Indigo. The script exports device names, IDs, and descriptions to a CSV file, sorted alphabetically by folder and then by device name. Device descriptions appear in the Notes column. Devices outside a folder appear under (no folder).

Replace YOUR_USER_NAME in output_path with your macOS account’s short username. The file is written to the Desktop on the Mac running the scripting shell; you can change the path to another existing, writable folder if you prefer. Running the script again overwrites the previous export.

import csv

folders = {}

for folder in indigo.devices.folders:
    folders[folder.id] = folder.name

folders[0] = "(no folder)"  # unfiled devices

output_path = "/Users/YOUR_USER_NAME/Desktop/indigo_devices_by_folder.csv"

rows = []
for dev in indigo.devices:
    folder_name = folders.get(dev.folderId, f"Unknown folder {dev.folderId}")
    rows.append((folder_name, dev.name, dev.id, dev.description))

rows.sort(key=lambda r: (r[0].lower(), r[1].lower()))

with open(output_path, "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["Folder", "Device", "Device ID", "Notes"])
    writer.writerows(rows)

indigo.server.log(f"Wrote {len(rows)} devices to {output_path}")

The resulting CSV gives me a searchable reference that I can keep open in a spreadsheet while writing Indigo scripts. It is a snapshot of the device list, so I just rerun the export after adding, renaming, or moving devices to keep it current.

If you have questions or suggestions, please get in touch through my contact page.

A better user experience when a Firefox extension loads a new tab custom page

N.B. This workaround is for macOS, using Keyboard Maestro. I have not tried equivalents elsewhere. On Windows, AutoHotkey can bind a hotkey, send Ctrl+T, select and clear the address bar, then Escape. On Linux, AutoKey is the usual analogue; under Wayland you may need something like ydotool. The Firefox new-tab focus behaviour itself is not macOS-specific.

In the previous post I described Slinky, a self-hosted start page, and mentioned that I use the New Tab Override extension so Firefox opens it on every new tab. That works, but the default behaviour is a little ugly.

Slinky: A self-hosted start page

A colorful, retro-style graphic illustration of a circular slinky coil featuring red, yellow, and teal segments on a cream background.

One of the browser conveniences that I appreciate is ready access to commonly used links, presented in a neat and categorized way. Every time I create a new tab, I just want to see those links. There are of course many browser extensions that present a page when the user opens a new tab. Mozilla has its own default ad-ridden page on Firefox. For my part, I don’t want news, weather, “trending stories,” or ads. I just want my curated links. That’s why I created Slinky.

Donald Trump’s pseudo-principles of adult behaviour

I’ll admit to being a pushover for lists of pithy advice for living. One that I return to frequently are those compiled by John Perry Barlow.

In 1977, John Perry Barlow wrote a list of twenty-five principles of adult behaviour.

Reading through these principles in the midst of the self-serving, self-enriching careless chaos that Donald Trump has wreaked on the world, I decided to write a parallel set of principles as Trump himself might do. I give you - by way of contrast - Donald Trump’s Principles of Adult Behaviour.

Updated: ARINC 424 parser & explainer

Yesterday I posted about a small utility that parses and explains ARINC 424 records. I have updated it.

For each field, the tool now cites the specific tables in the ARINC 424 specification that describe that field. The field-content explanations are also more detailed, so you can spend less time flipping between the parsed output and the printed standard. Here is an example for an Airport SID/STAR/Approach primary record:

This is still a work in progress. Not all record types are supported yet; I am filling those in as I need them.

A small utility to parse and explain ARINC 424 records

N.B. An enhanced version is now available, with specification table references and more detailed field explanations. 2026-08-03.

The ARINC 424 specification is the universally accepted standard for encoding aeronautical navigation data. Databases that follow it store that data in fixed-length, 132-character records. I created a utility that parses a single ARINC 424 record and prints the fields along with column numbers and plain-language explanations. The Python arinc424 module does the heavy lifting; I provide a wrapper around it, plus the logic that maps fields to the column numbers used in the official specification.

Violentmonkey script to block politicalwire.com troll “Reasonable”

The news site politicalwire.com is a well-regarded site that covers U.S. political news. Like other similar sites, it features a comment section; and like many comment sections on political sites, it attracts personality-disordered internet trolls. One such troll on politicalwire.com goes by the handle Reasonable. This commenter is a troll in every sense of the word, engaging users with deliberately provocative nonsense.

This user has been banned on multiple occasions and escapes both bans and blocks by repeatedly creating new Disqus accounts using the same name and avatar. Since it cannot be blocked at the account/server level, I’ve written a Violentmonkey script to expunge his comments at the level of the browser. To use the script, you will need to use the Violentmonkey (or related) extension and create a new script with the following code. It works perfectly in Firefox.

Lua script for X-Plane 12 fuel management

As a Challenger 650 captain, I fly routes between North America and Europe with some frequency. Dealing with the interconversion of imperial and metric units is a challenge; so I create a Lua script that runs in the X-Plane FlyWithLua plugin.

Once installed, the script allows you to enter the required trip fuel, current onboard fuel, fuel density and metric vs imperial units and outputs the desired fuel uplift. You can also select to take 10%, 15%, 20% extra fuel. This is a feature that I added because SimBrief seems to underestimate my fuel burn.