die() is such an often used idiom in Perl that you tend forget its irrevocability in real life ;-(
Liz | [reply] [Watch: Dir/Any] [d/l] |
Iain will be missed. It was only last November that he gave up some time to present a talk on DateTime at the melbourne.au PM.
Iain talked in detail how the development was proceeding on the Datetime modules and how he spent the last 8 months hard work crafting hacking ("hacking" is a poor choice of words. Conceptually DateTime is not for the weak of mind). The talk was well presented, informative and most of all amusing (especially the bit on the evolution of the French Revolutionary Calander)
I will certainly be thinking of him when I'm using any of his modules. His legacy is more than mere code.
| [reply] [Watch: Dir/Any] |
| [reply] [Watch: Dir/Any] [d/l] |
| [reply] [Watch: Dir/Any] |
User since: Jan 20, 2000 at 03:50 GMT+4
Last here: Dec 23, 2003 at 20:30 GMT+4 (3 weeks ago)
Experience: 230
Level: monk (5)
Writeups: 31
How many of us have to ++ those 31 helpful and polite writeups for him to make saint?
Maybe the gods are listening...
| [reply] [Watch: Dir/Any] |
When I read about this yesterday, I popped open the freenode #perl and #regex logs and read many of Iain's conversations. I was always impressed at the friendly, professional approach he took with users. I wish we'd been able to find more time to chat with each other.
Thanks for posting this, merlyn.
| [reply] [Watch: Dir/Any] |
Boy: There is no spoon.
Neo: There is no spoon? | [reply] [Watch: Dir/Any] |
He may be missed, but his code won't be. He has a public SVN repository which is open access. If he was still with us today, I'm sure he'd be glad to know that someone wrote this piece of code ... so that we may not lose any of his gifts.
This one's for you, spoon.
#!/usr/bin/perl -w
use strict;
use POE;
use POE::Component::Client::UserAgent;
use XML::Sablotron::DOM;
use URI;
my @urls = qw(http://dellah.org/svn/perl/);
my $thread = 0;
sub _start {
$_[HEAP]->{situa} = new XML::Sablotron::Situation();
$_[HEAP]->{alias} = "useragent".$_[ARG0];
$_[HEAP]->{thread} = ++$thread;
POE::Component::Client::UserAgent->new
(alias => $_[HEAP]->{alias});
$_[KERNEL]->yield("next");
}
sub next {
if (my $url = pop @urls) {
$_[HEAP]->{url} = URI->new($url);
print "Thread $_[HEAP]->{thread} fetching $url\n";
$_[KERNEL]->post (
$_[HEAP]->{alias} => "request",
{
request => HTTP::Request->new(GET => $url),
response => $_[SESSION]->postback('got_it')
}
);
} else {
print "Thread $_[HEAP]->{thread} waiting 10s for more work\n";
$_[KERNEL]->delay(waiting => 10);
}
}
sub waiting {
if (@urls) {
goto \&next;
} else {
print "Thread $_[HEAP]->{thread} shutting down\n";
$_[KERNEL]->post (
$_[HEAP]->{alias} => "shutdown",
);
}
}
sub got_it {
my (undef, $response) = @{$_[ARG1]};
# write the response to a file
my $url = $_[HEAP]->{url};
# pick a filename like wget does
(my $filename = $url) =~ s{^http://}{};
my ($dirname) = ($filename =~ m{(.*)/[^/]*});
( -d $dirname ) || system("mkdir -p '$dirname'");
if ($response->is_success) {
if ($url =~ m{/$}) {
print "Thread $_[HEAP]->{thread} scanning $url\n";
# a directory - grok it with Sablotron
$_[HEAP]->{doc} = XML::Sablotron::DOM::parseBuffer
($_[HEAP]->{situa}, $response->content);
my @dir_nodes = @{ $_[HEAP]->{doc}->xql("//dir") || []};
for my $node (@dir_nodes) {
push @urls, URI->new_abs($node->getAttribute("href"), $url)
}
my @file_nodes = @{ $_[HEAP]->{doc}->xql("//file") || []};
for my $node (@file_nodes) {
push @urls, URI->new_abs($node->getAttribute("href"), $url)
}
} else {
# write response ...
if (open FOO, ">$filename") {
print "Thread $_[HEAP]->{thread} saving $url to $filename\
+n";
print FOO $response->content;
close FOO;
} else {
warn "failed to open $filename for writing; $!";
};
}
} else {
warn "Thread $_[HEAP]->{thread} got error loading $url; "
.$response->status_line."\n";
}
$_[KERNEL]->yield("next");
}
for (1..3) {
POE::Session -> create
(
inline_states => {
_start => \&_start,
next => \&next,
got_it => \&got_it,
waiting => \&waiting,
},
args => [ $_ ], # arguments
);
}
$poe_kernel->run();
$h=$ENV{HOME};my@q=split/\n\n/,`cat $h/.quotes`;$s="$h/."
."signature";$t=`cat $s`;print$t,"\n",$q[rand($#q)],"\n";
| [reply] [Watch: Dir/Any] [d/l] [select] |