Blog Archive

  • TIL: Cleaner Log Output When Using 'Concurrently'

    If you’ve ever used the package concurrently to run more than one thing at the same time while developing, you probably have seen how the logs are a little jumbled together. All output is logged to the console, by default, with a number representing the process that created the output....

  • Making This Blog Even Faster With Speculation Rules

    Browsing the HTMHell Advent Calendar I learned about a completely new-to-me browser API called “speculation rules.” This poorly-named (according to me) feature allows browsers to prefetch or even pre-render content speculatively, basically predicting what a user is going to click on. Currently, this feature is available in Chromium-based browsers, but...

  • Webpack 201

    This cat is now bundled for production. In 2024, I wrote about learning the basics of Webpack when I realized it was a tool that I used almost daily without thinking about it. Now, I’m working on a Firefox extension that is going to depend on a third-party library. How...

  • I Created Custom Procedurally Generated Truchet-Tiled Open Graph Images for This Blog

    I love Truchet tiles, which are square tiles that form interesting patterns when you tile them on the plane. The idea that some basic shapes, like the triangles above, can form elaborate emergent patterns when tiled in interesting combinations, fits in nicely with my interests of quilting and drawing geometric...

  • 2025, Wrapped

    2025 has been … well, it has been one of the years of all time, I can say that. Personally and professionally, I have achieved a number of my goals. The wider world? I’m not sure I even have the words to describe how I feel about … everything, and...

  • Building a Cookbook in Python, for Reasons (Part 2)

    In my last post, I talked about building a cookbook/recipe blog that stores recipes emailed to a special address. I talked about setting up the backend, the service that provides an ‘email received’ webhook, and the library that parses recipe information from a website using the Schema.org standardized schema. Where...

  • Building a Cookbook With Python, for Reasons (part 1)

    📖 + 🐍 = ? *Note: This is a longer writeup of the project I presented at PyLadies 2025. If you want the bite-size version, watch it here. I’m part of a monthly potluck that organizes meetups over email, then meets in person to eat delicious vegan food. (I’m not...

  • Blogs I Follow By Women In Tech

    This is how I assume all women look when they write their dev blogs. I certainly do. Recently, a reader wrote in1 and said that she enjoyed my blog because it’s hard to find technical blogs not written by men. I counted up all the blogs I subscribe to in...

  • A Handy Shell Script to Publish Jekyll Drafts

    xkcd The quest to remove friction from posting to this blog continues. In an earlier post, I shared how I used rake to automatically generate a blog template for me and place it in Jekyll’s drafts folder. Now, I realized I’d also like to handle publishing that post with approximately...

  • Are There Any Good AI Documentation Apps Out There?

    One of the places that I had hoped “AI” could be truly a time-saver is in the realm of creating documentation. There are a number of services out there, including Guidde, Scribe, and Tango, that claim that using their browser extension, you can simply perform a task while the extension...

  • From Idea to Acceptance: Crafting a Standout Conference Proposal

    Honored to have been a part of this panel on how to get started speaking at tech conferences and meetups – with an emphasis on writing a good proposal – with some very talented and prolific folks. And a big thank you to Joy Hopkins for organizing the panel and...

  • Six Things I Bet You Didn't Know You Could Do With Chrome's Devtools, Part 2

    This is the second of two posts about devtools tricks; these are sourced from a conference talk I attended in early November as well as from other things I’ve picked up across the years. In the first post we covered: Time functions with console.time() and console.timeEnd() Watch any DOM element...

  • My 4 Testing Commandments

    Bug hunting This week I was a guest instructor at the Black Venture Capital Consortium’s Software Engineering Career Track. This is was my second year volunteering with BVCC on the SWE track, and it’s super rewarding, although I’m still learning how to deal with the “Gen Z stare” on Zoom....

  • Six Things I Bet You Didn't Know You Could Do With Chrome's Devtools, Part 1

    I just got back from TechBash conference in Pennsylvania. It was a great couple of days of meeting new people, reconnecting with old friends, and of course learning a ton. Many of the sessions I went to were fantastic, but my favorite session by far was by Mike Rapa about...

  • The Surprising Power of Jekyll's site.data

    I’ve been speaking a lot this past year. This is new and exciting to me, and I want to track all my accomplishments, because each one of them feels new, exciting, and honestly a little scary. So keeping track of everything is a great way for me to mark these...

  • Accessibility the Easy Way With Deque's Linter

    I have been interested in, though never an expert in, web accessibility, for years. I believe common-sense affordances like alt text and keyboard navigability in a website are shining examples of the curb-cut effect, so while I am not (currently) disabled1, I do at least try to make my websites...

  • Who's Touching My Files? Watch Out With Watchman

    Is Mr. Game and Watch a watch-man? I don’t see why not. I have a weird setup at work with a lot of interlocking config files. (We sort of halfway support git’s sparse-checkout feature but with an internal tool that’s supposed to keep everything in sync outside of git. Don’t...

  • An Intro to vavr's Either

    Either an orange or an apple would be delicious. Either is an incredibly useful tool in a Java programmer’s handbook, one that brings functional programming control to Java. If that didn’t make sense, I get it. Either is much easier to use, to me, than to explain. What Either does...

  • How to set up a backend FastAPI server on nginx (or: I am bad at devops)

    I’m setting up a new backend server for a silly side project I’m working on, and every time I do this I forget all the steps I need to follow. These steps are for a FastAPI server, served through nginx running on a Unix box (an Amazon EC2 instance running...

  • Some Basic Rake Tasks for Jekyll Users

    I recently tweaked a few of the (very basic) rake tasks I’m using to keep this blog going. Ruby isn’t my thing, but writing these was interesting and I figured I’d share in case they are useful to anyone else. Wait, back up. What’s a rake task? Rake is a...

  • What I Learned From Reviewing Hundreds of Conference Session Proposals

    I did not actually give anyone an A+. Nor did I get the chance to write “see me”. Since last fall, I’ve been pitching (and giving!) talks at tech meetups and conferences. So far it’s been an excellent way to hone ideas, meet new people, and learn more about the...

  • Partially Mocking a Class in Java

    This is an example of complete mocking, but not the kind of mocking this post discusses. I love writing unit tests. i know this is an unpopular opinion but I just really like it. I love thinking of edge cases that could break code and then coming up with exactly...

  • What I Learned This Week: AI and Alt Text (Don't Do It)

    For those of us who are sighted, it is easy to forget that alt text is a necessity for navigating the Internet for the millions of blind individuals who use screen readers. Not to mention, there are still, believe it or not, Internet users who do not load all images...

  • Don't Sync State, Derive It! (With Apologies to Kent C. Dodds)

    Syncing is for swimming, not for state. This is a pretty standard lesson (Kent C. Dodds talks about it a lot in his React courses and on his blog) but it’s still something that has taken me a while to internalize. With BookGuessr, I have a bunch of state! I...

  • The Making of (and Redesigning of) BookGuessr

    A couple of years ago, I got into my head the idea that I wanted to make a Wikitrivia style game with novels. I love to read, there’s a lot of publicly available data about books out there, why not? I made the first prototype in a weekend, using a...

  • I'm on a Podcast

    Last month I had the honor to appear on the “Her Corporate Compass” to talk about my approach to asking questions. (previously, and previously). You can listen to it here: If Spotify isn’t your thing, it’s also on Apple Podcasts here. I will be completely transparent: I’m still a little...

  • Secrets of the Git Commit Hash

    I attended an online presentation recently about very specific ways git can get messed up. To be clear, git can get messed up in many ways, but this fascinating presentation, by Mike Street, was about just some of the ways we run into problems with git. Have you ever gotten...

  • The Joy of Leetcode

    “This is what happens if you do very well on coding puzzles,” an acquaintance texted me last year during Advent of Code. I honestly assumed the link included in the text was gonna go to some meme of a skeleton dead in front of their computer. But nah, he wanted...

  • Save Time With Postman's Pre-Request Scripts

    Postman is an incredibly powerful tool for prototyping and testing APIs. If you ever find yourself making any kind of API request to any service (regardless whether it’s one you built or one you use), I really think you should be using Postman. In this post I’m going to share...

  • Some Tips for Working With the Google Sheets Java SDK

    At work, I’ve been working on a project that involves reading and writing data to and from a Google sheet. One could argue about the wisdom of using Google Sheets to hold any data, but for the sake of this post (and my sanity) let’s assume that the business requirements...

  • What I Learned at Work Today: Status Code Tricks

    At work yesterday, I came across this snippet of code in a Java class meant to handle HTTP responses: boolean isSuccessful(int statusCode){ return statusCode / 100 == 2; } My first instinct was to chuckle (and in fact I sent it to a coworker and we both chuckled). What a...

  • Cool Discovery: Over the Wire's Wargames

    I was nerd sniped this weekend by a coworker who told me about Over The Wire’s wargames, which are self-directed cybersecurity challenges. I am just about halfway through the easiest one, Bandit, which in addition to having me scan for open ports and base64 decode strings, is also teaching me...

  • Customizing the Command Line for Lazy People

    The shell is personal. Why not make it customized to your every whim? Actually, there are decent reasons not to go crazy customizing things – mainly, the logic goes, if you get too invested in having things a certain way that are ‘not normal’, then when you have to ssh...

  • Hidden Export Options in Google Slides

    To publish my slides for Reinforcement Learning for the Math-Phobic I had to do a lot of manual work. I cropped screenshots of the slides (and replaced some text-heavy slides with just text). I turned my speaker notes into complete sentences and interspersed them between the slides. (I was heavily...

  • Training a Reinforcement Learning Algo for the Math-Phobic

    Below is a copy* of a talk I did at work about the Gymnasium side project. I didn’t talk about Queens at all, because I realized I only had 10 minutes, and teaching people how to play Queens and then explaining how I made a bot do it would take...

  • See Me at Girl Geek in March!

    Look who that is, right there in the bottom row, third from the right! Oh yes, it’s me! Goodness gracious, I am thrilled to be speaking at Girl Geek X Elevate this spring. I’ll be giving a 25-minute version of a lightning talk I did based on this blog post....

  • My Github Skyline for 2024

    This is always a bit of silly fun, but I missed it last year. This year, the Github team put together a CLI tool that somewhat replicates the old STL generator. I used to print mine out, but I think I like the ASCII art better. :) This was created...

  • Works In Progress: Generating a Maze in Python

    Last year I was messing around with maze generation. I thought I was going to make another game (more on that later). I didn’t get very far, but I did learn how to use the recursive backtracking algorithm to create a 2D maze. I was thinking about that algorithm again...

  • Building My Blogging Habit, With Toys

    I would like to be writing more, and most self-help books about productivity say the same thing: If you’d like to encourage a good habit, you need to remove friction. To that end I’m trying out a few portable Bluetooth keyboards, under the idea that if it is easier to...

  • The Wrong Reason (and the Right One) to Blog

    I wish I looked this relaxed when I worked on this blog. Photo by Vardan Papikyan on Unsplash You should keep a blog. Yes, you. You introverted developer. A blog helps you learn in public. The concept of learning in public is often discussed in tech circles (and rarely, in...

  • Advent of Code Day 14: That Won't Work

    I guess finding the answer to part 2 manually is not going to work. Imagine this GIF goes up to iteration 4999….

  • Composing Functions in Python

    Beethoven did not compose any functions, that I know of. I have not done a lot of functional programming, although someone I used to volunteer with was very into it. This weekend, while attempting to solve Advent of Code, I came back across some functional techniques. I probably should have...

  • Why I'm Not Doing Advent of Code (in Go)

    I want to learn Go. another statically typed language would be good to have under my belt everyone seems to LOVE go I want to see what all the fuss is about and stretch my brain Ergo1, I should do a bunch of coding puzzles this month in go, right?...

  • About The F*ck

    Dunno how y’all are feeling lately, but I just have a lot of curse words on my mind. And by complete coincidence (actually no really), continuing with my theme of terminal tricks I have discovered the most perfectly named, magnificent app: The Fuck. It corrects your previous console command. All...

  • Webpack, Explained by Someone Who Just Learned What It Is

    Image by digital designer from Pixabay What is webpack? At a recent casual meeting of Women & Gender eXpansive Coders DC (a local group I’ve become involved with over the past year) a Python user asked me this question, and boy did I stutter out a non-answer. I think I...

  • Getting Unblocked, Faster: 5 Lessons from Journalism (and One Bonus Lesson) That Can Help You Ask Better Questions

    Most loyal readers of this site know that before I was a software engineer, I was a journalist. I pivoted to my new career during the pandemic and have zero regrets! But there are certainly times I am grateful for my journalism training. Frequently those times are when I need...

  • Teaching a Reinforcement Learning Algo to Play Queens

    Once you have created infinite games of Queens, you need to play infinite games of Queens. I don’t have time for that, so the next logical step is to teach the computer how to play, taking humans out of the equation entirely. A very cool data scientist I know recommended...

  • Site Updates for September

    Frequent visitors to the site may have noticed some minor layout changes around here. I’ve moved my list of projects to the top of the main page. Crucially, it is now mobile friendly as well. Projects also have tags on them now to distinguish between apps (something that may be...

  • In Which I Go Down a Complete Rabbithole About Bash Completion

    Ever wonder what is actually going on in your shell when you type, for example, cd ~/myp, hit <TAB>, and the shell completes ~/myproject? Neither had I, until recently. This was supposed to be a post about the next chapter of Efficient Linux at the Command Line, which is about...

  • Leveling Up on the Command Line

    I am lucky in that my first exposure to computers was through the command line. I wasn’t a wizard by any sense when I realized that I could type “echo hi” and the computer would ‘talk’ back to me*, but it means that I feel more comfortable in a non-GUI...

  • Building a Queens clone in React

    I have nearly a 50-day streak on Queens, a daily game from the worst social network. The fact that LinkedIn has managed to trick me into visiting daily is not lost on me, but man, it’s a fun game. I decided that one Queens per day is not enough, and...

  • Learnin' Kubernetes

    At work, all teams are being asked to adopt Karpenter, which, as you can tell from the name, is related to Kubernetes. The adoption is a relatively simple process, thanks to pre-work other teams have done to automate most of the hard stuff. Realistically, I should just have to change...

  • Fruit Tracker, my first Fitbit app, is live

    My first Fitbit app is live in the Fitbit app store. You can read about what it does here. Below are some things I learned while making it. The fitbit onboard computer is very stupid. This is probably why Fitbits have such good battery life. You can do very basic...

  • What Is A Snowflake Stage?

    At work the past week, I’ve been working with large datasets, trying to figure out the most efficient way to process and transform the data without overloading other teams’ servers. Disclaimer, I’m not a data scientist and SQL is not my strong suit. Any mistakes in the below are mine...

  • More Fitbit Dev Resources

    The developing-for-fitbit journey continues… Breaking changes between SDK 4.x and 5.x The older Fitbit I have, a Fitbit Versa 2, uses software written with version 4.x (or lower?) of the Fitbit SDK. Modern Fitbits use… I think it’s up to 6.x? And excitingly, there were a ton of breaking changes...

  • Common Errors When Developing for Fitbit

    Or maybe just common to me? Problem: Install failed: RPC call to 'app.install.stream.begin' could not be completed as the RPC stream is closed Cause: Jury’s out on what causes this. It seems to happen when I sleep my laptop; the Fitbit simulator doesn’t seem to be able to recover. Solution:...

  • Developing for the Fitbit Versa

    In my previous post I said something about learning Android app development so I could make a Fitbit app. However, silly me– just because Google owns Fitbit now does not mean that Fitbits run Android. (: Android Wear is what powers Google-owned smartwatches, but if you have a vanilla Fitbit...

  • Firebase Crashlytics and Feature Flagging, or What I Learned at WITS Spring 2024

    The following info comes from the Women in Tech Summit which I attended in Philadelphia this weekend. I may type up a more fluffy post about how it felt to attend this conference later, but for now, these are my technical notes from the hands-on session I attended. Android app...

  • Local Firebase, or, how I learned to stop trashing my prod db

    Noodle has a lot of the hallmarks of a solo dev side project, which is fair, because it is. Stupid simple deploy pipeline (which is probably a good thing), no tests to speak of (probably not a good thing), no real dev environment. That means when I test Noodle locally...

  • Typescript-ifying Noodle

    Over the spring and summer, I built Noodle, a minimalist, privacy-focused event scheduling app. (more) My friends and I use it all the time, but development has kinda slowed. This is a problem, because if I ever need to fix anything, I’m going to have to go back and remember...

  • Game Off Results

    2048 Invaders got 190th out of over 600 entries in the Github Game Off. This is far better than I expected for a silly Javascript game, my first game ever. I’m thrilled :)

  • Hello, Electron

    I mentioned that I wanted to experiment with packaging 2048-invaders as an Electron app to see if it improved performance. Turns out, Electron is easy (and awesome)! There are a ton of very opinionated templates out there to turn a Phaser game into an Electron app. I experimented with a...

  • Hello, world

    First post, first time using Jekyll! I’m really liking it so far. It feels a lot like building a website in the “old days”–the real old days of just HTML. You just write a thing, and poof, it appears. Except that it also has all the modern bells and whistles...