I've been putting a few cycles into souping up the ongoing software to brighten up the front page with an “image of the day,” and also to make the inline versions of the pictures smaller so as to go easier on the modemistas. The programming is pretty easy, but getting the tools together is a walk through Open Source Hell. (Teaser: Contains XML Insider Goodie)
A word on pictures generally: I look at my server logs, and it's painfully obvious that while some of the technical screeds here get thousands of readers, my little photo outings are viewed only by a handful comprising my immediate relatives and those who are convinced that if they look hard enough they'll find XML Insider Secrets (see below). I don't care, I like taking pictures and I like fiddling with them and I like posting them on the web, so ignore 'em all you want.
GD · Anyhow, what I needed was to be able to read, resize, and write the images from the ongoing Perl code. There are several facilities like ImageMagick that rely on using the X Window System libraries, but first of all I try to stay from X when I can, and second there's no good reason for the guy who runs the servers where ongoing lives to install and maintain X software.
So I settled on GD, a nice C-callable library that's been around forever (we use it in Visual net) and has a nice associated Perl module maintained by the redoubtable Lincoln Stein.
Well, normally, on Mac OS X if you want to use some Open Source stuff, you
use the very slick
fink package manager; for example,
if you're looking for the “Find
Outer Otter” package it usually suffices to say
sudo fink install
foo and go for lunch while
fink compiles it all.
fink knows about
so I stood back and let 'er rip.
Sigh, it turns out that
fink doesn't include Perl, it assumes you got it with
OS X or did it yourself,
and it has modules for Perl 5.6.
Well, I did get my own, and I'm running Perl 5.8, which you need if you want
to do a lot of Unicode processing.
So it didn't work.
CPAN Hell · So, this meant I had to do it myself. Well, if you are looking for anything in the land of Perl, the place to look is CPAN, the Comprehensive Perl Action Network, where approximately everything can be found, not just once but on mirrors everywhere. I use the term “found” loosely - the chance of anyone who's not a much harder-core Perl geek than me finding some random package on CPAN is approximately zero. There seem to be search facilities, but I've never got them to do anything useful. To start with, the central organizing principle of CPAN is that everything lives in a directory named after its author.
Fortunately, there's the “CPAN Shell”, which gives you a
command-line prompt and you can say things like
Mind you, whenever I do this, the shell spends fifteen minutes trying (and
failing) to download package directories using some form of FTP that clearly
Just Doesn't Work, before it switches modes and starts fetching things with
some other FTP mode that does.
OK, I fetched GD.pm, and since
fink had already built
for me, I thought I would be fine.
Nope; it turns out that the latest and greatest GD.pm that you get from CPAN
requires that you have v2.0.5 or greater of
some earlier version.
OK, I sighed, and was able to get
libgd.a v2.0.12 sources from
Boutell's site linked above, and of course then it wanted
which OS X comes with (but not the include files) so I had to go get that.
And of course, if you want to be able to read JPEGs, which are only generated
by every digital camera in the universe, you have to go track down
libjpg.a and build that too.
This is definitely two-steps-back-one-forward territory.
At some point during this odyssey I bashed away in Google looking for other people who'd had the problem, and saw that none other than Randal Schwartz, senior Perl deity, had been posting on the subject not too long ago. I know Randal from a shared Geek Cruise (that page fails to work in lots of browsers, bad O'Reilly) a while back, so I emailed him and he let me know that GD is famously difficult to build.
A little later, I had a working
libgd.a, and I went back to
CPAN and tried again for GD.pm and hey, it built!
Oops, it failed three of the installation tests.
But I tried it out and it seems to work fine, so I'm ignoring those failed
Windows Wins ·
My wife wanted to do some batch-job image crunching, and she has a Windows
laptop and is fine with Perl, I recommended GD and moaned about what a crock
it was getting it to build.
She fired up
ActiveState's “Perl Package
Manager” (by typing
ppm at the DOS command-line), entered
install GD, and it was all done in like 20 seconds.
Dammit, Unix is better than Windows because, er... because it just is, that's right.
GD is Good · Mind you, GD is a really nice piece of software, once you get it going. Here's how you scale and resize an image to make a thumbnail:
open($gfile, "<$inDir/$src") || die "Can't open image file $src"; my $bitmap = new GD::Image($gfile); my ($w, $h) = $bitmap->getBounds(); # make thumbnail version my $tnH = int($tnWidth * $h / $w); my $out = new GD::Image($tnWidth, $tnH); $out->copyResampled($bitmap, 0, 0, 0, 0, $tnWidth, $tnH, $w, $h) open(Out, ">$tnDir/$src") || die "Can't open thumbnail for $src"; print Out $out->png;
I suspect that Paintshop or Debabelizer might make a slightly better-looking thumbnail, but I don't know how to get at them from Perl code.
Debian Wins, Except When it Doesn't ·
I was emailing Matt, the guy who runs ongoing's colo, whining about my GD
problems, and he's a kind of a Debian chauvinist (I have a Debian box in my
basement too), and he wrote back pityingly “Tim, Tim, on Debian
you just type
apt-get install gd-pm and it's all done!”.
Speaking of all done, I got all those graphics updates done on the ongoing
software here on my Mac, and tried a run of the new version over on the
Oops! It turns out that Debian, just like
fink, got that back-rev of GD, and
it doesn't have that
copyResampled method, so I'm blocked for
In fact I've been informed that there's some metaphysical relationship
fink and Debian's
apt-get and friends, so
maybe this isn't a
Anyhow, Open Source is wonderful stuff except when it's not; but we all knew that already.