Currency On-Screen Display
Here's a quick hack demonstrating a nice juxtaposition between the
power of a CPAN module - in this case Christopher Laco's
Finance::Currency::Convert::WebserviceX
- and the elegance and utility of the little known osd_cat
, putting
together a desktop currency rates widget in a handful of lines:
#!/usr/bin/perl use strict; use IO::File; use Finance::Currency::Convert::WebserviceX; # Configuration my @currencies = map { uc } @ARGV || qw(USD GBP); my $base_currency = 'AUD'; my $refresh = 300; # seconds my $font = '9x15bold'; # X colours: http://sedition.com/perl/rgb.html my $colour = 'goldenrod3'; my $align = 'right'; my $pos = 'top'; my $offset = 25; my $lines = scalar @currencies; my $osd_refresh = $refresh + 1; my $osd = IO::File->new( "|osd_cat -l $lines -d $osd_refresh -c '$colour' -f $font -p $pos -A $align -o $offset" ) or die "can't open to osd_cat $!"; $osd->autoflush(1); local $SIG{PIPE} = sub { die "pipe failed: $!" }; my $cc = Finance::Currency::Convert::WebserviceX->new; while (1) { my $output = ''; $output .= "$_ " . $cc->convert(1, $base_currency, $_) . "\n" for @currencies; $osd->print($output); sleep $refresh; }
Most of this is just housekeeping around splitting out various osd_cat
options for tweaking, and allowing the set of currencies to display
to be passed in as arguments. I haven't bothered setting up any option
handling in order to keep the example short, but that would be
straightforward.
To use, you just run from the command line in the background:
./currency_osd &
and it shows up in the top right corner of your screen, like so:
Tweak to taste, of course.