Blog

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 ©


GNU::Free Distributions Increase Agency, Actually

My good friend Xe wrote a post complaining about fully GNU::Free distributions, and I disagree with some things xe says in it. Xe challenged me to a 1v1 fite irl fox only final destination no items but xe can’t meet up with me in person and nintendo’s netcode is garbage, so I’m writing a response blog post instead. I think that the existence of fully GNU::Free distributions is important for increasing people’s agency in the broader sense. On the other hand, I agree with Xe that some of the communities around these projects have problems.


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.


New Twitter - @EverfreeArtemis

Hey there! Our old account (@artemiseverfree) got banned because we added a birthdate to it. The time between the account’s creation date and the account’s birth date was less than 13 years, so twitter decided to retroactively ban us. We’re not minors, but sure cool whatever. This post is confirmation that our new account, @everfreeartemis, is in fact controlled by us. Thanks!


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.