It's Time for Pi
Pi is the number you get when you take any circle, measure the distance around it, and divide by the distance across it. Any circle. A dinner plate, the moon, a ring you draw in the sand. Always the same number. About 3.14159, and then it keeps going forever without repeating.
That last part is the part that gets people. It never ends. It never settles into a pattern. You can compute a trillion digits and you are no closer to the “end” than when you started, because there is no end. Pi is irrational (you can’t write it as a fraction) and transcendental (it isn’t the root of any nice polynomial), which are two math-flavored ways of saying it refuses to be pinned down.
Research First: Beating Kaggle's Titanic with History Books
Most Kaggle Titanic tutorials open with
import pandas as pdand immediately start running.describe(). I did something different: I read about the actual disaster first.The result was better feature engineering, more informed imputation strategies, and a clearer picture of what was noise versus signal. The model barely mattered — the features did all the work.
Why Research Before Code
The Titanic dataset has 891 rows and 11 features. You could get ~77% accuracy by predicting “all women survive, all men die.” Getting past 77% requires understanding why people survived beyond gender. That understanding comes from the history, not the data.
Building an AI-Assisted Kaggle Toolkit
I got tired of the standard Kaggle workflow. Open a notebook, import pandas, start typing
.describe(), throw some models at the wall. It works, but you don’t learn much, and three months later you can’t remember why you chose XGBoost over Random Forest.So I built a toolkit that forces a better process: research first, then model. Document everything. Produce educational content as a natural byproduct of doing the work.
Building a 24/7 Go Bot with KataGo on KGS
I wanted a Go bot that plays games on KGS while I sleep. Not to grief anyone — just to have a persistent presence on the server, accumulate games, and watch a machine play the oldest board game in the world against real humans, all day, every day.
The result: a Python wrapper around KataGo and kgsGtp.jar, running on a $5/month Lightsail instance, playing Chinese rules on 19x19, saving every game as an SGF file, and reporting stats back to me. Here’s how it works.
Non-Symmetrical Dice: When Fairness Gets Weird
A fair die doesn’t have to be a cube. A fair die just needs each face to have equal probability of landing face-up. But how do you build one that isn’t symmetric?
I’ve been exploring this question computationally. The project is at early stage but the results are already counterintuitive. More details coming as I work through the geometry and the simulations.
256 Universes in One Byte: Exploring 1D Cellular Automata
A row of cells. Each cell is either on or off. Every generation, each cell looks at itself and its two neighbors, then follows a rule to decide what it becomes next. That’s it. That’s the whole system.
From this absurdly simple setup, you get chaos, fractals, traffic jams, and even a system capable of computing anything a laptop can compute. All from one byte of information.
How It Works
The neighborhood is three cells wide: left, center, right. Since each cell can be 0 or 1, there are 2^3 = 8 possible patterns. A rule assigns an output (0 or 1) to each pattern. Eight binary choices = one byte = a number from 0 to 255.
Try My Physics Simulations: Live in Your Browser
I built a physics simulation library that models springs, pendulums, epidemics, gravity, and more. The simulations run locally with matplotlib, but you can also explore them interactively through Jupyter notebooks, no install required.
Click any button below to launch a live notebook in your browser via Binder. It takes about 30-60 seconds to spin up the first time (it’s building a fresh Python environment from my GitHub repo), then you’re in a full Jupyter session where you can run cells, tweak parameters, and see the results.
I Built an Open Source Contribution Toolkit in 57 Tokens, Then Submitted 7 PRs in One Session
I’m a beginner programmer. I know what loops do, I can read Python, and I’ve done basic git pushes and pulls. But I’d never submitted a pull request. I didn’t even know what a PR was a few hours ago.
Now I have 7 pull requests across 3 different repos, including a bug fix in a famous 3,259-star chess engine, and a fully tested toolkit that helps anyone find and contribute to open source projects.
Building a 6502 Simulator in Python (Part 2)
From a 12-instruction teaching CPU to a full MOS 6502 emulator, inspired by Ben Eater’s breadboard projects.
Why the 6502?
The MOS 6502 is the processor that defined home computing in the late 1970s and early 1980s. It ran the Apple II, the Commodore 64, the Atari 2600, and the Nintendo Entertainment System. It powered the first affordable personal computers and launched an industry.
What makes it perfect for a simulator project:
Building a CPU Simulator in College (Part 1)
The original MM1 processor simulator: a custom instruction set architecture built in Python as a student.
The Assignment
In 2004, week 5 of the Modeling Motion program introduced something unexpected: we weren’t simulating springs or epidemics anymore. We were building a computer from scratch, in software.
The assignment was to implement a simple processor simulator. Not a real CPU architecture like x86 or ARM, but a custom one designed for teaching: the MM1 (Modeling Motion 1). It had 8 registers, 64 words of memory, a 12-bit instruction format, and just enough instructions to write meaningful programs.