programming projects

here are a few programming projects and scripts that I've written over the years that may actually be of some use to someone. If you do use them I'd love to hear about it.

May 2011: As of this year, I'm starting to make a point of putting some of my small scripts and tools up here as I make or modify them. Nothing here is in what I'd call a finished state, but publishing something gives me a bit of incentive to make things a bit nicer. For something that I use once or twice ever, there's no point in making it do more than work, but once I've used it a few more times maybe it's worth cleaning up enough to put here.

Here is my sliding block puzzle solver. At the time of it's writing (over 10 years ago), it was the fastest general purpose slide puzzle solver I knew of. A few others have managed some significant feats but this is still a good solver. The code is a bit crufty and needs a bit of cleanup. It was written when windows compilers had weird placement of unix system calls. It was also written when I was willing to do such attrocious things as include c files in other c files to avoid creating header files.

snap is a super simple versioning/checkpointing script for *nix systems built on top of rsync. I use it for things that I don't want to put into a more proper version control system.

quat_mand_gtk is a program to generate 3d slices of quaternian space Julia set images and display them as a stereo pair image. It has a somewhat clunky but functional gtk interface. This is the basic usage doc. This is an example image created with one of it's predecessors.

The program itself is pretty neat but what I'm particularly proud of is my reimplementation of J Bloomenthal's implicit surface polygonizer. My implementation cuts RAM usage by about two orders of magnitude and is multi-threaded.

Python module for creating a software interface with the TekPower tp4000 / tp4000zc digital multimeter. The serial protocol is impressively unwieldy.

A quick Perl script to generate 5x5 Boggle like boards. Simple but very useful since Hasbro no longer makes 5x5 Boggle games. This is usable either stand alone or as a cgi script and will generate 4x4 and 5x5 boards over a range of image sizes. This script randomly rotates the letters so it is more faithful to the game and can be played by multiple players in the center of a table. is a short perl script that I wrote so I can have a more useful regional weather radar image for the area where I live (Pittsburgh is in the corner of the wunderground's regional radar images which isn't very useful). I then animated them into a longer animation. This routine requires the perlmagick wrapper around imagemagick and gifsicle to create the optimized gif animations. Click here for the current four hour weather radar map of the north east quarter of the US.

get_list is a short perl script to grab sequences (or broken sequences) of web pages / images. It's not hugely powerful or configurable but it works for a very large percentage of the times I want to scrape a bunch of images off of a web site.

zoomify_dl downloads and assembles images chopped up to be viewed with the flash based Zoomify plugin. I've seen a couple of other scripts that provide the same basic functionality but they don't allow provide simple options to get specific zoom level, getting smaller sections of the image or recursively finding and downloading Zoomified images. is a script to create simple fonts usable by small c programs, ideal for embedded environments.

This uses ImageMagick to render each character of a font in a specific size, performs some additional processing and then saves the rasterization as a c file that can be included in a program.

An example of its output is here (simple_font.c). Simple code to use the generated font files is easy_text.c and easy_text.h.

getmail3 is a small perl script for downloading pop3 mail from my ISP's mail server. I wanted to be able to read my mail on my shell account and then be able to download it later. Ideally I'd be using IMAP but that was disabled... Sounds like I should be using fetchmail running as a daemon. This is what I did initially (my ISP even has a nice little script to set up fetchmail for you). However, there are two things that mail server does that fetchmail doesn't like...