richardc's Journal
http://use.perl.org/~richardc/journal/
richardc's use Perl Journalen-ususe Perl; is Copyright 1998-2006, Chris Nandor. Stories, comments, journals, and other submissions posted on use Perl; are Copyright their respective owners.2012-01-25T02:03:54+00:00pudgepudge@perl.orgTechnologyhourly11970-01-01T00:00+00:00richardc's Journalhttp://use.perl.org/images/topics/useperl.gif
http://use.perl.org/~richardc/journal/
evolving - Paging Win32 and/or Device::SerialPort users.
http://use.perl.org/~richardc/journal/17800?from=rss
<p>So pleasantly enough <a href="http://search.cpan.org/perldoc?Device::Ericsson::AccessoryMenu">Device::Ericsson::AccessoryMenu</a> turns out to have quite the life of its own, so much so that the latest release
(0.8) is entirely the work of <a href="http://heim.ifi.uio.no/~argggh/">Arne Georg Gleditsch</a> who sent me a patch last
month which I shamefully only just got round to looking at.</p><p>Anyway in yesterdays mail I received a query about bluetooth devices
going out of range, which is in part the disconnection/reconnection
stuff mentioned in the <a href="http://search.cpan.org/dist/Device-Ericsson-AccessoryMenu/lib/Device/Ericsson/AccessoryMenu.pm#TODO">TODO section</a>
of the pod.</p><p>The problem in play here is that when your bluetooth device goes away
it's presented to the machine as 'your modem has been disconnected
from your serial port' and I can't work out how to get that from the
<a href="http://search.cpan.org/perldoc?Device::SerialPort">Device::SerialPort</a> API (actually, I can't figure out very much at
all from the documentation of <a href="http://search.cpan.org/perldoc?Device::SerialPort">Device::SerialPort</a> and
<a href="http://search.cpan.org/perldoc?Win32::SerialPort">Win32::SerialPort</a>, but that's a different matter).</p><p>One way around this whole mess is to avoid <a href="http://search.cpan.org/perldoc?Device::SerialPort">Device::SerialPort</a>
altogether, and handle the serial port directly in a <a href="http://www.easysw.com/~mike/serial/">posix stylee</a>, the downside to which is
but that means losing the plug compatibility with <a href="http://search.cpan.org/perldoc?Win32::SerialPort">Win32::SerialPort</a>
and so Win32 compatibility in general. </p><p>I'm somewhat reluctant to lose an OS just to make my life easier
(though if we were talking about AIX then that's quite a different
matter...), but I don't really know that there are Win32 users to
lose, and so on to the appeal.</p><p>If you're using <a href="http://search.cpan.org/perldoc?Device::Ericsson::AccessoryMenu">Device::Ericsson::AccessoryMenu</a> on Win32 please
drop me a note let me know. Also if you know how to get
<a href="http://search.cpan.org/perldoc?Device::SerialPort">Device::SerialPort</a> to 'fess up about the device going away, that'd
be super too.</p><p>
Monday - 2004-03-08 05:52</p>richardc2004-03-08T05:55:44+00:00journalevolving - Sweet sweet release
http://use.perl.org/~richardc/journal/17548?from=rss
<p>So I just finished cleaning up my zeroconf stuff enough to get it released, you should see them arrive on your local CPAN mirror any
time soon.</p><p>After a grand renaming I shoved everything into the
<a href="http://search.cpan.org/perldoc?Net::Rendezvous::Publish">Net::Rendezvous::Publish</a> namespace, since after experimentation I
found that <a href="http://search.cpan.org/perldoc?Net::Rendezvous">Net::Rendezvous</a> is a pure-perl browser-only
implementation, but that I liked the api and implementation enough to
try and usefully extend that space.</p><p>(I did try and evaluate <a href="http://search.cpan.org/perldoc?Net::MDNS::Server">Net::MDNS::Server</a> and <a href="http://search.cpan.org/perldoc?Net::MDNS::Client">Net::MDNS::Client</a>
but their <a href="http://dotlocal.org/mdnsd/">embdedded mdnsd</a> just didn't
build for me on Panther)</p><p>So about that terminology then:</p><p>
Zeroconf
</p><p> <a href="http://www.zeroconf.org/">Zero Configuration Networking</a> or Zeroconf
to its friends, is an IETF working group who have issued
specifications on various things. Together those specifications are
called Zeroconf. Wasn't that nice and clear of them.</p><p>One of the Zeroconf standards is mDNS, but there are also a
bunch of standards that define automatic allocation of IP addresses
and the like.</p><p> <b>---</b> </p><p>
ZeroConf
</p><p>How I keep mistyping Zeroconf. I say it as two words too. It's all a
trap laid out for me I swear.</p><p> <b>---</b> </p><p>
mDNS
</p><p> <a href="http://www.multicastdns.org/">Multicast DNS</a>. A fun abuse of the DNS
wire standards to add multicasting of service information. This is
where the publishing and browsing of services we all know and love
comes from.</p><p> <b>---</b> </p><p>
Rendezvous
</p><p>What Apple calls <a href="http://developer.apple.com/macosx/rendezvous/faq.html">their adoption</a> of the
Zeroconf protocols. It's actually just a subset which contains
<a href="http://files.zeroconf.org/draft-ietf-zeroconf-ipv4-linklocal.txt">Dynamic Configuration of Link-Local IPv4 Addresses</a>,
<a href="http://files.multicastdns.org/draft-cheshire-dnsext-multicastdns.txt">Multicast DNS</a>,
and <a href="http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt">DNS-SD</a>.</p><p> <b>- or -</b> </p><p>It's just what everyone calls mDNS over link-local.</p><p>Anyway I'm glad to say that's 3 modules cleared from my yak pile, I
can start on finishing Hook::Queue tomorrow, and everything will be
just super.</p><p>
Sunday - 2004-02-22 00:46</p>richardc2004-02-22T00:47:22+00:00journalevolving - Back with the new style
http://use.perl.org/~richardc/journal/17540?from=rss
<p>First, apologies to you people reading via rss or use.perl, the syndicating view seems to really make article-style things look like
ass. It's really much better looking in the <a href="http://unixbeard.net/svn/richardc/misc/podblog/os.pod">original klingon</a>, or the
<a href="http://unixbeard.net/~richardc/cgi/blog.cgi/os.pod">html/css thing</a>
that it transforms into.</p><p>Now some more of that old fashioned 'I tweaked my blog engine' guff.</p><p>I've moved in thinking from this being a ongoing diary to more
distinct entries, just like a real blog. That means now the linkable
pages are entries rather than days, and I'm putting a timestamp thingy
at the bottom as a <code>=head3</code> block so I can still figure out the day
on which I wrote it. I might even teach the RSS template about that,
if I feel the urge.</p><p>There, wasn't that suitably dull.</p><p>
Saturday 2004-02-21 13:49</p>richardc2004-02-21T13:57:14+00:00journalevolving - Friday 20th February, 2003 - Mac kool-aid
http://use.perl.org/~richardc/journal/17533?from=rss
<p>When I joined <a href="http://www.fotango.com/">Fotango</a>, I asked my new overlords if I could get a Mac laptop as my work machine. Being good
masters, or as part of their open source slave programme - the
distinction isn't clear, they equipped me with a shiny powerbook (and
after some supplier issues a working one.)</p><p>The upshot of this is that for the last couple of months I've been
migrating into it, and embracing stuff like iCal and Rendezvous.</p><p>Here's a run-down of the kool-aid I've supped to date.</p><p> <b>---</b> </p><p>
Fink
</p><p>I've always treated the system shipped perl with great suspicion,
mostly because it's often old, the modules I want aren't packaged for
it, and if I manually install/upgrade modules they get trampled by
system upgrades. As a result I generally install my own into<nobr> <wbr></nobr>/usr/local/perl5.xx and tend that while letting the system take care
of itself.</p><p>Well with the laptop I went with fink, because compiling binary
modules against fink-managed libraries has bit me before, the system
perl is a 5.8.1-era thingie (a late 5.8.1 RC at least) so new enough,
and it's easy enough to write package descriptions so the modules I
want can be made available as packages.</p><p>It's going well so far, I got a
<a href="http://unixbeard.net/svn/richardc/talks/fink_perl_packaging/">talk</a>
out of it, and more <a href="http://unixbeard.net/svn/richardc/finky/unixbeard/main/finkinfo/perl/">package descriptions</a>
than you'd normally shake a stick at (caveat: I rarely shake sticks,
which may skew the sample).</p><p> <b>---</b> </p><p>
iTunes/iPod
</p><p>Actually, I drank of the iTunes kool-aid with the release of the
Windows version, but I have imported all my albums into the new
machine. With
<a href="http://www.pol-online.net/index.php?page=freeware">X-Tunes</a> it's a
dream.</p><p>New to the mix is a 15Gb iPod. Given that no new technology
acquisition goes unpuninshed I ran into a typical iPod problem - my
music collection is bigger than it is.</p><p>iTunes has smart playlists, so I can say 'give me 15Gb of music', but
the drawback is that I can say 'of albums' or 'of songs', and
'randomly', but that either gets me the first 15Gb of albums every
time, or incomplete albums.</p><p>The solution of course was to write a
<a href="http://unixbeard.net/svn/richardc/misc/ipod_playlist">script</a> that
uses <a href="http://search.cpan.org/perldoc?File::Find::Rule">File::Find::Rule</a> and <a href="http://search.cpan.org/perldoc?Mac::Glue">Mac::Glue</a> to populate a playlist with
15Gb of randomly selected albums. Because that's a bit slow it also
uses <a href="http://search.cpan.org/perldoc?Term::StatusBar">Term::StatusBar</a> so you can see how far through you are.</p><p> <b>---</b> </p><p>
Mail.app
</p><p>I read a lot of email. OK, I skim a lot of email. I used to deal
with all of it using mutt on penfold, and then I switched to using
Mail.app's imap mode.</p><p>That was all good, apart from Mail.app's mail filtering rules don't
want to filter into imap hosted folders. That's not so much of a
problem for my on penfold because everything goes through procmail and
Perl in a long-tended configuration
(<a href="http://unixbeard.net/svn/richardc/mail/">scripts</a> and<nobr> <wbr></nobr><a href="http://unixbeard.net/svn/richardc/dotfiles/.procmailrc">.procmailrc</a>
in the usual places.) At the office however, the imap server is a
magic multi-domain virtual-user setup, so running procmail just isn't
an option.</p><p> <a href="http://imapfilter.hellug.gr/">imapfilter</a> to the rescue! Though it's
got a slightly quirky configuration file (and what doesn't), I managed
to bend it to <a href="http://unixbeard.net/svn/richardc/dotfiles/.imapfilterrc">my will</a> and now
everything is all well and filtered in the office too.</p><p> <b>---</b> </p><p>
Rendezvous
</p><p>Or is that Zeroconf? Or should that be
<a href="http://www.multicastdns.org/">mDNS</a>? Or is that just a part of the
<a href="http://www.zeroconf.org/">zeroconf standard</a>? I've a dread feeling
that I'll have to put together another list like I did for the
vCalendar debacle.</p><p>Anyway, it's really cool to watch things show up in <a href="http://www.tildesoft.com/Programs.html">Rendezvous Browser</a>, especially if you're
using modules you wrote to do it. More services should advertise
themselves.</p><p>While I was busy debugging
<a href="http://unixbeard.net/svn/richardc/perl/Net-ZeroConf-Backend-Howl/">Net::ZeroConf::Backend::Howl</a>
George Chlipapa released <a href="http://search.cpan.org/perldoc?Net::Rendezvous">Net::Rendezvous</a>, which I must install and
play with at some point, as it could well completely obsolete my 3
dists before I even got round to releasing them.</p><p> <b>---</b> </p><p>
iCal
</p><p>Apart from the <a href="http://unixbeard.net/~richardc/cgi/blog.cgi/os.pod/Friday_20th_February__2003_-_Fun_with_Calendars">adventure of parsing ics</a>,
it's been really rather painless. </p><p>On my todo list is to set up a private DAV share on unixbeard.net so
that we can put household events like "I'm going to FOSDEM, feed the
fish" in it, as we still seem not to have bought a paper 2004 calendar
for the kitchen.</p>richardc2004-02-20T23:57:48+00:00journalevolving - Friday 20th February, 2003 - Fun with Calendars
http://use.perl.org/~richardc/journal/17532?from=rss
<p>A couple of months ago, that pesky <a href="http://husk.org/">Paul Mison</a> (if I get to be the "wily" Richard Clamp for <a href="http://search.cpan.org/perldoc?Pod::Coverage">Pod::Coverage</a> I reserve the
right to hand out one pesky to someone) planted an idea in my head,
which lead me through something of a world of hurt...</p><p>First I'll tell you what the idea is, and you can tell me what the pain was.</p><p>Ready?</p><blockquote><div><p> <tt> It would be cool to turn a page on our intranet into ics so we can<br> add it to iCal.</tt></p></div> </blockquote><p>Okay, so now take a moment to yourselves to figure out where the pain
came from.</p><p>Done?</p><p>10 points if you guessed <a href="http://search.cpan.org/perldoc?Net::ICal">Net::ICal</a>.</p><p>Now I know it's disclaimed as being alpha code, and that I shouldn't
be surprised if it's not too good, but the CPAN dist doesn't even
pass its own tests, and the CVS version didn't even get that far.</p><p>I even sat down for a few afternoons and worked on a <a href="http://unixbeard.net/svn/richardc/local/Net-ICal/">fork of Net::ICal CVS</a> which
got the tests passing, and it still wasn't fit for duty.</p><p>There's a whole other paragraph which goes here and questions the
parentage and sanity of <a href="http://search.cpan.org/perldoc?Class::MethodMapper">Class::MethodMapper</a>, but there's only so
many times you can say rude words. Let's just say it's not suitable
for something you want to parse, validate, and follow the flow of
control without big sheets of paper and crayons. I like crayons, but
I like clear flow of control even more.</p><p>Thus cheesed off, I put the idea aside for a few weeks, expecting that
when I came back to it I'd just cave and write an alternative to the
whole ball of wax.</p><p>That few weeks ended this week, when Nik pointed out to me that
<a href="http://search.cpan.org/perldoc?Text::vFile">Text::vFile</a> should be a suitable module to base a vCalendar parser on.</p><p>
an aside - iCalendars, vCalendars, ics, vFile, rfc2445, make your mind up!
</p><p>So why do I keep calling things <code>ics</code> one moment, vCalendars the
other, and iCal the next? Well it's partly due to my brain being a
swiss cheesed mess, but also because someone is out to get me.</p><p>
rfc2445 / iCalendar
</p><p> <a href="http://search.cpan.org/perldoc?rfc2445">rfc 2445</a> </p><blockquote><div><p> <tt> Internet Calendaring and Scheduling Core Object Specification<br> (iCalendar)</tt></p></div> </blockquote><p>This baby is the specification for iCalendar-formatted files.</p><p>Weighing in at 148 pages it covers pretty much anything you need to do
for online interactive calendars (maybe).</p><p> <b>---</b> </p><p>
ics
</p><p>The common extension for iCalendar files when stored on disk.</p><p> <b>---</b> </p><p>
vFile
</p><p>It turns out that the object/property/parameter encoding used by
<a href="http://search.cpan.org/perldoc?rfc2445">rfc 2445</a> is the same as the one
used by <a href="http://search.cpan.org/perldoc?rfc2426">rfc 2426</a> <code>vCard MIME
Directory Profile</code>, apart from 2445 encoded documents tend to have
deeply nested objects.</p><p>We follow <a href="http://search.cpan.org/perldoc?Text::vFile">Text::vFile</a>s example in calling these documents vFile formatted.</p><p> <b>---</b> </p><p>
vCalendar
</p><p>Okay, this one's probably made up.</p><p>It comes about because iCalendar is a kind of vFile.</p><p>I think.</p><p>Look just stop looking at me like that.</p><p> <b>---</b> </p><p>
iCal
</p><p>An application from Apple Computer, Ltd. Parses, generates, and
generally speaks rfc 2445.</p><p>Sometimes I call it iCal.app, in order to distinguish it from the
standard in the same way that use Mail.app to refer to Apple Mail.</p><p>And thus overloading occured, in my branes at least.</p><p>Sadly, <a href="http://search.cpan.org/perldoc?Text::vFile">Text::vFile</a> doesn't handle nested objects - which you really
need for iCalendars - and clones a little too much (ie. at all) from
<a href="http://search.cpan.org/perldoc?Class::MethodMapper">Class::MethodMapper</a> in its api and thinking.</p><p>At about the time we discovered this my impatience kicked in. "Surely
it can't be that hard to parse vFile to a simple data structure" I
said to myself, and half an hour of coding later it turned out it
wasn't. <a href="http://search.cpan.org/perldoc?Text::vFile::asData">Text::vFile::asData</a> sprang into the world.</p><p>A couple more hours tagteaming with Nik to find the corner cases and
fix them and we both managed to scratch our itches. Nik's handy
<a href="http://unixbeard.net/svn/richardc/perl/Parse-vFile/examples/wgo">what's going on</a>
script to summarise upcoming events, and my <a href="http://unixbeard.net/svn/richardc/perl/Parse-vFile/examples/holidays_ical">wiki to ical</a>
script for the intranet, both done fairly easily with the assistance
of <a href="http://search.cpan.org/perldoc?DateTime">DateTime</a>. Version 0.01 hit the CPAN last night, with 0.02 to
follow this weekend.</p>richardc2004-02-20T23:55:40+00:00journalevolving - Friday 20th February, 2003 - mmm: every home should have one
http://use.perl.org/~richardc/journal/17531?from=rss
<p>One of the most tedious things in writing a new module is just spinning up the distribution structure and the pod boilerplate to go
in it. Of course, there are a whole bunch of ways to skin that cat,
from the fugly <a href="http://search.cpan.org/perldoc?h2xs">h2xs</a>, through <a href="http://search.cpan.org/perldoc?ExtUtils::ModuleMaker">ExtUtils::ModuleMaker</a>, to that home
grown that you've got sitting in ~/bin.</p><p>I'm using a home grown one too, but only in the sense that I'm using
<a href="http://unixbeard.net/svn/mark/homedir/bin/mmm">mmm</a>, which my
housemate <a href="http://use.perl.org/~2shortplanks/journal">Mark Fowler</a>
wrote.</p><p>It's got two big selling points for me. Firstly it creates a very
sane module structure, which is an absolute requirement. Mainly
though it's that it pulls all the boilerplate in using the <a href="http://tt2.org/">Template Toolkit</a>. This makes it trivial for me to just
customise the sub-templates for when <a href="http://unixbeard.net/svn/richardc/dotfiles/.mmm-templates/author">I'm not Mark</a>,
or I don't like one of his
<a href="http://unixbeard.net/svn/mark/homedir/bin/mmm-templates/">defaults</a>.</p><p>If you've ever had an itch to use a module generator I'd suggest you
take <a href="http://unixbeard.net/svn/mark/homedir/bin/mmm">mmm</a> for a spin - it offically Doesn't Suck.</p>richardc2004-02-20T23:50:44+00:00journalevolving - Monday 17th November, 2003
http://use.perl.org/~richardc/journal/17530?from=rss
Overly and repeatedly dumb. <p>So today I figured it'd be a good enough time to try and speedup
Timesink some. For those not keenly stalking me or my pet projects
<a href="http://unixbeard.net/svn/richardc/timesink">Timesink</a> is my web-based
RSS aggregator which I wrote a while back on migrating away from
a dying mac and NetNewsWire.</p><p>Anyway, there are a couple of parts of it which are kinda slow, one is
the "what's unseen" calculation in the web frontend, and another is
the scraper.</p><p>Now the unseen code looks like this:</p><blockquote><div><p> <tt> package Timesink::DBI::Subscriber;</tt></p></div> </blockquote><blockquote><div><p> <tt> sub unseen {<br> my $self = shift;<br> my $feed = shift;</tt></p></div> </blockquote><blockquote><div><p> <tt> my ($sub) = Timesink::DBI::Subscription->search({ feed => $feed,<br> subscriber => $self });<br> my %seen = map { $_->item => 1 } $sub->seen;<br> return grep { !$seen{ $_ } } $feed->items;<br> }</tt></p></div> </blockquote><p>That is; given the subscriber find out how many items in a given feed
are unseen by that subscriber. That you get the actual objects is
somewhat a side effect as the web inferface only really cares about
the final count.</p><p>Okay I think, after determining that this is the slow spot with
<a href="http://search.cpan.org/perldoc?Devel::Profiler">Devel::Profiler</a>, time to rewrite that as a quick SQL query. </p><p>Small flaw in that plan, my live instance runs on mysql 4.0.16, and
won't get upgraded till 4.1 until <a href="http://debian.org/">debian unstable</a>
does that for me, so I'm stuck with <a href="http://www.mysql.com/doc/en/Rewriting_subqueries.html">painful rewriting to emulate it</a>. After
about half an hour of that, I eventually admited defeat and added this
comment:</p><blockquote><div><p> <tt> +# XXX I be the slowest routine in Christendom. a sub-select would<br> +# probably help, if mysql 4.0 wasn't lame.</tt></p></div> </blockquote><p>So moving on to the second step. Work on the speed of the scraper.</p><p>Now the scraper itself is fairly quick, it's only really waiting on
upstream servers handing out RSS documents to parse, so if I could
just parallelise the downloading that it's going to take less time,
even if it's not really quicker.</p><p>Now I could see two ways around that, something finicky with
<a href="http://search.cpan.org/perldoc?LWP::Parallel">LWP::Parallel</a> or the brute force forking of <a href="http://search.cpan.org/perldoc?Proc::Queue">Proc::Queue</a>.</p><p>Given that I didn't want to rewrite <a href="http://search.cpan.org/perldoc?LWP::Simple">LWP::Simple</a>'s mirror routine I
decided to plump for forking, just so long as I remembered to
disconnect the dbh I'd be fine, or so I reasoned. So this was my
first stab:</p><p>Before:</p><blockquote><div><p> <tt> for my $feed (@feeds) {<br> my $rss = $self->get_rss( $feed ) or next;<br> $self->scrape_feed( $feed, $rss );<br> }</tt></p></div> </blockquote><p>After:</p><blockquote><div><p> <tt> for my $feed (@feeds) {<br> my $pid = fork;<br> die "couldn't fork $!" unless defined $pid;<br> if ($pid == 0) {<br> my $rss = $self->get_rss( $feed ) or next;<br> $self->scrape_feed( $feed, $rss );<br> exit;<br> }<br> }<br> 1 while wait != -1; # reap the kids</tt></p></div> </blockquote><p>Spot the deliberate mistake? Well even if you did, I didn't for a
time. Then <a href="http://rafael.net0.nerim.net/blog">Rafael</a> asked me why I
was grabbing his RSS 30 times a minute.</p><p>So I scratched my head, and eventually saw my mistake. Back in the
old single process model if get_rss didn't return new rss that was
your clue to check the *next* rss feed. Once I'd moved that into a
multi-process model the job of the child is not to try again, but to
exit gracefully. The fix was as simple as:</p><blockquote><div><p> <tt> - my $rss = $self->get_rss( $feed ) or next;<br> + my $rss = $self->get_rss( $feed ) or exit;</tt></p></div> </blockquote><p>Case solved I thought, and went off to watch teevee.</p><p>Of course it doesn't end there. But there's bonus points if you guess
my next (and hopefully final mistake of the evening). </p><p>Yes that's right, I'd forgotten to install the fixed version of the
module, so come the next time the script ran it picked up the old
DoS-happy version of the module and looped all over again. D'oh.</p><p> <b>---</b> </p><p>
Nothing for months, and then two modules come along in one day.
</p><p> <a href="http://search.cpan.org/perldoc?IO::Automatic">IO::Automatic</a> and <a href="http://search.cpan.org/perldoc?Parse::Debian::Packages">Parse::Debian::Packages</a> pretty much sprung to
my fingers unbidden today, the latter a side effect of adding debian
support to Leon's cool new <a href="http://search.cpan.org/perldoc?Module::Packaged">Module::Packaged</a> module, the former is a
TT-like trick extracted from some code I found myself banging on. </p><p>Enjoy.</p>richardc2004-02-20T23:48:18+00:00journalevolving - Monday 17th November, 2003
http://use.perl.org/~richardc/journal/15825?from=rss
Overly and repeatedly dumb. <p>So today I figured it'd be a good enough time to try and speedup
Timesink some. For those not keenly stalking me or my pet projects
<a href="http://unixbeard.net/svn/richardc/timesink">Timesink</a> is my web-based
RSS aggregator which I wrote a while back on migrating away from
a dying mac and NetNewsWire.</p><p>Anyway, there are a couple of parts of it which are kinda slow, one is
the "what's unseen" calculation in the web frontend, and another is
the scraper.</p><p>Now the unseen code looks like this:</p><blockquote><div><p> <tt> package Timesink::DBI::Subscriber;</tt></p></div> </blockquote><blockquote><div><p> <tt> sub unseen {<br> my $self = shift;<br> my $feed = shift;<br> my ($sub) = Timesink::DBI::Subscription->search({ feed => $feed,<br> subscriber => $self });<br> my %seen = map { $_->item => 1 } $sub->seen;<br> return grep { !$seen{ $_ } } $feed->items;<br> }</tt></p></div> </blockquote><p>That is; given the subscriber find out how many items in a given feed
are unseen by that subscriber. That you get the actual objects is
somewhat a side effect as the web inferface only really cares about
the final count.</p><p>Okay I think, after determining that this is the slow spot with
<a href="http://search.cpan.org/perldoc?Devel::Profiler">Devel::Profiler</a>, time to rewrite that as a quick SQL query. </p><p>Small flaw in that plan, my live instance runs on mysql 4.0.16, and
won't get upgraded till 4.1 until <a href="http://debian.org/">debian unstable</a>
does that for me, so I'm stuck with <a href="http://www.mysql.com/doc/en/Rewriting_subqueries.html">painful rewriting to emulate it</a>. After
about half an hour of that, I eventually admited defeat and added this
comment:</p><blockquote><div><p> <tt> +# XXX I be the slowest routine in Christendom. a sub-select would<br> +# probably help, if mysql 4.0 wasn't lame.</tt></p></div> </blockquote><p>So moving on to the second step. Work on the speed of the scraper.</p><p>Now the scraper itself is fairly quick, it's only really waiting on
upstream servers handing out RSS documents to parse, so if I could
just parallelise the downloading that it's going to take less time,
even if it's not really quicker.</p><p>Now I could see two ways around that, something finicky with
<a href="http://search.cpan.org/perldoc?LWP::Parallel">LWP::Parallel</a> or the brute force forking of <a href="http://search.cpan.org/perldoc?Proc::Queue">Proc::Queue</a>.</p><p>Given that I didn't want to rewrite <a href="http://search.cpan.org/perldoc?LWP::Simple">LWP::Simple</a>'s mirror routine I
decided to plump for forking, just so long as I remembered to
disconnect the dbh I'd be fine, or so I reasoned. So this was my
first stab:</p><p>Before:</p><blockquote><div><p> <tt> for my $feed (@feeds) {<br> my $rss = $self->get_rss( $feed ) or next;<br> $self->scrape_feed( $feed, $rss );<br> }</tt></p></div> </blockquote><p>After:</p><blockquote><div><p> <tt> for my $feed (@feeds) {<br> my $pid = fork;<br> die "couldn't fork $!" unless defined $pid;<br> if ($pid == 0) {<br> my $rss = $self->get_rss( $feed ) or next;<br> $self->scrape_feed( $feed, $rss );<br> exit;<br> }<br> }<br> 1 while wait != -1; # reap the kids</tt></p></div> </blockquote><p>Spot the deliberate mistake? Well even if you did, I didn't for a
time. Then <a href="http://rafael.net0.nerim.net/blog">Rafael</a> asked me why I
was grabbing his RSS 30 times a minute.</p><p>So I scratched my head, and eventually saw my mistake. Back in the
old single process model if get_rss didn't return new rss that was
your clue to check the *next* rss feed. Once I'd moved that into a
multi-process model the job of the child is not to try again, but to
exit gracefully. The fix was as simple as:</p><blockquote><div><p> <tt> - my $rss = $self->get_rss( $feed ) or next;<br> + my $rss = $self->get_rss( $feed ) or exit;</tt></p></div> </blockquote><p>Case solved I thought, and went off to watch teevee.</p><p>Of course it doesn't end there. But there's bonus points if you guess
my next (and hopefully final mistake of the evening). </p><p>Yes that's right, I'd forgotten to install the fixed version of the
module, so come the next time the script ran it picked up the old
DoS-happy version of the module and looped all over again. D'oh.</p><p> <b>---</b> </p><p>
Nothing for months, and then two modules come along in one day.
</p><p> <a href="http://search.cpan.org/perldoc?IO::Automatic">IO::Automatic</a> and <a href="http://search.cpan.org/perldoc?Parse::Debian::Packages">Parse::Debian::Packages</a> pretty much sprung to
my fingers unbidden today, the latter a side effect of adding debian
support to Leon's cool new <a href="http://search.cpan.org/perldoc?Module::Packaged">Module::Packaged</a> module, the former is a
TT-like trick extracted from some code I found myself banging on. </p><p>Enjoy.</p>richardc2003-11-18T01:10:06+00:00journalevolving - Tuesday 28th October, 2003
http://use.perl.org/~richardc/journal/15460?from=rss
Found Art<blockquote><div><p> <tt> 21:03 <@hex> hmm. http://www.brunching.com/cybimages/R/cyb-RICHARDC.gif<br> 21:03 <@hex> "I have patches! Die, worthless flesh-being!"</tt></p></div> </blockquote>richardc2003-10-29T21:51:58+00:00journalevolving - Friday 19th September, 2003
http://use.perl.org/~richardc/journal/14796?from=rss
<p>It be talk like a pirate day today, but I need more grog to pull that off.</p><p> <b>---</b> </p><p>Released a 0.05 of Devel::LeakTrace. Minimal bugfixes, nothing to
shout about really. The next version, now that's going to be cool.</p><p> <b>---</b> </p><p>I had another of those itches today with trying to build ponie on my
laptop, so now I have a sketch for
<a href="http://unixbeard.net/svn/richardc/perl/Devel-System/lib/Devel/System.pm">Devel::System</a> a
little module to intercept calls to the
<a href="http://perldoc.com/perl5.8.0/pod/func/system.html">system</a> function
so that you can see how things are being invoked without cracking the
script open.</p><p>It'll probably grow a callback interface and the ability to dry-run,
assuming the chaos monkey is kind with his dispensation of tuits.</p>richardc2003-09-20T00:54:31+00:00journalevolving - Thursday 18th September, 2003
http://use.perl.org/~richardc/journal/14790?from=rss
<p>Another London.pm Technical meeting came and went. Sadly I ran out of time to get my slides together in, so I shall try again with that talk
next time about.</p><p> <b>---</b> </p><p>Suddenly the Fotango collective seem to be using <a href="http://search.cpan.org/perldoc?Devel::LeakTrace">Devel::LeakTrace</a>
so I had to go and fix it. Pesky users.</p>richardc2003-09-19T16:59:06+00:00journalevolving - Wednesday 17th September, 2003
http://use.perl.org/~richardc/journal/14789?from=rss
<p> <a href="http://lists.netthink.co.uk/pipermail/code-review-ladder/2003-September/000082.html">ARRRRRGGGGGHHHHHH!!!!!!!</a> </p><p>In a similar but less shocking vein as "Soylent Green is people",
"<a href="http://search.cpan.org/perldoc?Algorithm::GenerateSequence">Algorithm::GenerateSequence</a> is <a href="http://search.cpan.org/perldoc?Set::CrossProduct">Set::CrossProduct</a>"</p><p>I hate it when that happens. Especially after I've already uploaded
it to CPAN and started thinking about a talk on it.</p>richardc2003-09-19T16:58:48+00:00journalevolving - Monday 16th September, 2003
http://use.perl.org/~richardc/journal/14737?from=rss
<p>Released small revisions to <a href="http://search.cpan.org/perldoc?File::Find::Rule">File::Find::Rule</a> and <a href="http://search.cpan.org/perldoc?Algorithm::GenerateSequence">Algorithm::GenerateSequence</a>, just pod fixes really.</p><p> <b>---</b> </p><p>Fricked about for a few hours in setting up an ogg stream to keep me
sane in the office. I looked at a bunch of existing web jukebox
systems but they all seemed to want to completely take over the
organisation of the source mp3s and oggs, sod that for a game.</p><p>So I tweaked the ices2 example to serve up a playlist, which was
pleasant, but a little awkward since you couldn't jump around. I
really wanted a way to (a) jump around the playlist, (b) stream mp3s
too and (b), shift the cost of encoding onto another machine on the
network.</p><p> <a href="http://packages.debian.org/unstable/sound/xmms-liveice.html">xmms-liveice</a>
seemed to be a fit for that. It'll let you use
<a href="http://www.xmms.org/">xmms</a> to feed the stream which gets you all the
joy of xmms's playlist handling and being able to generally cope with
all the files I already have. There was the small catch of needing an
X server somehow but <a href="http://www.tightvnc.com/">Xtightvnc</a> solved
that, so I started streaming.</p><p>A 64Kbps mp3 stream of whitenoise, but a stream all the same.</p><p>So taking a step back to using <a href="http://icecast.org/">ices2</a> I
reconfigured xmms to use
<a href="http://www.tux.org/~ricdude/EsounD.html">esound</a> for output and then
used esdmon to tap into that and send it on:</p><blockquote><div><p> <tt> esdmon | ices2 ices-live.xml</tt></p></div> </blockquote><p>An even better 112Kbps ogg encoded whitenoise stream! Precision is
important in these things after all.</p><p>So I scratched my head. Eventually it occurred to me that esdmon was
probably outputting big-endian values, where ices2 was expecting
little-endian values. Neither esdmon or ices2 could be configured to
deal with that, so I quickly wrote <a href="http://unixbeard.net/~richardc/swapend.c">some C</a>.</p><blockquote><div><p> <tt> esdmon |<nobr> <wbr></nobr>./swapend | ices2 ices-live.xml</tt></p></div> </blockquote><p>112Kbps ogg-encoded RAWK!</p>richardc2003-09-16T16:36:18+00:00journalevolving - Thursday 11th September, 2003
http://use.perl.org/~richardc/journal/14674?from=rss
<p>Put out the long-intended release of <a href="http://search.cpan.org/perldoc?File::Find::Rule::CVS">File::Find::Rule::CVS</a> and a small update to <a href="http://search.cpan.org/perldoc?Parse::CVSEntries">Parse::CVSEntries</a>, since testing of the former
showed up shortcomings in the latter.</p><p> <b>---</b> </p><p>Fiddled a little with <code>Timesink</code>, changing the unique property of a
feed <code>item</code> from it's <code>link</code> to a md5 hash of it's <code>title</code> and
<code>description</code>. This stopped the <a href="http://openzaurus.org/oz_website/content/rss">OpenZaurus feed</a> from collapsing in
on itself, and also means that a revised item is displayed as a new
item.</p><p> <b>---</b> </p><p>Tom gave me a bad idea, then Mark refined it into a more fun bad idea.
There's an implied deadline of next Friday, so it may yet all fall to
bits - deadlines aren't my friends recently.</p>richardc2003-09-12T16:31:56+00:00journalevolving - Monday 8th September, 2003
http://use.perl.org/~richardc/journal/14590?from=rss
<p>Well the review ladder came back with micro-optimisations rather than style issues, which I suppose is reassuring, but I suppose I was
hoping for something slightly more incisive.</p><p> <b>---</b> </p><p>Released <a href="http://search.cpan.org/perldoc?Algorithm::GenerateSequence">Algorithm::GenerateSequence</a> and <a href="http://search.cpan.org/perldoc?Games::Set">Games::Set</a>.</p><p>Now left in the unreleased pipe are: Class::Sealed, Games::Tetris,
Devel:Where, File::Find::Rule::CVS, Acme::Pie, and possibly
Acme::DupArray (if I can ever imagine a useful API for it)</p><p>I dare say they'll all get usurped by whatever the next cool thing is
though.</p><p> <b>---</b> </p><p>Got an email from Tom about <a href="http://search.cpan.org/perldoc?File::Find::Rule">File::Find::Rule</a> which in answering it
made me realise how slack I'd been with the 0.20 dev, so now I have to
convince myself that it's the hip new thing.</p><p>May the lord have mercy...</p><p> <b>---</b> </p><p>Released <a href="http://search.cpan.org/perldoc?File::Find::Rule">File::Find::Rule</a> 0.20. Fingers are crossed and our operators
await your call.</p><p> <b>---</b> </p><p>I am feeling
<a href="http://unixbeard.net/svn/richardc/perl/Siesta-Plugin-DelayedResponse/lib/Siesta/Plugin/DelayedResponse.pm">meta-hateful</a> </p>richardc2003-09-08T22:48:22+00:00journalevolving - Saturday 6th September, 2003
http://use.perl.org/~richardc/journal/14589?from=rss
<p>Bit fluy and unable to sleep I sat up and hacked out <a href="http://search.cpan.org/perldoc?Games::Set">Games::Set</a>. Along the way I made a wonderful discovery which had a most
kinderworthy surprise and toy.</p><p>The toy was <a href="http://search.cpan.org/perldoc?Algorithm::ChooseSets">Algorithm::ChooseSets</a>, which was just perfect for the
"I have these cards, what sets are possible" question. The surprise
was that I knew the author, Brain Duggan. </p><p>I worked briefly with Brian on a project from hell back when he was
drafted in from the New York office, and we've met a few times since,
but I didn't really expect to be picking his module out of the blue.</p><p>The module is cool, if you ever need to identify all the possible
n-sized subsets of some larger set then <a href="http://search.cpan.org/perldoc?Algorithm::ChooseSets">Algorithm::ChooseSets</a> is
going to be the one for you.</p><p> <b>---</b> </p><p>Another side effect of <a href="http://search.cpan.org/perldoc?Games::Set">Games::Set</a> was
<a href="http://search.cpan.org/perldoc?Algorithm::GenerateSequence">Algorithm::GenerateSequence</a> which I needed for generating the deck
based on the options for its properties.</p><p>I mailed it off to the newly formed <a href="http://lists.netthink.co.uk/listinfo/code-review-ladder">code review ladder</a> to see
what they made of it, and in part what I make of their suggestions.
We'll see.</p><p> <b>---</b> </p><p>Went and saw mummies at the British Museum.</p>richardc2003-09-08T22:48:06+00:00journalevolving - Thursday 21st August, 2003
http://use.perl.org/~richardc/journal/14267?from=rss
<p>Whoa, just clocked 1500 revisions on <a href="http://unixbeard.net/svn/">http://unixbeard.net/svn/</a> </p><p> <b>---</b> </p><p>Lost in the intermission is my <a href="http://search.cpan.org/perldoc?Class::DBI">Class::DBI</a> rewrite of
<a href="http://unixbeard.net/svn/richardc/timesink/">timesink</a>, my
web-browsable rss aggregator. I pretty much tore down the database
schema and did it again correctly so it supports multiple users,
logging in, and all that jazz.</p><p> <a href="http://search.cpan.org/perldoc?Class::DBI">Class::DBI</a> made everything so much cleaner, there's far less code
than there used to be, despite there being many more complex table
relations. I can even safely link to <a href="http://unixbeard.net/~richardc/cgi/timesink/">my installed copy</a> now and know you'll
not disturb my state. Aaah.</p><p>I might CPAN release it at some point, but I need to nail down my
mod_perl/cgi handler a little better. It's currently a slight
adaptation of <a href="http://search.cpan.org/perldoc?Siesta::Web">Siesta::Web</a> but ideally it could be reworked to be
used from both apps.</p>richardc2003-08-22T08:10:38+00:00journalevolving - Wednesday 20th August, 2003
http://use.perl.org/~richardc/journal/14254?from=rss
<p>Mmmmm, meatball sandwich.</p><p> <b>---</b> </p><p>Did some hacking on the <a href="http://unixbeard.net/svn/richardc/hates-software/">hates-software software</a>. Now it
has permalinks and a basic RSS feed.</p><p>Next up: displaying of comments, but first a nap.</p>richardc2003-08-21T15:11:14+00:00journalevolving - Intermission
http://use.perl.org/~richardc/journal/14253?from=rss
<p>Got busy, got too hot, got cold, got <a href="http://hates-software.com/">hate</a>, got earache, got stressed, got
caught up, get out of here.</p>richardc2003-08-21T15:10:15+00:00journalevolving - Wednesday 30th July, 2003
http://use.perl.org/~richardc/journal/13823?from=rss
<p>Bundled up my script into <a href="http://search.cpan.org/perldoc?Module::CPANTS::Generator::FreeBSD">Module::CPANTS::Generator::FreeBSD</a> and sent it off to Leon.</p><p> <b>---</b> </p><p>Started hacking on a web-based repository browser for <a href="http://search.cpan.org/perldoc?Munj">Munj</a>, which
resulted in the adaption of <a href="http://search.cpan.org/perldoc?Template::Plugin::Dumper">Template::Plugin::Dumper</a> into
<a href="http://search.cpan.org/perldoc?Template::Plugin::YAML">Template::Plugin::YAML</a>. Found a small bug in <code>Munge::Client</code> which
resulted in mildly hosed repositories on single-file checkins.</p><p> <b>---</b> </p><p>London.pm emergency meeting as Geoff Avery and claes were in town.
Arthur made sure we all had homework assignments to be working on. I
get to continue with the perlbug triage herding, and fiddling with
<a href="http://search.cpan.org/perldoc?Munj">Munj</a>.</p><p> <b>---</b> </p><p>Got home and released <a href="http://search.cpan.org/perldoc?Template::Plugin::YAML">Template::Plugin::YAML</a>. Was very pleased to
find that Gabor Szabo was putting <a href="http://search.cpan.org/perldoc?Siesta">Siesta</a> through its paces. Fixed
a couple of the issues this revealed and then passed out.</p>richardc2003-07-31T18:54:15+00:00journalevolving - Tuesday 29th July, 2003
http://use.perl.org/~richardc/journal/13822?from=rss
<p>In the wheels being reinvented department James has started hacking on <a href="http://www.ululate.co.uk/munge/">Munge</a>. It's fun, and self-hosting
very quickly.</p>richardc2003-07-31T18:53:07+00:00journalevolving - Monday 28th July, 2003
http://use.perl.org/~richardc/journal/13821?from=rss
<p>Did the inevitable bugfix release of <a href="http://search.cpan.org/perldoc?Siesta">Siesta</a>. Twice. (doh!)</p>richardc2003-07-31T18:52:49+00:00journalevolving - Sunday 27th July, 2003
http://use.perl.org/~richardc/journal/13820?from=rss
<p>So very tired. Discovered something wonderful on the Eurostar back to London - In the bios settions for the laptop (available while the OS
is booted no less) there's a "stay awake when the lid is shut" option.</p><p>Henceforth my laptop will be combined with my bluetooth adapter to
make a rather bulky, diskspace challenged iPod equivalent, controlled
by my phone. Bwahahaha.</p>richardc2003-07-31T18:50:53+00:00journalevolving - Saturday 26th July, 2003
http://use.perl.org/~richardc/journal/13819?from=rss
<p>p5p day. Woke up around 10, pondered more sleep, much much more. Moved rooms and then wandered around for about an hour trying to find
somewhere to eat; eventually found a sandwich shop about 5 minutes up
the road from the hotel (I turned left, it was to the right)</p><p>Caught the tail end of the parrot bof, then ate kangaroo at the
Tavern.</p><p>The main p5p meeting followed afterwards, which was both good and
frustrating, though thankfully not in equal measure. I wound up
volunteering to coordinate perlbug triage, of which I'll write when
all the details get hammered out.</p>richardc2003-07-31T18:50:29+00:00journalevolving - Friday 26th July, 2003
http://use.perl.org/~richardc/journal/13818?from=rss
<p>Knocked up a simple script to analyse a FreeBSD ports tree and report on which CPAN distributions were represented. That'll eventually be a
<a href="http://search.cpan.org/perldoc?Module::CPANTS::Generator">Module::CPANTS::Generator</a> module.</p><p> <b>---</b> </p><p>Bought my sombrero back in the auction, complete with hand drawn
crayon art by, well, me.</p>richardc2003-07-31T18:50:11+00:00journalevolving - Thursday 27th July, 2003
http://use.perl.org/~richardc/journal/13817?from=rss
<p> <a href="http://search.cpan.org/perldoc?Siesta">Siesta</a> release! Spent most of the morning cranking it out. In doing it I rushed out a release of <a href="http://search.cpan.org/perldoc?Email::LocalDelivery">Email::LocalDelivery</a> just before
as <a href="http://search.cpan.org/perldoc?Siesta">Siesta</a>'s<nobr> <wbr></nobr><code>./Build disttest</code> showed up a small bug in the
Maildir module.</p><p> <b>---</b> </p><p> <a href="http://search.cpan.org/perldoc?Siesta">Siesta</a> talk! People (including but not limited to Pete, Simon,
Greg, and Leon) were good enough to fetch me a giant sombrero and some
tequila and the <a href="http://search.cpan.org/perldoc?Siesta">Siesta</a> challenge was on!</p><p>In a mildly hairbrained scheme we agreed to drink a shot of tequila
every time I said <a href="http://search.cpan.org/perldoc?Siesta">Siesta</a> during the talk. I unwisely also opted to
play. All the combatants donated 50 euros to YAS, so I think we
netted 300 euros in the 40 minutes of the talk. </p><p>Apart from YAS, there was no clear winner of the challenge, though due
to a lack of prior planning I had my bottle taken away from me when
the other players ran out, so I'm claiming victory for myself<nobr> <wbr></nobr>:)</p>richardc2003-07-31T18:49:54+00:00journalevolving - Wednesday 23rd July, 2003
http://use.perl.org/~richardc/journal/13661?from=rss
<p>Awoke with a mild headache, clearly it was sinus trouble and not possibly any form of hangover, oh no.</p><p>Breakfasted with Belfast.pm, then wandered to the venue to set up my
laptop for Nick Clark's <i>When Perl Isn't Fast Enough</i> talk. Having
already read chunks of the talk in an early form I helped Earle debug
his DHCP issues and then wandered about a little. Leon captured some
of my soul in exchange for a nice orange badge, and I helped out a
little with converting a flat-file based app to use <a href="http://search.cpan.org/perldoc?DBD::SQLite">DBD::SQLite</a>.</p><p>Returned from lunch a little late and accidentally conspired in an
interruption to one of MJD's tutorials. Ooops.</p><p>Checked in with Simon who had been doing chunks of work on <code>Siesta</code>,
tossed a few executive decisions in his direction and started to catch
up on email.</p><p>Stole code from Ingy's Kwiki Slideshow thing to make flipping slides
more responsive - using the javascript that visits the next link on a
(simulated) keypress is much much quicker than launching a galeon
bookmarklet from the command line. I just got it finished in time to
use it for my <a href="http://search.cpan.org/perldoc?Device::Ericsson::AccessoryMenu">Device::Ericsson::AccessoryMenu</a> talk which I did as
part of the London.pm filler hour.</p><p>The CPANTS bof was thought provoking. Some of the thoughts could even
be classified as non-destructive. Expect a flurry of hacking on that
sometime around Friday.</p><p>Went for a nice relaxing walk with blech down to the Eiffel Tower from
the big needle thingy. He took <a href="http://xxx./">photos</a>, I mumbled a bit
about how to code up some more CPANTS metrics, though I'm very tempted
by attempting a piescrow bot instead.</p><p>Got back to the hotel and ran into a chunk of Belfast.pm and Mark
playing cards. Diabolical schemes were plotted over pizza, and we
were warned of the complexities of paying for cabs over the water.</p><p>Being too hot too sleep I knocked a few things off the <code>Siesta</code> TODO
list taking us down to two items, one being a slightly tedious bit of
the web interface, the other to batten down the hatches for a release.
Now that's JIT programming in action.</p><p>Oh, and retro-blogged to Saturday.</p>richardc2003-07-24T06:45:37+00:00journalevolving - Tuesday 22nd July, 2003
http://use.perl.org/~richardc/journal/13660?from=rss
<p>YAPC::Europe day 0. Not going to be that much hacking for the next couple of days, move along if you really wanted that.</p><p>Got the tube down to Paris with chunks of London.pm; Mark and I were
both kindof busy with last minute stuff. I drew a whole new bunch of
diagrams and then reworked a chunk of the talk to make use of the
released state of <code>Siesta</code> (or at least it will be by the time people
see the slides). Mark was still busy exposing bugs in
<a href="http://search.cpan.org/perldoc?Parse::RecDescent">Parse::RecDescent</a> with his slide generation tool.</p><p>Dropped things off at the hotel and wandered off down to CNAM for
earlybird registration. Couple of bars later we had formulated the
<code>Siesta</code> challenge, a sure-fire fundraiser for YAS. Details will be
revealed leading up till the Thursday 14:00 start time.</p>richardc2003-07-24T06:44:54+00:00journalevolving - Saturday 19th July, 2003
http://use.perl.org/~richardc/journal/13659?from=rss
<p>A mini-hackfest evolved on the kitchen table. I was working on getting the <code>Siesta</code> TODO down to a point where the rest can be
fitted in around YAPC::Europe sessions. Next Mark sat down and
started rewriting his <code>axpoint</code> preprocessor as a <a href="http://search.cpan.org/perldoc?Parse::RecDescent">Parse::RecDescent</a>
based thingy as he was starting to really hit the limits of sanity
that his regex-based v1 could cope with. Then fairly soon after that
Simon came over and did some more hacking on <code>Siesta</code>.</p><p>The patch rate, she is scaring me.</p>richardc2003-07-24T06:44:29+00:00journalevolving - Thursday 17th July, 2003
http://use.perl.org/~richardc/journal/13658?from=rss
<p>Spent some qualitee time with the Google image search updating my <a href="http://search.cpan.org/perldoc?Device::Ericsson::AccessoryMenu">Device::Ericsson::AccessoryMenu</a> talk ahead of presenting it to
London.pm tonight.</p><p>The
<a href="http://london.pm.org/pipermail/london.pm/Week-of-Mon-20030714/020356.html">lineup</a>
looks really good.</p>richardc2003-07-24T06:44:17+00:00journal