<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Hacking Thy Fearful Symmetry</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/" />
    <link rel="self" type="application/atom+xml" href="http://babyl.dyndns.org/techblog/atom.xml" />
    <id>tag:babyl.dyndns.org,2008-09-29:/techblog//1</id>
    <updated>2010-02-06T18:27:13Z</updated>
    <subtitle>Yanick opens mouth, technobabble ensues.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.25</generator>

<entry>
    <title>Contributing to CPAN: PAUSE Id, Bug Tracking, and Code Repositories</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2010/02/contributing-to-cpan-pause-id-bug-tracking-and-code-repositories.html" />
    <id>tag:babyl.dyndns.org,2010:/techblog//1.174</id>

    <published>2010-02-06T18:04:33Z</published>
    <updated>2010-02-06T18:27:13Z</updated>

    <summary>originally published on the Pythian blog. Want to contribute to your favorite CPAN module, or maybe create your own, but don&apos;t have the foggiest idea how to do it? Here are a few notes, tips, tricks, and links that might...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p><i>originally published on the 
<a href="http://www.pythian.com/news/7877/contributing-to-cpan-pause-id-bug-tracking-and-code-repositories/">Pythian blog</a>.</i></p>

<div style="float:right;"><img width="250" alt="CPAN Wants You!" src="http://www.pythian.com/news/wp-content/uploads/cpan-wants-you.jpg" /></div>

<p>Want to contribute to your favorite CPAN module, or maybe create your own, but don't have the foggiest idea how to do it?  Here are a few notes, tips, tricks, and links that might help you get started.</p>

<h2 style="font-size: bigger; font-weight: bold;">PAUSE id</h2>
<p>While bringing awesome street cred, having a <a href="http://pause.perl.org/pause/query?ACTION=request_id">PAUSE id</a> is strictly necessary only if you want to maintain or co-maintain a module.  If you just want to contribute code, you'll perfectly be able to do without, as it will usually be done via patches submitted to a bug tracking system, a code repository or using good ol' email.</p>
<h3 style="font-size: bigger;"><i>Becoming a co-maintainer</i></h3>
<p>Becoming the co-maintainer of a module gives you the power to upload authorized releases of the modules on CPAN.  To become one, the maintainer of the module simply has to promote you as such on PAUSE.</p>
<h3 style="font-size: bigger;"><i>Creating a new module</i></h3>
<p>You want to create your own module?  Excellent!  But before you do it, make sure that you</p>
<ul>
<li> verified on <a href="http://search.cpan.org">CPAN</a> that there's not already a module that already scratch that particular itch.</li>
<li>made sure that the module uses a <a href="http://pause.perl.org/pause/query?ACTION=pause_namingmodules">descriptive and pertinent namespace</a>.</li>
</ul>
<p>Once this is done, go ahead: log on <a href="http://pause.cpan.org">PAUSE</a> and <a href="https://pause.perl.org/pause/authenquery?ACTION=apply_mod">register the module</a>.</p>
<h3 style="font-size: bigger;"><i>Adopting an abandoned module</i></h3>
<p>There's a module apparently abandoned by its owner that you'd love to take over?  The procedure for that is given in the <a href="http://www.cpan.org/misc/cpan-faq.html#How_adopt_module">CPAN FAQ</a>, and it can be boiled down to:</p>
<ul>
<li>Try to get in contact with the current maintainer.</li>
<li>If you reach him or her, make puppy eyes and ask if you can take over.</li>
<li>If they are agreeable, they will flip over the maintenance of the module to you on PAUSE, and that's all there is to it.</li>
<li>If you tried their email addresses, poked around in mailing lists, forums and other places without any luck, wait a little bit (a couple of weeks) and contact the PAUSE admins.</li>
</ul>
<h3 style="font-size: bigger;"><i>Module created! How do I upload releases, now?</i></h3>
<p>You upload new versions of a module via the <a href="https://pause.perl.org/pause/authenquery?ACTION=add_uri">PAUSE interface</a> or via ftp.</p>
<p>Alternatively, and more conveniently, you can also use the <code>cpan-upload</code> script provided by <a href="http://search.cpan.org/~rjbs/CPAN-Uploader">CPAN::Uploader</a>.</p>
<h2 style="font-size: bigger; font-weight: bold;">Bug Tracking</h2>
<p>Contributing to a module means fixing bugs or implementing new enhancements.  To find those, who are you gonna call? The Bug Tracker!</p>
<h3 style="font-size: bigger; "><i>rt.cpan.org</i></h3>
<p>By default, every module on CPAN has a bug tracking queue on <a href="//rt.cpan.org">rt.cpan.org</a>. For example, the one for Git::CPAN::Patch is at <a href="http://rt.cpan.org/Public/Dist/Display.html?Name=Git-CPAN-Patch">http://rt.cpan.org/Public/Dist/Display.html?Name=Git-CPAN-Patch</a>.</p>
<p>Bug reporting can be done via the web interface, or by sending an email to <code>bug-<em>module</em>@rt.cpan.org</code> (e.g., <code>bug-git-cpan-patch@rt.cpan.org</code>).</p>
<h3 style="font-size: bigger; "><i>...or somewhere else</i></h3>
<p>Sometimes, the module's maintainer uses a different bug tracking system.  You'll typically find it mentioned in the POD, or in the <code>META.yml</code>:</p>

<pre>
$ curl -L http://search.cpan.org/dist/Git-CPAN-Patch/META.yml | \
  perl -MYAML -0 -E'say Load(<>)->{resources}{bugtracker}'

http://rt.cpan.org/NoAuth/Bugs.html?Dist=Git-CPAN-Patch
</pre>

<p>If you don't feel inclined to dig into <code>META.yml</code> for information, there is a <a href="http://userscripts.org/scripts/show/31748">Greasemonkey script</a> that will do it for you, and automatically add a link to the bugtracker (along some other goodies) on the module's CPAN page.</p>
<h3 style="font-size: bigger;"><i>...or here, there and everywhere</i></h3>
<p>What if the bugs are kept on rt.cpan.org, and on the local bug tracking system of Github, and a few other places?  You can either follow them manually, or you can get funky and experiment with <a href="http://syncwith.us/sd/using">SD</a>, a peer-to-peer ticket tracking system that can sync with and merge the information of several online bug tracking systems.  SD, it goes without saying, can be found on CPAN as <a href="http://search.cpan.org/dist/App-SD">App::SD</a>.</p>
<h2 style="font-size: bigger; font-weight: bold;">Code Repository</h2>
<p>Most, but not all, modules have a public code repository somewhere out there.  Just like for the bug tracking system look for it in the POD, or in the <code>META.yml</code>.  It will be displayed on the module's cpan page as well.</p>
<pre>
$ curl -L http://search.cpan.org/dist/Git-CPAN-Patch/META.yml | \
    perl -MYAML -0 -E'say Load(<>)->{resources}{repository}'

git://github.com/yanick/git-cpan-patch.git
</pre>
<h3  style="font-size: bigger;"><i>&lt;singing name="Adam West"&gt;Na na na na, Na na na na, GitPAN!&lt;/singing&gt;</i></h3>
<p>Thanks to <a href="http://github.com/schwern/gitpan">Schwern</a>, all CPAN distributions now have a <a href="http://github.com">GitHub</a> repository tracking its releases.  They can all be found under the GitHub <a href="http://github.com/gitpan">gitpan account</a>, and follow the pattern <a href="http://github.com/gitpan/Git-CPAN-Patch">http://github.com/gitpan/Git-CPAN-Patch</a>.</p>
<h3 style="font-size: bigger;"><i>Git::CPAN::Patch</i></h3>
<p>Speaking of <a href="http://search.cpan.org/dist/Git-CPAN-Patch">Git::CPAN::Patch</a>, you can use its set of scripts to ease the creation of CPAN-related git repositories.  It also includes scripts to send patches directly from your local repository to a rt bug queue. </p>
			]]>
        
    </content>
</entry>

<entry>
    <title>Local POD browsing: using Pod::POM::Web via the CLI</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2010/01/local-pod-browsing-using-podpomweb-via-the-cli.html" />
    <id>tag:babyl.dyndns.org,2010:/techblog//1.173</id>

    <published>2010-01-16T17:21:22Z</published>
    <updated>2010-01-16T17:38:47Z</updated>

    <summary> post originally published in the Pythian Blog Edit: After I&apos;ve written the original post, a colleage pointed me to a very similar entry in Perl Hacks. I just want to say that (a) no blatant plagiarism was intended and...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="podclibash" label="pod cli bash" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="pod.jpg" src="http://babyl.dyndns.org/techblog/pod.jpg" width="300" height="247" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></span>


<p align="right"><em>post originally published in the 
<a
href="http://www.pythian.com/news/7069/local-pod-browsing-using-podpomweb-via-the-cli/">Pythian
Blog</a></em></p>

<blockquote><small>
<p><b>Edit:</b> After I've written the original post, a colleage pointed me to
a very similar entry in <a
href="http://oreilly.com/catalog/9780596526740">Perl Hacks</a>. I just want to
say that (a) no blatant plagiarism was intended and (b) I should read that
book cover to cover one of these days.  In any case, I'm keeping this post
alive as it's using a different podserver and, more interestingly, 
the completion part of it brings a little extra sugar to  the original
hack.
</p></small>
</blockquote>

				<p>Half the time I want to peek at the doc of a module, I hit <tt>perldoc</tt>.  The rest of the time I type <em>cpan Some::Module</em><sup><a name="note-src" href="#note">[1]</a></sup> in Firefox and read the POD straight out of CPAN.  And while it&#8217;s pretty and handy, it also feels kinda silly to go on a remote server to read documentation that is also sitting on my computer.  Surely, I tell myself, there must be a better way.</p>
<p>Cue in the several Perl modules that act as local POD web servers.  After giving a few of them a quick test-run, I decided to give <a href="http://search.cpan.org/~dami/Pod-POM-Web/">Pod::POM::Web</a> a try. Being a CLI jockey, I wanted to be able to open the POD of a module from the command line.  Not a problem, I just had to create the script &#8216;pod&#8217;:</p>
<pre>
#!/bin/bash

POD_PORT=8787

perl -MPod::POM::Web \
   -e&quot;Pod::POM::Web-&gt;server($POD_PORT)&quot; 2&gt; /dev/null &amp;

PAGE=`perl -e's(::)(/)g for @ARGV; print @ARGV' $1`

HOSTNAME=`hostname`

kfmclient openURL &quot;http://${HOSTNAME}:$POD_PORT/$PAGE&quot;;
</pre>
<p>There is not even a need to fire up the Pod::POM::Web server beforehand: the script will do it for us (if the server is already running, subsequent calls to <code>pod</code> will harmlessly try to start a new server on the same port and fail).  </p>
<p>It should be noted that &#8216;kfmclient&#8217; is <a href="http://www.kde.org/">KDE</a>-specific &#8212; for any other desktop environment, you might want to change that to a direct call to <code>firefox</code>.</p>
<p>It&#8217;s already not too shabby, but wouldn&#8217;t it be even better with a little bit of auto-completeness magic?  To do that, we need a short script, <tt>pod_complete</tt>:</p>
<p><span id="more-7069"></span></p>
<pre class="brush: perl;">
#!/usr/bin/perl

use 5.010;

use List::MoreUtils qw/ uniq /;

my ( $sofar ) = reverse split ' ', $ENV{COMP_LINE};

$sofar =~ s(::)(/)g;

my ( $path, $file ) = $sofar =~ m!^(.*/)?(.*)?$!;

my @dirs = map { $_.'/'.$path } @INC;

my @candidates;

for ( @dirs ) {
    opendir my $dir, $_;
    push @candidates, grep { /^\Q$file/ } grep { !/^\.\.?$/ } readdir $dir;
}

if ( $path ) {
    $_ = $path.'/'.$_ for @candidates;
}

s/\.pm$// for @candidates;
s(/+)(/)g for @candidates;

say for uniq @candidates;
</pre>
<p>All that is left is to add&nbsp;.&nbsp;.&nbsp;.&nbsp;</p>
<pre class="brush: plain; light: true;">
complete -C pod_complete pod
</pre>
<p>&nbsp;.&nbsp;.&nbsp;.&nbsp;to our <code>bashrc</code>, and it should all work (with the caveat that the modules must be entered as <code>Some/Module</code> instead of <code>Some::Module</code>).</p>
<pre class="brush: plain; light: true;">
$ pod XML/XPath
XML/XPath        XML/XPathScript
</pre>
<p><a name="note" href="#note-src">[1] </a>If you don&#8217;t already know the trick: create a bookmark with keyword &#8216;cpan&#8217; and location <a href="http://search.cpan.org/search?query=%s">http://search.cpan.org/search?query=%s</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Ottawa Perl Mongers presents: FormFu Assassin</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/11/ottawa-perl-mongers-presents-formfu-assassin.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.172</id>

    <published>2009-11-29T22:33:31Z</published>
    <updated>2009-11-29T22:56:59Z</updated>

    <summary> Once more, the Ottawa Perl Mongers assemble! When: Thursday December 3rd, 2009, at 7:00pm. Where: at the Pythian headquarter What: I&apos;ll be presenting how I&apos;m implementing AJAX forms in a Catalyst application, using the deadly magic of Mason, Prototype...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
    <category term="catalyst" label="catalyst" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="formfu" label="formfu" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mason" label="mason" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ottawapm" label="ottawa.pm" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="prototype" label="prototype" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pythian" label="pythian" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="formfu_assassin.jpg" src="http://babyl.dyndns.org/techblog/formfu_assassin.jpg" width="268" height="400" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>
<p>
Once more, the Ottawa Perl Mongers assemble!
</p><p>
<b>When:</b> Thursday December 3<sup>rd</sup>, 2009, at 7:00pm.
</p><p>
<b>Where:</b> at the <a href="http://maps.google.com/maps/ms?source=s_q&hl=en&geocode=&ie=UTF8&t=h&msa=0&msid=112372910673398446194.0004720e8adfa3283eaec&ll=45.421197,-75.639496&spn=0.00494,0.009559&z=17">Pythian headquarter</a>
</p><p>
<b>What:</b>  I'll be presenting how I'm implementing AJAX forms in a 
<a href="http://www.catalystframework.org/">Catalyst</a> application, 
using the deadly magic of <a href="http://www.masonhq.com/">Mason</a>, 
<a href="http://www.prototypejs.org/">Prototype</a> and <a href="http://search.cpan.org/~cfranks/Catalyst-Controller-HTML-FormFu/">FormFu</a>.  
</p><p>
<b>Bonus:</b> Pizza will be graciously provided by Pythian.  So if you plan on coming, please let me know so that I can be a good little ninja and make  the number of slices  match the number of attendees.
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Perl Module Dependencies: how to require the latest, and nothing less</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/10/perl-module-dependencies-how-to-require-the-latest-and-nothing-less.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.171</id>

    <published>2009-10-14T23:27:35Z</published>
    <updated>2009-10-30T00:33:47Z</updated>

    <summary>entry originally published on the Pythian blog. Recently, hanekomu was contemplating how to make subsequent installs of a Task::BeLike module upgrade its dependencies to their latest version. The idea is intriguing. It&#8217;s not something you want to do for a...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cpan" label="CPAN" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="taskbelike" label="Task::BeLike" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="taskbelikeyanick" label="Task::BeLike::YANICK" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dependencies" label="dependencies" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="hanekomu" label="hanekomu" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="modules" label="modules" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p><i>entry originally published on the <a href="http://www.pythian.com/news/4281/perl-module-dependencies-how-to-require-the-latest">Pythian blog</a>.
</i></p>

				<p>Recently, hanekomu was contemplating <a href="http://hanekomu.at/blog/dev/20091005-1227-repeatedly_installing_task_distributions.html">how to make subsequent installs of a <em>Task::BeLike</em> module upgrade its dependencies to their latest version</a>.</p>
<p>The idea is intriguing.  It&#8217;s not something you want to do for a typical module, but it makes sense in the context of <em>Task::BeLike</em>. If you care enough about a module to put it in your <em>Task::BeLike</em>, you probably care enough to want to upgrade when there&#8217;s a new version out there.</p>
<p>Alas, I think hanekomu&#8217;s proposed way of doing it is flawed (mind you, the debate is still going on as of the writing of this entry, and I can very well still be proven wrong).  But after some pondeferous chin scratching, I might have come with a cunning alternative to it.</p>

<p><span id="more-4281"></span></p>
<p>Let&#8217;s say that in your <code>Build.PL</code> (the logic would be the same for a <code>Makefile.PL</code>) you have your dependencies stashed in <em>%dependencies</em>.  Something akin to:</p>
<pre><code>%dependencies = (
    XML::LibXML      =&gt; 0,          # any version will do
    XML::XPathScript =&gt; '1.42',     # 1.42 or higher
    Moose            =&gt; 'latest',   # nothing but the shiniest!
);

</code></pre>
<p>All we want to do, really, is to switch the <em>latest</em> for, well, the latest version available.  Surprisingly, that something that is almost as easy to do than to say:</p>
<pre><code>for my $mod ( keys %dependencies ) {
    next unless $dependencies{$mod} eq 'latest';

    require CPANPLUS::Backend;
    state $cb = CPANPLUS::Backend-&gt;new;

    $dependencies{$mod} = $cb-&gt;module_tree( $mod )-&gt;package_version;
}
</code></pre>
<p>Yes, that&#8217;s really all there is to it. A <a href="http://github.com/yanick/Task-BeLike-YANICK/commit/563898785d5a39af66c6d5ad3a296dfb7568bb3e">little further hacking</a> later, I have incorporated the functionality to my own <em>Task::BeLike::YANICK</em> module.  The way I implemented it, installing the module the usual way will yield no surprise (i.e., dependencies already present are not going to be updated).  But if the environment variable <code>TASK_UPGRADE</code> is set to true, like so:</p>

<pre><code>TASK_UPGRADE=1 cpan -f Task::BeLike::YANICK</code></pre>
<p>&nbsp;.&nbsp;.&nbsp;.&nbsp;then the magic is going to be unleashed (the <code>-f</code> is to force the re-install, if the Task has already been installed before).</p>
<p>Alternatively, just to know which dependencies are out-of-date, one can also extract the distribution and do a</p>
<pre><code>perl ./Build.PL --upgrade
./Build prereq_report
</code></pre>
]]>
        
    </content>
</entry>

<entry>
    <title>The Joy of Finding Your Code in Unexpected Places</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/10/the-joy-of-finding-your-code-in-unexpected-places.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.170</id>

    <published>2009-10-08T23:21:16Z</published>
    <updated>2009-10-30T00:32:56Z</updated>

    <summary>entry originally published on the Pythian blog. picture by Geophaps Hey, that one in the sixth row&#8230; Doesn&#8217;t he looks familiar? So there I am, on my morning bus ride, reading my copy of The Definitive Guide to Catalyst (keep...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="catalyst" label="Catalyst" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="git" label="Git" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="vcs" label="VCS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="blogging" label="blogging" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="book" label="book" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="development" label="development" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p><i>entry originally published on the <a href="http://www.pythian.com/news/4238/the-joy-of-finding-your-code-in-unexpected-places">Pythian blog</a>.
</i></p>

				<div style="float:right;margin-left:30px;width:250"><img src="http://babyl.dyndns.org/misc/penguin_small.jpg" alt="Lotsa penguins" width="250" height="150" /></p>
<p>picture by <a href="http://www.flickr.com/photos/31525296@N06/">Geophaps</a><br />
<em>Hey, that one in the sixth row&#8230;<br /> Doesn&#8217;t he looks familiar?</em></div>
<p>So there I am, on my morning bus ride, reading my copy of <a href="http://www.apress.com/book/view/1430223650">The Definitive Guide to Catalyst</a> (keep your eyes peeled for the upcoming review of the book in <a href="http://theperlreview.com/">the Perl Review</a>).</p>

<p>I&#8217;m near the end, in Chapter 11, <em>Catalyst Cookbook</em>.  As it is with most tech books, the last chapters are the most engrossing, as the gloves finally come of and the writers throw at you all the wonderful, mind-bending stuff that the rest of the book prepares you for.</p>
<p>The section I&#8217;m at is about the development process.  Specifically, it shows how you can put hooks in your versioning system to automatically screen commits to conform to Perl::Critic and Perl::Tidy policies.  The given example script uses Git, which is just dandy with me as it is my current VCS of choice.  But there&#8217;s something&nbsp;.&nbsp;.&nbsp;.&nbsp; funny about that script. The way the utility functions are stashed at the end after a</p>
<p><code>### utility functions ##############################</code></p>
<p>line.  The choice of variable names. The comments.  It all feels oddly familiar. <span id="more-4238"></span> And then my eyes fall on the line</p>

<p><code>exit 0 unless @dirty;     # Alles gut</code></p>
<p>and <a href="http://use.perl.org/~Yanick/journal/35626">everything falls into place</a>.  The script in the book is a wee bit different and has been improved upon, but its origin is unmistakable. Somehow, unexpectedly, a hack of mine found its way into publication.  Fame, glory, and page 293 of the Catalyst book, I can finally claim &#8216;em all as rightfully mine!</p>
<p>But, serendipitous glee aside, three important lessons lie in this little story.</p>
<h3>1. Blog posts, great and small, the Perl Gestalt, it reads them all</h3>
<p>All clever tricks, code snippets, and insights you come up with?  Blog &#8216;em. Even if you think they are only an itsy widdly little bit clever.  Chances are, if there is a spark in there, it&#8217;ll ignite the mind of someone insaner than you are and ultimately result in something awe-inspiring.  Or, more importantly, something awe-inspiring for which you&#8217;ll have bragging rights.</p>
<p>And don&#8217;t despair if your blog entries mostly go without comments.  Provided that you are broadcast by an <a href="http://perlsphere.net/">aggregator</a> or <a href="http://ironman.enlightenedperl.org/">two</a>, people <em>will</em> read you.  Silently, furtively, your thoughts <em>will</em> slip in the Perl subconscious like so many pumpkin seeds into autumn soil.</p>

<h3>2. Code carries your DNA</h3>
<p>No big discovery here, but it&#8217;s interesting to see how surprisingly easy it is to recognize one&#8217;s own code.  One would think that nothing looks more like a line of code than another line of code, the same way nothing looks more like a baby emperor penguin than another one.</p>
<p>Yet, we do recognize ours by a curve of the beak, a specific timbre of the voice. Admittedly, Perl&#8217;s flexibility provides much more latitude for transposing our idiosyncrasies unto our digital babies.  But then again, isn&#8217;t why a lot of us love Perl so much?</p>
<h3>3. Some of my code made it into a Catalyst book!</h3>
<p>I mean, seriously, how terminally cool is that?!</p>
]]>
        
    </content>
</entry>

<entry>
    <title>Gaining My Money Where My Mouth Is</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/08/gaining-my-money-where-my-mouth-is.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.169</id>

    <published>2009-08-23T17:46:41Z</published>
    <updated>2009-08-23T18:03:22Z</updated>

    <summary> In the last three months, I&apos;ve been eerily quiet both on my blog (it&apos;s been so long, I&apos;m afraid I&apos;m going to bolt straight past Paper Man and end up Pulp Man) and on the module front. Ironically enough,...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://babyl.dyndns.org/techblog/rubicon.jpg"><img alt="rubicon.jpg" src="http://babyl.dyndns.org/techblog/assets_c/2009/08/rubicon-thumb-420x331-7.jpg" width="420" height="331" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></a></span></p>

<p>In the last three months, 
I've been eerily quiet both on my
blog (it's been so long, I'm afraid
I'm going to bolt straight past 
<a href="http://ironman.enlightenedperl.org/">Paper Man</a>
and end up Pulp Man) and on the module front. 
Ironically enough, this long silence has actually 
been
caused by events in my life that have Perl plastered
all over them.</p>

<p>In a nutshell, after 11 years of working in the telecom
industry, I've decided
to take the plunge and try something different.  As of
the end of July, I've switched allegiance to 
<a href="http://www.pythian.com/">The Pythian Group</a>. 
They are a company specializing in database support,
and they happen to use Perl-based internal tools.  Which is 
where, as the astute reader may surmise, I enter the picture.  </p>

<p>So, no more watching from the peanut gallery for li'll old me -- we'll now
see if I can make a living out of that Perl stuff.  </p>

<p>No need to say, I'm in equal part thrilled, exhilarated and terrified of what lies ahead. 
Hopefully, my new colleagues will feel the same way before long. :-)</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Moose and Daemons, now on video!</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/05/moose-and-daemons-now-on-video.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.168</id>

    <published>2009-05-31T17:49:56Z</published>
    <updated>2009-05-31T17:56:49Z</updated>

    <summary>The talks of the last perl Monger meeting are now available online for your viewing pleasure. In addition of the classic decks of slides, thanks to Andrew Ross of the FOSSLC we also have full-fledged recordings of the talks: Tim...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="moose" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="ottawa Perl mongers" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p>The talks of the last perl Monger meeting are now available online for your viewing pleasure. In addition of the classic decks of slides, thanks to Andrew Ross of the <a href="http://www.fosslc.org">FOSSLC</a> we also have full-fledged recordings of the talks:</p>

<ul>
<li><p><a href="http://www.pythian.com/news/2575/perl-moose-and-daemons">Tim Procter</a>'s ''Portable Perl Daemons'': 
<a href="http://hosting3.epresence.tv/fosslc/1/watch/149.aspx">audio-visual extravaganza</a> or <a href="http://babyl.dyndns.org/techblog/2009/05/31/daemons.pdf">just the slides</a>.</p></li>
<li><p>Your truly introduction to Moose: 
<a href="http://hosting3.epresence.tv/fosslc/1/watch/148.aspx">audio-visual extravaganza</a> or <a href="http://babyl.dyndns.org/perl/moose-mongers/">just the slides</a>.</p></li>
</ul>

<p>Enjoy!</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Ottawa Mongers: Moose &amp; Daemons</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/05/ottawa-mongers-moose-daemons.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.167</id>

    <published>2009-05-23T15:24:10Z</published>
    <updated>2009-05-23T15:37:06Z</updated>

    <summary> The Ottawa Mongers meet this month! On the program, we have a Monger special edition of the Moose talk I gave at the FOSSLC Summercamp last week, and Tim Procter of the Pythian Group will give a talk about...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="ottawa Perl mongers" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Moose and Daemons poster" src="http://babyl.dyndns.org/techblog/2009/05/23/moose-and-daemons.jpg" width="520" height="410" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span>

<p>The Ottawa Mongers meet this month! </p>
<p>
On the program,
we have a Monger special edition of the Moose talk I gave at the 
<a href="http://fosslc.org/drupal/summercamp2009">FOSSLC Summercamp</a>
last week, and Tim Procter of the 
<a href="http://www.pythian.com">Pythian Group</a> 
will give a talk about Perl Daemon Processes.</p>

<p><b>Location and Time</b></p>
<p>
The meeting will take place Tuesday May 26<sup>th</sup>, at 7:00pm.
We'll be at the <a href="http://maps.google.ca/maps?hl=en&safe=off&client=firefox-a&q=116+albert+street+Ottawa&ie=UTF8&split=0&gl=ca&ei=rAcYSuyeNIieMqmKvY8P&t=h&z=16&iwloc=A">Pythian Group office</a> (Suite 1000, 116 Albert Street).</p>
<p>
If you plan to
come, please let me know so that we make sure we can accommodate
everyone.</p>]]>
        
    </content>
</entry>

<entry>
    <title>To 5.10 or not to 5.10</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/05/to-510-or-not-to-510.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.166</id>

    <published>2009-05-18T01:27:04Z</published>
    <updated>2009-05-18T01:33:30Z</updated>

    <summary>Ever since Perl 5.10 came out, my soul is torn asunder by a particularly prickly dilemma. On one hand, my love of shiny new toys urge me to go forth and use the new features of 5.10 to their full...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p>Ever since Perl 5.10 came out, my soul is torn asunder by a particularly prickly dilemma. </p>

<p>On one hand, my love of shiny new toys urge me to go forth and use the new features of 5.10 to their full extent so that my code is clean, concise and, most important of all, spiffy.  </p>

<p>On the other hand, my insatiable thirst for glory dictates that 
I should strive to make my modules accessible to the widest range
of configurations possible.  In that light, setting the
requirement bar to Perl 5.10 is a severe drawback.  Kinda
like longing for world domination, but restricting oneself 
to invade only countries with names beginning with 'M'. </p>

<p>So far I pretty much went the 5.8-compatible way. But the call of the shiny
is becoming just too strong, and from now on I'll try a new approach.</p>

<p>Conceptually, I'll divide my modules into two categories: modules that are 
for general consumption (WWW::Ohloh::API, XML::XPathScript, etc),
and modules that are tools for developers (Dist::Release, 
Git::CPAN::Patching, Test::Pod::Snippets). <br />
The formers, I'll keep 5.8-compatible.  For the latter, though,
I'll go on a limb and assume that they'll be used on development
machines.  Machines that can afford -- nay, should be expected --
to have a Perl 5.10 binary stashed somewhere.  </p>

<p>Now, my only hope is that by doing so I'll not alienate my user base. 
Well, not exactly: I also hope there is actually a user base to alienate in the first place.  :-)</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Me, Moose and Summercamp 2009  </title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/05/me-moose-and-summercamp-2009.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.165</id>

    <published>2009-05-10T23:49:28Z</published>
    <updated>2009-05-11T00:13:51Z</updated>

    <summary>(by the by, I joined the fun and accepted the Perl Iron Man Challenge.) As assiduous readers of my blog may recall, last year I gave a 35 minutes Perl introduction at OSBootCamp 8. For unphantomable reasons, I&apos;ve been asked...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="moose" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p>(by the by, I joined the fun and accepted
the <a href="http://www.shadowcat.co.uk/blog/matt-s-trout/iron-man/">Perl Iron Man
Challenge</a>.)</p>

<p>As assiduous readers of my blog may recall, last year I gave a 
<a href="http://babyl.dyndns.org/techblog/2008/09/me-at-osbootcamp-8-4.html">35 minutes Perl introduction at OSBootCamp
8</a>.  For unphantomable reasons, I've been asked to
come back and recidive for
<a href="http://fosslc.org/drupal/summercamp2009">FOSSLC Summercamp
2009</a>, which is happening
on the 13, 14 and 15 of May. </p>

<p>This time, my talk is going to be an introduction to Moose.  Why Moose? 
Since my goal is to hook unsuspecting students on Perl, I figured the easiest way to tip them to the dark side would be to show those java-tainted young minds the latest and shiniest OO coolness that the Perl community has to offer.</p>

<p>Sorry, what? ... Didn't I mention in a previous blog entry that I <a href="http://babyl.dyndns.org/techblog/2008/07/objectinsideout-cheatsheet-4.html">prefered Object::InsideOut over Moose</a>? </p>

<p>Ah... Hum... Well, yes, true, I might have said that... (darn those assiduous readers)</p>

<p>Mind you, I still think that Object::InsideOut is a very fine module indeed,
but several things made me progressively slide in the Moose camp:</p>

<ul>
<li><p>Moose has an incredibly strong momentum in the community. <br />
Notwithstanding the fact that when
so
many bright people get excited about something, it's usually for a good
reason,  it also means that Moose development is thriving. 
And not only core development, but extensions are by now abounding. <br />
And this, for my little lazy heart, is true bliss.  The <a href="http://search.cpan.org/search?query=MooseX&amp;mode=dist">MooseX</a>
namespace is quickly growing into a mini OO-CPAN.</p></li>
<li><p>At the time, I was arguing with Yuval that I had no
need for those cute 'before' and 'after' method modifiers.
Ah! That was before I seriously tried using them...</p></li>
<li><p>Roles.  Those things are dangerously addictive.  And they do 
such a damned good job of simplifying one's code.</p></li>
<li><p>MooseX::Method::Signatures, Moose types, coercion, and the
myriad of other things that all work together to move 
the tedious bits of coding out of the way, and to fragment
the good parts into small, easy to understand/maintain pieces.</p></li>
<li><p>Meta-programming.  Pure mad scientist type of fun.  How
can I possibly resist?</p></li>
</ul>

<p>So yeah, I call on my right to change my volatile mind. Color me a new Moose adept.  And, hopefully, I'll similarly be able to color some more converts this Friday.  Wish me luck.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Moose Attribute Meta Meddling</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/05/moose-attribute-meta-meddling.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.164</id>

    <published>2009-05-02T04:47:55Z</published>
    <updated>2009-05-02T16:04:12Z</updated>

    <summary>This week I finally got a good excuse to go on and dabble with Moose meta-programming. In my WWW::Ohloh::API classes, a lot of attributes take their values from an initial xml snippet. The original, naive way those values were extracted...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="moose" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="moose" label="moose" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p>This week I finally got a good excuse to 
go on and dabble with Moose meta-programming. 
In my WWW::Ohloh::API
classes, a lot of attributes take their values from an initial xml 
snippet.  The original, naive way those values were extracted was along
the lines of:</p>

<pre><code>has xml_src =&gt; (
    is   =&gt; 'ro',
    isa =&gt; 'XML::LibXML::Node',
);

has created_at =&gt; (
    is         =&gt; 'ro', 
    lazy      =&gt; 1,
    default =&gt; sub {
        return $_[0]-&gt;xml_src-&gt;findvalue( 'created_at' );
    }
)

has sender_account_name =&gt; (
    is          =&gt; 'ro', 
    lazy      =&gt; 1,
    default =&gt; sub {
        return $_[0]-&gt;xml_src-&gt;findvalue( 'sender_account_name' );
    }
);
</code></pre>

<p>Not harrowingly horrible, but rather repetitive.  I figured out it
would be much niftier to
provide the name of the attribute holding the source xml and the
pertinent xpath, and let Moose magic take care of the rest. Something like:</p>

<pre><code>has created_at =&gt; (
    metaclass =&gt; 'XMLExtract',
    is =&gt; 'ro', 
    xml_src =&gt; 'xml_src',
    xpath =&gt; 'created_at',
)
</code></pre>

<p>Well, turns out that once one knows how, 
this is fairly easy to do: </p>

<pre><code>package XMLExtract;

use Moose;

extends 'Moose::Meta::Attribute';

has 'xml_src' =&gt; ( isa =&gt; 'Str', );

has xpath =&gt; ( isa =&gt; 'Str', );

has '+lazy' =&gt; ( default =&gt; 1 );

before '_process_options' =&gt; sub {
    my ( $class, $name, $options ) = @_;

    die "attribute '$name' in class '$class' must be lazy-evaluated\n"
    if defined $options-&gt;{lazy} and not $options-&gt;{lazy};

    my $src = $options-&gt;{xml_src} ||= 'xml_src';
    my $xpath = $options-&gt;{xpath} ||= $name;

    $options-&gt;{default} = sub {
        return $_[0]-&gt;$src-&gt;findvalue($xpath);
    };

};

1;
</code></pre>

<p>If you notice, I've set '<em>xml_src</em>' and
'<em>xpath</em>' to default to '<code>xml_src</code>' 
and the name of the current attribute,
so that the code can be further simplified to</p>

<pre><code>has xml_src =&gt; (
    is   =&gt; 'ro',
    isa =&gt; 'XML::LibXML::Node',
);

has created_at =&gt; (
    metaclass =&gt; 'XMLExtract',
    is =&gt; 'ro', 
)

has sender_account_name =&gt; (
    metaclass =&gt; 'XMLExtract',
    is =&gt; 'ro', 
);
</code></pre>

<p>Short, sweet and to the point.  Now we're talking
code I like!</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Ruhr.pm: Die Meister des Psycho-Lamas</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/04/ruhrpm-die-meister-des-psycho-lamas.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.163</id>

    <published>2009-04-22T00:55:26Z</published>
    <updated>2009-04-23T23:41:51Z</updated>

    <summary>Last month, thanks to a concerted effort of German Perl Mongers[1] I was able to meet with the wonderful folks of Ruhr.pm. It turns out that not only the Ruhr-area mongers are a superlatively friendly bunch, but they have pretty...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
    <category term="mongersperl" label="mongers perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p>Last month, thanks to a concerted effort of German Perl Mongers[1]
I was able to meet with the wonderful folks of 
<a href="http://ruhr.pm.org">Ruhr.pm</a>. </p>

<p>It turns out that not only the  Ruhr-area mongers are
a superlatively friendly bunch, but they
have pretty <a href="http://ruhr.pm.org/material.psp">cool presentations</a> too. </p>

<p>The feature presentation of the night was 
<a href="http://ruhr.pm.org/files/fuse/docshot/">Fuse mit Perl</a>, 
by Simon Wilper. After he was done, I also got treated with a
quick replay of two previous presentations dealing with image
manipulation.  <a href="http://ruhr.pm.org/files/opencv/docshot">One</a> 
was about openCV, a facial recognition software,
and its Perl interface, and the other one was about the <a href="http://ruhr.pm.org/files/imagemagick/docshot">uses of
Image::Magick</a>,
including the detailed instructions on how to create a psycho-llama.
That last bit, I daresay, was worth the trip to Germany
all by itself.  The script to create the thing is in the <a href="http://ruhr.pm.org/files/imagemagick/imagemagick-beispiele.tar.gz">presentation companion tarball</a>, check it out (well, unless you suffer from epilepsy, in which case you want to stay as far away as possible).</p>

<p>So, bottom-line: Ruhr.pm rocks big time.  If you're ever passing in the vicinity, I highly recommend paying them a visit.  :-)</p>

<p>[1] Renée Bäcker saw my use.perl.org blog entry and forwarded the
information to Ruhr.pm, Veit Wahlich -- fearless leader of the Ruhrgebiet mongers --
contacted me and arranged the details, and René Knopp was dispatched
to pick me up from the train station.  Many thanks to the whole
bunch!</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Just another Perl Ausländer </title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/03/just-another-perl-auslander.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.162</id>

    <published>2009-03-04T19:24:15Z</published>
    <updated>2009-03-04T21:04:23Z</updated>

    <summary>Ever since I&apos;ve learned about the existence of $foo - Perl Magazin, I&apos;ve been awfully curious to take a peek at it. Unfortunately, they don&apos;t ship subscriptions internationally. So I went for the obvious workaround: I hunted high and low...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
    <category term="foomagazinegermany" label="$foo magazine germany" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p>Ever since I've learned about the existence of
   <a href="http://www.perl-magazin.de/">$foo - Perl Magazin</a>, I've
   been awfully curious to take a peek at it.
   Unfortunately, they don't ship subscriptions internationally.
   So I went for the obvious workaround: I hunted high and low for
   the loveliest German lass I could find, asked her to marry me,
   and coaxed her family to get and forward me a subscription for
   the magazine as this year's Christmas gift.
   Worked like a charm.</p>

   <p>
   And it was worth it too.  The magazine is even better than
   I expected, and it's high praises to the authors that
   I  learned quite a few things from the articles even though
   my German is still at a protozoic stage.  Whether you're a German
   wanting to learn Perl, or a Perl hacker wanting to learn German,
   I heartily recommend it.</p>

   <p>And talking of Germany, I'll embark tomorrow on a three-week vacation trip across
   the republic.  If there are any Perl mongers meeting this month around Duisburg,
   Morsbach or Schwieberdigen who wouldn't mind having an Ausländer in
   their midst, please feel free to drop me an email. :-)</p>
]]>
        
    </content>
</entry>

<entry>
    <title>Académie des chasseurs de primes</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2009/02/academie-des-chasseurs-de-primes.html" />
    <id>tag:babyl.dyndns.org,2009:/techblog//1.161</id>

    <published>2009-02-14T23:41:52Z</published>
    <updated>2009-02-14T23:48:01Z</updated>

    <summary> Next week is going to see the release of the comic book album &apos;Académie des chasseurs de primes&apos; (art by Benoit Godbout, stories by Michel Lacombe and yours truly). If you are in Montréal, there&apos;s going to be a...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
        <category term="acp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="invitation_ACP.png" src="http://babyl.dyndns.org/techblog/acp/invitation_ACP.png" width="400" height="284" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></span> </p>

<p>Next week is going to see the release of 
the comic book album 'Académie des chasseurs 
de primes' (art by Benoit Godbout, stories
by Michel Lacombe and yours truly).  If you are in 
Montréal, there's going to be a reception Wednesday
that Ben and Michel will be attending (see attached image).</p>

<p>We have a <a href="http://academiedeschasseursdeprimes.ca/bande">movie teaser</a>,
and we'll soon have a working <a href="http://academiedeschasseursdeprimes.ca/">website</a> as well. <br />
The album itself will be sold in librairies in Québec and France.
I'll see if there's a way to have an internet sale channel as well.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>CPAN Patching with Git</title>
    <link rel="alternate" type="text/html" href="http://babyl.dyndns.org/techblog/2008/12/cpan-patching-with-git.html" />
    <id>tag:babyl.dyndns.org,2008:/techblog//1.160</id>

    <published>2008-12-29T19:18:26Z</published>
    <updated>2008-12-29T19:22:40Z</updated>

    <summary>=pod A few months ago, brian posted a blog entry about L. In the ensuing discussion, I pointed at a possible way to automatise the process a step further by punting the generated patch to rt.cpan.org. The hack was well-received...</summary>
    <author>
        <name>Yanick</name>
        
    </author>
    
    <category term="gitperltpr" label="git perl tpr" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://babyl.dyndns.org/techblog/">
        <![CDATA[=pod

A few months ago, brian posted a blog entry 
about 
L<patching modules using Git|http://use.perl.org/~brian_d_foy/journal/37664>.
In the ensuing discussion, I pointed at a possible way to
automatise the process a step further by punting the generated
patch to rt.cpan.org.  The hack was well-received  and, with
(very) minimal coaxing, I was subsequently convinced to 
expand on the idea for the Perl Review.

The resulting piece is now available in 
L<TPR 5.1|http://theperlreview.com>. In the article, the 
initial command-line hack has morphed into 
four scripts -- C<git-cpan-init>, C<git-cpan-clone>, 
C<git-cpan-update> and C<git-cpan-sendpatch> -- that
pretty much take care of all the administrative
overhead of module patching.  In most cases, 
grabbing a distro, fixing a bug and sending the
patch can be done in four lines:


    $ git cpan-init Some::Module  
    $ git checkout -b mypatch    
    ...hack hack hack...                                
    $ git rebase -i cpan        
    $ git cpan-sendpatch       

And, no, the lack of hyphen between C<git> and C<cpan-X>
isn't a typo; the article also covers how
to seamlessly integrate the new scripts into the 
git infrastructure (as Edna Mode would say, 
I<it's a non-feature, dahling>).

Of course, I'm burning to say more, but I'll have to stop here. 
To know the whole story, you'll have to wait for The Perl Review 
to land in your mailbox (you are subscribed to TPR, I<right?>).]]>
        
    </content>
</entry>

</feed>
