This is my blog. There are many like it, but this is the one that embarrasses me.

You can add the JSON or Atom feed to your feed-reader. Alternatively, subscribe to my mailing list: you'll only receive posts, and boy are they infrequent.

Paris Redux

February 19, 2024 · Snippets on Paris from two recent interests: Friedensreich Hundertwasser and Rainer Maria Rilke.

Three-Step Lifted Interfaces

December 30, 2023 · In which I confess my dependence on strongly-statically-typed programming languages, bore you to death about “abstraction” and “refactoring,” and tell you to break programs in order to fix them.

Four Translations of Todesfuge

June 10, 2023 · I dug up four English translations of Paul Celan’s Holocaust poem Todesfuge (Deathfugue) in order to understand a pair of Anselm Kiefer paintings on view at SFMOMA. Why bother with four? They demonstrate why translation’s so difficult by highlighting different aspects of the original German.

Ceci n’est pas…

March 19, 2023 · My extended reflections on an exhibit of Marcel Broodthaers’s Industrial Poems at WIELS in Brussels, in 2021. I claim Ferdinand de Saussure’s notion of ‘ideographic value’ is a linguistic-specific case of Martin Heidegger’s ‘ready-to-hand;’ treating the Industrial Poems as tools rather than language reveals more about their function.

Easier OCR on macOS

February 18, 2023 · A PDF you can highlight and search is better than a PDF you can’t. Open source command-line interfaces like OCRmyPDF let you automatically introduce PDF text layers, but they’re uncomfortable interfaces for many of the users who could use OCR day to day. Here are instructions for setting up a Shortcut (on macOS 12 or later) to OCR PDFs by right-clicking them in Finder.

Comparing Vertex Cover Algorithms

October 30, 2022 · Go simulations, on several families of graphs, comparing the algorithms discussed in “Graphs at Work.” Can you reasonably give up a k-approximation (Vazirani) for a simpler weight-naïve strategy?

Graphs at Work

September 03, 2022 · Last week at work I found a wicked graph problem at the heart of an innocuous API task. This post explains the problem, its relationship to several well-studied discrete math puzzles, and comments on the difference between computer science and software engineering.

Technical Writing for Sequin

August 27, 2022 · An index of writing I publish as part of my work on Sequin — a data integration tool for software engineers — usually on Sequin’s blog. I’ll keep this list up-to-date instead of cross-posting articles.

Managing Emails from Recruiters

July 06, 2022 · You can set up a Gmail filter that evaluates for outgoing mail. Hiding a keyword in a template response is a neat time-saver for cold outreach from recruiters.

Tech Debt and Taxes

March 14, 2022 · An argument for highlighting the customer cost, via product unreliability and feature delays, of technical debt. Getting the time to clean up old bodges is a matter of revealing the constant but oft-hidden productivity tax of leaving them in place.

Collected Memories of Evans Hall

February 13, 2022 · Evans Hall, once home to UC Berkeley’s Computer Science department and current home to several others, is slated for demolition. While that’s good news, Evans Hall is a point of contact with history, a sort of concrete collective memory.

Hearst Hall: Continued Reading

July 04, 2021 · Extended notes on Hearst Hall. This essay reviews Bernard Maybeck: Artisan, Architect, Artist by rehashing old arguments with new evidence: extended excerpts from that text, from Sally Woodbridge’s history of Wurster Hall, and zingers (“quixotic purities…”) from Lewis Mumford.

Genres and Subtraction Tests

June 13, 2021 · Discusses ‘genre’ as a generic model for informally learned categories, and a test for making them more formal by using a duck test to learn if a feature is necessary or sufficient for membership in a category.

Blogging with TikZ

May 21, 2021 · Notes on using TikZ, a LaTeX extension for defining vector graphics, to create static diagrams and interactive demos for State Machines via Jorge Luis Borges. These notes cover my motivations, my tools for generating SVGs as I wrote, and how I modified the script-generated diagrams for interactivity.

State Machines via Jorge Luis Borges

February 19, 2021 · An introduction to state machines (also called “automata”) via an extended Borgean allegory about an existence in a labyrinth, a sort of infinite gallery of mazes. It introduces several significant concepts—equivalence, finitude, acceptance, determinism, and the powerset construction—as a succession of realizations about that existence.

Making Things Worse on Purpose

February 13, 2021 · Customizing one’s browser is a neat way to cut out app “features” that squeeze value out of users by being more irritating than useful.

Hearst Hall

November 22, 2020 · Hearst Hall is a stunning example of California Arts & Crafts architecture. What does a gothic hall—built, moved, and built again by a mining baroness, burned down in 1922, and now largely forgotten—say about the spaces that replace it?

Web Syndication with JSON Feeds

November 02, 2020 · Sometime in the last ten years, while you were mourning the loss of Google Reader, we entered the golden age of the feed. A brief pitch for web syndication and an overview of the tools I’ve built for generating and working with JSON Feeds.

Processing PDFs with Cloud Functions

October 19, 2020 · A personal project of mine requires storing and processing tens of gigabytes of scraped files. I discuss using polyglot Cloud Functions as a rudimentary data pipeline: first, a function for highly parallel file uploads; second, one for PDF text extraction.

Web App Product Ontologies

August 22, 2020 · What are a product’s central concepts? I consider planning products around a product model’s “noumena.” Such an object-oriented organizing principle should mitigate corrective error and, hopefully, set you up for interpretable and reusable componentry.