Thu 23 Jul 2026 emacs I have hundreds of README.org files. Almost every project I write has one, and every SRFI repo has one, too. There are often three or four open in my Emacs session at a time. When I look at a buffer, knowing the path, not just the buffer name, helps me tell them apart. An obvious idea is to put the path in the mode line, but paths are often too long to fit comfortably. My…
Mon 27 Apr 2026 scheme I'm building a new web site in Scheme for BALISP, the Bay Area Lisp and Scheme Users Group. (The site isn't launched yet, but will replace the current Meetup.com redirect at balisp.org sometime before our next meeting.) The BALISP site needs to validate users' email addresses to make sure that they comply with RFC 5322 , but I couldn't find a complete validator written in…
Tue 17 Mar 2026 artificial-intelligence , linux , rust I recently upgraded my System76 laptop to Pop!_OS 24.04 LTS, and switched from X11 to Wayland in the process. I had been hearing about Wayland for a long time, but hadn't paid much attention. I was mostly interested in trying the new COSMIC desktop. I'm happy I made the switch, but there was one problem: the Window Chord programs I had written…
Tue 16 Dec 2025 artificial-intelligence , embedded , smart-watch Pebble watches are back! Pebble was the original smart watch. I backed their original Kickstarter campaign , wrote my own watch face using their SDK, and upgraded every time they released a new watch. When they went out of business, I switched to a Fitbit Versa, and wrote a watch face for it. Fitbit bought Pebble's assets, and was in…
Thu 11 Dec 2025 android , artificial-intelligence , scheme Ever since I worked on the Android project nearly twenty years ago, I've wanted to write mobile apps in Scheme. But the early Android API made it hard to run a good Scheme implementation, and the Android team strongly discouraged the use of languages other than Java. Those limitations are long gone. Still, whenever I got the energy to dive…
Thu 27 Nov 2025 emacs When editing text, WYSIWYG , or What You See Is What You Get, is the way to go — if you can get it. When I started this blog, I used Scheme code to represent the text of each blog post, like this: ((p) "When editing text, " (a href "https://en.wikipedia.org/wiki/WYSIWYG") "WYSIWYG" ", or What You See Is What You Get, is the way to go — if you can get it. When I started this…
Sat 8 Mar 2025 command-line , miscellaneous Early in my career as a software engineer, I worked at a large database company. The company took data loss seriously. Their private data center contained computers of many types, including systems made by DEC, HP, IBM, SGI, Siemens, and Sun. They did backups constantly. Periodically, someone would transport a huge cart of metal boxes of tapes off site…
Tue 11 Feb 2025 artificial-intelligence , emacs Xenodium 's excellent chatgpt-shell package makes it easy to use ChatGPT and other LLMs from Emacs. Having all of Emacs's editing power and programmability while working with an LLM is a big win. ChatGPT requires a license key, and chatgpt-shell needs access to it. It would be a bad idea to store the key in a plain text file, so I looked for a way to…
Sat 7 Sep 2024 programming-tools I was tracking down a bug in a big open-source project — let's call it Project Foo — and wanted to know exactly which commit had introduced the bug. I knew that the bug was present at HEAD , and that it was not present at 2e243b2bc . Checking out and trying every commit among the many in between would have been tedious, so I used Git's wonderful bisect subcommand.…
Wed 21 Aug 2024 programming-tools Have you ever accidentally committed a change to Git? I used to do it all the time. For example, I would add some temporary logging code to help with debugging, then find and fix the bug, and in my excitement, forget to remove the logging code before committing the fix. That mistake is easy to remedy, but it's a nuisance, so I decided to put a stop to it. The…
Mon 27 May 2024 command-line , miscellaneous , scheme I left graduate school decades ago, but I still love to read academic papers. The field of computer science reinvents its wheels constantly, but academic literature is a great way to mine existing ideas and avoid that problem. It's a way to " stand on the shoulders of giants ." For a long time, I maintained and carefully indexed a collection of…
Fri 15 Mar 2024 emacs My tenth-grade Latin teacher sometimes became frustrated with a classmate who couldn't keep his attention on the text. She would say over and over again, “You've got to focus. You've simply got to focus.” Sometimes, it's important to study one fragment of code deeply, ignoring everything else. Perhaps it's part of someone else's code, or it's something you're debugging, or it…
Sun 10 Mar 2024 emacs , programming-tools Long compilations, long LLM training sessions, and other slow processes are facts of life for many software engineers. After more than a few seconds or minutes of waiting, it's natural to want to work on something else, or take a walk, or do anything else but stare at compilation output. The ntfy notification system is ideal for this purpose. It's open…
Weather Dashboard displayed on M5Paper Mon 10 Jul 2023 embedded , scheme Today's computers are amazing, but sometimes I miss what it was like to write code when I started . I don't miss trying to cram my program into 4K of RAM, or having to save every change twice because cassette tape was unreliable, or having to link my programs by hand because there wasn't enough memory for both source and…
Laconic watch face for Bangle.js 2 Thu 15 Dec 2022 embedded , scheme , smart-watch I would love to run Scheme code on my watch, and I'm getting closer. For the original Pebble watch, I wrote a watch face app in C that I called Laconic. I ported Laconic to JavaScript for the Fitbit Versa , and have now done a total rewrite for the Bangle.js 2 . It's not yet Scheme, but JavaScript is closer than C.…
The Stomachion , rendered using NanoVG-REPL Fri 18 Nov 2022 scheme Last year, I tried an experiment. I wanted to see how easy it would be to do standard 2D graphics from Scheme, but not through a foreign function interface. For the application I had in mind, low refresh rates would be just fine, so I decided to try communicating with a graphics library using a text protocol over a pipe.…
ICFP 2022 logo Fri 11 Nov 2022 scheme I had the honor to be co-chair, with Andy Keep, of this year's Scheme Workshop , held as part of ICFP 2022 in Ljubljana, Slovenia. Videos of the talks are now on YouTube . We're still working on publishing the proceedings. Once they're available, I'll update this blog entry. I plan to make an announcement on /r/scheme , too. Here was the program: Why…
Tue 26 Jul 2022 ergonomics , scheme I started my computing journey on a TRS-80 Model I , whose screen had sixty-four columns of characters in sixteen rows. It was amazing how much one could get done with such a small screen. Later, I used an Ann Arbor Ambassador terminal. It could not only display much more text, but it did so in a vertical orientation. Seeing a whole function at a time made…
Mon 13 Dec 2021 linux , scheme Software engineering is a game of concentration. If you want to stay "in flow," you need the right information in front of your eyes at the right time. You need to bring it into view quickly, using only muscle memory. If your editor, or debugger, or web browser isn't in sight right when you need it, or if a distracting program like your email reader is visible when…
Tue 12 Jan 2021 scheme Sometimes, I know that there's something that I should be doing, and I just don't do it. I keep putting it off because it's too much work, or too complicated, or uninteresting. It's easy to find an excuse not to do it. For well over a decade, I've run this web site using a web server I wrote in Scheme. (My server runs behind nginx .) Until yesterday, I hadn't configured my…
Mon 21 Sep 2020 emacs The W3C's Markup Validation Service is an invaluable tool for anyone who writes HTML. It pinpoints problems with HTML pages, and it gives clear, helpful error messages. I use it constantly to fix my own pages as well as pages that authors submit to Scheme Requests for Implementation . Most authors write HTML by hand, and there are a lot of errors to fix. Uploading pages to…
Thu 30 Apr 2020 emacs I used to be one of those people who insisted that email messages should be pure text, with no markup at all. After all, who sends the most elaborately formatted messages? Spammers do. But that's not a good argument; it's guilt by association. Eventually, I came around to the idea that using bulleted lists, hyperlinks, indentation, and the occasional bold and italic text can…
ICFP 2019 logo, based on the Ampelmännchen Wed 30 Oct 2019 scheme When working on software projects, it's easy to forget that one's collaborators are real people, not just disembodied voices somewhere in cyberspace. That's one of the reasons I like to attend the Scheme and Functional Programming Workshop each year. The talks are fascinating, and it's great to spend time with real people doing…
Monet 's garden at Giverny Mon 8 Apr 2019 scheme As long as the roots are not severed, all is well. And all will be well in the garden. — Chance the Gardener Programming language communities are like gardens. Often, we get to grow something new and beautiful. But sometimes, we have to collect our tools and do grunt work just to keep things alive. This is a story about recent grunt work on two web…
Wed 6 Feb 2019 scheme The Bay Area Lisp and Scheme Users Group meets a few times every year to discuss computer science, design, human-computer interaction, complex systems development, programming languages, compiler optimization, cryptography, computer music, artificial intelligence, and other topics from a Lisp and Scheme point of view. I'm a member and co-organizer of the group. Our meetings…
Tue 22 Jan 2019 miscellaneous One of the first dynamic pages I wrote for my web site was a countdown calendar . The idea is simple. You choose a date on a calendar: Once you choose a date, you are shown a new calendar that shows every date between today and that date, along with the number of days left until then. So if you're anticipating a big date, e.g. a graduation, a wedding, retirement, or…
Tue 22 Jan 2019 talks I remember being thrilled at having an 8-bit, 1.774MHz Z80 processor and 16K of RAM. After all, I had just upgraded my TRS-80 Model I from its original 4K RAM, so 16K felt huge. The small screenshot above would fill my TRS-80's full memory almost eight times. And the modest laptop on which I'm writing this post has four 64-bit processors running at 1684MHz, each clocked at…
Sat 19 Jan 2019 scheme , talks My favorite dialect of Lisp, Scheme, first appeared in 1975. The Revised Reports on Scheme (R n RS) are the official standards footnote for the language. In 1998, however, a second, parallel standards effort began: SRFI , the Scheme Requests for Implementation. The purpose of the Scheme Requests for Implementation (SRFI) process is to help Scheme users write…
Wed 9 Jan 2019 miscellaneous My mother has a wall map that is covered with push pins marking the many countries she has visited. Her map inspired me to make two web pages, one for the US and one for the world, that anyone can use to visualize all the places they've visited. USA World Both are written using simple JavaScript, without frameworks, in a direct style that might not be practical for…