<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Perlblogs &#187; Parrot</title>
	<atom:link href="http://perlblogs.com/category/parrot/feed/" rel="self" type="application/rss+xml" />
	<link>http://perlblogs.com</link>
	<description>Posts from selected Perl bloggers</description>
	<lastBuildDate>Mon, 06 Feb 2012 20:47:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Perlbuzz news roundup for 2012-01-16</title>
		<link>http://feedproxy.google.com/~r/PerlBuzz/~3/44X-OKItQhw/perlbuzz-news-roundup-for-2012-01-16.html</link>
		<comments>http://feedproxy.google.com/~r/PerlBuzz/~3/44X-OKItQhw/perlbuzz-news-roundup-for-2012-01-16.html#comments</comments>
		<pubDate>Mon, 16 Jan 2012 22:38:23 +0000</pubDate>
		<dc:creator>Andy Lester</dc:creator>
				<category><![CDATA[Parrot]]></category>
		<category><![CDATA[Perl 5]]></category>

		<guid isPermaLink="false">http://perlblogs.com/?guid=62caf74061b821912b09b8b71680ca01</guid>
		<description><![CDATA[These links are collected from the Perlbuzz Twitter feed. If you have suggestions for news bits, please mail me at andy@perlbuzz.com. Modern Perl 2011-2012 edition released (modernperlbooks.com) Developing parsers incrementally w/Marpa (blogs.perl.org) Parrot tickets migrated to @GitHub. (perlbuzz.com) Thank...]]></description>
			<content:encoded><![CDATA[
        <p>
These links are collected from the
<a href="http://twitter.com/perlbuzz">Perlbuzz Twitter feed</a>.
If you have suggestions for news bits, please mail me at
<a href="mailto:andy@perlbuzz.com">andy@perlbuzz.com</a>.
</p>

<ul>

<li>Modern Perl 2011-2012 edition released (<a href="http://www.modernperlbooks.com/mt/2012/01/modernperl-2011-2012-edition-released.html">modernperlbooks.com</a>)</li>
<li>Developing parsers incrementally w/Marpa (<a href="http://blogs.perl.org/users/jeffrey_kegler/2012/01/developing-parsers-incrementally-with-marpa.html">blogs.perl.org</a>)</li>
<li>Parrot tickets migrated to <a href="http://twitter.com/GitHub">@GitHub</a>. (<a href="http://perlbuzz.com/2012/01/parrot-tickets-now-converted-to-github.html">perlbuzz.com</a>)</li>
<li>Thank you, CPAN Testers (<a href="http://blogs.perl.org/users/alberto_simoes/2012/01/thank-you-cpan-testers.html">blogs.perl.org</a>)</li>
<li>The case of the overloaded curlies (<a href="http://blogs.perl.org/users/tom_wyant/2012/01/the-case-of-the-overloaded-curlys.html">blogs.perl.org</a>)</li>
<li>Perl more viable for webdev than ever (<a href="http://blogs.perl.org/users/joel_berger/2012/01/perl-is-more-viable-for-web-development-than-ever.html">blogs.perl.org</a>)</li>
</ul>

        

    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=44X-OKItQhw:G9_FQeecvVk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=44X-OKItQhw:G9_FQeecvVk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=44X-OKItQhw:G9_FQeecvVk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=44X-OKItQhw:G9_FQeecvVk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=44X-OKItQhw:G9_FQeecvVk:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=44X-OKItQhw:G9_FQeecvVk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PerlBuzz/~4/44X-OKItQhw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2012/01/17/perlbuzz-news-roundup-for-2012-01-16/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parrot tickets now converted to GitHub</title>
		<link>http://feedproxy.google.com/~r/PerlBuzz/~3/ciNG57gHluQ/parrot-tickets-now-converted-to-github.html</link>
		<comments>http://feedproxy.google.com/~r/PerlBuzz/~3/ciNG57gHluQ/parrot-tickets-now-converted-to-github.html#comments</comments>
		<pubDate>Mon, 16 Jan 2012 20:03:45 +0000</pubDate>
		<dc:creator>Andy Lester</dc:creator>
				<category><![CDATA[github]]></category>
		<category><![CDATA[Parrot]]></category>

		<guid isPermaLink="false">http://perlblogs.com/?guid=955a26386197284b30ebe0caca2f3e1a</guid>
		<description><![CDATA[The Parrot project is now using GitHub's issue tracking system. Parrot has used GitHub's source code control for months now, but we had hundreds of tickets in the Trac system.  Now, over the past few weeks, I've been working...]]></description>
			<content:encoded><![CDATA[
        <p>
The <a href="http://parrot.org/">Parrot project</a> is now using
<a href="https://github.com/parrot/parrot/issues">GitHub's issue tracking system</a>.
Parrot has used GitHub's source code control for months now, but
we had hundreds of tickets in the
<a href="http://trac.parrot.org/parrot">Trac system</a>.  Now,
over the past few weeks, I've been working with
<a href="https://github.com/technoweenie">Rick from GitHub</a>
to migrate the tickets out of Trac into GitHub's issue system.
</p>

<p>
Like most data conversion projects, the challenges were less about
the coding and more about making the decisions about how to massage
the data between two similar systems.  For example, Trac has fields
for Severity and Priority of tickets, but GitHub only has free-form
tagging, so I had to create GitHub tags that correspond to Severity
and Priority in Trac.  GitHub's tracking system doesn't handle file
attachments, so my conversion code had to make inline comments of
the file attachments.
</p>

<p>
Most time-consuming of all was the conversion of users from Trac
to GitHub.  We needed the issue history to have accurate user IDs
on them, so I needed
<a href="https://github.com/petdance/scraps/blob/master/trac-gh/GH.pm">a big lookup table to do the job</a>.
While users like "coke" and "chromatic" have the same user IDs on
both the Trac instance and GitHub, Trac user "jonathan" is "jnthn"
on GitHub, and so on.  Anyone I couldn't find a match for became
generic user "Parrot".
</p>

<p>
The
<a href="https://github.com/petdance/scraps/blob/master/trac-gh/tix">actual code to do all this</a>
is only about 200 lines of Perl code, which should be no surprise
for someone who has the CPAN at his disposal.  I used
<a href="http://search.cpan.org/dist/Net-Trac/">Net::Trac</a> to
read from the Trac instance, and the
<a href="http://search.cpan.org/dist/JSON/">JSON</a> module to write
out JSON files in the <a href="http://developer.github.com/v3/issues/">GitHub API format</a>.
The bulk of the code is
project-specific conversions to make little data tweaks like change
severity to tags, and to make the output code a little more friendly
in Markdown.
</p>

<p>
I have to specifically thank Rick at GitHub for helping us through
this project.  I used a lot of his time with questions about how
GitHub would handle my import format, and we had two test imports
for us to see real results, so that I could adjust my conversion
process. The final results are beautiful, and the Parrot team is
excited to see this move made.
</p>

<p>
I've long been a fan of <a href="https://github.com/about">GitHub</a>
and how they help out the community,
and this just adds to it.  This sort of aid to open source projects
should stand as an example to other companies that work with open
source.  Many companies give back to the communities of the projects
on which their businesses are based.  It's fantastic to have a
company willing to use human capital actually working with a project
in which they have no direct involvement.  In helping us, GitHub
gains nothing but the grateful thanks of the Parrot project.
</p>

        
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=ciNG57gHluQ:y_OkWOUA828:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=ciNG57gHluQ:y_OkWOUA828:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=ciNG57gHluQ:y_OkWOUA828:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=ciNG57gHluQ:y_OkWOUA828:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=ciNG57gHluQ:y_OkWOUA828:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=ciNG57gHluQ:y_OkWOUA828:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PerlBuzz/~4/ciNG57gHluQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2012/01/16/parrot-tickets-now-converted-to-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t TSA That Data!</title>
		<link>http://www.modernperlbooks.com/mt/2011/12/dont-tsa-that-data.html</link>
		<comments>http://www.modernperlbooks.com/mt/2011/12/dont-tsa-that-data.html#comments</comments>
		<pubDate>Thu, 22 Dec 2011 23:04:42 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Parrot]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[softwaredesign]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://perlblogs.com/?guid=b3b3110d724b2ebc33fa38957fa38c0d</guid>
		<description><![CDATA[A Vanity Fair article asks Does Airport Security Really Make Us Safer?. Fortunately, the writer of the article used Bruce Schneier as a source. (If you've been to an airport in the US, you know that the answer is &#34;No;...]]></description>
			<content:encoded><![CDATA[
        <p>A Vanity Fair article asks <a
href="http://www.vanityfair.com/culture/features/2011/12/tsa-insanity-201112">Does
Airport Security Really Make Us Safer?</a>. Fortunately, the writer of the
article used <a href="http://www.schneier.com/">Bruce Schneier</a> as a source.
(If you've been to an airport in the US, you know that the answer is "No; why
would you even <em>ask</em>?")</p>

<p>The article's penultimate paragraph makes what should be an obvious point. (At least, it's obvious if you want to prevent terrorism as much as possible. If your goal is to spend lots of taxpayer money in a very flashy, showy way without worrying about efficacy, please continue.) In particular:</p>

<blockquote>What the government should be doing is focusing on the terrorists
when they are planning their plots. "That's how the British caught the liquid
bombers," Schneier says. "They never got anywhere near the plane. That's what
you want--not catching them at the last minute as they try to board the
flight."</blockquote>

<p>I read this article moments after sending an email commiserating about the
silly (lack of) Unicode handling in a programming language which isn't Perl.
Then something clicked.</p>

<p>One of my persistent desires for <a href="http://parrotcode.org/">Parrot</a>
was to simplify the internals by <em>reducing</em> the amount of complexity and
genericity in the core. In terms of Unicode, this means knowing the encoding of
incoming data and the desired encoding of outgoing data, then
<em>transcoding</em> to and from a single internal encoding. This way the core
could operate on a single encoding and push the complexity of transcoding to
the edges.</p>

<p>If Parrot hasn't changed this since I looked at it most recently, its string
system requires each string to carry information about its encoding (which
makes each string structure that much larger, increasing memory pressure) and
each string operation to check for the need to transcode strings to mutually
compatible encodings (which takes time for the comparison in every case, as
well as time and memory for the transcoding in other cases).</p>

<p>Worse yet, string literals encoded in the source code of Parrot itself tend
to have a specific encoding (ASCII or at least Latin-1 in the case of literals
in the C code) and they ought to be constant, so transcoding in place isn't an
option and, if you're working primarily with another encoding, that means
<em>always</em> performing transcoding from that incompatible encoding.</p>

<p>It's not <em>free</em> to perform encoding at the edges, and you sometimes
notice this when working with large chunks of data (though if you're processing
multi-terabyte satellite images, treat them as binary and skip this encoding
altogether), but it's the right thing to do.</p>

<p>The same principle applies for <em>trusting</em> incoming data. Secure it at
the borders of the application. Don't spread those checks throughout the
system. Harden the edges and don't let nonsense through. Fail early for
suspicious things.</p>

<p>Otherwise you'll go mad trying to track down all of the possible
interactions and possibilities of maliciousnesses that people could perpetuate
if you lack a sane sanity policy. In other words, stop doing a lot of busy work
to make it look like you know what you're doing. Do it right.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2011/12/23/dont-tsa-that-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maintenance Costs of a Shared Resource</title>
		<link>http://www.modernperlbooks.com/mt/2011/11/maintenance-costs-of-a-shared-resource.html</link>
		<comments>http://www.modernperlbooks.com/mt/2011/11/maintenance-costs-of-a-shared-resource.html#comments</comments>
		<pubDate>Fri, 25 Nov 2011 19:46:44 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[maintenance]]></category>
		<category><![CDATA[modernperl]]></category>
		<category><![CDATA[p5p]]></category>
		<category><![CDATA[Parrot]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl5]]></category>

		<guid isPermaLink="false">http://perlblogs.com/?guid=65989861e79848ea822f080fa3e0bffd</guid>
		<description><![CDATA[Suppose the only thing Perl 5 ever really needed were a method keyword. If it were implemented correctly&#38;mdash;with the associated tests and documentation and a discussion period to see how it fits in with existing code&#38;mdash;the cost of adding this...]]></description>
			<content:encoded><![CDATA[
        <p>Suppose the only thing Perl 5 ever really needed were <a
href="http://www.modernperlbooks.com/mt/2011/01/adding-a-method-keyword-to-perl-5.html">a
<code>method</code> keyword</a>. If it were implemented correctly&mdash;with
the associated tests and documentation and a discussion period to see how it
fits in with existing code&mdash;the cost of adding this feature would be
relatively small: it's not much code, it's a simple feature, and it has very
few possibilities to interfere with existing code.</p>

<p>That's not the only thing Perl 5 needs, for some definition of
<em>need</em>.<p>

<p>(I believe <a
href="http://www.modernperlbooks.com/mt/2009/07/expressing-visions-for-perl-5.html">Perl
5 lacks a unified and coherent development vision</a>, which makes this entire
discussion both more interesting and less useful. Yet even an idealist has to
deal with the world as it is sometimes.)</p>

<p>If you accept that Perl 5 needs (or "could use" or "would benefit from" or
"really ought to have") a few more features, you have to answer at least two
procedural questions in addition to the technical questions of "What is it?",
"How should it work?", "How do we build it?", and "How do we know it works
correctly?":</p>

<ul>

<li>Who will build it?</li>

<li>Who will maintain it?</li>

</ul>

<p>By way of analogy, consider the case of an appealing albatross in Parrot,
specifically the compiler named IMCC. In Parrot's earliest days, the VM only
ran bytecode. An assembler written in Perl 5 turned Parrot's assembly source
code PASM into bytecode for Parrot to run.</p>

<p>Melvin Smith wrote an experimental intermediate compiler which added some
syntactic sugar to PASM and produced Parrot bytecode either as output or
directly in memory for Parrot to run. Parrot <em>needed</em> something like
this.<p>

<p>It wasn't long before Melvin's IMCC found itself grafted onto the side of
Parrot and used as the primary invocation and compilation mechanism. I hope I'm
not mischaracterizing Melvin's opinion as including dismay that his code was a
proof of concept which made assumptions and took shortcuts and wasn't exactly
what he would have submitted for a shipping product. (I don't blame him one bit
for writing prototype code&mdash;that's exactly what I would have done.)</p>

<p>Melvin stopped contributing to Parrot shortly after that point, but IMCC
lives on to this day. (Again, this was prototype code which needed at least
another round or two of severe refactoring before it was suitable for the sort
of duties Parrot expected. As an example, I found a register use analysis
algorithm which looked to have O(n<super>12</super>) complexity. That exponent
of 12 is not a typo. Let me type it again: twelve. One dozen. Ten plus two. I
managed to get it down to four in most cases.)</p>

<p>The problem is simple: someone (not Melvin!) dumped a big wad of code into
the wrong directory in version control and now everyone has to maintain that
code.</p>

<p>Perhaps marking this code as experimental would have helped, but other
people (including me) added features and built onto it. (Dan's apologia for
leaving Parrot mentions that his strategy of checking in messy code and hoping
that would lure new people to help clean it up didn't work out as well in
practice as he had hoped.)</p>

<p>In terms of Perl 5, it's important (as many people point out) to consider
the question "Who will maintain this code?" That task shouldn't have to fall to
the pumpking or a Nick Clark or Dave Mitchell by default, but it does.</p>

<p>The deeper question that Perl 5 needs to answer is "How can p5p make the
whole of Perl 5 easier to maintain?"&mdash;not just to make it easier to add
and support new features but to reduce the maintenance burden of existing
features and to attract new contributors to help maintain code.</p>

<p>You can see this for yourself; open up almost any core module and see if you
want to do the work to find and fix a bug. If that's not <a
href="http://www.modernperlbooks.com/mt/2011/11/on-technical-friction.html">technical
friction</a>, I don't know what is.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2011/11/25/maintenance-costs-of-a-shared-resource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perlbuzz news roundup for 2011-10-17</title>
		<link>http://feedproxy.google.com/~r/PerlBuzz/~3/Y1aThj6mmz8/perlbuzz-news-roundup-for-2011-10-17.html</link>
		<comments>http://feedproxy.google.com/~r/PerlBuzz/~3/Y1aThj6mmz8/perlbuzz-news-roundup-for-2011-10-17.html#comments</comments>
		<pubDate>Mon, 17 Oct 2011 19:58:25 +0000</pubDate>
		<dc:creator>Andy Lester</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[Parrot]]></category>
		<category><![CDATA[Perl 5]]></category>
		<category><![CDATA[Perl 6]]></category>

		<guid isPermaLink="false">http://perlblogs.com/?guid=a2b7c2416b0d6cfda48aabea88aa7d1d</guid>
		<description><![CDATA[These links are collected from the Perlbuzz Twitter feed. If you have suggestions for news bits, please mail me at andy@perlbuzz.com. RT @briandfoy_perl Huh, the new look for (lists.perl.org) is really slick. Leo Lapworth really deserves his White Camel...]]></description>
			<content:encoded><![CDATA[
        <p>
These links are collected from the
<a href="http://twitter.com/perlbuzz">Perlbuzz Twitter feed</a>.
If you have suggestions for news bits, please mail me at
<a href="mailto:andy@perlbuzz.com">andy@perlbuzz.com</a>.
</p>

<ul>

<li>RT <a href="http://twitter.com/briandfoy_perl">@briandfoy_perl</a> Huh, the new look for (<a href="http://lists.perl.org/">lists.perl.org</a>) is really slick. Leo Lapworth really deserves his White Camel Award.</li>
<li>RT <a href="http://twitter.com/parrotvm">@parrotvm</a> We are converting our Trac wiki to <a href="http://twitter.com/Github">@Github</a>! (<a href="https://github.com/parrot/parrot/wiki">github.com</a>) If you want to help, let us know!</li>
<li>Perl, C and Dr. Dennis Ritchie (<a href="http://blogs.perl.org/users/kirk_kimmel/2011/10/perl-c-and-dr-dennis-ritchie.html">blogs.perl.org</a>)</li>
<li>Trial releases with Dist::Zilla (<a href="http://blogs.perl.org/users/oliver_gorwits/2011/10/releasing-trialdevbeta-versions-with-distzilla.html">blogs.perl.org</a>)</li>
<li>Handy guide to core module activity (<a href="http://blogs.perl.org/users/kirk_kimmel/2011/10/core-module-addremove-quick-reference.html">blogs.perl.org</a>)</li>
<li>Photos from YAPC::Asia in Tokyo (<a href="http://blogs.perl.org/users/lestrrat/2011/10/yapcasia-tokyo-2011-photos.html">blogs.perl.org</a>)</li>
<li>Announcing namespace::sweep (<a href="http://blogs.perl.org/users/mike_friedman/2011/10/announcing-namespacesweep.html">blogs.perl.org</a>)</li>
<li>Why do you want new major Perl features? (<a href="http://blogs.perl.org/users/leon_timmermans/2011/10/why-do-you-want-new-major-features-in-core.html">blogs.perl.org</a>)</li>
</ul>

        
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=Y1aThj6mmz8:jPOaKLhQR6Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=Y1aThj6mmz8:jPOaKLhQR6Y:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=Y1aThj6mmz8:jPOaKLhQR6Y:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=Y1aThj6mmz8:jPOaKLhQR6Y:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=Y1aThj6mmz8:jPOaKLhQR6Y:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=Y1aThj6mmz8:jPOaKLhQR6Y:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PerlBuzz/~4/Y1aThj6mmz8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2011/10/17/perlbuzz-news-roundup-for-2011-10-17/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taming the The Great Stampede</title>
		<link>http://www.modernperlbooks.com/mt/2011/09/taming-the-the-great-stampede.html</link>
		<comments>http://www.modernperlbooks.com/mt/2011/09/taming-the-the-great-stampede.html#comments</comments>
		<pubDate>Fri, 09 Sep 2011 16:46:37 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[Parrot]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[projectmanagement]]></category>
		<category><![CDATA[softwaredevelopment]]></category>

		<guid isPermaLink="false">http://perlblogs.com/?guid=7fb42481b93b9d8af7881fb77d098e67</guid>
		<description><![CDATA[Scott James Remnant described problems with a mixed milestone-and-date release process as it applies to Ubuntu GNU/Linux. The specific problem is that each milestone represents a date by which you absolutely must finish your work lest you have to wait...]]></description>
			<content:encoded><![CDATA[
        <p>Scott James Remnant described <a
    href="http://netsplit.com/2011/09/08/new-ubuntu-release-process/">problems
    with a mixed milestone-and-date release process</a> as it applies to Ubuntu
GNU/Linux.</p>

<p>The specific problem is that each milestone represents a date by which you
absolutely must finish your work lest you have to wait for the next milestone.
In one sense, that's a feature of regular release cycles: if a feature isn't
ready for the current release, it can wait until the next release. In practice,
uncautious project management can turn this virtue into a vice in two ways:</p>

<ul>

    <li>If you get rewarded or punished based on meeting or missing calendar dates&mdash;not the appropriate level of release quality&mdash;you will prioritize calendar time over quality.</li>

    <li>If the periodicity between releases is too great, you'll prioritize getting a project in the current release over waiting until the next release.</li>

</ul>

<p>Choosing the right periodicity is more art than science. (Project management
is art, not science.) Yet you can know the period length is inappropriate when
the end of a period approaches and you suffer the great stampede of features
suddenly becoming good enough to land the week or weekend or day before your
cutoff date for features landing for the next Great Big Release.</p>

<p>You can see the evolution of this understanding in Parrot over the past
couple of years, and it's likely to culminate in a rethinking of Parrot's
deprecation and support policy. Whereas Parrot promised to adhere to a six
month cycle of publishing a deprecation or incompatible change notice before
making the change or removal, that promise was simply untenable as waiting six
months to make necessary changes left no one happy, least of all the end user
implementors for whom the policy should have been most useful. That big
stampede happened in Parrot as every six month cycle closed.</p>

<p>When we switched to a three month period, the big stampede still
happened.</p>

<p>When I'm fortunate enough to work within a dedicated team of full-time
developers using an agile approach, an iteration period of a week or two often
seems to work the best. Anything longer than that still has stampedes, but
delaying a branch merge by a week or so to get another day or two of polish
isn't a big deal. Delaying a branch merge by a month or so&mdash;especially for
branches in Parrot which should be trending smaller, simpler, and more
encapsulated&mdash;pushes the edge of what's acceptable.</p>

<p>Granted, releasing stable and useful software still requires a lot of
discipline from project management and developers. Slashdot comment screeching
to the contrary, shorter release cycles don't have to mean that Unity-style big
bang UI changes will land every month. (I suspect that Unity could have used
another few months of development and testing and integration, if not another
six month cycle). It's also often a simple matter of programming to release a
feature present but disabled by default so as to get more testing on deployment
and integration without forcing users to siwtch yet.</p>

<p>Yet the most important matter of discipline is <a
    href="http://jamesshore.com/Agile-Book/informative_workspace.html">unambiguous
    and ubiquitous project status information</a> such as the reports from
automated test suites, memory leak checkers, branch status reports, bug
reports, and anything else that can measure the quality of the iteration's
eventual release.</p>

<p>Certainly this requires a substantial investment on the part of projects to
build and maintain this infrastructure, but it's the only reliable and
repeatable way I know to produce great software. (If you've noticed that the much-vaunted Perl 5 monthly bleadperl releases are rather boring, that's the point! Most of the excitement takes place at project boundaries such as the interactions with CPAN modules.)</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2011/09/09/taming-the-the-great-stampede/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No Policy Can Save Wrong Code</title>
		<link>http://www.modernperlbooks.com/mt/2011/08/no-policy-can-save-wrong-code.html</link>
		<comments>http://www.modernperlbooks.com/mt/2011/08/no-policy-can-save-wrong-code.html#comments</comments>
		<pubDate>Tue, 23 Aug 2011 17:33:06 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Parrot]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl6]]></category>
		<category><![CDATA[projectmanagement]]></category>
		<category><![CDATA[softwaredevelopment]]></category>

		<guid isPermaLink="false">http://perlblogs.com/?guid=116492455b0cd8c30db3d2964dec669a</guid>
		<description><![CDATA[I've written before that software projects need sane, published deprecation policies, and I still believe that... ... but listen to a tale of two intertwined projects with a seemingly-sane and published deprecation policy that sounds great but doesn't actually work....]]></description>
			<content:encoded><![CDATA[
        <p>I've written before that <a href="http://www.modernperlbooks.com/mt/2009/02/toward-a-sane-deprecation-policy.html">software projects need sane, published deprecation policies</a>, and I still believe that...</p>

<p>... but listen to a tale of two intertwined projects with a seemingly-sane and published deprecation policy that sounds great but doesn't actually work.</p>

<p><a href="http://parrot.org/">Parrot</a> and <a href="http://rakudo.org/">Rakudo</a> used to be much closer together. The Parrot repository had a subdirectory <em>languages/</em> which held several language implementations running on Parrot. This was well and good (<a href="http://www.tvfanatic.com/quotes/dont-you-know-the-story-of-hercules-and-the-lion-is-it-a-bib/">How did a lion get rich? It was the olden days!</a>)&mdash;whenever Parrot underwent an API change, a simple <a href="http://www.betterthangrep.com/">ack</a> of the source tree could find most places that needed to change, and running the test suites of the projects under <em>languages/</em> could find the rest.</p>

<p>(Getting people to run the full test suite is a different story, but in that case at least guilt and a good bisection tool work post hoc magic.)</p>

<p>Then one day, Parrot left the Perl-centric world of perl.org and kicked
<em>languages/</em> out of the nest. <em>languages/perl6</em> went to
Rakudo.org and  the troubles began.</p>

<p>You see, back in the olden days when a lion could get rich and the Perl 6 VM
was like the Perl 5 VM but a little bit better, the way to extend Parrot was,
<em>obviously</em>, write a whole wad of C code. Want to add a new data type?
Write a wad of C code. Want to change how a core wad of C code works? Write a
whole wad of C code. If hacking on Perl 5 had taught anyone anything (and I
can't believe I can write this with a straight face), it's that finding hackers
ready, willing, and able to write big wads of C code to work around or
customize or extend other big wads of C code so that someone else doesn't have
to write C code is a really easy prospect.</p>

<p>Anyhow, the Parrot execution and extension and embedding model has always
assumed, as does Perl 5, that the VM should expose a big wad of C functions
that extenders and embedders should use to manipulate big wads of C structs and
other data types defined in C.</p>

<p>On one hand, customization and flexibility is good. On the other hand,
people like me who know both C and Perl write in Perl when we can and C only
when we have to for several very, very good reasons.</p>

<p>Imagine a ventriloquist with a Parrot puppet, except he doesn't stick his
hand in the puppet to pull levers and flip switches and wiggle his fingers. He
has a robot hand, operated by a joystick, and that robot hand is half robot and
half organic and it tickles actual organs inside the puppet and the bird goes
off and does its thing. Oh, and he's operating that joystick with his toes.
Plus he's underwater, wearing a blindfold.</p>

<p>In other words, Rakudo has an intimate knowledge of the guts of Parrot and
does some strange and bizarre things. (If you look through the revision history
of those parts of Rakudo, you'll see I've fixed some of those strange and
bizarre things and I've perpetuated others.)</p>

<p>When Rakudo and other languages left the nest, a deprecation policy came about. Imagine this vaudeville act:</p>

<p><strong>HLL Developer:</strong> "Hey, you changed this API!"</p>

<p><strong>Parrot Developer:</strong> "You weren't supposed to use it."</p>

<p><strong>HLL Developer:</strong> "No one told me that, but regardless, you broke my project."</p>

<p><strong>Parrot Developer:</strong> "Oh, sorry. Well here's how to fix it."</p>

<p><strong>HLL Developer:</strong> "Wish you'd told me that months ago."</p>

<p><strong>Parrot Developer:</strong> "Yeah, we'll do better next time. By the
way, what in the world were you doing with that?"</p>

<p><strong>HLL Developer:</strong> "No one told me to do it differently, so I
just threw together something that works."</p>

<p>You can see where this is going.</p>

<p>Thus began the great Parrot version numbering wars. The end result was that
Parrot would have two supported releases every year, one coming every six
months. The initial deprecation policy promised no backwards incompatible
changes without notification in at least one supported release.</p>

<p>In other words, if a project which was previously in <em>languages/</em> had
moved somewhere else where a well-meaning Parrot developer didn't notice that a
simple change broke backwards compatibility, that project had the ability to
request a reversion of the change, a documentation of the change as a
compatibility change, and a delay of up to six months before making the
change...</p>

<p>... depending on when the project noticed.</p>

<p>I've mentioned the idea of <a
href="http://www.modernperlbooks.com/mt/2010/04/removing-friction.html">technical
friction</a> before, but get out your calendar.</p>

<p>This policy didn't only protect languages from unintended changes, it
protected languages from desired changes. For example, if Rakudo wanted a new
feature in Parrot, and if the best way to add that feature in Parrot meant
breaking backwards compatibility (changing the order of search paths, for
example), both Rakudo and Parrot developers had to mark their calendars.</p>

<p>The deprecation policy period is now three months, for hopefully obvious reasons.</p>

<p>Even so, now there are at least two projects on separate time tables with
separate goals for features and improvements and deprecations. When Rakudo
wants a feature from Parrot that Parrot doesn't yet support (or Rakudo
developers believe it doesn't support fully or at all or in the precise way
Rakudo wants), Rakudo tends to toe the joystick. When Parrot makes a change
that exposes the fragility of tickling bird gullets with robot fingers, Rakudo
gets to complain. The deprecation policy followed to the letter prevents Parrot
from adding the features Rakudo demands at the same time that it prevents
Parrot from improving the features that Rakudo uses.</p>

<p>You might read this and think that the problem is the deprecation policy.
It's not&mdash;at least, that's not the root cause.</p>

<p>I hate the polite fiction calorie-free slogan that "Perl 6 is a research
project", because it's a polite way to suggest that Perl 6 is an embarrassing
pipe dream no true Perl hacker takes seriously, but implementing Perl 6 has
required a lot of research and fits and false starts. (Before you complain next
that it's taking a while, <em>you</em> write a performant grammar engine which
allows lexical overriding of any grammatical rule or category.) When Parrot
began, no one knew exactly how a Perl 6 VM machine should implement several
important features. That was also true in 2005. That was also true of <a
href="http://www.parrot.org/news/2009/Parrot-1.0.0">Parrot's 1.0 release</a> in
March 2009.</p>

<p>Making an effective Perl 6 means continually thinking and rethinking and simplifying and inventing new things.</p>

<p>Now tie an anchor around the feet of a live bird and pretend you're a
ventriloquist.</p>

<p>Granted, Parrot's also long had the goal of running other dynamic languages
efficiently and effectively. Its endgame is more than merely Perl 6 (and Perl
5). Yet a Parrot that won't run Perl 6 well has failed at its primary goal, and
subsequent goals are less interesting.</p>

<p>The right solution is to invent a time machine and not kick Rakudo out of
the nest. (The rightest solution is to invent a time machine and start
implementing Perl 6 on Parrot from the first day as a first-class citizen and
not a rat's nest of Perl 5 parsing madness which had, to my count, at least two
replacements <em>before</em> Rakudo.)</p>

<p>The current Rakudo solution is to add another layer, another project
external to both Parrot and Rakudo, which will sit in between the two and
abstract away the Parrot specific parts in the hope that someday someone will
add another VM backend so that Rakudo doesn't have to be tied to Parrot
forever.</p>

<p>If the notion of working around a broken deprecation policy&mdash;broken
because of <em>too little coupling</em> between two projects so intimately
intertwined&mdash;is to add another layer of coupling to separate those two
projects seems a little strange to you, you're not alone. By my count, that's
three projects in a driver's seat built for one. If you can figure out which
project is upstream and which project is downstream and how to debug with
reasonable each which change where broke which test and who gets to fix it,
you're a far, far better developer than I am.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2011/08/23/no-policy-can-save-wrong-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>M0 Test Tasks: Stealing from Perl 6</title>
		<link>http://www.modernperlbooks.com/mt/2011/07/m0-test-tasks-stealing-from-perl-6.html</link>
		<comments>http://www.modernperlbooks.com/mt/2011/07/m0-test-tasks-stealing-from-perl-6.html#comments</comments>
		<pubDate>Mon, 18 Jul 2011 20:02:03 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Parrot]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl6]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.modernperlbooks.com/mt/2011/07/m0-test-tasks-stealing-from-perl-6.html</guid>
		<description><![CDATA[Less Magic, Less C, A Faster Parrot promised a few small tasks for the interested to help the Parrot optimization project reach its goals. M0 is one of those goals. This small set of opcodes represents the minimum necessary platform-specific...]]></description>
			<content:encoded><![CDATA[
        <p><a
href="http://www.modernperlbooks.com/mt/2011/07/less-magic-less-c-a-faster-parrot.html">Less
Magic, Less C, A Faster Parrot</a> promised a few small tasks for the
interested to help the Parrot optimization project reach its goals.</p>

<p>M0 is one of those goals. This small set of opcodes represents the minimum
necessary platform-specific code required to implement the rest of Parrot. M0
is a specification. Like Perl 6 is a specification, there can be multiple
implementations. The demo implementation is a Perl 5 program, and my C
implementation is the second implementation (and hopefully a likely candidate
to become part of Parrot itself).</p>

<p>Like Perl 6, M0 is a specification and a test suite.</p>

<p>Unlike Perl 6, the M0 test suite is tied to the original implementation.
That is to say, when you run the M0 tests, you exercise the Perl 5 demo M0
implementation.</p>

<p>A small task for the interested is to decouple the M0 test suite from the
Perl 5 M0 implementation and make those tests available for multiple
implementations. This probably means representing those tests in a form with
expected inputs and outputs, perhaps running M0 source code through an
assembler to create M0 bytecode, and running the tests against an arbitrary
implementation.</p>

<p>Perl 6's test suite has an interesting capability whereby the list of tests
contains metadata on which known implementation should skip or try to run but
not expect to pass arbitrary test files. The #perl6 channel on irc.freenode.net
can give you more details about this fudging process.</p>

<p>This project does easily parallelize across multiple interested people.
Coordinating in #parrot on irc.perl.org will help.</p>

<p>As a bonus test, the C implementation should allow optional testing with <a
href="http://valgrind.org/">Valgrind</a>, if installed. All tests should run
without memory leaks or invalid memory accesses. (I tested the C implementation
by hand, but automating this is essential for further development.) This task
is slightly more complex, but should be within reach for any Perl 5 programmer
of modest experience.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2011/07/18/m0-test-tasks-stealing-from-perl-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>M0 Test Tasks: Stealing from Perl 6</title>
		<link>http://www.modernperlbooks.com/mt/2011/07/m0-test-tasks-stealing-from-perl-6.html</link>
		<comments>http://www.modernperlbooks.com/mt/2011/07/m0-test-tasks-stealing-from-perl-6.html#comments</comments>
		<pubDate>Mon, 18 Jul 2011 20:02:03 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Parrot]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl6]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.modernperlbooks.com/mt/2011/07/m0-test-tasks-stealing-from-perl-6.html</guid>
		<description><![CDATA[Less Magic, Less C, A Faster Parrot promised a few small tasks for the interested to help the Parrot optimization project reach its goals. M0 is one of those goals. This small set of opcodes represents the minimum necessary platform-specific...]]></description>
			<content:encoded><![CDATA[
        <p><a
href="http://www.modernperlbooks.com/mt/2011/07/less-magic-less-c-a-faster-parrot.html">Less
Magic, Less C, A Faster Parrot</a> promised a few small tasks for the
interested to help the Parrot optimization project reach its goals.</p>

<p>M0 is one of those goals. This small set of opcodes represents the minimum
necessary platform-specific code required to implement the rest of Parrot. M0
is a specification. Like Perl 6 is a specification, there can be multiple
implementations. The demo implementation is a Perl 5 program, and my C
implementation is the second implementation (and hopefully a likely candidate
to become part of Parrot itself).</p>

<p>Like Perl 6, M0 is a specification and a test suite.</p>

<p>Unlike Perl 6, the M0 test suite is tied to the original implementation.
That is to say, when you run the M0 tests, you exercise the Perl 5 demo M0
implementation.</p>

<p>A small task for the interested is to decouple the M0 test suite from the
Perl 5 M0 implementation and make those tests available for multiple
implementations. This probably means representing those tests in a form with
expected inputs and outputs, perhaps running M0 source code through an
assembler to create M0 bytecode, and running the tests against an arbitrary
implementation.</p>

<p>Perl 6's test suite has an interesting capability whereby the list of tests
contains metadata on which known implementation should skip or try to run but
not expect to pass arbitrary test files. The #perl6 channel on irc.freenode.net
can give you more details about this fudging process.</p>

<p>This project does easily parallelize across multiple interested people.
Coordinating in #parrot on irc.perl.org will help.</p>

<p>As a bonus test, the C implementation should allow optional testing with <a
href="http://valgrind.org/">Valgrind</a>, if installed. All tests should run
without memory leaks or invalid memory accesses. (I tested the C implementation
by hand, but automating this is essential for further development.) This task
is slightly more complex, but should be within reach for any Perl 5 programmer
of modest experience.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2011/07/18/m0-test-tasks-stealing-from-perl-6-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>M0 Test Tasks: Stealing from Perl 6</title>
		<link>http://www.modernperlbooks.com/mt/2011/07/m0-test-tasks-stealing-from-perl-6.html</link>
		<comments>http://www.modernperlbooks.com/mt/2011/07/m0-test-tasks-stealing-from-perl-6.html#comments</comments>
		<pubDate>Mon, 18 Jul 2011 20:02:03 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Parrot]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl6]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.modernperlbooks.com/mt/2011/07/m0-test-tasks-stealing-from-perl-6.html</guid>
		<description><![CDATA[Less Magic, Less C, A Faster Parrot promised a few small tasks for the interested to help the Parrot optimization project reach its goals. M0 is one of those goals. This small set of opcodes represents the minimum necessary platform-specific...]]></description>
			<content:encoded><![CDATA[
        <p><a
href="http://www.modernperlbooks.com/mt/2011/07/less-magic-less-c-a-faster-parrot.html">Less
Magic, Less C, A Faster Parrot</a> promised a few small tasks for the
interested to help the Parrot optimization project reach its goals.</p>

<p>M0 is one of those goals. This small set of opcodes represents the minimum
necessary platform-specific code required to implement the rest of Parrot. M0
is a specification. Like Perl 6 is a specification, there can be multiple
implementations. The demo implementation is a Perl 5 program, and my C
implementation is the second implementation (and hopefully a likely candidate
to become part of Parrot itself).</p>

<p>Like Perl 6, M0 is a specification and a test suite.</p>

<p>Unlike Perl 6, the M0 test suite is tied to the original implementation.
That is to say, when you run the M0 tests, you exercise the Perl 5 demo M0
implementation.</p>

<p>A small task for the interested is to decouple the M0 test suite from the
Perl 5 M0 implementation and make those tests available for multiple
implementations. This probably means representing those tests in a form with
expected inputs and outputs, perhaps running M0 source code through an
assembler to create M0 bytecode, and running the tests against an arbitrary
implementation.</p>

<p>Perl 6's test suite has an interesting capability whereby the list of tests
contains metadata on which known implementation should skip or try to run but
not expect to pass arbitrary test files. The #perl6 channel on irc.freenode.net
can give you more details about this fudging process.</p>

<p>This project does easily parallelize across multiple interested people.
Coordinating in #parrot on irc.perl.org will help.</p>

<p>As a bonus test, the C implementation should allow optional testing with <a
href="http://valgrind.org/">Valgrind</a>, if installed. All tests should run
without memory leaks or invalid memory accesses. (I tested the C implementation
by hand, but automating this is essential for further development.) This task
is slightly more complex, but should be within reach for any Perl 5 programmer
of modest experience.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2011/07/18/m0-test-tasks-stealing-from-perl-6-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

