<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <generator>Plagger/0.7.17</generator>
    <link>http://perlsphere.net/</link>
    <description>The Perl firehose! The Web's biggest collection of Perl 5 blogs.&lt;br /&gt;If you'd like your Perl 5 blog or tech blog's Perl category to appear here, send mail to &amp;#108;&amp;#101;&amp;#111;&amp;#64;&amp;#99;&amp;#117;&amp;#99;&amp;#107;&amp;#111;&amp;#111;&amp;#46;&amp;#111;&amp;#114;&amp;#103;&lt;br /&gt;(Please have several posts already).</description>
    <title>Perlsphere</title>
    <pubDate>Sun, 05 Feb 2012 17:13:03 -0000</pubDate>
    <item>
      <author>nobody@example.com (Joel Berger)</author>
      <dc:creator>nobody@example.com (Joel Berger)</dc:creator>
      <category>Announcing PDL Science/Math</category>
      <link>http://blogs.perl.org/users/joel_berger/2012/02/perl-data-language-pdl-2410-release.html</link>
      <description>Since the Perl Data Language (PDL) does not have a large presence in the
Perl Blogosphere, I have the honor of reposting Pumpking Chris Marshall’s
announcement of PDL 2.4.10.

For those of you who don’t know, PDL gives standard Perl the ability to
compactly store and speedily manipulate the large N-dimensional data
arrays which are the bread and butter of scientific computing. For more
information on PDL please visit its website at http://pdl.perl.org.

Chris’ release message is reposted below, the full text can be seen on
the mailing list archive.

PDL-2.4.10 released

The PDL Development Team is pleased to announce the PDL-2.4.10 release of
the Perl Data Language and the first PDF release of the PDL Book.

PDL-2.4.10 is the latest point release with more functionality,
portability, and robustness than ever before, including:

  * POSIX threads support for all platforms

  * Auto parallelization of PDL threadloops

  * Support for PDLs larger than 2GiB

  * PDL Book draft release (PDF format)

  * Much, much, more…

As always, the source distribution will be available at a CPAN mirror
near you within a couple of days. Our sf.net site has the source
distribution and the PDL Book:

http://sourceforge.net/projects/pdl/files/PDL/2.4.10/PDL-Book-20120205.pdf/download

Windows binary PPM are available in the usual site, see “Get PDL” in the
sidebar at http://pdl.perl.org (the PDL website for links, documentation
and info for all things PDL).

The SciPDL-2.4.10 release for MacOS X systems will be announced when it
is available.

Enjoy and Happy PDL-ing!

Chris Marshall for the PDL Development Team</description>
      <dc:date>2012-02-06T02:56:34Z</dc:date>
      <dc:subject>Announcing PDL Science/Math</dc:subject>
      <title>Perl Data Language (PDL) 2.4.10 Release</title>
      <pubDate>Mon, 06 Feb 2012 02:56:34 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;Since the Perl Data Language (PDL) does not have a large presence in the Perl Blogosphere, I have the honor of reposting Pumpking Chris Marshall&amp;#8217;s announcement of PDL 2.4.10. &lt;/p&gt;

&lt;p&gt;For those of you who don&amp;#8217;t know, PDL gives standard Perl the ability to compactly store and speedily manipulate the large N-dimensional data arrays which are the bread and butter of scientific computing. For more information on PDL please visit its website at &lt;a href="http://pdl.perl.org"&gt;http://pdl.perl.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Chris&amp;#8217; release message is reposted below, the full text can be seen on the &lt;a href="http://mailman.jach.hawaii.edu/pipermail/perldl/2012-February/006379.html"&gt;mailing list archive&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PDL-2.4.10 released&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The PDL Development Team is pleased to announce the
PDL-2.4.10 release of the Perl Data Language &lt;em&gt;and&lt;/em&gt;
the first PDF release of the PDL Book.&lt;/p&gt;

&lt;p&gt;PDL-2.4.10 is the latest point release with more
functionality, portability, and robustness than ever
before, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;POSIX threads support for all platforms&lt;/li&gt;
&lt;li&gt;Auto parallelization of PDL threadloops&lt;/li&gt;
&lt;li&gt;Support for PDLs larger than 2GiB&lt;/li&gt;
&lt;li&gt;PDL Book draft release (PDF format)&lt;/li&gt;
&lt;li&gt;Much, much, more&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As always, the source distribution will be available
at a CPAN mirror near you within a couple of days.
Our sf.net site has the source distribution and the
PDL Book:&lt;/p&gt;

&lt;p&gt;http://sourceforge.net/projects/pdl/files/PDL/2.4.10/PDL-Book-20120205.pdf/download&lt;/p&gt;

&lt;p&gt;Windows binary PPM are available in the usual site,
see &amp;#8220;Get PDL&amp;#8221; in the sidebar at http://pdl.perl.org
(the PDL website for links, documentation and info
for all things PDL).&lt;/p&gt;

&lt;p&gt;The SciPDL-2.4.10 release for MacOS X systems will be
announced when it is available.&lt;/p&gt;

&lt;p&gt;Enjoy and Happy PDL-ing!&lt;/p&gt;

&lt;p&gt;Chris Marshall
   for the PDL Development Team&lt;/p&gt;

        

    </content:encoded>
      <dcterms:modified>2012-02-06T02:56:34Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogs.perl.org,2012:/users/joel_berger//1022.2772</guid>
    </item>
    <item>
      <author>nobody@example.com (Sawyer X)</author>
      <dc:creator>nobody@example.com (Sawyer X)</dc:creator>
      <category>Design Perl</category>
      <link>http://blogs.perl.org/users/sawyer_x/2012/02/updates-to-syshostip.html</link>
      <description>Sys::HostIP simply parses ifconfig/ipconfig (supports
GNU/Linux/BSD/Windows) and gives you the interfaces and IPs found.

I stumbled upon this module when I was looking for a way to clean get all
the ips of every interface on machines at $work. I needed something that
parses ifconfig cleanly, because I didn't want to do it myself. I found a
few and Sys::HostIP was by far the easiest, simplest, fastest and the one
I decided to use. I noticed a few bugs open and contacted the author who
gave me co-ownership. I since updated it and cleaned most of the ticket
pool.

I've recently stumbled another situation, in which I want to find the IPs
by order. Thinking I could just tweak the module to allow fetching it in
order, I found that the logics is a bit of a mind boggle. I retained much
of the original code and it supported both functional programming (as in
functions) and object oriented, and I wanted to keep that.

I started by mapping on my board at $work all of the paths that methods
and functions take. This was a total mess and I decided it's time to pick
one or the other. I've picked object oriented in order to save user
configurations, allow results caching, reserve status and have
reusability.

This means that the next release of Sys::HostIP will warn when the
functional interface will be used, and the release after that (version
2.00) will have it removed completely. I intend to have that release in
at least two weeks from today, perhaps even a month.

Another important change is that Taint mode actually works now. Previous
the regex parsing used to get the binary directory (for setting the PATH
environment) was wrong, and I removed it in favor of the core module
File::Basename.

I also removed the need for Test::TinyMocker and Test::Exception. This
makes the module have zero non-core depdendencies. Hey, why not?

Feedback is welcome.

Thanks goes to Joel Berger, Yanick Champoux and Gabor Szabo for spreading
the idea of promoting our distribution, and actually doing it. :)</description>
      <dc:date>2012-02-05T09:41:09Z</dc:date>
      <dc:subject>Design Perl</dc:subject>
      <title>Updates to Sys::HostIP</title>
      <pubDate>Sun, 05 Feb 2012 09:41:09 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;Sys::HostIP simply parses ifconfig/ipconfig (supports GNU/Linux/BSD/Windows) and gives you the interfaces and IPs found.&lt;/p&gt;

&lt;p&gt;I stumbled upon this module when I was looking for a way to clean get all the ips of every interface on machines at $work. I needed something that parses ifconfig cleanly, because I didn't want to do it myself. I found a few and Sys::HostIP was by far the easiest, simplest, fastest and the one I decided to use. I noticed a few bugs open and contacted the author who gave me co-ownership. I since updated it and cleaned most of the ticket pool.&lt;/p&gt;

&lt;p&gt;I've recently stumbled another situation, in which I want to find the IPs by order. Thinking I could just tweak the module to allow fetching it in order, I found that the logics is a bit of a mind boggle. I retained much of the original code and it supported both functional programming (as in functions) and object oriented, and I wanted to keep that.&lt;/p&gt;

&lt;p&gt;I started by mapping on my board at $work all of the paths that methods and functions take. This was a total mess and I decided it's time to pick one or the other. I've picked object oriented in order to save user configurations, allow results caching, reserve status and have reusability.&lt;/p&gt;

&lt;p&gt;This means that the next release of Sys::HostIP will warn when the functional interface will be used, and the release after that (version 2.00) will have it removed completely. I intend to have that release in at least two weeks from today, perhaps even a month.&lt;/p&gt;

&lt;p&gt;Another important change is that Taint mode actually works now. Previous the regex parsing used to get the binary directory (for setting the PATH environment) was wrong, and I removed it in favor of the core module File::Basename.&lt;/p&gt;

&lt;p&gt;I also removed the need for Test::TinyMocker and Test::Exception. This makes the module have zero non-core depdendencies. Hey, why not?&lt;/p&gt;

&lt;p&gt;Feedback is welcome.&lt;/p&gt;

&lt;p&gt;Thanks goes to Joel Berger, Yanick Champoux and Gabor Szabo for spreading the idea of promoting our distribution, and actually doing it. :)&lt;br /&gt;
&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2012-02-05T09:41:09Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogs.perl.org,2012:/users/sawyer_x//87.2771</guid>
    </item>
    <item>
      <author>nobody@example.com (Joel Berger)</author>
      <dc:creator>nobody@example.com (Joel Berger)</dc:creator>
      <category>Feedback Wanted For Beginners Perl Love</category>
      <link>http://blogs.perl.org/users/joel_berger/2012/02/the-perl-tutorial-tutorial.html</link>
      <description>The web is crowded with tutorials about Perl. Perl has improved over the
years, bringing new features, safer constructs and clearer syntax.
However the old tutorials still are read and learned by far too many new
Perlers. This article is to help you be able to select your information
source critically.

Some things to look for:

The name of the language is Perl

Yes that’s Perl not PERL. The community is very adamant about this, so if
the tutorial says PERL you know that it is written by someone outside the
Perl community.

The current Perl version is 5.14, the year is 2012

Many tutorials that were great for Perl 4, or even 5.6 are now woefully
out of date. If there is a date on the tutorial older than about 2007 or
Perl version 5.10, it will be missing many of the new features and may
use older, more dangerous syntax.

Recommends using ‘strict’ and ‘warnings’

While the strict and warnings pragmas are not required, and there are
still a few people who prefer not to use them, the vast majority of
Perlers do. They help prevent typos and gotchas that are very easy for
even the most experienced Perlers to accidently fall into.

A good tutorial site should at least mention that these represent a good
safety net, but may skip including them on each example to save space. An
even better site will include them in all longer code snippets.

Finally, you may see snippets which use a -w on the top line, this is a
giveaway that the tutorial was probably good, but is now a little old
(see above).

Use of ‘my’ variables

Along with use strict comes the requirement that variables are declared
with some scope. This means that the first time a variable is introduced,
it should come with a declaration of my, our, local or state.

my $phrase = 'Hello World';
our @names = ('Jim', 'Bob');

If this is not the case, I would move on to another tutorial. One
exception is if the code is written as a “one-liner”, which will look
like

perl -e 'some code here'

in which these declarations are not often used. New Perlers may want to
learn some basics before attempting one-liners however.

Modern use of the ‘open’ command

The open command has seen some big changes over the years, and while the
old use will still work, the modern syntax is much better. Since Perl is
often used to work on text files, the open command is in almost every
tutorial. As such, the treatment of this one command can serve as a
useful litmus test as to the age and “goodness” of a tutorial.

A huge red-flag of an old tutorial looks like this

open HANDLE, '&lt;filename';

rather that a modern

open my $handle, '&lt;', 'filename' or die "Cannot open filename: $!";

This will take some explanation. First modern Perl lets one assign the
filehandle to a variable (i.e. $handle, which may need the my declarator
if it has not been declared previously), which is highly recommended.

Separating the open type, &lt; or &gt; (for read and write, respectively) from
the file name is now recommended as well. This is called “the 3-arg open”
and should be used whenever possible.

Checking to make sure that open succeeded is also recommended. The
snippet above does this with the or die ... conditional. Another simple
way to accomplish this task is to use autodie near the top of the script.
Would you want your code to work on a file that didn’t open correctly? I
doubt it.

A good tutorial should do, or at least mention, all of the previous
concerns. If they lax on checking success on opening after mentioning it,
this is probably acceptable (from a purely space-saving perspective). If
not, move on.

Preach code reuse

Perl is good at munging text, however, for all but simple cases, you
might want to use standard modules when appropriate. A new user should
probably know how to parse out a basic line of comma-separated text, and
a tutorial can show you how to do it manually. That said, a very good
tutorial will mention that this is very fragile and that you should, in
practice use the Text::CSV module. Same goes for HTML, XML, JSON and
other formats.

Finally while code-reuse is a good idea, it can only as good as the code
that is being reused. The CGI.pm module helped put Perl on the map, but
its days are numbered. A tutorial that spends too much time on it is
probably too old to trust.

In Conclusion

While none of these guidelines is absolute, I think you the reader will
find that most tutorials will usually fall into very good or very
bad/old. Hopefully this helps you find those good Perl tutorials, and
steer clear of the others.

Gabor Szabo, himself the author of a new series of Perl tutorials,
reminds me that there is a project aimed at screening and recommending
tutorials. You might want to start your search for a modern tutorial
there: Perl Tutorial Hub.

P.S.

To my fellow Perlers, you are encouraged to add to this list in the
comments, as well as suggest some good tutorials. This post was made
partially to be linked to posters on Stack Overflow and others when bad
code from old tutorials shows up (you know what I mean).</description>
      <dc:date>2012-02-05T00:50:32Z</dc:date>
      <dc:subject>Feedback Wanted For Beginners Perl Love</dc:subject>
      <title>The 'Perl Tutorial' Tutorial</title>
      <pubDate>Sun, 05 Feb 2012 00:50:32 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;The web is crowded with tutorials about Perl. Perl has improved over the years, bringing new features, safer constructs and clearer syntax. However the old tutorials still are read and learned by far too many new Perlers. This article is to help you be able to select your information source critically.&lt;/p&gt;

&lt;p&gt;Some things to look for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The name of the language is Perl&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes that&amp;#8217;s Perl not PERL. The community is very adamant about this, so if the tutorial says PERL you know that it is written by someone outside the Perl community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The current Perl version is 5.14, the year is 2012&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Many tutorials that were great for Perl 4, or even 5.6 are now woefully out of date. If there is a date on the tutorial older than about 2007 or Perl version 5.10, it will be missing many of the new features and may use older, more dangerous syntax.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommends using &amp;#8216;strict&amp;#8217; and &amp;#8216;warnings&amp;#8217;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While the &lt;code&gt;strict&lt;/code&gt; and &lt;code&gt;warnings&lt;/code&gt; pragmas are not required, and there are still a few people who prefer not to use them, the vast majority of Perlers do. They help prevent typos and gotchas that are very easy for even the most experienced Perlers to accidently fall into. &lt;/p&gt;

&lt;p&gt;A good tutorial site should at least mention that these represent a good safety net, but may skip including them on each example to save space. An even better site will include them in all longer code snippets. &lt;/p&gt;

&lt;p&gt;Finally, you may see snippets which use a &lt;code&gt;-w&lt;/code&gt; on the top line, this is a giveaway that the tutorial was probably good, but is now a little old (see above).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use of &amp;#8216;my&amp;#8217; variables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Along with &lt;code&gt;use strict&lt;/code&gt; comes the requirement that variables are declared with some scope. This means that the first time a variable is introduced, it should come with a declaration of &lt;code&gt;my&lt;/code&gt;, &lt;code&gt;our&lt;/code&gt;, &lt;code&gt;local&lt;/code&gt; or &lt;code&gt;state&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;my $phrase = 'Hello World';
our @names = ('Jim', 'Bob');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If this is not the case, I would move on to another tutorial. One exception is if the code is written as a &amp;#8220;one-liner&amp;#8221;, which will look like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;perl -e 'some code here'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;in which these declarations are not often used. New Perlers may want to learn some basics before attempting one-liners however.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modern use of the &amp;#8216;open&amp;#8217; command&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;open&lt;/code&gt; command has seen some big changes over the years, and while the old use will still work, the modern syntax is much better. Since Perl is often used to work on text files, the &lt;code&gt;open&lt;/code&gt; command is in almost every tutorial. As such, the treatment of this one command can serve as a useful litmus test as to the age and &amp;#8220;goodness&amp;#8221; of a tutorial.&lt;/p&gt;

&lt;p&gt;A huge red-flag of an old tutorial looks like this&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;open HANDLE, '&amp;lt;filename';
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;rather that a modern&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;open my $handle, '&amp;lt;', 'filename' or die "Cannot open filename: $!";
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will take some explanation. First modern Perl lets one assign the filehandle to a variable (i.e. &lt;code&gt;$handle&lt;/code&gt;, which may need the &lt;code&gt;my&lt;/code&gt; declarator if it has not been declared previously), which is highly recommended. &lt;/p&gt;

&lt;p&gt;Separating the open type, &lt;code&gt;&amp;lt;&lt;/code&gt; or &lt;code&gt;&amp;gt;&lt;/code&gt; (for read and write, respectively) from the file name is now recommended as well. This is called &amp;#8220;the 3-arg open&amp;#8221; and should be used whenever possible.&lt;/p&gt;

&lt;p&gt;Checking to make sure that open succeeded is also recommended. The snippet above does this with the &lt;code&gt;or die ...&lt;/code&gt; conditional. Another simple way to accomplish this task is to &lt;code&gt;use autodie&lt;/code&gt; near the top of the script. Would you want your code to work on a file that didn&amp;#8217;t open correctly? I doubt it.&lt;/p&gt;

&lt;p&gt;A good tutorial should do, or at least mention, all of the previous concerns. If they lax on checking success on opening after mentioning it, this is probably acceptable (from a purely space-saving perspective). If not, move on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preach code reuse&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Perl is good at munging text, however, for all but simple cases, you might want to use standard modules when appropriate. A new user should probably know how to parse out a basic line of comma-separated text, and a tutorial can show you how to do it manually. That said, a very good tutorial will mention that this is very fragile and that you should, in practice use the Text::CSV module. Same goes for HTML, XML, JSON and other formats.&lt;/p&gt;

&lt;p&gt;Finally while code-reuse is a good idea, it can only as good as the code that is being reused. The CGI.pm module helped put Perl on the map, but its days are numbered. A tutorial that spends too much time on it is probably too old to trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While none of these guidelines is absolute, I think you the reader will find that most tutorials will usually fall into very good or very bad/old. Hopefully this helps you find those good Perl tutorials, and steer clear of the others.&lt;/p&gt;

&lt;p&gt;Gabor Szabo, himself the author of a new series of Perl tutorials, reminds me that there is a project aimed at screening and recommending tutorials. You might want to start your search for a modern tutorial there: &lt;a href="http://perl-tutorial.org/"&gt;Perl Tutorial Hub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To my fellow Perlers, you are encouraged to add to this list in the comments, as well as suggest some good tutorials. This post was made partially to be linked to posters on Stack Overflow and others when bad code from old tutorials shows up (you know what I mean).&lt;/p&gt;

        

    </content:encoded>
      <dcterms:modified>2012-02-05T00:50:32Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogs.perl.org,2012:/users/joel_berger//1022.2768</guid>
    </item>
    <item>
      <author>nobody@example.com (PerlSquirrel)</author>
      <dc:creator>nobody@example.com (PerlSquirrel)</dc:creator>
      <category>Corn</category>
      <link>http://perlsquirrel.blogspot.com/2012/02/mexican-corn.html</link>
      <description>This may not have much to do with Perl, but it is this Squirrel's
favorite food!

[IMAGE]

Mexican Corn


















Recipe can be found here.</description>
      <dc:date>2012-02-05T00:02:00Z</dc:date>
      <dc:subject>Corn</dc:subject>
      <title>Mexican Corn</title>
      <pubDate>Sun, 05 Feb 2012 00:02:00 -0000</pubDate>
      <content:encoded>This may not have much to do with Perl, but it is this Squirrel's favorite food!&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://1.bp.blogspot.com/-WggpQrmMojQ/Ty3IF3UklRI/AAAAAAAAAEw/HR5nZ2oG1k4/s1600/cornmexican.jpg" imageanchor="1"&gt;&lt;img src="http://1.bp.blogspot.com/-WggpQrmMojQ/Ty3IF3UklRI/AAAAAAAAAEw/HR5nZ2oG1k4/s320/cornmexican.jpg"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption"&gt;Mexican Corn&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.richardcooks.com/" target="_blank"&gt;Recipe can be found here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2012-02-05T00:02:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-240639029338918802.post-6665114998203396156</guid>
    </item>
    <item>
      <author>nobody@example.com (Gabor Szabo)</author>
      <dc:creator>nobody@example.com (Gabor Szabo)</dc:creator>
      <category>Perl, debugging</category>
      <link>http://szabgab.com/debugging-perl-scripts.html</link>
      <description> When I studied computer sciences in the university, we learned a lot on
how to write programs, but as far as I remember no one told us about
debugging. We heard about the nice world of creating new things, but no
one told us that most of the time we'll have to spend trying to
understand other people's code. It turns out that while we mostly cherish
writing the program, we spend a lot more try trying to understand what we
(or others) wrote, and why does it misbehave, than the time we spent
writing it in the first time.

For the full article visit Debugging Perl scripts</description>
      <dc:date>2012-02-04T22:05:06Z</dc:date>
      <dc:subject>Perl, debugging</dc:subject>
      <title>Debugging Perl scripts</title>
      <pubDate>Sat, 04 Feb 2012 22:05:06 -0000</pubDate>
      <content:encoded>
When I studied computer sciences in the university, we learned a lot on how to write programs,
but as far as I remember no one told us about debugging. We heard about the nice world of creating
new things, but no one told us that most of the time we'll have to spend trying to understand other
people's code.

It turns out that while we mostly cherish writing the program, we spend
a lot more try trying to understand what we (or others) wrote, and why does
it misbehave, than the time we spent writing it in the first time.


&lt;p&gt;For the full article visit &lt;a href="http://szabgab.com/debugging-perl-scripts.html"&gt;Debugging Perl scripts&lt;/a&gt;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2012-02-04T22:05:06Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://szabgab.com/debugging-perl-scripts.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Alberto Simões)</author>
      <dc:creator>nobody@example.com (Alberto Simões)</dc:creator>
      <category>Grants GP2012Q1</category>
      <link>http://news.perlfoundation.org/2012/02/2012q1-grant-proposals.html</link>
      <description>The Perl Foundation Grants Committee is proud to present three grant
proposals for community discussion. As in previous rounds, please comment
and clarify any issue about the grant in each grant post and not in this
post.

The submitted grants are:

  * Alien::Base - Base classes for Alien:: modules by Joel Berger

  * EPublisher Website by Boris Däppen

  * Easy installation of non-CPAN dependencies by Alexandr Ciornii

The Grants Committee expects to vote and have a result for Carnival!</description>
      <dc:date>2012-02-04T13:45:55Z</dc:date>
      <dc:subject>Grants GP2012Q1</dc:subject>
      <title>2012Q1 Grant Proposals</title>
      <pubDate>Sat, 04 Feb 2012 13:45:55 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;The Perl Foundation Grants Committee is proud to present three grant proposals for community discussion. As in previous rounds, please comment and clarify any issue about the grant in each grant post and not in this post.&lt;/p&gt;

&lt;p&gt;The submitted grants are:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;&lt;a href="http://news.perlfoundation.org/2012/02/2012q1-grant-proposal-alienbas.html"&gt;Alien::Base - Base classes for Alien:: modules&lt;/a&gt; by &lt;em&gt;Joel Berger&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://news.perlfoundation.org/2012/02/2012q1-grant-proposal-epublish.html"&gt;EPublisher Website&lt;/a&gt; by &lt;em&gt;Boris Däppen&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://news.perlfoundation.org/2012/02/2012q1-grant-proposal-easy-ins.html"&gt;Easy installation of non-CPAN dependencies&lt;/a&gt; by &lt;em&gt;Alexandr Ciornii&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The Grants Committee expects to vote and have a result for Carnival!&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2012-02-04T13:45:55Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:news.perlfoundation.org,2012://18.2962</guid>
    </item>
    <item>
      <author>nobody@example.com (Alberto Simões)</author>
      <dc:creator>nobody@example.com (Alberto Simões)</dc:creator>
      <category>Grants Perl Foundation GP2012Q1 grants</category>
      <link>http://news.perlfoundation.org/2012/02/2012q1-grant-proposal-alienbas.html</link>
      <description>Name: 

      Joel Berger

Email:

      [hidden email]

Amount Requested:

      $500


Synopsis
--------

Artur Bergman's documentation for the Alien namespace specifically says
that there is no framework for Alien:: modules, however, in writing the
Alien::GSL manpage I find that most of the code I am writing has nothing
to do with the GSL library and could as easily apply to many external
libraries. I intend for Alien::Base to comprise some base classes for
other Alien:: modules, including Alien::GSL.


Benefits to the Perl Community
------------------------------

Perl is great, CPAN is great, CPAN.pm and cpanminus are great, but if a
module depends on an external library that is not installed, none of
these can help. The Alien namespace has attempted to meet this demand by
providing installers for external libraries needed by CPAN modules.

Sadly, comparitively few libraries are provided. In my opinion this is
because writing the Alien module itself is too hard. With an Alien::Base
system in place, perhaps more libraries could be provided and Perl would
have an even larger base of available code to build from.


Deliverables
------------

A CPAN distribution named Alien::Base, comprised of at least the classes:

  * 

    Alien::Base - used as the base class for an Alien module (e.g.
    Alien::OtherLibrary), which is called by the dependent module (e.g.
    Something::Other::XS).

  * 

    Alien::Base::ModuleBuild - a the Module::Build manpage subclass which
    handles the actions of fetching, building and installing the library.

  * 

    Tests

  * 

    Documentation


Project Details
---------------

Alien::Base::ModuleBuild will be able to

  * 

    Query an FTP or HTTP server for a list of files

  * 

    Fetch a file (archive) from either type of server, based on a
    required or else newest version

  * 

    Extract the archive to a temporary directory

  * 

    Perform a series of system calls to configure, build and install the
    library (to a the File::ShareDir manpage type folder)

  * 

    Extract some information about the library and store it in a the
    Module::Build::ConfigData manpage storage module

Alien::Base will be able to

  * 

    Provide the information about the library's local installation

  * 

    Make the library available to a dependent module and/or its builder

The aim will be to allow much, if not all, of the subclass (i.e.
Alien::OtherLibrary) specifics to be set with parameters/properties just
like the Module::Build manpage installations, rather than by needing to
write extra methods to do any of the above-listed tasks. I envision that
the Build.PL for Alien::GSL could look like this (properties like alien_
are from Alien::Base):

 use strict;
 use warnings;

 use Alien::Base::ModuleBuild;

 my $builder = Alien::Base::ModuleBuild-&gt;new(
   module_name =&gt; 'Alien::GSL',
   dist_abstract =&gt; 'Easy installation of the GNU Scientific Library',
   license =&gt; 'perl',
   configure_requires =&gt; {
     'Alien::Base' =&gt; 0,
   },
   requires =&gt; {
     'perl' =&gt; '5.8.1',
     'Alien::Base' =&gt; 0,
   },
   dist_author =&gt; 'Joel A. Berger &lt;joel.a.berger@gmail.com&gt;',
   alien_name =&gt; 'gsl',
   alien_source_ftp =&gt; { 
     server  =&gt; 'ftp.gnu.org',
     folder  =&gt; '/gnu/gsl',
     pattern =&gt; qr/^gsl-([\d\.])+\.tar\.gz$/,
   },
 );
 $builder-&gt;create_build_script;

Initially I intend to focus on GNU libraries as they are fairly
consistent in their build process. This should allow Alien:: authors to
wrap this large and important set of libraries, employing only minimal
configuration. I intend to use this for the Alien::GSL manpage and
perhaps something like Alien::NCurses (i.e. a library I am not as
familiar with) if I feel so inclined.

Hopefully the process will be sufficiently configurable so as to allow
other non-GNU libraries to be wrapped easily. Certainly something
involved like the Alien::SDL manpage isn't a prime candidate for this
framework, but there are many smaller libraries which might benefit from
being wrapped in this manner.

After initial releases, I hope that the community will help to make
Alien::Base even more broadly applicable to more libraries.


Inch-stones
-----------

Each of the bullets under Project Details will serve as inch-stones.


Project Schedule
----------------

I have already begun working on Alien::Base; see it at
https://github.com/jberger/Alien-Base. Development shouldn't take too
long; I imagine only a few total weeks work should do the trick.
Unfortunately my time cannot be given completely to this task since I am
also currently working on my thesis (see Bio). Therefore, I propose that
my project be 3-4 months (calendar) duration. Hopefully I will not need
all that time. Also I have been trying to include tests as I code
(countering a usual fault of mine) which is taking longer. This grant
will help me to focus on this project for a shorter burst of development
to completion, rather than working on it here and there as able.


Completeness Criteria
---------------------

Distribution released to CPAN, complete with a decent test suite and
documentation. Further convert the Alien::GSL manpage to the Alien::Base
framework, giving an in-the-wild example for others to follow.


Bio
---

I am a Physics Ph.D. candidate at the University of Illinois at Chicago.
I am writing a large simulation, a major part of my thesis, which uses
Perl and my the Math::GSLx::ODEIV2 manpage module. This in turn requires
version 1.15 of the GNU Scientific Library (GSL). I want my committee to
be able to try out the simulation on their own; I have worked hard to
make sure that it has a nice API, but certainly I cannot install it for
each of them on their computers. Unfortunately, very few Linux distros
come with this newest version of GSL (although this is always improving)
and Windows users certainly will not have it.

My goal is to be able to have my committee members install Perl
(Strawberry presumably on Windows) and my simulation module, which
depends on the Math::GSLx::ODEIV2 manpage and therefore the Alien::GSL
manpage (which would now depend on the Alien::Base manpage). From their
perspective, I want it to be a totally transparent installation.

Since I have already made this effort, I would like it if my work on
Alien::GSL could be used to make the task of writing other Alien::
modules easier for other authors.</description>
      <dc:date>2012-02-04T13:42:38Z</dc:date>
      <dc:subject>Grants Perl Foundation GP2012Q1 grants</dc:subject>
      <title>2012Q1 Grant Proposal: Alien::Base - Base classes for Alien:: modules</title>
      <pubDate>Sat, 04 Feb 2012 13:42:38 -0000</pubDate>
      <content:encoded>
        &lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;Joel Berger&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Email:&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;[hidden email]&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Amount Requested:&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;$500&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Synopsis&lt;/h2&gt;
&lt;p&gt;Artur Bergman's documentation for the &lt;em&gt;Alien&lt;/em&gt; namespace specifically says that there is no framework for Alien:: modules, however, in writing &lt;a href="/Alien/GSL.html"&gt;the Alien::GSL manpage&lt;/a&gt; I find that most of the code I am writing has nothing to do with the &lt;em&gt;GSL&lt;/em&gt; library and could as easily apply to many external libraries. I intend for Alien::Base to comprise some base classes for other Alien:: modules, including Alien::GSL.&lt;/p&gt;
        
&lt;h2&gt;Benefits to the Perl Community&lt;/h2&gt;
&lt;p&gt;Perl is great, CPAN is great, CPAN.pm and cpanminus are great, but if a module depends on an external library that is not installed, none of these can help. The Alien namespace has attempted to meet this demand by providing installers for external libraries needed by CPAN modules.&lt;/p&gt;
&lt;p&gt;Sadly, comparitively few libraries are provided. In my opinion this is because writing the Alien module itself is too hard. With an Alien::Base system in place, perhaps more libraries could be provided and Perl would have an even larger base of available code to build from.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Deliverables&lt;/h2&gt;
&lt;p&gt;A CPAN distribution named Alien::Base, comprised of at least the classes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Alien::Base - used as the base class for an Alien module (e.g. Alien::OtherLibrary), which is called by the dependent module (e.g. Something::Other::XS).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alien::Base::ModuleBuild - a &lt;a href="/Module/Build.html"&gt;the Module::Build manpage&lt;/a&gt; subclass which handles the actions of fetching, building and installing the library.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Project Details&lt;/h2&gt;
&lt;p&gt;Alien::Base::ModuleBuild will be able to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Query an FTP or HTTP server for a list of files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fetch a file (archive) from either type of server, based on a required or else newest version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extract the archive to a temporary directory&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Perform a series of system calls to configure, build and install the library (to a &lt;a href="/File/ShareDir.html"&gt;the File::ShareDir manpage&lt;/a&gt; type folder)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extract some information about the library and store it in a &lt;a href="/Module/Build/ConfigData.html"&gt;the Module::Build::ConfigData manpage&lt;/a&gt; storage module&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alien::Base will be able to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Provide the information about the library's local installation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make the library available to a dependent module and/or its builder&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The aim will be to allow much, if not all, of the subclass (i.e. Alien::OtherLibrary) specifics to be set with parameters/properties just like &lt;a href="/Module/Build.html"&gt;the Module::Build manpage&lt;/a&gt; installations, rather than by needing to write extra methods to do any of the above-listed tasks. I envision that the Build.PL for Alien::GSL could look like this (properties like &lt;code&gt;alien_&lt;/code&gt; are from Alien::Base):&lt;/p&gt;
&lt;pre&gt;
 use strict;
 use warnings;&lt;/pre&gt;
&lt;pre&gt;
 use Alien::Base::ModuleBuild;&lt;/pre&gt;
&lt;pre&gt;
 my $builder = Alien::Base::ModuleBuild-&amp;gt;new(
   module_name =&amp;gt; 'Alien::GSL',
   dist_abstract =&amp;gt; 'Easy installation of the GNU Scientific Library',
   license =&amp;gt; 'perl',
   configure_requires =&amp;gt; {
     'Alien::Base' =&amp;gt; 0,
   },
   requires =&amp;gt; {
     'perl' =&amp;gt; '5.8.1',
     'Alien::Base' =&amp;gt; 0,
   },
   dist_author =&amp;gt; 'Joel A. Berger &amp;lt;joel.a.berger@gmail.com&amp;gt;',
   alien_name =&amp;gt; 'gsl',
   alien_source_ftp =&amp;gt; { 
     server  =&amp;gt; 'ftp.gnu.org',
     folder  =&amp;gt; '/gnu/gsl',
     pattern =&amp;gt; qr/^gsl-([\d\.])+\.tar\.gz$/,
   },
 );
 $builder-&amp;gt;create_build_script;&lt;/pre&gt;
&lt;p&gt;Initially I intend to focus on GNU libraries as they are fairly consistent in their build process. This should allow Alien:: authors to wrap this large and important set of libraries, employing only minimal configuration. I intend to use this for &lt;a href="/Alien/GSL.html"&gt;the Alien::GSL manpage&lt;/a&gt; and perhaps something like Alien::NCurses (i.e. a library I am not as familiar with) if I feel so inclined.&lt;/p&gt;
&lt;p&gt;Hopefully the process will be sufficiently configurable so as to allow other non-GNU libraries to be wrapped easily. Certainly something involved like &lt;a href="/Alien/SDL.html"&gt;the Alien::SDL manpage&lt;/a&gt; isn't a prime candidate for this framework, but there are many smaller libraries which might benefit from being wrapped in this manner.&lt;/p&gt;
&lt;p&gt;After initial releases, I hope that the community will help to make Alien::Base even more broadly applicable to more libraries.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Inch-stones&lt;/h2&gt;
&lt;p&gt;Each of the bullets under &lt;a href="#project_details"&gt;Project Details&lt;/a&gt; will serve as inch-stones.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Project Schedule&lt;/h2&gt;
&lt;p&gt;I have already begun working on Alien::Base; see it at &lt;a href="https://github.com/jberger/Alien-Base"&gt;https://github.com/jberger/Alien-Base&lt;/a&gt;. Development shouldn't take too long; I imagine only a few total weeks work should do the trick. Unfortunately my time cannot be given completely to this task since I am also currently working on my thesis (see &lt;a href="#bio"&gt;Bio&lt;/a&gt;). Therefore, I propose that my project be 3-4 months (calendar) duration. Hopefully I will not need all that time. Also I have been trying to include tests as I code (countering a usual fault of mine) which is taking longer. This grant will help me to focus on this project for a shorter burst of development to completion, rather than working on it here and there as able.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Completeness Criteria&lt;/h2&gt;
&lt;p&gt;Distribution released to CPAN, complete with a decent test suite and documentation. Further convert &lt;a href="/Alien/GSL.html"&gt;the Alien::GSL manpage&lt;/a&gt; to the Alien::Base framework, giving an in-the-wild example for others to follow.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Bio&lt;/h2&gt;
&lt;p&gt;I am a Physics Ph.D. candidate at the University of Illinois at Chicago. I am writing a large simulation, a major part of my thesis, which uses Perl and my &lt;a href="/Math/GSLx/ODEIV2.html"&gt;the Math::GSLx::ODEIV2 manpage&lt;/a&gt; module. This in turn requires version 1.15 of the GNU Scientific Library (GSL). I want my committee to be able to try out the simulation on their own; I have worked hard to make sure that it has a nice API, but certainly I cannot install it for each of them on their computers. Unfortunately, very few Linux distros come with this newest version of GSL (although this is always improving) and Windows users certainly will not have it.&lt;/p&gt;
&lt;p&gt;My goal is to be able to have my committee members install Perl (Strawberry presumably on Windows) and my simulation module, which depends on &lt;a href="/Math/GSLx/ODEIV2.html"&gt;the Math::GSLx::ODEIV2 manpage&lt;/a&gt; and therefore &lt;a href="/Alien/GSL.html"&gt;the Alien::GSL manpage&lt;/a&gt; (which would now depend on &lt;a href="/Alien/Base.html"&gt;the Alien::Base manpage&lt;/a&gt;). From their perspective, I want it to be a totally transparent installation.&lt;/p&gt;
&lt;p&gt;Since I have already made this effort, I would like it if my work on Alien::GSL could be used to make the task of writing other Alien:: modules easier for other authors.&lt;/p&gt;


    </content:encoded>
      <dcterms:modified>2012-02-04T13:42:38Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:news.perlfoundation.org,2012://18.2960</guid>
    </item>
    <item>
      <author>nobody@example.com (Alberto Simões)</author>
      <dc:creator>nobody@example.com (Alberto Simões)</dc:creator>
      <category>Grants Perl Foundation GP2012Q1 grants</category>
      <link>http://news.perlfoundation.org/2012/02/2012q1-grant-proposal-epublish.html</link>
      <description>      Boris Däppen

Email:

      [hidden email]

Amount Requested:

      800$


Synopsis
--------

Develop and deploy a website which offers the service of rendering
different content into eBooks. There will be several input and output
formats supported by the website. An explicit input option will be CPAN
documentation. POD in general will be an input option. Output options
will be eBook formats. The open EPUB but also Amazons MOBI format will be
implemented.

The framework used by the website will offer a plugin architecture, so
that other input or output formats can be developed and published on
CPAN.


Benefits to the Perl Community
------------------------------

Perl developers will benefit from a webservice, which allows them to
receive CPAN documentation or other POD content as eBooks. They will also
profit from several deliverables which will be published as Perl code in
CPAN.


Deliverables
------------

  * Develop and publish a module (e.g. EBook::MOBI) which offers a simple
    Perl interface to create eBooks in the MOBI format (which is used by
    Amazons Kindle).

  * Maintain and debug the framework EPhublisher (published by RENEEB on
    CPAN), including writing plugins for the architecture, which allows
    simple transformation between different document formats.

  * Develop and run a website, which offers a simple user-interface, to
    receive different content a an eBook.


Project Details
---------------


CPAN module for the MOBI format

The first deliverable will be a module (e.g. EBook::MOBI) released to
CPAN. This module will allow Perl developers to write MOBI eBooks, using
an object orjented interface in Perl. The Module will borrow some code
from the project MobiPerl (which is not located on CPAN, it can be found
here: https://dev.mobileread.com/trac/mobiperl). MobiPerl is GPL3 and the
developer is fine with it being used (See forum thread:
http://www.mobileread.com/forums/showthread.php.


Maintaining Framework

The framework EPublisher from Renée Bäcker will be used for this purpose.
The author supports me in debugging the module and in writing input and
output plugins for it.


Developing Website

The website will be developed using Mojolicious. It will have a simple
user interface (e.g. similar to https://metacpan.org/).


Offering the Webservice

The website will be offered by http://perl-services.de/, so that e.g.
Perl programmers can use it as a free service.


Inch-stones
-----------

I will work about 10 hours per week on this project, so it will take much
longer than a week for sure.

The first deliverable will be the module for creating MOBI formats. This
module will be available on CPAN at least in february 2012.

Writing plugins and some debuging work on the publishing framework will
probably find a useful result in march 2012.

The development of the website will take some time, because I have to
work myself into Mojolicious. I hope the code will be ready for use at
end of march.

So my inch-stones are:

  1. Release CPAN module (something like EBook::MOBI)

  2. Bugfixing of publishing framework from Renée Bäcker.

  3. Writing plugins (input: CPAN, POD / output: EPUB, MOBI (PDF)).

  4. Coding the website.

  5. Taking the webservice online.


Project Schedule
----------------

I can start immediately. The webservice should be ready for users in May
2012. Perl developers can profit from some deliverables (e.g.
EBook::MOBI) already in February 2012.


Completeness Criteria
---------------------

  * CPAN module for writing eBooks in the MOBI format.

  * Plugins (input: CPAN, POD / output: EPUB, MOBI) for Renées framework.

  * Website online.


Bio
---

I successfully finished a bachelor level degree in IT at an university of
applied science in Zurich, Switzerland in 2006. I learned my first Perl
at a IT-service company, located in Zurich, after my studies. Since 2010
I am studying a masters in philosophy of technology in Darmstadt,
Germany. In my spare time I am programming Perl for a small Perl-company
(perl-services.de)

I enjoy programming Perl since several years, and the fun continues until
today. I also have excellent support in this project from Renée, so
progress is assured.</description>
      <dc:date>2012-02-04T13:36:35Z</dc:date>
      <dc:subject>Grants Perl Foundation GP2012Q1 grants</dc:subject>
      <title>2012Q1 Grant Proposal: EPublisher Website</title>
      <pubDate>Sat, 04 Feb 2012 13:36:35 -0000</pubDate>
      <content:encoded>
        
&lt;dd&gt;
&lt;p&gt;Boris Däppen&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Email:&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;[hidden email]&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Amount Requested:&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;800$&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Synopsis&lt;/h2&gt;
&lt;p&gt;Develop and deploy a website which offers the service of rendering different content into eBooks.
There will be several input and output formats supported by the website.
An explicit input option will be CPAN documentation.
POD in general will be an input option.
Output options will be eBook formats.
The open EPUB but also Amazons MOBI format will be implemented.&lt;/p&gt;
&lt;p&gt;The framework used by the website will offer a plugin architecture, so that other input or output formats can be developed and published on CPAN.&lt;/p&gt;
        &lt;h2&gt;Benefits to the Perl Community&lt;/h2&gt;
&lt;p&gt;Perl developers will benefit from a webservice, which allows them to receive CPAN documentation or other POD content as eBooks.
They will also profit from several deliverables which will be published as Perl code in CPAN.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Deliverables&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Develop and publish a module (e.g. EBook::MOBI) which offers a simple Perl interface to create eBooks in the MOBI format (which is used by Amazons Kindle).&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a name="ephublisher" class="item"&gt;Maintain and debug the framework &lt;a href="#ephublisher"&gt;EPhublisher&lt;/a&gt; (published by RENEEB on CPAN), including writing plugins for the architecture, which allows simple transformation between different document formats.&lt;/a&gt;&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Develop and run a website, which offers a simple user-interface, to receive different content a an eBook.&lt;/strong&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Project Details&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;CPAN module for the MOBI format&lt;/h3&gt;
&lt;p&gt;The first deliverable will be a module (e.g. EBook::MOBI) released to CPAN.
This module will allow Perl developers to write MOBI eBooks, using an object orjented interface in Perl.
The Module will borrow some code from the project MobiPerl (which is not located on CPAN, it can be found here: &lt;a href="https://dev.mobileread.com/trac/mobiperl"&gt;https://dev.mobileread.com/trac/mobiperl&lt;/a&gt;).
MobiPerl is GPL3 and the developer is fine with it being used (See forum thread: &lt;a href="http://www.mobileread.com/forums/showthread.php?p=1920805#post1920805"&gt;http://www.mobileread.com/forums/showthread.php&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;Maintaining Framework&lt;/h3&gt;
&lt;p&gt;The framework &lt;em&gt;EPublisher&lt;/em&gt; from Renée Bäcker will be used for this purpose.
The author supports me in debugging the module and in writing input and output plugins for it.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;Developing Website&lt;/h3&gt;
&lt;p&gt;The website will be developed using Mojolicious.
It will have a simple user interface (e.g. similar to &lt;a href="https://metacpan.org/"&gt;https://metacpan.org/&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h3&gt;Offering the Webservice&lt;/h3&gt;
&lt;p&gt;The website will be offered by &lt;a href="http://perl-services.de/"&gt;http://perl-services.de/&lt;/a&gt;, so that e.g. Perl programmers can use it as a free service.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Inch-stones&lt;/h2&gt;
&lt;p&gt;I will work about 10 hours per week on this project, so it will take much longer than a week for sure.&lt;/p&gt;
&lt;p&gt;The first deliverable will be the module for creating MOBI formats.
This module will be available on CPAN at least in february 2012.&lt;/p&gt;
&lt;p&gt;Writing plugins and some debuging work on the publishing framework will probably find a useful result in march 2012.&lt;/p&gt;
&lt;p&gt;The development of the website will take some time, because I have to work myself into Mojolicious. I hope the code will be ready for use at end of march.&lt;/p&gt;
&lt;p&gt;So my inch-stones are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Release CPAN module (something like EBook::MOBI)&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bugfixing of publishing framework from Renée Bäcker.&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Writing plugins (input: CPAN, POD / output: EPUB, MOBI (PDF)).&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coding the website.&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Taking the webservice online.&lt;/strong&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Project Schedule&lt;/h2&gt;
&lt;p&gt;I can start immediately.
The webservice should be ready for users in May 2012.
Perl developers can profit from some deliverables (e.g. EBook::MOBI) already in February 2012.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Completeness Criteria&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPAN module for writing eBooks in the MOBI format.&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugins (input: CPAN, POD / output: EPUB, MOBI) for Renées framework.&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Website online.&lt;/strong&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Bio&lt;/h2&gt;
&lt;p&gt;I successfully finished a bachelor level degree in IT at an university of applied science in Zurich, Switzerland in 2006.
I learned my first Perl at a IT-service company, located in Zurich, after my studies.
Since 2010 I am studying a masters in philosophy of technology in Darmstadt, Germany.
In my spare time I am programming Perl for a small Perl-company (perl-services.de)&lt;/p&gt;
&lt;p&gt;I enjoy programming Perl since several years, and the fun continues until today.
I also have excellent support in this project from Renée, so progress is assured.&lt;/p&gt;


    </content:encoded>
      <dcterms:modified>2012-02-04T13:36:35Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:news.perlfoundation.org,2012://18.2958</guid>
    </item>
    <item>
      <author>nobody@example.com (Alberto Simões)</author>
      <dc:creator>nobody@example.com (Alberto Simões)</dc:creator>
      <category>Grants Perl Foundation GP2012Q1</category>
      <link>http://news.perlfoundation.org/2012/02/2012q1-grant-proposal-easy-ins.html</link>
      <description>Name: 

      Alexandr Ciornii (CHORNY)

Email:

      [hidden email]

Amount Requested:

      $2000


Synopsis
--------

Many CPAN modules depend on non-CPAN libraries (or programs).
Installation of such module requires that library be installed before
installing CPAN module. For beginners it is more confusing as library may
be installed, but its headers may not. I'd like to automate this step and
install corresponding Linux package as part of module install.

Currently main module of this project has codename CPAN::non, it will be
renamed later after discussion in module-authors mailing list.


Benefits to the Perl Community
------------------------------

  * 

    For any user installing CPAN modules, as it will become much simpler.
    It is especially important when installing many modules or in case of
    inexpirienced user.

  * 

    Module authors, because module installation will become easier and
    they would not need to periodically explain that users need to
    install non-CPAN library.

  * 

    CPAN/OS porters, because dependencies will be listed more clearly, in
    future it may be also automated.

  * 

    Package tools like Shipwright or carton can use CPAN::non to install
    OS packages.


Deliverables (to CPAN)
----------------------

New version of Linux::Distribution. XML::Parser will automatically
install expat (of course if user agrees). Module for yum interaction.
CPAN::non and Module::Install plugin will be released.


Project Details
---------------

CPAN modules that want to get rid of this problem usually bundle
libraries either directly or as Alien:: CPAN distributions. This creates
several problems:

More work for authors and OS package maintainers

Duplication

Necessity to update library if serious problem is found

Necessity to replicate additional patches for every OS

But it is easy to install such dependency with OS tools. CPAN module will
have configuration file that will specify build and runtime dependencies.
CPAN::non will be bundled with module, or installed using
configure_requires in META.yml/json. In future OS vendors may include it
into their versions of Perl.

CPAN::non will detect version of Linux, check if dependency and its
headers are installed, find out which name has dependency and headers on
this OS from configuration file, install it.

For yum there is no module CPAN, I plan to write module for it. Also
there is no general module that would be dist-neutral, so I will write it
too.

Module::Install plugin will be convenient as Module::Install allows
automating bundling of run-time dependencies.

XML::Parser will be used as a first test for CPAN::non as I have comaint
rights for it.


Inch-stones
-----------

  1. Improve tests and release new version of Linux::Distribution.

  2. Test Linux::APT. Write/submit patches if necessary.

  3. Install CentOS and Fedora. Write a module for yum interaction

  4. Write and test an OS-independent module for software package
    installation (apt and yum)

  5. CPAN::non - prototype

  6. CPAN::non - write code

  7. CPAN::non - test

  8. CPAN::non - documentation

  9. Use it in XML::Parser for expat

  10. Module::Install plugin

  11. Blog about it, help CPAN authors use it, improve main module if
    necessary


Project Schedule
----------------

The project will take 2-3 months. I will start right after grant
approval.


Completeness Criteria
---------------------

  * 

    New versions of Linux::Distribution and XML::Parser.

  * 

    CPAN::non, Module::Install plugin and module for yum released.


Future
------

This project is a working solution, but after it will be adopted, more
interesting things may be implemented, like support for FreeBSD, even
Windows, support in tools for OS package generation, etc.


Bio
---

I maintain many CPAN modules and fixed bugs in many more. Participated in
such projects as Strawberry Perl, Padre, ExtUtils::MakeMaker and others.
Contributed to Module::Install. My CPAN account:
http://search.cpan.org/~chorny/ and Ohloh:
https://www.ohloh.net/accounts/chorny/positions.

For 9 years I was a lead programmer of credit card payment system
InterCardPro. Currently work for kariera.md.</description>
      <dc:date>2012-02-04T13:31:28Z</dc:date>
      <dc:subject>Grants Perl Foundation GP2012Q1</dc:subject>
      <title>2012Q1 Grant Proposal: Easy installation of non-CPAN dependencies</title>
      <pubDate>Sat, 04 Feb 2012 13:31:28 -0000</pubDate>
      <content:encoded>
        &lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;Alexandr Ciornii (CHORNY)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Email:&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;[hidden email]&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Amount Requested:&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;$2000&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Synopsis&lt;/h2&gt;
&lt;p&gt;Many CPAN modules depend on non-CPAN libraries (or programs). Installation of such module requires
that library be installed before installing CPAN module. For beginners it is more confusing
as library may be installed, but its headers may not. I'd like to automate this step and install
corresponding Linux package as part of module install.&lt;/p&gt;
&lt;p&gt;Currently main module of this project has codename CPAN::non, it will be renamed later after discussion in
module-authors mailing list.&lt;/p&gt;

        &lt;h2&gt;Benefits to the Perl Community&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For any user installing CPAN modules, as it will become much simpler.
It is especially important when installing many modules or in case of inexpirienced user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Module authors, because module installation will become easier and they
would not need to periodically explain that users need to install non-CPAN library.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CPAN/OS porters, because dependencies will be listed more clearly,
in future it may be also automated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Package tools like Shipwright or carton can use CPAN::non to install OS packages.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Deliverables (to CPAN)&lt;/h2&gt;
&lt;p&gt;New version of Linux::Distribution. XML::Parser will automatically install expat
(of course if user agrees). Module for yum interaction.
CPAN::non and Module::Install plugin will be released.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Project Details&lt;/h2&gt;
&lt;p&gt;CPAN modules that want to get rid of this problem usually bundle libraries either
directly or as Alien:: CPAN distributions. This creates several problems:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;More work for authors and OS package maintainers&lt;/strong&gt;&lt;/dt&gt;

&lt;dt&gt;&lt;strong&gt;Duplication&lt;/strong&gt;&lt;/dt&gt;

&lt;dt&gt;&lt;strong&gt;Necessity to update library if serious problem is found&lt;/strong&gt;&lt;/dt&gt;

&lt;dt&gt;&lt;strong&gt;Necessity to replicate additional patches for every OS&lt;/strong&gt;&lt;/dt&gt;

&lt;/dl&gt;
&lt;p&gt;But it is easy to install such dependency with OS tools. CPAN module will have configuration file
that will specify build and runtime dependencies. CPAN::non will be bundled with module, or
installed using configure_requires in META.yml/json. In future OS vendors may include it into their
versions of Perl.&lt;/p&gt;
&lt;p&gt;CPAN::non will detect version of Linux, check if dependency and its headers are installed,
find out which name has dependency and headers on this OS from configuration file, install it.&lt;/p&gt;
&lt;p&gt;For yum there is no module CPAN, I plan to write module for it. Also there is no general module
that would be dist-neutral, so I will write it too.&lt;/p&gt;
&lt;p&gt;Module::Install plugin will be convenient as Module::Install allows automating bundling of run-time
dependencies.&lt;/p&gt;
&lt;p&gt;XML::Parser will be used as a first test for CPAN::non as I have comaint rights for it.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Inch-stones&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Improve tests and release new version of Linux::Distribution.&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test Linux::APT. Write/submit patches if necessary.&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install CentOS and Fedora. Write a module for yum interaction&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write and test an OS-independent module for software package installation (apt and yum)&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPAN::non - prototype&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPAN::non - write code&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPAN::non - test&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPAN::non - documentation&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use it in XML::Parser for expat&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Module::Install plugin&lt;/strong&gt;

&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blog about it, help CPAN authors use it, improve main module if necessary&lt;/strong&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Project Schedule&lt;/h2&gt;
&lt;p&gt;The project will take 2-3 months. I will start right after grant approval.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Completeness Criteria&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;New versions of Linux::Distribution and XML::Parser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CPAN::non, Module::Install plugin and module for yum released.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Future&lt;/h2&gt;
&lt;p&gt;This project is a working solution, but after it will be adopted, more interesting
things may be implemented, like support for FreeBSD, even Windows, support in tools for
OS package generation, etc.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;Bio&lt;/h2&gt;
&lt;p&gt;I maintain many CPAN modules and fixed bugs in many more. Participated in
such projects as Strawberry Perl, Padre, ExtUtils::MakeMaker and others.
Contributed to Module::Install.
My CPAN account: &lt;a href="http://search.cpan.org/~chorny/"&gt;http://search.cpan.org/~chorny/&lt;/a&gt; and Ohloh:
&lt;a href="https://www.ohloh.net/accounts/chorny/positions"&gt;https://www.ohloh.net/accounts/chorny/positions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For 9 years I was a lead programmer of credit card payment system InterCardPro.
Currently work for kariera.md.&lt;/p&gt;

    </content:encoded>
      <dcterms:modified>2012-02-04T13:31:28Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:news.perlfoundation.org,2012://18.2956</guid>
    </item>
    <item>
      <author>nobody@example.com (Laufeyjarson)</author>
      <dc:creator>nobody@example.com (Laufeyjarson)</dc:creator>
      <category>Perl perl perforce</category>
      <link>http://blog.laufeyjarson.com/2012/02/perforce-auth-check-trigger-for-unix-passwd-file/</link>
      <description>I just installed Perforce (what a hassle!) and discovered that it won’t
authenticate to the local Unix accounts out of the box. The nice folks at
Perforce let you call an external trigger, and provide a complex sample
that will handle talking to Active Directory, but don’t have one do
handle ordinary Unix passwd access.

Totally annoying. A simple Perl script fixed it. Don’t know why they
didn’t put it in their samples, though.

#!/usr/bin/perl

use strict;
use warnings;

=head1 NAME p4_check_passwd

Called with the user name on the command line and the password on standard
input, this program returns a success or failure depending on that password's
correctness.

Uses getpwnam to do so, and must run as root on in shadow group to access
/etc/shadow and password data.

This should be configured in p4 triggers as an auth-check trigger:

Triggers:
unixpw auth-check auth "/home/perforce/bin/p4_check_passwd.pl %user%"

This uses the crypt system call, which should handle any variants of encryption
in your password file. It also uses the getpwnam() function to access
the password data, so should be able to access data from NIS or other
configured password system.

=cut

# Perforce wants all messages on stdout. Guarantee that.
open(STDERR, "&gt;&amp;STDOUT") or die "Can't redirect to stdout\n";

# Get the user name
my $username = shift;
die "Need user name on command line\n" unless $username;

# Get the password
my $password = &lt;STDIN&gt;;
chomp $password;

# Get username and password from the system
my ($name, $passwd) = getpwnam($username);

die "Can't log in as $username\n" unless ($name and $username eq $name);
die "Can't access encrypted passwords\n" if(not defined $passwd or $passwd eq ''
or $passwd eq 'x');

# Check password and return correct exit code or die.
if(crypt($password, $passwd) eq $passwd) {
        exit 0; # Silent, successful exit worked!
} else {
        die "Can't log in as $username\n";
}

Works for me, anyway.</description>
      <dc:date>2012-02-04T04:56:04Z</dc:date>
      <dc:subject>Perl perl perforce</dc:subject>
      <title>Perforce auth-check trigger for Unix passwd file</title>
      <pubDate>Sat, 04 Feb 2012 04:56:04 -0000</pubDate>
      <content:encoded>&lt;p&gt;I just installed Perforce (what a hassle!) and discovered that it won&amp;#8217;t authenticate to the local Unix accounts out of the box.  The nice folks at Perforce let you call an external trigger, and provide a complex sample that will handle talking to Active Directory, but don&amp;#8217;t have one do handle ordinary Unix passwd access.&lt;span id="more-152"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Totally annoying.  A simple Perl script fixed it.  Don&amp;#8217;t know why they didn&amp;#8217;t put it in their samples, though.&lt;/p&gt;
&lt;pre&gt;#!/usr/bin/perl

use strict;
use warnings;

=head1 NAME p4_check_passwd

Called with the user name on the command line and the password on standard
input, this program returns a success or failure depending on that password's
correctness.

Uses getpwnam to do so, and must run as root on in shadow group to access
/etc/shadow and password data.

This should be configured in p4 triggers as an auth-check trigger:

Triggers:
unixpw auth-check auth "/home/perforce/bin/p4_check_passwd.pl %user%"

This uses the crypt system call, which should handle any variants of encryption
in your password file. It also uses the getpwnam() function to access
the password data, so should be able to access data from NIS or other
configured password system.

=cut

# Perforce wants all messages on stdout. Guarantee that.
open(STDERR, "&amp;gt;&amp;amp;STDOUT") or die "Can't redirect to stdout\n";

# Get the user name
my $username = shift;
die "Need user name on command line\n" unless $username;

# Get the password
my $password = &amp;lt;STDIN&amp;gt;;
chomp $password;

# Get username and password from the system
my ($name, $passwd) = getpwnam($username);

die "Can't log in as $username\n" unless ($name and $username eq $name);
die "Can't access encrypted passwords\n" if(not defined $passwd or $passwd eq ''
or $passwd eq 'x');

# Check password and return correct exit code or die.
if(crypt($password, $passwd) eq $passwd) {
	exit 0; # Silent, successful exit worked!
} else {
	die "Can't log in as $username\n";
}&lt;/pre&gt;
&lt;p&gt;Works for me, anyway.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2012-02-04T04:56:04Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://blog.laufeyjarson.com/?p=152</guid>
    </item>
    <item>
      <author>nobody@example.com (Michael G Schwern)</author>
      <dc:creator>nobody@example.com (Michael G Schwern)</dc:creator>
      <link>http://blogs.perl.org/users/michael_g_schwern/2012/02/a-real-developer-challenge.html</link>
      <description>Spotify is having a coding challenge to find "top-notch talent to join
our NYC team". The challenge is to solve the most algorithmic puzzles in
four hours... alone. "You may not cooperate with anyone, and you may not
publish any discussion of solutions." What sort of developer will win
this competition? Someone who is quick, dirty, has a mathematical mindset
and lucky enough to write something that happens to work for the test
data set. The "rockstar". Is this somebody you want on your team? Would
you want to maintain their code?

Last year while on contract, the company in question was passing around
their coding problem they used to test new hires. It was pretty typical
stuff: give the data going in, the data they want out, and write a little
program to do the transform. They even supplied most of the program,
including a test; the prospective hire just needed to write one sort
subroutine which could deal with "Low", "Medium" and "High" as well as
numbers.

Predictably, this halted all coding in the office for a solid half day
while everyone figured out the most clever way to sort the data. My opus
was to observe that the input data was already sorted, so I redefined the
shuffle() routine. The best one was from a co-worker who observed that
"Low", "Medium" and "High" sort correctly by their last letter in reverse
order. It was fun for us, but it wasn't very useful.

This is a pretty typical coding problem used to judge potential hires,
and it sucks. All it tells you is the candidate is not completely
incompetent. Why do we keep using them? They're easy. They're easy to
think up, easy to judge and easy to administer. They're also the sort of
clean, algorithmic problems a stereotypical programmer loves to solve. Do
they have anything to do with detecting a good developer? No. Can we fix
it? Yes!

Before this can be fixed, first we have to work out what a project wants
in a developer. What do developers do all day? We can work this out by
reversing every contrived element of our typical programming contest:
clean, well defined inputs; clean, well defined expected output; a clear
description of the algorithm; pre-existing template code; pre-existing
acceptance tests. When's the last time you were handed a problem like
that in the real world?

Instead, we get poorly defined inputs, sample input that has anything to
do with reality being a luxury, inputs riddled with mistakes. Expected
behavior and output are vaguely defined. As a developer we're presented
with a clean sheet, no template, no tests, just a blinking cursor and a
blank page.

How does one solve the contrived example? First the specification, inputs
and outputs are carefully examined. If there's any ambiguity it's
discussed up front with the person who probably wrote the problem and
understands it perfectly. Then the candidate goes off and writes some
code until it passes the tests. There is little or no interaction with
people, everything is handed on a silver platter in unambiguous terms.

How does one solve the real example? First you have to find somebody who
understands the problem, usually not a programmer, and discuss the
problem. Then you drag some samples out of them, converting them into a
format you can actually use. The user probably doesn't know what they
really want, so the behavior/output will be ill defined. Pressed, the
user will make up something that you know will be wrong as soon as you
show it to them. Armed with this "information" you hammer it into some
sort of algorithm and now need to write some code.

But you don't just hammer out a script. You need to do it in a way that
matches the team's coding style. You'll probably want to make the meat of
it reusable, so you need to write it as a library not just a one-off
script. It'll have to deal with the inevitable bad input, which means
good error handling and recovery. Other people will have to use it, which
means good documentation. It needs tests written in a way which works
with whatever integration server the team is using. And, of course, it
should all be checked into version control with well defined and logged
commits.

And then, when you've written all that and got it working, you take it
back to the user and they tell you it's not what they wanted. Or they
show you some new input that doesn't match what they originally said. If
you're good... and lucky, your code is robust enough to handle it. If
you're not... back to coding with you! Repeat until dead.

In that light, a good developer is one who works well with others, but
also can make a multitude of small, detailed decisions about a problem
they know very little about. They need to take vague requirements and
work with a user to turn them into something a computer can do
repeatedly. A good developer looks beyond the immediate requirements and
thinks ahead ensuring the code is flexible enough to withstand future
change. A good developer writes code not for themselves, but for everyone
else on the team.

So... how do you test all that? And in less than an hour? Turns out it's
pretty easy with some simple modifications to the classic example. You
keep the same basic algorithmic problem, but you give it to the candidate
the way a user would. It can be as simple as this:

  Could you sort this data please? [Excel document attached]

You can be a bit more clever, feeding the candidate what seems like
enough information to do the work but is full of subtle ambiguities,
tempting them to take the easy route and just get to coding, weeding out
those with the undesirable tendency to program without questioning what
they're doing and why, but that's the crux of it.

Now sit back and see what the candidate does with that. Respond to their
questions, but remain in the persona of a user. What you're looking for
here is how they push back. What sort of questions to do they ask to
gather and clarify the requirements? What sort of assumptions do they
make? How well do they bridge the communications gap between customer and
programmer?

Given a blank page to code on, what do they do with that? Do they write
tests and documentation? Do they write a quick script or a library? Do
they use version control? Do they ask about your code standards? Do they
use pre-existing libraries? Do they write to the letter of the
requirements or leave some flexibility? And again, what are their
communications like through this process?

Once they've submitted their first solution, change the requirements on
them subtly by offering a second set of inputs. These will be the same
but subtly different. Maybe throw in some Unicode or deliberately
malformatted lines. Maybe change the sort criteria. Does their code fail
gracefully? Messily? Silently? Do they notice the changes? What shape
does the discussion over the change take? Are they indignant about the
changing requirements, do they take them in stride? How much work does it
take them to adapt their code to the new requirements?

This test will take more time than a traditional puzzle test, but it can
be administered easily enough over email and doesn't involve more than a
few minutes attention at any given time. A dud developer can sink your
team and cause far more damage than good, so it's worth the little bit of
extra effort to find out if they can actually do what developers do, and
not just solve clever puzzles.</description>
      <dc:date>2012-02-03T23:21:00Z</dc:date>
      <title>A Real Developer Challenge</title>
      <pubDate>Fri, 03 Feb 2012 23:21:00 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;&lt;a href="https://codequest.spotify.com/"&gt;Spotify is having a coding challenge &lt;/a&gt; to find "top-notch talent to join our NYC team".  The challenge is to solve the most &lt;a href="http://www.spotify.com/us/jobs/tech/"&gt;algorithmic puzzles&lt;/a&gt; in four hours... alone.  "You may not cooperate with anyone, and you may not publish any discussion of solutions."  What sort of developer will win this competition?  Someone who is quick, dirty, has a mathematical mindset and lucky enough to write something that happens to work for the test data set.  The "rockstar".  Is this somebody you want on your team?  Would you want to maintain their code?&lt;/p&gt;

&lt;p&gt;Last year while on contract, the company in question was passing around their coding problem they used to test new hires.  It was pretty typical stuff: give the data going in, the data they want out, and write a little program to do the transform.  They even supplied most of the program, including a test; the prospective hire just needed to write one sort subroutine which could deal with "Low", "Medium" and "High" as well as numbers.&lt;/p&gt;

&lt;p&gt;Predictably, this halted all coding in the office for a solid half day while everyone figured out the most clever way to sort the data.  My opus was to observe that the input data was already sorted, so I redefined the &lt;code&gt;shuffle()&lt;/code&gt; routine.  The best one was from a co-worker who observed that "Low", "Medium" and "High" sort correctly by their last letter in reverse order.  It was fun for us, but it wasn't very useful.&lt;/p&gt;

&lt;p&gt;This is a pretty typical coding problem used to judge potential hires, and it sucks.  All it tells you is the candidate is not completely incompetent.  Why do we keep using them?  They're easy.  They're easy to think up, easy to judge and easy to administer.  They're also the sort of clean, algorithmic problems a stereotypical programmer loves to solve.  Do they have anything to do with detecting a good developer?  No.  Can we fix it?  Yes!&lt;/p&gt;

        &lt;p&gt;Before this can be fixed, first we have to work out what a project wants in a developer.  What do developers do all day?  We can work this out by reversing every contrived element of our typical programming contest: clean, well defined inputs; clean, well defined expected output; a clear description of the algorithm; pre-existing template code; pre-existing acceptance tests.  When's the last time you were handed a problem like that in the real world?&lt;/p&gt;

&lt;p&gt;Instead, we get poorly defined inputs, sample input that has anything to do with reality being a luxury, inputs riddled with mistakes.  Expected behavior and output are vaguely defined.  As a developer we're presented with a clean sheet, no template, no tests, just a blinking cursor and a blank page.&lt;/p&gt;

&lt;p&gt;How does one solve the contrived example?  First the specification, inputs and outputs are carefully examined.  If there's any ambiguity it's discussed up front with the person who probably wrote the problem and understands it perfectly.  Then the candidate goes off and writes some code until it passes the tests.  There is little or no interaction with people, everything is handed on a silver platter in unambiguous terms.&lt;/p&gt;

&lt;p&gt;How does one solve the real example?  First you have to find somebody who understands the problem, usually not a programmer, and discuss the problem.  Then you drag some samples out of them, converting them into a format you can actually use.  The user probably doesn't know what they really want, so the behavior/output will be ill defined.  Pressed, the user will make up something that you know will be wrong as soon as you show it to them.  Armed with this "information" you hammer it into some sort of algorithm and now need to write some code.&lt;/p&gt;

&lt;p&gt;But you don't just hammer out a script.  You need to do it in a way that matches the team's coding style.  You'll probably want to make the meat of it reusable, so you need to write it as a library not just a one-off script.  It'll have to deal with the inevitable bad input, which means good error handling and recovery.  Other people will have to use it, which means good documentation.  It needs tests written in a way which works with whatever integration server the team is using.  And, of course, it should all be checked into version control with well defined and logged commits.&lt;/p&gt;

&lt;p&gt;And then, when you've written all that and got it working, you take it back to the user and they tell you it's not what they wanted.  Or they show you some new input that doesn't match what they originally said.  If you're good... and lucky, your code is robust enough to handle it.  If you're not... back to coding with you!  Repeat until dead.&lt;/p&gt;

&lt;p&gt;In that light, a good developer is one who works well with others, but also can make a multitude of small, detailed decisions about a problem they know very little about.  They need to take vague requirements and work with a user to turn them into something a computer can do repeatedly.  A good developer looks beyond the immediate requirements and thinks ahead ensuring the code is flexible enough to withstand future change.  A good developer writes code not for themselves, but for everyone else on the team.&lt;/p&gt;

&lt;p&gt;So... how do you test all that?  And in less than an hour?  Turns out it's pretty easy with some simple modifications to the classic example.  You keep the same basic algorithmic problem, but you give it to the candidate the way a &lt;em&gt;user&lt;/em&gt; would.  It can be as simple as this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Could you sort this data please?  [Excel document attached]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can be a bit more clever, feeding the candidate what seems like enough information to do the work but is full of subtle ambiguities, tempting them to take the easy route and just get to coding, weeding out those with the undesirable tendency to program without questioning what they're doing and why, but that's the crux of it.  &lt;/p&gt;

&lt;p&gt;Now sit back and see what the candidate does with that. Respond to their questions, but remain in the persona of a user.  What you're looking for here is how they push back.  What sort of questions to do they ask to gather and clarify the requirements?  What sort of assumptions do they make?  How well do they bridge the communications gap between customer and programmer?&lt;/p&gt;

&lt;p&gt;Given a blank page to code on, what do they do with that?  Do they write tests and documentation?  Do they write a quick script or a library?  Do they use version control?  Do they ask about your code standards?  Do they use pre-existing libraries?  Do they write to the letter of the requirements or leave some flexibility?  And again, what are their communications like through this process?&lt;/p&gt;

&lt;p&gt;Once they've submitted their first solution, change the requirements on them subtly by offering a second set of inputs.  These will be the same but subtly different.  Maybe throw in some Unicode or deliberately malformatted lines.  Maybe change the sort criteria.  Does their code fail gracefully?  Messily?  Silently?  Do they notice the changes?  What shape does the discussion over the change take?  Are they indignant about the changing requirements, do they take them in stride?  How much work does it take them to adapt their code to the new requirements?&lt;/p&gt;

&lt;p&gt;This test will take more time than a traditional puzzle test, but it can be administered easily enough over email and doesn't involve more than a few minutes attention at any given time.  A dud developer can sink your team and cause far more damage than good, so it's worth the little bit of extra effort to find out if they can actually do what developers do, and not just solve clever puzzles.&lt;/p&gt;

    </content:encoded>
      <dcterms:modified>2012-02-03T23:21:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogs.perl.org,2012:/users/michael_g_schwern//786.2759</guid>
    </item>
    <item>
      <author>nobody@example.com (Michael G Schwern)</author>
      <dc:creator>nobody@example.com (Michael G Schwern)</dc:creator>
      <link>http://blogs.perl.org/users/michael_g_schwern/2012/02/true-true-2.html</link>
      <description>I've seen lots of new Perl programmers confuse 1 and true before, usually
something like this:

do_something if boolean_function() == 1;

This is not only redundant, but it's also brittle and redundant. In Perl,
it's very easy for a boolean function to return something other than one.

sub has_stuff {
    ...
    return scalar @stuff;
}

This code I found today in Module::Build::Base takes the cake.

if ( $self-&gt;check_prereq + $self-&gt;check_autofeatures != 2) {

(Yes, I fixed it)

UPDATE: Whoops, I broke it! As rsimões pointed out in the comments, the
original does not short circuit and my change does. That was not a bug,
both check routines should always run (a consequence of the checks having
side effects). I had to think about it a bit, and the simplest thing I
came up with is:

if( grep { !$_ } $self-&gt;check_prereq, $self-&gt;check_autofeatures ) {

Which goes to show, and I should have known this myself, don't assume the
author is an idiot. There's usually a reason why they did what they did.
Find it before touching the code.</description>
      <dc:date>2012-02-03T22:47:28Z</dc:date>
      <title>True + True == 2</title>
      <pubDate>Fri, 03 Feb 2012 22:47:28 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;I've seen lots of new Perl programmers confuse 1 and true before, usually something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;do_something if boolean_function() == 1;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is not only redundant, but it's also brittle and redundant.  In Perl, it's very easy for a boolean function to return something other than one.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sub has_stuff {
    ...
    return scalar @stuff;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This &lt;a href="https://github.com/Perl-Toolchain-Gang/Module-Build/blob/bdb3e896cbecabfbc5b3e8fa6d705246a462107f/lib/Module/Build/Base.pm#L41"&gt;code I found today in Module::Build::Base&lt;/a&gt; takes the cake.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ( $self-&amp;gt;check_prereq + $self-&amp;gt;check_autofeatures != 2) {
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(&lt;a href="https://github.com/Perl-Toolchain-Gang/Module-Build/commit/fce7c9ccdf619f70cbe9fb957b626cd420527102"&gt;Yes, I fixed it&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;:  Whoops, I broke it!  As rsimões pointed out in the comments, the original does not short circuit and my change does.  That was not a bug, both check routines should always run (a consequence of the checks having side effects).  I had to think about it a bit, and the simplest thing I came up with is:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if( grep { !$_ } $self-&amp;gt;check_prereq, $self-&amp;gt;check_autofeatures ) {
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Which goes to show, and I should have known this myself, don't assume the author is an idiot.  There's usually a reason why they did what they did.  Find it before touching the code.&lt;/p&gt;

        

    </content:encoded>
      <dcterms:modified>2012-02-03T22:47:28Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogs.perl.org,2012:/users/michael_g_schwern//786.2765</guid>
    </item>
    <item>
      <author>nobody@example.com (chromatic)</author>
      <dc:creator>nobody@example.com (chromatic)</dc:creator>
      <category>language design perl 5 refactoring</category>
      <link>http://www.modernperlbooks.com/mt/2012/02/a-practical-use-for-macros-in-perl.html</link>
      <description>People occasionally ask for practical examples of macros when I lament
the lack of macros in Perl 5. While I'm usually pleased at the degree to
which Perl lets me design code to get and stay out of my way, sometimes
its abstractions just aren't quite enough enough to remove all of the
duplication available.

(I've been refactoring one of our business projects in preparation for
another round of deployment in the next couple of weeks. We could launch
without these improvements, but administrative work took almost two weeks
longer than the afternoon I'd planned for it, so I decided it was worth
my time to reduce technical friction so that further improvements are
easier. More users means more work, so why not accelerate that work while
I have the chance? I have another longer technical post to write to
praise the use of Moose roles for a plugin system and to show off the
stupidly-great task launcher, but that's for later.)

I found myself writing two code couplets that were similar enough they
triggered my "Hey, refactor away this duplication!" alert. It's extra
sensitive, because I know I'll have a few more couplets like this in the
very near future:

while (my $stock = $stock_rs-&gt;next)
{
    my $pe_update = $self-&gt;analyze_pe( $stock );
    $stock_txn-&gt;add( $pe_update ) if $pe_update;

    my $cash_yield_update = $self-&gt;analyze_cash_yield( $stock );
    $analysis_txn-&gt;add( $cash_yield_update ) if $cash_yield_update;
}

The *_txn variables contain objects representing deferred and scoped SQL
updates. I'll talk about that at YAPC::NA 2012 in When Wrong is Better.

The general pattern is this: for every stock in the appropriate
resultset, call a method in this plugin. The method will return nothing
if it fails (or has nothing to do) or it will return data to be added to
the appropriate transaction. I have at least two types of transactions
available here at the moment, and may have more later: one transaction
updates stock data and the other updates analysis data.

I have several options. I could rework the data model so that this stage
always only updates one transaction, in which the loop body could instead
look like:

{
    for my $method (qw( analyze_pe analyze_cash_yield ))
    {
        next unless my $result = $self-&gt;$method( $stock );
        $txn-&gt;add( $result );
    }
}

This technique of hoisting the variants into an ad hoc data structure and
using existing looping techniques works well sometimes. (I use it in
other parts of the system.) It's relatively easy to expand, even though
it moves interesting information ("I'm calling the analyze_pe method!")
to a place where tools have more trouble finding it. (I search for
&gt;analyze_pe when I want to find method calls.) You may have used
something similar to define several parametric methods at BEGIN time.
It's the same type of pattern, and while Perl 5 provides most of the
tools necessary to allow this, it doesn't natively express this pattern
well.

I could also change the transaction object's add() method to do nothing
when it receives an empty list of arguments. I like that in some ways,
but I don't like it in others. I've come down on the side of keeping its
invariant (it always takes only one scalar as an object) pure for now. If
I change it to take a list of updates, that might be the right time to
reconsider this.

What I notice in the code as it stands right now is that the individual
variables $pe_update and $cash_yield_update are synthetic variables. They
only exist to support the code as written; they're not necessary for the
algorithm. If I were to modify this code but only this code, I'd really
rather write:

{
    ADD_TXN_WITH( $self, analyze_pe,         $stock, $stock_txn    );
    ADD_TXN_WITH( $self, analyze_cash_yield, $stock, $analysis_txn );
}

... though that syntax doesn't thrill me either. The clearest possibility
I see right now is:

{
    $stock_txn-&gt;add(    SKIP unless $self-&gt;analyze_pe( $stock )         );
    $analysis_txn-&gt;add( SKIP unless $self-&gt;analyze_cash_yield( $stock ) );
}

... where SKIP does some magic to move to the next statement, not the
next loop iteration. (I have some ideas how to write XS to make this
work, but that creepy yak needs a shave and some mouthwash.)

The second best option right now is adding a function or method as
indirection to encapsulate the synthetic code. I'd rather avoid synthetic
code, but at least it reduces the possibility of copy and paste bugs.

For now, with only two steps in this analysis, I'm leaving it as it is.
Two repetitions of something this similar set off my refactoring alarm,
but I resist the urge for refactorings this small until I see three
instances of near-duplicate code.</description>
      <dc:date>2012-02-03T20:46:43Z</dc:date>
      <dc:subject>language design perl 5 refactoring</dc:subject>
      <title>A Practical Use for Macros in Perl</title>
      <pubDate>Fri, 03 Feb 2012 20:46:43 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;People occasionally ask for practical examples of macros when I lament &lt;a href="http://www.modernperlbooks.com/mt/2011/11/what-the-perl-5-compiler-modules-could-have-been.html"&gt;the
lack of macros in Perl 5&lt;/a&gt;. While I'm usually pleased at the degree to which
Perl lets me design code to get and stay out of my way, sometimes its
abstractions just aren't quite &lt;em&gt;enough&lt;/em&gt; enough to remove all of the
duplication available.&lt;/p&gt;

&lt;p&gt;(I've been refactoring one of our business projects in preparation for another round of deployment in the next couple of weeks. We could launch without these improvements, but administrative work took almost two weeks longer than the afternoon I'd planned for it, so I decided it was worth my time to &lt;a href="http://www.modernperlbooks.com/mt/2011/11/on-technical-friction.html"&gt;reduce technical friction&lt;/a&gt; so that further improvements are easier. More users means more work, so why not accelerate that work while I have the chance? I have another longer technical post to write to praise the use of Moose roles for a plugin system and to show off the stupidly-great task launcher, but that's for later.)&lt;/p&gt;

&lt;p&gt;I found myself writing two code couplets that were similar enough they
triggered my "Hey, refactor away this duplication!" alert. It's extra
sensitive, because I &lt;em&gt;know&lt;/em&gt; I'll have a few more couplets like this in
the very near future:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;while (my $stock = $stock_rs-&amp;gt;next)
{
    my $pe_update = $self-&amp;gt;analyze_pe( $stock );
    $stock_txn-&amp;gt;add( $pe_update ) if $pe_update;

    my $cash_yield_update = $self-&amp;gt;analyze_cash_yield( $stock );
    $analysis_txn-&amp;gt;add( $cash_yield_update ) if $cash_yield_update;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;*_txn&lt;/code&gt; variables contain objects representing deferred and
scoped SQL updates. I'll talk about that at &lt;a href="http://act.yapcna.org/2012/"&gt;YAPC::NA 2012&lt;/a&gt; in &lt;a href="http://act.yapcna.org/2012/talk/50"&gt;When Wrong is Better&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The general pattern is this: for every stock in the appropriate resultset,
call a method in this plugin. The method will return nothing if it fails (or
has nothing to do) or it will return data to be added to the appropriate
transaction. I have at least two types of transactions available here at the
moment, and may have more later: one transaction updates stock data and the
other updates analysis data.&lt;/p&gt;

&lt;p&gt;I have several options. I could rework the data model so that this stage
always only updates one transaction, in which the loop body could instead look
like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    for my $method (qw( analyze_pe analyze_cash_yield ))
    {
        next unless my $result = $self-&amp;gt;$method( $stock );
        $txn-&amp;gt;add( $result );
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This technique of hoisting the variants into an ad hoc data structure and
using existing looping techniques works well sometimes. (I use it in other
parts of the system.) It's relatively easy to expand, even though it moves
interesting information ("I'm calling the &lt;code&gt;analyze_pe&lt;/code&gt; method!") to
a place where tools have more trouble finding it. (I search for
&lt;code&gt;&amp;gt;analyze_pe&lt;/code&gt; when I want to find method calls.) You may have used something similar to define several parametric methods at &lt;code&gt;BEGIN&lt;/code&gt; time. It's the same type of pattern, and while Perl 5 provides most of the tools necessary to allow this, it doesn't natively express this pattern well.&lt;/p&gt;

&lt;p&gt;I could also change the transaction object's &lt;code&gt;add()&lt;/code&gt; method to do
nothing when it receives an empty list of arguments. I like that in some ways,
but I don't like it in others. I've come down on the side of keeping its
invariant (it always takes only one scalar as an object) pure for now. If I
change it to take a list of updates, that might be the right time to reconsider
this.&lt;/p&gt;

&lt;p&gt;What I notice in the code as it stands right now is that the individual
variables &lt;code&gt;$pe_update&lt;/code&gt; and &lt;code&gt;$cash_yield_update&lt;/code&gt; are
synthetic variables. They only exist to support the code as written; they're
not necessary for the algorithm. If I were to modify this code but only this code, I'd really rather write:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    ADD_TXN_WITH( $self, analyze_pe,         $stock, $stock_txn    );
    ADD_TXN_WITH( $self, analyze_cash_yield, $stock, $analysis_txn );
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;... though that syntax doesn't thrill me either. The clearest possibility I
see right now is:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    $stock_txn-&amp;gt;add(    SKIP unless $self-&amp;gt;analyze_pe( $stock )         );
    $analysis_txn-&amp;gt;add( SKIP unless $self-&amp;gt;analyze_cash_yield( $stock ) );
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;... where &lt;code&gt;SKIP&lt;/code&gt; does some magic to move to the next statement,
not the next loop iteration. (I have some ideas how to write XS to make this
work, but that creepy yak needs a shave and some mouthwash.)&lt;/p&gt;

&lt;p&gt;The second best option right now is adding a function or method as
indirection to encapsulate the synthetic code. I'd rather avoid synthetic code,
but at least it reduces the possibility of copy and paste bugs.&lt;/p&gt;

&lt;p&gt;For now, with only two steps in this analysis, I'm leaving it as it is. Two
repetitions of something this similar set off my refactoring alarm, but I
resist the urge for refactorings this small until I see three instances of
near-duplicate code.&lt;/p&gt;

        
    </content:encoded>
      <dcterms:modified>2012-02-03T20:46:43Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.modernperlbooks.com,2012:/mt//1.408</guid>
    </item>
    <item>
      <author>nobody@example.com (claudio)</author>
      <dc:creator>nobody@example.com (claudio)</dc:creator>
      <category>Uncategorized dev-room fosdem FOSDEM2012 Perl</category>
      <link>http://nxadm.wordpress.com/2012/02/03/perlfosdem201/</link>
      <enclosure>HASH(0x5bddc88)</enclosure>
      <description>fosdemJust a short reminder of the Perl talks at FOSDEM2012.

The Perl dev-room will be held this Sunday February 5th, from 9 to 17h on
room AW1.121. We have a wide range of talks. Some talks target Perl
programmers with subjects ranging from a beginner to an advanced level.
Other talks don’t focus on the language itself, but rather on projects
that use Perl as a building stone.

So please, drop by if you are at FOSDEM…

Room: AW1.121

Sunday 2012-02-05

Event

Speaker

Room

When

Welcome to the Perl devroom

Claudio Ramirez

AW1.121

09:00-09:05

Moose Primer

Nicholas Perez

AW1.121

09:05-09:25

Advanced Moose Techniques

Nicholas Perez

AW1.121

09:35-09:55

Perlude: a taste of Haskell in Perl

Marc Chantreux

AW1.121

10:05-10:45

Perlito

Flávio Glock

AW1.121

11:05-11:45

The LemonLDAP::NG Project

Clément Oudot

AW1.121

11:55-12:15

LedgerSMB: Open source accounting running on Perl

Erik Huelsmann

AW1.121

12:25-12:45

Modern PerlCommerce

Stefan Hornburg

AW1.121

13:25-14:05

Rapid real-world testing using git-deploy

Ævar Arnfjörð Bjarmason

AW1.121

14:15-14:35

POSIX::1003

Mark Overmeer

AW1.121

15:00-15:40

The FusionInventory Project

Guillaume Rousse

AW1.121

15:50-16:10

Using Moose objects with Memcached

Marius Olsthoorn

AW1.121

16:20-16:40


Filed under: Uncategorized Tagged: dev-room, fosdem, FOSDEM2012, Perl</description>
      <dc:date>2012-02-03T18:29:05Z</dc:date>
      <dc:subject>Uncategorized dev-room fosdem FOSDEM2012 Perl</dc:subject>
      <title>Perl devroom @ FOSDEM2012</title>
      <pubDate>Fri, 03 Feb 2012 18:29:05 -0000</pubDate>
      <content:encoded>&lt;p&gt;&lt;img src="http://nxadm.files.wordpress.com/2012/02/116316-96-20100105085124.png?w=460" alt="fosdem"&gt;Just a short reminder of the &lt;a href="http://fosdem.org/2012/schedule/track/perl_devroom" target="_blank"&gt;Perl talks at FOSDEM2012&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Perl dev-room will be held this Sunday February 5th, from 9 to 17h on room AW1.121. We have a wide range of talks. Some talks target Perl programmers with subjects ranging from a beginner to an advanced level. Other talks don&amp;#8217;t focus on the language itself, but rather on projects that use Perl as a building stone.&lt;/p&gt;
&lt;p&gt;So please, drop by if you are at FOSDEM&amp;#8230;&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="4"&gt;Room: &lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="4"&gt;Sunday 2012-02-05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Speaker&lt;/th&gt;
&lt;th&gt;Room&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/welcome_perldevroom"&gt;Welcome to the Perl devroom&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/claudio_ramirez"&gt;Claudio Ramirez&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09:00-09:05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/moose_primer"&gt;Moose Primer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/nicholas_perez"&gt;Nicholas Perez&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09:05-09:25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/advanced_moose"&gt;Advanced Moose Techniques&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/nicholas_perez"&gt;Nicholas Perez&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09:35-09:55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/perlude"&gt;Perlude: a taste of Haskell in Perl&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/marc_chantreux"&gt;Marc Chantreux&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10:05-10:45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/perlito"&gt;Perlito&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/flavio_glock"&gt;Flávio Glock&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;11:05-11:45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/lemonldapng"&gt;The LemonLDAP::NG Project&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/clement_oudot"&gt;Clément Oudot&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;11:55-12:15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/ledgersmb_perl"&gt;LedgerSMB: Open source accounting running on Perl&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/erik_huelsmann"&gt;Erik Huelsmann&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;12:25-12:45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/modern_perlcommerce"&gt;Modern PerlCommerce&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/stefan_hornburg"&gt;Stefan Hornburg&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;13:25-14:05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/gd"&gt;Rapid real-world testing using git-deploy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/AEvar_arnfjoerd_bjarmason"&gt;Ævar Arnfjörð Bjarmason&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;14:15-14:35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/posix1003"&gt;POSIX::1003&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/mark_overmeer"&gt;Mark Overmeer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;15:00-15:40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/fusioninventory"&gt;The FusionInventory Project&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/guillaume_rousse"&gt;Guillaume Rousse&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;15:50-16:10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/event/moose_memcached"&gt;Using Moose objects with Memcached&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/speaker/marius_olsthoorn"&gt;Marius Olsthoorn&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://fosdem.org/2012/schedule/room/aw1121"&gt;AW1.121&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;16:20-16:40&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;Filed under: &lt;a href="http://nxadm.wordpress.com/category/uncategorized/"&gt;Uncategorized&lt;/a&gt; Tagged: &lt;a href="http://nxadm.wordpress.com/tag/dev-room/"&gt;dev-room&lt;/a&gt;, &lt;a href="http://nxadm.wordpress.com/tag/fosdem/"&gt;fosdem&lt;/a&gt;, &lt;a href="http://nxadm.wordpress.com/tag/fosdem2012/"&gt;FOSDEM2012&lt;/a&gt;, &lt;a href="http://nxadm.wordpress.com/tag/perl/"&gt;Perl&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxadm.wordpress.com/871/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/comments/nxadm.wordpress.com/871/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nxadm.wordpress.com/871/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/delicious/nxadm.wordpress.com/871/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nxadm.wordpress.com/871/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/facebook/nxadm.wordpress.com/871/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nxadm.wordpress.com/871/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/twitter/nxadm.wordpress.com/871/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nxadm.wordpress.com/871/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/stumble/nxadm.wordpress.com/871/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nxadm.wordpress.com/871/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/digg/nxadm.wordpress.com/871/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nxadm.wordpress.com/871/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/reddit/nxadm.wordpress.com/871/"&gt;&lt;/a&gt; &lt;img alt="" src="http://stats.wordpress.com/b.gif?host=nxadm.wordpress.com&amp;amp;blog=1467330&amp;amp;post=871&amp;amp;subd=nxadm&amp;amp;ref=&amp;amp;feed=1"&gt;</content:encoded>
      <dcterms:modified>2012-02-03T18:29:05Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://nxadm.wordpress.com/?p=871</guid>
    </item>
    <item>
      <author>nobody@example.com (Gabor Szabo)</author>
      <dc:creator>nobody@example.com (Gabor Szabo)</dc:creator>
      <category>Perl, cmd, shell, prompt</category>
      <link>http://szabgab.com/perl-on-the-command-line.html</link>
      <description> While most of the tutorial deals with scripts saved in a file we'll also
see a couple of examples for one-liners. Even if you are using Padre or
some other IDE that would let you run your script from the editor itself
it is very important to familiarize yourself with the command line (or
shell) and be able to use perl from there.

For the full article visit Perl on the command line</description>
      <dc:date>2012-02-03T16:33:43Z</dc:date>
      <dc:subject>Perl, cmd, shell, prompt</dc:subject>
      <title>Perl on the command line</title>
      <pubDate>Fri, 03 Feb 2012 16:33:43 -0000</pubDate>
      <content:encoded>
While most of the tutorial deals with scripts saved in a
file we'll also see a couple of examples for one-liners.

Even if you are using Padre or some other IDE that would let you
run your script from the editor itself it is very important
to familiarize yourself with the command line (or shell) and
be able to use perl from there.


&lt;p&gt;For the full article visit &lt;a href="http://szabgab.com/perl-on-the-command-line.html"&gt;Perl on the command line&lt;/a&gt;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2012-02-03T16:33:43Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://szabgab.com/perl-on-the-command-line.html</guid>
    </item>
    <item>
      <author>nobody@example.com (chromatic)</author>
      <dc:creator>nobody@example.com (chromatic)</dc:creator>
      <category>web development</category>
      <link>http://www.perl.com/pub/2012/02/perl-in-plat-forms-2012-web-development-contest.html</link>
      <description>Thanks to Lars Dɪᴇᴄᴋᴏᴡ for coordinating entries into the Plat_Forms 2012
web development contest. This annual contest pits some of the best
developers of frameworks and languages against each other to solve real
problems. Perl developers have participated for several years. Teams
using Catalyst, Dancer, and Mojolicious have all demonstrated their
platform strengths and weaknesses.

No Perl team has won the contest—yet. With the rise of modern Perl 5, the
extra energy from competition between all of the great platforms, and (of
course) the power of the CPAN, we all expect great things. Consider
entering and showing what we can do.</description>
      <dc:date>2012-02-03T01:33:35Z</dc:date>
      <dc:subject>web development</dc:subject>
      <title>Perl in Plat_Forms 2012 Web Development Contest</title>
      <pubDate>Fri, 03 Feb 2012 01:33:35 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;Thanks to &lt;a href="http://search.cpan.org/~daxim/"&gt;Lars Dɪᴇᴄᴋᴏᴡ&lt;/a&gt; for coordinating entries into the &lt;a href="http://www.plat-forms.org/platforms-2012-announcement#overview"&gt;Plat_Forms 2012&lt;/a&gt; web development contest. This annual contest pits some of the best developers of frameworks and languages against each other to solve real problems. Perl developers have participated for several years. Teams using Catalyst, Dancer, and Mojolicious have all demonstrated their platform strengths and weaknesses.&lt;/p&gt;

&lt;p&gt;No Perl team has won the contest&amp;mdash;yet. With the rise of modern Perl 5, the extra energy from competition between all of the great platforms, and (of course) the power of the CPAN, we all expect great things. Consider entering and showing what we can do.&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2012-02-03T01:33:35Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.perl.com,2012:/pub//2.1976</guid>
    </item>
    <item>
      <author>nobody@example.com (Gabor Szabo)</author>
      <dc:creator>nobody@example.com (Gabor Szabo)</dc:creator>
      <category>Perl, TODO</category>
      <link>http://szabgab.com/todo-2012-02.html</link>
      <description> In January I started to write annual and monthly reports and TODO lists.
On one hand, I hope that this will help me track my progress and on the
other hand it lets you, my reader, take a look at my plans and
participate in the journey.

For the full article visit TODO February 2012</description>
      <dc:date>2012-02-01T11:33:07Z</dc:date>
      <dc:subject>Perl, TODO</dc:subject>
      <title>TODO February 2012</title>
      <pubDate>Wed, 01 Feb 2012 11:33:07 -0000</pubDate>
      <content:encoded>
In January I started to write &lt;a href="http://szabgab.com/todo-2012.html"&gt;annual and monthly reports and TODO&lt;/a&gt; lists. On one hand,
I hope that this will help me track my progress and on the other hand it lets you, my reader, take a look at my plans
and participate in the journey.


&lt;p&gt;For the full article visit &lt;a href="http://szabgab.com/todo-2012-02.html"&gt;TODO February 2012&lt;/a&gt;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2012-02-01T11:33:07Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://szabgab.com/todo-2012-02.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Joel Berger)</author>
      <dc:creator>nobody@example.com (Joel Berger)</dc:creator>
      <category>CPAN Love</category>
      <link>http://blogs.perl.org/users/joel_berger/2012/01/on-cpan-namespaces.html</link>
      <description>After the public buyers-remorse that I (almost) had on the name of my
latest module Tie::Select, I got to thinking about the filling of CPAN
namespaces.

CPAN is awesome; many have said that it is Perl’s killer app. It has tons
of modules to do many many things. The problem is that some of the
obvious names are gone. Certain namespaces have implications. For
Tie::Select I thought of IO::Select, which exists. I thought of going
underneath an existing module’s namespace, for example IO::Handle::Select,
but this implies, at least to me, that it is either a part of, or
derivative of IO::Handle. Its not, and in fact it isn’t even OO as that
module is.

I have settled on the current name for now, but I am not totally happy
with it. I got to thinking about other naming problems I’ve had. (And
note I am not complaining about any of this, just ruminating):

  * 

    Duke Leto’s SWIGing of the GSL library effectively took up the entire
    Math::GSL namespace. My Math::GSLx::ODEIV2 needed that little x to
    “clear things up”

  * 

    One might expect that my MooseX::Types::NumUnit uses MooseX::Types,
    but it doesn’t. Perhaps it should, or perhaps it should be in another
    namespace. Then again, this is the descriptive one.

  * 

    It seems like there are more that I am forgetting

Anyway, it begs the question, as CPAN continues to mature, what happens
as the namespaces fill up? What happens to old dead modules Tie::CSV_File
which aren’t really worth fixing, but will decrease the searching
signal-to-noise?

Gasp! What happens when ACME:: fills up!

I know that some people’s answer will be to adopt the old modules. But
what if I don’t plan to keep the API or the implementation. What if the
functionality is different but the names should be similar (my
Tie::Select vs IO::Select).

I know I’m rambling a bit now and I can’t say that I know what I want,
but I know what I don’t want. I don’t want new CPAN modules to have to
start picking odd names just to have their own namespaces. I’m sure many
of us have see Miyagawa’s module’s funny names and their reasoning.

But there just aren’t enough descriptive names.</description>
      <dc:date>2012-02-01T03:32:52Z</dc:date>
      <dc:subject>CPAN Love</dc:subject>
      <title>On CPAN Namespaces</title>
      <pubDate>Wed, 01 Feb 2012 03:32:52 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;After the &lt;a href="http://blogs.perl.org/users/joel_berger/2012/01/a-localizable-interface-to-select.html#comments"&gt;public buyers-remorse&lt;/a&gt; that I (almost) had on the name of my latest module &lt;a href="http://blogs.perl.org/users/joel_berger/2012/01/a-localizable-interface-to-select.html"&gt;Tie::Select&lt;/a&gt;, I got to thinking about the filling of CPAN namespaces.&lt;/p&gt;

&lt;p&gt;CPAN is awesome; many have said that it is Perl&amp;#8217;s killer app. It has tons of modules to do many many things. The problem is that some of the obvious names are gone. Certain namespaces have implications. For &lt;code&gt;Tie::Select&lt;/code&gt; I thought of &lt;code&gt;IO::Select&lt;/code&gt;, which exists. I thought of going underneath an existing module&amp;#8217;s namespace, for example &lt;code&gt;IO::Handle::Select&lt;/code&gt;, but this implies, at least to me, that it is either a part of, or derivative of &lt;code&gt;IO::Handle&lt;/code&gt;. Its not, and in fact it isn&amp;#8217;t even OO as that module is.&lt;/p&gt;

&lt;p&gt;I have settled on the current name for now, but I am not totally happy with it. I got to thinking about other naming problems I&amp;#8217;ve had. (And note I am not complaining about any of this, just ruminating):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Duke Leto&amp;#8217;s SWIGing of the GSL library effectively took up the entire &lt;code&gt;Math::GSL&lt;/code&gt; namespace. My &lt;code&gt;Math::GSLx::ODEIV2&lt;/code&gt; needed that little x to &amp;#8220;clear things up&amp;#8221;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One might expect that my &lt;code&gt;MooseX::Types::NumUnit&lt;/code&gt; uses &lt;code&gt;MooseX::Types&lt;/code&gt;, but it doesn&amp;#8217;t. Perhaps it should, or perhaps it should be in another namespace. Then again, this is the descriptive one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It seems like there are more that I am forgetting&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyway, it begs the question, as CPAN continues to mature, what happens as the namespaces fill up? What happens to old dead modules &lt;a href="http://www.cpantesters.org/distro/T/Tie-CSV_File.html#Tie-CSV_File-0.21"&gt;Tie::CSV_File&lt;/a&gt; which aren&amp;#8217;t really worth fixing, but will decrease the searching signal-to-noise?&lt;/p&gt;

&lt;p&gt;Gasp! What happens when &lt;code&gt;ACME::&lt;/code&gt; fills up!&lt;/p&gt;

&lt;p&gt;I know that some people&amp;#8217;s answer will be to adopt the old modules. But what if I don&amp;#8217;t plan to keep the API or the implementation. What if the functionality is different but the names should be similar (my &lt;code&gt;Tie::Select&lt;/code&gt; vs &lt;code&gt;IO::Select&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;I know I&amp;#8217;m rambling a bit now and I can&amp;#8217;t say that I know what I want, but I know what I don&amp;#8217;t want. I don&amp;#8217;t want new CPAN modules to &lt;em&gt;have&lt;/em&gt; to start picking odd names &lt;em&gt;just&lt;/em&gt; to have their own namespaces. I&amp;#8217;m sure many of us have see Miyagawa&amp;#8217;s module&amp;#8217;s funny names and their &lt;a href="http://search.cpan.org/~miyagawa/Starman-0.2014/lib/Starman.pm#Why_the_cute_name_instead_of_more_descriptive_namespace?_Are_you_on_drugs?"&gt;reasoning&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;But there just aren&amp;#8217;t enough descriptive names.&lt;/p&gt;

        

    </content:encoded>
      <dcterms:modified>2012-02-01T03:32:52Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogs.perl.org,2012:/users/joel_berger//1022.2757</guid>
    </item>
    <item>
      <author>nobody@example.com (chromatic)</author>
      <dc:creator>nobody@example.com (chromatic)</dc:creator>
      <category>cpan modern perl perl testing</category>
      <link>http://www.modernperlbooks.com/mt/2012/01/why-i-run-tests-on-install.html</link>
      <description>Jonathan Swartz makes a polemic statement:

  cpanm and perlbrew should not run tests by default.

His points are reasonable, but his complaints are mostly about side
effects and not the real problem. (I should clarify: the real problem I
encounter.)

If running tests slow down installs, speed up the tests. (Do you want to
get the wrong answer faster? Easy: it's 42. No need for a quantum
computer to do the calculation in constant time. This algorithm is O(0).)

If running tests exposes the fragility of the dependency chain, improve
the dependency chain.

If dependency test failures prevent the installation of downstream
clients... this is a weakness of the CPAN toolchain. A well-written test
suite for a downstream client should reveal whether bugs or other sources
of test failures in a dependency affect the correctness of the client.

Note the assumptions in that sentence.

Anyone who's experienced the flash of enlightenment that comes from
working with well tested code and who's shared that new zeal with
co-workers has undoubtedly heard the hoary old truism that testing cannot
prove the complete absence of bugs. It's no less true for its age, though
it's also true that good testing only improves our confidence in the
correctness and efficacy of our code.

For me, a 95% certainty that my code works and continues to work for the
things to which I've tested it is more than sufficient. I focus on
testing the things I'm most likely to get wrong and the things which need
to keep working correctly. (I don't care much about pixel-perfect
placement, but I do care that a book's index uses the right escapes for
its data and markup.)

Without tests running on the machines themselves in the environments
themselves where I expect my code to run, I don't have that confidence.

Put another way, I'm either not smart enough or far too lazy to want to
attempt to debug code without good tests. That's why I write tests, and
that's why I run them obsessively. That's good for me as a developer, and
you're getting the unvarnished developer perspective.

I also care about the perspective of mere users. (Without users, we're
amusing ourselves, and I can think of better ways to amuse myself than by
writing software no one uses.).

Yes, an excellent test suite can help a user help a developer debug a
problem. Many (most?) CPAN authors have had the wonderful experience of
receiving a bug report with a failing test case. Sometimes this even
includes a code patch.

Not all users are developers of that sort, nor should they be.

The CPAN ecosystem has improved greatly at automated testing and
dependency tracking, but we can improve further. What if we could
identify the severity of test failures? (We have TODO and SKIP, but they
don't convey semantic meaning.) What if we could identify buggy or
fragile tests? (My current favorite is XML::Feed tests versus
DateTime::Format::Atom because it catches me far too often, it doesn't
affect the operation of the code, and it's a stupid fix that's lingered
for a few months.) What if the failures are transient (Mechanize relying
on your ISP not ruining DNS lookups for you) or specific to your
environment (a test suite written without parallelism in mind).

As Jonathan rightly implies, how do you expect an end-user to understand
or care about or debug those things?

I'm still reluctant to agree that disabling tests for end-user
installations is the right solution. I want to know about failures in the
wild wider world. I want that confidence, but I can't bring myself to
trade away that confidence for the sake of a little more speed of
installation.

Yet his point about lingering points of fragility in the ecosystem are
true and important, even if the proposed solution of skipping tests isn't
right. Fortunately, improving dependency management and tracking and use
and testing can help solve both issues: perhaps to the point where we can
run only those tests users most care about and identify and report
material failures in dependencies.</description>
      <dc:date>2012-01-31T18:41:08Z</dc:date>
      <dc:subject>cpan modern perl perl testing</dc:subject>
      <title>Why I Run Tests on Install</title>
      <pubDate>Tue, 31 Jan 2012 18:41:08 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;Jonathan Swartz makes a polemic statement:&lt;/p&gt;

&lt;blockquote&gt;&lt;em&gt;&lt;a href="http://www.openswartz.com/2012/01/31/stop-running-tests-on-install/"&gt;cpanm and perlbrew should not run tests by default.&lt;/a&gt;&lt;/em&gt;&lt;/blockquote&gt;

&lt;p&gt;His points are reasonable, but his complaints are mostly about side effects
and not the real problem. (I should clarify: the real problem &lt;em&gt;I&lt;/em&gt;
encounter.)&lt;/p&gt;

&lt;p&gt;If running tests slow down installs, speed up the tests. (Do you want to get the wrong answer faster? Easy: it's 42. No need for a quantum computer to do the calculation in constant time. This algorithm is O(0).)&lt;/p&gt;

&lt;p&gt;If running tests exposes the fragility of the dependency chain, improve the dependency chain.&lt;/p&gt;

&lt;p&gt;If dependency test failures prevent the installation of downstream
clients... this &lt;em&gt;is&lt;/em&gt; a weakness of the CPAN toolchain. A well-written
test suite for a downstream client should reveal whether bugs or other sources
of test failures in a dependency affect the correctness of the client.&lt;/p&gt;

&lt;p&gt;Note the assumptions in that sentence.&lt;/p&gt;

&lt;p&gt;Anyone who's experienced the flash of enlightenment that comes from working
with well tested code and who's shared that new zeal with co-workers has
undoubtedly heard the hoary old truism that testing cannot prove the complete
absence of bugs. It's no less true for its age, though it's also true that
&lt;em&gt;good&lt;/em&gt; testing only improves our confidence in the correctness and
efficacy of our code.&lt;/p&gt;

&lt;p&gt;For me, a 95% certainty that my code works and continues to work for the
things to which I've tested it is more than sufficient. I focus on testing the
things I'm most likely to get wrong and the things which need to keep working
correctly. (I don't care much about pixel-perfect placement, but I do care that
a book's index uses the right escapes for its data and markup.)&lt;/p&gt;

&lt;p&gt;Without tests running on the machines themselves in the environments
themselves where I expect my code to run, I don't have that confidence.&lt;/p&gt;

&lt;p&gt;Put another way, I'm either not smart enough or far too lazy to want to
attempt to debug code without good tests. That's why I write tests, and that's
why I run them obsessively. That's good for me as a developer, and you're
getting the unvarnished developer perspective.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.modernperlbooks.com/mt/2011/10/in-search-of-minimum-viable-utility.html"&gt;I also care about the perspective of mere users&lt;/a&gt;. (Without users, we're amusing ourselves, and I can think of better ways to amuse myself than by writing software no one uses.).&lt;/p&gt;

&lt;p&gt;Yes, an excellent test suite can help a user help a developer debug a
problem. Many (most?) CPAN authors have had the wonderful experience of
receiving a bug report with a failing test case. Sometimes this even includes a
code patch.&lt;/p&gt;

&lt;p&gt;Not all users are developers of that sort, nor should they be.&lt;/p&gt;

&lt;p&gt;The CPAN ecosystem has improved greatly at automated testing and dependency tracking, but we can improve further. What if we could identify the severity of test failures? (We have TODO and SKIP, but they don't convey semantic meaning.) What if we could identify buggy or fragile tests? (My current favorite is &lt;a href="https://rt.cpan.org/Ticket/Display.html?id=69540"&gt;XML::Feed tests versus DateTime::Format::Atom&lt;/a&gt; because it catches me far too often, it doesn't affect the operation of the code, and it's a stupid fix that's lingered for a few months.) What if the failures are transient (Mechanize relying on your ISP &lt;em&gt;not&lt;/em&gt; ruining DNS lookups for you) or specific to your environment (a test suite written without parallelism in mind).&lt;/p&gt;

&lt;p&gt;As Jonathan rightly implies, how do you expect an end-user to understand or
care about or debug those things?&lt;/p&gt;

&lt;p&gt;I'm still reluctant to agree that disabling tests for end-user installations
is the right solution. I &lt;em&gt;want&lt;/em&gt; to know about failures in the wild wider
world. I want that confidence, but I can't bring myself to trade away that
confidence for the sake of a little more speed of installation.&lt;/p&gt;

&lt;p&gt;Yet his point about lingering points of fragility in the ecosystem are true
and important, even if the proposed solution of skipping tests isn't right.
Fortunately, improving dependency management and tracking and use and testing
can help solve both issues: perhaps to the point where we can run only those
tests users most care about and identify and report material failures in
dependencies.&lt;/p&gt;

        
    </content:encoded>
      <dcterms:modified>2012-01-31T18:41:08Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.modernperlbooks.com,2012:/mt//1.407</guid>
    </item>
    <item>
      <author>nobody@example.com (Pradeep Pant)</author>
      <dc:creator>nobody@example.com (Pradeep Pant)</dc:creator>
      <category>Perl Programming Server side (Perl 5, Perl 6) linkedin perl6 Rakudo</category>
      <link>http://pradeeppant.com/2012/01/31/rakudo-star-jan-2012-released/</link>
      <enclosure>HASH(0x5c400a0)</enclosure>
      <description>Rakudo Perl, a Perl 6 compiler for the Parrot virtual machine is released
.
The tarball for the January 2012 release is available from
http://github.com/rakudo/star/downloads.

See this link for official announcement.


Filed under: Perl, Programming, Server side (Perl 5, Perl 6) Tagged:
linkedin, perl6, Rakudo</description>
      <dc:date>2012-01-31T15:25:49Z</dc:date>
      <dc:subject>Perl Programming Server side (Perl 5, Perl 6) linkedin perl6 Rakudo</dc:subject>
      <title>Rakudo Star Jan 2012 Released</title>
      <pubDate>Tue, 31 Jan 2012 15:25:49 -0000</pubDate>
      <content:encoded>&lt;p&gt;Rakudo Perl, a &lt;a href="http://perl6.org/"&gt;Perl 6&lt;/a&gt; compiler for the &lt;a href="http://parrot.org/"&gt;Parrot virtual machine&lt;/a&gt; is released .&lt;br /&gt;
The tarball for the January 2012 release is available from &lt;a href="http://github.com/rakudo/star/downloads"&gt;http://github.com/rakudo/star/downloads&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See&lt;a href="http://rakudo.org/2012/01/28/rakudo-star-2012-01-released/"&gt; this link&lt;/a&gt; for official announcement.&lt;/p&gt;
&lt;br /&gt;Filed under: &lt;a href="http://pradeeppant.com/category/perl/"&gt;Perl&lt;/a&gt;, &lt;a href="http://pradeeppant.com/category/programming/"&gt;Programming&lt;/a&gt;, &lt;a href="http://pradeeppant.com/category/programming/web-development/server-side-perl-5-perl-6/"&gt;Server side (Perl 5, Perl 6)&lt;/a&gt; Tagged: &lt;a href="http://pradeeppant.com/tag/linkedin/"&gt;linkedin&lt;/a&gt;, &lt;a href="http://pradeeppant.com/tag/perl6/"&gt;perl6&lt;/a&gt;, &lt;a href="http://pradeeppant.com/tag/rakudo/"&gt;Rakudo&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ppant.wordpress.com/849/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/comments/ppant.wordpress.com/849/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ppant.wordpress.com/849/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/delicious/ppant.wordpress.com/849/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ppant.wordpress.com/849/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/facebook/ppant.wordpress.com/849/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ppant.wordpress.com/849/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/twitter/ppant.wordpress.com/849/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ppant.wordpress.com/849/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/stumble/ppant.wordpress.com/849/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ppant.wordpress.com/849/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/digg/ppant.wordpress.com/849/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ppant.wordpress.com/849/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/reddit/ppant.wordpress.com/849/"&gt;&lt;/a&gt; &lt;img alt="" src="http://stats.wordpress.com/b.gif?host=pradeeppant.com&amp;amp;blog=1919664&amp;amp;post=849&amp;amp;subd=ppant&amp;amp;ref=&amp;amp;feed=1"&gt;</content:encoded>
      <dcterms:modified>2012-01-31T15:25:49Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://pradeeppant.com/?p=849</guid>
    </item>
    <item>
      <author>nobody@example.com (Joel Berger)</author>
      <dc:creator>nobody@example.com (Joel Berger)</dc:creator>
      <category>Announcing Perl Love</category>
      <link>http://blogs.perl.org/users/joel_berger/2012/01/a-localizable-interface-to-select.html</link>
      <description>Have you ever forgotten to restore your original STDOUT (or other handle)
when you want to select another one for a brief time? Does the usage

my $stdin = select *STDERR;
print "To STDERR";
select $stdin;

seem clunky?

I have always loved the interface provided by File::chdir. It gives you
the $CWD variable. When you assign to it you change the working
directory. Even better, if you do that with the local directive, you
dynamically scope the change!

It struck me, while I was working on the test suite for another project,
that I wished that I could have that same kind of interface to select.
And why not, they both need changing and restoring of a global property?
So I gave it a try, and lo and behold it was simple!

So here it goes, I present Tie::Select, which provides the $SELECT
variable. Use it like this and I think you will wonder why you ever did
it the other way!

 use Tie::Select;

 {
   local $SELECT = *STDERR;
   print "This goes to STDERR";
 }

 print "This goes to STDOUT";</description>
      <dc:date>2012-01-31T11:46:09Z</dc:date>
      <dc:subject>Announcing Perl Love</dc:subject>
      <title>A localizable interface to `select`</title>
      <pubDate>Tue, 31 Jan 2012 11:46:09 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;Have you ever forgotten to restore your original STDOUT (or other handle) when you want to &lt;code&gt;select&lt;/code&gt; another one for a brief time? Does the usage&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;my $stdin = select *STDERR;
print "To STDERR";
select $stdin;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;seem clunky? &lt;/p&gt;

&lt;p&gt;I have always loved the interface provided by &lt;a href="http://p3rl.org/File::chdir"&gt;File::chdir&lt;/a&gt;. It gives you the &lt;code&gt;$CWD&lt;/code&gt; variable. When you assign to it you change the working directory. Even better, if you do that with the &lt;code&gt;local&lt;/code&gt; directive, you dynamically scope the change!&lt;/p&gt;

&lt;p&gt;It struck me, while I was working on the test suite for another project, that I wished that I could have that same kind of interface to &lt;code&gt;select&lt;/code&gt;. And why not, they both need changing and restoring of a global property? So I gave it a try, and lo and behold it was simple!&lt;/p&gt;

&lt;p&gt;So here it goes, I present &lt;a href="http://p3rl.org/Tie::Select"&gt;Tie::Select&lt;/a&gt;, which provides the &lt;code&gt;$SELECT&lt;/code&gt; variable. Use it like this and I think you will wonder why you ever did it the other way!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; use Tie::Select;

 {
   local $SELECT = *STDERR;
   print "This goes to STDERR";
 }

 print "This goes to STDOUT";
&lt;/code&gt;&lt;/pre&gt;

        

    </content:encoded>
      <dcterms:modified>2012-01-31T11:46:09Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogs.perl.org,2012:/users/joel_berger//1022.2753</guid>
    </item>
    <item>
      <author>nobody@example.com (Gabor Szabo)</author>
      <dc:creator>nobody@example.com (Gabor Szabo)</dc:creator>
      <category>Perl, CPAN, CM</category>
      <link>http://szabgab.com/the-right-way-to-install-cpan-modules.html</link>
      <description> There are several ways to install CPAN modules and about everyone
advocates something else. You can install the modules supplied by your
vendor (e.g. using aptitude on Debian). If the module is not available
from the vendor you can prepare a package (in the case of Debian using
dh-make-perl) or you can install the modules using a CPAN client. In that
case you can do it to the standard system directories or using local::lib.
You could also build your own perl with or without perlbrew and then you
can install everything with a CPAN client.

For the full article visit The right way to install CPAN modules</description>
      <dc:date>2012-01-31T11:16:02Z</dc:date>
      <dc:subject>Perl, CPAN, CM</dc:subject>
      <title>The right way to install CPAN modules</title>
      <pubDate>Tue, 31 Jan 2012 11:16:02 -0000</pubDate>
      <content:encoded>
There are several ways to install CPAN modules and about everyone advocates something else.

You can install the modules supplied by your vendor (e.g. using aptitude on Debian).
If the module is not available from the vendor you can prepare a package (in the case of Debian using dh-make-perl) or
you can install the modules using a CPAN client. In that case you can do it to the standard system directories or using 
&lt;a href="http://metacpan.org/release/local-lib"&gt;local::lib&lt;/a&gt;.

You could also build your own perl with or without &lt;a href="http://www.perlbrew.pl/"&gt;perlbrew&lt;/a&gt;
and then you can install everything with a CPAN client.


&lt;p&gt;For the full article visit &lt;a href="http://szabgab.com/the-right-way-to-install-cpan-modules.html"&gt;The right way to install CPAN modules&lt;/a&gt;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2012-01-31T11:16:02Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://szabgab.com/the-right-way-to-install-cpan-modules.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Karen)</author>
      <dc:creator>nobody@example.com (Karen)</dc:creator>
      <category>Grants grants</category>
      <link>http://news.perlfoundation.org/2012/01/perl-5-grant-application-trave.html</link>
      <description>We have received the following Perl 5 grant application from Ricardo
Signes.

Before the Board votes on this proposal we would like to have a period of
community consultation. Please leave feedback in the comments or if you
prefer send email with your comments to karen at perlfoundation.org.

Name

Ricardo Signes

Project Title

Perl QA Hackathon 2012
Amount Requested: $900

Synopsis

This grant will be used to pay for travel for Ricardo Signes to and from
the Perl QA Hackathon held in Paris in Q1 2012.

Benefits to Perl 5

I have attended three of the four Perl QA Hackathons (Oslo, Birmingham,
Amsterdam) and have, at each of them, been able to contribute several
solid work days of very productive work to the infrastructure behind the
CPAN and related tools. Specifically, I was one of the chief implementors
of the new CPAN Testers platform (Metabase) and built the Fake CPAN
system for testing CPAN tools, and several reusable software libraries
that are used to power both Metabase and Fake CPAN.

In 2012, I hope to continue some work performed with David Golden in
2011, refactoring PAUSE and adding more regression tests to it. PAUSE is
the system which processes contributor uploads to the CPAN, manages CPAN
contributor identity, and builds the CPAN indexes used by CPAN clients to
locate libraries for installation.

In previous years, I also spent a significant amount of time working with
other attendees on their contributions, and plan to do the same this
year. This is one of the several reasons that attendance in person is
incomparably superior to "virtual attendance."

Deliverable Elements

The QA Hackathon does not have a set agenda, so promising specific work
product from it up front seems unwise. I have detailed, above, the sort
of work that I am almost certain to do, however. Further, I will provide
a public, written report of my activities at the Hackathon.

Any software that I produce will be released under the Perl 5 standard
license terms.

Applicant Biography

I have been building software in Perl professionally for about twelve
years. I am a frequent contributor of original software to the CPAN and a
frequent contributor to, or maintainer of, other popular CPAN libraries.
I am also a contributor to the core Perl 5 project, and its current
project lead.

I have been the recipient of TPF grants twice before, both of which were
completed promptly and successfully.</description>
      <dc:date>2012-01-31T10:18:05Z</dc:date>
      <dc:subject>Grants grants</dc:subject>
      <title>Perl 5 Grant Application: Travel to QA Hackathon</title>
      <pubDate>Tue, 31 Jan 2012 10:18:05 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;We have received the following Perl 5 grant application from Ricardo Signes.&lt;/p&gt;

&lt;p&gt;Before the Board votes on this proposal we would like to have a period of community consultation. Please leave feedback in the comments or if you prefer send email with your comments to karen at perlfoundation.org.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Name&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Ricardo Signes&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Project Title&lt;/b&gt; &lt;/p&gt;

&lt;p&gt;Perl QA Hackathon 2012&lt;br /&gt;
Amount Requested: $900&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Synopsis&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;This grant will be used to pay for travel for Ricardo Signes to and from the Perl QA Hackathon held in Paris in Q1 2012.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Benefits to Perl 5&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;I have attended three of the four Perl QA Hackathons (Oslo, Birmingham, Amsterdam) and have, at each of them, been able to contribute several solid work days of very productive work to the infrastructure behind the &lt;span class="caps"&gt;CPAN &lt;/span&gt;and related tools. Specifically, I was one of the chief implementors of the new &lt;span class="caps"&gt;CPAN&lt;/span&gt; Testers platform (Metabase) and built the Fake &lt;span class="caps"&gt;CPAN &lt;/span&gt;system for testing &lt;span class="caps"&gt;CPAN &lt;/span&gt;tools, and several reusable software libraries that are used to power both Metabase and Fake &lt;span class="caps"&gt;CPAN.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;In 2012, I hope to continue some work performed with David Golden in 2011, refactoring &lt;span class="caps"&gt;PAUSE &lt;/span&gt;and adding more regression tests to it. &lt;span class="caps"&gt;PAUSE &lt;/span&gt;is the system which processes contributor uploads to the &lt;span class="caps"&gt;CPAN, &lt;/span&gt;manages &lt;span class="caps"&gt;CPAN &lt;/span&gt;contributor identity, and builds the &lt;span class="caps"&gt;CPAN &lt;/span&gt;indexes used by &lt;span class="caps"&gt;CPAN &lt;/span&gt;clients to locate libraries for installation.&lt;/p&gt;

&lt;p&gt;In previous years, I also spent a significant amount of time working with other attendees on their contributions, and plan to do the same this year. This is one of the several reasons that attendance in person is incomparably superior to "virtual attendance."&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Deliverable Elements&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;The QA Hackathon does not have a set agenda, so promising specific work product from it up front seems unwise. I have detailed, above, the sort of work that I am almost certain to do, however. Further, I will provide a public, written report of my activities at the Hackathon.&lt;/p&gt;

&lt;p&gt;Any software that I produce will be released under the Perl 5 standard license terms.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Applicant Biography&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;I have been building software in Perl professionally for about twelve years. I am a frequent contributor of original software to the &lt;span class="caps"&gt;CPAN &lt;/span&gt;and a frequent contributor to, or maintainer of, other popular &lt;span class="caps"&gt;CPAN &lt;/span&gt;libraries. I am also a contributor to the core Perl 5 project, and its current project lead.&lt;/p&gt;

&lt;p&gt;I have been the recipient of &lt;span class="caps"&gt;TPF &lt;/span&gt;grants twice before, both of which were completed promptly and successfully.&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2012-01-31T10:18:05Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:news.perlfoundation.org,2012://18.2954</guid>
    </item>
    <item>
      <author>nobody@example.com (jonasbn)</author>
      <dc:creator>nobody@example.com (jonasbn)</dc:creator>
      <category>Uncategorized cpan opensource perl release</category>
      <link>http://logiclab.org/wordpress/2012/01/31/cpan-release-businessdkphonenumber-0-04/</link>
      <description>&lt;p style="text-align: left"&gt;My friend, colleague and fellow Copenhagen Perl Monger Asbjørn Thegler reported a bug with &lt;a href="http://logiclab.jira.com/wiki/display/BDKPHN/Home"&gt;Business::DK::Phonenumber&lt;/a&gt; (&lt;a href="http://logiclab.jira.com/browse/BDKPHN-10"&gt;BDKPHN-10&lt;/a&gt;).&lt;/p&gt;
&lt;p style="text-align: left"&gt;Looking at the code we found out that parts of it made no sense. Asbjørn provided me with a good example demonstrating the bug, so this was quickly translated to a test (&lt;a href="http://logiclab.jira.com/source/browse/BDKPHN/trunk/t/BDKPHN-10.t?hb=true"&gt;BDKPHN-10&lt;/a&gt;) and the non-sense code and the issue could be addressed.&lt;/p&gt;
&lt;p style="text-align: left"&gt;The release has been uploaded to PAUSE and should be available on CPAN.&lt;/p&gt;
&lt;p style="text-align: left"&gt;Thanks to Asbjørn for reporting the bug.&lt;/p&gt;
&lt;p style="text-align: left"&gt;jonasbn, Copenhagen&lt;/p&gt;
&lt;p style="text-align: left"&gt;PS. this post was cross-posted from the &lt;a href="http://logiclab.jira.com/wiki/pages/viewrecentblogposts.action?key=BDKPHN"&gt;project blog on Business::DK::Phonenumber&lt;/a&gt;&lt;/p&gt;
</description>
      <dc:date>2012-01-31T08:16:42Z</dc:date>
      <dc:subject>Uncategorized cpan opensource perl release</dc:subject>
      <title>CPAN Release Business::DK::Phonenumber 0.04</title>
      <pubDate>Tue, 31 Jan 2012 08:16:42 -0000</pubDate>
      <content:encoded>&lt;p style="text-align: left"&gt;My friend, colleague and fellow Copenhagen Perl Monger Asbjørn Thegler reported a bug with &lt;a href="http://logiclab.jira.com/wiki/display/BDKPHN/Home"&gt;Business::DK::Phonenumber&lt;/a&gt; (&lt;a href="http://logiclab.jira.com/browse/BDKPHN-10"&gt;BDKPHN-10&lt;/a&gt;).&lt;/p&gt;
&lt;p style="text-align: left"&gt;Looking at the code we found out that parts of it made no sense. Asbjørn provided me with a good example demonstrating the bug, so this was quickly translated to a test (&lt;a href="http://logiclab.jira.com/source/browse/BDKPHN/trunk/t/BDKPHN-10.t?hb=true"&gt;BDKPHN-10&lt;/a&gt;) and the non-sense code and the issue could be addressed.&lt;/p&gt;
&lt;p style="text-align: left"&gt;The release has been uploaded to PAUSE and should be available on CPAN.&lt;/p&gt;
&lt;p style="text-align: left"&gt;Thanks to Asbjørn for reporting the bug.&lt;/p&gt;
&lt;p style="text-align: left"&gt;jonasbn, Copenhagen&lt;/p&gt;
&lt;p style="text-align: left"&gt;PS. this post was cross-posted from the &lt;a href="http://logiclab.jira.com/wiki/pages/viewrecentblogposts.action?key=BDKPHN"&gt;project blog on Business::DK::Phonenumber&lt;/a&gt;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2012-01-31T08:16:42Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://logiclab.org/wordpress/2012/01/31/cpan-release-businessdkphonenumber-0-04/</guid>
    </item>
    <item>
      <author>nobody@example.com (Jonathan Swartz)</author>
      <dc:creator>nobody@example.com (Jonathan Swartz)</dc:creator>
      <category>Perl</category>
      <link>http://www.openswartz.com/2012/01/31/stop-running-tests-on-install/</link>
      <description>chromatic shows users how to run tests faster on cpanm and perlbrew
installs. This strikes me as well-meaning advice that misses a much more
basic point:

cpanm and perlbrew should not run tests by default.

This may sound heretical. Perl has always had a strong testing culture,
and end-user testing may have once played a valuable role in testing a
distribution under many systems. But we now have a CPAN Testers network
which will run tests on countless systems and Perl versions, and report
failures back to the author promptly and automatically. Distributions can
be sent through the Testers’ gauntlet before ever being officially
released. In this environment, it’s hard to see much additional value in
ad hoc end-user testing.

As Dave Rolsky points out, we install most other software without running
tests and rarely give it a thought.

None of this would matter if end-user testing was free. But it is not.


The costs of end-user testing

Slower installs. On my system, a fresh install of Moose and its
dependencies takes three times longer with tests (2 minutes versus 41
seconds). A fresh install of Catalyst and its dependencies takes nearly
four times longer with tests (9.5 minutes versus 2.5 minutes).

How many new Perl users find CPAN installs much slower than they need to
be? How many would choose a 3-4 times speedup if they knew it was an
option? It’s like having a turbo button and leaving it unpressed by
default.

False positives. The more tests CPAN authors write, the more likely an
occasional false-positive failure sneaks through (as in “Failed 1/1746
tests.”) In most such cases the module will still work for the user’s
purposes. But the default behavior is to prevent the module from being
installed at all. If your module depends on other modules, then any
failure up the dependency chain likewise prevents your module from being
installed, even if the failure has no bearing on your module’s efficacy.

How many new Perl users have unnecessarily failed to install a module
like Moose or Catalyst because of an obscure, temporary failure deep in
the dependency chain?

Fear of dependencies and code reuse. Slower installs and false positives
are the main reasons why people complain about distributions having “too
many dependencies”. (If the dependencies installed quickly and reliably,
as they do with –notest and apt-get and yum, would anyone complain or
even notice?) These complaints in turn encourage module authors to reduce
or eliminate their dependencies, thus reinventing where they could be
reusing.


It’s the wrong default for new users

Some veteran Perl folks may like tests to run on every install. That’s
fine. But I suspect new Perl users just want things to install quickly
and reliably, and in any event don’t have the experience to evaluate or
take action on a test failure (especially one in an obscure dependency).
For these users running tests is simply the wrong default.

I turn on –notest on each system I administer and preach it
enthusiastically to every new Perl user I encounter. But I wish I didn’t
have to mention it at all.</description>
      <dc:date>2012-01-31T06:51:13Z</dc:date>
      <dc:subject>Perl</dc:subject>
      <title>Stop running tests on install!</title>
      <pubDate>Tue, 31 Jan 2012 06:51:13 -0000</pubDate>
      <content:encoded>&lt;p&gt;chromatic shows users how to &lt;a href="http://www.modernperlbooks.com/mt/2012/01/speed-up-perlbrew-with-test-parallelism.html"&gt;run tests faster&lt;/a&gt; on cpanm and perlbrew installs. This strikes me as well-meaning advice that misses a much more basic point:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;cpanm and perlbrew should not run tests by default.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This may sound heretical. Perl has always had a strong testing culture, and end-user testing may have once played a valuable role in testing a distribution under many systems. But we now have a &lt;a href="http://wiki.cpantesters.org/"&gt;CPAN Testers network&lt;/a&gt; which will run tests on countless systems and Perl versions, and report failures back to the author promptly and automatically. Distributions can be sent through the Testers&amp;#8217; gauntlet &lt;a href="http://blogs.perl.org/users/buddy_burden/2012/01/a-tale-of-cpan-testers.html"&gt;before ever being officially released&lt;/a&gt;. In this environment, it&amp;#8217;s hard to see much additional value in ad hoc end-user testing.&lt;/p&gt;
&lt;p&gt;As Dave Rolsky points out, we &lt;a href="http://blog.urth.org/2009/05/the-real-problem-with-dependencies.html"&gt;install most other software without running tests&lt;/a&gt; and rarely give it a thought.&lt;/p&gt;
&lt;p&gt;None of this would matter if end-user testing was free. But it is not.&lt;/p&gt;
&lt;h3&gt;The costs of end-user testing&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Slower installs.&lt;/strong&gt; On my system, a fresh install of &lt;a href="http://search.cpan.org/perldoc?Moose"&gt;Moose&lt;/a&gt; and its dependencies takes &lt;em&gt;three times&lt;/em&gt; longer with tests (2 minutes versus 41 seconds). A fresh install of &lt;a href="http://search.cpan.org/perldoc?Catalyst"&gt;Catalyst&lt;/a&gt; and its dependencies takes nearly &lt;em&gt;four times&lt;/em&gt; longer with tests (9.5 minutes versus 2.5 minutes).&lt;/p&gt;
&lt;p&gt;How many new Perl users find CPAN installs much slower than they need to be? How many would choose a 3-4 times speedup if they knew it was an option? It&amp;#8217;s like having a turbo button and leaving it unpressed by default.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;False positives.&lt;/strong&gt; The more tests CPAN authors write, the more likely an occasional false-positive failure sneaks through (as in &amp;#8220;Failed 1/1746 tests.&amp;#8221;) In most such cases the module will still work for the user&amp;#8217;s purposes. But the default behavior is to &lt;em&gt;prevent the module from being installed at all&lt;/em&gt;. If your module depends on other modules, then any failure up the dependency chain likewise prevents your module from being installed, even if the failure has no bearing on your module&amp;#8217;s efficacy.&lt;/p&gt;
&lt;p&gt;How many new Perl users have unnecessarily failed to install a module like Moose or Catalyst because of an obscure, temporary failure deep in the dependency chain?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fear of dependencies and code reuse.&lt;/strong&gt; Slower installs and false positives are the main reasons why people &lt;a href="http://perlmonks.org/?node_id=760581"&gt;complain&lt;/a&gt; about distributions having &amp;#8220;too many dependencies&amp;#8221;. (If the dependencies installed quickly and reliably, as they do with &amp;#8211;notest and apt-get and yum, would anyone complain or even notice?) These  complaints in turn encourage module authors to &lt;a href="http://perldancer.org/"&gt;reduce&lt;/a&gt; or &lt;a href="http://search.cpan.org/~ams/Mojolicious-2.46/lib/Mojolicious/Guides/FAQ.pod#Why_doesn%27t_Mojolicious_have_any_dependencies?"&gt;eliminate&lt;/a&gt; their dependencies, thus reinventing where they could be reusing.&lt;/p&gt;
&lt;h3&gt;It&amp;#8217;s the wrong default for new users&lt;/h3&gt;
&lt;p&gt;Some veteran Perl folks may like tests to run on every install. That&amp;#8217;s fine. But I suspect &lt;em&gt;new&lt;/em&gt; Perl users just want things to install quickly and reliably, and in any event don&amp;#8217;t have the experience to evaluate or take action on a test failure (especially one in an obscure dependency). For these users running tests is simply the wrong default.&lt;/p&gt;
&lt;p&gt;I turn on &amp;#8211;notest on each system I administer and preach it enthusiastically to every new Perl user I encounter. But I wish I didn&amp;#8217;t have to mention it at all.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2012-01-31T06:51:13Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.openswartz.com/?p=190</guid>
    </item>
    <item>
      <author>nobody@example.com (David E. Wheeler)</author>
      <dc:creator>nobody@example.com (David E. Wheeler)</dc:creator>
      <link>http://feedproxy.google.com/~r/justatheory/atomsum/~3/TloDXCSP52M/sql-change-management-sans-redundancy.html</link>
      <description>In the previous episode in this series, I had one issue with regard to
SQL change management that I wanted to resolve: duplication of code
between deploy and revert scripts sucks. Worse still is the duplication
of code to change just one line of a procedure. Here’s how I propose to
eliminate the dupes.

Read More »

[IMAGE]</description>
      <dc:date>2012-01-30T16:00:00Z</dc:date>
      <title>SQL Change Management Sans Duplication</title>
      <pubDate>Mon, 30 Jan 2012 16:00:00 -0000</pubDate>
      <content:encoded>
&lt;p&gt;In the &lt;a href="/computers/databases/vcs-sql-change-management.html"&gt;previous episode&lt;/a&gt; in this series, I had one issue with regard to SQL change management that I wanted to resolve: duplication of code between deploy and revert scripts sucks. Worse still is the duplication of code to change just one line of a procedure. Here&amp;rsquo;s how I propose to eliminate the dupes.&lt;/p&gt;&lt;p&gt;&lt;a href="http://justatheory.com/computers/databases/sql-change-management-sans-redundancy.html"&gt;Read More »&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/justatheory/atomsum/~4/TloDXCSP52M"&gt;</content:encoded>
      <dcterms:modified>2012-01-30T16:00:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:justatheory.com,2012:/computers/databases/sql-change-management-sans-redundancy</guid>
    </item>
    <item>
      <author>nobody@example.com (Andy Lester)</author>
      <dc:creator>nobody@example.com (Andy Lester)</dc:creator>
      <category>Conferences CPAN Perl 5 Perl 6</category>
      <link>http://feedproxy.google.com/~r/PerlBuzz/~3/MCCZZFS-6YE/perlbuzz-news-roundup-for-2012-01-30.html</link>
      <description>These links are collected from the Perlbuzz Twitter feed. If you have
suggestions for news bits, please mail me at andy@perlbuzz.com.

  * Open source is improv, so say "Yes and" (petdance.com)

  * craigslist donates $100,000 to the Perl Foundation (news.perlfoundation.org)

  * Text::AsciiTeX renders TeX formulas as ASCII art (blogs.perl.org)

  * The most important pig in the office (with nod to @chipsalz, too) (petdance.com)

  * An hour-long video of Damian Conway talking Perl and physics (blip.tv)

  * Speed up Perlbrew with parallel tests (modernperlbooks.com)

  * Visualizing the Perl 5 support policy (dagolden.com)

  * MooseX::Role::Loggable adds logging goodness to your objects (blogs.perl.org)

  * Rakudo Star 2012.01 released (rakudo.org)

  * What's next in Rakudo (6guts.wordpress.com)

  * I'll be presenting "29 ways to get started in open source today" at
    YAPC:NA (act.yapcna.org)

  * DC-Baltimore Perl Workshop is April 14th. $25 for two tracks of
    talks. (dcbpw.org)

[IMAGE] [IMAGE] [IMAGE] [IMAGE][IMAGE]</description>
      <dc:date>2012-01-30T15:05:03Z</dc:date>
      <dc:subject>Conferences CPAN Perl 5 Perl 6</dc:subject>
      <title>Perlbuzz news roundup for 2012-01-30</title>
      <pubDate>Mon, 30 Jan 2012 15:05:03 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;
These links are collected from the
&lt;a href="http://twitter.com/perlbuzz"&gt;Perlbuzz Twitter feed&lt;/a&gt;.
If you have suggestions for news bits, please mail me at
&lt;a href="mailto:andy@perlbuzz.com"&gt;andy@perlbuzz.com&lt;/a&gt;.
&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;Open source is improv, so say "Yes and" (&lt;a href="http://petdance.com/2012/01/open-source-is-improv-so-say-yes-and/"&gt;petdance.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;craigslist donates $100,000 to the Perl Foundation (&lt;a href="http://news.perlfoundation.org/2012/01/craigslist-charitable-fund-don.html"&gt;news.perlfoundation.org&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Text::AsciiTeX renders TeX formulas as ASCII art (&lt;a href="http://blogs.perl.org/users/joel_berger/2012/01/announcing-textasciitex.html"&gt;blogs.perl.org&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The most important pig in the office (with nod to &lt;a href="http://twitter.com/chipsalz"&gt;@chipsalz&lt;/a&gt;, too) (&lt;a href="http://petdance.com/2012/01/the-most-important-stuffed-pig-in-the-company/"&gt;petdance.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;An hour-long video of Damian Conway talking Perl and physics (&lt;a href="http://blip.tv/open-source-developers-conference/temporally-quaquaversal-virtual-nanomachine-programming-in-multiple-topologically-4466153"&gt;blip.tv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Speed up Perlbrew with parallel tests (&lt;a href="http://www.modernperlbooks.com/mt/2012/01/speed-up-perlbrew-with-test-parallelism.html"&gt;modernperlbooks.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Visualizing the Perl 5 support policy (&lt;a href="http://www.dagolden.com/index.php/1605/visualizing-the-perl-5-support-policy/"&gt;dagolden.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;MooseX::Role::Loggable adds logging goodness to your objects (&lt;a href="http://blogs.perl.org/users/sawyer_x/2012/01/i-love-moosexroleloggable.html"&gt;blogs.perl.org&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Rakudo Star 2012.01 released (&lt;a href="http://rakudo.org/2012/01/28/rakudo-star-2012-01-released/"&gt;rakudo.org&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;What's next in Rakudo (&lt;a href="http://6guts.wordpress.com/2012/01/29/this-months-rakudo-star-release-and-whats-coming-next/"&gt;6guts.wordpress.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;I'll be presenting "29 ways to get started in open source today" at YAPC:NA (&lt;a href="http://act.yapcna.org/2012/talk/31"&gt;act.yapcna.org&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;DC-Baltimore Perl Workshop is April 14th. $25 for two tracks of talks. (&lt;a href="http://dcbpw.org/dcbpw2012/"&gt;dcbpw.org&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=MCCZZFS-6YE:fAE2enYJ1pA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=yIl2AUoC8zA"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=MCCZZFS-6YE:fAE2enYJ1pA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=MCCZZFS-6YE:fAE2enYJ1pA:F7zBnMyn0Lo"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=MCCZZFS-6YE:fAE2enYJ1pA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=MCCZZFS-6YE:fAE2enYJ1pA:V_sGLiPBpWU"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=MCCZZFS-6YE:fAE2enYJ1pA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=qj6IDK7rITs"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PerlBuzz/~4/MCCZZFS-6YE"&gt;</content:encoded>
      <dcterms:modified>2012-01-30T15:05:03Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:perlbuzz.com,2012://1.865</guid>
    </item>
    <item>
      <author>nobody@example.com (Karen)</author>
      <dc:creator>nobody@example.com (Karen)</dc:creator>
      <category>Grants perl5 core maintenance</category>
      <link>http://news.perlfoundation.org/2012/01/fixing-perl5-core-bugs-report-19.html</link>
      <description>Dave Mitchell writes:

As per my grant conditions, here is a report for the December period.

Spent it continuing my overhaul of the re_eval mechanism. This month I
finished off fixing literal code blocks within patterns; that is to say,
in all places where a code block appears literally within a quoted-regex
context in perl source, that code block will only be compiled
once, at the same time as the surrounding perl code, and then passed
round as necessary rather than being recompiled.

The main things left to do are to fix non-literal code blocks, e.g.

$code = '(?{...})';
use re 'eval';
/abc$code/;

and make the code blocks be invoked in such a way that things like die,
return and caller() will work.

Over the last month I have averaged 8 hours per week.

As of 2011/12/31: since the beginning of the grant:

  94.9 weeks
  1052.4 total hours
  11.1 average hours per week

There are now 248 hours left on the grant.

Report for period 2011/12/01 to 2011/12/31 inclusive

Summary

Effort (HH::MM):

  0:00 diagnosing bugs
  37:00 fixing bugs
  0:00 reviewing other people's bug fixes
  0:00 reviewing ticket histories
  0:00 review the ticket queue (triage)
  -----
  37:00 Total

Numbers of tickets closed:

  0 tickets closed that have been worked on
  0 tickets closed related to bugs that have been fixed
  0 tickets closed that were reviewed but not worked on (triage)
  -----
  0 Total

Short Detail

  37:00 [perl #34161] METABUG - (?{...}) and (??{...}) regexp issues</description>
      <dc:date>2012-01-30T08:46:42Z</dc:date>
      <dc:subject>Grants perl5 core maintenance</dc:subject>
      <title>Fixing Perl5 Core Bugs: Report for Month 22</title>
      <pubDate>Mon, 30 Jan 2012 08:46:42 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;&lt;em&gt;Dave Mitchell writes:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As per my grant conditions, here is a report for the December period.&lt;/p&gt;

&lt;p&gt;Spent it continuing my overhaul of the re_eval mechanism. This month I finished off fixing literal code blocks within patterns; that is to say, in all places where a code block appears literally within a quoted-regex context in perl source, that code block will only be compiled&lt;br /&gt;
once, at the same time as the surrounding perl code, and then passed round as necessary rather than being recompiled.&lt;/p&gt;

&lt;p&gt;The main things left to do are to fix non-literal code blocks, e.g.&lt;/p&gt;

&lt;p&gt;   $code = '(?{...})';&lt;br /&gt;
   use re 'eval';&lt;br /&gt;
   /abc$code/;&lt;/p&gt;

&lt;p&gt;and make the code blocks be invoked in such a way that things like die,&lt;br /&gt;
return and caller() will work.&lt;/p&gt;

&lt;p&gt;Over the last month I have averaged 8 hours per week.&lt;/p&gt;

&lt;p&gt;As of 2011/12/31: since the beginning of the grant:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;94.9 weeks&lt;br /&gt;
1052.4 total hours&lt;br /&gt;
11.1 average hours per week&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;There are now 248 hours left on the grant.&lt;/p&gt;

&lt;p&gt;Report for period 2011/12/01 to 2011/12/31 inclusive&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;
  &lt;br /&gt;
Effort (HH::MM):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;0:00 diagnosing bugs&lt;br /&gt;
37:00 fixing bugs&lt;br /&gt;
0:00 reviewing other people's bug fixes&lt;br /&gt;
0:00 reviewing ticket histories&lt;br /&gt;
0:00 review the ticket queue (triage)&lt;br /&gt;
-----&lt;br /&gt;
&lt;b&gt;37:00 Total&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;b&gt;Numbers of tickets closed:&lt;/b&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;0 tickets closed that have been worked on&lt;br /&gt;
0 tickets closed related to bugs that have been fixed&lt;br /&gt;
0 tickets closed that were reviewed but not worked on (triage)&lt;br /&gt;
-----&lt;br /&gt;
&lt;b&gt;0 Total&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;b&gt;Short Detail&lt;/b&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;37:00 [perl #34161] &lt;span class="caps"&gt;METABUG &lt;/span&gt;- (?{...}) and (??{...}) regexp issues&lt;/p&gt;&lt;/blockquote&gt;
        
    </content:encoded>
      <dcterms:modified>2012-01-30T08:46:42Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:news.perlfoundation.org,2012://18.2952</guid>
    </item>
    <item>
      <author>nobody@example.com (Sawyer X)</author>
      <dc:creator>nobody@example.com (Sawyer X)</dc:creator>
      <category>Code Design Perl</category>
      <link>http://blogs.perl.org/users/sawyer_x/2012/01/call-of-the-callback-inversion-of-control-or-just-coolness.html</link>
      <description>Suppose I have a Runner which holds a Prober object. I need the Runner to
call the Prober and update stuff according to the result. Pretty simple,
right?


my $prober = Prober-&gt;new(...);
my $result = $prober-&gt;check;
if ( $result eq 'whatiwant' ) {
$self-&gt;update($stuff);
}

However, I'm running in asynchronous mode, which means I need the prober
and update to run somewhere in the loop, and I can't just sit around and
wait for a reply. I gotz otha dingz to do, mon! So, I have two options:

- I call the Prober and sends it the Runner object ($self to you). Once
the Prober is done, it will call the correct update method in the Runner
object object.
- The Runner calls the Prober and sends it a callback containing updating
code.

I asked around at $work and had been suggested to use the first method.
Instead, I actually went for the second. (let this be a lesson to you:
always listen to suggestions, but make up your mind youself!)

What I didn't like about the first method is that I'm sending the entire
Runner object to a very small intermediate object. Felt kind of dirty.
But, the more I thought about it, I noticed there was something else I
didn't like about it. I'm basically putting a lot of Runner object into
the Prober. That's not right...

By sending a callback to the Prober instead of the entire Runner object,
I gain the following:
- The Prober doesn't need to know about any object other than itself. It
doesn't know what you send it (other than a callback), not does it care.
- If I need to change the updating code, I only need to change what I
send the Prober. I never need to change the Prober itself, it remains
exactly the same.
- I can send a lot of other stuff as well, not just updating code.

In my case I could even set this callback on the initialization of the
Prober object. This is how it would look:

Prober-&gt;new(
...
on_change =&gt; sub {
$self-&gt;log("Updating...");
$self-&gt;update($stuff); # suppose this is curried method from
$self-&gt;updater
},
);

How cool is that? Very cool!

It would be much cooler though if I could present this situation to you
in an interesting way, such as how Tom Wyant does it. Damn, I'm jealous!
I'll try though!</description>
      <dc:date>2012-01-30T08:32:25Z</dc:date>
      <dc:subject>Code Design Perl</dc:subject>
      <title>Call of the callback: Inversion of Control or just coolness?</title>
      <pubDate>Mon, 30 Jan 2012 08:32:25 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;Suppose I have a Runner which holds a Prober object. I need the Runner to call the Prober and update stuff according to the result. Pretty simple, right?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br /&gt;
my $prober = Prober-&amp;gt;new(...);&lt;br /&gt;
my $result = $prober-&amp;gt;check;&lt;br /&gt;
if ( $result eq 'whatiwant' ) {&lt;br /&gt;
    $self-&amp;gt;update($stuff);&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;However, I'm running in asynchronous mode, which means I need the prober and update to run somewhere in the loop, and I can't just sit around and wait for a reply. I gotz otha dingz to do, mon! So, I have two options:&lt;/p&gt;

&lt;p&gt;- I call the Prober and sends it the Runner object (&lt;code&gt;$self&lt;/code&gt; to you). Once the Prober is done, it will call the correct &lt;code&gt;update&lt;/code&gt; method in the Runner object object.&lt;br /&gt;
- The Runner calls the Prober and sends it a callback containing updating code.&lt;/p&gt;

&lt;p&gt;I asked around at $work and had been suggested to use the first method. Instead, I actually went for the second. (let this be a lesson to you: always listen to suggestions, but make up your mind youself!)&lt;/p&gt;

&lt;p&gt;What I didn't like about the first method is that I'm sending the &lt;bold&gt;entire&lt;/bold&gt; Runner object to a very small intermediate object. Felt kind of dirty. But, the more I thought about it, I noticed there was something else I didn't like about it. I'm basically putting a lot of Runner object into the Prober. That's not right...&lt;/p&gt;

&lt;p&gt;By sending a callback to the Prober instead of the entire Runner object, I gain the following:&lt;br /&gt;
- The Prober doesn't need to know about any object other than itself. It doesn't know what you send it (other than a callback), not does it care.&lt;br /&gt;
- If I need to change the updating code, I only need to change what I send the Prober. I  never need to change the Prober itself, it remains exactly the same.&lt;br /&gt;
- I can send a lot of other stuff as well, not just updating code.&lt;/p&gt;

&lt;p&gt;In my case I could even set this callback on the initialization of the Prober object. This is how it would look:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
Prober-&amp;gt;new(&lt;br /&gt;
    ...&lt;br /&gt;
    on_change =&amp;gt; sub {&lt;br /&gt;
        $self-&amp;gt;log("Updating...");&lt;br /&gt;
        $self-&amp;gt;update($stuff); # suppose this is curried method from $self-&amp;gt;updater&lt;br /&gt;
    },&lt;br /&gt;
);&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;How cool is that? Very cool!&lt;/p&gt;

&lt;p&gt;It would be much cooler though if I could present this situation to you in an interesting way, such as how &lt;a href="http://blogs.perl.org/users/tom_wyant/"&gt;Tom Wyant&lt;/a&gt; does it. Damn, I'm jealous! I'll try though!&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2012-01-30T08:32:25Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogs.perl.org,2012:/users/sawyer_x//87.2742</guid>
    </item>
    <item>
      <author>nobody@example.com (C.J. Adams-Collier)</author>
      <dc:creator>nobody@example.com (C.J. Adams-Collier)</dc:creator>
      <category>Uncategorized</category>
      <link>http://wp.colliertech.org/cj/?p=1137</link>
      <description>Happy birthday, Scarlet, Teresa, Hannah and Tyra!

image</description>
      <dc:date>2012-01-29T01:05:32Z</dc:date>
      <dc:subject>Uncategorized</dc:subject>
      <title>Birthday pizzas!</title>
      <pubDate>Sun, 29 Jan 2012 01:05:32 -0000</pubDate>
      <content:encoded>&lt;p&gt;Happy birthday, Scarlet, Teresa, Hannah and Tyra!&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="http://wp.colliertech.org/cj/wp-content/uploads/2012/01/wpid-IMG_20120128_165329.jpg"&gt;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2012-01-29T01:05:32Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://wp.colliertech.org/cj/?p=1137</guid>
    </item>
    <item>
      <author>nobody@example.com (Andrew)</author>
      <dc:creator>nobody@example.com (Andrew)</dc:creator>
      <category>Uncategorised Google Privacy</category>
      <link>http://blog.andrew-jones.com/2012/01/28/what-google-thinks-of-me/</link>
      <description>What Google Thinks of Me

35-44? I still get ID’d for beer!

Also, I am obviously a geek (but I don’t like Java…).</description>
      <dc:date>2012-01-28T06:36:54Z</dc:date>
      <dc:subject>Uncategorised Google Privacy</dc:subject>
      <title>What Google Thinks of Me</title>
      <pubDate>Sat, 28 Jan 2012 06:36:54 -0000</pubDate>
      <content:encoded>&lt;p&gt;&lt;a href="http://blog.andrew-jones.com/wp-content/uploads/2012/01/what-google-thinks-of-me.png"&gt;&lt;img src="http://blog.andrew-jones.com/wp-content/uploads/2012/01/what-google-thinks-of-me.png" alt="What Google Thinks of Me"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;35-44? I still get ID&amp;#8217;d for beer!&lt;/p&gt;
&lt;p&gt;Also, I am obviously a geek (but I don&amp;#8217;t like Java&amp;#8230;).&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2012-01-28T06:36:54Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://blog.andrew-jones.com/?p=1115</guid>
    </item>
    <item>
      <author>nobody@example.com (chromatic)</author>
      <dc:creator>nobody@example.com (chromatic)</dc:creator>
      <category>modern perl perl 5 perlbrew productivity</category>
      <link>http://www.modernperlbooks.com/mt/2012/01/speed-up-perlbrew-with-test-parallelism.html</link>
      <description>Steven Haryanto's Perl First World Problems #1 reminded me of something
I've taken for granted lately.

You may have read my Controlling Test Parallelism with prove and
Parallelism and Test Suites. I still have Test::Harness parallelism
enabled by default on most of the machines where I install my own Perls.
While I haven't yet filed tickets and tried to write patches for modules
which need a little help to run tests in parallel, I've only found a few
lately that need work. That's nice—having a module install through cpanm
in five seconds is a lot better than ten seconds or more. (I like cpanm
because it's fast and quiet, and part of its speed comes from not
printing to the console.)

I like instant feedback.

Like Steven, I noticed quite a while that installing a custom Perl
through perlbrew takes a while, but then I remembered that a lot of work
went into the Perl 5 test suite to make tests run in parallel. (We did
something similar with Parrot several years ago, and it changed the way I
work forever.)

To run core tests in parallel, set the environment variable TEST_JOBS=n,
where n depends on your computer. I use a value of 9 on a quad-core
machine; in practice, that tends to keep the CPU busy while not blocking
anything too long on IO. You can set it globally in your shell's
configuration file or create an alias or wrapper for perlbrew.

As most of the time spent compiling and installing Perl 5 through
perlbrew goes to running the test suite, this has saved me a measurable
amount of time.</description>
      <dc:date>2012-01-27T21:20:46Z</dc:date>
      <dc:subject>modern perl perl 5 perlbrew productivity</dc:subject>
      <title>Speed up Perlbrew with Test Parallelism</title>
      <pubDate>Fri, 27 Jan 2012 21:20:46 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;Steven Haryanto's &lt;a href="http://blogs.perl.org/users/steven_haryanto/2012/01/perl-first-world-problems-1.html"&gt;Perl First World Problems #1&lt;/a&gt; reminded me of something I've taken for granted lately.&lt;/p&gt;

&lt;p&gt;You may have read my &lt;a href="http://www.modernperlbooks.com/mt/2011/12/controlling-test-parallelism-with-prove.html"&gt;Controlling
Test Parallelism with prove&lt;/a&gt; and &lt;a href="http://www.modernperlbooks.com/mt/2011/11/parallelism-and-test-suites.html"&gt;Parallelism
and Test Suites&lt;/a&gt;. I still have &lt;code&gt;Test::Harness&lt;/code&gt; parallelism
enabled by default on most of the machines where I install my own Perls. While
I haven't yet filed tickets and tried to write patches for modules which need a
little help to run tests in parallel, I've only found a few lately that need
work. That's nice&amp;mdash;having a module install through &lt;code&gt;cpanm&lt;/code&gt; in
five seconds is a lot better than ten seconds or more. (I like
&lt;code&gt;cpanm&lt;/code&gt; because it's &lt;em&gt;fast&lt;/em&gt; and quiet, and part of its speed
comes from not printing to the console.)&lt;/p&gt;

&lt;p&gt;I like instant feedback.&lt;/p&gt;

&lt;p&gt;Like Steven, I noticed quite a while that installing a custom Perl through &lt;a href="http://perlbrew.org/"&gt;perlbrew&lt;/a&gt; takes a while, but then I remembered that a lot of work went into the Perl 5 test suite to make tests run in parallel. (We did something similar with Parrot several years ago, and it changed the way I work forever.)&lt;/p&gt;

&lt;p&gt;To run core tests in parallel, set the environment variable
&lt;code&gt;TEST_JOBS=&lt;em&gt;n&lt;/em&gt;&lt;/code&gt;, where &lt;em&gt;n&lt;/em&gt; depends on your computer. I
use a value of 9 on a quad-core machine; in practice, that tends to keep the
CPU busy while not blocking anything too long on IO. You can set it globally in
your shell's configuration file or create an alias or wrapper for
&lt;code&gt;perlbrew&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As most of the time spent compiling and installing Perl 5 through perlbrew
goes to running the test suite, this has saved me a measurable amount of
time.&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2012-01-27T21:20:46Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.modernperlbooks.com,2012:/mt//1.406</guid>
    </item>
    <item>
      <author>nobody@example.com (brian d foy)</author>
      <dc:creator>nobody@example.com (brian d foy)</dc:creator>
      <link>http://blogs.perl.org/users/brian_d_foy/2012/01/yapc-achievements.html</link>
      <description>Want to make YAPC a game? Want elite points for doing things at YAPC?
Want to be the person to give out the points?

JT Smith was at the Windy City Perl Mongers last night giving his The
Game Crafter talk as an exemplar of the talks he wants at YAPC in
Madison. It's more about his application of Perl to one of his businesses
than just explaining another module or framework.

After the talk when JT and I were headed back uptown, we started talking
about achievements for YAPC. You do something and you get some sort of
recognition. That might be for giving a talk, showing up at the keynote,
donating money, talking to Schwern, posting a picture of YAPC on Twitter,
and all sorts of other things.

The trick however, is to find the capacity to implement all the ideas.
Someone must already have implemented something close.

Yanick already has perl achievements (although it's not on CPAN, wtf
Yanick? :)

QR codes are one of the big things at YAPC this year. I wonder if someone
could combine the two. You access the URL, which identifies your scanning
device somehow, and it activates the right achievement.

It would really be nice to integrate this into Act so you can have
trans-YAPC achievements and so on, but hey, baby steps.

This is actually something I would like to do, but JT has me working on
another big project for YAPC, and this year is all about focus.</description>
      <dc:date>2012-01-27T18:46:39Z</dc:date>
      <title>YAPC Achievements</title>
      <pubDate>Fri, 27 Jan 2012 18:46:39 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;Want to make YAPC a game? Want elite points for doing things at YAPC? Want to be the person to give out the points? &lt;/p&gt;

&lt;p&gt;JT Smith was at the Windy City Perl Mongers last night giving his &lt;a href="http://www.madmongers.org/talks/the-game-crafter-2.0#idjRBUEFx6KgeOzwFrzqmm9A"&gt;The Game Crafter talk&lt;/a&gt; as an exemplar of the talks he wants at YAPC in Madison. It's more about his application of Perl to one of his businesses than just explaining another module or framework.&lt;/p&gt;

&lt;p&gt;After the talk when JT and I were headed back uptown, we started talking about achievements for YAPC. You do something and you get some sort of recognition. That might be for giving a talk, showing up at the keynote, donating money, talking to Schwern, posting a picture of YAPC on Twitter, and all sorts of other things.&lt;/p&gt;

&lt;p&gt;The trick however, is to find the capacity to implement all the ideas. Someone must already have implemented something close. &lt;/p&gt;

&lt;p&gt;Yanick already has &lt;a href="https://github.com/yanick/Perl-Achievements"&gt;perl achievements&lt;/a&gt; (although it's not on CPAN, wtf Yanick? :)&lt;/p&gt;

&lt;p&gt;QR codes are one of the big things at YAPC this year. I wonder if someone could combine the two. You access the URL, which identifies your scanning device somehow, and it activates the right achievement.&lt;/p&gt;

&lt;p&gt;It would really be nice to integrate this into Act so you can have trans-YAPC achievements and so on, but hey, baby steps.&lt;/p&gt;

&lt;p&gt;This is actually something I would like to do, but JT has me working on another big project for YAPC, and this year is all about focus.&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2012-01-27T18:46:39Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogs.perl.org,2012:/users/brian_d_foy//178.2739</guid>
    </item>
    <item>
      <author>nobody@example.com (rhaen)</author>
      <dc:creator>nobody@example.com (rhaen)</dc:creator>
      <category>NetBSD Perl Unix</category>
      <link>http://www.pkgbox.org/wordpress/2012/01/updating-p5-packages-in-pkgsrc/</link>
      <description>I am updating Perl packages in pkgsrc right now. pkgsrc is the package
management system from the NetBSD project and it is great. It works on
different platforms and different operating systems such as Linux,
Solaris and even on FreeBSD.

The Perl packages really need some love there – some are horribly
outdated and broken. There seem to be Perl packages in pkgsrc which are
older than the versions which are shipped with the Perl core
distribution. It’s alot of work.

Here what I will do in the next days – let’s see how far I can get:

  * update the packages (at least the most)

  * clean up the licenses

  * check the dependencies inside the Makefile.PL (script)

As I’ve mentioned on a talk – it’s not only fun to maintain Perl packages
for a package distribution. But it seems to be fair – compared to someone
who follows the KDE packages :)Ah folks – here is something which I don’t
like:

snowflake:p5-Archive-Tar rhaen$ cvs ci ../../doc/CHANGES-2012 
cvs commit: Up-to-date check failed for `../../doc/CHANGES-2012'
cvs [commit aborted]: correct above errors first!

Can i haz working version control system?</description>
      <dc:date>2012-01-27T08:50:21Z</dc:date>
      <dc:subject>NetBSD Perl Unix</dc:subject>
      <title>Updating p5-* packages in pkgsrc</title>
      <pubDate>Fri, 27 Jan 2012 08:50:21 -0000</pubDate>
      <content:encoded>&lt;p&gt;&lt;img src="http://www.pkgbox.org/wordpress/wp-content/uploads/2012/01/2002-04-07_12-53-17-300x168.jpg" alt=""&gt;I am updating Perl packages in pkgsrc right now. pkgsrc is the package management system from the NetBSD project and it is great. It works on different platforms and different operating systems such as Linux, Solaris and even on FreeBSD.&lt;/p&gt;
&lt;p&gt;The Perl packages really need some love there &amp;#8211; some are horribly outdated and broken. There seem to be Perl packages in pkgsrc which are older than the versions which are shipped with the Perl core distribution. It&amp;#8217;s alot of work.&lt;/p&gt;
&lt;p&gt;Here what I will do in the next days &amp;#8211; let&amp;#8217;s see how far I can get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;update the packages (at least the most)&lt;/li&gt;
&lt;li&gt;clean up the licenses&lt;/li&gt;
&lt;li&gt;check the dependencies inside the Makefile.PL (script)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;As I&amp;#8217;ve mentioned on a talk &amp;#8211; it&amp;#8217;s not only fun to maintain Perl packages for a package distribution. But it seems to be fair &amp;#8211; compared to someone who follows the KDE packages :)&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Ah folks &amp;#8211; here is something which I don&amp;#8217;t like:&lt;/div&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class=""&gt;snowflake:p5-Archive-Tar rhaen$ cvs ci ../../doc/CHANGES-&lt;span&gt;2012&lt;/span&gt; 
cvs commit: Up-to-date check failed for `../../doc/CHANGES-&lt;span&gt;2012&lt;/span&gt;'
cvs &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;commit aborted&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;: correct above errors first!&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Can i haz  working version control system?&lt;/em&gt;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2012-01-27T08:50:21Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.pkgbox.org/wordpress/?p=153</guid>
    </item>
    <item>
      <author>nobody@example.com (David E. Wheeler)</author>
      <dc:creator>nobody@example.com (David E. Wheeler)</dc:creator>
      <link>http://feedproxy.google.com/~r/justatheory/atomsum/~3/QTYAuGwQ6yE/vcs-sql-change-management.html</link>
      <description>In my previous post, I outlined the basics of a configuration-file and
dependency-tracking SQL deployment architecture. But I left it off
wanting to eliminate the need for such a file and still have it all work.
This post outlines just how to do that by relying on VCS history to
determine what changes need to be deployed or reverted.

Read More »</description>
      <dc:date>2012-01-27T07:32:00Z</dc:date>
      <title>VCS-Enabled SQL Change Management</title>
      <pubDate>Fri, 27 Jan 2012 07:32:00 -0000</pubDate>
      <content:encoded>&lt;p&gt;In my &lt;a href="/computers/databases/simple-sql-change-management.html"&gt;previous post&lt;/a&gt;, I outlined the basics of a configuration-file and dependency-tracking SQL deployment architecture. But I left it off wanting to eliminate the need for such a file and still have it all work. This post outlines just how to do that by relying on VCS history to determine what changes need to be deployed or reverted.&lt;/p&gt;&lt;p&gt;
  &lt;a href="http://justatheory.com/computers/databases/vcs-sql-change-management.html"&gt;Read More »&lt;/a&gt;
&lt;/p&gt;&lt;xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" height="1" width="1" /&gt;</content:encoded>
      <dcterms:modified>2012-01-27T07:32:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:justatheory.com,2012:/computers/databases/vcs-sql-change-management</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/Devel-CheckLib-functions</link>
      <title> Devel::CheckLib can now check libraries' contents </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/Devel-CheckLib-functions</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/how-fast-is-nom.html</link>
      <description>Nearly one year ago, the Rakudo Perl 6 developers proudly released the
first Rakudo Star, a distribution aimed at showing the world what Perl 6
can look like, and in turn get feedback from more early adaptors.

And feedback we got. While the overall response was very positive, people
had one main concern: it was too slow. That didn't come as a surprise,
considering that we had focused on features first. Now it was time to
change that, and work on massive performance improvements.

That is easier said than done. One of the reasons is that Rakudo is
tightly coupled to the parrot virtual machine, but there is a lot of
mismatch between the two. For example parrot provides multi dispatch
built-in, but not quite with the semantics that Perl 6 needs. Same for
parameter binding, objects and a number of other areas.

In the following year, parrot got a new, faster garbage collector, and
Jonathan Worthington came up with a cache for type checks at routine call
time.

This sped up this simple mandelbrot fractal generator at size 201x201
from 18 minutes to 16 minutes 14 seconds. Actually the speedup was better
than that, but we paid a performance penalty for new features, bug fixes
and parrot performance regressions.

But it was clear that more substantial improvements where needed. One of
the most promising candidates for speedups is a complete redesign of the
object model, resulting in the "nom" (new object model) branch of Rakudo.
Additionally to providing much more well suited OO primitives than parrot
can offer right now, it also allows to share more information between
compile time and run time, making a lot of optimizations possible.

Yesterday I sped up some operations on Complex numbers, and implemented a
built-in that was missing to run the mandelbrot script. And today I timed
it: 3 Minutes. From originally 18 Minutes.

Now that's a speedup by more than a factor of 5. I'm not sure if it will
extend to other operators, but it sure is encouraging.

And that's without the optimizations that will now be possible, for
example inlining operators. So after a literally slow start, Rakudo Perl
6 has a bright and fast future ahead. And it's already here, just not
evenly distributed.</description>
      <title>How fast is Rakudo's "nom" branch?</title>
      <content:encoded>
&lt;p&gt;Nearly one year ago, the &lt;a href="http://rakudo.org/"&gt;Rakudo Perl 6&lt;/a&gt;
developers proudly released the first &lt;a href="http://rakudo.org/2010/07/29/rakudo-star-2010-07/"&gt;Rakudo Star&lt;/a&gt;, a
distribution aimed at showing the world what Perl 6 can look like, and in turn
get feedback from more early adaptors.&lt;/p&gt;

&lt;p&gt;And feedback we got. While the overall response was very positive, people
had one main concern: it was too slow. That didn't come as a surprise,
considering that we had focused on features first. Now it was time to change
that, and work on massive performance improvements.&lt;/p&gt;

&lt;p&gt;That is easier said than done. One of the reasons is that Rakudo is tightly
coupled to &lt;a href="http://parrot.org/"&gt;the parrot virtual machine&lt;/a&gt;, but
there is a lot of mismatch between the two. For example parrot provides multi
dispatch built-in, but not quite with the semantics that Perl 6 needs. Same
for parameter binding, objects and a number of other areas.&lt;/p&gt;

&lt;p&gt;In the following year, parrot got a new, faster garbage collector, and
Jonathan Worthington came up with a cache for type checks at routine call
time.&lt;/p&gt;

&lt;p&gt;This sped up this simple &lt;a href="https://github.com/colomon/mandelbrot/blob/master/bin/mandelbrot-color.pl"&gt;mandelbrot fractal
generator&lt;/a&gt; at size 201x201 from 18 minutes to 16 minutes 14 seconds.
Actually the speedup was better than that, but we paid a performance penalty
for new features, bug fixes and parrot performance regressions.&lt;/p&gt;

&lt;p&gt;But it was clear that more substantial improvements where needed.
One of the most promising candidates for
speedups is a
&lt;a href="http://6guts.wordpress.com/"&gt;complete redesign of the object
model&lt;/a&gt;, resulting in the &lt;a href="http://pmthium.com/2011/02/08/new-nqp-repository-new-nom-rakudo-branch/"&gt;"nom"
(new object model) branch&lt;/a&gt; of Rakudo. Additionally to providing much more
well suited OO primitives than parrot can offer right now, it also allows to
share more information between compile time and run time, making a lot of
optimizations possible.&lt;/p&gt;

&lt;p&gt;Yesterday I &lt;a href="https://github.com/rakudo/rakudo/commit/437675e330460d0cf801d48a635c413d532e062f"&gt;sped
up some operations on Complex numbers&lt;/a&gt;, and implemented a built-in that was
missing to run the mandelbrot script. And today I timed it: 3 Minutes. From
originally 18 Minutes.&lt;/p&gt;

&lt;p&gt;Now that's a speedup by more than a factor of 5. I'm not sure if it will
extend to other operators, but it sure is encouraging.&lt;/p&gt;

&lt;p&gt;And that's without the optimizations that will now be possible, for example
inlining operators. So after a literally slow start, Rakudo Perl 6 has a
bright and fast future ahead. And it's already here, just not evenly
distributed.&lt;/p&gt;

 
</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/how-fast-is-nom.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/grant-report-errors-2.html</link>
      <description>Progress on my grant for error message is slower than expected, as
expected :-). Life and work, though rewarding, take their toll. Also many
of my original ideas turned out to be not very good, and got shot down by
@Larry (with good reason).

However I did get around to lay out some specification for exceptions in
S32::Exception (rendered) - some basic roles, and the relationships
between exception, Failure (lazy/unthrown exceptions) and backtraces.

More importantly I think I'm at a point where I could start to actually
implement some of that stuff, and use that experience to update the
specification.</description>
      <title>Second Grant Report: Structured Error Messages</title>
      <content:encoded>
&lt;p&gt;Progress on my &lt;a href="http://news.perlfoundation.org/2011/02/hague-grant-application-struct.html"&gt;grant
for error message&lt;/a&gt; is slower than expected, as expected :-). Life and work,
though rewarding, take their toll. Also many of my original ideas turned out
to be not very good, and got shot down by @Larry (with good reason).&lt;/p&gt;

&lt;p&gt;However I did get around to lay out some specification for exceptions in &lt;a href="https://github.com/perl6/specs/blob/master/S32-setting-library/Exception.pod"&gt;S32::Exception&lt;/a&gt;
(&lt;a href="http://perlcabal.org/syn/S32/Exception.html"&gt;rendered&lt;/a&gt;) - some
basic roles, and the relationships between exception, &lt;code&gt;Failure&lt;/code&gt;
(lazy/unthrown exceptions) and backtraces.&lt;/p&gt;

&lt;p&gt;More importantly I think I'm at a point where I could start to actually
implement some of that stuff, and use that experience to update the
specification.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/grant-report-errors-2.html</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/palm-treophonecalldb-first-release</link>
      <title> Palm Treo call db module </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/palm-treophonecalldb-first-release</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/three-functions-of-smartmatch.html</link>
      <description>In Perl 5, if you want to match a regex against a particular string, you
write $string =~ $regex.

In the design process of Perl 6, people have realized that you cannot
only match against regexes, but lots of other things can act as patterns
too: types (checking type conformance), numbers, strings, junctions
(composites of values), subroutine signatures and so on. So smart
matching was born, and it's now written as $topic ~~ $pattern. Being a
general comparison mechanism is the first function of the smart match
operator.

But behold, there were problems. One of them was the perceived need for
special syntactic forms on the right hand side of the smart match
operator to cover some cases. Those were limited and hard to implement.
There was also the fact that now we had two different ways to invoke
regexes: smart matching, and direct invocation as m/.../, which matches
against the topic variable $_. That wasn't really a problem as such, but
it was an indicator of design smell.

And that's where the second function of the smart match operator
originated: topicalization. Previously, $a ~~ $b mostly turned into a
method call, $b.ACCEPTS($a). The new idea was to set the topic variable
to $a in a small scope, which allowed many special cases to go away. It
also nicely unified with given $topic { when $matcher { ... } }, which
was already specified as being a topicalizer.

In the new model, MATCH ~~ PAT becomes something like do { $_ = MATCH;
PAT.ACCEPTS($_) } -- which means that if MATCH accesses $_, it
automatically does what the user wants.

Awesomeness reigned, and it worked out great.

Until the compiler writers actually started to implement a few more cases
of regex matching. The first thing we noticed was that if $str ~~ $regex
{ ... } behaved quite unexpectedly. What happend was that $_ got set to
$str, the match was conducted and returned a Match object. And then
called $match.ACCEPTS($str), which failed. A quick hack around that was
to modify Match.ACCEPTS to always return the invocant (ie the Match on
which it was called), but of course that was only a stop gap solution.

The reason it doesn't work for other, more involved cases of regex
invocations is that they don't fit into the "does $a match $b?" schema.
Two examples:

# :g for "global", all matches
my @matches = $str ~~ m:g/pattern/; 

if $str ~~ s/pattern/substitution/ { ... }

People expect those to work. But global matching of a regex isn't a
simple conformance check, and that is reflected in the return value: a
list. So should we special-cases smart-matching against a list, just
because we can't get global matching to work in smart-matching otherwise?
(People have also proposed to return a kind of aggregate Match object
instead of a list; that comes with the problem that Match objects aren't
lazy, but lists are. You could "solve" that with a LazyMatch type; watch
the pattern of workarounds unfold...)

A substitution is also not a simple matching operation. In Perl 5, a s///
returns the number of successful substitutions. In Perl 6, that wouldn't
work with the current setup of the smart match operator, where it would
then smart-match the string against the returned number of matches.

So to summarize, the smart match operator has three functions: comparing
values to patterns, topicalization, and conducting regex matches.

These three functions are distinct enough to start to interact in weird
ways, which limits the flexibility in choice of return values from regex
matches and substitutions.

I don't know what the best way forward is. Maybe it is to reintroduce a
dedicated operator for regex matching, which seems to be the main feature
with which topicalization interacts badly. Maybe there are other good
ideas out there. If so, I'd love to hear about them.</description>
      <title>The Three-Fold Function of the Smart Match Operator</title>
      <content:encoded>
&lt;p&gt;In Perl 5, if you want to match a regex against a particular
string, you write &lt;code&gt;$string =~ $regex&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the design process of Perl 6, people have realized that you cannot
only match against regexes, but lots of other things can act as
patterns too: types (checking type conformance), numbers, strings,
junctions (composites of values), subroutine signatures and so on. So
&lt;em&gt;smart matching&lt;/em&gt; was born, and it's now written as
&lt;code&gt;$topic ~~ $pattern&lt;/code&gt;. Being a general comparison mechanism
is the first function of the smart match operator.&lt;/p&gt;

&lt;p&gt;But behold, there were problems. One of them was the perceived need
for special syntactic forms on the right hand side of the smart match
operator to cover some cases. Those were limited and hard to
implement. There was also the fact that now we had two different ways
to invoke regexes: smart matching, and direct invocation as
&lt;code&gt;m/.../&lt;/code&gt;, which matches against the topic variable
&lt;code&gt;$_&lt;/code&gt;. That wasn't really a problem as such, but it was an
indicator of design smell.&lt;/p&gt;

&lt;p&gt;And that's where the second function of the smart match operator
originated: topicalization. Previously, &lt;code&gt;$a ~~ $b&lt;/code&gt; mostly
turned into a method call, &lt;code&gt;$b.ACCEPTS($a)&lt;/code&gt;. The new idea
was to &lt;a href="https://github.com/perl6/specs/commit/f2dff276c272399a92a841818842ad663d70f23b"&gt;set
the topic variable to $a in a small scope&lt;/a&gt;, which allowed many
special cases to go away. It also nicely unified with
&lt;code&gt;given $topic { when $matcher  { ... } }&lt;/code&gt;, which was
already specified as being a topicalizer.&lt;/p&gt;

&lt;p&gt;In the new model, &lt;code&gt;MATCH ~~ PAT&lt;/code&gt; becomes something like
&lt;code&gt;do { $_ = MATCH; PAT.ACCEPTS($_) }&lt;/code&gt; -- which means that if
&lt;code&gt;MATCH&lt;/code&gt; accesses &lt;code&gt;$_&lt;/code&gt;, it automatically does what the
user wants.&lt;/p&gt;

&lt;p&gt;Awesomeness reigned, and it worked out great.&lt;/p&gt;

&lt;p&gt;Until the compiler writers actually started to implement a few more
cases of regex matching. The first thing we noticed was that
&lt;code&gt;if $str ~~ $regex { ... }&lt;/code&gt; behaved quite unexpectedly.
What happend was that &lt;code&gt;$_&lt;/code&gt; got set to &lt;code&gt;$str&lt;/code&gt;,
the match was conducted and returned a Match object. And then called
&lt;code&gt;$match.ACCEPTS($str)&lt;/code&gt;, which failed. A quick hack around
that was to modify &lt;code&gt;Match.ACCEPTS&lt;/code&gt; to always return the
invocant (ie the Match on which it was called), but of course that was
only a stop gap solution.&lt;/p&gt;

&lt;p&gt;The reason it doesn't work for other, more involved cases of regex
invocations is that they don't fit into the "does $a match $b?"
schema. Two examples:&lt;/p&gt;

&lt;pre&gt;
# :g for &amp;quot;global&amp;quot;, all matches
my @matches = $str ~~ m:g/pattern/; 

if $str ~~ s/pattern/substitution/ { ... }
&lt;/pre&gt;

&lt;p&gt;People expect those to work. But global matching of a regex isn't a
simple conformance check, and that is reflected in the return value: a
list. So should we special-cases smart-matching against a list, just
because we can't get global matching to work in smart-matching
otherwise? (People have also proposed to return a kind of aggregate
Match object instead of a list; that comes with the problem that Match
objects aren't lazy, but lists are. You could "solve" that with a
LazyMatch type; watch the pattern of workarounds unfold...)&lt;/p&gt;

&lt;p&gt;A substitution is also not a simple matching operation. In Perl 5,
a s/// returns the number of successful substitutions. In Perl 6, that
wouldn't work with the current setup of the smart match operator,
where it would then smart-match the string against the returned number
of matches.&lt;/p&gt;

&lt;p&gt;So to summarize, the smart match operator has three functions:
comparing values to patterns, topicalization, and conducting regex
matches.&lt;/p&gt;

&lt;p&gt;These three functions are distinct enough to start to interact in
weird ways, which limits the flexibility in choice of return values
from regex matches and substitutions.&lt;/p&gt;

&lt;p&gt;I don't know what the best way forward is. Maybe it is to
reintroduce a dedicated operator for regex matching, which seems to be
the main feature with which topicalization interacts badly. Maybe
there are other good ideas out there. If so, I'd love to hear about
them.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/three-functions-of-smartmatch.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/an-offer-to-the-perl-community.html</link>
      <description>The Perl 6 developers communicate a lot through IRC. Some of the
conversation is still valuable later on, so we have public IRC logs.

The software powering these logs was written especially for #perl6, but
works fine for other channels too. Among the other users are TestML, CDK
(Chemistry Development Kit), darcs, mojo, Padre, the Perl IDE, Parrot and
Rosetta Code.

If you are also developing software, and would like public logs for your
channel (either on freenode or irc.perl.org; other servers might be added
on demand), feel free to contact me (moritz on freenode, or per email:
moritz at faui2k3.org)

Features include: linking to individual lines, permanent URLs and
volatile URLs for the current day, automatic linking of URLs and readable
color schemes.

A current limitation is that you can't have two channels with the same
name from different networks, in case of conflict "first come, first
served" holds.</description>
      <title>An offer for software developers: free IRC logging</title>
      <content:encoded>

&lt;p&gt;The &lt;a href="http://perl6.org/"&gt;Perl 6 developers&lt;/a&gt; communicate a lot
through &lt;abbr title="Internet Relay Chat"&gt;IRC&lt;/abbr&gt;. Some of the conversation
is still valuable later on, so we have &lt;a href="http://irclog.perlgeek.de/perl6/today"&gt;public IRC logs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://moritz.faui2k3.org/en/ilbot"&gt;software powering these
logs&lt;/a&gt; was written especially for #perl6, but works fine for other channels
too. Among the other users are &lt;a href="http://www.testml.org/"&gt;TestML&lt;/a&gt;,
&lt;a href="http://sourceforge.net/apps/mediawiki/cdk/index.php?title=Main_Page"&gt;CDK
(Chemistry Development Kit)&lt;/a&gt;, &lt;a href="http://darcs.net/"&gt;darcs&lt;/a&gt;,
&lt;a href="http://mojolicio.us/"&gt;mojo&lt;/a&gt;, &lt;a href="http://padre.perlide.org/"&gt;Padre, the Perl IDE&lt;/a&gt;, &lt;a href="http://www.parrot.org/"&gt;Parrot&lt;/a&gt; and &lt;a href="http://rosettacode.org/wiki/Welcome_to_Rosetta_Code"&gt;Rosetta
Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are also developing software, and would like public logs for your
channel (either on freenode or irc.perl.org; other servers might be added on
demand), feel free to contact me (&lt;code&gt;moritz&lt;/code&gt; on freenode, or per
email: moritz at faui2k3.org)&lt;/p&gt;

&lt;p&gt;Features include: linking to individual lines, permanent URLs and volatile
URLs for the current day, automatic linking of URLs and readable color
schemes.&lt;/p&gt;

&lt;p&gt;A current limitation is that you can't have two channels with the same name
from different networks, in case of conflict "first come, first served"
holds.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/an-offer-to-the-perl-community.html</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/graphing-tool</link>
      <title> Graphing tool </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/graphing-tool</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/xml-tiny</link>
      <title> XML::Tiny released </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/xml-tiny</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/perl-6-in-2011.html</link>
      <description>The change of year is a good occasion to look back. Here I want to
reflect on the development of Perl 6, its compilers and ecosystem.

At the start of the year, masak's Perl 6 Coding Contest continued from
2010, concluding in the announcement of the winner. I must admit that I
still haven't read all the books I won :-)


Specification
-------------

2011 was a rather quiet year in terms of spec changes; they were a
mixture of responses to compiler writer and user feedback, and some
simplifications and cleanups.

Positional parameters used to be allowed to be called by name; this
feature is now gone. That both makes the signature binder simpler, and
removes accidental dependencies on names that weren't meant to be public.
Read the full justification for more background.

A small change that illustrates the cleanup of old, p5-inherited features
was the change that made &amp;eval stop catching exceptions. There is really
no good reason for it to catch them, except Perl 5 legacy.

say now uses a different stringification than print. The reasoning is
that print is aimed at computer-readable output, whereas say is often
used for debugging. As an example, undefined values stringify to the
empty string (and produce a warning), whereas say calls the .gist method
on the object to be said, which produces the type name on undefined
values.

An area that has been greatly solidified due to implementation progress
is Plain Old Documentation or Pod. Tadeusz Sośnierz' Google Summer of
Code project ironed out many wrinkles and inconsistencies, and changed my
perception of this part of the spec from "speculative" to "under
development".


Rakudo
------

Rakudo underwent a huge refactoring this year; it is now bootstrapped by
a new compiler called "nqp", and uses a new object model (nom).

It allows us to gain speed and memory advantages from gradual typing; for
example the mandelbrot fractral generator used to take 18 minutes to run
on a machine of mine, and now takes less than 40 seconds. Speedups in
other areas are not as big, but there is still much room for improvement
in the optimizer.

With the nom branch came support for different object representations. It
makes it possible to store object attributes in simple C-like structs,
which in turn makes it much easier and more convenient to interoperate
with C libraries.

Tadeusz' work on Pod gave Rakudo support for converting Pod to plain text
and HTML, and attach documentation objects to routines and other objects.

Rakudo now also has lazy lists, much better role handling, typed
exceptions for a few errors, the -n and -p command line options, support
for big integers, NFA-based support for proto regexes and improvements to
many built-in functions, methods and operators.


Niecza
------

It is hard to accurately summarize the development of Niecza in a few
sentences; instead of listing the many, many new features I should give
an impression on how it feels and felt for the user.

At the start of 2011, programming in niecza was a real adventure. Running
some random piece of Perl 6 code that worked with Rakudo rarely worked,
most of the time it hit a missing built-in, feature or bug.

Now it often just works, and usually much faster than in Rakudo. There
are still some missing features, but Stefan O'Rear and his fellow
contributors work tirelessly on catching up to Rakudo, and it some areas
Niecza is clearly ahead (for example Unicode support in regexes, and
longest-token matching).

Since Niecza is implemented on top of the Common Language Runtime (CLR)
(which means .NET or mono), it makes it easy to use existing CLR-based
libraries. Examples include an interactive fractal generator and a small
Tetris game in Perl 6.


Perlito
-------

Perlito aims to be a minimal compiler with multiple backends, which can
be used for embedding and experimenting with Perl 6. It had several
releases in 2011, and has interesting features like a Javascript backend.


Ecosystem
---------

The presence of two usable compilers (and in the case of Rakudo, two
viable but very different branches) has led to many questions about the
different compilers. The new Perl 6 Compiler Feature matrix tries to
answer the questions about the state of the implemented features in the
compilers.

With Panda we now have a module installer that actually works with
Rakudo. It still has some lengths to go in terms of stability and feature
completeness, but it is fun to work with.

The new Perl 6 Modules page gives an overview of existing Perl 6 modules;
we hope to evolve it into a real CPAN equivalent.


Community
---------

This year we had another Perl 6 Advent Calendar, with much positive
feedback both from the Perl 6 community and the wider programming
community.

We were also happy to welcome several new prolific contributors to the
Perl 6 compilers and modules. The atmosphere in the community still feels
relaxed, friendly and productive -- I quite enjoy it.

The year ends like it started: with a Perl 6 Coding Contest. This is a
good opportunity to dive into Perl 6, provide feedback to compiler
writers, and most of all have fun.</description>
      <title>Perl 6 in 2011 - A Retrospection</title>
      <content:encoded>
&lt;p&gt;The change of year is a good occasion to look back. Here I want to
reflect on the development of Perl 6, its compilers and ecosystem.&lt;/p&gt;

&lt;p&gt;At the start of the year, masak's &lt;a href="http://strangelyconsistent.org/p6cc2010/"&gt;Perl 6 Coding Contest&lt;/a&gt;
continued from 2010, concluding in the &lt;a href="http://strangelyconsistent.org/blog/announcing-the-winner-of-p6cc2010"&gt;announcement
of the winner&lt;/a&gt;. I must admit that I still haven't read all the books I
won :-)&lt;/p&gt;

&lt;h2&gt;Specification&lt;/h2&gt;

&lt;p&gt;2011 was a rather quiet year in terms of spec changes; they were a
mixture of responses to compiler writer and user feedback, and
some simplifications and cleanups.&lt;/p&gt;

&lt;p&gt;Positional parameters used to be allowed to be called by name; this
feature is now gone. That both makes the signature binder simpler, and
removes accidental dependencies on names that weren't meant to be public.
Read the &lt;a href="https://gist.github.com/984783"&gt;full justification&lt;/a&gt;
for more background.&lt;/p&gt;

&lt;p&gt;A small change that illustrates the cleanup of old, p5-inherited features
was the change that &lt;a href="https://github.com/perl6/specs/commit/e84b11137cc55ecd9f17f58976c08d361054ea05"&gt;made
&amp;amp;eval stop catching exceptions&lt;/a&gt;. There is really no good reason for it
to catch them, except Perl 5 legacy.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;say&lt;/code&gt; now uses a different stringification than
&lt;code&gt;print&lt;/code&gt;. The reasoning is that &lt;code&gt;print&lt;/code&gt; is aimed at
computer-readable output, whereas &lt;code&gt;say&lt;/code&gt; is often used for
debugging. As an example, undefined values stringify to the empty string
(and produce a warning), whereas &lt;code&gt;say&lt;/code&gt; calls the &lt;code&gt;.gist&lt;/code&gt;
method on the object to be said, which produces the type name on undefined
values.&lt;/p&gt;

&lt;p&gt;An area that has been greatly solidified due to implementation progress is
&lt;em&gt;Plain Old Documentation&lt;/em&gt; or &lt;em&gt;Pod&lt;/em&gt;. Tadeusz Sośnierz' Google
Summer of Code project ironed out many wrinkles and inconsistencies, and
changed my perception of this part of the spec from "speculative" to "under
development".&lt;/p&gt;

&lt;h2&gt;Rakudo&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://rakudo.org/"&gt;Rakudo&lt;/a&gt; underwent a huge refactoring this year; it is now &lt;a href="http://pmthium.com/2011/02/08/new-nqp-repository-new-nom-rakudo-branch/"&gt;bootstrapped
by a new compiler called "nqp", and uses a new object model&lt;/a&gt; (nom).&lt;/p&gt;

&lt;p&gt;It allows us to gain speed and memory advantages from gradual typing; for
example the &lt;a href="https://github.com/colomon/mandelbrot/blob/master/bin/mandelbrot-color.pl"&gt;mandelbrot
fractral generator&lt;/a&gt; used to take 18 minutes to run on a machine of mine,
and now takes less than 40 seconds. Speedups in other areas are not as big,
but there is still much room for improvement in the optimizer.&lt;/p&gt;

&lt;p&gt;With the nom branch came support for different object representations. It
makes it possible to store object attributes in simple C-like structs, which
in turn makes it much easier and more convenient to &lt;a href="https://github.com/jnthn/zavolaj/"&gt;interoperate with C
libraries&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tadeusz' work on Pod gave Rakudo support for converting Pod to plain text
and HTML, and attach documentation objects to routines and other objects.&lt;/p&gt;

&lt;p&gt;Rakudo now also has lazy lists, much better role handling, &lt;a href="http://news.perlfoundation.org/2011/02/hague-grant-application-struct.html"&gt;typed
exceptions for a few errors&lt;/a&gt;, the &lt;code&gt;-n&lt;/code&gt; and &lt;code&gt;-p&lt;/code&gt; command
line options, support for big integers, NFA-based support for proto regexes
and improvements to many built-in functions, methods and operators.&lt;/p&gt;


&lt;h2&gt;Niecza&lt;/h2&gt;

&lt;p&gt;It is hard to accurately summarize the development of &lt;a href="https://github.com/sorear/niecza/"&gt;Niecza&lt;/a&gt; in a few
sentences; instead of listing the many, many new features I should give
an impression on how it feels and felt for the user.&lt;/p&gt;

&lt;p&gt;At the start of 2011, programming in niecza was a real adventure. Running 
some random piece of Perl 6 code that worked with Rakudo rarely worked, most
of the time it hit a missing built-in, feature or bug.&lt;/p&gt;

&lt;p&gt;Now it often just works, and usually much faster than in Rakudo. There are
still some missing features, but Stefan O'Rear and his fellow contributors
work tirelessly on catching up to Rakudo, and it some areas Niecza is clearly
ahead (for example Unicode support in regexes, and longest-token
matching).&lt;/p&gt;

&lt;p&gt;Since Niecza is implemented on top of the Common Language Runtime (CLR)
(which means .NET or mono), it makes it easy to use existing CLR-based
libraries. Examples include &lt;a href="http://perl6advent.wordpress.com/2011/12/17/day-17-gtk-mandelbrot/"&gt;an
interactive fractal generator&lt;/a&gt; and a small &lt;a href="http://perl6advent.wordpress.com/2011/12/05/tetris-on-niecza/"&gt;Tetris
game in Perl 6.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Perlito&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.perlito.org/"&gt;Perlito&lt;/a&gt; aims to be a minimal compiler
with multiple backends, which can be used for embedding and experimenting with
Perl 6. It had several releases in 2011, and has interesting features like a
Javascript backend.&lt;/p&gt;

&lt;h2&gt;Ecosystem&lt;/h2&gt;

&lt;p&gt;The presence of two usable compilers (and in the case of Rakudo, two viable
but very different branches) has led to many questions about the different
compilers. The new &lt;a href="http://perl6.org/compilers/features"&gt;Perl 6
Compiler Feature matrix&lt;/a&gt; tries to answer the questions about the state of
the implemented features in the compilers.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://github.com/tadzik/panda/"&gt;Panda&lt;/a&gt; we now have a
module installer that actually works with Rakudo. It still has some lengths to
go in terms of stability and feature completeness, but it is fun to work
with.&lt;/p&gt;

&lt;p&gt;The new &lt;a href="http://modules.perl6.org/"&gt;Perl 6 Modules&lt;/a&gt; page gives
an overview of existing Perl 6 modules; we hope to evolve it into a real CPAN
equivalent.&lt;/p&gt;

&lt;h2&gt;Community&lt;/h2&gt;

&lt;p&gt;This year we had another &lt;a href="http://perl6advent.wordpress.com/2011/12/01/perl-6-advent-calendar-2011/"&gt;Perl
6 Advent Calendar&lt;/a&gt;, with much positive feedback both from the Perl 6
community and the wider programming community.&lt;/p&gt;

&lt;p&gt;We were also happy to welcome several new prolific contributors to the Perl
6 compilers and modules. The atmosphere in the community still feels relaxed,
friendly and productive -- I quite enjoy it.&lt;/p&gt;

&lt;p&gt;The year ends like it started: with a &lt;a href="http://strangelyconsistent.org/blog/the-2011-perl-6-coding-contest"&gt;Perl
6 Coding Contest&lt;/a&gt;. This is a good opportunity to dive into Perl 6, provide
feedback to compiler writers, and most of all have fun.&lt;/p&gt;

 
</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/perl-6-in-2011.html</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/yapc-europe-2007-day-2</link>
      <title> YAPC::Europe 2007 report: day 2 </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/yapc-europe-2007-day-2</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/feature-comparison-matrix.html</link>
      <description>We now have a nice table that tells you which Perl 6 compiler implements
what..

Such a thing was long overdue. When the topic came up in the past, people
have suggested mostly automated solutions that compared test coverage of
compiles to generate such a table. Nothing came out of it, it would have
been a rather large endeavor. Now Eevee blogged about the lack of some
easy overview that tells you what is implemented in Rakudo., and I
thought it was time to tackle the problem.

Instead of some advanced automated system, we now have a simple text file,
and a short perl script that converts it to a HTML page.

I'd like to thanks Will Coleda, Patrick Michaud and Stefan O'Rear for
their contributions, and encourage everybody to keep the data up to date.</description>
      <title>Perl 6 Compiler Feature Matrix</title>
      <content:encoded>

&lt;p&gt;We now have a &lt;a href="http://perl6.org/compilers/features"&gt;nice table that
tells you which Perl 6 compiler implements what.&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Such a thing was long overdue. When the topic came up in the past, people
have suggested mostly automated solutions that compared test coverage of
compiles to generate such a table. Nothing came out of it, it would have been
a rather large endeavor. Now Eevee blogged about &lt;a href="http://me.veekun.com/blog/2011/07/22/perls-of-wisdom/#fixing-perl-6"&gt;the
lack of some easy overview that tells you what is implemented in Rakudo.&lt;/a&gt;,
and I thought it was time to tackle the problem.&lt;/p&gt;

&lt;p&gt;Instead of some advanced automated system, we now have a &lt;a href="https://github.com/perl6/features/blob/master/features.txt"&gt;simple text
file&lt;/a&gt;, and a &lt;a href="https://github.com/perl6/features/blob/master/process.pl"&gt;short perl
script&lt;/a&gt; that converts it to a HTML page.&lt;/p&gt;

&lt;p&gt;I'd like to thanks Will Coleda, Patrick Michaud and Stefan O'Rear for their
contributions, and encourage everybody to keep the data up to date.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/feature-comparison-matrix.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/does-your-bug-tracker-do-this.html</link>
      <description>While working on a fast moving Open Source project, we sometimes get some
platform specific bug reports. And even if nobody explicitly works on the
problem, sometimes they go away due to general improvements of
robustness.

So sometimes an intrepid volunteer goes through the list of old bugs, and
asks the reporter if these platform specific bugs still persist. Quite
often, we don't get a reply. Then the reports aren't very useful to us,
and should be closed. Which requires a second pass through the bug queue.
With more than 600 open bugs this quite a bit of work.

So I'd like to have an option to automatically close a bug within a given
time span (say, four weeks or two months) if no feedback occurs. Our bug
tracker (or at least our installation) doesn't have such a button.

Does your favorite bug tracker have it? Would you also sometimes like
such a button?</description>
      <title>Does Your Bug Tracker Do This For You?</title>
      <content:encoded>

&lt;p&gt;While working on a &lt;a href="http://rakudo.org/"&gt;fast moving Open Source
project&lt;/a&gt;, we sometimes get some platform specific bug reports. And even if
nobody explicitly works on the problem, sometimes they go away due to general
improvements of robustness.&lt;/p&gt;

&lt;p&gt;So sometimes an intrepid volunteer goes through the list of old bugs, and
asks the reporter if these platform specific bugs still persist. Quite often,
we don't get a reply. Then the reports aren't very useful to us, and should be
closed. Which requires a second pass through the bug queue. With more than
600 open bugs this quite a bit of work.&lt;/p&gt;

&lt;p&gt;So I'd like to have an option to automatically close a bug within a given
time span (say, four weeks or two months) if no feedback occurs.
&lt;a href="http://bestpractical.com/rt/"&gt;Our bug tracker&lt;/a&gt; (or at least our
installation) doesn't have such a button.&lt;/p&gt;

&lt;p&gt;Does your favorite bug tracker have it? Would you also sometimes like such
a button?&lt;/a&gt;


 
</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/does-your-bug-tracker-do-this.html</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/yapc-europe-2007--travel-plans</link>
      <title> YAPC::Europe 2007 travel plans </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/yapc-europe-2007--travel-plans</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/wikipedia-proxy</link>
      <title> Wikipedia handheld proxy </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/wikipedia-proxy</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/bryar-security-hole</link>
      <title> Bryar security hole </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/bryar-security-hole</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/grant-report-errors-4.html</link>
      <description>Progress on my grant for error message is slow but steady. Since my last
report, I've done the following things:

  * Merged the nom-exceptions Rakudo branch, so now you can reliably
    throw Perl 6 objects as exceptions.

  * Implemented several error classes and roles in Rakudo

  * Started to throw typed errors both from runtime libraries and from
    inside the compiler

  * Hacked the default exception printer Rakudo to be much more flexible,
    for example you can now write exception classes that supress
    backtraces from the standard handler.

  * Wrote tests for typed run time and compile time errors, and at the
    same time developed a test function that makes it easy to write such
    tests.

It's time for a quick review of how far I am along the various
deliverables in the original grant proposal.

  * D1: Specification. I think the hard work here is done already, what
    remains to do is finding good default and how to manipulate them (for
    example, how to generally switch on/off printing of backtraces?).

  * D2: Error catalogue, tests: I've not worked on this one too much. The
    error classes and roles so far mostly served to exercise the
    implementation; going through the existing errors from the various
    compilers and formalizing them will be quite a bit of work, but only
    moderately complicated.

  * D3: Implementation, documentation. Like D1, the hard part is mostly
    done. We can now throw errors from within the compiler actions and
    from the setting, next up will be the grammar. Then all places where
    errors are thrown need to be changed to use the new error classes.
    Again that'll be much work, but easy to do. Documentation is still
    missing.

All in all I feel I'm well on the way, and most complex decisions have
been made.

For a more user oriented view of the new exception system I'd like to
point you to my Perl 6 advent calendar post on exceptions.</description>
      <title>Fourth Grant Report: Structured Error Messages</title>
      <content:encoded>
&lt;p&gt;Progress on my &lt;a href="http://news.perlfoundation.org/2011/02/hague-grant-application-struct.html"&gt;grant
for error message&lt;/a&gt; is slow but steady. Since my last report, I've done the
following things:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Merged the &lt;code&gt;nom-exceptions&lt;/code&gt; Rakudo  branch, so now you
    can reliably throw Perl 6 objects as exceptions.&lt;/li&gt;
    &lt;li&gt;Implemented several error classes and roles in Rakudo&lt;/li&gt;
    &lt;li&gt;Started to throw typed errors both from runtime libraries and from
        inside the compiler&lt;/li&gt;
    &lt;li&gt;Hacked the default exception printer Rakudo to be much more flexible,
        for example you can now write exception classes that supress
        backtraces from the standard handler.&lt;/li&gt;
    &lt;li&gt;Wrote tests for typed run time and compile time errors, and at the
        same time developed a test function that makes it easy to write such
        tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's time for a quick review of how far I am along the various deliverables
in the original grant proposal.&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;D1: Specification. I think the hard work here is done already,
        what remains to do is finding good default and how to manipulate them
        (for example, how to generally switch on/off printing of
        backtraces?).&lt;/li&gt;
    &lt;li&gt;D2: Error catalogue, tests: I've not worked on this one too much.
        The error classes and roles so far mostly served to exercise the
        implementation; going through the existing errors from the various
        compilers and formalizing them will be quite a bit of work, but only
        moderately complicated.&lt;/li&gt;
    &lt;li&gt;D3: Implementation, documentation. Like D1, the hard part is mostly 
        done. We can now
       throw errors from within the compiler actions and from the setting,
       next up will be the grammar. Then all places where errors are thrown
       need to be changed to use the new error classes. Again that'll be much
       work, but easy to do. Documentation is still missing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in all I feel I'm well on the way, and most complex decisions have been
made. &lt;/p&gt;


&lt;p&gt;For a more user oriented view of the new exception system I'd like to
point you to my &lt;a href="http://perl6advent.wordpress.com/2011/12/15/day-15-something-exceptional/"&gt;Perl
    6 advent calendar post on exceptions&lt;/a&gt;.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/grant-report-errors-4.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/why-rakudo-needs-nqp.html</link>
      <description>Rakudo, a popular Perl 6 compiler, is built on top of a smaller compiler
called "NQP", short for Not Quite Perl.

Reading through a recent ramble by chromatic, I felt like he said "Rakudo
needs NQP to be able to ditch Parrot, once NQP runs on a different
platform" (NQP is the "another layer", which sits between Rakudo and
Parrot, mentioned in the next-to-final paragraph).

I'm sure chromatic knows that VM independence is the least important
reason for having NQP at all, but the casual reader might not, so let me
explain the real importance of NQP for Rakudo here.

The short version is just a single word: bootstrapping.

The longer version is that large parts of Rakudo are written in Perl 6
itself (or a subset thereof), and something is needed to break the
circularity.

In particular the base of the compiler is written in a subset of Perl 6,
and NQP compiles those parts to bytecode, which can then compile the rest
of the compiler.

This is not just because we have a fancy for Perl 6, and thus want to
write as much of the code in Perl 6, but there are solid technical
reasons for writing the compiler in Perl 6.

In Perl 6, the boundary between run time and compile time is blurred, as
well as the boundary between the compiler, the run time library and
user-space code. For example you alter the grammar with which your source
code is parsed, by injecting your own grammar rules.

"Your own grammar rules" above refers to user-space code, while the
grammar that is being altered is part of the compiler. If we had written
the compiler in something else than Perl 6 (for example Java), it would
be horribly difficult to inject user-space Perl 6 code into compiled code
from a different language.

And the code not only needs to be injected, but the data passed back and
forth between the compiler and the user space need to be Perl 6 objects,
so all important data structures in the compiler need to be Perl 6 based
anyway.

And it's not just for grammar modifications: At its heart, Perl 6 is an
object oriented language. When the compiler sees a class definition, it
translates them to a series of method calls on the metaobject, which
again needs to be a Perl 6 object, otherwise it wouldn't be easily usable
and extensible from the user space.

Now you might think that grammar modifications and changes to the
Metaobject are pretty obscure features, and you could get along just fine
with an incomplete Perl 6 compiler that neglected those two areas. But
even then you'd have lots of interactions between run time and compile
time. For example consider a numeric literal like 42. Obviously that
needs to be constructed of type Int. What's less obvious is that it needs
to be constructed to be of type Int at compile time already, because Perl
6 code can run interleaved with the compilation. So the compiler needs to
be able to handle Perl 6 objects in all their generality, which is a huge
pain if the compiler is not written in Perl 6.

Rakudo has cheated on that front in the past, and consequently has had
lots of bugs and limitations due to non-Perl 6 objects leaking out at
unexpected ends. If you ever got a "Null PMC Access" from Rakudo, you
know what I mean.

The lesson we learned was that you need a Perl 6 compiler to implement a
Perl 6 compiler, even if that first Perl 6 compiler can handle only a
rather limited subset of Perl 6.

And there are also quite some benefits to this approach. For example
NQP's new regex engine is implemented as a role in NQP. It is mixed into
an NQP class which allows us to build Rakudo, but it is also mixed in a
Perl 6 class, which allows the generation of Perl 6-level Match objects
without any need to create NQP-level match objects first, and then wrap
them in Perl 6 Match objects.

That's what NQP does for us. It allows us to actually write a Perl 6
compiler.</description>
      <title>Why Rakudo needs NQP</title>
      <content:encoded>

&lt;p&gt;&lt;a href="http://rakudo.org/"&gt;Rakudo&lt;/a&gt;, a popular &lt;a href="http://perl6.org/"&gt;Perl 6&lt;/a&gt; compiler, is built on top of a smaller
compiler called "NQP", short for &lt;em&gt;Not Quite Perl&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Reading through a &lt;a href="http://www.modernperlbooks.com/mt/2011/08/no-policy-can-save-wrong-code.html"&gt;recent
    ramble by chromatic&lt;/a&gt;, I felt like he said "Rakudo needs NQP to be able
to ditch Parrot, once NQP runs on a different platform" (NQP is the "another
layer", which sits between Rakudo and Parrot, mentioned in the next-to-final
paragraph).&lt;/p&gt;

&lt;p&gt;I'm sure chromatic knows that VM independence is the least important reason
for having NQP at all, but the casual reader might not, so let me explain the
real importance of NQP for Rakudo here.&lt;/p&gt;

&lt;p&gt;The short version is just a single word: &lt;a href="http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29"&gt;bootstrapping&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The longer version is that large parts of Rakudo are written in Perl 6
itself (or a subset thereof), and something is needed to break the
circularity.&lt;/p&gt;

&lt;p&gt;In particular the base of the compiler is written in a subset of Perl 6,
and NQP compiles those parts to bytecode, which can then compile the rest of
the compiler.&lt;/p&gt;

&lt;p&gt;This is not just because we have a fancy for Perl 6, and thus want to write
as much of the code in Perl 6, but there are solid technical reasons for
writing the compiler in Perl 6.&lt;/p&gt;

&lt;p&gt;In Perl 6, the boundary between run time and compile time is blurred, as
well as the boundary between the compiler, the run time library and user-space
code. For example you alter the grammar with which your source code is parsed, by
injecting your own grammar rules.&lt;/p&gt;

&lt;p&gt;"Your own grammar rules" above refers to user-space code, while the grammar
that is being altered is part of the compiler. If we had written the compiler
in something else than Perl 6 (for example Java), it would be horribly
difficult to inject user-space Perl 6 code into compiled code from a different
language.&lt;/p&gt;

&lt;p&gt;And the code not only needs to be injected, but the data passed back
and forth between the compiler and the user space need to be Perl 6 objects, so all
important data structures in the compiler need to be Perl 6 based anyway.&lt;/p&gt;

&lt;p&gt;And it's not just for grammar modifications: At its heart, Perl 6 is an
object oriented language. When the compiler sees a class definition, it
translates them to a series of method calls on the &lt;a href="http://en.wikipedia.org/wiki/Metaobject"&gt;metaobject&lt;/a&gt;, which again
needs to be a Perl 6 object, otherwise it wouldn't be easily usable and
extensible from the user space.&lt;/p&gt;

&lt;p&gt;Now you might think that grammar modifications and changes to the
Metaobject are pretty obscure features, and you could get along just fine
with an incomplete Perl 6 compiler that neglected those two areas. But even
then you'd have lots of interactions between run time and compile time. For
example consider a numeric literal like &lt;code&gt;42&lt;/code&gt;. Obviously that needs
to be constructed of type &lt;code&gt;Int&lt;/code&gt;. What's less obvious is that it
needs to be constructed to be of type Int at compile time already, because
Perl 6 code can run interleaved with the compilation. So the compiler needs to
be able to handle Perl 6 objects in all their generality, which is a huge pain
if the compiler is not written in Perl 6.&lt;/p&gt;

&lt;p&gt;Rakudo has cheated on that front in the past, and consequently has
had lots of bugs and limitations due to non-Perl 6 objects leaking out at
unexpected ends. If you ever got a "Null PMC Access" from Rakudo, you know what I
mean.&lt;/p&gt;

&lt;p&gt;The lesson we learned was that &lt;strong&gt;you need a Perl 6 compiler to
implement a Perl 6 compiler&lt;/strong&gt;, even if that first Perl 6 compiler can
handle only a rather limited subset of Perl 6.&lt;/p&gt;


&lt;p&gt;And there are also quite some benefits to this approach. For example &lt;a href="http://pmthium.com/2011/07/14/new-regex-engine-for-nqp-and-nom-now-passing-7k-spectests/"&gt;NQP's new
    regex engine&lt;/a&gt; is implemented as a role in NQP. It is mixed into an NQP
class which allows us to build Rakudo, but it is also mixed in a Perl 6 class,
which allows the generation of &lt;a href="http://perlcabal.org/syn/S05.html#Match_objects"&gt;Perl 6-level Match
objects&lt;/a&gt; without any need to create NQP-level match objects first, and then
wrap them in Perl 6 Match objects.&lt;/p&gt;

&lt;p&gt;That's what NQP does for us. It allows us to actually write a Perl 6
compiler.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/why-rakudo-needs-nqp.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/thoughts-on-p6cc.html</link>
      <description>Masak's Perl 6 Coding Contest (short p6cc) is now in its final stage -
the public commentary of solutions. So far masak has commented on p1, p2,
and p3. I enjoyed the reviews and explanations so far, and look forward
to more (except to the p4 review, because I botched the solution to this
one).

The reviews made a good read, and here are only a few very minor points
that I find worth mentioning. No criticism intended (neither to the
author nor the reviewer).

  * Matthias' p1 solution uses side effects in subroutine named to-string.
    I would avoid that in "production" code (for whatever I might mean
    with that word...), since it's not what I would expect from the name.
    Instead of a counter, the array indexes could be used to identify
    which matrix to stringify.

  * Masak's review of fox' p1 solution contains the question I wonder why
    the @items array deserved a plural but the @matrix only a singular....
    I'd say that's because @matrix holds one matrix, but @items holds
    many items. Speaking of which, I don't like the name @matrix - it
    describe a structure rather than the contents. The structure becomes
    pretty obvious through the access, but what is in the matrix?

  *  After viewing my own p1 submission without syntax hilighting, I
    wonder why I chose so many double blank lines. My vim color scheme
    uses a dark blue for comments, which means that comment blocks need
    more visual distance from code, in my personal opinion. But when
    sharing code, I shouldn't make layout decisions based on non-shared
    syntax hilighting.

  * colomon's p2 submission uses complex numbers for coordinates. I
    considered that myself, and there's nothing wrong with it. Just
    strange that he then reinvented subtraction of two complex numbers in
    sub lines-intersect. Maybe he didn't want to come up with names for
    the intermediate results, $slope and $axes-intercept might have been
    viable ones.

  * Matthias could have simplified comb: /&lt;&amp;number&gt;/ to just comb:
    &amp;number -- a regex is just a callable, and when it's explicit in the
    current scope, you can just use a hard reference to it.

  * colomon's p3 solution could, as far as I can tell, replace all
    regexes with tokens - less backtracking, fewer surprises.

  * Reviewing my own p3 solution, masak asked I wonder what stopped
    moritz from, rather than doing $_ &amp;&amp; .including on line 39, doing
    .?including instead. Either he considered that too cute, or he didn't
    consider it. I did consider it, but I decided against it, because the
    two things are subtly different. Mine only calls the method if the
    topic is true, whereas .?including always tries the call - even on a
    type object, where accessing an attribute leads to a fatal error. I
    think in my code that case doesn't show up, but it did appear during
    debugging in earlier versions.</description>
      <title>Thoughts on masak's Perl 6 Coding Contest</title>
      <content:encoded>

&lt;p&gt;&lt;a href="http://strangelyconsistent.org/blog/masaks-perl-6-coding-contest"&gt;Masak's
Perl 6 Coding Contest&lt;/a&gt; (short p6cc) is now in its final stage - the public
commentary of solutions. So far masak has commented on &lt;a href="http://strangelyconsistent.org/blog/p1-best-way-to-multiply-a-chain-of-matrices"&gt;p1&lt;/a&gt;, &lt;a href="http://strangelyconsistent.org/blog/p2-is-the-point-in-the-polygon"&gt;p2,&lt;/a&gt;
and &lt;a href="http://strangelyconsistent.org/blog/p3-is-the-integer-in-the-rangeset"&gt;p3&lt;/a&gt;.
I enjoyed the reviews and explanations so far, and look forward to more
(except to the p4 review, because I botched the solution to this one).&lt;/p&gt;

&lt;p&gt;The reviews made a good read, and here are only a few very minor points
that I find worth mentioning. No criticism intended (neither to the author nor
the reviewer).&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://strangelyconsistent.org/p6cc2010/p1-matthias/"&gt;Matthias'
        p1 solution&lt;/a&gt; uses side effects in subroutine named
        &lt;code&gt;to-string&lt;/code&gt;. I would avoid that in "production" code (for
        whatever I might mean with that word...), since it's not what I would
        expect from the name. Instead of a counter, the array indexes could be
        used to identify which matrix to stringify.
    &lt;/li&gt;
    &lt;li&gt;Masak's review of &lt;a href="http://strangelyconsistent.org/p6cc2010/p1-fox/"&gt;fox' p1
        solution&lt;/a&gt; contains the question &lt;em&gt;I wonder why the @items array
        deserved a plural but the @matrix only a singular...&lt;/em&gt;. I'd say
        that's because &lt;code&gt;@matrix&lt;/code&gt; holds one matrix, but
        &lt;code&gt;@items&lt;/code&gt; holds many items. Speaking of which, I don't like
        the name &lt;code&gt;@matrix&lt;/code&gt; - it describe a structure rather than
        the contents. The structure becomes pretty obvious through the access,
        but what is in the matrix?
     &lt;/li&gt;
     &lt;li&gt;
        After viewing &lt;a href="http://strangelyconsistent.org/p6cc2010/p1-moritz/"&gt;my own p1
        submission&lt;/a&gt; without syntax hilighting, I wonder why I chose so many
        double blank lines. My vim color scheme uses a dark blue for comments,
        which means that comment blocks need more visual distance from code,
        in my personal opinion. But when sharing code, I shouldn't make layout
        decisions based on non-shared syntax hilighting.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href="http://strangelyconsistent.org/p6cc2010/p2-colomon/"&gt;colomon's
        p2 submission&lt;/a&gt; uses complex numbers for coordinates. I considered
        that myself, and there's nothing wrong with it. Just strange that he
        then reinvented subtraction of two complex numbers in sub
        &lt;code&gt;lines-intersect&lt;/code&gt;. Maybe he didn't want to come up with
        names for the intermediate results, &lt;code&gt;$slope&lt;/code&gt; and
        &lt;code&gt;$axes-intercept&lt;/code&gt; might have been viable ones.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href="http://strangelyconsistent.org/p6cc2010/p2-matthias/"&gt;Matthias&lt;/a&gt;
        could have simplified &lt;code&gt;comb: /&amp;lt;&amp;amp;number&amp;gt;/&lt;/code&gt; to just
        &lt;code&gt;comb: &amp;amp;number&lt;/code&gt; -- a regex is just a callable, and when
        it's explicit in the current scope, you can just use a hard reference
        to it.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;a href="http://strangelyconsistent.org/p6cc2010/p3-colomon/"&gt;colomon's
        p3 solution&lt;/a&gt; could, as far as I can tell, replace all regexes with
        tokens - less backtracking, fewer surprises.
    &lt;/li&gt;
    &lt;li&gt;Reviewing &lt;a href="http://strangelyconsistent.org/p6cc2010/p3-moritz/"&gt;my own p3
        solution&lt;/a&gt;, masak asked &lt;em&gt;I wonder what stopped moritz from,
        rather than doing $_ &amp;&amp; .including on line 39, doing .?including
        instead. Either he considered that too cute, or he didn't consider
        it.&lt;/em&gt; I did consider it, but I decided against it, because the two
        things are subtly different.  Mine only calls the method if the topic is
        true, whereas &lt;code&gt;.?including&lt;/code&gt; always tries the call - even on a
        type object, where accessing an attribute leads to a fatal error. I
        think in my code that case doesn't show up, but it did appear during
        debugging in earlier versions.
    &lt;/li&gt;

&lt;/ul&gt;


</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/thoughts-on-p6cc.html</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/thankyou-anonymous-benefactor</link>
      <title> Thankyou, Anonymous Benefactor! </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/thankyou-anonymous-benefactor</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/number-phone-release</link>
      <title> Number::Phone release </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/number-phone-release</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/ill</link>
      <title> Ill </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/ill</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/cpandeps-upgraded-to-mysql</link>
      <title> CPANdeps upgrade </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/cpandeps-upgraded-to-mysql</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/grant-report-errors-3.html</link>
      <description>Progress on my grant for error message is slower than expected, as
expected :-). Yes, you've read that sentence before.

In the past months, general hacking on the nom branch of Rakudo was just
too much fun -- and partially a prerequisite for the exceptions work.

I did manage to redo the backtraces that are generated from error
messages.

Backtraces are now generated mostly in Perl 6 code, making them much more
hackable. There's a Backtrace class, which is a list of Backtrace::Frame
objects, each knowing the code object associated with it, as well as line
number and file. (This is both specced and works in Rakudo)

Routines can have the is hidden_from_backtrace trait, which makes them
not show up in the default backtrace stringification (one can still
request a .full string representation). This is useful for routines which
are internally used to generate exceptions, like die().

Rakudo also has a --ll-exceptions command line option which provides
PIR-level backtraces, in the rare case the Perl 6 level backtraces hide
too much information.

I've also started the nom-exceptions branch in Rakudo, which aims at
lifting current limitations in Rakudo's exception handling. Currently
die() and friends generate a parrot exception, and then there's a routine
that fills the error variable $!. This routine generates a new Exception
object, and sticks the parrot exception into it.

This practice means that if you create a subclass of Exception,
instantiate it and throw it, you still only get an Exception in the error
handler, not an object of the subclass. Since the actual exception type
is very important for the ongoing work, that has to change. The branch
mentioned earlier allows one to generate a Perl 6 exception, and pass
that on as the payload of the parrot exception, which is then unwrapped
when filling $!.

As a proof of concept this works, but it suffers from not being robust
enough -- as it is, we could accidentally unwrap the payload of a CONTROL
exception, placing meaningless junk into $!. So this needs a bit more
work, which I plan to do this week (or next, if it proves to be more
difficult than anticipated).

As always, your feedback is very welcome.</description>
      <title>Third Grant Report: Structured Error Messages</title>
      <content:encoded>
&lt;p&gt;Progress on my &lt;a href="http://news.perlfoundation.org/2011/02/hague-grant-application-struct.html"&gt;grant
for error message&lt;/a&gt; is slower than expected, as expected :-). Yes, you've
read that sentence before.&lt;/p&gt;

&lt;p&gt;In the past months, general hacking on the nom branch of Rakudo was just
too much fun -- and partially a prerequisite for the exceptions work.&lt;/p&gt;

&lt;p&gt;I did manage to redo the backtraces that are generated from error
messages.&lt;/p&gt;

&lt;p&gt;Backtraces are now generated mostly in Perl 6 code, making them much more
hackable. There's a &lt;code&gt;Backtrace&lt;/code&gt; class, which is a list of
&lt;code&gt;Backtrace::Frame&lt;/code&gt; objects, each knowing the code object associated
with it, as well as line number and file. (This is both specced and works in
Rakudo)&lt;/p&gt;

&lt;p&gt;Routines can have the &lt;code&gt;is hidden_from_backtrace&lt;/code&gt; trait, which
makes them not show up in the default backtrace stringification (one can still
request a &lt;code&gt;.full&lt;/code&gt; string representation). This is useful for
routines which are internally used to generate exceptions, like
&lt;code&gt;die()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Rakudo also has a &lt;code&gt;--ll-exceptions&lt;/code&gt; command line option which
provides PIR-level backtraces, in the rare case the Perl 6 level backtraces
hide too much information.&lt;/p&gt;

&lt;p&gt;I've also started the &lt;code&gt;nom-exceptions&lt;/code&gt; branch in Rakudo, which
aims at lifting current limitations in Rakudo's exception handling. Currently
&lt;code&gt;die()&lt;/code&gt; and friends generate a parrot exception, and then there's a
routine that fills the error variable &lt;code&gt;$!&lt;/code&gt;. This routine generates
a new &lt;code&gt;Exception&lt;/code&gt; object, and sticks the parrot exception into
it.&lt;/p&gt;

&lt;p&gt;This practice means that if you create a subclass of
&lt;code&gt;Exception&lt;/code&gt;, instantiate it and throw it, you still only get an
&lt;code&gt;Exception&lt;/code&gt; in the error handler, not an object of the subclass.
Since the actual exception type is very important for the ongoing work, that
has to change. The branch mentioned earlier allows one to generate a Perl 6
exception, and pass that on as the payload of the parrot exception, which is
then unwrapped when filling &lt;code&gt;$!&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As a proof of concept this works, but it suffers from not being robust
enough -- as it is, we could accidentally unwrap the payload of a
&lt;code&gt;CONTROL&lt;/code&gt; exception, placing meaningless junk into &lt;code&gt;$!&lt;/code&gt;.
So this needs a bit more work, which I plan to do this week (or next, if it
proves to be more difficult than anticipated).&lt;/p&gt;

&lt;p&gt;As always, your feedback is very welcome.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/grant-report-errors-3.html</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/cpandeps</link>
      <title> CPANdeps </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/cpandeps</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/cpandeps-release</link>
      <title> Module pre-requisites analyser </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/cpandeps-release</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/perl-isnt-dying</link>
      <title> Perl isn't dieing </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/perl-isnt-dying</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/yapc-europe-2007-day-3</link>
      <title> YAPC::Europe 2007 report: day 3 </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/yapc-europe-2007-day-3</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/misc/introducing-quelology.html</link>
      <description>For about half a year I've been working on a website called quelology,
which collects book series and translations.

It is intended to answer questions of the form: I've now read "Harry
Potter and the Order of the Phoenix", which is the next book in that
series? or What's the name of the French translation of that book?

The website and data mining behind it are written in Perl, and it is
based on book meta data by isfdb, amazon and worldcat.

I'm working on importing data from more sources, next up will be the
Swedish National Library.

After completing the data mining stage, I'll add an interfaces that
allows the visitor to edit the book, series and translations data, so
that users can extend the data body.</description>
      <title>Introducing my new project: Quelology organizes books</title>
      <content:encoded>
&lt;p&gt;For about half a year I've been working on a website called &lt;a href="http://quelology.org/"&gt;quelology&lt;/a&gt;, which collects book series and
translations.&lt;/p&gt;

&lt;p&gt;It is intended to answer questions of the form:
&lt;a href="http://quelology.org/t/9684"&gt;I've now read "Harry Potter and the Order of the Phoenix",
which is the next book in that series?&lt;/a&gt; or
&lt;a href="http://quelology.org/t/9681"&gt;What's the name of the French translation of that book?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The website and data mining behind it are written in Perl, and it is based on book meta data by &lt;a href="http://www.isfdb.org/cgi-bin/index.cgi"&gt;isfdb&lt;/a&gt;, amazon and &lt;a href="http://www.worldcat.org/"&gt;worldcat&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm working on importing data from more sources, next up will be the
&lt;a href="http://libris.kb.se/"&gt;Swedish National Library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After completing the data mining stage, I'll add an interfaces that allows
the visitor to edit the book, series and translations data, so that users can extend the data body.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/misc/introducing-quelology.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/grant-report-errors-1.html</link>
      <description>My Hague Grant proposal for designing, implementing and testing
structured error messages for Perl 6 has been acceepted, and I've started
my work on it in my copious free time.

Before the grant started I've unified the error messages of several
compilers to use "Cannot" instead of a wild mixture of "Cannot", "Can
not" and "Can't".

In the past week I created a repository for the initial work on the error
message spec, and added a list of existing error messages across
different compilers, and some notes regarding the upcoming spec.

So far I've outlined some thoughts about separation of concerns,
classification of the error messages, testing error messages for certain
properties, and calling syntax for die() and fail().

Any constructive feedback on it is very welcome.

Thanks go to Ian Hague and The Perl Foundation for supporting my work
financially.</description>
      <title>First Grant Report: Structured Error Messages</title>
      <content:encoded>
&lt;p&gt;My &lt;a href="http://news.perlfoundation.org/2011/02/hague-grant-application-struct.html"&gt;Hague
    Grant proposal&lt;/a&gt; for designing, implementing and testing structured
error messages for Perl 6 &lt;a href="http://news.perlfoundation.org/2011/04/structured-error-message-grant.html"&gt;has
been acceepted&lt;/a&gt;, and I've started my work on it in &lt;a href="http://www.catb.org/jargon/html/C/copious-free-time.html"&gt;my copious
free time&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before the grant started I've &lt;a href="https://github.com/perl6/std/commit/430e3d68b0321e96b5ae1586329b0caa74dc8ca8"&gt;unified&lt;/a&gt;
&lt;a href="https://github.com/rakudo/rakudo/commit/76425aba89d4fbd742abbf0d1278380ec21f9ce5"&gt;the
error messages&lt;/a&gt; of &lt;a href="https://github.com/sorear/niecza/commit/d6ca04a1aaee2f180454f77f14af4b647c65b1ff"&gt;several&lt;/a&gt;
&lt;a href="https://github.com/masak/yapsi/commit/423894a104f4b10a2122ba7dc2e3160b0481654c"&gt;compilers&lt;/a&gt;
to use "Cannot" instead of a wild mixture of "Cannot", "Can not" and
"Can't".&lt;/p&gt;

&lt;p&gt;In the past week I created a &lt;a href="https://github.com/perl6/errors/"&gt;repository for the initial work on the
error message spec&lt;/a&gt;, and added a list of existing error messages across
different compilers, and some notes regarding the upcoming spec.&lt;/p&gt;

&lt;p&gt;So far I've outlined some thoughts about separation of concerns,
classification of the error messages, testing error messages for certain
properties, and calling syntax for &lt;code&gt;die()&lt;/code&gt; and
&lt;code&gt;fail()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Any constructive feedback on it is very welcome.&lt;/p&gt;

&lt;p&gt;Thanks go to Ian Hague and The Perl Foundation for supporting my work
financially.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/grant-report-errors-1.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/notes-2011-02.html</link>
      <description>Lately real life has prevented me from blogging, so here are just a few
random notes from the Perl 6 developers:

The Perl bug tracker now has tags testneeded and testcommitted, which can
mark tests that need or have tests in the spectest suite. Since the URLs
for querying these tags are unwieldy and non-obvious, I've created some
aliases: http://rakudo.de/testneeded and http://rakudo.de/testcommitted.

Development of the new nqp and rakudo-on-the-new-object-model is
progressing nicely. I had some fun porting some PIR code to NQP, and
writing some new code. Most interesting to read is the source of the new
meta model, much of which is written in a subset of Perl 6 (so quite
readable, if you happen to know Perl 6. For example you can see how the
method resolution order for multiple inheritance is calculated.

There is a parrot branch that adds a generation garbage collector to
parrot. Its release is planned for shortly after the 3.1.0 release due
tomorrow. Initial benchmarks show that Rakudo is between 25% and 30%
faster on that parrot, as measured by a spectest run. I very much look
forward to having that in the parrot main line.

Writing code for niecza is quite a nice experience. It still has a big
startup cost, but then runs much faster than rakudo (at least it feels
that way). There are still lots of features missing (for example
non-integer number literals), but feature requests are usually implement
quite quickly.</description>
      <title>Perl 6 notes from February 2011</title>
      <content:encoded>
&lt;p&gt;Lately real life has prevented me from blogging, so here are just a few
random notes from the Perl 6 developers:&lt;/p&gt;


&lt;p&gt;The &lt;a href="http://rt.perl.org/rt3/"&gt;Perl bug tracker&lt;/a&gt; now has tags
&lt;code&gt;testneeded&lt;/code&gt; and &lt;code&gt;testcommitted&lt;/code&gt;, which can mark tests
that need or have tests in the spectest suite. Since the URLs for querying
these tags are unwieldy and non-obvious, I've created some aliases:
&lt;a href="http://rakudo.de/testneeded"&gt;http://rakudo.de/testneeded&lt;/a&gt;
and
&lt;a href="http://rakudo.de/testcommitted"&gt;http://rakudo.de/testcommitted&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;Development of &lt;a href="http://pmthium.com/2011/02/08/new-nqp-repository-new-nom-rakudo-branch/"&gt;the
new nqp and rakudo-on-the-new-object-model&lt;/a&gt; is progressing nicely. I had
some fun porting some PIR code to NQP, and writing some new code. Most
interesting to read is the &lt;a href="https://github.com/rakudo/rakudo/tree/nom/src/Perl6/Metamodel"&gt;source of the
new meta model&lt;/a&gt;, much of which is written in a subset of Perl 6 (so quite
readable, if you happen to know Perl 6. For example you can see how &lt;a href="https://github.com/rakudo/rakudo/blob/nom/src/Perl6/Metamodel/MultipleInheritance.pm"&gt;the
    method resolution order for multiple inheritance is calculated.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a parrot branch that adds a generation garbage collector to
parrot. Its release is planned for shortly after the 3.1.0 release due
tomorrow. Initial benchmarks show that Rakudo is between 25% and 30% faster on
that parrot, as measured by a spectest run. I very much look forward to having
that in the parrot main line.&lt;/p&gt;

&lt;p&gt;Writing code for &lt;a href="https://github.com/sorear/niecza"&gt;niecza&lt;/a&gt;
is quite a nice experience. It still has a big startup cost, but then runs
much faster than rakudo (at least it feels that way). There are still lots of
features missing (for example non-integer number literals), but feature
requests are usually implement quite quickly.&lt;/p&gt;

 
</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/perl-6/notes-2011-02.html</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/cp2000an</link>
      <title> Travelling in time: the CP2000AN </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/cp2000an</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/yapc-europe-2007-day-1</link>
      <title> YAPC::Europe 2007 report: day 1 </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/yapc-europe-2007-day-1</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/thanks-yahoo</link>
      <title> Thanks, Yahoo! </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/thanks-yahoo</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/pod-includes</link>
      <title> POD includes </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/pod-includes</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/cgit-syntax-highlighting</link>
      <title> cgit syntax highlighting </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/cgit-syntax-highlighting</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/cpantesters-cpan-author-faq</link>
      <title> CPAN Testers' CPAN author FAQ </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/cpantesters-cpan-author-faq</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/misc/why-is-my-tmp-directory-only-1mb.html</link>
      <description>Today I got a really weird error on my Debian "Squeeze" Linux box -- a
processes tried to write a temp file, and it complained that there was No
space left on device.

The weird thing is, just yesterday my root parition was full, and I had
made about 7GB free space in it.

I checked, there was still plenty of room today. But behold:

$ df -h /tmp/
Filesystem            Size  Used Avail Use% Mounted on
overflow              1.0M  632K  392K  62% /tmp

So, suddenly my /tmp/ directory was a ram disc with just 1MB of space.
And it didn't show up in /etc/fstab, so I had no idea what cause it.

After googling a bit around, I found the likely reason: as a protection
against low disc space, some daemon automatically "shadows" the current
/tmp/ dir with a ram disc if the the root partition runs out of disc
space. Sadly there's no automatic reversion of that process once enough
disc space is free again.

To remove the mount, you can say (as root)

umount -l /tmp/

And to permanently disable this feature, use

echo 'MINTMPKB=0' &gt; /etc/default/mountoverflowtmp</description>
      <title>Why is my /tmp/ directory suddenly only 1MB big?</title>
      <content:encoded>

&lt;p&gt;Today I got a really weird error on my Debian "Squeeze" Linux box --
a processes tried to write a temp file, and it complained that there was
&lt;code&gt;No space left on device&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The weird thing is, just yesterday my root parition was full, and I had
made about 7GB free space in it.&lt;/p&gt;

&lt;p&gt;I checked, there was still plenty of room today. But behold:&lt;/p&gt;

&lt;pre&gt;
$ df -h /tmp/
Filesystem            Size  Used Avail Use% Mounted on
overflow              1.0M  632K  392K  62% /tmp
&lt;/pre&gt;

&lt;p&gt;So, suddenly my /tmp/ directory was a ram disc with just 1MB of space. And
it didn't show up in &lt;code&gt;/etc/fstab&lt;/code&gt;, so I had no idea what cause
it.&lt;/p&gt;

&lt;p&gt;After googling a bit around, I found the likely reason: &lt;a href="http://lists.alioth.debian.org/pipermail/pkg-sysvinit-devel/2007-June/001973.html"&gt;as
a protection against low disc space, some daemon automatically "shadows" the
current /tmp/ dir with a ram disc if the the root partition runs out of disc
space&lt;/a&gt;. Sadly there's no automatic reversion of that process once enough
disc space is free again.&lt;/p&gt;

&lt;p&gt;To remove the mount, you can say (as root)&lt;/p&gt;

&lt;pre&gt;
umount -l /tmp/
&lt;/pre&gt;

&lt;p&gt;And to permanently disable this feature, use&lt;/p&gt;

&lt;pre&gt;
echo 'MINTMPKB=0' &amp;gt; /etc/default/mountoverflowtmp
&lt;/pre&gt;

 
</content:encoded>
      <guid isPermaLink="false">tag:kitty,2006:http://perlgeek.de/blog-en/misc/why-is-my-tmp-directory-only-1mb.html</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/id/yapc-europe-2006-day-3</link>
      <title> YAPC::Europe 2006 report: day 3 </title>
      <guid isPermaLink="false">tag:kitty,2006: http://www.cantrell.org.uk/david/journal/id/yapc-europe-2006-day-3</guid>
    </item>
  </channel>
</rss>

