Recorded another Tom Lehrer song over my lunch break
Sharing one of my favorite music projects: a gorgeous, free - as in freedom - recording of J.S. Bach’s Goldberg Variations
I wired this blog up to Open AI’s text-to-speech API so you can listen to individual posts or subscribe to the blog as a podcast.
Sharing a quick video I made of Tom Lehrer’s very funny song “A Christmas Carol”
Sharing Kent Beck’s excellent article describing how we can find modes of working which can help manage complexity as it scales
A rule of thumb for thinking about scaling client application state
Writing an interpreter for a custom bytecode opens the door for rendering interactive custom Winamp skins in the browser
This incredible 2016 video presents a dystopian, visually opulent, and depressingly believable augmented reality future.
Webamp.org has a feature that lets it pose as if it were in action
A very silly code golf solution I came up with that I’m still amused by ten years later
Sharing this classic brilliant, hilarious and prophetic talk about the crazy language that is JavaScript
A technical breakdown of the Winamp Skin Museum’s over-engineered upload flow, and how it helped create a positive feedback loop
A vision for using GraphQL on the client for local-first apps, apps using e2e encryption, and other apps with heavy client state
My response to a Reddit user’s question about the value of the Relay Connection Spec
An internal Meta decorator name which taught me something important about API naming
How implementing an ESLint rule led to changes in how people write JavaScript
Reflections on my journey from a classical music background to a career in big tech
Youtube videos of a choral group I used to sing with
Youtube video of the talk I gave at GraphQL Conf 2024 covering advanced client error handling and its implications for potentially fundamentally solving the problem of pervasive nullability in GraphQL
A video from earlier this year of my wife Chelsea Hollow and myself singing the soprano and bass solos in Mozart’s Requiem
I caught up with Jerod and Adam about nostalgia, music, file sharing, Napster and the weird stuff I found in corrupt Winamp skins
Explaining how exactly the UI = f(state) model tames code complexity
This clip from Malcolm in the Middle perfectly encapsulates the experience of trying to get anything done with software
Sharing this repository which teaches data structures through charmingly commented JavaScript implementations
Sharing Bob Nystrom’s excellent blog post explaining the Pratt Parser algorithm which offers a very clean way to model operator precedence
One of the most fascinating pieces of software art/trolling/humor I’ve ever seen
Why I chose to use Notion as the backing CMS for the Notes portion of this site, and the technical details of how it’s implemented
Shhhh. Don't tell anyone, but the Winamp Skin Museum has a secret debug mode.
The Winamp Skin Museum is powered by an sqlite3 database containing 1.2gb of metadata about 86,000 Winamp skins and exposed as a public GraphQL endpoint
I started looking through corrupt Winamp skins and it lead me down some very strange rabbit holes
I wrote a simple lint rule which detected hundreds of user facing bugs at Meta and inspired my colleague to ship a similar validation to every major JS parser
I found some interesting information about Next.js’ elusive unstable_cache API
Bringing Implementation-First GraphQL to TypeScript via a novel static analysis approach.
Defining a meaningful distinction within code-first GraphQL server libraries.
I contributed a rule to ESLint that catches a surprisingly wide variety of logic bugs.
Defaulting to empty string is a lie we tell our type checker.
I wrote a VS Code extension which shows subscript parentheses in your JS code to help clarify operator precedence.
Python Context Managers are a great way to model resources with setup and teardown. Here's how to implement that pattern in JavaScript.
I made a simple website where you can instantly open and view any .ani file for free.
Video of my TSConf 2021 talk entitled "Faster, Safer: Compiling Untrusted Code to WebAssembly in the Browser".
A reprint of an interview I did with the Italian design magazine Progetto Grafico about Winamp's significance in our digital culture.
Making a video that smoothly scrolls through 70k Winamp skins over the course of 12 hours.
How my Twitter bot @winampskins works under the hood, how it has evolved over time, and what I've learned from the project.
I used thousands of screenshots of Winamp skins and StyleGAN2 to train an ML model generate more Winamp skins.
Writing an in-browser compiler to compile untrusted user-supplied code to fast and secure Wasm at runtime.
Video of a talk I gave at Speakeasy JS about the engineering and design philosophy behind the Winamp Skin Museum.
Technical breakdown of how the NPM module ani-cursor converts .ani files into CSS animations in the browser.
Thoughts on what I think made the Winamp Skin Museum successful.
After more than four years, I'm finally happy with how Webamp implements balance.
Read the transcript of a live Q/A I did about Webamp and Nuclide.
I talked about Winamp2-js on the Changelog Podcast.
Why I'm perfectly happy to have built something that nobody really uses.
I appeared on the Zeal Interestings Podcast to talk about Winamp2-js.
Demo videos of Winamp2-js' more interesting features with notes on how they are implemented.
Discovering, reproducing, and working around a bug that crashes Safari hard.
A private, mobile-first web app that writes your journal directly to Dropbox.
How to remove code and still increase your library weight.
Learn the basics of functional programming by iteratively refactoring imperative code.
My work interviewed me as part of their "employee spotlight" series.
Video and PDF tablature of a Gilbert and Sullivan aria arranged for ukulele.
Making the case against allowing linting errors in master.
I’ve added the equivalent of 30 hours to my week, all dedicated to reading and listening.
I wrote a minimal implementation of the game Snake in JavaScript.
A detailed guide for those who are struggling to find a way to contribute to open source.
Video of a talk I gave introducing and explaining Vim Awesome.
Ten common mistakes people make when using Underscore, and a linting tool to detect them.
I made a meme generator where the URL is the user interface.
In which I discuss how constraints have inspired my creative process as a musician and programmer.
I recently released a new website called HashBin which avoids being able to see the content the pastes it helps create.
How we get from a binary Winamp skin file to seeing Winamp2-js take on the look of your favorite skin, all within the limitations of your browser.
The Shepard Tone is an audio illusion that creates the impression of an endlessly rising or falling tone.
Rewriting a PHP script from 2008 in JavaScript.
Free CDNs are a thing, and they can be put to use almost instantaneously during an unexpected traffic spike.
I refactored Winamp2-js to not depend on jQuery, and learned native JavaScript is not so bad.
I've found Plug to be superior to Vundle in several regards.
How I used transactions to make my tests run eight times faster.
How to install CLI tools wiht Composer.
How to write a custom Codeception module and distribute it as a Composer package.
A simple way to asynchronously load suggestions into an array in JavaScript.
A Codeception helper to test emails sent by your application.
How to get Codeception acceptance tests working in a Vagrant workflow.
I gave a talk at the San Francisco Vim Enthusiasts user group.
Documenting a bug in CodeIgniter that causes sessions to be irretrievable.
A tehcnique to ensure that unchecked checkboxes submit a value of zero with PHP apps.
Documenting a change in Laravel 4.1 that affects how ambiguous routes are handled.
A handy Git alias for merging a feature branch into master and pushing it to the server.
A .vimrc snippet for better indent support for PHP with HTML.
I've been using GitHub issues to track problems with my workflow.
Generate infinite sexy Halloween costume ideas.
I typeset a Creative Commons edition of Charles Gounod's a cappella choral work 'Le Crucifix'.
As a wedding gift for Chelsea I arranged a piano four-hands version of the song her dad wrote to sing her to sleep.
A ringtone for Chelsea based on Papageno's Glockenspiel music from Mozart's The Magic Flute.
I created a website that will generate silly fach names.
One way in which 'curl pipe sh' install scripts can be dangerous.
A solo ukulele arrangement of Charlie Chaplin's 'Smile'.
An original song from the vaults. Recorded on my first ukulele into my first (MacBook) laptop.
I recorded a simple version of Tom Waits' 'Ol' 55' for my friends Jared and Kathleen's wedding.
A tiny ukulele track for Chelsea's iPhone text tone.
I wrote and recorded a song about not having time to write songs.
I arranged and recorded 'I Love You Truly' on electric ukulele for Chelsea.
I arranged and recorded a solo ukulele version of the classic song 'Never on Sunday'.
Chelsea and I recorded a few songs in our backyard with the help of Beau Lambert.
I arranged and recorded the hymn 'In The Garden' on ukulele in memory of George Morris.
I built a website to help opera singers discover role which might suite their voice.
A micro song for Chelsea, written and recorded while she was in San Diego.
While visiting my parent's cabin in the woods, I created a little ring-tone song with my Electric Ukulele for Chelsea.
I arranged and recorded Irving Berlin's 'Blue Skies' on my new Eleuke electric ukulele.
I arranged and recorded a jazz ukulele version of the classic song 'What's New?'
I arranged and recorded 'Love Is a Song' from Walt Disney's Bambi on my new ukulele.
On New Years Day some friends and I recorded a multitrack video of The Beach Boys' song 'In My Room'.
I got bored over winter break and make an electric ukulele out of stuff I found in my parent's basement.
My dad and I recorded a version of Mary Had a Little Lamb where I sang and played the same song a fifth above.
I wrote a song for Chelsea after three years of dating.
My friends and I recorded a cover of 'Colors of The Wind' from the major motion picture _Pocahontas_.
Experimenting with recording every part in a barbershop tag a perfect fifth higher to create jazzy chords.
I recorded an a cappella version of 'That's Why I Love You' by The Flamingos.
I recorded a little audio drama for my parents 30th wedding anniversary featuring characters and musical excerpts from the hilarious musical Forever Plaid.
I got my family to record a math themed song for my brother's birthday and graduation.
I recorded a short song in a parking garage.
I wrote and recorded a novelty love song for Chelsea.
I wrote and recorded a barbershop tag for Chelsea.
I recorded a cover of 'We're Going To Be Friends' by the White Stripes with multiple voice parts and ukulele.
My friends and I recorded a rendition of 'I Want to Hold Your Hand' by The Beatles.
Geoff's Boring Programming Stuff wrote a bot to beat my Refresh Cannon game.
I turned my forum avatar image into an interactive projectile aiming game.
I turned my forum avatar image into an interactive rhythm streak game.
I wrote a barbershop tag for my girlfriend Chelsea.
I created the Shepard Tone audio illusion using Lilypond.
I multitracked 'Happy Birthday' for my friend Amanda Ortmayer's birthday.
I sing the alphabet song with the melody backwards, the words backwards while showing solfegge hand signs and conducting.
I recorded myself singing the ABCs backwards while playing the ukulele.
I learned to sing the alphabet song backwards and recorded it in Golden Gate Park.
I recorded a doo-wop arrangement of 'Earth Angel' for my girlfriend Chelsea.
I recorded two barbershop tags with my friend Zane Fiala.
I recorded myself reading a tongue twister story about Shrewd Simon Short.
An inventive trick with dynamically generated avatar images, or: How I learned the hard way just how motivated people are by leader boards.
I programed a dynamic avatar that plays the card game war.
I uncovered the reason why my php server was only serving one page at a time.
I wrote a PHP script that automates a hilarious method for generating Your Debut Album.
I wrote and recorded an original song about not being able to write.
I wrote a PHP script that generates mandalas based on the size and number of points you give it.
I wrote a script that sends you an email when the image you embed in your emails is opened.
I record a multi-track of the jazz standard Everything I Have is Yours, with strange harmonies.
I recorded a video multitrack of a barbershop tag, showing all four parts in sol-feg hand signs.
I recorded a barbershop tag in a robot voice to experiment with overtones.
I recorded a barbershop tag for Chelsea on our year and a half anniversary.
I tricked my professor into thinking I found a recording of the Chipmunks singing Schumann's Widmung.
I recorded a multi-track of the barbershop tag 'Cry'
I recorded a multi-track of the barbershop tag 'I Love To Sing 'Em'
I found a letter in which the writer tries to assure the recipient that the fire hasn't burnt out yet for them.
I found an envelope of old photos and slides in a PG&E bill return envelope.
I wrote and recorded a multi-track of a barbershop tag for my cell phone ring tone.
I recorded a multi-track of the barbershop tag 'Who'll Take My Place When I'm Gone'
Three paper airplanes I found in San Francisco with writing on them which is decidedly not safe for work.
A chaotic note I found taped to a newspaper vending box.
I recorded a multi-track of the barbershop tag 'Lord, You Made the Night Too Long'
A drawing I found depicting what Socrates' Myspace page would look like.
I recorded a multi-track of the barbershop tag 'Love Letters Straight From the Heart'
A strange document I found on the ground which refers to an unknown music transcription system.
A video of my choir singing at St. Boniface Church in Anaheim, California.
I recorded myself playing a minuet my brother wrote for a music course.
Sharing a youtube video of the choir in which I sing.
Sharing an issue I found where PGP Desktop was causing my computer to run slowly.
A made a script that scrambles the inner letters of words but, surprisingly, leaves them still readable.
Update on my MAME cabinet project.