Every so often I do something which strikes me as kind of cool.
There are at least three reasons for undertaking a project. One is
for the fun of doing it. Another is for the benefit I derive from the
end product. And the third is for the benefit other people might
derive from said end product. This page exists for the third purpose.
Actually, it mostly exists for my own amusement. But I like to claim
a higher purpose. And I do hope stuff proves to be useful. I may go
digging around for older stuff, but for the moment, this page only
lists relatively recent things.
- Subversion: Ensure
Properties
- This is a tool for manipulating Subversion
properties. Several subversion properties e.g. svn:ignore
are really lists of entries, but the command-line svn tools only
provide for manipulating the whole list as a single value. This
script lets you add (or remove) entries individually. Especially, you
can ensure that particular files are ignored. The file ensure.py provides a basic command-line tool and
several useful classes.
- Linux at CU Boulder
- This is mostly written in English, not code.
If you're at the University of Colorado at Boulder, and you're trying
to use a GNU/Linux system, this
mini-tutorial may help. Some of it was a pain to figure out, so
you might as well not have to do it to.
- EIRS - Election Incident Reporting
System
- The
Election Incident Reporting System is a joint project by a whole
bunch of organizations to track - and respond to and hopefully correct
- problems which occur in the current election. Unlike the rest of
the stuff on this page, it's actually important, and I'm only playing
a small role in it. But it's really cool, and you should know about
it. Here's CPSR's press
release.
- Stacker
- Stacker is another program that's grown out
of teaching Programming Languages: It's a run-time stack drawing
program. You give it a set of (possibly nested) sub-programs and a
calling sequence, and you get out a picture of the stack at that
moment in time.
Download stacker and play with
it! Stacker actually produces a graph specification and then uses
Graphviz to draw the actual
images, and gv to
display them, so you'll need to install both of those in order to
use it.
- EGAD! Eric's Grading Application Distribution
- EGAD
is a set of programs designed to help automate the process of
grading assignments for a course. EGAD does not actually assign
grades; it's sort of a poor man's work-flow management tool for
grading.
I'm currently (meaning, in the fall of 2004) TAing an
undergraduate programming languages course with eighty-odd
students. With that many students, any automation is a welcome
thing. EGAD started out as a handful of unrelated scripts, and
it's being slowly mashed into uniformity.
- Wireless Network
Sign-on
- This is a glorified wrapper around wget which
performs web-based log-in and log-out operations for wireless network
users. This script reads credentials from a configuration file,
attempts to log in/out, and processes the resulting page. It's written
for the University of
Oregon wireless network, but it's probably a good start for other
networks, too.
To perform the web operations, this script requires post
operations and SSL. POST form submission is not in wget 1.8 (the most
recent stable release as of 24 June 2004), so you'll need the CVS
version. If you're using Debian
GNU/Linux, you can get wget-cvs
from the experimental "release". My current
laptop is an Apple iBook with OS 10.3, so I built wget from source,
as described in the script. Previously, when I had an IBM Thinkpad
with Debian on in it, I had the networking scripts configured to call
a wrapper script whenever the wireless card was
ifconfig-ed. The wrapper used iwconfig
from Jean Tourrilhes' wireless
tools for Linux to get the network SSID, and called the
predecessor to this script if it was "uowireless." If you have any
suggestions on how to do this under OS X, please drop me a line!
Here are the relevant files:
- Firefox Oxford English Dictionary
Search
- The Mozilla browsers (both Seamonkey and Firefox) support search plug-ins based
on Apple's Sherlock standard. I've hacked up one for looking up words
in the OED. This what Mozilla
refers to as a semi-plugin because it just takes you to the
search results page, rather than parsing the output and filling in the
sidebar. Firefox doesn't have a sidebar, I don't really like it in
Seamonkey anyway, and the OED's search output is a little bit
ugly, so I haven't added support for that yet. Also, the plug-in's
self-update fields point to the Mozilla project's main plug-in
repository, but this plug-in hasn't been added yet (as of 17
Feb. 2004). I'm not aware of any problems arising from this, but
caveat emptor.
Note that I use this from the University of Oregon which has a
site-wide subscription to the OED. If you're not a subscriber, or if
you have an individual
subscription which requires you to authenticate yourself somehow,
then this may not work for you. If you're in the latter category,
please let me know how it works!
Here's the pseudo-xml source and
here's some javascript to
install it.
- HTML Calendar (aka gsched2)
- You'd think there were enough calendar
applications out there to meet any reasonable need. And you'd be
right. But for your unreasonable needs, here's a common LISP module for rendering
a schedule, described as a list of
activities, into a web
page. It's got a lot of configurable parameters, especially if
you use the make-schedule function instead of the wrapper
make-page. The results of either are valid XHTML/CSS and
many of the display attributes are controllable simply by providing
your own style sheet without having to change the htmlcal code. This
is done by using :afterstyles and a list of stylesheet URLs.
These stylesheets are included after the default style and thus
override it. As you might imagine, there's a corresponding
:beforestyles key if you want to include style sheets which
htmlcal should override.
Right now, you can write a small
common LISP program, or directly invoke the htmlcal library, but I'm
currently hacking up a wrapper program so you can use this from the
command line like any other Unix tool. That said, I think the main
strength of this software is that it's easily modifiable / extensible,
which is only of use to you if you're willing to do some programming.
- <un-named> version 0-point-diddly-squat
-
I was setting up an OpenBSD box to act as a NAT-ing router, firewall,
DHCP server and internal DNS server for my home LAN the other day. In
the course of doing so, I had to enter the same host information in
the DNS configuration files, the DHCPD configurations file, and the PF
routing rules, which seems wasteful and error-prone. I'm also learning Python because it's my team's
language of choice for a current research project.
So, to get some practice playing with Python and to automate this
task, I wrote a little tool to read host
information out of one file and plug it into N other configuration
files, each with its own syntax. Since its purpose is to generate all
my configuration files, I called it GenItAll. The next morning, the
error of my ways became apparent. I haven't thought of a better name
yet, though, so it sticks for now. If you have a better idea —
and any idea at all is surely better — let me know!
At this point, this program is less than entirely useful because it
only generates the DHCPD configuration file, so the rest have to be
done by hand. I post it because even in this primitive state I find
it easier to edit the hosts file than the
more verbose and easier to hose up dhcpd.conf. There are a few features of
this program which strike me as reasonable:
- Rather than try to make the program aware of the full complexity
of any given configuration file, it only knows about the syntax for
generating the host lists. Everything else is written up as a template file, and the host list is inserted
at the proper point.
- The template file can be a valid configuration file as well, since
everything between the BEGIN AUTOGEN and END AUTOGEN comments is
replaced. In fact, the template file and output file can be the same.
This is of value because it means that a human or automated tool can
directly edit the configuration file to change other options (outside
of the block to be replaced), and this program will not munge those
changes. Thus, existing users/tools/scripts don't have to be
reconfigured to be aware of the template file, and can just work with
the configuration file itself.
- Hosts belong to user-defined groups, and are inserted into the
configuration file on a per-group basis. By listing different groups
in the configuration files in different places (or maybe some not at
all), you can treat the hosts differently.
- Each configuration file is handled by its own code, which has the
drawback of duplicating effort, but also the advantage of letting you
define appropriate parsing behavior rather than forcing a
one-size-fits-all solution.
- Jardinains! Ports
-
Jardinains! is a
lawn-gnome-filled Breakout derivative by Tom Darby. I'm working with him
to develop versions for non-Windows operating systems. This is a
project in progress, so I'll post further when there's something to
show for it. Right now, you should just go find an unenlightened
friend who's running Windows, and play on her or his computer.
- The Goats Rapacious Greed Tracker
- My favorite on-line comic,
Goats has begun soliciting donations using
Amazon.com's Honor
System. I thought it would be fun to see a graph of their progress, so I
wrote the
Goats Rapacious Greed Tracker to keep and display a record. The page is
written in TCL and uses the AOLserver and ArsDigita Community System APIs.
The source code is now on-line. Here's
goats-2.tcl which displays the main page, and here's goats-requery.tcl which queries Amazon
for the data and puts it in the database.
Note: This is off line because the server (aka my personal
workstation) is sitting in a box on a shelf in a basement in a house
in Minnesota. Much to my chagrin,
Carleton College did not elect to continue giving me bandwidth
after I graduated.
Time and tide, as they say, wait for no man. Goats now has their own
progress-tracking system, and this would be redundant. Also, they
change their account number at Amazon now and then, and keeping up with
that would be more maintenance than a why-the-hell-not hack really
deserves. So off-line it shall stay.
- Connect
- Like any good programmer or sysadmin, I have
accounts on way too many different servers. And it's a pain to
remember, and type, my user name and the full machine name all the
time. To reduce this problem, I wrote this connect
script. Essentially, you tell it what host to connect to, and it
parses a configuration file for the full domain name, user name, and
connection protocol (eg. telnet, rsh, ssh).
There are two features which (in my mind) make it slightly more useful than it
sounds: First, the configuration file is stored on the web so that the user
only has to change it in one place. This eliminates the need to keep the
configuration updated on zillions of different machines. This configuration
file is encrypted to keep the contents (comparatively) safe despite it being
available on the web. There are lots of reasons why a list of machines one has
access to (and by extension, organizations one is affiliated with) could be
sensitive. If nothing else, that information could give spammers and crackers
a leg up. So encrypting it is a Good Thing (TM). The second nice feature is
that you can define shorthand aliases for the host/user name pairs. This script
requires OpenSSL or SSLeay for crypto, and wget to fetch the configuration.
If you want to use it yourself, here's a sample config file, and here's the tiny script I use to encrypt and upload the
configuration file. There's no documentation, but the command line
syntax is: connect alias. Of
course, you'll probably want to change the URL where it looks for the
config file, but that's not hard.
- Academic Projects
-
Stuff I've done for classes or research should show up off my computer science home
page.
This page uses Cascading Style Sheets, and may be aesthetically suboptimal
on browsers not supporting CSS.