I’m working on another site, written directly in HTML and stitched together with
the C preprocessor (it’s really quite ergonomic!) and using the excellent Python
package reloadserver to automatically reload the pages in my
browser whenever I make changes.
Unfortunately, Firefox, at least, doesn’t remember
and restore scroll position on reload, which may be the…
Hey look, I made a zine in Decker! You can read it right here, or
download the deck file . 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

 And now for the nerd shit.
 Decker is really cool. It carries on the legacy of HyperCard, one of
the first real hypertext media systems; it’s got that dithered, lo-fi, retro
flair that I…

 This post is part of April Cools Club : an April 1st effort to publish
genuine essays on unexpected topics. Please enjoy these true stories, and rest
assured that the tech content will be back soon eventually! 
 
 sina o pali e nimi sin. sina o pana e nimi mute tawa mi. 
 nimi o kama sama pi soweli lili. mi wile e ni: nimi li kama mute a. 
 That’s toki pona , a…
I’ve wanted to change up my projects page for a while, but wasn’t
quite sure what to do. I didn’t want to use any JavaScript, but I did want to
organize projects in multiple different ways, rather than just a single set of
categories like I’ve had for a long time. 
 Ultimately what I settled on is a tag system. The tags look like this: 
 
 Project…
“The Temper of Revenge” is one of my favorite filksongs, though I was introduced
to it by the Star Trek II -related parody, “The Temperature of Revenge”.
A few weeks ago, on a bus from Madison to Chicago, I decided to see if I could
fit some lyrics about my favorite video game, Outer Wilds , to the tune.
It took a lot of revising to do so without massively…
I think we should use “method”, in Rust, to refer specifically to associated
functions which would be object safe if put in a trait. 
 In this terminology scheme: 
 
 associated function refers to any function defined in an impl block,
which is how most people use it now 1 , 2 
 trait function refers to any function defined in a trait 
 method specifically…
A reader reached out to me the other day to let me know that my RSS feed for
this blog didn’t include post content, just descriptions, and that this hindered
their ability to read my posts offline.
This obviously isn’t ideal, so I set about adding the full post content. 
 Customizing the RSS Feed 
 Hugo comes with a builtin RSS feed template, but it’s easy…
I’ve used NixOS and Morph to manage the servers in my house for about a year now,
and while I have many gripes with both the Nix language
and the documentation around the nixpkgs and NixOS ecosystem,
it’s been a great help. 
 
 This post is for users of Morph and its near-drop-in replacement, Colmena .
If you don’t already use one of these tools, take a…
“Fly, Columbia” is a deeply hopeful song. Written in 1981 by Diana Gallagher,
Leslie Fish’s performance on Minus Ten and Counting was one of the first filk
recordings that really captured me. The chorus names OV-102 “the promise of
better days to come”, and blesses her to “Sail an orbit free, track the moon and
chase the sun.” 
 Yet,…
Twelve 
 It starts when you’re about twelve. 
 You haven’t thought about it much until then; people call you things,
but you’re just a kid, and that doesn’t matter yet.
You ask for the toys you like, and you don’t think about whether they’re “boy”
or “girl” toys.
You have the friends you have, and maybe a few…
The Fediverse is not dying, nor is it crumbling. As an ideoform in the collective consciousness of the ’net, the Fediverse is already dead. 
 What was the Fediverse? 
 Stripped of technical terminology, the Fediverse (“federated universe”) refers to a bunch of web services which let people share text, images, video and audio with each other without a centralized…
I love Fallout: New Vegas.
I keep going back to it, in a way that I don’t for Oblivion, or Skyrim,
or Fallout 3.
And yet, every time I sit down to play the game, whether reliving old memories
or showing one of my favorite pieces of art to someone new,
my enthusiasm quickly fades.
For a long time, I had no idea why, but today I figured it out.

 TL;DR: Mastodon’s Sidekiq deferred execution jobs are the limiting factor for
scaling federated traffic in a single-server or small cluster deployment.
Sidekiq performance scales poorly under a single process model, and can be
limited by database performance in a deployment of the default Dockerized
configuration. 
 If you are an embattled instance admin, go here . 
…
One of the most interesting emergent properties of the Rust language has been
the desire and ability to push more and more information into the type system.
Other programming languages allow this, but Rust’s combination of speed,
safety, and extremely powerful compile-time computation through both
types and macros, have lead to a large ecosystem of highly…
I’ve always loved strange and interesting music and sounds.
For the last few months, I’ve been assembling a collection of patch cables
and circuit boards on my desk which, when connected just right,
can create anything from melodic sequences to fast, driving beats to
wacky electronic soundscapes. 
 Mescaline at the Theme Park by Daughter of Eris 
 This is a…
I’ve gone back to using zsh 1 rather than fish 2 as my primary shell,
for the same reason I use Vim over Emacs - zsh is lightweight, compatible, present,
and (with Oh My Zsh! 3 and Starship 4 ) very featureful. 
 First of all, zsh feels snappy.
To be totally fair to fish , which is a wonderful project, I did not objectively
measure this, but subjectively, zsh starts…
A person’s “preferred name” is their name, their “legal name” is something else, and it’s our duty as software engineers not to muddle the two up. 
 That means software should avoid keeping track of users’ legal names, and software that must record legal names should have a “name” field and a “legal name” field, rather than a “name” field meant for a legal name and a “preferred name” field.…
Using Java or Python in a professional IDE like IntelliJ IDEA, NetBeans, PyCharm, or Eclipse is not a good first introduction to programming for computer science students, whether they’re in the field to become web developers, systems software engineers, or academic computer science researchers. 
 Some IDEs, such as jGRASP, 1 provide education-specific tooling, like the “automatic…
As mentioned in the previous post , the web
platform is popular for creating apps that would make plenty of sense as desktop software.
This is partly because it unifies many platforms, but mostly it’s because it solves
the distribution problem . That is, having written a program, how do I get it into the
hands of users? 
 Consider the process of installing a desktop app…
The HackRF One is an amazing tool, but the documentation about how to use it with GNURadio
is… scattered, to say the least. I got mine working today after a few hours of effort,
and I wanted to share what I did so others could benefit, because it’s a little arcane. 
 Specifically, I was using the wrong output sample rate . 
 Symptoms of having the wrong output sample…

 
It’s a simple and humble apparatus, but it’s quite useful.
 

 One of my first electronics projects was the excellent β and γ radiation detector kit,
from MightyOhm . It’s all
through-hole construction, a beautiful yellow PCB that’s easy to assemble and fun to play
with. 
 Recently, though, I found myself interested in more than just a…
I’ve been playing around with Elixir , which is a pretty cool
language - specifically, I’m reading Programming Elixir 1.6 
which is free for anyone with a .edu email address from The Pragmatic Bookshelf. 
 reverse/1 
 I enjoy functional programming, so of course the first two functions I made were list
operations. First up is reverse(list) (written as reverse/1 ,…
I’ve seen a lot of misconceptions around what the unsafe keyword means for the utility
and validity of Rust and its marketing as a “safe systems language”. The truth is a lot
more complicated than a single pithy tweet can possibly sum up, unfortunately; here it is
as I see it. 
 Basically, the unsafe keyword does not turn off the advanced type system
that…
The web platform is the delivery mechanism of choice for a ton of software these
days, either through the web browser itself or through Electron, but that doesn’t mean
there isn’t a place for a good old fashioned straight-up desktop application in the
picture. 
 Fortunately, it’s easier than ever to write a usable, pretty, and performant desktop app,
using my…

 The bottom line : Thelio, System76’s new “open hardware” desktop, is a
small, beautiful, and powerful desktop computer that hits every high point
anyone could have expected, faltering only in the inherent limitations of its
small size. 
 Pros : pretty, small, performant, well cooled, well supported, and easy to
modify 
 Cons : somewhat noisy, no front I/O, not as many…
Searching: the second-most studied problem in computer science, next to sorting (or so
it would seem from my CS curriculum). There are pretty good methods for doing it, too;
for example, everyone’s favorite, binary search, can find an item in a list of 260,000
possibilities after looking at just 18 items (the base-2 logarithms of the size of the
array). 
 Even the most…
This is the first of several posts on the implementation of my ActivityPub-enabled Rust
web application, FediDict. Each of these posts was released to my Patreon patrons before
being make publicly available. I recommend that you read the
 security design post first. 
 The core of any stateful service is its datastore, and FediDict uses PostgreSQL, a very
performant,…
This is the second of several posts on the design of my current ActivityPub-enabled
Rust web application, FediDict. Each of these posts was be released to my Patreon
patrons before being made publicly available. I recommend that you read the first
UX design post first. 
 Any software that accepts input over the network will, eventually, be subject to
attack, of some kind. Any…
This is the first of several posts on the design of my current ActivityPub-enabled
Rust web application, FediDict. Each of these posts was be released to my Patreon
patrons before being made publicly available. 
 FediDict, a portmanteau of Federated and Dictionary, is my current open source project.
Most of the time, I’ve taken the approach of “dive in and write some…
PDF, or Portable Document Format, is an incredibly complex file format, governed by many
standards and semi-standards. Like HTML and CSS, it was primarily designed for document
layout and presentation. Also like HTML and CSS, it has been augmented with a JavaScript
engine and document API that allows programmers to turn PDF documents into applications -
or vehicles for malware.…
One of the biggest challenges in software testing is defining the input for code under
test in a way that is expressive and powerful enough to test complex situations but
doesn’t distract from the intent of the test or clutter the test code to a degree that
makes it difficult to read. 
 Many dynamic languages have testing APIs which take advantage of their looser and later
type…
Rust’s Iterator trait is one of its most useful features. It allows lazy processing of item-by-item streams of anything from the bytes of a file to threads to complex and exotic data structures. 
 Most of the useful functionality, though, is provided by combinators, functions that allow us to combine iterators and process them in useful ways. These include map , fold , filter , and many…
The Improved User Interface crate has had its 0.3.0 release, adding new input fields ( Checkbox and Combobox ), new layout options ( LayoutGrid ), as well as finally working 100% on Windows, and with many bug fixes.
This comes with the 0.1.3 release of the underlying ui-sys crate to support these features. 
 It’s been a big undertaking to get to this point, and I’m excited to…
We, each and every one of us, need to make the decision to move to free, open source, and decentralized online services.
It will be painful. It will be difficult. It may mean giving up some comforts, like sending money instantly to friends without fees.
It is also the only way to prevent some seriously bad things from happening. 
 Inciting Events 
 In recent weeks, two major things…
I recently got a U2F Zero , a tiny (about 2 inches long) and cheap (about 8 dollars) device implementing the FIDO Universal Second Factor protocol. It’s open source, too, which is awesome. 
 
 
A close-up shot of the U2F Zero.
 

 I primarily use Firefox. Unfortunately, Firefox doesn’t support U2F out of the box; you have to enable security.webauth.u2f in…
One of the hardest parts of building beautiful Linux systems is fonts. Font precedence on Linux is generally handled with fontconfig .
In essence, fontconfig is used to permit many fonts to be installed and uninstalled over time without breaking applications which specify a font or font family, while letting users configure which fonts are used when a missing font, font family, or missing…
This is a sequel to my (rather long) introduction to reverse engineering. It is something of a “whirlwind tour” of some useful methods that weren’t shown in that tutorial, and provides a number of exercises to hone your skills. 
 The CrackMe Programs 
 You can find the CrackMes discussed here on GitHub . Clone that repository and, without looking at the source code ,…
This document presents an introduction to x86_64 binary reverse engineering, the process of determining the operation of a compiled computer program without access to its source code, through a series of CrackMe programs. 
 There are a lot of excellent tutorials out there, but they mostly focus on the 32-bit x86 platform. Modern computers are, almost without exception, 64-bit capable, so this…

 Install for Firefox or Chrome , or view on GitHub 
 What is RandomUA? 
 RandomUA is a WebExtension that changes your User-Agent string to a sensible-looking, desktop-browser-like UA string which is different for every request. 
 A User-Agent string is a piece of information that your computer sends to every website you go to. It tells them what software you use to access the…
I recently switched back to Firefox from Google Chrome. Firefox has gotten a lot faster recently, and is in the process of getting event faster, partly thanks to Mozilla’s Rust language , which is being used to write important components in a provably memory-safe way. This allows them to be made much more concurrent and parallel, leading to large speed improvements. 
 One big draw of…
Programmers talk a lot about types, but what is a “type”, anyway? It is, in essence, the set of all possible values for some variable. Defining such a set gives us some information about what we can do with the value of that variable, in general. 
 For example, when speaking about numbers, we might say, “let x be any integer” or “let y be any real number not equal…
I hadn’t really decided whether or not I liked Battle Dome until I punched a wall with my Vive wand while trying to poke my rifle out from behind cover to distract the sniper that was killing all my teammates. Then I decided that I liked it very, very much. 
 Battle Dome , available on Steam , is a 5v5 first person shooter that manages to combine all the best elements of…
Quanero VR , available from “Laserboys3000” on Steam for nothing, is the best of the many VR experiences I’ve encountered so far. 
 This isn’t because it’s particularly beautiful (it’s graphics are competent, much more so than those I’m able to create, but not on a AAA level) nor because it’s gameplay is particularly well designed (in fact, it has almost no “gameplay”). Quanero is amazing…
I was recently fortunate enough to be the recipient of a grant for $2000 to learn about virtual reality and develop a video game using the HTC Vive. So far, I’ve mostly been exploring prior art. 
 There is the problem of cost; the $2000 went pretty quickly, first for a GTX 1080 to produce the graphics and then for the $800 Vive itself, along a bit of money for tripods for the…
SBrain , or Semantic Brain , is a language based on Urban Müller’s famous language Brainf*ck with only 8 symbols (3 bit instructions). SBrain’s additions increase the number of symbols to 32 (6 bit instructions), including bit-shifting and arithmetic, and add a stack and a register. 
 Having these additional facilities allows SBrain to be far more expressive while retaining its…
I’ve recently been working on a project called the Machine Learning Machine, or MLeM.
It’s a VM implemented in the Rust programming language which I hope to use as a basis for some genetic programming. 
 It’s a Harvard architecture machine, meaning that it has separate representations and memory for data and program segments. While this is not the way most modern…

 Author’s note: Piston has moved on since March of 2017. This tutorial, for 0.64 , is
preserved for posterity; I suggest you look instead at
 the official getting started guide . 
 
 I’ve been interested in game programming for a while, and I periodically sample the Rust ecosystem’s offerings around game programming. Piston seems like the most promising…
Session types are a technique for using a rich type system, like that of Rust or OCaml, to prevent the representation of certain kinds of illegal states. Here, I’ll illustrate them with a (somewhat contrived) example. 
 What is the use-case? 
 Let’s take the example of a system representing packaging and shipping boxes. I want to create a Package data structure, pack data into…
I occasionally spend time randomly surfing the Python standard library docs; there is a lot of useful functionality included in the language’s standard distribution, such as, for instance, the socketserver module, which I didn’t know about until this evening and which is one of the most useful I’ve seen in a while. As ever, the docs are straightforward in their self-description:…
In 1999, J. David Blackstone, or, as he is known online, jdavidb , was taking CSE 4344 (Network Concepts) at UT Arlington. Those were the glory days of Sparc Solaris, and Blackstone wrote, for his college course, a C program called tinyhttpd . It is, essentially, a very short version of the immensely complex programs that seem run the world these days: web servers. Unlike the million-line…