<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
>

<channel rdf:about="http://chris.prather.org/rss.xml">
<title>The Room</title>
<link>http://chris.prather.org/rss.xml</link>
<description></description>
<items>
 <rdf:Seq>
  <rdf:li rdf:resource="http://chris.prather.org/brewing-up-a-storm.md.html" />
  <rdf:li rdf:resource="http://chris.prather.org/shot-on-sight.md.html" />
  <rdf:li rdf:resource="http://chris.prather.org/perl-oasis-2010-thankyou.md.html" />
  <rdf:li rdf:resource="http://chris.prather.org/starting_out_with_ood.md.html" />
  <rdf:li rdf:resource="http://chris.prather.org/a-little-bit-of-history.md.html" />
  <rdf:li rdf:resource="http://chris.prather.org/lies-damn-liest-and-statistics.md.html" />
  <rdf:li rdf:resource="http://chris.prather.org/if-you-give-a-mouse-a-christmas.md.html" />
  <rdf:li rdf:resource="http://chris.prather.org/blawd-now-with-plack-control.md.html" />
  <rdf:li rdf:resource="http://chris.prather.org/software-delivery.md.html" />
  <rdf:li rdf:resource="http://chris.prather.org/perl-oasis-2010-hotel-rates-end.md.html" />
  <rdf:li rdf:resource="http://chris.prather.org/what-stops-me-from-using-perl-6-today.md.html" />
 </rdf:Seq>
</items>
</channel>
<item rdf:about="http://chris.prather.org/brewing-up-a-storm.md.html">
<title>Brewing Up a Storm</title>
<link>http://chris.prather.org/brewing-up-a-storm.md.html</link>
<description>&#x3C;h1 id=&#x22;brewingupastorm&#x22;&#x3E;Brewing Up a Storm&#x3C;/h1&#x3E;

&#x3C;p&#x3E;Because I recently had the opportunity to do a fresh re-install of my world&#x3C;a href=&#x22;#fn:1&#x22; id=&#x22;fnref:1&#x22; class=&#x22;footnote&#x22;&#x3E;1&#x3C;/a&#x3E;, I&#x27;ve spent the last few days playing with &#x3C;a href=&#x22;http://search.cpan.org/dist/App-perlbrew&#x22;&#x3E;&#x3C;code&#x3E;App::perlbrew&#x3C;/code&#x3E;&#x3C;/a&#x3E;. &#x3C;code&#x3E;App::perlbrew&#x3C;/code&#x3E; is the invention of Kang-min Liu aka gugod, and the basic idea is that it&#x27;s a perl manager. It will install and track several different installations of Perl for you, allowing you to switch between them at will.&#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;$perlbrew installed
perl-5.10.1
perl-5.8.9
perl-5.6.2

$perlbrew switch perl-5.10.1
$perl -v
This is perl, v5.10.1 (*) built for darwin-2level
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;I&#x27;d like to state now that what gugod had was very nice. It was very simple, very straight forward and did exactly what it said on the package. I have not spoke with him about this application, and anything I say here is my opinion and has no reflection upon him or anybody else that might have been involved. &#x3C;/p&#x3E;

&#x3C;p&#x3E;Having seen what power some simple scripting can do in the form of Miyagawa&#x27;s &#x3C;code&#x3E;App::cpanminus&#x3C;/code&#x3E;, I started tinkering with &#x3C;code&#x3E;perlbrew&#x3C;/code&#x3E;. It started with perl 5.10.1 not installing properly on Snow Leopard&#x3C;a href=&#x22;#fn:2&#x22; id=&#x22;fnref:2&#x22; class=&#x22;footnote&#x22;&#x3E;2&#x3C;/a&#x3E;, so the first thing I added was a way to force install. &#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;perlbrew install -f perl-5.10.1
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;Then I decided it and &#x3C;code&#x3E;local::lib&#x3C;/code&#x3E; both sharing $HOME/perl5 wasn&#x27;t going to be pretty. So I taught it to use an environment variable &#x3C;code&#x3E;PERLBREW_ROOT&#x3C;/code&#x3E; to relocate the default install. In my setup I have it set to &#x3C;code&#x3E;$HOME/.perlbrew&#x3C;/code&#x3E;.&#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;$export PERLBREW_ROOT=$HOME/.perlbrew
$perlbrew init
Attempting to create directory /Users/perigrin/.perlbrew/perls/current
Perlbrew environmet Initiated.
Required directories are created under /Users/perigrin/.perlbrew.
Please add this to the end of your ~/.bashrc:
    source /Users/perigrin/.perlbrew/etc/bashrc
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;Then I got annoyed with the pages of verbose output, so I stole a page from &#x3C;code&#x3E;cpanminus&#x3C;/code&#x3E; and implemented a &#x3C;code&#x3E;quiet&#x3C;/code&#x3E; switch that is enabled by default. Output now goes to &#x3C;code&#x3E;$PERLBREW_ROOT/build.log&#x3C;/code&#x3E;.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Today I integrated it with &#x3C;code&#x3E;local::lib&#x3C;/code&#x3E; so that if you have &#x3C;code&#x3E;local::lib&#x3C;/code&#x3E; installed it will drop the proper configuration in the &#x3C;code&#x3E;perlbrew&#x3C;/code&#x3E; configuration scripts so that when you install new modules they get installed into your &#x3C;code&#x3E;perlbrew&#x3C;/code&#x3E; managed directories&#x3C;a href=&#x22;#fn:3&#x22; id=&#x22;fnref:3&#x22; class=&#x22;footnote&#x22;&#x3E;3&#x3C;/a&#x3E;.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Finally just now I finished getting &#x3C;code&#x3E;--as=&#x3C;/code&#x3E; working. This means that if you build a custom perl you can have it installed under a special name and then easily switch to and from it. I&#x27;m planning on using this to build a &#x3C;code&#x3E;--as-workperl&#x3C;/code&#x3E; that contains all the modules I need for work. &#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;$perlbrew install perl-5.10.1 --as=debugging-perl -D=debugging
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;I would like to integrate a plugin system&#x3C;a href=&#x22;#fn:4&#x22; id=&#x22;fnref:4&#x22; class=&#x22;footnote&#x22;&#x3E;4&#x3C;/a&#x3E;, but all in all I&#x27;m very happy with it. Much thanks to gugod for making it to start with, and to Miyagawa for getting me itching for small lightweight tools in my toolchain. If you&#x27;re interested in my changes, you can check them out on my &#x3C;a href=&#x22;http://github.com/perigrin/App-perlbrew&#x22;&#x3E;github&#x3C;/a&#x3E;&#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2010-03-07T00:00:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;

&#x3C;div class=&#x22;footnotes&#x22;&#x3E;
&#x3C;hr /&#x3E;
&#x3C;ol&#x3E;

&#x3C;li id=&#x22;fn:1&#x22;&#x3E;&#x3C;p&#x3E;Last week I upgraded my trusty Macbook Pro from OSX 10.5 (Leopard) to OSX 10.6 (Snow Leopard), using a &#x22;complete wipe&#x22;. The old system had been around for ~3 years and was showing the cruft so it was time.&#x3C;a href=&#x22;#fnref:1&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;li id=&#x22;fn:2&#x22;&#x3E;&#x3C;p&#x3E;Apparently there is an issue with Snow Leopard&#x27;s locales, and a single test fails.&#x3C;a href=&#x22;#fnref:2&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;li id=&#x22;fn:3&#x22;&#x3E;&#x3C;p&#x3E;Full disclosure, I got this to the proof of concept stage but not really much further. It currently expects &#x3C;code&#x3E;local::lib&#x3C;/code&#x3E; to be installed to &#x3C;code&#x3E;$HOME/perl5&#x3C;/code&#x3E; (which is the default). If you have it installed somewhere else, you&#x27;ll need to manually set up the environment.&#x3C;a href=&#x22;#fnref:3&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;li id=&#x22;fn:4&#x22;&#x3E;&#x3C;p&#x3E;Having recently played with plugins in &#x3C;code&#x3E;cpanminus&#x3C;/code&#x3E; I have to say they&#x27;re incredibly nifty. The &#x3C;code&#x3E;github&#x3C;/code&#x3E; plugin is especially nice. I especially would like a plugin to allow swapping Git in for several parts of the system.&#x3C;a href=&#x22;#fnref:4&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;/ol&#x3E;
&#x3C;/div&#x3E;
</description>
<dc:date>2010-03-07T00:00:00Z</dc:date>
</item>
<item rdf:about="http://chris.prather.org/shot-on-sight.md.html">
<title>Why I should (apparently) be shot on sight</title>
<link>http://chris.prather.org/shot-on-sight.md.html</link>
<description>&#x3C;h1 id=&#x22;whyishouldapparentlybeshotonsight&#x22;&#x3E;Why I should (apparently) be shot on sight&#x3C;/h1&#x3E;

&#x3C;p&#x3E;Recently &#x3C;code&#x3E;chromatic&#x3C;/code&#x3E; posted:&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;[12:52] chromatic: More and more I think Module::Install &#x3C;em&#x3E;hurts&#x3C;/em&#x3E; 
    CPAN&#x27;s installation experience.  Ia!  Ia! EUMM fhtagn!&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;Which I found curious. I suspect it is because it resorts to driving ExtUtils::MakeMaker which &#x3C;code&#x3E;chromatic&#x3C;/code&#x3E; has been vocal about hating in the past. It was however Elliot Shank&#x27;s comments in response that I found really off putting.&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;[12:58] clonezone: .@chromatic_x I want to throttle all CPAN authors
    that use Module::Install. M::I may be great for the author, but it
    sucks as a user.&#x3C;/p&#x3E;
  
  &#x3C;p&#x3E;[12:59] clonezone: Any CPAN author that uses Module::AutoInstall
    should be shot on sight.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;Needless to say I use both &#x3C;a href=&#x22;http://search.cpan.org/dist/Module-Install/lib/Module/Install.pm&#x22;&#x3E;Module::Install&#x3C;/a&#x3E; and &#x3C;a href=&#x22;http://search.cpan.org/dist/Module-Install/lib/Module/AutoInstall.pm&#x22;&#x3E;Module::AutoInstall&#x3C;/a&#x3E;, and before the firing squad shows up to execute my unrepentant self I figured I should explain for posterity&#x27;s sake.&#x3C;/p&#x3E;

&#x3C;p&#x3E;First some history. In 2003 I became interested in the &#x3C;a href=&#x22;http://openguides.org&#x22;&#x3E;OpenGuides&#x3C;/a&#x3E; project. OpenGuides is a Perl based wiki to build guidebook style websites for Cities. I maintained a guide or two for a while before losing the time and resources to host them.&#x3C;/p&#x3E;

&#x3C;p&#x3E;OpenGuides uses Module::Build. Early on when I was starting to work with OpenGuides as a Guide Admin, a troublesome build of Module::Build had gotten into CPAN. I don&#x27;t recall the details and to be honest they&#x27;re not important. Things happen, not every release can be perfect. This build basically caused a ton of pain for anything that used Module::Build for installation. &#x3C;/p&#x3E;

&#x3C;p&#x3E;Obviously Module::Build has fixed these problems since then. I have not had a problem in over five years with Module::Build. Most of the time I don&#x27;t recognize that it is even being used&#x3C;a href=&#x22;#fn:1&#x22; id=&#x22;fnref:1&#x22; class=&#x22;footnote&#x22;&#x3E;1&#x3C;/a&#x3E;. This story isn&#x27;t about Module::Build, it&#x27;s about why I deserve to be shot on sight.&#x3C;/p&#x3E;

&#x3C;p&#x3E;The experience left a bad taste in my mouth. One bad module could break my entire toolchain. A module that the maintainers of OpenGuides didn&#x27;t control and couldn&#x27;t fix for me the user. That was a horrible experience, and it came right as I was starting to release my first Perl modules onto CPAN. &#x3C;/p&#x3E;

&#x3C;p&#x3E;I am lazy, and at the time I was using Module::Starter to build my distributions. Module::Starter would build my Makefile.PL to use EUMM and everything generally &#x22;just worked&#x22;, but I still didn&#x27;t like the fact that I had to rely upon the user having the right toolchain installed. When someone, I suspect &#x3C;code&#x3E;mst&#x3C;/code&#x3E; suggested I take a look at Module::Install because it auto bundled itself into &#x3C;code&#x3E;inc/&#x3C;/code&#x3E;. I was curious enough to take a look. The declarative sugar was nice, but the bundling was the important part. &#x3C;/p&#x3E;

&#x3C;p&#x3E;Now there has been an ages old debate about bundling. Adam Kennedy explained it well enough&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;In the Module::Install model, all authors need to do incremental
     releases of the modules affected by the problem, but users need to
     do nothing.&#x3C;/p&#x3E;
  
  &#x3C;p&#x3E;In the Module::Build model, all users affected by the problem need
     to upgrade their version of Module::Build, but authors need to do
     nothing.&#x3C;/p&#x3E;
  
  &#x3C;p&#x3E;At present, both of these don&#x27;t solve this problem correctly.&#x3C;/p&#x3E;
  
  &#x3C;p&#x3E;Module::Install doesn&#x27;t have a method for ensuring authors upgrade,
     and Module::Build doesn&#x27;t have a method for ensuring users upgrade.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;I quite obviously lean strongly on the &#x22;make the author responsible&#x22; side of the fence. The number of Authors of CPAN modules is smaller than the number of Users of CPAN modules. Make the pain point as small as possible is my argument. Module::Build even supports bundling itself now as well. So this story isn&#x27;t really about bundling either, this story is about why I deserve to be shot on sight.&#x3C;/p&#x3E;

&#x3C;p&#x3E;When one starts using Module::Install one quickly finds Module::AutoInstall, the one that has the firing squad after me. Module::AutoInstall will spawn a CPAN/CPANPLUS instance to chase down dependencies&#x3C;a href=&#x22;#fn:2&#x22; id=&#x22;fnref:2&#x22; class=&#x22;footnote&#x22;&#x3E;2&#x3C;/a&#x3E;. We use this at one of my jobs to maintain our dependencies for the very large application we&#x27;re maintaining, but it&#x27;s a feature that CPAN and CPANPLUS both have managed to do for quite some time now.&#x3C;/p&#x3E;

&#x3C;p&#x3E;The other feature that Module::AutoInstall performs, the one I&#x27;m willing to be shot for, is Features. Features are what make utilities like &#x3C;a href=&#x22;http://search.cpan.org/dist/Task-Kensho&#x22;&#x3E;&#x3C;code&#x3E;Task::Kensho&#x3C;/code&#x3E;&#x3C;/a&#x3E;, &#x3C;a href=&#x22;http://search.cpan.org/dist/Task-Catalyst&#x22;&#x3E;Task::Catalyst&#x3C;/a&#x3E;, and &#x3C;a href=&#x22;http://search.cpan.org/dist/Task-Moose&#x22;&#x3E;Task::Moose&#x3C;/a&#x3E; useful. They allow you to gather, possibly optional, dependencies together into smaller groups and present that as a choice to the user. Features do not exist in ExtUtils::MakeMaker, and in Module::Build the closest I could find was a &#x22;reccomends&#x22; dependency which lacks the grouping (as far as I could tell from the documentation).&#x3C;/p&#x3E;

&#x3C;p&#x3E;I have three modules that require Features to properly work. &#x3C;code&#x3E;Task::Kensho&#x3C;/code&#x3E; and &#x3C;code&#x3E;JSON::Any&#x3C;/code&#x3E; are the best known of them. Without Module::AutoInstall these two modules would be a much bigger hassle for my users. &#x3C;code&#x3E;JSON::Any&#x3C;/code&#x3E; for example would require me to define a specific default JSON package and make the others &#x22;reccomended&#x22;, this rather defeats the entire purpose of &#x3C;code&#x3E;JSON::Any&#x3C;/code&#x3E;. As for &#x3C;code&#x3E;Task::Kensho&#x3C;/code&#x3E;, one of the things I like most about it is that beyond a certain set of core modules relating to the tool chain and testing, everything else is optional. This means if you don&#x27;t want or need &#x3C;a href=&#x22;http://search.cpan.org/dist/POE&#x22;&#x3E;POE&#x3C;/a&#x3E; on your machine (perhaps because you enjoy AnyEvent), &#x3C;code&#x3E;Task::Kensho&#x3C;/code&#x3E; doesn&#x27;t force you to take it. But it does so at a large enough level that if you opt into POE, you get a good set of recommended modules picked by default.&#x3C;/p&#x3E;

&#x3C;p&#x3E;I am also lazy, I mentioned this. I have several Modules that need to be updated to no longer include &#x3C;code&#x3E;auto_install&#x3C;/code&#x3E; because they don&#x27;t need or use Features. But despite at least one of these modules being popular enough to make a Top 100 list, I have never had a complaint about not being able to install it. I cannot repent for thinking about my users&#x3C;a href=&#x22;#fn:3&#x22; id=&#x22;fnref:3&#x22; class=&#x22;footnote&#x22;&#x3E;3&#x3C;/a&#x3E;. So I will clean up the modules I have that don&#x27;t require Module::AutoInstall while I wait for the firing squad for the few modules that &#x3C;em&#x3E;must&#x3C;/em&#x3E; have it so that the user experience is the nicest I can provide.&#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2010-02-18T03:42:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;

&#x3C;div class=&#x22;footnotes&#x22;&#x3E;
&#x3C;hr /&#x3E;
&#x3C;ol&#x3E;

&#x3C;li id=&#x22;fn:1&#x22;&#x3E;&#x3C;p&#x3E;I give much thanks to Ken Williams, Michael Schwern, Eric Wilhelm, and David Golden for the work they&#x27;ve done over the years to make sure I don&#x27;t notice Module::Build anymore. They are awesome people who are making the world better.&#x3C;a href=&#x22;#fnref:1&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;li id=&#x22;fn:2&#x22;&#x3E;&#x3C;p&#x3E;It used to do this regardless of the environment it was in, but now has checks to bail if it&#x27;s under a CPAN/CPANPLUS install. They&#x27;re not perfect checks, but they should work on any CPAN releaed in the last two to three years.&#x3C;a href=&#x22;#fnref:2&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;li id=&#x22;fn:3&#x22;&#x3E;&#x3C;p&#x3E;If I truly were going to make life easier on myself I would have moved to &#x3C;a href=&#x22;http://search.cpan.org/dist/Dist-Zilla&#x22;&#x3E;Dist::Zilla&#x3C;/a&#x3E; and stopped even writing a Makefile.PL.&#x3C;a href=&#x22;#fnref:3&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;/ol&#x3E;
&#x3C;/div&#x3E;
</description>
<dc:date>2010-02-18T03:42:00Z</dc:date>
</item>
<item rdf:about="http://chris.prather.org/perl-oasis-2010-thankyou.md.html">
<title>Perl Oasis 2010 Thank You</title>
<link>http://chris.prather.org/perl-oasis-2010-thankyou.md.html</link>
<description>&#x3C;h1 id=&#x22;perloasis2010thankyou&#x22;&#x3E;Perl Oasis 2010 Thank You&#x3C;/h1&#x3E;

&#x3C;p&#x3E;So Perl Oasis 2010 is now done, I&#x27;m currently sitting in the Hackathon room watching people quietly mingle and work on their projects. All told we had 33 people from 15 PMs across 4 countries. This is a larger attendance than last year, but still small enough I felt I got to sit and talk with people and really hang out.&#x3C;/p&#x3E;

&#x3C;p&#x3E;To forestall questions, yes video was shot of all of the sessions. I&#x27;m unsure of how long the editing process will take, but expect an announcement when the video will be ready. The quality of all of the talks was excellent and overall The general comments I got were very favorable, things like &#x22;excellent workshop&#x22;, &#x22;well organized&#x22;. So I&#x27;m pleased with the results.&#x3C;/p&#x3E;

&#x3C;p&#x3E;On to the Thank You notes.&#x3C;/p&#x3E;

&#x3C;p&#x3E;I want to thank the people who came, these conferences simply wouldn&#x27;t work if nobody wanted to attend.  I also want to thank the speakers&#x3C;a href=&#x22;#fn:1&#x22; id=&#x22;fnref:1&#x22; class=&#x22;footnote&#x22;&#x3E;1&#x3C;/a&#x3E;, nobody would want to attend if we didn&#x27;t have such an excellent selection of talks. They &#x3C;em&#x3E;were&#x3C;/em&#x3E; the show.&#x3C;/p&#x3E;

&#x3C;p&#x3E;I want to thank &#x3C;a href=&#x22;http://martian.org/marty/&#x22;&#x3E;Marty&#x3C;/a&#x3E; and &#x3C;a href=&#x22;http://martian.org/karen/&#x22;&#x3E;Karen&#x3C;/a&#x3E; Pauly who traveled the furthest to be there. They are 2/3rds of the reason why Shibuya.pm was tied for the largest attending PM group. Karen also let Jamie and I talk her ear off with our organizing nattering and worries about the TPF. &#x3C;/p&#x3E;

&#x3C;p&#x3E;I want to thank Mark Keating (mdk) for his excellent keynote on &#x22;The awful things we all must do and the most disgusting word you&#x27;ll hear&#x22;. He encourages all of us to step out and talk about Perl not in divisive terms (Perl5 vs. Perl6; Perl vs. Python, Ruby, PHP; Perl5 Version 10 vs. Perl 5.10) but rather to use inclusive terms (Rakudo and Moose and possibly Perl &#x22;Vincent&#x22;). Mark also presented me with our new mascot for Perl Oasis, Aurelia the Camel.&#x3C;/p&#x3E;

&#x3C;p&#x3E;&#x3C;img src=&#x22;http://farm5.static.flickr.com/4037/4282005529_f8bd070a6f.jpg&#x22; alt=&#x22;Aurelia&#x22; id=&#x22;aurelia&#x22; /&#x3E;&#x3C;/p&#x3E;

&#x3C;p&#x3E;I want to thank &#x3C;a href=&#x22;&#x22;&#x3E;DataRocket Data Services&#x3C;/a&#x3E;, who provided our A/V equipment. They are an excellent bunch of guys who do insane things with MySQL and very large data sets. &#x3C;/p&#x3E;

&#x3C;p&#x3E;I want to specifically thank Cory Watson (gphat) and &#x3C;a href=&#x22;http://magazines.com&#x22;&#x3E;Magazines.com&#x3C;/a&#x3E; for stepping up and sponsoring the entire event. Without them we would be sitting in a parking lot somewhere, probably in the rain. &#x3C;/p&#x3E;

&#x3C;p&#x3E;Finally I would like to thank my wife, Jamie, who the attendees all know worked her ass off organizing. I am an incredibly disorganized person and without her nothing would ever have gotten done. &#x3C;/p&#x3E;

&#x3C;p&#x3E;We have already started talking with the venue about next year&#x27;s conference which will be the 15th of January, 2011. I hope to see you then!&#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2010-01-17T14:22:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;

&#x3C;div class=&#x22;footnotes&#x22;&#x3E;
&#x3C;hr /&#x3E;
&#x3C;ol&#x3E;

&#x3C;li id=&#x22;fn:1&#x22;&#x3E;&#x3C;p&#x3E;Specifically I should mention that Miyagawa says that we should help Plack become the top google hit for &#x3C;a href=&#x22;http://plackperl.org&#x22;&#x3E;Perl Web Server&#x3C;/a&#x3E;. So let&#x27;s help do that.&#x3C;a href=&#x22;#fnref:1&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;/ol&#x3E;
&#x3C;/div&#x3E;
</description>
<dc:date>2010-01-17T14:22:00Z</dc:date>
</item>
<item rdf:about="http://chris.prather.org/starting_out_with_ood.md.html">
<title>Starting out with OOD</title>
<link>http://chris.prather.org/starting_out_with_ood.md.html</link>
<description>&#x3C;h1 id=&#x22;startingoutwithood&#x22;&#x3E;Starting Out with  OOD&#x3C;/h1&#x3E;

&#x3C;p&#x3E;The &#x3C;a href=&#x22;http://stackoverflow.com/questions/1078838/oop-choosing-objects&#x22;&#x3E;basic question&#x3C;/a&#x3E;&#x3C;a href=&#x22;#fn:1&#x22; id=&#x22;fnref:1&#x22; class=&#x22;footnote&#x22;&#x3E;1&#x3C;/a&#x3E; for Object Oriented Design is &#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;For a given domain, how do you break the model up into Objects and
    Classes?&#x22;&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;Let&#x27;s say we&#x27;re going to build an application to model the life cycle of a Book. The naive approach is to start asking &#x22;What different things are involved with Books, and how are they related?&#x22; The domain can be literally infinite when you start breaking it out and exploring it in detail.&#x3C;/p&#x3E;

&#x3C;p&#x3E;This ability to break things up is part of the power of Object Oriented Design, because it seems like it should operate the way people have thought about the world for centuries. For the most part it does operate that way.  Without constraint, however, you end up lost trying to achieve some platonic ideal (like the questioner on Stack Overflow) or you end up with what people have come to call &#x3C;a href=&#x22;http://en.wikipedia.org/wiki/Ravioli_code#Ravioli_code&#x22;&#x3E;Ravioli Code&#x3C;/a&#x3E;.&#x3C;/p&#x3E;

&#x3C;p&#x3E;The platonic ideal trap is trying to figure out if a Book has an Author or a Author has a Book, and what to properly name the parent class of Books, Graphic Novels, and Magazines. It&#x27;s involved with questions of should a Magazine have a &#x22;Table of Contents&#x22;, Index, or Appendices? Should a Graphic Novel? Trying to sort these things out  is a fool&#x27;s errand of fiddling details that may have no reflection on the needs of the system you&#x27;re building. If the &#x3C;code&#x3E;cover_style&#x3C;/code&#x3E; attribute is never called, does it matter that it might possibly return &#x3C;code&#x3E;&#x27;hardback&#x27;&#x3C;/code&#x3E; for a Magazine?&#x3C;/p&#x3E;

&#x3C;p&#x3E;The other end of the spectrum is Ravioli Code. Ravioli Code is what you get when you no-longer model discrete components in your logic, but rather model sub-components. It&#x27;s like talking about a Book not as a collection of pages, words and phrases but rather as a sequence of glyphs and wood pulp recipes. The resolution of the focus of your model is too tight, not only can you not see the forrest for the trees, you can&#x27;t see the tree for the wood grain.&#x3C;/p&#x3E;

&#x3C;p&#x3E;The Power of object oriented modeling needs to be constrained by the needs of the application you&#x27;re building. Say for example you&#x27;re building a system for tracking a single book that is being written without considering it&#x27;s publishing or distribution. In this system you won&#x27;t need to model Sales, Stores, Advertising or any number of things dealing with the distribution chain, nor would you need to know about paper bond, binding type, covers, type faces, line height or the minutia of building the artifact that is a Book. You will however need to model things like Pages, Chapters, Paragraphs.&#x3C;/p&#x3E;

&#x3C;p&#x3E;To bring this back around to the point, in any application of Object Oriented Design the goal is to have a Class or Object hierarchy that matches exactly as much of &#x22;reality&#x22; as you need to accurately describe and solve the problems you&#x27;re writing a program to solve, and nothing more. There is a quote by Antoine de Saint-Exupery&#x3C;a href=&#x22;#fn:2&#x22; id=&#x22;fnref:2&#x22; class=&#x22;footnote&#x22;&#x3E;2&#x3C;/a&#x3E;:&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;Perfection is achieved, not when there is nothing more to add, but
    when there is nothing left to take away.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;Instead of starting with &#x22;What different things are involved with Books, and how are they related?&#x22; we with really should start with &#x22;what features of a Book do I need to enable my application to deal with?&#x22;&#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2009-12-31T19:21:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;

&#x3C;div class=&#x22;footnotes&#x22;&#x3E;
&#x3C;hr /&#x3E;
&#x3C;ol&#x3E;

&#x3C;li id=&#x22;fn:1&#x22;&#x3E;&#x3C;p&#x3E;The accepted answer for this question on Stack Overflow is excellent.&#x3C;a href=&#x22;#fnref:1&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;li id=&#x22;fn:2&#x22;&#x3E;&#x3C;p&#x3E;&#x3C;a href=&#x22;http://stevan-little.blogspot.com/&#x22;&#x3E;Stevan&#x3C;/a&#x3E; uses this quote all the time&#x3C;a href=&#x22;#fnref:2&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;/ol&#x3E;
&#x3C;/div&#x3E;
</description>
<dc:date>2009-12-31T19:21:00Z</dc:date>
</item>
<item rdf:about="http://chris.prather.org/a-little-bit-of-history.md.html">
<title>A Little Bit of History</title>
<link>http://chris.prather.org/a-little-bit-of-history.md.html</link>
<description>&#x3C;h1 id=&#x22;alittlebitofhistory&#x22;&#x3E;A Little Bit of History&#x3C;/h1&#x3E;

&#x3C;p&#x3E;I recently did some digging for what may be some future writings, as well as possibly something larger. Part of those diggings involved research into Object Oriented programming&#x27;s history. I found this example on wikipedia of Simula 67, the first Object Oriented programming language.&#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;Begin
   Class Glyph;
      Virtual: Procedure print Is Procedure print;;
   Begin
   End;

   Glyph Class Char (c);
      Character c;
   Begin
      Procedure print;
        OutChar(c);
   End;

   Glyph Class Line (elements);
      Ref (Glyph) Array elements;
   Begin
      Procedure print;
      Begin
         Integer i;
         For i:= 1 Step 1 Until UpperBound (elements, 1) Do
            elements (i).print;
         OutImage;
      End;
   End;

   Ref (Glyph) rg;
   Ref (Glyph) Array rgs (1 : 4);

   ! Main program;
   rgs (1):- New Char (&#x27;A&#x27;);
   rgs (2):- New Char (&#x27;b&#x27;);
   rgs (3):- New Char (&#x27;b&#x27;);
   rgs (4):- New Char (&#x27;a&#x27;);
   rg:- New Line (rgs);
   rg.print;
End;
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;Here is a translation of the Simula 67 Example using &#x3C;a href=&#x22;http://search.cpan.org/dist/MooseX-Declare&#x22;&#x3E;MooseX::Declare&#x3C;/a&#x3E;&#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;{
    use MooseX::Declare;

    class Glyph {
        sub print { confess &#xE2;&#x80;&#x9C;Virtual&#xE2;&#x80;&#x9D; }
    }

    class Char extends Glyph {
        has char =&#x26;gt; ( isa =&#x26;gt; &#xE2;&#x80;&#x98;Charecter&#xE2;&#x80;&#x99;, is =&#x26;gt; &#xE2;&#x80;&#x98;ro&#xE2;&#x80;&#x99; );
        method print { CORE::print $self-&#x26;gt;char }
    }

    class Line extends Glyph {
        has elements =&#x26;gt; ( isa =&#x26;gt; &#xE2;&#x80;&#x98;ArrayRef[Glyph]&#xE2;&#x80;&#x99;, is =&#x26;gt; &#xE2;&#x80;&#x98;ro&#xE2;&#x80;&#x99; );
        method print { $_-&#x26;gt;print for @{ $self-&#x26;gt;elements } }
    }

    # Main program
    my @rgs = map { Char-&#x26;gt;new(char=&#x26;gt;$_) } qw(A b b a);
    my $rg = Line-&#x26;gt;new(elements =&#x26;gt; \@rgs);
    $rg-&#x26;gt;print;
}
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;There really isn&#x27;t a point to this post, but I thought it was neat to see how nicely clean Object Oriented programming translates from it&#x27;s earliest days to something very recent.&#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2009-12-24T01:38:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;
</description>
<dc:date>2009-12-24T01:38:00Z</dc:date>
</item>
<item rdf:about="http://chris.prather.org/lies-damn-liest-and-statistics.md.html">
<title>Lies, Damn Lies, and Statistics</title>
<link>http://chris.prather.org/lies-damn-liest-and-statistics.md.html</link>
<description>&#x3C;h1 id=&#x22;liesdamnliesandstatistics&#x22;&#x3E;Lies, Damn Lies, and Statistics&#x3C;/h1&#x3E;

&#x3C;p&#x3E;UPDATE: &#x3C;/p&#x3E;

&#x3C;p&#x3E;Aldo Cortesi contacted me privately via email with a response to this post. With his permission I&#x27;ve updated this post with the substance of his response and my own rebuttal. The updated sections are marked with UPDATE/END blocks.&#x3C;/p&#x3E;

&#x3C;p&#x3E;END&#x3C;/p&#x3E;

&#x3C;p&#x3E;So after chromatic &#x3C;a href=&#x22;http://identi.ca/notice/16739116&#x22;&#x3E;linked&#x3C;/a&#x3E; to Aldo Cortesi&#x27;s post &#x3C;a href=&#x22;http://corte.si/posts/code/devsurvey/index.html&#x22;&#x3E;The impact of
language choice on github projects&#x3C;/a&#x3E; I was curious. After reading the
post, I was shocked and dismayed at some of the analysis Mr. Cortesi
attempts to derive from his data. I brought it up on IRC and decided at
first that &#x3C;code&#x3E;rjbs&#x3C;/code&#x3E;&#x27;s advice is best, &#x22;just ignore it.&#x22;&#x3C;/p&#x3E;

&#x3C;p&#x3E;Obviously that didn&#x27;t stand, because I saw Flavio Poletti and osfameron
&#x3C;a href=&#x22;http://www.polettix.it/perlettix/id_perl-5-parsing&#x22;&#x3E;both&#x3C;/a&#x3E; &#x3C;a href=&#x22;http://greenokapi.net/blog/2009/12/15/github-language-statistics/&#x22;&#x3E;comment&#x3C;/a&#x3E; about Cortesi&#x27;s post. Upon second reflection I
realized that perhaps there was some nice value to be taken out of the
data he presents.&#x3C;/p&#x3E;

&#x3C;p&#x3E;At the time Cortesi extracted his data from github, Perl was the 6th
most popular language.&#x3C;a href=&#x22;#fn:1&#x22; id=&#x22;fnref:1&#x22; class=&#x22;footnote&#x22;&#x3E;1&#x3C;/a&#x3E; Cortesi&#x27;s first two illustrations look
particularly nice for Perl. First he pulled out the median number of
contributors (emphasis is his).&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;&#x3C;strong&#x3E;Most projects have around 3 contributors, with Perl and Java
    projects having about 5, and Javascript and Objective C around 2.&#x3C;/strong&#x3E;&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;This means in general that Perl projects have &#x3C;em&#x3E;more&#x3C;/em&#x3E; developers than the
other languages measured except for C++. This is a good sign. Next he
pulled out the median number of commits (again emphasis his).&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;&#x3C;strong&#x3E;Most projects have around 75 commits.&#x3C;/strong&#x3E;&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;Perl however in his data (again like C++) has a much higher media,
nearly 200 commits median. His explanation for this was (to me) very
unsatisfying.&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;The Perl and C++ data, however, seems significant - projects in
    these languages on average have a much longer commit history. I
    suspect that this is due to a decline in popularity in these
    languages. Recall that I collected data only for projects that had
    recent commits. If fewer new projects are created in C++ and Perl,
    we would expect projects in these languages to be older, on average.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;I think that the sheer fact that Perl (and C++) are both much older
languages is enough to explain the discrepancy. Perl has many projects
that have converted from one or more version control systems (Moose for
example has a revision history that is only a year younger than Git
itself, and is considered a &#x3C;em&#x3E;young&#x3C;/em&#x3E; project in the Perl world).&#x3C;/p&#x3E;

&#x3C;p&#x3E;The Perl community also tends to get behind a few &#x3C;em&#x3E;good&#x3C;/em&#x3E; projects. This
isn&#x27;t really obvious unless you&#x27;re active in the Perl community, there
are many many things that aren&#x27;t obvious unless you&#x27;re in the Perl
community, it actually is a problem but one for a later blog post.&#x3C;/p&#x3E;

&#x3C;p&#x3E;So to extrapolate further, the Perl community tries to engender people
rather than create a &#x3C;em&#x3E;new&#x3C;/em&#x3E; project, to use one of the 21 thousand
existing projects to solve their problem. This explains why we have a
higher median number of contributors to our projects as well as why our
projects are on a whole &#x3C;em&#x3E;older&#x3C;/em&#x3E;. &#x3C;/p&#x3E;

&#x3C;p&#x3E;UPDATE: &#x3C;/p&#x3E;

&#x3C;p&#x3E;Cortesi pointed out the following.&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;The first point where you strongly disagree with me is my conjecture
  that the higher median commit count for Perl and C++ is due to a
  decline in popluarity in the languages, which means that my sample is
  skewed towards &#x22;older&#x22; projects. You counter that it might just be that
  Perl and C++ are older, and that this is reflected in the project data.
  This doesn&#x27;t sound right to me - for one thing, Perl was first releaed
  in 1987, and Python in 1990. I just don&#x27;t think that a 3 year
  difference over a 20+ year history can explain the size of the effect.
  One way to approach this might be to look at the rate of project
  creation over the last few years, which would be easy enough to do.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;He&#x27;s right, I&#x27;m simply parroting the stereotype that Perl is
older than Python (or even Ruby which came into existence in the mid
90s) when I rightly know better. The stereotype however does have some
merit. It&#x27;s generally accepted that Perl had it&#x27;s &#x3C;em&#x3E;second&#x3C;/em&#x3E; wind during
the dot-com era and that was when Python had it&#x27;s first wind.&#x3C;/p&#x3E;

&#x3C;p&#x3E;I&#x27;m honestly not sure that the data can be conclusive argued one way
or the other without perhaps correlating the age of the data (time
since first commit) in there as well.&#x3C;/p&#x3E;

&#x3C;p&#x3E;END&#x3C;/p&#x3E;

&#x3C;p&#x3E;Next Cortesi measured number of files touched per commit (emphasis his).&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;&#x3C;strong&#x3E;Most commits touch about 4 files, with C++ touching somewhat more,
    and Perl, Python and Ruby somewhat less.&#x3C;/strong&#x3E;&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;This is most easily explained by the nature of the dynamic languages
that more is done in smaller modules, blah blah blah. Neither Cortesi
nor I really found anything interesting in this because it upholds the
standard stereotypes.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Next Cortesi talks about Contributors (emphasis his).&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;&#x3C;strong&#x3E;The average contributor contributes about 5 commits to a project.
    C, Objective C and Ruby developers contribute somewhat less, PHP,
    C#, Java and Javascript developers somewhat more.&#x3C;/strong&#x3E; I suspect the
    results for C and Ruby are due to projects in these languages
    receiving more one-off contributions.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;Here Perl clocks in at &#x3C;em&#x3E;exactly&#x3C;/em&#x3E; the median. If I were to guess I think
the meaning here is that on average Perl projects have on average a
larger core group of contributers with smaller one off commits, and that
these two facts offset each other. This story reflects the information
above (higher median contributer count, older more established
projects), as well as the next point Cortesi makes (emphasis his).&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;&#x3C;strong&#x3E;For all languages, a small fraction of the committers do the vast
     majority of the work.&#x3C;/strong&#x3E; This won&#x27;t be news to anyone in the Open
     Source community. More interesting, though, is the fact that &#x3C;strong&#x3E;C,
     C++ and Perl projects are significantly more &#x22;top-heavy&#x22; than those
     in other languages, with a smaller core of contributors doing more
     of the work.&#x3C;/strong&#x3E;&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;This really just reinforces the previous point that Perl&#x27;s projects are
older and more established, with a stronger commitment from it&#x27;s core
contributors. This could be read as Perl being a dying language, just
like C and C++. This could also be read as these three languages not
being &#x3C;em&#x3E;fad languages&#x3C;/em&#x3E;, where people swoop in, commit a whole bunch and
then drift off. Really there isn&#x27;t enough information here to tease out
which is true.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Finally Cortesi tries to make a correlation between the number of
committers for projects and something. I think however there may be a
problem with his analysis. First he measures commits vs committer as a
measure of how well languages recruit and retain contributors. Perl here
shows up fairly well actually, third only to Python and Ruby. I strongly
suspect that the significant discrepancy in data between these languages
(there are more than twice as many Python projects included as Perl, and
Ruby is four times again as much as Python) may come into play, but I&#x27;ve
no evidence to back that up.&#x3C;/p&#x3E;

&#x3C;p&#x3E;UPDATE:&#x3C;/p&#x3E;

&#x3C;p&#x3E;Cortesi noted the following, which is a fair point I overlooked. &#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;Here, I&#x27;d like to point out that the graph shows the total commits vs
  the total committers per project. As such, it doesn&#x27;t tell us anything
  about the &#x3C;em&#x3E;retention&#x3C;/em&#x3E; of committers - a committer who makes a single
  commit and leaves the project is still counted. I&#x27;ve been thinking
  about how to measure committer retention - perhaps looking at the
  timespan bracketed by the first and last commits of a committer, as a
  percentage of the lifespan of the project.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;END&#x3C;/p&#x3E;

&#x3C;p&#x3E;The next set of graphs shows the number of commits per day over the
first 300 days of a project. Perl here shows a strong decline, the
strongest actually. Coming in second is C, then Ruby being the last
obviously show a decline (Python and C++ could arguably show a decline,
but they just as arguably are flat). The other languages are all flat,
or show a slight increase.&#x3C;/p&#x3E;

&#x3C;p&#x3E;A suggestion came up in the comments to Cortesi&#x27;s that Perl projects
tend to be &#x22;complete&#x22; and move into maintenance mode. Cortesi actively
rejects this idea. While I disagree with his analysis&#x3C;a href=&#x22;#fn:2&#x22; id=&#x22;fnref:2&#x22; class=&#x22;footnote&#x22;&#x3E;2&#x3C;/a&#x3E; I think he&#x27;s
correct in refuting this. I &#x3C;em&#x3E;suspect&#x3C;/em&#x3E; that instead Perl projects quickly
move to a point where they are obviously inferior to another project and
are abandoned.&#x3C;/p&#x3E;

&#x3C;p&#x3E;This story would play out with the earlier arguments regarding the
commit count, and the age of Perl projects. The story behind
&#x3C;code&#x3E;DBIx::Class&#x3C;/code&#x3E; is a good example (even though it works counter to my
argument). Originally Matt Trout used and actively contributed to
&#x3C;code&#x3E;Class::DBI&#x3C;/code&#x3E;, &#x3C;code&#x3E;DBIx::Class&#x3C;/code&#x3E; was intended to research ideas for moving
&#x3C;code&#x3E;Class::DBI&#x3C;/code&#x3E;&#x27;s codebase forward. It wasn&#x27;t until fundamental design
differences between &#x3C;code&#x3E;Class::DBI&#x3C;/code&#x3E; and &#x3C;code&#x3E;DBIx::Class&#x3C;/code&#x3E; were discovered that
the fork of the community really occured, and even then for the longest
time &#x3C;code&#x3E;DBIx::Class&#x3C;/code&#x3E; maintained a CDBI compatible API.&#x3C;/p&#x3E;

&#x3C;p&#x3E;This story plays out more often in the small, and in many of those the
research project is found to be fundamentally flawed, or folded back
into the parent project, or abandoned due to lack of community interest.
The fact that this story plays out again and again in the Perl community
is in some ways very ironic considering the Perl motto of TIMTOWDI, but
this is the basis of the new motto TIMTOWDI BSCINABTE (pronounced
Timtoady Bicarbonate and meaning There Is More Than One Way To Do It,
But Sometimes Consistence Is Not A Bad Thing Either).&#x3C;/p&#x3E;

&#x3C;p&#x3E;Finally, it&#x27;s obvious in the analysis and comments that Cortesi dislikes
Perl. He is allowed to have his opinion, obviously to anyone who reads
more than one post on this blog I don&#x27;t share it. I found it
particularly dismaying&#x3C;a href=&#x22;#fn:3&#x22; id=&#x22;fnref:3&#x22; class=&#x22;footnote&#x22;&#x3E;3&#x3C;/a&#x3E; however he let his opinion of Perl ruin his
analysis, and lead to what he calls &#x22;the venomousness of some of the
Perl commentators&#x22;.&#x3C;/p&#x3E;

&#x3C;p&#x3E;I can only assume that the venomousness he is talking about was removed
or particularly bad in email, because the comments that stand now
&#x3C;em&#x3E;appear&#x3C;/em&#x3E; relatively rational and inline with the tone set in the body. I
can&#x27;t pretend that the Perl community isn&#x27;t full of loudmouth assholes,
I&#x27;m one of them, however if people find themselves feeling venomous,
they should take it to their own blog. Better yet, take a deep breath
and start that new project that is really cool and will change the
world, and upload it to github so that the world beyond Perl can see it.&#x3C;/p&#x3E;

&#x3C;p&#x3E;UPDATE:&#x3C;/p&#x3E;

&#x3C;p&#x3E;This is pure conjecture on my part, any opinion expressed here is entirely my own and has not been approved or vetted by Mr. Cortesi. &#x3C;/p&#x3E;

&#x3C;p&#x3E;Aldo seems genuinely surprised at the strength of reaction he had, and in speaking with him his comments weren&#x27;t intended to be as inflammatory as they came off. I&#x27;ve expressed that the Perl of the past isn&#x27;t the Modern Enlightened Perl we all know and love (YOU DO LOVE IT RIGHT?!?), and tried to show how things really are in the Perl universe I see rather than the one he&#x27;s obviously experienced in the past.&#x3C;/p&#x3E;

&#x3C;p&#x3E;END&#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2009-12-15T18:40:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;

&#x3C;div class=&#x22;footnotes&#x22;&#x3E;
&#x3C;hr /&#x3E;
&#x3C;ol&#x3E;

&#x3C;li id=&#x22;fn:1&#x22;&#x3E;&#x3C;p&#x3E;Today it is the second most popular language on github. The
increase in &#x22;popularity&#x22; is entirely based upon the &#x3C;a href=&#x22;http://github.com/gitpan/&#x22;&#x3E;&#x3C;code&#x3E;gitpan&#x3C;/code&#x3E;&#x3C;/a&#x3E;
project which uploaded the entire &#x3C;a href=&#x22;http://backpan.perl.org/&#x22;&#x3E;Backpan&#x3C;/a&#x3E; repository as git repos.
However the 21,766 repositories in &#x3C;code&#x3E;gitpan&#x3C;/code&#x3E; are not followed by at least
3 people each, so thankfully wouldn&#x27;t affect the outcome of the
experiment.&#x3C;a href=&#x22;#fnref:1&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;li id=&#x22;fn:2&#x22;&#x3E;&#x3C;p&#x3E;The conclusion that Cortesi makes is that Perl is that Perl is
somehow much more difficult a language to contribute to after 300 days,
but this is contrary to the &#x3C;em&#x3E;other&#x3C;/em&#x3E; evidence he presents that perl
projects are in general older with a larger median contributor size, and
a larger core of contributors over time.&#x3C;a href=&#x22;#fnref:2&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;li id=&#x22;fn:3&#x22;&#x3E;&#x3C;p&#x3E;I for one found the &#x22;offhand speculation&#x22; didn&#x27;t even follow the
data presented accurately enough to justify its existence without a
qualifier (simply stating &#x22;my opinion is that ... &#x22;). A stronger
distinction between the analysis of the data, and the sterotypical
opinions he thought it backed up might have helped tone down the venom.&#x3C;a href=&#x22;#fnref:3&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;/ol&#x3E;
&#x3C;/div&#x3E;
</description>
<dc:date>2009-12-15T18:40:00Z</dc:date>
</item>
<item rdf:about="http://chris.prather.org/if-you-give-a-mouse-a-christmas.md.html">
<title>If You Give a Mouse A Christmas</title>
<link>http://chris.prather.org/if-you-give-a-mouse-a-christmas.md.html</link>
<description>&#x3C;h1 id=&#x22;ifyougiveamouseachristmas&#x22;&#x3E;If You Give a Mouse A Christmas&#x3C;/h1&#x3E;

&#x3C;p&#x3E;Jerrad Pierce wrote a &#x3C;a href=&#x22;http://www.perladvent.org/2009/1/&#x22;&#x3E;Perl Advent Calendar entry&#x3C;/a&#x3E; that has sparked
some discussion in the Moose community. He has revised it two or three
times, and the final version is disappointing but not blatantly wrong.
As a Moose contributor who has deployed Mouse into production I wanted
to give some perspective on the issues that came up.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Jerrad suggests strongly in the tone of his article that Mouse is
everything you want in Moose but faster. There are some strong issues
with this implication, the first being that there is no way to really
know if that is true. Jerrad quotes the Mouse documentation by saying&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;Mouse is &#x22;Moose without the antlers&#x22; i.e; lacking the thorny
     dependencies and added heft giving you a pain in the neck.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;But the truth is that the antlers the Mouse documentation is talking
about isn&#x27;t the dependencies (which I&#x27;ve &#x3C;a href=&#x22;http://chris.prather.org/moose-dependencies--a-lurid-tale.html&#x22;&#x3E;blogged about previously&#x3C;/a&#x3E;),
it is the Meta Object Protocol (the MOP). To quote Jerrad again (from
one of his re-writes)&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;[Mouse] can be a nicer, gentler introduction to the world of Moose.
    Like the cervine form, the rodent provides a simple means of
    providing accessors which are more explicit than a generalized
    AUTOLOAD mechanism, while still eliminating redundant code. Plenty
    of other fancy OO features come along for the ride, but no
    &#x22;metaprotocol stuff,&#x22; which some would argue is the raison d&#x27;&#xC3;&#xAA;tre of
    Moose.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;Mouse implements much of the &#x3C;em&#x3E;sugar&#x3C;/em&#x3E; from Moose, but implements the
bare-minimum of an Object System to back up that sugar.&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;You may be willing to make such a trade-off, but what if you&#x27;re not
    writing the code, and instead run into some other module that foists
    Moose upon you? That author may or may not need all of Moose, but
    chances are good they don&#x27;t.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;Here is where my problem with the solution provided in this calendar
entry comes. Chances are that the developer who chose to use Moose has
no clue which pieces of the MOP they rely upon. The MOP in Moose is a
kind of an iceberg, everything in Moose is build around it. The thin
sugar layer that most people interact with is only the surface of what
is going on inside.&#x3C;/p&#x3E;

&#x3C;p&#x3E;This is the power of Moose. You don&#x27;t &#x3C;em&#x3E;need&#x3C;/em&#x3E; to know what is going on
for 90% of the things you do, you just need to know that Moose works,
and &#x3C;a href=&#x22;http://search.cpan.org/dist/MooseX-Aliases&#x22;&#x3E;MooseX::Aliases&#x3C;/a&#x3E;, or &#x3C;a href=&#x22;http://search.cpan.org/dist/MooseX-Getopt&#x22;&#x3E;MooseX::Getopt&#x3C;/a&#x3E;, or
&#x3C;a href=&#x22;http://search.cpan.org/dist/MooseX-Storage&#x22;&#x3E;MooseX::Storage&#x3C;/a&#x3E; can hook into the proper places in the MOP and get
things done.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Jerrad mentions this almost as an aside though in his calendar entry.&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;Note that even if other code will compile correctly with Mouse, it&#x27;s
    possible the code could be doing some deep introspection and you may
    end up with Chet rather than Comet. it is therefore recommended that
    you run the code&#x27;s test suite against Mouse whether you force it
    through Package::Alias or substituting Any::Moose.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;How confident are you that your test suite includes the proper coverage
for your application that you can detect subtle bugs in the MOP? I have
a few applications that have high 90%+ test coverage, and I&#x27;m not sure
&#x3C;em&#x3E;they&#x3C;/em&#x3E; would deal well with having their object system replaced
underneath them.&#x3C;/p&#x3E;

&#x3C;p&#x3E;The fact of the matter is that unless the upstream module author
designed their application with possible Mouse usage in mind, it simply
cannot be a safe guaranteed drop in replacement for Moose. This is why
the Mouse documentation say to use Moose instead.&#x3C;/p&#x3E;

&#x3C;p&#x3E;This leads to my last, and sadly personal, issue with this calendar post. I&#x27;m an active member in the Moose community. I have been for about three years now. I am one of the people who will have to support the kinds of failure that this well intentioned but reckless advice will cause.&#x3C;/p&#x3E;

&#x3C;p&#x3E;If Jerrad had simply talked to us when writing this calendar post, we wouldn&#x27;t have reacted so strongly. We could have pointed out the issues in the advice he was giving, and helped him to write a better article that focused on the important part of advocating Mouse as a reasonable replacement for Moose in some circumstances, and the interesting hack he performed with Package::Alias, or Alias.pm, or even the &#x3C;code&#x3E;import&#x3C;/code&#x3E; hack someone in the Moose community suggested.&#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2009-12-02T18:14:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;
</description>
<dc:date>2009-12-02T18:14:00Z</dc:date>
</item>
<item rdf:about="http://chris.prather.org/blawd-now-with-plack-control.md.html">
<title>Blawd: Now With Plack Control</title>
<link>http://chris.prather.org/blawd-now-with-plack-control.md.html</link>
<description>&#x3C;h1 id=&#x22;blawd:nowwithplackcontrol&#x22;&#x3E;Blawd: Now With Plack Control&#x3C;/h1&#x3E;

&#x3C;p&#x3E;miyagawa, the esteemed ring-leader behind the &#x3C;a href=&#x22;http://plackperl.org/&#x22;&#x3E;PSGI/Plack&#x3C;/a&#x3E; tonight in response to an idle comment about wanting to move Blawd&#x27;s simple &#x3C;code&#x3E;server&#x3C;/code&#x3E; command over to the PSGI standard supplied me with a quick patch to do just that. So as of the most recent commit &#x3C;code&#x3E;blawd server --repo myblog.git&#x3C;/code&#x3E; should &#x22;just work&#x22; with any environment that speaks PSGI. The code itself was exceptionally elegant and I thought it deserved to be shown off.&#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;has host =&#x26;gt; ( isa =&#x26;gt; &#x27;Str&#x27;, is =&#x26;gt; &#x27;ro&#x27;, default =&#x26;gt; &#x27;localhost&#x27; );
has port =&#x26;gt; ( isa =&#x26;gt; &#x27;Int&#x27;, is =&#x26;gt; &#x27;ro&#x27;, default =&#x26;gt; 1978 );

sub _build__http_engine {
        my ($self) = @_;
        HTTP::Engine-&#x26;gt;new(
            interface =&#x26;gt; {
                    module          =&#x26;gt; &#x27;PSGI&#x27;,
                    request_handler =&#x26;gt; sub { $self-&#x26;gt;handle_request(@_) },
            },
        );
}

sub execute {
        my $self = shift;
        my $app = sub { $self-&#x26;gt;_http_engine-&#x26;gt;run(@_) };
        Plack::Loader-&#x26;gt;auto( host =&#x26;gt; $self-&#x26;gt;host, port =&#x26;gt; $self-&#x26;gt;port )-&#x26;gt;run($app);
}
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;The old version was based on &#x3C;a href=&#x22;http://search.cpan.org/dist/HTTP-Engine&#x22;&#x3E;HTTP::Engine&#x3C;/a&#x3E; the new version takes advantage of the HTTP::Engine plack support. &#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2009-12-02T00:00:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;
</description>
<dc:date>2009-12-02T00:00:00Z</dc:date>
</item>
<item rdf:about="http://chris.prather.org/software-delivery.md.html">
<title>Software Delivery! </title>
<link>http://chris.prather.org/software-delivery.md.html</link>
<description>&#x3C;h1 id=&#x22;softwaredelivery&#x22;&#x3E;Software Delivery!&#x3C;/h1&#x3E;

&#x3C;p&#x3E;I was just reading Matt Asay&#x27;s &#x3C;a href=&#x22;http://news.cnet.com/8301-13505_3-10404406-16.html&#x22;&#x3E;piece&#x3C;/a&#x3E; about Domino&#x27;s using open
source to build out their multi-million dollar order fulfillment system.
His take away quote got me thinking.&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;There will still be a need for companies like SAP, of course, as there
  are broad industry needs that a company or open-source foundation can
  satisfy. But for strategic IT projects, we&#x27;re likely to see more open
  source plus internal development, and less packaged software 
  purchases.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;The gist of this is that these companies like Domino&#x27;s will be building
up their internal IT departments to largely take on the kinds of
projects that they would previously buy enterprise grade software from Microsoft or SAP. I disagree.&#x3C;/p&#x3E;

&#x3C;p&#x3E;I think (or perhaps hope) that this is the first step in a further
evolution. There is no long term economic reason why Domino&#x27;s should be
in the the software development business. That&#x27;s not their core
business. Saying that the future of open source jobs is working for the
Domino&#x27;s internal software development group is like saying 20 years ago
that the future of open source is the Operating System.&#x3C;/p&#x3E;

&#x3C;p&#x3E;I suspect in 20 years time that there will be (or recently have been) a
shift from large in-house IT teams, to outsourced teams of consulting
companies and independent contractors. Teams of people already surround
open source projects. Some of these people are in-house developers at
large corporations like Asay&#x27;s article talks about (the Moose community
for example has people from Walmart, the BBC, and Omni Hotels). Some of
these developers work at smaller consultancies (again Moose has people
from &#x3C;a href=&#x22;http://iinteractive.com&#x22;&#x3E;Infinity Interactive&#x3C;/a&#x3E;, &#x3C;a href=&#x22;http://bestpractical.com&#x22;&#x3E;Best Practical&#x3C;/a&#x3E;, and my own
&#x3C;a href=&#x22;http://tamarou.com&#x22;&#x3E;Tamarou&#x3C;/a&#x3E;&#x3C;a href=&#x22;#fn:1&#x22; id=&#x22;fnref:1&#x22; class=&#x22;footnote&#x22;&#x3E;1&#x3C;/a&#x3E;). Some of these people are even independent contractors.&#x3C;/p&#x3E;

&#x3C;p&#x3E;It seems like a very short step for these organizations do the heavy
lifting for an enterprise level IT Project. The Corporate Sponsor could
then choose to either hire a skeleton maintenance staff, or keep one or
more of the project&#x27;s organizations on retainer.&#x3C;/p&#x3E;

&#x3C;p&#x3E;In his book &#x3C;em&#x3E;The Four Hour Work Week&#x3C;/em&#x3E;, Tim Ferris coined a term
&#x27;geo-arbitrage&#x27;. Arbitrage is the practice of taking advantage of a
difference in prices between two or more markets. Geo-arbitrage is
taking advantage of physically distinct markets (say India vs Europe).
Geo and temporal arbitrage are what cause the radical lowering of cost
for open source&#x3C;a href=&#x22;#fn:2&#x22; id=&#x22;fnref:2&#x22; class=&#x22;footnote&#x22;&#x3E;2&#x3C;/a&#x3E;. Developers who are emotionally committed to a project somehow find non-monetary ways to value their time.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Currently large corporations leverage geo arbitrage with a few very
large strokes. They&#x27;ll off-shore their internal developments staff
(setting up a development office in Mumbai or Beijing for example), or
they&#x27;ll hire an external company to perform a large project. I don&#x27;t
think this will change, but I think that this will become much more
sophisticated as time goes on. Large consultancies will themselves
outsource development rather than hire more developers and maintain a
large staff, or perhaps smaller consultancies will band together to
tackle projects normally handled by the larger consultancies.&#x3C;/p&#x3E;

&#x3C;p&#x3E;The benefits for companies like Domino&#x27;s are enormous. For starters
smaller focused software shops are already experts in their specific
tool chain and domain. Teaching a programmer who has already built six
order fulfillment applications enough about the Pizza industry to drive
an application story is easier than doing the reverse with an executive
in the Pizza industry, or even a talented programmer who has no relevant
experience.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Second finding and retaining good developers is &#x3C;em&#x3E;hard&#x3C;/em&#x3E;. Finding
committed developers with a passion for an Open Source stack is even
harder. Scott Adams (yes Dilbert&#x27;s creator) recently 
&#x3C;a href=&#x22;http://www.dilbert.com/blog/entry/the_bad_management_stimulus/&#x22;&#x3E;noticed a trend&#x3C;/a&#x3E;.&#x3C;/p&#x3E;

&#x3C;blockquote&#x3E;
  &#x3C;p&#x3E;Imagine a world where managers always recognized and rewarded their
  most capable people. It would be hard for a rational employee to
  leave a great job for a ten percent chance of creating something
  even greater. But leaving a boss who is Satan&#x27;s learning-challenged
  little brother is relatively easy. And if the general economy isn&#x27;t
  serving up wonderful job opportunities at other companies (thanks in
  part to bad management) then you can see why people gravitate toward
  starting their own companies.&#x3C;/p&#x3E;
&#x3C;/blockquote&#x3E;

&#x3C;p&#x3E;The best developers are already thinking of striking out on their own.
These are already the people who are clued in. Why not let them step out
on their own, and hire them back with a few of their talented friends in
the community as a consultant? That IT manager may have been incompetent
as an IT manager, but he or she might make an excellent liaison to the
new consultants. Sometimes it is easier to work &#x3C;em&#x3E;with&#x3C;/em&#x3E; someone than
&#x3C;em&#x3E;for&#x3C;/em&#x3E; someone.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Also, some corporations are limited by law or economic reasons to their
local market they are and they may have to make decisions based not on
what is &#x3C;strong&#x3E;best&#x3C;/strong&#x3E; but rather on what is &#x3C;strong&#x3E;available&#x3C;/strong&#x3E;. A consultancy or
contractor may have a lot more flexibility in the options they can bring
to the table. Perhaps they have experience handing telecommuter teams,
while your company doesn&#x27;t. They might be able to hire a developer from
Israel, who lives part times in France, and can finish that project in a
week and a half.&#x3C;/p&#x3E;

&#x3C;p&#x3E;I&#x27;m not trying to gloss over the downsides of out sourcing. It is by no
means always a rosy magical world of happiness. I am simply trying to
illimunate the current efforts at outsourcing as the clumsy beginnings
of what will become a much more sophisticated market.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Some may claim that this will inevitably lead to the same situation we
have today where the consultancies of tomorrow have a single product
that they schlep from project to project. They may be correct, time will
have to tell. I suspect that the truth in 20 years will be even stranger than we know.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Update: Apparently the Perl Ironman blogging contest wants me to mention CPAN as well for it to show up. &#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2009-11-27T15:36:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;

&#x3C;div class=&#x22;footnotes&#x22;&#x3E;
&#x3C;hr /&#x3E;
&#x3C;ol&#x3E;

&#x3C;li id=&#x22;fn:1&#x22;&#x3E;&#x3C;p&#x3E;Actually there are far more consulting companies than these three active in teh community, and I&#x27;ve been told it was remiss to not point out &#x3C;a href=&#x22;http://shadowcat.co.uk&#x22;&#x3E;ShadowCat&#x3C;/a&#x3E; as well as &#x3C;a href=&#x22;http://cloudtone.ca&#x22;&#x3E;CloudTone&#x3C;/a&#x3E;&#x3C;a href=&#x22;#fnref:1&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;li id=&#x22;fn:2&#x22;&#x3E;&#x3C;p&#x3E;Temporal-arbitrage being the concept that even in the same place, all other things being equal, prices change depending on the time. &#x3C;a href=&#x22;#fnref:2&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;/ol&#x3E;
&#x3C;/div&#x3E;
</description>
<dc:date>2009-11-27T15:36:00Z</dc:date>
</item>
<item rdf:about="http://chris.prather.org/perl-oasis-2010-hotel-rates-end.md.html">
<title>Perl Oasis 2010: Discount Hotel Rates End</title>
<link>http://chris.prather.org/perl-oasis-2010-hotel-rates-end.md.html</link>
<description>&#x3C;h1 id=&#x22;perloasis2010:discounthotelratesend&#x22;&#x3E;Perl Oasis 2010: Discount Hotel Rates End&#x3C;/h1&#x3E;

&#x3C;p&#x3E;November 25th is the last day for the Perl Oasis special Group Rate. The
rate is $75 USD / night for what according to other sources is a
$135-$150 / night hotel room.&#x3C;/p&#x3E;

&#x3C;p&#x3E;&#x3C;a href=&#x22;http://perloasis.org/opw2010/&#x22;&#x3E;Perl Oasis&#x3C;/a&#x3E; is a one day workshop in Orlando Florida focusing on
Modern Enlightened Perl. This year we have speakers from three
continents, and the entire Perl spectrum speaking. The Call for Speakers
is still open so you can &#x3C;a href=&#x22;http://perloasis.org/opw2010/newtalk&#x22;&#x3E;submit your talk&#x3C;/a&#x3E; as well!&#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2009-11-24T20:45:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;
</description>
<dc:date>2009-11-24T20:45:00Z</dc:date>
</item>
<item rdf:about="http://chris.prather.org/what-stops-me-from-using-perl-6-today.md.html">
<title>What Stops Me From Using Perl6 Today</title>
<link>http://chris.prather.org/what-stops-me-from-using-perl-6-today.md.html</link>
<description>&#x3C;h1 id=&#x22;whatstopsmefromusingperl6today&#x22;&#x3E;What Stops Me From Using Perl6 Today&#x3C;/h1&#x3E;

&#x3C;p&#x3E;I have to confess &#x3C;code&#x3E;mst&#x3C;/code&#x3E; asked me to step forward and make a comment about the &#x3C;a href=&#x22;http://www.shadowcat.co.uk/blog/matt-s-trout/f_ck-perl-6/&#x22;&#x3E;Perl5&#x3C;/a&#x3E; &#x26;amp; &#x3C;a href=&#x22;http://use.perl.org/~masak/journal/39912&#x22;&#x3E;Perl6&#x3C;/a&#x3E;. I suspect because I&#x27;m a prime example of a person who&#x27;s deeply involved in what &#x3C;code&#x3E;masak&#x3C;/code&#x3E; calls the Perl5 story. This is because I&#x27;ve been bound up tightly with the Moose community for a while, and I&#x27;ve recently founded a &#x3C;a href=&#x22;http://tamarou.com&#x22;&#x3E;company&#x3C;/a&#x3E; that is doing Modern Enlightened Perl development. My bread is buttered by Perl5.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Recently because of &#x3C;code&#x3E;mst&#x3C;/code&#x3E; and &#x3C;code&#x3E;masak&#x3C;/code&#x3E; sparking a conversation I have started taking a really close look at Perl6. One of the things that struck me was how polished and complete the core Perl6 language was, and the Rakudo implementation.&#x3C;/p&#x3E;

&#x3C;p&#x3E;This post started out as a much more whiney response to &#x3C;code&#x3E;bakkushan&#x3C;/code&#x3E;&#x27;s &#x3C;a href=&#x22;http://howcaniexplainthis.blogspot.com/2009/11/what-stops-me-from-using-perl-6-today.html&#x22;&#x3E;post&#x3C;/a&#x3E; of the same name. For that version of this post I set out to compare Perl6, specifically Rakudo, to my own cherished Moose. The Example object I came up with is a stripped down version of &#x3C;a href=&#x22;http://github.com/perigrin/blawd/blob/master/lib/Blawd/Entry/MultiMarkdown.pm&#x22;&#x3E;&#x3C;code&#x3E;Blawd::Entry::MultiMarkdown&#x3C;/code&#x3E;&#x3C;/a&#x3E;. &#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;use 5.10.0;
use MooseX::Declare;

class Blawd::Entry {
    use MooseX::Types::DateTimeX qw(DateTime);
    has [qw(title author content filename)] =&#x26;gt; (
        isa      =&#x26;gt; &#x27;Str&#x27;,
        is       =&#x26;gt; &#x27;ro&#x27;,
        required =&#x26;gt; 1,
    );
    has date =&#x26;gt; (
        isa      =&#x26;gt; DateTime,
        is       =&#x26;gt; &#x27;ro&#x27;,
        coerce   =&#x26;gt; 1,
        required =&#x26;gt; 1,
    );
    has headers =&#x26;gt; ( isa =&#x26;gt; &#x27;Str&#x27;, is =&#x26;gt; &#x27;ro&#x27;, default =&#x26;gt; &#x27;&#x27; );
    has commit =&#x26;gt; ( is =&#x26;gt; &#x27;ro&#x27;, required =&#x26;gt; 1 );
}
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;The Perl6 version is pretty straight forward.&#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;use v6;

class Blawd::Entry {
    use Temporal;

    has Str $.title     = die &#x22;Str title Required&#x22;;
    has Str $.author    = die &#x22;Str author Required&#x22;;
    has Str $.content   = die &#x22;Str content Required&#x22;;
    has Str $.filename  = die &#x22;Str filename Required&#x22;;
    has DateTime $.date = die &#x22;DateTime date required&#x22;;
    has Object $.commit = die &#x22;Object commit required&#x22;;
    has Str $.headers   = &#x27;&#x27;;
}
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;The Perl6 version is shorter, and arguably more elegant. &#x3C;code&#x3E;TimToady&#x3C;/code&#x3E; helped me figure out the Perl6 equivalent to Moose&#x27;s &#x3C;code&#x3E;required =&#x26;gt; 1&#x3C;/code&#x3E;. You just set a default that will throw an exception when evaluated.&#x3C;/p&#x3E;

&#x3C;p&#x3E;But I&#x27;ve lost the type coercion on DateTime. In the Moose version it is provided in the MooseX::Types::DateTimeX library and enabled by the &#x3C;code&#x3E;isa =&#x26;gt; DateTime, coerce =&#x26;gt; 1&#x3C;/code&#x3E; parameters passed into the &#x3C;code&#x3E;date&#x3C;/code&#x3E; attribute constructor. I know this can be done in Perl6 and after several furtive attempts to find it in the documentation as well as a question that &#x3C;code&#x3E;TimToady&#x3C;/code&#x3E; answered on &#x3C;code&#x3E;#perl6&#x3C;/code&#x3E; I finally found a solution.&#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;class Int is also { method Time { Time.gmtime(self) } };
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;Trying to shoe horn that in after a second beer at 1:30am simply wasn&#x27;t producing the desired results&#x3C;a href=&#x22;#fn:&#x22; id=&#x22;fnref:&#x22; class=&#x22;footnote&#x22;&#x3E;1&#x3C;/a&#x3E;. Think about that for a second, my complaint was I couldn&#x27;t get the Type Coercions to work as elegantly as I wanted. That&#x27;s a far cry from &#x22;half finished vaporware&#x22;.&#x3C;/p&#x3E;

&#x3C;p&#x3E;So while I have reservations about some of the current design regarding the metaobject protocol (I have offered and am still in dialog with the Perl6 people about helping them steal from Moose), Perl6 is a much more complete picture than the general grousing in the Perl5 community would give you.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Does that mean I&#x27;ve jumped ship and will start hacking in Perl6? Probably not. While Perl6 may have more polish than I expected, and is a project that is &#x3C;em&#x3E;well&#x3C;/em&#x3E; on it&#x27;s way to being complete, it lacks some fundamental things I love about Perl5. The biggest of which is CPAN.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Going back to my Blawd app as an example. Blawd is only 814 lines of code because I leverage CPAN. If you look at the dependencies from the &#x3C;code&#x3E;Makefile.PL&#x3C;/code&#x3E; you&#x27;ll see a tight list.&#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;requires &#x27;aliased&#x27;;
requires &#x27;Bread::Board&#x27;;
requires &#x27;DateTime&#x27;;
requires &#x27;DBI&#x27;;
requires &#x27;Git::PurePerl&#x27;;
requires &#x27;HTTP::Engine&#x27;;
requires &#x27;Moose&#x27; =&#x26;gt; &#x27;0.92&#x27;;
requires &#x27;MooseX::Aliases&#x27;;
requires &#x27;MooseX::Types::DateTime&#x27;;
requires &#x27;MooseX::Types::DateTimeX&#x27;;
requires &#x27;MooseX::Types::Path::Class&#x27;;
requires &#x27;namespace::autoclean&#x27;;
requires &#x27;Path::Class&#x27;;
requires &#x27;Text::MultiMarkdown&#x27; =&#x26;gt; &#x27;1.0.30&#x27;;
requires &#x27;Try::Tiny&#x27;;
requires &#x27;XML::RSS&#x27;;
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;Some of these are hard requirements, &#x3C;code&#x3E;Git::PurePerl&#x3C;/code&#x3E; for example. Some of these are soft requirements, &#x3C;code&#x3E;DBI&#x3C;/code&#x3E; for example I only use in the MoveableType exporter, and &#x3C;code&#x3E;HTTP::Engine&#x3C;/code&#x3E; is only there for the experimental &#x3C;code&#x3E;server&#x3C;/code&#x3E; back-end.&#x3C;/p&#x3E;

&#x3C;p&#x3E;The point however is that I have 15 dependencies for code I didn&#x27;t have to write. If I wanted to start hacking up a Blawd in Perl6 I&#x27;d have to port &#x3C;code&#x3E;Git::PurePerl&#x3C;/code&#x3E;, which itself turn requires 11 modules.&#x3C;/p&#x3E;

&#x3C;pre&#x3E;&#x3C;code&#x3E;&#x27;Archive::Extract&#x27;           =&#x26;gt; &#x27;0&#x27;,
&#x27;Compress::Raw::Zlib&#x27;        =&#x26;gt; &#x27;0&#x27;,
&#x27;Compress::Zlib&#x27;             =&#x26;gt; &#x27;0&#x27;,
&#x27;Data::Stream::Bulk&#x27;         =&#x26;gt; &#x27;0&#x27;,
&#x27;DateTime&#x27;                   =&#x26;gt; &#x27;0&#x27;,
&#x27;Digest::SHA1&#x27;               =&#x26;gt; &#x27;0&#x27;,
&#x27;File::Find::Rule&#x27;           =&#x26;gt; &#x27;0&#x27;,
&#x27;IO::Digest&#x27;,                =&#x26;gt; &#x27;0&#x27;,
&#x27;Moose&#x27;                      =&#x26;gt; &#x27;0&#x27;,
&#x27;MooseX::StrictConstructor&#x27;  =&#x26;gt; &#x27;0&#x27;,
&#x27;MooseX::Types::Path::Class&#x27; =&#x26;gt; &#x27;0&#x27;,
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;

&#x3C;p&#x3E;Now Perl6 doesn&#x27;t require some of these. Moose will hopefully not be required in Perl6 in the not too distant future. But what about &#x3C;code&#x3E;Digest::SHA1&#x3C;/code&#x3E;? A quick google didn&#x27;t find anything suitable as a replacement, so I&#x27;d have to re-write that as well. What it boils down to is there are far more Yaks than I want to shave in the Perl6 ecosystem. Just to replace my little 814 line hack, I&#x27;d have to write a Git implementation, a MultiMarkdown renderer, and an RSS feed generator.&#x3C;/p&#x3E;

&#x3C;p&#x3E;I&#x27;ve added &#x3C;code&#x3E;#perl6&#x3C;/code&#x3E; to my IRC client. I&#x27;m keeping a closer eye on it, but for now I say long live Perl5, further up and further in.&#x3C;/p&#x3E;

&#x3C;p&#x3E;By: Chris Prather on 2009-11-16T14:12:00&#x3C;/p&#x3E;

&#x3C;p&#x3E;Tags: &#x3C;/p&#x3E;

&#x3C;div class=&#x22;footnotes&#x22;&#x3E;
&#x3C;hr /&#x3E;
&#x3C;ol&#x3E;

&#x3C;li id=&#x22;fn:&#x22;&#x3E;&#x3C;p&#x3E;I was testing the results of this article with the following simple test.&#x3C;/p&#x3E;

&#x3C;p&#x3E;bin/perl6 -e&#x27;
    class Int is also { method Time { Time.gmtime(self) } }; &#x3C;br /&#x3E;
    class A { use Temporal; has Time $.foo = die &#x22;Not Declared&#x22; }; 
    say A.new(foo =&#x3E; 1)
&#x27; 
Assignment type check failed; expected Time, but got Int&#x3C;a href=&#x22;#fnref:&#x22; class=&#x22;reversefootnote&#x22;&#x3E;&#x26;#160;&#x26;#8617;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;/li&#x3E;

&#x3C;/ol&#x3E;
&#x3C;/div&#x3E;
</description>
<dc:date>2009-11-16T14:12:00Z</dc:date>
</item>
</rdf:RDF>