894400df8ad8

It is a new year
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Wed, 15 Jan 2020 20:28:30 -0500
parents dab1f38ba625
children ede69641159a
branches/tags (none)
files 2019.markdown README.markdown

Changes

--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2019.markdown	Wed Jan 15 20:28:30 2020 -0500
@@ -0,0 +1,735 @@
+[TOC]
+
+# January 2019
+
+Happy new year!
+
+## 2019-01-01
+
+Started poking around at Fern again.  Need lots more thinking on this.  Slow and
+steady wins the race.
+
+## 2019-01-02
+
+Had trouble booting my Ubuntu partition, it took forever and tossed me at a root
+prompt with "You are in Emergency Mode".  Turns out the line I added to
+`/etc/fstab` broke things when the external drive isn't plugged in.  Need to
+figure out how to fix that.
+
+## 2019-01-04
+
+Did a good chunk of work on Fern.  Finally got all the official opcodes written
+out after rewriting the addressing mode stuff three or four times.
+
+## 2019-01-05
+
+More work on Fern.  Got all of `nestest.nes` passing after lots of run, diff,
+fix cycles.  On to pictures and sound!
+
+## 2019-01-06
+
+More work on Fern.  Did a lot of restructuring and didn't make much actual
+progress, but I think it was helpful for wrapping my brain around stuff.
+
+## 2019-01-07
+
+Someone wanted me to take a look at getting my coding math repo running again.
+It's bitrotted.  Need to install SDL first:
+
+    sudo apt install libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libffi-dev
+
+Pushed a commit to fix the most obvious brokenness, but something inside SDL
+makes CCL shit itself and drop you into the kernel debugger and I just can't be
+bothered to figure out the shitshow that is graphics programming.  Sorry.  Best
+to look at my `coding-math` repo as a historical curiosity.
+
+Did some research and thinking about the GUI for Fern.  Refreshed my memory on
+all the inscrutable fucking acronyms:
+
+* OpenGL: take triangles and textures and shaders, render pixels.
+* GLU: utilities for OpenGL, probably outdated and not needed any more.
+* GLUT: handles the OS-specific stuff about getting a window to draw into, getting keystrokes, etc.
+* GLFW: competitor to GLUT that does the same things?
+* SDL: competitor to GLUT/GLU that does the same things, plus other things like sound, networking, etc.
+* GLEW: completely unrelated, handles OpenGL extensions (GL Extension Wrangler).
+
+Looked into immediate mode GUI libs like IMGUI and Nuklear.  They're especially
+weird in that you have to provide your own rendering backend and input support.
+So you'd use them *in addition* to GLFW+OpenGL, for example, and you need to
+wire up all the support yourself.
+
+These might be good eventually but I think I can probably just get away with
+GLFW for now, since I just want to display some god damn pixels in a window.
+I can do sound with PortAudio like I did for `cl-chip8`.  That'll be a fun
+learning experience and should work just fine for the NES.
+
+## 2019-01-08
+
+Started really wrapping my head around pattern tables for Fern.  Wrote some
+janky code to render them as strings for now.
+
+Started poking around with `cl-glfw3` and `cl-opengl`.  OpenGL is as much of an
+inscrutable shitshow as I remember, though I have a little bit of a head start
+in understanding it this time around.  Hopefully it won't take me too long to
+remember everything.  I did manage to get the example running smoothly, so
+that's nice.
+
+Started going through <http://learnopengl.com> to try to remember how to do this
+crap.  Spent lots of time fighting with object lifetimes because the examples
+all just garbage collect with `exit()`.
+
+## 2019-01-09
+
+Started booking travel for the upcoming year.
+
+Got my copy of [Programming the 65816](https://amzn.to/2RH8or0).  Gonna skim
+through it for all the 6502-specific bits to hopefully fill in the gaps in my
+brain for Fern.
+
+## 2019-01-10
+
+Finally got around to replacing `mkpass` with a version in Common Lisp.  My
+collection of CL scripts is growing, now that I have Adopt to make writing their
+UI less painful.  Need to dogfood it a bit more and eventually release it.
+
+Did a bit more of the OpenGL tutorial.
+
+## 2019-01-12
+
+Did some more of the OpenGL tutorial.  Added some extra bits to cl-netpbm to
+easily load an image into an array in the form OpenGL expects.  Started
+sketching out the GUI structure in Fern.
+
+## 2019-01-19
+
+Got pattern tables rendering in Fern (finally).
+
+## 2019-01-22
+
+Got a first pass at the main GUI loop for Fern hashed out.  GUI programming is
+fucking miserable.
+
+## 2019-01-24
+
+The saga of my keyboard disconnects continues.  Captured a `dmesg` log of it
+happening:
+
+    [88916.149078] usb 1-2.1-port1: disabled by hub (EMI?), re-enabling...
+    [88916.152083] usb 1-2.1.1: USB disconnect, device number 29
+    [88916.638190] usb 1-2.1.1: new full-speed USB device number 33 using xhci_hcd
+    [88916.958196] usb 1-2.1.1: New USB device found, idVendor=1d50, idProduct=6122
+    [88916.958199] usb 1-2.1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
+    [88916.958200] usb 1-2.1.1: Product: Ultimate Hacking Keyboard
+    [88916.958202] usb 1-2.1.1: Manufacturer: Ultimate Gadget Laboratories
+    [88916.979576] hid-generic 0003:1D50:6122.002A: hiddev1,hidraw2: USB HID v1.10 Device [Ultimate Gadget Laboratories Ultimate Hacking Keyboard] on usb-0000:01:00.0-2.1.1/input0
+    [88916.989417] input: Ultimate Gadget Laboratories Ultimate Hacking Keyboard as /devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-2/1-2.1/1-2.1.1/1-2.1.1:1.1/0003:1D50:6122.002B/input/input45
+    [88917.046540] hid-generic 0003:1D50:6122.002B: input,hidraw3: USB HID v1.10 Keyboard [Ultimate Gadget Laboratories Ultimate Hacking Keyboard] on usb-0000:01:00.0-2.1.1/input1
+    [88917.056500] input: Ultimate Gadget Laboratories Ultimate Hacking Keyboard as /devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-2/1-2.1/1-2.1.1/1-2.1.1:1.2/0003:1D50:6122.002C/input/input46
+    [88917.114459] hid-generic 0003:1D50:6122.002C: input,hidraw4: USB HID v1.10 Device [Ultimate Gadget Laboratories Ultimate Hacking Keyboard] on usb-0000:01:00.0-2.1.1/input2
+    [88917.124334] input: Ultimate Gadget Laboratories Ultimate Hacking Keyboard as /devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-2/1-2.1/1-2.1.1/1-2.1.1:1.3/0003:1D50:6122.002D/input/input47
+    [88917.182306] hid-generic 0003:1D50:6122.002D: input,hidraw5: USB HID v1.10 Device [Ultimate Gadget Laboratories Ultimate Hacking Keyboard] on usb-0000:01:00.0-2.1.1/input3
+    [88917.194570] input: Ultimate Gadget Laboratories Ultimate Hacking Keyboard as /devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-2/1-2.1/1-2.1.1/1-2.1.1:1.4/0003:1D50:6122.002E/input/input48
+    [88917.194696] hid-generic 0003:1D50:6122.002E: input,hidraw7: USB HID v1.10 Mouse [Ultimate Gadget Laboratories Ultimate Hacking Keyboard] on usb-0000:01:00.0-2.1.1/input4
+    [88917.258912] usb 1-2.1.2: reset full-speed USB device number 31 using xhci_hcd
+
+Observations:
+
+* It's only the keyboard disconnecting.  The mouse is also plugged into the same
+  USB hub, and that doesn't seem to get disconnected (the "mouse" in that log
+  output is the virtual one the UHK uses to do mouse stuff).
+* I'm pretty sure this happens regardless of what USB port it's plugged into.
+  I'm going to try plugging it into a different port on the hub, and if that
+  fails, into the monitor hub, and maybe into the work laptop itself.
+* My Realforce did the same thing, so it can't be specific to the keyboard.
+
+What the fuck, man.
+
+Added a skeleton of a nametable viewer to Fern.  The windowing works, but I've
+hit a problem I'm not sure exactly how to solve.
+
+For some reason, I thought it was the `poll-events` call that blocked til vsync.
+That was incorrect — it's the `swap-buffers` that waits.  This exposes two
+problems in my current design:
+
+1. When we don't have to draw anything, we never call `swap-buffers`, and so
+   never have a chance to block, and so busy loop and consume an entire CPU
+   core.
+2. If we have multiple windows open that all want to draw on the same frame,
+   they'll vsync one after another and end up cutting our FPS down.
+
+I could potentially solve 1 with something like "if you didn't draw anything,
+sleep for 10ms" or something, but that doesn't fix problem 2, which is more of
+an issue.
+
+Problem 2 is trickier.  I searched around a little bit online and found a couple
+of things I might want to try.
+
+1. Disabling vsync and managing it myself with sleeps.  Folks warn that this
+   could produce tearing, so it doesn't seem ideal.
+2. Track which windows need to swap.  Enable vsync for the first and swap,
+   disable it for the rest and swap them.  Sleep if nothing needs to swap.  This
+   seems reasonable, though some folks said it might still produce tearing?
+3. Run each window in its own thread, and vsync.  Does this work on MacOS?  Do
+   I care?
+
+Need to sleep on this.
+
+## 2019-01-27
+
+Took another two stabs at the Fern multiple windows things.  I basically ended
+up going with option 2.  It seems to work.  Still need to do some actual work
+on the nametable viewer, but at least it doesn't eat my CPU and/or take way too
+long to do anything now.
+
+# February 2019
+
+Spent the first two weeks in SF for work.
+
+## 2019-02-18
+
+Back from SF.  Registered for ELS 2019.  Don't have anything to talk about this
+time, but it'll be good to see folks again.
+
+## 2019-02-22
+
+Did some more Rosalind problems.  I'm up to 33 or so now.  These were fairly
+straightforward, but there are some other trickier ones I need to think about
+more.
+
+## 2019-02-23
+
+Did another Rosalind problem.  Spent some time dicking around with `format` to
+try to figure out how to do the equivalent of the following:
+
+    (format nil "~{~,VF~^ ~}" precision floats)
+
+The intent is to print all the floats with the given precision.  This doesn't
+work, because the `V` is inside the `~{~}` directive, and so `format` expects
+two list items per iteration.  Options:
+
+1. Generate a control string at runtime with a separate `format` (gross).
+2. Define `print-float` to be a formatting function that uses a dynamic variable
+   and use`~/print-float/` in the control string (awkward).
+3. Interleave the precision in the list (wasteful).
+4. Do something horrible.
+
+I went with option 4:
+
+    (defun float-string (float-or-floats &optional (precision 3))
+      (with-output-to-string (s)
+        (loop :for (float . more) :on (ensure-list float-or-floats)
+              :do (format s "~,VF~:[~; ~]" precision float more))))
+
+Finally wrote some documentation for
+[cl-netpbm](https://sjl.bitbucket.io/cl-netpbm/) and sent a request to get it
+into Quicklisp.  The project backlog continues to shrink.
+
+Started reading the Bioinformatics Algorithms book.  Set up a new repo for it.
+Did the first problem just to make sure all the pieces are hooked up.  The first
+problem is trivial to do serially.  Dicked around with lparallel to exercise my
+fancy machine a bit.  Learned a few things:
+
+* You can give each lparallel worker thread its own thread-local bindings with
+  `:bindings '((*foo* . (form to eval) …))`.  This is nice to give each thread
+  its own random number generator so they can work concurrently.
+* Generating ~32gb of random DNA is a *lot* faster when you do it on 16 cores
+  instead of 1.
+* Giving SBCL all of my 64gb of memory is a bad idea.  It will try to use *all*
+  of it, and I usually have at least another few GB used, and the Linux OOM
+  killer does not fuck around.
+* I need a better interface for cl-pcg.  The current one blows.
+* SBCL does appear to `free` memory back to the OS when it GCs, unlike the JVM.
+
+Asked #sbcl for clarification on a couple of things:
+
+    <sjl> Are there any thread safety guarantees for writing to separate elements of SIMPLE-ARRAYs?
+    <sjl> Example: I want to initialize a large (~30gb) array with random data (DNA bases) for testing purposes.
+    <sjl> If I make the array a (SIMPLE-ARRAY CHARACTER (*)) and initialize it using LPARALLEL:PDOTIMES to work in chunks, it appears to work fine, but I assume I can't rely on that behaviour.
+    <sjl> I'm guessing if I switched to something more compact like (SIMPLE-ARRAY (INTEGER 0 3) (*)) this would no longer Just Work™.
+    <sjl> Would I then need to use the CAS stuff to guarantee that one thread writing to (AREF FOO N) and another writing to (AREF FOO (1+ N)) don't step on each others' toes?
+    <pkhuong> sjl: bytes and larger are safe.
+    <pkhuong> there is no guarantee
+    <pkhuong> except for the fact that it's implemented that way
+    <pkhuong> threading is outside the spec. developing a formal memory model is expensive.
+    <sjl> Yeah
+    <sjl> It seems unlikely that "bytes and larger are safe" would stop being true in the future, right?
+    <pkhuong> correct.
+    <sjl> I think I can live with that.
+    <sjl> Thanks.
+    <pkhuong> don't run on itanium. I'd double check the disassembly on ARM.
+    <sjl> Ah, not using either at the moment, but good to know.
+
+## 2019-02-24
+
+More Bioinformatics Algorithms problems.
+
+# March 2019
+
+## 2019-03-01
+
+Did the `LONG` Rosalind problem while sitting in ORD.  Not completely happy with
+it — I feel like I must be missing something that would make this cleaner.
+
+## 2019-03-08
+
+Did some more BIAL problems.  Spent way too much time writing iterate drivers to
+make the problems themselves look clean.  Oh well, I'll use them again some day.
+
+## 2019-03-09
+
+Browsed through `st`'s code a little bit.  Seems fairly simple (at least as
+simple as a language as weak as C can be).
+
+More BIAL problems.  Spent a bunch of time screwing around with iterate and
+lparallel for not a lot of benefit.  Oh well.
+
+Finished The Character of Physical Law by Feynman.  A bunch went over my head,
+but it was still a good read.
+
+# April 2019
+
+## 2019-04-12
+
+My [MakerLisp Machine](https://makerlisp.com/) arrived.  Going to put it
+together and brain dump along the way.
+
+I had previously downloaded and extracted `makerlisp.zip`, and committed the
+result into a Mercurial repo.  Just to be safe I wanted to see if it had been
+updated since a couple of days ago.  I downloaded it again, moved it into the
+repo, and then `rm -rf src doc RELEASE` and `unzip makerlisp.zip`.  Then an `hg
+diff` showed me the changes.  Maybe this process could be made easier (e.g. by
+just letting me clone the git repo?) but it's easy enough to script up if
+necessary.
+
+Used my new SD card reader to get at the SD card.  It was FAT32 as expected, so
+nothing to mess around with there.  Had to first get it mounted, and of course
+mounting anything is a giant pain in the ass on Linux.  I miss MacOS.  Ended up
+using `udisksctl mount -b /dev/sdc1` to mount the thing without dicking around
+with `fstab`.  Then `cp -rt /media/sjl/…mountpoint…/ src/uSDimage/*` to actually
+copy the files.  It was pretty fast.  `udisksctl unmount -b /dev/sdc1` to eject.
+
+Installed the battery.
+
+Wiring up the VGA controller and USB keyboard controller.  Almost messed up
+— the RX pin goes to PD0 and the C pin goes to PB1.  Note it's D and B, not the
+same letter!
+
+VGA cable is quite beefy, not perfect for routing around everything.  But it
+does the job.
+
+After connecting everything and plugging it in, it works!  The screen looks
+a little odd because there appear to be two prompts.  I wonder if the graphics
+mode is wonky.
+
+Had some issues getting the keyboard working:
+
+* The documentation says to make sure the RX jumper isn't connected.  The board
+  came this way, so that was fine.
+* But the board came with the TX jumper jumped, and I had to *remove* that to
+  get the keyboard to work.
+* Then I tried to use some other USB keyboards, because the 40% one is just too
+  painful to type on.  The Realforce 104 worked fine, but my HHKB and my UHKs
+  didn't work at all.  They're getting power (they light up) but typing doesn't
+  work at all.
+
+Setting the time and date worked great.  They persist across restarts and such.
+
+After evaluating some stuff, the screen seems to be garbled.  Not sure exactly
+what I need to do/configure to get the screen working properly.  Evaluating
+`(cls)` does clear the screen back to the beginning, so I can use that for now.
+
+## 2019-04-13
+
+Trying to get my code-to-PDF thing ported to Linux.  Random notes:
+
+No idea where my header file is.  Probably forgot to commit it.
+
+`pstopdf` is called `ps2pdf` on Linux and has different options, because fuck
+you.
+
+To list fonts and their files on the system: `fc-list`.
+
+`enscript` on Linux can't just take one of these fonts because fuck you.  It
+needs an "AFM" file for some reason.
+
+Can generate an `afm` file with `ttf2afm` which is in the `texlive-binaries`
+package along with a whole other pile of bullshit I don't need.  Cool:
+
+    sudo apt install texlive-binaries
+    ttf2afm /usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf | sudo tee /usr/share/enscript/afm/umr.afm`
+
+Then I need to edit `/usr/share/enscript/afm/font.map` because this program is
+incapable of `ls`ing a directory to find all the font maps in it or something.
+Note that the font name here needs to match the font name in the generated AFM
+even though you're explicitly telling the stupid program which AFM to use with
+a given font name, because once again: fuck you.
+
+Found the `sjl.hdr` file on my old machine.  It was just in `/usr/local` because
+I was lazy.  Committed it to my dotfiles this time.
+
+I also had a `clisp.st` highlighting file in there.  Need to symlink that into
+`/usr/share` too, and also update the `enscript.st` file to add it.
+
+Also need to hack `enscript.st` to tell enscript how to find the proper variants
+of my font.  Jesus:
+
+    else if (is_prefix ("UbuntuMono", font))
+      {
+        bold_font = "UbuntuMono-Bold";
+        italic_font = "UbuntuMono-Italic";
+        bold_italic_font = "UbuntuMono-BoldItalic";
+      }
+
+Now the thing finally fucking runs again.  So now I can get started printing the
+MakerLisp code.  However, if I do my usual one-page-per-file style it ends up
+being 198 pages, and many of them are almost entirely blank.  So instead I can
+cat the various groups of files together with something like:
+
+    cd bin
+    ffindext l | sort | xargs -I file sh -c "cat file; echo" > ../bin.l
+    cd ../..
+
+    cd l/lang
+    ffindext l | sort | xargs -I file sh -c "cat file; echo" > ../lang.l
+    cd ../..
+
+    cd l/clib
+    ffindext l | sort | xargs -I file sh -c "cat file; echo" > ../clib.l
+    cd ../..
+
+    cd l/ez80
+    ffindext l | sort | xargs -I file sh -c "cat file; echo" > ../ez80.l
+    cd ../..
+
+And then generate the PDF with something like:
+
+    ffindext l | sort | grep -v /lang/ | grep -v /bin/ | grep -v /clib/ | grep -v /ez80/ | xargs code-to-pdf "MakerLisp"
+
+Now we're down to 64 pages, which is much more reasonable.  The `demo` and
+`util` directories have some beefier programs, so I'll leave those alone.  And
+I *finally* have a PDF I can print.  I hate computers.
+
+Booted up the lisp machine again and today the TX jumper seems to work as
+documented.  I tried debugging the display corruption with the info from the
+email Luther sent (getting a bunch of text on the screen and pressing the Auto
+button) but that didn't seem to help.  Emailed back.
+
+## 2019-04-14
+
+More troubleshooting of the Lisp machine video issues.  Borrowed a miniDP/VGA
+dongle and TV with a VGA input (apparently they still exist) from a friend, and
+got a new VGA cable.  The results are very confusing:
+
+* Cable makes no different in any scenario.
+* WORKS: Macbook miniDP to dongle to Elecrow VGA
+* WORKS: Thinkpad miniDP to dongle to Elecrow VGA
+* WORKS: Lisp Machine VGA to TV VGA
+* BORKED: Lisp Machine VGA to Elecrow VGA
+
+Emailed the author back with my results.  This is really strange… I would have
+expected either the monitor or the Lisp Machine were the problem, but they only
+seem to not work *together*.
+
+## 2019-04-16
+
+The Makerlisp author received an updated version of the monitor and he's now
+seeing the same thing I am, so it's nothing I did wrong.  He's mailing me his
+old/good monitor and I'm mailing him my bad new one, which was very kind of him.
+
+Spent a while getting Vim set up to work with a Makerlisp REPL.  Mostly got it
+working, except the newline handling is going to be kind of a pain.  But I can
+live with that for now, in exchange for being able to edit in Vim with Paredit
+and sending to a REPL easily.
+
+## 2019-04-18
+
+More poking around at MakerLisp.
+
+I know I'm going to need user input for a game, so my first idea is to see if
+I can make some reading functions.  `read-line` would be good for a text
+adventure.  I found an example implementation in the shunting yard demo, but
+also tried writing my own.  I wrote a bunch of other stuff along the way too.
+Did `read-byte` and `read-char`.  Not sure how to go about making the `-no-hang`
+variants.
+
+Is there something like CL's `macroexpand-1` that will only do one level of
+macroexpansion?  It's a bit hard to read when *everything* gets expanded…
+
+Symbols don't seem to be printed readably.
+
+Spent 15+ minutes wondering why my `defmacro` macro would go into an infinite
+loop on the second and further tries.  Realized it's because I was using the
+file as a scratch space, and so when it would `forget` itself and autoload it
+would be evaling the `expand` call over and over.  I'm so dumb.
+
+`cadr` is a macro, so I can't map it (or, rather, I can with *very* strange
+results).
+
+`print` and friends don't return their argument, which means you can't just wrap
+a `(print …)` around something when debugging.
+
+## 2019-04-19
+
+New screen arrived today.  It works!  Then I needed to sync the SD card again.
+Commands to do that (eventually I'll script these):
+
+    udisksctl mount -b /dev/sdc1
+    rsync -avd ./ --copy-unsafe-links --exclude=.hg  /media/sjl/3831-6133
+    udisksctl unmount -b /dev/sdc1 
+
+(Aside: why don't I always just pipe `histgrep` into `nvim -`?)
+
+Narrowed down my macro troubles to a couple of bugs in MakerLisp itself.  He's
+going to take care of them.
+
+## 2019-04-20
+
+Need a random number generator for the MakerLisp machine.  I could FFI out, but
+it'll be more fun to write a PCG for it.  This turned out to be a hell of
+a rabbit hole.
+
+I've written PCGs before, of course, but on normal computers where I could just
+use the bit sizes and multiplier of the reference implementation.  Here I can't
+do that, so I had to try to come up with something that would work with 24 bit
+integers.  Turns out not many folks have done much LCG research on 24-bit
+machines (go figure).  All the test suites (e.g. TestU01 and PractRand)
+immediately fail small PRNGs, so it's hard to know if I've got something decent
+or not.  Oh well, it's just for games, it's not life and death.
+
+Random notes:
+
+* The "Randograms" in the blog post are confusing because they're sampling the
+  entire period of the generator, but still get odd-numbered occurence counts.
+  This confused the hell out of me until I realized that by "pair up the
+  numbers" they mean a sliding two element window: `(1 2 3 4)` produces `((1 2)
+  (2 3) (3 4))`.
+* The 256x256 size works perfectly for the 8-bit generators.  I wasn't able to
+  extend it for 16-bit generators because exhausting their period would take
+  *much* longer.
+* It's still not clear to me how to decide what's a "good" multiplier for
+  smaller-sized PRNGs.  They fail the tests right away because they're so small,
+  so I can't really go by that.
+
+## 2019-04-30
+
+Started playing/rating the lisp jam games.  Wanted to install a VM to safely
+play the non-web ones, which led to a big old rabbit hole:
+
+* Need to enable CPU virtualization in the BIOS to get VirtualBox to work.
+* When I rebooted my desktop crashed right after logging in.
+* Took me a while to find my display manager logs because I can never remember
+  its fucking name (and can never remember that it's "display manager" and not
+  "desktop manager").  Hey idiot future self: you use XDM.
+* Thought the problem was maybe because I just upgraded SBCL and didn't rebuild
+  Stump.  Tried that, didn't help.
+* Saw some errors in the XDM log about the config file not parsing properly.
+  Fixed those.  Didn't help.
+* Opened `.xsessionrc` and immediately saw the problem: the `gpg-agent` shit
+  I added on my work machine and pulled down here.  Christ.  Removed that for
+  now because I can't remember the magic systemd incantation required to get it
+  to quit fucking autostarting the agent whenever anything looks in the general
+  direction of its ports and I want to move on with my fucking life tonight.
+
+# May 2019
+
+## 2019-05-20
+
+Going to try to reboot this plan.  I know I haven't kept up with it very well
+(though my work `.plan` has been going strong every day since October).  Oh
+well, no time like the present to restart.
+
+Added a couple of type checks to Adopt.  The only main thing left is to rewrite
+the unit tests to work in the new style.  Then it should be ready for Quicklisp,
+I think.
+
+Continued learning how to sew.  Hemmed my second pair of pants.  Kind of
+a miserable experience, but I'm getting better.  It's weird that the machine
+will happily let you forget to put the foot down before letting you sew, happily
+fucking up your shit into a giant bird's nest instead of having some kind of
+switch you need to press to let yourself fuck it all up.  Oh well, I'll just
+learn to not make mistakes I guess.
+
+Finally figured out what all the `/dev/loopNN` bullshit on Ubuntu is.  Seems to
+be their app store thing "snap".  I removed some of the garbage "snaps" I never
+installed in the first place, but there's still some installed with scary names
+like "core" so I guess I'll just have to live with them if I don't want to take
+the risk of breaking something.  I did make a little `disks` script to show me
+the output I care about using a combination of `lsblk` and `du` and `grep`.
+It'll do for now.
+
+New UHK came.  I now own three: one with browns, one with browns plus
+stabilizers, and one with blues.  The blues are even clickier than I remember.
+I think I still prefer the unsilenced browns though.  They have a nice clunk to
+them instead of the clickiness of the blues.  I think I'm finally done buying
+keyboards — 2 at home and one at the office is plenty.
+
+Need to figure out how many hard drive bays I've got left in my tower and
+motherboard.  I'm running out of room on my Windows partition, and I'm thinking
+of using Lightroom on Windows to finally move one more thing away from MacOS.
+Sacrilege.  Then DJ'ing for blues and Lindy dances will be the only thing
+I still need the Mac for.  I can live with that.
+
+The polydivisibility search I wrote over the weekend is still churning away.
+It's searching base 41 now.  Checking base 39 took about 4.6 hours.  Base 40
+took around half that.  We'll see how long 41 takes.  Still no results,
+unfortunately.  I wonder if I could prove that odd bases never work.  I played
+around on the whiteboard but couldn't come up with anything (and if Parker
+didn't I almost certainly won't, so I don't feel *too* bad about that).  At
+least my cores are getting some use.  It's fun to see all 32 bars full in
+`htop` for a change.  Memory usage is pretty constant at about 3-4gb, though it
+churns through a lot of garbage thanks to all the bignum arithmetic (~182tb
+allocated for base 39).  Is there a way to avoid all the bignum division maybe?
+
+## 2019-05-21
+
+Figured out why my alt key wasn't working.  What a gross rabbit shave:
+
+1. Alt key doesn't seem to be working (e.g. `alt-a` in Zoom doesn't work).
+2. Open `xev` and look.  Pressing `alt` shows keycode `133` and keysym `F17`.
+3. Open `.xmodmaprc`, which has `keycode 133 = Alt_L` and nothing else listed
+   for `133`.
+4. Source the file, then run `xmodmap -pke | grep 133` to see if it's working.
+5. This gives `keycode 133 = F17 NoSymbol F17`.  But all the *other* mappings in
+   the rc file are working, so what the fuck?
+6. Eventually I get the idea to look for `F17` instead.  Realize I have a bunch
+   of lines like `keycode 900 = F16`, `keycode 901 = F17`, `keycode 902 = F18`,
+   etc in the rc file.
+7. Tried commenting out the line that maps `F17`, and now everything works.
+8. But that was mapping keycode `901`, not `133`.  Why was it overwriting the
+   alt mapping?
+9. Because `901 ≡ 133 mod 256`.  Fucking kill me.
+
+Pushed my verbose-assertion patch for 1am to Github so I can get to it from
+other machines.
+
+Did some work to get Adopt's test suite running again.  Also added duplicate
+option detection.  Tests pass in SBCL and CCL.
+
+Tried to install ECL to see if I could run the tests there too.  Problem:
+there's no installation link/guide on the ECL page.  Really.  Here's what I did:
+
+    git clone https://gitlab.com/embeddable-common-lisp/ecl.git
+    cd ecl
+    git checkout ECL-16.1.3
+    ./configure --prefix=/usr/local
+    make
+    sudo make install
+
+Seems to work.  Adopt tests all pass just fine on SBCL, CCL, ECL, and ABCL.
+
+I thought about testing with CLASP, but looking at the installation process it
+says it'll take a couple of hours to install.  Maybe once my cores aren't busy
+on the polydivisibility checks I'll give it a go, but I don't want to stop it
+after many hours and waste all that progress, and I don't know how to make
+lparallel interrupt all the threads at once.
+
+Also finally added some docstrings for all the functions in the API.
+
+Anyway, I think Adopt is finally ready (or at least as ready as it's ever gonna
+be) for Quicklisp.  I submitted it.  It's a shame I just missed this month's
+dist.  Oh well, move slow and make things.
+
+## 2019-05-23
+
+There are no polydivisible numbers in base `41`.  The search continues.
+
+## 2019-05-24
+
+There are no polydivisible numbers in base `42` (what a shame).  Once again,
+even bases finish an order of magnitude faster than odd bases, and so far only
+even bases work.  I'm going to focus the search on the next couple of even bases
+to save time.  I wish I could figure out *why* even bases were more promising.
+Or just a better way to search.
+
+# June 2019
+
+## 2019-06-09
+
+Restarted work on Flax.  I want to be able to lay out my l-system nonaptychs
+entirely in Lisp, without having to dick around in Inkscape manually.  This
+requires two yaks to be shaved:
+
+1. A nice way to say "take this group of drawing objects and translate/scale
+   them into this specific bounding box".
+2. A way to render text without having to do it manually via Hersheytext.
+
+Implementing 1 was pretty easy.
+
+Implementing 2 is going to require bezier curves, so I went ahead and
+implemented those.  I ended up extending the `path` primitive to accept points
+with control points attached to draw the nice curves.  This was easy in SVG, but
+kind of a pain to do ergonomically in PNG.  I did eventually finish that though.
+So now I just need to find/make a font that I can render with those curves.
+
+Ended up just making my own "font" with only the characters I need for the
+L-systems (`+-()LR→ `).  Did a bit more and got string rendering working.  Still
+probably need to handle multiple lines, but this was a productive day.
+
+# July 2019
+
+## 2019-07-02
+
+My Linux machine has been randomly hanging completely when playing Youtube
+videos in Firefox.  I have to hard reboot the machine to get it back.  I have no
+idea how to debug this.
+
+Then, today, after one of these reboots the machine wouldn't even get to the
+BIOS at all.  Fantastic.  Looking inside at the motherboard's debug screen
+showed `C0`.  This code isn't mentioned in the manual at all.  Searching online
+showed a bunch of children flailing around in forums, but there was one useful
+nugget: resetting the CMOS.  Apparently you're supposed to do this when you
+install new RAM, and I did not.  It's worked fine for months, but oh well, may
+as well give it a try.  The button on the x399 is just to the left of the debug
+screen, and the computer needs to be completely unplugged for it to work.  After
+resetting the CMOS the machine took a long time to boot, but did eventually POST
+to the BIOS and boot normally.
+
+I think I want to update the BIOS at some point, but for now I'm just happy to
+have the machine back and working again.
+
+## 2019-07-09
+
+To get a black new tab page in Firefox, add the following to
+`~/.mozilla/firefox/*/chrome/userChrome.css`:
+
+    .browserContainer { background-color: #000000 !important; }
+
+And in `about:config` set `browser.display.background_color` to black.
+
+# August 2019
+
+## 2019-08-27
+
+BitBucket is shitcanning Mercurial support next year, so I have to run on the
+Hamster Wheel of Backwards Incompatibility and fix all my repositories and
+documentation.
+
+Started by setting up <http://docs.stevelosh.com> to serve the repo that was
+formerly served by BitBucket pages.  Added a hook into `.hg/hgrc` on the remote
+repo to autoupdate when pushed:
+
+    [hooks]
+    changegroup = hg update
+
+Then reconfigured nginx to serve the repo (which is full of plain old HTML files
+so it Just Works).  Decided to be lazy and just use `autoindex on` to generate
+the index page.  Good enough.
+
+Added `docs.stevelosh.com` to DNS.
+
+I still need to update all my `pubdocs` make targets, and also update all the
+links everywhere, but that can wait.  One step at a time.
+
+# December 2019
+
+## 2019-12-23
+
+Enabled HTTPS for `stevelosh.com` and `docs.stevelosh.com` and
+`learnvimscriptthehardway.stevelosh.com`.  Used Let's Encrypt which was… okay
+I guess.  Hopefully the cron machinery works and I don't have to dick around
+with it again in the future.
+
+Spent some time migrating all my Bitbucket repos to Source Hut and updating the
+links, so that when Atlassian tells us all to eat shit next year I don't have to
+scramble.
+
--- a/README.markdown	Wed Jan 15 20:27:24 2020 -0500
+++ b/README.markdown	Wed Jan 15 20:28:30 2020 -0500
@@ -1,738 +1,5 @@
 [TOC]
 
-# January 2019
-
-Happy new year!
-
-## 2019-01-01
-
-Started poking around at Fern again.  Need lots more thinking on this.  Slow and
-steady wins the race.
-
-## 2019-01-02
-
-Had trouble booting my Ubuntu partition, it took forever and tossed me at a root
-prompt with "You are in Emergency Mode".  Turns out the line I added to
-`/etc/fstab` broke things when the external drive isn't plugged in.  Need to
-figure out how to fix that.
-
-## 2019-01-04
-
-Did a good chunk of work on Fern.  Finally got all the official opcodes written
-out after rewriting the addressing mode stuff three or four times.
-
-## 2019-01-05
-
-More work on Fern.  Got all of `nestest.nes` passing after lots of run, diff,
-fix cycles.  On to pictures and sound!
-
-## 2019-01-06
-
-More work on Fern.  Did a lot of restructuring and didn't make much actual
-progress, but I think it was helpful for wrapping my brain around stuff.
-
-## 2019-01-07
-
-Someone wanted me to take a look at getting my coding math repo running again.
-It's bitrotted.  Need to install SDL first:
-
-    sudo apt install libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libffi-dev
-
-Pushed a commit to fix the most obvious brokenness, but something inside SDL
-makes CCL shit itself and drop you into the kernel debugger and I just can't be
-bothered to figure out the shitshow that is graphics programming.  Sorry.  Best
-to look at my `coding-math` repo as a historical curiosity.
-
-Did some research and thinking about the GUI for Fern.  Refreshed my memory on
-all the inscrutable fucking acronyms:
-
-* OpenGL: take triangles and textures and shaders, render pixels.
-* GLU: utilities for OpenGL, probably outdated and not needed any more.
-* GLUT: handles the OS-specific stuff about getting a window to draw into, getting keystrokes, etc.
-* GLFW: competitor to GLUT that does the same things?
-* SDL: competitor to GLUT/GLU that does the same things, plus other things like sound, networking, etc.
-* GLEW: completely unrelated, handles OpenGL extensions (GL Extension Wrangler).
-
-Looked into immediate mode GUI libs like IMGUI and Nuklear.  They're especially
-weird in that you have to provide your own rendering backend and input support.
-So you'd use them *in addition* to GLFW+OpenGL, for example, and you need to
-wire up all the support yourself.
-
-These might be good eventually but I think I can probably just get away with
-GLFW for now, since I just want to display some god damn pixels in a window.
-I can do sound with PortAudio like I did for `cl-chip8`.  That'll be a fun
-learning experience and should work just fine for the NES.
-
-## 2019-01-08
-
-Started really wrapping my head around pattern tables for Fern.  Wrote some
-janky code to render them as strings for now.
-
-Started poking around with `cl-glfw3` and `cl-opengl`.  OpenGL is as much of an
-inscrutable shitshow as I remember, though I have a little bit of a head start
-in understanding it this time around.  Hopefully it won't take me too long to
-remember everything.  I did manage to get the example running smoothly, so
-that's nice.
-
-Started going through <http://learnopengl.com> to try to remember how to do this
-crap.  Spent lots of time fighting with object lifetimes because the examples
-all just garbage collect with `exit()`.
-
-## 2019-01-09
-
-Started booking travel for the upcoming year.
-
-Got my copy of [Programming the 65816](https://amzn.to/2RH8or0).  Gonna skim
-through it for all the 6502-specific bits to hopefully fill in the gaps in my
-brain for Fern.
-
-## 2019-01-10
-
-Finally got around to replacing `mkpass` with a version in Common Lisp.  My
-collection of CL scripts is growing, now that I have Adopt to make writing their
-UI less painful.  Need to dogfood it a bit more and eventually release it.
-
-Did a bit more of the OpenGL tutorial.
-
-## 2019-01-12
-
-Did some more of the OpenGL tutorial.  Added some extra bits to cl-netpbm to
-easily load an image into an array in the form OpenGL expects.  Started
-sketching out the GUI structure in Fern.
-
-## 2019-01-19
-
-Got pattern tables rendering in Fern (finally).
-
-## 2019-01-22
-
-Got a first pass at the main GUI loop for Fern hashed out.  GUI programming is
-fucking miserable.
-
-## 2019-01-24
-
-The saga of my keyboard disconnects continues.  Captured a `dmesg` log of it
-happening:
-
-    [88916.149078] usb 1-2.1-port1: disabled by hub (EMI?), re-enabling...
-    [88916.152083] usb 1-2.1.1: USB disconnect, device number 29
-    [88916.638190] usb 1-2.1.1: new full-speed USB device number 33 using xhci_hcd
-    [88916.958196] usb 1-2.1.1: New USB device found, idVendor=1d50, idProduct=6122
-    [88916.958199] usb 1-2.1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
-    [88916.958200] usb 1-2.1.1: Product: Ultimate Hacking Keyboard
-    [88916.958202] usb 1-2.1.1: Manufacturer: Ultimate Gadget Laboratories
-    [88916.979576] hid-generic 0003:1D50:6122.002A: hiddev1,hidraw2: USB HID v1.10 Device [Ultimate Gadget Laboratories Ultimate Hacking Keyboard] on usb-0000:01:00.0-2.1.1/input0
-    [88916.989417] input: Ultimate Gadget Laboratories Ultimate Hacking Keyboard as /devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-2/1-2.1/1-2.1.1/1-2.1.1:1.1/0003:1D50:6122.002B/input/input45
-    [88917.046540] hid-generic 0003:1D50:6122.002B: input,hidraw3: USB HID v1.10 Keyboard [Ultimate Gadget Laboratories Ultimate Hacking Keyboard] on usb-0000:01:00.0-2.1.1/input1
-    [88917.056500] input: Ultimate Gadget Laboratories Ultimate Hacking Keyboard as /devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-2/1-2.1/1-2.1.1/1-2.1.1:1.2/0003:1D50:6122.002C/input/input46
-    [88917.114459] hid-generic 0003:1D50:6122.002C: input,hidraw4: USB HID v1.10 Device [Ultimate Gadget Laboratories Ultimate Hacking Keyboard] on usb-0000:01:00.0-2.1.1/input2
-    [88917.124334] input: Ultimate Gadget Laboratories Ultimate Hacking Keyboard as /devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-2/1-2.1/1-2.1.1/1-2.1.1:1.3/0003:1D50:6122.002D/input/input47
-    [88917.182306] hid-generic 0003:1D50:6122.002D: input,hidraw5: USB HID v1.10 Device [Ultimate Gadget Laboratories Ultimate Hacking Keyboard] on usb-0000:01:00.0-2.1.1/input3
-    [88917.194570] input: Ultimate Gadget Laboratories Ultimate Hacking Keyboard as /devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-2/1-2.1/1-2.1.1/1-2.1.1:1.4/0003:1D50:6122.002E/input/input48
-    [88917.194696] hid-generic 0003:1D50:6122.002E: input,hidraw7: USB HID v1.10 Mouse [Ultimate Gadget Laboratories Ultimate Hacking Keyboard] on usb-0000:01:00.0-2.1.1/input4
-    [88917.258912] usb 1-2.1.2: reset full-speed USB device number 31 using xhci_hcd
-
-Observations:
-
-* It's only the keyboard disconnecting.  The mouse is also plugged into the same
-  USB hub, and that doesn't seem to get disconnected (the "mouse" in that log
-  output is the virtual one the UHK uses to do mouse stuff).
-* I'm pretty sure this happens regardless of what USB port it's plugged into.
-  I'm going to try plugging it into a different port on the hub, and if that
-  fails, into the monitor hub, and maybe into the work laptop itself.
-* My Realforce did the same thing, so it can't be specific to the keyboard.
-
-What the fuck, man.
-
-Added a skeleton of a nametable viewer to Fern.  The windowing works, but I've
-hit a problem I'm not sure exactly how to solve.
-
-For some reason, I thought it was the `poll-events` call that blocked til vsync.
-That was incorrect — it's the `swap-buffers` that waits.  This exposes two
-problems in my current design:
-
-1. When we don't have to draw anything, we never call `swap-buffers`, and so
-   never have a chance to block, and so busy loop and consume an entire CPU
-   core.
-2. If we have multiple windows open that all want to draw on the same frame,
-   they'll vsync one after another and end up cutting our FPS down.
-
-I could potentially solve 1 with something like "if you didn't draw anything,
-sleep for 10ms" or something, but that doesn't fix problem 2, which is more of
-an issue.
-
-Problem 2 is trickier.  I searched around a little bit online and found a couple
-of things I might want to try.
-
-1. Disabling vsync and managing it myself with sleeps.  Folks warn that this
-   could produce tearing, so it doesn't seem ideal.
-2. Track which windows need to swap.  Enable vsync for the first and swap,
-   disable it for the rest and swap them.  Sleep if nothing needs to swap.  This
-   seems reasonable, though some folks said it might still produce tearing?
-3. Run each window in its own thread, and vsync.  Does this work on MacOS?  Do
-   I care?
-
-Need to sleep on this.
-
-## 2019-01-27
-
-Took another two stabs at the Fern multiple windows things.  I basically ended
-up going with option 2.  It seems to work.  Still need to do some actual work
-on the nametable viewer, but at least it doesn't eat my CPU and/or take way too
-long to do anything now.
-
-# February 2019
-
-Spent the first two weeks in SF for work.
-
-## 2019-02-18
-
-Back from SF.  Registered for ELS 2019.  Don't have anything to talk about this
-time, but it'll be good to see folks again.
-
-## 2019-02-22
-
-Did some more Rosalind problems.  I'm up to 33 or so now.  These were fairly
-straightforward, but there are some other trickier ones I need to think about
-more.
-
-## 2019-02-23
-
-Did another Rosalind problem.  Spent some time dicking around with `format` to
-try to figure out how to do the equivalent of the following:
-
-    (format nil "~{~,VF~^ ~}" precision floats)
-
-The intent is to print all the floats with the given precision.  This doesn't
-work, because the `V` is inside the `~{~}` directive, and so `format` expects
-two list items per iteration.  Options:
-
-1. Generate a control string at runtime with a separate `format` (gross).
-2. Define `print-float` to be a formatting function that uses a dynamic variable
-   and use`~/print-float/` in the control string (awkward).
-3. Interleave the precision in the list (wasteful).
-4. Do something horrible.
-
-I went with option 4:
-
-    (defun float-string (float-or-floats &optional (precision 3))
-      (with-output-to-string (s)
-        (loop :for (float . more) :on (ensure-list float-or-floats)
-              :do (format s "~,VF~:[~; ~]" precision float more))))
-
-Finally wrote some documentation for
-[cl-netpbm](https://sjl.bitbucket.io/cl-netpbm/) and sent a request to get it
-into Quicklisp.  The project backlog continues to shrink.
-
-Started reading the Bioinformatics Algorithms book.  Set up a new repo for it.
-Did the first problem just to make sure all the pieces are hooked up.  The first
-problem is trivial to do serially.  Dicked around with lparallel to exercise my
-fancy machine a bit.  Learned a few things:
-
-* You can give each lparallel worker thread its own thread-local bindings with
-  `:bindings '((*foo* . (form to eval) …))`.  This is nice to give each thread
-  its own random number generator so they can work concurrently.
-* Generating ~32gb of random DNA is a *lot* faster when you do it on 16 cores
-  instead of 1.
-* Giving SBCL all of my 64gb of memory is a bad idea.  It will try to use *all*
-  of it, and I usually have at least another few GB used, and the Linux OOM
-  killer does not fuck around.
-* I need a better interface for cl-pcg.  The current one blows.
-* SBCL does appear to `free` memory back to the OS when it GCs, unlike the JVM.
-
-Asked #sbcl for clarification on a couple of things:
-
-    <sjl> Are there any thread safety guarantees for writing to separate elements of SIMPLE-ARRAYs?
-    <sjl> Example: I want to initialize a large (~30gb) array with random data (DNA bases) for testing purposes.
-    <sjl> If I make the array a (SIMPLE-ARRAY CHARACTER (*)) and initialize it using LPARALLEL:PDOTIMES to work in chunks, it appears to work fine, but I assume I can't rely on that behaviour.
-    <sjl> I'm guessing if I switched to something more compact like (SIMPLE-ARRAY (INTEGER 0 3) (*)) this would no longer Just Work™.
-    <sjl> Would I then need to use the CAS stuff to guarantee that one thread writing to (AREF FOO N) and another writing to (AREF FOO (1+ N)) don't step on each others' toes?
-    <pkhuong> sjl: bytes and larger are safe.
-    <pkhuong> there is no guarantee
-    <pkhuong> except for the fact that it's implemented that way
-    <pkhuong> threading is outside the spec. developing a formal memory model is expensive.
-    <sjl> Yeah
-    <sjl> It seems unlikely that "bytes and larger are safe" would stop being true in the future, right?
-    <pkhuong> correct.
-    <sjl> I think I can live with that.
-    <sjl> Thanks.
-    <pkhuong> don't run on itanium. I'd double check the disassembly on ARM.
-    <sjl> Ah, not using either at the moment, but good to know.
-
-## 2019-02-24
-
-More Bioinformatics Algorithms problems.
-
-# March 2019
-
-## 2019-03-01
-
-Did the `LONG` Rosalind problem while sitting in ORD.  Not completely happy with
-it — I feel like I must be missing something that would make this cleaner.
-
-## 2019-03-08
-
-Did some more BIAL problems.  Spent way too much time writing iterate drivers to
-make the problems themselves look clean.  Oh well, I'll use them again some day.
-
-## 2019-03-09
-
-Browsed through `st`'s code a little bit.  Seems fairly simple (at least as
-simple as a language as weak as C can be).
-
-More BIAL problems.  Spent a bunch of time screwing around with iterate and
-lparallel for not a lot of benefit.  Oh well.
-
-Finished The Character of Physical Law by Feynman.  A bunch went over my head,
-but it was still a good read.
-
-# April 2019
-
-## 2019-04-12
-
-My [MakerLisp Machine](https://makerlisp.com/) arrived.  Going to put it
-together and brain dump along the way.
-
-I had previously downloaded and extracted `makerlisp.zip`, and committed the
-result into a Mercurial repo.  Just to be safe I wanted to see if it had been
-updated since a couple of days ago.  I downloaded it again, moved it into the
-repo, and then `rm -rf src doc RELEASE` and `unzip makerlisp.zip`.  Then an `hg
-diff` showed me the changes.  Maybe this process could be made easier (e.g. by
-just letting me clone the git repo?) but it's easy enough to script up if
-necessary.
-
-Used my new SD card reader to get at the SD card.  It was FAT32 as expected, so
-nothing to mess around with there.  Had to first get it mounted, and of course
-mounting anything is a giant pain in the ass on Linux.  I miss MacOS.  Ended up
-using `udisksctl mount -b /dev/sdc1` to mount the thing without dicking around
-with `fstab`.  Then `cp -rt /media/sjl/…mountpoint…/ src/uSDimage/*` to actually
-copy the files.  It was pretty fast.  `udisksctl unmount -b /dev/sdc1` to eject.
-
-Installed the battery.
-
-Wiring up the VGA controller and USB keyboard controller.  Almost messed up
-— the RX pin goes to PD0 and the C pin goes to PB1.  Note it's D and B, not the
-same letter!
-
-VGA cable is quite beefy, not perfect for routing around everything.  But it
-does the job.
-
-After connecting everything and plugging it in, it works!  The screen looks
-a little odd because there appear to be two prompts.  I wonder if the graphics
-mode is wonky.
-
-Had some issues getting the keyboard working:
-
-* The documentation says to make sure the RX jumper isn't connected.  The board
-  came this way, so that was fine.
-* But the board came with the TX jumper jumped, and I had to *remove* that to
-  get the keyboard to work.
-* Then I tried to use some other USB keyboards, because the 40% one is just too
-  painful to type on.  The Realforce 104 worked fine, but my HHKB and my UHKs
-  didn't work at all.  They're getting power (they light up) but typing doesn't
-  work at all.
-
-Setting the time and date worked great.  They persist across restarts and such.
-
-After evaluating some stuff, the screen seems to be garbled.  Not sure exactly
-what I need to do/configure to get the screen working properly.  Evaluating
-`(cls)` does clear the screen back to the beginning, so I can use that for now.
-
-## 2019-04-13
-
-Trying to get my code-to-PDF thing ported to Linux.  Random notes:
-
-No idea where my header file is.  Probably forgot to commit it.
-
-`pstopdf` is called `ps2pdf` on Linux and has different options, because fuck
-you.
-
-To list fonts and their files on the system: `fc-list`.
-
-`enscript` on Linux can't just take one of these fonts because fuck you.  It
-needs an "AFM" file for some reason.
-
-Can generate an `afm` file with `ttf2afm` which is in the `texlive-binaries`
-package along with a whole other pile of bullshit I don't need.  Cool:
-
-    sudo apt install texlive-binaries
-    ttf2afm /usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf | sudo tee /usr/share/enscript/afm/umr.afm`
-
-Then I need to edit `/usr/share/enscript/afm/font.map` because this program is
-incapable of `ls`ing a directory to find all the font maps in it or something.
-Note that the font name here needs to match the font name in the generated AFM
-even though you're explicitly telling the stupid program which AFM to use with
-a given font name, because once again: fuck you.
-
-Found the `sjl.hdr` file on my old machine.  It was just in `/usr/local` because
-I was lazy.  Committed it to my dotfiles this time.
-
-I also had a `clisp.st` highlighting file in there.  Need to symlink that into
-`/usr/share` too, and also update the `enscript.st` file to add it.
-
-Also need to hack `enscript.st` to tell enscript how to find the proper variants
-of my font.  Jesus:
-
-    else if (is_prefix ("UbuntuMono", font))
-      {
-        bold_font = "UbuntuMono-Bold";
-        italic_font = "UbuntuMono-Italic";
-        bold_italic_font = "UbuntuMono-BoldItalic";
-      }
-
-Now the thing finally fucking runs again.  So now I can get started printing the
-MakerLisp code.  However, if I do my usual one-page-per-file style it ends up
-being 198 pages, and many of them are almost entirely blank.  So instead I can
-cat the various groups of files together with something like:
-
-    cd bin
-    ffindext l | sort | xargs -I file sh -c "cat file; echo" > ../bin.l
-    cd ../..
-
-    cd l/lang
-    ffindext l | sort | xargs -I file sh -c "cat file; echo" > ../lang.l
-    cd ../..
-
-    cd l/clib
-    ffindext l | sort | xargs -I file sh -c "cat file; echo" > ../clib.l
-    cd ../..
-
-    cd l/ez80
-    ffindext l | sort | xargs -I file sh -c "cat file; echo" > ../ez80.l
-    cd ../..
-
-And then generate the PDF with something like:
-
-    ffindext l | sort | grep -v /lang/ | grep -v /bin/ | grep -v /clib/ | grep -v /ez80/ | xargs code-to-pdf "MakerLisp"
-
-Now we're down to 64 pages, which is much more reasonable.  The `demo` and
-`util` directories have some beefier programs, so I'll leave those alone.  And
-I *finally* have a PDF I can print.  I hate computers.
-
-Booted up the lisp machine again and today the TX jumper seems to work as
-documented.  I tried debugging the display corruption with the info from the
-email Luther sent (getting a bunch of text on the screen and pressing the Auto
-button) but that didn't seem to help.  Emailed back.
-
-## 2019-04-14
-
-More troubleshooting of the Lisp machine video issues.  Borrowed a miniDP/VGA
-dongle and TV with a VGA input (apparently they still exist) from a friend, and
-got a new VGA cable.  The results are very confusing:
-
-* Cable makes no different in any scenario.
-* WORKS: Macbook miniDP to dongle to Elecrow VGA
-* WORKS: Thinkpad miniDP to dongle to Elecrow VGA
-* WORKS: Lisp Machine VGA to TV VGA
-* BORKED: Lisp Machine VGA to Elecrow VGA
-
-Emailed the author back with my results.  This is really strange… I would have
-expected either the monitor or the Lisp Machine were the problem, but they only
-seem to not work *together*.
-
-## 2019-04-16
-
-The Makerlisp author received an updated version of the monitor and he's now
-seeing the same thing I am, so it's nothing I did wrong.  He's mailing me his
-old/good monitor and I'm mailing him my bad new one, which was very kind of him.
-
-Spent a while getting Vim set up to work with a Makerlisp REPL.  Mostly got it
-working, except the newline handling is going to be kind of a pain.  But I can
-live with that for now, in exchange for being able to edit in Vim with Paredit
-and sending to a REPL easily.
-
-## 2019-04-18
-
-More poking around at MakerLisp.
-
-I know I'm going to need user input for a game, so my first idea is to see if
-I can make some reading functions.  `read-line` would be good for a text
-adventure.  I found an example implementation in the shunting yard demo, but
-also tried writing my own.  I wrote a bunch of other stuff along the way too.
-Did `read-byte` and `read-char`.  Not sure how to go about making the `-no-hang`
-variants.
-
-Is there something like CL's `macroexpand-1` that will only do one level of
-macroexpansion?  It's a bit hard to read when *everything* gets expanded…
-
-Symbols don't seem to be printed readably.
-
-Spent 15+ minutes wondering why my `defmacro` macro would go into an infinite
-loop on the second and further tries.  Realized it's because I was using the
-file as a scratch space, and so when it would `forget` itself and autoload it
-would be evaling the `expand` call over and over.  I'm so dumb.
-
-`cadr` is a macro, so I can't map it (or, rather, I can with *very* strange
-results).
-
-`print` and friends don't return their argument, which means you can't just wrap
-a `(print …)` around something when debugging.
-
-## 2019-04-19
-
-New screen arrived today.  It works!  Then I needed to sync the SD card again.
-Commands to do that (eventually I'll script these):
-
-    udisksctl mount -b /dev/sdc1
-    rsync -avd ./ --copy-unsafe-links --exclude=.hg  /media/sjl/3831-6133
-    udisksctl unmount -b /dev/sdc1 
-
-(Aside: why don't I always just pipe `histgrep` into `nvim -`?)
-
-Narrowed down my macro troubles to a couple of bugs in MakerLisp itself.  He's
-going to take care of them.
-
-## 2019-04-20
-
-Need a random number generator for the MakerLisp machine.  I could FFI out, but
-it'll be more fun to write a PCG for it.  This turned out to be a hell of
-a rabbit hole.
-
-I've written PCGs before, of course, but on normal computers where I could just
-use the bit sizes and multiplier of the reference implementation.  Here I can't
-do that, so I had to try to come up with something that would work with 24 bit
-integers.  Turns out not many folks have done much LCG research on 24-bit
-machines (go figure).  All the test suites (e.g. TestU01 and PractRand)
-immediately fail small PRNGs, so it's hard to know if I've got something decent
-or not.  Oh well, it's just for games, it's not life and death.
-
-Random notes:
-
-* The "Randograms" in the blog post are confusing because they're sampling the
-  entire period of the generator, but still get odd-numbered occurence counts.
-  This confused the hell out of me until I realized that by "pair up the
-  numbers" they mean a sliding two element window: `(1 2 3 4)` produces `((1 2)
-  (2 3) (3 4))`.
-* The 256x256 size works perfectly for the 8-bit generators.  I wasn't able to
-  extend it for 16-bit generators because exhausting their period would take
-  *much* longer.
-* It's still not clear to me how to decide what's a "good" multiplier for
-  smaller-sized PRNGs.  They fail the tests right away because they're so small,
-  so I can't really go by that.
-
-## 2019-04-30
-
-Started playing/rating the lisp jam games.  Wanted to install a VM to safely
-play the non-web ones, which led to a big old rabbit hole:
-
-* Need to enable CPU virtualization in the BIOS to get VirtualBox to work.
-* When I rebooted my desktop crashed right after logging in.
-* Took me a while to find my display manager logs because I can never remember
-  its fucking name (and can never remember that it's "display manager" and not
-  "desktop manager").  Hey idiot future self: you use XDM.
-* Thought the problem was maybe because I just upgraded SBCL and didn't rebuild
-  Stump.  Tried that, didn't help.
-* Saw some errors in the XDM log about the config file not parsing properly.
-  Fixed those.  Didn't help.
-* Opened `.xsessionrc` and immediately saw the problem: the `gpg-agent` shit
-  I added on my work machine and pulled down here.  Christ.  Removed that for
-  now because I can't remember the magic systemd incantation required to get it
-  to quit fucking autostarting the agent whenever anything looks in the general
-  direction of its ports and I want to move on with my fucking life tonight.
-
-# May 2019
-
-## 2019-05-20
-
-Going to try to reboot this plan.  I know I haven't kept up with it very well
-(though my work `.plan` has been going strong every day since October).  Oh
-well, no time like the present to restart.
-
-Added a couple of type checks to Adopt.  The only main thing left is to rewrite
-the unit tests to work in the new style.  Then it should be ready for Quicklisp,
-I think.
-
-Continued learning how to sew.  Hemmed my second pair of pants.  Kind of
-a miserable experience, but I'm getting better.  It's weird that the machine
-will happily let you forget to put the foot down before letting you sew, happily
-fucking up your shit into a giant bird's nest instead of having some kind of
-switch you need to press to let yourself fuck it all up.  Oh well, I'll just
-learn to not make mistakes I guess.
-
-Finally figured out what all the `/dev/loopNN` bullshit on Ubuntu is.  Seems to
-be their app store thing "snap".  I removed some of the garbage "snaps" I never
-installed in the first place, but there's still some installed with scary names
-like "core" so I guess I'll just have to live with them if I don't want to take
-the risk of breaking something.  I did make a little `disks` script to show me
-the output I care about using a combination of `lsblk` and `du` and `grep`.
-It'll do for now.
-
-New UHK came.  I now own three: one with browns, one with browns plus
-stabilizers, and one with blues.  The blues are even clickier than I remember.
-I think I still prefer the unsilenced browns though.  They have a nice clunk to
-them instead of the clickiness of the blues.  I think I'm finally done buying
-keyboards — 2 at home and one at the office is plenty.
-
-Need to figure out how many hard drive bays I've got left in my tower and
-motherboard.  I'm running out of room on my Windows partition, and I'm thinking
-of using Lightroom on Windows to finally move one more thing away from MacOS.
-Sacrilege.  Then DJ'ing for blues and Lindy dances will be the only thing
-I still need the Mac for.  I can live with that.
-
-The polydivisibility search I wrote over the weekend is still churning away.
-It's searching base 41 now.  Checking base 39 took about 4.6 hours.  Base 40
-took around half that.  We'll see how long 41 takes.  Still no results,
-unfortunately.  I wonder if I could prove that odd bases never work.  I played
-around on the whiteboard but couldn't come up with anything (and if Parker
-didn't I almost certainly won't, so I don't feel *too* bad about that).  At
-least my cores are getting some use.  It's fun to see all 32 bars full in
-`htop` for a change.  Memory usage is pretty constant at about 3-4gb, though it
-churns through a lot of garbage thanks to all the bignum arithmetic (~182tb
-allocated for base 39).  Is there a way to avoid all the bignum division maybe?
-
-## 2019-05-21
-
-Figured out why my alt key wasn't working.  What a gross rabbit shave:
-
-1. Alt key doesn't seem to be working (e.g. `alt-a` in Zoom doesn't work).
-2. Open `xev` and look.  Pressing `alt` shows keycode `133` and keysym `F17`.
-3. Open `.xmodmaprc`, which has `keycode 133 = Alt_L` and nothing else listed
-   for `133`.
-4. Source the file, then run `xmodmap -pke | grep 133` to see if it's working.
-5. This gives `keycode 133 = F17 NoSymbol F17`.  But all the *other* mappings in
-   the rc file are working, so what the fuck?
-6. Eventually I get the idea to look for `F17` instead.  Realize I have a bunch
-   of lines like `keycode 900 = F16`, `keycode 901 = F17`, `keycode 902 = F18`,
-   etc in the rc file.
-7. Tried commenting out the line that maps `F17`, and now everything works.
-8. But that was mapping keycode `901`, not `133`.  Why was it overwriting the
-   alt mapping?
-9. Because `901 ≡ 133 mod 256`.  Fucking kill me.
-
-Pushed my verbose-assertion patch for 1am to Github so I can get to it from
-other machines.
-
-Did some work to get Adopt's test suite running again.  Also added duplicate
-option detection.  Tests pass in SBCL and CCL.
-
-Tried to install ECL to see if I could run the tests there too.  Problem:
-there's no installation link/guide on the ECL page.  Really.  Here's what I did:
-
-    git clone https://gitlab.com/embeddable-common-lisp/ecl.git
-    cd ecl
-    git checkout ECL-16.1.3
-    ./configure --prefix=/usr/local
-    make
-    sudo make install
-
-Seems to work.  Adopt tests all pass just fine on SBCL, CCL, ECL, and ABCL.
-
-I thought about testing with CLASP, but looking at the installation process it
-says it'll take a couple of hours to install.  Maybe once my cores aren't busy
-on the polydivisibility checks I'll give it a go, but I don't want to stop it
-after many hours and waste all that progress, and I don't know how to make
-lparallel interrupt all the threads at once.
-
-Also finally added some docstrings for all the functions in the API.
-
-Anyway, I think Adopt is finally ready (or at least as ready as it's ever gonna
-be) for Quicklisp.  I submitted it.  It's a shame I just missed this month's
-dist.  Oh well, move slow and make things.
-
-## 2019-05-23
-
-There are no polydivisible numbers in base `41`.  The search continues.
-
-## 2019-05-24
-
-There are no polydivisible numbers in base `42` (what a shame).  Once again,
-even bases finish an order of magnitude faster than odd bases, and so far only
-even bases work.  I'm going to focus the search on the next couple of even bases
-to save time.  I wish I could figure out *why* even bases were more promising.
-Or just a better way to search.
-
-# June 2019
-
-## 2019-06-09
-
-Restarted work on Flax.  I want to be able to lay out my l-system nonaptychs
-entirely in Lisp, without having to dick around in Inkscape manually.  This
-requires two yaks to be shaved:
-
-1. A nice way to say "take this group of drawing objects and translate/scale
-   them into this specific bounding box".
-2. A way to render text without having to do it manually via Hersheytext.
-
-Implementing 1 was pretty easy.
-
-Implementing 2 is going to require bezier curves, so I went ahead and
-implemented those.  I ended up extending the `path` primitive to accept points
-with control points attached to draw the nice curves.  This was easy in SVG, but
-kind of a pain to do ergonomically in PNG.  I did eventually finish that though.
-So now I just need to find/make a font that I can render with those curves.
-
-Ended up just making my own "font" with only the characters I need for the
-L-systems (`+-()LR→ `).  Did a bit more and got string rendering working.  Still
-probably need to handle multiple lines, but this was a productive day.
-
-# July 2019
-
-## 2019-07-02
-
-My Linux machine has been randomly hanging completely when playing Youtube
-videos in Firefox.  I have to hard reboot the machine to get it back.  I have no
-idea how to debug this.
-
-Then, today, after one of these reboots the machine wouldn't even get to the
-BIOS at all.  Fantastic.  Looking inside at the motherboard's debug screen
-showed `C0`.  This code isn't mentioned in the manual at all.  Searching online
-showed a bunch of children flailing around in forums, but there was one useful
-nugget: resetting the CMOS.  Apparently you're supposed to do this when you
-install new RAM, and I did not.  It's worked fine for months, but oh well, may
-as well give it a try.  The button on the x399 is just to the left of the debug
-screen, and the computer needs to be completely unplugged for it to work.  After
-resetting the CMOS the machine took a long time to boot, but did eventually POST
-to the BIOS and boot normally.
-
-I think I want to update the BIOS at some point, but for now I'm just happy to
-have the machine back and working again.
-
-## 2019-07-09
-
-To get a black new tab page in Firefox, add the following to
-`~/.mozilla/firefox/*/chrome/userChrome.css`:
-
-    .browserContainer { background-color: #000000 !important; }
-
-And in `about:config` set `browser.display.background_color` to black.
-
-# August 2019
-
-## 2019-08-27
-
-BitBucket is shitcanning Mercurial support next year, so I have to run on the
-Hamster Wheel of Backwards Incompatibility and fix all my repositories and
-documentation.
-
-Started by setting up <http://docs.stevelosh.com> to serve the repo that was
-formerly served by BitBucket pages.  Added a hook into `.hg/hgrc` on the remote
-repo to autoupdate when pushed:
-
-    [hooks]
-    changegroup = hg update
-
-Then reconfigured nginx to serve the repo (which is full of plain old HTML files
-so it Just Works).  Decided to be lazy and just use `autoindex on` to generate
-the index page.  Good enough.
-
-Added `docs.stevelosh.com` to DNS.
-
-I still need to update all my `pubdocs` make targets, and also update all the
-links everywhere, but that can wait.  One step at a time.
-
-# December 2019
-
-## 2019-12-23
-
-Enabled HTTPS for `stevelosh.com` and `docs.stevelosh.com` and
-`learnvimscriptthehardway.stevelosh.com`.  Used Let's Encrypt which was… okay
-I guess.  Hopefully the cron machinery works and I don't have to dick around
-with it again in the future.
-
-Spent some time migrating all my Bitbucket repos to Source Hut and updating the
-links, so that when Atlassian tells us all to eat shit next year I don't have to
-scramble.
-
 # January 2020
 
 ## 2020-01-03