Blog archives
This is all there is.
2026
-
Setting up a multi-purpose iTerm2 profile for development
A tmux configuration for developing with iTerm2 that runs a Codex session on the left, Vim at top right, and git status monitoring at bottom right. The setup is configured in an iTerm2 profile for easy access.
-
Consolidated advice for respiratory virus immunization 2026-2027
A link to the AMA’s consolidated respiratory-virus immunization reference, organized by age and risk group for influenza, COVID-19, and RSV.
-
Exporting Indigo device list to CSV
A Python script for exporting Indigo device names, IDs, folders, and descriptions to a sorted CSV reference file.
-
fancy_quoteshortcode for Hugo for fancier quotesA reusable Hugo shortcode for displaying quotations with attribution, source information, and optional highlighted passages.
-
A better user experience when a Firefox extension loads a new tab custom page
A Keyboard Maestro workaround that clears Firefox’s address bar after opening a custom new-tab page, making it ready for a search.
-
Slinky: A self-hosted start page
Introducing Slinky, a self-hosted start page for organizing frequently used links and accessing them across devices.
-
Donald Trump’s pseudo-principles of adult behaviour
A satirical counterpart to John Perry Barlow’s principles of adult behaviour, written to reflect the author’s criticism of Donald Trump.
-
Updated: ARINC 424 parser & explainer
An update to the ARINC 424 explainer adds specification table references and more detailed field descriptions.
-
A small utility to parse and explain ARINC 424 records
Introducing a Python utility that parses individual ARINC 424 navigation records and explains their fields and column positions.
-
Violentmonkey script to block politicalwire.com troll “Reasonable”
A Violentmonkey script for hiding comments from a recurring Disqus troll on Political Wire who repeatedly creates new accounts.
-
Lua script for X-Plane 12 fuel management
A FlyWithLua fuel calculator for X-Plane that estimates required uplift using trip fuel, onboard fuel, density, and metric or imperial units.
-
Keyboard Maestro macro to toggle macOS calendar visibility
Using Keyboard Maestro and AppleScript UI scripting to show or hide a selected group of macOS calendars with one shortcut.
-
A script to generate KiCad board outlines
Generating reusable KiCad board-outline footprints from specified dimensions, with optional rounded corners and mounting holes.
-
F*ck Reddit and Facebook for blocking information about protecting communities from ICE
A protest against reported Facebook and Reddit restrictions on links to ICEList, with links to the project and related coverage.
-
Indigo actions are not guaranteed to execute sequentially
Understanding Indigo’s parallel action execution and using scripts or state-based sequencing to avoid race conditions.
2025
-
GPIO initialization on the ESP32 in ESP-IDF
Why explicit GPIO configuration in ESP-IDF is preferable to setting pin direction while assuming the rest of its state.
-
Removing Stuck Filament from the Bambu AMS 2
Diagnosing and clearing a persistent Bambu AMS 2 filament jam that required partial disassembly to remove retained fragments.
-
Scripting Shelly relay devices in Indigo
Controlling a Shelly relay from Indigo Python actions and recording device measurements in Indigo variables without a dedicated plugin.
-
Some thoughts on the Charlie Kirk Assassination
Reflections on Charlie Kirk’s killing, rejecting political violence while maintaining a critical view of his public rhetoric.
-
Growing hot peppers in cooler climates - germination and early indoor care
My process for starting hot peppers in a northern climate, emphasizing early timing, consistent germination, and careful seedling management.
-
Holding back the ChatGPT emoji tsunami
A Violentmonkey workaround for filtering unwanted emoji from ChatGPT replies after preference settings failed to prevent them.
-
Removing inflammatory YouTube comments programmatically
A Violentmonkey userscript for hiding a specific user’s inflammatory comments on YouTube.
-
Creating Obsidian tables of content
Generating tables of contents directly in Obsidian Markdown notes with an external script and scheduled updates.
-
How I rid my life of social media
My reasons for leaving social media and the DNS and macOS network restrictions I used to reinforce that decision.
-
When will I get to 1,000,000 Anki reviews?
Using SQLite common table expressions and review history to estimate when my Anki collection will reach one million reviews.
-
Why I’m quitting Facebook (again)
Why Meta’s political direction and changes to fact-checking led me to leave Facebook again.
-
Registering a custom collation to query Anki database
Registering a custom SQLite collation to support text comparisons when querying an Anki collection outside the application.
2024
-
Fix your Anki streak - the script edition
A Ruby script that automates adjustments to Anki review dates for a chosen deck, with a simulation mode for previewing changes.
-
An API (sort of) for adding links to ArchiveBox
Building a small FastAPI service around a Docker-hosted ArchiveBox command-line interface to submit links and check archival jobs.
-
A Keyboard Maestro action to save bookmarks to Espial
A Keyboard Maestro workflow for saving browser pages to a self-hosted Espial bookmark manager through its API.
-
Louisiana and the Ten Commandments
A critique of Louisiana’s classroom Ten Commandments requirement and a consideration of secular principles for ethical living.
-
Improving vegetable seed germination with chemical pretreatment
An experiment using potassium nitrate, hydrogen peroxide, and controlled warmth to improve germination of difficult pepper and eggplant seeds.
-
A quick word on ATtiny 1-series interrupts
An introduction to pin interrupts on tinyAVR 1-series microcontrollers, using the ATtiny1614 and the Arduino development environment.
-
FreeRTOS stack size on ESP32 - words or bytes?
Clarifying the difference between standard FreeRTOS and ESP-IDF stack-size units when creating tasks and interpreting stack measurements.
2023
-
Our vermiculture process: A sustainable contribution
How our family uses composting worms and bokashi to process kitchen waste and enrich the soil in our vegetable garden.
-
An approach to interleaved and variable musical practice: Tools and techniques
Combining variable and interleaved practice in music study, with timer-based tools for structuring deliberate practice sessions.
-
Telling Hazel not to match locked files
Adding a shell-script condition to Hazel rules so locked files are excluded before actions fail.
-
Quickly change playlist view options on macOS
A Keyboard Maestro macro that switches Music playlists to a compact Songs view with composer information.
-
Obsidian file creation date debacle and a solution
Restoring Obsidian note creation dates on macOS from front-matter metadata or timestamps embedded in filenames.
-
Changing the file creation date on macOS
Preserving macOS file creation dates when sed rewrites Obsidian notes, using GetFileInfo and SetFile around the edit.
-
Flatten airports in X-Plane
Flattening troublesome airport terrain in X-Plane’s apt.dat file and reapplying the change programmatically after updates.
-
Hazel deletes custom file icons, and a workaround
Preventing Hazel from deleting custom Finder icons by recognizing their metadata in a shell-script condition.
2022
-
AwesomeTTS Anki add-on: Use Amazon Polly
Modifying AwesomeTTS to call Amazon Polly through the AWS CLI using an existing AWS account.
-
Using fswatch to dynamically update Obsidian documents
A proof-of-concept filesystem watcher that updates modification-date metadata in Obsidian notes outside the application.
-
Week functions in Dataview plugin for Obsidian
Using Dataview’s start-of-week and end-of-week date functions to link to weekly notes in Obsidian.
-
Scraping Forvo pronunciations
A Python scraper for downloading Forvo pronunciations when the API is unreliable, with ranking based on preferred speakers and votes.
-
A regex to remove Anki’s cloze markup
Regular expressions for stripping standard Anki cloze markup and Cloze Anything markup while retaining the underlying text.
-
Anki: Insert the most recent image
A Keyboard Maestro and AnkiConnect workflow for inserting the most recently prepared image into an Anki note.
-
Altering Anki’s revlog table, or how to recover your streak
Editing timestamps in Anki’s review log to move a review to another day and repair a broken review streak.
-
A deep dive into my Anki language learning: Part III (Sentences)
How I use sentence cards in Anki, including cloze deletions generated from vocabulary notes and audio that reinforces context.
-
A deep dive into my Anki language learning: Part II (Vocabulary)
A detailed tour of my Russian vocabulary decks, including note fields, card types, tagging, and adaptations for verbs.
-
A deep dive into my Anki language learning: Part I (Overview and philosophy)
The first part of an overview of my Anki language-learning system, covering its guiding principles and deck organization.
-
A tool for scraping definitions of Russian words from Wikitionary
A custom Beautiful Soup scraper for extracting English definitions of Russian words from Wiktionary, including multiple-etymology cases.
-
Getting plaintext into Anki fields on macOS: An update
An updated Keyboard Maestro workflow that uses macOS textutil to strip clipboard formatting before pasting into Anki.
-
Extracting title title of a web page from the command line
Extracting a web page’s title with command-line tools and the pup HTML parser instead of relying on an external title service.
-
Hugo static site upload woes and a way forward
Making the Hugo → S3 upload process much more efficient by tracking file hashes.
-
Interlinear glossing dealing with punctuation
Dealing with PUNCT nodes in interlinear glossing.
-
Three-line (though non-standard) interlinear glossing
A CSS-based experiment in displaying words, lemmas, and parts of speech as three-line interlinear text for a language-learning project.
-
Experimenting with leipzig.js for interlinear gloss
leipzig.js is a library for applying interlinear gloss to texts for linguistic analysis. In this post, I experiment a little with this libary to evaluate whether it would work for a little project of mine.
-
Hedghog and interlinear lemmas
Starting a new devlog about Hedghog, a new language learning app and some thoughts about the interlinear display of lemmas.
-
Splitting text into sentences: Russian edition
Splitting text into sentences is one of those tasks that looks simple but on closer inspection is more difficult than you think. A common approach is to use regular expressions to divide up the text on punction marks. …
-
What’s up with Pinboard? And an alternative
More outages at Pinboard. It was time to find an open-source self-hosted alternative. Espial, it turns out, works great.
-
My favourite Cyrillic font
A brief appreciation of Georgia as a readable Cyrillic typeface for a non-native Russian reader.
-
The cancellation of Russian music
Reflections on free expression, Russia’s war in Ukraine, and the case against excluding artists solely because they are Russian.
-
Bash variable scope and pipelines
Why variables changed inside a Bash pipeline may remain unchanged outside it, and how the lastpipe option alters that behaviour.
-
Automating the handling of bank and financial statements
A Hazel workflow that extracts text from financial-statement PDFs, renames them consistently, and imports them into DEVONthink with tags.
-
Bulk rename tags in DEVONthink 3
Recursively renaming DEVONthink tags with AppleScript to simplify a hierarchical tagging system and change its separators.
-
Stripping Russian syllabic stress marks in Python
Removing Russian stress marks in Python with byte replacements or regular expressions, including handling accented Latin lookalikes.
-
Accessing Anki collection models from Python
Accessing Anki note-type models from standalone Python scripts, with notes on version compatibility and non-Latin names.
2021
-
Converting Cyrillic UTF-8 text encoded as Latin-1
Diagnosing and repairing garbled Cyrillic filenames from Forvo by inspecting character codes and correcting their encoding.
-
accentchar: a command-line utility to apply Russian stress marks
A small command-line tool for placing a Russian stress mark at a specified character position, with argument and pipeline input.
-
sterilize-ng: a command-line URL sterilizer
Introducing sterilize-ng, a composable command-line tool for stripping tracking information from URLs.
-
Using Perl in Keyboard Maestro macros
Using Perl inside a Keyboard Maestro macro to turn copied Wiktionary text into Markdown for Anki cards.
-
Stripping Russian stress marks from text from the command line
Removing Russian syllabic stress marks on the command line with Perl or sd.
-
Splitting a string on the command line - the search for the one-liner
Converting comma-separated vocabulary lists into Markdown bullets with command-line text-processing tools.
-
A Keyboard Maestro macro to edit Anki sound file
A Keyboard Maestro macro that locates an Anki sound file from its field markup and opens it in Audacity for editing.
-
Querying the Anki database when the application is running
A read-only workaround for querying a locked Anki database by making a temporary copy when the application is open.
-
Normalizing spelling in Russian words containing the letter ё
Querying Russian Wiktionary headwords to restore ё where ordinary text uses е instead.
-
Scraping Russian word definitions from Wikitionary: utility for Anki
Using Python’s WiktionaryParser to extract and clean English definitions of Russian words for Anki cards.
-
Encoding of the Cyrillic letter й - a UTF-8 gotcha
Investigating failed Russian word lookups caused by different Unicode representations of й and correcting the input before querying SQLite.
-
Dynamic DNS - auto-updating from macOS
Setting up dynv6 and ddclient on macOS to keep a dynamic DNS record aligned with a home connection’s public IP address.
-
No sir, I do not want Big Sur
Documenting my attempt to prevent an unwanted macOS Big Sur upgrade from disrupting an established automation environment.
-
Dynamically loading Javascript in Anki card templates
Dynamically loading multiple JavaScript resources in Anki card templates so custom functionality is available when needed.
-
Fixing CodeRunner jQuery injection
Working around broken jQuery injection in CodeRunner by pointing its custom run script to a local jQuery file.
-
Extending the Anki Cloze Anything script for language learners
Adapting Anki Cloze Anything for language-learning notes so example sentences display cleanly and remain compatible with AwesomeTTS.
-
Complete fix for broken Knowclip .apkg files
A complete script that repairs Knowclip-generated Anki packages using the package’s creation time to assign note and card dates.
-
Fixing Knowclip .apkg files: one more thing
Extending the Knowclip date-correction script to repair card identifiers as well as note identifiers.
-
Fixing Knowclip Anki apkg creation dates
An initial script for correcting creation dates in Knowclip-generated Anki packages by updating their SQLite data.
-
Generating HTML from Markdown in Anki fields
Converting Markdown in Anki fields to HTML with Python and Keyboard Maestro to reduce dependence on formatting add-ons.
-
Pre-processing Russian text for the AwesomeTTS add-on in Anki
Using AwesomeTTS preprocessing rules to address Russian pronunciation problems associated with stress marks and the letter ё in Azure voices.
-
Factor analysis of failed language cards in Anki
An exploratory analysis of lapses in my Russian Anki collection, examining card direction, parts of speech, and noun gender.
-
Refactoring Anki language cards
Diagnosing and improving difficult Anki vocabulary cards through better context, clearer prompts, and more varied exposure to the language.
-
Parsing Russian Wiktionary content using XPath
Extracting stress-marked Russian headwords and definitions from Wiktionary with Python, lxml, XPath, and Beautiful Soup.
-
Being grateful for those who push our buttons
A reflection on Jetsunma Tenzin Palmo’s observation that difficult interactions can reveal sensitivities we otherwise fail to notice.
-
Directly setting an Anki card’s interval in the sqlite3 database
Directly adjusting selected Anki card intervals with SQLite for familiar vocabulary newly added to a collection.
-
Where the power lies in 2021
Trump’s removal from social platforms prompts reflection on the power private networks exercise over public communication.
-
More on integrating Hazel and DEVONthink
Using Hazel to extract dates from bank-statement PDFs, rename the files, and import them into DEVONthink with tags.
2020
-
Undoing the Anki new card custom study limit
Finding and resetting the Anki database value responsible for an accidentally enlarged custom-study new-card allowance.
-
Copy Zettel as link in DEVONthink
Copying a Zettelkasten note’s identifier as a ready-to-use link with AppleScript and Keyboard Maestro in DEVONthink.
-
Cleaning up Zettelkasten WikiLinks in DEVONthink Pro
An AppleScript workflow for simplifying WikiLinks between timestamped Zettelkasten notes in DEVONthink.
-
Regex to match a cloze
A regular expression and Python example for removing Anki cloze markup while preserving the enclosed text.
-
Removing stress marks from Russian text
Using regular expressions to remove syllabic stress marks from Russian text.
-
“Delete any app that makes money off your attention.”
Reflections on treating a smartphone as a tool and removing apps whose business depends on capturing attention.
-
URL-encoding URLs in AppleScript
Encoding Cyrillic URLs in AppleScript so Safari can open Russian dictionary pages without rejecting the address.
-
Consume media outside one’s bubble?
Questioning advice to read across political divides when doing so treats unreliable reporting as equivalent to factual journalism.
-
Свидетельство того или тому?
Exploring when the Russian noun свидетельство takes a genitive or dative complement, with examples and guidance from Rozental.
-
Escaping “Anki hell” by direct manipulation of the Anki sqlite3 database
An explanation of Anki’s ease-hell problem and a direct SQLite approach to resetting low card ease factors.
-
Typing Russian stress marks on macOS
Installing a custom Russian phonetic keyboard layout on macOS to make syllabic stress marks easier to type.
-
Stripping surveillance parameters from Facebook and Google links
A proof-of-concept script for removing tracking parameters from Google and Facebook links, integrated into Keyboard Maestro.
-
Predictions 2021
A set of probability estimates about the pandemic, politics, and personal goals, intended to test and improve my forecasting judgment.
-
Extracting ID3 tags from the command line - two methods
Command-line methods for extracting an MP3’s ID3 title using ffprobe or id3info with text-processing tools.
-
Using variables in Keyboard Maestro scripts
Accessing Keyboard Maestro variables from Perl through the environment rather than treating them as ordinary Perl variables.
-
Hugo cache busting
A Hugo deployment workflow that uses Git content hashes in CSS filenames so browsers reload changed stylesheets.
-
iOS shortcut to clear Safari
An iOS Shortcut that opens Safari’s history and website-data clearing setting to make routine privacy maintenance easier.
-
My macOS and iOS security setup - Update 2020
The macOS and iOS browsing practices I adopted to reduce cross-site tracking and limit the collection of personal behavioural data.
-
A macOS text service for morphological analysis and in situ marking of Russian syllabic stress
A Keyboard Maestro workflow that uses UDAR to add Russian stress marks to selected text in place.
-
Solzhenitsyn on the folly of looking for good/evil dichotomies
A passage from Solzhenitsyn on good and evil within every human heart, accompanied by my English translation.
-
On not minding what happens
Reflections on Krishnamurti’s distinction between caring about the future and clinging to how it must unfold.
-
We’re all imposters
Oliver Burkeman’s reflections on imposter syndrome prompt thoughts about amateur creativity, expertise, and accepting uncertainty.
-
The Buddha was a list-maker
Reflections on David Snyder’s book of Buddhist lists, with particular attention to the Brahmaviharas and their near and far enemies.
-
Beginning to experiement with Stanza for natural language processing
Early experiments with Stanza for Russian part-of-speech tagging, morphological analysis, and named-entity recognition.
-
Automated marking of Russian syllabic stress
Installing and using UDAR to add syllabic stress marks to Russian text through grammatical analysis.
-
sed matching whitespace on macOS
Why common whitespace escapes fail in macOS sed, and how POSIX character classes provide working alternatives.
-
Partitioning a large directory into subdirectories by size
A macOS shell script for dividing a large directory into size-limited subdirectories for optical-disc archiving.
-
More chorus repetition macros for Audacity
Audacity macros for creating slower sentence repetitions so language learners can build toward native-speed pronunciation.
-
Audacity macros to support chorus repetition practice
Audacity macros that prepare sentence recordings for chorus repetition by trimming silence, compressing audio, and creating repeated clips.
-
Scripting Apple Music on macOS for chorus repetition practice
An updated AppleScript for using the macOS Music app to support chorus repetition in foreign-language pronunciation practice.
-
Wednesday, June 24, 2020
EU to ban Americans over coronavirus / John McCain’s 2008 campaign manager with a brutal commentary on Trump.
-
A meritocracy reading list
A reading list and preliminary reflections on meritocracy, individual competence, and the concentration of economic rewards.
-
A folder-based image gallery for Hugo
Adapting a Hugo folder-gallery shortcode for macOS to display images from a directory using Fancybox.
-
An alternative method for keyboard input switching on macOS
Switching macOS keyboard layouts with InputSourceSelector, AppleScript, and Quicksilver when the built-in Caps Lock method fails in Anki.
-
Semelfactive Verbs
Semelfactive verbs, a special class of perfectives. (Applies to Russian, but also to English grammar, too.)
2019
-
Stripping diacriticals from Russian text
A method for stripping diacritical markings from Russian text.
-
Getting plain text into Anki: a saga
In Anki 2.1, it’s practically impossible to get plain text from the web into note fields. A solution (on macOS, at least)…
-
The Dalai Lama on cultivating altruism
“Being too self-centred can give rise to anxiety and depression. An effective antidote is to cultivate a sense of altruism, taking the whole of humanity into account.” - The Dalai Lama
-
Wealth of thirty-fives
Share of wealth held by 35 year-olds of different generations has declined strikingly.
-
He doesn’t speak to any of these people
He tells them every single day not to trust anyone, not to believe in the healing power of love and redemption and peace.
-
Saturday, November 23, 2019
Zen and believing // ‘She didn’t hang my picture.’
-
Monthly report 2019-11-30
Still working to boot and reboot a bunch of habits; but it was a productive month.
-
L-R method for language learning
An introduction to the listening-reading method of language learning, with practical notes on preparing parallel texts and matching audio.
-
Saturday, November 16, 2019
Political candidates - minimum requirements
-
The following wind of privilege
When the following wind of privilege is misread as merit, then the inequalities that result are legitimized.
-
Recent favourites
Books and podcasts that I’ve been cogitating about.
-
The misinterpreted-effort hypothesis
A study of blocked and interleaved practice prompts reflection on why learners may mistake greater effort for lower effectiveness.
-
Saturday, November 9, 2019
Reflections on reports that Trump might attend Moscow’s Victory Day parade and the holiday’s cultural significance in Russia.
-
Friday, November 8, 2019
Politicians are basically well trained dogs. // Patience and anger
-
The Wisdom of crowds. The Madness of crowds
A brief challenge to the assumption that crowds reliably produce wisdom rather than collective folly.
-
Thursday, October 31, 2019
Just this week, Facebook conferred trusted status on Breitbart, the Nazi lie-peddling rag. Facebook gladly accepts ad revenue from politicians like Trump and friends who purposely lie to pander to ignoramuses in their …
-
Monthly report 2019-10-31
An October 2019 report on rebuilding habits in Russian study, exercise, reading, music practice, and social media use.
-
Force Chrome to reload CSS and JavaScript
Keystrokes for forcing Chrome to reload CSS and JavaScript
-
Sorry Jordan Peterson
I really tried. Sorry, Jordan Peterson, it’s not me, it’s you.
-
What is the First Principle
What is the First Principle? I don’t know.
-
Rules of Self-Governance
Reflections on David Cain’s case for personal rules and how deliberate limits can protect attention and support meaningful work.
-
The Four Brahmaviharas as meditation objects
An interview about the Four Brahmaviharas as meditation objects.
-
A Simple Styling Shortcode for Hugo
A Hugo shortcode used to style inline text in a post. I use it here to style Russian text in my posts.
-
Trust in Mind
An introduction to Sengcan’s Zen poem Trust in Mind, with a passage on relinquishing preferences and opposition.
-
Russian TK Constructions
A pervasive, but unusual feature of Russian grammar.
2018
-
Creating year and month groups in DEVONthink Pro Office using AppleScript
An AppleScript to create year and month groups in DEVONthink
-
Duncan’s Law
A proposed rule of thumb: extravagant claims of personal superiority often invite skepticism about the quality being claimed.
-
Friday, November 9, 2018
A short satirical response to reports that Interior Secretary Ryan Zinke was considering a role at Fox News.
-
Tuesday, November 6, 2018. U.S. Election Day
An Election Day reflection on Trump, Sean Hannity, and the cost of prioritizing political victory over civic norms.
-
Saturday, October 13, 2018
A brief comment on Melania Trump’s explanation of her jacket message and her remarks about being bullied.
-
Monday, October 9, 2018
Kurt Vonnegut’s appeal for kindness, followed by a critique of statistical comparisons in commentary on false sexual-assault allegations.
-
Scripting thumbnail image file creation on macOS
A Python script that uses macOS sips to generate four sizes of image thumbnails for a web gallery.
-
Sunday, October 7, 2018
A brief link commenting on Republicans’ behaviour after a political victory.
-
Friday, October 5, 2018
Reflections on Christopher Browning’s analysis of democratic decline, Republican polarization, and the Kavanaugh confirmation debate.
-
Thursday, October 4, 2018
Reflections on Adam Serwer’s essay about cruelty as a source of solidarity among Trump’s supporters.
-
Searching the Russian National Corpus
A method of searching the official Russian language National Corpus using Python and SQLite.
-
Monday, September 17, 2018
A brief response to reporting on Donald Trump’s attitude toward debt and Republican fiscal responsibility.
-
Sunday, September 16, 2018
Notes on regex testing, repairing a Wiktionary audio-download pattern, and claims about Gina Loudon’s academic credentials.
-
Saturday, September 15, 2018
An observation that Fox News rejected Tor Browser requests while the New York Times remained accessible.
-
Thursday, September 13, 2018
Notes on Trump’s response to weather disasters and an article examining the effects of harsh verbal discipline on children.
-
How fascism works
An exploration of how appeals to purity and tradition can distract supporters from political corruption, drawing on Peter Beinart’s analysis.
-
Managing classical music collections in iTunes in 2018
My approach to wrestling with iTunes to make it (barely) usable for classical music collections.
-
Using lynx to bypass ad block detection
Using the Lynx command-line browser on macOS to read text without the clutter and ad-block detection encountered in graphical browsers.
-
Quarantining extremist ideas
Reflections on strategic silence as a way for the media to avoid granting legitimacy to extremist ideas.
-
Remind me, how do you say “WTF?” in German?
A brief, satirical reaction to Donald Trump’s conduct at a gathering of world leaders.
-
A letter to Jerry Brown
A letter urging California Governor Jerry Brown to authorize further DNA testing in Kevin Cooper’s case.
-
ESP32, DS18B20, TM1637 integration: Displaying temperature data
Combining an ESP32, a DS18B20 temperature sensor, and TM1637 LED displays to show temperature measurements.
-
Interfacing an ESP32 to an MCP23017 GPIO expander
Connecting an MCP23017 GPIO expander to an ESP32 over I2C with a reusable component for configuration, reads, and writes.
-
Using TM1637-based LED displays with ESP32
Extending an ESP32 component for TM1637 LED displays to show positive and negative floating-point values with appropriate rounding.
-
What was the purpose of that tweet?
A reflection on Mueller’s reported questions about Trump’s tweet warning James Comey about possible recordings.
-
Serving sensor data via ESP32
Serving Si7021 temperature and humidity readings from an ESP32 web server, with URL-based control of an LED.
-
ESP32 reading Si7102 temperature and humidity data via I2C bus
Developing a reusable ESP-IDF component to read Si7021 temperature and humidity measurements over the ESP32’s I2C bus.
-
How to disable links opening in a new tab
Using a Chrome extension to choose whether links that request a new tab open in the current tab instead.
-
Setting up Arduino IDE with Heltec ESP32 module for macOS
Setting up the Arduino IDE on macOS for a Heltec WiFi Kit 32, including workarounds for installation and SSL errors.
-
New Yorker: Michael Cohen and the end stage of the Trump presidency
A recommendation of Adam Davidson’s New Yorker essay on Michael Cohen and the vulnerabilities of Trump’s business operation.
-
NYT: Tethered to a buffoon
A brief response to a New York Times essay on Trump’s authoritarian tactics and the weakening of democratic institutions.
-
Stalin, Trump, and the cult of personality
Reflections on the cult of personality surrounding Trump, drawing comparisons with the adoration cultivated around Stalin.
-
Not always what it seems
A Soviet propaganda image and its translated message thanking Stalin for a happy childhood.
-
A software debouncing class for rotary encoders
A pointer to a rotary-encoder software class shared on the Teensy forum, with configurable upper and lower limits.
-
Implementing a simple menu interface on OLED display
Building a small OLED menu interface with a Teensy, rotary encoder, and pushbutton, including hardware and software debouncing.
-
Carl Sagan’s tools for detecting baloney
Carl Sagan’s tools for critical thinking offer a framework for questioning political claims and appeals to authority.
-
Resetting the Syncthing index
Using Syncthing’s REST API to reset an index when synchronization becomes stuck.
-
Displaying Cyrillic fonts on a 128x64 OLED display
Displaying Russian text on a small SSD1306 OLED using the u8g2 library’s font support.
-
Programming the Raspberry Pi in ARM assembly language
A brief recommendation of a textbook on programming the Raspberry Pi in ARM assembly language.
-
Reading data from Si7021 temperature and humidity sensor using Raspberry Pi
Reading temperature and humidity from a Si7021 sensor over I2C with a Raspberry Pi, including register access and measurement commands.
-
RF communication between Arduino Nanos using nRF24L01
A guide to wireless communication between two Arduino Nano boards using nRF24L01+ modules, covering device operation, wiring, and example code.
-
Using the Raspberry Pi to communicate over the I2C bus using C
Using C and the bcm2835 library to communicate with a TSL2561 light sensor over the Raspberry Pi’s I2C bus.
-
Implementing ADC using Raspberry Pi and MCP3008
Reading analog signals on a Raspberry Pi with an MCP3008 ADC over SPI, using C and the bcm2835 library.
-
2018: Experiment No. 1
Results from a month without news, reflecting on anger, attention, and the gap between concern and influence.
-
Automate iTunes for chorus repetitions of L2 pronunciation practice
Using AppleScript to automate chorus repetition practice
-
Awesome principles for L2 language learning
Resources for second language acquisition
2017
-
2018: A year of experiments
A year of monthly experiments in habits, language learning, exercise, and reduced technology use as an alternative to New Year’s resolutions.
-
Peering into Anki using R
Using R to query Anki’s SQLite database, count notes by model type, and plot monthly review time.
-
Language word frequencies
A brief look at word-frequency statistics and their relevance to prioritizing vocabulary in language learning.
-
Anki database adventures: Counting notes by model type
Accessing Anki’s note-type models with Python and counting notes associated with a particular model.
-
Accessing the Anki database with Python: Working with a specific deck
Finding an Anki deck’s ID by name and using it to restrict Python database queries to that deck.
-
Working with the Anki database on mac OS using Python
Opening and querying an Anki collection from an external Python script on macOS by linking to a downloaded Anki codebase.
-
Process automation in building Anki vocabulary cards
Automating Russian vocabulary card preparation with Python and AppleScript, including dictionary lookups and pronunciation downloads from Wiktionary.
-
More Javascript with Anki
Using JavaScript in Anki templates to add gender-appropriate articles to French nouns, including vowel and aspirated-h cases.
-
Rebecca Solnit: The Loneliness of Donald Trump
A brief recommendation of Rebecca Solnit’s essay on Donald Trump, privilege, and isolation.
-
An approach to dealing with spurious sensor data in Indigo
Filtering spurious Indigo sensor readings with validity checks and time averaging to prevent false home automation triggers.
-
Follow the intent.
Interpreting Trump’s dismissal of James Comey through the author’s view of Trump’s persistent personal self-interest.
-
They’re just paid protesters
A critique of claims that protesters are paid, examining the inconsistent treatment of money and legitimacy in politics.
-
@realDonaldTrump Russian Twitter bot
A satirical proposal for a Twitter bot that translates Donald Trump’s tweets into Russian.
-
marking time
A poem about screen-bound passivity, political spectacle, and the uneasy unreality of the Trump era.
-
13 Random thoughts about Canada after living here for a year.
Observations on everyday life, culture, healthcare, and politics after moving from Minnesota to Canada.
-
Serious audio processing on the command line
Automatically improving pronunciation recordings for Anki with Hazel, ffmpeg, and SoX for audio conversion and dynamic-range processing.
-
Foreign language education in the U.S.: a neglected cure for xenophobia
An argument for stronger foreign-language education in the United States as a way to broaden cultural understanding and counter xenophobia.
-
Trump and the arts
A response to Trump’s proposed elimination of federal arts and humanities endowments, drawing on Edna St. Vincent Millay’s poetry.
-
Using macOS NSSpeechSynthesizer to generate audio content for Anki cards
A macOS application that generates spoken Russian numbers for Anki using NSSpeechSynthesizer and converts the recordings with ffmpeg.
-
My month without news
What I learned from a month without routine news consumption and with strict limits on social media.
-
Using rrdtool to chart Indigo data
Using Python and rrdtool to store and graph temperature and humidity measurements from Indigo home automation sensors.
-
The right way to resist Trump
Lessons from opposition to Silvio Berlusconi suggest resisting Trump through issues and principles rather than personality.
-
Helping the helpers
A brief appeal to support the ACLU, Planned Parenthood, and the Southern Poverty Law Center after the 2016 election.
-
Don’t feed the troll
An argument for directing opposition toward Trump’s policies rather than rewarding his provocations with attention.
-
AppleScript and iTerm2
Automating iTerm2 with AppleScript to connect to a remote server and periodically attach to and detach from screen sessions.
-
Law and order
A visual response to the Trump administration’s declaration that it would be a law-and-order administration.
-
NYT: Women who voted for Trump
A critical response to New York Times interviews with women explaining why they voted for Donald Trump.
-
Trumpku No. 1
A short satirical haiku portrait of Donald Trump, accompanied by an illustration.
2016
-
Scripting Indigo with Python
Running Python scripts through the Indigo Plugin Host to control Indigo from outside the application.
-
President Trump insisted…
A political cartoon from Truthdig responding to Donald Trump’s election as president.
-
Going “low information”
After the 2016 election, an experiment in limiting news and social media to information that supports meaningful action.
-
Extracting mp3 file from web page with Python and ApplesScript
Using Python and AppleScript to download and rename Russian pronunciation audio from Open Russian for Anki vocabulary cards.
-
How to tell if you’re being pandered to
Recognizing political pandering through fear, scapegoating, unsupported claims, and appeals designed to bypass critical judgment.
-
Well that has a familiar ring to it
A critique of the familiar response to American mass shootings and the failure to address their interacting causes.
-
EC: An Environment Canada data plugin for Indigo
Introducing an Indigo plugin that creates virtual weather stations from Environment Canada data for use in home automation rules.
-
Using Python and AppleScript to get notified if a site is down
A scheduled Python and AppleScript workflow that checks websites and sends Messages notifications when a site has problems.
-
Dynamic UI lists in Indigo 6
Building dependent dynamic lists in an Indigo plugin, using province selection to filter Environment Canada weather stations.
-
Import and tag with Hazel and DEVONthink Pro Office
A Hazel and AppleScript workflow that imports downloaded audio into DEVONthink, applies tags, and removes the original files.
-
Using AppleScript with MailTags
Using the MailTagsHelper AppleScript dictionary to move tagged or project-assigned messages from an inbox into a reference folder.
-
Using AdBlock Plus to block YouTube comments
Hiding YouTube comments with a custom AdBlock Plus filter that blocks the comments section of video pages.
-
Introducing AnkiStats & AnkiStatsServer
Introducing AnkiStats and AnkiStatsServer, companion projects for extracting Anki performance data for further analysis.
-
Waking the computer to allow AppleScript to run
Using pmset and scheduled cron jobs to wake a Mac for AppleScripts that depend on the user interface.
-
An easier way to automate synchronization of Anki profiles with AppleScript
Using AppleScript and System Events to select and synchronize an Anki profile as an alternative to an Automator recording.
-
Scheduling synchronization of Anki databases on OS X
An Automator and LaunchControl workflow for scheduling Anki synchronization on OS X, with the limitations of recorded UI actions.
-
Resizing of images for Anki with Hazel and ImageMagick
Automatically resizing images for Anki with Hazel and ImageMagick to reduce media size and improve synchronization efficiency.
-
Writing Hexo filters
A legacy Hexo filter that replaces specially marked text with styled spans, developed to distinguish Cyrillic passages.
-
Fine-tuning caching for S3-hosted static blogs using AWS CLI
Using the AWS CLI, Python, and Grunt to apply different caching policies to images and HTML in an S3-hosted blog.
-
Modern textbook design: an architecture for distraction
A critique and redesign of a mathematics textbook page, showing how typography and unnecessary graphics can distract from learning.
-
Trump, the conspiracy theorist
A critique of Donald Trump’s embrace of conspiracy theories and its implications for evidence-based decision making.
-
The spread of anger in social networks and its implications for political violence
Reflections on research into the spread of anger through Weibo and its implications for political rhetoric and social networks.
-
anki_tool: low level manipulation of Anki databases
A brief introduction to an Anki command-line utility for searching, moving, and renaming database content.
-
JavaScript in Anki cards
Using JavaScript in Anki card templates to hide formatting when example sentences are absent, with a note on built-in conditional replacement.
-
Organizing knowledge for memorization
Selected principles for organizing information for memorization, including understanding first, keeping items simple, and using imagery.
-
Observation: Facebook groups don’t work
Why Facebook groups make sustained discussion difficult, from shallow comment threading to poorly organized and disappearing content.
-
Detecting Russian letters with regex
Regular-expression patterns for matching Russian letters, including explicit handling of Ё and ё.
-
Scalia and the secret society
A satirical response to reports connecting Antonin Scalia’s final hunting trip with the International Order of St. Hubertus.
-
Mak-kimchi 막김치
Lessons from making mak-kimchi, including cabbage preparation, salting, seasoning, and fermentation.
-
Automate hexo blogging tasks with Grunt
Automating Hexo blog generation and deployment to Amazon S3 with Grunt, including sitemap and robots.txt tasks.
-
Kimchi and hypertension
A brief note on a study of Korean adults that found no association between kimchi consumption and hypertension prevalence.
-
Privacy vs. security: Just this once.
A critique of the claim that compelling Apple to bypass iPhone security could remain a one-time exception.
-
On the lack of association between taxes, GDP and happiness
Questioning Trump’s claims about American taxation and examining the relationship between tax revenue, economic output, and happiness.
-
Trump meets computational linguistics
Using a Python Markov-chain text generator to recombine Donald Trump’s speeches into satirical variations.
-
Stop Facebook tracking
The browser tools and privacy settings I used to limit Facebook tracking and other forms of online behavioural advertising.
-
Leaving something and taking something away.
A Robert Fulghum passage about the memories we leave with others prompts a pointed reflection on Donald Trump’s legacy.
-
The anti-polarizing effect of keeping one’s identity small.
Paul Graham’s advice to keep one’s identity small offers a way to approach political and religious disagreements with greater openness.
-
Properly understanding ISIS
Reflections on an Atlantic essay about ISIS, its religious ideology, and the contradictions of its opposition to modernity.
2015
-
A new hexo deployer for Amazon web services
Introducing a legacy Hexo deployer that uses Transmit to upload a generated blog to an Amazon S3 bucket.
-
Scope of attention and consumption
A reflection on how scattered attention and material consumption can reinforce one another, and how owning less may interrupt that cycle.
-
Collapsing DEVONthink groups via AppleScript
A recursive AppleScript for moving records out of nested DEVONthink groups into a single reference group.
-
A minimalist mind
Practical rules for reducing information overload, avoiding online distractions, and directing attention toward meaningful pursuits.
-
Working with DEVONthink Pro Office and Hazel
Using Hazel and AppleScript to automate DEVONthink workflows, including clearing the global inbox and archiving files.
-
Why is the U.S. obsessed with home ownership?
A personal examination of the American preference for home ownership, its financial assumptions, and the appeal of renting.
-
The Art of Just Enough
Abandoning an elaborate house-building project led our family to reconsider possessions, consumption, and how little is enough.
-
Finding things with DEVONthink
How I organize and retrieve information in DEVONthink using databases, hierarchical tags, and project smart groups.
-
First experience with astrophotography
Lessons from photographing Kilauea and the night sky with a Sony A7, including equipment, exposure choices, and image noise.
-
Concatenating mp4 video files
Joining separate MP4 recordings into a single video with ffmpeg and a text file listing the source clips.
-
Dandelions and innocence
A child’s delight in dandelions prompts a reflection on beauty, conformity, and the impulse to eradicate weeds.
-
Nietzsche and the sublime purposeless of music
A reflection on Nietzsche, play, and the value of making music for its own sake, independent of practical rewards.
-
Middle class economics and false dichotomies
Reflections on middle-class economic insecurity, stagnant wages, and the role of rising expectations for material comfort.
-
Private virtues v. public life
A case for clarifying and living by personal virtues when electoral politics cannot adequately represent individual values.
-
Synchronizing DEVONthink databases across machines
Synchronizing DEVONthink databases between Macs using local sync stores transferred through BitTorrent Sync.
-
Commerce and discrimination
Reflections on Indiana’s religious freedom controversy and the principle that businesses should serve customers without discrimination.
-
Spotlight-searchable pinboard bookmarks
A legacy Python workflow for downloading Pinboard bookmarks as tagged local files so they can be found through Spotlight.
2013
-
What motivates climate change deniers?
An exploration of climate change denial through research on free-market beliefs, conspiracy theories, and distrust of scientific consensus.
-
Markdown anchors
Using named HTML anchors and Markdown links to navigate within longer documents, including a variation for GitHub wikis.
-
ADC for Raspberry Pi
Adding analog inputs to a Raspberry Pi with an ATtiny861 microcontroller acting as an ADC over I2C, with AVR firmware and Python integration.