HP Lovecraft's Xenophobia

It occurs to me after a number of rereads (now up to "Dagon") that Ruthanna and Anne there live a callow, sunlit, happy existence, don't really know much of the world, and have never read a history book. "He was as wrong about humanity as it’s possible to be without actually believing that we’re all sessile pebbles"1: No, he was not.

World War I, which informed most of Lovecraft's despair at Human stupidity and imminent extinction, was then exceeded by World War II in every kind of atrocity, and that was exceeded by the Communist states during the Cold War and beyond. There is no depravity or horror to which Humans will not sink given power and the ability to "other" people. "Kindly, liberal, crippled, New Deal" FDR imprisoned and robbed 120,000 Americans of Japanese ancestry; the Tuskegee syphilis experiment treated Black people as test animals. The KKK was still terrorizing and lynching in the South (still is, if smaller). It's still unsafe to walk or drive or stand around in Starbucks while Black in America. Immigrants and refugees are treated like unwanted vermin in every country. Humans murder each other over minor differences in skin color, birthplace, language, or what name to call some fairy tale god (or for saying it's a fairy tale). No joke, Humans blow up other Humans over cartoons of their prophet. Half of Americans voted for the Cheeto thing that squats and defecates in the White House.

Any notion that Howard's xenophobia is excessive for his time, or even now, is just delusional. He was an asshole about race, and perhaps about gender (very scant evidence, from a time when few male writers wrote women except as objects), but the distinction is that he was more literate and expressive of his bigotry, while the assholes next door just couldn't write about it coherently. If he'd been into politics, he'd have been the William Safire of his time. Somehow he found his way to the weird tale instead.

So when his narrators see the real owners of the Earth, and they're nothing like Humans, of course they flip out. What are Humans going to do when confronted with fish-frog-humanoid things, unspeaking but greater in intelligence, ancient and undying, worshipping gods (or godlike aliens) who provide true power? As in "Shadow over Innsmouth", bombing the Devil's Reef is a minimum possible freak-out. Somehow they pull back from provoking a full-out war with billions of living demigods, and the Deep Ones (being our moral superiors) are uninterested in great conquests of the land.

Howard does have characters who don't flip out at the alien, like the narrator and some other abductees in "Shadow Out of Time", but then when he's confronted with the truth of our imminent doom, he loses it.

I am extremely pessimistic about First Contact, and I expect that true AI will end very very badly for Humanity. Nobody's going to show up and say "You're totally ready to join the Federation of Nice Planets!"; we'll either meet Conquistadors, exterminators, or if we get to a lower-tech species first, victims. Ideally, alien contact would unify Humanity, but more likely every group will seek their own advantage and agenda.

As for the reread, I'm switching to publication order, then see if they or someone else has any commentary for a story. I've previously read some of ST Joshi's annotated books, but his apologies and delusions are just as annoying.

A Funny Thing Happened on the Way to the Forum

The movie has something for everyone, a comedy tonight, but I'm actually talking about:

Blogging is sometimes very different from "social networking", and one of the key things is that there are no private conversations. On the technical side, that's basically impossible: A blog post is public, or it wouldn't show up in feed readers, search engines, or micro.blog. And even "private" messaging in Twitter or Facebook is stored in plaintext on the server, where the staff can read it for laughs or social engineering or selling you to advertisers and Russians.

In the socially stunted worlds of Twitter or Facebook, often someone posts, and the first person to respond may feel like they "own" the conversation, anyone else responding is a "rando", and the lack of proper threading makes conversation very difficult so they just hate everyone. There is, I fear, not much that can be done for many of these; they grew up feral in an innately hostile environment, and won't or can't read about how to have longer discussions. Robert's Rules of Order this is not.

Blogging is about people contributing to a public dialogue. As we had in web forums, or USENET, or college dorm halls, or actual forums going back to Rome and ancient Greece. Threading and arguments about ideas are not just OK, but encouraged, just don't hit below the belt.

You may be able to learn from USENET netiquette (somewhat old link, but anything quoting Eugene Spafford is good).

When being sarcastic, if there's any danger of misinterpretation, use a smiley. Excessive sarcasm is often counter-productive and hurts people's feelings, even when it's unintentional.
—a rule I sure don't live by

New Phone Who Dis?

Dealing with my aging iPhone 6 and iOS 10, and even older iPad 3, was getting on my nerves, so I got a new "space gray" iPhone 8+, 256GB.

I considered the iPhone X, but after doing some maintenance on my apps, I loathe coding around the notch, and I loathe the way it looks. Chris Pirillo had some thoughts and followup that echo mine. Chris has since gone to Android, which to me is like eating only Soylent Green because you once got an undercooked meatloaf; overreaction isn't always wrong, though.

I would prefer the SE form factor, but I don't like a years-old hardware platform. And if this is going to be my only iOS device, I should get the biggest one possible so I can use it as a phablet. It's not like I ever hold a phone up to my ear anyway, it's either on speaker or headphones (dual speakers in the iPhone 8+! But USB-C headphone dongles ?).

The device arrives, and I go to set up, and immediately hit a roadblock: I can't access my iTunes backups. I've used them to recover before, but now I have no idea what the password is, and it's not any of my previous device passwords. Well, now I'm boned. Had to upgrade iCloud and backup to iCloud, which doesn't preserve on-device logins or the actual apps. Many hours later (slow asymmetric bandwidth), it's done.

Restoring the phone from that backup wasn't bad, but now I have a blank phone with placeholders for every single app, which I have to tap on, wait for it to spin and decide "keep/delete" if it's not 64-bit, or paradoxically tell me to buy the app if the app is no longer for sale. And then for every app, go in and restore purchases if it has any, login if necessary, etc. I didn't set Downcast to archive all podcasts, so it had to sit there for hours downloading the last 2 eps of dozens of podcasts.

At this point, let me say: Going 64-bit only is the most user-hostile, art-destroying thing Apple has ever done, and it SUCKS. All of Llamasoft's and CAVE's games are gone from the App Store, and were 32-bit. So I can still play them on old dying devices, but that's it. I miss Gridrunner and Deathsmiles. Atari Greatest Hits is still updated, and works perfectly; Activision Anthology is not, so no Pitfall! Midway Arcade is gone. Lost Treasures of Infocom is lost.

Apple's actually fucked up in 3 ways here, by not supporting 32-bit with an optional API download, by not providing legacy download of apps, and by making the App Store a toxic race for the bottom by EA and other literal motherfucking mega-studios, so no independent developer can make money except the 1 in a billion jackpots. I'm not advocating leaving for Google Play, because that's even less profitable, it's just open theft. I'm advocating burning down the entire system and starting over. But for now I'll take my Big Brother-issued gruel and pretend to enjoy it.

That was most of day 1 before I could do anything with the phone at all.

iBooks is a special level of Hell. It's the shittiest-written app Apple's ever released, syncing barely works at all, downloading is flaky and eats the main UI thread. So I'd go Purchased > Books > Not on this iPhone > All Books, which actually shows maybe 20 books and then stops listing them, then click the download arrow for the 5-6 items visible, then the UI would lock up and I'd have to wait for 5-15 minutes for it to finish. Then once I had all my books, they weren't organized correctly anymore, which is I guess my fault for having slightly different setups on iPhone, iPad, and Mac. So I went full-on librarian. Protip: Disable 3D touch in Settings, because the 3D touch in iBooks is useless and makes it impossible to move books. I spent a good 15 minutes struggling with this before I learned. So here goes most of day 2.

ibooks-hell-1 ibooks-hell-2
ibooks-hell-3 ibooks-hell-4

Taking those screenshots reveals a new screenshot UI, which PISSES ME OFF: iPhone demands that I triage or edit every screenshot immediately, sitting in the corner of the screen like a Jony Ive dog turd. I don't see any way to turn this bullshit feature off.

Additional stress comes from my entertainments: The ESO Jester's Festival was all weekend, which I grind for items worth a lot of gold, but had to spend most of a day tapping thru my phone and then looking back to the game.

And at the same time, Animal Crossing: Pocket Camp has two events running, a Mario anniversary crafting thing, and a gardening event. Happily I can still clear these in bed, in the bathroom, or while out, but having my phone be busy downloading books interferes with that.

I know, "do something useful, Mark", but really, games are supposed to be what recharge me, not extra stress.

I still haven't loaded my music onto the phone. I have enough space now for a good portion of my music library, instead of only the highest-rated curated lists. Yes, I still have a music library, so when I'm away from wifi, I can listen to music without burning thru my data cap. Ha ha suck it streaming-only kiddies. But I could also just take my iPod classic out, which has everything, but Apple doesn't want you to have nice things like that anymore.

As for the hardware:

The size is preposterous. 158.4mm x 78.1mm x 7.5mm, 202g. The old Palm III was 119mm x 81mm x 18mm, 160g, and the LifeDrive aka iPod touch 5 years before the iPod touch, was 121mm x 73mm x 19mm, 190g. I thought the Palm devices were almost too big for a pocket, but this is a big goddamned thing.

The screen's nice, bright, and rectangular. No fucking around with maybe-unusable areas at the bottom and top, just a big canvas for software to draw on. I can see the time, battery, AND phone signal at once. I can't really use it one-handed all the time. If I cradle it at the base of my fingers in my left hand, I can barely reach the other side of the screen with my thumb. I treat it more like the iPad already, set it down on a table or my leg and work on it.

The glossy case is irresponsible vanity. It should have a matte, grippable back, not be a perfectly-smooth, sliding-onto-concrete frictionless surface. FUCK Jony Ive and his obsession with things that look like nothing, and suck to actually use. I guess I need to find a new sticker-backing or very thin case for this. I don't want to add bulk.

Home button has a VERY satisfying haptic click, it really feels like the entire front of the device is pivoting down about 1mm, even tho it's solid glass. I do use TouchID when I'm somewhere safe, tho I'd disable that if I was travelling; I don't want the pigs to force me to unlock my device.

I haven't done any real photography with this phone yet, but the giant 2-camera hunchback is supposed to be quite nice.

Current setup, which will probably change again soon. Elric covers were just convenient, but the text under the icons doesn't look good, so I have to change that soon. You know what I want? Custom wallpaper per desktop, like we have on Mac OS X.

iphone-2018apr-1
iphone-2018apr-2
iphone-2018apr-3

Post-Facebook Microblogging

So, you've deleted your Facebook, Twitter, and Google accounts and all of their apps, right? Where do you social?

First, I'm the most technical boy in town, but you don't have to be for any of what I'm going to tell you. This is all fairly easy, even for a normal Human.

Second, you will have to learn things. You'll need to set aside a day or two to read, make decisions, go look terms up. I know learning is hard and scary, but go look at a motivational poster and do the thing:

I am a tiny cactus and I believe in you. You can do the thing!
original

Third, I'm on Mac and iOS; I have complaints with current Apple, but it's still the slowest-sinking ship. That said, you may be using Windows, BSD, Linux, or Android. Most of this is completely platform-independent, and there are some apps for other platforms.

Fourth, some of this costs money, up front for new software, and every month for hosting. As I have previously noted:

"If you are not paying for it, you're not the customer; you're the product being sold."
—Andrew Lewis

  • Search: So, first, set your browser to search with DuckDuckGo. Google is just as bad as Facebook. In Safari, hit Preferences ⌘, > Search tab > dropdown. In Chrome, Preferences > Search engine > dropdown.
    • Now anything you type in the address bar goes thru a search engine that doesn't track you. And there's neat tricks in DDG: Type "!w blog" to see the Wikipedia page on "blog". Type "!g porn" to search Google if DDG's results aren't good enough, tho mostly they are.
  • Blog. I'm using DreamHost managed WordPress, found a nice domain, paid, and was up and running in a few minutes (new domains take a few hours to appear everywhere on the Internet; but while you wait there's plenty of setup and writing to do).
    • There's other options, but whatever you do, make sure you have your own domain name; the WordPress.com free blogs are not bad, but the site is owned by Automattic, not you. Own your own thing, but it's OK to let someone manage it if you can move it somewhere else.
  • Theme: I went with the Twenty Sixteen theme because it looks most traditional blog-like. Twenty Seventeen seems to be more business-oriented. Try both, and other themes, and see what you like.
    • The side menus are a pain to set up: WP Admin > Appearance > Menus, then Appearance > Widgets to create a widget showing that menu. Ask me or someone else with a blog you like, if you need more help; this is all fussy, not technical just annoying.
  • Social: I'm currently using micro.blog (MB) for a social network. Register, choose the "I already have my own microblog." option, the RSS feed is the "Entries RSS" link on your WP blog.
    • Add some WordPress plugins: Micropub, Webmention, Semantic-Linkbacks. These let replies from MB appear as comments under posts, with avatars and names, just like you can see here.
    • You might want to set up WP to "Publicize" to Twitter, and Mastodon Autopost does the same thing for the Fediverse. Alternately, MB can be paid to crosspost to Twitter.
    • I use the MB iOS and Mac apps for posting quick items, or the web site (WP Admin > Posts > Add New) to post here. I'm editing this in the browser, because WP's "classic" editor is OK; I'm scared of the next-gen editor but I'll see if I like it.
    • MarsEdit has a better Mac editor, and posts to all sorts of blogs. But if I'm on the Mac, the web page is fine.
    • I'm still using Fediverse/Mastodon some, and I want that to become bigger and more widespread. But be aware that the site admins have a lot of power, and there's no privacy. I'm likely to set up my own Pleroma instance just for myself so I control my Fediverse activity, and I don't like Gargron's Mastodon tech junkpile/stack.
  • Photos: The MB app does OK at posting photos. Not great, I take photos with Camera+, edit, save, then open the MB app and click the photo button; the share action didn't work when I tried it, but I think that's an iOS 10 issue? Tap tap tap tap stroke tap turn-crank tap tap tap.
    • Sunlit is the other app from Manton Reece (guy behind MB), formerly for App.net (which we all miss), and now a general-purpose photo-blogging tool. I'm not really into it yet, but if I was photo-blogging a lot I would be.
  • Messaging: Facebook can read every message you ever sent thru FB Messenger. Probably not a person (but they can, it's just in a database any FB dev can read), but a program can know everything about you. DELETE THAT SHIT.
    • You can use Email for initial point of contact with people, but realize that's not secure, either. Use iMessage, Telegram, Signal, maybe LINE, maybe WhatsApp (warning: owned by Facebook, so they can still read the metadata of who you're calling), for safe, secure chat; these use end-to-end encryption so nobody, not the company, not the NSA, not a fucking advertiser, can read your messages.
    • Skype, Slack, and Discord are nice for public chat, but realize these are NOT PRIVATE. They have access to everything you send, and of course everything is hosted on their servers. IRC is a complex service, it can be made secure, but any public instance is not secure.
  • Reading: So if someone's on micro.blog, you can just follow them, and see all their posts, and reply/comment on their posts as if it was Twitter.
    • Anyone who hasn't joined MB, you need to find the RSS feed link on their site, and add it to a feed reader. I use FeedBin and think it's worth paying for.
    • Reeder is OK, and runs on iOS and Mac. I like it less than the FeedBin web interface, but YMMV.
    • There used to be a great Mac app called NetNewsWire. It was then acquired, killed, rewritten badly, beaten, chained up, and abandoned to die in a corner with only the rarest bug fixes. I do not recommend the current version in any way, total catastrofuck.
    • Brent Simmons has a new app in development, Evergreen, but the alpha requires High Sierra, and I'm still on Sierra. Still, I expect this to be a good app sometime.

That gets you independent, publishing, and reading posts again, without a scumbag owning everything you do. I'm sure there's a ton of other things you're going to miss, and if you've got questions, ask.

Apple Education Event

Being out of the Apple & Twitter bubbles, I didn't see anything about the Apple education event until hours later. At a rich private school, and more pushing the iPad and "pencil" (still $99 for a stylus) in education.

The LA school district fiasco and cheaper Chromebooks make anything Apple currently does an uphill fight, if not impossible outside of isolated environments like private schools. How do you get a public school district to spend more for iPads with a thinner but maybe better set of apps, if their underpaid, part-time IT guy with a Windows XP machine can't figure it out? What happens after the next LA-style fuckup?

The new iPad at $329 ($567 for 128GB, with pencil & keyboard case) is good enough to replace an iPad pro, so at least something nice has come out of this—my ancient iPad 3 is crashing often, largely from battery and memory problems. Or maybe I'll just get a new cheapo Linux laptop which is massively more capable, with a built-in keyboard that doesn't suck to type on. That's the fight Apple's got with anything they sell to a price-conscious market.

(Finished posting from my iPhone because my iPad 3 crashed while writing this. Should I expect the next iPad to last longer?)

Hypercard! The Software Tool of Tomorrow!

Encouraging people to write & submit new Hypercard stacks. Which, as a retro-tech challenge, I think is great. But. How about first having a decent modern Hypercard environment?

Why not? There's the classic John Gruber hit piece Why Hypercard Failed:

"Apple PR says it's a dead product so it doesn't matter if you like it! I like the Yankees who are also a bullshit PR project!"
—semantic analysis of all Gruber's posts produced this summary.

Stanislav (not a pleasant or generally useful person to me, but perhaps correct for once), had a different read of Why Hypercard Had to Die:

The reason for this is that HyperCard is an echo of a different world.  One where the distinction between the “use” and “programming” of a computer has been weakened and awaits near-total erasure.  A world where the personal computer is a mind-amplifier, and not merely an expensive video telephone.  A world in which Apple’s walled garden aesthetic has no place.

Apple did have a near-Hypercard tool, Dashcode, which was slightly more technical but not much; it auto-generated placeholder functions and you'd fill them in with JS and use local storage as your database. They never fully supported it, killed it, and pushed Xcode instead, which is like giving kids a backfiring nailgun with no safety instead of a plastic hammer. Now they're ludicrously trying to teach kids BDSM Swift with the lldb debugger repackaged as "Playgrounds". I feel so sad for a kid whose first experience of programming is 100s of "unable to satisfy template constraint" errors; that's some hard unyielding playground equipment there.

There's a few modern variants, but nothing I know of that works:

  • Uli Kusterer's Stacksmith is unfinished, has no binary download or web site, and the build instructions are very pro-dev. Last time I tried it I couldn't get it to build, so…
  • SuperCard is $180/$280. Ha ha… uh, no.
  • HyperNext Studio is based on RealBASIC, and is free, but rarely updated. Does not run classic Hypercard stacks.

So everyone just gives up and uses emulation, because making a new Hypercard is impossible. If you're going to do that, do it the easy way:

Twitter's Sweet Solution, You Are the Product Being Sold

Unshocking.

Acquiring Tweetie from Loren Brichter 8 years ago was one of the last user-centric moves Twitter ever made. They eventually let Loren go and immediately started a total rewrite, into a steaming pile of hot garbage that services the advertisers better. I tried the rewrite every so often and always went back to Twitterrific, both on iOS and Mac; even when the Twitterrific Mac app was years-stale abandonware, it was more usable. Killing the thing built on the corpse of Tweetie is a mercy.

The Mac has the CPU power & wattage to run web applications, mobile devices really don't, so you only truly need a native app on mobile; I waffle between writing new software for web or native, but practically the web has already won on the high-power platforms.

But that does leave everyone at the same point as 2006-8, when there was only the Twitter website and SMS, except now I'd be surprised if SMS worked. And the Twitter official mobile app is junk. And they're very obviously slowly edging towards revoking all API access, so only their mobile app works.

What I see from all the panicked screams is that these people delusionally believe that Twitter cares about user experience, that Jack runs a public charity for the good of all 4 billion people on the Internet.

You Are the Product Being Sold

"If you are not paying for it, you're not the customer; you're the product being sold."
—Andrew Lewis

Also:

"The Product of Television, Commercial Television, is the Audience. Television delivers people to an advertiser."
Richard Serra's 1973 short film "Television Delivers People"

Seriously stop and watch Serra's film; I'd forgotten just how accurate this is. 45 years after Serra's film, it's exactly the same situation, with three "networks" consuming the consumers: Twitter, Facebook, and Google.

Twitter needs to deliver their audience to their advertisers, that's the only way they will ever make a profit. They aren't here to be your friends, they aren't creating a global consciousness to spread Peace, Love, and the American Way. They want your eyeballs attached to the ads, and if it makes you miserable, nobody cares.

The Max Headroom pilot was about this exact thing: Zik Zak buys advertising from Network 23, because they can run blipverts, which prevent channel flipping. Blipverts explode the most slovenly audience members. Nobody cares, because the customer, Zik Zak, is happy. Max Headroom is a fantasy, of course, where a reporter can expose the truth and this matters in any way; in reality, Network 23 would just keep showing blipverts and settling a few lawsuits for a tiny fraction of their profit margin.

Zik Zak Know Future

It's a lot less unpleasant to watch the frog boil from outside, but I still have to hear all you frogs screaming until you decide to jump out or mercifully fall silent, so I like it when Twitter turns up the heat under you.

🐸🍲

How Much Computer?

I learned to program on a TRS-80 Model I. And for almost any normal need, you could get by just fine on it. You could program in BASIC, Pascal, or Z80 assembly, do word-processing, play amazing videogames and text adventures, or write your own.

There's still people using their TRS-80 as a hobby, TRS-80 Trash Talk podcast, TRS8BIT newsletter, making hardware like the MISE Model I System Expander. With the latter, it's possible to use it for some modern computing problems. I listen to the podcast out of nostalgia, but every time the urge to buy a Model I and MISE comes over me, I play with a TRS-80 emulator and remember why I shouldn't be doing that.

If that's too retro, you can get a complete Raspberry Pi setup for $100 or so, perfectly fine for some light coding (hope you like Vim, or maybe Emacs, because you're not going to run Atom on it), and most end-user tasks like word processing and email are fine. Web browsing is going to be a little challenging, you can't keep dozens or hundreds of tabs open (as I insanely do), and sites with creative modern JavaScript are going to eat it alive. It can play Minecraft, sorta; it's the crippled Pocket Edition with some Python APIs, but it's something.

I'm planning to pick one up, case-mod it inside a keyboard, and make myself a retro '80s cyberdeck, more as an art project than a practical system, but I'll make things work on it, and I want to ship something on Raspbian.

"It was hot, the night we burned Chrome. Out in the malls and plazas, moths were batting themselves to death against the neon, but in Bobby's loft the only light came from a monitor screen and the green and red LEDs on the face of the matrix simulator. I knew every chip in Bobby's simulator by heart; it looked like your workaday Ono-Sendai VII, the "Cyberspace Seven", but I'd rebuilt it so many times that you'd have had a hard time finding a square millimeter of factory circuitry in all that silicon."
—William Gibson, "Burning Chrome" (1985)

Back in the day, I would work on Pascal, C, or Scheme code in a plain text editor (ed, vi (Bill Joy's version), or steVIe) all morning, start a compile, go to lunch, come back and read the error log, go through and fix everything, recompile and go do something else, repeat until I got a good build for the day. Certainly this encouraged better code hygiene and thinking through problems instead of just hitting build, but it wasn't fun or rapid development. So that's a problem with these retro systems; the tools I use take all RAM and CPU and want more.

"Are you stealing those LCDs?" "Yeah, but I'm doing it while my code compiles."

These days, I mostly code in Atom, which is the most wasteful editor ever made but great when it's working. I expect my compiles to take seconds or less (and I don't even use the ironically-named Swift). When I do any audio editing (in theory, I might do some 3D in Unity, or video editing, but in practice I barely touch those), I can't sit there trying an effect and waiting minutes for it to burn the CPU. And I'm still and forever hooked on Elder Scrolls Online, which runs OK but not highest-FPS on my now-3-year-old iMac 5k.

For mobile text editing and a little browsing or video watching, I can use a cheap iPad, which happily gets me out of burning a pile of money on laptops. But I'm still stuck on the desktop work machine, I budget $2000 or more every 4 years for a dev and gaming Mac. Given the baseline of $8000 for an iMac Pro I'd consider useful, and whatever more the Mac Pro is going to cost, I'd better get some money put together for that.

I can already hear the cheapest-possible-computer whine of "PC Master Race" whom I consider to be literal trailer trash Nazis in need of a beating, and I'd sooner gnaw off a leg than run Windows; and Lindorks with dumpster-dived garbage computers may be fine for a little hobby coding, but useless for games, the productivity software's terrible (Gimp and OpenOffice, ugh), and the audio and graphics support are shit. The RasPi is no worse than any "real" computer running Linux.

'80s low-end computers barely more than game consoles were $200, and "high-end" with almost the same specs other than floppy disks and maybe an 80-column display were $2500 ($7921 in 2017 money!!!), but you simply couldn't do professional work on the low-end machines. Now there's a vast gulf of capability between the low-end and high-end, the price difference is the same, and I still need an expensive machine for professional work. Is that progress?

A Little Scheme

I go through phases of playing with Scheme for utility code, maybe even portable dev; while FreePascal is a better language for this, I'm frustrated by the lack of library support and the useless iOS situation.

Scheme's always been an emergency backup language; it was fun to learn back in the '80s and early '90s, and both SICP and TSPL are good books, but nobody wanted to pay for Scheme dev, and anyway the language is very annoying to write. I often treat it as a logic puzzle to get anything done, not a useful tool. But it does have good library support, and it can compile to very fast binaries, despite having GC pauses and consuming 2x as much memory as a C program. Maybe I can get better at solving problems in it, build up some libraries, and make it useful?

So the current landscape is:

  • Chez Scheme:
    • Pros:
      • Very fast to compile and at runtime, competitive with C compilers.
      • Great interactive REPL, not just a half-broken readline history like pretty much every other Scheme.
      • Debugger is reasonably good, and integrated in the REPL. All I really use myself is (trace FOO) and (inspect BAR), but non-caveman coders will make better use of it.
      • Current R6RS implementation plus extensive chezscheme library.
      • By R. Kent Dybvig, author of TSPL, and Cisco currently employs him to maintain Chez Scheme.
      • REPL environment is called a café, which I find charming. Yes, I also liked all the coffee puns and iconography from early Java programming.
    • Cons:
      • Not as widely supported by tools & documentation as Racket.
  • Racket:
    • Pros:
      • Very nice GUI.
      • Current R6RS implementation plus extensive racket library.
      • Built around making multiple languages; I don't really care about this. I loathe "Typed Racket", one of the worst combinations of ideas in history.
      • Tons of documentation.
    • Cons:
      • Mediocre performance. There's a project to rehost Racket on Chez Scheme, which would fix this, but then why use Racket?
      • Doing anything in the GUI destroys your environment, all the objects you've made, unlike any LISP or Scheme ever. So it's utterly fucking useless as an interactive REPL. I can't say enough bad things about this. ★☆☆☆☆ Kill On Sight.
  • Chicken:
    • Pros:
      • Compiles to C and thence to native binaries, with nice FFI to C libraries.
    • Cons:
      • Mostly old R5RS, with a few extension libraries.
      • Terrible REPL, only really usable as a compiled language.
  • Scheme R7RS benchmarks

Chez Scheme is the clear winner for me; if I was a novice, I might choose Racket and not realize that the REPL is a broken abomination for a while. If I was only doing C interop, Chicken would be better.

Editing in BBEdit works OK, but it doesn't know how to find function definitions. I guess Vim has current syntax, but I'm kinda over that habit unless I have to sysadmin. I have never been emacsulated and never will.

Atom's symbols list doesn't do any better. But if you do want to use it, install package language-racket (all other language-schemes are R5RS at best), and then add some file types to config.cson:

"*":
  core:
    customFileTypes:
      "source.racket": [
        "scm"
        "ss"
      ]

In any editor, any language, I use hard tabs (1 char = 1 logical indentation level, obviously), and normally tabstop at 8 chars which discourages very long nesting and encourages me to extract functions. Scheme is indentation hell, so set the tabstop to 4 spaces. (The code blocks below won't show that.)

Do not criticize my C-like paren/brace placement; I prefer clear readability of code structure to some obsolete Emacs dogma.

So, let's see it work, with hello.ss:

#!/usr/bin/env scheme-script
(import (chezscheme))
(format #t "Cheers ? , ~a!~%" (car (command-line-arguments)))
(exit)
% chmod 755 hello.ss
% ./hello.ss Mark
Cheers ? , Mark!

Now for something more serious:

stdlib.ss:

;; stdlib.ss
;; Copyright © 2015,2018 by Mark Damon Hughes. All Rights Reserved.
(library (stdlib)
    (export inc! dec! currentTimeMillis randomize input atoi)
    (import (chezscheme))

;; Variables

(define-syntax inc!
    (syntax-rules ()
        ((_ x)      (begin (set! x (+ x 1)) x))
        ((_ x n)    (begin (set! x (+ x n)) x))
    )
)

(define-syntax dec!
    (syntax-rules ()
        ((_ x)      (inc! x -1))
        ((_ x n)    (inc! x (- n)))
    )
)

;; Date-Time

(define (currentTimeMillis)
    (let [(now (current-time))]
        (+ (* (time-second now) 1000)
            (div0 (time-nanosecond now) 1000000))
    )
)

;; Random Numbers
;; "Anyone who attempts to generate random numbers by deterministic means is, of course, living in a state of sin." —John von Neumann

(define (randomize)
    (random-seed (bitwise-and (currentTimeMillis) #xffffffff) )
)

;; Input/Output

;; Reads a line from stdin, ends program on EOF
(define (input)
    (let [(s (get-line (current-input-port)) )]
        (if (eof-object? s)
            [begin (display "Bye!\n")
                (exit)
            ]
            s
        )
    )
)

;; Strings

;; Converts a string to an integer, 0 if invalid
(define (atoi s)
    (let [(n (string->number s))]
        (if (eqv? n #f)
            0
            (inexact->exact (truncate n))
        )
    )
)

)

guess.ss:

#!/usr/bin/env scheme-script
;; guess.ss
;; Copyright © 2015,2018 by Mark Damon Hughes. All Rights Reserved.

(import (chezscheme))
(import (stdlib))

(define (guess)
    (display "I'm thinking of a number from 1 to 100, try to guess it!\n")
    (let [(theNumber (+ (random 100) 1))]
        (define guesses 1)
        (do [(break #f)] (break)
            (format #t "Guess #~a? " guesses)
            (let [(g (atoi (input)))]
                (cond
                    [(or (<= g 0) (>= g 100))
                        (display "Try a number from 1 to 100.\n")
                    ]
                    [(< g theNumber)
                        (display "Too low!\n")
                        (inc! guesses)
                    ]
                    [(> g theNumber)
                        (display "Too high!\n")
                        (inc! guesses)
                    ]
                    [else
                        (display "You got it!\n")
                        (set! break #t)
                    ]
                )
            )
        )
    )
    (display "***GAME OVER***\n")
)

(randomize)
(guess)
(exit)

chez-compile.zsh, with my thanks to Graham Watt for explaining wpo and libraries:

#!/bin/zsh
if [ $# -ne 1 ]; then
    echo "Usage: chez-compile.zsh MAINNAME"
    exit 1
fi
rm -f *.so
rm -f *.wpo
mkdir -p bin

cat <<ENDTEXT |scheme -q --optimize-level 3
(compile-imported-libraries #t)
(generate-wpo-files #t)
(compile-program "$1.ss")
(compile-whole-program "$1.wpo" "bin/$1")
ENDTEXT

rm -f *.so
rm -f *.wpo
if [ -f "bin/$1" ]; then
    chmod 755 "bin/$1"
fi

Now I just:

% chez-compile.zsh guess
compiling guess.ss with output to guess.so
compiling stdlib.ss with output to stdlib.so
((stdlib))
()
% bin/guess
I'm thinking of a number from 1 to 100, try to guess it!
Guess #1? 50
Too low!
Guess #2? ^DBye!

Well, that was an adventure to get the equivalent of my first BASIC program from 1980, which can be run in Chipmunk BASIC if you don't happen to have a TRS-80 Model I handy:

1 REM GUESS. COPYRIGHT (C) 1980,2018 BY MARK DAMON HUGHES. ALL RIGHTS RESERVED.
5 RANDOMIZE INT(TIMER()):FOR I=1 TO 10:A=RND(1):NEXT I:REM CHIPMUNK'S RANDOMIZE SUCKS
10 N=INT(100*RND(1))+1:T=1
20 PRINT "I'M THINKING OF A NUMBER FROM 1 TO 100, TRY TO GUESS IT!"
100 PRINT "GUESS #";T;"? ";:INPUT "",G
110 IF G<=0 OR G>=100 OR G<>INT(G) THEN 200
120 IF G<N THEN 210
130 IF G>N THEN 220
140 GOTO 230
200 PRINT "TRY A NUMBER FROM 1 TO 100.":GOTO 100
210 PRINT "TOO LOW!":T=T+1:GOTO 100
220 PRINT "TOO HIGH!":T=T+1:GOTO 100
230 PRINT "YOU GOT IT!":PRINT "*** GAME OVER ***"
240 EXIT:REM CHIPMUNK

But now I can think about more complex problems in Chez Scheme!

Here's the tiniest piece of what I've been thinking about next:

Island in emoji

Fake Emoji & "Smart" Quotes Fuck Off

WordPress does a lot of things, not always well, but better than other blog platforms. But occasionally it runs amok like a toddler on espresso scribbling over your stuff with crayons and shitting in corners before falling down in a huff.

Today, it decided to replace my emoji with terrible little pictures again despite using the Disable Emojis plugin, so I gave up and edited functions.php (Appearance, Editor). And took this opportunity to uneducate my quotes so you can actually use code I paste without having to run it thru BBEdit's "straighten quotes" text menu. I didn't invent any of this, but it's all buried in obsolete version advice.

Add this:

// Fake Emoji & "Smart" Quotes Fuck Off
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('admin_print_styles', 'print_emoji_styles');
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
add_filter('emoji_svg_url', '__return_false');
add_filter('run_wptexturize', '__return_false');

Sláinte ?