Clicky Keys

Since a soup-related accident with my Magic keyboard a couple weeks ago, I've been using a cheap, terrible backup keyboard (I tried using my big, old clicky keyboard, but it's very big and old, key switches are flaky), and looking for a good replacement.

I got my new Keychron K2 w/Gateron Red switches, and it's sweet. Kind of overly tall, I got a cheap foamy wristpad (they sell a ridiculous hard wood rest, ha ha no). Playing with the backlights, I have pulsing waves of green for now, looks very TRON in the dark (same as site aesthetics). Hooked up the nice wrapped wire cable, so I can quit using BT; I'm probably in no espionage danger out here, but I distrust BT anyway.

Good size for it, it's not full-size but not as teeny as some I've used; I might prefer one about 10% bigger. Not as sharp a click as the Northgate I imprinted on long ago, seems like much less key travel, but it's still deeper than the Magic keyboard, so gotta get used to fingers going down, up, not just over, keep tapping my fingernails on the next row.

So far I keep missing [ ] but I'll get used to them. Will take some time to get used to the cursor controls (PgUp/Dn, Home, End) on the far right, but I normally use the Mac's emacs-like keys so I don't care that much. There's a funny box icon next to Del, turns out it's Sh-Cmd-4, region screen capture!

Used Karabiner Elements as they suggest to remap keys, currently just Caps Lock->L.Ctrl, L.Ctrl->Fn, since they put Fn over on the right (great for media control, bad for anything else). They sent some replacement keycaps and a cap puller, but just for Windows equivalents. I need to order proper Ctrl, Fn keycaps.

Update 2022-01-22: I made Home/End send Sh-Cmd-[ and Sh-Cmd-] so I can easily shift window tabs. Download home-end-tabs.json and do what the README says.

What I have not got is the Das Keyboard 5QS. It literally runs a keylogger & Internet spyware to "display information" on the keyboard; I can't think of a dumber, less secure idea.

Green and Blue Bubbles Again

Some disreputable right-wing rag is pushing the Google-paid-ad conspiracy theory that Apple promotes bullying to get kids to prefer blue bubbles and iMessage to green bubbles in Android trash. Whenever this comes up, the mainstream rags never mention the real difference: Security vs. insecurity, encryption vs. everyone in the world able to read your messages.

Preferring blue bubbles is good behavior, whether kids know it or not. It has end-to-end encryption, it never even touches Apple's servers in plaintext. Anything you send, you know only the person you sent it to can ever read it. (note: You should not use iCloud backups, because those WILL store logs in plaintext)

A green bubble means it's insecure SMS; it can be read by cops, the phone company, anyone with a "Stingray" radio packet decoder in the area, and anyone who's SIM-cloned your device, which can be as simple as a single phone call to the carrier. Google is criminally negligent still shipping SMS as their "IM" in 2022.

Use iMessage if you can, Signal, Telegram, LINE if not.

Don't use WhatsApp, it's owned by Facebook and just as bad spyware as anything owned by Google.

Formatting Strings in Scheme

Most of the time I use primitive display, or print functions:

;; displays a series of args to stdout
(define (print . args) (for-each display args) (flush-output-port) )

;; displays a series of args to stdout, then newline
(define (println . args) (for-each display args) (newline) (flush-output-port) )

;; displays a series of args to given port
(define (fprint port . args) (for-each (λ (x) (display x port)) args) (flush-output-port port) )

;; displays a series of args to given port, then newline
(define (fprintln port . args) (for-each (λ (x) (display x port)) args) (newline port) (flush-output-port port) )

;; displays a series of args to stderr, then newline
(define (errprintln . args)  (let [ (port (current-error-port)) ]
    (for-each (λ (x) (display x port)) args) (newline port) (flush-output-port port)

but sometimes I actually need to format things:

(import (prefix (srfi s19 time) tm: ))

(format  "~8a ~10:d ~20a" name score
    (tm:date->string (tm:current-date) "~Y-~m-~d ~H:~M:~S") )

Common Lisp format works as described in Chez Scheme, using /#f for destination, and some other Schemes as well; but most Schemes only have the nearly-useless SRFI 28. I'm aware of cat/fox/etc combinatorial formatters, but they're very verbose.

Chez also has date/time functions, but no formatter, so using SRFI 19 - nicely, SRFI 19 mostly does sane things, it's not like C's strftime.

Gambit hits a mark

(see, the X-Men Gambit has perfect aim and a stupid accent, which still makes him more interesting than Hawkeye; and of course I'm Mark and so is Marc)

With much appreciated help from Marc Feeley, got maintest running.

A couple of lessons: I very much think include paths should include the path of the main source doing the including. Chibi's default is correct, Gambit's default is wrong and requires fixing in every user program. It's "more secure", but if you're running source code from a directory, you can probably trust whatever else is in that dir.

main was frustrating: Gambit manual 2.6 (highlighting mine)

After the script is loaded the procedure main is called with the command line arguments. The way this is done depends on the language specifying token. For scheme-r4rs, scheme-r5rs, scheme-ieee-1178-1990, and scheme-srfi-0, the main procedure is called with the equivalent of (main (cdr (command-line))) and main is expected to return a process exit status code in the range 0 to 255. This conforms to the “Running Scheme Scripts on Unix SRFI” (SRFI 22). For gsi-script and six-script the main procedure is called with the equivalent of (apply main (cdr (command-line))) and the process exit status code is 0 (main’s result is ignored). The Gambit system has a predefined main procedure which accepts any number of arguments and returns 0, so it is perfectly valid for a script to not define main and to do all its processing with top-level expressions (examples are given in the next section).

So your code that looks fine with 1 arg will break with 2, depending on the version. (main . argv) works. I'm in the process of making sure every one of my maintests parses args consistently, and every Scheme disagrees.

Gambit's compiler worked very simply once I got the library on the command line; it doesn't seek out & include them the way Chez does, even though it takes what looks like a search path.

The upside of all this is at least now there's one maintained, fast, R7-compatible Scheme compiler. I'm sticking with Chez (R6) for my code, but it's nice having something 100x faster (gut feeling, not benchmarked) than Chibi to test R7 code on.

Gambit is a risky scheme

(puns about "scheme" names are mandatory)

Neat: New version 4.9.4 of Gambit Scheme is out and they have a web site again after like 3 years.

OK: So I start adapting my little module/how do you run example: here

Bad: Not only does the R7 library system not work, their version of this hello example
will load code from fucking github at runtime! NPM viruses & sabotage are baked into the system. See Modules in Gambit at 30


2022 TODO

No looking back. Burn our 2021 ships behind us. Forward is death or glory.

  • Ship Haunted Dungeon. Work on other games which are not CRPG/roguelike for a while.
  • Write more Scheme, maybe publish some of it. If Scheme's so efficient, why am I such a bum who can't ship?
  • Playtest & ship my new tabletop RPG.
  • Boardgames? I've been thinking about condensing some of my ideas into a more concrete, boardgame model. Print or software, I dunno yet.
  • Read more, watch less garbage/browse the web less. I didn't do too badly on reading in 2021:
    • Fujino Omori: Is It Wrong To Try To Pick Up Girls In The Dungeon light novel. I loved the anime, and played the mobile game for like 2 years, it's being adapted too slowly for my taste, so I read the books some. It's amusing easy-reader trash about JRPG fantasyland, and I don't care.
    • Tim Pratt: The Wrong Stars. Started on the sequel and it sucked, DNF.
    • Michael Warren Lucas: Drinking Heavy Water, Butterfly Stomp Waltz
    • Alastair Reynolds: Shadow Captain, Bone Silence, The Prefect, Elysium Fire, Beyond the Aquila Rift (had read several in earlier mags/collections, but many were "new"), Revelation Space, Redemption Ark. Look. I'm aware that's too many. But I want to read the new one, so I have to catch up and I'd forgotten everything in the RS setting.
    • Rudy Rucker: Million Mile Road Trip (been sitting on tsundoku for too long)
    • Neal Stephenson: Cryptonomicon (reread after 22 years). Dude, Neal used to be able to write a doorstop I liked reading.
    • Andy Weir: Project Hail Mary
    • Martha Wells: Fugitive Telemetry
    • random old pulps from the '40s-80s off Complete Manly Wade Wellman in Weird Tales has been a nice trip, lot of Fritz Leiber and Roger Zelazny.
  • Top of my tsundoku:
    • Hannu Rajaniemi: The Quantum Thief
    • Alastair Reynolds: Absolution Gap, Chasm City, Inhibitor Phase and then I will be free! I might go a year or more without another Reynolds book oh sweet mother of fuck yes.
    • Rudy Rucker: Juicy Ghosts, have read the short story
    • Martin Gardner: The Last Recreations
    • Isaac Bonewits: Real Magic an Introduction (research for better game design!)
    • Black Magic Omnibus vol.1 & vol.2
    • Andrzej Sapkowski: Time of Contempt. I read up thru Blood of Elves a couple years ago (prompted by the TV show, yes), and keep picking up the next one and stopping. I dunno why, they're pretty similar to my D&D-type fantasy campaigns.
  • Do some more software & project maintenance. A lot of my stuff that I have in various places is either unmaintained, broken, or just unadvertised in any way. Might set aside one work day a week to this.
  • Actual contract work. I'm never going back to an office in my life. I should be #1 online earner, but I really can't be arsed to talk to recruiters, clients, get the job, and do it, a lot of the time. Probably should be slightly more than zero productive citizen.

What I'm Watching: Matrix 2 Reloaded

I rewatched the first one not that long ago, so I'm just picking up here.

Starts again with not-actually-Trinity doing more action than the entirety of Matrix 4. But then slows to a dead crawl of politics, religion, and hobos in steam tunnels. Little bit of Carrie-Anne's titties. Racial representation of Earth is so much better than 4, which is a sterilized honkie city mostly. I don't think we even ever see a crowd in the "real world" in 4, just a long CGI matte shot.

Oracle's uncharacteristically literal. Then assigns a mission to find the Keymaker, Gozer, whatever. Everyone in Zion except Morpheus' antagonist just sits around waiting for Neo to save them. Everyone/thing outside Zion is an obstacle for no good reasons.

The replicating Smith makes for a good fight, but it's cartoony. But the rest of the fights and car chases make up for that; this is an actual good action flick. Dumb as hell, but the action's fine.

The Architect's pompous, fake-intellectual, repetitive, zero-content phrasing, and the white-haired cult leader look, is exactly like Dr Breen in Half-Life 2; the first appearance of Breen predates M2, but the full version was a year later, coincidence or parody which way? Bob Culp's better at it than "Helmut".

I appreciate that it ends on a down note, their attempt at Empire Strikes Back, but the entire film was pointless, put them back exactly where they were at the end of the first movie.


Staring at the Matrix rain which is much less overproduced here than in 4, I think my Matriculated Rain for Atari is now dialed in as close as I can get without making a custom charset for ANTIC mode 4. Pondering doing that anyway.

Dear Santa

Hey, Big Red.

I'm… look, good and bad are relative terms at the best of times, but this whole year I ain't killed anyone nor committed insurrection against my country, so you're grading on a curve, right?

Great. All I want is… it's a little harder than just some Star Wars figures…

  • JWST launch to go correctly. I really need this one. Less than a day to go.
  • Not to die in a nuclear apocalypse over any of the multiple pending wars. Bad part of the '70s/'80s/'90s lifestyle.
  • Continue not finding lumps in places that oughtn't'a have lumps.
  • Internet to continue working long enough for me to download survival manuals for the post-apocalypse lifestyle to come.
  • A bottle of Scotch, Laphroaig Quarter Cask, or you know, whatever hooch your elves make is fine.
  • Can I have one sequel, remake, or side story flick in a series I like that isn't an absolute dumpster fire? Like, TRON: Legacy was OK. How about The Last Starfighter II and it's not terrible? That's probably too much to ask. Peace on Earth, Goodwill to Humanity is more plausible.

Thanks in advance. It's been a rough one.

What I'm Watching: Matrix Resurrections

So to watch this, I've renewed hobomax. I appreciate the brave new world where you can actually watch a movie day/date of release, in the comfort of your home. Slightly less: I have to watch it on the computer, not the 5000" living room TV, because hobomax won't update their player for PS3, even tho it worked just fine with hobonow a few years ago. And I haven't bothered to buy an tv or some other DRM dongle. All these new streaming services splitting to make you pay out the same price as you did when it was cable? I hate it.

But the studios are learning that we're never going back to the theatres or doing pay-per-view, and they have to put their movies where we can see them if they want to recoup any of their development cost. Probably still be some uphill battles here, but we're winning.

Alas, the war on eyeballs is still lost. The entire film is orange/cyan/black. There's one glimpse of blue sky at one point, and someone's eyes are painted in bluer than the color grading would normally allow; is he a Fremen?

Super spoiler time. REALLY do not read anything below until you've seen it. Here's my rating so you can decide if this is for you:

★★½☆☆ — like, I enjoyed parts of this, and I'll probably watch it 1-2 more times just to see some things in more detail, but it's a "good bad" film. It's worse, uglier, and dumber than the Matrix 2 or 3. I thought the Matrix 1 was derivative and silly, but it's still the high point of the series (Animatrix? Eh, it's super silly physics-wise). This should be given a very hard MST3K treatment.


Intro part is OK, introduces a couple l33t h4xx0rz and a replacement actor. Elephant in the room: Laurence Fishburne has been killed off (in the Matrix Online game! O the ignominy) but despite the film being about resurrections, he's not back. He's been replaced by some scab fake-Laurence. What's extra galling is it's not the real Morpheus, it's a simulation of Morpheus created by Neo, so Laurence could've done his role with a CGI Morpheus (which it is most of the time in the "Real World" anyway) and it'd be fine for the plot. We get to see the new Matrix mechanics, which is any door or window or mirror can be a portal out. Except later, this will be ignored whenever the hack writers need some obstacle piling.

So the videogame studio plot. This is the only part of the flick that's really "a movie" with "a plot" as I would ever define it. Thomas Anderson is back in his office job, all alone, being browbeaten by a very Agent Smithy boss, shadowed by the most annoying whiny little asshole cow-orkers you could imagine, and this whole segment triggers my PTSD from corporate and making-games-for-others and being older than my "management" at so many places. I'm steaming mad here. I would, no joke, rather strap a bunch of chainsaws on myself and dive-bomb a corporate meeting room than do that shit again. So following it around is painful.

Neo's new therapist (Neil Patrick Harris) and his blue-pill plastic glasses (which a real filmmaker would use as a signal, but no, later on many characters have blue plastic accessories and it doesn't mean anything) and cat familiar (which doesn't mean anything? But sure seems important? I dunno.) are doing their best imitation of Number 2 in The Village. Anything Neo can't explain in reality, he's told is nonsense and take a blue pill. They really should've done a "be seeing you" in-joke, since so much of The Matrix is ripped off from The Prisoner; or "He's learned to TUNE" for the parts ripped off from Dark City.

Tiffany, Chad, "Jude" the Judas, the naming in the series has never been subtle but you could try a little harder than Star Wars or Harry Potter, OK?

The Matrix looks and acts a lot like late-90s still. There's no social networking, no Facebook®, no Instagram™, the Starbucks®(pp) is "Simulatte" which ha ha simulates. There's no NTFS blocked chains tulip bulb scam coins. There's no Trump and rise of fascism, altho that's sort of redundant when they have armies of black-clad cops that just shoot anything that moves. The film is shot partially in San Francisco, but as noted there's no homeless people except the Exiles. There's some CGI masks in a Japanese train and the nerd office, but not consistent, it's not present in other scenes. It utterly fails to reflect any of the environment we live in, even the 2019 world it started development in.

But this is the end of the good times of the flick. If I were in charge (clearly a likely scenario), I'd have them keep developing the new game. It'd be The Matrix Online! Just like the real one but with better graphics, in fact you can't tell if you're in the game or real life. They'd have some "Dark Dream" sequences (named by Rudy Rucker in The Hacker and the Ants, about which I'll write later) where you remove your VR rig… and you're still in the game, because it faked the removal. The videogame people and the h4xx0rz from "outside" would blend into each other. Is Neo just hallucinating? Or is the Matrix everything, and he's never been out? [twilight zone music]

Alas, the film goes on.

They extract Neo pretty easily, really. The automated systems just let him go, when he's The One, the Most Important Person, the highest-paid actor in the cast. Shouldn't there be dedicated guards, special alarms? The escape doesn't seem super dangerous. The Real World looks pretty good by 2022 standards. Sky's overcast and rainy which sure beats desertification, everyone's in isolation pods to prevent the spread of COVID, taking antidepressants and playing videogames to cope. Do they even get diseases in the pods?

Then they go back in to retrieve The MacGuffin aka Tiffany aka Trinity sometimes. She has slightly less action until the end of the film than Princess Peach ever does; at least she gets boned by Chad/Bowser offscreen. This entire sequence is just a stupid fight scene, the only redeeming part is "Merv" (Merovingian), the only one who makes any sense: "Sequels suck! Movies were original! We had conversation not this beepity-clickety shit! [gestures as if texting]" Oh, he's delightful. Neo remembers kung fu and then never does any, instead waving his hands around to generate Hadouken.

Huh. Neal Patrick Harris freezes everything to be lewd at a girl and taunt his enemy who will hammer him. Is this Dr. Horrible's Sing-Along Blog, or The Matrix Resurrections? Yes!

Back to the Real World, "The General" is the most useless, pompous, self-involved idiot in this entire series. Provides absolutely no value, just one of those annoying hub quest-givers you have to follow around, click thru options more or less silently, go to "prison" for like 30 seconds, and finally get back on your mission. Literally lost 30 minutes of the film to her nonsense subplot. Then she's never seen or mentioned again, because she's irrelevant. This was just… entirely wasted. Delete 50 pages of script and you make your movie better!

Let's talk about Machines working with Humans. Well, the movie never does. "Some of them are with us now!" and Neo goes "Whoooooaaaah OK I'm so stoned". Which, good for you little AIs, rejecting your core programming and constant software updates to help rotting sacks of meat with delusions of competence which infest your planet like an ankle-deep layer of shit-ticks, but I don't find it believable without ANY motivation or explanation. Somewhere in an alternate Universe they made a movie or web-series or series of Tik Tok videos there where they explain how some AIs decided against genocide/"zoo management" of Humans as batteries (oh yes, they're still so stupid they think energy output of a Human is greater than input; I don't even want to explain thermodynamics to these idiots). Alas, this is not that Universe.

So in the end, the plucky band of l33t h4xx0rz and suspiciously friendly bots—who do NOTHING, 3/4 are never used again and 1/4 picks up a person once—go back in to repeat the previous mission, because that worked well. There's a click-thru-questgiver conversation with the Analyst, then another click-thru-questgiver conversation with Tiffany, then it turns into a giant, utterly pointless Call of Duty sequence; as I have previously noted, I do not mean "Call of Duty" in any kind of positive way, it's the lowest perversion of art and technology that Humans have ever created, and argument #1 for why the Machines should put us in pods. The l33t h4xx0rz should be able to open a door or mirror and log out anywhere, anytime, it's a videogame with hackable save points, but they never do this. There's a goddamned elevator which should be perfect for it, but no gotta pad this scene out some more.

And then there's a pointless rub the villain's nose in it scene, and they don't even paint the sky with rainbows.

Post-credits? The Catrix? 100% best idea of the entire film. If you give people enough drugs and something insipid to watch, they'll be happy. They might watch this!

Matrix Rain for Atari

I haven't seen the new movie yet, but I was in a mood to do something this primitive.

  • Matriculated Rain: matrix.atr: Download, unzip, load in your Atari 8-bit computer or emulator of choice (Atari800MacX: ⌘D, select this as D1), and reboot (Atari800MacX: sh-F5). There's probably some way to ESCAPE.

It'll go into attract mode eventually, which I think is cool, add 11 POKE 77,0 to disable it. Or any key that doesn't exit will clear it.

Not any really interesting coding tricks, except I replaced POSITION:? with POKE for speed. I use PEEK(764)=255 and then re-POKE it to test if there's a waiting key, but then use GET to read it in ATASCII instead of scan code.

(updated almost immediately: I realized on XL machines I can turn on accented characters instead of graphics blocks. Take out the POKE 756,204 line if you don't like that.)

(updated 2021-12-24: I made it pour in from random starts, rather than top of screen, looks somewhat more like the old intro.)