<?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</title>
	<atom:link href="http://perlblogs.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://perlblogs.com</link>
	<description>Posts from selected Perl bloggers</description>
	<lastBuildDate>Thu, 29 Jul 2010 21:15:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>How About a Shetland Ponie?</title>
		<link>http://www.modernperlbooks.com/mt/2010/07/how-about-a-shetland-ponie.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/07/how-about-a-shetland-ponie.html#comments</comments>
		<pubDate>Thu, 29 Jul 2010 20:47:15 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Parrot]]></category>
		<category><![CDATA[Rakudo]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl5]]></category>
		<category><![CDATA[perl6]]></category>
		<category><![CDATA[perlprogramming]]></category>
		<category><![CDATA[ponie]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Rakudo Star is out, and so begins the next great wave of interest and use of Perl 6. The next several releases will improve performance, fix bugs, add features, port or create more libraries, and&#38;mdash;in all likelihood&#38;mdash;improve and otherwise clarify...]]></description>
			<content:encoded><![CDATA[
        <p><a href="http://rakudo.org/node/75">Rakudo Star is out</a>, and so begins
the next great wave of interest and use of Perl 6.  The next several releases
will improve performance, fix bugs, add features, port or create more
libraries, and&mdash;in all likelihood&mdash;improve and otherwise clarify the
Perl 6 specification.</p>

<p>The Perl ecosystem has room for other projects, however.</p>

<p>For example, one of the clearest benefits Perl 6 has over Perl 5 is its portability to other virtual machines and runtimes.  By design Perl 6 <em>encourages</em> multiple implementations.  Perl 5 is its own specification; in many places, what Perl 5 is is solely what Perl 5 happens to do.  Sometimes that behavior gets enshrined in the specification tests, but other times it's folklore and institutional community knowledge.</p>

<p>Just as <a href="http://trac.parrot.org/parrot/wiki/Lorito">Parrot's Lorito project</a> intends to make Parrot at least an order of magnitude faster, so too a reorganization of Perl 5 internals could make amazing things more possible.</p>

<p>What if there were a project to <a
href="http://www.nntp.perl.org/group/perl.perl5.porters/2010/07/msg162367.html">implement
a minimal set of Perl 5 on the Parrot virtual machine</a> as a prototype and
exploration of how much of Perl 5 you can support, the effort it takes to do
so, and what kind of utility you can expect?  Parrot's compiler tools let the
Rakudo developers write most of Perl 6 in Perl 6; surely it's possible to write
Perl 5 in a similar fashion.  (Credit to other projects such as <a
href="http://rubini.us/">Rubinius</a> and <a
href="http://codespeak.net/pypy/">PyPy</a> for demonstrating that such things
are possible.)</p>

<p>I know other projects have attempted this in the past.  Perhaps the best place to steal information is Bradley Kuhn's masters thesis, <a href="http://www.ebb.org/bkuhn/articles/thesis/">Considerations on Porting Perl
to the Java Virtual Machine</a>.</p>

<p>As Jesse wrote in his comments, bug-for-bug compatibility isn't necessary.
Nor is full compliance with the existing Perl 5 test suite.  A simple proof of
concept to produce the 80% of Perl 5 most people use in most programs should
suffice.  (Parrot gives you a lot of that anyway.)</p>

<p>As a bonus, you get cheap and easy interoperability with Perl 5, access to
Parrot features such as multidispatch, grammars, continuations, and bytecode
serialization, and you could even replace some of the uses of Perl 5 within
Parrot's and perhaps even Rakudo's configuration and build processes.</p>

<p>It doesn't even have to be a pony of full size.</p>
        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2010/07/29/how-about-a-shetland-ponie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perlbuzz news roundup for 2010-07-27</title>
		<link>http://feedproxy.google.com/~r/PerlBuzz/~3/zc4XRklI82s/perlbuzz-news-roundup-for-2010-07-27.html</link>
		<comments>http://feedproxy.google.com/~r/PerlBuzz/~3/zc4XRklI82s/perlbuzz-news-roundup-for-2010-07-27.html#comments</comments>
		<pubDate>Tue, 27 Jul 2010 14:49:10 +0000</pubDate>
		<dc:creator>Andy Lester</dc:creator>
				<category><![CDATA[Interviews]]></category>
		<category><![CDATA[Perl 5]]></category>
		<category><![CDATA[Perl 6]]></category>
		<category><![CDATA[Perl Foundation]]></category>
		<category><![CDATA[Rakudo]]></category>
		<category><![CDATA[cpan]]></category>

		<guid isPermaLink="false"></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. NYTProf 4.04 now warns if it sees $`, $\&#38; or $\', which are regex performance killers (blog.timbunce.org) Facebook::Graph...]]></description>
			<content:encoded><![CDATA[
        <p><br /><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></p>

<ul>

<li>NYTProf 4.04 now warns if it sees $`, $\& or $\', which are regex performance killers (<a href="http://blog.timbunce.org/2010/07/09/nytprof-4-04-came-saw-ampersand-and-conquered/">blog.timbunce.org</a>)</li>
<li>Facebook::Graph automates Facebook interactions (<a href="http://blogs.perl.org/users/jt_smith/2010/07/introducing-facebookgraph.html">blogs.perl.org</a>)</li>
<li>Iterating your way to happiness with Perl 6 (<a href="http://use.perl.org/~masak/journal/40442">use.perl.org</a>)</li>
<li>Perlcast returns with an interview with Stevan Little about Moose (<a href="http://perlcast.com/2010/07/12/stevan-little-on-moose/">perlcast.com</a>)</li>
<li>CPAN on your iPhone (<a href="http://blogs.perl.org/users/olaf_alders/2010/07/icpan-cpan-on-your-iphone.html">blogs.perl.org</a>)</li>
<li>YAPC::NA 2011 will be in Asheville, NC (<a href="http://news.perlfoundation.org/2010/07/yapcna-2011---asheville-north.html">news.perlfoundation.org</a>)</li>
<li>Ten years of Perl 6 and all the goodness it's brought (<a href="http://use.perl.org/~masak/journal/40451">use.perl.org</a>)</li>
<li>Fixing my #1 bash annoyance (<a href="http://perlbuzz.com/mechanix/2010/07/fixing-my-1-bash-annoyance.html">perlbuzz.com</a>)</li>
<li>Wedge more text in your tweets with Unicode abuse (<a href="http://blogs.perl.org/users/holy_zarquons_singing_fish/2010/07/unicode-abuse.html">blogs.perl.org</a>)</li>
<li>Ingy's take on Rakduo Perl 6: It's really ready (<a href="http://blogs.perl.org/users/ingy_dot_net/2010/07/rakudos-really-really-release-ready.html">blogs.perl.org</a>)</li>
<li>Convert Perl POD to ePub format for your iPhone (<a href="http://blogs.perl.org/users/john_mcnamara/2010/07/pod-to-epub-to-ibooks.html">blogs.perl.org</a>)</li>
<li>I would love to see something like this for the Perl standard modules (<a href="http://ruby-doc.org/stdlib/">ruby-doc.org</a>)</li>
<li>Six cool Perl 6 built-ins (<a href="http://use.perl.org/~masak/journal/40459">use.perl.org</a>)</li>
<li>Outsider recap of Larry's 2010 State of the Onion (<a href="http://www.pcworld.com/businesscenter/article/201743/">pcworld.com</a>)</li>
<li>Template Toolkit + vim users, the tt2.vim and tt2html.vim files are now part of vim-perl (<a href="http://github.com/petdance/vim-perl">github.com</a>)</li>
<li>All about Perl 5.12's deprecation warnings (<a href="http://www.effectiveperlprogramming.com/blog/463">effectiveperlprogramming.com</a>)</li>
<li>Github is now at one million projects (<a href="http://techcrunch.com/2010/07/24/github-one-million/">techcrunch.com</a>)</li>
<li>Common Perl 6 idioms (<a href="http://perlgeek.de/blog-en/perl-5-to-6/27-common-idioms.html">perlgeek.de</a>)</li>
<li>The Moose Blog (<a href="http://blog.moose.perl.org/">blog.moose.perl.org</a>)</li>
<li>Modern Perl vs. Desperate Perl (<a href="http://www.bofh.org.uk/2010/07/25/a-tale-of-two-languages">bofh.org.uk</a>)</li>
<li>Per-computer colored prompts in bash (<a href="http://geofft.mit.edu/blog/sipb/125">geofft.mit.edu</a>)</li>
<li>Someone perceives Perl as old, dying. You can either A) Argue, or B) Do awesomeness with Perl to prove him wrong. I suggest B.</li>
<li>Why roles in Perl are awesome (<a href="http://perlbuzz.com/2010/07/why-roles-in-perl-are-awesome.html">perlbuzz.com</a>)</li>
</ul>

        

    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=zc4XRklI82s:50FLdUDYzH4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=zc4XRklI82s:50FLdUDYzH4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=zc4XRklI82s:50FLdUDYzH4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=zc4XRklI82s:50FLdUDYzH4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=zc4XRklI82s:50FLdUDYzH4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=zc4XRklI82s:50FLdUDYzH4: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/zc4XRklI82s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2010/07/27/perlbuzz-news-roundup-for-2010-07-27/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why roles in Perl are awesome</title>
		<link>http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html</link>
		<comments>http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#comments</comments>
		<pubDate>Tue, 27 Jul 2010 14:21:20 +0000</pubDate>
		<dc:creator>Andy Lester</dc:creator>
				<category><![CDATA[Perl 5]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[by Chris Prather A question came up recently on a mailing list. I was talking about how Roles are a awesome win for Perl5 considering how few languages implement the concept1. Someone asked what the win was with Roles....]]></description>
			<content:encoded><![CDATA[
        <p>
<i>by Chris Prather</i>
</p>

<p>A question came up recently on a mailing list. I was talking about how Roles are a awesome win for Perl5 considering how few languages implement the concept<a href="http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#fn:1" id="fnref:1" class="footnote">1</a>. Someone asked what the win was with Roles. I happen to have been thinking about this recently and dashed off a reply.</p>

<p>When you use Inheritance, especially multiple inheritance, for behavioral re-use you run into several problems quickly.</p>

<p>First Inheritance is an explicit modeling of a relationship that carries semantic meaning. Let's say you're developing a game for Biology students to explain to them taxonomy. In this game a Dog class is a subclass of Animal. That is, the Dog class inherits specific behaviors and attributes from the Animal class. This probably isn't even a direct relationship your Dog class may inherit from a Mammal class which inherits from a Vertebrate class which inherits from Animalia which itself inherits from Life. These kinds of hierarchies are common in Taxonomy as well as in Object Oriented programming. However when you need to express something that may cross cut concerns in, you run into issues.</p>

<p>Say for example your marketing department has had trouble selling this product to schools and is attempting to market to parents directly. They have done studies and kids really like Pets<a href="http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#fn:2" id="fnref:2" class="footnote">2</a>. So your boss comes to you because the company wants you to add the concept of Pet to your Taxonomy model.</p>

<p>Pets don't fit into a Taxonomy, it's obvious that not all Animalias are Pets<a href="http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#fn:3" id="fnref:3" class="footnote">3</a> and some Pets may not be animals at all<a href="http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#fn:4" id="fnref:4" class="footnote">4</a>. In many languages can use Multiple Inheritance to describe this new "I'm an Animalia <em>and</em> a Pet" relationship but often you run into issues there as well. Is a Pet a Life? That would mean our object model would look like:</p>

<pre><code>Life
    Animalia
        Vertebrae
            Canine    Pet
                Dog
</code></pre>

<p>Pet stands out like a sore thumb. Obviously we've got issues with this new modeling. We talk to our boss and figure out that the rules for Pet are simple. Pet's are always domesticated versions of the Animalia, but not every class in Animalia is a pet. So for example Dogs are always Pets, Wolves are not. We can solve this with multiple inheritance now, but it's really not a clean way to express the relationship <em>and</em> it requires us to document the special relationship the Pet class would have with the rest off the Inheritance tree. Once you get beyond a few "special cases" like this it becomes hard to see the model for the exceptions.</p>

<p>This is why some languages like to disallow multiple inheritance entirely. In Java for example, Pet could become an Interface.</p>

<pre><code>public interface Pet {
    Date getYearDomesticated;
}
</code></pre>

<p>This however means that every class that we want to be a pet needs to have the exact same piece of boiler plate code added to it.</p>

<pre><code>class Dog implements Pet {
    ...
    private Date yearDomesticated;
    public Date getYearDomesticated () { this.yearDomesticated }
    ...
}
</code></pre>

<p>If we instead have the concept of Roles then we can apply the concept of a Pet once at any level of the hierarchy we need. A example using a modern Perl<a href="http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#fn:5" id="fnref:5" class="footnote">5</a></p>

<pre><code>package Pet {
    use Moose::Role
    has year_domesticated =&gt; (
        is =&gt; 'ro',
        isa =&gt; 'DateTime',
        required =&gt; 1
    );
}

package Dog {
    use Moose;
    extends qw(Canine);
    with qw(Pet);
}

</code></pre>

<p>The Pet Role here implements everything we need for a <em>default</em> implementation, and doesn't require more boiler plate to our Dog class, that the bare minimum needed. It also avoids the ugly inheritance issues we saw with multiple inheritance by moving the behavior composition onto different tool. In my opinion, Roles aren't a win for every use of inheritance, nor for every time you want to re-use behavior, but they are an excellent tool to have in the box and one that the Moose crowd knows to reach for quite often.</p>

<div class="footnotes">
<hr />
<ol>

<li id="fn:1"><p>Off the top of my head I only know about Perl5, Perl6, Scala, Javascript, and Smalltalk. There may be other implementations out there.<a href="http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#fnref:1" class="reversefootnote">&#160;&#8617;</a></p></li>

<li id="fn:2"><p>The Marketing guy's daughter plays on WebKinz nightly.<a href="http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#fnref:2" class="reversefootnote">&#160;&#8617;</a></p></li>

<li id="fn:3"><p>Pet Shark's would be dangerous to say the least, and where would you keep a pet Blue Whale?<a href="http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#fnref:3" class="reversefootnote">&#160;&#8617;</a></p></li>

<li id="fn:4"><p>Who doesn't love their Pet Rock?<a href="http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#fnref:4" class="reversefootnote">&#160;&#8617;</a></p></li>

<li id="fn:5"><p>We're using the the inline package syntax that will be released in 5.14<a href="http://feedproxy.google.com/~r/PerlBuzz/~3/wNfSMV2eBbY/why-roles-in-perl-are-awesome.html#fnref:5" class="reversefootnote">&#160;&#8617;</a></p></li>

</ol>
</div>

<p>
<i><a href="http://chris.prather.org/">Chris Prather</a> is an Owner at <a href="http://tamarou.com/">Tamarou LLC</a>, a member of the <a href="http://moose.perl.org/">Moose</a> cabal, and
responsible for <a href="http://search.cpan.org/dist/Task-Kensho/">Task::Kensho</a>.</i>
</p>
        
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=wNfSMV2eBbY:bhGrd9DAcIg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=wNfSMV2eBbY:bhGrd9DAcIg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=wNfSMV2eBbY:bhGrd9DAcIg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=wNfSMV2eBbY:bhGrd9DAcIg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=wNfSMV2eBbY:bhGrd9DAcIg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=wNfSMV2eBbY:bhGrd9DAcIg: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/wNfSMV2eBbY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2010/07/27/why-roles-in-perl-are-awesome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>perlprogramming.org looking for a nice home</title>
		<link>http://www.dagolden.com/index.php/925/perlprogramming-org-looking-for-a-nice-home/</link>
		<comments>http://www.dagolden.com/index.php/925/perlprogramming-org-looking-for-a-nice-home/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 04:33:33 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[ironman]]></category>
		<category><![CDATA[perl programming]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=925</guid>
		<description><![CDATA[I picked up this domain name a while ago since it was available and people were saying how Perl needs better visibility. (I was probably inspired by Tim's post about TIOBE). Currently, I just redirect to perl.org. The domain is coming up for renewal and I'll gladly sign it over to someone who can make [...]]]></description>
			<content:encoded><![CDATA[<p>I picked up this domain name a while ago since it was available and people were saying how Perl needs better visibility.  (I was probably inspired by Tim's <a href="http://blog.timbunce.org/2009/05/17/tiobe-index-is-being-gamed/">post about TIOBE</a>).  Currently, I just <a href="http://perlprogramming.org/">redirect</a> to perl.org.  The domain is coming up for renewal and I'll gladly sign it over to someone who can make a good case for what they plan to do with it to benefit the perl community.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/925/perlprogramming-org-looking-for-a-nice-home/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Checklist for Writing Maintainable Perl</title>
		<link>http://www.modernperlbooks.com/mt/2010/07/a-checklist-for-writing-maintainable-perl.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/07/a-checklist-for-writing-maintainable-perl.html#comments</comments>
		<pubDate>Mon, 26 Jul 2010 16:53:01 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[advocacy]]></category>
		<category><![CDATA[maintainability]]></category>
		<category><![CDATA[modernperl]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl5]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Suppose you want to write a program in Perl. (Suppose you have written a program in Perl.) If the thesis behind what I call Modern Perl is correct, you can write that program well or you can write that program...]]></description>
			<content:encoded><![CDATA[
        <p>Suppose you want to write a program in Perl.  (Suppose you <em>have written</em> a program in Perl.)  If the thesis behind what I call Modern Perl is correct, you can write that program well or you can write that program poorly.  (For supporting arguments for that thesis, see Piers Cawley's <a href="http://www.bofh.org.uk/2010/07/25/a-tale-of-two-languages">A tale of two languages</a>.)</p>

<p>Likely you've seen examples of Poorly Written Perl on the Internet.  They serve as the YouTube comments to Nabokov of English language.  In other words, the proper response to a reluctant admission that:</p>

<blockquote>Yes, I know that Perl <em>can</em> be written in an object-oriented and readable way.</blockquote>

<p>&mdash; Tim Bray, <a href="http://www.tbray.org/ongoing/When/201x/2010/07/21/DPH">D.P.H.</a></p>

<p>... or that:</p>

<blockquote>There's also been a push in some applications to rewrite Perl utilities in Bash to enhance portability between platforms. While Perl exists on just about every platform out there, there are vagaries that can cause issues with differing Perl versions, which then leads to portability problems.</blockquote>

<p>&mdash; Paul Venezia, <a href="http://www.infoworld.com/t/languages-and-standards/whatever-happened-perl-012">Is it still libelous if you end your titles with question marks?</a>

<p>... the proper response is "Why <em>didn't</em> you write your code with maintainability in mind?"</p>

<p>I know, I know.  That's not helpful.  Here's a quick checklist to help those of you writing Perl (or those of you trying to hire people to write Perl (or those of you trying to hire people to learn to write Perl)) to determine if you're capable of writing Perl well:</p>

<ul>

<li>Do you know how to use <a href="http://perldoc.perl.org/">the Perl documentation</a></li>

<li>Do you use <a href="http://www.cpan.org/">CPAN</a> modules?</li>

<li>Do you use the <a href="http://search.cpan.org/perldoc?Module::Starter">CPAN distribution layout</a> for organizing your code?</li>

<li>Have you enabled <a href="http://search.cpan.org/perldoc?strict">strict</a>users and <a href="http://search.cpan.org/perldoc?warnings">warnings</a>?  Is the resulting code clean of warnings and errors?</li>

<li>Are you using the standard <a href="http://search.cpan.org/perldoc?Test::Tutorial">Perl testing framework</a>?  (Did you write tests at all?)</li>

<li>Do you have an <a href="http://search.cpan.org/perldoc?Module::Build">automated Perl configuration, build, dependency resolution, installation, and distribution mechanism</a>?</li>

<li>Does your code conform to local <a href="http://search.cpan.org/perldoc?Perl::Tidy">Perl layout guidelines</a>?</li>

<li>Does your code conform to <a href="http://search.cpan.org/perldoc?Perl::Critic">Perl community standards for maintainability and correctness</a>?</li>

<li>Are you familiar with the local <a href="http://www.pm.org/">Perl mongers group</a>?</li>

<li>Are you using a recent version of Perl?</li>

<li>Are you familiar with <a href="http://perldoc.perl.org/perlsec.html">writing secure Perl</a>?</li>

<li>Do you use source control?</li>

<li>Do you use functions?</li>

<li>Do you use modules?</li>

<li>Do you use objects?</li>

<li>Do you use <a href="http://moose.perl.org/">Moose</a> or another abstraction mechanism from the CPAN?</li>

<li>Do you <a href="http://perldoc.perl.org/perlpod.html">document your Perl code</a>?</li>

<li>Do you use language constructs you don't understand, copied and pasted from elsewhere, smushed together into a hateful melange of barely-working confusion you occasionally tweak just to see what happens, and one afternoon you get sick of it and call it done?</li>

</ul>

<p>You don't have to answer all of those questions in the correct way to write good and maintainable Perl, but if you answer most of those questions in the wrong way, <em>of course you'll write bad code</em>.</p>

<p>Perl allows people to accomplish their tasks without having to learn much, without having to participate in strange and unfamiliar ceremonies, and without even being much good at programming at all.  That's by design, and that's a good thing for very specific circumstances.  Yet if you approach programming as if it were merely typing and retyping until something barely working fell out of your typewriter, you're going to make lots of messes, and no language can save you from an unprofessional lack of discipline.</p>

<p>Writing good code requires discipline in any language.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2010/07/26/a-checklist-for-writing-maintainable-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My OSCON talks are online</title>
		<link>http://www.dagolden.com/index.php/920/my-oscon-talks-are-online/</link>
		<comments>http://www.dagolden.com/index.php/920/my-oscon-talks-are-online/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 02:17:08 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan-testers]]></category>
		<category><![CDATA[ironman]]></category>
		<category><![CDATA[perl programming]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=920</guid>
		<description><![CDATA[I've posted my OSCON talks (one regular talk and one lightning talk) in my Talks page. But for those wanting direct links, here they are: Free QA! -- a non-technical talk about the history and social architecture choices of the CPAN Testers project Perl 5, Version 13 -- a lightning talk summarizing notable changes in [...]]]></description>
			<content:encoded><![CDATA[<p>I've posted my OSCON talks (one regular talk and one lightning talk) in my <a href="http://www.dagolden.com/index.php/talks/">Talks</a> page.  But for those wanting direct links, here they are:</p>
<ul>
<li><a href='http://www.dagolden.com/wp-content/uploads/2009/04/Free-QA-OSCON-2010.pdf'>Free QA!</a> -- a non-technical talk about the history and social architecture choices of the CPAN Testers project</li>
<li><a href="http://www.dagolden.com/wp-content/uploads/2010/07/Perl-5-Version-13.pdf">Perl 5, Version 13</a> -- a lightning talk summarizing notable changes in the Perl 5.13 development series</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/920/my-oscon-talks-are-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Best Art Continues to Surprise</title>
		<link>http://www.modernperlbooks.com/mt/2010/07/the-best-art-continues-to-surprise.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/07/the-best-art-continues-to-surprise.html#comments</comments>
		<pubDate>Thu, 22 Jul 2010 22:10:03 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[art]]></category>
		<category><![CDATA[languagedesign]]></category>
		<category><![CDATA[modernperl]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl5]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I attended an exhibit about the work of Leonardo da Vinci several months ago. Part of that exhibit was a thorough analysis of his Mona Lisa painting. &#34;It's perhaps the most famous painting in the world,&#34; I thought. &#34;I've seen...]]></description>
			<content:encoded><![CDATA[
        <p>I attended an exhibit about the work of Leonardo da Vinci several months
ago.  Part of that exhibit was a thorough analysis of his Mona Lisa painting.
"It's perhaps the most famous painting in the world," I thought.  "I've seen it
(or at least replicas) thousands of times before."</p>

<p>Then at the suggestion of the exhibit, I looked behind the model and saw more details, such as a low wall, the lack of eyebrows and eyelashes, and other small details that have always been there but somehow failed to catch my attention.</p>

<p>Several years ago, I read an analysis of Roger Zelazny's The Chronicles of Amber series.  The analyst admitted that he re-read the series every few years and learned new things each time.  (Zelazny's Chandleresque tone in the first five books contributes to the depth of the books, but so does the fact that his characters gladly lie to, backstab, betray, confuse, manipulate, and distrust each other and their own selves.)  A reinterpretation of a single line which seemed so innocent during the last reading could cause you to see a character in an entirely different light.</p>

<p>Good art is like that.</p>

<p>Today I understood an underused feature of Perl 5 better.</p>

<p><a href="http://search.cpan.org/~pscust/">Paulo Custodio</a> filed a bug on the Modern Perl draft that the explanation of module unimporting was incomplete.  I had written that:</p>

<pre><code>no Module::Name qw( arguments );</code></pre>

<p>... is equivalent to:</p>

<pre><code>BEGIN { Module::Name-&gt;unimport( qw( arguments ) ) }</code></pre>

<p>In all accuracy (and, upon reflection, obviousness), <code>no Module::Name qw( arguments )</code> is equivalent to:</p>

<pre><code>BEGIN
{
    require 'Module::Name';
    Module::Name-&gt;unimport( qw( arguments ) );
}</code></pre>

<p>Even though I rarely use module unimporting and have never, to my best
recollection, unimported a module I haven't previously <code>use</code>d, its
obvious that unimporting through <code>no</code> should imply
<code>require</code>.  (I have trouble imagining an interface where you'd initially load a pragma with <code>no</code>, unless you use <a href="http://www.modernperlbooks.com/.../a-stupid-experiment-in-reliability-and-maintainability.html">strictperl</a>, but clever people can do clever things.)</p>

<p>You may all now chuckle at how long it took me to realize this (and, yes, I did read the Perl 5 source code to prove to myself that this occurs).</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2010/07/23/the-best-art-continues-to-surprise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eliminating Errors with Little Languages</title>
		<link>http://www.modernperlbooks.com/mt/2010/07/eliminating-errors-with-little-languages.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/07/eliminating-errors-with-little-languages.html#comments</comments>
		<pubDate>Tue, 20 Jul 2010 17:51:01 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[apis]]></category>
		<category><![CDATA[languagedesign]]></category>
		<category><![CDATA[modernperl]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl6]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Jamie McCarthy made an interesting point about type safety in embedded SQL on String-Plus: SQL is a great example for this. Relational databases are more useful with strong typing, so EMPLOYEE_ID is incompatible with PRODUCT_ID even if they are both...]]></description>
			<content:encoded><![CDATA[
        <p><a
href="http://www.modernperlbooks.com/mt/2010/07/string-plus.html#comment-500">Jamie
McCarthy made an interesting point about type safety in embedded SQL</a> on <a
href="http://www.modernperlbooks.com/mt/2010/07/string-plus.html">String-Plus</a>:</p>

<blockquote>SQL is a great example for this. Relational databases are more
useful with strong typing, so EMPLOYEE_ID is incompatible with PRODUCT_ID even
if they are both implemented as INT. It'd be a great idea to see those
constraints implemented at the perl level, presumably by giving perl more
knowledge of the database schema than even the database engine
has.</blockquote>

<p>Imagine that you have, or can write, a little language parser for a SQL-like language.  My simple example was:</p>

<pre><code>SQL {{
    UPDATE users SET address = { Address $address } WHERE user = { User $user }
}}</code></pre>

<p>This can decompose into several operations:</p>

<ul>

<li>Get the value of the <code>$address</code> variable.</li>

<li>Get the primary key of the <code>$user</code> variable.</li>

<li>Prepare a database query with a rewritten query string which uses placeholders for the <code>$address</code> and <code>$user</code> variables to avoid SQL injection and other interpolation errors.</li>

<li>Execute the query.</li>

</ul>

<p>That's a nice interface, but you can do better.  As I suggested, you can add error checking if you know the structure of the database:</p>

<ul>

<li><em>Get the metadata which describes the <code>users</code> table.</em></li>

<li><em>Verify that the required fields (<code>address</code> and <code>user</code> exist).</em></li>

<li>Get the value of the <code>$address</code> variable.</li>

<li>Get the primary key of the <code>$user</code> variable.</li>

<li>Prepare a database query with a rewritten query string which uses placeholders for the <code>$address</code> and <code>$user</code> variables to avoid SQL injection and other interpolation errors.</li>

<li>Execute the query.</li>

</ul>

<p>You can take advantage of type checking too:</p>

<ul>

<li>Get the metadata which describes the <code>users</code> table.</li>

<li>Verify that the required fields (<code>address</code> and <code>user</code> exist).</li>

<li><em>Verify that the type of <code>$address</code> is compatible with the type of the <code>address</code> field.  Repeat for <code>$user</code> and <code>user</code>.</em></li>

<li>Get the value of the <code>$address</code> variable.</li>

<li>Get the primary key of the <code>$user</code> variable.</li>

<li>Prepare a database query with a rewritten query string which uses placeholders for the <code>$address</code> and <code>$user</code> variables to avoid SQL injection and other interpolation errors.</li>

<li>Execute the query.</li>

</ul>

<p>If you know the structure of the database when the program starts, you can start to push some of this type checking to the point of compilation.  (You may not be able to perform <em>all</em> of the type checking at compilation time, but you can do as much as possible as early as possible to prevent as many errors as possible.)</p>

<p>That's simple and easy.  Now imagine something more interesting:</p>

<pre><code>SQL {{
    SELECT name, address FROM users, addresses GIVEN { User $user }
}}</code></pre>

<p>It's obvious from the syntax of the query language that the database needs to perform a join operation, and it's obvious that the primary key of the <code>$user</code> object is the important key of the operation.  If the program knows the relationship of the <code>users</code> and <code>addresses</code> tables, it can join them effectively as well.</p>

<p>Don't get caught up in the syntax or the semantics of the remainder of examples here; they exist to demonstrate possibilities, not the final form of battle-tested code.  Even so, imagine a dynamic query:</p>

<pre><code>SQL {{
    SELECT @fields FROM { Table $table_one }, {Table $table_two } }
}}</code></pre>

<p>Again the structure and intent of the code is obvious.  The operations are now:</p>

<ul>

<li>Find the primary keys for <code>$table_one</code> and <code>$table_two</code>.</li>

<li>Verify that they're joinable.</li>

<li>Verify that all members of <code>@fields</code> are present in either <code>$table_one</code> or <code>$table_two</code>.</li>

<li>Construct the query.</li>

</ul>

<p>If I were to implement this, I'd make a <code>join_tables</code> multimethod.  It takes two arguments (generalizable to more, but follow along with two for now).  Imagine that it looks something like this:</p>

<pre><code>multi join_tables( Table $t1, Table $t2 ) { ... }

multi join_tables( Any, Any ) { fail() }</code></pre>

<p>Given two <code>Table</code> arguments, the first multi candidate matches and gets called.  Given any other combination of arguments, the second candidate matches and produces an error.</p>

<p>Knowing that you have two <code>Table</code> objects isn't enough, however.  The tables might have no relationship to each other.  Imagine if you somehow <em>could</em> verify that the tables have an appropriate relationship.  If I were to implement this, I might check that the keys of the tables matched types, perhaps with a syntax something like:</p>

<pre><code>multi join_tables ( Table $t1, Table $t2 where { $t1.primary_key eqv $t2.foreign_key( $t1 ) } ) { ... }</code></pre>

<p>That is, the keys must be of equivalent types.  If one key is a
<code>user_id</code> and the other is an <code>Integer</code>, the where clause
won't match for this candidate, so a different multi will get called.</p>

<p>Now imagine that for those embedded SQL minilanguage statements where table name is available at compilation time and sufficient type information exists to verify the statements themselves at compilation time:</p>

<pre><code>SQL {{
    SELECT name, address FROM { User users }, { Address addresses }
}}</code></pre>

<p>... then everyone who uses this minilanguage (and has set up the table information appropriately) gets safety and correctness by default.  Some of that can even occur <em>before the program runs</em>.  The rest of it can occur as the program runs.</p>

<p>(A really, really good type checker and optimization system could infer that some errors are impossible even if it can't prove the use of a single type in every case.)</p>

<p>Now imagine that you have a language which allows you to build minilanguages like this, to build APIs which specify correct operations and fall back to good error reporting on incorrect operations, and which do so without interfering with other code and other extensions.</p>

<p>Welcome to Perl 6.</p>
        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2010/07/20/eliminating-errors-with-little-languages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl 5.13.3 is released</title>
		<link>http://www.dagolden.com/index.php/907/perl-5-13-3-is-released/</link>
		<comments>http://www.dagolden.com/index.php/907/perl-5-13-3-is-released/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 12:40:07 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[ironman]]></category>
		<category><![CDATA[perl programming]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=907</guid>
		<description><![CDATA[[Reposted from my announcement to the the perl5-porters mailing list] Look at Crowley, doing 110 mph on the M40 heading towards Oxfordshire. Even the most resolutely casual observer would notice a number of strange things about him. The clenched teeth, for example, or the dull red glow coming from behind his sunglasses. And the car. [...]]]></description>
			<content:encoded><![CDATA[<p>[Reposted from my <a href="http://www.nntp.perl.org/group/perl.perl5.porters/2010/07/msg162230.html">announcement</a> to the the perl5-porters mailing list]</p>
<blockquote><p>
Look at Crowley, doing 110 mph on the M40 heading towards<br />
Oxfordshire.  Even the most resolutely casual observer would<br />
notice a number of strange things about him.  The clenched teeth,<br />
for example, or the dull red glow coming from behind his<br />
sunglasses.  And the car.  The car was a definite hint.</p>
<p>Crowley had started the journey in his Bentley, and he was<br />
dammned if he wasn't going to finish it in the Bentley as well.<br />
Not that even the kind of car buff who owns his own pair of<br />
motoring goggles would have been able to tell it was a vintage<br />
Bentley.  Not any more.  They wouldn't have been able to tell<br />
that it was a Bentley.  They would only offer fifty-fifty that it<br />
had ever even been a car.</p>
<p>There was no paint left on it, for a start.  It might still have<br />
been black, where it wasn't a rusty, smudged reddish-brown, but<br />
this was a dull charcoal black.  It traveled in its own ball of<br />
flame, like a space capsule making a particularly difficult<br />
re-entry.</p>
<p>There was a thin skin of crusted, melted rubber left around the<br />
metal wheel rims, but seeing that the wheel rims were still<br />
somhow riding an inch above the road surface this didn't seem to<br />
make an awful lot of difference to the suspension.</p>
<p>   It should have fallen apart miles back.</p>
<p>           <strong>-- Neil Gaiman and Terry Pratchett, "Good Omens"</strong>
</p></blockquote>
<p>It gives me great pleasure to announce the release of Perl 5.13.3.</p>
<p>This is the fourth DEVELOPMENT release in the 5.13.x series leading to a stable release of Perl 5.14.0. You can find a list of high-profile changes in this release in the file "perl5133delta.pod" inside the distribution.</p>
<p>You can (or will shortly be able to) download the 5.13.3 release from:</p>
<p>  <a href="http://search.cpan.org/~dagolden/perl-5.13.3/">http://search.cpan.org/~dagolden/perl-5.13.3/</a></p>
<p>The release's SHA1 signatures are:</p>
<ul>
<li>SHA1: 58e802bcae597ca08a6933265d03b37420c80076  <a href="http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/perl-5.13.3.tar.bz2">perl-5.13.3.tar.bz2</a></li>
<li>SHA1: 75b1bb2585fcbc75bfa473fcf77318b3872d61a2  <a href="http://search.cpan.org/CPAN/authors/id/D/DA/DAGOLDEN/perl-5.13.3.tar.gz">perl-5.13.3.tar.gz</a></li>
</ul>
<p>This release corresponds to commit 414abf8 in Perl's git repository.  It is tagged as 'v5.13.3'.</p>
<p>We welcome your feedback on this release.</p>
<p>If Perl 5.13.3 works well for you, please use the 'perlthanks' tool included with this distribution to tell the all-volunteer development team how much you appreciate their work.</p>
<p>If you discover issues with Perl 5.13.3, please use the 'perlbug' tool included in this distribution to report them.</p>
<p>If you write software in Perl, it is particularly important that you test your software against development releases. While we strive to maintain source compatibility with prior stable versions of Perl wherever possible, it is always possible that a well-intentioned change can have unexpected consequences. If you spot a change in a development version which breaks your code, it's much more likely that we will be able to fix it before the next stable release. If you only test your code against stable releases of Perl, it may not be possible to undo a backwards-incompatible change which breaks your code.</p>
<p>Perl 5.13.3 represents approximately one month of development since Perl 5.13.2, and contains 12,184 lines of changes across 575 files from 104 authors and committers.</p>
<p>Notable changes in this release:</p>
<ul>
<li>\o{...} has been added as a string escape for octals.</li>
<li>\N{} and charnames::vianame now know about the abbreviated character names listed by Unicode, such as NBSP, SHY, etc.</li>
<li>Most dual-life module have been synchronized with the latest production release on CPAN.</li>
<li>There is a new internal function PL_blockhook_register for XS code to hook into Perl's lexical scope mechanism</li>
</ul>
<p>There is one major known issue:</p>
<ul>
<li>Bug fixes involving CvGV reference counting break Sub::Name (currently version 0.04).  A patch has been sent upstream to the maintainer.</li>
</ul>
<p>Thank you to the following for contributing to this release:</p>
<p>Abhijit Menon-Sen, Abigail, Alex Davies, Alex Vandiver, Alexandr Ciornii, Andreas J. Koenig, Andrew Rodland, Andy Dougherty, Aristotle Pagaltzis, Arkturuz, Ben Morrow, Bo Borgerson, Bo Lindbergh, Brad Gilbert, Bram, Brian Phillips, Chas. Owens, Chip Salzenberg, Chris Williams, Craig A. Berry, Curtis Jewell, Dan Dascalescu, Daniel Frederick Crisman, Dave Rolsky, David Caldwell, David E. Wheeler, David Golden, David Leadbeater, David Mitchell, Dennis Kaarsemaker, Eric Brine, Father Chrysostomos, Florian Ragwitz, Frank Wiegand, Gene Sullivan, George Greer, Gerard Goossen, Gisle Aas, Goro Fuji, Graham Barr, H.Merijn Brand, Harmen, Hugo van der Sanden, James E Keenan, James Mastros, Jan Dubois, Jerry D. Hedden, Jesse Vincent, Jim Cromie, John Peacock, Jos Boumans, Josh ben Jore, Karl Williamson, Kevin Ryde, Leon Brocard, Lubomir Rintel, Maik Hentsche, Marcus Holland-Moritz, Matt Johnson, Matt S Trout, Max Maischein, Michael Breen, Michael G Schwern, Moritz Lenz, Nga Tang Chan, Nicholas Clark, Nick Cleaton, Nick Johnston, Niko Tyni, Offer Kaye, Paul Marquess, Philip Hazel, Philippe Bruhat, Rafael Garcia-Suarez, Rainer Tammer, Reini Urban, Ricardo Signes, Richard Soderberg, Robin Barker, Ruslan Zakirov, Salvador Fandino, Salvador Ortiz Garcia, Shlomi Fish, Sinan Unur, Sisyphus, Slaven Rezic, Steffen Mueller, Stepan Kasal, Steve Hay, Steve Peters, Sullivan Beck, Tim Bunce, Todd Rinaldo, Tom Christiansen, Tom Hukins, Tony Cook, Vincent Pit, Yuval Kogman, Yves Orton, Zefram, brian d foy, chromatic, kmx, Ævar Arnfjörð Bjarmason</p>
<p>Many of the changes included in this version originated in the CPAN modules included in Perl's core. We're grateful to the entire CPAN community for helping Perl to flourish.</p>
<p>Development versions of Perl are released monthly on or about the 20th of the month by a monthly "release manager". You can expect following upcoming releases:</p>
<ul>
<li>August 20       -   Florian Ragwitz</li>
<li>September 20    -   Steve Hay</li>
<li>October 20      -   Tatsuhiko Miyagawa</li>
<li>November 20     -   Chris Williams</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/907/perl-5-13-3-is-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On joining Google</title>
		<link>http://feedproxy.google.com/~r/Infotropism/~3/wqP5Iw0njGs/</link>
		<comments>http://feedproxy.google.com/~r/Infotropism/~3/wqP5Iw0njGs/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 17:02:00 +0000</pubDate>
		<dc:creator>Skud</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[freebase]]></category>
		<category><![CDATA[metaweb]]></category>
		<category><![CDATA[open data]]></category>
		<category><![CDATA[oscon]]></category>

		<guid isPermaLink="false">http://infotrope.net/blog/?p=532</guid>
		<description><![CDATA[It&#8217;s a long time since I posted here, but this seemed worth an announcement. Yesterday Metaweb, my employer and the creators of Freebase, announced that we&#8217;ve been acquired by Google. The announcement was pretty exciting, not least because I got to be the person to post the official blog post on the Freebase blog. I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s a long time since I posted here, but this seemed worth an announcement.</p>
<p>Yesterday Metaweb, my employer and the creators of <a href="http://freebase.com/">Freebase</a>, announced that we&#8217;ve been <a href="http://blog.freebase.com/2010/07/16/metaweb-joins-google/">acquired by Google</a>.</p>
<p>The announcement was pretty exciting, not least because I got to be the person to post the official blog post on the Freebase blog.  </p>
<p>I&#8217;m also excited that we launched this video along with the announcement, explaining what Metaweb/Freebase is all about:</p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/TJfrNo3Z-DU&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/TJfrNo3Z-DU&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></p>
<blockquote><p><strong>Transcript:</strong><br />
You know what drives me crazy about words? They have a million different meanings.  </p>
<p>Like, check this out: someone says, &#8220;I love Boston.&#8221;  Now, they probably mean, &#8220;I love Boston, the big city in Massachusetts&#8221;, but they could be referring to one of the twenty-six other Bostons that are scattered around the globe. But, if it&#8217;s during the playoffs, they&#8217;re probably referring to the Celtics [basketball team]. Of course, you and I both hope that they&#8217;re talking about <em>the</em> Boston. You know. [Image of rock band, sounds of electric guitar.]</p>
<p>But, I guess there&#8217;s really no way of knowing. The problem is that the same word can mean so many different things.  Because of that, when it comes to finding, linking, reconciling, or organising multiple layers of information, words are not the best solution.  The guys at grocery stores figured this out back in the sixties when they started putting barcodes on everything, so that products with the same name wouldn&#8217;t get confused. </p>
<p>So how come on the web, so many sites still try to organise stuff with words?  Say you&#8217;re a product guy at a big music site and you want to pull in feeds of lyrics and videos and photos from all of your data suppliers.  But everyone uses different names for things, and a lot of the feeds don&#8217;t even match up, so you&#8217;ve got to reconcile them, and pull in updates, and deal with merges and deletes and splits.  It&#8217;s a nightmare.  </p>
<p>But what if there was a better way?</p>
<p>Welcome to Metaweb.  Metaweb is a service that helps you build your website around <em>entities</em>, and not just words. Whoa, what&#8217;s an entity?  Well the simple answer is, it&#8217;s a singular person, place, or thing. </p>
<p>OK, well, let&#8217;s compare that to text. Did you know that on the web there are more than 50 different ways people write &#8220;U. C. Berkeley&#8221;? [Examples listed: Cal Berkeley, Berkeley University, UCB, California, U of Cal, etc.]  And they&#8217;re really just talking about one single place, one entity.  By mapping all those words to a single entity, as if it had its own barcode, you can combine all that information about U. C. Berkeley into one place. </p>
<p>But that&#8217;s just the beginning.  Because entities represent unique, real-life things, we can build a map that shows how they&#8217;re related.  So, you can look for things that share certain attributes, like &#8220;actresses under 20 from New York&#8221;.  Can you imagine trying to find that with a keyword search? [Shows typical keyword search results, with keywords highlighted: "NY blogger under fire for criticizing actress", "March 3 2004: New! 20 steps to be an actress", "Kid actress eats 20 York peppermints".]  Entities are just smarter than words. </p>
<p>So, Metaweb&#8217;s been in the process of identifying millions of  these entities and mapping out how they&#8217;re related, and what words other sites use to refer to them. And it&#8217;s really cool because they have a totally collaborative process that involves the online community.  This thing will always be expanding and improving. </p>
<p>So, how is this going to help you? Well let&#8217;s say you&#8217;re that guy writing the movie review. If you tag the review with an entity in Metaweb, it&#8217;s like you&#8217;re looking at a menu saying, &#8220;Hey, Metaweb, give me the movie poster and a trailer and some links and maybe some other information like the release date and who was in it.&#8221;  And <em>BAM</em>, it&#8217;d be right there. And now, your page looks awesome! </p>
<p>Or, say you&#8217;re that product guy at the music site.  Instead of spending months doing messy integrations and maintaining all those feeds, you can just plug in to Metaweb, and suddenly everything just works. It&#8217;s like a switchboard for content on the web. [Various logos related to web content: eg. Twitter, Facebook, Audio Scrobbler, WordPress.]  And not only that!  When your site&#8217;s built on entities, new things get magically connected.  Like, if one of your users adds a band to her profile page, or tags them in a comment, that can show up on the band page, because they&#8217;re all linked under the hood to the same entity.</p>
<p>Are you kidding me? This stuff sounds impossible! Well, that&#8217;s what they said about the barcode.</p>
<p>And it&#8217;s not just movies and bands.  Metaweb has millions of entities in thousands of categories: twelve million and counting! </p>
<p>Metaweb makes your site smarter.  It&#8217;s time to connect to the web.  Metaweb.com.
</p></blockquote>
<p>I think a lot of friends and family are finally going to be saying, &#8220;Oh, so <em>that&#8217;s</em> what you do&#8221; :)</p>
<p>The other good news with the announcement is that Freebase is going to be staying free and open, and we&#8217;ll be working with Google to make it bigger and better (and you know with Google, bigger means <em>bigger</em>).  So that&#8217;s pretty exciting.  I&#8217;ll be continuing on over there doing community/developer relations stuff.  </p>
<p>I&#8217;ll also be at <a href="http://www.oscon.com/oscon2010">OSCON</a> next week, where I&#8217;ll be giving a presentation on <a href="http://www.oscon.com/oscon2010/public/schedule/detail/13983">Open Source, Open Data</a> where I talk about how we apply open source ideas and processes to open data.  Come see my talk!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Infotropism?a=wqP5Iw0njGs:KVNb52fZF2c:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Infotropism?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Infotropism?a=wqP5Iw0njGs:KVNb52fZF2c:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Infotropism?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Infotropism?a=wqP5Iw0njGs:KVNb52fZF2c:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Infotropism?i=wqP5Iw0njGs:KVNb52fZF2c:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Infotropism?a=wqP5Iw0njGs:KVNb52fZF2c:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Infotropism?i=wqP5Iw0njGs:KVNb52fZF2c:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Infotropism?a=wqP5Iw0njGs:KVNb52fZF2c:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Infotropism?i=wqP5Iw0njGs:KVNb52fZF2c:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Infotropism/~4/wqP5Iw0njGs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infotrope.net/blog/2010/07/17/on-joining-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
