The Magic of Extundelete

Last night, I was just falling asleep when my roommate knocked on my door with a Linux problem. Our CS480 assignment was due at midnight and she’d finished the work, then accidentally overwritten the most important file in her program with a malformed tar command.


Code Coverage in the Monte Tests

My schoolwork is particularly bad this weekend, so I’m procrastinating by learning to analyze the test coverage of a moderately complex Python codebase. Specifically, the reference implementation of the Monte programming language. This effort is hampered only slightly by the fact that I’ve never done much with code coverage tools before.


Hardware Saga, part 1

At around 1pm on 2/26/2015, my ThinkPad X230’s screen died without warning. I put the laptop away to take a quiz in class, walked home, tried to boot, an it remained black. The LEDs and CPU fan went through their familiar boot process, but the screen remained stubbornly blank.

Below the fold you’ll find several pages of excrutiating detail on the situation, because I enjoy writing these things down.


The SomeoneWhoCares Hosts File

I’ve been having intermittent problems with Firefox freezing up, pegging a CPU, eating all my memory, and freezing my desktop environment over the past few weeks. The only apparent trend in their occurrence was that they happened while I was active on HabitRPG and other ridiculously Javascript-heavy sites.

I disabled AdBlock Plus, and haven’t had a similar freeze since then. I also haven’t seen an increase in the amount of annoying ads, even when I visit questionable websites. This is because I took 30 seconds when first setting up my Arch installation to take an incredibly easy and effective action against ads.


Making a PDF of Hieroglyph slides

I build slides for my presentations with Hieroglyph, which makes beautiful HTML presentations out of raw ReStructuredText. However, HTML slides with my speaker notes in a JavaScript console are not ideal for redistribution.


Scale13x Retrospective

This year I had the pleasure of attending and speaking at the Southern California Linux Expo. Here’s what I observed about the location, the conference’s organization, and my own talk.


Automating Irssi

I use Irssi as my IRC client because I don’t need to write my own plugins for it, and its documentation is excellent even when you’re not sure what questions to ask. If I needed plugins that haven’t already been written by others, and didn’t mind either reading the entire manual or constantly asking for help to solve simple problems, I would switch to Weechat.

I’ve configured Irssi to automatically join the networks that I want, authenticate me to services, then join my preferred channels. The Irssi beginner docs are a great reference for client commands to set these functions up, but if I was doing it over again, it would save a lot of keystrokes to simply hand-write the config file which those commands end up generating. Here’s how you can do that.


Starting screen+irssi at boot

Installing security updates isn’t always enough to apply them; you have to reboot from time to time if you want the benefit of any kernel upgrades that don’t use live patching.

There’s also a small chance that my hosting provider might reboot my VPS. This has only happened once so far, as part of the Spectre/Meltdown mitigation in early 2018. After that reboot, my IRC setup came back to life without any problems as a result of the configuration that I documented in this post.

In both cases, I would like my IRC client to get back online as soon as it can after reboot.


Résumé Improvement with LaTeX Macros

It’s career fair season at OSU, which means that I’m taking my annual dive into LaTeX programming in order to improve my résumé.

I’m discovering how powerful and easy to use the macros in LaTeX are. Let’s talk about why you might want to convert your résumé to LaTeX, and how to do it easily.


My Second Steps with Javascript

There are many things to hate about Javascript. I’m not a fan of the language, and I’ve been known to laugh at people when they make unqualified claims that it’s “good”.

However, I sometimes find myself wanting to build toys and share them with everyone who has a web browser. Compared to the security and scaling implications of making my poor little VPS run a bunch of other people’s code for them, Javascript becomes the only viable option.


Interview on

As part of my upcoming talk at SCALE, I was interviewed on

Nitish Tiwari interviewed me by email about my talk, then edited my comments into what I feel like ended up as a very nice publication. I appreciate the CC-BY-SA license under which he released the article.

Installing gavrasm on Arch

Avra, the AVR assembler that I have been using for my ECE375 assignments, started throwing cryptic error messages such as “PRAGMA directives currently ignored” from an include file which had previously been working fine.

In order to sanity check whether the problem is in my code or the compiler, I installed gavrasm, the assembler which the ECE375 lab website recommends for Mac users.


Mailman and Multiple Addresses

“Your message to the list requires moderator approval”, replies Mailman when you try to post to your mailing list.

“But I’m on the list!” you complain, then waste a few minutes of your day finding the administrative password and releasing your message.


Automating Arch, I3, and Terminator to do the right thing at startup

I’m currently on my second clean install of Arch Linux. On the whole I’ve been glad that I ditched most of my old configuration when I installed Arch to the new SSD I got for my laptop at the beginning of the school year. However, I’d been procrastinating on re-implementing a few things which worked last install without me really knowing which of my many attempts had fixed them. This time, I know what I’m doing and what questions to ask.


Please License Your Code

Code without a license isn’t open source. It isn’t free software, either.

Posting your code publicly doesn’t inherently apply a license to it.


20 HabitRPG levels in 5 days

I’ve been having fun with HabitRPG lately, and discovered this One Neat Trick:



The Trouble with Toctrees

It’s a couple weeks and nearly a dozen posts into this Tinkerer experiment, I’m mostly delighted with it. It’s fulfilling its original promise of “write RST, push button, get pretty blog”... Mostly. There’s one problem, though. I constantly forget to add master.rst when committing.


Gamifying Adulthood with HabitRPG

After creating an account and abandoning it some time before December 2013 (since I have never yet subscribed and yet had a Trapper Santa scroll in my inventory), I have returned to HabitRPG. Here’s a quick examination of why I think I left and then came back.


Arbitrary Python versions on Flip

A question in the #osu-lug channel about running python 2.7 on a school server (which only has python 2.6.6) made me realize I should know how to do that but have never tried it. Stackoverflow provides instructions for solving a similar problem, so I’m testing them out to make sure they work for Python 2.7.7 and Python 3.


Vim: Open file with cursor at the end

As part of a recent quest to automate everything and learn more Vim tricks, I’ve been identifying patterns in my use of the editor and attempting to get them done with fewer keystrokes.


What Makes a Good Mailing List Post?

As part of my student club officer duties, I send a lot of emails. One game that makes this chore less onerous is to try to optimize each email’s quality. I do this by observing my own reaction to others’ postings, and others’ reaction to my posts. Here are a few trends I’ve noticed.


Those funny characters in Vim


I copied and pasted some of the lines from a PDF, and now I have a problem which is nearly impossible to Google.


Searching a FOSS project’s history

I’m curious about whether anyone has tried to build a predictive analytics plugin for Heka before. To find out, I’m going to stalk the project’s entire recorded history. Since it’s a relatively young project (only in its third year of having a public mailing list), the history is small enough for basic Linux command-line utilities to handle in a timely manner.

Here are all the places one can look for project history, and how I used them.


ECE375: Using an Arduino Uno as a programmer

I have an atmega128 development board for the ECE375 class at Oregon State University. I believe the board is good, because it runs the test program that it came with when I picked it up from TekBots. I also have an Olimex AVR-ISP-MK2 programmer inherited from an ECE major friend, which I have come to conclude is bad, because despite testing and rebuilding all of the connections between it and my atmega128 board, despite passing avrdude all of the force and override-warnings flags at my disposal, it consistently refuses to program.

Since my assignment is due tomorrow, I am configuring an Arduino Uno to stand in as a programmer. Here’s how.


Don’t rename Tinkerer posts

Or if you must, at least do it correctly. Here’s how.


Floating-point Forth

The first assignment for CS480 (Translators) requests that we use Forth as a pocket calculator, rather than teaching the immensely powerful composition strategies for which it’s valued in the real world.

Since our first exposure to the language is a deep dive into the syntax of floating-point computation, no single tutorial on the web answers all the strange assortment of introductory and advanced questions that my classmates and I are running into.


Blogging with Tinkerer

I had a wok site here for a while, but I rarely (okay, never) updated it. My experience with blogging platforms has been limited to Wordpress (both self-hosted and on, Wok, Pelican, and an abomination of a Trac plugin that I’d prefer to forget.

Here’s how and why I am now trying Tinkerer.