Indecent Proposal: Linux

Craig suggested a snarky Modest Proposal, start targeting Linux instead of Mac, if you recoil at Apple taking 30%.

It’s really 15% for most people in Small Business Program. In the Olden Times Before Ye Appe Store, distributors only would take 50% or more cut, publishers would take 70-90% cut; the App Store was a ridiculously good deal when it came out. Assholes like Tim Sweeney at “Epic Games” are of course appalled at paying out a dime, and so after an epic court battle where they lost 9/10 claims, have now reduced it to 27%, and owe Apple $73M for legal fees.

But let’s think about switching. I’ve been spending a few days arguing with Linux zealots on fediverse, and have come to some conclusions, aside from the obvious that Linux people are crazy.

THE GOALS

  1. Write software in tools and languages I don’t hate.
  2. Keep the kind of software quality, taste, accessibility, etc. that I like.
  3. Ship it and GET PAID.

Not Goals

  1. End-user use. I don’t have to inflict this on myself, just see what the dev environment’s like.
  2. Server software, I have FreeBSD for that.
  3. Joining a cult and singing the Free Software Song – do not click, it’s Stallman singing.

GUI APIs

This is the most visible, but shallowest problem. Craig suggests Gtk+ or QT.

  • Gtk:
    • Pro: It is easy to code against in C, and from there you can use anything you like with FFI; I could ship my Scheme programs with Gtk.
    • Con: Looks like ass everywhere, native to nothing.
    • Every version is incompatible and utterly different from the last.
    • Theming makes UI design very hard, or impossible.
  • QT:
    • Pro: Actually not terrible looking, sometimes almost passes for native.
    • Con: Have to work in C++, which is a HARD NO from me.
  • Gnome: Mostly this is just Gtk.
    • Con: Do everything in their awful IDE.
    • Sort of has design guidelines, but the child-like or Windows Vista-like icons, bubble aesthetic, is not appealing.
    • Requires Flatpak, which I’ll get to in a minute.
  • KDE: Mostly this is just QT.
    • Pro: Can be worked in from Kate, which is an OK editor. Here’s Mark, saying something almost positive about a Linux program! Kate is OK. It’s no Vim, though.
    • Human Interface Guidelines are pretty consistent, professional-looking.
    • Con: Can also be worked in from KDevelop, which makes Eclipse look fun (Eclipse is not fun).
    • UI is mostly written in QML, which is YAML like Microsoft’s XML layout stuff. Just horrible.
    • Mostly the loser in the Linux User Interface Wars.
    • Again, C++, no.
  • Android:
    • Pro: Is a platform with some aesthetics & user experience; not great, but it exists.
    • Has a paid store.
    • Con: Languages are Java or Kotlin, which are very silly.
    • IDEs for it are really spectacularly awful, either Eclipse or a bag-on-the-side mode of IntelliJ.
    • Security is F-tier, I don’t like contributing to a platform that’s all scams, piracy, and botnets.

I hate basically everything here, and more besides. Gtk has a bare winning edge that it’s easier to use from a language I like.

System APIs

The deeper problem of Linux is everything in between 1970s terminal programs and trivial GUI programs that don’t interact with anything. There’s no real system integrations.

If you want to use the user’s calendar, you have to research several calendaring systems, some of which may have an API and some don’t. Again when you want to do messaging, oh, wait, that doesn’t even exist on every system. Again when you want to do something with curated photo albums, not just shoving a png in some random directory.

Or dig deeper, and audio is the same fiasco that chased me off Linux desktop 20 years ago; you simply can’t get multiple audio streams to sync & play, and the latency is often in the seconds for audio processing, I can get far under 10ms on Mac. Video is nonexistent other than calling out to VLC or mplayer; you don’t want to try.

What you can get done on Linux is maybe a database and low-level networking. If that’s not enough, you’re in for a rough ride.

Taste

So I use this word a lot. “The only problem with Microsoft is, they just have no taste.” —Steve Jobs – watch that whole clip from Triumph of the Nerds.

Taste is about picking one aesthetic, one set of user experiences, and saying no to all the others. You have to choose. And most people can’t choose, or they just end up dumpster-diving a bunch of junk that doesn’t go together, and can’t understand why they’re unhappy (or maybe they’re Grouches who like garbage).

If the platform creator has an aesthetic, it has behavior guidelines, you follow it, so users will feel comfortable, they won’t feel surprised: Law of Least Astonishment.

This is impossible on Linux. Gnome users hate KDE, KDE users hate Gnome. Some of them like Electron shit, others think it’s as bad as Flash (it’s actually worse). Until one of them becomes a One True Catholic Linux and puts the rest to conversion or death at swordpoint, there won’t be any unified UI.

So now you have to do QA testing on design as well as functionality on multiple distros, many different configurations, and you’ll probably need testers familiar with those setups. It’s an impossible QA task.

Suppose I want a file open box with custom file previews. On Mac OS X, I can use NSOpenPanel, customize the accessory view, watch notifications and update the preview. Gnome & KDE will deal with even having icons differently, and you can’t override anything without bringing in their code and hacking on it.

Ship It

You have several choices here.

Gnome people say Flatpak, which bundles all the libraries and support for a program into a bundle, explicitly copied from NeXTstep/Mac OS X/iOS .app bundles (the word “app” is only valid for these platforms! This is where it comes from!)

Which is theoretically fine, but runs into the problem that Linux doesn’t have a consistent OS base, so Flatpaks are a LOT bigger than Mac app bundles. They run “cross-distro” by some kind of linking hackery and translation layers, so your Gnome program includes all of Gnome, and looks like ass on KDE, but runs. As noted under Taste, that’s not an acceptable way to ship, you’d have to test on everything.

npm, deb, & nix are distro-specific bundles, but at least they can check dependencies and install only what’s needed. They don’t help you at all with translation layers. While there’s a UI for these, you really only do them from command line.

“Free Software” is an incredible pain in the ass here, you have to carefully check what libraries you use, and if they’re LGPL or BSD/MIT, so you can use them with some qualifications, or GPL or AGPL, in which case you can’t (unless you like shipping all your source and having 100% piracy).

Get Paid

Releasing free software is useless. As Harlan Ellison said, cross my palm with silver.

Universally, every Linux I’ve spoken to hates paying for software, they would never do it, think I’m an immoral monster for suggesting it, I should be happy someone might put a penny in a tip jar.

This is a backwards, shit-covered, medieval religious dogma. It’s appalling in the 21st Century that Rape Apologist Richard Stallman is still Pope of the FSF, eater of toejam, owner of abortion jokes in fortune. And his devotees are carrying out The Faith, regardless of the sins of their leader.

There’s no good software stores. Elementary has one, which is defunct or close to it, from what I can tell. Ubuntu shut theirs down years ago.

Google Play for Android isn’t on every device, and it’s widely pirated. I also morally object to letting Google have money, but any port in a storm if it wasn’t for that?

itch.io works fine for games. I suspect the Linux paid users are the tiniest most shrivelled-up sliver of the demographics. 20-30 years ago, I actually had minor success with shareware on Linux, but that dropped off and never recovered.

Otherwise, I dunno, try to run my own e-commerce site and sell binaries which will instantly get pirated because nobody on Linux has any money?

So instead of paying Apple 15-30%, pay whatever hosting, bandwidth, & e-commerce costs you, and you get nothin’ in return. Let’s see, 30% of nothin’ is…

Conclusion

It appears that eating babies will not actually solve the overpopulation or hunger problems at this time, Mr Swift (no relation).

Gone from Suck to Blow

Want to move a URL or other text between your local computers, and they’re not all Mac/iOS where universal pasteboard mostly works? There’s smart ways, and then there’s how I do it:

# note: needs Apache turned on. sudo apachectl start
mac% cd /Library/WebServer/Documents
mac% sudo ln -s $HOME/Sites
mac% cd
mac% cat bin/blow
#!/bin/zsh
pbpaste >$HOME/Sites/suckblow.txt

raspi% sudo apt-get xclip
…
raspi% cat bin/suck
#!/bin/zsh
curl -s "http://mac.local/Sites/suckblow.txt" |xclip -i -selection clipboard
xclip -o -selection clipboard

And in the reverse set, pbcopy is the Mac equivalent of xclip -i. In practice, I don’t run a server on my RasPi but I rarely need to paste the other way, just sometimes scp files.

Now on the Mac, I copy some text, type “blow” in iTerm2. On the RasPi, I grab terminal and type “suck”. It can take a few seconds, and then the text is in clipboard.

Without running Apache (or other web server, but I’m a caveman), you can use scp to grab the file, then cat it into xclip -i.

Happy blowing & sucking!

[Update 2022-12-03: Some update on raspi changed the default in xclip from clipboard to primary (X11). So I’ve added -selection clipboard to them all.]

Raspberry Pi OS 64-bit

Back up your user files (only). Don’t bother configuring the installer beyond choosing “Other Raspbian” and “64-bit base”, it ignores your settings, you’ll have to configure the device after booting stock. But it writes the micro-SD card correctly; I didn’t have to reformat it myself like last time. So I run thru my 400 setup routine again, and with minor changes it’s still current.

Everything seems to work. I can run my Scheme scripts in Gauche like it was just a minute ago. Since it’s 64-bit now, I should be able to install Chez Scheme from Debian! But ambitious plans later. Python is 3.9.2, which meh, fine; I’ve mostly updated my desktop to 3.10, but old ports require 3.9 still.

I had a weird crash with Twitch, but I’ve had that before; on reboot I was able to watch Twitch with no problems, but I’ll keep an eye on that.

Uh, when adding things to the Main Menu, make sure they’re marked executable (chmod 755 whatever).

And reminder, MagPi magazine is good content, you just have to persistently demand “free PDF”, nobody wants dead trees! It does tend towards the very noob, classic WIRED magazine color/font assault on your senses, and they think IDEs are a good idea on a tiny computer. Don’t do that. Just use Vim in a terminal.

Very importantly, keep your files as much as possible on a USB drive, not the internal SD card, you don’t want to thrash the OS card any more than you have to.

Now the next step will be to reuse my old micro-SD card for an alternate OS, so I’m not running Linux. But if you do run Linux, Raspbian’s acceptable since it only has one hardware profile to support.

Raspberry Pi 400 Setup

I got my RasPi400 after weeks of delay. WEEKS! What is this, 1980? (I wish)

Keyboard is almost precisely the size & layout of the Apple Magic Keyboard, which is fine with me. The key travel’s bad, like the lawsuit butterfly keyboard. I’m moderately unpleased with the keyboard touch, but it’s definitely usable. I switch over here to my Magic Keyboard, and it’s night and day in quality. Mouse is nice enough; it’s not a hi-DPI gaming mouse, but it’s a good workstation mouse. Aesthetics are fine, I’d prefer black to white, but the raspberry red highlights are pleasing.

It is so nice to have a really usable little computer in a keyboard again. Literally the best thing since the Atari 800 (and that cost $899 in 1980, $2,869.53 in 2021’s inflated currency; this is 28x cheaper!).

I’ve grown accustomed to Raspberry Pi OS (née raspbian). It’s still a lame linux, but they’ve mostly got pulseaudio working(!) after 20 years of it being not functional, wifi mostly stays up, the desktop environment isn’t awful. It’s no Mac OS X Tiger, but nothing is anymore. There’s less complaining from me using it, than hours of playing sysadmin would cause.

Not RasPi’s problem, but I got a new, overly large portable LCD for use with this, FANGOR 15.6″; it’s basically impossible to find any LCD >7″ but <15″ which has a decent rez (1920×1080) and color reproduction; the random-Chinese-fake-company plastic 10″ on my RasPi4 is just awful, the worst screen I’ve ever used. RasPi4 is now on my bookshelf, waiting to be moved into a closet where it will live forever as a headless server that I don’t have to hear the fan whine.

Checklist

  • “Recommended software”
    • Keep: Geany, Mathematica, WolframAlpha, VNC Viewer
    • Currently errors when I try to remove LibreOffice, which is bullshit!
    • I don’t use Claws Mail, I use webmail on the pi. I should install mutt or alpine. But if you like graphical mail, leave it.
    • Minecraft Pi is ridiculous, tiny world, creative mode only, tiny window you can’t resize. Don’t bother.
    • Remove everything else.
  • Remove the unremovable crap and like half an SD card of dependencies! (update 2022-02-03: Seems like these are no longer pre-installed, so that’s better.)
    % sudo apt-get purge "libreoffice*"
    % sudo apt-get purge "scratch*"
    % sudo apt-get clean
    % sudo apt-get autoremove
    
  • Add/Remove Software: zsh, gauche, vim, media apps. (update 2022-02-03: zsh is now in /bin/zsh where it should be.)
    % sudo apt-get install zsh gauche vim mpv yt-dlp 
    % sudo apt-get install xscreensaver xscreensaver-data xscreensaver-data-extra
    % chsh pi -s /bin/zsh
    
  • Fix mouse scroll direction!
    % sudo vi /usr/share/X11/xorg.conf.d/40-libinput.conf
    
    Section "InputClass"
        Identifier "libinput pointer catchall"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
        # add this:
        Option "NaturalScrolling" "true"
    EndSection
    
  • Fix capslock to be ctrl:
    % sudo vi /etc/default/keyboard
    XKBOPTIONS="ctrl:swapcaps"
    

    Or ctrl:nocaps if you don’t want any capslock, but I find it somewhat useful.

  • Create local user, not pi:

    % sudo adduser mdh
    % sudo usermod -aG sudo mdh
    
  • Disable auto-login: Raspi, Preferences, Raspi Configuration.

  • login as mdh

    % chsh mdh -s /bin/zsh
    % mkdir bin
    % mkdir tmp
    
  • Fix vim: How to Configure Vim

  • vi .profile:

    export EDITOR=vim
    export TMP="$HOME/tmp"
    export LESS="-C -i -M -g -e -y4"
    export PATH="$HOME/bin:$PATH"
    
  • vi .zshrc:
    umask 022
    
    unsetopt NOMATCH
    setopt APPEND_HISTORY
    setopt COMBINING_CHARS
    setopt EXTENDED_HISTORY
    setopt HIST_IGNORE_DUPS
    setopt HIST_REDUCE_BLANKS
    setopt INC_APPEND_HISTORY
    setopt INTERACTIVE_COMMENTS
    setopt NO_BANG_HIST
    setopt PROMPT_SUBST
    
    bindkey -e
    
    export HISTFILE=~/.zhistory
    export HISTSIZE=10000
    export SAVEHIST=$HISTSIZE
    
    autoload -U zmv
    autoload -U colors && colors
    export PS1="%{$fg[red]%}%n@%m:%~%#%{$reset_color%} "
    
    zmodload zsh/mathfunc
    zmodload zsh/regex
    
    function mcd() {
        mkdir -p "$1"
        cd "$1"
    }
    
    function cdcd() {
        while [ $# -gt 0 ]; do
            cd "$1"
            shift
        done
    }
    
    function hd() {
        hexdump -C "$1"|less
    }
    
    alias ..='cdcd ..'
    alias ...='cdcd ../..'
    alias ....='cdcd ../../..'
    alias .....='cdcd ../../../..'
    alias c='clear'
    alias grep='egrep'
    alias l='ls -FsCk'
    alias la='ls -FsCka'
    alias ll='ls -al'
    alias md='mkdir'
    alias rd='rmdir'
    alias sd='screen -d -r'
    alias v='vim'
    alias x='exit'
    
  • add menu to lock xscreensaver:

    % echo ‘sleep 1; xscreensaver-command –lock’ >bin/xscreensaver-lock.sh
    % chmod 755 bin/xscreensaver-lock.sh

    Then add that to your main menu (RasPi, Preferences, Main Menu Editor).

  • Reboot, should be nice now.

Outstanding Issues

  • No multimedia keys

Raspbian from the Keyboard

Doing some maintenance and setup on my RasPi4, I struggled to find keyboard shortcuts. Where I did find them online, they were slightly obsolete or just not correct for my keyboard.

Some of these are specific to my Rii keyboard/trackpad combo, which has a Fn key and F-keys are “under” the media keys and arrows. A normal keyboard doesn’t need to type Fn.

Key Effect
Ctrl-Alt-Fn-Del Shutdown menu
Ctrl-Esc System menu
Alt-Space Window menu
Alt-Fn-F2 Run Program dialog
Alt-Fn-F11 Fullscreen window
Alt-Tab Cycle windows
Ctrl-Q Quit most programs
Alt-Fn-F4 Kill any program
Ctrl-Alt-Arrow Left/Right packs window to side, Up fullscreen, Down not-fullscreen.
Ctrl-Alt-Fn-F1-6 Virtual Console 1-6
Ctrl-Alt-Fn-F7 GUI

I love Ctrl-Alt-Arrow keys now that I know them. It’s not quite Ratpoison or other anti-mouse window managers, but it’s so handy on a small screen.

If you use virtual consoles, I cannot recommend highly enough learning to use screen, so you only need to remember that one of them is open, and can restore that session in any terminal later.

I still don’t know what the Chromium program menu key is, it won’t tell me and the docs are useless. I loathe that every Linux program chooses a different place to put menus. It shouldn’t be allowed.

Useful Shell Commands

  • lxterminal: Standard Terminal
  • omxplayer: Audio/Video player
  • scrot: Screenshot, dumps into ~ in format Y-M-D-HMS_REZ_scrot.png (which is terrible, but whatever, man). I can’t generate its printscreen keycode, supposedly I can edit openbox config to add a keycode for it. Later. I can always run scrot from the Run Program dialog, or sleep 10; scrot from lxterminal and switch windows.
  • gpicview: Image viewer
  • mousepad: Simple GUI text editor. Has line numbers, paren matching, and different themes, so if you don’t want to use GVim or Geany, or nano or vim from Terminal, this is nice and starts nigh-instantly.
  • leafpad: Shitty Gtk text editor. You should hit Ctrl-Esc, Preferences, Main Menu Editor, Accessories, Text Editor, Properties. If it says leafpad, change that to mousepad.

I don’t have Dropbox on it, and that’d be awkward anyway, so I’m still pondering how to easily get files off it. sftp or scp works, but I’d rather have a general-purpose, auto-syncing share folder.

RasPi 400: Adorable New Keyboard Computer

This is very nice, at least in principle.

Classic home computers – BBC Micros, ZX Spectrums, Commodore Amigas, and the rest – integrated the motherboard directly into the keyboard.
No separate system unit and case; no keyboard cable. Just a computer, a power supply, a monitor cable, and (sometimes) a mouse.

Hm, the naming is obviously after the Atari 400 (so 800 will be the 8GB model?), but they don’t mention Atari. Well, the criminals now doing business as “Atari SA” aren’t people you want to associate with. And these are English, who couldn’t afford nice computers back then.

It’s not really $70, it’s $100 plus a monitor, because the cabling is unusual, you should not get the no-cables computer-only box. When I got my RasPi4 I had to email them to get my micro-HDMI cables (which they did supply), and the cheapo monitor is still terrible but I haven’t found a good cheap replacement. The RasPi400 also doesn’t have a power switch; the CanaKit set at least gave me an inline power clicker.

Having the keyboard & computer in one gets you much closer to a nice clean cyberdeck than the current maze of wires; there’s no battery pack, but in most cases what you want is a small computer in your satchel you can set down, plug in, and work. I’m dubious of using a mouse with this in most space-constrained areas (machine rooms, or cafés—in the distant future when we can go back to cafés), but trackpads and trackballs are expensive, too.

RasPi4 is critically heat-constrained, the fan runs all the time on mine or it dies. El Regerino does a teardown and review, and the giant heat sink plate seems to solve the problem. I could probably justify getting this just to have silence! Or a fedi-pal has suggested the Argon One heat-sink case, which is a much cheaper fix.

Software’s still an issue. Raspbian is a relentlessly mediocre Linux variant; I said earlier I’d switch it to BSD, but that hasn’t happened yet. I should update to the newer “Raspberry Pi OS” and see if it’s better. … Later: Not really. You can set some better scaling options now so it’s not unreadable. WOO. (I shouldn’t mock, scalable UI is really fucking hard, and they’ve got at least most of the stock software configured for it; notably Chromium yes, but not Firefox).

Dev tools are not great on RasPiOS. Ludicrously, they suggest Python, the slowest modern language on the slowest modern hardware. Their free “Create GUIs with Python” book uses a fat layer on top of Tkinter, which is awesome for portability, totally awful for going through now 3 layers to reach hardware. No. Almost anything will be better on it. As I noted, Gauche runs, it’s fine for porting small tools, and has industrial-strength (and industrial-ugly) GTK.

A much better IDE will be sudo apt-get install vim-gtk3 (gvim runs faster than vim in lxterm, though it pulls in a preposterous set of dependencies)

Just as a sanity test (“maybe a 4GB, 1.5GHz, heat-constrained computer is OK for Python!”), I wrote a tiny 10 PRINT maze program in both. Gauche fills the terminal instantly; I can see the lines being drawn by Python, and it’s even slower in any IDE. That’s just one random number per char, imagine doing real work!

All their programming books and the new Beginner’s Guide are up for free as PDF on their MagPi books page, or now in-OS from Raspberry menu, Help, Bookshelf. Looking thru the guide, it covers:

  • Hardware tour so you can identify ports
  • Software setup
  • Programming in Scratch for kids. As I was raised on BASIC and assembly, I roll my eyes at programming by drag-and-drop instead of interactive text editing, but Scratch isn’t awful, just cutesy, bulky (a 10-statement program will fill a page of the book) and very slow.
  • Programming in Python. Thonny IDE looks OK, for what it is, with integrated REPL, tabbed editing, and debugger. But IDLE does as well; both use Tkinter, and are non-fun slow on the little device.
  • A starter chapter on using the GPIO, doing wiring, digital circuits, and Scratch to blink an LED. Then controlling the Sense Hat, which is maybe the worst peripheral I’ve ever seen. There’s plenty of other small-screen interfaces or sensor devices that’d be better, surely.
  • Appendices on how to install software, and finally an extremely inadequate tutorial on using the terminal.

For $100, it’s a cute little portable computer, but the way they suggest using it will make it seem like a 1K RAM ZX-80, not the reasonably fast secondary machine (or kid’s first Scheme terminal) it can be if you’re not working under multiple layers of mud.

No Linux Platform

All about design & organization of the “OS”. But this completely ignores the actual problem: There’s no MONEY in Linux application development. So nobody makes any that are even minimally competent.

I would correct his post, though, Ubuntu had a design language and SDK, and was working on a universal desktop & phone UI… and then that collapsed because there was no money in it. Now they’re just another GNOME desktop.

Elementary has their own language (Vala), and reasonable documentation and policies, and lets you ship through their “app store”… as long as you give away your source code, it’s Pay What You Want, it’s not enforced in any way. Anyone can just go to github and build your software for themselves, and then distribute it for free. Elementary also takes a 30% cut as if they were Apple!

Looking at the Elementary App Center, they have 160(!) mostly tiny utilities listed. A couple Sudoku games. A $25(!!!) single-site client for write.as. But there is Minder, a mind-mapper; Tootle, a Mastodon client; Notes-Up, an organized notes app. Unimpressive but not as awful as the usual Linux software. But in 3 years that’s all they’ve made?

There’s enough servers to keep Linus working on the kernel, and a lot of nerds employed in janitorial jobs, but they have no motivation to make end-user software that anyone wants to use.

Google may be the enemy of Humanity, incubator of SkyNet, a Terminator’s metal foot stomping on a human face forever, but they sorta half-assed their way into making Linux usable with Android. ‘droid has a ton of end-user software (if mostly terrible) because Google Pay works and isn’t trivial to circumvent, or they can just shove ads in every screen. It’s mostly sloppy seconds from iOS or the web, and the dev tools are awful, but it’s software. So why can’t those people make desktop software for Linux? Follow the money.

Raspberry Pi 4 Setup

In my long-running cyberdeck-building saga, I’ve tried a few variations. Now trying the new RasPi4-4GB from CanaKit, Rii K12 keyboard, and a very cheap terrible Elecrow 10.1″ monitor. When I first got the shipment, the MicroHDMI-HDMI cable was missing, but CanaKit quickly shipped me two, in case I want to run two monitors on my very tiny computer. And then when I got everything hooked up… nothing happened. Turns out, the recommended format tool formats SD cards in ExFat, and RasPi only boots from FAT32. OS X’s “new” Disk Utility is awful but did let me pick the right option, copied NOOBS, and was able to boot Raspbian! Yay!

Protip with the Rii keyboard: Little radio adapter is hidden in one of the feet. Took me a bit to figure out why it wouldn’t pair. It’s a weird layout, keys are a little mushier than I like (I like either classic buckling spring IBM or Northgate keys, or the thin super-crisp “Apple Magic Keyboard” keys), but it’s attractive, great for the size, and the trackpad works better than I expected as a real mouse; I do have to hit the left-click keyboard button sometimes to wake it up. I may or may not stick with this forever.

I won’t be staying in Raspbian, I hate Linux more than anything, but I don’t want to fight with setting up BSD on a new device just yet. What I’d love is if Haiku worked on it, but BSD is probably a saner choice.

Uninstalled all the stupid stuff that’s preloaded. LibreOffice can suck it, 10 different “simple IDEs” can fuck off. Mathematica and Wolfram Alpha can stay. “vi” is actually Vim, but “vim” is not installed; anyway I won’t be working full-time in Vim. Did an adduser, installed zsh and chsh to zsh; fucking Lintwats still use bash after all the security holes! After some advice from Mastodon, Geany seems tolerable as a GUI editor, and it’s cross-platform, good option.

There’s a Chez Scheme package, but it didn’t install anything and apparently is long out of date. Chicken only has the compiler, not a REPL. But Gauche installs, the “gosh” REPL runs fine, and seems to have working GL & GTK+ libraries, which may be a reasonable way to make some GUI tools for it.

Chromium is the standard browser, which whatever man, but it keeps bugging me to sign in, and I will never do that. It plays Youtubes OK, which is likely to be 75% of its runtime. I’m kind of impressed the sound works and I won’t touch anything about that except volume because Linux + sound = 9th level of Hell.

I loathe the very simplistic Windows-like wm it starts with, haven’t seen any “setting” to change that, probably have to go fight config files and Raspbian won’t be here that long.

Now I need to finish the keyboard box, so I can make this portable, but as just a little desktop computer it’s pretty sweet, and my setup cost me $220 total (plus some earlier experiments).

Terminal Condition

I spend half my time, easily, in a command-line terminal running zsh. So a new one, even one on an OS I don’t run, is interesting:

There are some modern, nice conveniences in this. It’s a little ways behind Mac Terminal.app (based on the NeXTstep Terminal from 1990), and vastly far behind iTerm2, but it’s more advanced than the usual Linux terminals like rxvt, urxvt, or cross-platform Alacritty or Hyper.

Between this and WSL2 being a full Linux, it’s plausible that the best Linux dev environment now (well, this summer when it’s released) is Windows. The Year of the Linux Desktop is 2019, and it is owned by Microsoft®. Can you hear the tiny, distant screams of the FSF cultists?

Comparison based on code, reviews, and reddit thread with MS devs involved:

  • Scrollback: The single most important thing a terminal can do. MS does this, but doesn’t have logging.

    Surprisingly, a lot of them only support a few pages. I keep mine at 10,000 lines or so, which is probably wasteful but so handy; I don’t bother logging since my .zhistory keeps everything I typed, and I have Terminal.app and iTerm2 set to not close tabs automatically.

    Alacritty only just added scrollback last year.

  • Prompt Marking: Nope.

    This is a feature it’s hard to live without once you’ve had it, no more paging up trying to see prompt lines (I have a red ANSI-colored prompt and it’s still hard to see). In Terminal.app, Edit, Marks, Automatically Mark Prompt Lines, and then ⌘↑ and ⌘↓ move between them. iTerm2 has it enabled by default, and ⇑⌘↑ ⇑⌘↓ are the keys, which took me some re-learning.

    Nothing else has this, as far as I’ve seen.

  • Fonts: MS has programming ligatures and displays emoji, finally. Does not support RTL languages.

    I use Fira Code in all my editors and shells, and it’s enormously helpful, more readable, and catches bugs: I look for === as a fat-equals symbol in JS, etc.

    Hyper, urxvt, Alacritty support Unicode fonts. rxvt stopped development almost 20 years ago so it barely shows 8-bit fonts correctly.

  • Tabs: MS has tabs! They’re currently invisible until you add a second tab, same shit Terminal.app does, which annoys the hell out of me; I don’t like UI that reshapes itself, reminds me of T-1000 Terminators (also makes it hard to tile my windows up correctly when they get resized).

    It’s not clear if you can drag Windows Terminal tabs around to different windows.

    In iTerm2, I normally keep: First window with tabs for home shell, ssh into my server (running screen, so that has many open shells). Second window with 2 tabs for REPL, editor/running/compiling tasks, and sometimes a third tab for reading local docs. If I need more shells, I usually open them on the first window. I rarely open a third window for monitoring some long-running task; I just drag a tab out to its own window. All terminal windows are stacked on the left side of my screen, because there’s no icons under that side of the Desktop.

    urxvt has tabs, but they’re kind of a hack, not fully usable.

    Hyper has tabs, but they replace the title bar. Which is cool but also awful like a lot of things it does.

    rxvt and Alacritty don’t do tabs, because they insist you use screen or tmux. Which sucks if you want to move a process from one window to another.

  • Profiles: MS supports multiple profiles, so you can use different ones for each task.

    So does Terminal.app, iTerm2, urxvt (but it’s buried in a text file config).

    Alacritty, rxvt, and Hyper have a single profile and no UI for changing anything, hope you like editing text files and reloading.

    As far as I can tell, nothing else does automatic profile switching like iTerm2; when I cd to my ~/Code/CodeScheme folder, iTerm2 switches to my dark red transparent profile, including Scheme-specific triggers and copy/paste filtering.

    You can probably do that in urxvt’s Perl(!) scripting, but it’s not normal or easy.

  • Copy/Paste Filtering: Nope.

    iTerm2 and urxvt both let you set a bunch of regexp to run over lines to get selections correctly matching boundaries, not just space-delimited.

  • URL Highlighting: Nope.

    iTerm2, Hyper, and urxvt notice URLs and filenames, and let you click on them. In iTerm2, hold down ⌘ and click on any URL or path (like in an ls or find result!) and it does some useful action: Opens the URL in your browser or file path in your editor, by default, but you can configure that in the profile.

  • Custom Keybindings: Sorta? Doesn’t seem complete, no idea if there’s UI for it, but it does exist in their config.

    Most terminals can do this, but most can only remap a few actions. I like iTerm2’s, as usual, which lets you bind any action, menu, or run a program on any keybinding. I mostly just use it to launch different profiles with starting paths & scripts.

    Terminal.app only lets you send specific text for a key.

  • Images: Sorta? Only if they’re embedded in fonts.

    This is a neat trick in iTerm2: images. I use imgls all the time to see a thumbnail of every file with details (protip: I changed ls -ld in the script to ls -1Fskd for a more concise listing), and then ⌘-click to open what I want in Acorn; it’s better than opening Finder and trying to read a long filename under a thumbnail.

    I’m unaware of anyone else being able to do this.

The Stubbornness of Windows Users

What we’ve got here is, a total failure to understand the purpose of the device or the OS.

A somewhat long sidebar here, state of the world in desktop operating systems:

  • Windows: Redmond still ships a garbage toy OS which is the bastard child of VMS and MS-DOS, that costs a lot of money, but runs on cheap (but not sub-$200) computers, many of which come in every shape and size. In order to run Windows, you need to have a total lack of aesthetic sense, a willingness to put up with “updates” that brick your computer, a tolerance for Microsoft-Quality™ software (“let’s add more buttons to a ribbon bar and ship it!”), and a willingness to use junk hardware that consumes twice as much power as needed and makes noise all the time.
    Slightly positive, the graphics and sound systems work, and you get all the games; if that’s all you’re after, though, a PS4 or Xbox OnePlus+Ultra/190 (whatever the name is) is a better deal. You can generally browse the web on Windows, and you’ll get some viruses and ransomware but it works. Dev tools on Windows are expensive and shitty, so in order to get real dev work done, Redmond now also ships Linux inside Windows. My bias shows, sure: I’ve never owned a Microsoft product in my life, and I’d eat broken glass before doing so, but I’ve had to use them in some workplaces. Dire, but minimally functional.

  • Linux: Distros ship a garbage OS for free that runs on garbage computers, including sub-$200 microcontrollers. In order to run Linux, you need to be masochistic, technically educated, not have any need for desktop apps, sound support, graphics support, games (some Steam stuff now works, sometimes, on higher-end machines!). As a server or microcontroller OS, or a very nerdy dev machine (emacs and C), it’s adequate and somewhat supported. Only insane people use Linux as a working desktop. I say that as someone who ran it as a working desktop for a decade, and I loathed it.

  • FreeBSD, OpenBSD, NetBSD: Great server OS’s, that ship for free and run on slightly more demanding computers. Only the most technical nerds will even know that these exist. Software, you basically write your own or port from other POSIX systems, which half the time is written for broken Linux APIs and so doesn’t work right. On the bright side, they have such limited sound and graphics driver support that if you do have compatible hardware, you’ll have working sound and graphics. If Mac OS X didn’t exist, I’d be using FreeBSD.

  • Haiku (aka BeOS): Seriously, they shipped a working beta, and it seems nice. Great desktop, graphics and sound support if you’re on compatible hardware. Down side, minimal software for it, and if you want to write your own the APIs are in C++. Fuck that, no. But… I do like BeOS, probably tolerable as a nerdy dev computer.

  • Mac OS X (or “tacOS”, er, “macOS” as they now style it): The last of the UNIX® workstation OS’s, that only runs on expensive devices Apple makes (it’s possible to “Hackintosh” a garbage computer to run Mac OS X, but half the services won’t work; don’t do it unless you’re nerdier than a FreeBSD user). Everything actually fucking works. Sound has no latency, and always works. Graphics, aside from low-end devices having a shitty Intel GPU, always works; I’m unhappy with them deprecating OpenGL and going with Metal instead of Vulkan, but Vulkan libraries have been ported. It’s fine.
    There are games, Elder Scrolls Online and World of Warcraft in particular, and Steam’s full of Mac games. Desktop applications on the Mac are adequate to amazing; there’s no “you must use this one shitty program because it’s all we’ve got” like GIMP on Linux. As a dev machine, it’s unmatched. I don’t touch Xcode unless I have to anymore, but that’s what you use to make iOS and Mac apps, and it has some good dev tools like Xcode Server.

Of course, I say that, and:

libswiftcore-crash Good job, Apple, ship it.

So, end sidebar, the reason you buy Mac hardware is to run Mac OS X, the least bad hardware/software combination available in this horrible century.

What you’d use a Mac Mini for is what you’d use an iMac for, but cheaper and often hidden away:

  • Switch to the Mac from another OS. Steal the keyboard and screen from your garbage computer. You may need some dongles to convert the cables. Learn how to use a Mac. Buy something better when you need it, and re-sell the Mini, which will still be worth 2/3 or more of the original price.

  • Run a multimedia display. Put a playlist of music, photos, or videos on one or a bunch of LCD panels; you can’t do this with a Linux microcontroller like Peter suggests, because their graphics and sound don’t work worth a fuck. Just try playing a random folder of media on Linux, you’ll throw it through the window. It’s worth $800 to not fight with Linux.

  • Run a build farm for Xcode Server. Probably need a mid-priced Mini for this, but speed won’t matter much because it’s an invisible server. It can’t be rack-mounted, because not every workplace has a machine room with racks, they just need a little device in some (well-ventilated) cupboard to support the developers.

  • Streaming audio, video, or other server. Put this in a colo farm with a static IP, and deliver whatever media you want. Your podcast and web site has to live somewhere. Now, you can do that with AWS/EC2 and other shared servers, much cheaper, but you don’t control the computer, they mostly run Linux (ugh), and often you’ve written software for the Mac.
    I have an old Mini at colo that runs Minecraft, some file shares, holds backups, used to run Xcode builds but I don’t need that now, sometimes runs one-off networking services I want to try out. I may upgrade to a new one, but my needs aren’t quite as heavy on it as they were. Invalidstream is currently run from an old Mac pro, but I think he’d be fine on a higher-end Mini now.

  • Literally any other use that doesn’t require using it on the move, or extremely heavy CPU or GPU loads. Not a top-of-the-line gaming, Photoshop, or movie editing device by itself, but an external GPU could put it on par with an iMac, maybe even an iMac Pro for some jobs. Probably not a stage DJ device, there they’d use a MacBook Air or even an iPad, but ideal for sticking in an audio booth and doing podcast recording and mixing. Unlike a garbage computer, you can be in the room with a Mini and not be blasted off the air by the overheating fans and clicking drives, and unlike a MacBook it has enough ports.

Most of those tasks require it to be small, quiet, and still attractive if it is visible.

The $799 base model is for only the most minimal uses. For $1,599, you can get:

3.2GHz 6‑core 8th‑generation Intel Core i7 (Turbo Boost up to 4.6GHz)
8GB 2666MHz DDR4
Intel UHD Graphics 630
512GB SSD storage
10 Gigabit Ethernet (Nbase-T Ethernet with support for 1Gb, 2.5Gb, 5Gb, and 10Gb Ethernet using RJ‑45 connector)

That seems like a reasonable Mac workstation, if it had more RAM. +$200 to get 16GB RAM is OK, +$600 to get 32GB RAM is overpriced, +$1400 for 64GB is “bend over and squeal like a pig”. You can get 64GB of the same RAM for under $500, and there’s a Snazzy Labs RAM Upgrade Tutorial and Teardown; the disassembly doesn’t look fun, but worth doing if you’re going to use it as a server. A casual user can live on somewhat less RAM with the Apple RAM tax.

lain-s1e3-open navi

Windows and Linux users, people who’ve only used garbage computers, are confused by Apple’s attitude on pricing, upgrades, and repairs because they’ve never thought about non-garbage computing.

Apple doesn’t price based on hardware costs (except for RAM, which they tax 50-300% over cost), but on where it fits in a Portability/Power chart, starting at $1000, because you’re buying “machine that runs Mac OS X”, not “random collection of parts that does not run Mac OS X”. You’ll never see Apple micro-adjust prices day to day as part prices or exchange rates change, because it has nothing to do with that.

If you want to upgrade an Apple device, other than RAM in some models, you sell it at a high resale value and buy a better one. Garbage computers are useless in a couple years, cost more to replace parts than they’re worth, and have no resale value at all.

If you want to repair an Apple device, it’s either free for as long as your AppleCare lasts, or $100 in most cases. Don’t keep open containers of liquid on your desk (*), don’t abuse your expensive hardware, and the repair isn’t a problem (notably, the same guy at Snazzy Labs fucked up his iMac Pro and Apple unsurprisingly told him to go piss up a rope).

*: I wanted to link in the atp.fm episodes where John warns about this, and then gets to say “I told you so”, but I can’t find them with obvious keywords.