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

SIGH.

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 archive.org. 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.