#!/usr/bin/env python3
A wrapper around difflib.get_close_matches to make it easy to find misspelled
words in text that contains many non-words.
For regular text, where every letter sequence must be a dictionary word,
checking spelling is straightforward. Technical text, such as documentation or
code comments, may contain many valid non-words (e.g. function names) and
deliberate nonsense example strings. As a consequence, there tend to be many

Keybase proof

I hereby claim:

  • I am 0 on github.
  • I am 0_0 ( on keybase.
  • I have a public key ASDLXFbFtcCeD6vYtHwlR1M19TQhwTOOq93dfIqz9F6d3go

To claim this, I am signing this object:


The following are instructions for connecting a Bluetooth device for serial communication on Arch Linux using BlueZ 5.31.


The following packages are required:

  • bluez: bluetoothd
  • bluez-utils: bluetoothctl, rfcomm


The following are instructions for building a GCC cross-compiler for the MSP430. They are based in part on Peter Bigot's post to mspgcc-users.


export PREFIX=/usr/local/msp430
#!/usr/bin/env python3
Calculate complex square roots with the correct sign for trajectories in the
complex plane.
Taking the square root of values along a continuous trajectory in the complex
plane is not as simple as calling a sqrt function, because the complex square
root is a multi-valued function whose Riemann surface is composed of two
sheets. If the trajectory crosses the branch cut (conventionally placed along
View aif.jl
# Anaphoric if.
macro aif(ex)
@assert (ex.head == :if) "@aif must be applied to an if expression."
cond = ex.args[1]
ex.args[1] = :(convert(Bool, it))
let it = $cond

x86 shellcode

Back in 2010, I needed some shellcode, so I wrote this. It spawns Vim rather than a shell, so I guess it's technically "vimcode".

It is, of course, null-free. There is a commented version in the test file, but here it is in its entirety:


For some reason, in January of 2009 I felt the need to implement RC4 in Scheme.


Known to work with Racket.

Specify the key and plaintext on the command-line as arguments, and it will output the ciphertext. For example,

View arrays_pointers.c
/* gcc -std=c99 -pedantic -Wall -Wextra -Werror -o arrays_pointers arrays_pointers.c
#include <stdio.h>
#include <string.h>
#define A_LEN 5
void foo(int a[], int *p);
View cols.txt
abc 1 2 3
def 4 5 6
ga 7 9 10
hij 1 5 99