From now on, the title of the post is allowed to just be "January 2024" (only when it is January 2024, however)
(31 Jan at 22:08)
This month I've been plugging away on the project I mentioned in the previous post which involves among other things a PDF generator and now an implementation of ML (as in Standard ML, but also the other one). This is probably the 10th "compiler" I've written in my life, and it's kind of fun to revisit these problems that you've done many times and try out different approaches, although this time one of the approaches is "Use C++" (for reasons of making good on a joke, but also for reasons of mlton doesn't work on my computer any more). And although C++ is a fine tool for many applications, it does have some deficiencies for the task of writing a compiler (one of the most irritating: a very modest limit on the stack depth? Like my computer has 256 Gigabytes of RAM and 2^64 virtual addresses and somehow it can only manage 1 megabyte for the stack and there's no standard way to increase it? Get off my lawn). But then you can also experience new ways of struggling with C++, like: A middle of the night power failure wrecked my computer's GPT (as in GUID Partition Table, but also the other one) and I was deep in the depths of taking the computer apart to reset its parts, its BIOS (its Basic In/Out System, which is where it stores its biography) and its hard drives were everywhere on the floor, and it could not be saved, and this after I already broke my computer this year by trying to put the world's biggest video card in it, too hard. And I could not merely perform recovery because of Unknown Error, so I had to begin anew again and restore from backups. But when you restore from backup and you're in the mood of "why is this so complicated and I don't understand how computers work any more?" it occurs to you (me) to also change your underlying development environment instead of reinstalling the devil you know. So I ended my friendship with Cygwin64 and switched to new best friend MSYS2. Both of these things are different ways of wishing that you were using Linux while you're using Windows. The main reason I tried this new way of struggling is that Cygwin is very behind on its version of x86_64 clang (C++ compiler), which I wanted to try because it supports AddressSanitizer and clangd on Windows, and I wanted to give LSP in emacs a shot (it's finally good!). There were a few growing pains, but I think MSYS2 is what I would recommend now. One of the nice things they did was create multiple different environments depending on what you want to do (e.g. "I want to use clang to compile x86_64 code" or "I want to do 32-bit cross compilation for ARM") and in that environment, you just say "g++" and it invokes the compiler you want, instead of the weird contortions I've been doing for years with manually invoking x86_64-w64-mingw32-g++. I was also able to get clblast working before being too filled with rage to continue, so that is nice for the ML inference on the world's biggest graphics card. I made these graphics to help me tune the correct settings of GPU layers (y axis) and number of threads (x axis):
In some sense the results are obvious (more threads and more layers is faster) but it was interesting to me how the cliff of performance drops off at a different number of layers for single and batch mode (I guess because the batch needs some memory itself?) and how it's clearly better to use fewer threads than cores for batch as well. I was not surprised to see performance drop off for >32 threads (everybody knows that hyper-threads kinda suck) but I was very surprised to see performance pick up again when it gets back up to 64? And only for single mode? I wish I understood that better. But mostly I'm a sucker for the custom visualizations.
Right but when writing this compiler I realized that I wanted to use some Greek letters, and I can't handle it when some characters are in a different font in my source code, so I finally made some space for those in my programming font FixederSys. These certainly still need some tweaks, but it's already better than just being in some other weird font:
You can also see that I have been adding some "useful" emoji at the top. It is an interesting puzzle to try to make these things recognizable (especially for the 1x version, whose charboxes are 8x16 pixels). I am pretty sure I will not try to do all of the emoji (like, the flags are totally hopeless at 8x16), but it is tempting to round out the Unicode support somewhat. Like I was trying to make a ¯\_(ツ)_/¯ today and had to settle for ~\_( :) )_/~ which is pretty much (ノಠ益ಠ)ノ彡┻━┻.
Also: Adam revived our old game jam game Headcat, which I described in post 927, now over 16 years ago. You can play it online at Headcat.org. It is harder than I remember, perhaps explaining why it did not reach #1 on the One Appstore Per Child charts.
Also: I started and finished (true ending, but just with one character) Slay the Spire. Good game, but you don't need me to tell you that. Same for Alwa's Legacy, which is the sequel to Alwa's Awakening. Both of these are very true-to-form "8-bit" and "16-bit" platformers that I enjoyed and would recommend for genre fans, though I did not try to 100% them. The graphics are the highlight and I thought it was very cute how these could easily have been a pair of games from the NES and SNES. The good old days. And speaking of good-old days, I am now playing Katamari Damacy, which I had played at a friend's house many years ago, and always wanted to spend more time with. It totally holds up (aside from stuff like: You have to play through the tutorial and first level before you can access the menus at all, like to make the game fullscreen?) and it's honestly inspiring how unhinged the game design and writing are, and how fun it manages to be. What an accomplishment!
It's the tail end of winter break here, and we did a little traveling to see family, etc.. But I've been keeping the calendar light so that I have plenty of time for projects. There are too many in the works simultaneously, which is a bad sign, but during break I made significant progress on all of them. I also added a new one, with the idea that it would be a "small hack" so that I'd be sure to have something for SIGBOVIK (not everything needs to be epic, right?). It already works, but now I'm in the midst of writing a PDF file generator, which is also a bad sign.
Now that I'm nearly done going in and out of my attic so much, it seemed like good timing to attend to the dangerously acrobatic way that I always get in, which is to stand at the very top of a ladder and then mantle up using the floor joists. It's not actually that dangerous even though the ladder demands that you Never Stand Above This Line (how am I supposed to stand in the attic then, ladder?!), but I regularly lose my phone out of my pocket in the last leg-swinging step, which is at least dangerous to the phone. Without belaboring the tale, I ended up "having" to go to Harbor Freight to invest in some suspiciously cheap tools like a set of black pipe threading dies, pipe wrenches, pipe cutter, and while I was there I got a new vise. Worried that the vise would be too easy to install, I wisely purchased carriage bolts with square necks, so I had to file down the mounting holes of this thing:
This provided a good occasion to listen to some albums in the basement and order some new files. It is now very firmly and satisfyingly bolted to that satisfyingly timeworn workbench. Not pictured is how I needed to grind down the bolts so that the cabinet door below could open and close again (I use this cabinet to store old vises).
The only thing I have used the new vise for so far is to flatten one of the washers that was used to attach the old, crappy vise, so that I could weld that washer to the charging terminal on my Roomba so that it's able to charge again, so that I could vacuum up all the steel filings on my basement floor. Anyway, getting back now to the original task of making the entrance to the attic a similar amount of athletic but less fraught, I installed this pull-up bar:
The only hard part of this was getting the pipe to be just the right length, and threaded, but I am now equipped to do such tasks.
Winter is also a time for hibernation. I played through The Talos Principle II. I really loved the first Talos Principle, which had no business being as good as it was (the team was mainly known for Serious Sam, an over-the-top first-person shooter). Talos is a puzzle game with a pretty interesting story and fairly thoughtful writing. The sequel is good and definitely worth playing if you liked the original. It has a bit of the "Portal 2" effect where they clearly had a bigger budget and wanted to add all this polish, but did miss some of what made the original magic along the way. As you know I love to play games "the wrong way," and so I'm always looking for ways to break the puzzles in this game. I felt like the first one let me get away with more hijinks, like you'd stack items to make your way up somewhere, and a third of the time it'd be a Star (expected for 100%), a third of the time it'd be an Easter egg (acknowledging your prowess), and a third of the time you'd just fall out of the map forever and have to reset (true victory). I did fall out of the level several times on this sequel, but it seemed to me that the puzzles were more tightly constrained. Then again, I watched the current world record speedruns and there's certainly a lot of hijinks possible, so maybe I'm just losing my edge! I also played through Party Hard. It's a "murder all the people in 2D" game very similar to the Hotline Miami games, and not as good, but its absurd mood and unfair chaotic difficulty did grow on me. Right now I am "playing" (the) Gnorp Apologue, an idle game that has its charms, but, well, it's an idle game and I think it is cruel to ever recommend those. It was written in Rust!
New content on radar.spacebar.org
(30 Nov 2023 at 23:27)
Here is the new content:
I've mentioned that I have been working on running a five-minute mile on the treadmill this year, a goal that at one point seemed in reach. I think I also complained that I got sick and that when I got back to it, they had swapped out all the treadmills for fancy treadmills with built-in Netflix and air conditioning and stuff like that, which I now refer to as "Bob's Tred Mill." There's some good things about these, and some things that make me crazy, but one thing that especially made me crazy is they felt significantly faster than the old Precor ones I was used to. It's definitely a real thing that treadmills are sometimes not calibrated correctly (or the tread stretches out or slips, etc.) but it was also possible that being sick set me back more than I thought. The important thing is to get The Data instead of just The Upset Feelings so I was shopping for things like those hand-held unicycles that you can wheel around to measure how long things (like streets) are, as it does seem like the kind of device that I would own, looking at like the world's most accurate hand-held unicycle thing, and then I noticed at the last thing that most of them have a MAX SPEED of something like 10mph, which would not do. I finally had the brain-stroke that I could use a laser tachometer to do it, since these have a max speed more like 99999 RPM. So I measured the tread length with some chalk marks and put reflective tape on there. The treadmill will go at different speeds when loaded (running on it) vs unloaded, which also depends on your weight and stride and stuff a little, so you also gotta engage in the dexterity-testing act of measuring while running on it, which looked like this:
POV: You are me
Pointing the laser at the reflective tape dot (visible right next to the laser dot here) as it flies by while running kinda fast is definitely tricky, although I must say that it was one of those times when I thought, "I've been training my whole life for this!" and you can see that I'm showing off a little bit here by also photographing it at the same time. But you are not impressed since it reports 0 RPM. The nice thing about the tachometer is that it only needs a pair of observations to give you a frequency, and you can easily tell if you missed the tape, which you do often on account of the shaking, because you get some integer multiple that's way off from the right answer. Anyway I dutifully took multiple readings unloaded and loaded at (nominally) 6mph, 7mph, ... 12mph and made a spreadsheet with all the results converted, and... found that the treadmill is just about 1% too fast loaded, all across the board. This would be just 3 seconds for a five-minute mile, which is not nothing, but it definitely does not vindicate my Upset Feelings (I was thinking it felt more like 10%). My best guess is that the old treadmills were (all?) actually too slow, which is annoying because now I doubt some of the unofficial 5k records I painfully set for myself during the summer. But, well, the thing about endeavoring to do challenging things is: No Cheating!
In project news, I feel I have a foothold now to get myself out of this math hole, as I've finally migrated this algorithm to work only with 64-bit integer arithmetic and so I can port it to GPU soon and then be out of ideas about how to make it faster. I have no idea if there's a good story to be told for this project, but I'll try (and also, it is okay if sometimes the hobby programming doesn't lead to a video or Sigbovik paper, you know?). And speaking of Sigbovik: Heroes have emerged quite on time this year, so it's certainly looking like there will be a proceedings and conference (perhaps with livestream), so start writing those papers now.
Aside from the math hole, I've been making some progress on two other concurrent projects. It's getting normal again (even quiet) at work and winter break is coming up, and I'm looking forward to having some several-day stretches to work on them.
I played through Golf Peaks (well, I haven't beat all the bonus levels yet but I've been working back to front so it's just a matter of a little time at this point), which was a very nice little puzzle game that does almost everything right. Other than the very irritating music in one world, I think my only disappointment was that it doesn't elegantly handle infinite-length puts. I'm also still working on Return to Monkey Island, which I do like, although it doesn't hold up to my memory of the first two. I think one of the problems with modern point-and-click adventure games is the voices, actually: Not because the voice acting bothers me, but because it goes so slow compared to reading. It's like when you just want to figure out the maximum speed of the hand-held unicycle and they're trying to get you to watch a video instead of just reading. Tears of the Kingdom (which I'm still savoring, but getting close to the end now) does a good job with this; you do hear snippets of voices, which helps with the characterization, but you can blow through the dialog at a pretty fast pace. Probably a lot cheaper, too!
Wow, this month sure went by fast. I'm sure I say that every October, as this is the busiest time of year at work, and stuff like football and Maybe The Last Nice Day This Year keep me busy.
I've been plugging away at this math/programming project, currently porting some numerical code that I don't fully understand and finding bugs in it and improving its performance. It's relaxing, at least, but there's nothing good to share here yet and I'm not sure it'll ever make an interesting story. I did make some version-2 circuit boards for a project I've been working on in parallel, too, but the next step in that one is going to be annoying ("Why won't it boot?") so I've been putting it off.
They brought the small neighborhood race called "Run Shadyside" back this year. This is a 5k course that I can easily walk to the start of, and Shadyside is about as flat as it gets in Pittsburgh, so it's a nice race to try to PR in. I've been keeping in pretty good shape (despite the setback due to illness mentioned previously), but that morning I was having some burning lungs so I didn't push myself too hard. (Could have been mold? Bad air quality? Slightly sick?) I finished in 20m19s, which is probably my third best official 5K time, although a bit disappointing since I ran several unofficial treadmill 5Ks under 19 minutes this summer. I finished 3rd in my age group. The results feature a new capitalization of my name, the elusive Stegosaurus CasE: "Tom Murphy ViI"
Craving a game that would make proper use of the GeForce 4090, I installed Call Of Duty: Cold War. Actually this game is a couple years old, and graphically it's not anything particularly special. I am liking the single-player campaign more than usual for these kinds of games, and avoiding getting sucked into multiplayer. I gave the "zombies" mode a shot and I think I finally understand it, like playing a roguelike on a single seed. I think I'm at the point where I need to set myself some kind of challenge and complete it and retire to more artful things, though.
Hello and howdy. I usually describe myself as turning the "ripe old age of so-and-so" on my birthday posts, but I may need a new adjective as I'm solidly in my mid-40s, now (44). Perhaps "fermented." The birthday's come and gone without incident, although there were minor contemporaneous incidents:
Still in the math hole. It might be an infinite hole. Trying to get out. But I have improved my console fonts and ANSI color libraries and GPU programming skills, at least. I was very pleased that a recent release of NVIDIA drivers came with a brand new updated OpenCL, which I previously assumed had been abandoned like so many computer things that I become fond of. Kudos to whoever at NVIDIA pushed on this. I am making myself laugh privately to myself (well, no longer private now) by imagining someone who spells it out like an acronym, N-V-I D-I-A.
Also, like usual, I ran the Pittsburgh Great Race, a mostly-downhill 10k. No encumbrances this time. I've been in good shape this summer, but I got sick last month and it set me back a bit, so this wasn't a star performance. Still 43m22s is not too bad and I didn't push myself all that hard. Fewer minutes than years old.
The new GPU is mostly for math, but I wanted to try it out for its Intended Purpose, (N)Video Games. So I played through Far Cry 6, which was okay. I liked it better than 5, which among other things had a bunch of technical problems (this one was much smoother and more stable), but I probably should have read my review of that game before downloading, as I say something like "I should probably stop playing this series." Still slowly savoring Tears of The Kingdom, which remains great. I also started Return To Monkey Island. I loved the first two in this series, but couldn't get into the later sequels; of course I'm interested in giving this one a shot since it's made by the original designers (and I did like Thimbleweed Park). Too early to render a verdict, but I did like how they deftly handled the canonicity of the end of 2.
Then there's this: I think this is Taylor Swift wearing a homemade t-shirt of her "Pegicorn" (sometimes "Pegacorn"), a Unicorn-Pegasus hybrid. The text is in my font Action Jackson:
Taylor Swift Pegicorn (Action Jackson font)
You can also see this drawing/font at the beginning of the "Making of" video for You Belong With Me". I think she posted this to twitter in May 2009, but somehow I'm unable to find an archive of her tweets from this time (inconceivable??).