General Update

Posted on Apr 2, 2024

Well, I've managed to go just under two years and a half years without posting a single thing to the blog. So, what have I been doing in that time? Time travel perchance? Or possibly something a bit more mundane like being frozen in carbonite or trapped in the Phantom Zone?

While all very reasonable guesses, the answer is “no”. I've started several posts, but haven't liked any of them enough to actually publish. Also I was frozen in carbonite.

So, what WOULD I have posted over the last two-ish years?

Side Project: Wikipedia Pathfinder

After loading Wikipedia into an RDBMS, a document store, and a graph database, I just kept going. As I imagined it, the next reasonable thing as I saw it was to write an express/React frontend to put over it so that I could have a nice UI for finding paths and then reviewing the content.

The front page of my project, Wikipedia Pathfinder

At this point I found out that Wikipedia uses its own markdown format which is a bit different from every other form of markdown I had seen. Being that I couldn't find a ready-made parser for it 1, I wrote a lexer/parser myself. While this somehow seemed semi-reasonable at first, I quickly found out that Wikipedia's markdown, as actually used, is considerably more permissive than the documentation would suggest and that a wide variety of pages existed firmly in the realm of “undefined behavior” (and sometimes outright forbidden behavior).

The results page of my Wikipedia UI

Getting it working was definitely a pain, but I ended up being able to get most of the formatting, including tables and embeddings to work as expected. And it supports dark mode, to boot.

I had to implement dark mode because… my eyes

Building a Cryptogram Solver

I've got a soft spot for cryptograms. When I was probably eight or nine, my Grandmother taught me how to solve those beautiful little linguistic puzzles. There's just something about them that I find terribly interesting; they're simple enough to describe yet not so easily decomposed that they become uninteresting mechanical repetitions like their tiring kin, the sudoku.

I used to enjoy trying to solve them, pencil on paper. After a while just trying to find a book of them became a largely unsolvable challenge of its own. Fast forward to the last two years and I rediscovered them thanks to a beautifully simple implementation designed for the iPad. I started solving them again in earnest when I was looking for a chill puzzle game that I could simply pick up and sit down. I was hooked again, and not just me, but also my family who I had the pleasure of introducing to cryptograms too.

As I was getting ready for bed one night it occurred to me that writing a program to solve cryptograms could be an interesting challenge since solving them requires more probabilistic reasoning than hard “if this then that”.

Over the next two evenings after work, I mulled over how to handle it and ended up coming up with just over 80 lines of TypeScript that would take an input and give a best-guess output of what the hidden text likely was. At present, the whole program compiles, runs, and provides a result in just under 7 seconds.

Input:  EQA SGBEU DSKG AQ UQWGYE GWGEAO, B UQWGYE FNOGKZ.
Output: not being able to govern events, i govern myself.

After I solved that challenge I went on to the next challenge: writing a post describing what I had done. This, like most of the projects I've written about, took longer than the project itself.

Input:  J RNQFWXAC NYRA MAJX QA JX RSAKK, MWX VX IJK YN QJXRS LNC QA JX TVRT MNEVYP.
Output: a computer once beat me at chess, but it das no match for me at kick bowing.

Unfortunately, I never das was able to get the post to have the texture and cohesion that I wanted it to have. I'll likely try writing it again at some point, but it's also possible that this is the entire record of the cryptogram solver, a state that I'm still content with.

Building a Ray-Tracer in F#

Having almost no knowledge of how ray tracing works (beyond what I had picked up in Game Engine Black Book: DOOM) and having previously produced nothing of any notable magnitude in F#, I did the only reasonable thing one could do: I bought a copy of The Ray Tracer Challenge and started following along, implementing my ray tracer in F#, learning the language as I went.

An image generated by my ray-tracer

I'm still working my way through and, though there's still significantly more to cover, but I can confidently say that Pixar is not now and will not later be at greater risk due to the existence of my ray-tracer.

Building a Computer in Turing Complete

The game Turing Complete is just that: a (turing complete) game. Specifically, it's a game where you build a computer from first principles and get all the way to the point of programming it in assembly.

A screenshot of the final computer I made in Turing Complete

I built a little computer there, enjoying that I could see how everything worked under the surface. It was a fantastic game that gave a simple way to build and visualize the flow of data in our from-scratch machine.

Follow Andrej Karpathy's “Neural Networks: Zero to Hero” Courses

AI is basically magic. Or at least it had seemed that way. After watching the first six videos in Andrej Karpathy's “Neural Networks: Zero to Hero” YouTube course and “playing along” in a Jupyter notebook, I found myself seeing AI as significantly more impressive and far less magical. Programming my own back-propagation system and then training a model using it was incredibly satisfying (albeit impractical).

Life

And then, believe-it-or-not, there's things that I do outside of technology, most of which I don't talk about here. If I did though, it would have included the following two notes:

For roughly a year-and-a-half, I served as church pianist / guitarist, along with a good friend. That was a massive growing experience. I don't play in front of people. I don't sing while playing (for years I simply lacked the coordination). I absolutely don't play while other people single.Especially not guitar (as I am more inexperienced in that area.) Our regular musician left for paternity leave and our pastor halfway joking asked me to play. I played guitar that week in front of people while they sang. This continued for several months until my friend returned, at which point we both rotated for the next year. Eventually I added piano too.

This one is a bit weird. If you've never tried teaching third and fourth graders how to use higher-level reasoning I advocate that you try it. At that, you should also consider writing your own fourth grade teacher a heartfelt apology. It's a learning experience for all involved. Terrifying and rewarding. My daughter loved it and (because of that), so did I. As an aside, it also gave me a chance to use Three.js to verify the flight-path of a misbehaving drone, something that will likely appear here on another day.

Plotted out flight paths from a drone used in a drone competition


  1. They absolutely exist. I just didn't look closely enough because I was focused on “wikipedia” not “mediawiki”. I could have found a list of parsers here ↩︎