Recent Posts

Vibe coding a web app

How good are the latest and greatest LLM agents?

September 20, 2025 | ~1600 words | 8 min read

I built a simple Streamlit web app for a DIY electrolyte mix recipe. Embracing the "vibe coding" lifestyle, I decided to let a Claude agent do most of the work for me. Here's how it went. (Spoiler: pretty good but far from perfect)

Chicago Tool Library Search Improvements: Part 2

Quick wins

September 2, 2025 | ~1600 words | 8 min read

Now that we've identified some common problems, let's make the first steps toward solving them. First we'll focus on small, simple changes that will have an immediate impact.

Chicago Tool Library Search Improvements: Part 1

Identifying the problem(s)

June 26, 2025 | ~1800 words | 9 min read

An overview of the Circulate app and common problems with its search functionality. Not talking solutions yet, just seeing what types of problems exist. Plus, some constraints and limitations of a volunteer project with a shoestring budget.

Should I Renew My Kroger Boost Membership?

Running the numbers to see if it's worth it

February 1, 2025 | ~1200 words | 6 min read

My previous job gave me a free Kroger Boost membership. Now that membership is expiring. Is it worth renewing for $59?

Should My Fantasy Football League Change Our Kicker Scoring Settings?

Analyzing potential changes to fantasy football's least important position

September 1, 2024 | ~1400 words | 7 min read

Another year, another request for fantasy football rule changes. This time some people want to use a new scoring system for kickers. Let's (over)analyze how it would impact scoring.

Streamlit Hackathon: Exploring Chicago Datasets

I couldn't pass up an opportunity for some Streamlit swag!

August 3, 2023 | ~800 words | 4 min read

Streamlit is hosting a hackathon to show off their new connections functionality. I built a simple app implementing semantic search to explore public datasets in the city of Chicago's Socrata open data platform.

Analyzing Vehicle Size and Pedestrian Safety

Are SUVs and trucks more likely to kill pedestrians?

January 10, 2023 | ~2000 words | 10 min read

Traffic deaths in the US are increasing, and big SUVs and trucks seem to be taking over the roads everywhere. Are those things related? I analyzed publicly available traffic crash data and found that yes, bigger cars are statistically more likely to injure or kill pedestrians.

Strava Noise Reduction

Messing around with Kalman filters to fix noisy Strava activities

September 26, 2022 | ~2500 words | 12 min read

I use Strava to track my runs, and sometimes I'm annoyed with how noisy the GPS tracks are. I recently learned about Kalman filtering, a methodology for smoothing noisy data. Let's see if it can solve my Strava problem. Plus, a small Flask app that integrates with the Strava API.

Should My Fantasy Football League Change Our Defense Scoring Settings?

Analyzing the impact of possible changes

September 6, 2022 | ~1000 words | 5 min read

Some of my fantasy football league members want to make changes to defense scoring settings. I'm not sure it's a good idea, or if it even matters at all. Let's find out! Featuring a Streamlit web app and the (ugly) Yahoo Fantasy Sports API.

How to Manage Conda Environments on an Apple Silicon M1 Mac

Manage both ARM64 and x86 Python environments using conda

May 23, 2022 | ~1100 words | 6 min read

A basic tutorial for managing Python environments using conda (for those who don't like pyenv, or when pyenv isn't sufficient).

How to Manage Multiple Python Versions on an Apple Silicon M1 Mac

Install both ARM64 and x86 Python versions and seamlessly switch between them using pyenv

February 17, 2022 | ~1300 words | 7 min read

A basic tutorial for managing Python environments using my preferred tool, pyenv.

Why I Chose the MacBook Air over the MacBook Pro as a Data Scientist

Benchmark tests and other considerations to help you decide between the latest and greatest Apple laptops

November 28, 2021 | ~3400 words | 16 min read

I recently replaced my old laptop. Despite looking forward to the release of the new MacBook Pro for years, I opted for the MacBook Air instead. Why? It offers good performance and much better value. Most people (but not everyone) should probably make the same choice.

Using FastAPI to Recreate the Flask Tutorial

November 8, 2021 | ~1100 words | 6 min read

I wanted to try out the popular FastAPI framework. As a learning exercise, I reproduced a simple Flask tutorial using FastAPI.

Developing a Generalized Elo Rating System for Multiplayer Games

And using it to prove that I’m a terrible poker player

September 26, 2021 | ~2700 words | 13 min read

Elo is a rating system for two-player games, such as chess. I developed a Python implementation of a generalized Elo system that works for multiplayer games. Then I built a web app to track the Elo ratings of my friend group's poker games. At the risk of personal embarrassment, I'm publishing the results.

The Lazy Data Scientist's Fantasy Football Rankings

Blending fantasy football expert rankings with rank aggregation methods

September 3, 2019 | ~900 words | 5 min read

Exploring how rank aggregation methods can be applied to fantasy football. Sometimes the consensus is more accurate than the predictions from any individual expert.

Are "Hot Ones" Viewers Sexist?

Maybe a little bit, according to text analysis of YouTube comments

August 16, 2019 | ~2900 words | 14 min read

I analyzed the comments from episodes of the popular YouTube series "Hot Ones" and found some differences between episodes with male and female guests.