Percy doing her no-paws Kilroy impression

Here is my PGP public key.

Here's a list of the non-technial books I've read since 1990.

Here is the obligatory picture of my (so much younger!) self (and a variation on that theme). Feel free to poke around my photo archive, or Maryanne's photo archive.

My favorite thing is fostering kittens for my local SPCA. I've been wanting to put up a gallery but so far the best I can offer are a couple of kitten-based gag images and a few kitten videos.

Other than that my primary hobby is playing board and similar games. I attend a weekly game night at the University of Virginia (all are welcome, write me if you want details) and I host a weekly game night at home.

I keep track of the games I've played and my game collection at Here are some games I've played recently:

I've worked (very) intermittently on a Perl implementation of The Scepter Of Zavendor board game for many years.

Nethack is used to be my favorite computer game. I've played versions of it off and on since 1985. Hearse is a protocol which allows Nethack users to exchanges bones files with each other. I've written a Unix Hearse client, and a number of Nethack patches.

After Nethack my favorite game made a somewhat lateral move to Dungeon Crawl, which I love for its anti-grinding philosophy and so many other excellent choices. I've written a couple of simple patches for it but they were merged in.

I spent a good number of years playing Quake, running some Quake servers, and working on a Quake mod called Artifact-RJS. I don't do that any more, but amazingly the mod is still active, now called Rune Quake, 22 years(!) after Quake was released.

A number of the scripts below use my RS::Handy module (modified 2018-08-14, RCS, installation instructions). This module provides useful but not otherwise classified functions I use in my Perl programs (see the RS::Handy documentation). I should really have more discipline about categorizing all these things and creating separate modules for them so that they can be uploaded to CPAN. That's a lot of work, though, and if I forced myself to do that I'd likely end up re-writing these when I needed them, and that'd be worse than having this grab-bag module. What I like to do is to split useful components out of RS::Handy into modules which can be uploaded to CPAN. So far it has yielded Proc::SyncExec, IPC::Signal, Proc::WaitStat, String::ShellQuote, and some which made it into the core. If you find any of these compellingly useful let me know so I can prioritize splitting them out, too.


books-gen (modified 2018-08-19, RCS)
This Perl program generates the web pages of books I've read from the text file in which I actually store the information.
ftp-upload-1.6.tar.gz (modified 2018-01-22, sig)
ftp-upload transfers local files to another machine using FTP. It's meant to be used by scripts and such rather than interactively. There's no user interface, the program is controlled strictly via the command line. It is disciplined with its exit status. (modified 2018-01-18, RCS)
This is my ~/ file (used by sirc, a Perl IRC client).
mail-output (modified 2013-05-08, RCS)
mail-output runs a command you specify and mails you any output it generates. Normally if there isn't any output no mail is sent, but you can override this. If the command exits with a non-zero status mail is always generated. Here's the mail-output man page. This script requires RS::Handy. (modified 2011-11-03)
This is compiled copy of the current version of the SIMBL plugin TerminalCopyOnSelect found on github ( on 2011-11-03. This allows it to work with Lion's version of Terminal (299). (With the compiled version at you get "Error Terminal [...] has not been tested with the plugin TerminalCopyOnSelect [...]".) (modified 2010-08-24)
This is compiled copy of the current version of the SIMBL plugin TerminalCopyOnSelect found on github ( on 2010-08-24. This allows it to work with current versions of Terminal. (With the compiled version at you get "Error Terminal [...] has not been tested with the plugin TerminalCopyOnSelect [...]".)
mime-construct-1.11.tar.gz (modified 2010-06-23, sig)
mime-construct constructs and (by default) mails MIME messages. It is entirely driven from the command line, it is designed to be used by other programs, or people who act like programs.
String-ShellQuote-1.04.tar.gz (modified 2010-06-11, sig)
This Perl module provides functions for quoting strings for safe passage through shells.
dedup (modified 2010-01-27, RCS)
This program scans the files given as arguments and removes duplicates. See the dedup documentation for more info. This requires RS::Handy. (modified 2010-01-11, sig)
This is compiled Mac app of version 0.6.1 of Keldon Jones' excellent Race for the Galaxy computer version with AI. As with the pre-compiled version on, you have to install the Mac GTK framework before using it.

Changes to the original source were minimal, here's the source diff.

rss-download (modified 2007-12-27, RCS)
rss-download automatically downloads files listed in an RSS feed. It isn't documented or feature-complete yet, but I'm already using it so I thought I'd put it here early.
mbox-purge (modified 2007-05-01, RCS)
mbox-purge performs batch deletion of email messages from mbox format files with appropriate locking, based on rules you specify. You can select messages received before or after some point in time, or whose headers or bodies match some Perl regular expression, or which are selected based on an arbitrary Perl expression. See the mbox-purge documentation for more info and examples. I use it to let my users automatically delete messages older than a certain date, and sometimes to purge email-based viruses and the like. This requires RS::Handy (from here) and Proc::WaitStat (from CPAN or here), and Date::Parse (from CPAN) if you want to do date parsing.
lgtoclnt_7.2.2-1.diff.gz (modified 2007-02-14)
This diff can be used to create a Debian .deb package for Legato Networker version 7.2.2. The simplest way to use it is to place it in /var/lib/alien and run "fakeroot alien lgtoclnt-7.2.2.jumbo-1.i686.rpm".

BTW, to get a .deb of the man pages you can use "fakeroot alien lgtoman-7.2.2.jumbo-1.i686.rpm" without any patch (though the version number will be a little off). The scripts aren't necessary.

apt-pinning.html (modified 2006-06-14)
APT's Default-Release setting (aka "apt-get --target-release") is an extremely useful feature, but it doesn't work very well if you're using more than 2 releases in your /etc/apt/sources.list file (such as stable, testing, and unstable, or any 1 of those plus multiple non-Debian sources). This document contains a description of the problem and an /etc/apt/preferences file which improves the situation a bit.
URI-Find-0.16.tar.gz (modified 2005-07-22, sig)
This module helps pick URLs out of text strings. It was written by Michael Schwern, but I'm currently maintaining it.
x-resolution.c (modified 2005-07-11)
This is an X program which outputs the X and Y resolutions of your current screen.
randline (modified 2005-04-08, RCS)
randline picks random lines from its input, either a fixed number of lines, or a certain percentage of lines. In all cases it does this using a single pass over the input, without saving it all in memory. Here's the randline man page. This script requires RS::Handy.
db2-linux-client.html (modified 2005-03-31)
I needed to access a DB2 database on a remote (Windows) server from a Debian Linux machine using Perl's DBI (DBD::DB2). Here are my notes about how I did it.
gzip-links (modified 2005-03-25, RCS)
gzip-links is like gzip but it allows you to compress multiply-linked files. It does this by removing all but one of the links, compressing the data under the remaining name, then linking to the removed names (plus .gz). See the gzip-links documentation for more info. This requires RS::Handy.
Proc-SyncExec-1.01.tar.gz (modified 2005-02-05, sig)
This Perl module contains functions for spawning processes with proper exec() failure error reporting. It also has a fork_retry() function. It lacks tests, examples and a synopsis but it is otherwise complete.
pound-perl-nick-changes.html (modified 2004-11-22)
It turns out that I'm really bad at noticing when people change their IRC nicks. More than once on #perl after learning that somebody I've been talking to for a while used to be somebody else I'd been talking to for a while I wished for a nick change cheat sheet. So here one is.
jules-pool.html (modified 2004-04-26)
Date/time/weight pool for our baby's birth.
catan.html (modified 2002-10-06)
A reference list I keep with my Catan set to aid reconfiguring for different games.
mail2news (modified 2002-06-18, RCS)
This is my mail to news convertor and injector. It gets reasonable threading by creating References from In-Reply-To if necessary and possible. It is a Perl 4 script (though it says perl5 in the shebang line).
dunk (modified 2002-05-06, RCS)
dunk stands for "du, no kids". It's like du but a directory's size doesn't include the data in its subdirectories. These days I'd likely just have used GNU du's --separate-dirs switch, but dunk also outputs the size in a fixed-width field. This requires RS::Handy.
stderr-die (modified 2002-04-26, RCS)
stderr-die is a Perl script which runs the command given as its args and mostly stays out of the way. The exit status is normally the exit status of the command. If the command outputs anything on stderr but exits with a 0 status, though, the exit status will be 1 instead.
aixtoolbox-updates (modified 2002-04-01)
aixtoolbox-updates checks the Aix Toolbox FTP site for updates to the RPMs which are installed on the local machine, and downloads those which have been updated. It's neither polished nor bulletproof, but I'm releasing it as-is as I'm unlikely to improve either thing any time soon. Here's the aixtoolbox-updates man page. This script requires RS::Handy.
xwarppointer.c (modified 2002-03-01)
This is an X program which moves your mouse pointer to the X and Y coordinates given as args.
xvidmode.c (modified 2002-03-01)
My intention is for this program to allow switching among your XFree86 video modes from the command line. So far it only switches to the default mode. I bind it to a contraol-alt-keypad-enter so I can more easily get back to the right resolution if a game leaves me in the wrong one.
learn-ip-address (modified 2001-12-04)
The Perl FAQ contains a method for finding out your machine's IP address which works by first determining its hostname and then doing a gethostbyname() on that. Here's an alternative I suggested which doesn't rely on hostname lookups, but has the disadvantage of giving you only one address when run on a multi-homed host.
libsirc-0.12.tar.gz (modified 2001-07-27, sig)
This is collection of modules for sirc, a Perl IRC client. It provides lots of programming conveniences, plus auto-opping, kicks with temporary bans, and the like. It notably contains Sirc::URL, which might be the most day-to-day useful thing I've ever written. It marks up the output on IRC to allow you to load URLs without cutting and pasting them. To use it you'll also need URI::Find 0.11 or higher.
tracked-packages (modified 2001-03-09, RCS)
This is a Perl script I use on Debian systems. It lets me know what newer versions of the packages I'm tracking from unstable are available. It's useful on a Debian system which is mostly tracking stable but has a few packages installed from unstable.
Proc-SafePipe-0.01.tar.gz (modified 2000-09-23, sig)
These Perl functions provide a simple way to read from or write to commands which are run without being interpreted by the shell. This module provides both popen() and backtick equivalents.
Proc-WaitStat-1.00.tar.gz (modified 1999-10-21, sig)
This Perl module contains functions for interpreting and acting on wait() status values. This module requires IPC::Signal, so get that one, too.
IPC-Signal-1.00.tar.gz (modified 1998-10-27, sig)
This Perl module provides functions for translating signal names to numbers and vice versa. This version works with 5.005 (and earlier). Older versions didn't work with 5.005 because the format of $Config{sig_num} changed.
User-utent-0.02.tar.gz (modified 1998-05-14, sig)
This is a version of my utmp/wtmp module which does not work. I'm releasing it as part of my guilt alleviation campaign. I'd done a lot of work on the module last summer, but I could never get around to finishing it.

I'm bundling up what I've got so far and looking for somebody who'd like to take it over. The module uses autoconf with quite a bit of local m4 code to do configuration. I've looked the code over (for the first time in 4 months) and the foundation is solid, particularly aclocal.m4/ and the gen-code script. I'd estimate that the module is about two thirds done. I hope somebody can give it the time it needs, I think this module could really shine.

ssh-command-users.txt (modified 1997-09-15)
This is a patch for SSH 1.2.21. It gives you the ability to specify that some users are allowed to use SSH to log in to the machine (slogin) but not to run arbitrary commands (ssh/scp).
User-utent-0.01.tar.gz (modified 1997-05-01, sig)
This is a Perl interface to the utmp, wtmp, utmpx and wtmpx databases and functions. It is definitely not ready for prime time. Most of the XS functions have been written, but neither the automatic utmp/utmpx Perl glue nor the documentation has. This version should be at least a little useful, 0.02 does not work but I'm releasing it anyway because I'm looking for somebody to take it over. (modified 1996-10-15)
A replacement player skin for Id's game Quake. This skin makes it easier to distinguish other players' teams in a multiplayer game. Here's the readme file (modified 1996-10-15).

I'd like to go on record noting a couple of things in order to get them out of my head:

Thank you for your indulgence.

Roderick Schertler <>