# HG changeset patch # User Steve Losh # Date 1579138110 18000 # Node ID 894400df8ad8f5f810e22b9eb823ac1fbdc2c7ad # Parent dab1f38ba625899cfffbfb6491d8eb140c55da4e It is a new year diff -r dab1f38ba625 -r 894400df8ad8 2019.markdown --- /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 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: + + Are there any thread safety guarantees for writing to separate elements of SIMPLE-ARRAYs? + Example: I want to initialize a large (~30gb) array with random data (DNA bases) for testing purposes. + 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. + I'm guessing if I switched to something more compact like (SIMPLE-ARRAY (INTEGER 0 3) (*)) this would no longer Just Work™. + 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? + sjl: bytes and larger are safe. + there is no guarantee + except for the fact that it's implemented that way + threading is outside the spec. developing a formal memory model is expensive. + Yeah + It seems unlikely that "bytes and larger are safe" would stop being true in the future, right? + correct. + I think I can live with that. + Thanks. + don't run on itanium. I'd double check the disassembly on ARM. + 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 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. + diff -r dab1f38ba625 -r 894400df8ad8 README.markdown --- 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 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: - - Are there any thread safety guarantees for writing to separate elements of SIMPLE-ARRAYs? - Example: I want to initialize a large (~30gb) array with random data (DNA bases) for testing purposes. - 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. - I'm guessing if I switched to something more compact like (SIMPLE-ARRAY (INTEGER 0 3) (*)) this would no longer Just Work™. - 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? - sjl: bytes and larger are safe. - there is no guarantee - except for the fact that it's implemented that way - threading is outside the spec. developing a formal memory model is expensive. - Yeah - It seems unlikely that "bytes and larger are safe" would stop being true in the future, right? - correct. - I think I can live with that. - Thanks. - don't run on itanium. I'd double check the disassembly on ARM. - 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 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