I like using Vim to make ASCII art. I don't use any plugins; Vim already has a bunch of built-in features that are super useful for making ASCII art! _ _/_Z _ / |// / |/ \ \__/_/_/_/_/ This article is for people who have made ASCII art before and want to see what other tools are out there. If you've never tried making ASCII art before, I recommend you don't read this article! You don't need any of…
Did you know Vim has a built-in shortcut to ROT13-encode the current line? Me neither! And I've been using Vim for 13 years! You can ROT13-encode the current line by typing g?? in Normal mode. I found out about this while reading :help g (2.4 Commands starting with 'g'). 1 Apparently, this feature has been in Vim since version 5.4, which came out in 1999. 2 For reference, Vim was first released in…
In 2025, I was browsing at my favorite Brooklyn thrift store 1 when I came across a 35-year-old printing calculator 2 . I'm usually pretty good about not hoarding junk these days but for some reason I couldn't resist taking a chance on this particular piece of junk. Once I brought it home, I was able to power it on using the included AC adapter. I felt a tinge of nostalgia as I watched the green…
The Recurse Center is where self-directed programmers go to push themselves, learn from each other, and have fun. In the fall of 2025, I traveled to New York and spent 12 weeks there building software for fun. In the beginning, I planned my work using a bottom-up approach — first deciding on a topic I wanted to learn more about, then structuring my work around that goal. The main example of…
What is the debugger doing under the hood when I ask it to set a breakpoint? Let's watch how GDB is changing the machine code of a program at runtime, from within the program itself. Here's a somewhat sketchy 1 C program that prints out the first 20 bytes of its own machine code, starting at the first instruction of the main function. #include <stdio.h> int main(void) { unsigned char *addr = (void…
The debugger is a tool designed to inspect programs as they're running. To this end, one of the debugger's most important capabilities is being able to pause a program's execution at any point so that its state can be observed. In debugger parlance, the point at which the program is paused is called a "breakpoint." In this post, I want to answer the following question: how exactly does the…
I'm starting at the Recurse Center today and I'll be here for the next 12 weeks. My goal for today was to set up this website so that I have a publicly accessible place to share what I'm working on. I tried not to overthink this. As of right now I'm writing the HTML by hand and I have a simple script to bundle everything into a directory. I set up Netlify to grab the changes from GitHub, run the…