Blog

There are still quite a few 32-bit x86 Linux distributions

The options for 32-bit x86 distributions have been declining a little bit. Some distros have dropped 32-bit support, but quite a few still have it. What remains? And which CPUs do they actually support?


Trying out NetBSD on our Vaio

NetBSD 10.0 is out!! This is very exciting; they’ve poured a ton of work into making that happen. I figured in celebration I needed to install NetBSD on something around the house, and the vaio vgn-p (prev featured in Life at 800MHz) seemed fun to try it on.


Simple Executable Love2D Files, or, You Can Shove Random Data At The Start of a Zip File and it's Basically Fine

LÖVE (which I will write as love because my keyboard doesn’t have an Ö) is a neat program that’s mostly intended for writing games with lua. We’ve been using it to write an image viewer. There’s a lot of ways to package a love project up for distribution, and some of them ship a copy of love with the project and some don’t. Since my distribution provides the version of love I need, I can create a .love file with all my source code and assets in it, and then I can run it with love path/to/myprogram.love. A .love file is just a .zip with a different file extension, so that’s pretty easy to do.


we've added light mode

This has been an addition we’ve wanted for a long while. For too many reasons to consider listing, some people find dark websites difficult to read. Or they’ve just got preferences. The Reader Mode in many browsers can help do an auto-transformation, but not everyone knows about that, and it doesn’t always do it right. So, now there’s a light theme built into the site now. If you’re a light-mode enjoyer, I hope it helps! The rest of this post will be some details about how we implemented it.


If you can't find it, it needs to be written

In the world of the digital, many of us have been tricked into thinking that something only needs to be said once. If someone has stated something, then stating it again is noise. Provides no purpose. Does not benefit anyone. The extension of this follows: I should not write something, on the off-chance that someone else whom I don’t even know about has already written it, perhaps better. The fear of being more incomplete than an imagined other-expert. But an utter void of information is more incomplete than your works will be, and there is value in saying what has been said.


Installing nixGL on aarch64

Published , with updates on

nixGL is a tool that’s useful for people who use Nix on distributions that aren’t NixOS. It lets you run graphical applications from nixpkgs with hardware acceleration; without it everything falls back to software rendering. Here’s how to install it on aarch64 (arm64).


i like gentoo's package deprecation process

Gentoo’s process for removing packages from the main gentoo package repository is designed to make me aware of it and give me time to react, and I really appreciate that.


LSDJ is pretty cool

Little Sound DJ (LSDJ) is a music tracker for the original gameboy / gameboy color. It makes pretty bleep bloops, I think it’s neat.


cloud-init - set root password with a config iso

This is useful for running cloud-init VMs locally, particularly if the image doesn’t have sudo or some other privilege escalation tool. Usually in an actual cloud environment you wouldn’t do this.


Scrollbars are becoming a problem

Scrollbars. Ever heard of them? They’re pretty cool. Click and drag on a scrollbar and you can move content around in a scrollable content pane. I love that shit. Every day I am scrolling on my computer, all day long. But the scrollbars are getting smaller and this is increasingly becoming a problem. I would show you screenshots but they’re so small that even screenshotting them is hard to do. And people keep making them even smaller, hiding them away, its like they don’t want you to scroll! “Ah”, they say, “that’s what the scroll wheel is for”. My friend, not everyone can use a scroll wheel or a swipe up touch screen. And me, a happy scroll-wheeler, even I would like to quickly jump around some time.


Gentoo Stability Indicators- what do keywords mean?

I’m not a core Gentoo dev, but this is my understanding of what the stability indicators mean, having used Gentoo for about a year now.


Ephemerality in the Land of Federation

Sometimes when we’re talking, we want ephemerality. Messages that do not last. Messages that cannot be read after some period of time. There are many reasons for this, and I’m not going to explain them, because I’d rather spend energy on how it can or can’t be achieved.


hackage search is not so good

Haskell has a package database called Hackage. It has a search feature, but it is hard to find things with the search feature. What is bad about it? What are work arounds?


lua script to generate a nodejs cache from a package-lock.json

this is a lua script that generates a nodejs cache from a package-lock.json. why is this useful? well you can generate a cache without this by deleting node_modules, and then running npm install --no-save --cache path/to/some/dir. It will cache all the downloads to the directory you gave it. but, it won’t cache anything it doesn’t download. This means if you install esbuild for example it will only cache the binary executable for your CPU architecture and not other ones.


Split up a .stp/.step file into STLs

Simple thing, writing so we can find it again. So first install FreeCAD, easiest with the appimage or flatpak probably. Then open the step file with File > Open or File > Import. You’re on a screen like this:


Nix: Using rustPlatform.buildRustPackage with Git Dependencies (it's kind of a pain)

I’m not sure if something changed with the way Nix’s rust build system works in 23.05, but I’m pretty sure something did because this project didn’t suddenly switch to git dependencies since I last built it with git; it was already using them. Anyways whether it’s new or not, you need to specify a hash for each of the git dependencies which works but is annoying to actually do. Here’s how.


Thoughts on MNT Reform after a couple months

So we got ahold of one of these used from someone who found it didn’t do what they needed it to. New, these things are like 1200 euros. We got one for $420 (lmao). though we had to buy a different keycap set to get key legends (prev owner had blank caps), and we had to replace the battery boards with a newer version since this was like one of the first Reform versions made and the battery boards had a problem. the thing is that if you look purely at the CPU performance and ram, and you compare that to the price, this thing is currently really bad value. maybe that changes when they finish designing the RK3588 module but right now that’s how it is. but it’s increasingly clear that the value is there now, it’s just not in compute, it’s everything else.


cross-compile with NixOS and deploy that shit continuously

Alright the premise of this one is way simpler than how we got there. We’ve got a raspberry pi 2, and we wanted to set it up to do some system monitoring. Pretty simple stuff ultimately: it’s got an FTDI serial adapter and an ST-Link both plugged in over USB to monitor a long computer that we’re doing work on right now. It’s also got an ethernet connection to that computer for netbooting, and then it’s bridging that connection to the rest of our network over a second ethernet port. We could get most of the way to what we wanted with Alpine Linux or even raspbian, but we’re running humility to do the ST-Link side of things, and there’s no way in hell I’m waiting around for that to compile an a raspi2. So, cross compile right? Yeah, but cross compiling sucks. Unless NixOS can save us? Turns out it can.


Enable Crate Features in Helix Editor With rust-analyzer

Published , with updates on

So you’re using helix, you’re working on a rust crate, and you need to turn a feature flag on. Here’s how:


Fix Linux Suspend/Sleep in Gigabyte B550i Aorus Pro AX

Linux won’t sleep on this motherboard out of the box. I have a rev1.1 motherboard running BIOS version F17b. No idea if this applies to rev1.2. There’s a workaround you can do which is to disable PCIe wakeup on GPP0 (GPP bridge to the m.2 NVMe drives): echo GPP0 | sudo tee /proc/acpi/wakeup. To make this persistent you need to run this command at boot. I do not know why it is like this. systemd/openrc methods to run this at boot:


Why I Switched to Helix Editor

It works on illumos. It supports rust-analyzer out of the box. I like the controls. I like the color themes. I don’t need to install or configure plugins.


I got Mozilla's syncstorage-rs working; free yourself from python2

You may not know this, but you can run your own sync server for Firefox Sync, which lets you keep all your sync’d data entirely on your own servers. The github:mozilla-services/syncserver has been what you use to do this for awhile now, but it’s written in Python 2, which is becoming increasingly non-existent on modern Linux distributions since Python 2 is end-of-life. The replacement is github:mozilla-services/syncstorage-rs, a new rust implementation. I had some trouble just following the docs, but I did some code diving to find the missing details. Here’s what I got working on my machine.


Firefox: Disable 'A web page is slowing down your browser'

This warning serves no purpose on slow computers where like half of modern web-apps trigger it (thanks modern web-apps). To disable it, go into about:config and set dom.ipc.processHangMonitor and dom.ipc.reportProcessHangs to false.


a practical guide to self-induced {trance?, hypnogogia?, daydreaming?} for fun and vibes

A strategy so simple that a friend described it to me in a few sentences, off hand, not intending to provide me instruction. and I went and did it, and it worked anyway.


Copying NixOS's Live CD to RAM: a short look at NixOS's early boot

Due to Circumstances, I want to boot a NixOS live ISO in such a way that the storage medium can be removed after boot-up. This is at a technical level rather simple. NixOS live images store the Nix store in a SquashFS, and everything else is already in RAM via tmpfs anyway. So in theory all we need to do is copy the SquashFS to ram before it gets mounted. But that does raise the question: how is the SquashFS mounted in the first place? And how can we change that? If you were a reasonable person you would read nixos.wiki/wiki/Bootloader, and you would find your answer: pass copytoram in boot.kernelParams. I am not reasonable, and figured it out from the source code, which is what the remainder of this post is about.


ffmpeg v4l2 requests 4.4.3 patchset

I rebased the 4.4 branch of jernejsk/FFmpeg on ffmpeg 4.4.3. You can find that at faithanalog/FFmpeg-v4l2. This lets you use hardware accelerated video decoding on anything that uses v4l2-requests (hantro, rkvdec, etc.). Tested on my Quartz64. You can also download a .patch file that applies cleanly to upstream 4.4.3: v4l2-4.4.3.patch. If you’re on gentoo, drop this in /etc/portage/patches/media-video/ffmpeg-4.4.3/. Tested on my Quartz64 and nowhere else. You also need to build with --enable-v4l2-request --enable-libudev. On gentoo, use EXTRA_FFMPEG_CONF='--enable-v4l2-request --enable-libudev' emerge ffmpeg and consider putting this in /etc/portage/env so you don’t forget later.


Blazingly Fast Lua Serialization

You’re writing lua, you want to serialize and deserialize data, and you want to pick the best format/library pairing for the job. What’s good? I’ve been doing some testing to find out. Here’s the short version: If you want the fastest option and you can choose the format, use lua-cbor if you need it to be pure lua, or use lua-protobuf if you’re cool with a C library. If you need JSON, use either lunajson for pure lua, or lua-cjson for a faster C implementation. And now, the details.


Anti-Fandom Action! Hosting BreezeWiki with Caching and WildCard DNS

There’s this website online that’s a bit notorious for being awful, and also for being everywhere: fandom dot com. Fandom hosts a lot of wikis, some of which have existed for over a decade now. They used to be known as wikkia and provided the quite-useful service of a hosted MediaWiki instance. That’s still what they do actually, but over time they’ve become more and more malignant. I don’t know the full story, what happened with management, whatever, but these days when you go on a Fandom page you’re bombarded with ads for media you don’t care about, weird trivia quizzes, obnoxious animations, and all of this slows your browser down and gets in the way of the page you were actually trying to read. BreezeWiki is a proxy that fixes that, and you can even run your own! You can point the getindie browser extension at your instance or another person’s instance and it’ll turn that pit of despair into a nice smooth browsing experience, and recommend alternative independently hosted wikis if they exist. If that’s all you want to do, go download that extensions, you’re free. But if you want to run your own, that’s what the rest of this post is for.


So you want to cross compile illumos...

I want to cross compile to illumos from linux, for reasons I’ll hopefully get to write about in the future. This is a pretty tricky endeavor. Let’s talk about why.


Tfw your kernel makes your linker print to STDERR - Gentoo, Mold, and AArch64

We’ve been passively experimenting with the mold linker for the past six months or so. We’ve got a Quartz64 that hasn’t needed to do much of anything, and because it’s only got 4 efficiency cores, the linker runs long enough that we can actually watch it and see how it’s doing. We’re not really sure if it’s been worth using, and haven’t done any scientific comparisons on it. That said, here’s how we have it set up.


How To Make Java Swing Look Better

This is not new information but I’ve been having an increasingly difficult time finding the exact options to use in the library of babel that is the modern search engine. So here we are.


An X11 Apologist Tries Wayland

I think it’s only fair to call me an X apologist. I get incredibly frustrated when people talk about dropping support for X11. I fight back against the notion that some day X11 will be dead and unmaintained, a curiosity of a time before. I’ve spoken to people in my circles at-length about the accessibility tools that Wayland simply hasn’t been capable of supporting that X11 has. A lot of times, I’ve ended this conversation with “Maybe 5 years from now it’ll be good”. Well it’s 5 years in since I first said those words, and you know what, I’m actually pleasantly surprised.


Stop Chrome from Stealing Sway's Hotkeys

I read the manual, and I’m putting it here so I don’t forget. As mentioned in some previous posts, I like to run web-apps in chrome with the --app= flag, rather than use the electron version. For stuff like Discord this largely makes it act like the electron version- the website gets its own dedicated window, clicking links opens stuff in a different window, there’s no browser UI taking up space. The main differences are I don’t have to bother keeping an app updated, and I can apply custom CSS. Anyway, recently I’ve been trying out Wayland with Sway, and it seems that when you launch chrome with --app=, it inhibits your compositor’s keyboard shortcuts so it can have them all to itself.


That time I 10x'd a TI-84 emulator's speed by replacing a switch-case

There’s a javascript emulator for the TI83+, TI84+, and TI84+CSE calculators called jsTIfied, which was written by Christopher Mitchell, founder of the calculator fan site cemetech.net. There’s not a whole lot of reasons to use it over something else if you’ve got a native option available, but if you don’t it’s pretty great. I got interested because it was the first emulator to support the TI84+CSE when that calculator was released in the early 2010s. The CSE was exciting because it retrofitted a 320x240 color display onto the hardware platform of the 84+SE, so all the other hardware and OS access was the same except for graphics. I wanted to be one of the first game developers for the CSE, but developing for the calculator without an emulator and debugger is pretty painful, so I tried out jsTIfied with my older calculator ROMs to get a feel for it.


[reblog] How to Start an Unencrypted Chat on Matrix (Element)

Hey! A friend of mine, Cadence, wrote a great blog post about how to start an unencrypted direct message with someone else on Matrix using Element or a fish script. That post is over at https://cadence.moe/blog/2022-07-29-how-to-start-an-unencrypted-chat-on-matrix-element. I’ve also iframe’d it here! This reblog thing is a new thing I’m trying, and I don’t intend to make it a majority part of the feed, but I think it’s fun. Let me know what you think!


I'm tired of making decisions

Decisions are our keys to the ethereal freedom, but they are also our shackles to the earth. I’ve been thinking a lot about what makes a system pleasant for me to use, particularly as a workstation. I’ve become disillusioned with a lot of Linux distributions as of late, not for technical reasons, but just because many of them feel cause me to feel depressed and dejected when I work with them. One of the primary factors I’ve identified is how they reckon with choice. What do they allow me to choose? What do they force me to choose? This balance is why I use Puppy Linux, despite everything, and why I’ve gone from being an Arch Linux zealot to avoiding it at all costs.


MNT Pocket Reform Has Problems, But I Still Want It

I am a notorious lover of small computers. At the start of the year I wrote about my darling little Vaio VGN-P that I use all the time for communications, writing, and even dev work. But these things are long out of manufacture and difficult to repair. In current year you can get some compelling options from GPD, but their keyboards are pretty bad, so they’re out of the question for me. So, when I heard about the MNT Pocket Reform, I was pretty fucking interested. My first impressions are pretty good, but there’s some problems that could end up being deal breakers.


I Disabled GIF Animations on Cohost

If there’s one thing that is guaranteed to piss me off in the current year, it’s a social media tool that doesn’t let me disable GIF animations. Personal websites- yeah, whatever, it’s your website. But when social media lets people blast animations into my feed, I’m just not ok with that. Today’s offender is cohost, some hip new website for Posting that some of my friends are using. The GIFs are fucking everywhere and I want them to stop. Websites shouldn’t take all the blame here. If we weren’t living in a hell disguised as middle-earth, browsers would have a setting to disable GIF animations at the browser level. But we don’t, so websites have to do all sorts of bullshit if they actually want to support disabling GIF animations, especially if they want play-on-hover support. Anyways, today cohost is in my line of fire and I decided to do something about it. Here’s my janky userscript that replaces gifs with canvases, with a snapshot of the gif drawn on.


How I Use Borg for Ransomware-Resilient Backups

If you’re in need of a backup solution for your *nix machines, BorgBackup is a great tool for it. Borg features encryption, deduplication, append-only data access for ransomware resiliency, and data compression. I’ve been using it for five or six years now and I’ve developed a strategy for deploying borg that I’ll share with you.


More Oxide at Home: My Pi is a Wireless Crucible

Welcome back to me making bad decisions with Oxide software. Today we’ll have a look at Crucible, a networked storage service. Now, “network storage” can mean a lot of things, from low level block devices to high level bucket stores. Crucible sits at the low level end of the spectrum, and is intended for stuff like block devices for virtual machine. I’m going to tell you what I’ve learned from digging through the crucible git repository and talking to Josh Clulow (seriously, thanks for answering all my 2AM questions). Then for dessert I’m going to turn a Raspberry Pi into a WiFi USB drive backed by a Crucible datastore on my OpenIndiana box, complete with block-level encryption and data replication.


How I Listened To Music In The 2010s

The early 2010s was when I first got into music in a big way. Early on, I just had some files in the first music player app I thought looked cool, but as my library grew my methods for listening to music got more and more convoluted, culminating in a DIY cloud streaming setup. I wanna write about it, for my own memory and amusement. Maybe you’ll get a kick out of it too!


Everfree's ARMFerno - My Unholy Battle With a Rock64

I’ve got this rock64, which is an aarch64 board comparable to a Raspberry Pi 3 B+ with 4 gigs of ram. For years I’ve wanted to put a distribution on here that doesn’t have a premade image available, mainly because out of all the options on that page I don’t actually like any of them. Well, except NetBSD, but NetBSD doesn’t have GPU drivers for it. Problem is, everything I do want to use provides rootfs tarballs and tells you to figure it out. To do that I’ve got to get a Linux kernel, track down the device trees so it knows what hardware it has, and then wrangle u-boot into actually booting the whole thing. I figured that would be the hard part; little did I know the depths that Single Board Computer Hell would reach.


A System-Witch's Package Manager Murder Mystery

It was a calm day on the puppy-linux thinkpad. The CPU was cool, the RAM was operating at double data rate, and a gentle breeze flowed through the chassis as the fan whirred away. A girl wanted to log onto Discord to chat with her friends, but much to her dismay, Discord needed a package update! No matter, such things happen from time to time, but she’d need to uninstall the old version first. She threw on her systems-witch hat and set to work.


Could Hubris and WebAssembly Allow High-Level Hardware Emulation?

WebAssembly is a specification for a portable binary execution format, which has grown far beyond its original intent of simply providing an alternative runtime for running code in web browsers. Notably, it has a segmented memory model that is unlike the usual flat address space most programs are accustomed to running in. Not that programs don’t usually run within some level of memory segmentation, but it’s usually not something tracked alongside your pointers and is handled a bit lower level than that. WebAssembly also makes complicated memory allocation environments where multiple library may have multiple memory allocators a bit of a bear to get working, and this has been the source of much debate hammering out the standard moving forward. Therefore, WebAssembly tends to be at its utmost smoothest when everything is statically linked, memory regions are known statically, and there’s no dynamic allocation outside these regions at runtime. And here’s where things get interesting, because that’s exactly what you get with Hubris.


Oxide on My Wrist: Hubris on PineTime was the best worst idea

In my last Oxide-related post I got Oxide’s Propolis software running and said I might try and get their sled agent up and running next. Anyways that didn’t happen. Instead I ended up reading datasheets, writing rust codegen, spending 16 gigs of ram for an hour to build docs for a crate that’s just a glorified bundle of pointers, dreaming about serial data transfer, and uploading code to my smart watch over the slowest debug link I’ve ever had the displeasure of using. *Record Scratch* You’re probably wondering how I got in this situation. Well, it all started when I learned the nRF52832 microcontroller has a memory protection unit.


That time I wrote a FORTH compiler for my TI84

I’ve got something special in the works for my next Oxide-related post, but while I work on that I want to revisit an old project of mine, uninspiringly named calccomp. The README claims it’s a C compiler but that’s a lie; I never got very far on the C part of the project. What it does have is a custom Z80 assembler and a compiler for my own dialect of FORTH, with a few neat features like the ability to write an infinitely recursive “word” (the FORTH terminology for a subroutine/function) without stack overflows. I’m leaving the project in its unorganized and disheveled state, but it deserves some proper representation.


Oxide at Home: Propolis says Hello

So Oxide is making some cool stuff huh? Big metal boxes with lots of computer in them. Servers as they should be! Too bad I can’t afford to buy one for myself… but wait, they’re open-sourcing the software they’re writing to do it. Mom said we can have Oxide at Home!


A brief tale of pkgsrc and illumos

Recently we got our hands on some nice DDR3 era hardware, which we’ll use eventually for NAS purposes. It’s got 96 gigs of ECC RAM, two Xeons, the works. For fun we’ve decided to run OpenIndiana on it, an illumos distribution. OpenIndiana has a package manager called the Image Package System (IPS), and the default repositories have basically everything we’d need, but for another layer of excitement we put pkgsrc on here too. pkgsrc is a repository of package build scripts, most of which work on NetBSD, Solaris, illumos, Linux, macOS, and more! Joyent actually provides a binary distribution of pkgsrc for illumos, but on our everlasting journey for increasingly esoteric layers of fun we’re building pkgsrc from source. Don’t worry, it was easier than you think.


Regret License Version 1.0

``` Regret License Version 1.0, February 2022


Tailscale on NetBSD - Proof of Concept

I’m currently working on porting Tailscale to NetBSD. Actually, I already have the core functionality working (see screenshot below). I don’t have a full idea of what the rest of the port will look like, but there’s plenty of additional features and loose ends that I need to chase down until this moves from proof of concept to something upstreamable. This also relies on adding a NetBSD backend into wireguard-go, which I actually have no idea how to upstream, but I’ll burn that bridge when I get to it. Anyway, I’m gonna talk about what I’ve done so far and what needs to come next.


The Following Software License Is Intended For Jim Boonie Only

``` Copyright ©


Discord Holds the Keys to Your Heart

A friend of ours has been struggling with RSI. As part of their plans to address this, they decided to create a secondary Discord account to use on their phone, for direct messaging purposes. That way, they could still talk to people from their phone, but wouldn’t be tempted to participate in active discussions in group channels. As part of the signup process, Discord forced them to provide a phone number for account verification. They provided the same phone number they used for their primary Discord account, and in response, Discord locked both accounts, cutting them off from a huge part of their social circle. Discord’s support was unable to unlock the account or provide any information on when it might be unlocked.


Life at 800MHz

We’ve been using a Sony Vaio VGN-P588E for the past few months as our primary personal laptop. This thing’s great; it’s got a small but not uncomfortable keyboard. It’s got a trackpoint, which we absolutely need to keep our hands healthy. Crucially, it’s only 1.5 pounds. We’re disabled in a way that means we’ve got to care about every bit of weight we add to our bag when we leave home, so that’s a big deal! One catch: the Intel Atom inside hits a peak speed of 1.33GHz, with a normal speed of 800MHz under most thermal conditions. Oh yeah and there’s only 2GB of DDR2, GPU drivers don’t work in Linux, and it’s a 32 bit processor too did I say one catch I meant four. Let’s talk about life in the slow lane.


Git Reflector Script

Here’s a small script to reflect a git repo from some source like GitHub to some destination like an internal gitea mirror. That’s my usecase. You could also use this to go the other direction, or whatever you like.


Wowstick Electric Screwdriver Review - It Saves My Wrists

About 4 months ago we picked up the “wowstick” electric screwdriver. It’s a lightweight handheld screwdriver with a rechargeable lithium-ion battery. It’s got some limitations worth knowing about, but as someone prone to being injured by manual screwdrivers it has made a huge difference to my ability to work on hardware projects.


A Story of Microsuites, and Atrophy

Let me give you a view into the hellworld of “microsuites”. This shit is becoming more and more prevalent and it’s so incredibly cursed. Picture this: You come home to your apartment building. You walk up five flights of stairs to the top-floor of your building with no elevator. On the way you pass the communal kitchen on the second floor. You walk in your front door. You’ve got like 200 square feet of living space: there’s a bathroom with a shower, a sink, a mini-fridge, a microwave. The place came with internet, you didn’t have to pay for that. You’ve got a ladder up to a loft with your pre-furnished full-mattress bed. Before bed it’s time to cook up a nice pot of- wait, aren’t we missing something?


Puppy Linux: ROX File Manager Basics

This is the first of what I hope will be a series of practical guides for using Puppy Linux. I’d also like to contribute these to the wiki later but I don’t want to learn how to do that right now. Anyway, this is a short post explaining some things about the ROX File Manager, the default file manager in Puppy. Everything here is also in the full documentation, but digging into that can be daunting when you’re starting out.


Nix RFC 0098: Community Team

Nix RFC 0098 was submitted to the Nix community recently. In its own words at the time of this post, it aims to “establish an official community team to model social norms, mediate interpersonal problems, and make moderation decisions”.


Linux Mixtapes

I use Puppy Linux on my laptop. Everyone I mention this to is like “Oh yeah Puppy, I used that on a flash drive that one time at school” or something to that extent. That’s kinda where I was when I tried it too; I didn’t want to buy a boot drive for my thinkpad when I had a slim USB stick I could just plug in with 128 gigs of storage, and I had heard puppy was fast for that. I wasn’t wrong either, this thing runs way better than it has any right to given the speed of this storage device. But what’s even cooler is how easy it is to remix a puppy linux distribution into your own custom puppy that you can share with others.


why i don't use analytics

Social ranking numbers are poison to my mind. Likes, views, retweets, boosts, all these things are to me a social slot machine. Put words out, see which words get the numbers highest, chase that dopamine one more time.


eGPU with a Thinkpad x220 from 2011

Something I’ve been quite enamored with recently is ExpressCard. It’s an older standard that’s conceptually similar to Thunderbolt; basically, it’s a slot in the laptop that can provide a USB 2.0, USB 3.0, or PCI Express interface.


The Workgirl Keyboard Layout

There’s a keyboard layout I’ve been using for the past 8 or 9 months. It’s called the workgirl layout. It may look familiar to some of you:


Extended Lua Hashbang - Portable Lua Scripts

So you have a lua file, and you want to be able to run it from the command line like ./your_script.lua. In languages like python or ruby you would accomplish this by adding #!/usr/bin/env ruby or #!/usr/bin/env python as the first line of the file. The #! magic pattern, known as a shebang (sheh-bang) or hashbang, tells linux to use a specific command to execute the file. You can do this in Lua too, but it’s not the most portable option.


Your Anti-bot is Not Accessible

TL;DR: Input sequencing and automation tools such as autohotkey scripts, hardware macros, auto-clickers, and turbo buttons are important accessibility tools that allow people with disabilities to play games they’d otherwise be unable to play. These tools are often banned in multiplayer titles, particularly MMORPGs, in the name of fairness and bot prevention. I argue that these tools should be allowed, or even implemented within the game itself. With the recognition that a line has to be drawn somewhere, I suggest that a tool should be classified as a bot only if it automatically makes meaningful decisions in response to stimuli provided directly by the game, creating a feedback loop that does not involve the player. Further, I suggest that in the games that can’t allow external tools fairly, first-party accessibility features can still make the game playable for more people.


Declawing the Dragon - Voice Coding in 2020

In this post I am going to talk about programming with speech recognition software, also known as voice coding. Voice coding as a concept is nothing new, though you may not have heard of it. Here are some talks you can check out if you want to see what this actually looks like in practice:


Mirroring YouTube Playlists

Recently I wanted to set up a periodic job to mirror some of my personal youtube playlists. There’s plenty of reasons one might want to do this. For me it’s simple: one copy is none copy, and two copies is one copy, so I want a second copy of youtube videos I care about stored locally. This protects against videos getting removed, copyright stuck, youtube shutting down, or anything else that might make the youtube video otherwise unavailable.


SSTV Tx/Rx with a Pi and an RTL-SDR

It turns out that transmitting and receiving SSTV signals is pretty easy, using just a raspberry pi as a transmitter and an RTL-SDR as a receiver. There are a few programs which you’ll need to install before you begin:


TI-BASIC Bejeweled

TI-BASIC is the unofficial name for the programming language included on the stock operating systems of the TI-83 and TI-84 Plus series of calculators. This includes a large set of calculators, the most popular these days being the 96x64 monochrome TI-84+SE, the 320x240 16 bit color TI-84+ Color SE (referred to as the “CSE”), and the newly released TI-84+CE which features a LCD which is significantly faster to access than the CSE and a processor upgrade from a z80 to an ez80.


Prelude of the Chambered in Dart

I was watching [REDACTED] write what was essentially a re-implementation of Doom in Dart recently, and it inspired me to port Prelude of the Chambered (PotC) to Dart.


z80 Assembly: Binary-Coded Decimal

One method for displaying numbers larger than 16 bits is to convert it to Binary Coded Decimal (BCD) first, and display the result. BCD works by using four bits to store each decimal (base 10) digit of a number. The following code can convert a number to BCD, and display it. It’s currently written to convert a 24 bit number to a 10 digit BCD number, but can be modified to support anything really. It is memory ineffecient, because it uses one byte for each digit rather than storing two digits per byte. This is useful though because it makes the display routine simpler.


TI-84+CSE: Max Pixel Fill Speed with OTIR

One of the fastest practical ways to write arbitrary pixels (no 1-color rectangles) to the LCD is with an OTIR loop copying pixel data directly from memory. That being said, I was wondering how many pixels you could theoretically update per frame. As mentioned, this is theoretical. This does not take into account the overhead of adjusting the LCD window, or any of the other logic you may have. It also assumes that interrupts are disabled.


TI-84+CSE: Half Resolution Mode

Half res mode is an LCD mode which results in a halved horizontal resolution. This can also be used for double buffering, because one can write to the left side of the screen while displaying the right side or vice versa.