richardc's Journal http://use.perl.org/~richardc/journal/ richardc's use Perl Journal en-us use 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:00 pudge pudge@perl.org Technology hourly 1 1970-01-01T00:00+00:00 richardc's Journal http://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> richardc 2004-03-08T05:55:44+00:00 journal evolving - 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> richardc 2004-02-22T00:47:22+00:00 journal evolving - 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> richardc 2004-02-21T13:57:14+00:00 journal evolving - 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> richardc 2004-02-20T23:57:48+00:00 journal evolving - 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>&nbsp; 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>&nbsp; &nbsp; &nbsp;Internet Calendaring and Scheduling Core Object Specification<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(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> richardc 2004-02-20T23:55:40+00:00 journal evolving - 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> richardc 2004-02-20T23:50:44+00:00 journal evolving - 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>&nbsp; &nbsp; &nbsp; my $self = shift;<br>&nbsp; &nbsp; &nbsp; my $feed = shift;</tt></p></div> </blockquote><blockquote><div><p> <tt>&nbsp; &nbsp; &nbsp;my ($sub) = Timesink::DBI::Subscription-&gt;search({ feed =&gt; $feed,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; subscriber =&gt; $self });<br>&nbsp; &nbsp; &nbsp; my %seen = map { $_-&gt;item =&gt; 1 } $sub-&gt;seen;<br>&nbsp; &nbsp; &nbsp; return grep { !$seen{ $_ } } $feed-&gt;items;<br>&nbsp; }</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.&nbsp; a sub-select would<br>&nbsp; +# 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>&nbsp; &nbsp; &nbsp;my $rss = $self-&gt;get_rss( $feed ) or next;<br>&nbsp; &nbsp; &nbsp;$self-&gt;scrape_feed( $feed, $rss );<br>&nbsp; }</tt></p></div> </blockquote><p>After:</p><blockquote><div><p> <tt> for my $feed (@feeds) {<br>&nbsp; &nbsp; &nbsp; my $pid = fork;<br>&nbsp; &nbsp; &nbsp; die "couldn't fork $!" unless defined $pid;<br>&nbsp; &nbsp; &nbsp; if ($pid == 0) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; my $rss = $self-&gt;get_rss( $feed ) or next;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $self-&gt;scrape_feed( $feed, $rss );<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>&nbsp; &nbsp; &nbsp; }<br>&nbsp; }<br>&nbsp; 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> -&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;my $rss = $self-&gt;get_rss( $feed ) or next;<br>&nbsp; +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;my $rss = $self-&gt;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> richardc 2004-02-20T23:48:18+00:00 journal evolving - 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>&nbsp; &nbsp; &nbsp; my $self = shift;<br>&nbsp; &nbsp; &nbsp; my $feed = shift;<br>&nbsp; &nbsp; &nbsp; my ($sub) = Timesink::DBI::Subscription-&gt;search({ feed =&gt; $feed,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; subscriber =&gt; $self });<br>&nbsp; &nbsp; &nbsp; my %seen = map { $_-&gt;item =&gt; 1 } $sub-&gt;seen;<br>&nbsp; &nbsp; &nbsp; return grep { !$seen{ $_ } } $feed-&gt;items;<br>&nbsp; }</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>&nbsp; +# XXX I be the slowest routine in Christendom.&nbsp; a sub-select would<br>&nbsp; +# 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>&nbsp; for my $feed (@feeds) {<br>&nbsp; &nbsp; &nbsp;my $rss = $self-&gt;get_rss( $feed ) or next;<br>&nbsp; &nbsp; &nbsp;$self-&gt;scrape_feed( $feed, $rss );<br>&nbsp; }</tt></p></div> </blockquote><p>After:</p><blockquote><div><p> <tt>&nbsp; for my $feed (@feeds) {<br>&nbsp; &nbsp; &nbsp; my $pid = fork;<br>&nbsp; &nbsp; &nbsp; die "couldn't fork $!" unless defined $pid;<br>&nbsp; &nbsp; &nbsp; if ($pid == 0) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; my $rss = $self-&gt;get_rss( $feed ) or next;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $self-&gt;scrape_feed( $feed, $rss );<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>&nbsp; &nbsp; &nbsp; }<br>&nbsp; }<br>&nbsp; 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>&nbsp; -&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;my $rss = $self-&gt;get_rss( $feed ) or next;<br>&nbsp; +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;my $rss = $self-&gt;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> richardc 2003-11-18T01:10:06+00:00 journal evolving - Tuesday 28th October, 2003 http://use.perl.org/~richardc/journal/15460?from=rss Found Art<blockquote><div><p> <tt> 21:03 &lt;@hex&gt; hmm. http://www.brunching.com/cybimages/R/cyb-RICHARDC.gif<br>&nbsp; 21:03 &lt;@hex&gt; "I have patches! Die, worthless flesh-being!"</tt></p></div> </blockquote> richardc 2003-10-29T21:51:58+00:00 journal evolving - 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> richardc 2003-09-20T00:54:31+00:00 journal evolving - 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> richardc 2003-09-19T16:59:06+00:00 journal evolving - 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> richardc 2003-09-19T16:58:48+00:00 journal evolving - 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> richardc 2003-09-16T16:36:18+00:00 journal evolving - 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> richardc 2003-09-12T16:31:56+00:00 journal evolving - 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> richardc 2003-09-08T22:48:22+00:00 journal evolving - 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> richardc 2003-09-08T22:48:06+00:00 journal evolving - 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> richardc 2003-08-22T08:10:38+00:00 journal evolving - 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> richardc 2003-08-21T15:11:14+00:00 journal evolving - 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> richardc 2003-08-21T15:10:15+00:00 journal evolving - 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> richardc 2003-07-31T18:54:15+00:00 journal evolving - 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> richardc 2003-07-31T18:53:07+00:00 journal evolving - 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> richardc 2003-07-31T18:52:49+00:00 journal evolving - 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> richardc 2003-07-31T18:50:53+00:00 journal evolving - 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> richardc 2003-07-31T18:50:29+00:00 journal evolving - 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> richardc 2003-07-31T18:50:11+00:00 journal evolving - 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> richardc 2003-07-31T18:49:54+00:00 journal evolving - 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> richardc 2003-07-24T06:45:37+00:00 journal evolving - 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> richardc 2003-07-24T06:44:54+00:00 journal evolving - 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> richardc 2003-07-24T06:44:29+00:00 journal evolving - 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> richardc 2003-07-24T06:44:17+00:00 journal