Pinned toot

Researching new ways to write software that make it easier for newcomers to understand rather than for insiders to maintain. Systems that build easy, reward curiosity, encourage lots of forks, encourage deleting unused features, make society more anti-fragile.

Current project: a zero-dependency Assembly language for x86; Linux without GNU.

(Previous intro:

Updated Mu's fork of the Linux kernel again. Today I deleted the entire top-level sound/ directory and a whole bunch of unused file systems.

LoC down from 6.1M to 4.4M.


Made up of 58 strokes in its traditional form (42 in simplified Chinese), the Chinese character for biáng is one of the most complex Chinese characters in modern usage, although the character is not found in modern dictionaries or even in the Kangxi dictionary.

Are "it's not a real word if it's not in the dictionary" arguments as popular in China?

Neither the traditional nor the simplified Chinese characters for biáng are yet encoded in Unicode, so there is no standardized way of entering or representing them on computers.

Turns out this wasn't a memory leak, just my tracing infrastructure 😄 Turn that off when it isn't used, and everything becomes reasonable.

Stack manipulations in SubX

I've been noodling on a Forth-inspired (but likely insane) syntactic sugar for stack manipulations in raw machine code. Behold:

{ 0 0 ->%ecx

This expands to:

push 0/imm32
push 0/imm32
copy %esp to %ecx
add 8 to %esp

Basically you get a (fairly unsafe) block scope containing an 8-byte local in %ecx.

To temporarily spill a register:

{ %ecx

Function call:

{ z y x
call f/disp32

The '}' turns into code to undo pushes in the '{' line.


Getting around AWS pagination with.. xargs

$ aws elbv2 describe-load-balancers --names `cat alblist`

An error occurred (ValidationError) when calling the DescribeLoadBalancers operation: Up to 20 load balancers can be described at a time, but 27 were specified

$ cat alblist |xargs -n 20 aws elbv2 describe-load-balancers --names


This basically is a combination of Python's "Explicit is better than implicit" philosophy with Rob Pike's observations on the [Byte Order Fallacy](

Now that I'm packaging Mu with a fork of bleeding-edge Linux, I have a tiger by the tail. I need to stay abreast of changes from upstream or risk bitrot, particularly as new security vulnerabilities are uncovered and patched.

I'm going to start changing the kernel soon, and I need a way to not kill myself merging patches from upstream. For starters: aggressively delete code Mu doesn't need. That'll reduce merge conflicts.

In the first run I just deleted non-x86 architectures. So far so good.

One aspect that seems more broadly useful than just my own Assembly language project: how to deploy bootable disk images on Linode.

Ah, the uncommon but irritating gym sensation of wondering, was that set 2 or 3?

Brain: I don't know why you're looking at me all the blood is down there

Pectorals: I don't understand your question, what's a number

Turn a set of .subx files into a bootable disk image.

$ git clone
$ cd mu
# package up a "hello world" binary and Linux kernel into mu.iso
$ ./gen_iso examples/ex6.subx
# try it out
$ qemu-system-x86_64 -m 256M -cdrom mu.iso -boot d

The process is still fairly klunky, and I've added several large dependencies. But now that I have something working I can start polishing it.


Created a timeline that shows the maintenance lifeline of everything I worked on these past 12 years.

Cloud VPS from "scratch"

I just successfully built a minimal Linux kernel, installed a SubX binary[1] as init -- and ran the whole thing on a Linode.

It's not in yet, but there will soon be step-by-step instructions.

This couldn't have happened without the education I received from


This is probably months late, but I've _finally_ gotten into the habit of clicking on Firefox's Reader View icon ( the second a website pops up any sort of occlusion on the page. Works great across all devices!

my family is out of town this week so I've got the weekend free to redesign the Atreus cyberdeck from scratch while Amiga demoscene videos play in the background on my Pi


Followed the datasheet and still, I cannot write even a single bit into the AT28C256 EEPROM :blobcatumm: I searched online and found everyone having the same problem was trying to make a homebrew computer, either Z80, 6502 or 8088. So I'm the latest victim in #retrocomputing ? 🤣

The general conclusion seems to be that there's either a hidden timing issue somewhere (but I don't have a 32-channel logic analyzer to spot it...), or the chips are Shenzhen counterfeit... .

Another funny mastofedi behavior: Alice and Bob share an instance. Alice replies to Bob's post. Alice's reply is sent to Bob's followers (in addition to hers). Later Alice deletes the post. The Delete is only sent to her followers, not Bob's.

@djsumdog @akkartik
That means random access to a file was bolted onto an already existing interface. The alternative was to have a completely different API for different storage techniques (hence all the "access methods" of IBM mainframes).

The reason for open() is to prepare the OS for I/O. This is a convenient time to cache directory information, check access privileges, etc. The alternative is to touch this data on every access, which is prohibitively expensive.

Show more

Server run by the main developers of the project 🐘 It is not focused on any particular niche interest - everyone is welcome as long as you follow our code of conduct!