ken black, fyi.

February 12th, 2026

Like many others, I've been spending a silly amount of time cleaning up old emails. Google has recently started cracking down on storage quotas and I have been hoarding data like a packrat since 2011.

To approach the problem, I've been relying on filters in the Mozilla Thunderbird email client. I love this thing! Not only is it FOSS, it truly is a versatile application while being more user-friendly than Outlook. It keeps things "nuts and bolts," meaning that it doesn't try to hide how it's managing your emails and it does trust you with the tools to work with your whole dataset. In contrast, the Gmail web client is constantly hiding emails from your search and filters. This is a development choice; it is done to improve performance, and that initiative to improve performance is done so you don't click away from their ad-infested web interface. Thunderbird has the same functionality you'd need in any web client and executes all the operations you want on your own computer's hardware. It doesn't get any sweeter than that.

And these filters have got the juice!

Thunderbird filters cut through years' worth of marketing emails and deletes them in a matter of seconds, reclaiming valuable cloud real estate. It works so well at deleting things, I've had to think up some precautions, to make sure my filters don't error out and blindly delete all the emails from my inbox.

One of those nifty tricks is to look up my late grandpa's email address, because he started forwarding all kinds of nonsense to me very early on in my account's lifespan. I think he started sending me stuff the day I made a Gmail account. On a regular basis, he would send pseudoscience, good luck or prayer chain messages, and most of all -- YouTube videos. Many people of my generation have this exact same experience with a beloved older relative. These messages are amazing. Like this one:

Subject: Fwd: Dolphin Show in Israel

Dolphin Show in Israel

Sent from my iPad

Begin forwarded message:

> This is amazing…I have not seen a dolphin show QUITE like this one!

> HOPE THE REST OF YOU ENJOY !

> https://www.youtube-nocookie.com/embed/pRFq7K4vCSk?rel=0

That link is quite funny -- and very privacy conscious! People were trying to resist enshittification, even way back then.

Anyway, it made me remember him first showing me his own personal website, and being impressed at age 10. And once I learned the fact that his emails always came from his own domain, I was extremely impressed at age 13. Even to this day, I find that feat impressive, considering he did this with the tools/services available in the early 2000s. Every sysadmin I've ever met describes, with horror, the complexity involved in managing custom domain email systems. I've always thought it was cool. He inspired me to pursue Computer Science and later inspired me to build the website you're on right now.

Just for sake of closure, I wanted to see if his website was still kicking around. Who knows? Size-wise, we're only really talking just HTML and a couple low-resolution pictures. He could have prepaid $20 to some 3rd-rate webhost and had it last for decades.

... But, no, seems to be some sort of Turkish gambling website SEO garbage. Disappointing, but again, hilarious.

Anyway, I saw this, and the subject line alone made me laugh, so I had to share this reflection on old fwds from grandpa.

February 7th, 2026

I've spent the day writing a python script that simulates game battles. My aim is to use the data resulting from the simulation to shape design of enemies and levels for an RPG which my brother and I are cooking up. Building the script was more complicated than anticipated, but anyone who's ever promised they can build a "simple" tool in a limited timespan will know the foolishness of this pact. Nevertheless, the development of the script has been illimunating. Most of all, I really enjoyed myself!

  def top(self,i):
  #invoked: army.top(0)
  if (len(self.units)>=i+1):
	top = self.units[i]
	if (top.ready):
		#if top ready, return top of pack
		return top
	else:
		#otherwise recursive call to find the next ready unit
		# ready = no action this round
		return self.top(i+1)
  else: 
	#if there's noone left, return a blank unit with idr=0
	#this terminates the round if both armies have idr=0 as top
	return comUn.comUn('null',0,0,0,0,0,0,0)
		

Cool, right? ... Well, I like it. It's a good example of recursive code calls.

You don't see too many of those. Good examples; you don't see too many good examples, that is. Examples of recursion that are actually pragmatically useful are rare to come by, or at least, that's the consensus between a few developer friends and me. The function of recursive calls can usually be implemented more clearly with a for loop. In this case, though, I couldn't seem to plan out a flow using for loops that didn't require meticulous polling of the index. That sounded far too tedious to write and, besides, that decision may have cost serious performance gains. Instead, this recursive call takes advantage of the self-sorting nature of the Army class, which owns this function. Self-sorting, self-indexing data structures are always my favorite to work with. We'll see how this runs at scale.

Who knows, I might attempt to optimise this whole thing, using a new indexer, but I don't think you can do better than this in terms of performance.

Anyway, this recursive call was the piece that allowed the game engine I'm writing to move the turn order to the next highest initiative. Now, I can run arbitrary simulations of RPG battles, to see how many rounds it will take a party to defeat hordes of varying sizes.

My next objective is to implement logic for target selection. It's been years since I've attempted to write "game code," and I'm thrilled that I ran with this idea on a whim. It's important to re-ignite old passions.