We participated in the 2021 ICFP Programming Contest. I have done a lot of these (including organizing the 2006 contest some 15 years ago) although it has been a while (recently someone always seems to be getting married etc. that same weekend). This was a well-designed problem which I can summarize briefly: Given a graph and some simple polygon, find an isomorphic graph that fits within the polygon, (mostly) preserving edge lengths and trying to get edge vertices near vertices of the polygon. Everything takes place on an integer grid, which makes the optimization problems much harder, especially for instances where the edge lengths have to be preserved almost exactly. I worked with David and Jason and Ben, working virtually/extremely-online (as is the fashion these days) and spent most of my time on a C++ optimizer based on a blackbox optimizer that I have been using for projects recently. Blackbox optimization is not a good way to solve this problem (it's a bit like "just throw machine learning at it" except less capable) but it is a fun way to make progress without beating your head against various frustrations. Jason also made a web UI for solving the problem manually, and most of our solutions were some combination of human solving and computer optimization. Here's a screenshot of the debugging UI improving a solution (or nolution):
We certainly didn't win, but we found a valid solution to every problem and had a good time! I actually liked the problem enough that I kept tinkering with my optimizer after the contest ended, since I kept getting ideas while running that I just wanted to see whether they'd work.
I also basically finished this pixely UI for the classic Destroy FX plugin Buffer Override. I drew it in Aseprite, which I'm trying to develop my muscle memories in, and used the NES palette as an unnecessary challenge:
This one is best viewed with crisp pixels, so maybe click that bad boy. The only missing part here is the programmatic visualization of the state, to go in the brown box on the top left. After this one's done I think we'll be ready to launch the new versions of all the plugins, all 64 bit, and after that I have some other in-progress plugins and ideas I'm itching to try. For the plugin UI work I also made a pipeline for generating TTF (based on code from the Uppestcase and Lowestcase project) pixely fonts, and created three specimen for the plugins, including a new version of "snoot.org pixel10" with some problems fixed, like missing ∞ and ± symbols. I like making bitmap fonts so perhaps I shall find a place for these my Divide By Zero Fonts site, although I'm not sure they really belong in that series. Completists can just snag 'em out of the DFX repository, though.
Speaking of crisp pixels, I also got a new monitor, since these 120hz 4k 32" displays that were supposed to be coming out like 18 months ago are finally actually available. I'm still getting used to it, with one major bummer being that 4k (even at 32") is probably a bit too high-dpi for my aging eyes to read comfortably at normal UI sizes. But I kept getting mad at the various other imperfections with UI scaling turned on (especially when working on developing pixel-perfect UI above!). So I have been going back and forth on settings until I get used to something. High-res photographs, video, and games look just fantastic on it though. I was playing ScourgeBringer, which I think is a very polished roguelike that I did like, but I was at the point where I unlocked all the help and I either needed to invest a lot more time to get good enough to actually beat it, or move on, and for this one I (wisely?) moved on. I consider this a kind of maturity like when I bought the well-liked pixel art software instead of "just" writing my own, but maybe it can alternatively be seen as a kind of softness. Anyway, to make good use of the big new monitor I switched to some 3D games that can at least pretend to be 4k, first Sensorium. This was a first-person puzzle game that I ended up rather enjoying. It's similar to The Witness and Antichamber (although I think both of those are better; prefer them) with some ideas I've seen before, and a handful of very good new ones. The postgame puzzles were the most up my alley, including that I found my way out of the map and off to some stray geometry on the horizon in search of one of the octagons. Good stuff. Now I am playing Sniper: Ghost Warrior: Contracts II which is exactly what you'd expect.
Here I am again! I was going to say that month went by quickly, but when I re-read last month's post it seems like ages ago.
We drove the car on a road trip; other than when I drove twice to West Virginia in a Zipcar to get vaccinated this was my only time significantly far from my house in a year, so that was kind of weird, but good. Still trying to stay outdoors or masked if around potentially unvaccinated people. The main event was to go to southern Connecticut to visit my family, since there is a new nephew (1 year old!) since last we met, and the other nieces and nephews have also grown at least a year, which is a lot for kids. They were excited to show me their video games, and I was excited to show them some science stuff (turns out you can get perfectly decent handheld microscopes for less than $20, which were a hit with the kids, at least for a few minutes), and the siblings were excited to drink beer together. We even got some real New Haven pizza, which is the main reason that most people would consider going to Connecticut. Driving straight through takes over eight hours, which is doable but very tedious, and I'm trying to get in a mindset of not hating driving so much (I mean the act of driving; I don't think I'll ever really "like" the idea of driving, especially the obsession with car infrastructure in cities), so we stopped "on the way" in Watkins Glen, which is in the Finger Lakes. I can recommend this place for a day, especially the state park. It's this mile-long gorge that has stone walkways and bridges and caves built into it where you go up the spiral stairs and emerge behind the waterfall that spills into the giant basin, and then you keep going and again there's another better waterfall that you could just slip and fall into, and soon you are just so completely over waterfalls, not like in a bad way, but say where you feel judgey if you see anybody take a photograph, because like, come on, there are SO many waterfalls. Aside from its many wineries and beereries, I discovered that this town has some kind of car racing history, and if you pay them $30 they let you drive around their race track, so I did that also in the spirit of trying to hate driving less. That is definitely more fun than driving on the highway.
Still working on the Pac Tom endgame, which I have done some significant construction on, although I made one discouraging mistake that set me back a bit. The main problem is that to finish the project and the filming, I need a decent weekend (like: not on a road trip, not hosting visitor, not 95°F, not raining) and these have not been forthcoming. I did a redesign of the Buffer Override UI for Destroy FX (mostly because the current one is so dang tiny) but it's not quite ready to share. Part of that was distracting myself by using my newly minted abilities of generating TTFs to make some bitmap fonts for this project, instead of clicking the pixels by hand (??), which I am pretty efficient at, but jeez. I've been using Aseprite as discussed in the previous post, for both the UI work and the fonting. I do like it, although its similarity to Photoshop keys/behavior does put a spotlight on some of the things I expect to be there but aren't (say, holding shift when drawing with the pencil to constrain it to a straight line). It's great to be able to write scripts, though, and have native support for animation!
I finished Project Hail Mary and I think I basically liked it; a few things fell better into place than I was expecting, or at least it didn't fall apart like the (somewhat similar) "Seveneves" did. By the way I always pronounce that Se-VEN-eh-vess. Now I'm reading The Utopia of Rules which isn't what I was expecting but is interesting, and in some Wikipedia rabbit hole (I think it was about cryogenic brain preservation) I was reminded of how much I like Nick Bostrom's brand of bonkers but nonetheless hard-to-refute writing, and so I have been catching up on some of his papers since I last thought about that guy. I did in fact finish the game Caveblazers (it's no Spelunky or Isaac but it was a very solid Roguelike) in time to pick up Nifflas's new Ynglet. I think Nifflas made some of the best indie "Metroidvanias" out there, with the creative movement and clever hidden challenges, and I was sort of expecting this one to be in that vein. It's not, but it was a very good short game anyway, with a really cool presentation style and vibe. Then I finished Slime Rancher too (charming), and now I am on to Outbuddies DX (I expect to finish it, but I think it has too many rough edges to recommend).
Aw jeez, that month went by fast. Partly because the weather has gotten good here, and with the vaccines kicking in we have been doing some stuff again, like some outdoor dining and hikes and hosting some vaccinated visitors. All of that is good, though.
I think I actually want a compiler that uses the type information to do optimizations/transformations (like say variable and property renaming). I think when I write code I'm often thinking about easy transformations that the compiler can do (discarding unused code, for example) and making use of that; without it, I find I need extra discipline to keep myself from optimizing by hand.
The very first thing I wanted to do with it, which was to parameterize some class by some set of types with operations, was quite awkward to do. This seems partly because of the way TypeScript is committed to erasure-based features (see prev), but also more annoying than it would need to be due to several ergonomic omissions (like, why can't I say "type T = F<T1, T2>" inside a generic class?). jcreed did help me figure out a livable approach though.
The type system is not complete (normal) and I kind of knew it was not actually sound either, but I was surprised to immediately find out how unsound it is. For example, consider this trivial program:
let a = ;
if (a.length != 0) throw 'no';
if (a.length != 1) throw 'no';
Kinda makes you want to just make your own language, right? But aside from that, I needed to do some pixel animations, which Photoshop is only minimally suited for. I was proud of myself for buying the well-liked Aseprite sprite editor (still need that tilemap mode though!!) instead of "just writing my own," although it was a somewhat agonizing decision.
I made some progress on my Pac Tom endgame strategy (video, CAD, basement workshop, and software work) and some other miscellaneous hacking, but a relatively project-light month.
I started reading Project Hail Mary (same author as The Martian), which is fun in its way. I really like the setup of "problem-solving sci-fi where the problems and solutions are compelling," although the writing is mostly just tolerable and the disbelief is inherently (to the genre) fragile if you notice something conceptually wrong with the fiction part (like, why not one waking crewmember and two in comas?). I think it's part of what drives me instead to non-fiction problem solving like "Eight Amazing Engineering Stories." Happy to hear recommendations along these lines though. In video games, I finished Blasphemous (decent exploration platformer with stiff combat/movement but excellent atmosphere), Rite (small hard precision platformer with great controls), Willy Jetman (silly exploration platformer that nonetheless had its charms), and Sayonara Wild Hearts (beautifully stylish animation and music with good-enough gameplay; recommended!). Wow, that's actually a lot. I'm letting myself play another roguelike now, Caveblazers. Might be a mistake though. It's quite fun but the difficulty curve on the later levels is starting to worry me.
SIGBOVIK 2021 and other things of April
(30 Apr at 18:25)
Yeah! Several newsy things from April. First up is my SIGBOVIK project, published on the first of the month (that's right, at Tom 7 Radar you can find out about the newest Tom 7 Projects a mere 29 days after they are announced in other venues!). This year's conference was virtual again, although they mercifully allowed for both audio and video in the submissions. From me the main artifacts are the 24 minute video Uppestcase and Lowestcase Letters and the 18-page paper of the same name. The project site also has some additional downloads. I'll let them speak for themselves! For SIGBOVIK, the presentations were limited to 5 minutes, so there's a highly truncated/ruined version of the video (not recommended unless for some weird reason you gotta catch 'em all) and a "double-blind" Q&A afterwards in the SIGBOVIK 2021 recording. There are some other good parts in there from friends and strangers; I especially liked Jim's "Dada" presentation (29m05s mark).
As usual I was feeling fairly sick of the project as I completed it, so it's nice encouragement that upon completion, it seems that others were not yet sick of the project and were willing to spend 24 minutes on it. It's not like the video is a viral hit at 73k views, but it was nice that it found an enthusiastic audience, and I definitely feel like it was successful. I've come to realize that I get a much bigger kick out of a viewership who is smart and "gets" the technical stuff and strange form of humor more than I do from simply making the numbers go up. Hopefully I can keep up the mood/momentum and finish a few more nearly-complete projects soon.
Speaking of momentum, I got my second vaccine shot, again driving to a Rite-Aid in a tiny town in Ohio for it. Possibly inspired by these two driving day trips but probably more a directly a consequence of cabin fever from staying at home for a year, I ended up buying a car! I've owned a car before (for example Van 7 and Van 7 2) but always a crappy car that was nearly dead, like for example before I donated Van 7 2 to NPR it could only be entered or exited through the back sliding door, and when the car was on it would always and forever play the one CD that was stuck in the CD player at slightly-too-loud volume because the CD player's faceplate was malfunctioning, which at least would cover up (for the unwise passengers and driver) the various scraping, shimmying, and structural unsoundness sounds that the van would make whenever it moved. Among other things. This time I got something that I thought would be fun to drive (we will pretty much only use this thing irregularly for trips or for picking up things at the hardware store that are a bit too large to carry home running, but nonetheless not too big to fit in the actually quite tiny back seat/trunk) and got a Mini Cooper convertible that looks like this:
Vanity license plate idea: POOPERS
Actually that lens angle makes it look bigger than it is. It is a tiny, silly car. And it is more fun to drive than the minivan indeed. We'll see whether it ultimately ends up being a foolish idea, but it should at least let us see family and do some safe outdoor activities as we try to mentally survive through the extended coda of the pandemic.
You know what else was annoying? A few weekends ago I tried rebooting the server that hosts various of my websites including this very blog, and it just failed to come back (dashboard just says like "ERROR" with no diagnostics) and none of the standard things gave me any information about what was wrong. Emergency console gives some internal error. Backup images wouldn't load either. I spent an hour+ on the phone with Rackspace support, who finally concluded the server was "just too old" to turn on. I had been upgrading the OS in place for many years, so this was a pretty annoying outcome (like they could have warned me at some point that the container image or whatever was going to fail to come back?). I never particularly liked Rackspace anyway (they bought the hosting company that I had started with), so I used the "opportunity" to switch to DigitalOcean, which is probably faster and a better deal and their website is certainly way better. So, it was a weekend down the drain, but spacebar.org has a new exoskeleton now. I think that I've gotten everything restored, but partly because some people have nicely sent me bug reports (e.g. muddle was behaving as though no boards had any words, because it couldn't find the dictionary file). So if you see anything amiss, please do lemme know.
I also took the "opportunity" of struggling to get my decades of legacy software running on a new system again to rewrite some of the guts of Escape to separate the UI from the server components a bit more. Now there is a subset of the game that can easily be compiled as standalone standard C++ (e.g. for the server-side components) without needing SDL, which is nice. The main thing I need to do with that before doing another release is to make it compile again for Mac OS and for the new ARM chips, which is somewhat daunting, but I left it in a reasonable state for the next time I have such energy, at least.
Current programming project is something between a game and an overly-complicated technology demo; we'll see how it goes!
Helloo! Things are looking up. Last week I was able to drive to Ohio (from Western PA where I live, only a little over an hour, the main difficulty being that I don't have a car) and get vaccinated for sars-cov-2! This was a good blend for me because it's legitimately available for anyone over 40 (no residency requirement) so it didn't require any funny business, but on the other hand I got to express my eagerness to get one by going significantly out of the way. I got the Pfizer version, which along with the Moderna one is just really cool technology and I'm grateful that we live in a time where such things are possible. I was thinking today that it's probably the coolest thing I ever put in my body? It seems like a lot of people around me are finding one way or another to get their shots, which is a good sign!
While I was out there, I had some extra time on the zipcar so I did this run that's been on my bucket list for a while. There's a narrow sliver of West Virginia surprisingly sandwiched between Ohio and Pennsylvania here, so I ran from Ohio through WV to PA and back. (One of my running side projects is to collect border crossings, with a three-way like this being especially good (although not as coveted as a tour around a triple-point such as in post 1158).)
The portion along the river was pretty awful, basically just running in a breakdown lane of a highway, and it seems that WV and OH are having some kind of "Oh yeah, you're building a factory right here to billow smoke across the river to us? Well then we're going to build an even bigger factory where the exhaust is literally on fire!" back-and-forth, but at least I had my mask with me. Otherwise it wasn't a particularly epic run or anything, except that I was cutting it a little close with the Zipcar deadline, so it worse than it normally is when I made a wrong turn on the way back!
After that I spent pretty much an entire long weekend putting together a video for my latest project (actually finished this one) for SIGBOVIK. (It's good that I got a burst of energy because I unwisely started playing shapez.io the week before this deadline, as recommended by jonas on this very blog's comment section, and the game is both good and tended to keep me up way past my bedtime. I think I won it, though!) This project is also nothing epic but it is kind of funny/interesting I hope, and I'm very glad to have actually finished something given the energy challenges that 2020 posed. There's a paper in SIGBOVIK and a 5 minute version during the conference. It's all taking place online this year and there's both audio and video, so I think it will be a good event that anyone can participate in. I'll post the full 24-minute Director's Cut tomorrow after SIGBOVIK, which is project's true Final Form.