Wash Your Hands

Youtube announced they would reduce the quality of their videos for 30 days in the EU. Joke's on them, because I only use it to stream bootlegs of old films anyway.

In all seriousness, though: Stay safe, indoors, and WASH YOUR HANDS. This is not the common cold, folks!

Good Damage

Diane: If I don't write my book of essays now, I never will!

Princess Carolyn: So? Don't write your book of essays.

Diane: I have to!

Princess Carolyn: Why?

Diane: Because if I don't, that means that all the damage I got isn't good damage, it's just… damage.

Bojack Horseman, Season 6, Episode 10 "Good Damage"

There's not a lot that I have to add here. I loved that stupid horse show, because it was funny, and sad, and real in a way that most live-action shows are not. Diane is my favorite character and that exchange in particular hit very close to home for me. I've had conversations like that. I am trying to come to grips with a thing like that right now!

I'm not crazy about the "golden age of television" like most people are, but Bojack truly was one of the good ones.

It was nice while it lasted.

Photography Site

I had a bit of time over the weekend, so I decided to finally put up a Photography site. It's a straightforward grid with pictures and if you click/tap on one, you get the full-sized image. Simple.

They are not sorted by date or anything else, because my goal was not to create another feed you have to check in on, but to provide an immersive space of rest. I haven't decided if I will create a blog post every time I add new pictures or not. We'll see what feels right.

Another small tweak: At the bottom of the page, right next to the Archive, is now a link to the RSS Feed. My friend Philipp pointed out that such a link was missing. Thanks, Philipp. 😄

Mobile Note To Self

I should come up with an easier way to post to this blog from my phone. Maybe write a small Shortcut? I haven't done much with Shortcuts, but this strikes me as a good use case. A share extension that pushes a text file onto the server and then invokes the publish script. It's simple and self-contained. Hm.

New Sites

I've added some information on the Projects and Games sites. The only one that's missing is the Photography site, but I need to write some CSS for that first. Soon.

A New Year

The holidays are officially over, the presents have been exchanged, the wrappings torn and thrown out, most of the food has been eaten, and it's January. For the first time in over 6 years I have no idea what my future looks like, professionally speaking, and I couldn't be more excited.

The possibilities are not endless (I'm not 20 and, uh, rich), but everything I want to accomplish is still possible. Actually, more accomplishable, since I now have over 6 years of experience working as a professional software developer (and sys/office admin).

Experience is a weird thing. There is no substitution for it, which sounds both corny and condescending. But it's also true! Experience can teach you a lot about your strengths and weaknesses, if you pay attention. I feel like a lot of people focus on the strength part and forget about the weaknesses. I'm not that person. I relish in the weaknesses. Knowing your weaknesses helps you focus.

I spend the first two years at my old job (still weird calling it that) mostly in sys/office admin land. Back then I thought I would enjoy the admin side of things as much as the coding side. After all, it is computer nerdery, right? Well, yeah. But it's a different kind of nerdery.

I can get by with setting up scripts and cleaning up Windows installs and all that kind of junk, but I'm just not that good at it. And I don't enjoy it. Which now, after a few years, I'm actually fine with. I don't have to like all parts of computers. I don't even have to know all parts of computers. It's way too much. I just need to know what's out there, so I can focus on what I want to do. What I'm good at. Once I had everything up and running and could focus on writing code and designing interfaces I was much happier. Once I figured out that I could work on games and I'm not completely shit at it (your mileage may vary), I was really happy.

Code and Design working hand in hand. The Steve Jobs spiel about the "Intersection of Technology and Liberal Arts". That's what I like. That's what I'm good at. That's what I want to do the next few years.

Anyway, that's a long-winded way of saying that I will die a happy person if I never have to fix a fucking printer again. Fuck printers.

Christmas Let Me Go


So, let's do it quick and easy: I was let go from my job two days before Christmas. Yeah, I know. It's the perfect gift for someone like me and you're kicking yourself for not coming up with it. Short version: They just don't feel like they need a full-time software developer/sysadmin anymore, because computers are a fad? Maybe? My last official day is January 31, so I still have some time before I hit panic mode.

Anyway, if you know something, let me know. For the last six years I've been building internal tools for a medium-sized Taxi company (think Uber but, like, legal), first for iOS, and then for the web with Python! Apache! Django! CSS! Other cool buzzwords! I've also been working on a super top-secret website redesign, which will be officially unveiled very soon. ish. (Hi guys. You know who you are. Early January? 😬)

Internet Archive Vinyl Archive

The Internet Archive is a global treasure:

Unfortunately, many of these audio files were never translated into digital formats and are therefore locked in their physical recording. In order to prevent them from disappearing forever when the vinyl is broken, warped, or lost, the Internet Archive is digitizing these at-risk recordings so that they will remain accessible for future listeners.

Full Post.

Mystery Tease 03


It took me longer than expected to implement this. Obviously.

The reason being I wanted to make it somewhat flexible and to test out a few simple ideas without spending too much time overengineering it (I'm aware of the irony). I'm not 100% sure if I managed it, but here's what I came up with:

I have an abstract interface called InventoryProvider. Each Scene (read Level, Room, what have you) has an inventory, and each Player has one. Now, I'm not saying I'm making a game with multiple characters. But if I was, hypothetically, it would be very easy to add new ones with new abilities or change stuff around without disturbing existing ones. The interface looks something like this:

template <typename InvT>
class InventoryProvider {
	virtual ~InventoryProvider() {};

	virtual bool select(Inventory<InvT>&, std::shared_ptr<InvT>&) = 0;
	virtual bool deselect() = 0;
	virtual bool take(Inventory<InvT>&, std::shared_ptr<InvT>) = 0;
	virtual void useSelectedWith(std::shared_ptr<InvT>&) = 0;

It outlines the most common tasks you'd want to accomplish in a point-and-click adventure; namely selecting items, picking them up, and using them with other items. The Inventory is essentially a wrapper around a std::array of game objects, with some added info for grid-based inventories:

constexpr uint32_t _slot_size = 10;

template <typename InvT>
class Inventory {
	void add(std::shared_ptr<InvT>);
	void remove(InvT);
	bool contains(std::shared_ptr<InvT>&);
	struct Slot {
		float posX, posY;
		bool isFilled;
		std::shared_ptr<InvT> item;

	std::array<Slot, _slot_size> slots;
	bool is_grid;

The Player or Scene inherits from InventoryProvider, implements the methods, and stores the data in a corresponding Inventory member. I check for clicks in the runloop and react according to the position of the clicked item.

Yes, using std::array this way limits the number of items I can have per scene, but that won't be a problem, since they're very tiny anyway. It make it much easier to work with grids, and that's more important to me than filling a scene with more stuff. Remember, I'm the only person working on this thing. I don't have the capacity to add thousands of items, so I get to make decisions like that.

Parser Update Incoming

When I set up this new site, I decided to do most of it myself, including the Markdown parser. I knew what kind of stuff I wanted to write about, so I took various shortcuts to get it done quickly, because I didn't want to lose interest and add to my pile of unfinished projects. Well, that has come around to bite me in the ass, and hard.

I wanted to post a new update on the mystery game I'm working on, and naturally include some code to illustrate what I was doing. Suffice it to say, that didn't go well. The layout was completely borked and now I have to spend time I could be spending on the game on a new and improved Markdown parser. Yes, I know that there are ready-made offerings, but I would like to do it myself. It's fun. I think.

Dark Mode Icons

I waited to upgrade my devices until 13.1 dropped and it's been fine so far. Nothing crashes, no weird bugs (except for that one thing where keyboard keys randomly appear in Springboard, but I've had that since 12), nothing slows down. I appreciate the small design tweaks. Overall a solid upgrade.

I have one little complaint, though: Developers should be able to set Dark Mode specific icons and Apple should make Dark Mode versions of their own icons. I think it's a glaring oversight that this is not there (yet?), especially since they've been so thoughtful about the implementation overall.

Apple Music Feature Request

I like Apple Music playlists a bunch, so I add them to my library all the time. Problem is, they're stored as a list in the sidebar. Which, uh, is suboptimal if you've added more than ten. What I want is to have a view where I can see the cover art. Basically, the album view, but for playlists. Also, a way to pin favorite lists to the top would be nice. That would be super, thanks.

Mystery Tease 02

Look at that, another mysterious image:


Granted, that doesn't look all that different from the one I posted a while ago, but it does mark progress. While the first tease was generated in code just to get it up and running, this one is generated from data, specifically JSON:


That means I can swap stuff in and out, change color, etc., without having to recompile every time. I'm using the excellent JSON For Modern C++ to parse the files on disk. It's super well documented, simple, and makes it feel as if JSON was a native type in C++. Plumbing, ftw.

I'm adding items next, so an upcoming tease will have grey boxes and probably some text. Exciting!

Thrice Upon A Time

Yes, I promised to write something more substantial about Once Upon a Time… in Hollywood. And I will. I just haven't found the time yet. For now, this will have to do:

  1. There are problems. They are mostly the same problem as with every other Tarantino film.
  2. Brad Pitt!
  3. The Spahn Ranch sequence is just perfect. Could be released as a short.
  4. I liked it so much I will probably see it two more times in the theater before the end of the month.

At The Movies

I'm about to head out to watch the new Quentin Tarantino movie. Two weeks late, because someone decided in their infinite wisdom that staggering a release by country is a thing you do in 2019. 😒

I'm pretty excited. I wanted to make a concerted effort to watch more movies in the theater this year, but I haven't managed to do it for various reasons. So this will be only the second original film I've seen in the theater this year. ( I've seen all the Marvel ones, natch.) The other one was Vox Lux, which I enjoyed.

I couldn't escape some of the negative reactions online. Yes, obviously there are problems with Tarantino movies. I will most likely write something about them tomorrow.

But tonight I'm going to the movies, get some popcorn, maybe a beer, and watch $90 million arthouse trash.

I think that's pretty cool.