Herein is a list of some of the perl widgets I've been working on. They are
in various states of completion. Drop me a line if you've got an interest in
any of these. I haven't submitted any of these to CPAN yet.. I haven't had a
chance to discuss the naming issues with comp.lang.perl.modules yet.
Some of these modules are old and unloved, and there are others that I'm
actively working on but haven't had the time to mention here.
Stuff that hasn't been worked on in a while
Stuff that's been gathering dust for years
My PGP module differs greatly from the one available on CPAN. Rather
than controlling an external standalone pgp through pipes, my module
uses the 'libpgptools' library of PGP functions to achive a tighter
integration. There are functions to create objects that represent
keyrings, keys, and messages, either from scratch or from the output of
pgp. Then you can send methods to these objects to extract keys, sign or
decrypt messages, etc.
The tradeoff is tight integration for portability. The libpgptools.a
library requires some tweaking to build on an arbitrary platform,
and isn't as internationalized and patent-sanitized as the official
PGP distribution is, so it's use may be restricted by the laws of your
country or the policies of your company.
Now that the 'cryptlib' library is available and fairly stable, I'm
working from that instead. It will take longer to get to a module that
can do PGP functions, but the result should be far more portable.
Click here to see the README file and the current status.
(no longer maintained)
I finally found the library I was looking for. A guy named Peter
Gutmann from New Zealand has assembled the 'cryptlib' library that
implements many common encryption/authentication methods : DES, IDEA,
RSA, MD5, etc. It's easy to use (from C) and comes from outside the
United States. The problem with any crypto developed inside the US is
that it's illegal to export.
So now that this library exists, I can make a perl binding to it. My
CryptLib.pm module does exactly this. You can use IDEA to encrypt a
string in about 6 lines.
Click here to see the README file and current status.
(somewhat functional but the library has moved on without me, and
the Cryptix module has removed much of the need for this one)
to see the cryptlib home page.
CryptLib::PGP (take 2)
Now that the cryptlib library is available, I can rewrite my PGP module
to take advantage of it. The problem with libpgptools is that, while it
does many PGP functions, there are some that I had to do myself. There
were places where it would be much easier to parse the .pgp file by
myself and then call various routines to do the decryption. The problem
is that I couldn't use distribute the encryption routines with the perl
module (because of the ITAR export restrictions), and there was no
internationally-available library to do the functions I needed.
Well, now there is such a library. My new PGP module, to be called
CryptLib::PGP, will do all of the processing of the PGP file format
internally, using the CryptLib module to handle the crypto. This should
provide as good integration as my old PGP module while being much more
portable. The cryptlib library looks like it can be compiled on a wide
variety of systems, and the CryptLib::PGP module will be pure perl.
I expect this module to be usable on just about any machine that can
run perl itself.
Click here to see more information on this module.
(still a dream, and with PGP5.0 and the PGP development kit it will
probably look nothing like this, and might actually be able to use
real PGP code).
This is a program (not quite a module, but I intend to break it up a
bit and make pieces of it more reusable) that keeps various directories
on different machines synchronized. It uses email to transfer the
contents of the directories, only transfers files that have changed,
and keeps track of modebits properly. It computes an MD5 hash of the
files and exchanges a catalog of these hashes before sending any actual
data. If my PGP module is installed, the messages are encrypted and
signed to keep others from tricking the program into accepting bogus
Click here to see the README and status.
(no longer maintained since these days I either (a) use CVS over ssh
from work to keep things updated or (b) do work at work and fun stuff
at home. Having a fast linux box at home greatly helps this).
This is a pair of little modules that I can distribute with the other
modules. When I make a release of any of these modules, I check them all
into my source control (I use CVS) as a unit. An md5 hash of all the
files is put in the MANIFEST file. When the module is unpacked by
someone else and built, these hashes are checked. If any of the files
have been modified, the version number gets a '+' appended to it.
This makes it fairly easy for other folks to make local changes to their
copies of my modules and have a simple indication that their version is
derived-from-but-not-identical-to my version. I use this myself when
installing my own modules in other places to remind me that I've made
local changes that need to be integrated back into my main source.
(useable, I need to package it into a tarfile and talk to the community
about naming it.. perhaps Devel::Release::(Base|CVS) ).
This is a module for playing and recording sounds. At present it only
works on a sparcstation under SunOS, but it should be easily adaptable
to any machine that uses a stream-like device for moving audio data into
and out of the box. You can read .au files, play them, record to them,
change volumes, audio sources and destinations. Voice-activated
recording works (startvox at least.. stopvox doesn't work yet). There
will be hooks to run callbacks every once in a while, or when the record
level gets too quiet, that can play other sounds or stop recording. The
playback function will be interruptable by a loud volume on the record
I'm developing this module for my answering machine project. The
mechanical phone box on my desk is wearing down, and my goal is to move
the functionality over to the computer before it dies completely. Once
that's happened, I can start adding in nifty features like checking
caller-id numbers, or emailing the voicemail messages to myself at work.
I hope that this could be a fairly generic mechanism for handling sound
on a varity of machines.. I don't know what that will involve, though.
(status: it can play .au sounds, and record pre-determined durations.
On hold for now, when I get back to it I'll probably rework it to
function under either SunOS or Linux)
This is a module to do remote messages between perl objects running
in different processes, or on different machines, communicating with
TCP sockets. It's pretty simple, just enough to support my answering
machine project and my DragonChess game.
(status: on hold)
Someday, this will be a fullscale DragonChess playing program.
DragonChess is a D&D-inspired variant of chess (with a name that's
probably copyrighted by Dragon Magazine), that works on a 3x8x12 board
with 84 pieces in all. It's a little too.. big. I haven't found anyone
else who is interested in playing this game, so I decided I'd have to
write a program if I wanted an opponent. So far I've managed to put the
rules of the game into a machine-understandable format, and made a
little Perl/Tk widget that shows the board and lets you move the pieces
around. My vague thoughts are to use a combination of genetic algorithms
and distributed processing (running across all the free machines at my
office) to make up for what I don't know about writing game-playing
(status: on hold)
Update: I've been playing a game-by-mail with someone for a few months
now. I haven't made any more progress on the perl module, but I've been
slowly working on a game board implemented in perl with a Gtk interface.
Not much progress.
This is a module that you link against the SOCKS4 library for your
system. It replaces the standard socket calls with versions that know
how to ask a SOCKS proxy to create the world-visible sockets on your
behalf. You can use it in your own scripts or use it in a special way
that "hijacks" another module, handy to make LWP or IO::Socket use
SOCKSified sockets instead.
I don't use this too frequently these days since I changed jobs to an
office with (IMHO) crummy security that no longer requires outgoing
proxies, but it will probably be useful at home since I only have one
IP address and all the other machines must use SOCKS to get out to the
net. I use SOCKS for some things, and HTTP proxies (supported easily
with LWP) for other things.
status: functional, needs peer review and naming discussion. There's
another SOCKS module pending by
Clinton Wong that I need
to investigate.. his module does the SOCKS protocol entirely in perl
instead of linking against libsocks.a, which I like, but I think I like
my interface (and the "hijacking" function) a bit better. I've sent him
a copy of my code and he expressed interest in merging the interface into
his. I haven't heard anything else.
shared hotlist, embedding perl into emacs. P4 (the version control
system from Perforce). A module to
do something useful with GPG, perhaps an encryption-agent.
My perl download area is in http://www.lothar.com/ftp/perl/,
anything that I've polished enough to release is in there. Some day (when I
get things cleaned up and official names for everything) I'll register under
PAUSE and then this directory will get copied to CPAN.
Brian Warner <email@example.com>
Last modified: Thu Dec 23 11:08:37 EST 2004