Léon Brocard will give a two minute introduction to each of ten less known but useful Perl modules he has created and distributed on CPAN. He begins by introducing App-Cache, a module for easy application-level caching, and Crypt::Skip32::Base32Crockford, which allows encoding database record IDs in URLs using a Base32 encoding.
1. Ten modules I haven’t yet talked
about
I have modules on the CPAN and I haven’t yet
given a talk about most of them. I’ll pick ten useful
but less-known modules of mine and give two
minute introductions to each.
Léon Brocard
London Perl Workshop
2. Me
Léon Brocard
French, live in London
Like food
Like the colour orange
Founded Amsterdam.pm, Bath.pm, Croydon.pm
Now in London.pm
Started YAPC::Europe
Perl hacker
5. App-Cache
Easy application-level caching
# in your class, stores in something like
# ~/.parse_backpan_packages/cache/
my $cache = App::Cache->new({ ttl => 60*60 });
$cache->delete(’test’);
my $data = $cache->get(’test’);
my $code = $cache->get_code(quot;codequot;,
sub { $self->calculate() });
my $html = $cache->get_url(
quot;http://www.google.com/quot;);
$cache->set(’test’, ’one’);
$cache->set(’test’, { foo => ’bar’ });
my $scratch = $cache->scratch;
$cache->clear;
6. App-Cache
# in CPAN::Mini::Webserver
my $cache = App::Cache->new(
{ ttl => 60 * 60 }
);
my $parse_cpan_authors = $cache->get_code(
’parse_cpan_authors’,
sub {
Parse::CPAN::Authors->new(
$authors_filename->stringify
)
}
);
7. Crypt::Skip ::Base Crockford
Crypt::Skip + Encode::Base ::Crockford =
database record IDs in URLs
my $key = pack( ’H20’, quot;112233445566778899AAquot; );
my $cipher = Crypt::Skip32::Base32Crockford->new($key);
my $n = 3493209676;
my $b32 = $cipher->encrypt_number_b32_crockford($n);
# 1PT4W80
my $m = $cipher->decrypt_number_b32_crockford($b32);
# 3493209676
8. Email-Send-Gmail
Send Messages using Gmail
use Email::Send;
use Email::Send::Gmail;
use Email::Simple::Creator;
my $email = Email::Simple->create(
header => [
From => ’magicmonitoring@gmail.com’,
To => ’acme@astray.com’,
Subject => ’Server down’,
],
body => ’The server is down, panic!’,
);
10. Games-GuessWord
Guess the letters in a word (i. e. Hangman)
my $g = Games::GuessWord->new(
file => quot;/path/to/wordlistquot;
);
print quot;Score: quot; . $g->score . quot;nquot;;
print quot;Chances: quot; . $g->chances . quot;nquot;;
print quot;Answer: quot; . $g->answer . quot;nquot;;
my @guesses = $g->guesses;
$g->guess(quot;tquot;);
# ...
if ($g->won) {
print quot;You won!nquot;;
$g->new_word;
}
11. HTML-Fraction
Encode fractions as HTML entities
my $fraction = HTML::Fraction->new;
print $fraction->tweak($html);
# 1/5 is ⅕
which is displayed as ⁄
12. Image-Imlib - umbnail
Generate a set of thumbnails of an image
my $t = Image::Imlib2::Thumbnail->new();
foreach my $thumbnail
($t->generate( $image, $directory )) {
my $name = $thumbnail->{name};
my $width= $thumbnail->{width};
my $height = $thumbnail->{height};
my $type = $thumbnail->{type};
my $filename = $thumbnail->{filename};
print quot;$name/$type is $width x $heightquot;;
print quot; at $filenamenquot;;
}
13. Image-Imlib - umbnail
By default it generates thumbnails of the same
dimension that Flickr generates:
Type Name Width Height
Landscape Square 75 75
Landscape Thumbnail 100 75
Landscape Small 240 180
Landscape Medium 500 375
Landscape Large 1024 768
Portrait Square 75 75
Portrait Thumbnail 75 100
Portrait Small 180 240
Portrait Medium 375 500
Portrait Large 768 1024
14. Image-WorldMap
Create graphical world maps of data
use Image::WorldMap;
my $map = Image::WorldMap->new(
quot;earth-small.pngquot;, quot;maian/8quot;
);
$map->add(4.91, 52.35, quot;Amsterdam.pmquot;);
$map->add(-2.355399, 51.3828, quot;Bath.pmquot;);
$map->add(-0.093999, 51.3627, quot;Croydon.pmquot;);
$map->draw(quot;test.pngquot;);
16. Net-FTP- rottle
rottle FTP connections
my $ftp = Net::FTP::Throttle->new(
quot;ftp.example.comquot;,
MegabitsPerSecond => 2
)
or die quot;Cannot connect: $@quot;;
# then as with Net::FTP
17. String-Koremutake
Convert to/from Koremutake Memorable Random
Strings
use String::Koremutake;
my $k = String::Koremutake->new;
my $s = $k->integer_to_koremutake(65535);
# botretre
my $i = $k->koremutake_to_integer(’koremutake’);
# 10610353957
18. Term-ProgressBar-Simple
Edmund extended my Term-ProgressBar-Quiet:
provides a simple progress meter if run interactively
use Term::ProgressBar::Simple;
my @todo = ( (’x’) x 10 );
my $progress = Term::ProgressBar::Quiet->new(
scalar(@todo),
);
foreach my $todo (@todo) {
# do something with $todo
$progress++;
}
$progress->message(’All done’);
19. Term-ProgressBar-Quiet
progress: 10% [=== ]0m06s Left
progress: 40% [========== ]0m04s Left
All done
progress: 100% [==================]D 0h00m10s