<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet ChrisDolan</title>
	<link>http://www.chrisdolan.net/planet/</link>
	<language>en</language>
	<description>Planet ChrisDolan - http://www.chrisdolan.net/planet/</description>

<item>
	<title>use Perl Journals: RFC: lethal - lexical exceptions for Perl (2008.03.09  8:50)</title>
	<guid isPermaLink="true">http://use.perl.org/~pjf/journal/35869?from=rss</guid>
	<link>http://use.perl.org/~pjf/journal/35869?from=rss</link>
	<description>&lt;p&gt; &lt;b&gt;RFC: lethal - lexical exceptions for Perl&lt;/b&gt; &lt;br /&gt;
I've been scratching a long-time itch of mine, which is that while Perl allows me to use &lt;tt&gt; &lt;a href=&quot;http://search.cpan.org/perldoc?Fatal&quot;&gt;Fatal&lt;/a&gt; &lt;/tt&gt; to get subroutines and built-ins to throw exceptions on failure, such a change was always done on a package-wide, rather than lexical (block) basis.
&lt;/p&gt; &lt;p&gt;
However with Perl 5.10 we have the ability to fix that, and I've put together a proof-of-concept module that enables exception-throwing subroutines on a lexical basis.
&lt;/p&gt; &lt;p&gt;
I'm looking for input into its naming, interface, and concept in general.  Rather than filling up a blog post with it, you can &lt;a href=&quot;http://perlmonks.org/?node_id=673060&quot;&gt;read the node on PerlMonks&lt;/a&gt;.
&lt;/p&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:59:55 +0000</pubDate>
</item>
<item>
	<title>use Perl Journals: Upgrading Trac #2 (2008.03.08 18:16)</title>
	<guid isPermaLink="true">http://use.perl.org/~Beatnik/journal/35868?from=rss</guid>
	<link>http://use.perl.org/~Beatnik/journal/35868?from=rss</link>
	<description>After the migration, Trac started throwing &lt;a href=&quot;http://lists.edgewall.com/archive/trac/2006-February/006655.html&quot;&gt;No changeset X in repository&lt;/a&gt;. It took me a few minutes to figure out. The solution: resync Trac with the SVN db:&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;trac-admin /path/to/tracdb&lt;br /&gt;resync&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:59:55 +0000</pubDate>
</item>
<item>
	<title>Planet Mozilla: Michael Ventnor: Fullscreen Is Now...</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-4925399027471706894.post-6795920305269840367</guid>
	<link>http://ventnorsblog.blogspot.com/2008/03/fullscreen-is-now.html</link>
	<description>&lt;a href=&quot;http://bp2.blogger.com/_UKaUkB4Y3mE/R9MzqppfPpI/AAAAAAAAADw/qdB1pzLRKwE/s1600-h/fullscr-incrediblyawesome.jpg&quot;&gt;&lt;img src=&quot;http://bp2.blogger.com/_UKaUkB4Y3mE/R9MzqppfPpI/AAAAAAAAADw/qdB1pzLRKwE/s400/fullscr-incrediblyawesome.jpg&quot; alt=&quot;&quot; style=&quot;cursor: pointer; cursor: hand;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5175537204606221970&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once upon a time there was a humble front-end contributor who worked on many small XUL and Javascript features for Firefox 3 like the smooth-scrolling tab bar and prefilling the find bar with the current selection. He later took on the mountainous responsibility of GTK Widget maintainer after travelling to New Zealand for his Uni holidays, but thats another story.&lt;br /&gt;&lt;br /&gt;Anyway, in April 2007, I^H he contributed a patch to make the toolbars auto-hide themselves when in full-screen mode. It was a long and laborious process towards code review but it is now finally in the latest Firefox 3 hourly builds, and possibly in the latest nightly build.&lt;br /&gt;&lt;br /&gt;So why is this fullscreen so incredibly awesome? For Firefox 3 we added a new read-only boolean property called &lt;a href=&quot;http://developer.mozilla.org/en/docs/DOM:window.fullScreen&quot;&gt;window.fullScreen&lt;/a&gt; that can allow web applications to know whether or not you are in fullscreen mode (technically its not &quot;new&quot; per se, it existed in Firefox 2 but it never gave back the correct value, I just fixed that up). This can provide really great opportunities for web apps to take advantage of the new built-in fuller fullscreen. Maybe Google Presentations could start the slide show automatically when you enter fullscreen. Or maybe video sites could adjust the video size to take up the entire screen when you enter fullscreen.&lt;br /&gt;&lt;br /&gt;Of course, I haven't forgotten my now main duty of GTK Widget maintainer. For Thunderbird users, I managed to fix the bug where dragging an image from your file manager would paste the file:// URL as text rather than embed the image. Oh, and XUL popups now properly set hints, so if you maintain a window manager, especially one with compositing, you no longer need Firefox-specific hacks; we now correctly report whether the popup is supposed to be a menu, a tooltip, or just a utility popup like Larry.&lt;br /&gt;&lt;br /&gt;But anyway, Beta 4 is coming out soon. Like many times before, all the cool things I make just miss the beta freeze and get checked in before said beta even comes out, which makes the betas slightly less exciting than the nightlies or hourlies. Also, I hope Ted manages to turn on Profile-Guided Optimization for Linux very soon (if he hasn't done so already).</description>
	<pubDate>Sun, 09 Mar 2008 20:59:50 +0000</pubDate>
</item>
<item>
	<title>Planet Mozilla: Robert Sayre: Blocker Report for March 08, 2008</title>
	<guid isPermaLink="true">http://blog.mozilla.com/rob-sayre/2008/03/08/blocker-report-for-march-08-2008/</guid>
	<link>http://blog.mozilla.com/rob-sayre/2008/03/08/blocker-report-for-march-08-2008/</link>
	<description>&lt;h3&gt;Overall Status&lt;/h3&gt;
&lt;p&gt;Blocking Firefox 3: 206 bugs found.&lt;br /&gt;
Blocking Gecko 1.9: 175 bugs found.&lt;/p&gt;
&lt;h3&gt;Blockers fixed between 12:00am and 10:45pm&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=421412&quot;&gt;Bug 421412&lt;/a&gt; Get rid of _adjustWidth hack. Patch by Edward Lee.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=396548&quot;&gt;Bug 396548&lt;/a&gt;. Star icon in url bar autocomplete is partly or completely buried under scrollbar (covered, hidden). Patch by Edward Lee.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=406373&quot;&gt;Bug 406373&lt;/a&gt;. Url bar results can be scrolled horizontally after scrolling vertically. Patch by Edward Lee.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=421490&quot;&gt;Bug 421490&lt;/a&gt;. wpad may be dangerous, and it is on by default. Patch by Michael Ventnor.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=415329&quot;&gt;Bug 415329&lt;/a&gt;. large toolbar buttons are vertically misaligned. Patch by Dão Gottwald.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=417421&quot;&gt;Bug 417421&lt;/a&gt;. Loss of back forward buttons when switching between 1.8 and 1.9. Patch by Dão Gottwald.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=405010&quot;&gt;Bug 405010&lt;/a&gt;. make column changes in places/library (session) persistent. Patch by Marco Bonardo.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=416225&quot;&gt;Bug 416225&lt;/a&gt;. Change “Unfiled bookmarks” to “Unsorted Bookmarks”. Patch by Kurt (supernova_00).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=409215&quot;&gt;Bug 409215&lt;/a&gt;. Closing tabs quickly in succession causes the close button to “get stuck” (Minefield 3.0pre3, browser.tabs.closeButtons = 1). Patch by Gavin Sharp.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=412360&quot;&gt;Bug 412360&lt;/a&gt;. Download Manager remains empty, downloads don’t start, with this 3.0b2 downloads.sqlite. Patch by Edward Lee.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=418961&quot;&gt;Bug 418961&lt;/a&gt;. “Save Page As” “Text Files” saves file but Downloads window doesn’t show completion. Patch by Edward Lee.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=421058&quot;&gt;Bug 421058&lt;/a&gt;.  Firefox won’t prompt to change stored passwords. Patch by Justin Dolske.&lt;/p&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:59:50 +0000</pubDate>
</item>
<item>
	<title>Planet Mozilla: Benjamin Smedberg: Has GCC Dehydra Replaced Elsa?</title>
	<guid isPermaLink="true">http://benjamin.smedbergs.us/blog/2008-03-09/has-gcc-dehydra-replaced-elsa/</guid>
	<link>http://benjamin.smedbergs.us/blog/2008-03-09/has-gcc-dehydra-replaced-elsa/</link>
	<description>&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;GCC Dehydra allows us to do analysis passes on our existing code. In the far future it may also allow us to do optimization passes. But it does not have the ability to do code rewriting, and probably won’t gain that ability any time soon. In order to be able to do C++-&amp;gt;C++ transformations, you have to have correct end positions for all statements/tokens, not just beginning positions. GCC does not track this information, and making it do so would be a massive undertaking.&lt;/p&gt;
&lt;p&gt;Mozilla2 still lives in a dual world where automatic code refactoring is done using the elsa/oink toolchain, while static analysis is taking place using the GCC toolchain.&lt;/p&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:59:50 +0000</pubDate>
	<author>benjamin@smedbergs.us (Benjamin Smedberg)</author>
</item>
<item>
	<title>use Perl Journals: Nancy: from Lua to Perl (2008.03.09 15:13)</title>
	<guid isPermaLink="true">http://use.perl.org/~ferreira/journal/35871?from=rss</guid>
	<link>http://use.perl.org/~ferreira/journal/35871?from=rss</link>
	<description>&lt;p&gt;
Some days before, Reuben Thomas (a known contributor to &lt;a href=&quot;http://www.lua.org/&quot;&gt;Lua&lt;/a&gt; community) &lt;a href=&quot;http://article.gmane.org/gmane.comp.lang.lua.general/46135&quot;&gt;announced&lt;/a&gt; the release of &lt;a href=&quot;http://rrt.sc3d.org/Software/Nancy/&quot;&gt;Nancy&lt;/a&gt;, &quot;a simple web site builder&quot; at the &lt;a href=&quot;http://www.lua.org/lua-l.html&quot;&gt;Lua mailing list&lt;/a&gt;.


&lt;/p&gt;&lt;p&gt;
For the dismay of Lua afficcionados, this release was not written in Lua.
&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;p&gt; &lt;em&gt;
Oh, and it's written in Perl. I thought it might be interesting to say why.
The problem was not libraries (I used my pure-Lua stdlib and LuaFileSystem),
but deployment on Windows (I use Linux). I had previously built an
all-in-one binary for Windows using a cross-compiler. That worked fine but
made it hard to debug on Windows as I couldn't just edit-run, and also broke
nastily when the cross-compiler was upgraded. So, I switched to LuaBinaries.
That enabled me in the end to deploy only pre-built binaries, but at the
cost of having to install 2 binary packages, and then do manual fiddling to
get .lua files run as commands by the Windows shell.
&lt;/em&gt; &lt;/p&gt;

&lt;p&gt; &lt;em&gt;
ActivePerl does all this for me, and I was already using some Perl scripts
in the same system, so by rewriting Nancy in Perl I got down to &quot;run the
Perl installer&quot; as being the prerequisites for running Nancy.
&lt;/em&gt; &lt;/p&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;
Nancy begun its life as Lua code (and that's the reason Reuben announced this at Lua mailing list for the last time — unless it be written in Lua again in the future).
&lt;/p&gt;

&lt;p&gt;
Perl still has an edge ahead before some of the popular dynamical languages out there, which (I hope) is not going away anytime soon in the future.
&lt;/p&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:58:31 +0000</pubDate>
</item>
<item>
	<title>Unofficial Apple Weblog: Talkcast reminder, 10 pm ET tonight</title>
	<guid isPermaLink="false">http://www.tuaw.com/2008/03/09/talkcast-reminder-10-pm-et-tonight/</guid>
	<link>http://feeds.tuaw.com/~r/weblogsinc/tuaw/~3/248486264/</link>
	<description>&lt;p&gt;Filed under: &lt;a href=&quot;http://www.tuaw.com/category/tuaw-business/&quot; rel=&quot;tag&quot;&gt;TUAW Business&lt;/a&gt;, &lt;a href=&quot;http://www.tuaw.com/category/podcasts/&quot; rel=&quot;tag&quot;&gt;Podcasts&lt;/a&gt;&lt;/p&gt;&lt;a href=&quot;http://www.talkshoe.com/talkshoe/web/talkCast.jsp?masterId=45077&quot;&gt;&lt;img src=&quot;http://www.blogsmithmedia.com/www.tuaw.com/media/2008/03/modernphone.jpg&quot; hspace=&quot;8&quot; align=&quot;right&quot; height=&quot;168&quot; width=&quot;225&quot; vspace=&quot;8&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;If you haven't checked out last week's show yet, by all means grab a copy.  &lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://iconfactory.com/home/permalink/1961&quot;&gt;We were joined&lt;/a&gt; by Craig Hockenberry and Gedeon Maheux from &lt;a href=&quot;http://iconfactory.com/&quot;&gt;Iconfactory&lt;/a&gt;, who gave us the lowdown on the &lt;a href=&quot;http://files.iconfactory.net/downloads/animations/Redesign/&quot;&gt;history of the company,&lt;/a&gt; the origins of &lt;a href=&quot;http://iconfactory.com/twitterrific&quot;&gt;Twitterrific&lt;/a&gt;, the coevolution of &lt;a href=&quot;http://twitter.com/tuaw&quot;&gt;Twitter&lt;/a&gt; with the now-dominant Mac client, and the promise of the upcoming &lt;a href=&quot;http://www.tuaw.com/tag/iPhone/&quot;&gt;iPhone&lt;/a&gt; development explosion.  &lt;a href=&quot;http://recordings.talkshoe.com/TC-45077/TS-95271.mp3&quot;&gt;Download direct&lt;/a&gt;, &lt;a href=&quot;http://www.talkshoe.com/talkshoe/web/talkCast.jsp?masterId=45077&quot;&gt;listen in your browser&lt;/a&gt; or &lt;a href=&quot;itpc://recordings.talkshoe.com/rss45077.xml&quot;&gt;subscribe to the TalkShoe feed&lt;/a&gt; in iTunes.&lt;br /&gt; &lt;br /&gt;Speaking of iPhone... &lt;a href=&quot;http://www.talkshoe.com/talkshoe/web/talkCast.jsp?masterId=45077&quot;&gt;We are live tonight (Sunday 3/9)&lt;/a&gt; for this week's talkcast, 10 pm ET, talking about iPhone for enterprise and the SDK -- featuring a taped segment with &lt;a href=&quot;http://ericasadun.com&quot;&gt;Erica Sadun&lt;/a&gt; and &lt;a href=&quot;http://www.apolloapp.com/&quot;&gt;Apollo IM developer Alex Schaefer,&lt;/a&gt; who couldn't make the regular Sunday night show but felt they had to say something after 72+ hours deep in the SDK.&lt;br /&gt;&lt;br /&gt;Join me, Scott, Dave and Mike Schramm tonight for the social. Bring your own ice cream!&lt;p&gt;&lt;a href=&quot;http://www.tuaw.com/2008/03/09/talkcast-reminder-10-pm-et-tonight/&quot; rel=&quot;bookmark&quot;&gt;Continue reading &lt;em&gt;Talkcast reminder, 10 pm ET tonight&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;h6 style=&quot;clear: both; padding: 8px 0 0 0; height: 2px; font-size: 1px; border: 0; margin: 0; padding: 0;&quot;&gt;&lt;/h6&gt;&lt;a href=&quot;http://www.talkshoe.com/talkshoe/web/talkCast.jsp?masterId=45077&amp;amp;cmd=tc&quot;&gt;Read&lt;/a&gt; | &lt;a href=&quot;http://www.tuaw.com/2008/03/09/talkcast-reminder-10-pm-et-tonight/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent link to this entry&quot;&gt;Permalink&lt;/a&gt; | &lt;a href=&quot;http://www.tuaw.com/forward/1135528/&quot; title=&quot;Send this entry to a friend via email&quot;&gt;Email this&lt;/a&gt; | &lt;a href=&quot;http://www.tuaw.com/2008/03/09/talkcast-reminder-10-pm-et-tonight/#comments&quot; title=&quot;View reader comments on this entry&quot;&gt;Comments&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;map name=&quot;google_ad_map_16-1135528&quot;&gt;&lt;area shape=&quot;rect&quot; href=&quot;http://imageads.googleadservices.com/pagead/imgclick/16-1135528?pos=0&quot; coords=&quot;1,2,367,28&quot; /&gt;&lt;area shape=&quot;rect&quot; href=&quot;http://services.google.com/feedback/abg&quot; coords=&quot;384,10,453,23&quot; /&gt;&lt;/map&gt;&lt;img src=&quot;http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;amp;client=ca-pub-3546992251556849&amp;amp;channel=21&amp;amp;output=png&amp;amp;cuid=16-1135528&amp;amp;url=http://www.tuaw.com/2008/03/09/talkcast-reminder-10-pm-et-tonight/&quot; border=&quot;0&quot; usemap=&quot;http://feeds.tuaw.com/weblogsinc/tuaw#google_ad_map_16-1135528&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.tuaw.com/~a/weblogsinc/tuaw?a=nlvCv3&quot;&gt;&lt;img src=&quot;http://feeds.tuaw.com/~a/weblogsinc/tuaw?i=nlvCv3&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?a=UMtsjzf&quot;&gt;&lt;img src=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?i=UMtsjzf&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?a=x0d4UDf&quot;&gt;&lt;img src=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?i=x0d4UDf&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.tuaw.com/~r/weblogsinc/tuaw/~4/248486264&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:57:26 +0000</pubDate>
</item>
<item>
	<title>Unofficial Apple Weblog: More Jim Henson classics on iTunes</title>
	<guid isPermaLink="false">http://www.tuaw.com/2008/03/09/more-jim-henson-classics-on-itunes/</guid>
	<link>http://feeds.tuaw.com/~r/weblogsinc/tuaw/~3/248493190/</link>
	<description>&lt;p&gt;Filed under: &lt;a href=&quot;http://www.tuaw.com/category/itunes-store/&quot; rel=&quot;tag&quot;&gt;iTS&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www.blogsmithmedia.com/www.tuaw.com/media/2008/03/labyrinth.jpg&quot; hspace=&quot;8&quot; align=&quot;right&quot; vspace=&quot;8&quot; alt=&quot;&quot; border=&quot;1&quot; /&gt;
&lt;p&gt;iTunes users who also happen to be fans of a goblin David Bowie, Gelflings, Skeksis, Mystics and/or &lt;a href=&quot;http://en.wikipedia.org/wiki/Jim_Henson&quot;&gt;Jim Henson&lt;/a&gt; have reason to celebrate: two of Henson's cult classic films are now available on iTunes. &lt;a href=&quot;http://www.imdb.com/title/tt0083791/&quot;&gt;The Dark Crystal&lt;/a&gt; and &lt;a href=&quot;http://www.imdb.com/title/tt0091369/&quot;&gt;Labyrinth&lt;/a&gt; are now available for purchase at the iTunes Store. This comes on the heels of the &lt;a href=&quot;http://www.tuaw.com/2008/01/28/fraggles-and-farscape-come-to-itunes/&quot;&gt;Farscape and Fraggle Rock iTunes releases&lt;/a&gt; in January.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;If you've never been able to get the cry of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Skeksis&quot;&gt;Skeksis&lt;/a&gt; or the image of a frighteningly glam Goblin King (with fantastic hair) out of your head, pop up iTunes and make some Jim Henson magic. While you're there, you can even grab the slightly watered-down musical numbers in the Labyrinth Soundtrack to go with it, as well as a copy of The Muppet Christmas Carol, just in case the kids need some lighter fare after The Dark Crystal. Can't beat that, right?&lt;/p&gt;&lt;h6 style=&quot;clear: both; padding: 8px 0 0 0; height: 2px; font-size: 1px; border: 0; margin: 0; padding: 0;&quot;&gt;&lt;/h6&gt;&lt;a href=&quot;http://www.prxbuilder.com/link.aspx?id=104940b6-36ed-46c0-a5cd-fb4556c4aff9&amp;amp;name=DarkCrystallabyrinth.xml&amp;amp;xform=xslt%2flink.xslt&amp;amp;perm=true&quot;&gt;Read&lt;/a&gt; | &lt;a href=&quot;http://www.tuaw.com/2008/03/09/more-jim-henson-classics-on-itunes/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent link to this entry&quot;&gt;Permalink&lt;/a&gt; | &lt;a href=&quot;http://www.tuaw.com/forward/1133195/&quot; title=&quot;Send this entry to a friend via email&quot;&gt;Email this&lt;/a&gt; | &lt;a href=&quot;http://www.tuaw.com/2008/03/09/more-jim-henson-classics-on-itunes/#comments&quot; title=&quot;View reader comments on this entry&quot;&gt;Comments&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;map name=&quot;google_ad_map_16-1133195&quot;&gt;&lt;area shape=&quot;rect&quot; href=&quot;http://imageads.googleadservices.com/pagead/imgclick/16-1133195?pos=0&quot; coords=&quot;1,2,367,28&quot; /&gt;&lt;area shape=&quot;rect&quot; href=&quot;http://services.google.com/feedback/abg&quot; coords=&quot;384,10,453,23&quot; /&gt;&lt;/map&gt;&lt;img src=&quot;http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;amp;client=ca-pub-3546992251556849&amp;amp;channel=21&amp;amp;output=png&amp;amp;cuid=16-1133195&amp;amp;url=http://www.tuaw.com/2008/03/09/more-jim-henson-classics-on-itunes/&quot; border=&quot;0&quot; usemap=&quot;http://feeds.tuaw.com/weblogsinc/tuaw#google_ad_map_16-1133195&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.tuaw.com/~a/weblogsinc/tuaw?a=dwUxhQ&quot;&gt;&lt;img src=&quot;http://feeds.tuaw.com/~a/weblogsinc/tuaw?i=dwUxhQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?a=zsLIuYf&quot;&gt;&lt;img src=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?i=zsLIuYf&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?a=YqtdHlf&quot;&gt;&lt;img src=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?i=YqtdHlf&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.tuaw.com/~r/weblogsinc/tuaw/~4/248493190&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:57:26 +0000</pubDate>
</item>
<item>
	<title>Unofficial Apple Weblog: Macworld posts &quot;Mac snobbery?&quot; video</title>
	<guid isPermaLink="false">http://www.tuaw.com/2008/03/09/macworld-posts-mac-snobbery-video/</guid>
	<link>http://feeds.tuaw.com/~r/weblogsinc/tuaw/~3/248457653/</link>
	<description>&lt;p&gt;Filed under: &lt;a href=&quot;http://www.tuaw.com/category/cult-of-mac/&quot; rel=&quot;tag&quot;&gt;Cult of Mac&lt;/a&gt;&lt;/p&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://www.macworld.com/article/132433/2008/03/mwvodcast41.html&quot;&gt;&lt;img src=&quot;http://www.blogsmithmedia.com/www.tuaw.com/media/2008/03/brian-chen-macworld-mac-users-snobs-video-_-cory-_-7128397392008sbm.jpg&quot; vspace=&quot;4&quot; border=&quot;1&quot; hspace=&quot;4&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div align=&quot;left&quot;&gt;You may recall us posting about a &lt;a href=&quot;http://www.tuaw.com/2008/02/17/the-street-mac-owners-are-snobs/&quot;&gt;recent study that found Mac users to be &quot;Snobs.&quot;&lt;/a&gt; Well, Macworld has &lt;a href=&quot;http://www.macworld.com/article/132433/2008/03/mwvodcast41.html&quot;&gt;taken this study a bit further&lt;/a&gt;. Brian Chen, the Associate Editor, went around asking some of the staff at Macworld (including Jason Snell) what they thought about the study. They also went to the Apple store asking wandering customers outside the store what they thought about the study. &lt;/div&gt;
&lt;/div&gt;&lt;h6 style=&quot;clear: both; padding: 8px 0 0 0; height: 2px; font-size: 1px; border: 0; margin: 0; padding: 0;&quot;&gt;&lt;/h6&gt;&lt;a href=&quot;http://www.macworld.com/article/132433/2008/03/mwvodcast41.html&quot;&gt;Read&lt;/a&gt; | &lt;a href=&quot;http://www.tuaw.com/2008/03/09/macworld-posts-mac-snobbery-video/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent link to this entry&quot;&gt;Permalink&lt;/a&gt; | &lt;a href=&quot;http://www.tuaw.com/forward/1135152/&quot; title=&quot;Send this entry to a friend via email&quot;&gt;Email this&lt;/a&gt; | &lt;a href=&quot;http://www.tuaw.com/2008/03/09/macworld-posts-mac-snobbery-video/#comments&quot; title=&quot;View reader comments on this entry&quot;&gt;Comments&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;map name=&quot;google_ad_map_16-1135152&quot;&gt;&lt;area shape=&quot;rect&quot; href=&quot;http://imageads.googleadservices.com/pagead/imgclick/16-1135152?pos=0&quot; coords=&quot;1,2,367,28&quot; /&gt;&lt;area shape=&quot;rect&quot; href=&quot;http://services.google.com/feedback/abg&quot; coords=&quot;384,10,453,23&quot; /&gt;&lt;/map&gt;&lt;img src=&quot;http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;amp;client=ca-pub-3546992251556849&amp;amp;channel=21&amp;amp;output=png&amp;amp;cuid=16-1135152&amp;amp;url=http://www.tuaw.com/2008/03/09/macworld-posts-mac-snobbery-video/&quot; border=&quot;0&quot; usemap=&quot;http://feeds.tuaw.com/weblogsinc/tuaw#google_ad_map_16-1135152&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.tuaw.com/~a/weblogsinc/tuaw?a=UDiPgj&quot;&gt;&lt;img src=&quot;http://feeds.tuaw.com/~a/weblogsinc/tuaw?i=UDiPgj&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?a=s1Mcp5f&quot;&gt;&lt;img src=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?i=s1Mcp5f&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?a=HMRsi3f&quot;&gt;&lt;img src=&quot;http://feeds.tuaw.com/~f/weblogsinc/tuaw?i=HMRsi3f&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.tuaw.com/~r/weblogsinc/tuaw/~4/248457653&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:57:25 +0000</pubDate>
</item>
<item>
	<title>Jakob Nielsen: microcontent-brand-names.html</title>
	<guid isPermaLink="true">http://www.useit.com/alertbox/microcontent-brand-names.html</guid>
	<link>http://www.useit.com/alertbox/microcontent-brand-names.html</link>
	<description>Company Name First in Microcontent?</description>
	<pubDate>Sun, 09 Mar 2008 20:56:38 +0000</pubDate>
</item>
<item>
	<title>Perl Buzz Mechanix: Use seq or jot to do repetitive numbering</title>
	<guid isPermaLink="true">http://perlbuzz.com/mechanix/2008/03/use-seq-or-jot-to-do-repetitiv.html</guid>
	<link>http://perlbuzz.com/mechanix/2008/03/use-seq-or-jot-to-do-repetitiv.html</link>
	<description>&lt;p&gt;
I just now had to clean up some tables in a PostgreSQL database.  The prior DBA thought that it would be good to split up tables into lx1, lx2, lx3 up to lx20.  After I combined all the tables together, I needed to drop the originals.  I could have written a Perl program to generate a series of &lt;tt&gt;drop table lx1;&lt;/tt&gt; commands to feed into the &lt;tt&gt;psql&lt;/tt&gt; command-line client, but instead I used the &lt;tt&gt;seq&lt;/tt&gt; tool:
&lt;/p&gt;
&lt;pre&gt;$ seq -f'drop table lx%g;' 1 20
drop table lx1;
drop table lx2;
...
drop table lx20;
&lt;/pre&gt;
&lt;p&gt;
If you don't have &lt;tt&gt;seq&lt;/tt&gt; on your system, as on Mac OS X, you probably have &lt;tt&gt;jot&lt;/tt&gt;, as in:
&lt;/p&gt;

&lt;pre&gt;jot -w'drop table lx%g;' 20 1
&lt;/pre&gt;

&lt;p&gt;
Then again, if you just &lt;i&gt;have&lt;/i&gt; to do it in Perl:
&lt;/p&gt;
&lt;pre&gt;perl -le'print qq{drop table lx$_;} for 1..20'
&lt;/pre&gt;
&lt;p&gt;
but I like to use other tools than the Swiss Army Chainsaw sometimes.
&lt;/p&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:56:31 +0000</pubDate>
</item>
<item>
	<title>Slashdot: German Police Raid 51 CeBIT Stands Over Patent Claims</title>
	<guid isPermaLink="false">http://yro.slashdot.org/article.pl?sid=08/03/09/1815205&amp;from=rss</guid>
	<link>http://rss.slashdot.org/~r/Slashdot/slashdot/~3/248496852/article.pl</link>
	<description>LeCaddie writes &quot;Last week German investigators raided 51 exhibitor stands at CeBIT, the German information technology fair in Hanover, looking for goods suspected of infringing patents. Some 183 police, customs officers, and prosecutors raided the fair on Wednesday and carried off 68 boxes of electronic goods and documents including cellphones, navigation devices, digital picture frames, and flat-screen monitors. Of the 51 companies raided, 24 were Chinese. Most of the patents concerned were related to devices with MP3, MP4, and DVB standard functions for digital audio and video, blank CDs, and DVD copiers, police said.&quot; In the US there are no criminal penalties associated with patents, and such a raid could not be conducted, especially in the absence of a court ruling of infringement.&lt;p&gt;&lt;a href=&quot;http://yro.slashdot.org/article.pl?sid=08/03/09/1815205&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at Slashdot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rss.slashdot.org/~a/Slashdot/slashdot?a=TxVsPW&quot;&gt;&lt;img src=&quot;http://rss.slashdot.org/~a/Slashdot/slashdot?i=TxVsPW&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://rss.slashdot.org/~r/Slashdot/slashdot/~4/248496852&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:40:24 +0000</pubDate>
</item>
<item>
	<title>Slashdot: Wikileaks Calls For Global Boycott Against eNom</title>
	<guid isPermaLink="false">http://yro.slashdot.org/article.pl?sid=08/03/09/025222&amp;from=rss</guid>
	<link>http://rss.slashdot.org/~r/Slashdot/slashdot/~3/248322146/article.pl</link>
	<description>souls writes &quot;The folks at Wikileaks are calling for a boycott against eNom, Inc., one of the top internet domain registrars, which WikiLeaks claims is involved in systematic domain censoring. On Feb 28th eNom shut down wikileaks.info, one of the many Wikileaks mirrors held by a volunteer as a side-effect of the court proceedings around wikileaks.org. In addition, eNom was the registrar that shut off access to a Spanish travel agent who showed up on a US Treasury watch list. Wikileaks calls for a 'global boycott of eNom and its parent Demand Media, its owners, executives and their affiliated companies, interests and holdings, to make clear such behavior can and will not be tolerated within the boundaries of the Internet and its global community.'&quot;&lt;p&gt;&lt;a href=&quot;http://yro.slashdot.org/article.pl?sid=08/03/09/025222&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at Slashdot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rss.slashdot.org/~a/Slashdot/slashdot?a=jhkmBs&quot;&gt;&lt;img src=&quot;http://rss.slashdot.org/~a/Slashdot/slashdot?i=jhkmBs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://rss.slashdot.org/~r/Slashdot/slashdot/~4/248322146&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:40:24 +0000</pubDate>
</item>
<item>
	<title>Slashdot: Olympic Web Site Features Pirated Content</title>
	<guid isPermaLink="false">http://yro.slashdot.org/article.pl?sid=08/03/09/0146224&amp;from=rss</guid>
	<link>http://rss.slashdot.org/~r/Slashdot/slashdot/~3/248263584/article.pl</link>
	<description>An anonymous reader writes &quot;Despite all the emphasis on protecting Olympic copyrights in China this year, the official web site of the Beijing Olympics features a Flash game that is a blatant copy of one of the games developed at The Pencil Farm. Compare the game on the Olympic site with 'Snow Day' at The Pencil Farm.&quot;&lt;p&gt;&lt;a href=&quot;http://yro.slashdot.org/article.pl?sid=08/03/09/0146224&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at Slashdot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rss.slashdot.org/~a/Slashdot/slashdot?a=Pd8bn7&quot;&gt;&lt;img src=&quot;http://rss.slashdot.org/~a/Slashdot/slashdot?i=Pd8bn7&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://rss.slashdot.org/~r/Slashdot/slashdot/~4/248263584&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:40:24 +0000</pubDate>
</item>
<item>
	<title>Daring Fireball: G-Archiver</title>
	<guid isPermaLink="false">tag:daringfireball.net,2008:/linked//6.11147</guid>
	<link>http://www.codinghorror.com/blog/archives/001072.html</link>
	<description>&lt;p&gt;So G-Archiver is a Windows app that lets you download your archived Gmail messages. It ends up that the app emails your Gmail username and password to the author. Crazy.&lt;/p&gt;

&lt;div&gt;
&lt;a href=&quot;http://daringfireball.net/linked/2008/march#sun-09-garchiver&quot; title=&quot;Permanent link to ‘G-Archiver’&quot;&gt; ★ &lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Sun, 09 Mar 2008 20:36:28 +0000</pubDate>
</item>
<item>
	<title>Planet Mozillazine: Asa Dotzler: webslices and activites</title>
	<guid isPermaLink="true">http://weblogs.mozillazine.org/asa/archives/2008/03/webslices_and_a.html</guid>
	<link>http://weblogs.mozillazine.org/asa/archives/2008/03/webslices_and_a.html</link>
	<description>&lt;p&gt;Just in case the power of the Firefox platform wasn't obvious already, check out the &lt;a href=&quot;http://www.glazman.org/weblog/dotclear/index.php?post/2008/03/07/WebSlices-in-Firefox-2&quot;&gt;Web Slices work from Daniel Glazman&lt;/a&gt; and the &lt;a href=&quot;http://www.kaply.com/weblog/2008/03/07/microsoft-activities-for-firefox-new-version/&quot;&gt;Activities work Mike Kaply's doing&lt;/a&gt;. &lt;/p&gt;</description>
	<pubDate>Sat, 08 Mar 2008 22:00:02 +0000</pubDate>
</item>
<item>
	<title>Mac Rumors: Sun Bringing Java to iPhone</title>
	<guid isPermaLink="true">http://www.macrumors.com/2008/03/08/sun-bringing-java-to-iphone/</guid>
	<link>http://www.macrumors.com/2008/03/08/sun-bringing-java-to-iphone/</link>
	<description>Sun announced that they are developing a Java Virtual Machine for Apple's iPhone with the newly released Software Development Kit (SDK).&lt;p class=&quot;quote&quot;&gt;&quot;We're going to make sure that the JVM offers the Java applications as much access to the native ...&lt;/p&gt;</description>
	<pubDate>Sat, 08 Mar 2008 21:57:28 +0000</pubDate>
</item>
<item>
	<title>Mac Rumors: iPhone SDK Limitations: Multitasking, Java, Emulators</title>
	<guid isPermaLink="true">http://www.macrumors.com/2008/03/08/iphone-sdk-limitations-multitasking-java-emulators/</guid>
	<link>http://www.macrumors.com/2008/03/08/iphone-sdk-limitations-multitasking-java-emulators/</link>
	<description>As people delve into the details of Apple's iPhone SDK, a few interesting issues are emerging.  One developer guideline that is generating some concern is from Apple's Human Interface Guidelines for iPhone:&lt;p class=&quot;quote&quot;&gt;Only one iPhone application...&lt;/p&gt;</description>
	<pubDate>Sat, 08 Mar 2008 21:57:25 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Vanilla Perl Build 15 - Loads of new toys</title>
	<guid isPermaLink="false">http://use.perl.org/article.pl?sid=08/03/08/1937220&amp;from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/248029736/article.pl</link>
	<description>http://ali.as/download/vanilla-perl-5.10.0-build-15.exe (14.4 MB) I'm happy to (FINALLY) release the new Vanilla Perl build 15. Vanilla Perl is the experimental Win32 Perl distribution with the mandate to do the absolute minimum amount of changes to the Perl core to get various features working. This latest experimental release contains most of the new tricks that will be in the upcoming April Strawberry Perl, and probably the biggest number of new features yet in a Vanilla release. XML::Parser This release comes with Expat and XML::Parser built in (since I still can't make XML::Parser install from CPAN itself and you can't upgrade it). So it should be possible to build a range of other stuff on top of it now (like PPM support, which is out of the scope of Vanilla). Win32::API Although it probably won't stay in Vanilla beyond this release, I've bundled in Win32::API out of the box. With Win32::API also comes (be necessity) with libwin32 bundled in as well (which is by far the biggest install from cpan.strawberryperl.com). With those two installed, most of the rest of the Win32:: family should install relatively easily. Relocation This release contains experimental patches for all three configuration files that contain hard-coded paths to make them capable or handling the Perl installation being shoved around. This should also be the first release usable for people interested in creating Portable Perl type distributions for flash drives, etc. Of course, this is still an .exe installer (which Portable Perl people don't want, cause it dumps crap into the registry). This particular feature WON'T be in Strawberry Perl, but it involved adding some extra capabilities in regards to tweaking installs. libwwwperl aka LWP Because I refuse to use FTP CPAN mirrors any more (HTTP being infinitely superior in every way) Vanilla now comes with LWP out of the box. This also means that the built in CPAN mirrors can be used now, intead of it falling back on the horrible FTP defaults. Righto then... So, with Vanilla 15 working, time to move on to getting a Strawberry Beta.&lt;p&gt;&lt;a href=&quot;http://use.perl.org/article.pl?sid=08/03/08/1937220&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at use Perl.&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/248029736&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 08 Mar 2008 21:41:58 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: pmtools-1.10 Release</title>
	<guid isPermaLink="false">http://use.perl.org/article.pl?sid=08/03/08/1936257&amp;from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/248029731/article.pl</link>
	<description>Now at a CPAN mirror site near you — pmtools-1.10. Tom &quot;spot&quot; Callaway of Fedora Core let me know that the Fedora folks were concerned about the fact that pmtools was only licensed under the Perl 5 Artistic License (they were concerned about how well the Artistic License 1.0 would stand up in court). So, pmtools (starting with v1.10) is now dual-licensed like Perl (Artistic and GPL). (My other public Perl stuff is also dual-licensed.) I also added my copyright to pmtools, as I had not added my name to the copyright when I took it over. Off-hand, I don't recall why Tom Christiansen used only the Artistic License for pmtools. Anyone with a clue, please drop me a line. (That of course includes you, Tom.)&lt;p&gt;&lt;a href=&quot;http://use.perl.org/article.pl?sid=08/03/08/1936257&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at use Perl.&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/248029731&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 08 Mar 2008 21:41:58 +0000</pubDate>
</item>
<item>
	<title>Slashdot Developers: Donkey Kong and Me</title>
	<guid isPermaLink="false">http://games.slashdot.org/article.pl?sid=08/03/08/194249&amp;from=rss</guid>
	<link>http://rss.slashdot.org/~r/Slashdot/slashdotDevelopers/~3/248020903/article.pl</link>
	<description>MBCook sends us to the blog of one Landon Dyer, who posted an entry the other day entitled Donkey Kong and Me. It describes how he was offered at job at Atari after writing a Centipede clone and ended up programming Donkey Kong for the Atari 800. It's full of detail that will be fascinating to anyone who ever programmed assembly language that had to fit into 16K, as well as portents of what was to come at Atari. &quot;My first officemate didn't know how to set up his computer. He didn't know anything, it appeared. He'd been hired to work on Dig Dug, and he was completely at sea. I had to teach him a lot, including how to program in assembly, how the Atari hardware worked, how to download stuff, how to debug. It was pretty bad.&quot;&lt;p&gt;&lt;a href=&quot;http://games.slashdot.org/article.pl?sid=08/03/08/194249&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at Slashdot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotDevelopers?a=zdlQGY&quot;&gt;&lt;img src=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotDevelopers?i=zdlQGY&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://rss.slashdot.org/~r/Slashdot/slashdotDevelopers/~4/248020903&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 08 Mar 2008 21:40:22 +0000</pubDate>
</item>
<item>
	<title>Slashdot Developers: Sun Is Porting Java To the iPhone</title>
	<guid isPermaLink="false">http://developers.slashdot.org/article.pl?sid=08/03/08/180252&amp;from=rss</guid>
	<link>http://rss.slashdot.org/~r/Slashdot/slashdotDevelopers/~3/248002734/article.pl</link>
	<description>krquet notes an InfoWorld article on Sun's plans for the iPhone. After studying Apple's newly released SDK docs for 24 hours, Sun decided it was feasible to develop a JVM, based on Java Micro Edition, for both the iPhone and the iTouch. An analyst is quoted: &quot;I think going forward, with the SDK, it takes out of Apple's control which applications are 'right' for the iPhone.&quot; The article doesn't speculate on how Apple might to react to such a loss of control. &quot;Apple had not shown interest in enabling Java to run on the iPhone, but Sun plans to step in and do the job itself... The free JVM would be made available via Apple's App Store marketplace for third-party applications.&quot;&lt;p&gt;&lt;a href=&quot;http://developers.slashdot.org/article.pl?sid=08/03/08/180252&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at Slashdot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotDevelopers?a=WjUVt0&quot;&gt;&lt;img src=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotDevelopers?i=WjUVt0&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://rss.slashdot.org/~r/Slashdot/slashdotDevelopers/~4/248002734&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 08 Mar 2008 21:40:22 +0000</pubDate>
</item>
<item>
	<title>Daring Fireball: The Beauty of 99¢ iPhone Apps</title>
	<guid isPermaLink="false">tag:daringfireball.net,2008:/linked//6.11145</guid>
	<link>http://mooseyard.com/Jens/2008/03/the-beauty-of-99%c2%a2-iphone-apps/</link>
	<description>&lt;p&gt;$.99 or $1.99 is indeed low, but I think Jens Alfke may have a point. It’s not that bigger, serious apps will sell for prices that low, but smaller, simpler apps that might otherwise have been released for free might generate real money with “cup of coffee”-level prices. It’s the App Store that makes this possible.&lt;/p&gt;

&lt;div&gt;
&lt;a href=&quot;http://daringfireball.net/linked/2008/march#fri-07-99_cent&quot; title=&quot;Permanent link to ‘The Beauty of 99¢ iPhone Apps’&quot;&gt; ★ &lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Sat, 08 Mar 2008 03:35:11 +0000</pubDate>
</item>
<item>
	<title>Daring Fireball: Can’t Help Falling in Love</title>
	<guid isPermaLink="false">tag:daringfireball.net,2008:/linked//6.11143</guid>
	<link>http://arstechnica.com/staff/fatbits.ars/2008/03/07/cant-help-falling-in-love</link>
	<description>&lt;p&gt;John Siracusa:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Skilled Mac developers are uniquely positioned to be the first to market with the iPhone applications they’ve been designing in their heads since last year. They know the tools, they know the technology, they even know a lot of the APIs already, and those they don’t know look a lot like the ones they do.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div&gt;
&lt;a href=&quot;http://daringfireball.net/linked/2008/march#fri-07-siracusa&quot; title=&quot;Permanent link to ‘Can’t Help Falling in Love’&quot;&gt; ★ &lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Sat, 08 Mar 2008 03:35:11 +0000</pubDate>
</item>
<item>
	<title>Linux Weekly News: GCC 4.3.0 exposes a kernel bug</title>
	<guid isPermaLink="true">http://lwn.net/Articles/272048/</guid>
	<link>http://lwn.net/Articles/272048/</link>
	<description>&lt;a href=&quot;http://lwn.net/Articles/272048/&quot;&gt;http://lwn.net/Articles/272048/&lt;/a&gt;</description>
	<pubDate>Fri, 07 Mar 2008 22:00:06 +0000</pubDate>
</item>
<item>
	<title>Bob Cringely: Antisocial</title>
	<guid isPermaLink="true">http://www.pbs.org/cringely/pulpit/2008/pulpit_20080307_004467.html</guid>
	<link>http://www.pbs.org/cringely/pulpit/2008/pulpit_20080307_004467.html</link>
	<description>&lt;p&gt;Do you remember Citizens' Band radio?  Though established by the Federal Communications Commission in the 1950s, CB radio didn't become an overnight sensation until the 1970s when Moore's Law brought down the cost of radios to where it was economically viable to buy them solely for the purpose of breaking speed-limit laws.  President Nixon, who liked to wear a blue suit and keep a cozy fire burning in his White House hearth year round no matter what the outside temperature or impact on his (our) air conditioning bill, had decided we all should drive 55 miles per hour or less to save fuel following the energy crisis of 1973.  So, being true Americans, which is to say cranky and prone to complain, we en masse set out to break this new law using as our primary tool CB radio technology to warn us where Smokey was or had recently been or whether there was an eye in the sky.  Criminals bound by a criminal code, we flaunted CB license restrictions (you were supposed to use your Federally assigned call sign from that license you were also supposed to have but never got) and operated under handles like &quot;Thunderchicken&quot; and &quot;Boot-licker.&quot; I was &quot;asciiboy.&quot;  CB radio sales went from zero to tens of millions of units in under two years -- the highest rate of technology adoption ever seen in the U.S. before or since.  Soon there was CB lore and a CB culture.  CB was everywhere.  When not breaking the law with it we were using CB as a huge social network to find the cheapest gas, the best hamburger or even a date for the prom.  And then, quick as it started, CB was gone, worn to the bone from overuse and abuse and left to the truckers as it should have been all along.  What killed CB radio was that moment when its annoyance factor exceeded its utility -- a utility already driven down by low traffic conviction rates and the eventual understanding that if everyone were a speeder then most cops wouldn't stop anyone.&lt;/p&gt;

&lt;p&gt;I am beginning to think that Internet social networking is another CB radio, destined to crash and burn.&lt;/p&gt;

&lt;p&gt;Social networking has a lot of problems as both a business and a cultural phenomenon.  To start with there is generally no true business model.  This can vary a bit from application to application but most are vying simply for eyeballs and hoping for Google ads to pay the bills until Time Warner or News Corp make them an acquisition offer they can't refuse.  That might be okay for Facebook or MySpace and maybe Linked-In, but there are more than 350 general-purpose social networks out there and I will guarantee you that no more than 5 percent of those will be still operating two years from today.&lt;/p&gt;

&lt;p&gt;If you are a social networking entrepreneur and your operation isn't among the top 10, I'd be either looking frantically for an acquirer or turning your site into a social networking aggregator, linking to many others in exactly the way the chat networks appear to be merging while still retaining their individual identities.&lt;/p&gt;

&lt;p&gt;Then there is the annoyance factor, which for me is rapidly accelerating as the major social networks try to establish themselves as hosts for third-party applications.  This would appear to be a no-brainer tactic for the two or three social networks that are likely to survive.  In fact I could argue that what is more likely to survive than most social networks are the truly compelling applications that run upon them, eventually subsuming their hosts.  But in the meantime there is all this annoying crap.  How many groups do you have to join, how many causes do you have to support, how many silly applications do you have to run until you come to realize that you are being included TO DEATH?&lt;/p&gt;

&lt;p&gt;My idea for the perfect Facebook app, for example, is one I call &quot;I've Fallen and I Can't Get Up!&quot;  It's a variation on Twitter that is activated ONLY when one participant needs other participants to call 9-1-1 on his or her behalf.  Maybe it could be linked to a panic button or to your cardiac pacemaker.  The perfect Facebook application, then, is one you hope you'll never have to use.  This is far better than the typical Facebook app, which is overused to the point where people withdraw or simply stop noticing.&lt;/p&gt;

&lt;p&gt;It's not that I don't see value to social networks, it's that I generally don't see ENOUGH value.  Yes, keeping my address book synchronized with reality is nice, but isn't that likely to be shortly absorbed into the operating system or perhaps into networked applications like Gmail and Yahoo Mail?&lt;/p&gt;

&lt;p&gt;This trend has happened over and over as hundreds of portals came and went, leaving a few survivors.  Same for hundreds of search engines, hundreds of free e-mail services, etc., etc.&lt;/p&gt;

&lt;p&gt;Marshall McLuhan argued that obsolete communication technologies survive as art forms.  This is true, I'd say, for Morse code and movable type printing and perhaps even for your venerable Rolodex or typewriter.  But it isn't yet true for CB radio, nor for most Internet technologies.  Maybe they aren't old enough yet to be appreciated.  In the case of CB I think range of reception limits the possible population of players to something less than an artistic critical mass.&lt;/p&gt;

&lt;p&gt;What will likely happen to social networking is that some applications will survive on a more modest basis than now (used by the trucker equivalents), others will morph into some new Next Big Thing as their more compelling sub-applications take over, and true hard-core social networkers will jump to more advanced technologies that eliminate the riff-raff.  In the meantime, 70 percent or so of most social networking functionality -- the really useful functionality -- will be sucked into the dominant portal/search/e-mail/chat/social networks like MSN and Yahoo.&lt;/p&gt;

&lt;p&gt;This next transition will happen faster than most people realize.  Part of this is because Internet product cycles have been shortening for the past several years, so each generation is shorter than the one before.  This hasn't mattered much because the audience has continued to expand.  And even now as Internet growth in terms of new users is slowing, that's more than made up for by the shift of advertising budgets from print and broadcast to the net.  So while the growth in users is decreasing, the growth in total revenue PER user is increasing.  But so is the competition, hence the shorter product cycles.&lt;/p&gt;

&lt;p&gt;The tip-off that we're nearing the end of a cycle is the flight to quality we're seeing from some of the bigger players.  At Facebook, for example, you can no longer register using an e-mail address from an anonymous mail site like Mailinator, Operamail, or Countermail.  Facebook demands that you take an extra three minutes and get a Yahoo Mail or AOL mail address for example.  This is clearly the company pruning its subscribers in anticipation of an acquisition in the next couple quarters.  There is no other reason to do it.  MySpace isn't doing it despite a very real sex offender scandal, but then MySpace has already been sold and Facebook hasn't yet.&lt;/p&gt;

&lt;p&gt;Once Facebook has been taken and one or two others, the golden era of social networking acquisitions will be over and the entrepreneurs will be headed for that Next Big Thing.&lt;/p&gt; 

&lt;p&gt;&quot;Breaker Port 80!  Do you have your ears on?&quot;&lt;/p&gt;</description>
	<pubDate>Fri, 07 Mar 2008 21:58:55 +0000</pubDate>
</item>
<item>
	<title>Mac Rumors: iPhone SDK Reactions and Ongoing Questions</title>
	<guid isPermaLink="true">http://www.macrumors.com/2008/03/07/iphone-sdk-reactions-and-ongoing-questions/</guid>
	<link>http://www.macrumors.com/2008/03/07/iphone-sdk-reactions-and-ongoing-questions/</link>
	<description>The release of the iPhone SDK provided a lot of answers, but has also raised a number of questions, many of which will not be answerable until the iTunes App Store launches in June 2008.&lt;br /&gt;
&lt;br /&gt;
The general sentiment, however, has been quite p...</description>
	<pubDate>Fri, 07 Mar 2008 21:56:30 +0000</pubDate>
</item>
<item>
	<title>Mac Rumors, Page 2: DVD or CD Sharing Setup Update for Mac/PC</title>
	<guid isPermaLink="true">http://www.macrumors.com/2008/03/06/dvd-or-cd-sharing-setup-update-for-mac-pc/</guid>
	<link>http://www.macrumors.com/2008/03/06/dvd-or-cd-sharing-setup-update-for-mac-pc/</link>
	<description>Apple has released DVD or CD Sharing Setup Update for Mac and PC.&lt;p class=&quot;quote&quot;&gt;This update installs software that enables remote disc sharing, system software restoration, and wireless migration with MacBook Air.&lt;/p&gt;&lt;br /&gt;
The Mac version require...&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=O043KnF&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=O043KnF&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=fPaZCBf&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=fPaZCBf&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=LJ0Rlyf&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=LJ0Rlyf&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=E6SiubF&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=E6SiubF&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.macrumors.com/~r/MacRumors-Page2/~4/247043055&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 07 Mar 2008 21:56:05 +0000</pubDate>
</item>
<item>
	<title>Slashdot Developers: Little Demand Yet For Silverlight Developers</title>
	<guid isPermaLink="false">http://developers.slashdot.org/article.pl?sid=08/03/07/1443208&amp;from=rss</guid>
	<link>http://rss.slashdot.org/~r/Slashdot/slashdotDevelopers/~3/247437060/article.pl</link>
	<description>ericatcw writes &quot;At its Mix08 Web development conference, Microsoft said that its Silverlight rich Internet application platform is downloaded and installed an average of 1.5 million times every day; Microsoft has a goal of 200 million installs by midyear. But Silverlight is at the beginning of a long slog towards gaining traction. Computerworld did a quick analysis of job listings at nine popular career sites and found that an average of 41 times more ads mentioned Adobe's Flash than mentioned Silverlight. As expected only 6 months after Silverlight's introduction, the number of programming books carried on Amazon.com was also heavily skewed in favor of Flash.&quot;&lt;p&gt;&lt;a href=&quot;http://developers.slashdot.org/article.pl?sid=08/03/07/1443208&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at Slashdot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotDevelopers?a=difRvl&quot;&gt;&lt;img src=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotDevelopers?i=difRvl&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://rss.slashdot.org/~r/Slashdot/slashdotDevelopers/~4/247437060&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 07 Mar 2008 21:50:23 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Catalyst:  More Lessons in How Not To Write An Application</title>
	<guid isPermaLink="false">http://use.perl.org/~Ovid/journal/35856?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/247305442/35856</link>
	<description>&lt;p&gt;Trying to figure out the source of a method in one of our Catalyst controllers. Our controller inherited from one of our controller base classes.  That, in turn, inherited from the deprecated &lt;tt&gt;Catalyst::Base&lt;/tt&gt; which, in turn, does nothing but inherit from &lt;tt&gt;Catalyst::Controller&lt;/tt&gt;, which inherits from &lt;em&gt;three&lt;/em&gt; different classes.  Two of those inherit from two classes each, which in turn ...&lt;/p&gt;

&lt;p&gt;Let's see if I can figure this out our inheritance heirarchy so I can tell where that method is coming from:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;Our::Controller&lt;br /&gt;    Our::ControllerBase&lt;br /&gt;        Catalyst::Base (deprecated passthrough)&lt;br /&gt;            Catalyst::Controller&lt;br /&gt;                Catalyst::Component&lt;br /&gt;                    Class::Accessor::Fast&lt;br /&gt;                        Class::Accessor&lt;br /&gt;                    Class::Data::Inheritable&lt;br /&gt;                Catalyst::AttrContainer&lt;br /&gt;                    Class::Accessor::Fast&lt;br /&gt;                        Class::Accessor&lt;br /&gt;                    Class::Data::Inheritable&lt;br /&gt;                  Class::Accessor::Fast&lt;br /&gt;                      Class::Accessor&lt;br /&gt;    Catalyst::Controller::REST&lt;br /&gt;        Catalyst::Controller&lt;br /&gt;            Catalyst::Component&lt;br /&gt;                Class::Accessor::Fast&lt;br /&gt;                    Class::Accessor&lt;br /&gt;                Class::Data::Inheritable&lt;br /&gt;            Catalyst::AttrContainer&lt;br /&gt;                Class::Accessor::Fast&lt;br /&gt;                    Class::Accessor&lt;br /&gt;                Class::Data::Inheritable&lt;br /&gt;              Class::Accessor::Fast&lt;br /&gt;                  Class::Accessor&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;Got that?&lt;/p&gt;

&lt;p&gt;On the off chance that you're a Multiple Inheritance fanboy, I don't think I'm going to say anything right now.  I'm on the verge of profanity.  MI is a tool of &lt;em&gt;last&lt;/em&gt; resort (no, I'm not saying it's always the wrong answer).  Today there are so many excellent alternatives that you really have no excuse for using MI other than &quot;I don't like change&quot;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/247305442&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 07 Mar 2008 21:41:53 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: YAPC::NA 2008 CFP Deadline Quickly Approaching</title>
	<guid isPermaLink="false">http://use.perl.org/article.pl?sid=08/03/07/1725220&amp;from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/247518977/article.pl</link>
	<description>The CFP for YAPC::NA 2008 officially ends on March 15th, so get your submissions in soon. Though we actually have had an amazing number of pre-deadline submissions (typically the last few days are when the floodgates open), we could still use some more. There are spots open for talks ranging from 20 minute overviews to longer 90 minute sessions. This year, we are also doing hands-on workshops in the conference center computer lab. Any projects that want to try to recruit some new hackers should sign up for hosting one of these informal learning sessions.&lt;p&gt;&lt;a href=&quot;http://use.perl.org/article.pl?sid=08/03/07/1725220&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at use Perl.&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/247518977&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 07 Mar 2008 21:41:53 +0000</pubDate>
</item>
<item>
	<title>Linux Weekly News: LWN.net Weekly Edition for March 6, 2008</title>
	<guid isPermaLink="true">http://lwn.net/Articles/271240/</guid>
	<link>http://lwn.net/Articles/271240/</link>
	<description>&lt;a href=&quot;http://lwn.net/Articles/271240/&quot;&gt;http://lwn.net/Articles/271240/&lt;/a&gt;</description>
	<pubDate>Thu, 06 Mar 2008 22:00:04 +0000</pubDate>
</item>
<item>
	<title>Focus Shift: Progress</title>
	<guid isPermaLink="true">http://osnews.com/story/19435/Progress</guid>
	<link>http://osnews.com/story/19435/Progress</link>
	<description>&lt;center&gt;&lt;img src=&quot;http://www.osnews.com/images/comics/progress.jpg&quot; title=&quot;Progress.&quot; height=&quot;502&quot; width=&quot;500&quot; alt=&quot;Progress.&quot; border=&quot;1&quot; /&gt;&lt;/center&gt;</description>
	<pubDate>Thu, 06 Mar 2008 21:59:48 +0000</pubDate>
	<author>donotreply@osnews.com (Thom Holwerda)</author>
</item>
<item>
	<title>Annotated CPAN: Net::HTTPServer</title>
	<guid isPermaLink="true">http://annocpan.org/~REATMON/Net-HTTPServer-1.1.1/lib/Net/HTTPServer.pm#note_1832</guid>
	<link>http://annocpan.org/~REATMON/Net-HTTPServer-1.1.1/lib/Net/HTTPServer.pm#note_1832</link>
	<description>&lt;p&gt;Net::HTTPServer does not handle large responses. To enable this support by breaking up large responses, change the _send function within:
if (ref($data) eq &quot;&quot;) { ...&lt;/p&gt;
&lt;p&gt;to:
if (ref($data) eq &quot;&quot;) 
{
        if (length($data) &amp;gt; 1024) {
                my @data_chunks = unpack &quot;a1024&quot; x ((length($data)/1024)-1) . &quot;a*&quot;, $data;
                foreach my $chunk (@data_chunks) {
                        $self-&amp;gt;_debug(&quot;SEND&quot;,&quot;_send: $chunk&quot;);
                        return unless defined($self-&amp;gt;_send_data($sock,$chunk));
                }
        }
        else {
                $self-&amp;gt;_debug(&quot;SEND&quot;,&quot;_send: $data&quot;);
                return unless defined($self-&amp;gt;_send_data($sock,$data));
        }
}
&lt;/p&gt;</description>
	<pubDate>Thu, 06 Mar 2008 21:59:02 +0000</pubDate>
</item>
<item>
	<title>Annotated CPAN: Regexp::Common</title>
	<guid isPermaLink="true">http://annocpan.org/~ABIGAIL/Regexp-Common-2.120/lib/Regexp/Common.pm#note_1831</guid>
	<link>http://annocpan.org/~ABIGAIL/Regexp-Common-2.120/lib/Regexp/Common.pm#note_1831</link>
	<description>&lt;p&gt;See also: &lt;a href=&quot;http://annocpan.org/perldoc?Regexp::Common::Email::Address&quot;&gt;Regexp::Common::Email::Address&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Thu, 06 Mar 2008 21:59:02 +0000</pubDate>
</item>
<item>
	<title>Josh McAdams: Perl @ Flourish</title>
	<guid isPermaLink="true">http://use.perl.org/~jmcada/journal/35847?from=rss</guid>
	<link>http://use.perl.org/~jmcada/journal/35847?from=rss</link>
	<description>The organizers of &lt;a href=&quot;http://www.flourishconf.com/&quot;&gt;Flourish&lt;/a&gt; are of course looking for attendees for their conference, but they are also looking for something else... top-notch Perl web developers.  They are having a web programming showdown using a variety of languages and frameworks.  Perl is on the list, but is currently under-represented.  They are looking to invite the best-of-the-best in each language, preferably people who are noted contributors to the particular language or platform that they'll be developing in.  Because of this demanding criteria, they are willing to talk about helping out with travel, etc.  Please contact me, Josh McAdams (joshua dot mcadams at gmail dot com) if you are interested.</description>
	<pubDate>Thu, 06 Mar 2008 21:58:56 +0000</pubDate>
</item>
<item>
	<title>Planet Mozillazine: Asa Dotzler: &quot;activities&quot; for firefox</title>
	<guid isPermaLink="true">http://weblogs.mozillazine.org/asa/archives/2008/03/activities_for.html</guid>
	<link>http://weblogs.mozillazine.org/asa/archives/2008/03/activities_for.html</link>
	<description>&lt;p&gt;If you didn't think think IE 8's &quot;activities&quot; were a derivative of Mozilla's microformats work then check out &lt;a href=&quot;http://www.kaply.com/weblog/2008/03/05/microsoft-activities-for-firefox/&quot;&gt;Mike Kapley's add-on&lt;/a&gt;. &lt;/p&gt;</description>
	<pubDate>Thu, 06 Mar 2008 21:58:18 +0000</pubDate>
</item>
<item>
	<title>Planet Mozillazine: Gervase Markham: Breathtaking UI Award: Linksys</title>
	<guid isPermaLink="true">http://weblogs.mozillazine.org/gerv/archives/2008/03/breathtaking_ui_award_linksys.html</guid>
	<link>http://weblogs.mozillazine.org/gerv/archives/2008/03/breathtaking_ui_award_linksys.html</link>
	<description>&lt;p&gt;Six months ago I had to set up a Linksys Access Point (WAP54G) as a wireless repeater in my house, to get the wireless signal from my Wireless-G Broadband Router (WRT54G) to reach the attic. It was a painful process, and the main reason it was painful was trying to get the correct value on the repeater for the setting labelled &quot;Remote Access Point's LAN MAC Address&quot;. This is how it knows where to send all the relayed traffic to.&lt;/p&gt;

&lt;p&gt;How hard can this be? You go to your WRT54G router, click &quot;Status&quot;, and there it is: a field labelled &quot;MAC Address&quot;. Just copy that in, right? However, that's the MAC address for the wired side. So, despite the fact that the field is labelled &quot;LAN MAC address&quot;, if you enter the MAC address the router uses on the LAN, nothing works! It's not the &quot;LAN MAC Address&quot; at all - it's precisely the other one, the MAC address from the Status/Wireless subtab. Doh! A &quot;Breathtaking UI&quot; award to Linksys, I think.&lt;/p&gt;

&lt;p&gt;(This is a bit geeky, but I also want to document it to try and avoid anyone else having to suffer through this.)&lt;/p&gt;</description>
	<pubDate>Thu, 06 Mar 2008 21:58:14 +0000</pubDate>
</item>
<item>
	<title>Perl Buzz Mechanix: Devel::NYTProf is the hot new profiler in town</title>
	<guid isPermaLink="true">http://perlbuzz.com/mechanix/2008/03/develnytprof-is-the-hot-new-pr.html</guid>
	<link>http://perlbuzz.com/mechanix/2008/03/develnytprof-is-the-hot-new-pr.html</link>
	<description>&lt;p&gt;
Adam Kaplan has released a cool new profiling tool, &lt;a href=&quot;http://search.cpan.org/dist/Devel-NYTProf/&quot;&gt;Devel::NYTProf&lt;/a&gt;.  It's apparently taken the formatting beauty of &lt;a href=&quot;http://search.cpan.org/dist/Devel-Coverf/&quot;&gt;Devel::Cover&lt;/a&gt;, the code test coverage tool, and used it to identify hotspots in your code.  The results are beautiful: &lt;a href=&quot;http://graphics8.nytimes.com/images/blogs/open/05screenshotindex.png&quot;&gt;Overview&lt;/a&gt; and &lt;a href=&quot;http://graphics8.nytimes.com/images/blogs/open/05screenshotprofile.png&quot;&gt;module-level detail&lt;/a&gt;.  There's also a report writer that provides CSV output and lets you create your own output in your own format.
&lt;/p&gt;
&lt;p&gt;
I ran into a divide-by-zero error that I patched in my local copy, but other than that the results seem good.  I look forward to whatever other improvements come.  I'm also glad it's been &lt;a href=&quot;http://perlbuzz.com/2008/03/more-companies-openly-supporting-perl-projects.html&quot;&gt;released with the support of the New York Times&lt;/a&gt;.
&lt;/p&gt;</description>
	<pubDate>Thu, 06 Mar 2008 21:56:25 +0000</pubDate>
</item>
<item>
	<title>Other Chris Dolans: First You Need Enlightenment and Then You Need Atonement</title>
	<guid isPermaLink="true">http://cosmos-liturgy-sex.com/2008/03/06/first-you-need-enlightenment-and-then-you-need-atonement/</guid>
	<link>http://cosmos-liturgy-sex.com/2008/03/06/first-you-need-enlightenment-and-then-you-need-atonement/</link>
	<description>In January, Shelray did a post about a San Francisco man suing a Catholic Hospital in Daly City for refusing to give him a sex change operation. Well apparently the hospital caved under the pressure of a court order according to an EWTN feed from CWN. This is most unfortunate but I suppose that it is encouraging that they resisted to start with. However, what is problematic is that the hospital is said to have released the following statement: “We regret any confusion that may have come from th</description>
	<pubDate>Thu, 06 Mar 2008 21:56:10 +0000</pubDate>
</item>
<item>
	<title>Mac Rumors, Page 2: Apple Preparing 10.4.12 Update For Tiger?</title>
	<guid isPermaLink="true">http://www.macrumors.com/2008/03/05/apple-preparing-10-4-12-update-for-tiger/</guid>
	<link>http://www.macrumors.com/2008/03/05/apple-preparing-10-4-12-update-for-tiger/</link>
	<description>Macenstein percolates a rumor that Apple is preparing a final update to Mac OS 10.4 &quot;Tiger&quot;, bringing the system version to 10.4.12.&lt;p class=&quot;quote&quot;&gt;We have it on good authority (meaning this is a rumor, and “good authority” could mean anything) that...&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=FMygDBF&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=FMygDBF&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=UqBPejf&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=UqBPejf&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=aoH1Egf&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=aoH1Egf&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=gThQ00F&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=gThQ00F&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.macrumors.com/~r/MacRumors-Page2/~4/246451798&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 06 Mar 2008 21:56:04 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Announcing IrishPulse</title>
	<guid isPermaLink="false">http://taint.org/2008/03/06/124737a.html</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/246709681/124737a.html</link>
	<description>&lt;p&gt;As &lt;a href=&quot;http://taint.org/2008/02/26/121227a.html&quot;&gt;I previously threatened&lt;/a&gt;, I’ve
gone ahead and created a “Microplanet” for Irish twitterers, similar to
Portland’s &lt;a href=&quot;http://pulseofpdx.com/&quot;&gt;Pulse of PDX&lt;/a&gt; — an aggregator of the
“stream of consciousness” that comes out of our local Twitter community: &lt;strong&gt;&lt;a href=&quot;http://irishpulse.taint.org/&quot;&gt;IrishPulse&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here’s what you can do:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add yourself&lt;/strong&gt;: if you’re an Irish Twitter user, &lt;a href=&quot;http://twitter.com/irishpulse&quot;&gt;follow the user ‘irishpulse’&lt;/a&gt;.  This will add you to the sources list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publicise it&lt;/strong&gt;: feel free to pass on the URL to other Irish Twitter users, and blog about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read it&lt;/strong&gt;: bookmark and take a look now and again!&lt;/p&gt;

&lt;p&gt;In terms of implementation, it’s just a (slightly patched) copy of
&lt;a href=&quot;http://intertwingly.net/code/venus/&quot;&gt;Venus&lt;/a&gt; and a perl script using
&lt;a href=&quot;http://search.cpan.org/dist/Net-Twitter/&quot;&gt;Net::Twitter&lt;/a&gt; to generate an OPML file
of the Twitter followers.  &lt;a href=&quot;http://taint.org/wk/PulseSource&quot;&gt;Here’s the source&lt;/a&gt;.  I’d love to see more “Pulse” sites using this…&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/246709681&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 06 Mar 2008 21:43:49 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: More companies openly supporting Perl projects</title>
	<guid isPermaLink="false">tag:perlbuzz.com,2008://1.362</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/246561362/more-companies-openly-supporting-perl-projects.html</link>
	<description>&lt;p&gt;
More companies are showing their support for open source projects, and I couldn't be happier about it.
&lt;/p&gt;
&lt;p&gt;
Those of you following &lt;a href=&quot;http://use.perl.org/~Ovid/journal/&quot;&gt;Ovid's blog on use.perl.org&lt;/a&gt;, or reading his code improvements in the &lt;a href=&quot;http://lists.cpan.org/showlist.cgi?name=perl-qa&quot;&gt;perl-qa mailing list&lt;/a&gt;, should give thanks to the &lt;a href=&quot;http://bbc.co.uk/&quot;&gt;BBC&lt;/a&gt; for supporting his Perl work.  It's not all philanthropic, of course, since the BBC wants good tools for themselves, but I love that they're letting Ovid hitch his stories to the BBC wagon.  That helps give Perl some credence in the eyes of open source skeptics.
&lt;/p&gt;
&lt;p&gt;
Now, as you readers of &lt;a href=&quot;http://perlbuzz.com/mechanix/&quot;&gt;Mechanix&lt;/a&gt; know, &lt;a href=&quot;http://perlbuzz.com/mechanix/2008/03/develnytprof-is-the-hot-new-pr.html&quot;&gt;Devel::NYTProf is the hot new profiler in town&lt;/a&gt;.  Not only is the New York Times allowing code to be released, it turns out there's a blog, &lt;a href=&quot;http://open.blogs.nytimes.com/&quot;&gt;open.blogs.nytimes.com&lt;/a&gt;, where &lt;a href=&quot;http://open.blogs.nytimes.com/2008/03/05/the-new-york-times-perl-profiler/&quot;&gt;Adam Kaplan announced the module&lt;/a&gt;.  I love that a company that's not (exactly) in the software business is blogging about their open source software work.  Let's hope it's a light in the darkness that others will lend their illumination to as well.
&lt;/p&gt;

        
    &lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PerlBuzz/~4/246554808&quot; height=&quot;1&quot; /&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/246561362&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 06 Mar 2008 21:43:49 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Throttling qmail</title>
	<guid isPermaLink="false">http://blog.plover.com/2008/03/06#qmail-throttle</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/246872631/06</link>
	<description>This may well turn out to be another oops.  Sometimes when I screw
around with the mail system, it's a big win, and &lt;a href=&quot;http://blog.plover.com/oops/multiple-connections.html&quot;&gt;sometimes it's a big
lose&lt;/a&gt;.  I don't know yet how this will turn out.&lt;p&gt;

Since I moved house, I have all sorts of internet-related problems
that I didn't have before.  I used to do business with a small ISP,
and I ran my own web server, my own mail service, and so on.  When
something was wrong, or I needed them to do something, I called or
emailed and they did it.  Everything was fine.&lt;/p&gt;&lt;p&gt;

Since moving, my ISP is Verizon.  I have great respect for Verizon as a
provider of telephone services.  They have been doing it for over a
hundred years, and they are good at it.  Maybe in a hundred years they
will be good at providing computer network services too.  Maybe it
will take less than a hundred years.  But I'm not as young as I once
was, and whenever that glorious day comes, I don't suppose I'll be around
to see it.&lt;/p&gt;&lt;p&gt;

One of the unexpected problems that arose when I switched ISPs was
that Verizon helpfully blocks incoming access to port 80.  I had moved
my blog to outside hosting anyway, because the blog was consuming too
much bandwidth, so I moved the other plover.com web services to the
same place.  There are still some things that don't work, but I'm
dealing with them as I have time.&lt;/p&gt;&lt;p&gt;

Another problem was that a lot of sites now rejected my SMTP
connections.  My address was in a different netblock.  A Verizon DSL
netblock.  Remote SMTP servers assume that anybody who is dumb enough
to sign up with Verizon is also too dumb to run their own MTA.  So any
mail coming from a DSL connection in Verizonland &lt;i&gt;must&lt;/i&gt; be spam,
probably generated by some Trojan software on some infected Windows
box.&lt;/p&gt;&lt;p&gt;

The solution here (short of getting rid of Verizon) is to relay the
mail through Verizon's SMTP relay service.  &lt;tt&gt;mail.plover.com&lt;/tt&gt;
sends to &lt;tt&gt;outgoing.verizon.net&lt;/tt&gt;, and
let &lt;tt&gt;outgoing.verizon.net&lt;/tt&gt; forward the mail to its final
destination.  Fine.&lt;/p&gt;&lt;p&gt;

But but but. &lt;/p&gt;&lt;p&gt;

If my machine sends more than &lt;i&gt;X&lt;/i&gt; messages per
&lt;i&gt;Y&lt;/i&gt; time, &lt;tt&gt;outgoing.verizon.net&lt;/tt&gt; will assume that
&lt;tt&gt;mail.plover.com&lt;/tt&gt; has been taken over by a Trojan spam
generator, and cut off access.  All outgoing mail will be rejected with a
permanent failure.&lt;/p&gt;&lt;p&gt;

So what happens if someone sends a message to one of the
500-subscriber email lists that I host here?  &lt;tt&gt;mail.plover.com&lt;/tt&gt;
generates 500 outgoing messages, sends the first hundred or so through
Verizon.  Then Verizon cuts off my mail service.  The mailing list
detects 400 bounce messages, and unsubscribes 400 subscribers.  If any
mail comes in for another mailing list before Verizon lifts my ban,
&lt;i&gt;every&lt;/i&gt; outgoing message will bounce and &lt;i&gt;every&lt;/i&gt; subscriber
will be unsubscribed.&lt;/p&gt;&lt;p&gt;

One solution is to get a better mail provider.  Lorrie has an
Earthlink account that comes with outbound mail relay service.  But
they do the same thing for the same reason.  My Dreamhost subscription
comes with an outbound mail relay service.  But they do the same thing
for the same reason.  My &lt;tt&gt;Pobox.com&lt;/tt&gt; account comes with an
&lt;i&gt;unlimited&lt;/i&gt; outbound mail relay service.  But they require SASL
authentication.  If there's SASL patch for &lt;tt&gt;qmail&lt;/tt&gt;, I haven't been able
to find it.  I could implement it myself, I suppose, but I don't
wanna.&lt;/p&gt;&lt;p&gt;

So far there are at least five solutions that are on the &quot;eh, maybe,
if I have to&quot; list:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;Get a non-suck ISP
  &lt;/li&gt;&lt;li&gt;Find a better mail relay service
  &lt;/li&gt;&lt;li&gt;Hack SASL into &lt;tt&gt;qmail&lt;/tt&gt; and send mail through &lt;tt&gt;Pobox.com&lt;/tt&gt;
  &lt;/li&gt;&lt;li&gt;Do some skanky thing with &lt;tt&gt;serialmail&lt;/tt&gt;
  &lt;/li&gt;&lt;li&gt;Get rid of &lt;tt&gt;qmail&lt;/tt&gt; in favor of postfix, which presumably supports SASL
&lt;/li&gt;&lt;/ul&gt;

(Yeah, I know the Postfix weenies in the audience are shaking their
heads sadly and wondering when the scales will fall from my eyes.
They show up at my door every Sunday morning in their starched white
shirts and their pictures of DJB with horns and a pointy tail...)&lt;p&gt;



It also occurred to me in the shower this morning that the old ISP might be
willing to sell me mail relaying and nothing else, for a small fee.
That might be worth pursuing.  It's gotta be easier than turning &lt;tt&gt;qmail-remote&lt;/tt&gt;
into a
SASL mail client.&lt;/p&gt;&lt;p&gt;




The &lt;tt&gt;serialmail&lt;/tt&gt; thing is worth a couple of sentences, because there's an
autoresponder on the &lt;tt&gt;qmail-users&lt;/tt&gt; mailing-list that replies with &quot;Use &lt;tt&gt;serialmail&lt;/tt&gt;.  This is discussed
in the archives.&quot; whenever someone says the word &quot;throttle&quot;.  The &lt;tt&gt;serialmail&lt;/tt&gt;
suite, also written by Daniel J. Bernstein, takes a
maildir-format directory and posts every message in it to some remote
server, one message at a time.  Say you want to run &lt;tt&gt;qmail&lt;/tt&gt; on your laptop.
Then you arrange to have &lt;tt&gt;qmail&lt;/tt&gt; deliver all its mail into a maildir, and
then when your laptop is connected to the network, you run &lt;tt&gt;serialmail&lt;/tt&gt;, and it
delivers the mail from the maildir to your mail relay host.  &lt;tt&gt;serialmail&lt;/tt&gt; is
good for some throttling problems.  You can run &lt;tt&gt;serialmail&lt;/tt&gt; under control of a
daemon that will cut off its network connection after it has written a
certain amount of data, for example.  But there seems to be no easy
way to do what I want with &lt;tt&gt;serialmail&lt;/tt&gt;, because it always wants to deliver
&lt;i&gt;all&lt;/i&gt; the messages from the maildir, and I want it to deliver
&lt;i&gt;one&lt;/i&gt; message.&lt;/p&gt;&lt;p&gt;

There have been some people on the &lt;tt&gt;qmail-users&lt;/tt&gt; mailing-list asking for something close to
what I want, and sometimes the answer was &quot;&lt;tt&gt;qmail&lt;/tt&gt; was designed to deliver
mail as quickly and efficiently as possible, so it won't do what you
want.&quot;  This is a variation of &quot;Our software doesn't do what you want,
so I'll tell you that you shouldn't want to do it.&quot;  That's another
rant for another day.  Anyway, I shouldn't badmouth &lt;tt&gt;qmail-users&lt;/tt&gt; mailing-list, because the
archives did get me what I wanted.  It's only a stopgap solution, and
it might turn out to be a big mistake, but so far it seems okay, and
so at last I am coming to the point of this article.&lt;/p&gt;&lt;p&gt;

I hacked &lt;tt&gt;qmail&lt;/tt&gt; to support outbound message rate throttling.  Following &lt;a href=&quot;http://www.gossamer-threads.com/lists/qmail/users/121426#121426&quot;&gt;a
suggestion of Richard Lyons&lt;/a&gt; from the &lt;tt&gt;qmail-users&lt;/tt&gt; mailing-list, it was much easier to do than I had
initially thought.&lt;/p&gt;&lt;p&gt;

Here's how it works.  Whenever &lt;tt&gt;qmail&lt;/tt&gt; wants to try to deliver a message to
a remote address, it runs a program called &lt;tt&gt;qmail-remote&lt;/tt&gt;.  &lt;tt&gt;qmail-remote&lt;/tt&gt; is responsible for
looking up the MX records for the host, contacting the right server,
conducting the SMTP conversation, and returning a status code back to
the main component.  Rather than hacking directly on &lt;tt&gt;qmail-remote&lt;/tt&gt;, I've
replaced it with a wrapper.  The real &lt;tt&gt;qmail-remote&lt;/tt&gt; is now in
&lt;tt&gt;qmail-remote-real&lt;/tt&gt;.  The &lt;tt&gt;qmail-remote&lt;/tt&gt; program is now written in Perl.
It maintains a log file recording the times at which the last few
messages were sent.  When it runs, it reads the log file, and a policy
file that says how quickly it is allowed to send messages.  If it is
okay to send another message, the Perl program appends the current
time to the log file and invokes the real &lt;tt&gt;qmail-remote&lt;/tt&gt;.  Otherwise, it sleeps
for a while and checks again.&lt;/p&gt;&lt;p&gt;

The program is not strictly correct.  It has some race conditions.
Suppose the policy limits &lt;tt&gt;qmail&lt;/tt&gt; to sending 8 messages per minute.  Suppose
7 messages have been sent in the last minute.  Then six instances of
&lt;tt&gt;qmail-remote&lt;/tt&gt; might all run at once, decide that it is OK to send a message, and send
one.  Then 13 messages have been sent in the last minute, which
exceeds the policy limit.  So far this has not been much of a
problem.  It's happened twice in the last few hours that the system
sent 9 messages in a minute instead of 8.  If it worries me too much,
I can tell &lt;tt&gt;qmail&lt;/tt&gt; to run only one &lt;tt&gt;qmail-remote&lt;/tt&gt; at a time, instead of 10.  On a normal
&lt;tt&gt;qmail&lt;/tt&gt; system, &lt;tt&gt;qmail&lt;/tt&gt; speeds up outbound delivery by running multiple &lt;tt&gt;qmail-remote&lt;/tt&gt;
processes concurrently.  On my crippled system, speeding up outbound
delivery is just what I'm trying to avoid.  Running at most one &lt;tt&gt;qmail-remote&lt;/tt&gt; at
a time will cure all race conditions.  If I were doing the project
over, I think I'd take out all the file locking and such, and just run
one &lt;tt&gt;qmail-remote&lt;/tt&gt;.   But I didn't think of it in time, and for now I think I'll
live with the race conditions and see what happens.&lt;/p&gt;&lt;p&gt;

So let's see?  What else is interesting about this program?  I made
at least one error, and almost made at least one more.&lt;/p&gt;&lt;p&gt;



The almost-error was this:  The original design for the program was
something like:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;        do
  &lt;ul&gt;
  &lt;li&gt;        lock the history file, read it, and unlock it
  &lt;/li&gt;&lt;/ul&gt;
        until it's time to send a message

&lt;/li&gt;&lt;li&gt;        lock the history file, update it, and unlock it

&lt;/li&gt;&lt;li&gt;        send the message
&lt;/li&gt;&lt;/ol&gt;

This is a classic mistake in writing programs that run concurrently
and update a file.  The problem is that process &lt;i&gt;A&lt;/i&gt;
update the file after  process &lt;i&gt;B&lt;/i&gt; reads but before &lt;i&gt;B&lt;/i&gt;
updates it.  Then &lt;i&gt;B&lt;/i&gt;'s update will destroy &lt;i&gt;A&lt;/i&gt;'s.&lt;p&gt;

One way to fix this is to have the processes append to the history
file, but never remove anything from it.  That is clearly not a
sustainable strategy.    Someone must remove expired entries from the
history file.&lt;/p&gt;&lt;p&gt;

Another fix is to have the read and the update in the same critical
section:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;        lock the history file
&lt;/li&gt;&lt;li&gt;        do
&lt;ul&gt;&lt;li&gt;          read the history file
&lt;/li&gt;&lt;/ul&gt;        until it's time to send a message

&lt;/li&gt;&lt;li&gt;        update the history file and unlock it
&lt;/li&gt;&lt;li&gt;        send the message
&lt;/li&gt;&lt;/ol&gt;

But that loop could take a long time, during which no other &lt;tt&gt;qmail-remote&lt;/tt&gt; process
can make progress.  I had decided that I wanted to try to retain the
concurrency, and so I wasn't willing to accept this.&lt;p&gt;

Cleaning the history file could be done by a separate process that
periodically locks the file and rewrites it.  But instead, I have the &lt;tt&gt;qmail-remote&lt;/tt&gt;
processes to it on the fly:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;        do
&lt;ul&gt;&lt;li&gt;          lock the history file, read it, and unlock it
&lt;/li&gt;&lt;/ul&gt;        until it's time to send a message

&lt;/li&gt;&lt;li&gt;        lock the history file, read it, update it, and unlock it

&lt;/li&gt;&lt;li&gt;        send the message
&lt;/li&gt;&lt;/ol&gt;

I'm happy that I didn't actually make this mistake.  I only thought
about it.&lt;p&gt;

Here's a mistake that I &lt;i&gt;did&lt;/i&gt; make.    This is the block of code
that sleeps until it's time to send the message:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;pre&gt;          while (@last &amp;gt;= $msgs) {
            my $oldest = $last[0];
            my $age = time() - $oldest;
            my $zzz = $time - $age + int(rand(3));
            $zzz = 1 if $zzz  1;
       #    Log(&quot;Sleeping for $zzz secs&quot;);
            sleep $zzz;
            shift @last while $last[0] &amp;lt; time() - $time;
            load_policy();
          }
&lt;/pre&gt;

The throttling
policy is expressed by two numbers, &lt;tt&gt;$msgs&lt;/tt&gt; and &lt;tt&gt;$time&lt;/tt&gt;,
and the program tries to send no more than &lt;tt&gt;$msgs&lt;/tt&gt; messages per
&lt;tt&gt;$time&lt;/tt&gt; seconds.  The &lt;tt&gt;@last&lt;/tt&gt; array contains a list of
Unix epoch timestamps of the times at which the messages of the last
&lt;tt&gt;$time&lt;/tt&gt; seconds were sent.
So the loop condition checks to see if fewer than &lt;tt&gt;$msgs&lt;/tt&gt;
messages were sent in the last &lt;tt&gt;$time&lt;/tt&gt; seconds.  If not, the
program continues immediately, possibly posting its message.  (It
rereads the history file first, in case some other messages have been
posted while it was asleep.)
&lt;p&gt;

Otherwise the program will sleep for a while.  The first three lines
in the loop calculate how long to sleep for.  It sleeps until the time
the oldest message in the history will fall off the queue, possibly
plus a second or two.  Then the crucial line:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;pre&gt;            shift @last while $last[0] &amp;lt; time() - $time;
&lt;/pre&gt;

which discards the expired items from the history.  Finally, the call
to &lt;tt&gt;load_policy()&lt;/tt&gt; checks to see if the policy has changed, and
the loop repeats if necessary.&lt;p&gt;

The bug is in this crucial line.  if &lt;tt&gt;@last&lt;/tt&gt; becomes  empty,
this line turns into an infinite busy-loop.  It should have been:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;pre&gt;            shift @last while @last &amp;amp;&amp;amp; $last[0] &amp;lt; time() - $time;
&lt;/pre&gt;

Whoops.  I noticed this this morning when my system's load was around
12, and eight or nine &lt;tt&gt;qmail-remote&lt;/tt&gt; processes were collectively eating 100% of
the CPU.  I would have noticed sooner, but outbound deliveries hadn't
come to a complete halt yet.&lt;p&gt;

Incidentally, there's another potential problem here arising from the
concurrency.  A process will complete the sleep loop in at most
&lt;tt&gt;$time&lt;/tt&gt;+3 seconds. But then it will go back and reread the history
file, and it may have to repeat the loop.  This could go on
indefinitely if the system is busy.  I can't think of a good way to
fix this without getting rid of the concurrent &lt;tt&gt;qmail-remote&lt;/tt&gt; processes.&lt;/p&gt;&lt;p&gt;

&lt;a href=&quot;http://pic.blog.plover.com/Unix/qmail-throttle/qmail-remote-throttle&quot;&gt;Here's the code&lt;/a&gt;.  I
hereby place it in the public domain.  It was written between 1 AM and
3 AM last night, so don't expect too much.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/246872631&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 06 Mar 2008 21:43:49 +0000</pubDate>
</item>
<item>
	<title>Surfin Safari: The Acid 3 Test</title>
	<guid isPermaLink="true">http://webkit.org/blog/158/the-acid-3-test/</guid>
	<link>http://webkit.org/blog/158/the-acid-3-test/</link>
	<description>&lt;p&gt;The &lt;a href=&quot;http://acid3.acidtests.org/&quot;&gt;Acid 3 Test&lt;/a&gt; has been &lt;a href=&quot;http://www.webstandards.org/press/releases/20080303/&quot;&gt;officially released&lt;/a&gt;.  The test has been in development for some time, with much of that development happening in the open.&lt;/p&gt;
&lt;p&gt;The Acid 3 test is far more complex than the Acid 2 test.  It covers a wider range of standards and consists of many more individual tests.  Browsers have to render a sequence of boxes that display dynamically in a stairstep pattern.  For every cluster of tests passed successfully, the boxes will fill in with a color, which signifies that all of the tests covered by that block have passed.&lt;/p&gt;
&lt;p&gt;If you run Acid 3 on the shipping versions of current browsers (Firefox 2, Safari 3, Opera 9, IE7), you’ll see that they all score quite low.  For example Safari 3 scores a 39/100.  This percentage score is a bit misleading however.  The situation with all four browser engines really isn’t that bad.&lt;/p&gt;
&lt;p&gt;You can think of the Acid 3 test as consisting of 100 individual test suites.  In order for a browser engine to claim one of these precious 100 points, it has to pass a whole battery of tests around a specific standard.  In other words it’s like the browser is being asked to take 100 separate exams and score an A+ on each test in order to get any credit at all.  &lt;/p&gt;
&lt;p&gt;The reality is that all of the browsers are doing much better than their scores would have you believe, since the engines are often passing a majority of the subtests and experiencing minor failures that cost them the point for that section.&lt;/p&gt;
&lt;p&gt;Shipping Safari scores a 39/100 with some significant rendering errors.  We’ve been working hard since the test surfaced and are pleased to report that we’ve entered the “A” range on the test with a score of 90/100.  &lt;/p&gt;
&lt;p&gt;So what did we fix to gain so many points?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://bugs.webkit.org/showdependencytree.cgi?id=17064&quot;&gt;Bug 17064&lt;/a&gt; has all the details, but here are the highlights.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Support for CSS3 Selectors&lt;/b&gt;&lt;br /&gt;
We added support for all of the remaining CSS3 selectors.  These include selectors like nth-child, nth-of-type, last-child, last-of-type, etc.  These selectors were already implemented in KHTML, and the KHTML developers had even kindly provided patches for us in the relevant WebKit bugs.  Therefore it was a simple matter of taking those patches, updating them to the WebKit codebase, and then merging them in.  A big thanks to the KHTML developers for their hard work in this area.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Parsing Bugs&lt;/b&gt;&lt;br /&gt;
WebKit had a number of minor parsing bugs that Acid 3 targeted.  The boxes did not render properly because of an obscure parsing bug that the test exploited (thanks, Hixie).  In addition a number of other parsing bugs kept us from completely passing individual tests.  We have updated our parser to be much closer to the HTML5-specified parsing rules.&lt;/p&gt;
&lt;p&gt;WebKit has also never parsed DOCTYPEs before.  I re-wrote WebKit’s DOCTYPE parsing to match the HTML5 specification, and so now if you put a DOCTYPE into your page it will be present in the DOM.  In addition many bugs centered around proper mode resolution (quirks vs. strict) have now been fixed.  You can document.write a DOCTYPE for example in a new document and have the correct mode be selected.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;SVG&lt;/b&gt;&lt;br /&gt;
Acid3 has many SVG tests.  We’ve been hard at work making these tests pass.  In particular SVG font support and other aspects of the SVG DOM have been tested.  Many of the remaining 10 points are SVG failures.  We’ll be working on SVG animation in order to pass the last few SVG tests.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;DOM&lt;/b&gt;&lt;br /&gt;
Acid3 tests a lot of DOM level 2 features, like traversal and ranges.  It particularly focuses on the “liveness” of objects, e.g., making sure everything updates properly when you dynamically change a document by adding/removing nodes.  Most of our failures in this area had to do with not behaving properly in the presence of these dynamic changes (even though we tended to pass the more static tests).&lt;/p&gt;
&lt;p&gt;Now that we’re closing in on 100%, we’ll be blogging about each fix as it happens, so that you can follow our progress from the blog.&lt;/p&gt;</description>
	<pubDate>Thu, 06 Mar 2008 20:29:55 +0000</pubDate>
</item>
<item>
	<title>Aristotle Pagaltzis: No credit where no credit is due</title>
	<guid isPermaLink="false">urn:uuid:1a8dee3a-eb06-11dc-a302-b36c00dd6d4c</guid>
	<link>http://plasmasturm.org/log/496/</link>
	<description>&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://daringfireball.net/linked/2008/march#wed-05-z&quot; title=&quot;Zeldman on Microsoft’s IE8 Version Targeting Reversal&quot;&gt;John Gruber&lt;/a&gt;&lt;/cite&gt;:&lt;/p&gt;
    &lt;blockquote cite=&quot;http://daringfireball.net/linked/2008/march#wed-05-z&quot;&gt;&lt;p&gt;I do think the &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt; team deserves credit for having floating the idea for opt-in version targeting rather than just going ahead and implementing it.&lt;/p&gt;&lt;/blockquote&gt;
    &lt;p&gt;Err, “floated the idea?” I thought what I read was an announcement of fait accompli. At no time did it strike me as though Microsoft left the issue open-ended. That they subsequently revoked their proclaimed decision came out of left field; would this have been the case if what they first did was in fact merely “floating the idea?”&lt;/p&gt;
    &lt;p&gt;I’m glad that someone inside Microsoft apparently somehow managed to overrule someone else (whoever the people involved are), but I can find no way to interpret Microsoft’s initial course of action as commendable.&lt;/p&gt;
    &lt;p&gt;Furthermore, &lt;a href=&quot;http://meyerweb.com/eric/thoughts/2008/03/04/principles-and-legality/&quot; title=&quot;Eric Meyer: Principles and Legality&quot;&gt;the question Eric Meyer asked&lt;/a&gt; is still open: even though Microsoft reneged on the most objectionable part of the announcement, the fact that &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt; 8 will have three rendering modes, including a frozen-in-time one with all its implications for competitors, still stands.&lt;/p&gt;</description>
	<pubDate>Wed, 05 Mar 2008 22:47:16 +0000</pubDate>
</item>
<item>
	<title>Linux Weekly News: NDISwrapper dodges another bullet</title>
	<guid isPermaLink="true">http://lwn.net/Articles/271762/</guid>
	<link>http://lwn.net/Articles/271762/</link>
	<description>&lt;a href=&quot;http://lwn.net/Articles/271762/&quot;&gt;http://lwn.net/Articles/271762/&lt;/a&gt;</description>
	<pubDate>Wed, 05 Mar 2008 22:00:25 +0000</pubDate>
</item>
<item>
	<title>Adriano Ferreira: Abusing &quot;Memoize&quot;</title>
	<guid isPermaLink="true">http://use.perl.org/~ferreira/journal/35842?from=rss</guid>
	<link>http://use.perl.org/~ferreira/journal/35842?from=rss</link>
	<description>&lt;p&gt;
A few days ago, I was writing a code (namely the &lt;a href=&quot;http://search.cpan.org/dist/Path-Classy&quot;&gt;Path-Classy&lt;/a&gt; dist) and stared at the code that produced the file size in raw bytes or &quot;humanized&quot; (28300 or 28K).
&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;sub _format_size {&lt;br /&gt;  my ($sz, $opt) = @_;&lt;br /&gt; &lt;br /&gt;  my $format = $opt-&amp;gt;{format};&lt;br /&gt;  if ( $format eq 'h' ) {&lt;br /&gt;    require Numbers::Bytes::Human;&lt;br /&gt;    return Number::Bytes::Human-&amp;gt;new-&amp;gt;format( $sz );&lt;br /&gt;  }&lt;br /&gt;  else { # raw bytes&lt;br /&gt;    return $sz;&lt;br /&gt;  }&lt;br /&gt;}&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;
Of course, loading &lt;code&gt;Number::Bytes::Human&lt;/code&gt; and creating a instance every time &lt;code&gt;$f-&amp;gt;size({ format =&amp;gt; 'h' })&lt;/code&gt; was invoked seemed overkill. But saving the &lt;code&gt;N::B::H&lt;/code&gt; into a class/instance variable seemed overkill too: it has nothing to do with &lt;code&gt;Path::Classy&lt;/code&gt; (which are &lt;code&gt; &lt;a href=&quot;http://search.cpan.org/perldoc?Path::Class&quot;&gt;Path::Class&lt;/a&gt; &lt;/code&gt;) objects but for that instant relationship to format a file property, size.
&lt;/p&gt;
&lt;p&gt;
Hey, that's a chance to use &lt;a href=&quot;http://search.cpan.org/perldoc?Memoize&quot;&gt;memoization&lt;/a&gt;, splitting the formatter creation into a function and then memoizing it (so that we don't need to create a [reusable] object with the same capabilities over and over), we come to this code.
&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;use Memoize;&lt;br /&gt; &lt;br /&gt;sub _size_formatter {&lt;br /&gt;  require Number::Bytes::Human;&lt;br /&gt;  return Number::Bytes::Human-&amp;gt;new;&lt;br /&gt;}&lt;br /&gt;memoize('_size_formatter');&lt;br /&gt; &lt;br /&gt;sub _format_size {&lt;br /&gt;  my ($sz, $opt) = @_;&lt;br /&gt; &lt;br /&gt;  my $format = $opt-&amp;gt;{format};&lt;br /&gt;  if ( $format eq 'h' ) {&lt;br /&gt;    return _size_formatter-&amp;gt;format( $sz );&lt;br /&gt;  ...&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;
That looked elegant to me. To make it even more tight (and to require yet another CPAN module ;-) ), using &lt;code&gt; &lt;a href=&quot;http://search.cpan.org/perldoc?Attribute::Memoize&quot;&gt;Attribute::Memoize&lt;/a&gt; &lt;/code&gt; seemed right. It avoids the need to repeat the function name in the &lt;code&gt;memoize&lt;/code&gt; call and it anticipated the wrapping up of the sub to BEGIN time (a free bonus of &lt;code&gt; &lt;a href=&quot;http://search.cpan.org/perldoc?Attribute::Handlers&quot;&gt;Attribute::Handlers&lt;/a&gt; &lt;/code&gt; in the backstage).
&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;use Attribute::Memoize;&lt;br /&gt; &lt;br /&gt;sub _size_formatter :Memoize {&lt;br /&gt;  require Number::Bytes::Human;&lt;br /&gt;  return Number::Bytes::Human-&amp;gt;new;&lt;br /&gt;}&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;
That's it! Efficient code, localized behavior, no need for extra variables. Will people understand that for maintenance? I hope so.
&lt;/p&gt;</description>
	<pubDate>Wed, 05 Mar 2008 21:58:16 +0000</pubDate>
</item>
<item>
	<title>Adam Kennedy: Win32::File::Object - Rounding out the Win32 &quot;experience&quot;</title>
	<guid isPermaLink="true">http://use.perl.org/~Alias/journal/35841?from=rss</guid>
	<link>http://use.perl.org/~Alias/journal/35841?from=rss</link>
	<description>I've had pretty much all the basic modules I need for a while now, which has put a damper on my release rate. No bad thing, since when you are looking after 100+ you tend to end up doing a lot more maintenance and feature additions than new coding.&lt;br /&gt;&lt;br /&gt;I'm by and large completely happy coding Perl on Unix now.&lt;br /&gt;&lt;br /&gt;Unfortunately, as I start to do more coding on Windows (in this case, funky Perl::Dist internals magic) I find myself back in the past a bit.&lt;br /&gt;&lt;br /&gt;Win32::File, for example, is a horrible piece of API ugliness. It's all CamelCase and return-by-param and bit fields. Ugh...&lt;br /&gt;&lt;br /&gt;So here I am again writing simple usability wrappers about code that does the right thing but makes you feel dirty while doing it.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://search.cpan.org/perldoc?Win32::File::Object&quot;&gt;Win32::File::Object&lt;/a&gt; is a wrapper around &lt;a href=&quot;http://search.cpan.org/perldoc?Win32::File&quot;&gt;Win32::File&lt;/a&gt;, which is basically only a thin Perl/XS wrapper around the raw C API.&lt;br /&gt;&lt;br /&gt;So now if you have some code that needs to remove a readonly flag, you can just go...&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Win32::File::Object-&amp;gt;new('file.txt', 'autowrite')-&amp;gt;readonly(0);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The only downside of this module is that my release code can't deal with Windows code, so I'm stuck with an absolutely tortuous release process.&lt;br /&gt;&lt;br /&gt;And given the state of Win32:: I've got a feeling this won't be the first Win32:: module I'm going to be forced to write to feel like a human being when I'm coding on Win32.</description>
	<pubDate>Wed, 05 Mar 2008 21:57:08 +0000</pubDate>
</item>
<item>
	<title>Perl Buzz Mechanix: The worst way to shorten names</title>
	<guid isPermaLink="true">http://perlbuzz.com/mechanix/2008/03/the-worst-way-to-shorten-names.html</guid>
	<link>http://perlbuzz.com/mechanix/2008/03/the-worst-way-to-shorten-names.html</link>
	<description>&lt;p&gt;
Dropping vowels to shorten names is a terrible practice.  Quick, someone give me an idea what &lt;tt&gt;$hdnchgdsp&lt;/tt&gt; means, an Actual Variable from some Bad Code I'm working on today.
&lt;/p&gt;
&lt;p&gt;
It's not just variables names, either.  Filenames often need to be shortened, but dropping vowels is not the way to do it.  You're left with unpronounceable names that are annoying to type.
&lt;/p&gt;
&lt;p&gt;
The key to effective abbreviation is not removal of letters from the middle of the words, but from the end.  Sometimes, it doesn't make sense to shorten a word at all, like &quot;post&quot;. If you have a file that is supposed to &quot;post audit transactions&quot;, call it &quot;post-aud-trans&quot; or &quot;post-aud-trx&quot;, not &quot;pst_adt_trns&quot;.
&lt;/p&gt;</description>
	<pubDate>Wed, 05 Mar 2008 21:56:24 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: hiveminder integration with jott</title>
	<guid isPermaLink="false">http://use.perl.org/~rjbs/journal/35844?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/246361480/35844</link>
	<description>&lt;p&gt; &lt;a href=&quot;http://jott.com/&quot;&gt;Jott&lt;/a&gt; is a really neat service that lets you Do Stuff via
your cell phone.  The default Stuff you can do is &quot;send email and SMS&quot; and
&quot;setup a reminder.&quot;  There's also a very &lt;a href=&quot;http://jott.com/jotters/index.php/developers&quot;&gt;simple
API&lt;/a&gt; for writing your own
applications (called Jott Links).  It works something like this:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;you call the toll-free Jott number&lt;/li&gt; &lt;li&gt;you speak the name of the Jott Link you've set up&lt;/li&gt; &lt;li&gt;you speak a message&lt;/li&gt; &lt;li&gt;Jott issues a web request with data including your id and the message&lt;/li&gt; &lt;li&gt;the service does something and replies to Jott&lt;/li&gt; &lt;li&gt;Jott sends you a reply&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;There are Jott Links for Twitter and other things that I don't care about.
There isn't one for Hiveminder.  Zak Greant made a &lt;a href=&quot;http://jott.com/jotters/index.php/developers&quot;&gt;video demonstrating
Hiveminder and Jott together&lt;/a&gt;,
which has Jott send mail to the task-by-email interface of Hiveminder.  This
isn't bad at all, but it puts all kinds of crap into your task, because Jott
sends pretty chatty email.&lt;/p&gt; &lt;p&gt;I wrote a Jott Link service in about ten minutes (much of which was test time,
waiting for Jott to transcribe my messages).  It uses CGI.pm and
Net::Hiveminder to create a very concise task.  I need to add more features to
it, but I'm in no rush.  I am secretly hoping that the guys at Best Practical
will write a much better version, complete with a user setup link, so that
everyone can use their link, rather than running his own, each on a different
server.&lt;/p&gt; &lt;p&gt;Here's my code:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;BEGIN { $ENV{HOME} = '/home/rjbs' }&lt;br /&gt;use CGI qw(:standard);&lt;br /&gt;use Net::Hiveminder;&lt;br /&gt; &lt;br /&gt;my ($pw, $key) = `cat /home/rjbs/.hiveminder`;&lt;br /&gt;chomp($pw, $key);&lt;br /&gt; &lt;br /&gt;my $hm = Net::Hiveminder-&amp;gt;new(&lt;br /&gt;  email    =&amp;gt; 'user@example.com',&lt;br /&gt;  password =&amp;gt; $pw,&lt;br /&gt;);&lt;br /&gt; &lt;br /&gt;my $user_key = url_param('userKey');&lt;br /&gt;my $message  = url_param('message');&lt;br /&gt; &lt;br /&gt;die unless lc $user_key eq lc $key;&lt;br /&gt;$hm-&amp;gt;create_task(&quot;$message\n via Jott.com&quot;);&lt;br /&gt; &lt;br /&gt;print &quot;Content-type: text/plain\n\nCreated.&quot;;&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;Obviously, this is a horrible hack.  Still, it means I can open my phone, hold
down 5, and dictate todo items right into Hiveminder.&lt;/p&gt; &lt;p&gt;There are a lot of little problems with Jott, some of which strike me as
significant usability issues, but they're all very fixable, and I look forward
to seeing them fixed.  I'll write more about them later.  Here's the one that
irked me the most last night:  Jott says that to write a Jott Link, you should
expect an HTTP POST.  You do, in fact, get a POST, but all of the data is in
the URL query string, not in the content of the request.  Huh?&lt;/p&gt; &lt;p&gt;Well, whatever.  All their problems are fixable, and the service looks like it
will be great.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/246361480&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 05 Mar 2008 21:42:02 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Test::Aggregate 0.07</title>
	<guid isPermaLink="false">http://use.perl.org/~Ovid/journal/35840?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/246096379/35840</link>
	<description>&lt;p&gt;I've just uploaded the new &lt;a href=&quot;http://search.cpan.org/dist/Test-Aggregate/&quot;&gt;Test::Aggregate&lt;/a&gt;.  The only change is that it sets the &lt;tt&gt;$ENV{TEST_AGGREGATE}&lt;/tt&gt; variable to true (for VMS users:  and explicitly deletes it in an END block).  This allows you to do this:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;die &quot;Cannot use $0 in aggregated tests&quot;&lt;br /&gt;  if $ENV{TEST_AGGREGATE};&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;Blew a chunk of time yesterday trying to debug why the aggregated tests were failing.  Now I can add that to some code to ensure that I'll know immediately next time.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/246096379&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 05 Mar 2008 21:42:02 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Fun with IMAP</title>
	<guid isPermaLink="false">http://use.perl.org/~Matts/journal/35839?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/245891014/35839</link>
	<description>So I've been playing with IMAP lately, processing a folder of emails to process. It has been kind of interesting (to say the least).&lt;br /&gt;&lt;br /&gt;Those of you who follow my CPAN uploads know I created Net::IMAP::Simple::NB, which is a subclass of Net::IMAP::Simple but using non-blocking I/O. The idea for that originally was to create a webmail system for AxKit2, but it was also fun learning how IMAP works.&lt;br /&gt;&lt;br /&gt;There are some really interesting corner issues in IMAP that surprise me. For example an IMAP server is expected to be able to parse MIME messages, and be able to provide different components of the body as requested. This seems odd to me as frankly this should be a client task - surely this slows IMAP servers down? Also when you ask for the body structure it maps it in a very odd manner - though perhaps its useful for clients - there seems to be a lot of structure data there that isn't useful. There are some other odd choices too, like dates are provided as &quot;DD-MON-YYYY&quot; rather than the more ISO compliant &quot;YYYY-MM-DD&quot; format, and email addresses are provided pre-parsed, which means if your IMAP server gets it wrong you're screwed (though I guess that isn't too common).&lt;br /&gt;&lt;br /&gt;On the other hand there are some nice things too, like IMAP provides most of its data in an S-expressions-like format, which is quite easy to parse in perl. The RFC is also not as horrible as I had once thought, so decoding various things is reasonably easy. On the other hand, it seems Net::IMAP::Simple is a bit too simplistic, in that it doesn't parse the output formats properly, and honestly doesn't have enough methods in it (I've added 8 methods just for my one simple app).&lt;br /&gt;&lt;br /&gt;I'll have to consider contacting the author about patches. Though I'm unsure right now if I want to have too much to do with it in the long term.&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/245891014&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 05 Mar 2008 21:42:02 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Google’s CAPTCHA - not entirely broken after all?</title>
	<guid isPermaLink="false">http://taint.org/2008/03/05/122732a.html</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/246089744/122732a.html</link>
	<description>&lt;p&gt;A couple of weeks ago, &lt;a href=&quot;http://www.websense.com/securitylabs/blog/blog.php?BlogID=174&quot;&gt;WebSense posted this article&lt;/a&gt; with details of a spammer’s attack on Google’s &lt;a href=&quot;http://en.wikipedia.org/wiki/CAPTCHA&quot;&gt;CAPTCHA&lt;/a&gt; puzzle, using web services running on two centralized servers:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[…] It is observed that two separate hosts active on same domain are contacted during the entire process. These two hosts work collaboratively during the CAPTCHA break process. […]&lt;/p&gt;
  
  &lt;p&gt;Why [use 2 hosts]? Because of variations included in the Google CAPTCHA image, chances are that host 1 may fail breaking the code. Hence, the spammers have a backup or second CAPTCHA-learning host 2 that tries to learn and break the CAPTCHA code. However, it is possible that spammers also use these two hosts to check the efficiency and accuracy of both hosts involved in breaking one CAPTCHA code at a time, with the ultimate goal of having a successful CAPTCHA breaking process.&lt;/p&gt;
  
  &lt;p&gt;To be specific, host 1 has a similar concept that was used to attack Live mail CAPTCHA. This involved extracting an image from a victim’s machine in the form of a bitmap file, bearing BM.. file headers and breaking the code. Host 2 uses an entirely different concept wherein the CAPTCHA image is broken into segments and then sent as a portable image / graphic file  bearing  PV..X file headers as requests. […]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While it doesn’t say as such, &lt;a href=&quot;http://www.codinghorror.com/blog/archives/001067.html?r=9602&quot;&gt;some have read the post to mean that Google’s CAPTCHA has been solved algorithmically&lt;/a&gt;.  I’m pretty sure this isn’t the case.  Here’s why.&lt;/p&gt;

&lt;p&gt;Firstly, the FAQ text that appears on “host 1″ (thanks Alex for the improved translation!):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://taint.org/x/2008/a_012.jpg&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;b&gt;FAQ&lt;/b&gt;&lt;/p&gt;
  
  &lt;p&gt;If you cannot recognize the image or if it doesn’t load (a black or empty image gets displayed), just press Enter.&lt;/p&gt;
  
  &lt;p&gt;Whatever happens, do not enter random characters!!!&lt;/p&gt;
  
  &lt;p&gt;If there is a delay in loading images, exit from your account, refresh the page, and log in again.&lt;/p&gt;
  
  &lt;p&gt;The system was tested in the following browsers: Internet Explorer Mozilla Firefox&lt;/p&gt;
  
  &lt;p&gt;Before each payment, recognized images are checked by the admin. We pay only for correctly recognized images!!!&lt;/p&gt;
  
  &lt;p&gt;Payment is made once per 24 hours. The minimum payment amount is $3. To request payment, send your request to the admin by ICQ. If the admin is free, your request will be processed within 10-15 minutes, and if he is busy, it will be processed as soon as possible.&lt;/p&gt;
  
  &lt;p&gt;If you have any problems (questions), ICQ the admin.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That reads to me a lot like instructions to human &lt;a href=&quot;http://ha.ckers.org/blog/20070427/solving-captchas-for-cash/&quot;&gt;“CAPTCHA farmers”&lt;/a&gt;, working as a distributed team via a web interface.&lt;/p&gt;

&lt;p&gt;Secondly, take a look at the timestamps in this packet trace:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://taint.org/x/2008/a_002.jpg&quot; alt=&quot;img2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The interesting point is that there’s a 40-second gap between the invocation on “Captcha breaking host 1″ and the invocation on “Captcha breaking host 2″.  There is then a short gap of 5 seconds before the invocations occur on the Gmail websites.&lt;/p&gt;

&lt;p&gt;Here’s my theory: “host 1″ is a web service gateway, proxying for a farm of human CAPTCHA solvers. “host 2″, however, is an algorithm-driven server, with no humans involved.  A human may take 40 seconds to solve a CAPTCHA, but pure code should be a lot speedier.&lt;/p&gt;

&lt;p&gt;Interesting to note that they’re running both systems in parallel, on the same data.  By doing this, the attackers can&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;collect training data for a machine-learning algorithm (this is implied by the ‘do not enter random characters!’ warning from the FAQ — they don’t want useless training data)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;collect test cases for test-driven development of improvements to the algorithm&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;measure success/failure rates of their algorithms, “live”, as the attack progresses&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Worth noting this, too:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Observation*: On average, only 1 in every 5 CAPTCHA breaking requests are successfully including both algorithms used by the bot, approximating a success rate of 20%. The second algorithm (segmentation) has very poor performance that sometimes totally fails and returns garbage or incorrect answers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So their algorithm is unreliable, and hasn’t yet caught up with the human farmers.  Good news for Google — and for &lt;a href=&quot;http://ha.ckers.org/blog/20070427/solving-captchas-for-cash/&quot;&gt;the CAPTCHA farmers of Romania&lt;/a&gt; ;)&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/246089744&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 05 Mar 2008 21:42:02 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Perl Foundation needs new members</title>
	<guid isPermaLink="false">tag:perlbuzz.com,2008://1.359</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/246188003/perl-foundation-needs-new-members.html</link>
	<description>&lt;p&gt;
The Perl Foundation needs new blood.  &lt;a href=&quot;http://news.perlfoundation.org/2008/03/tpf_needs_you_nominations_open.html&quot;&gt;Jim Brandt writes&lt;/a&gt;:
&lt;/p&gt;&lt;blockquote&gt;

           &lt;p&gt;Have you ever wanted to get involved in The Perl Foundation, but didn't know how? Well, now's your chance. I'm pleased to announce open self-nominations for the following &lt;span class=&quot;caps&quot;&gt;TPF &lt;/span&gt;roles:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.perlfoundation.org/steering_committee_chair&quot;&gt;Steering Committee Chair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.perlfoundation.org/conferences_committee_roles&quot;&gt;Conferences Committee Chair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.perlfoundation.org/public_relations&quot;&gt;Public Relations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;You can follow the links above to read descriptions of each of the positions. If you think you're a good fit for one or more of them, send me an email at cbrandt at perlfoundation dot org. I'll then invite you to a dedicated wiki we have set up just for the election.&lt;/p&gt;

&lt;p&gt;Once you join the wiki, you'll set up a page to post all of your experience and answer the questions provided in each section above. The wiki is private, but you'll be able to see the other candidate pages, and they'll see yours.&lt;/p&gt;

&lt;p&gt;The deadline to get all of your information in is midnight next Tuesday, March 11. Our committees elect their members, so the Conferences Committee will be voting on the CC chair and the Steering Committee will vote on the chair and PR positions. After we have a chance to look over everyone's information, we vote and select our newest members.&lt;/p&gt;

&lt;p&gt;You only have a week, so don't wait too long. I look forward to hearing from you.&lt;/p&gt;

&lt;/blockquote&gt;
&lt;p&gt;
&lt;a href=&quot;http://martian.org/karen/2008/03/05/problems-with-managing-volunteers/&quot;&gt;Karen Pauley is stepping up to run for Steering Committee chair&lt;/a&gt;, so how about you?  Maybe that's a spot you'd like to work on, or maybe public relations is more up your alley.  This is your chance to help lead TPF lead Perl and Perl development.
&lt;/p&gt;
&lt;p&gt;
Astute followers of TPF will note that the PR spot is open, a spot that I once held.  Yes, I am no longer doing PR for TPF.  I've done that job for a while, and now I'm moving on to do other things, not least of which is this little news called &lt;a href=&quot;http://perlbuzz.com/&quot;&gt;perlbuzz.com&lt;/a&gt;.
&lt;/p&gt;
        
    &lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PerlBuzz/~4/246185303&quot; height=&quot;1&quot; /&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/246188003&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 05 Mar 2008 21:42:02 +0000</pubDate>
</item>
<item>
	<title>Annotated CPAN: Net::HTTPServer</title>
	<guid isPermaLink="true">http://annocpan.org/~REATMON/Net-HTTPServer-1.1.1/lib/Net/HTTPServer.pm#note_1830</guid>
	<link>http://annocpan.org/~REATMON/Net-HTTPServer-1.1.1/lib/Net/HTTPServer.pm#note_1830</link>
	<description>&lt;p&gt;Net::HTTPServer also enables client side certificate checking by default without any built in interface to change this.&lt;/p&gt;
&lt;p&gt;I've added an option to new() to set this on the fly, but as a workaround see line 825 of HTTPServer.pm and change SSL_verify_mode to desired setting:&lt;/p&gt;
&lt;p&gt;0x00 - no verification
0x01 - verify peer certificate
0x02 - fail verification if no peer certificate exists; ignored for clients
0x04 - verify client once&lt;/p&gt;
&lt;p&gt;for more details on these options see: http://search.cpan.org/~sullr/IO-Socket-SSL-1.13/SSL.pm&lt;/p&gt;</description>
	<pubDate>Tue, 04 Mar 2008 21:58:51 +0000</pubDate>
</item>
<item>
	<title>Other Chris Dolans: So, about that freedom of religion mentioned in the Constitution...</title>
	<guid isPermaLink="true">http://agangershome.blogspot.com/2008/03/so-about-that-freedom-of-religion.html</guid>
	<link>http://agangershome.blogspot.com/2008/03/so-about-that-freedom-of-religion.html</link>
	<description>Guess it's another case of all animals being equal, some are more equal than others. Phooey!  Daly City, CA, Mar 4, 2008 / 04:19 am (CNA).- A Catholic hospital that refused to allow its facilities to be used for breast implant surgery on a man that had undergone a sex-change operation will now allow the procedure, the California Catholic Daily reports.  In 2006 a doctor told Charlene Hastings, 57, that Seton Medical Center in Daly City would not allow him to perform breast-enhancement surgery on</description>
	<pubDate>Tue, 04 Mar 2008 21:56:19 +0000</pubDate>
</item>
<item>
	<title>Slashdot Apple: Paypal Advises Users To Stop Using Safari</title>
	<guid isPermaLink="false">http://it.slashdot.org/article.pl?sid=08/03/03/2049205&amp;from=rss</guid>
	<link>http://rss.slashdot.org/~r/Slashdot/slashdotApple/~3/245157677/article.pl</link>
	<description>eldavojohn writes &quot;Over concerns for lack of an anti-phishing mechanism for Safari, Paypal is telling its Mac users to use another browser. An author from Ars Technica reveals that he has been using Camino and has fallen victim to a Paypal related phishing scam via e-mail so this story must hit home for him. 'Currently the Apple browser does not alert users to sites that could be phishing for your info, and it lacks support for Extended Validation. PayPal is, of course, a popular site among phishers in their neverending search for personal information, user IDs, and passwords. While it's not entirely fair singling out Safari (other Mac browsers like Camino also lack this support), it is perhaps at least a helpful reminder of the threat.'&quot;&lt;p&gt;&lt;a href=&quot;http://it.slashdot.org/article.pl?sid=08/03/03/2049205&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at Slashdot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotApple?a=2JkNIo&quot;&gt;&lt;img src=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotApple?i=2JkNIo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://rss.slashdot.org/~r/Slashdot/slashdotApple/~4/245157677&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 04 Mar 2008 21:50:29 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: hiveminder and imap, now sharing a bed</title>
	<guid isPermaLink="false">http://use.perl.org/~rjbs/journal/35829?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/245164335/35829</link>
	<description>&lt;p&gt;Today, Best Practical announced &lt;a href=&quot;http://bestpractical.typepad.com/worst_impractical/2008/03/post.html&quot;&gt;IMAP access to
Hiveminder&lt;/a&gt;.
It's way cool, and I'm sure I'll end up making a lot of improvement to my mutt
configuration tools to make the most of it.  You can check out their blog post
or documentation for more information, but basically you point your IMAP client
at Hiveminder and you can see your todo list.  You can drop new tasks (in the
form of email from elsewhere) into inbound folders and you can move existing
tasks into other folders to cause them to become hidden or complete.  There's a
bit more to it, but that's the gist.&lt;/p&gt; &lt;p&gt;My IMAP client of choice is
&lt;a href=&quot;http://software.complete.org/offlineimap&quot;&gt;OfflineIMAP&lt;/a&gt;, as I've said many
times before.  It's the easiest way for me to use mutt with IMAP, whether
online or off.  Unfortunately, it has a really stupid bug.  Every message in an
IMAP account has a unique id (the UID), which is useful for doing
synchronization.  It lets you figure out that you've moved a message from one
place to another in your offline store.  OfflineIMAP doesn't seem to keep the
same UID on messages that have moved from one folder to another, which made it
impossible to use the IMAP interface to mark a message done or hidden.&lt;/p&gt; &lt;p&gt;As usual, the guys at Hiveminder were quick to sort this out, making their
correct software cope with my twitchy software.&lt;/p&gt; &lt;p&gt;Now, the folders in which Hiveminder presents your tasks are (I am told) great
for users of GUI MUAs, where they form a nice hierarchy of folders that you can
drill down through.  Here's a summary of the folder layout:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;Actions&lt;br /&gt;  Completed&lt;br /&gt;  Hide for&lt;br /&gt;    Days..&lt;br /&gt;      01 day&lt;br /&gt;      (..more..)&lt;br /&gt;    Months..&lt;br /&gt;      01 month&lt;br /&gt;      (..more..)&lt;br /&gt;  Take&lt;br /&gt;Braindump mailboxes&lt;br /&gt;  []&lt;br /&gt;Groups&lt;br /&gt;  pep&lt;br /&gt;    All tasks&lt;br /&gt;    Everyone else's tasks&lt;br /&gt;    Up for grabs&lt;br /&gt;Help&lt;br /&gt;News&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;Here's what they look like as directories:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;Actions/Completed&lt;br /&gt;Actions/Hide for/Days../01 day&lt;br /&gt;Actions/Hide for/Months../01 month&lt;br /&gt;Actions/Take&lt;br /&gt;Braindump mailboxes/[]&lt;br /&gt;Groups/pep&lt;br /&gt;Groups/pep/All tasks&lt;br /&gt;Groups/pep/Everyone else's tasks&lt;br /&gt;Groups/pep/Up for grabs&lt;br /&gt;Help&lt;br /&gt;News&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;The amount of typing needed to move things around between these folders is a
drag.  Fortunately, OfflineIMAP makes it really simple to map Hiveminder's IMAP
folders into a nice, shallow, easy to type hierarchy.  With my OfflineIMAP
configuration, it looks like this:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt; &lt;tt&gt;./braindump&lt;br /&gt;./braindump.[]&lt;br /&gt;./done&lt;br /&gt;./groups&lt;br /&gt;./groups.pep&lt;br /&gt;./groups.pep.all&lt;br /&gt;.  /groups.pep.avail&lt;br /&gt;./groups.pep.others&lt;br /&gt;./help&lt;br /&gt;./hide.1d&lt;br /&gt;./hide.1m&lt;br /&gt;./inbox&lt;br /&gt;.  /take&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;I need to do a bit of work to make
&lt;a href=&quot;http://rjbs.manxome.org/rubric/entry/1592&quot;&gt;WhichConfig&lt;/a&gt; check &lt;code&gt;$0&lt;/code&gt; (or
something) to notice that I want to use Hiveminder, rather than the &quot;normal&quot;
mail available to it.  Even without having done that, the IMAP interface is
pretty fantastic.  I see a lot of weird Maildir tricks in my future.  Until I
have some to publish, here's my OfflineIMAP configuration for use with
Hiveminder:&lt;/p&gt; &lt;p&gt; &lt;em&gt; &lt;code&gt;.offlineimap&lt;/code&gt; &lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;[general]&lt;br /&gt;pythonfile = ~/.offlineimap/helper.py&lt;br /&gt; &lt;br /&gt;[Account hiveminder]&lt;br /&gt;localrepository = hiveminder_maildir&lt;br /&gt;remoterepository = hiveminder_imap&lt;br /&gt; &lt;br /&gt;[Repository hiveminder_imap]&lt;br /&gt;type = IMAP&lt;br /&gt;remotehost = hiveminder.com&lt;br /&gt;ssl = yes&lt;br /&gt;remoteuser = user@example.com&lt;br /&gt;remotepass = PASSWORD&lt;br /&gt; &lt;br /&gt;nametrans    = lambda foldername: hm_nametrans(foldername)&lt;br /&gt;folderfilter = lambda foldername: hm_folderfilter(foldername)&lt;br /&gt; &lt;br /&gt;[Repository hiveminder_maildir]&lt;br /&gt;type = Maildir&lt;br /&gt;localfolders = ~/Mailhive&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;This relies on a few Python functions stored in another file:&lt;/p&gt; &lt;p&gt; &lt;em&gt; &lt;code&gt;helper.py&lt;/code&gt; &lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;import re&lt;br /&gt; &lt;br /&gt;hide_re = re.compile('^Actions/Hide')&lt;br /&gt;spec_re = re.compile('(?P&amp;lt;n&amp;gt;\d\d) (?P&amp;lt;units&amp;gt;days?|months?)$')&lt;br /&gt; &lt;br /&gt;def hm_folderfilter(folder):&lt;br /&gt;  if folder in ('Actions', 'Groups'): return False&lt;br /&gt; &lt;br /&gt;  if hide_re.search(folder) and not spec_re.search(folder): return False&lt;br /&gt; &lt;br /&gt;  return True&lt;br /&gt; &lt;br /&gt;def hm_nametrans(folder):&lt;br /&gt;  if folder == 'Actions/Completed': return 'done'&lt;br /&gt;  if folder == 'Actions/Take': return 'take'&lt;br /&gt;  if folder == 'Actions/Take': return 'take'&lt;br /&gt; &lt;br /&gt;  folder = re.compile('Braindump mailboxes').sub('braindump', folder)&lt;br /&gt; &lt;br /&gt;  if hide_re.search(folder):&lt;br /&gt;    spec  = spec_re.search(folder)&lt;br /&gt;    n     = int(spec.group('n'))&lt;br /&gt;    units = spec.group('units')&lt;br /&gt; &lt;br /&gt;    return 'hide/%s%s' % (n, units[0:1])&lt;br /&gt; &lt;br /&gt;  if re.compile('^Groups').search(folder):&lt;br /&gt;    folder = re.compile('All tasks').sub('all', folder)&lt;br /&gt;    folder = re.compile('Up for grabs').sub('avail', folder)&lt;br /&gt;    folder = re.compile(&quot;Everyone else's tasks&quot;).sub('others', folder)&lt;br /&gt; &lt;br /&gt;  return folder.lower()&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/245164335&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 04 Mar 2008 21:42:04 +0000</pubDate>
</item>
<item>
	<title>Planet Perl6: Jesse Vincent: We've released the code used to run rt.cpan.org</title>
	<guid isPermaLink="true">http://use.perl.org/~jesse/journal/35833?from=rss</guid>
	<link>http://use.perl.org/~jesse/journal/35833?from=rss</link>
	<description>As part of a recent project to modernize and improve rt.cpan.org, we took the time to clean up and better abstract the various plugins we use on the backend. We've also (finally) moved all the RT extensions that make up the UI to a public SVN repository.&lt;br /&gt;&lt;br /&gt;You can get at the code via svn://svn.bestpractical.com/&lt;br /&gt;&lt;br /&gt;We use the following extensions.&lt;br /&gt;&lt;br /&gt;For authentication:&lt;br /&gt;* RT-Authen-PAUSE&lt;br /&gt;* RT-Authen-Bitcard&lt;br /&gt;* RT-Authen-OpenID&lt;br /&gt;&lt;br /&gt;CPAN specific UI and public bug tracking:&lt;br /&gt;* RT-BugTracker&lt;br /&gt;* RT-BugTracker-Public&lt;br /&gt;* RT-Extension-rt_cpan_org&lt;br /&gt;&lt;br /&gt;Other:&lt;br /&gt;* RT-Extension-MergeUsers&lt;br /&gt;* RT-Extension-QuickDelete&lt;br /&gt;&lt;br /&gt;We also have a set of tools which import info from the PAUSE and&lt;br /&gt;other sources into RT's Database, but we still need to clean those up a bit (removing hardcoded passwords, little things like that) before we can publish them.&lt;br /&gt;&lt;br /&gt;If you've been hankering for a new feature in rt.cpan.org, now's the time to start sending patches. After 3 good patches, we'll grant you a commit bit to the rt.cpan.org extensions. You can start sending your patches to the address listed on the front page of rt.cpan.org&lt;br /&gt;&lt;br /&gt;-jesse</description>
	<pubDate>Tue, 04 Mar 2008 21:42:04 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: returnvalues.useperl.at</title>
	<guid isPermaLink="false">http://use.perl.org/~domm/journal/35834?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/245692520/35834</link>
	<description>&lt;p&gt;I've put up a quick site with the results of &lt;a href=&quot;http://search.cpan.org/dist/Acme-ReturnValue&quot;&gt;Acme::ReturnValue&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt; &lt;a href=&quot;http://returnvalues.useperl.at/&quot;&gt;http://returnvalues.useperl.at&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;This page shows that Acme::ReturnValue is far from perfect because it contains a whole lot of false positives. But there are also some very funny things to be found.&lt;/p&gt;

&lt;p&gt;I'm not sure if I'll spend much more time on Acme::ReturnValue, so I doubt that the website will see any improvements (filters, sorting, links to source code, ..). But I do plan to look at &lt;a href=&quot;http://search.cpan.org/src/ELLIOTJS/Perl-Critic-1.080/lib/Perl/Critic/Policy/Modules/RequireEndWithOne.pm&quot;&gt;Perl::Critic::Policy::Modules::RequireEndWithOne&lt;/a&gt;, as suggested by &lt;a href=&quot;http://use.perl.org/comments.pl?sid=38799&quot;&gt;Chris Dolan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And I will set up a cronjob to generate the site (but probably only once a week - I want to spare those cycles for cpants...)&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/245692520&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 04 Mar 2008 21:42:04 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Module Updates</title>
	<guid isPermaLink="false">http://use.perl.org/~davorg/journal/35830?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/245414523/35830</link>
	<description>&lt;p&gt;I've been a rather slack CPAN author for the last couple of years and haven't been updating my modules as much as I should.&lt;/p&gt;
&lt;p&gt;But over the weekend, whilst updating the &lt;a href=&quot;http://mag-sol.com/train/teachin/&quot;&gt;Teach-In slides&lt;/a&gt; for the &lt;a href=&quot;http://spring2008.ukuug.org/talks.html&quot;&gt;UKUUG conference&lt;/a&gt; I discovered the new &lt;a href=&quot;http://bbbike.radzeit.de/~slaven/cpantestersmatrix.cgi&quot;&gt;CPAN testers matrix&lt;/a&gt; and, in particular, the &lt;a href=&quot;http://bbbike.radzeit.de/~slaven/cpantestersmatrix.cgi?dist=Symbol-Approx-Sub%202.02&quot;&gt;appalling test results&lt;/a&gt; for the current version of &lt;a href=&quot;http://search.cpan.org/dist/Symbol-Approx-Sub/&quot;&gt;Symbol::Approx::Sub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Obviously having major test failures in such a crucial module is a terrible state of affairs so I spent some time looking at the problem last night.&lt;/p&gt;
&lt;p&gt;Luckily it was a relatively easy fix. It was just a test which had been written by someone (me!) whose knowledge of Perl had temporarily left them. Fixing it was simple enough, and I was able to release the first new version of Symbol::Approx::Sub for over two years. I also switched the distribution from ExtUtils::MakeMaker to Module::Build and made a few other tweaks which have improved its &lt;a href=&quot;http://cpants.perl.org/dist/overview/Symbol-Approx-Sub&quot;&gt;kwalitee&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And this morning, I saw a &lt;a href=&quot;http://bbbike.radzeit.de/~slaven/cpantestersmatrix.cgi?dist=Symbol-Approx-Sub%202.03&quot;&gt;much happier set of test results&lt;/a&gt;. Which was nice.&lt;/p&gt;
&lt;p&gt;Whilst poking around in my test results, I noticed that &lt;a href=&quot;http://search.cpan.org/dist/WWW-MakeAShorterLink/&quot;&gt;WWW::MakeAShorterLink&lt;/a&gt; was also &lt;a href=&quot;http://bbbike.radzeit.de/~slaven/cpantestersmatrix.cgi?dist=WWW-MakeAShorterLink+1.08&quot;&gt;failing far too many tests&lt;/a&gt;. It turns out that this is because the MASL web site no longer exists. Or, rather, it redirects to &lt;a href=&quot;http://tinyurl.com/&quot;&gt;TinyURL&lt;/a&gt;. So I've submitted a deletion request for WWW::MakeAShorterLink. It will be removed from CPAN in the next couple of days. All of your URL-shortening needs will be handled by &lt;a href=&quot;http://search.cpan.org/dist/WWW-Shorten/&quot;&gt;WWW::Shorten&lt;/a&gt;.  And, yes, next on my list is to fix the problems in &lt;a href=&quot;http://bbbike.radzeit.de/~slaven/cpantestersmatrix.cgi?dist=WWW-Shorten+1.97&quot;&gt;that distribution's test plan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Many thanks must go to the &lt;a href=&quot;http://cpantesters.perl.org/&quot;&gt;CPAN testers&lt;/a&gt; whose is so important in revealing my inadequacies as a programmer.&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/245414523&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 04 Mar 2008 21:42:04 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Quick Test Hack of the Day</title>
	<guid isPermaLink="false">http://use.perl.org/~Ovid/journal/35831?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/245456307/35831</link>
	<description>&lt;p&gt;As part of our ongoing effort to maintain our test suite's performance, I've just added the following quick hack to source control (it needs a lot of work):&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;#!/usr/bin/env perl&lt;br /&gt; &lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;use App::Prove::State;&lt;br /&gt;use List::Util 'sum';&lt;br /&gt;use Lingua::EN::Numbers 'num2en';&lt;br /&gt; &lt;br /&gt;my $prove = '.prove';&lt;br /&gt;unless (-f $prove &amp;amp;&amp;amp; -r _) {&lt;br /&gt;    die &quot;Cannot find or read $prove file&quot;;&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;my $state      = App::Prove::State-&amp;gt;new({ store =&amp;gt; $prove });&lt;br /&gt;my $generation = $state-&amp;gt;{_}{generation};&lt;br /&gt;my $tests      = $state-&amp;gt;{_}{tests};&lt;br /&gt; &lt;br /&gt;my $total   = sum(map { $_-&amp;gt;{elapsed} } values %$tests);&lt;br /&gt;my $minutes = int($total / 60);&lt;br /&gt;my $seconds = int($total % 60);&lt;br /&gt; &lt;br /&gt;my $num_tests = shift || 5;&lt;br /&gt; &lt;br /&gt;if ($num_tests &amp;gt; keys %$tests) {&lt;br /&gt;    $num_tests = keys %$tests;&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;my $num_word = num2en($num_tests);&lt;br /&gt; &lt;br /&gt;my %time_for;&lt;br /&gt;while (my ($test, $data) = each %$tests) {&lt;br /&gt;    $time_for{$test} = $data-&amp;gt;{elapsed};&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;my @sorted_by_time_desc&lt;br /&gt;        = sort { $time_for{$b} &amp;lt;=&amp;gt; $time_for{$a} } keys %time_for;&lt;br /&gt; &lt;br /&gt;print &quot;Generation $generation\n&quot;;&lt;br /&gt;print &quot;Total runtime approximately $minutes minutes $seconds seconds\n&quot;;&lt;br /&gt;print &quot;\u$num_word slowest tests:\n&quot;;&lt;br /&gt;for (0 .. $num_tests) {&lt;br /&gt;    my $test = $sorted_by_time_desc[$_];&lt;br /&gt;    print &quot;\t$time_for{$test} seconds -&amp;gt; $test\n&quot;;&lt;br /&gt;}&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;Basically, if you use the '--state=save' option with &lt;tt&gt;prove&lt;/tt&gt;, it will save the state of your tests in a &lt;tt&gt;.prove&lt;/tt&gt; file.  This code reads the file, tells you which generation the file is, total test suite run time in minutes and seconds and your 5 slowest tests.  Pass it a number and it will tell you the X slowest tests.&lt;/p&gt;

&lt;p&gt; &lt;strong&gt;Update&lt;/strong&gt;.  Here's the output from the current branch I'm working on (a slightly updated version from above):&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;Generation 18&lt;br /&gt;Number of test programs: 58&lt;br /&gt;Total runtime approximately 17 minutes 35 seconds&lt;br /&gt;Five slowest tests:&lt;br /&gt;        482.732247114182 seconds -&amp;gt; t/acceptance.t&lt;br /&gt;        234.499103069305 seconds -&amp;gt; t/aggregate.t&lt;br /&gt;        96.313854932785 seconds -&amp;gt; t/standards/strict.t&lt;br /&gt;        66.6500070095062 seconds -&amp;gt; t/unit/db/migrations.t&lt;br /&gt;        56.7010760307312 seconds -&amp;gt; t/unit/piptest/pprove/testdb.t&lt;br /&gt;        13.5212490558624 seconds -&amp;gt; t/unit/api/builder/brand-promotions.t&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/245456307&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 04 Mar 2008 21:42:04 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: &quot;Boolean&quot; or &quot;boolean&quot;?</title>
	<guid isPermaLink="false">http://blog.plover.com/2008/03/04#Boolean</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/245318180/04</link>
	<description>&lt;a href=&quot;http://blog.plover.com/oops/subtypes.html&quot;&gt;In a recent article&lt;/a&gt; I wrote:&lt;p&gt;

&lt;/p&gt;&lt;blockquote&gt;
... a logical negation function ... takes a boolean argument
and returns a boolean result.
&lt;/blockquote&gt;

I worried for some time about whether to capitalize &quot;boolean&quot; here.
But writing &quot;Boolean&quot; felt strange enough that I didn't actually try
it to see how it looked on the page.&lt;p&gt;

I looked at the &lt;a href=&quot;http://www.oed.com/&quot;&gt;the Big Dictionary&lt;/a&gt;,
and all the citations were capitalized.  
But the most recent one was from 1964, so that was not much help.&lt;/p&gt;&lt;p&gt;

Then I tried Google search for &quot;boolean capitalized&quot;.  The first hit
was &lt;a href=&quot;http://blogs.msdn.com/ericlippert/archive/2006/10/31/boolean-or-or-boolean-or.aspx&quot;&gt;a
helpful article by Eric Lippert&lt;/a&gt;.  M. Lippert starts by
pointing out that &quot;Boolean&quot; means &quot;pertaining to George Boole&quot;, and so
should be capitalized.  That much I knew already.&lt;/p&gt;&lt;p&gt;

But then he pointed out a countervailing consideration:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;blockquote&gt;
English writers do not usually capitalize the eponyms &quot;shrapnel&quot; (Henry Shrapnel, 1761-1842), &quot;diesel&quot; (Rudolf Diesel, 1858-1913), &quot;saxophone&quot; (Adolphe Sax, 1814-1894), &quot;baud&quot; (Emile Baudot, 1845-1903), &quot;ampere&quot; (Andre Ampere, 1775-1836), &quot;chauvinist&quot; (Nicolas Chauvin, 1790-?), &quot;nicotine&quot; (Jean Nicot, 1530-1600) or &quot;teddy bear&quot; (Theodore Roosevelt, 1858-1916).
&lt;/blockquote&gt;

Isn't that a great paragraph?  I just had to quote the whole thing.&lt;p&gt;

Lippert concluded that the tendency is to capitalize an eponym when it
is an adjective, but not when it is a noun.  (Except when it isn't
that way; consider &quot;diesel engine&quot;.  English is what it is.)&lt;/p&gt;&lt;p&gt;

I went back to my example to see if that was why I resisted
capitalizing &quot;Boolean&quot;:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;blockquote&gt;
... takes a boolean argument
and returns a boolean result.
&lt;/blockquote&gt;

Hmm, no, that wasn't it.  I was using &quot;boolean&quot; as an adjective in
both places.  Wasn't I?&lt;p&gt;

Something seemed wrong.  I tried changing the example:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;blockquote&gt;
... takes an integer argument
and returns an integer result.
&lt;/blockquote&gt;

Aha!  Notice &quot;integer&quot;, not &quot;integral&quot;.  &quot;Integral&quot; would have been
acceptable also, but that isn't analogous to the expression I
intended.   I wasn't using &quot;boolean&quot; as an adjective to modify
&quot;argument&quot; and &quot;result&quot;.  I was using it as a noun to denote a certain
kind of data, as part of a noun phrase.   So it is a noun, and that's
why I didn't want to capitalize it.&lt;p&gt;

I would have been happy to have written &quot;takes a boolean and returns a
boolean&quot;, and I think that's the controlling criterion.&lt;/p&gt;&lt;p&gt;

Sorry, George.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/245318180&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 04 Mar 2008 21:42:04 +0000</pubDate>
</item>
<item>
	<title>Perl Foundation: TPF Needs You: Nominations Open for Several TPF Roles</title>
	<guid isPermaLink="false">tag:news.perlfoundation.org,2008://18.1950</guid>
	<link>http://news.perlfoundation.org/2008/03/tpf_needs_you_nominations_open.html</link>
	<description>&lt;p&gt;Have you ever wanted to get involved in The Perl Foundation, but didn't know how? Well, now's your chance. I'm pleased to announce open self-nominations for the following &lt;span class=&quot;caps&quot;&gt;TPF &lt;/span&gt;roles:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.perlfoundation.org/steering_committee_chair&quot;&gt;Steering Committee Chair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.perlfoundation.org/conferences_committee_roles&quot;&gt;Conferences Committee Chair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.perlfoundation.org/public_relations&quot;&gt;Public Relations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;You can follow the links above to read descriptions of each of the positions. If you think you're a good fit for one or more of them, send me an email at cbrandt at perlfoundation dot org. I'll then invite you to a dedicated wiki we have set up just for the election.&lt;/p&gt;

&lt;p&gt;Once you join the wiki, you'll set up a page to post all of your experience and answer the questions provided in each section above. The wiki is private, but you'll be able to see the other candidate pages, and they'll see yours.&lt;/p&gt;

&lt;p&gt;The deadline to get all of your information in is midnight next Tuesday, March 11. Our committees elect their members, so the Conferences Committee will be voting on the CC chair and the Steering Committee will vote on the chair and PR positions. After we have a chance to look over everyone's information, we vote and select our newest members.&lt;/p&gt;

&lt;p&gt;You only have a week, so don't wait too long. I look forward to hearing from you.&lt;/p&gt;</description>
	<pubDate>Tue, 04 Mar 2008 01:57:52 +0000</pubDate>
</item>
<item>
	<title>Focus Shift: PDA</title>
	<guid isPermaLink="true">http://osnews.com/story/19415/PDA</guid>
	<link>http://osnews.com/story/19415/PDA</link>
	<description>&lt;center&gt;&lt;img src=&quot;http://www.osnews.com/images/comics/pda.jpg&quot; title=&quot;PDA.&quot; height=&quot;615&quot; width=&quot;500&quot; alt=&quot;PDA.&quot; border=&quot;1&quot; /&gt;&lt;/center&gt;</description>
	<pubDate>Mon, 03 Mar 2008 23:49:13 +0000</pubDate>
	<author>donotreply@osnews.com (Thom Holwerda)</author>
</item>
<item>
	<title>Focus Shift: Gnome</title>
	<guid isPermaLink="true">http://osnews.com/story/19389/Gnome</guid>
	<link>http://osnews.com/story/19389/Gnome</link>
	<description>&lt;center&gt;&lt;img src=&quot;http://www.osnews.com/images/comics/gnome.jpg&quot; title=&quot;Gnome.&quot; height=&quot;500&quot; width=&quot;500&quot; alt=&quot;Gnome.&quot; border=&quot;1&quot; /&gt;&lt;/center&gt;</description>
	<pubDate>Mon, 03 Mar 2008 23:49:13 +0000</pubDate>
	<author>donotreply@osnews.com (Thom Holwerda)</author>
</item>
<item>
	<title>CPAN Testers, Clotho: PASS CAM-Template-Cache-0.91 5.10.0 on MSWin32 5.00 (MSWin32-x86-multi-thread)</title>
	<guid isPermaLink="true">http://nntp.x.perl.org/group/perl.cpan.testers/1097752</guid>
	<link>http://nntp.x.perl.org/group/perl.cpan.testers/1097752</link>
	<pubDate>Mon, 03 Mar 2008 21:57:41 +0000</pubDate>
</item>
<item>
	<title>CPAN Testers, Clotho: PASS CAM-EmailTemplate-SMTP-0.91 5.10.0 on MSWin32 5.00 (MSWin32-x86-multi-thread)</title>
	<guid isPermaLink="true">http://nntp.x.perl.org/group/perl.cpan.testers/1097749</guid>
	<link>http://nntp.x.perl.org/group/perl.cpan.testers/1097749</link>
	<pubDate>Mon, 03 Mar 2008 21:57:40 +0000</pubDate>
</item>
<item>
	<title>CPAN Testers, Clotho: PASS CAM-EmailTemplate-0.92 5.10.0 on MSWin32 5.00 (MSWin32-x86-multi-thread)</title>
	<guid isPermaLink="true">http://nntp.x.perl.org/group/perl.cpan.testers/1097748</guid>
	<link>http://nntp.x.perl.org/group/perl.cpan.testers/1097748</link>
	<pubDate>Mon, 03 Mar 2008 21:57:40 +0000</pubDate>
</item>
<item>
	<title>Homestar Runner: Strong Bad email #191</title>
	<guid isPermaLink="true">http://homestarrunner.com/sbemail191.html</guid>
	<link>http://homestarrunner.com/sbemail191.html</link>
	<pubDate>Mon, 03 Mar 2008 21:56:38 +0000</pubDate>
</item>
<item>
	<title>Mac Rumors, Page 2: Woz on MacBook Air, 3G iPhone... Reporters</title>
	<guid isPermaLink="true">http://www.macrumors.com/2008/03/03/woz-on-macbook-air-3g-iphone-reporters/</guid>
	<link>http://www.macrumors.com/2008/03/03/woz-on-macbook-air-3g-iphone-reporters/</link>
	<description>Apple's co-founder, Steve Wozniak, spoke at a broadband conference in Australia.  In a Q&amp;amp;A session with journalists, Wozniak spent some time relating his thoughts about some of Apple's newest products.&lt;br /&gt;
&lt;br /&gt;
In general, he had similar though...&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=zb0GCmF&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=zb0GCmF&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=o5RGhkf&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=o5RGhkf&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=QjuxTXf&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=QjuxTXf&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?a=04oIUdF&quot;&gt;&lt;img src=&quot;http://feeds.macrumors.com/~f/MacRumors-Page2?i=04oIUdF&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.macrumors.com/~r/MacRumors-Page2/~4/244803004&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 03 Mar 2008 21:56:05 +0000</pubDate>
</item>
<item>
	<title>Slashdot Apple: Woz Dumps on MacBook Air, iPhone, AppleTV</title>
	<guid isPermaLink="false">http://apple.slashdot.org/article.pl?sid=08/03/03/1441208&amp;from=rss</guid>
	<link>http://rss.slashdot.org/~r/Slashdot/slashdotApple/~3/244918021/article.pl</link>
	<description>AcidAUS writes &quot;Apple co-founder Steve Wozniak heaped less than lavish praise on the company's iPhone, MacBook Air and Apple TV products when visiting Sydney this morning. Wozniak said he was puzzled by the lack of 3G support on the iPhone and that he didn't believe the MacBook Air would be a hit.&quot;&lt;p&gt;&lt;a href=&quot;http://apple.slashdot.org/article.pl?sid=08/03/03/1441208&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at Slashdot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotApple?a=rxkYzW&quot;&gt;&lt;img src=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotApple?i=rxkYzW&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://rss.slashdot.org/~r/Slashdot/slashdotApple/~4/244918021&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 03 Mar 2008 21:40:27 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: more code for mutt on osx</title>
	<guid isPermaLink="false">http://use.perl.org/~rjbs/journal/35820?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/244622218/35820</link>
	<description>&lt;p&gt;I have a fairly complicated mutt configuration.  It could probably do with more
streamlining, but it's pretty easy for me to update, because of the way I
generate it.&lt;/p&gt; &lt;p&gt;Some of it, of course, comes from &lt;a href=&quot;http://search.cpan.org/dist/Addex&quot;&gt;Addex&lt;/a&gt;.
That's only some of it, though.  Namely, the folder hooks, folder
subscriptions, and a lot of the aliases.  That leaves a lot of things
unconfigured: default headers, folder names and locations, connection methods,
helper programs (i.e., the mailcap), OpenPGP and S/MIME config, keybindings,
colors, and all sorts of other little things.&lt;/p&gt; &lt;p&gt;A lot of these I really do want to set myself, once, by hand.  I want the same
basic colors everywhere, for example.  A lot of other things vary from host to
host.  On the server to which mail mail is delivered, my mail is laid out in
Courier-style Maildirs, so my inbox is in &lt;code&gt;~/Maildir/{cur,new,tmp}&lt;/code&gt; and one of
my folders is &lt;code&gt;~/Maildir/cpan/{cur,new,tmp}&lt;/code&gt; and so on.  On my laptop, where I
sync that mail with OfflineIMAP, I end up with my inbox in
&lt;code&gt;~/Maildir/INBOX/{cur,new,tmp}&lt;/code&gt;.  Some folders are renamed, others are omitted.
That affects save hooks, folder hooks, folder subscriptions, and other
settings.&lt;/p&gt; &lt;p&gt;At work, I have an entirely different set of folders, as well as a different
From header, a different sig, and other different settings.  On all my
machines, I have different helper applications.  On my workstation at work,
which I use only via ssh, I can't open images.  On my laptop, I need to use a
wrapper around Preview.app.  Elsewhere, I might want to use Firefox.  On some
machines, I want HTML rendered with lynx, and if there's no lynx, html2text
will do, and so on.&lt;/p&gt; &lt;p&gt;So, a lot of my mutt configuration is generated for me by little programs,
either when I run mutt or when I deploy its configuration to my homedir from
a git checkout.&lt;/p&gt; &lt;p&gt;Since it's important to know what machine I'm running on, I have a module
called WhichConfig.  It exports a routine, &lt;code&gt;which_config&lt;/code&gt; that tells me what
configuration to use.  For the most part, this is either a hostname or
&quot;default.&quot;  It works like this:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;if the hostname is a known hostname, use that config&lt;/li&gt; &lt;li&gt;if we find a known string in &lt;code&gt;ifconfig&lt;/code&gt;, use the associated config&lt;/li&gt; &lt;li&gt;use default config&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The &lt;code&gt;ifconfig&lt;/code&gt; check is pretty crude, but very, very effective.  I look for the
MAC address on hosts for which I control the hardware and IP address on hosts
that I don't.  It's easy to change the way the test works, but so far this has
always worked.  Many of the rest of my tools rely on WhichConfig.&lt;/p&gt; &lt;p&gt;The first application is simple; my muttrc contains this line:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;source `~/.mutt/which-config`&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt; &lt;code&gt;which-config&lt;/code&gt; just prints out a filename based on the appropriate config.
That file contains settings that I just want to set by hand on each host.&lt;/p&gt; &lt;p&gt;A more interesting (but still very simple) helper script is &lt;code&gt;folder-finder&lt;/code&gt;.
It finds all the relevant maildirs for the current configuration and subscribes
to them.  It knows how to find both Courier-style and OfflineIMAP-style folders
and normalize their names.  It runs every time I run mutt, so that it will find
folders that have been recently created.  Unfortunately, mutt can't include the
multi-line output of a script via the &quot;source&quot; directive or backticks
mechanism, so I end up with this in my muttrc:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;source `~/.mutt/folder-finder &amp;gt; ~/.mutt-folders; echo ~/.mutt-folders`&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;This minor inelegance is definitely worth the benefits.&lt;/p&gt; &lt;p&gt;Finally, there's &lt;code&gt;make-mailcap&lt;/code&gt;.  This program looks at WhichConfig and looks
for known useful commands in &lt;code&gt;$PATH&lt;/code&gt;, then reads in &lt;code&gt;/etc/mailcap&lt;/code&gt; and dumps an
output file into &lt;code&gt;~/.mutt/mailcap&lt;/code&gt;.  This file is used as the mailcap file,
which mutt uses to figure out how to view or print attachments.  This is useful
for dumping HTML mail to text (when it has no useful text alternative), or for
opening pictures and PDFs in Preview, xv, or xpdf.  Over time, I imagine I'll
add more and more helpers to &lt;code&gt;make-mailcap&lt;/code&gt;, but the most useful one is
&lt;code&gt;osx-preview-img&lt;/code&gt;.  When mutt uses a helper program to open an attachment, it
generally sees a specification like &quot;&lt;code&gt;lynx -dump -force_html '%s'&lt;/code&gt;&quot; and
replaces the &lt;code&gt;%s&lt;/code&gt; with the name of a temporary file, which is deleted after the
command exits.&lt;/p&gt; &lt;p&gt;In MacOS X, the way to open a file in a GUI application is usually to use the
&lt;code&gt;open&lt;/code&gt; command, like this:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;$ open -a Preview some-image.jpg&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;The problem is that &lt;code&gt;open&lt;/code&gt; exits nearly instantly, having send a request to
Preview.  mutt then deletes the temporary file, and Preview sends a SIGWTF.  My
helper program copies the tempfile to another location and has Preview open
that.  It never cleans up that tempfile, but since it's under /tmp, I know the
OS will clean it up on reboot.  In the future, I may look at using Mac::Glue to
write a helper that won't leave clutter in /tmp, but I'm not too worried about
it for now.&lt;/p&gt; &lt;p&gt;All of this stuff has been so useful to me that I feel like I should bundle it
up and drop it on the CPAN, but I'm not sure whether (or how) anyone else would
find much of it useful.  I think I need to work more on it and see if it can be
turned into a simple module to attach plugins to, sort of like Addex, but just
for mutt configuration.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/244622218&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 03 Mar 2008 21:22:02 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Lessons in workshop organization from Frozen Perl 2008</title>
	<guid isPermaLink="false">tag:perlbuzz.com,2008://1.358</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/245052263/lessons-in-workshop-organization-from-frozen-perl-1.html</link>
	<description>&lt;p&gt;
&lt;a href=&quot;http://use.perl.org/~autarch/journal/35803&quot;&gt;Dave Rolsky has written up a recap of Frozen Perl&lt;/a&gt; from the organizers' point of view.  Some interesting tidbits:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2/3rds of FP2008 expenses were paid by sponsors, keeping attendee cost low&lt;/li&gt;
&lt;li&gt;Some sponsors are interested in the tax deduction; some see it as a marketing expense&lt;/li&gt;
&lt;li&gt;With very low ticket prices, each additional attendee ends up being a net loss&lt;/li&gt;
&lt;li&gt;A potential solution to the lightning talk machine dance could be a KVM.&lt;/li&gt;
&lt;li&gt;Income $7,190 - Expenses $6,213.43 = $976.57 overage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The workshop came together beautifully.  I was very impressed with what Dave &amp;amp; Co. pulled together.
&lt;/p&gt;
        
    &lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PerlBuzz/~4/245044901&quot; height=&quot;1&quot; /&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/245052263&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 03 Mar 2008 21:22:02 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Uniquely-decodable codes revisited</title>
	<guid isPermaLink="false">http://blog.plover.com/2008/03/03#udcodes-2</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/244653579/03</link>
	<description>[ This is a followup to &lt;a href=&quot;http://blog.plover.com/CS/udcodes.html&quot;&gt;an earlier article&lt;/a&gt;. ]&lt;p&gt;

Alan Morgan wrote to ask if there was a difference between
uniquely-decodable (UD) codes for strings and for streams.  That is,
is there a code for which every finite string is UD, but for which
some &lt;i&gt;infinite&lt;/i&gt; sequence of symbols has multiple decodings.&lt;/p&gt;&lt;p&gt;

I pondered this a bit, and after a little guessing came up with an
example: { &quot;a&quot;, &quot;ab&quot;, &quot;bb&quot; } is UD, because it is a suffix code.  But
the stream &quot;abbbbbbbbbb...&quot; can be decoded in two ways. &lt;/p&gt;&lt;p&gt;

After I found the example, I realized that I shouldn't have needed to
guess, because I already knew that you sometimes have to see the last
symbol of a string before you can know how to decode it, and in such a
code, if there is no such symbol, the decoding must be ambiguous.  The
code above is UD, but to decode &quot;abbbbbbbbbbbbbbb&quot; you have to count
the &quot;b&quot;s to figure out whether the first code word is &quot;a&quot; or &quot;ab&quot;. &lt;/p&gt;&lt;p&gt;

Let's say that a code is UD+ if it has the property that no two
infinite sequences of code words have the same concatenation.  Can we
characterize the UD+ codes?  Clearly, UD+ implies UD, and the example
above shows that the converse is not true.  A simple argument shows
that all prefix codes are UD+.  So the question now is, are there UD+
codes that are not prefix codes?  I don't know.&lt;/p&gt;&lt;p&gt;

[ Addendum 20080303: Gareth McCaughan points out that { &quot;a&quot;,
&quot;ab&quot; } is UD+ but not prefix. ]&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/244653579&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 03 Mar 2008 21:22:02 +0000</pubDate>
</item>
<item>
	<title>Jonathan Rockway: Sorry about the Angerwhale bugs</title>
	<guid isPermaLink="false">urn:guid:597762EC-E8C8-11DC-AB0B-7C19994B61BA</guid>
	<link>http://blog.jrock.us/articles/Sorry%20about%20the%20Angerwhale%20bugs.pod</link>
	<description>&lt;div class=&quot;pod&quot;&gt;
&lt;p&gt;I've noticed a few bugs in Angerwhale these days that are annoying
people.  For some reason, the CAPTCHA is really hard to guess (it has
to be a bug, I'm sure that I'm typing it in correctly), and of course
Crypt::OpenPGP is choking on UTF-8 regularly.  I found it ironic that
I couldn't use my own perl software to post a rant about people
misusing the perl UTF-8 flag.  (Not signing the post fixed the
problem; my code is mostly correct, but the modules I use are
broken...)&lt;/p&gt;
&lt;p&gt;Anyway, work on Angerwhale has been slow-going because Crypt::OpenPGP
doesn't work on 5.10.  This means I can't run the test suite, among
other things.  I need to get rid of that broken module anyway, so I
will sometime this week.  Then I can start actively fixing the
Angerwhale weirdness and push out a new version.&lt;/p&gt;
&lt;p&gt;For now, sorry for the brokenness.  It will be fixed Real Soon Now.&lt;/p&gt;


&lt;/div&gt;</description>
	<pubDate>Mon, 03 Mar 2008 21:22:02 +0000</pubDate>
	<author>jon@jrock.us (Jonathan Rockway)</author>
</item>
<item>
	<title>Lawrence Watt-Evans: Class is in Session</title>
	<guid isPermaLink="true">http://www.watt-evans.com/blog/?p=67</guid>
	<link>http://www.watt-evans.com/blog/?p=67</link>
	<description>&lt;p&gt;Back in 2001, I posted a bunch of mini-essays about class in the United States in my newsgroup on &lt;a href=&quot;http://webnews.sff.net&quot;&gt;SFF Net&lt;/a&gt; — six of them in all, though I’d originally planned on seven to nine; I got distracted before I finished.&lt;/p&gt;
&lt;p&gt;I’m planning to repost them here, somewhat edited and updated, as much for my own amusement as anything else, but I welcome comments.&lt;/p&gt;
&lt;p&gt;I don’t have a hard and fast schedule for when they’ll appear here, but I thought I’d let any readers know they’re coming.&lt;/p&gt;</description>
	<pubDate>Mon, 03 Mar 2008 06:33:42 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Time::Piece 0.13 released</title>
	<guid isPermaLink="false">http://use.perl.org/~Matts/journal/35819?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/244477458/35819</link>
	<description>Some of you may know that Time::Piece became part of perl 5.10. Anyone one of the things discovered was that I accidentally dropped a BSD copyright off one of the XS functions. This is now added back in. I also added an add_months() and add_years() set of functions, to make date arithmetic a bit easier.&lt;br /&gt;&lt;br /&gt;This was interesting seeing what happens with the edge-case dates. It seems that when you do 31st March + 1 month you end up with 1st May. This mirrors what other date libraries appear to do. I documented the gotcha.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/244477458&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 02 Mar 2008 21:42:24 +0000</pubDate>
</item>
<item>
	<title>Jonathan Rockway: Fuck the internal representation</title>
	<guid isPermaLink="false">urn:guid:2C8476BE-E830-11DC-B235-4AF7984B61BA</guid>
	<link>http://blog.jrock.us/articles/Fuck%20the%20internal%20representation.pod</link>
	<description>&lt;div class=&quot;pod&quot;&gt;
&lt;p&gt;I often see people (including myself) write code like this:&lt;/p&gt;
&lt;pre&gt;utf8::encode($data_to_print) if utf8::is_utf8($data_to_print);
&lt;/pre&gt;
&lt;p&gt;This results in irritating bugs, because it's incorrect and doesn't
even make sense.&lt;/p&gt;
&lt;p&gt;Perl can store text as either latin-1 or utf8 internally.  For a
string like &lt;code&gt;ほげ&lt;/code&gt;, the internal representation will be utf8,
because you definitely can't represent Japanese in latin-1.  However
(and this is where problems crop up), something like &lt;code&gt;ü&lt;/code&gt; (written as
&lt;code&gt;&quot;\xfc&quot;&lt;/code&gt;) will be represented as latin-1, even if you &lt;code&gt;use utf8&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is not something that should concern you, but when you check
&lt;code&gt;utf8::is_utf8&lt;/code&gt;, you've just made Perl's internals your problem.  You
want to convert to utf8 regardless of the internal representation, but
your code only converts if the string is already utf8.  If the string
isn't utf8, you're saying you &lt;i&gt;don't&lt;/i&gt; want to convert it?  What!?&lt;/p&gt;
&lt;p&gt;The key is to drop the if condition.  Always &lt;code&gt;encode&lt;/code&gt; to utf8 if you
want utf8!&lt;/p&gt;
&lt;pre&gt;print {$the_web_browser} Encode::encode('utf8', $some_string);
&lt;/pre&gt;
&lt;p&gt;Please stop checking &lt;code&gt;utf8::is_utf8&lt;/code&gt;.  Fuck the internal
representation!
&lt;/p&gt;


&lt;/div&gt;</description>
	<pubDate>Sun, 02 Mar 2008 21:42:24 +0000</pubDate>
	<author>jon@jrock.us (Jonathan Rockway)</author>
</item>
<item>
	<title>Adam Kennedy: Allocating a timeslice to PITA</title>
	<guid isPermaLink="true">http://use.perl.org/~Alias/journal/35807?from=rss</guid>
	<link>http://use.perl.org/~Alias/journal/35807?from=rss</link>
	<description>With all the changes for the Strawberry April release mostly working now (I just need to generate the beta release now) and my PITA talk at the Go Open conference in Norway officially in the program, it's time again to try and make the next push on getting PITA running actual productive tests.&lt;br /&gt;&lt;br /&gt;The good news is that I think I now have enough information together to generate live testing images. After some consulting with various sysadmin types, we've come up with the following.&lt;br /&gt;&lt;br /&gt;To turn a system image into a PITA image, we'll be using a hook into SysV init.&lt;br /&gt;&lt;br /&gt;This is in the form of an S98PITA that runs just before logins are enabled, but after networking and all services are running. And, more importantly, after the &quot;injector&quot; (payload) disk image has been mounted already.&lt;br /&gt;&lt;br /&gt;The PITA init script will look for the image.conf config file in the root of the mount directory.&lt;br /&gt;&lt;br /&gt;If the config file exists, the script assumes the system is running in testing mode, and will spawn the PITA::Image image manager object and run it, which will then do the testing or other task.&lt;br /&gt;&lt;br /&gt;If the config file does NOT exist, the init script assumes that the image is being booted in &quot;maintenance mode&quot;, and shortcut to null, allowing normal boot up of the system.&lt;br /&gt;&lt;br /&gt;Obviously this only works with SysV Init, but that covers the scode of the initial OS we want to get running.&lt;br /&gt;&lt;br /&gt;This solution does, however, allow a system image to be easily maintained and update, as you can just boot the image up as a regular VM and it should work completely normally.&lt;br /&gt;&lt;br /&gt;Only if it discovers the payload does the system switch to fully automated mode, run the tests, then shut itself down.&lt;br /&gt;&lt;br /&gt;You can see the current prototype of the init script here...&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://svn.ali.as/cpan/trunk/PITA-Image/examples/sysv_init_pita.pl&quot;&gt;http://svn.ali.as/cpan/trunk/PITA-Image/examples/sysv_init_pita.pl&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you'd like to assist setting me up some images (since I'm not an amazing sysadmin) I'll try to hang out on irc.perl.org #pita as much as possible.&lt;br /&gt;&lt;br /&gt;Any sysadmin one-off help to set up an OS image would be greatly appreciated.</description>
	<pubDate>Sat, 01 Mar 2008 21:57:18 +0000</pubDate>
</item>
<item>
	<title>use Perl journals: [uri] Introducing The Perl College</title>
	<guid isPermaLink="true">http://use.perl.org/~uri/journal/?from=rss</guid>
	<link>http://use.perl.org/~uri/journal/?from=rss</link>
	<pubDate>Sat, 01 Mar 2008 21:56:36 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Dutch Perl Workshop, part 2</title>
	<guid isPermaLink="false">http://use.perl.org/~domm/journal/35802?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/243592481/35802</link>
	<description>&lt;p&gt;After staying at Wendy and Liz' (and visting a cave (!) in the Dutch mountains (!!)) I stayed a night at Mark &amp;amp; Cleos place.&lt;/p&gt;

&lt;p&gt;Their 1.5 years old son Tycho is very cute (but I'm still happy that my kids are already older...). I managed to get most of my slides done while staying there.&lt;/p&gt;

&lt;p&gt;On Thursday evening we prepared the venue for the Workshop (including setting up Wendys &lt;b&gt;huge&lt;/b&gt; collection of Perl books). Then a aprox 10 attendees had some chinese food at Marks place. Then we went back to the venue, for more preparation, Fluxx and Whisk(e)y.&lt;/p&gt;

&lt;p&gt;A tiny bit after midnight I was done with all my slides (even for the talk I only agreed upon a few hours ago, and a lightning talk), so I started working on &lt;a href=&quot;http://search.cpan.org/dist/Acme-ReturnValue&quot;&gt;Acme::ReturnValue&lt;/a&gt;.
After finishing a first version I want to bed way to late.&lt;/p&gt;

&lt;p&gt;The workshop itself was very nice. Jonathans talk on Perl6 Internals was very interesting (and it prompted me to install Perl6 on my laptop - hard to belive, but things like &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;perl6 -e 'say &quot;Hello World!&quot;'&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  work!)

&lt;p&gt;I used my new wireless presenter thingy to remote-control my computer during my presentation, which was very nice.&lt;/p&gt;

&lt;p&gt;Here are my talks (and their slides):
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt; &lt;a href=&quot;http://domm.plix.at/talks/2008_arnhem_die_perl_die/&quot;&gt;die, Perl, die!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://domm.plix.at/talks/2008_arnhem_perl_5_10/&quot;&gt;Perl 5.10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://domm.plix.at/talks/2008_arnhem_cpanplus_custom_sources&quot;&gt;CPANPLUS custom sources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://domm.plix.at/talks/2008_arnhem_acme_returnvalue&quot;&gt;Acme::ReturnValue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The evening was spend (as usual) with Fluxx, Whisk(e)y and Cake. I very much enjoyed my stay in the Netherlands. Everybody was very hospitable and I had a lod of fun speaking fake dutch&lt;/p&gt;

&lt;p&gt;But I also look forward to beeing home again and spend some time with my family...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/243592481&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 01 Mar 2008 21:41:54 +0000</pubDate>
</item>
<item>
	<title>Planet Parrot: chromatic: The Difference Between a Program and a Script</title>
	<guid isPermaLink="true">http://use.perl.org/~chromatic/journal/35804?from=rss</guid>
	<link>http://use.perl.org/~chromatic/journal/35804?from=rss</link>
	<description>&lt;p&gt;The difference between a program and a script isn't as subtle as most people think.  A script is interpreted, and a program is compiled.&lt;/p&gt;

&lt;p&gt;Of course, there's no reason you can't write a compiler that immediately
executes the compiled form of a program without writing compilation artifacts
to disk, but that's an implementation detail, and precision in technical
matters is important.&lt;/p&gt;

&lt;p&gt;Though Perl 5, for example, doesn't write out the artifacts of compilation
to disk and Java and .Net do, Perl 5 is clearly an interpreter even though it
evaluates the compiled form of code in the same way that the JVM and the CLR
do.  Why?  Because it's a scripting language.&lt;/p&gt;

&lt;p&gt;Okay, that's a facetious explanation.&lt;/p&gt;

&lt;p&gt;The difference between a program and a script is if there's native
compilation available in at least one widely-used implementation.  Thus Java
before the prevalence of even the HotSpot JVM and its JIT was a scripting
language and now it's a programming language, except that you can write a C
interpreter that doesn't have a JIT and C programs become scripts.&lt;/p&gt;

&lt;p&gt;Hm.&lt;/p&gt;

&lt;p&gt;Of course, if someone were to write an extra optimizer step for Perl 5 to
evaluate certain parts of the optree and generate native code in memory on
certain platforms without writing it out to disk (uh oh...) and then execute
that code under certain conditions, all Perl 5 scripts would automatically turn
into programs.&lt;/p&gt;

&lt;p&gt;You know, like &lt;em&gt;.pmc&lt;/em&gt; files, or Python's &lt;em&gt;.pyc&lt;/em&gt; files.
Uh.&lt;/p&gt;

&lt;p&gt;As well, if more people use Punie (Perl 1 on Parrot) this year than native
Perl 1 -- a possibility -- then Perl 1 scripts automatically become Perl 1
programs becaues Punie can use Parrot's JIT.  I don't know if this powerful
upgrade from script to program is retroactive, but I see no reason why not.&lt;/p&gt;

&lt;p&gt;Perl 5 scripts were briefly programs while Ponie was viable, but the removal
of the code from the Parrot tree has now downgraded them back to scripts.  We
apologize for the inconvenience.&lt;/p&gt;

&lt;p&gt;To summarize, if you have a separate compilation step visible to developers,
you have programs.  If not, you have scripts.  An exception is that if you have
a separate, partial compilation step at runtime and not visible to users, then
you may have programs.  The presence of one implementation that performs
additional compilationy thingies at runtime instantly upgrades all scripts to
programs, while the presence of an interpreter for a language in which people
normally write programs, not scripts, does not downgrade programs to scripts.
Program-ness is sticky.&lt;/p&gt;

&lt;p&gt;I hope this is now clear.&lt;/p&gt;

&lt;p&gt;Ironically some JavaScript implementations have JITs, so the colloquial name
of the language should change from JavaScript to JavaProgram.&lt;/p&gt;

&lt;p&gt;Script bad, four-legs good.&lt;/p&gt;</description>
	<pubDate>Sat, 01 Mar 2008 21:41:54 +0000</pubDate>
</item>
<item>
	<title>Bob Cringely: Azul Means (Big) Blue</title>
	<guid isPermaLink="true">http://www.pbs.org/cringely/pulpit/2008/pulpit_20080229_004404.html</guid>
	<link>http://www.pbs.org/cringely/pulpit/2008/pulpit_20080229_004404.html</link>
	<description>&lt;p&gt;In a triumph of PR right up there with suggesting that Intel executives ever badgered Microsoft executives into doing anything, IBM this week introduced a new generation of mainframe computers.  The IBM System z10 is smaller, faster, cooler, has more memory, more storage -- more of everything in fact -- and all that is crammed into less of everything than was the case with the z9 machine it replaces.  Touted as more of a super-duper virtualization server than traditional big iron, the only problem with the z10 is that every bit of its superior performance can be easily attributed to Moore's Law.  The darned thing actually should be faster than it is.  There's a mainframe revolution going on all right, but it's not at IBM.  The real mainframe revolt is taking place inside your generic Linux box, as well as at an outfit called Azul Systems.&lt;/p&gt;

&lt;p&gt;I'm perfectly happy for IBM to introduce a great new mainframe computer.  It's just that the 85 percent faster, 85 percent smaller and a little bit cheaper z10 is coming three years after the z9, and Moore's Law says sister machines that far apart ought to be 200 percent faster, not 85 percent -- a fact that IBM managed to ignore while touting the new machine's unsubstantiated equivalence to 1,500 Intel single-processor servers. &lt;/p&gt;

&lt;p&gt;Where were the hard questions?  Did anyone do the math?  The tricked-out z10 that's the supposed equivalent of 1,500 beige boxes costs close to $20 million, which works out to $13,333 per beige box -- hardly a cost savings.  Even taking into account the data center space savings, power savings, and possibly (far from guaranteed) savings on administration, the z10 really isn't much of a deal unless you use it for one thing and one thing only -- replacing a z9.&lt;/p&gt;

&lt;p&gt;So the newfangled mainframe is really just an oldfangled mainframe after all, which I am sure is comforting for folks who like to buy oldfangled mainframes.&lt;/p&gt;

&lt;p&gt;But those sketchily described IBM benchmarks are, themselves, dubious.  IBM never fully explains its own benchmarks nor does it even allow others to benchmark IBM mainframe computers.  So nobody really knows how fast the z10 is or how many Intel boxes it can replace if those boxes are actually DOING something.&lt;/p&gt;

&lt;p&gt;Remember the stories folks like me wrote a few years back about an earlier IBM mainframe running 40,000+ instances of SUSE Linux under VM on one machine?  I wonder how many of those 40,000 parallel Linux images were simultaneously running Doom?  My guess is none were.&lt;/p&gt;

&lt;p&gt;Far more interesting to me is the vastly increasing utility of Linux as what I would consider a mainframe-equivalent operating system, primarily due to the open source OS's newfound skill with multiple threads that goes a long way toward making efficient use of those multi-core processors we all are so excited to buy yet barely use.&lt;/p&gt;

&lt;p&gt;As I wrote a few weeks ago in a column on semiconductor voltage leakage of all things, all this multi-core stuff is really about keeping benchmark performance up while keeping clock speeds down so the CPUs don't overheat.  Unlike the benchmark programs, most desktop applications still run on a single processor core and have no good way to take efficient advantage of this extra oomph.&lt;/p&gt;

&lt;p&gt;But that's changing.  Linux used to be especially bad at dealing with multiple program threads for example -- so bad the rule of thumb was it simply wasn't worth even trying under most conditions.  But that was with the archaic Linux 2.4 kernel.  Now we have Linux 2.6 and a new library called NPTL or Native POSIX Thread Library to change all that. &lt;/p&gt;

&lt;p&gt;NPTL has been in the enterprise versions of Red Hat Linux for a while, but now it is here for the rest of us, too.  With NPTL, hundreds of thousands of threads on one machine are now very possible. And where it used to be an issue when many threads competed for data structures (think about 1,000 threads all trying to update a hash table), we now have data structures where no thread waits for any other.  In fact, if one thread gets swapped out before it's done doing the update, the next thread detects this and helps finish the job.&lt;/p&gt;

&lt;p&gt;The upshot is superior performance IF applications are prepared to take advantage.&lt;/p&gt;

&lt;p&gt;&quot;My e-mail application runs on a four-core Opteron server,&quot; says a techie friend of mine, &quot;but I've seen it have over 4,000 simultaneous connections - 4,000 separate threads (where I'm using &quot;thread&quot; to describe a lightweight process) competing for those four CPU's.  And looking at the stats, my CPUs are running under five percent almost all the time. This stuff really has come a long way.&quot;&lt;/p&gt;

&lt;p&gt;But not nearly as far as Azul Systems has gone in ITS redefinition of the mainframe -- extending further than any other company, as far as I can tell, models for thread management and process concurrency. &lt;/p&gt;

&lt;p&gt;Azul makes custom multi-core server appliances.  You can buy a 14u Azul box with up to 768 processor cores and 768 gigabytes of memory.  The processors are of Azul's own design, at least for now.&lt;/p&gt;

&lt;p&gt;But what's a server appliance?  In the case of Azul, the appliance is a kind of Java co-processor that sits on the network providing compute assistance to many different Java applications running on many different machines.&lt;/p&gt;

&lt;p&gt;Java has always been a great language for writing big apps that can be virtualized across a bunch of processors or machines.  But while Java was flexible and elegant, it wasn't always very fast, the biggest problem being processor delays caused by Java's automatic garbage collection routines.  Azul handles garbage collection in hardware rather than in software, making it a continuous process that keeps garbage heap sizes down and performance up.&lt;/p&gt;

&lt;p&gt;Language geeks used to sit around arguing about the comparative performance of Java with, say, C or C++ and some (maybe I should actually write &quot;Sun&quot;) would claim that Java was just as fast as C++.  And it was, for everything except getting work done because of intermittent garbage collection delays.  Well now Azul -- not just with its custom hardware but also with its unique multi-core Java Virtual Machine -- has made those arguments moot: Java finally IS as fast as C++.&lt;/p&gt;

&lt;p&gt;But for that matter there is no reason to believe that Azul's architecture has to be limited to Java, either, and can't be extended to C++, too.&lt;/p&gt;

&lt;p&gt;To me what's exciting here is Azul's redefinition of big iron.  That z10 box from IBM, for example, can look to the network like 1,500 little servers running a variety of operating systems.  That's useful to a point, but not especially flexible.  Azul's appliance doesn't replace servers in this sense of substituting one virtualized instance for what might previously have been a discrete hardware device.  Instead, Azul ASSISTS existing servers with their Java processing needs with the result that fewer total servers are required. &lt;/p&gt;

&lt;p&gt;Servers aren't replaced, they are made unnecessary at a typical ratio of 10-to-one, according to Azul.  So what might have required 100 blade servers can be done FASTER (Azul claims 5-50X) with 10 blade servers and an Azul appliance.  Now that Azul box is not cheap, costing close to $1,000 per CPU core, but that's comparable to blade server prices and vastly cheaper than mainframe power that isn't nearly as flexible.&lt;/p&gt;

&lt;p&gt;And flexibility is what this is all about, because Azul's assistance is provided both transparently and transiently.  Java apps don't have to be rewritten to accept assistance from the Azul appliance.  If it is visible on the network, the appliance can assist ANY Java app, with that assistance coming in proportion to the amount of help required based on the number of cores available.&lt;/p&gt;

&lt;p&gt;Now imagine how this would work in a data center.  Unlike a traditional mainframe that would take over from some number of servers, the Azul box would assist EVERY server in the room as needed, so that you might need a big Azul box for every thousand or so servers, with that total number of servers dramatically diminished because of the dynamically shared overhead.&lt;/p&gt;

&lt;p&gt;This is simply more efficient computing -- something we don't often see.&lt;/p&gt;

&lt;p&gt;There are other concurrency architectures out there like Appistry (which I wrote about back when it was called Tsunami before we unfortunately HAD a Tsunami -- what sort of marketing bad luck is that?).  But where Appistry spreads the compute load concurrently across hundreds or thousands of computers, Azul ASSISTS hundreds or thousands of servers or server images with their compute requirements as needed.&lt;/p&gt;

&lt;p&gt;Bear Stearns runs its back office with Azul assistance, but many customers use Azul boxes to accelerate their websites.&lt;/p&gt;

&lt;p&gt;Since I am not a big company guy who cares very much about what big companies do, what I see exciting about Azul's approach is how it could be applied in the kinds of data centers where I am typically renting either virtual or dedicated servers.  If an Azul box were installed on that network, my little app would instantly and mysteriously run up to 50 times faster.&lt;/p&gt;

&lt;p&gt;Cool.&lt;/p&gt;</description>
	<pubDate>Fri, 29 Feb 2008 21:58:53 +0000</pubDate>
</item>
<item>
	<title>Barbie: Perl &amp; The Leap Year Day Babies</title>
	<guid isPermaLink="true">http://use.perl.org/~barbie/journal/35800?from=rss</guid>
	<link>http://use.perl.org/~barbie/journal/35800?from=rss</link>
	<description>&lt;p&gt; &lt;a href=&quot;http://www.theregister.co.uk/2008/02/29/leap_year_babies_attack_ballmer/&quot;&gt;The Register today&lt;/a&gt; (29th Feb 2008), has highlighted an all too common issue for several thousand people. Their birthdays fall on the leap day of a leap year. To emphasise their plight they have written &lt;a href=&quot;http://leapyearday.com/hr/freecode.html&quot;&gt;a snippet of perl code&lt;/a&gt; to show how easy it is to get the number of days in a year. Obviously it might be a little more robust if they use something like DateTime, but the general rule is there. They have now taken on Toys R Us and Microsoft to fix the problem in their websites and software respectively. I wish them luck :)&lt;/p&gt;</description>
	<pubDate>Fri, 29 Feb 2008 21:57:56 +0000</pubDate>
</item>
<item>
	<title>Nicholas Clark: spaces is a waste of space</title>
	<guid isPermaLink="true">http://use.perl.org/~nicholas/journal/35799?from=rss</guid>
	<link>http://use.perl.org/~nicholas/journal/35799?from=rss</link>
	<description>&lt;p&gt;So, it seems that every time I switch workspace, &lt;a href=&quot;http://www.apple.com/macosx/features/spaces.html&quot;&gt;Spaces&lt;/a&gt; helpfully
decides that I want Finder as the front most application. How useful.&lt;/p&gt;
&lt;p&gt;This makes Spaces a waste of space.&lt;/p&gt;
&lt;p&gt;Dear lazyweb, which virtual desktop system is useful?&lt;/p&gt;</description>
	<pubDate>Fri, 29 Feb 2008 21:56:35 +0000</pubDate>
</item>
<item>
	<title>Other Chris Dolans: A northern Uganda reading list</title>
	<guid isPermaLink="true">http://chrisblattman.blogspot.com/2008/02/northern-uganda-reading-list.html</guid>
	<link>http://chrisblattman.blogspot.com/2008/02/northern-uganda-reading-list.html</link>
	<description>I am often asked for recommended reading on the war in northern Uganda. The literature is vast, but a few works on culture, politics and history stand out. For history and analysis of the war, this ACORD volume presents the evolution of the war (and previous attempts at peace) from the perspective of numerous Ugandans. Also very good is the background material in this report by Tim Allen. This report from the Refugee Law Project (RLP) at Makerere University provides another fine analysis of the</description>
	<pubDate>Fri, 29 Feb 2008 21:56:18 +0000</pubDate>
</item>
<item>
	<title>Planet Parrot: chromatic: Perl 6 Design Minutes for 27 February 2008</title>
	<guid isPermaLink="true">http://use.perl.org/~chromatic/journal/35794?from=rss</guid>
	<link>http://use.perl.org/~chromatic/journal/35794?from=rss</link>
	<description>&lt;p&gt;The Perl 6 design team met by phone on 27 February 2008.  Larry, Allison, Patrick, Will, Jerry, Jesse, Nicholas, and chromatic attended.&lt;/p&gt;

&lt;p&gt; &lt;strong&gt;Larry:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;very busy with my day job right now&lt;/li&gt;
&lt;li&gt;clarified that multis and protos are automatically exported by default&lt;/li&gt;
&lt;li&gt;assumed that there's &lt;code&gt;is export&lt;/code&gt; on them&lt;/li&gt;
&lt;li&gt;you have to declare them with &lt;code&gt;my&lt;/code&gt; to get non-exported versions&lt;/li&gt;
&lt;li&gt;made some changes and defined something called interface versions&lt;/li&gt;
&lt;li&gt;subset of the version number&lt;/li&gt;
&lt;li&gt;the patchlevel doesn't matter when you require something with language tweaks&lt;/li&gt;
&lt;li&gt;only the interface version&lt;/li&gt;
&lt;li&gt;doing a lot of cleanup of &lt;em&gt;STD.pm&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;dekludging various things&lt;/li&gt;
&lt;li&gt;made a separate regular expression grammar&lt;/li&gt;
&lt;li&gt;derived from the Perl grammar&lt;/li&gt;
&lt;li&gt;allows us to override things like whitespace rules&lt;/li&gt;
&lt;li&gt;we use derivation for its original intent&lt;/li&gt;
&lt;li&gt;did a lot of work on the &lt;code&gt;gimme&lt;/code&gt; program that translate that&lt;/li&gt;
&lt;li&gt;cleanups came from noticing badness when I tried to run the Perl 5&lt;/li&gt;
&lt;li&gt;plenty of feedback from Patrick, Jonathan, and the rest of the gang&lt;/li&gt;
&lt;li&gt;added some rules to &lt;em&gt;STD.pm&lt;/em&gt; to add hooks for having an interactive parser that knows when you're done with user input&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;vws&lt;/code&gt; rule for vertical whitespace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Patrick:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the Parrot release went very smoothly&lt;/li&gt;
&lt;li&gt;compliments to everyone who put together release notes and updated things for me&lt;/li&gt;
&lt;li&gt;spent the weekend in Brussels at FOSDEM 2008&lt;/li&gt;
&lt;li&gt;my Perl 6 talk seems to have been well received&lt;/li&gt;
&lt;li&gt;lots of compliments and comments and renewed enthusiasm&lt;/li&gt;
&lt;li&gt;spent some time on the plane looking into getting Rakudo to use Parrot's HLL directives&lt;/li&gt;
&lt;li&gt;it'll take some refactoring to get some of the classes working there&lt;/li&gt;
&lt;li&gt;just methods and the way things get stored in namespaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Jerry:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;let's create a branch for that&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Patrick:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;that's a good idea&lt;/li&gt;
&lt;li&gt;probably just a branch to play in, then switch over in the trunk&lt;/li&gt;
&lt;li&gt;probably doable incrementally&lt;/li&gt;
&lt;li&gt;did some work on trying to improve the state of Unicode in Parrot&lt;/li&gt;
&lt;li&gt;want to use more Unicode in Rakudo&lt;/li&gt;
&lt;li&gt;get string tests passing, use French quotes&lt;/li&gt;
&lt;li&gt;I'm a little concerned that applying the patch will slow things down until we can do things in something other than UTF-8&lt;/li&gt;
&lt;li&gt;otherwise applying patches and keeping up with the excellent work done by Jonathan, Jerry, and others&lt;/li&gt;
&lt;li&gt;all of the &lt;em&gt;STD.pm&lt;/em&gt; changes have been really nice lately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Allison:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;working on the security PDD&lt;/li&gt;
&lt;li&gt;have a long list of features that we I include&lt;/li&gt;
&lt;li&gt;working on deciding a necessary and sufficient set of security features for the 1.0 release&lt;/li&gt;
&lt;li&gt;need the most useful features for our target contexts and target languages&lt;/li&gt;
&lt;li&gt;otherwise we could spend three years implementing security features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Jerry:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enjoying some peanut chocolate-coated candies&lt;/li&gt;
&lt;li&gt;updated p6doc before the release&lt;/li&gt;
&lt;li&gt;I don't think anyone's really using it yet though&lt;/li&gt;
&lt;li&gt;removed some deprecated compiler directives from Rakudo's grammar&lt;/li&gt;
&lt;li&gt;now that we have &lt;code&gt;fudge&lt;/code&gt; working&lt;/li&gt;
&lt;li&gt;working on a patch to allow you to write Rakudo runtime libraries in Perl 6&lt;/li&gt;
&lt;li&gt;Zev Benjamin sent the patch to the list&lt;/li&gt;
&lt;li&gt;it had some bugs, but most of those are fixed&lt;/li&gt;
&lt;li&gt;there seems to be one cross-compiler problem remaining&lt;/li&gt;
&lt;li&gt;made some progress on a YAML dumper to use for dumping AST match objects&lt;/li&gt;
&lt;li&gt;committed a config patch to detect &lt;code&gt;gettext&lt;/code&gt; so we can work toward internationalizing Parrot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Jesse:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;talked to Mitchell Charity about the state of Pugs&lt;/li&gt;
&lt;li&gt;he's looking into a way to extract a standardized AST for all of the various Pugsian implementations for anyone to play with different backends&lt;/li&gt;
&lt;li&gt;a little glue around the kp6 AST to target from either end&lt;/li&gt;
&lt;li&gt;hopefully let the various folks in the Pugs community actually interoperate&lt;/li&gt;
&lt;li&gt;instead of having a half-dozen half-implemented full stacks hanging around&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;c:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;working on GC problems&lt;/li&gt;
&lt;li&gt;have a workaround I think fixes things&lt;/li&gt;
&lt;li&gt;sort of expensive, but we need to rethink part of our strategy&lt;/li&gt;
&lt;li&gt;workaround will probably stick around until we revise the GC in a couple of months&lt;/li&gt;
&lt;li&gt;did some profiling; think I'll tackle PIR profiling next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Nicholas:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;found a bug in Perl 1 configure and patched it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Jerry:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;do you have someone to bounce your security ideas off of?&lt;/li&gt;
&lt;li&gt;it would help me to have this more visible&lt;/li&gt;
&lt;li&gt;I don't want it to slow you down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Allison:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this is just the initial draft&lt;/li&gt;
&lt;li&gt;the whole list will get to see and review the draft&lt;/li&gt;
&lt;li&gt;or do you want to see the mental process of what I consider and discard?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Jerry:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I just wonder if you would have an easier time deciding what we need for 1.0 if you could discuss pros and cons with someone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Allison:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I've been trying to write the PDD as a single coherent set of things&lt;/li&gt;
&lt;li&gt;haven't written pros and cons within the PDD&lt;/li&gt;
&lt;li&gt;otherwise it'll end up about 20 pages long&lt;/li&gt;
&lt;li&gt;so many different approaches for the same thing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Jerry:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;years ago, &lt;em&gt;docs/dev/&lt;/em&gt; was the place for those&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Allison:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'll probably push the current document out today or tomorrow&lt;/li&gt;
&lt;li&gt;we'll start a series of discussions about various different topics&lt;/li&gt;
&lt;li&gt;a lot of it depends on what language implementors and application designers want&lt;/li&gt;
&lt;li&gt;the biggest thing I want is people asking for missing features and telling me they don't want other features&lt;/li&gt;
&lt;li&gt;what I'm doing is the core seed of that process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Jerry:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hopefully interested people will read these minutes or a weblog post&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Allison:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'll do my usual post to the mailing list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;c:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;maybe you could post it to your journal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;strong&gt;Allison:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which journal?&lt;/li&gt;
&lt;li&gt;I've been thinking of setting up a dedicated &lt;a href=&quot;http://www.parrotblog.org/&quot;&gt;Parrot blog&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Fri, 29 Feb 2008 21:42:09 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: FOSDEM</title>
	<guid isPermaLink="false">http://use.perl.org/~acme/journal/35798?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/243294074/35798</link>
	<description>&lt;a href=&quot;http://www.fosdem.org/2008/&quot;&gt;FOSDEM&lt;/a&gt; last weekend was huge - 4000 geeks and hundreds of speakers. Lots of interesting talks in the hallways and I particularly liked the &lt;a href=&quot;http://jruby.codehaus.org/&quot;&gt;JRuby&lt;/a&gt; talk as an example of how an open source project can continue without its founders. I really didn't like Patrick's Perl 6 talk: a lot of it was along the lines of &quot;Perl 5 doesn't have this, but Perl 6 will&quot; with examples which Perl 5.10 actually has, or &quot;Perl 6 has feature X (e.g. threads) built in from the beginning&quot; which is completely untrue. It was a bit sad really, but at least the room was mostly full so people haven't completely written off Perl.&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/243294074&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 29 Feb 2008 21:42:09 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: On the effects of lowering your SpamAssassin threshold</title>
	<guid isPermaLink="false">http://taint.org/2008/02/29/155648a.html</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/243363733/155648a.html</link>
	<description>&lt;p&gt;So I was chatting to &lt;a href=&quot;http://www.oblomovka.com&quot;&gt;Danny O’Brien&lt;/a&gt; a few days ago.  He noted that he’d reduced his Spamassassin “this is spam” threshold from the default 5.0 points to 3.7, and was wondering what that &lt;em&gt;meant&lt;/em&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I know what it means in raw technical terms — spamassassin now marks anything &amp;gt;3.7 as spam, as opposed to the default of five. But given the genetic algorithm way that SA calculates the rule scoring, what does lowering the score mean? That I’m more confident that stuff marked ham is stuffed marked ham than the average person? That my bayesian scoring is now really good?&lt;/p&gt;
  
  &lt;p&gt;Do people usually do this without harmful side-effects? What does it mean about them if they do it?&lt;/p&gt;
  
  &lt;p&gt;Does it make me a good person? Will I smell of ham? These are the things that keep me awake at night.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s a good question! Here’s what I responded with — it occurs to me that this
is probably quite widely speculated about, so let’s blog it here, too.&lt;/p&gt;

&lt;p&gt;As you tweak the threshold, it gets more or less aggressive.&lt;/p&gt;

&lt;p&gt;By default, we target a false positive rate of less than 0.1% — that means 1
FP, a ham marked as spam incorrectly, per 1000 ham messages.  Last time the
scores were generated, we ran our usual accuracy estimation tests, and got a
false positive rate of 0.06% (1 in 1667 hams) and a false negative rate of
1.49% (1 in 67 spams) for the default threshold of 5.0 points.  That’s assuming
you’re using network tests (you should be) and have Bayes training (this is
generally the case after running for a few weeks with autolearning on).&lt;/p&gt;

&lt;p&gt;If you lower the threshold, then, that trades off the false negatives (reducing
them — less spam getting past) in exchange for more false positives (hams
getting caught). In those tests, here’s some figures for other thresholds:&lt;/p&gt;

&lt;p&gt;SUMMARY for threshold 3.0: False positives: 290 0.43% False negatives: 313 0.26%&lt;/p&gt;

&lt;p&gt;SUMMARY for threshold 4.0: False positives: 104 0.15% False negatives: 1084 0.91%&lt;/p&gt;

&lt;p&gt;SUMMARY for threshold 4.5: False positives: 68 0.10% False negatives: 1345 1.13%&lt;/p&gt;

&lt;p&gt;so you can see FPs rise quite quickly as the threshold drops.  At 4.0 points,
the nearest to 3.7, 1 in 666 ham messages (0.15%) will be marked incorrectly as
spam. That’s nearly 3 times as many FPs as the default setting’s value (0.06%).
On the other hand, only 1 in 109 spams will be mis-filed.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://svn.apache.org/repos/asf/spamassassin/trunk/rules/STATISTICS-set3.txt&quot;&gt;Here’s the reports from the last release&lt;/a&gt;, with all those figures for different
thresholds — should be useful for figuring out the likelihoods!&lt;/p&gt;

&lt;p&gt;In fact, let’s get some graphs from that report.   Here is a graph of false positives (in orange) vs false
negatives (in blue) as the threshold changes…&lt;/p&gt;

&lt;p&gt;&lt;img width=&quot;500&quot; src=&quot;http://taint.org/x/2008/fp_fn_rates_main.png&quot; height=&quot;400&quot; /&gt;&lt;/p&gt;

&lt;p&gt;and, to illustrate the details a little better, zoom in to the area between 0% and 1%…&lt;/p&gt;

&lt;p&gt;&lt;img width=&quot;500&quot; src=&quot;http://taint.org/x/2008/fp_fn_rates_zoomed.png&quot; height=&quot;200&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can see that the default threshold of 5 isn’t where the FP% and FN% rates meet; instead, it’s got a much lower FP% rate than FN%.  This is because we consider FPs to be much more dangerous than missed spams, so we try to avoid them to a higher degree.&lt;/p&gt;

&lt;p&gt;An alternative, more standardized way to display this info is as a &lt;a href=&quot;http://en.wikipedia.org/wiki/Receiver_operating_characteristic&quot;&gt;Receiver Operating Characteristic curve&lt;/a&gt;, which is basically a plot of the true positive rate vs false positives, on a scale from 0 to 1.&lt;/p&gt;

&lt;p&gt;Here’s the SpamAssassin ROC curve:&lt;/p&gt;

&lt;p&gt;&lt;img width=&quot;500&quot; src=&quot;http://taint.org/x/2008/roc.png&quot; height=&quot;400&quot; /&gt;&lt;/p&gt;

&lt;p&gt;More usefully, here’s the ROC curve zoomed in nearer the “perfect accuracy” top-left corner:&lt;/p&gt;

&lt;p&gt;&lt;img width=&quot;500&quot; src=&quot;http://taint.org/x/2008/roc_zoomed.png&quot; height=&quot;400&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, this type of graph isn’t much use for picking a SpamAssassin threshold.  GNUplot doesn’t allow individual points to be marked with the value from a certain column, otherwise this would be much more useful, since we’d be able to tell which threshold value corresponds to each point.  C’est la vie!&lt;/p&gt;

&lt;p&gt;(GNUplot commands to render these graphs are &lt;a href=&quot;http://taint.org/wk/FpFnGraphs&quot;&gt;here&lt;/a&gt;.)&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/243363733&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 29 Feb 2008 21:42:09 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: SVN::Notify 2.70: Output Filtering and Character Encoding</title>
	<guid isPermaLink="false">http://www.justatheory.com/computers/programming/perl/modules/svnnotify-2.70.html</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/243437262/svnnotify-2.70.html</link>
	<description>&lt;p&gt;I’m very pleased to announce the release of &lt;a href=&quot;http://search.cpan.org/dist/SVN-Notify/&quot; title=&quot;SVN::Notify on CPAN&quot;&gt;SVN::Notify&lt;/a&gt; 2.70. You can see an example of its colordiff output &lt;a href=&quot;http://www.justatheory.com/computers/programming/perl/modules/svnnotify-2.70_colordiff_example.html&quot; title=&quot;Example output from SVN::Notify::HTML::ColorDiff 2.70&quot;&gt;here&lt;/a&gt;. This is a major release that I’ve spent the last several weeks polishing and tweaking to get just right. There are quite a few &lt;a href=&quot;http://search.cpan.org/src/DWHEELER/SVN-Notify-2.70/Changes&quot; title=&quot;SVN::Notify Changes&quot;&gt;changes&lt;/a&gt;, but the two most important are imporoved character encoding support and output filtering.&lt;/p&gt;

&lt;h3&gt;Improved Character Encoding Support&lt;/h3&gt;

&lt;p&gt;I’ve had a number of bug reports regarding issues with character encodings. Particularly for folks working in Europe and Asia, but really for &lt;em&gt;anyone&lt;/em&gt; using multibyte characters in their source code and log messages (and we all do nowadays, don’t we?), it has been difficult to find the proper incantation to get SVN::Notify to convert data from and to their proper encodings. Using a patch from Toshikazu Kinkoh as a starting-point, and with a lot of reading and experimentation, as well as regular and patient tests on Toshikazu’s and Martin Lindhe’s production systems, I think I’ve finally got it nailed down.&lt;/p&gt;

&lt;p&gt;Now you can use the &lt;code&gt;--encoding&lt;/code&gt; (formerly &lt;code&gt;--charset&lt;/code&gt;), &lt;code&gt;--svn-encoding&lt;/code&gt;, and &lt;code&gt;--diff-encoding&lt;/code&gt; options—as well as &lt;code&gt;--language&lt;/code&gt;—to get SVN::Notify to do the right thing. As long as your Subversion server’s OS supports an appropriate locale, you should be golden (mine is old, with no UTF-8 locales :\). And if all else fails, you can still set the &lt;code&gt;$LANG&lt;/code&gt; environment variable before executing &lt;code&gt;svnnotify&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There is actually a fair bit to know about encodings to get it to work properly, but if you use UTF-8 throughout and your OS supports UTF-8 locales, you shouldn’t have to do anything. You might have to set &lt;code&gt;--language&lt;/code&gt; in order to get it to use the proper locale. See the new &lt;a href=&quot;http://search.cpan.org/dist/SVN-Notify/lib/SVN/Notify.pm#Character_Encoding_Support&quot; title=&quot;Character Encoding Support in SVN::Notify&quot;&gt;documentation of the encoding support&lt;/a&gt; for all the details. And if you still have problems, please do &lt;a href=&quot;https://rt.cpan.org/Ticket/Create.html?Queue=SVN-Notify&quot; title=&quot;Open a Ticket for SVN::Notify&quot;&gt;let me know&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Output Filtering&lt;/h3&gt;

&lt;p&gt;Much sexier is the addition of output filtering in SVN::Notify 2.70. I got pretty tired of getting feature requests for what are essentially formatting modifications, such as &lt;a href=&quot;https://rt.cpan.org/Ticket/Display.html?id=26944&quot; title=&quot;SVN::Notify feature requst for KDE keywords support&quot;&gt;this one&lt;/a&gt; requesting support for KDE-style &lt;a href=&quot;http://techbase.kde.org/Policies/SVN_Commit_Policy#Special_keywords_in_SVN_log_messages&quot; title=&quot;KDE TechBase: Special keywords in SVN log messages&quot;&gt;keyword support&lt;/a&gt;. I myself was using &lt;a href=&quot;http://trac.edgewall.org/wiki/WikiFormatting&quot; title=&quot;Trac Wiki Formatting Syntax&quot;&gt;Trac wiki syntax&lt;/a&gt; in commit messages on a &lt;a href=&quot;http://iwantsandy.com/&quot; title=&quot;Sandy: Your virtual personal assistant&quot;&gt;recent project&lt;/a&gt; and wanted to see them converted to HTML for messages output by SVN::Notify::HTML::ColorDiff.&lt;/p&gt;

&lt;p&gt;So I finally sat down and gave some though on how to implement a simple plugin architecture for SVN::Notify. When I realized that it was generally just formatting that people wanted, it became simpler: I just needed a way to allow folks to write simple output filters. The solution I came up with was to just use Perl. Output filters are simply subroutines named for the kind of output they filter. They live in perl packages. That’s it.&lt;/p&gt;

&lt;p&gt;For example, say that your developers write their commit log messages in &lt;a href=&quot;http://www.textism.com/tools/textile/&quot; title=&quot;Textile&quot;&gt;Textile&lt;/a&gt;, and rather than receive them stuck inside &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; tags, you’d like them converted to HTML. It’s simple. Just put this code in a Perl module file:&lt;/p&gt;

&lt;pre&gt;package SVN::Notify::Filter::Textile;
use Text::Textile ();

sub log_message {
    my ($notifier, $lines) = @_;
    return $lines unless $notify-&amp;gt;content_type eq 'text/html';
    return [ Text::Textile-&amp;gt;new-&amp;gt;process( join $/, @$lines ) ];
}
&lt;/pre&gt;

&lt;p&gt;Put the file, &lt;em&gt;SVN/Notify/Filter/Textile.pm&lt;/em&gt; somewhere in a Perl library directory. Then use the new &lt;code&gt;--filter&lt;/code&gt; option to &lt;code&gt;svnnotify&lt;/code&gt; to put it to work:&lt;/p&gt;

&lt;pre&gt;svnnotify -p &quot;$1&quot; -r &quot;$2&quot; --handler HTML::ColorDiff --filter Textile
&lt;/pre&gt;

&lt;p&gt;Yep, that’s it! SVN::Notify will find the filter module, load it, register its filtering subroutine, and then call it at the appropriate time. Of course, there are a lot of things you can filter; consult the  &lt;a href=&quot;http://search.cpan.org/dist/SVN-Notify/lib/SVN/Notify/Filter.pm&quot; title=&quot;SVN::Notify Output Filtering Documentation&quot;&gt;complete documentation&lt;/a&gt; for all of the details. But hopefully this gives you a flavor for how easy it is to write new filters for SVN::Notify. I’m hoping that all those folks who want featurs can now stop bugging me and writing their own filters to do the job, and uploading them to CPAN for all to share!&lt;/p&gt;

&lt;p&gt;To get things started, I scratched my own itch, writing a &lt;a href=&quot;http://search.cpan.org/dist/SVN-Notify/lib/SVN/Notify/Filter/Trac.pm&quot; title=&quot;SVN::Notify::Filter::Trac Documentation&quot;&gt;Trac filter&lt;/a&gt; myself. The filter is almost as simple as the Textile example above, but I also spent quite a bit of time tweaking the CSS so that most of the Trac-generated HTML looks good. You can see an example &lt;a href=&quot;http://www.justatheory.com/computers/programming/perl/modules/svnnotify-2.70_trac_example.html&quot; title=&quot;Example output from SVN::Notify 2.70 and modified by the Trac filter&quot;&gt;right here&lt;/a&gt;. Thanks to a number of bug fixes in  &lt;a href=&quot;http://search.cpan.org/dist/Text-Trac/&quot;&gt;Text::Trac&lt;/a&gt;, as well as Trac-specific CSS added via a filter on CSS output, it works beautifully. If I’m feeling motivated in the next week or so, I’ll create a separate CPAN distribution with just a Markdown filter and upload it. That will create a nice distriution example for folks to copy to creat their own. Or maybe someone on the Lazy Web Will do it for me! Maybe &lt;em&gt;you?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I wish I’d thought to do this from the beginning; it would have saved me from having to add so many features/cruft to SVN::Notify over the years. Here’s a quick list of the features that likely could have been implemented via filters instead of added to the core:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;--user-domain&lt;/code&gt;: Combine the SVN username with a domain for the &lt;q&gt;From&lt;/q&gt; header.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--add-header&lt;/code&gt;: Add a header to the message.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--reply-to&lt;/code&gt;: Add a specific header to the message.&lt;/li&gt;
  &lt;li&gt;SVN::Notify::HTML::ColorDiff: Frankly, looking back on it, I don’t know why I didn’t just put this support right into SVN::Notify::HTML. But even if I hadn’t, it could have been implemented via filters.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--subject-prefix:&lt;/code&gt;: Modify the message subject.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--subject-cx&lt;/code&gt;: Add the commit context to the subject.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--strip-cx-regex&lt;/code&gt;: More subject context modification.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--no-first-line&lt;/code&gt;: Another subject filter.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--max-sub-length&lt;/code&gt;: Yet another!&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--max-diff-length&lt;/code&gt;: A filter could truncate the diff, although this might be tricky with the HTML formatting.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--author-url&lt;/code&gt;: Modify the metadata section to add a link to the author URL.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--revision-url&lt;/code&gt;: Ditto for the revision URL.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--ticket-map&lt;/code&gt;: Filter the log message for various ticketing system strings to convert to URLs. This also encompasses the old &lt;code&gt;--rt-url&lt;/code&gt;, &lt;code&gt;--bugzilla-url&lt;/code&gt;, &lt;code&gt;--gnats-url&lt;/code&gt;, and &lt;code&gt;--jira-url&lt;/code&gt; options.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--header&lt;/code&gt;: Filter the beginning of the message.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--footer&lt;/code&gt;: Filter the end of the message.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--linkize&lt;/code&gt;: Filter the log message to convert URLs to links for HTML messages.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--css-url&lt;/code&gt;: Filter the CSS to modify it, or filter the start of the HTML to add a link to an external CSS URL.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;--wrap-log&lt;/code&gt;: Reformat the log message for HTML.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, &lt;em&gt;really!&lt;/em&gt; That’s about half the functionality right there. I’m glad that I won’t have to add any more like that; filters are a &lt;em&gt;much&lt;/em&gt; better way to go.&lt;/p&gt;

&lt;p&gt;So download it, install it, write some filters, get your multibyte characters output properly, and enjoy! And as usual, send me your &lt;a href=&quot;https://rt.cpan.org/Ticket/Create.html?Queue=SVN-Notify&quot; title=&quot;Open a Ticket for SVN::Notify&quot;&gt;bug reports&lt;/a&gt;, but implement your own improvements using filters!&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/243437262&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 29 Feb 2008 21:42:09 +0000</pubDate>
	<author>david@justatheory.com (David Wheeler)</author>
</item>
<item>
	<title>Slashdot Apple: Mac OS X Secretly Cripples Non-Apple Software</title>
	<guid isPermaLink="false">http://apple.slashdot.org/article.pl?sid=08/02/28/2339246&amp;from=rss</guid>
	<link>http://rss.slashdot.org/~r/Slashdot/slashdotApple/~3/243073493/article.pl</link>
	<description>spikedLemur writes &quot;Vladimir Vukicevic of the Firefox team stumbled upon some questionable practices from Apple while trying to improve the performance of Firefox. Apparently, Apple is using some undocumented APIs that give Safari a significant performance advantage over other browsers. Of course, &quot;undocumented&quot; means that non-Apple developers have to try and reverse-engineer these interfaces to get the same level of performance. You really have to wonder what Apple is thinking, considering the kind of retaliation Microsoft has gotten for similar practices.&lt;p&gt;&lt;a href=&quot;http://apple.slashdot.org/article.pl?sid=08/02/28/2339246&amp;amp;from=rss&quot;&gt;Read more of this story&lt;/a&gt; at Slashdot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotApple?a=u8eonl&quot;&gt;&lt;img src=&quot;http://rss.slashdot.org/~a/Slashdot/slashdotApple?i=u8eonl&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://rss.slashdot.org/~r/Slashdot/slashdotApple/~4/243073493&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 29 Feb 2008 21:40:46 +0000</pubDate>
</item>
<item>
	<title>Parrot Blog: What is Parrot?</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-2772753380875006713.post-9033906797067809899</guid>
	<link>http://www.parrotblog.org/2008/02/what-is-parrot.html</link>
	<description>Parrot is a virtual machine for dynamic languages like Python, PHP, Ruby, and Perl. A dynamic language is one that allows things like extension of the code base, subroutine and class definition, and altering the type system at runtime. Static languages like Java or C# restrict these features to compile time. If this sounds like an edgy idea, keep in mind that Lisp, one of the prime examples of a</description>
	<pubDate>Fri, 29 Feb 2008 11:19:53 +0000</pubDate>
</item>
<item>
	<title>Barbie: UKUUG Spring 2008 Conference: 31 Mar - 2 Apr</title>
	<guid isPermaLink="true">http://use.perl.org/~barbie/journal/35785?from=rss</guid>
	<link>http://use.perl.org/~barbie/journal/35785?from=rss</link>
	<description>&lt;p&gt;The &lt;a href=&quot;http://spring2008.ukuug.org/&quot;&gt;UKUUG Spring 2008 Conference&lt;/a&gt; will be held at the &lt;i&gt;Birmingham Conservatoire&lt;/i&gt; (&lt;a href=&quot;http://www.visitbirmingham.com/exec/229738/29614/PROFILE=NDpTWURfQkhNMV8xOTcxMTQ3OlNZRF9CSE0xXzExMTIyOTc6RU5HTElTSDpHQjo6MTIwNDE5NTg3Mjo6Og==&quot;&gt;Birmingham&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Birmingham&quot;&gt;UK&lt;/a&gt;) from &lt;b&gt;31st March to 2nd April 2008&lt;/b&gt;. Monday features 3 full day tutorials, with Tuesday and Wednesday taken up by shorter technical presentations. You can see the current schedule &lt;a href=&quot;http://spring2008.ukuug.org/timetable.html&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;Birmingham Perl Mongers are helping to coordinate the event, with several Perl Mongers from around the UK offering to present talks. Dave Cross will be holding a one-day Perl tutorial of his Teach-In session, with Matt S Trout, Tom Hukins, Mike Whitaker, Daniel Giribet, Barnabas Aspray, Mark Gledhill, Robin Doran, Brian McCauley, Jon Allen and me presenting technical talks discussing Perl.
&lt;/p&gt;&lt;p&gt;The event is a UKUUG event and there are discounted rates for UKUUG members. You can attend just a tutorial, just the technical talk days or the whole 3 days. See &lt;a href=&quot;http://spring2008.ukuug.org/booking.html&quot;&gt;Payment Details&lt;/a&gt; for all the options and prices. For those travelling from further afield who would like to know of some local hotels, the &lt;a href=&quot;http://spring2008.ukuug.org/accommodation.html&quot;&gt;Accommodation&lt;/a&gt; page lists several nearby hotels. The &lt;a href=&quot;http://spring2008.ukuug.org/venue.html&quot;&gt;conference venue&lt;/a&gt; is situated at the west end of New Street and is within 5-10 minutes walk of several hotels, including all those available during YAPC::Europe in 2006. Both GUADEC and PyConUK were held there in 2007, and proved a very suitable venue.
&lt;/p&gt;&lt;p&gt;The Early Bird rates for the event are due to end on &lt;i&gt;March 10th&lt;/i&gt;, so if you're thinking of coming along, please book soon to take advantage of the reduced rates.&lt;/p&gt;</description>
	<pubDate>Thu, 28 Feb 2008 21:57:57 +0000</pubDate>
</item>
<item>
	<title>use Perl journals: [weiqk] test</title>
	<guid isPermaLink="true">http://use.perl.org/~weiqk/journal/?from=rss</guid>
	<link>http://use.perl.org/~weiqk/journal/?from=rss</link>
	<pubDate>Thu, 28 Feb 2008 21:56:15 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Retries in Net::Amazon::S3</title>
	<guid isPermaLink="false">http://use.perl.org/~acme/journal/35788?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/242833017/35788</link>
	<description>One of the slight issues with Amazon's &lt;a href=&quot;http://s3.amazonaws.com/&quot;&gt;Simple Storage Service&lt;/a&gt; is that by design sometimes the service returns a HTTP 500 Internal Server Error response and the client &lt;a href=&quot;http://developer.amazonwebservices.com/connect/thread.jspa?messageID=80529&amp;amp;tstart=0&quot;&gt;should retry&lt;/a&gt; the request. Previously, applications which use my &lt;a href=&quot;http://search.cpan.org/dist/Net-Amazon-S3/&quot;&gt;Net::Amazon::S3&lt;/a&gt; module, such as &lt;a href=&quot;http://search.cpan.org/dist/Brackup/&quot;&gt;Brackup&lt;/a&gt;,
 had to handle the retries themselves - but no more! With the magic that is &lt;a href=&quot;http://search.cpan.org/dist/LWP-UserAgent-Determined/&quot;&gt;LWP::UserAgent::Determined&lt;/a&gt;
you can now pass a retry option into the version 0.42 of &lt;a href=&quot;http://search.cpan.org/dist/Net-Amazon-S3/&quot;&gt;Net::Amazon::S3 &lt;/a&gt;and it will handle the retries with &lt;a href=&quot;http://en.wikipedia.org/wiki/Exponential_backoff&quot;&gt;exponential backoff&lt;/a&gt; for you.&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/242833017&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 28 Feb 2008 21:21:52 +0000</pubDate>
</item>
<item>
	<title>Mozilla DevNews: flag changes coming for this week</title>
	<guid isPermaLink="true">http://developer.mozilla.org/devnews/index.php/2008/02/27/flag-changes-coming-for-this-week/</guid>
	<link>http://developer.mozilla.org/devnews/index.php/2008/02/27/flag-changes-coming-for-this-week/</link>
	<description>&lt;p&gt;To facilitate the triage we’re going to be doing this week for Fx3/1.9 we’ll be making some changes to various flags.  There’s a few goals here:&lt;/p&gt;
&lt;p&gt;* Identifying the set of bugs that will absolutely block the release of Firefox 3&lt;br /&gt;
* From those bugs, identify the set of bugs that we need to ship in a beta to get wider testing before ship.&lt;br /&gt;
* Ensure that bugs we won’t get done for this release don’t get lost in the shuffle.&lt;/p&gt;
&lt;p&gt;In order to do this, we are going to work against the following plan, starting Real Soon Now:&lt;/p&gt;
&lt;p&gt;* The current blocking1.9 flag will be renamed to tracking1.9 on a temporary basis.&lt;br /&gt;
* A new blocking1.9 flag will be created, along with a wanted-next flag to track bugs that won’t make 1.9.0 but should be tracked.&lt;br /&gt;
* All b4 blockers will move over to the new blocking flag immediately.&lt;br /&gt;
* All outstanding nominations against the old blocking flag will be migrated as well.&lt;br /&gt;
* Drivers will triage all of the open bugs marked as tracking1.9+, moving flags to one or more of blocking1.9, wanted-next, or wanted1.9.0.x as appropriate.  the tracking1.9 flag will be cleared as we go.&lt;br /&gt;
* When there are no bugs with the tracking1.9 flag left, we’ll obsolete the flag and rename it to blocking1.9 so historical queries continue to work.&lt;/p&gt;
&lt;p&gt;For developers and triagers:&lt;/p&gt;
&lt;p&gt;Please don’t be alarmed if your P1/P2 bugs no longer appear as blockers, we’ll be retriaging aggressively and plan to be complete this week.  If you have opinions on your bugs, please add comments making your recommendations for drivers.&lt;/p&gt;
&lt;p&gt;The new blocking1.9 should be used like the old one, both for nominating blockers for beta 4 and for final.  If a bug was previously marked as a blocker but hasn’t been retriaged, please nominate again to expedite the process.&lt;/p&gt;
&lt;p&gt;For questions or feedback, please see the matching post in dev.planning.&lt;/p&gt;</description>
	<pubDate>Thu, 28 Feb 2008 01:01:33 +0000</pubDate>
</item>
<item>
	<title>José Castro: Lisbon.pm Tech Meeting #8</title>
	<guid isPermaLink="true">http://use.perl.org/~cog/journal/35781?from=rss</guid>
	<link>http://use.perl.org/~cog/journal/35781?from=rss</link>
	<description>Yet another tech meeting! Today!&lt;br /&gt;&lt;br /&gt;Yeah, yeah, I know it's short notice, but even if this doesn't reach potential attendees in time, at least we're putting the word out there of what we're doing.&lt;br /&gt;&lt;br /&gt;The meeting takes place today, starting at 21:30, on the IST facilities in Lisbon (Alameda).&lt;br /&gt;&lt;br /&gt;The talks:&lt;br /&gt;&lt;br /&gt;
        * Namespaces, typeglobs, closures and references, by Daniel Ruoso&lt;br /&gt;
        * DBI-Link 3.0, by David Fetter&lt;br /&gt;
        * Wrap-up &amp;amp;&amp;amp; upcoming events (workshops, training, etc.), by José Castro&lt;br /&gt;&lt;br /&gt;Attendance is free.&lt;br /&gt;&lt;br /&gt;Join our &lt;a href=&quot;http://lisbon.pm.org/&quot;&gt;mailing list&lt;/a&gt; if you need more details on how to find us.</description>
	<pubDate>Wed, 27 Feb 2008 22:00:18 +0000</pubDate>
</item>
<item>
	<title>José Castro: Portuguese Perl Workshop 2008 :: Call for Talks</title>
	<guid isPermaLink="true">http://use.perl.org/~cog/journal/35777?from=rss</guid>
	<link>http://use.perl.org/~cog/journal/35777?from=rss</link>
	<description>This is the official Call For Talks for the very first Portuguese Perl Workshop.&lt;br /&gt;&lt;br /&gt;We are now accepting talk proposals in English or in Portuguese that are 5, 20 or 40 minutes long.&lt;br /&gt;&lt;br /&gt;The deadline for talk submission if April 30th, but don't you go around waiting, &lt;a href=&quot;http://workshop.perl.pt/ptpw2008/newtalk&quot;&gt;do it now&lt;/a&gt;!</description>
	<pubDate>Wed, 27 Feb 2008 22:00:18 +0000</pubDate>
</item>
<item>
	<title>Adam Kennedy: Goodbye USA</title>
	<guid isPermaLink="true">http://use.perl.org/~Alias/journal/35776?from=rss</guid>
	<link>http://use.perl.org/~Alias/journal/35776?from=rss</link>
	<description>&lt;a href=&quot;http://ap.google.com/article/ALeqM5jsanM66tszKz1zFq0LOG4XvWS7zAD8V293480&quot;&gt;http://ap.google.com/article/ALeqM5jsanM66tszKz1zFq0LOG4XvWS7zAD8V293480&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Most of the business and economics people I respect have been saying for a couple of years now that the US economy is &quot;cactus&quot;. The first people to put their balls on the line were saying this in 2004, anticipating the like effects of the massive stimulation caused by the interest rate falls of the time.&lt;br /&gt;&lt;br /&gt;Through 2005 and 2006, opinion start to line up behind the the position that the scenario was becoming inevitable, with no escape options left.&lt;br /&gt;&lt;br /&gt;The housing bubble collapse, and resulting world credit squeeze, was merely the trigger.&lt;br /&gt;&lt;br /&gt;The underlying cause of the whole situation is a problem called a &quot;triple deficit&quot;.&lt;br /&gt;&lt;br /&gt;The idea of the triple deficit is that the health of a country's economic, and the risk of various policy actions, can be determined by examining 3 main cash flow indicators in a combined fashion.&lt;br /&gt;&lt;br /&gt;1. Public Accounts (Government Surplus/Deficit)&lt;br /&gt;&lt;br /&gt;2. Private Accounts (Citizen and Corporate Surplus/Deficit)&lt;br /&gt;&lt;br /&gt;3. Trade Accounts (Trade Surplus/Deficit)&lt;br /&gt;&lt;br /&gt;While deficits are generally seen as &quot;bad&quot;, the triple deficit concept suggests that deficits in individual elements can be benign if they are balanced by the other elements.&lt;br /&gt;&lt;br /&gt;Under these rules, a high-exporting country like Germany or China can make a decision to spend big and run up big government debts if it needs to, because it is healthy in overall terms.&lt;br /&gt;&lt;br /&gt;The dangerous scenario from which negative consequences seem to always result is the situation in which you simultaneously have public debt, private debt, AND trade debt. The longer it lasts, and the higher the debt levels (in relative terms of course) the worst the final outcome.&lt;br /&gt;&lt;br /&gt;For more background, there is a very interesting recent paper produced by the Budapest College of Management, looking at the state of Hungary's current triple-deficit as well.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://tinyurl.com/2k4vfv&quot;&gt;http://tinyurl.com/2k4vfv&lt;/a&gt; (PDF file)&lt;br /&gt;&lt;br /&gt;Ever since the dot-com crash the US has been running with a high government deficit (now close to but not quite record levels in GDP terms), a high private deficit (made worse by the low interest rates and resulting credit and housing glut) and a high trade deficit (thanks to China and Walmart-and-friends).&lt;br /&gt;&lt;br /&gt;The initial inevitable consequences of this are in full swing now. The large fall in the US dollar is by now obvious to all and sundry.&lt;br /&gt;&lt;br /&gt;Warren Buffet made a major bet on this move a while back, moving a vast sum of money into the Brazillian currency. (a strong growing energy-independant democracy with high resources)&lt;br /&gt;&lt;br /&gt;Buffet is particular interesting to watch because the cash pile he is sitting on is so large that he is unable to invest in short term events without his moves affecting those markets. As economic entities get larger, their performance inevitably approaches the performance of the economy as a whole.&lt;br /&gt;&lt;br /&gt;So he is limited to betting mainly on country-scale and long term trends.&lt;br /&gt;&lt;br /&gt;The current fall helps address the manufactured goods component of the trade deficit in particular, because it effectively imposes a trade tariff, making local manufacturing more competitive against foreign manufacturing.&lt;br /&gt;&lt;br /&gt;Buffet recently bought a giant US generalized manufacturing conglomerate, effectively betting on US manufacturing as a whole.&lt;br /&gt;&lt;br /&gt;Unfortunately, here is where things get ugly.&lt;br /&gt;&lt;br /&gt;Although the currency fall helps manufacturing, there's lag involved, particularly in areas where manufacturing has largely died domestically. Thing textiles, toys and light bulbs. Industries you can't just bootstrap overnight.&lt;br /&gt;&lt;br /&gt;Worse, the US also has a huge energy deficit, which can't be as easily correct by a drop in the US dollar. In fact, since energy prices controlled by supply/demand at a global level, the fall in the US dollar results in a very significant price spike in the cost of energy, above and beyond the underlying increases in energy prices.&lt;br /&gt;&lt;br /&gt;The combination of rising import prices on household expenses and rising energy prices together creates a major risk of one of the most dangerous economic beats, &quot;stagflation&quot;.&lt;br /&gt;&lt;br /&gt;Stagflation is so dangerous because there's very little you can do about it. The Reserve Banks, whose normal job it is to control inflation, has one big weapon. Interest rates.&lt;br /&gt;&lt;br /&gt;Under normal circumstances, with inflation driven by excessive economic activity, a rise in interest rates dampens this activity, and helps bring inflation undercontrol.&lt;br /&gt;&lt;br /&gt;In stagflation, inflation is high DESPITE the economy being weak. Interest rate rises have less of an effect on stagflation and can easily be pushed too far (the effect of 15%+ home loan rates and the resulting recession from the 80s is burned into the Australian racial memory).&lt;br /&gt;&lt;br /&gt;And with a triple-deficit in play, some of the other safety values are missing as well. Governments, already cash-strapped, can't simply spend big to help the country past the problem.&lt;br /&gt;&lt;br /&gt;And thus, the three deficits, although resulting from separate causes, combine together in a devastating fashion. The Private Debt triggers the problem, the Trade Debt creates the stagflation, and the Public Debt prevents countermeasures.&lt;br /&gt;&lt;br /&gt;As you can see at that first link, we now have the clearest evidence yet that the US economy is in bad enough shape to kick off stagflation, and that it's probably happening right now.&lt;br /&gt;&lt;br /&gt;So it appears the US economy is indeed cactus.&lt;br /&gt;&lt;br /&gt;You have my sincerest condolences, living under stagflation is not fun.</description>
	<pubDate>Wed, 27 Feb 2008 22:00:18 +0000</pubDate>
</item>
<item>
	<title>Josh McAdams: YAPC::NA Website Banners</title>
	<guid isPermaLink="true">http://use.perl.org/~jmcada/journal/35774?from=rss</guid>
	<link>http://use.perl.org/~jmcada/journal/35774?from=rss</link>
	<description>&lt;p&gt;The folks over at &lt;a href=&quot;http://www.plainblack.com/&quot;&gt;PlainBlack&lt;/a&gt; were nice enough to offer up some graphic design assistance and created a set of &lt;a href=&quot;http://conferences.mongueurs.net/yn2008/banners.html&quot;&gt;banners&lt;/a&gt; for people to help promote YAPC::NA 2008.  Please feel free to use these banners and li        nke to this site to help spread the word about YAPC.&lt;/p&gt;</description>
	<pubDate>Wed, 27 Feb 2008 21:59:52 +0000</pubDate>
</item>
<item>
	<title>Mozilla DevNews: Thunderbird 2.0.0.12 security and stability release now available</title>
	<guid isPermaLink="true">http://developer.mozilla.org/devnews/index.php/2008/02/26/thunderbird-20012-security-and-stability-release-now-available/</guid>
	<link>http://developer.mozilla.org/devnews/index.php/2008/02/26/thunderbird-20012-security-and-stability-release-now-available/</link>
	<description>&lt;p&gt;As part of Mozilla Corporation’s ongoing stability and security update process, Thunderbird 2.0.0.12 is now available for Windows, Mac, and Linux as a free download from &lt;a href=&quot;http://www.getthunderbird.com&quot;&gt;www.getthunderbird.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Due to the security fixes, we strongly recommend that all Thunderbird users upgrade to this latest release.&lt;/p&gt;
&lt;p&gt;If you already have Thunderbird 2.0.0.x, you will receive an automated update notification within 24 to 48 hours. This update can also be applied manually by selecting “Check for Updates…” from the Help menu.&lt;/p&gt;
&lt;p&gt;For a list of changes and more information, please review the &lt;a href=&quot;http://www.mozilla.com/thunderbird/2.0.0.12/releasenotes/&quot;&gt;Thunderbird 2.0.0.12 Release Notes&lt;/a&gt;&lt;a href=&quot;http://www.mozilla.com/en-US/thunderbird/2.0.0.9/releasenotes/&quot;&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please note: If you’re still using Thunderbird 1.5.0.x, this version is &lt;strong&gt;no longer supported&lt;/strong&gt; and contains known security vulnerabilities. Please upgrade to Thunderbird 2 by downloading Thunderbird 2.0.0.12 from &lt;a href=&quot;http://www.getthunderbird.com&quot;&gt;www.getthunderbird.com&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 27 Feb 2008 07:09:54 +0000</pubDate>
</item>
<item>
	<title>Mozilla DevNews: Firefox 3 Beta 4 starts baking tonight</title>
	<guid isPermaLink="true">http://developer.mozilla.org/devnews/index.php/2008/02/26/firefox-3-beta-4-starts-baking-tonight/</guid>
	<link>http://developer.mozilla.org/devnews/index.php/2008/02/26/firefox-3-beta-4-starts-baking-tonight/</link>
	<description>&lt;p&gt;At &lt;a href=&quot;http://wiki.mozilla.org/Firefox3/StatusMeetings/2008-02-26&quot;&gt;today’s Firefox 3 / Gecko 1.9 meeting&lt;/a&gt; we reviewed the remaining number of P1 and P2 blockers on our lists, and decided that we would go ahead with tonight’s Firefox 3 Beta 4 code freeze tonight at 11:59pm PST and then &lt;acronym title=&quot;This means keeping nightly builds basically unchanged to spot regressions from recent changes&quot;&gt;bake nightly builds&lt;/acronym&gt; for a few days before handing off the code to the Build and Quality Assurance teams.&lt;/p&gt;
&lt;p&gt;During the baking period, all Firefox 3/ Gecko 1.9 component owners have been asked to triage their blocker nomination and blocking bug lists &lt;em&gt;by Friday noon PST&lt;/em&gt; in order to determine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which bugs, if any, require a beta release vehicle&lt;/li&gt;
&lt;li&gt;which bugs, if any, need to block the final release of Firefox 3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mike Connor has posted &lt;a href=&quot;http://wiki.mozilla.org/Firefox3/Drivers/Triage&quot;&gt;criteria to be used when assigning priorities to blocking bugs&lt;/a&gt;. If possible, bug owners should add an estimate of the time required and precieved difficulty of fixing a bug.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tree management after tonight’s freeze&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After tonight’s freeze we’ll be using the same process we used for the last beta. The tree will be closed to bake, and during that time we would appreciate your help in regression spotting and fixing. The only bugs that can land during this baking period are those marked with the “approval1.9b4+” flag.&lt;/p&gt;
&lt;p&gt;Please note that if you believe a bug should block the release of Firefox 3 Beta 4, please make sure it is either marked or nominated as a P1 blocker and set the target milestone to “Firefox 3 beta 4″ or “mozilla1.9beta4″. We are currently frozen for localization work, so no new strings will be accepted at this time. You may wish to mark bugs with the following keywords:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“relnote” will nominate that bug for entry in the Firefox 3 Beta 4 release notes&lt;/li&gt;
&lt;li&gt;“late-compat” will indicate that the bug might affect add-on compatibility&lt;/li&gt;
&lt;li&gt;“dev-doc-needed” will indicate that developer documentation is required&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After this Friday, we will have more information about the delivery schedule for this beta. Look for announcements here and on the mozilla.dev.planning group.&lt;/p&gt;</description>
	<pubDate>Wed, 27 Feb 2008 07:09:54 +0000</pubDate>
</item>
<item>
	<title>David Landgren: Stalling the pipeline in the checkout queue</title>
	<guid isPermaLink="false">/~grinder/journal/7299?from=rss</guid>
	<link>http://use.perl.org/~grinder/journal/7299?from=rss</link>
	<description>I was in the supermarket the other day after work. I had a number of essentials in my basket and I was itching to get home.
&lt;p&gt;Big problem: which queue to choose? Having learnt about Queuing Theory at school, and knowing that single queue-multiple consumer is as efficient as it gets, it's always an agonizing decision. You have to balance a number of factors: how many people in the queue, how many items do people want to buy, do they look impatient or vagued out. It's better to be behind a person buying 10 of one thing, than one item of ten different things. And, although it pains me to admit it, old people are Bad News. Statistically, you'll waste 30 seconds to five minutes with them in front of you.&lt;/p&gt;
&lt;p&gt;So I was pondering this the other day, and reflecting on my worldview, how I tend to algorithmatise things (figuring out the shortest path between the four shops I need to go to, establishing contigency plans in case a shop doesn't have a product I need, that sort of stuff. When house-cleaning I try to keep my hands full. I hate going into room A to fetch something for room B, and realising there was something in room B which should be tidied away in room A). Geeking out, basically.&lt;/p&gt;
&lt;p&gt;And as I stood there ruminating on this, I was idly watching the woman at the front of the line, and became more and more alarmed. She was just stacking up the products that the cashier swiped...&lt;i&gt;but not putting them into bags.&lt;/i&gt; I couldn't figure out what she was doing, but figured it was bad news for me. And on and on it went, until the cashier had checked out every last item. Then she handed over her credit card, had it swiped, punched in her pin, and only once she had received her docket did she begin to bag up the stuff she'd bought. And I thought &quot;You f5cking moron: can't you deal with asynchronous events?&quot; Because the cashier couldn't start checking out the items of the next person until she'd cleared the decks. Which took a non-trivial amount of time, during which no other work could be done.&lt;/p&gt;
&lt;p&gt;Meantime I note that the people who were at the  ends of the other queues are now close to being served, and I've still got two people in front of me. But I'm in too deep at this point to bear the cost of cutting my losses and requeuing on another line.&lt;/p&gt;
&lt;p&gt;The next person went through without a hitch: a few items, had cash ready, out straight away.&lt;/p&gt;
&lt;p&gt;Then the person in front of me went through. Seemed to be okay: started bagging up the goods as soon as they came through, but she had a fair number of things to buy. Then it turns out that she has a Method. All the fruit goes together, the  stuff that requires Refrigeration goes together, tins kept apart from packets and so on. And the cashier is done quickly and announces the price. But does she do anything? Noooooooooo! She just keeps putting stuff in bags. And the cashier, who is polite (the Customer is always Right and all that) says nothing.&lt;/p&gt;
&lt;p&gt;At this point I just take a deep breath and resign myself. The people who were at the ends of the other queues are all long since gone. At times  like this I can't help thinking that a lot of what we learn in Computer Science is applicable to the Real World. And one of the cardinal sins is stalling the pipeline. When you have people queued up to do something, you want to get in and get out as fast as possible, just like an instruction on a  CPU. Because wait states are just time lost. Gone, never to come back.&lt;/p&gt;
&lt;p&gt;I really, &lt;i&gt;really&lt;/i&gt; hate when that happens.&lt;/p&gt;</description>
	<pubDate>Tue, 26 Feb 2008 21:56:57 +0000</pubDate>
</item>
<item>
	<title>David Landgren: Another fun (?) SQL puzzle</title>
	<guid isPermaLink="false">/~grinder/journal/34718?from=rss</guid>
	<link>http://use.perl.org/~grinder/journal/34718?from=rss</link>
	<description>&lt;p&gt;So, I have a database with a particularly nasty design decision. We have people who belong to cost centres, usually only one, but sometimes with a prorata on two cost centres. The programmer responsable for creating the table denormalised things, so rather than having&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;    EMP1  UNIT1 50%&lt;br /&gt;    EMP1  UNIT2 50%&lt;br /&gt;    EMP2  UNIT3 100%&lt;br /&gt;    EMP3  UNIT1 100%&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;we have something that looks like&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;    EMP1   UNIT1   UNIT2    50   50&lt;br /&gt;    EMP2   UNIT3   null    100    0&lt;br /&gt;    EMP3   UNIT1   null    100    0&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;That is, both cost centre ids in the same table, the second one usually null. It is a given that there will never be more than two. This table is of course an utter bitch to work with. Turns out we can cheat a bit, by only keeping track of the rate of the first centre, the second is just 100-first (which also helps cut down round-offs). Let us create a table to play with:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;create table t1 (&lt;br /&gt;   id_person varchar(10),&lt;br /&gt;   rate      number(5,2),&lt;br /&gt;   unit1     varchar(3),&lt;br /&gt;   unit2     varchar(3),&lt;br /&gt;   val1      number(10),&lt;br /&gt;   val2      number(10)&lt;br /&gt;);&lt;br /&gt;insert into t1 values ('alice',   1, 'U1', null,   10,   20);&lt;br /&gt;insert into t1 values ('bob',     1, 'U2', null,    4,    8);&lt;br /&gt;insert into t1 values ('carol', 0.5, 'U1', 'U2',  300,  600);&lt;br /&gt;insert into t1 values ('david', 0.2, 'U1', 'U3', 6000, 8000);&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;Now I want the sum the values val1 and val2 by unit, keeping in mind that for 'david', VAL1 6000 * 0.2 = 1200 is summed to U1, and the difference, 4800, to U3. Similarly, for VAL2, 1600 to U1 and 6400 to U3. In other words, I want the following result set:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;    U1 1360 1920&lt;br /&gt;    U2  154  308&lt;br /&gt;    U3 4800 6400&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;Now the only way that I can see is to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sum the value proratas for all people on their first cost centre. If they have one centre, they get the full hit, otherwise it's prorata'ed between it and the second.&lt;/li&gt;
&lt;li&gt;Union the above with the people having two centres, by subtracting the prorata of the first centre from the total value to arrive at the second prorata (to minimise roundoff errors, otherwise the sum of both centres will lose a cent compared with the initial sum from time to time).&lt;/li&gt;
&lt;li&gt;Treat all that as a derived table, and sum the results.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives the following:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;select&lt;br /&gt;     S.UNIT  UNIT&lt;br /&gt;    ,sum(V1) V1_TOT&lt;br /&gt;    ,sum(V2) V2_TOT&lt;br /&gt;from (&lt;br /&gt;    select&lt;br /&gt;         unit1            UNIT&lt;br /&gt;        ,sum(val1 * rate) V1&lt;br /&gt;        ,sum(val2 * rate) V2&lt;br /&gt;    from&lt;br /&gt;        t1&lt;br /&gt;    group by&lt;br /&gt;        unit1&lt;br /&gt;    union select&lt;br /&gt;         unit2                   UNIT&lt;br /&gt;        ,sum(val1 - val1 * rate) V1&lt;br /&gt;        ,sum(val2 - val2 * rate) V2&lt;br /&gt;    from&lt;br /&gt;        t1&lt;br /&gt;    where&lt;br /&gt;        unit2 is not null&lt;br /&gt;    group by&lt;br /&gt;        unit2&lt;br /&gt;) S&lt;br /&gt;group by S.UNIT&lt;br /&gt;order by S.UNIT&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;That's pretty ugly. Is there a better way?&lt;/p&gt;</description>
	<pubDate>Tue, 26 Feb 2008 21:56:57 +0000</pubDate>
</item>
<item>
	<title>David Landgren: Bitten by glob crypto context</title>
	<guid isPermaLink="false">/~grinder/journal/34555?from=rss</guid>
	<link>http://use.perl.org/~grinder/journal/34555?from=rss</link>
	<description>&lt;p&gt; &lt;tt&gt;/me is annoyed&lt;/tt&gt; &lt;/p&gt;

&lt;p&gt;I just spent a while chasing a stupid bug. I have an big log directory that I have to clean up. The number of files caused the shell's wildcard expansion to fail. So I wrote some perl to move things around.&lt;/p&gt;

&lt;p&gt;And it didn't do anything. To cut a long story short, I needed the total number of files in the directory. So I had something along the lines of:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;perl -le 'print scalar(glob(&quot;*&quot;))'&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;That does not return the number of files. It returns the name of the first file. Or the last. I don't care.&lt;/p&gt;

&lt;p&gt;You have to force array context and throw it away:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;perl -le 'print scalar(()=glob(&quot;*&quot;))'&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;This prints 31192. I wish Perl didn't do this. Nice interview question though, I guess.&lt;/p&gt;</description>
	<pubDate>Tue, 26 Feb 2008 21:56:57 +0000</pubDate>
</item>
<item>
	<title>use Perl journals: [jozef] Catalyst book review</title>
	<guid isPermaLink="true">http://use.perl.org/~jozef/journal/?from=rss</guid>
	<link>http://use.perl.org/~jozef/journal/?from=rss</link>
	<pubDate>Tue, 26 Feb 2008 21:56:23 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Trip to FOSDEM &amp;amp; Dutch Perl Workshop, part 1</title>
	<guid isPermaLink="false">http://use.perl.org/~domm/journal/35766?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/241459885/35766</link>
	<description>&lt;p&gt;After the nice 0100000 party on Thursday (and a nice &lt;a href=&quot;http://domm.plix.at/var/0100000/geschenke.jpg&quot;&gt;loot&lt;/a&gt;) I took the sleeper train to Köln on Friday night. By some very lucky coincidence I got a 4-person compartment on my own - yay!&lt;/p&gt;

&lt;p&gt;The next day I walked a bit through the central area of Köln (around the Cathredral). Quite nice for a german city... I discovered a &lt;a href=&quot;http://www.space-invaders.com/&quot;&gt;space invader&lt;/a&gt; and a fake medevial castle on a boat (some kind of museum).&lt;/p&gt;

&lt;p&gt;In Brussels, I went straigth to &lt;a href=&quot;http://fosdem.org/&quot;&gt;FOSDEM&lt;/a&gt; where I met a few Perl people (Mark, Juerd, Leon, ..) at the Perl 6 talk. I spend most of the day talking with them. In the evening we had yet another birthday &quot;party&quot; (together with Leon) - and to my big surprise I discovered that I actually like Cherry Beer (because it doesn't taste like beer I guess)&lt;/p&gt;

&lt;p&gt;Sunday night I drove with Wendy &amp;amp; Liz to their place, where I'm staying now. It's very nice and they are very hospitable. Yesterday Jonathan arrived from Kiev, and we did a small bicycle tour around the neighbourhood. I'm switching between working, preparing slides, chatting &amp;amp; playing Fluxx. Very nice...&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/241459885&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 26 Feb 2008 21:42:12 +0000</pubDate>
</item>
<item>
	<title>Planet Parrot: chromatic: Hasty Generalizations Make Wastey Generalizations</title>
	<guid isPermaLink="true">http://use.perl.org/~chromatic/journal/35759?from=rss</guid>
	<link>http://use.perl.org/~chromatic/journal/35759?from=rss</link>
	<description>&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;p&gt; &lt;em&gt;... what I'm seeing in Ruby is that the many ways have been transformed into idioms and guidelines. There are no hard rules, but the community have evolutionary evolved idioms that work and found out many of the ways that doesn't work.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt; &lt;em&gt;Ruby has almost all of the flexibility of Perl to do things in different ways. But at the end of the day, none of the Perl problems tend to show up. Why is this?&lt;/em&gt; &lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;

&lt;p&gt;— &lt;a href=&quot;http://use.perl.org/~chromatic/journal/ola-bini.blogspot.com/&quot;&gt;Ola Bini&lt;/a&gt;, &lt;a href=&quot;http://ola-bini.blogspot.com/2008/02/language-design-philosophy-more-than.html&quot;&gt;Language design philosophy: more than one way?&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Why?  Probably because you're not a very good Perl programmer.&lt;/p&gt;

&lt;p&gt;A better question is &quot;Why do programmers experienced with a language so often fail to have the maintainability problems that plague novices?&quot;  That might have led nicely into a discussion of idioms and the evolution of good style in a language which encourages such things.&lt;/p&gt;

&lt;p&gt;See also the discussion why Java fans luuurve their IDEs and can't understand why those of us who can go through the TDD cycle once or twice before Eclipse finishes loading the whole project think that Java's syntax might be a touch verbose.  Another fun discussion is &quot;Why don't you Lunix types make one-click installers you can just download and click to install?&quot;&lt;/p&gt;

&lt;p&gt;I suppose only the familiar is awesome, and the unfamiliar is stupid and scary.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 26 Feb 2008 21:42:12 +0000</pubDate>
</item>
<item>
	<title>Joshua Wehner: On the need for game criticism</title>
	<guid isPermaLink="true">http://blogs.thewehners.net/josh/posts/view/356-on-the-need-for-game-criticism</guid>
	<link>http://blogs.thewehners.net/josh/posts/view/356-on-the-need-for-game-criticism</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.costik.com/&quot;&gt;Greg Costikyan&lt;/a&gt; has been saying this for a decade or more, but &lt;a href=&quot;http://playthisthing.com/game-criticism-why-we-need-it-and-why-reviews-arent-it&quot;&gt;this&lt;/a&gt; is well-written at least:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;The truth is that, for the most part, we don’t have anything like game criticism, and we need it—to inform gamers, to hold developers to task, and to inform our broader cultural understanding of games and their importance and impact on our culture.&lt;/p&gt;


	&lt;p&gt;We need our own Pauline Kaels and John Simons—and we need to ensure that when they appear, no one insists that they attach a damn numerical score to their writing, because that is wholly irrelevant to the undertaking of writing seriously about games.&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p style=&quot;display: none;&quot;&gt;&lt;strong&gt;Tagged: &lt;/strong&gt;&lt;a href=&quot;http://blogs.thewehners.net/josh/posts/tagged/gaming&quot; rel=&quot;tag&quot;&gt;gaming&lt;/a&gt;, &lt;a href=&quot;http://blogs.thewehners.net/josh/posts/tagged/geek-culture&quot; rel=&quot;tag&quot;&gt;geek-culture&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 26 Feb 2008 09:10:45 +0000</pubDate>
	<author>blog_spam_joshua@thewehners.net (Joshua Wehner)</author>
</item>
<item>
	<title>Barbie: Birmingham.pm Technical Meeting - Wed 27th Feb 2008</title>
	<guid isPermaLink="true">http://use.perl.org/~barbie/journal/35748?from=rss</guid>
	<link>http://use.perl.org/~barbie/journal/35748?from=rss</link>
	<description>&lt;code&gt;
Event:   Technical Meeting&lt;br /&gt;
Date:    Wednesday 27th February 2008&lt;br /&gt;
Times:   from 7pm onwards (see below)&lt;br /&gt;
Venue:   The Victoria, 48 John Bright Street, Birmingham, B1 1BN.&lt;br /&gt;
Details: &lt;a href=&quot;http://birmingham.pm.org/cgi-bin/brum.pl?act=tech-next&quot;&gt;http://birmingham.pm.org/cgi-bin/brum.pl?act=tech-next&lt;/a&gt; &lt;br /&gt;
&lt;/code&gt;
&lt;br /&gt; &lt;br /&gt;
&lt;b&gt;Talks:&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;Monotone: Distributed Peer-To-Peer revision control system. A natural successor to CVS [Tony Cooper]&lt;/li&gt;
&lt;li&gt;Developing Perl GUIs Using Glade and Gtk2 [Tony Cooper]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;b&gt;Details&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
This month we're featuring a special guest night with Tony Cooper coming along to give us two talks. The first looks at the VCS Monotone, and the second looks at creating GUI tools with Perl, Glade and Gtk2.
&lt;/p&gt;&lt;p&gt;
Once again we'll be at The Victoria this month. The pub is on the corner of John Bright Street and Beak Street, between the old entrance to the Alexandra Theatre and the backstage entrance. If in doubt, the main entrance to the Theatre is on the inner ring road, near the Pagoda roundabout. The pub is on the road immediately behind the main entrance.
See the map link on the website if you're stuck.
&lt;/p&gt;&lt;p&gt;
As always entry is free, with no knowledge of Perl required. We'd be delighted to have you along, so feel free to invite family, friends and colleagues ;)
&lt;/p&gt;&lt;p&gt;
We'll be in the venue from about 6.30pm, and have booked The Boardroom for the night. Order food as you get there, and we'll aim to begin talks at about 8pm. I expect talks to finish about 9.30pm, with plenty of time for discussion and planning for meetups over the weekend in London.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;
&lt;b&gt;Venue &amp;amp; Directions:&lt;/b&gt;

&lt;/p&gt;&lt;p&gt;
The Victoria, 48 John Bright Street, Birmingham, B1 1BN (Tel: 0121 633 9439)&lt;br /&gt;
- &lt;a href=&quot;http://www.pubs247.co.uk/pubPages/pub.asp?id=24358&amp;amp;from=&amp;amp;promotion=&quot;&gt;Pub Details&lt;/a&gt; &lt;br /&gt;
- &lt;a href=&quot;http://birmingham.pm.org/images/upload/victoria.jpg&quot;&gt;Picture&lt;/a&gt; &lt;br /&gt;
- &lt;a href=&quot;http://www.google.co.uk/maps?hl=en&amp;amp;client=firefox-a&amp;amp;q=the+victoria+pub&amp;amp;near=Birmingham&amp;amp;radius=0.0&amp;amp;cd=1&amp;amp;cid=52482921,-1893619,7492755984503563963&amp;amp;li=lmd&amp;amp;z=14&amp;amp;t=m&quot;&gt;Google Map&lt;/a&gt; &lt;br /&gt;

&lt;/p&gt;&lt;p&gt;
The venue is approximately 5-10 minutes walk from New Street station, and about the same from the city centre. On street car parking is available see full details and directions on the &lt;a href=&quot;http://birmingham.pm.org/cgi-bin/brum.pl?act=tech-next&quot;&gt;website&lt;/a&gt;.

&lt;/p&gt;&lt;p&gt;
&lt;b&gt;Times:&lt;/b&gt;

&lt;/p&gt;&lt;p&gt;
These are the rough times for the evening:

&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;food available until 7.30pm&lt;/li&gt;
&lt;li&gt;talks: 8.00-10.00pm&lt;/li&gt;
&lt;li&gt;pub closes: 11.00pm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please note that beer will be consumed during all the above sessions ;)&lt;/p&gt;</description>
	<pubDate>Mon, 25 Feb 2008 21:57:49 +0000</pubDate>
</item>
<item>
	<title>Homestar Runner: answer15.html</title>
	<guid isPermaLink="true">http://homestarrunner.com/answer15.html</guid>
	<link>http://homestarrunner.com/answer15.html</link>
	<pubDate>Mon, 25 Feb 2008 21:56:31 +0000</pubDate>
</item>
<item>
	<title>Randal Schwartz: I made MacOSX Hints today!</title>
	<guid isPermaLink="true">http://use.perl.org/~merlyn/journal/35756?from=rss</guid>
	<link>http://use.perl.org/~merlyn/journal/35756?from=rss</link>
	<description>&lt;p&gt;Rob Griffiths IM'ed me saturday while I was sitting at ATL airport, asking what my day rates were.
&lt;/p&gt;&lt;p&gt;My normal reply was &quot;depends on the task&quot;, and asked him what he had in mind.  As he described it, it fleshed out to all of 10 lines in my head, so I said &quot;well, buy me lunch and we'll call it even&quot;.  He couldn't believe that it could be that short to create or to write.
&lt;/p&gt;&lt;p&gt;Ten minutes later, I showed him the code that he added to &lt;a href=&quot;http://www.macosxhints.com/article.php?story=2008022420010324&quot;&gt;a hint for today about renaming old iChat logs&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;Hadn't tried it on my own data, but told him &quot;it should probably work&quot;.  I'm pretty good at previewing code in my head. :)  He tried it, and it worked fine for his data.  Yeay.
&lt;/p&gt;&lt;p&gt;So there I am, famous again.  And got a free lunch for 10 minutes work.  Not bad.&lt;/p&gt;</description>
	<pubDate>Mon, 25 Feb 2008 21:55:25 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: When you program open source, ...</title>
	<guid isPermaLink="false">tag:www.askbjoernhansen.com,2008://1.1948</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/240553768/when_you_program_open_source.html</link>
	<description>&lt;p&gt;&lt;span class=&quot;mt-enclosure mt-enclosure-image&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/knasclass/2235238048/in/pool-659837@N23&quot;&gt;&lt;img src=&quot;http://i.askask.com/2008/02/microsoft-communism.jpg&quot; alt=&quot;microsoft-communism.jpg&quot; width=&quot;373&quot; class=&quot;mt-image-center&quot; height=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Flickr sure has some &lt;a href=&quot;http://www.flickr.com/groups/microsoft-keep-your-evil-grubby-hands-off-our-flickr/&quot;&gt;passionate users&lt;/a&gt;!&lt;/p&gt;
        
    &lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.askbjoernhansen.com/~f/ask?a=qE5SxEE&quot;&gt;&lt;img src=&quot;http://feeds.askbjoernhansen.com/~f/ask?i=qE5SxEE&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.askbjoernhansen.com/~f/ask?a=cK8Fite&quot;&gt;&lt;img src=&quot;http://feeds.askbjoernhansen.com/~f/ask?i=cK8Fite&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.askbjoernhansen.com/~f/ask?a=WL1vsVe&quot;&gt;&lt;img src=&quot;http://feeds.askbjoernhansen.com/~f/ask?i=WL1vsVe&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.askbjoernhansen.com/~r/ask/~4/240548224&quot; height=&quot;1&quot; /&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/240553768&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 25 Feb 2008 01:01:57 +0000</pubDate>
</item>
<item>
	<title>Aristotle Pagaltzis: You know what’s tough?</title>
	<guid isPermaLink="false">urn:uuid:fbd750a0-e333-11dc-bc36-7d8b00dd6d4c</guid>
	<link>http://plasmasturm.org/log/495/</link>
	<description>&lt;p&gt;Forget &lt;a href=&quot;http://diveintomark.org/archives/2004/07/06/tough&quot; title=&quot;Mark Pilgrim: XML is tough&quot;&gt;Markup Barbie&lt;/a&gt;… I want Unicode Barbie. When you pull her string, she says “text is hard.”&lt;/p&gt;</description>
	<pubDate>Sun, 24 Feb 2008 23:55:32 +0000</pubDate>
</item>
<item>
	<title>Michael Schwern: That damned Test::More threading test</title>
	<guid isPermaLink="true">http://use.perl.org/~schwern/journal/35738?from=rss</guid>
	<link>http://use.perl.org/~schwern/journal/35738?from=rss</link>
	<description>I did it.  I finally killed that damned threading test in Test::More.  is_deeply_fail.t will no longer run unless AUTHOR_TESTING is set.&lt;br /&gt;&lt;br /&gt;For those who don't know, that test would tickle intermittent threading bugs in certain vendor supplied versions of perl.  The 5.8.6 OS X ships with and most Redhat derivatives are vulnerable, but it would only fail about one in a hundred times.  I don't know what the problem is, I suspect it's from vendors pulling in bleadperl patches but I haven't confirmed.  Nobody's put the time into it to find out.&lt;br /&gt;&lt;br /&gt;Since there's nothing I can do about it, and it was just holding up CPAN installations, I turned the test off.  Done.</description>
	<pubDate>Sun, 24 Feb 2008 21:57:28 +0000</pubDate>
</item>
<item>
	<title>Jakob Nielsen: application-mistakes.html</title>
	<guid isPermaLink="true">http://www.useit.com/alertbox/application-mistakes.html</guid>
	<link>http://www.useit.com/alertbox/application-mistakes.html</link>
	<description>Top-10 Application-Design Mistakes</description>
	<pubDate>Sun, 24 Feb 2008 21:56:37 +0000</pubDate>
</item>
<item>
	<title>Nicholas Clark: who are you and what have you done with the real politicians</title>
	<guid isPermaLink="true">http://use.perl.org/~nicholas/journal/35742?from=rss</guid>
	<link>http://use.perl.org/~nicholas/journal/35742?from=rss</link>
	<description>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;quote&quot;&gt; &lt;p&gt;The Home Office said a mandatory database &quot;would raise significant practical and ethical issues&quot;.&lt;/p&gt;

&lt;p&gt;Home Office minister Tony McNulty &lt;a href=&quot;http://news.bbc.co.uk/2/hi/uk_news/7260164.stm&quot;&gt;told BBC&lt;/a&gt; that a national database was not a &quot;silver bullet&quot; and that it would raise practical as well as civil liberties issues.&lt;/p&gt;

&lt;p&gt;&quot;How to maintain the security of a database with 4.5m people on it is one thing,&quot; he said.&lt;/p&gt;

&lt;p&gt;&quot;Doing that for 60m people is another.&quot;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Politicians listening to reason and experts and &lt;i&gt;not&lt;/i&gt; going to do something (that can be spun as doing something &lt;strong&gt;useful&lt;/strong&gt;) because it's impractical? Who are you and what have you done with the real politicians?&lt;/p&gt;</description>
	<pubDate>Sun, 24 Feb 2008 21:56:28 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Catalyst Book Review</title>
	<guid isPermaLink="false">http://use.perl.org/~davorg/journal/35740?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/240332602/35740</link>
	<description>&lt;p&gt;I wrote a review of &quot;Catalyst&quot; by Jonathan Rockway. You can read it (the review, not the book) &lt;a href=&quot;http://dave.org.uk/reviews/catalyst.html&quot;&gt;on my web site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Executive summary: I didn't like it much.&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/240332602&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 24 Feb 2008 21:41:54 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Domain names not for sale</title>
	<guid isPermaLink="false">http://log.perl.org/2008/02/domain-names-no.html</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/239701567/domain-names-no.html</link>
	<description>&lt;p&gt;We regularly get inquiries about the perl.org, perlmonks.org etc domains like the following:&lt;/p&gt;

&lt;blockquote&gt;We are interested in purchasing your domain name. If interested, please let me know what it takes to buy it.

&lt;p&gt;If agreeable, we can finalize the deal through escrow.com Monday.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Our typical response:&lt;/p&gt;

&lt;blockquote&gt;Hi $spammer,

&lt;p&gt;One billion USD.   Non-sequential twenty dollar bills preferred, but not required.&lt;/p&gt;

&lt;p&gt;You pay the escrow.com fees.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
Thanks,&lt;/p&gt;

&lt;p&gt;  - ask&lt;/p&gt;

&lt;p&gt;p.s. no, it's not really for sale.&lt;/p&gt;&lt;/blockquote&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/239701567&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 23 Feb 2008 21:41:53 +0000</pubDate>
</item>
<item>
	<title>Bob Cringely: Leadfoot</title>
	<guid isPermaLink="true">http://www.pbs.org/cringely/pulpit/2008/pulpit_20080221_004346.html</guid>
	<link>http://www.pbs.org/cringely/pulpit/2008/pulpit_20080221_004346.html</link>
	<description>&lt;p&gt;If you have ever seen my show Triumph of the Nerds well then you've also seen my car, a 1966 Ford Thunderbird convertible very similar to the car used in the movie Thelma &amp;amp; Louise (I play the role of Thelma).  It is in almost every way a fabulous car.  It's going up in value, for one thing.  It looks cool.  It goes like hell with its 428 cubic-inch V-8 engine.  It is heavier than anything else on the road, so in a collision with anything less than a dump truck I win.  And thanks to analog technology that handily predates the Clean Air Act, it somehow manages to do all this while getting 22 miles per gallon on the highway, 16 in town.  Everything is good about my T-Bird, in fact, except for its wires.  My car has bad wires.  And shortly YOUR car will have bad wires, too, as will everything else you own that has soldered electrical connections.  Everything.  Prepare to share my pain.&lt;/p&gt;

&lt;p&gt;My T-Bird was built at the absolute apex of 20th century electromechanical automotive technology.  A convertible, it has a fully automatic electric top that relies on eight electrical relays firing in sequence to put the top up or down.  Here's the typical (and inevitable) failure mode.  I'm at the beach with the top down.  It starts to rain.  Quickly I run to the car, start it, and hit the button to raise the top.  First the suicide trunk lid opens until it is fully vertical.  Next the electric tonneau cover opens until it is vertical, too.  Then the canvas top begins to retract, raising until it, too, is vertical, at which point everything grinds to a halt and I drive my car home in the pouring rain at five miles per hour, traffic honking behind me, and all three broken parts sticking eight feet into the sky. &lt;/p&gt;

&lt;p&gt;Victim to a succession of good and bad mechanics, some well-intentioned but all in it for the money, I have spent thousands of dollars over the years replacing electrical parts -- window motors, switches, relays for both the top and the sequential tail lights -- all to little avail.  New parts failed as quickly as old parts.  Eventually I abandoned all hope of viewing my car as a restoration and replaced the relays with brilliant little computers from British Columbia.  Now the hydraulics worked beautifully but all it really meant was that the top no longer failed in mid-sequence: it would either work fine or not at all.&lt;/p&gt;

&lt;p&gt;When you've replaced everything else the problem has to be with what's left, which in the case of my car was the wires, themselves.  Over the years the wires had somehow corroded inside their insulation and the terminals had lost their mojo.  I had been replacing perfectly good switches and motors (and knowledgeable folks had been selling me switches and motors) that would have been helped more by simply replacing the terminals or, better still, the wires.  Some experts think Ford just got a bad batch of wire back in 1966 -- that this problem is isolated -- but I don't care.  So what if my car is two years older than my wife?  All her parts seem to be working just fine, why shouldn't my T-Bird?&lt;/p&gt;

&lt;p&gt;Which brings me to you, or rather to all of your soldered devices that are two years old or less.  Most of these are now assembled using solder joints that have no lead in an effort to save our groundwater and our health.  The fact that the lead has been generally replaced with silver or bismuth, both of which are actually greater health risks than lead, well we'll leave that one for Ralph Nader if he decides not to run for President.  The longer-term trend is toward all-tin connections, anyway, but they don't work very well, either.&lt;/p&gt;

&lt;p&gt;I wrote a column about this back in 2004 (it's in this week's links) that was heavy on information and therefore low on readership.  Everything in that column has come to pass and more.  Where's my Pulitzer Prize?&lt;/p&gt;

&lt;p&gt;Costs have gone up, mean time between failures (MTBF) has gone down (accelerated MTBF tests, which are the only MTBF tests we do anymore, don't reliably pick this up, by the way), and reliability has suffered.  Since we don't fix things anymore, it’s hard to say whether your gizmo failed because of bad solder or not, but the problem is becoming worse as a greater percentage of total circuits in use have lead-free solder.  The military was especially concerned, even before the whisker crisis.&lt;/p&gt;

&lt;p&gt;We're talking about tin whiskers, single crystals that mysteriously grow from pure tin joints but not generally from tin-lead solder joints.  Nobody knows how or why these whiskers grow and nobody knows how to stop them, except through the use of lead solder.  Whiskers can start growing in a decade or a year or a day after manufacture.  They can grow at up to nine millimeters per year.  They grow in any atmosphere including a pure vacuum.  They grow in any humidity condition.  They just grow.  And when they get long enough they either touch another joint, shorting out one or more connections, or they vaporize in a flash, creating a little plasma cloud that can carry for an instant hundreds of amps and literally blow your device to pieces.&lt;/p&gt;

&lt;p&gt;Since 2006 we have been exclusively manufacturing soldered connections thousands of times more likely to create tin whiskers than previous generation joints made with tin-lead solder.  Because of the universal phase-in of the new solder technology and the fact that the solder technologies can't reliably be mixed (old solders mess with new solder joints in the same device through simple outgassing) this means that it is practically impossible to use older, more reliable technology just for mission-critical (even life-critical) connections.  So we're all in this tin boat together.&lt;/p&gt;

&lt;p&gt;Some experts confidently say that the disparity of joint reliability we are seeing today will go away and that the new joints will become as reliable or even more reliable than the old tin-lead joints as we gain experience with the new processes.  What's disturbing, though, is that these experts don't actually know how this increased reliability is likely to be achieved.  Just like extrapolating a Moore's Law curve to figure out how fast or how cheap technology is likely to be a decade from now, they have no idea how these gains will be made, just confidence that they will be.&lt;/p&gt;

&lt;p&gt;What if the experts are wrong?&lt;/p&gt;

&lt;p&gt;Tin whiskers can take out your iPod or your network.  They can stop your car cold.  They can take down an entire airport or Citibank.  They are much more common than most people -- even most experts -- think.  The reason for this is that most tin whiskers can't even be seen.&lt;/p&gt;

&lt;p&gt;&quot;Maybe it is worth adding,&quot; said one expert who prefers to remain anonymous, &quot;that whisker diameters range from 0.1 um to 10 um, while the diameter of a human hair is 70 um to 100 um --- so the largest whisker is only some 15 percent of the diameter of a thin hair, and most are less than 5 percent. A good fraction (of these are) so thin that light waves just pass them by, scattering a bit but not reflecting. So the optical microscope images that (typically used to illustrate whiskers) show only a small fraction of what is really there. Scanning electron microscope (SEM) images are a bit better, but only show a small zone of the sample; also, not many folks are able to acquire SEM images of their equipment.  So all too many folks have the idea that whiskers are something that happens to someone else, but never to them. This is an expensive misconception.&quot;&lt;/p&gt;

&lt;p&gt;What I wonder is whether a cost-benefit analysis of this solder technology changeover was ever done?  I haven't seen one.&lt;/p&gt;

&lt;p&gt;And if you think this problem is minor, I have been told that just the cost of changing to lead-free solder stands right now at $280 BILLION and climbing.  That cost is borne by all of us.&lt;/p&gt;

&lt;p&gt;Maybe dumping lead solder was absolutely the right thing to do.  Maybe it was absolutely the wrong thing to do.  The truth is we haven't the slightest idea the answer to that question and anyone who claims to know is wrong.  We didn't know what would happen when we started this and we don't know what we'll get out of it, either, or whether it will be worth the cost.  All we know for sure is that a bumpy ride lies ahead. &lt;/p&gt;

&lt;p&gt;Fortunately I have new shock absorbers (and a new wiring harness) on my T-Bird.&lt;/p&gt;</description>
	<pubDate>Fri, 22 Feb 2008 21:58:56 +0000</pubDate>
</item>
<item>
	<title>Aristotle Pagaltzis: Lost in translation</title>
	<guid isPermaLink="true">http://use.perl.org/~Aristotle/journal/35725?from=rss</guid>
	<link>http://use.perl.org/~Aristotle/journal/35725?from=rss</link>
	<description>&lt;p&gt; &lt;cite&gt; &lt;a href=&quot;http://blogs.msdn.com/ericlippert/archive/2008/02/20/how-to-not-get-a-question-answered.aspx&quot;&gt;Eric Lippert&lt;/a&gt; &lt;/cite&gt;:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;p&gt;I understand that there is an inherent and pervasive bias in pure-text communication which makes statements intended to be &lt;em&gt;good-humoured &lt;/em&gt;sound &lt;em&gt;sophomoric&lt;/em&gt;, makes statements which were intended to be &lt;em&gt;friendly &lt;/em&gt;sound &lt;em&gt;smarmy&lt;/em&gt;, makes statements which were intended to be &lt;em&gt;enthusiastic&lt;/em&gt; sound &lt;em&gt;brash&lt;/em&gt;, makes statements intended to be &lt;em&gt;helpful&lt;/em&gt; sound &lt;em&gt;condescending&lt;/em&gt;, makes statements which were intended to be &lt;em&gt;precise and accurate&lt;/em&gt; sound &lt;em&gt;brusque and pedantic, &lt;/em&gt;makes statements which were intended to be &lt;em&gt;positive&lt;/em&gt; sound &lt;em&gt;neutral&lt;/em&gt;, and makes statements which were intended to be &lt;em&gt;neutral&lt;/em&gt; seem downright &lt;em&gt;hostile&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;</description>
	<pubDate>Fri, 22 Feb 2008 21:56:37 +0000</pubDate>
</item>
<item>
	<title>Aristotle Pagaltzis: Shout it from the rooftops!</title>
	<guid isPermaLink="true">http://use.perl.org/~Aristotle/journal/35723?from=rss</guid>
	<link>http://use.perl.org/~Aristotle/journal/35723?from=rss</link>
	<description>&lt;p&gt;From &lt;a href=&quot;http://search.cpan.org/perldoc?List::Maker&quot;&gt;List::Maker&lt;/a&gt;’s &lt;code&gt;Changes&lt;/code&gt; file:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;0.0.4  Sat Feb  9 11:08:51 2008&lt;br /&gt; &lt;br /&gt;    * Made globbing magical only in those source files that explicitly load&lt;br /&gt;      the module (thanks Steffen)&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt; &lt;a href=&quot;http://www.merriam-webster.com/info/07words.htm&quot;&gt;W00t&lt;/a&gt;! Now I can actually use the module instead of making sad eyes and letting out a wistful sigh when I think of it.&lt;/p&gt;</description>
	<pubDate>Fri, 22 Feb 2008 21:56:37 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Making URI work with Business::ISBN 2.x</title>
	<guid isPermaLink="false">http://use.perl.org/~brian_d_foy/journal/35718?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/239127054/35718</link>
	<description>If you have &lt;a href=&quot;http://search.cpan.org/dist/Business-ISBN&quot;&gt;Business::ISBN&lt;/a&gt; 2.x installed and you try to install &lt;a href=&quot;http://search.cpan.org/dist/URI&quot;&gt;URI&lt;/a&gt;, you'll probably get stopped at the `make test` stage. Some of the method names changed to support ISBN-13, but URI up to 1.35 hasn't caught up yet. Unless you're using the obscure ISBN scheme in URLs, you don't really care that it breaks save that it doesn't install nicely. You can force install URI and be just fine (or install it without Business::ISBN already installed).&lt;br /&gt;&lt;br /&gt;I've &lt;a href=&quot;http://rt.cpan.org/Ticket/Display.html?id=33220&quot;&gt;posted the patch for URI to RT&lt;/a&gt; so URI can work with either major version of &lt;a href=&quot;http://search.cpan.org/dist/Business-ISBN&quot;&gt;Business::ISBN&lt;/a&gt; back to Perl 5.004. It renames a couple of methods in URI::urn::isbn, but still works with the older names (with a warning) too.&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/239127054&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 22 Feb 2008 21:21:59 +0000</pubDate>
</item>
<item>
	<title>Beautiful Code: Quality Begs for Object-Orientation</title>
	<guid isPermaLink="false">tag:beautifulcode.oreillynet.com,2008://2.86</guid>
	<link>http://beautifulcode.oreillynet.com/2008/02/quality_begs_for_objectorienta_1.php</link>
	<description>&lt;p&gt;Many people are dabbling in functional programming these days.  Haskell is more popular than it ever has been, OCaml has it's adherents, and we are starting to see common functional idioms spread throughout the industry.&lt;/p&gt;

&lt;p&gt;Why am I not happy?&lt;/p&gt;

&lt;p&gt;Here's why.  I think that most functional programming languages are fundamentally broken with respect to the software lifecycle.   I realize that's a bold statement.  Let me back it up.&lt;/p&gt;

&lt;p&gt;Imagine these lines of code in any object-oriented language (I'll use Java here because it is familiar to most people, even if they dislike it):&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;public class X {
    public void method() {
       ...
       badMethod();
       ...
    }
    ...
}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Class X has a method named &lt;code&gt;badMethod&lt;/code&gt;.  The method isn't bad because it does something awful while the system is running; it's bad because it does something painful during testing.  It could be anything.  The method could make a call to our production database and update it, or it could communicate with another system across a socket.  It could even touch some low level hardware that causes a mechanical machine arm to do something that it shouldn't be doing over and over again while we are testing.&lt;/p&gt;

&lt;p&gt;In an ideal world, people would design their systems so that classes and clusters of classes could be tested independently; the industry is slowly rediscovering the utility of unit testing.  But, stuff happens.  People make mistakes.  They think that they've got it all under control until they discover that they have a big wad of code that they can't easily change and don't understand.  At that point, they wish that they could write little tests that help them understand what the hell their code does before and after they change it.&lt;/p&gt;

&lt;p&gt;The nice thing, so far, is that most of the object-oriented languages out there leave you an “out.”  You can use the features that were built in to provide flexibility to give yourself enough maneuverability to test.  In short, we can do this:&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;public class TestableX extends X {
    void badMethod() {
        // do nothing
    }
}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;We can override functionality and build ourselves a wedge that makes testing easy.&lt;/p&gt;

&lt;p&gt;The fact that &lt;code&gt;badMethod&lt;/code&gt; is a non-final, override-able method makes it something I call a &lt;i&gt;seam&lt;/i&gt;.  A &lt;i&gt;seam&lt;/i&gt; is a place where you can substitute one piece of functionality for another without editing.  Most languages provide seams.  The C programming language is rich with them.  You can use the preprocessor, function pointers, and link substitution to replace awkward functionality during testing, but it isn't quite as easy as it is in OO.&lt;/p&gt;

&lt;p&gt;Virtual function calls in OO languages are a common seam.  Java is easy.  C++ is a bit more awkward.  Ruby and Python are a breeze.  The power of these seams is in the fact that you can get between around around the pieces of your application when testing.  It isn't just a big hard-coded mass.&lt;/p&gt;

&lt;p&gt;What about Haskell, OCaml, and Erlang?&lt;/p&gt;

&lt;p&gt;Yes, you can provide alternative modules to link against, but it's clunky.  Sure, you can  use virtual in OCaml, but who really organizes all of their OCaml code in classes?&lt;/p&gt;

&lt;p&gt;Haskell is a bit nicer, most of the code that you'd ever want to avoid in a test can be sequestered in a monad, and I expect that half of the Haskellers reading this will argue that functional purity obviates any need to unit test; it can all be done in QuickCheck.  I hear you, but there's distance between here and there and that distance can be a quagmire.&lt;/p&gt;

&lt;p&gt;No, the fact is, the late-binding that OO languages provide makes code written in them more easily recoverable.  And, this is important because entropy happens.  Count on it.&lt;/p&gt;</description>
	<pubDate>Thu, 21 Feb 2008 22:16:24 +0000</pubDate>
</item>
<item>
	<title>Planet Perl6: perl6.announce: Parrot 0.5.3 &quot;Way of the Parrot&quot; released! by Patrick R. Michaud</title>
	<guid isPermaLink="true">http://www.nntp.perl.org/group/perl.perl6.announce/2008/02/msg578.html</guid>
	<link>http://www.nntp.perl.org/group/perl.perl6.announce/2008/02/msg578.html</link>
	<description>On behalf of the Parrot team, I'm proud to announce Parrot 0.5.3&lt;br /&gt;&quot;Way of the Parrot.&quot; Parrot (http://parrotcode.org/) is a virtual &lt;br /&gt;machine aimed at running all dynamic languages.&lt;br /&gt;&lt;br /&gt;Parrot 0.5.3 can be obtained via CPAN (soon), or follow the&lt;br /&gt;download instructions at http://parrotcode.org/source.html.&lt;br /&gt;For those who would like to develop on Parrot, or help develop&lt;br /&gt;Parrot itself, we recommend using Subversion or SVK on the&lt;br /&gt;source code repository to get the latest and best Parrot code.&lt;br /&gt;&lt;br /&gt;Parrot 0.5.3 highlights:&lt;br /&gt;&lt;br /&gt;The Perl 6 on Parrot compiler has now been given the name&lt;br /&gt;&quot;Rakudo Perl&quot;.  More details on the new name are available&lt;br /&gt;from http://use.perl.org/~pmichaud/journal/35400 .  In addition,&lt;br /&gt;Rakudo now has more support for objects, classes, roles, etc.,&lt;br /&gt;and a better interface to the official Perl 6 test suite.&lt;br /&gt;&lt;br /&gt;More languages are being converted to use the Parrot Compiler&lt;br /&gt;Toolkit.&lt;br /&gt;&lt;br /&gt;Parrot 0.5.3 News:&lt;br /&gt;- Documentation&lt;br /&gt;  + PDD09 (garbage collection) - approved&lt;br /&gt;  + PDD28 (character sets) - draft started&lt;br /&gt;  + added function documentation to some core functions&lt;br /&gt;  + PCT beginners guide, optable guide and PAST nodes guide, bug fixes&lt;br /&gt;- Compilers&lt;br /&gt;  + IMCC: plugged various memory leaks and other cleanups&lt;br /&gt;  + PCT:&lt;br /&gt;    . add &quot;attribute&quot; as a scope variant to PAST::Var nodes&lt;br /&gt;    . add 'shift' and 'pop' methods to PAST:: nodes&lt;br /&gt;  + NQP: add '=:=' op, tests for scalar and list contextualizers, \x escapes&lt;br /&gt;- Languages&lt;br /&gt;  + APL: reimplementation with PCT&lt;br /&gt;  + Cardinal (Ruby): reimplemention with PCT&lt;br /&gt;  + Ecmascript: reimplementation with PCT&lt;br /&gt;  + lolcode: improved expression parsing, ifthen, IT, YARN&lt;br /&gt;  + lua:&lt;br /&gt;    . aligned with Lua official release 5.1.3.&lt;br /&gt;    . added initial PCT-based implementation.&lt;br /&gt;  + Punie (Perl 1): refactor to use standard PCT-based filenames&lt;br /&gt;  + Pynie (Python): add functions&lt;br /&gt;  + Rakudo (Perl 6):&lt;br /&gt;    . rebranded, formerly known as 'perl6'&lt;br /&gt;    . passes many more official Perl 6 Specification tests&lt;br /&gt;    . added 'perl6doc' utility&lt;br /&gt;    . oo including meta?classes, objects, methods, attributes, role composition&lt;br /&gt;    . match variables, while/until statements, traits&lt;br /&gt;    . many new methods for Str, List, Hash, Junction&lt;br /&gt;- Implementation&lt;br /&gt;- Deprecations&lt;br /&gt;  + PCCINVOKE syntax for named arguments using []; use () instead.&lt;br /&gt;  + see DEPRECATED.pod for details&lt;br /&gt;- Miscellaneous&lt;br /&gt;  + pbc_to_exe refactored for code reduction, portability, and maintainability&lt;br /&gt;  + various bug fixes&lt;br /&gt;  + #line directives added to generated JIT files, improving debugging&lt;br /&gt;  + consting, attribute marking, refactoring, warnings cleanup&lt;br /&gt;&lt;br /&gt;The next scheduled Parrot release will be on March 18, 2008.&lt;br /&gt;&lt;br /&gt;Thanks to all our contributors for making this possible, and our&lt;br /&gt;sponsors for supporting this project.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Thu, 21 Feb 2008 22:00:18 +0000</pubDate>
</item>
<item>
	<title>Nicholas Clark: terminals for OS X?</title>
	<guid isPermaLink="true">http://use.perl.org/~nicholas/journal/35715?from=rss</guid>
	<link>http://use.perl.org/~nicholas/journal/35715?from=rss</link>
	<description>&lt;p&gt;Dear lazyweb,&lt;/p&gt;
&lt;p&gt;Given that genuine VT102 terminals are not that practical to lug around, what
is the &quot;best&quot; terminal emulator for OS X? I realise that as all are made of &lt;a href=&quot;http://nick.hates-software.com/&quot;&gt;software&lt;/a&gt;, all will be hateful, but I was hoping that some might be less hateful than others.&lt;/p&gt;</description>
	<pubDate>Thu, 21 Feb 2008 21:56:41 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: SlideShare Perl Goodness</title>
	<guid isPermaLink="false">http://use.perl.org/~brian_d_foy/journal/35708?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/238436189/35708</link>
	<description>I've joined &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;SlideShare&lt;/a&gt; and uploaded &lt;a href=&quot;http://www.slideshare.net/brian_d_foy&quot;&gt;the 17 talks for which I have slides readily available&lt;/a&gt;. I'm still playing with the service, and although Andy Armstrong pointed out that there is a Perl group, I didn't find any Perl events. I have fixed that by adding the right stuff for the talks I have:&lt;br /&gt;&lt;br /&gt;Groups:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/group/perl&quot;&gt;Perl&lt;/a&gt; (73 talks)&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/group/windy-city-perl-mongers&quot;&gt;Windy City Perl Mongers&lt;/a&gt; (6 talks)&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/group/stonehenge-consulting-services-inc&quot;&gt;Stonehenge&lt;/a&gt; (17 talks)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Events:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/event/yapcna-chicago-2006&quot;&gt;YAPC Chicago 2006&lt;/a&gt; (3 talks)&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/event/yapcna-chicago-2008&quot;&gt;YAPC Chicago 2008&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/event/frozen-perl&quot;&gt;Frozen Perl 2008&lt;/a&gt; (5 talks)&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/event/nordic-perl-workshop-2006&quot;&gt;Nordic Perl Workshop, Oslo 2006&lt;/a&gt; (3 talks)&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/event/nordic-perl-workshop-2007&quot;&gt;Nordic Perl Workshop, Copenhagen 2007&lt;/a&gt; (5 talks)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Add your own events and groups even if you don't have slides for them yet! If you need help remembering dates, use &lt;a href=&quot;http://www.theperlreview.com/community_calendar&quot;&gt;The Perl Review's Community Calendar&lt;/a&gt;.&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/238436189&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 21 Feb 2008 21:41:56 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Three levels of Perl/Unicode understanding</title>
	<guid isPermaLink="false">http://use.perl.org/~miyagawa/journal/35700?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/238106487/35700</link>
	<description>(Editorial: Don't frontpage this post, editors. I write it down here to summarize my thought, wanting to get feedbacks from my trusted readers and NOT flame wars or another giant thread of utf-8 flag woes)&lt;br /&gt;&lt;br /&gt;I can finally say I fully grok Unicode, UTF-8 flag and all that stuff in Perl just lately. Here are some analysis of how perl programmers understand Unicode and UTF-8 flag stuff.&lt;br /&gt;&lt;br /&gt;(This post might need more code to demonsrate and visualize what I'm talking about, but I'd leave it as a homework for readers, or at least thing for me to do until YAPC::Asia if there's a demand for this talk :))&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Level 1. &quot;Take that annoying flag off, dude!&quot;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;They, typically web application developers, assume all data is encoded in utf-8. If they encounter some wacky garbaged characters (a.k.a Mojibake in Japanese) which they think is a perl bug, they just make an ad-hoc call of:&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;Encode::_utf8_off($stuff)&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt; to take the utf-8 flag off and make sure all data is still in utf-8 by avoiding any possible latin-1-utf8 auto upgrades.&lt;br /&gt;&lt;br /&gt;This is level 1. Unfortunately, this works okay, assuming their data is actually encoded only in utf-8 (like database is utf-8, web page is displayed in utf-8, the data sent from browsers is utf-8 etc.). Their app is still broken when they call things like length(), substr() or regular expression because the strings are not UTF-8 flagged and those functions don't work in Unicode semantics.&lt;br /&gt;&lt;br /&gt;They can optionally use &quot;use encoding 'utf-8'&quot; or CPAN module &lt;a href=&quot;http://search.cpan.org/~audreyt/encoding-warnings&quot;&gt;encoding::warnings&lt;/a&gt; to avoid auto-upgrades at all, or catch such mistakes, or use &lt;a href=&quot;http://search.cpan.org/~taniguchi/Unicode-RecursiveDowngrade-0.03/&quot;&gt;Unicode::RecursiveDowngrade&lt;/a&gt; to turn off UTF-8 flag on complex data structure.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Level 2. &quot;Unicode strings have UTF-8 flags. That's easy&quot;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;They make an extensive use of Encode module encode() and decode() to make sure all data in their app is UTF-8 flagged. Their app works really nice in Unicode semantics.&lt;br /&gt;&lt;br /&gt;They sometimes need to deal with UTF-8 bytes in addition to UTF8-flagged strings. In that case, they use some hacky modules named &lt;a href=&quot;http://search.cpan.org/search?query=forceutf8&amp;amp;mode=all&quot;&gt;ForceUTF8&lt;/a&gt;, or do things like&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;utf8::encode($_) if utf8::is_utf8($_)&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt; to assume that &quot;Unicode strings should have UTF-8 flagged, and those without the flag are assumed UTF-8 bytes.&quot;&lt;br /&gt;&lt;br /&gt;This is Level 2. This is a straight upgrade from Level 1 and fixes some issues of Level 1 (string functions not working in Unicode semantics, etc.), but it's still too UTF-8 centric. They ignore why perl5 treats strings this way, and still hate SV Auto-upgrade.&lt;br /&gt;&lt;br /&gt;To be honest I was thinking this way until, like early 2007. There's a couple of my modules on CPAN that accepts both UTF-8 flagged string and UTF-8 bytes, because I thought it'd be handy, but actually that breaks latin-1 strings if they're not utf-8 flagged, which is rare in UTF-8 centric web application development anyway, but still could happen.&lt;br /&gt;&lt;br /&gt;I gradually have changed my mind when I talked about how JSON::Syck Unicode support is broken with &lt;a href=&quot;http://search.cpan.org/~mlehmann/&quot;&gt;Marc Lehmann&lt;/a&gt;, and when I read the tutorial by and attended to the Perl Unicode tutorial talk by &lt;a href=&quot;http://search.cpan.org/~juerd/&quot;&gt;Juerd Waalboer&lt;/a&gt; in YAPC::EU.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Level 3. &quot;Don't bother UTF-8 flag&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;They stop guessing if a variable is UTF-8 flagged or not. All they need to know is that a string is whether bytes or characters, by checking how a scalar variable is generated.&lt;br /&gt;&lt;br /&gt;If it's bytes, use decode() to get Unicode strings. If it's characters, don't bother if it's UTF-8 flagged or not: if it's not flagged they'll be auto-upgraded thanks to Perl, so you don't need to know the internal representations.&lt;br /&gt;&lt;br /&gt;So it's like a step back from Level 2. &quot;Get back to the basic, and think why Perl 5 does this latin-1 to utf-8 auto upgrades.&quot;&lt;br /&gt;&lt;br /&gt;If your function or module needs to accept strings that might be either characters or bytes, just provide 2 different functions, or some flag to explicitly set. Don't auto-decode bytes as utf-8 because that breaks latin-1 characters if they're not utf-8 flagged. Of course the caller of the module can call utf8::upgrade() to make sure, but it's just a pain and anti-perl5 way.&lt;br /&gt;&lt;br /&gt;There's still a remaining problem with CPAN modules, though. Some modules return strings in some occasion and not otherwise. For instance, $c-&amp;gt;req-&amp;gt;param($foo) would return UTF-8 flagged string if Catalyst::Plugin::Unicode is loaded and bytes otherwise. And using utf8::is_utf8($_) here might cause bugs like described before.&lt;br /&gt;&lt;br /&gt;Well, in C::P::Unicode example, actually not. using C::P::Unicode guarantees that parameters are all utf-8 flagged even if the characters contain latin-1 range characters. Not using the plugin guarantees the parametes are not flagged at all. So it's a different story.&lt;br /&gt;&lt;br /&gt;(To be continued...)&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/238106487&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 20 Feb 2008 21:41:59 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: I'm now on SlideShare</title>
	<guid isPermaLink="false">http://use.perl.org/~brian_d_foy/journal/35701?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/238145965/35701</link>
	<description>So, I have another web 2.0 account thingy. I uploaded &lt;a href=&quot;http://www.slideshare.net/brian_d_foy&quot;&gt;my talks to Slideshare&lt;/a&gt;. There's probably some way to connect to other Perl people or somesuch on there.&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/238145965&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 20 Feb 2008 21:41:59 +0000</pubDate>
</item>
<item>
	<title>Homestar Runner: Strong Bad email #190</title>
	<guid isPermaLink="true">http://homestarrunner.com/sbemail190.html</guid>
	<link>http://homestarrunner.com/sbemail190.html</link>
	<pubDate>Tue, 19 Feb 2008 21:56:52 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Submit your talks to YAPC::Asia 2008</title>
	<guid isPermaLink="false">http://use.perl.org/~miyagawa/journal/35688?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/237215050/35688</link>
	<description>YAPC::Asia 2008 proposal deadline is 2/25, one week away. &lt;a href=&quot;http://conferences.yapcasia.org/ya2008/&quot;&gt;Submit your talk&lt;/a&gt; now. We welcome JavaScript related talks as well as anything Perl.&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/237215050&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 19 Feb 2008 21:22:13 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Working in the cloud</title>
	<guid isPermaLink="false">http://use.perl.org/~acme/journal/35694?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/237480554/35694</link>
	<description>&lt;p&gt;
I've just submitted this talk to YAPC::Asia and will submit it to YAPC::Europe:
&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;We are from the internet - we know the value of open source. Hardware and storage is unfortunately real, but you can outsource it all. This talk will guide you through how to exploit cloud computing today to make you happier and more efficient.&lt;/div&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/237480554&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 19 Feb 2008 21:22:13 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: goodbye cpan-testers, hello cpan-uploads</title>
	<guid isPermaLink="false">http://log.perl.org/2008/02/goodbye-cpan-te.html</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/237267031/goodbye-cpan-te.html</link>
	<description>&lt;p&gt;Today, at 4:11pm Pacific Standard Time, an era (or at least 9 years) ended.  The cpan-testers mailing list, recipient of a &lt;strong&gt;all &lt;/strong&gt;CPAN tests submitted for &lt;a href=&quot;http://testers.cpan.org&quot;&gt;CPAN testers&lt;/a&gt; processing, no longer resends all of those emails to its 50+ subscribers.  The last message to be distributed via email should have been #1049514.  Further messages will be kept in the archive, &lt;a href=&quot;http://www.nntp.perl.org/group/perl.cpan.testers&quot;&gt;http://www.nntp.perl.org/group/perl.cpan.testers&lt;/a&gt; (also home to RSS and Atom feeds).  Eventually, we're going to transfer to a proper database backed system that doesn't use email at all.&lt;/p&gt;

&lt;p&gt;Several people noted that they used cpan-testers to receive notification of new uploads to CPAN.  We've created the cpan-uploads mailing list to receive these notifications.     Archive/RSS/Atom is at &lt;a href=&quot;http://www.nntp.perl.org/group/perl.cpan.uploads&quot;&gt;http://www.nntp.perl.org/group/perl.cpan.uploads&lt;/a&gt;.  You can subscribe by sending a note to cpan-uploads-subscribe at perl.org.&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/237267031&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 19 Feb 2008 21:22:13 +0000</pubDate>
</item>
<item>
	<title>Beautiful Code: Code inspections simplified</title>
	<guid isPermaLink="false">tag:beautifulcode.oreillynet.com,2008://2.85</guid>
	<link>http://beautifulcode.oreillynet.com/2008/02/code_inspections_simplified.php</link>
	<description>&lt;p&gt;

It's hard to remember to do simple code inspections--the oldest
quality technique in the software field--amid the welter of graphical
tools, measurement tools, and other fancy tricks the industry has
thought up. Code inspections make sense. If you find a flaw during a
program run and debug it, you've fixed just one bug. Only a code
inspection can fix the potentially hundreds of other similar bugs.

&lt;/p&gt;&lt;p&gt;

But code inspections are a headache, because logic and consistency are
hard to determine. Miska Hiltunen is trying to make them more
agreeable by rigidly limiting what you have to look for, and assuring
developers that they can get through each inspection in just about an
hour.
      His
&lt;a href=&quot;http://www.tick-the-code.com/en/index.php&quot;&gt;Tick-the-Code&lt;/a&gt;
site lists extremely simple things that pop out of poorly constructed
code right away, and that supposedly warn you of the risk of deeper
problems. Things to look for include unchecked parameters, deeply
nested structures, duplicate code, unnecessary comments, unfinished
code, and poorly named variables.

&lt;/p&gt;&lt;p&gt;

How is this relevant to &lt;em&gt;Beautiful Code&lt;/em&gt;? A chapter in that
book by Laura Wingerd and Christopher Seiwald of
&lt;a href=&quot;http://www.perforce.com/&quot;&gt;Perforce&lt;/a&gt;
focuses our attention on just such superficial aspects of source
code. Simply lining up the code for different cases to show their
similarities and differences, these authors claim, can prevent
associated bugs. They show how a violation at one stage of one of
their principles--deep nesting of control structures, which they, like
Hiltunen, try to avoid--coincided with a sharp uptick in errors.

&lt;/p&gt;&lt;p&gt;

Will Hiltunen's list of simple rules help programmers avoid real bugs?
Or is it a focus on trivia that distracts programmers from dealing
with real problems in their design and algorithms? Testing and time
will tell.

&lt;/p&gt;&lt;p&gt;

Perhaps we can look at the endeavor this way: design and algorithms
are certainly the most important drivers of quality and good
performance. But design mostly takes place outside of and before
coding, while algorithms are coded by experts who provide them to the
rest of us in packages. Most of us who code are cobbling together
small programs with lots of glue from standard libraries. Checking for
trivial coding inconsistencies may uncover a lot of the problems we
need to find.&lt;/p&gt;</description>
	<pubDate>Mon, 18 Feb 2008 00:02:30 +0000</pubDate>
</item>
<item>
	<title>Joshua Wehner: Obscure Rails bug: respond_to format.any</title>
	<guid isPermaLink="true">http://blogs.thewehners.net/josh/posts/view/354-obscure-rails-bug-respond_to-formatany</guid>
	<link>http://blogs.thewehners.net/josh/posts/view/354-obscure-rails-bug-respond_to-formatany</link>
	<description>&lt;p&gt;I found an odd bug in Rails today. Odd, in the sense that it's not so much broken, as working in a way that's different than one would expect.&lt;/p&gt;

&lt;p&gt;In a controller, one uses respond_to to present the appropriate response, as determined by the requested mimetype. If you want to respond to a whole clump of mimetypes in the same way, you might expect format.any to act as a catch-all for all the types you didn't already address.&lt;/p&gt;

&lt;p&gt;So, for example, if we're writing an authentication system, we want web browsers redirected to the login page. But for non-browsers (eg, curl asking for XML, or Ajax asking for JSON, or some API asking for a vcard, whatever), it doesn't make any sense to direct them to a login page. We should ask them to use http basic authentication.&lt;/p&gt;

&lt;p&gt;Here's the way this is handled by the current version of &lt;a href=&quot;http://svn.techno-weenie.net/projects/plugins/restful_authentication/&quot;&gt;restful_authentication&lt;/a&gt;:&lt;/p&gt;

&lt;p style=&quot;padding: 5px;&quot;&gt;&lt;code&gt;def access_denied&lt;br /&gt;  respond_to do |format|&lt;br /&gt;    format.html do&lt;br /&gt;      store_location&lt;br /&gt;      redirect_to new_&amp;lt;%= controller_singular_name %&amp;gt;_path&lt;br /&gt;    end&lt;br /&gt;    format.any do&lt;br /&gt;      request_http_basic_authentication 'Web Password'&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Except, this doesn't actually work. If you make a request for a non-html mimetype, you'll get a 406 (&quot;that format doesn't work here anymore&quot;), not a 401 (&quot;unauthorized&quot;).&lt;/p&gt;

&lt;p&gt;Presently, format.any actually looks something like this:&lt;/p&gt;

&lt;p style=&quot;padding: 5px;&quot;&gt;&lt;code&gt;def any(*args, &amp;amp;block)&lt;br /&gt;  args.each { |type| send(type, &amp;amp;block) }&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And, if you dig around a little in the mime_responds tests, you'll see that you're &lt;em&gt;supposed&lt;/em&gt; to call #any like so:&lt;/p&gt;

&lt;p style=&quot;padding: 5px;&quot;&gt;&lt;code&gt;respond_to do |type|&lt;br /&gt;  type.html { render :text =&amp;gt; &quot;HTML&quot; }&lt;br /&gt;  type.any(:js, :xml) { render :text =&amp;gt; &quot;Either JS or XML&quot; }&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Which, effectively, makes #any useless as a high-level catch-all for things like #access_denied. It's interesting that you can use it as a sort of multi-type, but that hardly seems the most common application. (Given the scarce documentation and meta-magic shenanigans in MimeType::Responders, I kinda doubt #any is used all that often. I only know about it because of restful_authentication.)&lt;/p&gt;

&lt;p&gt;I've created a &lt;a href=&quot;http://dev.rubyonrails.org/ticket/11140&quot;&gt;patch&lt;/a&gt; that changes #any's signature. It can now take 0 or any number of arguments. In the case where it has zero arguments, it assumes the mimetype requested (via the Rails-standard format parameter) or the first allowed mimetype (set by the request headers). In other words, it allows code like #access_denied, above from restful_authentication, to work as intended.&lt;/p&gt;

&lt;p&gt;If you can, please take a moment to +1 the patch.&lt;/p&gt;

&lt;p style=&quot;display: none;&quot;&gt;&lt;strong&gt;Tagged: &lt;/strong&gt;&lt;a href=&quot;http://blogs.thewehners.net/josh/posts/tagged/programming&quot; rel=&quot;tag&quot;&gt;programming&lt;/a&gt;, &lt;a href=&quot;http://blogs.thewehners.net/josh/posts/tagged/ruby+on+rails&quot; rel=&quot;tag&quot;&gt;ruby on rails&lt;/a&gt;, &lt;a href=&quot;http://blogs.thewehners.net/josh/posts/tagged/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 17 Feb 2008 16:39:33 +0000</pubDate>
	<author>blog_spam_joshua@thewehners.net (Joshua Wehner)</author>
</item>
<item>
	<title>Aristotle Pagaltzis: Roy T. Fielding has a posse</title>
	<guid isPermaLink="false">urn:uuid:b560e896-dd2c-11dc-89f2-b54a00dd6d4c</guid>
	<link>http://plasmasturm.org/log/494/</link>
	<description>&lt;p&gt;… err, I mean, has &lt;a href=&quot;http://roy.gbiv.com/untangled/&quot; title=&quot;Untangled: musings of Roy T. Fielding&quot;&gt;a weblog&lt;/a&gt;.&lt;/p&gt;
    &lt;p&gt;Welcome aboard, Roy.&lt;/p&gt;</description>
	<pubDate>Sun, 17 Feb 2008 07:48:20 +0000</pubDate>
</item>
<item>
	<title>Randal Schwartz: R.E.M. chooses &quot;artistic license&quot; for video mashups</title>
	<guid isPermaLink="true">http://use.perl.org/~merlyn/journal/35674?from=rss</guid>
	<link>http://use.perl.org/~merlyn/journal/35674?from=rss</link>
	<description>Looks like the Perl hackers aren't the only ones who like the new Artistic 2.0.  Apparently &lt;a href=&quot;http://www.readwriteweb.com/archives/rem_releases_new_videos_under_open_source_license.php&quot;&gt;the band R.E.M. has chosen to release 11 of their videos under Artistic 2.0 for mashups&lt;/a&gt;.  Wow.</description>
	<pubDate>Sat, 16 Feb 2008 21:55:26 +0000</pubDate>
</item>
<item>
	<title>Randal Schwartz: If only I could be cloned....</title>
	<guid isPermaLink="true">http://use.perl.org/~merlyn/journal/35667?from=rss</guid>
	<link>http://use.perl.org/~merlyn/journal/35667?from=rss</link>
	<description>Apparently, my &lt;a href=&quot;http://jobs.perl.org/job/7924&quot;&gt;&quot;programming-related memory engrams&quot;&lt;/a&gt; are worth something!</description>
	<pubDate>Fri, 15 Feb 2008 21:55:26 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Links for 2008-02-14 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/ask#2008-02-14</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/235400550/ask</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.schneier.com/blog/archives/2008/02/giving_drivers.html&quot;&gt;Schneier on Security: Giving Drivers Licenses to Illegal Immigrants&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.askbjoernhansen.com/~r/ask/~4/235379802&quot; height=&quot;1&quot; /&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/235400550&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 15 Feb 2008 21:41:53 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: 10000+ tables in one MySQL database</title>
	<guid isPermaLink="false">tag:www.askbjoernhansen.com,2008://1.1938</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/235355367/10000_tables_in_one_mysql_database.html</link>
	<description>&lt;p&gt;Once in a while I hear people talking about using thousands or tens of thousands of tables in one MySQL database and often how it “doesn’t work”.  There are two things to say to them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are you nuts?!&lt;/li&gt;
&lt;li&gt;Sure it works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ll elaborate a little on both …&lt;/p&gt;

&lt;h2&gt;Why’d you do that? Are you nuts?!&lt;/h2&gt;

&lt;p&gt;In most cases when extraordinarily many tables are brought up the “correct answer” is: Fix your schema to not duplicate the same table layout for each customer/user/site/…!&lt;/p&gt;

&lt;p&gt;Once in a while though there are good reasons to have &lt;strike&gt;way too many&lt;/strike&gt; lots of tables.  Even “takes too long to fix the application now” can be a good enough answer sometimes.&lt;/p&gt;

&lt;p&gt;My use case was to use the many tables as an extra “index” for a situation that a regular index couldn’t cover.  Tens of thousands of tables, here we come.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/ask/2265668961/&quot; title=&quot;Nova Cimangola Cement Plant by ask, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2140/2265668961_b081232230.jpg&quot; alt=&quot;Nova Cimangola Cement Plant&quot; width=&quot;500&quot; height=&quot;333&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Sure it works, just configure it right!&lt;/h2&gt;

&lt;p&gt;… which is easy!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In your startup script (/etc/init.d/mysql with the MySQL RPMs), add “ulimit -n 30000” somewhere near the top to allow mysqld to have 30000 open files (and sockets).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In your mysql configuration, add something like the following - adjust the number as appropriate.&lt;/p&gt;

&lt;p&gt;set-variable = table_cache=12000&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will let MySQL keep up to 12000 tables open.  The default limit is much too low and the system will spend all its time closing and opening the files.  The other few thousand handles are free for database connections or whatever.   You surely can tune the numbers more, but I haven’t needed to be more specific yet.   MySQL uses two filehandles per open table (for MyISAM, it depends on the table type…) &lt;/p&gt;

&lt;h3&gt;Flushing the tables&lt;/h3&gt;

&lt;p&gt;One curious thing you’ll run into is that MySQL can take &lt;em&gt;forever&lt;/em&gt; (read: hours!) flushing thousands of tables that have been changed if you do it with a simple “flush tables” or when you are shutting down mysql.  That’s of course not “hmn, how curious” but rather &lt;em&gt;insanely frustrating&lt;/em&gt; if you were going for a quick restart.  This occasionally seems to happen with InnoDB tables too, but in particular with our large MyISAM system (we use fulltext indexes, hence MyISAM) this is a big issue.&lt;/p&gt;

&lt;p&gt;With MyISAM tables, you also have a lot of cleaning up to do if the system crashes one way or another with thousands of tables open.&lt;/p&gt;

&lt;p&gt;There’s an easy-ish solution to both these problems, though! Just flush the tables &lt;em&gt;individually&lt;/em&gt; before the shutdown command and on a regular basis to mitigate the issue if it crashes.   Remember the system or MySQL can crash for all sorts of reasons.   Recently we had a motherboard with a BIOS or hardware bug that made it unstable after adding more than 16GB memory.  On another box, one of the memory sticks went bad so suddenly it came up with 4GB memory less than previously.   With MySQL carefully tuned to use all the memory (it was an InnoDB-only installation) it’d try using all 24GB memory and get killed by the kernel when it got above 20!  Yeah, that one took some head scratching before I figured it out.&lt;/p&gt;

&lt;p&gt;Below is a small program that’ll go through the database twice flushing all tables in all databases and then end with a regular “flush all”.  We go through the database twice just in case the first flush took so long that a lot of tables got opened again.  Two works for me, depending on your needs you might make it an option.  Or a fancy version would check how many open tables are at the end of the run and go through it again if too many are open (and abort with an error if they open faster than they can get closed!).  The final “flush tables” worked for me in getting everything closed just before the script exits (and the shutdown or whatever starts).&lt;/p&gt;

        &lt;pre&gt;&lt;code&gt;#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long qw(GetOptions);
use DBI;

my %args = (
            verbose =&amp;gt; 0,
            user     =&amp;gt; $ENV{USER},
            hostname  =&amp;gt; '127.0.0.1',
            port     =&amp;gt; 3306
           );

GetOptions(\%args,
           'verbose!',
           'user=s',
           'password=s',
           'hostname=s',
           'port=i',
           'database=s@'
          );


my $dbh = DBI-&amp;gt;connect(&quot;dbi:mysql:hostname=$args{hostname};port=$args{port}&quot;,
                        $args{user}, $args{password})
  or die DBI-&amp;gt;errstr;

my @dbs = $dbh-&amp;gt;func('_ListDBs');

for my $db (@dbs) {
  next if uc($db) eq 'INFORMATION_SCHEMA';
  $dbh-&amp;gt;do(&quot;use $db&quot;);
  my $tables = $dbh-&amp;gt;selectcol_arrayref(&quot;show tables&quot;);
  for (1..2) {
    for my $table (@$tables) {
      print &quot;flushing $db.$table\n&quot;;
      $dbh-&amp;gt;do(&quot;flush table $table&quot;);
    }
  }
}

print &quot;flushing all\n&quot;;
$dbh-&amp;gt;do(&quot;flush tables&quot;);
&lt;/code&gt;&lt;/pre&gt;

    &lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.askbjoernhansen.com/~f/ask?a=p3lsG3E&quot;&gt;&lt;img src=&quot;http://feeds.askbjoernhansen.com/~f/ask?i=p3lsG3E&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.askbjoernhansen.com/~f/ask?a=1iBUqxe&quot;&gt;&lt;img src=&quot;http://feeds.askbjoernhansen.com/~f/ask?i=1iBUqxe&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.askbjoernhansen.com/~f/ask?a=dsh2RVe&quot;&gt;&lt;img src=&quot;http://feeds.askbjoernhansen.com/~f/ask?i=dsh2RVe&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.askbjoernhansen.com/~r/ask/~4/235344650&quot; height=&quot;1&quot; /&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/235355367&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 15 Feb 2008 21:41:53 +0000</pubDate>
</item>
<item>
	<title>Josh McAdams: YAPC::NA 2008 Call for Participation</title>
	<guid isPermaLink="true">http://use.perl.org/~jmcada/journal/35656?from=rss</guid>
	<link>http://use.perl.org/~jmcada/journal/35656?from=rss</link>
	<description>&lt;p&gt;The Chicago Perl Mongers are excited to officially open the call for participation for YAPC::NA 2008. To submit your proposal, visit &lt;a href=&quot;http://yapc.org/America&quot;&gt;the YAPC site&lt;/a&gt;, create an account, and let us know what you'd like to talk about. Submissions will be accepted through March 15th 2008, so get yours in soon.
&lt;/p&gt;
&lt;p&gt;
We are currently accepting proposals for conference talks with durations of 20, 45, 70, and 95 minutes. These talks can be directed at any level of Perl programmer, from the noobies to seasoned Perl veterans. If you want to show off an amazing hack or new framework that youve been involved with, this could be your chance. Possibly you just want to contribute to the community by giving an introductory talk on regular expressions or subroutines; we intend on having something for everyone this year.
&lt;/p&gt;
&lt;p&gt;
If 20 minutes is a too intimidating for you right now or if you just dont have enough material to fill up that much time, dont fret, we'll be opening the call for lighting talks soon. These 5-minute mini-presentations are a great way to get a quick point across and to get some experience in presenting in front of a crowd. Keep watching this news source for more information about the lighting talks.
&lt;/p&gt;
&lt;p&gt;
This year we are also planning on introducing more hands-on workshop-style tracks to the conference. These sessions will typically be a little longer than a normal presentation and will be much more informal. During the workshops, conference attendees will be able to interact with presenters to actually do things like compile Parrot or create a hello world program in Perl 6. If you are involved in a project and would like to host a workshop, please contact Josh McAdams directly at joshua dot mcadams at gmail dot com.
&lt;/p&gt;</description>
	<pubDate>Thu, 14 Feb 2008 22:01:11 +0000</pubDate>
</item>
<item>
	<title>Adriano Ferreira: Wanna break some dists?</title>
	<guid isPermaLink="true">http://use.perl.org/~ferreira/journal/35653?from=rss</guid>
	<link>http://use.perl.org/~ferreira/journal/35653?from=rss</link>
	<description>&lt;p&gt;
An easy recipe to do this is to include a dependency on a module version which only development releases reached that far.
&lt;/p&gt;
&lt;p&gt;
That will provoke installations by the CPAN shell to fail complaining about a bad dependency. These actually will generate NA test reports because of dependencies which could not be satisfied.
&lt;/p&gt;
&lt;p&gt;
I saw such an example the other day. The dist &lt;a href=&quot;http://search.cpan.org/dist/KSx-Analysis-StripAccents/&quot;&gt; &lt;code&gt;KSx-Analysis-StripAccents &lt;/code&gt; &lt;/a&gt; declared a dependency on 0.2 version of &lt;a href=&quot;http://search.cpan.org/dist/KinoSearch&quot;&gt; &lt;code&gt;KinoSearch&lt;/code&gt; &lt;/a&gt;. The latest stable release of KinoSearch is 0.162 and the current devel release is 0.20_05. That filled CPAN Testers with NA reports on SPROUT's module.
&lt;/p&gt;
&lt;p&gt;
Note that this is not a major fault from author's part. It is just how the toolchain works nowadays.  There is no automated way to have a dependency on development versions, which seems a good thing, but which cannot be circumvented (unless it is done manually).
&lt;/p&gt;
&lt;p&gt;
Maybe, that has some resemblances with declaring dependencies on third-party modules which are not in CPAN (like &lt;code&gt;SVN::Core&lt;/code&gt; and modules in the list kept by &lt;a href=&quot;http://search.cpan.org/perldoc?Module::ThirdParty&quot;&gt;Module::ThirdyParty&lt;/a&gt;,
and company-specific code).&lt;/p&gt;</description>
	<pubDate>Thu, 14 Feb 2008 21:59:31 +0000</pubDate>
</item>
<item>
	<title>Planet Perl6: Jesse Vincent: Shipwright - our new code distribution system</title>
	<guid isPermaLink="true">http://use.perl.org/~jesse/journal/35658?from=rss</guid>
	<link>http://use.perl.org/~jesse/journal/35658?from=rss</link>
	<description>Like any opensource software shop, we distribute the source code&lt;br /&gt;for our software. How's that for the obvious statement of the decade?&lt;br /&gt;&lt;br /&gt;Actually, I can beat it. It's a pain in the neck for end users to&lt;br /&gt;collect and install all of the dependencies for our software.&lt;br /&gt;&lt;br /&gt;And now I'm going to one-up myself again.  Customers often build&lt;br /&gt;our software against untested versions of libraries, making debugging&lt;br /&gt;'frustrating.'&lt;br /&gt;&lt;br /&gt;RT, our flagship product, depends on 124 separate packages, 114 of&lt;br /&gt;them CPAN libraries. While CPAN has pretty good support for recursively&lt;br /&gt;installing dependencies, it's not perfect and can be time consuming&lt;br /&gt;and confusing for end users. And when it doesn't work right, as can&lt;br /&gt;happen when a module author makes an incompatible change, debugging&lt;br /&gt;requires a wizard.&lt;br /&gt;&lt;br /&gt;We've built a new source (and binary) packaging system called&lt;br /&gt;Shipwright.  Shipwright allows you to track all of your package's&lt;br /&gt;dependencies in a version control repository like SVN or SVK as&lt;br /&gt;well as build order and build instructions.&lt;br /&gt;&lt;br /&gt;It comes with tools for importing Perl modules, C libraries and&lt;br /&gt;other dependencies from CPAN, upstream version control repositories&lt;br /&gt;and tarballs. When it can discover dependency information (as it&lt;br /&gt;can for Perl modules), Shipwright will automatically import the&lt;br /&gt;current versions of all listed dependencies if the repository doesn't&lt;br /&gt;already contain sufficient versions.&lt;br /&gt;&lt;br /&gt;Shipwright can automatically set up build instructions for projects&lt;br /&gt;using autoconf as well as projects using Perl's MakeMaker,&lt;br /&gt;Module::Install and  Module::Build mechanisms. If necessary, you&lt;br /&gt;can customize the build instructions and dependency ordering after&lt;br /&gt;you import a package.&lt;br /&gt;&lt;br /&gt;When it's time to ship your project to your end users, all you need&lt;br /&gt;to do is take a snapshot of your Shipwright repository and send it&lt;br /&gt;out. To build your project, an end user just needs to run&lt;br /&gt;&quot;./bin/shipwright-build&quot;. If they want to, your users can choose&lt;br /&gt;to skip certain dependencies (if they want to use system versions)&lt;br /&gt;or specify an installation path.  By default, Shipwright builds&lt;br /&gt;fully relocatable binary distributions into a temporary directory&lt;br /&gt;and users can move them into place or copy them to any number of&lt;br /&gt;hosts with the same base system libraries -- Shipwright automatically&lt;br /&gt;wraps all your binaries and scripts so that they can find the&lt;br /&gt;Shipwright versions of their dependencies, no matter where you move&lt;br /&gt;the installed distribution.  Shipwright also comes with sh and tcsh&lt;br /&gt;scripts you can 'source' to add an installed distribution's libraries&lt;br /&gt;to your current environment.&lt;br /&gt;&lt;br /&gt;At Best Practical, we've configured most of our Shipwright distributions&lt;br /&gt;to bundle everything above libc. Perl, Subversion and GD are just&lt;br /&gt;some of the packages we distribute as part of these relocatable&lt;br /&gt;builds.  We now have a single-command tool to build, link and install&lt;br /&gt;Subversion, SVK and all their dependencies (including APR, Neon,&lt;br /&gt;Perl and a bunch of others).  With a single command, we downloaded,&lt;br /&gt;extracted, checked in and tested Tatsuhiko Miyagawa's Plagger Feed&lt;br /&gt;Aggregator and all 134 perl modules it depends on. After that, a&lt;br /&gt;single command built a full binary distribution of Plagger, ready&lt;br /&gt;for deployment on any Mac OS X system.&lt;br /&gt;&lt;br /&gt;I'm quite proud to release Shipwright 1.0 today. I designed Shipwright&lt;br /&gt;with sunnavy, one of the hackers here at Best Practical.  He's&lt;br /&gt;responsible for almost all of the project's implementation to date,&lt;br /&gt;though we're eager to have additional developers join us going forward.&lt;br /&gt;&lt;br /&gt;If you're interested in Shipwright, download 1.0 from&lt;br /&gt;http://search.cpan.org/dist/Shipwright and subscribe to the Shipwright&lt;br /&gt;mailing list by emailing shipwright-subscribe@lists.bestpractical.com&lt;br /&gt;&lt;br /&gt;You can always get the latest version of the Shipwright source code&lt;br /&gt;with this command:&lt;br /&gt;&lt;br /&gt;svn co svn://svn.bestpractical.com/Shipwright/trunk&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Thu, 14 Feb 2008 21:41:57 +0000</pubDate>
</item>
<item>
	<title>Adriano Ferreira: What's better? -Ilib or -Mblib?</title>
	<guid isPermaLink="true">http://use.perl.org/~ferreira/journal/35649?from=rss</guid>
	<link>http://use.perl.org/~ferreira/journal/35649?from=rss</link>
	<description>&lt;p&gt;
When testing/playing with a distribution, one usually runs:
&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;$ perl Makefile.PL; make&lt;br /&gt;$ perl -Mblib demo.pl&lt;br /&gt;# or (with tests)&lt;br /&gt;$ prove -b test.t&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;
Sometime the &lt;code&gt;make&lt;/code&gt; (or &lt;code&gt;./Build&lt;/code&gt;) gets annoying and a shortcut is nice:
&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;$ perl -Ilib demo.pl&lt;br /&gt;# or&lt;br /&gt;$ prove -l test.t&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;
However, there are a bunch of reasons not do that. Among them:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; &lt;code&gt;-Ilib&lt;/code&gt; won't work for modules with XS parts (it will use installed XS components or fail to load)
&lt;/li&gt;
&lt;li&gt;the current build settings may establish an environment different from the current &lt;code&gt;lib/&lt;/code&gt; layout (with modules not in the MANIFEST and things like that)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
At the end, we conclude that working under &lt;code&gt;-Mblib&lt;/code&gt; is safer (and closer to release conditions) than playing with &lt;code&gt;-Ilib&lt;/code&gt;.
&lt;/p&gt;</description>
	<pubDate>Wed, 13 Feb 2008 21:58:29 +0000</pubDate>
</item>
<item>
	<title>Perl.com: Elements of Access Control</title>
	<guid isPermaLink="true">http://www.perl.com/pub/a/2008/02/13/elements-of-access-control.html?CMP=OTC-BD0016219291&amp;ATT=Elements+of+Access+Control</guid>
	<link>http://www.perl.com/pub/a/2008/02/13/elements-of-access-control.html?CMP=OTC-BD0016219291&amp;ATT=Elements+of+Access+Control</link>
	<description>Some data is private. Other data, less so. Secure applications make it possible--and easy--to keep user data visible to the right people and invisible to the wrong people. Vladi Belperchinov explains how access control works and demonstrates with working code suitable for implementing your own access controls.</description>
	<pubDate>Wed, 13 Feb 2008 21:58:05 +0000</pubDate>
</item>
<item>
	<title>David Golden: CPAN 1.92_56 adds &quot;trust_test_report_history&quot; option</title>
	<guid isPermaLink="true">http://use.perl.org/~dagolden/journal/35637?from=rss</guid>
	<link>http://use.perl.org/~dagolden/journal/35637?from=rss</link>
	<description>I'm proud of this new config option I added to CPAN.pm: trust_test_report_history.&lt;br /&gt;&lt;br /&gt;When this option is set and the latest version of CPAN::Reporter is installed, then CPAN.pm won't run tests on a distribution that has already passed tests on that platform and perl, but will use the last test result for that distribution instead.&lt;br /&gt;&lt;br /&gt;Where this comes in handy is &quot;build_requires&quot; prerequisites.  If a build_requires prereq is not installed, CPAN.pm will download, build and test it and then include it in PERL5LIB (if it passes its tests) for the rest of that session.  But in any future session, the next time a distribution has that prerequisite, CPAN.pm does the exact same thing all over again.  But with &quot;trust_test_report_history&quot;, the test is only run once.&lt;br /&gt;&lt;br /&gt;This may not have a big impact for day-to-day use, but it should save a lot of time and processor cycles for smoke testing.&lt;br /&gt;&lt;br /&gt;-- dagolden&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Tue, 12 Feb 2008 21:56:43 +0000</pubDate>
</item>
<item>
	<title>Aristotle Pagaltzis: T-2D for the 10th German Perl Workshop</title>
	<guid isPermaLink="true">http://use.perl.org/~Aristotle/journal/35634?from=rss</guid>
	<link>http://use.perl.org/~Aristotle/journal/35634?from=rss</link>
	<description>&lt;p&gt;Tomorrow at this hour I’ll be asleep 400km from home.&lt;/p&gt;</description>
	<pubDate>Tue, 12 Feb 2008 21:56:39 +0000</pubDate>
</item>
<item>
	<title>Yanick Champoux: Thinking about taking over NetPacket</title>
	<guid isPermaLink="true">http://use.perl.org/~Yanick/journal/35641?from=rss</guid>
	<link>http://use.perl.org/~Yanick/journal/35641?from=rss</link>
	<description>&lt;p&gt;
At $work, an application that I wrote (&lt;i&gt;remora&lt;/i&gt;, a companion
application to &lt;a href=&quot;http://www.wireshark.org/&quot;&gt;Wireshark&lt;/a&gt;)
is extensively using
&lt;a href=&quot;http://search.cpan.org/~atrak/NetPacket-0.04/&quot;&gt;NetPacket&lt;/a&gt;.
NetPacket is very handy but, alas,  has
&lt;a href=&quot;http://rt.cpan.org/Ticket/Display.html?id=7010&quot;&gt;some&lt;/a&gt;
&lt;a href=&quot;http://rt.cpan.org/Ticket/Display.html?id=18941&quot;&gt;bugs&lt;/a&gt;,
and seem to be orphaned  (the latest update
is from 2003).  I've tried to poke the maintainers, but
Stephanie Wehner's email is no longer working, and Tim Potter didn't
reply yet (although, to be fair, I only began to poke last week).
&lt;/p&gt;
&lt;p&gt;
Bottom line, I'm playing with the idea of taking over the module so that
I can churn a new version with the bug fixes.  So if
anyone out there is in contact with Stephanie or Tim, can you let
them know a madman is nefariously organizing a coup?  Thanks. :-)
&lt;/p&gt;</description>
	<pubDate>Tue, 12 Feb 2008 21:55:12 +0000</pubDate>
</item>
<item>
	<title>Perl Foundation: rt.cpan.org Speed Improvements in Place</title>
	<guid isPermaLink="false">tag:news.perlfoundation.org,2008://18.1934</guid>
	<link>http://news.perlfoundation.org/2008/02/rtcpanorg_speed_improvements_i.html</link>
	<description>&lt;p&gt;A while back, around November 2007, there was &lt;a href=&quot;http://use.perl.org/~Alias/journal/34801&quot;&gt;some discussion&lt;/a&gt; about performance problems with rt.cpan.org to the point that some found it to be almost unusable. I bring this up here because there were some suggestions that perhaps &lt;span class=&quot;caps&quot;&gt;TPF &lt;/span&gt;could buy some new hardware. If you scroll to the bottom, you'll see Jesse Vincent jumped in and said he thought the performance wasn't a hardware problem and he could make some changes, but he needed help locating the trouble spots. &lt;/p&gt;

&lt;p&gt;I'm happy to report that Jesse's team, led by Ruslan Zakirov, has implemented some changes and performance seems to be much better now. Even better, many of the changes made for &lt;a href=&quot;http://rt.cpan.org&quot;&gt;rt.cpan.org&lt;/a&gt; have filtered into the regular &lt;a href=&quot;http://bestpractical.com/rt&quot;&gt;RT&lt;/a&gt; codebase as of RT 3.6.6. Jesse also told me they are working to publish all the bits of rt.cpan.org that are still&lt;br /&gt;
locked away so that the perl community can contribute more actively.&lt;/p&gt;

&lt;p&gt;I just wanted to say thanks to Jesse (and Ruslan) for following through on the fixes. I also want to thank Adam and others for pointing out the problems so we could address them. A public service isn't really a service if people can't use it.&lt;/p&gt;

&lt;p&gt;Note: I applied some updates after I first published this.&lt;/p&gt;</description>
	<pubDate>Tue, 12 Feb 2008 18:39:24 +0000</pubDate>
</item>
<item>
	<title>Beautiful Code: Model Checking creators win Turing Award</title>
	<guid isPermaLink="false">tag:beautifulcode.oreillynet.com,2008://2.84</guid>
	<link>http://beautifulcode.oreillynet.com/2008/02/model_checking_creators_win_tu.php</link>
	<description>&lt;p&gt;

The Association for Computing Machinery has
&lt;a href=&quot;http://www.acm.org/press-room/news-releases/turing-award-07/&quot;&gt;given it\s highly prestigious A.M. Turing Award&lt;/a&gt;
to the researchers credited for inventing Model Checking: Edmund M.
Clarke, E. Allen Emerson, and Joseph Sifakis.


      &lt;/p&gt;&lt;p&gt;

I believe it was in the 1960s that a few computer science pioneers
such as Edsger Dijkstra suggested checking computer programs through
formal proofs. For instance, it's obvious you'd better be careful if
you write code such as:

&lt;/p&gt;&lt;pre&gt;
if ( var &amp;gt; 0 )
  func();
else if ( var = 0 )
  return;

&lt;/pre&gt;

Any programmer looking at that has to ask: what does the program do if
&lt;tt&gt;var&lt;/tt&gt; is less than 0? Is it OK if the program just falls
through to the next statement? If not, can you be sure that
&lt;tt&gt;var&lt;/tt&gt; can never be less than 0 when the program reaches this
point? These sort of questions are what formal proofs are supposed to
expose and resolve.

&lt;p&gt;

Formal proofs looked great for academic exercises, but quickly became
untenable when applied to real-life applications because of the
explosion of possible states. The same originally was true for Model
Checking when it was invented in the 1980s.

&lt;/p&gt;&lt;p&gt;

Another problem with these systems is that they beg the question of
whether a program is correct. You can't run a proof without specifying
your requirements in a highly formal manner, and the formal statement
could just as easily have a bug as the program you want to check, a
&lt;em&gt;qui custodiat custos&lt;/em&gt; situation.

&lt;/p&gt;&lt;p&gt;

Gradually these problems were overcome to enough of an extent that
Model Checking proves useful in a wide range of situations nowadays,
and a huge number of products support it. It's particularly useful in
hardware, probably because you're not facing the irony of using code
to check code (the &lt;em&gt;qui custodiat custos&lt;/em&gt; situation).

&lt;/p&gt;&lt;p&gt;

So computer science &lt;em&gt;can&lt;/em&gt; solve some of the big problems in
quality. Congratulations to the honored researchers.&lt;/p&gt;</description>
	<pubDate>Mon, 11 Feb 2008 23:28:36 +0000</pubDate>
</item>
<item>
	<title>Surfin Safari: The Star Seven Hack</title>
	<guid isPermaLink="true">http://webkit.org/blog/157/the-star-seven-hack/</guid>
	<link>http://webkit.org/blog/157/the-star-seven-hack/</link>
	<description>&lt;p&gt;For those of you using the star seven CSS hack to target current or older versions of WebKit, this parsing bug has been closed in the latest WebKit nightlies.  Acid3 specifically tests for this, so any browser that wants to be compliant with Acid3 will have to fix this CSS parsing bug.&lt;/p&gt;
&lt;p&gt;For more information about this hack, see:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://diveintomark.org/projects/csshacks/star7.html&quot;&gt;http://diveintomark.org/projects/csshacks/star7.html&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 11 Feb 2008 22:09:21 +0000</pubDate>
</item>
<item>
	<title>José Castro: Portuguese Perl Workshop 2008</title>
	<guid isPermaLink="true">http://use.perl.org/~cog/journal/35633?from=rss</guid>
	<link>http://use.perl.org/~cog/journal/35633?from=rss</link>
	<description>It's true! It's going to happen!&lt;br /&gt;&lt;br /&gt;June 6th and 7th (a Friday and a Saturday), in Braga, Portugal.&lt;br /&gt;&lt;br /&gt;brian d foy is going to be there and he will also be lecturing two days of Intermediate Perl Programming on the 4th and on the 5th (and we could also tell you which days of the week those are, but instead we'll just let you guess). Other national and foreign speakers are also expected (there's already some movement on DOPPLR).&lt;br /&gt;&lt;br /&gt;What did you say? A website? Of course we have a website, don't be ridiculous... Now, where did we put it? Ah, &lt;a href=&quot;http://workshop.perl.pt/ptpw2008/&quot;&gt;here it is&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;You may want to subscribe &lt;a href=&quot;http://workshop.perl.pt/ptpw2008/atom/en.xml&quot;&gt;our feed&lt;/a&gt;, since that's the place where the CFP and other announcements are supposed to show up.&lt;br /&gt;&lt;br /&gt;Also, spread the word!&lt;br /&gt;&lt;br /&gt;See you in Braga ;-)</description>
	<pubDate>Mon, 11 Feb 2008 21:58:03 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: No more email delivery of cpan-testers</title>
	<guid isPermaLink="false">http://log.perl.org/2008/02/no-more-email-d.html</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/233002572/no-more-email-d.html</link>
	<description>&lt;p&gt;Dear cpan-testers recipients,&lt;/p&gt;

&lt;p&gt;  Effective Monday night, Feb 11th, 2008, after over a million test reports[1], we will no longer be supporting the delivery via email of cpan-testers test reports.  With an influx of over 3000 messages a  day, this was causing us to deliver almost 200,000 outbound messages, most of which nobody read.&lt;/p&gt;&lt;p&gt;cpan-testers test report submission is unaffected by this change.[2]

&lt;/p&gt;

&lt;p&gt;If you are currently subscribed to cpan-testers, you'll be unsubscribed, and your mail server will breathe a sign of relief.&lt;/p&gt;

&lt;p&gt;  You can find test reports at:&lt;br /&gt;    &lt;a href=&quot;http://www.nntp.perl.org/group/perl.cpan.testers/&quot;&gt;http://www.nntp.perl.org/group/perl.cpan.testers/&lt;/a&gt;&lt;br /&gt;    &lt;a href=&quot;http://www.nntp.perl.org/group/perl.cpan.testers/rss/posts.xml&quot;&gt;http://www.nntp.perl.org/group/perl.cpan.testers/rss/posts.xml&lt;/a&gt;&lt;br /&gt;    &lt;a href=&quot;nntp://nntp.perl.org/perl.cpan.testers/&quot;&gt;nntp://nntp.perl.org/perl.cpan.testers/&lt;/a&gt;&lt;br /&gt;    &lt;a href=&quot;http://testers.cpan.org/&quot;&gt;http://testers.cpan.org/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Why are we doing this?  Things were chugging along smoothly, except every few weeks we'd have a problem where a recipient's mail server would stop accepting mail, and we'd very quickly end up with a large backlog of thousands of messages waiting to be delivered.  This would slow down delivery for all of our mailing lists.  Recently, this has been happening more and more often.  We analyzed the&lt;br /&gt;problem, and came to the conclusion that the best solution was to discontinue outbound email.  This will let us focus more time on maintaining more important things.&lt;/p&gt;

&lt;p&gt;If you have something that is dependent on receiving all of these emails, please let us know.&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;

&lt;p&gt;-R&lt;/p&gt;

&lt;p&gt;Footnotes: &lt;br /&gt;[1]  &lt;a href=&quot;http://www.nntp.perl.org/group/perl.cpan.testers/2008/01/msg1000000.html&quot;&gt;http://www.nntp.perl.org/group/perl.cpan.testers/2008/01/msg1000000.html&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;[2]  There are some volunteers working on a new system that will take email out of the picture altogether, creating a faster, more streamlined, and more consistent test database.&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/233002572&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 11 Feb 2008 21:42:02 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Mac OS X CD-ROM File Systems WTF?</title>
	<guid isPermaLink="false">http://www.justatheory.com/computers/os/macosx/cd_rom_filesystems.html</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/232855226/cd_rom_filesystems.html</link>
	<description>&lt;p&gt;Didn’t it used to be the case that when you used the Mac OS X Finder to
burn a CD-ROM that you could then mount that CD-ROM on a Windows box? In the
last few months, I’m suddenly finding that this is no longer the case. So now
I have to use &lt;code&gt;hdiutil&lt;/code&gt; to convert a &lt;em&gt;.dmg&lt;/em&gt; file to the
Joliet and ISO9660 file systems:&lt;/p&gt;

&lt;pre&gt;hdiutil makehybrid -o image.iso -joliet -iso image.dmg
&lt;/pre&gt;

&lt;p&gt;And &lt;em&gt;then&lt;/em&gt; I could burn a CD readable on Windows. What the fuck? I
burned three CDs that were then useless to me before I finally dug
up &lt;a href=&quot;http://www.macosxhints.com/article.php?query=dmg&amp;amp;story=20050819185219196&quot; title=&quot;Mac OS X Hints: “DVD image manipulation via hdiutil”&quot;&gt;this hint&lt;/a&gt;.
And I had this problem with CDs burned by Tiger, too, last summer, so it’s not
just Leopard. It seems to me that Mac OS X should always default to building a
hybrid CD that’s then readable by Windows, Linux, and everything else. Why
doesn’t it?&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/232855226&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 11 Feb 2008 21:42:02 +0000</pubDate>
	<author>david@justatheory.com (David Wheeler)</author>
</item>
<item>
	<title>Jonathan Rockway: Adding methods at runtime</title>
	<guid isPermaLink="false">urn:guid:1D74C4FA-D8E8-11DC-B346-98FB984B61BA</guid>
	<link>http://blog.jrock.us/articles/Adding%20methods%20at%20runtime.pod</link>
	<description>&lt;div class=&quot;pod&quot;&gt;
&lt;p&gt;Something people often want to do is add methods to a specific
instance of a class.  For example, if you have a web request, you
might want to introspect it and add a &quot;deserialize&quot; method if it's a
REST request with serialized data.  However, you don't want other
instances of the Request class to have that method.  In this article,
we'll see how such a thing is possible.&lt;/p&gt;
&lt;p&gt;Let's start with a simple (and contrived) example:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Keyword&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; Foo;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; Moose;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;has &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; =&amp;gt; (is =&amp;gt; &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;ro&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;, isa =&amp;gt; &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Any&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Float&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;You can use the class like this:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$foo&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = Foo-&amp;gt;new( value =&amp;gt; &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Hello&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; );&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;say &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$foo&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# Hello&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;It sure would be nice to say &lt;code&gt;$foo-&amp;gt;say&lt;/code&gt; though.  Let's write a
role that implements the &lt;code&gt;say&lt;/code&gt; method:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Keyword&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; Say;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;Moose::Role&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; { say shift-&amp;gt;value }&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Float&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Right now, this role doesn't do much:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;DataType&quot;&gt;$foo&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;can&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);  &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# undef&lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$foo&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;does&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Say&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;); &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# undef&lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$foo&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;         &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# dies&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;To make &lt;code&gt;$foo&lt;/code&gt; do &lt;code&gt;Say&lt;/code&gt;, we need to apply the Role.  If we were
applying the role to every instance of the Foo class, we would say:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Keyword&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; Foo;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;with &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Say&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;...&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Then &lt;code&gt;Foo-&amp;gt;new(value =&amp;gt; '...')-&amp;gt;say&lt;/code&gt; would work.&lt;/p&gt;
&lt;p&gt;We only want to apply &lt;code&gt;Say&lt;/code&gt; to a specific instance,
however.  Fortunately, that is possible:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Normal&quot;&gt;Say-&amp;gt;meta-&amp;gt;apply(&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$foo&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$foo&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;         &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# Hello &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$foo&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;can&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);  &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# CODE(0xc0ffee)&lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$foo&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;does&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Say&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;); &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# true&lt;/span&gt;

&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$bar&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = Foo-&amp;gt;new;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$bar&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;can&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);  &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# no&lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$bar&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;does&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;): &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# false&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;That's all there is to it.  Applying &lt;code&gt;Say&lt;/code&gt; to every instance is also
possible at runtime:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Normal&quot;&gt;Say-&amp;gt;meta-&amp;gt;apply(Foo-&amp;gt;meta);&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Let's look at a more complex example:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Keyword&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;Integer&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; Moose;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;has &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; =&amp;gt; (is =&amp;gt; &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;ro&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;, isa =&amp;gt; &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;

&lt;span class=&quot;Keyword&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;one_less&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;shift&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; (blessed &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;gt;new( &lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;        value =&amp;gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;Float&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    ) &lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;

&lt;span class=&quot;Keyword&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;multiply_by&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$other&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;) = &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; (blessed &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;gt;new( &lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;        value =&amp;gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$other&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    ) &lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;is_zero&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; { shift-&amp;gt;value == 0 }&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;

&lt;span class=&quot;Keyword&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; { say &lt;/span&gt;&lt;span class=&quot;Variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;[0]&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;gt;value; &lt;/span&gt;&lt;span class=&quot;Variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;[0] }&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Here we have a basic Integer class.  You can do things like:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$two&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = Integer-&amp;gt;new(value =&amp;gt; &lt;/span&gt;&lt;span class=&quot;Float&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;gt;say;  &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# 2&lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$four&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$two&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;multiply_by&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$two&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;gt;say;  &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# 4&lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$zero&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$two&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;one_less&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;one_less&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# 0&lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;say &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;is zero&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$zero&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;is_zero&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;          &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# is zero&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Straightforward.  Now let's say we want to add a &lt;code&gt;factorial&lt;/code&gt; method.
We again begin by creating a Factorial role:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Keyword&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; Factorial;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;Moose::Role&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;

&lt;span class=&quot;Normal&quot;&gt;requires &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;is_zero&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;requires &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;multiply_by&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;requires &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;one_less&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;

&lt;span class=&quot;Keyword&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;factorial&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;shift&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; Integer-&amp;gt;new( value =&amp;gt; &lt;/span&gt;&lt;span class=&quot;Float&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; ) &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;is_zero&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;multiply_by&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$number&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;one_less&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;factorial&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Notice that this time we make sure we have all the methods that
&lt;code&gt;factorial&lt;/code&gt; requires by using the &lt;code&gt;requires&lt;/code&gt; keyword.  This is
checked when we apply the role.&lt;/p&gt;
&lt;p&gt;Let's do that:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$ten&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = Integer-&amp;gt;new(value =&amp;gt; &lt;/span&gt;&lt;span class=&quot;Float&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;eval&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; { say &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$ten&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;factorial&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;or&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; say &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;dies&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# dies&lt;/span&gt;

&lt;span class=&quot;Normal&quot;&gt;Factorial-&amp;gt;meta-&amp;gt;apply(&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$ten&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$ten&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;does&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Factorial&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$ten&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;factorial&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# 362880&lt;/span&gt;

&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$ten2&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = Integer-&amp;gt;new(value =&amp;gt; &lt;/span&gt;&lt;span class=&quot;Float&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$ten2&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;factorial&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# dies&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;It works just like you'd expect.  However, we are doing something
tricky.  Let's take a look at the &lt;code&gt;one_less&lt;/code&gt; method.  It takes the
current value, subtracts 1, and then wraps up the result in another
&lt;code&gt;Integer&lt;/code&gt; object.&lt;/p&gt;
&lt;p&gt;But, you'll note that instead of &lt;code&gt;Integer-&amp;gt;new&lt;/code&gt;, we say &lt;code&gt;(blessed $self)-&amp;gt;new&lt;/code&gt;.  That's because to calculate the factorial,
the result of &lt;code&gt;one_less&lt;/code&gt; also needs to &lt;code&gt;does('Factorial')&lt;/code&gt;.  But,
role application only affects one instance, so just saying &lt;code&gt;Integer-&amp;gt;new&lt;/code&gt; would fail.&lt;/p&gt;
&lt;p&gt;The tricky bit is in the implementation of runtime role application.
Basically, when you apply a role at runtime, this happens:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Keyword&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;apply_role_to&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;invocant) {&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    { &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;Some::Dynamic&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;Package&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; Moose;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;      extends &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;The::Original::Class&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;      with &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;The::Role::You::Just::Applied&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;    }&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;        &lt;/span&gt;

&lt;span class=&quot;Normal&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$invocant&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;bless&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Some::Dynamic::Package::1&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;That's not valid Perl, but the idea holds.  Whatever you passed to
&lt;code&gt;apply&lt;/code&gt; is reblessed into a dynamically generated package that isa
the original class.  When we say:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Normal&quot;&gt;(blessed &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;gt;new( value =&amp;gt; ... );&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;instead of:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Normal&quot;&gt;Integer-&amp;gt;new( value =&amp;gt; ... );&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;we're making sure that the Integer we return is in that
dynamically-generated class with the role applied to it.  That way if
we call &lt;code&gt;one_less&lt;/code&gt; on a class that does Factorial, the instance we
return can also do Factorial.&lt;/p&gt;
&lt;p&gt;The key thing to take away is that it's possible, easy, and clean to
add methods (via roles) to specific instances of classes.  However,
you do need to make sure your class isn't working against, like our
Integer class would be if we just returned &lt;code&gt;Integer-&amp;gt;new&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;Footnote_1&quot;&gt;Footnote 1&lt;/h4&gt;
&lt;div id=&quot;Footnote_1_CONTENT&quot;&gt;
&lt;p&gt;Incidentally, did you know you can modify a method's invocant?
Try this sometime:&lt;/p&gt;
&lt;pre&gt;&lt;span class=&quot;Keyword&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; Foo;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; { say &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Foo::go&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;Variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;[0] = &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Bar&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; }&lt;/span&gt;

&lt;span class=&quot;Keyword&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; Bar;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Keyword&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;Function&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; { say &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Bar::go&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;Variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;[0] = &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; }&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;   &lt;/span&gt;

&lt;span class=&quot;Keyword&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; &lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;Operator&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# Foo::go&lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# Bar::go&lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;DataType&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;Comment&quot;&gt;# Foo::go&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;This is a great way to ensure that your code is completely
unmaintainable.  But it's also good for implementing runtime role
application.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Mon, 11 Feb 2008 21:42:02 +0000</pubDate>
	<author>jon@jrock.us (Jonathan Rockway)</author>
</item>
<item>
	<title>Perl Foundation: yapc.org Updates</title>
	<guid isPermaLink="false">tag:news.perlfoundation.org,2008://18.1932</guid>
	<link>http://news.perlfoundation.org/2008/02/yapcorg_updates.html</link>
	<description>&lt;p&gt;Thanks to some help from Will Willis and Jeremy Fluhmann, of the Perl Foundation conferences committee, yapc.org has a few new items. Specifically, we've included ads from the &lt;a href=&quot;http://adserver.szabgab.com/&quot;&gt;Perl community ad server&lt;/a&gt; provided by Gabor Szabo and a new Workshops page that describes how to organize a workshop and what &lt;span class=&quot;caps&quot;&gt;TPF &lt;/span&gt;can do to help.&lt;/p&gt;</description>
	<pubDate>Mon, 11 Feb 2008 18:01:16 +0000</pubDate>
</item>
<item>
	<title>Jakob Nielsen: user-skills.html</title>
	<guid isPermaLink="true">http://www.useit.com/alertbox/user-skills.html</guid>
	<link>http://www.useit.com/alertbox/user-skills.html</link>
	<description>User Skills Improving, But Only Slightly</description>
	<pubDate>Sun, 10 Feb 2008 21:56:44 +0000</pubDate>
</item>
<item>
	<title>Yanick Champoux: Git's the nightclub, Perltidy's the bouncer</title>
	<guid isPermaLink="true">http://use.perl.org/~Yanick/journal/35626?from=rss</guid>
	<link>http://use.perl.org/~Yanick/journal/35626?from=rss</link>
	<description>&lt;p&gt;
I finally wrapped my CVS-encrusted mind
around Git's hooks. Huzzah! The biggest hurdle, really, was
realizing that there is no spoon. &lt;/p&gt;

&lt;p&gt;
Anyway, as I'm an unsalvageable slob who always
forget to run perltidy before committing changes, I've
written a &lt;code&gt;pre-commit&lt;/code&gt; hook that makes sure that
all Perl files to be committed are all clean, neat and tidy
(and aborts the commit and chides me if they are not):&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;#!/usr/bin/perl&lt;br /&gt; &lt;br /&gt;use Perl6::Slurp;&lt;br /&gt; &lt;br /&gt;my $status = slurp '-|', 'git-status';&lt;br /&gt; &lt;br /&gt;# only want what is going to be commited&lt;br /&gt;$status =~ s/Changed but not updated.*$//s;&lt;br /&gt; &lt;br /&gt;my @dirty =&lt;br /&gt;  grep { !file_is_tidy($_) }                   # not tidy&lt;br /&gt;  grep { /\.(pl|pod|pm|t)$/ }                  # perl file&lt;br /&gt;  map  { /(?:modified|new file):\s+(\S+)/ }    # to be commited&lt;br /&gt;  split &quot;\n&quot;, $status;&lt;br /&gt; &lt;br /&gt;exit 0 unless @dirty;                          # Alles gut&lt;br /&gt; &lt;br /&gt;warn &quot;following files are not tidy, aborting commit\n&quot;,&lt;br /&gt;     map &quot;\t$_\n&quot; =&amp;gt; @dirty;&lt;br /&gt; &lt;br /&gt;exit 1;&lt;br /&gt; &lt;br /&gt;### utility functions ###############################################&lt;br /&gt; &lt;br /&gt;sub file_is_tidy {&lt;br /&gt;    my $file = shift;&lt;br /&gt; &lt;br /&gt;    my $original = slurp $file;&lt;br /&gt;    my $tidied = slurp '-|', 'perltidy', $file, '-st';&lt;br /&gt; &lt;br /&gt;    return $original eq $tidied;&lt;br /&gt;}&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;</description>
	<pubDate>Sun, 10 Feb 2008 21:55:14 +0000</pubDate>
</item>
<item>
	<title>Michael Schwern: Critical and Significant Dates</title>
	<guid isPermaLink="true">http://use.perl.org/~schwern/journal/35620?from=rss</guid>
	<link>http://use.perl.org/~schwern/journal/35620?from=rss</link>
	<description>Speaking of 2038, J R Stockton wrote up an enormous and comprehensive list of &lt;a href=&quot;http://web.archive.org/web/20070619063840/http://www.merlyn.demon.co.uk/critdate.htm#FM&quot;&gt;Critical and Significant Dates&lt;/a&gt;.  The original site has, alas, been knocked out but the &lt;a href=&quot;http://web.archive.org/&quot;&gt;Wayback Machine&lt;/a&gt; remembers all.&lt;br /&gt;&lt;br /&gt;It's a fascinating look back at historical date and time related crises as well as possible future ones.  2038 is, of course, on there but there are hundreds more between now and then.  Not just computing problems, but multiple ends of the world ranging from Mayan predictions to near-misses by asteroids.  The last crisis point to pass was 2008-01-19 when 30 year look aheads fail.  Next up is an unusually early Easter, 2008-03-23.&lt;br /&gt;&lt;br /&gt;Not so exciting but what about 2010 when a lot of not particularly robust Y2K fixes will fail and 2019 when yet more will fail?  Various dates used as magic marker values happen.  2009-09-09 (09/09/09) and 2011-11-11 (11/11/11).  2008-12-31 is coming up, the 366th day of the year which has caused &lt;a href=&quot;http://www.cs.dartmouth.edu/Y2K/manufacturing-BGV/index.html#t53&quot;&gt;major failures in the past&lt;/a&gt;.  2015-09-05 is when Apollo/HP 32 bit machines run out of time.&lt;br /&gt;&lt;br /&gt;After 2025 the pace of systems failing accelerates.  Quickbooks starts to die in 2025.  2028 overflows systems that store the year as 1900 + signed byte.  More Y2K fixes break in 2028 and 2029.  MSDOS file dates start to fail in 2030.  Palm Pilots die in 2031.  Microsoft's Y2K compliance ends at 2035...&lt;br /&gt;&lt;br /&gt;Looking far, far into the future, around the year 300 billion 64 bit time_t runs out.  Finally, in the year 2^1E80, it becomes impossible to express the date as the size of the year in binary is larger than the number of particles in the universe.&lt;br /&gt;&lt;br /&gt;But by then I think we can safely assume we'll all have migrated to a 1e160 particle universe.&lt;br /&gt;</description>
	<pubDate>Sat, 09 Feb 2008 21:57:46 +0000</pubDate>
</item>
<item>
	<title>Surfin Safari: querySelector and querySelectorAll</title>
	<guid isPermaLink="true">http://webkit.org/blog/156/queryselector-and-queryselectorall/</guid>
	<link>http://webkit.org/blog/156/queryselector-and-queryselectorall/</link>
	<description>&lt;p&gt;A familiar and unpleasant sight in web applications is fragile code traversing the DOM to get to certain elements or collections of elements. Chains of &lt;code&gt;getElementById(&quot;something&quot;).parent.parent&lt;/code&gt; are all too common, hurting both readability and flexibility. As a result, &lt;a href=&quot;http://prototypejs.org&quot;&gt;many&lt;/a&gt; &lt;a href=&quot;http://jquery.com&quot;&gt;javascript&lt;/a&gt; &lt;a href=&quot;http://extjs.com&quot;&gt;libraries&lt;/a&gt; have implemented functions to use the powerful CSS selector system to look up DOM nodes.&lt;/p&gt;
&lt;p&gt;
Continuing &lt;a href=&quot;http://webkit.org/blog/153/webkit-gets-native-getelementsbyclassname/&quot;&gt;the trend&lt;/a&gt; of standardizing and speeding up commonly used functionality from these libraries, WebKit now has support for the new &lt;a href=&quot;http://www.w3.org/TR/selectors-api/&quot;&gt;W3C Selectors API&lt;/a&gt;, which consists of the &lt;code&gt;querySelector&lt;/code&gt; and &lt;code&gt;querySelectorAll&lt;/code&gt; methods. Hopefully libraries will begin to adopt this new functionality to provide performance improvements while remaining compatible with older browsers.&lt;/p&gt;
&lt;p&gt;Some examples of how it could be used:&lt;/p&gt;
&lt;pre&gt;  /*
   * Get all the elements with class &quot;hot&quot; (duplicating getElementsByClassName)
   * A common use for this is as a toggle;
   * for example, a search feature might tag results with a class
   */
  document.querySelectorAll(&quot;.hot&quot;);

  /*
   * Get the currently hovered element
   */
  document.querySelector(&quot;:hover&quot;);

  /*
   * Get every other element in the &amp;lt;li&amp;gt; with id &quot;large&quot;
   * This is mostly useful for doing &quot;zebra stripe&quot; alternating rows.
   * Once CSS3 becomes more widespread, doing this directly via CSS will be more practical
   */
  document.querySelectorAll(&quot;#large:nth-child(even)&quot;);
&lt;/pre&gt;
&lt;p&gt;
What would a new API like this be without benchmarks? The &lt;a href=&quot;http://mootools.net/&quot;&gt;mootools project&lt;/a&gt; has conveniently created a wonderful &lt;a href=&quot;http://mootools.net/slickspeed/&quot;&gt;test and benchmark suite&lt;/a&gt; for just this sort of functionality. A version of it that has been modified to test querySelectorAll as well as three common javascript libraries is available at &lt;a href=&quot;http://webkit.org/perf/slickspeed&quot;&gt;http://webkit.org/perf/slickspeed/&lt;/a&gt;. Please note that many of the tests will only work in a build of WebKit from February 7th or later.&lt;/p&gt;</description>
	<pubDate>Fri, 08 Feb 2008 06:51:43 +0000</pubDate>
</item>
<item>
	<title>Michael Schwern: Perl is now Y2038 safe</title>
	<guid isPermaLink="true">http://use.perl.org/~schwern/journal/35604?from=rss</guid>
	<link>http://use.perl.org/~schwern/journal/35604?from=rss</link>
	<description>They said it couldn't be done.  They said it SHOULDN'T be done!  But I have here a working 64 bit localtime_r() on a machine with just 32 bits of time_t.  Time zones, daylight savings time... it all works.&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;$ ./miniperl -wle 'print scalar localtime(2**35)'&lt;br /&gt;Mon Oct 25 20:46:08 3058&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt; Perl will be Y2038 safe.  And yes, I'm going to get it backported to 5.10.&lt;br /&gt;&lt;br /&gt;The underlying C functions are solid, but I just sort of rammed them down perl's throat because it's 5am.  Here's &lt;a href=&quot;http://www.pobox.com/~schwern/src/perl_Y2038.patch&quot;&gt;the patch&lt;/a&gt; for the intrepid.&lt;br /&gt;&lt;br /&gt;The underlying &lt;a href=&quot;http://svn.schwern.org/svn/y2038&quot;&gt;C implementation&lt;/a&gt; is a heavily modified version of the code from &lt;a href=&quot;http://www.2038bug.com/&quot;&gt;2038bug.com&lt;/a&gt; written by Paul Sheer.  He came up with the same basic algorithm I did:&lt;br /&gt;&lt;br /&gt;1)  Write a 64 bit clean gmtime(), that's a SMOP and Paul did that.&lt;br /&gt;2)  Run your time through this new gmtime_64().&lt;br /&gt;3)  Change the year to a year between 2012 and 2037.&lt;br /&gt;4)  Run it through the 32 bit system localtime() to get time zone stuff.&lt;br /&gt;5)  Move the year back to the original.&lt;br /&gt;&lt;br /&gt;The trick is using a 32 bit safe year that has the same properties as the real year.  This means same leap year status and same calendar layout.  Had to do some tricky Gregorian calendar math aided by Graham, Nick and Abigail who realized there's a 28 year cycle within the larger 400 year Gregorian cycle and Mark Mielke who provided a big table of 64 bit localtime() results to test against.  There's also some edge cases around New Year's, but they're all taken care of.&lt;br /&gt;&lt;br /&gt;This approach will break when daylight savings time changes, but I'd rather be off by an hour than 137 years.  The full Perl patch will always prefer the system's 64 bit localtime() if one is available.  As more machines upgrade time_t this hack will be used less.&lt;br /&gt;&lt;br /&gt;The nice part is this code isn't specific to Perl and can be used to fix up any other C-based Unix program.</description>
	<pubDate>Thu, 07 Feb 2008 21:57:20 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Winter Creek</title>
	<guid isPermaLink="false">http://use.perl.org/~Matts/journal/35573?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/228935381/35573</link>
	<description>&lt;a href=&quot;http://home.sergeant.org/D70/2008/02_Feb/03_Feb/DSC_8639_bw.jpg?format=raw;size=1024&quot;&gt;Image&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
        A small creek frozen over that I found on the drive home yesterday. The&lt;br /&gt;
        utter silence while taking this photograph was perfect, broken by the&lt;br /&gt;
        distant screech of an owl.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://blog.sergeant.org/view/2008-2-4_Winter_Creek&quot;&gt;Original here&lt;/a&gt;&lt;br /&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/228935381&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 04 Feb 2008 21:42:45 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Need Suggestions for IMAP Solution and Migration</title>
	<guid isPermaLink="false">http://www.justatheory.com/computers/internet/mail/need_imap_solution.html</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/228583076/need_imap_solution.html</link>
	<description>&lt;p&gt;For the last several years, I’ve run
a &lt;a href=&quot;http://www.courier-mta.org/imap/&quot; title=&quot;Courier-IMAP Home&quot;&gt;Courier-IMAP&lt;/a&gt; mail server for all of the mail for &lt;a href=&quot;http://www.justatheory.com/&quot; title=&quot;Just a Theory&quot;&gt;this site&lt;/a&gt;, &lt;a href=&quot;http://www.kineticode.com/&quot; title=&quot;Kineticode Home&quot;&gt;Kineticode&lt;/a&gt;, &lt;a href=&quot;http://www.strongrrl.com/&quot; title=&quot;Strongrrl Home&quot;&gt;Strongrrl&lt;/a&gt; and other domains. We mainly used
Mail.app on Mac OS X to communicate with the server, and it worked really
well. Today,
&lt;a href=&quot;http://www.strongrrl.com/&quot; title=&quot;Julie Wheeler is principal at Strongrrl&quot;&gt;Julie&lt;/a&gt; has over 3 GB of mail data, and I have around 1.5 GB, all
managed via IMAP.&lt;/p&gt;

&lt;p&gt;Recently, I decided it was time to move the mail elsewhere. I’ve been
meaning to do it for a while, primarily because the server I was using is now
used for the &lt;a href=&quot;http://bricolage.cc&quot; title=&quot;Bricolage CMS Home&quot;&gt;Bricolage&lt;/a&gt; project, and because I never set up any spam filtering.
Julie was suddenly getting 100s of spam messages in her inbox. (It really
didn’t help that she was still using Panther.) So on the advice of a good
friend who had been evaluating various mail services—and who for now
shall go nameless and therefor blameless—I moved all of our mail to
&lt;a href=&quot;http://www.fusemail.com/&quot; title=&quot;FuseMail Home&quot;&gt;FuseMail&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;At first this seamed like a pretty good solution. Our spam rates went way
down, I could set up unlimited mail lists, aliases, and forwards, and
there was a migration tool that automated moving all of our existing
mail from the old IMAP server to the new one. There were some glitches with
the migration tool, but in the end all of our mail was moved and in tact.&lt;/p&gt;

&lt;p&gt;But that’s when I started to notice the issues. To summarize:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Mail put into the &lt;q&gt;Sent Items&lt;/q&gt; folder by Mail.app was marked as
  unread. This didn’t happen on the old server, and apparently has something
  to so with how FuseMail names the sent folder: &lt;q&gt;Sent Items&lt;/q&gt; rather
  than &lt;q&gt;Sent Messages.&lt;/q&gt;&lt;/li&gt;
  &lt;li&gt;Mail.app is syncing &lt;em&gt;constantly&lt;/em&gt;. Even once it had successfully
  synced the all of our email in all of our IMAP folders (which took
  &lt;em&gt;days&lt;/em&gt;, it is syncing all the time, to the extent that I am sometimes
  waiting for up to a minute to read a mail when I double-click it, because
  there are all these other threads doing stuff and taking up all the
  resources. It can take several minutes for mail I’m sending to
  be &lt;em&gt;sent&lt;/em&gt; (though that might be a delay in Mail.app copying the
  message to the Sent Items folder rather than the actual sending).&lt;/li&gt;
  &lt;li&gt;Deleting mail takes for&lt;em&gt;ever!&lt;/em&gt; This is probably the same issue as
  the syncing problem, but when I delete 1000s of messages from my Junk mail
  folder, it runs forever, and all other activities are delayed eve further.
  It turns out to be much more efficient to empty the Junk and Deleted Items
  folders using the webmail interface. And even then, Mail.app can take a
  while to delete locally-cached items from the folder when it syncs.&lt;/li&gt;
  &lt;li&gt;Suddenly, Julie is getting a lot less spam. She went from several
  hundred messages showing up in her Junk mailbox a few days ago to just five
  on Friday and two yesterday—one of which was a false positive). As she had
  been expecting a message from someone that she never got, this naturally
  made her very suspicious. Where is all the spam? Is she getting all of her
  mail?&lt;/li&gt;
  &lt;li&gt;Since FuseMail uses a mailbox named &lt;q&gt;Sent Items&lt;/q&gt; instead of the
  traditional &lt;q&gt;Sent Messages&lt;/q&gt; for all sent mail, I asked if they could
  move the 1.8 GB of messages from Julie’s Sent Messages to their Sent Items,
  since Mail.app would just choke on such a task. Though my request was
  escalated to the FuseMail developers, the answer came back &lt;q&gt;no.&lt;/q&gt; Which
  I guess means that they’re not
  using &lt;a href=&quot;http://en.wikipedia.org/wiki/Maildir&quot; title=&quot;Maildir as   described by Wikipedia&quot;&gt;Maildir&lt;/a&gt;, because in that case it would be a
  cinch, n’est pas?&lt;/li&gt;
  &lt;li&gt;Backups are not really feasible. Of course FuseMail has its own
  backup regimen, but if I ever want to move elsewhere or deal with some
  sort of catastrophic failure, I want my own backups. There is no
  rsync service available for this (remember: no maildir), so I have to
  use the IMAP interface. I’ve been trying for the past two weeks to get
  &lt;a href=&quot;http://software.complete.org/offlineimap&quot; title=&quot;OfflineIMAP   Home&quot;&gt;Offline IMAP&lt;/a&gt; to back up all of Julie’s and my mail, but it keeps
  choking. It gets a little further every time I run it; eventually it will
  get it all. But this only allows me to backup those accounts for which I
  happen to have a password. I have accounts set up for a few other users, but
  don’t have access to their passwords, so I can’t back them up. This does not
  make for very good support for corporate backup and retention
  policies.&lt;/li&gt;
  &lt;li&gt;Mail forwarded by FuseMail has its &lt;code&gt;Return-Path&lt;/code&gt; header
  modified. This made &lt;a href=&quot;http://www.bestpractical.com/rt/&quot; title=&quot;Request Tracker Home&quot;&gt;RT&lt;/a&gt; break until I hacked it to ignore that
  header (which is its by-default preferred header for identifying
  senders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I’m pretty fed up. It took me a week to get all of our mail on FuseMail,
and now I’m looking at moving it off again (once OfflineIMAP finishes a full
sync). Grr. I’m considering finding a virtual host somewhere and setting up my
own IMAP server again, but then I have the spam problem again. So then I could
use a forwarding service like &lt;a href=&quot;http://www.pobox.com/&quot; title=&quot;Pobox Home&quot;&gt;Pobox&lt;/a&gt;, or I can set up my own spam filtering (something I had hoped
never to get into managing myself). My old IMAP server required very little
maintenance, which was nice, but then the span filtering stuff always seemed
daunting. Don’t you have to update things all the time?a&lt;/p&gt;

&lt;p&gt;But before I go off and do something else, and unlike before I moved to
FuseMail, I wanted to get an idea what other folks are doing? Do you use IMAP?
Do you use it to manage a shitload (read: Gigabytes) of mail? Do you get very
little spam and still get all of your valid mail? Are IMAP folder maintenance
actions fast for you (in Mail.app in particular)? Are you paying a
not-unreasonable amount of money for your setup? If you answered yes to all of
these questions, please, for the love of all that is good in this world, tell
me how you do it. I’m looking for something that I don’t have to work very
hard to maintain (hence my original attempt to have some company that
specializes in this stuff do it), but I’ll do what I have to to make this
thing right. So how do you make it right? And if I have to run my own server,
where should I host it that won’t cost me an arm and a leg?&lt;/p&gt;

&lt;p&gt;Thanks for your help!&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/228583076&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 04 Feb 2008 21:42:45 +0000</pubDate>
	<author>david@justatheory.com (David Wheeler)</author>
</item>
<item>
	<title>Joshua Wehner: Configuring a Windows server</title>
	<guid isPermaLink="true">http://blogs.thewehners.net/josh/posts/view/352-configuring-a-windows-server</guid>
	<link>http://blogs.thewehners.net/josh/posts/view/352-configuring-a-windows-server</link>
	<description>&lt;p&gt;I quite enjoyed reading Brent Ashley’s &lt;a href=&quot;http://www.ashleyit.com/blogs/brentashley/2008/02/01/not-nearly-enough-rope-but-im-almost-ready-to-hang-myself/&quot;&gt;description&lt;/a&gt; of his travails when trying to set up a Windows server&lt;/p&gt;


&lt;blockquote&gt;When I finally get through a marathon session of setting up a Windows server “just so” to make my application work, it’s like I have created a finely balanced stack of Jenga blocks from which I back away slowly on tiptoe, praying it doesn’t tumble. I’ve get very little confidence that fixing anything will be an excercise in logic and deduction more than having to know some obscure incantation or uninstalling components wholesale and reinstalling and reconfiguring them.&lt;/blockquote&gt;

	&lt;p&gt;&lt;a href=&quot;http://www.ashleyit.com/blogs/brentashley/2008/02/01/not-nearly-enough-rope-but-im-almost-ready-to-hang-myself/&quot;&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p style=&quot;display: none;&quot;&gt;&lt;strong&gt;Tagged: &lt;/strong&gt;&lt;a href=&quot;http://blogs.thewehners.net/josh/posts/tagged/links&quot; rel=&quot;tag&quot;&gt;links&lt;/a&gt;, &lt;a href=&quot;http://blogs.thewehners.net/josh/posts/tagged/tech+stuff&quot; rel=&quot;tag&quot;&gt;tech stuff&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 03 Feb 2008 18:44:52 +0000</pubDate>
	<author>blog_spam_joshua@thewehners.net (Joshua Wehner)</author>
</item>
<item>
	<title>Planet Perl: OSCON talk</title>
	<guid isPermaLink="false">http://use.perl.org/~miyagawa/journal/35556?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/227522929/35556</link>
	<description>Wondering what talk I should submit to OSCON (and other YAPCs this year too!).&lt;br /&gt;&lt;br /&gt;The obvious choice is Web::Scraper since I haven't done this talk other than Europe and Japan, and I can make lots of updates till summer when I give an actual talk (We call it CDD -- Conference Driven Development)&lt;br /&gt;&lt;br /&gt;Any suggestions?&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/227522929&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 02 Feb 2008 21:41:52 +0000</pubDate>
</item>
<item>
	<title>Chris Dolan: [Idea Bin] Port bash to Parrot</title>
	<guid isPermaLink="true">http://use.perl.org/~ChrisDolan/journal/35518?from=rss</guid>
	<link>http://use.perl.org/~ChrisDolan/journal/35518?from=rss</link>
	<description>&lt;em&gt;I'm going to use the &quot;[Idea Bin]&quot; flag to indicate ideas or projects that I would love to develop if I had more time, but realistically admit that I'll never finish.  If you choose to use one of these ideas, you have my permission and best wishes.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;An implementation of &lt;a href=&quot;http://www.gnu.org/software/bash/&quot;&gt;bash&lt;/a&gt; on Parrot would be a great test of Parrot's I/O capabilities.  The &lt;a href=&quot;http://www.google.com/codesearch?q=show:P6s4ZVbjcws:DBoyWDFSyh4&amp;amp;cs_p=http://ftp.gnu.org/gnu/bash/bash-3.0.tar.gz&amp;amp;cs_f=bash-3.0&quot;&gt;source code&lt;/a&gt; for bash is fairly readable considering how arcane are some of its supported operations.  Bash has a rather healthy &lt;a href=&quot;http://www.google.com/codesearch?q=show:aQiA-P6qM4M:Vsw8jKvLGPw&amp;amp;cs_p=http://ftp.gnu.org/gnu/bash/bash-3.0.tar.gz&amp;amp;cs_f=bash-3.0/tests&quot;&gt;test suite&lt;/a&gt; that could be reused during development.&lt;br /&gt;&lt;br /&gt;I spent many commutes pondering possible names for such a port, but never came up with a great one.  I wanted &quot;posh&quot; to work, but never came up with the right words for the acronym.  &quot;bashup&quot; = bash-under-parrot felt too forced.&lt;br /&gt;&lt;br /&gt;If such a parrot implementation would enable you to call out to other languages via namespace prefixes on functions, this could let shell be a better glue language than ever.  You could incrementally port hairy shell scripts to more expressive programming languages.&lt;br /&gt;&lt;br /&gt;Then you could switch all of your /etc/rc scripts to run under parrot by just changing the sharp-bang.&lt;br /&gt;&lt;br /&gt;Furthermore, I've been a csh/tcsh user for 15 years and have always envied the power of bash, but never bothered learning more than the rudiments.  This would be an excuse to learn it deeply.</description>
	<pubDate>Wed, 30 Jan 2008 21:56:53 +0000</pubDate>
</item>
<item>
	<title>Yanick Champoux: Greasemonkeying dependencies</title>
	<guid isPermaLink="true">http://use.perl.org/~Yanick/journal/35507?from=rss</guid>
	<link>http://use.perl.org/~Yanick/journal/35507?from=rss</link>
	<description>&lt;p&gt;Escalation wars... you just have to love'em.&lt;/p&gt;

&lt;p&gt;First, David
came up with the über-cool &lt;a href=&quot;http://cpandeps.cantrell.org.uk/&quot;&gt;
CPAN deps&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;Then &lt;a href=&quot;http://use.perl.org/~AndyArmstrong/journal/&quot;&gt;Andy&lt;/a&gt;
comes up with a &lt;a href=&quot;http://use.perl.org/article.pl?sid=07/12/15/1931244&quot;&gt;nifty Greasemonkey script &lt;/a&gt;
to add it to the CPAN distributions main pages. &lt;/p&gt;

&lt;p&gt;Then I add a small patch to the script to retrieve
some information from the Deps page.&lt;/p&gt;

&lt;p&gt;Then David creates an xml interface to CPAN deps, opening the
door wide open for Web 2.0 goodiness.&lt;/p&gt;

&lt;p&gt;Then (and this is where we are right now) I hack together a new &lt;a href=&quot;http://userscripts.org/scripts/show/21779&quot;&gt;CPAN_Dependencies&lt;/a&gt; monkeyscript
to take advantage of said xml interface.&lt;/p&gt;

&lt;p&gt;This, of course, is nowhere near the end of the story.
My new script only scratches the surface of what can be done with the
information contained in the xml. As soon as I have some tuits,
I'll probably add a way to toggle between showing only the first-level
dependencies and all dependencies, and have dependencies color-coded
by degree of b0rkage, and whatever bell or whistle I can think of in
the meantime.&lt;/p&gt;</description>
	<pubDate>Tue, 29 Jan 2008 21:55:10 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Tom Limoncelli Interview Transcribed</title>
	<guid isPermaLink="false">http://perlcast.com/2008/01/27/tom-limoncelli-interview-transcribed/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/223733687/</link>
	<description>&lt;p&gt;I’d like to thank Shlomi Fish for taking the time to &lt;a href=&quot;http://perl.net.au/wiki/Perlcast_Transcript_-_Interview_with_Tom_Limoncelli&quot;&gt;transcribe&lt;/a&gt; the &lt;a href=&quot;http://perlcast.com/audio/Perlcast_Interview_021_Limoncelli.mp3&quot;&gt;Perlcast interview&lt;/a&gt; with Tom Limoncelli about “Time Management For System Administrators”
&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/223733687&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 27 Jan 2008 21:42:09 +0000</pubDate>
</item>
<item>
	<title>Steffan Müller: perl 5.12, strict by default</title>
	<guid isPermaLink="false">/~tsee/journal/35213?from=rss</guid>
	<link>http://use.perl.org/~tsee/journal/35213?from=rss</link>
	<description>&lt;p&gt;So I did it. I proposed to the perl5-porters that we should enable &quot;use strict&quot; by default for some future code. This may be a little less preposterous than it sounds at first, so please wait with hitting the &quot;reply&quot; button until you read the whole of this.&lt;/p&gt;

&lt;p&gt;My proposal basically goes as follows:&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Add a feature called &quot;strict&quot; to feature.pm.&lt;/li&gt;
&lt;li&gt;Include that feature into the set of default features which are loaded by &quot;use feature ':5.11'&quot; or even just &quot;use 5.11.0;&quot;.&lt;/li&gt;
&lt;li&gt;Add a special case for the -E switch to perl so strictures aren't enabled by default for one-liners.&lt;/li&gt;
&lt;/ul&gt; 
&lt;p&gt;
I'll include my original rationale here:
&lt;/p&gt;
&lt;p&gt; &lt;cite&gt;
Personally, I've always wanted perl to have strictures on by default for my code. I would think that 95% of all code bases which were written in this century and which are of non-negligible size import &quot;strict&quot;. I don't use strictures for one-liners, of course, but for anything else it's a must. It seems to me like others have similar views on this. Try posting some code without &quot;use strict&quot; to some newsgroup or forum and ask for help. Make sure not to give out your email address, though.
&lt;/cite&gt; &lt;/p&gt; &lt;p&gt; &lt;cite&gt;
&quot;use 5.10.0;&quot; already auto-imports feature.pm and loads the 5.10 specific features.
&lt;/cite&gt; &lt;/p&gt; &lt;p&gt; &lt;cite&gt;
How about having &quot;use 5.11.0;&quot; (or 5.12.0) automatically import strict along with the 5.10+5.11 feature set? Naturally, the -E switch for one-liners should *not* do that.
&lt;/cite&gt; &lt;/p&gt; &lt;p&gt; &lt;cite&gt;
This would *not* break backwards compatibility. This would not affect one-liners. This would optimize for the common case: If you write enough code to make importing optional features worthwhile, odds are very high you'd be importing &quot;strict&quot; anyway. The 5% who need to disable strictures again can still add a &quot;no strict;&quot; statement.
&lt;/cite&gt; &lt;/p&gt; &lt;p&gt; &lt;cite&gt;
strictures-correct code has been best-practice for a long time now. Let's make it the default for *new* code.
&lt;/cite&gt; &lt;/p&gt; &lt;p&gt; &lt;cite&gt;
Just think of strictures as a feature. It just makes sense.
&lt;/cite&gt; &lt;/p&gt;

&lt;p&gt;
To my surprise, the proposal has been received with very positive feedback. So I wrote the patch.
&lt;/p&gt; &lt;p&gt;
With some luck, we'll get strictures by default in 5.12! Flame away!
&lt;/p&gt; &lt;p&gt;
Cheers,&lt;br /&gt;
Steffen&lt;/p&gt;</description>
	<pubDate>Sat, 26 Jan 2008 21:55:24 +0000</pubDate>
</item>
<item>
	<title>Steffan Müller: Evil PAR tricks, issue 0: Binary including a binary</title>
	<guid isPermaLink="false">/~tsee/journal/32140?from=rss</guid>
	<link>http://use.perl.org/~tsee/journal/32140?from=rss</link>
	<description>&lt;p&gt;In my journal entry from December 22, 2006, I said I'd used a few hacks to package &lt;i&gt;parinstallppdgui&lt;/i&gt; into an executable binary using PAR::Packer. I'll explore that further here:&lt;/p&gt;&lt;br /&gt;&lt;p&gt; &lt;i&gt;parinstallppdgui&lt;/i&gt; is mostly a GUI front-end to &lt;i&gt;parinstallppd&lt;/i&gt;. It doesn't use &lt;i&gt;PAR::Dist::InstallPPD&lt;/i&gt; internally, but uses the system to run &lt;i&gt;parinstallppd&lt;/i&gt; so if the child process bombs out, the GUI process can show a friendly warning to the user (comprised of the STDERR and STDOUT of the child process) instead of crashing. That's all very simple if you have perl on your system, of course.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now, if you want to package &lt;i&gt;parinstallppdgui&lt;/i&gt; or any other Perl script that uses another Perl script into an .exe, you'll quickly find out that without a perl on the target system, these two scripts cannot share the same interpreter. The obvious &quot;solution&quot; is to package both of them up into an .exe separately and ship them both. This has several problems. First, you need to ship two executables instead of one. Second, the first executable won't necessarily know where to look for the second if the user doesn't put them in PATH. Adding a couple of FindBin hacks isn't great at solving this, either! Third, these two executables will have a lot in common - starting with all the core Perl modules.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So I took a slightly better, yet more complicated route. The process is as follows:&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Add a &lt;b&gt;special case&lt;/b&gt; to the parent's source code for execution from inside a PAR binary:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if (defined $ENV{PAR_TEMP}) {&lt;br /&gt;
        require Config;&lt;br /&gt;
        require File::Spec;&lt;br /&gt;
        $ENV{PATH} .= (defined $ENV{PATH} ? $Config::Config{path_sep} : '')&lt;br /&gt;
                                        . File::Spec-&amp;gt;catdir($ENV{PAR_TEMP}, 'inc');&lt;br /&gt;
        $ENV{PAR_GLOBAL_TEMP} = $ENV{PAR_TEMP};&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;This forces all PAR'd executables that are started by this process to use the same cache area as this process. This might be a dangerous thing to do if both binaries contain different, incompatible versions of some files. But we control everything here, so it should be okay.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;b&gt;Package&lt;/b&gt; &lt;i&gt;parinstallppdgui&lt;/i&gt;, the parent script:&lt;br /&gt;&lt;code&gt;pp -o parinstallppdgui.exe parinstallppdgui&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;b&gt;Package&lt;/b&gt; &lt;i&gt;parinstallppd&lt;/i&gt;, the child script:&lt;br /&gt;&lt;code&gt;pp -o parinstallppd.exe -l expat parinstallppd&lt;/code&gt;&lt;br /&gt;(We include the expat library.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Remove all files from the child script that are also available from the parent. This makes the child &lt;b&gt;dependent&lt;/b&gt; on the parent. Use the &lt;i&gt;pare&lt;/i&gt; utility from the PAR::Packer distribution's contrib/ directory for this:&lt;br /&gt;&lt;code&gt;pare -u parinstallppdgui.exe parinstallppd.exe&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;b&gt;Package&lt;/b&gt; the parent script again, but this time include the child script as an extra file into the executable:&lt;br /&gt;&lt;code&gt;pp -o parinstallppdgui.exe -a parinstallppd.exe -l expat parinstallppdgui&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;b&gt;Ship&lt;/b&gt; the combined binary only.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Cheers,&lt;br /&gt;&lt;br /&gt;Steffen&lt;/p&gt;&lt;br /&gt;&lt;p&gt;P.S.: A third and even better solution might be to package both of the scripts into the same binary and symlink or copy that binary to &lt;i&gt;parinstallppd.exe&lt;/i&gt; and &lt;i&gt;parinstallppdgui.exe&lt;/i&gt; and let PAR figure out what to run. This is cool if you have symlinks and sucks if you don't.&lt;/p&gt;</description>
	<pubDate>Sat, 26 Jan 2008 21:55:24 +0000</pubDate>
</item>
<item>
	<title>Steffan Müller: CPANTS Distribution Checker (without PAUSE upload)</title>
	<guid isPermaLink="false">/~tsee/journal/32090?from=rss</guid>
	<link>http://use.perl.org/~tsee/journal/32090?from=rss</link>
	<description>&lt;p&gt;So CPANTS was down for a couple of weeks. This morning, I noticed it's back, but so far without the cron job that updated the data nightly.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;For me, CPANTS has been a way to check my eighty or so CPAN distributions for packaging shortcomings. Unfortunately, that check happens only after I made the release. I installed Module::CPANTS::Analyse which comes with &lt;i&gt;cpants_lint.pl&lt;/i&gt;. Given a distribution file name, it runs the CPANTS metrics against it.&lt;/p&gt;&lt;br /&gt;&lt;p&gt; Since Module::CPANTS::Analyse comes with quite a few prerequisites, I set up a simple web service which you can use to check your distributions before uploading. The interface is a little cumbersome, but I think it's worthwhile. Just upload your distribution at &lt;a href=&quot;http://steffen-mueller.net/cgi-bin/cpants-limbo/check.pl&quot;&gt;http://steffen-mueller.net/cgi-bin/cpants-limbo/check.pl&lt;/a&gt; and then visit the result URL given by that script after a few minutes.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The reason for the delay is that I didn't want to install all prerequisites on the hosting account and certainly didn't like running &lt;i&gt;cpants_lint.pl&lt;/i&gt; from a CGI process. Thus, my local server fetches distributions-to-scan from there and uploads a result text every three minutes.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Cheers,&lt;br /&gt;Steffen&lt;/p&gt;</description>
	<pubDate>Sat, 26 Jan 2008 21:55:24 +0000</pubDate>
</item>
<item>
	<title>Joshua Wehner, Comments: Comment on 'Massachussets-style health-care reform: results are in'</title>
	<guid isPermaLink="false">http://blogs.thewehners.net/josh/comments/view/350-massachussets-style-health-care-reform-results-are-in#445</guid>
	<link>http://blogs.thewehners.net/josh/posts/view/350-massachussets-style-health-care-reform-results-are-in#comment_445</link>
	<description>&lt;strong&gt;Parmeter said:&lt;/strong&gt;&lt;p&gt;Mindboggling.&lt;/p&gt;

&lt;p&gt;The answer to your question is simple. It is the way these politics are played. See Medicare and -aide as examples. It doesn't matter if the first incarnation was so screwed up that its taken forty some years to try and right it, it was the first to make it through the legal system largely intact. Because it has already survived legal challenges and came out the other side with legislative and judicial approval. Any other state that wants to do the same doesn't have to work to get it going at home. All they have to do is copy and paste.&lt;/p&gt;

&lt;p&gt;Simply amazing that the effects of the law can be so far away from what was intended (either through accident or design, it matters not which at this juncture) that I am left wondering if anyone, anywhere will pay politically for the screw up.&lt;/p&gt;</description>
	<pubDate>Fri, 25 Jan 2008 23:00:39 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Settling in</title>
	<guid isPermaLink="false">http://infotrope.net/blog/2008/01/25/settling-in/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/222469118/</link>
	<description>&lt;div class=&quot;series_toc&quot;&gt;&lt;/div&gt; &lt;p&gt;Well, I’m here in San Francisco and starting to settle in nicely.  Lots of social stuff going on, fun work that doesn’t feel like work, and I found a place to live really quickly and easily.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/7360611@N06/2216433071&quot; title=&quot;View 'Me at the Rock Band extravaganza' on Flickr.com&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2182/2216433071_62130818e5_m.jpg&quot; align=&quot;left&quot; height=&quot;240&quot; width=&quot;159&quot; alt=&quot;Me at the Rock Band extravaganza&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This photo’s by the lovely &lt;a href=&quot;http://flickr.com/photos/yarnivore&quot;&gt;yarnivore&lt;/a&gt; who took it last weekend at a Rock Band extravaganza where we (I say “we”, though I didn’t do much of it) played right through the full 58-song set list.  It took about eight hours.&lt;/p&gt;

&lt;p&gt;But the real reason I’m posting today is to assist anyone stalking me.  I assume you’re already following &lt;a href=&quot;http://www.flickr.com/photos/kirrilyrobert/&quot;&gt;my photos on Flickr&lt;/a&gt; but you might also like to check out &lt;a href=&quot;http://blog.freebase.com/&quot;&gt;my work blog&lt;/a&gt; where I’m, well, posting about work things: Freebase, open data, mashups, that sort of stuff.  And if you’re going to be around these parts on Feb 6th, be sure to swing by the &lt;a href=&quot;http://upcoming.yahoo.com/event/413252&quot;&gt;Freebase user group meeting&lt;/a&gt; for pizza, beer, and of course lots of technical presentations.&lt;/p&gt;
No Tags &lt;div class=&quot;series_links&quot;&gt; &lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=ps6583D&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=ps6583D&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=4xcs1xD&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=4xcs1xD&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=1t6CNsd&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=1t6CNsd&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=tJ9ufPd&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=tJ9ufPd&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=sYrAVPd&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=sYrAVPd&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/Infotropism/~4/222461376&quot; height=&quot;1&quot; /&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/222469118&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 24 Jan 2008 21:42:28 +0000</pubDate>
</item>
<item>
	<title>sigzero: using POD or something else?</title>
	<guid isPermaLink="true">http://use.perl.org/~sigzero/journal/35453?from=rss</guid>
	<link>http://use.perl.org/~sigzero/journal/35453?from=rss</link>
	<description>I was curious as to what percentage of Perl'ers use POD for documenting their code. I was curious because I looked at the Template-Toolkit source and while there is POD after the __END__ there is also documentation in the code using normal # type comments. That seems redundant to me but is that the norm?&lt;br /&gt;&lt;br /&gt;Also, is there a good &quot;this is how you use POD&quot; with examples (besides perlpod) somewhere?</description>
	<pubDate>Tue, 22 Jan 2008 21:57:02 +0000</pubDate>
</item>
<item>
	<title>David Golden: CPAN::Reporter::Smoker first alpha release</title>
	<guid isPermaLink="true">http://use.perl.org/~dagolden/journal/35442?from=rss</guid>
	<link>http://use.perl.org/~dagolden/journal/35442?from=rss</link>
	<description>&lt;p&gt;For a long time, the only easy way to submit CPAN Testers reports was
CPANPLUS.  The first automated smoke testers for CPAN were built upon it,
like &lt;a href=&quot;http://search.cpan.org/dist/CPAN-YACSmoke/&quot;&gt;CPAN::YACSmoke&lt;/a&gt;
and &lt;a href=&quot;http://search.cpan.org/dist/POE-Component-CPAN-YACSmoke/&quot;&gt;
POE::Component::CPAN::YACSmoke&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;About a year and a half ago, I wrote &lt;a href=&quot;http://search.cpan.org/dist/CPAN-Reporter&quot;&gt;CPAN::Reporter&lt;/a&gt;, to bring
CPAN Testers reporting to good-old CPAN.pm.  Since then, some intrepid
individuals have built automated smoke testers upon CPAN::Reporter, all
writing their own programs to do so.&lt;/p&gt;

&lt;p&gt;CPAN.pm itself added an experimental
&lt;i&gt;smoke&lt;/i&gt; command to test recent uploads, but it requires XML::LibXML and
doesn't test distributions in isolation -- all tested distributions and their
dependencies keep getting added to PERL5LIB until things explode.&lt;/p&gt;

&lt;p&gt;Yesterday, I released the first, alpha version of
&lt;a href=&quot;http://search.cpan.org/dist/CPAN-Reporter-Smoker&quot;&gt;
CPAN::Reporter::Smoker&lt;/a&gt; to provide a better-behaved, more turn-key approach
to smoke testing with CPAN::Reporter.&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;(... configure CPAN and CPAN::Reporter as usual ... )&lt;br /&gt; &lt;br /&gt;$ perl -MCPAN::Reporter::Smoker -e start&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;This initial version still has some limitations (e.g. no developer
versions smoked), but I'm ready for anyone interested to try it out and start
sending feedback -- compliments, suggestions, or complaints all welcome.&lt;/p&gt;

&lt;p&gt;-- dagolden&lt;/p&gt;</description>
	<pubDate>Mon, 21 Jan 2008 21:56:33 +0000</pubDate>
</item>
<item>
	<title>Chris Laco: My Perl 5.12 Wishlist</title>
	<guid isPermaLink="true">http://use.perl.org/~jk2addict/journal/35444?from=rss</guid>
	<link>http://use.perl.org/~jk2addict/journal/35444?from=rss</link>
	<description>It's one thing and one thing only. Unless my memory is wrong, sub attributes can only be on the first line. Please o please, allow them to span multiple lines.

When using Catalyst, you could start with this:&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;sub update : Chained('instance') PathPart Args(0)&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt; The minute you start adding custom attributes, things end up well past 70-80 columns wide:&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;sub update : Chained('instance') PathPart Args(0) Form('someform.yml') Template('this/page') ActionClass('REST')&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;</description>
	<pubDate>Mon, 21 Jan 2008 21:55:55 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: vim and Perl 5.10</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-6096704822492180681.post-2384530112272143770</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/220347228/vim-and-perl-510.html</link>
	<description>If you use vim and want it to highlight correctly the new keywords in Perl 5.10, you can just drop the following syntax plugin script as &lt;tt&gt;~/.vim/syntax/perl.vim&lt;/tt&gt; :&lt;br /&gt;&lt;pre&gt;so $VIMRUNTIME/syntax/perl.vim&lt;br /&gt;syn keyword perlStatementStorage state&lt;br /&gt;syn keyword perlStatementFiledesc say&lt;br /&gt;if exists(&quot;perl_fold&quot;) &amp;amp;&amp;amp; exists(&quot;perl_fold_blocks&quot;)&lt;br /&gt;    syn match perlConditional &quot;\&amp;lt;given\&amp;gt;&quot;&lt;br /&gt;    syn match perlConditional &quot;\&amp;lt;when\&amp;gt;&quot;&lt;br /&gt;    syn match perlConditional &quot;\&amp;lt;default\&amp;gt;&quot;&lt;br /&gt;    syn match perlRepeat &quot;\&amp;lt;break\&amp;gt;&quot;&lt;br /&gt;else&lt;br /&gt;    syn keyword perlConditional given when default&lt;br /&gt;    syn keyword perlRepeat break&lt;br /&gt;endif&lt;br /&gt;if exists(&quot;perl_fold&quot;)&lt;br /&gt;    syn match perlControl &quot;\&amp;lt;BEGIN\|CHECK\|INIT\|END\|UNITCHECK\&amp;gt;&quot; contained&lt;br /&gt;else&lt;br /&gt;    syn keyword perlControl BEGIN END CHECK INIT UNITCHECK&lt;br /&gt;endif&lt;/pre&gt;&lt;br /&gt;An extension, not implemented here, could be to add a new highlight class for the new regexp verbs (MARK, SKIP, COMMIT, etc.)&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/220347228&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 21 Jan 2008 21:42:02 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Logic Programming with Ovid</title>
	<guid isPermaLink="false">http://perlcast.com/2008/01/20/logic-programming-with-ovid/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/219585548/</link>
	<description>&lt;p&gt;Back at the Nordic Perl Workshop 2007, I sat down with Ovid to talk about logic programming.  Here is the audio for that interview.&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.perlcast.com/audio/Perlcast_Interview_046.mp3&quot;&gt;Interview Audio&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/219585548&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 20 Jan 2008 21:43:00 +0000</pubDate>
</item>
<item>
	<title>Lawrence Watt-Evans: A Word to Hugo Voters</title>
	<guid isPermaLink="true">http://www.watt-evans.com/blog/?p=66</guid>
	<link>http://www.watt-evans.com/blog/?p=66</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.helixsf.com&quot;&gt;&lt;strong&gt;Helix&lt;/strong&gt;&lt;/a&gt; is eligible for nomination in the semiprozine category.  A nomination would brighten my summer.&lt;/p&gt;
&lt;p&gt;I wouldn’t mind seeing William Sanders up for editor, short form, either.&lt;/p&gt;</description>
	<pubDate>Sat, 19 Jan 2008 08:01:43 +0000</pubDate>
</item>
<item>
	<title>Lawrence Watt-Evans, Serials: On an unrelated matter…</title>
	<guid isPermaLink="true">http://www.ethshar.com/serials/?p=57</guid>
	<link>http://www.ethshar.com/serials/?p=57</link>
	<description>&lt;p&gt;I would just like to point out to any readers here who happen to be Hugo voters that &lt;a href=&quot;http://www.helixsf.com&quot;&gt;Helix&lt;/a&gt; is eligible for nomination as a semiprozine.  If you happen to have your Hugo nominating ballot lying around, and you were thinking, “Gee, what could I nominate, so as not to waste this fine ballot?” — well, there’s one possibility&lt;br /&gt;
.
&lt;/p&gt;</description>
	<pubDate>Sat, 19 Jan 2008 07:56:57 +0000</pubDate>
</item>
<item>
	<title>Lawrence Watt-Evans, Serials: Done!</title>
	<guid isPermaLink="true">http://www.ethshar.com/serials/?p=56</guid>
	<link>http://www.ethshar.com/serials/?p=56</link>
	<description>&lt;p&gt;At last!&lt;/p&gt;
&lt;p&gt;I believe that every book I owed any donor is now on its way, though how I’m defining that gets a bit tricky.&lt;/p&gt;
&lt;p&gt;There are seven sitting in a box in the dining room waiting to be taken to the post office.  There’s one on my desk waiting for an e-mail confirming how the donor wanted it personalized.&lt;/p&gt;
&lt;p&gt;All the others have been mailed.&lt;/p&gt;
&lt;p&gt;Most packages included &lt;em&gt;The Vondish Ambassador&lt;/em&gt;, a chapbook of “The God in Red,” and an insert map of the Empire of Vond.  I signed or personalized &lt;em&gt;The Vondish Ambassador&lt;/em&gt; as requested.&lt;/p&gt;
&lt;p&gt;However, I know that in at least one case I sent a signed book to someone who hadn’t wanted it signed, and sent an unsigned copy to someone who had requested a signature.  I’m fairly sure that I forgot at least one map.  It’s possible I also messed up in other ways.  My apologies, but packing and mailing hundreds of books is one heck of a job.  I got &lt;em&gt;most&lt;/em&gt; of them right.&lt;/p&gt;
&lt;p&gt;There were also a few people who I could never get a response from, so those books may have gone to incorrect addresses.  I tried, honest.&lt;/p&gt;
&lt;p&gt;If you did not receive the map (it should be just inside the front cover), let me know, and we’ll see what we can do about it.&lt;/p&gt;
&lt;p&gt;Two people who are entitled to a copy of the book declined — one prefers an e-book and the other is waiting for a mass-market edition.&lt;/p&gt;
&lt;p&gt;If your copy of the book hasn’t arrived yet at all — especially if you’re outside the U.S. — give it a few days, but if it hasn’t shown up by Candlemas, drop me a line.&lt;/p&gt;
&lt;p&gt;As of right now, there’s still nothing definite about a mass-market edition.&lt;/p&gt;
&lt;p&gt;Several people have asked me when I’ll be starting the next serial, and what it’s going to be, so let me once again say, “I don’t know.”  It depends on when I get other projects done, what sort of offer Tor makes (if any) for the Fall of the Sorcerers, and various other factors, some of them beyond my control.&lt;/p&gt;
&lt;p&gt;My best guess is that I’ll start a third serial late this year — maybe as a Christmas present for my readers.  Whether it’s Ethshar or science fiction — well, we’ll see.&lt;/p&gt;
&lt;p&gt;Thanks to everyone for your continued support!
&lt;/p&gt;</description>
	<pubDate>Sat, 19 Jan 2008 07:56:57 +0000</pubDate>
</item>
<item>
	<title>Perl.com: How to Tell Your Perl Story (at OSCON)</title>
	<guid isPermaLink="true">http://www.perl.com/pub/a/2008/01/18/how-to-tell-your-perl-story.html?CMP=OTC-BD0016219291&amp;ATT=How+to+Tell+Your+Perl+Story+at+OSCON</guid>
	<link>http://www.perl.com/pub/a/2008/01/18/how-to-tell-your-perl-story.html?CMP=OTC-BD0016219291&amp;ATT=How+to+Tell+Your+Perl+Story+at+OSCON</link>
	<description>Have you done something stunningly cool or staggeringly useful with Perl in the past year? Conference season will be here soon; it's time to consider giving a talk to your local monger group, a regional conference, or even OSCON. Perl track committee member brian d foy gives several guidelines to help you decide what to talk about and how to present it.</description>
	<pubDate>Fri, 18 Jan 2008 21:57:30 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Teach-In in Birmingham</title>
	<guid isPermaLink="false">http://use.perl.org/~davorg/journal/35419?from=rss</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/218868357/35419</link>
	<description>&lt;p&gt;I'm going to be presenting the Perl Teach-In in Birmingham on Monday 31st March as part of &lt;a href=&quot;http://spring2008.ukuug.org/&quot;&gt;UKUUG's Spring 2008 Conference&lt;/a&gt;. The talk will be (lightly) updated from the one I gave at the BBC last summer.&lt;/p&gt;

&lt;p&gt;This tutorial won't be free. As I understand it, the class will only be open to people who are registered at the conference, but I don't currently know how much that will cost or whether you'll be able to buy a ticket for just the tutorial day. I'm sure more information will appear on their &lt;a href=&quot;http://spring2008.ukuug.org/talks.html&quot;&gt;web site&lt;/a&gt; soon.&lt;/p&gt;

&lt;p&gt;I should start looking in to running the Teach-In in London again.&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/218868357&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 18 Jan 2008 21:22:01 +0000</pubDate>
</item>
<item>
	<title>Penny Arcade Art</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-35190014.post-1767826327714116216</guid>
	<link>http://pennyarcadeart.blogspot.com/2008/01/my-druid.html</link>
	<description>&lt;a href=&quot;http://bp2.blogger.com/_aOJNqzM3f0w/R5DoKgXGs4I/AAAAAAAAAD4/dimWjXluyuE/s1600-h/fedaus.jpg&quot;&gt;&lt;img src=&quot;http://bp2.blogger.com/_aOJNqzM3f0w/R5DoKgXGs4I/AAAAAAAAAD4/dimWjXluyuE/s320/fedaus.jpg&quot; alt=&quot;&quot; style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5156876840522396546&quot; /&gt;&lt;/a&gt;&lt;br /&gt;My Druid.</description>
	<pubDate>Fri, 18 Jan 2008 19:03:47 +0000</pubDate>
</item>
<item>
	<title>Chris Laco: Catalyst + REST</title>
	<guid isPermaLink="true">http://use.perl.org/~jk2addict/journal/35411?from=rss</guid>
	<link>http://use.perl.org/~jk2addict/journal/35411?from=rss</link>
	<description>Since we're &lt;a href=&quot;http://use.perl.org/~hanekomu/journal/35409&quot;&gt;on the topic&lt;/a&gt; of Catalyst and REST, I hereby declare Firefox 2.x broken.&lt;br /&gt;&lt;br /&gt;There's this great set of modules under the moniker &lt;a href=&quot;http://search.cpan.org/dist/Catalyst-Action-REST-0.60/&quot;&gt;Catalyst::Action::REST&lt;/a&gt; that easily adds REST support to Catalyst. While I have no REST API in Mango (yet), I also use this package to do Content-Type -&amp;gt; View negotiations (text/html-&amp;gt; View::HTML, application/xhtml+xml-&amp;gt;View::XHTML, application/atom+xml-&amp;gt;View::Atom, etc), and it does it quite well.&lt;br /&gt;&lt;br /&gt;Unfortunately, Firefox 2.x throws a kink in the works. The REST controller looks at the Content-Type header, then falls back to the content-type query param, then falls back to the Accept header. It's that last thing that kills. You see, firefox sends this accept header:&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,  image/png,*/*;q=0.5&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt; So, when I request a regular old web page, really wanting HTML, the REST controller negotiation falls back to text/xml, even though my default type in config is text/html. Grrr.&lt;br /&gt;&lt;br /&gt;There are at least two solutions to this [for me in my base class]:&lt;br /&gt;&lt;br /&gt;1. Cleanse the Accept header of this madness before calling the REST package into action&lt;br /&gt;&lt;br /&gt;2. Map text/xml to my HTML View&lt;br /&gt;&lt;br /&gt;Both are evil in their own ways. I started with #2, since people should really be sending application/xml anyhow and as of now, my app doesn't support xml via REST/content negotiation anyways.&lt;br /&gt;&lt;br /&gt;#1 is really the better answer since we can't fix Firefox 2.x. For REST clients, they must send a Content-Type header, so those aren't a problem. And you can always override using the content-type param.&lt;br /&gt;&lt;br /&gt;Just for giggles, Firefox 3.x beta Accept header is:&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;</description>
	<pubDate>Thu, 17 Jan 2008 21:55:53 +0000</pubDate>
</item>
<item>
	<title>Penny Arcade Art</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-35190014.post-6834706100433489842</guid>
	<link>http://pennyarcadeart.blogspot.com/2008/01/im-going-to-try-and-draw-all-our-new.html</link>
	<description>&lt;a href=&quot;http://bp1.blogger.com/_aOJNqzM3f0w/R4-d1gXGs3I/AAAAAAAAADw/YDqDnNQpfzY/s1600-h/narrisa.jpg&quot;&gt;&lt;img src=&quot;http://bp1.blogger.com/_aOJNqzM3f0w/R4-d1gXGs3I/AAAAAAAAADw/YDqDnNQpfzY/s320/narrisa.jpg&quot; alt=&quot;&quot; style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5156513640907977586&quot; /&gt;&lt;/a&gt;&lt;br /&gt;I'm going to try and draw all our new Wow characters. I started with Kara's hunter.</description>
	<pubDate>Thu, 17 Jan 2008 19:26:37 +0000</pubDate>
</item>
<item>
	<title>sigzero: Jobs</title>
	<guid isPermaLink="true">http://use.perl.org/~sigzero/journal/35406?from=rss</guid>
	<link>http://use.perl.org/~sigzero/journal/35406?from=rss</link>
	<description>I have started looking for smaller part-time work in Perl. I really need to push myself and learn as I don't have anyone to &quot;harass&quot; about Perl. I think I am pretty solid in the fundamentals and I have put up a couple commercial sites for friends.&lt;br /&gt;&lt;br /&gt;I think I just need to close my eyes and jump.</description>
	<pubDate>Wed, 16 Jan 2008 21:57:10 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Disk usage graphical presentation</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-6096704822492180681.post-4872430621763418808</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/217691850/disk-usage-graphical-presentation.html</link>
	<description>I found out by accident about this GNOME tool, the &quot;Disk Usage Analyzer&quot;. It has a surprisingly good UI, displaying subdirectories as concentric circular arcs. It makes visually obvious the spots where all the place is wasted. Or spent.&lt;br /&gt;&lt;br /&gt;As an illustration, here's a screenshot of it displaying the disk usage taken by a fresh checkout of Perl 5's sources.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://bp1.blogger.com/_doRI2vYPLjQ/R44cWK9JPmI/AAAAAAAAAAw/kTBO9stb3HA/s1600-h/Screenshot-Disk+Usage+Analyzer.png&quot;&gt;&lt;img src=&quot;http://bp1.blogger.com/_doRI2vYPLjQ/R44cWK9JPmI/AAAAAAAAAAw/kTBO9stb3HA/s320/Screenshot-Disk+Usage+Analyzer.png&quot; alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5156089790609309282&quot; /&gt;&lt;/a&gt;&lt;br /&gt;I wouldn't have thought that &lt;a href=&quot;http://search.cpan.org/dist/Encode&quot;&gt;Encode&lt;/a&gt; was taking so much space. (This is, of course, due to all the files that describes the various encodings recognized by this module.)&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/217691850&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 16 Jan 2008 21:41:55 +0000</pubDate>
</item>
<item>
	<title>sigzero: Maven for Perl?</title>
	<guid isPermaLink="true">http://use.perl.org/~sigzero/journal/35382?from=rss</guid>
	<link>http://use.perl.org/~sigzero/journal/35382?from=rss</link>
	<description>I have been reading up on Maven2 for a project at work. It pretty much handles everything about a project (managing dependecies, documentation, tests etc.).&lt;br /&gt;&lt;br /&gt;I wonder if something similar would benefit the Perl community or is there something out there that I don't know about or even &quot;it is a bad idea&quot;.</description>
	<pubDate>Sun, 13 Jan 2008 21:56:57 +0000</pubDate>
</item>
<item>
	<title>Chris Laco: PAUSE HTTPS Is Borked</title>
	<guid isPermaLink="true">http://use.perl.org/~jk2addict/journal/35378?from=rss</guid>
	<link>http://use.perl.org/~jk2addict/journal/35378?from=rss</link>
	<description>FYI to whomever. Just tried to login to PAUSE. I'm getting https connection errors. Changing the login link to http works just fine.</description>
	<pubDate>Sun, 13 Jan 2008 21:55:53 +0000</pubDate>
</item>
<item>
	<title>Penny Arcade Art</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-35190014.post-3747735822412394601</guid>
	<link>http://pennyarcadeart.blogspot.com/2008/01/ron-has-helped-us-so-much-on-our-game.html</link>
	<description>&lt;a href=&quot;http://bp2.blogger.com/_aOJNqzM3f0w/R4U2EQXGs2I/AAAAAAAAADo/rVPFgDTN_iE/s1600-h/ds.jpg&quot;&gt;&lt;img src=&quot;http://bp2.blogger.com/_aOJNqzM3f0w/R4U2EQXGs2I/AAAAAAAAADo/rVPFgDTN_iE/s320/ds.jpg&quot; alt=&quot;&quot; style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5153584795334652770&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Ron has helped us so much on our game. I did this for him just to say congrats on the announcement of DeathSpank.</description>
	<pubDate>Wed, 09 Jan 2008 21:24:28 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Here comes another one, just like the other one</title>
	<guid isPermaLink="false">http://infotrope.net/blog/2008/01/08/here-comes-another-one-just-like-the-other-one/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/212889664/</link>
	<description>&lt;div class=&quot;series_toc&quot;&gt;&lt;/div&gt; &lt;p&gt;Labor Senator Stephen Conroy’s new &lt;a href=&quot;http://www.senatorconroy.com/meida108.html&quot;&gt;Internet censorship policy&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Federal Labor will improve existing government programs in this area by:&lt;/p&gt;
&lt;p&gt;Providing a &lt;em&gt;mandatory ‘clean feed’ internet service for all homes&lt;/em&gt;, schools and public computers that are used by Australian children, so that ISPs will filter out content identified as prohibited by the Australian Communications and Media Authority (ACMA).  The ACMA ‘blacklist’ will also be made more comprehensive to ensure that children are protected from harmful and inappropriate online material.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;(emphasis mine)&lt;/p&gt;

&lt;div&gt;&lt;a href=&quot;http://www.flickr.com/photos/7360611@N06/1573456652&quot; title=&quot;View '' on Flickr.com&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2040/1573456652_d5f974a247.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; width=&quot;375&quot; height=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;center&gt;&lt;small&gt;The previous government’s scare tactics, as seen on a tram shelter in Melbourne.&lt;/small&gt;&lt;/center&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;The difference between this load of steaming horse shit and the &lt;a href=&quot;http://www.efa.org.au/Campaigns/stop99.html&quot;&gt;rather similar load&lt;/a&gt; that got dumped on us in 1999 is that this time the mainstream media actually know what’s going on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.australianit.news.com.au/story/0,24897,22997280-15306,00.html&quot;&gt;The Australian&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.smh.com.au/news/web/labor-warned-on-porn-filters/2008/01/02/1198949855875.html&quot;&gt;Sydney Morning Herald&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.news.com.au/couriermail/story/0,23739,22990520-27197,00.html&quot;&gt;Courier Mail&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;When a Queensland newspaper’s headline reads “Nanny Rudd censors the internet”, you know the times are a-changin’.  So, I have some hope that this idiotic proposal will either get ditched entirely, watered down to pointlessness (as 1999’s was), or worked around to a significant degree.  I won’t be here for it, but good luck with that.&lt;/p&gt;
No Tags &lt;div class=&quot;series_links&quot;&gt; &lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=Vioe07D&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=Vioe07D&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=LmTxdSD&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=LmTxdSD&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=jDz891d&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=jDz891d&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=DLk3gad&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=DLk3gad&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=tkeIfcd&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=tkeIfcd&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/Infotropism/~4/212884735&quot; height=&quot;1&quot; /&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/212889664&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 08 Jan 2008 21:42:21 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: mod_perl</title>
	<guid isPermaLink="false">http://perlcast.com/2008/01/05/mod_perl/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/211709286/</link>
	<description>&lt;p&gt;Happy New Year and welcome back to Perlcast.  Though 2007 ended with a very light lineup of shows, we here at Perlcast are excited about what 2008 has to offer.  There are plans for more interviews, more presentations, and possibly even some videos and video tutorials about Perl.&lt;/p&gt;
	&lt;p&gt;Anyway, let’s get back to the podcast.  Way back at OSCON 2006, I sat down with Stas Bekman and Philippe M. Chiasson to talk about mod_perl.  Though quite a bit of time has passed since the show was recorded, there is still a lot of good mod_perl related information in the show.  I hope that you enjoy it.&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.perlcast.com/audio/Perlcast_Interview_045.mp3&quot;&gt;Interview Audio&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://perl.apache.org/&quot;&gt;mod_perl&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/211709286&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 05 Jan 2008 21:21:48 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: California, here I come</title>
	<guid isPermaLink="false">http://infotrope.net/blog/2008/01/05/california-here-i-come/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/211390442/</link>
	<description>&lt;div class=&quot;series_toc&quot;&gt;&lt;/div&gt; &lt;p&gt;I seem to be constitutionally incapble of avoiding that subject line.  Sigh.  I apologise.&lt;/p&gt;

&lt;p&gt;In any case, it’s official.  I’m moving to California in less than two weeks’ time.&lt;/p&gt;

&lt;p&gt;I put off mentioning it here in some sort of fit of superstition.  I didn’t want to jinx it.  But back in November I received a job offer from &lt;a href=&quot;http://metaweb.com/&quot;&gt;Metaweb, Inc&lt;/a&gt; to become the Community Director for &lt;a href=&quot;http://freebase.com/&quot;&gt;Freebase&lt;/a&gt;.  I accepted, and the visa paperwork began.  Yesterday my visa was approved, and now the tickets are booked.  I fly out on January 15th.&lt;/p&gt;

&lt;p&gt;The job is based in San Francisco in the SOMA district, and I’ll initially be staying with friends in the Mission til I find a share house to move into.  Plus I’ll get to travel to conferences, so I’m hoping to get to see a bit of the US and the world.&lt;/p&gt;

&lt;p&gt;Right now I’m in the throes of packing everything I own into boxes and saying goodbye to people in Australia.  Life is crazy but good.&lt;/p&gt;
No Tags &lt;div class=&quot;series_links&quot;&gt; &lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=FPyDfAD&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=FPyDfAD&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=mjdSVQD&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=mjdSVQD&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=J5k9TFd&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=J5k9TFd&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=VqLPthd&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=VqLPthd&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Infotropism?a=DhCAdnd&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Infotropism?i=DhCAdnd&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/Infotropism/~4/211381497&quot; height=&quot;1&quot; /&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/211390442&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 05 Jan 2008 21:21:48 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: WoC part two: Database and Domain Design</title>
	<guid isPermaLink="false">tag:vox.com,2008-01-01:asset-6a00cd971ce84f4cd500e398cd84050004</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/209203856/woc-part-two-database-and-domain-design.html</link>
	<description>&lt;div&gt;
         Part two of the Vienna WoC TODO Manager code is up, in which I design and implement a Catalyst+DBIx::Class+Reaction app from the ground up in public and document the process.  The latest article is Database and Domain Design, in which I don my gea...   &lt;p&gt; 
    &lt;a href=&quot;http://chainsawblues.vox.com/library/post/woc-part-two-database-and-domain-design.html?_c=feed-atom#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00cd971ce84f4cd500e398cd84050004?_c=feed-atom&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;

                &lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/209203856&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 01 Jan 2008 21:41:59 +0000</pubDate>
</item>
<item>
	<title>Lawrence Watt-Evans: Seventh Heaven… I mean, Helix!</title>
	<guid isPermaLink="true">http://www.watt-evans.com/blog/?p=65</guid>
	<link>http://www.watt-evans.com/blog/?p=65</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.helixsf.com&quot;&gt;&lt;strong&gt;Helix&lt;/strong&gt; No. 7&lt;/a&gt; is now up and open for business — check it out.&lt;/p&gt;
&lt;p&gt;There are seven new stories, by Charlie Anders, Maya Bohnhoff, Adam-Troy Castro, David W. Goldman, Selina Rosen, Vaughan Stanger, and Laura J. Underwood, along with poetry by Mike Allen, F. J. Bergmann, Anthony Bernstein, Gene van Troyer, and Jane Yolen, and columns by the regulars — John Barnes, Bud Webster, etc.&lt;/p&gt;
&lt;p&gt;The only pay the authors of those seven stories will receive is a share of what readers donate, so if you like what you read, do please show that appreciation in tangible form, either through PayPal or by sending a check.&lt;/p&gt;</description>
	<pubDate>Tue, 01 Jan 2008 19:54:53 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Vienna WoC TODO Manager series on shadowcat.co.uk</title>
	<guid isPermaLink="false">tag:vox.com,2007-12-29:asset-6a00cd971ce84f4cd500e398ccba550002</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/208143790/vienna-woc-todo-manager-series-on-shadowcatcouk.html</link>
	<description>&lt;div&gt;
         I'm going to be building an application to help run the Vienna.pm Winter of Code, and since the resulting application is going to be open source and in public subversion as an example of Catalyst+DBIx::Class+Reaction, I've decided to write up the ...   &lt;p&gt; 
    &lt;a href=&quot;http://chainsawblues.vox.com/library/post/vienna-woc-todo-manager-series-on-shadowcatcouk.html?_c=feed-atom#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00cd971ce84f4cd500e398ccba550002?_c=feed-atom&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;

                &lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/208143790&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 29 Dec 2007 21:42:03 +0000</pubDate>
</item>
<item>
	<title>Perl Advent Calendar: 9</title>
	<guid isPermaLink="true">http://perladvent.org/2007/9/</guid>
	<link>http://perladvent.org/2007/9/</link>
	<description>2007 Perl Advent Calendar: E.L.F.</description>
	<pubDate>Thu, 27 Dec 2007 21:56:34 +0000</pubDate>
</item>
<item>
	<title>Perl Advent Calendar: 25</title>
	<guid isPermaLink="true">http://perladvent.org/2007/25/</guid>
	<link>http://perladvent.org/2007/25/</link>
	<description>2007 Perl Advent Calendar: I can hardly wait</description>
	<pubDate>Tue, 25 Dec 2007 21:56:51 +0000</pubDate>
</item>
<item>
	<title>Perl Advent Calendar: 23</title>
	<guid isPermaLink="true">http://perladvent.org/2007/23/</guid>
	<link>http://perladvent.org/2007/23/</link>
	<description>2007 Perl Advent Calendar: Dickens also rates an 8</description>
	<pubDate>Tue, 25 Dec 2007 21:56:51 +0000</pubDate>
</item>
<item>
	<title>Josh ben Jore: Obstacles to porting SmallTalk debugger in Perl</title>
	<guid isPermaLink="true">http://use.perl.org/~jjore/journal/35197?from=rss</guid>
	<link>http://use.perl.org/~jjore/journal/35197?from=rss</link>
	<description>I've been playing in Squeak recently and it has the best debugger I've ever seen before. Not only can I inspect any part of the running system, I can modify the code for anything, let the absence of methods or other exceptions serve as breakpoints, pop up a level (or many) in the stack and restart a function.&lt;br /&gt;&lt;br /&gt;It's sweet. To make this happen in Perl 5 I'd need the following facilities that&lt;br /&gt;&lt;br /&gt;&quot;find the source for the thing that is executing&quot;&lt;br /&gt;&quot;project an editor somewhere useful&quot;&lt;br /&gt;&quot;be able to accept the edited code and replace it in the original file (this is difficult. maybe requires PPI)&quot;&lt;br /&gt;&quot;Merge newly compiled block into running program. (trivial? for non-closures. needs rebinding for closures)&quot;&lt;br /&gt;&quot;pop the stack to some arbitrary point. be able to restart the block&quot;&lt;br /&gt;&lt;br /&gt;This is just off the top of my head. Maybe it's not worth doing in Perl 5 but it'd be hella nice to have.</description>
	<pubDate>Mon, 24 Dec 2007 21:59:19 +0000</pubDate>
</item>
<item>
	<title>Catalyst Advent: Using plain classes as Catalyst models</title>
	<guid isPermaLink="true">http://catalyst.perl.org/calendar/2007/24</guid>
	<link>http://catalyst.perl.org/calendar/2007/24</link>
	<description>&lt;div class=&quot;pod&quot;&gt;
&lt;h1 id=&quot;Using_plain_classes_as_Catalyst_mode&quot;&gt;Using plain classes as Catalyst models&lt;/h1&gt;
&lt;div id=&quot;Using_plain_classes_as_Catalyst_mode-2&quot;&gt;
&lt;p&gt;A common pitfall when designing models is the tendency to tie application
logic to Catalyst. The problem with this approach is that model classes become
difficult to reuse outside of Catalyst, which is a common requirement for most
applications.
A better design approach would be to write and test a plain class outside of
your main web application, and then painlessly glue it to Catalyst with a
couple lines of code.&lt;/p&gt;

&lt;/div&gt;
&lt;h2 id=&quot;A_review_of_Catalyst_components&quot;&gt;A review of Catalyst components&lt;/h2&gt;
&lt;div id=&quot;A_review_of_Catalyst_components_CONT&quot;&gt;

&lt;/div&gt;
&lt;h3 id=&quot;The_COMPONENT_method&quot;&gt;The COMPONENT() method&lt;/h3&gt;
&lt;div id=&quot;The_COMPONENT_method_CONTENT&quot;&gt;
&lt;p&gt;Catalyst gives you a chance to instantiate all your components (Models, Views
and Controllers) during load time by calling the COMPONENT() method on each
component class. This means you can implement it and return whatever you want
from it. For models this boils down to:&lt;/p&gt;
&lt;pre&gt;    package MyApp::Model::SomeClass;

    use warnings;
    use strict;
    use base qw/Catalyst::Model/;

    use SomeClass;

    sub COMPONENT {
        my($self, $c, @config) = @_;
        return SomeClass-&amp;gt;new(@config);
    }

    1;

&lt;/pre&gt;
&lt;p&gt;This particular implementation passes the configuration for this model to the
external class on the call to new(). Of course, you could choose to instance
the class any way you want to. Later on, &lt;code&gt;$c-&amp;gt;model('SomeClass')&lt;/code&gt; will get
you the &lt;code&gt;SomeClass&lt;/code&gt; instance, &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;MyApp::Model::SomeClass&lt;/code&gt;. Notice that
the returned object is the &lt;strong&gt;very same&lt;/strong&gt; instance that was created initially when
your app was loaded.&lt;/p&gt;

&lt;/div&gt;
&lt;h3 id=&quot;The_ACCEPT_CONTEXT_method&quot;&gt;The ACCEPT_CONTEXT() method&lt;/h3&gt;
&lt;div id=&quot;The_ACCEPT_CONTEXT_method_CONTENT&quot;&gt;
&lt;p&gt;Every time &lt;code&gt;$c-&amp;gt;model&lt;/code&gt; is called, Catalyst gives you a chance to run custom
logic by attempting to run ACCEPT_CONTEXT on the model, whatever is returned
by this method is what &lt;code&gt;$c-&amp;gt;model&lt;/code&gt; returns as well. So, if you need a
new instance on every call, your model becomes something like:&lt;/p&gt;
&lt;pre&gt;    package MyApp::Model::SomeClass;

    use warnings;
    use strict;
    use base qw/Catalyst::Model/;

    use SomeClass;

    sub ACCEPT_CONTEXT {
        my($self, $c, @args) = @_;
        return SomeClass-&amp;gt;new(@args);
    }

    1;

&lt;/pre&gt;
&lt;p&gt;So when you call &lt;code&gt;$c-&amp;gt;model('SomeClass')&lt;/code&gt;, you'll get a fresh instance of
&lt;code&gt;SomeClass&lt;/code&gt; &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;MyApp::Model::SomeClass&lt;/code&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;h2 id=&quot;The_code_Catalyst_Model_Adaptor_code&quot;&gt;The &lt;code&gt;Catalyst::Model::Adaptor&lt;/code&gt; way&lt;/h2&gt;
&lt;div id=&quot;The_code_Catalyst_Model_Adaptor_code-2&quot;&gt;
&lt;p&gt;Instead of implementing your own glue code, you can use the generic
implementation provided by the &lt;code&gt;Catalyst::Model::Adaptor&lt;/code&gt; module, which
provides several different ways of building your external class instances.&lt;/p&gt;
&lt;p&gt;If you need a single application-wide instance of your external class, you can
inherit from &lt;code&gt;Catalyst::Model::Adaptor&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;    package MyApp::Model::Foo;

    use warnings;
    use strict;
    use base qw/Catalyst::Model::Adaptor/;

    __PACKAGE__-&amp;gt;config(
        class =&amp;gt; 'SomeClass',
        args  =&amp;gt; {
            foo =&amp;gt; 'bar'
        }
    );

    1;

&lt;/pre&gt;
&lt;p&gt;Of course, you can also configure your class via myapp.yaml&lt;/p&gt;
&lt;pre&gt;    Model::Foo:
        class: SomeClass
        args:
            foo: bar

&lt;/pre&gt;
&lt;p&gt;This gives you more flexibility when you decide to change your implementation,
just replace &lt;code&gt;SomeClass&lt;/code&gt; with whatever class you wish to use, without even
touching your code.&lt;/p&gt;

&lt;/div&gt;
&lt;h3 id=&quot;Alternate_object_instancing_approach&quot;&gt;Alternate object instancing approaches&lt;/h3&gt;
&lt;div id=&quot;Alternate_object_instancing_approach-2&quot;&gt;
&lt;p&gt;For instancing objects on every call to &lt;code&gt;$c-&amp;gt;model&lt;/code&gt;, just inherit from
&lt;code&gt;Catalyst::Model::Factory&lt;/code&gt; instead. And for instancing objects on a
per-request basis, inherit from &lt;code&gt;Catalyst::Model::Factory::PerRequest&lt;/code&gt;.
The &lt;code&gt;Catalyst::Model::Adaptor&lt;/code&gt; documentation provides information on how to
further customize your models to address your specific needs.&lt;/p&gt;

&lt;/div&gt;
&lt;h3 id=&quot;For_the_incredibly_lazy&quot;&gt;For the incredibly lazy&lt;/h3&gt;
&lt;div id=&quot;For_the_incredibly_lazy_CONTENT&quot;&gt;
&lt;p&gt;You can easily create glue models by using the helpers provided with
&lt;code&gt;Catalyst::Model::Adaptor&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;    script/myapp_create.pl model SomeClass &amp;lt;type&amp;gt; MyApp::Model::SomeClass

&lt;/pre&gt;
&lt;p&gt;Where &amp;lt;type&amp;gt; can be &lt;code&gt;Adaptor&lt;/code&gt;, &lt;code&gt;Factory&lt;/code&gt; or &lt;code&gt;Factory::PerRequest&lt;/code&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;h1 id=&quot;ACKNOWLEDGEMENTS&quot;&gt;ACKNOWLEDGEMENTS&lt;/h1&gt;
&lt;div id=&quot;ACKNOWLEDGEMENTS_CONTENT&quot;&gt;
&lt;p&gt;Jonathan Rockway, for writing &lt;code&gt;Catalyst::Model::Adaptor&lt;/code&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;h1 id=&quot;AUTHOR&quot;&gt;AUTHOR&lt;/h1&gt;
&lt;div id=&quot;AUTHOR_CONTENT&quot;&gt;
&lt;p&gt;edenc - Eden Cardim - &lt;code&gt;edencardim@gmail.com&lt;/code&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Mon, 24 Dec 2007 06:05:20 +0000</pubDate>
	<author>edencardim@gmail.com (edenc)</author>
</item>
<item>
	<title>Catalyst Advent: Pluggable Modules and Deployable Instances</title>
	<guid isPermaLink="true">http://catalyst.perl.org/calendar/2007/23</guid>
	<link>http://catalyst.perl.org/calendar/2007/23</link>
	<description>&lt;div class=&quot;pod&quot;&gt;
&lt;h1 id=&quot;Pluggable_Modules_and_Deployable_Ins&quot;&gt;Pluggable Modules and Deployable Instances&lt;/h1&gt;
&lt;div id=&quot;Pluggable_Modules_and_Deployable_Ins-2&quot;&gt;

&lt;/div&gt;
&lt;h2 id=&quot;Discussed_Concepts&quot;&gt;Discussed Concepts :&lt;/h2&gt;
&lt;div id=&quot;Discussed_Concepts_CONTENT&quot;&gt;
&lt;p&gt;This article discusses  about two catalyst concepts .&lt;/p&gt;
&lt;p&gt;1. How chaining can be used to create applications that have a central engine that process core logic and allow independent modules be built on top.(The Application)&lt;/p&gt;
&lt;p&gt;2. Par and creating spawns of the application that can span again and integrate to the master site . The individual spawn can be carried around as a separate application.(Instantiating)&lt;/p&gt;

&lt;/div&gt;
&lt;h2 id=&quot;The_Built_Application&quot;&gt;The Built Application :&lt;/h2&gt;
&lt;div id=&quot;The_Built_Application_CONTENT&quot;&gt;
&lt;p&gt;The tutorial is accompanied by a functional and well commented code base which can be checkout using svn  from 
http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/Quiz&lt;/p&gt;




&lt;p&gt;For demonstrating the above mentioned concepts a quiz application has been taken as example.&lt;/p&gt;
&lt;p&gt;The final application must be able to &lt;/p&gt;
&lt;p&gt;I). Create quizzes that can be taken on the site or deployed to a trainer's laptop , which the trainer can carry to colleges.The application must make sure that the deployed quiz contains only the required questions in the database as the questions can be proprietary and the trainer must be able to take only what is necessary. It must also allow a deployed quiz to act as master and create smaller quizzes from it . Ideal when a trainer takes 500 questions and has to train 10 batches with different question set  in the same college.&lt;/p&gt;
&lt;p&gt;II). When creating a quiz it must be possible to choose the modules  and the number of questions from each module .Example of questioning modules can be &quot;choose the correct answer&quot; ,&quot;Fill in the blanks &quot; etc.&lt;/p&gt;
&lt;p&gt;III). It must be  possible to build new modules that can work along with the application and yet can be developed independently without any constraints on its internal logic , look and feel.
This tutorial will take you step by step on building such an application . &lt;/p&gt;

&lt;/div&gt;
&lt;h2 id=&quot;The_Application&quot;&gt;(The Application) :&lt;/h2&gt;
&lt;div id=&quot;The_Application_CONTENT&quot;&gt;
&lt;p&gt;This tutorial will take you step by step on building such an application . &lt;/p&gt;

&lt;/div&gt;
&lt;h3 id=&quot;Step_1_The_model&quot;&gt;Step 1 : The model .&lt;/h3&gt;
&lt;div id=&quot;Step_1_The_model_CONTENT&quot;&gt;
&lt;p&gt;What is needed is a quiz engine that can create quiz containing questions from more than one module .
And be able to track who took the quiz and what they scored.&lt;/p&gt;
&lt;p&gt;The sql and the schema to create the required tables and models can be seen from the code.
Basically there are 4 tables.&lt;/p&gt;
&lt;p&gt;QuizMaster::Quizzes stores the generated quizzes.
QuizMaster::Modules stores the list of available modules.
QuizMaster::QuizModules stores the modules selected for a quiz , 
			and the randomly assigned question numbers from each module.
QuizMaster::participants stores who took what quiz and how much they scored.&lt;/p&gt;

&lt;/div&gt;
&lt;h3 id=&quot;Step_2_Creating_controller_methods_f&quot;&gt;Step 2 : Creating controller methods for creating the quiz.&lt;/h3&gt;
&lt;div id=&quot;Step_2_Creating_controller_methods_f-2&quot;&gt;
&lt;p&gt;Controller methods (index and create )  are written in quiz controller  the general way to display the created quiz and to allow to create a new quiz.&lt;/p&gt;

&lt;/div&gt;
&lt;h3 id=&quot;Step_3_Implementing_the_concept_of_i&quot;&gt;Step 3 : Implementing the concept of independent modules.&lt;/h3&gt;
&lt;div id=&quot;Step_3_Implementing_the_concept_of_i-2&quot;&gt;
&lt;p&gt;What is expected is that the application act as a quiz engine that controls modules 
to ask questions .The modules are designed to ask questions and get answers in whatever manner is best suited for that module and pass back only the result to the engine so that the engine can track the score and the flow.&lt;/p&gt;
&lt;p&gt;For example : A quiz might consist of two module &quot;Choose the correct answer &quot; , &quot;Fill in the blanks&quot;.&lt;/p&gt;
&lt;p&gt;Both the modules may have completely different UI , a module may select more than one value as an answer.
A quiz can contain questions (1,2,8) from module 1 and (4,6) from module 2.&lt;/p&gt;
&lt;p&gt;The application has to be designed in such a way that the flow , i.e the transition from question 1 to question 2 when in module 1 and the transition from question 8 in module 1 to question 4 in module 2 is handled by the engine.The engine must also handle the score manipulation.&lt;/p&gt;
&lt;p&gt;Even when doing the above , the application must still keep it easy to create new modules.&lt;/p&gt;
&lt;p&gt;This is possible by combining sessions and chaining in the following way . &lt;/p&gt;
&lt;p&gt;We define 3 methods  in the quiz controller to do the above.&lt;/p&gt;
&lt;p&gt;(start, process  and finish)&lt;/p&gt;







&lt;p&gt;Each of which are explained  below .&lt;/p&gt;

&lt;/div&gt;
&lt;h4 id=&quot;start&quot;&gt;start : &lt;/h4&gt;
&lt;div id=&quot;start_CONTENT&quot;&gt;
&lt;pre&gt;

  This function does two things 

  1.Initializes the quiz by loading the details of the modules used and their 
    respective question numbers into the session.
  2.Determines the first module and the first question that have to be asked and 
    its corresponding url.




&lt;/pre&gt;
&lt;p&gt;sub start : Local
  {&lt;/p&gt;
&lt;pre&gt;  my ($self,$c,$quizid) = @_;

  #Displays a form and gets the participants name.

  if ($c-&amp;gt;request-&amp;gt;param('name')) {

     #Loads the modules and the questions selected randomly from each module 
     #during create and stores it in session      
    my $quiz = $c-&amp;gt;model('QuizMaster::Quizzes')-&amp;gt;search({id=&amp;gt;$quizid})-&amp;gt;first;
    my $modules = [$quiz-&amp;gt;search_related('quizmodules',{quiz=&amp;gt;$quizid})-&amp;gt;all];
    $c-&amp;gt;session-&amp;gt;{quiz}={participant=&amp;gt;$c-&amp;gt;request-&amp;gt;param('name'),name=&amp;gt;$quiz-&amp;gt;name};
    my $moduledata;

    foreach my $module (@{$modules}) {

      


      push @{$moduledata} , { id =&amp;gt; $module-&amp;gt;id , 
                              name=&amp;gt;$module-&amp;gt;module-&amp;gt;name,
                               questions =&amp;gt; [split ' ',$module-&amp;gt;questions] };

    }

    


    $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{modquestions}=$moduledata;

    #set up counter for the questions and modules
    $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{modindex}=0;
    $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{qindex}=0;

    #set score and total score as 0
    $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{score} = 0;
    $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{tscore} = 0;




    #Sets up the url for the first question of the first module.
    $c-&amp;gt;stash-&amp;gt;{newurl} = &quot;/quiz/process/$quizid/$moduledata-&amp;gt;[0]-&amp;gt;{name}/$moduledata-&amp;gt;[0]-&amp;gt;{questions}-&amp;gt;[0]&quot;;
    $c-&amp;gt;stash-&amp;gt;{template} = 'quiz/begin.tt2';

  }




&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;/div&gt;
&lt;h4 id=&quot;Process&quot;&gt;Process :&lt;/h4&gt;
&lt;div id=&quot;Process_CONTENT&quot;&gt;
&lt;p&gt;This method plays the key role of maintaining the flow and scoring &lt;/p&gt;
&lt;pre&gt; This controller does two things .
 1.It does scoring for the previously answered question
 2.Set the action path(url) for the next question  that can be used by the module 
   displaying the current question 




&lt;/pre&gt;
&lt;p&gt;sub process : PathPart('quiz/process') Chained('/')  CaptureArgs(1) {&lt;/p&gt;
&lt;pre&gt;  my ($self,$c,$quizid) = @_;




  #Scoring 
  $c-&amp;gt;log-&amp;gt;debug($c-&amp;gt;request-&amp;gt;method);

  if ($c-&amp;gt;request-&amp;gt;method =~ /POST/) {
    $c-&amp;gt;log-&amp;gt;debug('Entered here');

    # To make sure we don't evaluate a non existing previous answer when displaying the first question
    if ($c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{answer}) {
      my $flag= 1;

      # The questioning module has to store the answer for the question in the application's session 
      # Using a hash here allows to have questions with multiple answers

      foreach (keys %{$c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{answer}}) {
	if ($c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{answer}-&amp;gt;{$_} != $c-&amp;gt;request-&amp;gt;param($_) ) {
	  $flag = 0;

	}
      }

      # The score per question is taken as 10 here . 
      #It can also be set to take a value from the sessions in which case the 
      #questioning modules can assign different marks to each question
      my $spq = 10;

      $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{score} += ($flag * $spq);
      $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{tscore} += $spq;
      $c-&amp;gt;log-&amp;gt;debug($c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{score});




    }

  }




  #Determine the action path(url for next question)




  my $modindex = $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{modindex};
  my $qindex = $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{qindex};

  #check that the current question is not the last question of the module
  if ( $qindex != $#{$c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{modquestions}-&amp;gt;[$modindex]-&amp;gt;{questions}}) {

    


    $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{qindex} += 1;
    $qindex ++;

    # generate /quiz/process/quizid/modulename/questionid
    my $modulename = $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{modquestions}-&amp;gt;[$modindex]-&amp;gt;{name};
    my $questionid = int($c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{modquestions}-&amp;gt;[$modindex]-&amp;gt;{questions}-&amp;gt;[$qindex]);

    $c-&amp;gt;stash-&amp;gt;{postaction}=&quot;/quiz/process/$quizid/$modulename/$questionid&quot;;

  } else {
    #if it is the last question , check that the current module is not the last module
    if ($modindex != $#{$c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{modquestions}}) {
      $qindex = $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{qindex} = 0;
      $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{modindex} += 1;
      $modindex ++;
      my $modulename = $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{modquestions}-&amp;gt;[$modindex]-&amp;gt;{name};
      my $questionid = int($c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{modquestions}-&amp;gt;[$modindex]-&amp;gt;{questions}-&amp;gt;[$qindex]);

      $c-&amp;gt;stash-&amp;gt;{postaction}=&quot;/quiz/process/$quizid/$modulename/$questionid&quot;;

	 





    }

    #if the current question is the last question of the last module set action path 
     to the quiz finish controller
    else {
      $c-&amp;gt;stash-&amp;gt;{postaction}=&quot;/quiz/finish/$quizid&quot;;

    }
  }

    


&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;/div&gt;
&lt;h4 id=&quot;finish&quot;&gt;finish : &lt;/h4&gt;
&lt;div id=&quot;finish_CONTENT&quot;&gt;
&lt;p&gt;This method does two things &lt;/p&gt;
&lt;p&gt;1. Manipulate the score for the last answer.
2. Save the quiz results to the database.&lt;/p&gt;
&lt;p&gt;(Actually this can be re-factored to chain that process method and hence pop point 1 from its responsibility .It will be necessary to do so when complex scoring algorithms are used in the quiz . Say for example each module has a different scoring patter for questions and a that module allows multiple answers and different scores for each answer.In such a case the scoring algorithm will be complex and it will not be a good design to repeat that portion in the controller below for the last question alone) &lt;/p&gt;







&lt;p&gt;sub finish : Local {&lt;/p&gt;
&lt;pre&gt;  my ($self,$c,$quizid) = @_;
  my  $name = $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{participant};
  # Same as in the previous controller , manipulate the score for the last question.  
  my $flag= 1;

      foreach (keys %{$c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{answer}}) {
	if ($c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{answer}-&amp;gt;{$_} != $c-&amp;gt;request-&amp;gt;param($_) ) {
	  $flag = 0;

	}
      }

  my $spq = 10;

      $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{score} += ($flag * $spq);
      $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{tscore} += $spq;




  my $score = $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{score};
  my $tscore = $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{tscore};

&lt;/pre&gt;
&lt;p&gt;# Save the Quiz results&lt;/p&gt;
&lt;pre&gt; my $participant = $c-&amp;gt;model('QuizMaster::Participants')-&amp;gt;create({
                 name =&amp;gt; $name,
		 quiz =&amp;gt; $quizid,
		 score =&amp;gt; $score,
                 totalscore =&amp;gt; $tscore

									 						 });
  $c-&amp;gt;stash-&amp;gt;{score} = &quot;$score / $tscore&quot;;

          


&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;/div&gt;
&lt;h3 id=&quot;Step_4_Create_a_sample_module&quot;&gt;Step 4: Create a sample module :&lt;/h3&gt;
&lt;div id=&quot;Step_4_Create_a_sample_module_CONTEN&quot;&gt;
&lt;p&gt;Having designed the engine above.
There are few things  to be kept in mind to create a questioning module .&lt;/p&gt;

&lt;/div&gt;
&lt;h4 id=&quot;Model&quot;&gt;Model : &lt;/h4&gt;
&lt;div id=&quot;Model_CONTENT&quot;&gt;
&lt;p&gt;1. The module model must have the questions in the namespace modelname::modelname_questions
   (This can be avoided if the Quiz::Modules table can have the count of the total number of questions available for each module or maybe a field that contains the name of the model that the module uses for storing its questions ).&lt;/p&gt;

&lt;/div&gt;
&lt;h4 id=&quot;Controller&quot;&gt;Controller :&lt;/h4&gt;
&lt;div id=&quot;Controller_CONTENT&quot;&gt;




&lt;p&gt;1.There must be a controller with the same name as the module 
2.The questionid of the question that is to be challenged will be given to the module's method that is chained with the quiz controller's process method and has PathPart same as the module's name.
3.The form action  value(url for the next question) will have to be retrieved from the session.
4.The answer(s) to the current question must be stored in the session as a key/value pair.&lt;/p&gt;




&lt;p&gt;When the above points are followed , &lt;/p&gt;
&lt;p&gt;The three methods in the quiz  controller (start , process and finish)  handle  scoring , moving over the questions and moving over to the next module .&lt;/p&gt;




&lt;p&gt;With that in mind, the complete controller code for a simple choose the correct answer module is &lt;/p&gt;




&lt;p&gt;sub index : PathPart('Ctca') Chained('/quiz/process')  Args(1)  {
    my ( $self, $c , $questionid ) = @_;&lt;/p&gt;
&lt;pre&gt;    my $question = $c-&amp;gt;model('Ctca::CtcaQuestions')-&amp;gt;search({id=&amp;gt;$questionid})-&amp;gt;first;

    $c-&amp;gt;stash-&amp;gt;{question} = $question;

    $c-&amp;gt;stash-&amp;gt;{options}= [$question-&amp;gt;search_related('options',question=&amp;gt;$questionid)-&amp;gt;all];
    # The only extra line by the module that is needed to let the engine handle the flow and scoring 
    $c-&amp;gt;session-&amp;gt;{quiz}-&amp;gt;{answer} = {choice =&amp;gt; $question-&amp;gt;correct};
    $c-&amp;gt;stash-&amp;gt;{template} = 'Ctca/index.tt2';

&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;/div&gt;
&lt;h3 id=&quot;Conclusion&quot;&gt;Conclusion : &lt;/h3&gt;
&lt;div id=&quot;Conclusion_CONTENT&quot;&gt;




&lt;p&gt;The above architecture reduces the work involved in designing a new module . When creating a new module one will have to only worry about &lt;/p&gt;
&lt;pre&gt; * How the question is displayed and answer taken (drag and drop , jigsaw , draw lines :))
 * Determine the correct answer from the database and store it in the session

&lt;/pre&gt;
&lt;p&gt;Everything else is taken care by the quiz controller . &lt;/p&gt;
&lt;p&gt;This makes it easier to develop new modules .&lt;/p&gt;





&lt;/div&gt;
&lt;h2 id=&quot;Instantiating&quot;&gt;(Instantiating) :&lt;/h2&gt;
&lt;div id=&quot;Instantiating_CONTENT&quot;&gt;




&lt;p&gt;This part of the tutorial outlines the step required in creating spawns of the application that can span again and integrate to the master site . The individual spawn can be carried around as a separate application.&lt;/p&gt;
&lt;p&gt;The application is so build from above that &lt;/p&gt;
&lt;p&gt;1.If we were to copy the entire folder to a new folder .
2.Delete all the records in the QuizMasterL::Quizzes table except the one selected for deployment.
3.Delete all the records in each quiz module other than the ones used by the quiz
4.Create par and use pp to make a binary with the perl compiler.&lt;/p&gt;
&lt;p&gt;We will have a complete spawn of the existing site with a limited number of questions.
Hence a trainer can create sub quizzes from the limited number of quizzes and that runs easily with a single click.&lt;/p&gt;




&lt;p&gt;We will use a method called deploy in the quiz controller which does the above 4 points.
Since it is easier to handle steps (1,4) in a script run locally .
The controller script will first do steps (2,3) and save the created databases to a temporary location.
Then the  system command can be used to invoke a shell script that will do the copy and packaging.&lt;/p&gt;

&lt;/div&gt;
&lt;h3 id=&quot;To_do_step_2_3_slice_an_existing_db&quot;&gt;To do step (2,3) [slice an existing db]:&lt;/h3&gt;
&lt;div id=&quot;To_do_step_2_3_slice_an_existing_db_&quot;&gt;
&lt;p&gt;That is to create a slice of the existing database the following procedure is followed.&lt;/p&gt;
&lt;p&gt;1.Use deploy() to create the database for the QuizMaster::Quizzes . 
2.Insert a record with the quiz id and the name to that database.
3.use deploy() to create the database for each of the module.
4.Read the assigned questions for each module from the QuizMaster::QuizMoules tables and insert those record into the newly created database.&lt;/p&gt;




&lt;p&gt;After doing which the control can be passed to the shell script that will do the copy and packaging.&lt;/p&gt;
&lt;p&gt;Since we had stated that using the above said convention for the questions table is the only constraint for the  module's Model.It is only possible to slice the questions table .It is not possible to know the logic used by the questioning module to store the answers.So we cant slice them. Anyways that is alright as though the questions can make sense without the answers and need to be protected when proprietary , the answers without the questions are just junk and will not make much meaning.&lt;/p&gt;








&lt;/div&gt;
&lt;h3 id=&quot;Acknowledgement&quot;&gt;Acknowledgement&lt;/h3&gt;
&lt;div id=&quot;Acknowledgement_CONTENT&quot;&gt;
&lt;p&gt;Special thanks to Ma Foi Academy for allowing me to expose part of the code developed for the organization in this article.&lt;/p&gt;

&lt;/div&gt;
&lt;h1 id=&quot;AUTHOR&quot;&gt;AUTHOR&lt;/h1&gt;
&lt;div id=&quot;AUTHOR_CONTENT&quot;&gt;
&lt;p&gt;Antano Solar John
&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Mon, 24 Dec 2007 06:05:20 +0000</pubDate>
	<author>catalyst@lists.scsys.co.uk (Antano Solar John)</author>
</item>
<item>
	<title>Catalyst Advent: NAME</title>
	<guid isPermaLink="true">http://catalyst.perl.org/calendar/2007/22</guid>
	<link>http://catalyst.perl.org/calendar/2007/22</link>
	<description>&lt;div class=&quot;pod&quot;&gt;
&lt;h1 id=&quot;NAME&quot;&gt;NAME &lt;/h1&gt;
&lt;div id=&quot;NAME_CONTENT&quot;&gt;
&lt;p&gt;DBIx::Class::Tutorial::Part1&lt;/p&gt;

&lt;/div&gt;
&lt;h1 id=&quot;DESCRIPTION&quot;&gt;DESCRIPTION&lt;/h1&gt;
&lt;div id=&quot;DESCRIPTION_CONTENT&quot;&gt;
&lt;p&gt;This is part one of a DBIx::Class tutorial I started writing for the
folks at work, I hope to turn it into a multi-part releasable
document.&lt;/p&gt;

&lt;/div&gt;
&lt;h1 id=&quot;GLOSSARY&quot;&gt;GLOSSARY&lt;/h1&gt;
&lt;div id=&quot;GLOSSARY_CONTENT&quot;&gt;
&lt;p&gt;See &lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::Manual::Glossary&quot;&gt;DBIx::Class::Manual::Glossary&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some terms needed for this doc:&lt;/p&gt;
&lt;dl&gt;
	&lt;dt&gt;Schema&lt;/dt&gt;
	&lt;dd&gt;
		&lt;p&gt;A &lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::Schema&quot;&gt;DBIx::Class::Schema&lt;/a&gt; object is created by calling &lt;code&gt;-&amp;gt;connect&lt;/code&gt;
on our Schema subclass, and passing it the DSN (and other possible
values, see &lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::Schema&quot;&gt;DBIx::Class::Schema&lt;/a&gt;). Eg: &lt;code&gt;my $schema =
Breadcrumbs::Schema-&amp;gt;connect('dbi:mysql;dbname=Breadcrumbs',
'user', 'passwd');&lt;/code&gt; Creating this object does not attempt to connect
to the database yet.&lt;/p&gt;
		&lt;p&gt;NB: To make use of an existing mechanism to store credentials for
databases, we can do: &lt;code&gt;my $schema = Breadcrumbs::Schema-&amp;gt;connect(
sub { My::Util('Breadcrumbs') } );&lt;/code&gt;.&lt;/p&gt;
	&lt;/dd&gt;
	&lt;dt&gt;ResultSet&lt;/dt&gt;
	&lt;dd&gt;
		&lt;p&gt;A &lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::ResultSet&quot;&gt;DBIx::Class::ResultSet&lt;/a&gt;, an object which represents a database
query, including all conditions/clauses. Creating one does not run the
associated query, it is stored and used when actual data objects are
requested. The simplest form of ResultSet represents an entire table,
and can be retrieved from the schema object like this: &lt;code&gt;my $rs =
$schema-&amp;gt;resultset('Path')&lt;/code&gt;.&lt;/p&gt;
	&lt;/dd&gt;
	&lt;dt&gt;ResultSource&lt;/dt&gt;
	&lt;dd&gt;
		&lt;p&gt;A class that describes a table, it's columns and it's relations with
other tables.&lt;/p&gt;
	&lt;/dd&gt;
	&lt;dt&gt;Row&lt;/dt&gt;
	&lt;dd&gt;
		&lt;p&gt;A &lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::Row&quot;&gt;DBIx::Class::Row&lt;/a&gt; representing an actual row of data resulting
from a database query. This could be and entire row, or just certain
fields as restricted by a ResultSet.&lt;/p&gt;

&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;
&lt;h1 id=&quot;SETUP&quot;&gt;SETUP&lt;/h1&gt;
&lt;div id=&quot;SETUP_CONTENT&quot;&gt;
		&lt;p&gt;To create a new set of DBIx::Class &lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::ResultSource&quot;&gt;DBIx::Class::ResultSource&lt;/a&gt;
classes, you can either write them by hand, or create from an existing
database.&lt;/p&gt;

&lt;/div&gt;
&lt;h2 id=&quot;Create_ResultSource_classes_from_exi&quot;&gt;Create ResultSource classes from existing database&lt;/h2&gt;
&lt;div id=&quot;Create_ResultSource_classes_from_exi-2&quot;&gt;
		&lt;p&gt;&lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::Schema::Loader&quot;&gt;DBIx::Class::Schema::Loader&lt;/a&gt;'s &lt;code&gt;make_schema_at&lt;/code&gt; can extract schema
definitions from existing databases and create a complete
&lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class&quot;&gt;DBIx::Class&lt;/a&gt; schema for you, example:&lt;/p&gt;
&lt;pre&gt;  perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at(&quot;Breadcrumbs::Schema&quot;, { debug =&amp;gt; 1 }, [ &quot;dbi:mysql:dbname=Breadcrumbs&quot;,&quot;user&quot;, &quot;passwd&quot; ])'

&lt;/pre&gt;
		&lt;p&gt;This will create a file for each database table (in
&lt;cite&gt;lib/Breadcrumbs/Schema/&lt;/cite&gt;), plus the file &lt;cite&gt;Breadcrumbs/Schema.pm&lt;/cite&gt; which is
the &lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::Schema&quot;&gt;DBIx::Class::Schema&lt;/a&gt; file.&lt;/p&gt;
		&lt;p&gt;The table files will contain information about the columns and their
types. If the database is innodb, it will also extract relationships
based on foreign key references etc. An md5 sum of the contents is
added, so that the user can add more relations or other methods to the
file, and a later update will not overwrite them.&lt;/p&gt;

&lt;/div&gt;
&lt;h2 id=&quot;If_the_database_layout_changes&quot;&gt;If the database layout changes&lt;/h2&gt;
&lt;div id=&quot;If_the_database_layout_changes_CONTE&quot;&gt;
		&lt;p&gt;Re-run the &lt;code&gt;make_schema_at&lt;/code&gt; command shown above. &lt;/p&gt;

&lt;/div&gt;
&lt;h2 id=&quot;Create_ResultSource_classes_from_scr&quot;&gt;Create ResultSource classes from scratch&lt;/h2&gt;
&lt;div id=&quot;Create_ResultSource_classes_from_scr-2&quot;&gt;
		&lt;p&gt;See &lt;a href=&quot;http://search.cpan.org/perldoc?SETTING UP DBIx::Class&quot;&gt;SETTING UP DBIx::Class in DBIx::Class::Manual::Intro&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;
&lt;h2 id=&quot;Setting_up_relationships&quot;&gt;Setting up relationships&lt;/h2&gt;
&lt;div id=&quot;Setting_up_relationships_CONTENT&quot;&gt;
		&lt;p&gt;If your databases is mysql and not using innodb, you will have
to add the table relationships ourselves. These are the most useful
part of DBIx::Class, otherwise we might as well just use DBI..&lt;/p&gt;
		&lt;p&gt;There are 3 main/useful relationship types, for the rest and a more wordy
description, see &lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::Relationship&quot;&gt;DBIx::Class::Relationship&lt;/a&gt;.&lt;/p&gt;
		&lt;p&gt;The &lt;code&gt;name&lt;/code&gt; of each relationship (the first argument), is important,
it is used both as an accessor and as a key to joni across tables.&lt;/p&gt;

&lt;/div&gt;
&lt;h2 id=&quot;belongs_to_foreign_keys&quot;&gt;belongs_to (foreign keys)&lt;/h2&gt;
&lt;div id=&quot;belongs_to_foreign_keys_CONTENT&quot;&gt;
		&lt;p&gt;Breadcrumbs's &lt;code&gt;Name&lt;/code&gt; table has a &lt;code&gt;PathID&lt;/code&gt; column which contains
an ID from the &lt;code&gt;Path&lt;/code&gt; table. To make the Path object simple to
retrieve and update, we add the following to the Name.pm file,
after the md5 sum from Loader:&lt;/p&gt;
&lt;pre&gt;  __PACKAGE__-&amp;gt;belongs_to('path', 'Breadcrumbs::Schema::Path', 'PathID');

&lt;/pre&gt;
		&lt;p&gt;Read as: The value in the &lt;code&gt;PathID&lt;/code&gt; column belongs_to the table
represented by &lt;code&gt;Breadcrumbs::Schema::Path&lt;/code&gt;.&lt;/p&gt;
		&lt;p&gt;This creates an accessor &lt;code&gt;path&lt;/code&gt;, which we can call on a Name
&lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::Row&quot;&gt;DBIx::Class::Row&lt;/a&gt; which will retrieve the appropriate
&lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::Row&quot;&gt;DBIx::Class::Row&lt;/a&gt; in the &lt;code&gt;Path&lt;/code&gt; table.&lt;/p&gt;
&lt;pre&gt;  ## Print the path of the current name entry
  print $name-&amp;gt;path-&amp;gt;path;

&lt;/pre&gt;
		&lt;p&gt;We can also set a PathID for a new Name row by calling:&lt;/p&gt;
&lt;pre&gt;  $name-&amp;gt;path($pathobj);
  $name-&amp;gt;update;

&lt;/pre&gt;

&lt;/div&gt;
&lt;h2 id=&quot;has_many_reverse_foreign_key&quot;&gt;has_many (reverse foreign key)&lt;/h2&gt;
&lt;div id=&quot;has_many_reverse_foreign_key_CONTENT&quot;&gt;
		&lt;p&gt;Going in the opposite direction, each &lt;code&gt;Path&lt;/code&gt; row has 0 to many
&lt;code&gt;Name&lt;/code&gt; entries associated with it, indicated by the &lt;code&gt;PathID&lt;/code&gt; column
in the &lt;code&gt;Name&lt;/code&gt; table. We can make it simple to retrieve all the name
values for a particular &lt;code&gt;Path&lt;/code&gt; row:&lt;/p&gt;
&lt;pre&gt;  __PACKAGE__-&amp;gt;has_many('names', 'Breadcrumbs::Schema::Name', 'PathID');

&lt;/pre&gt;
		&lt;p&gt;Read as: This class has many &lt;code&gt;names&lt;/code&gt; in &lt;code&gt;Breadcrumbs::Schema::Name&lt;/code&gt;
linked via the &lt;code&gt;PathID&lt;/code&gt; column.&lt;/p&gt;
		&lt;p&gt;Creates us an accessor &lt;code&gt;names&lt;/code&gt; which can give us a
&lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::ResultSet&quot;&gt;DBIx::Class::ResultSet&lt;/a&gt; (of which more later), or an array of
&lt;code&gt;Name&lt;/code&gt; objects.&lt;/p&gt;
&lt;pre&gt;  ## find all names for current path entry
  foreach my $name ($path-&amp;gt;names)
  {
     print $name-&amp;gt;name;
  }

&lt;/pre&gt;
		&lt;p&gt;Add a new name for the current path, assuming we have a language
object as well:&lt;/p&gt;
&lt;pre&gt;  $path-&amp;gt;create_related('names', 
                        { name =&amp;gt; 'Products',
                          lang =&amp;gt; $lang }
                       );







&lt;/pre&gt;

&lt;/div&gt;
&lt;h1 id=&quot;GETTING_DATA&quot;&gt;GETTING DATA&lt;/h1&gt;
&lt;div id=&quot;GETTING_DATA_CONTENT&quot;&gt;
		&lt;p&gt;Whether fetching complete rows, searching for rows, or fetching data
from multiple tables, the methods are much the same, all return
&lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::Row&quot;&gt;DBIx::Class::Row&lt;/a&gt; objects eventually.&lt;/p&gt;

&lt;/div&gt;
&lt;h2 id=&quot;find_single_row_by_unique_key&quot;&gt;find (single row by unique key)&lt;/h2&gt;
&lt;div id=&quot;find_single_row_by_unique_key_CONTEN&quot;&gt;
		&lt;p&gt;To fetch a full row using it's Primary Key (they all have PKs,
right?), we can retrieve a Row object directly from a ResultSet
representing the table:&lt;/p&gt;
&lt;pre&gt;  ## Just PK:
  my $name1 = $schema-&amp;gt;resultset('Name')-&amp;gt;find(1);

  ## More meaningful:
  my $name1 = $schema-&amp;gt;resultset('Name')-&amp;gt;find({ id =&amp;gt; 1 });

&lt;/pre&gt;
		&lt;p&gt;The Row object contains all the values of all the fields defined in
the ResultSource. Not necessarily in the table. Each column has an
accessor which is by default the name of the column lower-cased (When
using Loader).&lt;/p&gt;
&lt;pre&gt;  my $namename = $name1-&amp;gt;name;   ## Japan
  my $langid   = $name1-&amp;gt;langid; ## 1

&lt;/pre&gt;

&lt;/div&gt;
&lt;h2 id=&quot;search_multiple_objects_less_coluns_&quot;&gt;search (multiple objects, less coluns, conditions)&lt;/h2&gt;
&lt;div id=&quot;search_multiple_objects_less_coluns_-2&quot;&gt;
		&lt;p&gt;To fetch a particular Name row and it's Path at the
same time, using only one database query:&lt;/p&gt;
&lt;pre&gt;  my $name_rs = $schema-&amp;gt;resultset('Name')-&amp;gt;search(
    { 'me.id' =&amp;gt; 1 },                                ## WHERE
    { prefetch =&amp;gt; [ 'path' ] }                       ## JOIN AND SELECT. NB: Rel name!

&lt;/pre&gt;
		&lt;p&gt;This creates a &lt;a href=&quot;http://search.cpan.org/perldoc?DBIx::Class::ResultSet&quot;&gt;DBIx::Class::ResultSet&lt;/a&gt;, to retrieve the actual Row object:&lt;/p&gt;
&lt;pre&gt;  my $namerow = $name_rs-&amp;gt;next;

&lt;/pre&gt;
		&lt;p&gt;The following SQL is executed:&lt;/p&gt;
&lt;pre&gt;  SELECT me.ID, me.Name, me.LangID, me.PathID, path.ID, path.Path, path.Parent, path.Position, path.MenuID FROM Name me  JOIN Path path ON ( path.ID = me.PathID ) WHERE ( me.id = ? ): '1'




&lt;/pre&gt;
		&lt;p&gt;As with the find, the data is retrieved using the column-name
accessors. To retrieve a Row object representing the path:&lt;/p&gt;
&lt;pre&gt;  my $pathrow = $namerow-&amp;gt;path;

  my $actualpath = $pathrow-&amp;gt;path;   ## companyinfo/careers/jp
  my $pathparent = $pathrow-&amp;gt;parent; ## 36

&lt;/pre&gt;
		&lt;p&gt;To fetch just a few columns:&lt;/p&gt;
&lt;pre&gt;  my $name_rs = $schema-&amp;gt;resultset('Name')-&amp;gt;search(
    { 'me.id' =&amp;gt; 1 },                                ## WHERE
    { 
      select   =&amp;gt; [ qw/id name/ ],                   ## SELECT
      as       =&amp;gt; [ qw/id name/ ],
    }

&lt;/pre&gt;
		&lt;p&gt;This will only select the ID and Name columns. The &lt;code&gt;as&lt;/code&gt; attribute names the columns.&lt;/p&gt;
		&lt;p&gt;To add more complex conditions:&lt;/p&gt;
&lt;pre&gt;  ## All names where the patch matches '/support%'
  my $name_search = $schema-&amp;gt;resultset('Name')-&amp;gt;search(
    {
      'path.path' =&amp;gt; { 'like' =&amp;gt; '/support/%' },  ## WHERE path.path LIKE '/support/%'
    },
    { 
      'join' =&amp;gt; [ 'path' ],                       ## JOIN
    }

&lt;/pre&gt;

&lt;/div&gt;
&lt;h1 id=&quot;INSERTING_DATA&quot;&gt;INSERTING DATA&lt;/h1&gt;
&lt;div id=&quot;INSERTING_DATA_CONTENT&quot;&gt;
		&lt;p&gt;To insert new rows, call &lt;code&gt;create&lt;/code&gt; on a ResultSet object. This will
first instantiate a new Row object, then call &lt;code&gt;insert&lt;/code&gt; on it. This
can be done individually if needed.&lt;/p&gt;
&lt;pre&gt;  ## INSERT INTO .. 
  my $newname = $schema-&amp;gt;resultset('Name')-&amp;gt;create(
  {
     name   =&amp;gt; 'Support',
     pathid =&amp;gt; $pathid,
     langid =&amp;gt; $langid,
  });
  print $newname-&amp;gt;in_storage();  ## 1 (TRUE)

  my $newpath = $schema-&amp;gt;resultset('Path')-&amp;gt;new(
  {
     path =&amp;gt; 'support',
  });
  print $newpath-&amp;gt;in_storage();  ## 0 (FALSE)
  $newpath-&amp;gt;insert();
  print $newpath-&amp;gt;in_storage();  ## 1 (TRUE)

&lt;/pre&gt;

&lt;/div&gt;
&lt;h1 id=&quot;CHANGING_DATA&quot;&gt;CHANGING DATA&lt;/h1&gt;
&lt;div id=&quot;CHANGING_DATA_CONTENT&quot;&gt;

&lt;/div&gt;
&lt;h2 id=&quot;Updating_one_row&quot;&gt;Updating one row&lt;/h2&gt;
&lt;div id=&quot;Updating_one_row_CONTENT&quot;&gt;
		&lt;p&gt;The column-name accessors used to fetch data from a row can also be
used to set new values, eg:&lt;/p&gt;
&lt;pre&gt;  ## Nonsensically change the language of a given Name row
  my $namerow = $schema-&amp;gt;resultset('Name')-&amp;gt;find({ name =&amp;gt; 'Japan' });
  $namerow-&amp;gt;langid(2);
  $namerow-&amp;gt;update;    ## UPDATE 

&lt;/pre&gt;

&lt;/div&gt;
&lt;h2 id=&quot;Updating_many_rows_with_a_resultset&quot;&gt;Updating many rows with a resultset&lt;/h2&gt;
&lt;div id=&quot;Updating_many_rows_with_a_resultset_&quot;&gt;
		&lt;p&gt;Create a resultset containing the condition to select all the rows to
update. Calling &lt;code&gt;update&lt;/code&gt; on the resultset will run the &lt;code&gt;UPDATE&lt;/code&gt;
command using the condition in the resultset.&lt;/p&gt;
&lt;pre&gt;  ## All name rows with value 'Evaluation'
  my $name_rs = $schema-&amp;gt;resultset('Name')-&amp;gt;search(
  {
    'me.name' =&amp;gt; 'Evaluation',
  });
  $name_rs-&amp;gt;update({ name =&amp;gt; 'Free Trial' });  ## UPDATE .. WHERE

&lt;/pre&gt;

&lt;/div&gt;
&lt;h3 id=&quot;Deleting_a_row&quot;&gt;Deleting a row&lt;/h3&gt;
&lt;div id=&quot;Deleting_a_row_CONTENT&quot;&gt;
		&lt;p&gt;Just call &lt;code&gt;delete&lt;/code&gt; on a &lt;code&gt;Row&lt;/code&gt; object.&lt;/p&gt;
&lt;pre&gt;  ## No more products/es !
  my $pathrow = $schema-&amp;gt;resultset('Path')-&amp;gt;find({ path =&amp;gt; 'products/es' });
  $pathrow-&amp;gt;delete;

&lt;/pre&gt;
		&lt;p&gt;This will also delete related rows that would otherwise be
inconsistent. It will remove them *after* the main row. This cascading
can be turned off on a relationship if necessary.&lt;/p&gt;

&lt;/div&gt;
&lt;h3 id=&quot;Delete_multiple_rows&quot;&gt;Delete multiple rows&lt;/h3&gt;
&lt;div id=&quot;Delete_multiple_rows_CONTENT&quot;&gt;
		&lt;p&gt;Call &lt;code&gt;delete&lt;/code&gt; on a ResultSet object instead. This will run a
&lt;code&gt;DELETE&lt;/code&gt; statement with a &lt;code&gt;WHERE&lt;/code&gt; clause, and will not cascade the
deletes.&lt;/p&gt;
&lt;pre&gt;  my $path_rs = $schema-&amp;gt;resultset('Path')-&amp;gt;search(
  {
    'me.path' =&amp;gt; 'products/es',
  });
  $path_rs-&amp;gt;delete;     ## DELETE .. WHERE 

&lt;/pre&gt;
		&lt;p&gt;To delete multiple rows with cascading, call &lt;code&gt;delete_all&lt;/code&gt; on the
ResultSet, which will delete each row and it's related rows
individually.&lt;/p&gt;
&lt;pre&gt;  $path_rs-&amp;gt;delete_all;    ## many DELETE statements

&lt;/pre&gt;

&lt;/div&gt;
&lt;h1 id=&quot;TODO&quot;&gt;TODO&lt;/h1&gt;
&lt;div id=&quot;TODO_CONTENT&quot;&gt;
		&lt;p&gt;Add some sorta table descriptions to this doc. &lt;/p&gt;
		&lt;p&gt;Patches and suggestions welcome.&lt;/p&gt;

&lt;/div&gt;
&lt;h1 id=&quot;AUTHOR&quot;&gt;AUTHOR&lt;/h1&gt;
&lt;div id=&quot;AUTHOR_CONTENT&quot;&gt;
		&lt;p&gt;Jess Robinson &amp;lt;castaway@desert-island.me.uk&amp;gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Mon, 24 Dec 2007 06:05:20 +0000</pubDate>
	<author>castaway@desert-island.me.uk (Jess Robinson)</author>
</item>
<item>
	<title>Perl.com: Memories of 20 Years of Perl</title>
	<guid isPermaLink="true">http://www.perl.com/pub/a/2007/12/21/20-years-of-perl.html?CMP=OTC-BD0016219291&amp;ATT=Memories+of+20+Years+of+Perl</guid>
	<link>http://www.perl.com/pub/a/2007/12/21/20-years-of-perl.html?CMP=OTC-BD0016219291&amp;ATT=Memories+of+20+Years+of+Perl</link>
	<description>&lt;a href=&quot;http://www.perl.com/pub/a/2007/12/21/20-years-of-perl.html?CMP=OTC-BD0016219291&amp;amp;ATT=Memories+of+20+Years+of+Perl&quot;&gt;&lt;img src=&quot;http://www.perl.com/standard-tiles/perl/111-alpaca.jpg&quot; style=&quot;padding-right: 5px;&quot; align=&quot;left&quot; height=&quot;91px&quot; width=&quot;111px&quot; alt=&quot;tile image&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;The Perl community just celebrated the 20th anniversary of Perl. Here are some stories from Perl hackers around the world about problems they've solved and memories they've made with the venerable, powerful, and still vital language.</description>
	<pubDate>Fri, 21 Dec 2007 21:59:29 +0000</pubDate>
</item>
<item>
	<title>Chris Dolan: Fuse, PDF and PAR</title>
	<guid isPermaLink="true">http://use.perl.org/~ChrisDolan/journal/35173?from=rss</guid>
	<link>http://use.perl.org/~ChrisDolan/journal/35173?from=rss</link>
	<description>Last week I &lt;a href=&quot;http://www.chrisdolan.net/madmongers/par-fuse-pdf.html&quot;&gt;presented a fun topic&lt;/a&gt; to the &lt;a href=&quot;http://madmongers.org/&quot;&gt;Madison Perl Mongers&lt;/a&gt;: I created a user-mode filesystem that treats PDF files as disk images, and I packaged it with PAR.&lt;br /&gt;&lt;br /&gt;For the demonstration, I wrote a quick-and-dirty &lt;a href=&quot;http://www.chrisdolan.net/Fuse-PDF/Fuse-PDF-App.dmg&quot;&gt;Mac GUI front end&lt;/a&gt;.  It probably works only on 10.4 (I didn't test 10.5) and isn't as powerful as the Fuse-PDF &lt;a href=&quot;http://search.cpan.org/dist/Fuse-PDF/&quot;&gt;command line&lt;/a&gt;, but it's more accessible.&lt;br /&gt;</description>
	<pubDate>Fri, 21 Dec 2007 21:57:56 +0000</pubDate>
</item>
<item>
	<title>Andy Lester, OReilly: Perl 5.10 now available</title>
	<guid isPermaLink="true">http://www.oreillynet.com/onlamp/blog/2007/12/perl_510_now_available.html</guid>
	<link>http://www.oreillynet.com/onlamp/blog/2007/12/perl_510_now_available.html</link>
	<description>&lt;p&gt;
&lt;i&gt;This is a copy of &lt;a href=&quot;http://news.perlfoundation.org/2007/12/perl_510_now_available.html&quot;&gt;the official announcement&lt;/a&gt; about Perl 5.10&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
Today &lt;a href=&quot;http://www.perlfoundation.org/&quot;&gt;the Perl Foundation&lt;/a&gt;
announces the release of Perl 5.10, the
first major upgrade to the wildly popular dynamic programming
language in over five years.  This latest version builds on the
successful 5.8.x series by adding powerful new language features
and improving the Perl interpreter itself.  The Perl development
team, called the Perl Porters, has taken features and inspiration
from the ambitious &lt;a href=&quot;http://dev.perl.org/perl6/&quot;&gt;Perl 6&lt;/a&gt;
project, as well as from chiefly academic languages and blended
them with Perl’s pragmatic view to practicality and usefulness.
&lt;/p&gt;

&lt;h2&gt;Significant new language features&lt;/h2&gt;

&lt;p&gt;
The most exciting change is the new &lt;b&gt;smart match operator&lt;/b&gt;.
It implements a new kind of
comparison, the specifics of which are contextual based on the
inputs to the operator.  For example, to find if scalar &lt;tt&gt;$needle&lt;/tt&gt; is in array &lt;tt&gt;@haystack&lt;/tt&gt;,
simply use the new &lt;tt&gt;~~&lt;/tt&gt; operator:
&lt;/p&gt;
&lt;pre&gt;  if ( $needle ~~ @haystack ) ...
&lt;/pre&gt;
&lt;p&gt;
The result is that all comparisons now
just Do The Right Thing, a hallmark of Perl programming.
Building on the smart-match operator, Perl &lt;b&gt;finally gets a
&lt;tt&gt;switch&lt;/tt&gt; statement&lt;/b&gt;, and it goes far beyond the kind
of traditional &lt;tt&gt;switch&lt;/tt&gt; statement found in languages like
C, C++ and Java.
&lt;/p&gt;

&lt;p&gt;
Regular expressions are now far more powerful.  Programmers
can now use &lt;b&gt;named captures&lt;/b&gt; in regular expressions, rather than counting parentheses for 
positional captures.  Perl 5.10 also supports recursive patterns,
making many useful constructs, especially in parsing, now possible.
Even with these new features, the regular expression engine has
been tweaked, tuned and sped up in many cases.
&lt;/p&gt;

&lt;p&gt;
Other improvements include &lt;b&gt;state variables&lt;/b&gt; that allow variables to
persist between calls to subroutines; user defined pragmata that
allow users to write modules to influence the way Perl behaves; a
&lt;b&gt;defined-or operator&lt;/b&gt;; field hashes for inside-out objects and
&lt;b&gt;better error messages&lt;/b&gt;.
&lt;/p&gt;

&lt;h2&gt; Interpreter improvements &lt;/h2&gt;

&lt;p&gt;
It’s not just language changes.  The Perl interpreter itself is
&lt;b&gt;faster with a smaller memory footprint&lt;/b&gt;, and has several UTF-8 and
threading improvements.  The Perl &lt;b&gt;installation is now
    relocatable&lt;/b&gt;, a blessing for systems administrators and operating
system packagers.  The source code is more portable, and of course many
small bugs have been fixed along the way.  It all adds up to the best
Perl yet.
&lt;/p&gt;

&lt;p&gt;
For a list of all changes in Perl 5.10, see Perl 5.10’s &lt;a href=&quot;http://search.cpan.org/dist/perl-5.10.0/pod/perl5100delta.pod&quot;&gt;perldelta&lt;/a&gt; document included
with the source distribution.  For a gentler introduction of just the high points, the slides for 
Ricardo Signes’ &lt;a href=&quot;http://www.slideshare.net/rjbs/perl-510-for-people-who-arent-totally-insane&quot;&gt;Perl 5.10 For People Who Aren’t Totally Insane&lt;/a&gt; talk are well worth reading.
&lt;/p&gt;

&lt;p&gt;
Don’t think that the Perl Porters are resting on their laurels.
As Rafael Garcia-Suarez, the release manager for Perl 5.10, said:
“I would like to thank every one of the Perl Porters for their
efforts. I hope we’ll all be proud of what Perl is becoming, and
ready to get back to the keyboard for 5.12.”
&lt;/p&gt;

&lt;h2&gt; Where to get Perl &lt;/h2&gt;

&lt;p&gt;
Perl is a standard feature in almost every operating system today
except Windows.  Users who don’t want to wait for their operating
system vendor to release a package can dig into Perl 5.10 by
downloading it from CPAN, the Comprehensive Perl Archive Network,
at &lt;a href=&quot;http://search.cpan.org/dist/perl/&quot;&gt;http://search.cpan.org/dist/perl/&lt;/a&gt;,
or from the Perl home page at &lt;a href=&quot;http://www.perl.org/&quot;&gt;www.perl.org&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Windows users can also take advantage of the power of Perl by
compiling a source distribution from CPAN, or downloading one of
two easily installed binary distributions.
&lt;a href=&quot;http://strawberryperl.com&quot;&gt;Strawberry Perl&lt;/a&gt; is a community-built
binary distribution for Windows, and
&lt;a href=&quot;http://activestate.com&quot;&gt;ActiveState&lt;/a&gt;’s distribution is
free but commercially-maintained.  ActiveState’s distribution is available now, and Strawberry Perl’s is imminent.
&lt;/p&gt;</description>
	<pubDate>Fri, 21 Dec 2007 07:47:05 +0000</pubDate>
</item>
<item>
	<title>CPAN Watch: CPAN Watch is on hiatus</title>
	<guid isPermaLink="false">tag:perlbuzz.com,2007:/cpan-watch//4.261</guid>
	<link>http://feeds.feedburner.com/~r/PerlBuzzCpanWatch/~3/203829534/cpan-watch-is-on-hiatus.html</link>
	<description>&lt;p&gt;
The Perlbuzz section &lt;a href=&quot;http://perlbuzz.com/cpan-watch/&quot;&gt;CPAN Watch&lt;/a&gt; is going on an indefinite hiatus.  Kirrily Robert, Skud, who has driven CPAN Watch since its start, is moving to San Francisco from Australia, and just doesn't have the time to keep things going.
&lt;/p&gt;
&lt;p&gt;
I'll still be keeping you informed about cool new CPAN releases, but instead of CPAN Watch I'll be putting them in the &lt;a href=&quot;http://perlbuzz.com/mechanix/&quot;&gt;Mechanix&lt;/a&gt; section.  So, point your RSS/Atom readers over there for now.
&lt;/p&gt;
        
    &lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PerlBuzzCpanWatch/~4/203829534&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 21 Dec 2007 04:47:36 +0000</pubDate>
</item>
<item>
	<title>Lawrence Watt-Evans, Serials: The Books Have Been Ordered</title>
	<guid isPermaLink="true">http://www.ethshar.com/serials/?p=55</guid>
	<link>http://www.ethshar.com/serials/?p=55</link>
	<description>&lt;p&gt;I placed the print order for 400 copies of &lt;em&gt;The Vondish Ambassador&lt;/em&gt; this morning.  Got the proof copy yesterday, and found it good.&lt;/p&gt;
&lt;p&gt;This book is about the same format as the six Wildside Press reprints in the Ethshar series; I’m afraid it doesn’t match &lt;i&gt;The Spriggan Mirror&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, the books should be here in mid-January.  Sorry it couldn’t be in time for Christmas.
&lt;/p&gt;</description>
	<pubDate>Thu, 20 Dec 2007 19:24:15 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Perl 5.10.0 is out</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-6096704822492180681.post-6060741969147208095</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/202641891/perl-5100-is-out.html</link>
	<description>The news is beginning to propagate on the internet... &lt;a href=&quot;http://search.cpan.org/~rgarcia/perl-5.10.0/&quot;&gt;perl 5.10.0&lt;/a&gt; is out. My &lt;a href=&quot;http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2007-12/msg00414.html&quot;&gt;informal announcement&lt;/a&gt; was posted to perl5-porters yesterday, and it summarizes my views on the subject. Or, more concisely: I'm happy!&lt;br /&gt;&lt;br /&gt;I think I deserve a small vacation, and I'll be away in Nice for one week (the week of Christmas).&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/202641891&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 19 Dec 2007 21:42:01 +0000</pubDate>
</item>
<item>
	<title>Joshua Wehner, Comments: Comment on 'Safari vs. Safari: label'</title>
	<guid isPermaLink="false">http://blogs.thewehners.net/josh/comments/view/337-safari-vs-safari-label#439</guid>
	<link>http://blogs.thewehners.net/josh/posts/view/337-safari-vs-safari-label#comment_439</link>
	<description>&lt;strong&gt;Joshua said:&lt;/strong&gt;&lt;p&gt;Very useful, thanks Andre!&lt;/p&gt;</description>
	<pubDate>Tue, 18 Dec 2007 13:44:09 +0000</pubDate>
</item>
<item>
	<title>Joshua Wehner, Comments: Comment on 'Safari vs. Safari: label'</title>
	<guid isPermaLink="false">http://blogs.thewehners.net/josh/comments/view/337-safari-vs-safari-label#438</guid>
	<link>http://blogs.thewehners.net/josh/posts/view/337-safari-vs-safari-label#comment_438</link>
	<description>&lt;strong&gt;Andre Arko said:&lt;/strong&gt;&lt;p&gt;I use Multi-Safari, and it's great:  &lt;a href=&quot;http://michelf.com/projects/multi-safari/&quot;&gt;http://michelf.com/projects/multi-safari/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In 10.5.1 the older versions of Safari have problems, but a fixed copy of Safari 2.0.4 can be found here:  &lt;a href=&quot;http://tripledoubleyou.subtlegradient.com/stuff/Safari2/&quot;&gt;http://tripledoubleyou.subtlegradient.com/stuff/Safari2/&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 17 Dec 2007 03:11:16 +0000</pubDate>
</item>
<item>
	<title>CPAN Watch: CPAN::Dependencies 2.0 is out</title>
	<guid isPermaLink="false">tag:perlbuzz.com,2007:/cpan-watch//4.252</guid>
	<link>http://feeds.feedburner.com/~r/PerlBuzzCpanWatch/~3/200408366/cpandependencies-20-is-out.html</link>
	<description>David Cantrell &lt;a href=&quot;http://www.nntp.perl.org/group/perl.module-authors/2007/12/msg6133.html&quot;&gt;writes to the module-authors list&lt;/a&gt; about his new CPAN module dependency tracker:
&lt;blockquote&gt;
I've just uploaded CPAN::FindDependencies version 2 to the CPAN.  This
is pretty much a complete re-write which has lots of cool new Stuff:
&lt;ul&gt;
&lt;li&gt;uses Parse::CPAN::Packages instead of CPAN.pm, so loads faster and
 takes a lot less memory;
&lt;/li&gt;&lt;li&gt;much better core module detection;
&lt;/li&gt;&lt;li&gt;user can specify which version of perl to use when figuring out what's
 in core;
&lt;/li&gt;&lt;li&gt;can cache META.yml files and use a local 02packages file instead of
 fetching it from a CPAN mirror at startup;
&lt;/li&gt;&lt;li&gt;add 'maxdepth' parameter to limit how far down the dependency tree it
 goes;
&lt;/li&gt;&lt;li&gt; much better tests;
&lt;/li&gt;&lt;li&gt;'cpandeps' script is now documented
&lt;/li&gt;&lt;/ul&gt;
Why am I telling you this?  Cos, for the perl-qa folks, this will be the
new brane for http://cpandeps.cantrell.org.uk/ soon.  For the
module-authors list - the bundled 'cpandeps' program is a useful tool
for getting an idea of how much extra code gets pulled in when you make
your users install a dependency.  Re-using code is a Good Thing of
course, but taken to extremes it can be a real pain in the arse for
those for whom perl is just another environment that they have to
support on their machines.
&lt;/blockquote&gt;
&lt;p&gt;
&lt;a href=&quot;http://perlbuzz.com/2007/11/installing-a-module-do-you-feel-lucky.html&quot;&gt;I wrote about David's dependency checker&lt;/a&gt; before, and it's pretty slick.
        
    &lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PerlBuzzCpanWatch/~4/200408366&quot; height=&quot;1&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 14 Dec 2007 18:16:35 +0000</pubDate>
</item>
<item>
	<title>CPAN Watch: Find::Lib simplifies loading of libraries</title>
	<guid isPermaLink="false">tag:perlbuzz.com,2007:/cpan-watch//4.245</guid>
	<link>http://feeds.feedburner.com/~r/PerlBuzzCpanWatch/~3/197326375/findlib-simplifies-loading-of-libraries.html</link>
	<description>&lt;p&gt;
Yann Kerherve has released &lt;a href=&quot;http://search.cpan.org/dist/Find-Lib/&quot;&gt;Find::Lib&lt;/a&gt;, an alternate way of loading libraries in non-standard locations.  Find::Lib lets you specify paths like so:
&lt;/p&gt;
&lt;pre&gt;use base Find::Lib '../bootstrap/lib' =&amp;gt; 'My::Bootstrap', %param;
&lt;/pre&gt;
&lt;p&gt;
I'd love to hear from anyone who's used it and what they think.
&lt;/p&gt;
        
    &lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PerlBuzzCpanWatch/~4/197326375&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 08 Dec 2007 22:56:22 +0000</pubDate>
</item>
<item>
	<title>Rhesa Rozendaal: Squeezebox, with Perl</title>
	<guid isPermaLink="true">http://use.perl.org/~rhesa/journal/35065?from=rss</guid>
	<link>http://use.perl.org/~rhesa/journal/35065?from=rss</link>
	<description>Today, my Squeezebox (from &lt;a href=&quot;http://www.slimdevices.com/&quot;&gt;http://www.slimdevices.com/&lt;/a&gt;) arrived in the mail. Its streaming server is written in Perl :-)&lt;br /&gt;&lt;br /&gt;I've only glanced at the code, but it looks very well layed out, and uses great modules like TT2 and DBIx::Class. And it's all GPL'ed too, nice!&lt;br /&gt;&lt;br /&gt;If you're looking for a good quality, wireless media player, the Squeezebox should be on your list.&lt;br /&gt;</description>
	<pubDate>Sat, 08 Dec 2007 22:07:25 +0000</pubDate>
</item>
<item>
	<title>Chris Dolan: Recommended: krugle.org code search</title>
	<guid isPermaLink="true">http://use.perl.org/~ChrisDolan/journal/35031?from=rss</guid>
	<link>http://use.perl.org/~ChrisDolan/journal/35031?from=rss</link>
	<description>I recently had a &lt;a href=&quot;http://www.nntp.perl.org/group/perl.cpan.testers/2007/11/msg812452.html&quot;&gt;Solaris failure report&lt;/a&gt; from CPAN testers.  The failure report had errno.h numbers that I could not interpret, since I lack a Solaris 2.9 box.  I knew that Solaris was now open sourced, so I tried to look for errno.h via Google code search.  Blech, my google-fu was too weak.&lt;br /&gt;&lt;br /&gt;So I instead tried krugle.org.  I quickly found the OpenSolaris project, browsed the source code repository and found sys/errno.h.  Wow.&lt;br /&gt;&lt;br /&gt;It didn't solve my problem (alas, instead I need a new CPAN release with better failure diagnostics) but I was very impressed with the ease of use.&lt;br /&gt;&lt;br /&gt;I first learned about Krugle via the 2006 Chicago hackathon.  Ken Krugler bought us pizza and talked about getting better Perl/CPAN support into his product.</description>
	<pubDate>Mon, 03 Dec 2007 21:58:42 +0000</pubDate>
</item>
<item>
	<title>Thomas Tongue: From my iPhone</title>
	<guid isPermaLink="true">http://www.thomastongue.com/DotProduct/?p=375</guid>
	<link>http://www.thomastongue.com/DotProduct/?p=375</link>
	<description>&lt;p&gt;As I think most who have known me would have predicted, I stepped up to an iPhone several months ago. This post is authored from that device while I wait to get into the Dr.’s office with Ian. Entering text is certainly possible, though this is going to be a short post because its far from pleasant. Still, its a remarkable device that has reshaped the accessibility of information for me on many occasions. If it has one weakness, its the coupling with AT&amp;amp;T, whose service seems positively Neolithic compared to verizon…&lt;/p&gt;
&lt;p&gt;More on this topic later. (Told you this would be short)&lt;/p&gt;</description>
	<pubDate>Sat, 01 Dec 2007 22:19:27 +0000</pubDate>
</item>
<item>
	<title>Thomas Tongue: Doctor Who - The New Series</title>
	<guid isPermaLink="true">http://www.thomastongue.com/DotProduct/?p=374</guid>
	<link>http://www.thomastongue.com/DotProduct/?p=374</link>
	<description>&lt;p&gt;Peter wrote in and queried me about the new Doctor Who Series. He asked if someone new to the shows should start with Christopher Eccleston’s incarnation, OR just jump in at the beginning of David Tennant’s tenth Doctor. I figured I’d share my opinion here and give another plug for the new series, because it really is outstanding and a great deal of fun.&lt;/p&gt;
&lt;p&gt;Definitely start with Christopher Eccleston!&lt;/p&gt;
&lt;p&gt;There are a couple of good reasons for this actually, aside from the fact that he’s brilliant in the role and really brings out a very fresh, and somewhat tortured version of the Doctor to the audience. Tortured? Yeah, well you see… there was a war between the Daleks and the Timelords… simply called the Time War. A war so devastating that both sides seem to have been wiped out. So he’s dealing with a ton of survivor guilt, and is now alone in the universe. Which is fertile ground for the character to pick up some serious emotional depth, which Christopher Eccleston portrays very well.&lt;/p&gt;
&lt;p&gt;Alot of the history of what happens in that first season also plays out in the 2nd and 3rd season under David Tennant, who is also brilliant, so starting at the new beginning helps make sense of a number of things down the line.&lt;/p&gt;
&lt;p&gt;The 4th season starts in April of 2008 I believe, and then there will be at least a 1 year hiatus punctuated by 2 telefilms, and then the 5th season in 2010. On the one hand, that sucks, but it beats having the production crew and writers of the show quit or grow stale.&lt;/p&gt;</description>
	<pubDate>Sat, 01 Dec 2007 19:26:25 +0000</pubDate>
</item>
<item>
	<title>Andy Lester, OReilly: Perl gratitude, 2007</title>
	<guid isPermaLink="true">http://www.oreillynet.com/onlamp/blog/2007/11/perl_gratitude_2007.html</guid>
	<link>http://www.oreillynet.com/onlamp/blog/2007/11/perl_gratitude_2007.html</link>
	<description>&lt;p&gt; Here in the US, it’s Thanksgiving, a day of eating lots of food,
watching football, and sometimes, just sometimes, expressing gratitude
and giving thanks for those things that make life wonderful.  &lt;/p&gt;

&lt;p&gt; Here are the things I’m grateful for in late 2007, in no
particular order after the first.  &lt;/p&gt;


&lt;h2&gt;Google Code&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://code.google.com/hosting/&quot;&gt;Google’s project hosting
    service&lt;/a&gt; has been a godsend.  It’s changed the way I do open
source projects.  It has leapfrogged SourceForge for ease of
maintenance, and the bug tracker trumps &lt;a href=&quot;http://rt.cpan.org/&quot;&gt;RT
    for CPAN&lt;/a&gt; that we’ve been using for so long.  Add that to the
integration with Google Groups which makes it trivial to create
mailing lists, and it’s at the tops of my list for 2007.  I can’t
say enough good about it.&lt;/p&gt;

&lt;h2&gt;The readers of Perlbuzz&lt;/h2&gt;

&lt;p&gt;Eleven weeks ago, Skud and I started this little website called
&lt;a href=&quot;http://perlbuzz.com/&quot;&gt;Perlbuzz&lt;/a&gt; as an alternative to
the “more traditional outlets” for news in the Perl world.  The
response has been tremendous.  We get 600 RSS readers every day,
and have had over 10,000 unique visitors in that time.  It makes
me happy that our little venture is used and appreciated by the
community.&lt;/p&gt;

&lt;h2&gt;Test::Harness 3.0&lt;/h2&gt;

&lt;p&gt;It’s been over a year in the making, but the new version of &lt;a href=&quot;http://search.cpan.org/dist/Test-Harness/&quot;&gt;the crucial
    Test::Harness 3.0&lt;/a&gt; means more flexibility for module authors, and
lots of UI improvements for people who just want to run &lt;i&gt;prove&lt;/i&gt;
and &lt;i&gt;make test&lt;/i&gt;.&lt;/p&gt;

&lt;h2&gt;Mark Dominus&lt;/h2&gt;

&lt;p&gt;MJD is so much a fixture in Perl it’s easy to forget that he’s
there.  For 2007, though, never mind all the things he’s done for
Perl in the past, or the hours I’ve spent being enthralled in talks
of his.  His &lt;a href=&quot;http://blog.plover.com/&quot;&gt;Universe Of Discourse
    blog&lt;/a&gt; is the single most intelligent blog out there, and sometimes
it just happens to be about Perl.&lt;/p&gt;

&lt;h2&gt;Andy Armstrong&lt;/h2&gt;

&lt;p&gt;Was Andy Armstrong always around, or did I just not notice?  His
time and dedication spent on climbing on board with Ovid and Schwern
and the rest of the Test::Harness 3.0 crew has been invaluable in
getting it out.  Plus, he’s a really swell guy anyway.  &lt;/p&gt;

&lt;h2&gt;Dave Hoover&lt;/h2&gt;

&lt;p&gt;When I finally despaired of the amount of time and frustration
it took to organize content for &lt;a href=&quot;http://chicago.pm.org/&quot;&gt;Chicago.pm&lt;/a&gt;’s Wheaton meetings,
Dave Hoover stepped up and volunteered to take it over.  I’m thankful,
but not as much as I hope the other Chicago.pm folks are.&lt;/p&gt;

&lt;h2&gt;Perl::Critic&lt;/h2&gt;

&lt;p&gt;I’m all about having the machine keep an eye out for the stupid things
we do, and the goodness of &lt;a href=&quot;http://perlcritic.tigris.org/&quot;&gt;Perl::Critic&lt;/a&gt;
is always impressive.  You won’t like everything Perl::Critic says about your code,
but that’s OK.  It’s an entire framework for enforcing good Perl
coding practices.&lt;/p&gt;

&lt;h2&gt;The Perl Community in general&lt;/h2&gt;

&lt;p&gt;The Perl community is populated by some tremendous folks.  Some
names are more known than others, but these people help make daily
Perl life better for me.  In no particular order, I want to single
out Pete Krawczyk, Kent Cowgill, Elliot Shank, Liz Cortell, Jason
Crome, Yaakov Sloman, Michael Schwern, Andy Armstrong, Ricardo
Signes, Julian Cash, Jim Thomason, chromatic, Chris Dolan, Adam
Kennedy, Josh McAdams and of course Kirrily Robert.  If you think
you should be on this list, you’re probably right, and I just forgot.
&lt;/p&gt;

&lt;h2&gt;My wife, Amy Lester&lt;/h2&gt;

&lt;p&gt;Because even if she doesn’t understand this part of my life, she
at least understands its importance to me.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;
I’d love to hear back from any readers about what they’re thankful for.  I’m thinking about having a regular “Love Letters to Perl” column on &lt;a href=&quot;http://perlbuzz.com/&quot;&gt;Perlbuzz&lt;/a&gt; where people write about what they love in Perl.
&lt;/p&gt;</description>
	<pubDate>Fri, 23 Nov 2007 21:55:53 +0000</pubDate>
</item>
<item>
	<title>Pete Prodoehl: Asus Eee PC: First Impressions</title>
	<guid isPermaLink="true">http://rasterweb.net/raster/2007/11/22/asus-eee-pc-first-impressions/</guid>
	<link>http://rasterweb.net/raster/2007/11/22/asus-eee-pc-first-impressions/</link>
	<description>&lt;p&gt;
&lt;a href=&quot;http://www.flickr.com/photos/raster/2056614132/&quot; title=&quot;Asus Eee PC&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2075/2056614132_a45feb607e_m.jpg&quot; alt=&quot;Asus Eee PC&quot; width=&quot;179&quot; style=&quot;float: right; margin: 0 0 10px 10px; border: 1px #000 solid;&quot; height=&quot;240&quot; /&gt;&lt;/a&gt; I am typing this on my Apple keyboard, which is connected to my Asus Eee PC. The Eee PC is also connected to a old Apple VGA monitor running at 1152×864 (though there is a black border all around the screen.) I’m mainly testing the actual &lt;acronym title=&quot;Operating System&quot;&gt;OS&lt;/acronym&gt; right now, which happens to be &lt;a href=&quot;http://www.xandros.com/&quot;&gt;Xandros&lt;/a&gt;. It works pretty well.
&lt;/p&gt;
&lt;p&gt;
Xandros is pretty nice. I know &lt;a href=&quot;http://www.ubuntu.com/&quot;&gt;Ubuntu&lt;/a&gt; is the favorite OS of most desktop Linux people I know, but Xandros seems ok. I still need to customize the system a bit, but for now, it’s pretty functional. I’ve run Firefox, OpenOffice, Skype, ssh’d into a server, played with the webcam, and there is still much more to do.
&lt;/p&gt;
&lt;p&gt;
First, my gripes… On the tiny keyboard there does not seem to be a caps lock indicator, so you don’t know when the caps lock is on. If you’re typing text you can see, it may not be a big deal, but typing a password you see **** and have no idea if it’s uppercase or lowercase. (&lt;strong&gt;Note&lt;/strong&gt;: There is a caps lock indicator, but it’s on screen, I just didn’t notice it at first.) When I plugged in the external monitor it didn’t show immediately (it might be the Mac user in me that expected that) and I had to open a control panel to get it to show up. The trackpad button seemed like it took more pressure to click that it should. Maybe it will loosen up in time. I also need to get used to tapping on the trackpad to click, since I’ve never had a machine that supported that. (I may end up getting a small mouse to use with it.) I noticed the wife had used it to check her email (webmail) and I asked how she like it, her reply was “It was fine, expect for the small screen and hitting four keys when I wanted to hit one.” :)
&lt;/p&gt;
&lt;p&gt;
The kids think it very cool. They’ve already asked for their own, for Xmas, or when they go to high school or college. At some point I’ll let them use it and see what they think. They use Macs and Windows PC’s pretty often, so they might have a different perspective.
&lt;/p&gt;
&lt;p&gt;
Getting the wifi functional was a bit of work, but I will blame that on my network setup at home. (I’ve got a few old Macs connected via USB wifi adapters which complicate things.) I’m pretty sure the wifi is solid now, but we’ll see how it goes. (&lt;strong&gt;Update&lt;/strong&gt;: One thing I noticed was that I wasn’t waiting long enough after booting for it to connect. It just took another minute or so for the connection to be made, then all was good.) When I disconnected the external monitor, I couldn’t use the built in screen because everything was off screen, as it was displaying the LCD display at the resolution I had the external monitor running at, &lt;strong&gt;so another note&lt;/strong&gt;, be sure to set the display back properly for the internal LCD before you disconnect the external monitor.)
&lt;/p&gt;
&lt;p&gt;
Did I mention it’s tiny? You know it’s tiny, but until you see one in person and use it, you don’t appreciate how tiny it is. It seems funny right now to be using such a tiny computer with a full sized keyboard and a 17″ monitor. I’ll be bringing it with me to the next &lt;a href=&quot;http://web414.com/&quot;&gt;Web414 Meeting&lt;/a&gt; so you can see it in person.
&lt;/p&gt;
&lt;div style=&quot;display: none;&quot;&gt;
&lt;a href=&quot;http://technorati.com/tag/eeepc&quot; rel=&quot;tag&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://technorati.com/tag/laptop&quot; rel=&quot;tag&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://technorati.com/tag/xandros&quot; rel=&quot;tag&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Fri, 23 Nov 2007 13:02:30 +0000</pubDate>
</item>
<item>
	<title>Andy Lester: Perl gratitude, 2007</title>
	<guid isPermaLink="true">http://use.perl.org/~petdance/journal/34957?from=rss</guid>
	<link>http://use.perl.org/~petdance/journal/34957?from=rss</link>
	<description>&lt;p&gt; Here in the US, it's Thanksgiving, a day of eating lots of food,
watching football, and sometimes, just sometimes, expressing gratitude
and giving thanks for those things that make life wonderful.  &lt;/p&gt;

&lt;p&gt; Here are the things I'm grateful for in late 2007, in no
particular order after the first.  &lt;/p&gt;


Google Code

&lt;p&gt; &lt;a href=&quot;http://code.google.com/hosting/&quot;&gt;Google's project hosting
    service&lt;/a&gt; has been a godsend.  It's changed the way I do open
source projects.  It has leapfrogged SourceForge for ease of
maintenance, and the bug tracker trumps &lt;a href=&quot;http://rt.cpan.org/&quot;&gt;RT
    for CPAN&lt;/a&gt; that we've been using for so long.  Add that to the
integration with Google Groups which makes it trivial to create
mailing lists, and it's at the tops of my list for 2007.  I can't
say enough good about it.&lt;/p&gt;

The readers of Perlbuzz

&lt;p&gt;Eleven weeks ago, Skud and I started this little website called
&lt;a href=&quot;http://perlbuzz.com/&quot;&gt;Perlbuzz&lt;/a&gt; as an alternative to
the &quot;more traditional outlets&quot; for news in the Perl world.  The
response has been tremendous.  We get 600 RSS readers every day,
and have had over 10,000 unique visitors in that time.  It makes
me happy that our little venture is used and appreciated by the
community.&lt;/p&gt;

Test::Harness 3.0

&lt;p&gt;It's been over a year in the making, but the new version of &lt;a href=&quot;http://search.cpan.org/dist/Test-Harness/&quot;&gt;the crucial
    Test::Harness 3.0&lt;/a&gt; means more flexibility for module authors, and
lots of UI improvements for people who just want to run &lt;i&gt;prove&lt;/i&gt;
and &lt;i&gt;make test&lt;/i&gt;.&lt;/p&gt;

Mark Dominus

&lt;p&gt;MJD is so much a fixture in Perl it's easy to forget that he's
there.  For 2007, though, never mind all the things he's done for
Perl in the past, or the hours I've spent being enthralled in talks
of his.  His &lt;a href=&quot;http://blog.plover.com/&quot;&gt;Universe Of Discourse
    blog&lt;/a&gt; is the single most intelligent blog out there, and sometimes
it just happens to be about Perl.&lt;/p&gt;

Andy Armstrong

&lt;p&gt;Was Andy Armstrong always around, or did I just not notice?  His
time and dedication spent on climbing on board with Ovid and Schwern
and the rest of the Test::Harness 3.0 crew has been invaluable in
getting it out.  Plus, he's a really swell guy anyway.  &lt;/p&gt;

Dave Hoover

&lt;p&gt;When I finally despaired of the amount of time and frustration
it took to organize content for &lt;a href=&quot;http://chicago.pm.org/&quot;&gt;Chicago.pm&lt;/a&gt;'s Wheaton meetings,
Dave Hoover stepped up and volunteered to take it over.  I'm thankful,
but not as much as I hope the other Chicago.pm folks are.&lt;/p&gt;

Perl::Critic

&lt;p&gt;I'm all about having the machine keep an eye out for the stupid things
we do, and the goodness of &lt;a href=&quot;http://perlcritic.tigris.org/&quot;&gt;Perl::Critic&lt;/a&gt;
is always impressive.  You won't like everything Perl::Critic says about your code,
but that's OK.  It's an entire framework for enforcing good Perl
coding practices.&lt;/p&gt;

The Perl Community in general

&lt;p&gt;The Perl community is populated by some tremendous folks.  Some
names are more known than others, but these people help make daily
Perl life better for me.  In no particular order, I want to single
out Pete Krawczyk, Kent Cowgill, Elliot Shank, Liz Cortell, Jason
Crome, Yaakov Sloman, Michael Schwern, Andy Armstrong, Ricardo
Signes, Julian Cash, Jim Thomason, chromatic, Chris Dolan, Adam
Kennedy, Josh McAdams and of course Kirrily Robert.  If you think
you should be on this list, you're probably right, and I just forgot.
&lt;/p&gt;

My wife, Amy Lester

&lt;p&gt;Because even if she doesn't understand this part of my life, she
at least understands its importance to me.&lt;/p&gt;



&lt;p&gt;
I'd love to hear back from anyone about what they're thankful for.  I'm thinking about having a regular Perlbuzz &quot;Love Letters to Perl&quot; column where people write about what they love in Perl.
&lt;/p&gt;</description>
	<pubDate>Thu, 22 Nov 2007 21:56:19 +0000</pubDate>
</item>
<item>
	<title>Project Hum: Parrot 0.5.0 is out</title>
	<guid isPermaLink="false">tag:perlbuzz.com,2007:/project-hum//2.225</guid>
	<link>http://feeds.feedburner.com/~r/PerlBuzzProjectHum/~3/188494966/parrot-050-is-out.html</link>
	<description>&lt;p&gt;
The monthly &lt;a href=&quot;http://search.cpan.org/dist/parrot/&quot;&gt;Parrot release is out&lt;/a&gt;, version 0.5.0.  Included in this version:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Implementation&lt;/li&gt;
    &lt;ul&gt;
        &lt;li&gt;PDD15 (OO) branch merged with trunk; this release contains a working, tested implementation of the latest OO model&lt;/li&gt;
        &lt;li&gt;Added pop_eh/push_eh_p/count_eh opcodes&lt;/li&gt;
        &lt;li&gt;Add --runcore command line option&lt;/li&gt;
        &lt;li&gt;Add gcdebug runcore to help track down GC bugs&lt;/li&gt;
        &lt;li&gt;minor improvements to IA-32 JIT&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li&gt;Documentation
    &lt;ul&gt;
        &lt;li&gt;PDD19 (PIR): updates to macros, .pcc* directives&lt;/li&gt;
        &lt;li&gt;PDD25 (Concurrency): updated&lt;/li&gt;
        &lt;li&gt;PDD26 (AST):  draft approved&lt;/li&gt;
        &lt;li&gt;PDD23 (Exceptions): draft approved&lt;/li&gt;
        &lt;li&gt;Copyright cleanups&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;&lt;li&gt;Languages/Compilers
    &lt;ul&gt;
        &lt;li&gt;languages/APL: minor updates, PDD15 conformance&lt;/li&gt;
        &lt;li&gt;languages/dotnet: minor updates&lt;/li&gt;
        &lt;li&gt;languages/lua: minor updates, PDD15 conformance&lt;/li&gt;
        &lt;li&gt;languages/lisp: minor updates&lt;/li&gt;
        &lt;li&gt;languages/perl6: minor updates, PDD15 conformance&lt;/li&gt;
        &lt;li&gt;languages/plumhead: minor updates&lt;/li&gt;
        &lt;li&gt;languages/punie: minor updates, PDD15 conformance&lt;/li&gt;
        &lt;li&gt;languages/nqp: minor updates&lt;/li&gt;
        &lt;li&gt;languages/scheme: many updates, PDD15 conformance, improved tests, use PMCs instead of primitive registers to represent values&lt;/li&gt;
        &lt;li&gt;languages/tcl: bugfixes, PDD15 conformance&lt;/li&gt;
        &lt;li&gt;languages/WMLScript: minor updates&lt;/li&gt;
        &lt;li&gt;compilers/pirc: updates from PDD19, PDD06&lt;/li&gt;
        &lt;li&gt;compilers/pct: minor updates, PDD15 conformance&lt;/li&gt;
        &lt;li&gt;compilers/pge: PDD15 conformance&lt;/li&gt;
        &lt;li&gt;compilers/tge: PDD15 conformance&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;&lt;li&gt;Configuration
    &lt;ul&gt;
        &lt;li&gt;Improve test coverage&lt;/li&gt;
        &lt;li&gt;Improve reporting when a step fails; allow abort on failure&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;&lt;li&gt;Miscellaneous
    &lt;ul&gt;
        &lt;li&gt;More coding standard conformance, tests, cleanup, speedups, warnings cleanup&lt;/li&gt;
        &lt;li&gt;Bug cleanup, esp. GC bugs&lt;/li&gt;
        &lt;li&gt;Eliminate .imc extension (use .pir)&lt;/li&gt;
        &lt;li&gt;Simplify some core config steps to not allow interactive prompting&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;&lt;li&gt;Removed
    &lt;ul&gt;
        &lt;li&gt;clear_eh opcode&lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;


        
    &lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PerlBuzzProjectHum/~4/188494966&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 21 Nov 2007 21:37:41 +0000</pubDate>
</item>
<item>
	<title>Josh ben Jore: Perl 5 VM @ SPUG Tonight</title>
	<guid isPermaLink="true">http://use.perl.org/~jjore/journal/34939?from=rss</guid>
	<link>http://use.perl.org/~jjore/journal/34939?from=rss</link>
	<description>Tonight at SPUG I'm going to be talking about the Perl 5 Virtual Machine focusing on code aspects.&lt;br /&gt;&lt;br /&gt;The original slides can be read directly by KPresenter+Kivio at &lt;a href=&quot;http://diotalevi.isa-geek.net/~josh/Presentations/Perl%205%20VM.odp&quot;&gt;http://diotalevi.isa-geek.net/~josh/Presentations/Perl%205%20VM.odp&lt;/a&gt;, as a 8MB Ogg Theora video at &lt;a href=&quot;http://diotalevi.isa-geek.net/~josh/Presentations/Perl%205%20VM.ogg&quot;&gt;http://diotalevi.isa-geek.net/~josh/Presentations/Perl%205%20VM.ogg&lt;/a&gt; , or as a kind of sucky fallback HTML at &lt;a href=&quot;http://diotalevi.isa-geek.net/~josh/Presentations/Perl%205%20VM/html/slide_1.html&quot;&gt;http://diotalevi.isa-geek.net/~josh/Presentations/Perl%205%20VM/html/slide_1.htm l&lt;/a&gt;.</description>
	<pubDate>Tue, 20 Nov 2007 21:56:25 +0000</pubDate>
</item>
<item>
	<title>David Golden: Can you run Inline::C?  I need your help...</title>
	<guid isPermaLink="true">http://use.perl.org/~dagolden/journal/34919?from=rss</guid>
	<link>http://use.perl.org/~dagolden/journal/34919?from=rss</link>
	<description>&lt;p&gt;If you have or can install &lt;a href=&quot;http://search.cpan.org/perldoc?Inline::C&quot;&gt;Inline::C&lt;/a&gt;, I'd greatly appreciate
your help testing IO-CaptureOutput-1.05_53.&lt;/p&gt;

&lt;p&gt;I've recently adopted &lt;a href=&quot;http://search.cpan.org/perldoc?IO::CaptureOutput&quot;&gt;IO::CaptureOutput&lt;/a&gt;,
which is a wonderful tool for capturing program output to STDOUT or STDERR
without ties and regardless of whether the output comes from perl, XS or
programs in a subprocess.&lt;/p&gt;

&lt;p&gt;However, the tests for XS use Inline::C and the C
code was found to have portability problems (i.e. segfault on some Win32
platforms).  At least one fix for Microsoft Visual C++ (MSVC) then broke on someone else's
Linux platform.&lt;/p&gt;

&lt;p&gt; &lt;i&gt;(Aside: the fact that it it this hard to portably print the
equivalent of &quot;Hello World&quot; to STDOUT and STDERR just astonishes me.)&lt;/i&gt; &lt;/p&gt;

&lt;p&gt;My latest attempt at updating the C code now uses different code for MSVC
and other compilers and now I want to test this as far and as wide as I
can.&lt;/p&gt;

&lt;p&gt;So if you have installed Inline::C and something that can send
test reports (e.g.
&lt;a href=&quot;http://search.cpan.org/perldoc?CPAN::Reporter&quot;&gt;CPAN::Reporter&lt;/a&gt;),
please test IO-CaptureOutput-1.05_53.  For
example, from the CPAN shell:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;cpan&amp;gt; test DAGOLDEN/IO-CaptureOutput-1.05_53.tar.gz&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;Thank you very much,&lt;/p&gt;

&lt;p&gt;-- dagolden&lt;/p&gt;</description>
	<pubDate>Sun, 18 Nov 2007 21:56:08 +0000</pubDate>
</item>
<item>
	<title>John Wang: Whither Point Releases?</title>
	<guid isPermaLink="false">urn:uuid:e6677855-58d4-478d-8ec4-7ed1d978fc26</guid>
	<link>http://www.dev411.com/blog/2007/11/14/whither-point-releases</link>
	<description>&lt;p&gt;In the old software days with &lt;a href=&quot;http://en.wikipedia.org/wiki/Point_release&quot;&gt;point releases&lt;/a&gt;, major versions would increase from 1 to 2 to 3, etc. Releases in between major versions would point releases along the lines of 1.1, 1.2, 1.3 and smaller releases would be 1.1.1, 1.1.2, 1.1.3, etc. Then came along Windows 95 and the exit of sequential version numbers. With this naming scheme you really can't have Windows 95.1 so we now have Releases, along the lines of Oracle 11g Release 1 and Windows 2003 Server Release 2. You can pretty much guarantee that there isn't going to be an Oracle 11.1g ;)&lt;/p&gt;

&lt;p&gt;That's all fine and good from a marketing perspective if the reason is that we are now using a year or abbreviation instead of a simple integer but are there other technical reasons? I recently upgraded from Apache httpd 2.0.x to 2.2.x and the major thing that I encountered was that configuration had changed significantly and that I had to redo my conf files. I've spoken with some people that indicated many organizations are afraid of point releases for enterprise software because they often break things and are not necessarily smooth upgrades. This fit with my Apache httpd experience which got me thinking.&lt;/p&gt;

&lt;p&gt;If there exist enough backward compatibility problems with point releases, it would make sense that software publishers would want to avoid point releases (at least from a marketing perspective), when the release is backward compatible, e.g. Releases for former point releases, Service Packs for aggregated patches and the like. Has the single point (vs. double point) release come to mean that backward compatibility has been broken. If so, should it be avoided from a marketing perspective when backward compatibility still exists?&lt;/p&gt;</description>
	<pubDate>Wed, 14 Nov 2007 21:57:20 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Automated web screen shots with Perl</title>
	<guid isPermaLink="false">urn:uuid:829678746bcf7e466ae1a607174ea863</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/184536703/automated-web-screen-shots-with-perl</link>
	<description>&lt;p&gt;I've been looking for a program that will take full screen shots of web pages even when the web page is larger than the window size on my physical screen, requiring scrolling. This morning I found such a program in Petr Šmejkal's &lt;a href=&quot;http://search.cpan.org/~psme/Win32-CaptureIE-1.30/CaptureIE.pm&quot; class=&quot;fix&quot;&gt;Win32::CaptureIE&lt;/a&gt; when it was mentioned by Displeaser on &lt;a href=&quot;http://forums.devshed.com&quot;&gt;DevShed Forums&lt;/a&gt; in the &quot;&lt;a href=&quot;http://forums.devshed.com/perl-programming-6/screenshot-of-webpage-370275.html&quot;&gt;Screenshot of webpage&lt;/a&gt;&quot; thread. It uses ImageMagick for image manipulation.&lt;/p&gt;

&lt;p&gt;From reading the &lt;span class=&quot;fix&quot;&gt;Win32::CaptureIE&lt;/span&gt; POD, the CapturePage function does exactly what I want:&lt;/p&gt;

&lt;div class=&quot;quote_simple&quot;&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;CapturePage ( )&lt;/strong&gt; Captures whole page currently loaded in the Internet Explorer window. Only the page content will be captured - no window, no scrollbars. If the page is smaller than the window only the occupied part of the window will be captured. If the page is longer (scrollbars are active) the function will capture the whole page step by step by scrolling the window content (in all directions) and will return a complete image of the page.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;After installing ImageMagick, &lt;span class=&quot;fix&quot;&gt;Image::Magick&lt;/span&gt; and &lt;span class=&quot;fix&quot;&gt;Win32::CaptureIE&lt;/span&gt; on my Windows / ActiveState Perl system, I generated &lt;a href=&quot;http://www.dev411.com/images/articles/200607/dev411blog_win32captureie.png&quot;&gt;this screen shot&lt;/a&gt; with the following short program using no additional processing:&lt;/p&gt;

&lt;pre&gt;#!perl
use strict; use warnings;
use Win32::CaptureIE;

StartIE( width =&amp;gt; 900 );
Navigate( 'http://www.dev411.com/blog/' );

my $img = CapturePage();
$img-&amp;gt;Write( 'capture.png' );
QuitIE;&lt;/pre&gt;

&lt;p&gt;Perl and CPAN continue to amaze me with their treasure trove of functionality. Are there  similar tools for using Firefox, Linux, other image libraries or languages?&lt;/p&gt;

&lt;div class=&quot;update&quot;&gt;&lt;p&gt;&lt;b&gt;UPDATE:&lt;/b&gt; ishnid has found two programs with CLIs (posted to the same thread):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://khtml2png.sourceforge.net/&quot;&gt;khtml2png&lt;/a&gt; on SourceForge. This is a command-line program that looks like it can be run without a browser. It uses &lt;span class=&quot;fix&quot;&gt;libkhtml&lt;/span&gt; (used by Konqueror) and ImageMagick's &lt;span class=&quot;fix&quot;&gt;convertn&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pearlcrescent.com/products/pagesaver/&quot;&gt;Pearl Crescent Page Saver&lt;/a&gt;, a commercial app but available in a free version. This is a Firefox extension and requires the browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;UPDATE 2:&lt;/b&gt;: I recently tried Win32::CaptureIE with ImageMagick 6.3.0 and it doesn't work. Apparently there used to be a link to &quot;PerlMagick&quot; in older versions of ImageMagick that may not exist anymore. Unfortunately Win32::CaptureIE relies on PerlMagick.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;UPDATE 3:&lt;/b&gt;: I just tried the free version of Pearl Crescent with Firefox 1.5.0.7 which it says it should support but I get a &quot;Download error&quot; with pageserverbasic-1.3.xpi.&lt;/p&gt;

&lt;/div&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/184536703&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 14 Nov 2007 21:42:01 +0000</pubDate>
</item>
<item>
	<title>Thomas Tongue, Comments: Comment on iChatAV - Can ya feel the luv? by Dot Product  » Blog Archive   » WebEx, Skype and SkypeOut…</title>
	<guid isPermaLink="true">http://www.thomastongue.com/DotProduct/?p=334#comment-26804</guid>
	<link>http://www.thomastongue.com/DotProduct/?p=334#comment-26804</link>
	<description>&lt;p&gt;[…] I’m spending some time trying various tools like iChatAV (which I’ve mentioned previously), WebEx, and Skype (Download Skype For Windows).  	 WebEx is the heavywe […]&lt;/p&gt;</description>
	<pubDate>Tue, 13 Nov 2007 21:59:36 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Comparing CPAN Modules with YUI DataTable</title>
	<guid isPermaLink="false">urn:uuid:ae818063-2322-4837-b2a9-4bed5ff26768</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/182077162/comparing-cpan-modules-with-yui-datatable</link>
	<description>&lt;p&gt;There is a lot of choice on the CPAN for open source Perl libraries and sometimes it's difficult to get an idea of how modules compare to each other. &lt;a href=&quot;http://ratings.cpan.org&quot;&gt;CPAN Ratings&lt;/a&gt; is a good source of reviews but it's not convenient to compare one module with another. To provide a partial solution, I whipped up a quick &lt;a href=&quot;http://www.dev411.com/perl/cpancompare&quot;&gt;CPAN Compare&lt;/a&gt; page which will pull the CPAN Ratings from a number of modules and summarize them for you.&lt;/p&gt;

&lt;div&gt;&lt;a href=&quot;http://www.dev411.com/perl/cpancompare/&quot;&gt;&lt;img src=&quot;http://www.dev411.com/images/articles/cpan_compare_ss_400x.png&quot; alt=&quot;CPAN Compare Modules&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;I decided to use &lt;a href=&quot;http://developer.yahoo.com/yui/datatable/&quot;&gt;YUI DataTable&lt;/a&gt; for this. I've heard good things about YUI so I decided to give it a try. Getting the example code to work off of the Yahoo website almost as straight forward as say using Scriptaculous demos but it was faster than working with Dojo in the early days. The nice thing about the DataTable is that it takes a JavaScript array which can be populated using server-side JSON generated code. I used JSON::XS for this.&lt;/p&gt;

&lt;p&gt;YUI DataTable has a nice sorting feature and it can sort on text, numbers, dates, etc. However, it does not seem to be able to sort on visual information only so if you include HTML markup, that will be used for sorting as well. To get around this I used standard text sorting and customized the title fields to assist in the sorting. For example, in a link, I start with &amp;lt;a title=&quot; instead of &amp;lt;a href=&quot; because title is arbitrary and can be used to mirror the InnerHTML. For numbers a text sort will have 25 come before 4 so I added leading zeros to numbers using sprintf and put them in the title attribute as well.&lt;/p&gt;

&lt;p&gt;A few Perl modules and the Logo Creator website made this easy to set up. YUI DataTable has a nice default CSS so I just left that as is.&lt;/p&gt;

&lt;p&gt;Note: YUI DataTable is convenient if you just drop in a Perl data structure and have it generate the HTML and JS for you. This script uses 3 DataTables (ratings, popular and recent) so I wrote a Perl wrapper for YUI which takes a hashref and generates the client code, extracting the fields from the column definitions. This works because YUI does not require the HTML table to be built beforehand. By not having an underlying table, it's faster to get running but also won't fallback as nicely for people who aren't running JS (8% of users?). As an alternative, jQuery has a &lt;a href=&quot;ttp://ideamill.synaptrixgroup.com/jquery/tablefilter/tabletest.htm&quot;&gt;couple&lt;/a&gt; of &lt;a href=&quot;http://tablesorter.com/docs/#Demo&quot;&gt;add ons&lt;/a&gt; which work by enhancing an existing HTML table. jQuery has some nice syntax but I haven't gotten around to using it yet. Perhaps it's worth a look.&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/182077162&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 09 Nov 2007 21:42:00 +0000</pubDate>
</item>
<item>
	<title>Andy Lester: ack 1.70 adds context and line-specific matching</title>
	<guid isPermaLink="true">http://use.perl.org/~petdance/journal/34832?from=rss</guid>
	<link>http://use.perl.org/~petdance/journal/34832?from=rss</link>
	<description>&lt;p&gt;
ack, my replacement for grep for 95% of the times programmers use grep, just got &lt;a href=&quot;http://search.cpan.org/dist/ack&quot;&gt;released to CPAN with version 1.70&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
At long last, you can now get contextual lines before and after matched lines, just like GNU grep's -A, -B and -C options.  You can also match on a specific line number or range of line numbers with the new --line option. For example, if you want to see the first line of every Perl file in a tree, you'd just do &lt;tt&gt;ack --line=1 --perl&lt;/tt&gt;.  Thanks very much to Torsten Biix for putting both these features together for me.&lt;/p&gt;
&lt;p&gt;
Finally, Elliot Shank pointed out that one of my favorite features, the &lt;tt&gt;-1&lt;/tt&gt; option, was never documented.  Now it is.  The &lt;tt&gt;-1&lt;/tt&gt; option says &quot;stop after the first match of any type.&quot;  If you find yourself acking for lines, or searching for a specific file with &lt;tt&gt;ack -g&lt;/tt&gt; and then having to Ctrl-C to stop the search process, just add a &lt;tt&gt;-1&lt;/tt&gt; and Ctrl-C no longer.
&lt;/p&gt;
&lt;p&gt;
ack is available in the &lt;a href=&quot;http://search.cpan.org/dist/ack&quot;&gt;ack distribution&lt;/a&gt; on CPAN, or by installing the module App::Ack from the CPAN shell.  You can also download the &lt;a href=&quot;http://ack.googlecode.com/svn/tags/latest/ack-standalone&quot;&gt;single-file version&lt;/a&gt; direct from Subversion and drop it right into your ~/bin directory.&lt;/p&gt;</description>
	<pubDate>Mon, 05 Nov 2007 21:56:29 +0000</pubDate>
</item>
<item>
	<title>Josh ben Jore: B-Generate 1.11 passes tests on 5.10</title>
	<guid isPermaLink="true">http://use.perl.org/~jjore/journal/34833?from=rss</guid>
	<link>http://use.perl.org/~jjore/journal/34833?from=rss</link>
	<description>Figured I'd tell you all. It's on CPAN now.</description>
	<pubDate>Mon, 05 Nov 2007 21:56:29 +0000</pubDate>
</item>
<item>
	<title>Glenn Loos-Austin: Fun: Be Warned</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-8996988.post-6835900315325540861</guid>
	<link>http://junkchest.blogspot.com/2007/11/fun-be-warned.html</link>
	<description>&lt;table width=&quot;300&quot; align=&quot;center&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p style=&quot;font-size: x-small; text-align: center;&quot;&gt;&lt;a href=&quot;http://sooniwillbeinvincible.com/maps/activitymap.php&quot;&gt;check the Metahuman Activity Map&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td height=&quot;189&quot;&gt;&lt;p style=&quot;font-size: large; font-weight: bold; padding-top: 40px; color: #000066; text-align: center;&quot;&gt;Glenn Loos-Austin&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p style=&quot;font-size: x-small; text-align: center;&quot;&gt;&lt;a href=&quot;http://sooniwillbeinvincible.com/&quot;&gt;SoonIWillBeInvincible.com&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description>
	<pubDate>Mon, 05 Nov 2007 20:32:53 +0000</pubDate>
</item>
<item>
	<title>Project Hum: How to debug memory problems in Parrot</title>
	<guid isPermaLink="false">tag:perlbuzz.com,2007:/project-hum//2.203</guid>
	<link>http://feeds.feedburner.com/~r/PerlBuzzProjectHum/~3/178563394/how-to-debug-memory-problems-in-parrot.html</link>
	<description>&lt;p&gt;
chromatic has a couple of cool articles on tracking down segfaults in Parrot that valgrind just can't find.  Along the way, he talks about memory management methods and Parrot's pluggable garbage collection system, and shows off his &lt;tt&gt;gdb&lt;/tt&gt;-fu.
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.oreillynet.com/onlamp/blog/2007/10/debugging_gc_problems_in_parro.html&quot;&gt;Part 1&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.oreillynet.com/onlamp/blog/2007/10/how_to_debug_a_gc_problem_in_p.html&quot;&gt;Part 2&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;
        
    &lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PerlBuzzProjectHum/~4/178563394&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 02 Nov 2007 04:27:53 +0000</pubDate>
</item>
<item>
	<title>Andrew Moore: How to Sneak Testing Into Your Devlopment Team</title>
	<guid isPermaLink="false">/~amoore/journal/30215?from=rss</guid>
	<link>http://use.perl.org/~amoore/journal/30215?from=rss</link>
	<description>There is a growing amount of material available about automated testing in the perl community. I have noticed that often times when an engineer reads an article or listens to a talk on this topic that he or she will respond either by giving a reason that they can't implement it in their workplace, or by asking how they can implement it in their specific workplace given some set of reasons that it's tough.&lt;br /&gt;&lt;br /&gt;In the past 10 months, I have transformed my huge mod_perl application from one with no unit tests to having about 50% test coverage. Each of the 7 engineers who have been on the team have used the tests and added to them. The application and the testing environment that I have for it are not perfect, but they're better than they were before, and they'll soon be better than they are now. I did it without issuing an edict requiring unit testing or by having management require it, or even know about it.&lt;br /&gt;&lt;br /&gt;Looking back on the progress, I don't really think it was that hard. In fact, I think that there were three main methods that I used to grow this testing system into what it is now. I've essentially tricked my peers (and myself) into becoming better programmers with these methods, and I'll bet that you can too.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Boiling a Frog&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;They say that you can put a frog in a pan of water, set it on the stove, and bring the water to a boil. This will cook the frog without it jumping out. If you drop the frog in hot water, he'll jump right out. Apparently, it's the sudden change in environment that scares the frog. It's probably not true, but I don't really care to try. Nonetheless, it makes a good analogy.&lt;br /&gt;&lt;br /&gt;When I started adding unit tests to my code, I didn't really see that it was necessary to convince all of the other members of my team to fully test their code. I knew that if I tested all of the code that I touched or added eventually we would have dozens and then hundreds of tests that tested parts of the whole application.&lt;br /&gt;&lt;br /&gt;As I wandered around the application fixing bugs and adding new features in my normal course of work, I would add unit tests. I knew that each time I checked in a test case the rest of the team would see the new code in the svn commit emails. They knew that unit tests were being added even if they didn't contribute to them. (You do have subversion set to send out emails with patches each time someone commits code, don't you?)&lt;br /&gt;&lt;br /&gt;Occasionally, someone checked in a change that broke a few tests when the nightly smokebot was run. I fixed the code or the tests, checked in the patch, and sent a mail to the developer that broke the test cases. I let him know that I made a small change to preserve backwards compatibility, or something like that and moved on. Eventually, the water boiled so to speak and a few other developers running the test suite themselves and adding tests to try out their new code. This meant that I was no longer the only one writing unit tests. The test suite was growing more quickly. That's powerful.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Ping-Pong Method&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The &quot;ping-pong&quot; method is another trick I used to build up our test suite. After I noticed another member of my team check in a new method for an object, I'll try to use it. I write a test case that instantiates the object and tries to call that method. Typically, I find a place where the documentation doesn't really match the behavior. So, I'll send over a mail to the author:&lt;br /&gt;&lt;br /&gt;&quot;Hey, Carl. I'm trying to use the new 'bark' method I saw that you just added to the Dog object, and I can't quite figure it out. The docs say that I can optionally pass a volume paramteter, but if I leave it out, the dog doesn't bark. Is it required, or should there be a default?&quot;&lt;br /&gt;&lt;br /&gt;Typically, they'll write back and say that there's something missing from the documentation or the code and often even check in a patch or mail one to me. I'll update the test cases that I'm working on and them check them in. Through this back and forth exchange, I can make sure that I understand most of the new code that goes into the application, that the code does what the original author expects it to do, and that there exist test cases to prove it. Knowing that I will be writing test cases for their code eventually started to encourage the other team members to write well-documented, usable code and eventually even their own test cases. After a few weeks of &quot;ping-pong&quot;, I'll bet most developers will start writing their own unit tests.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Ratchet Method&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Once the members of the team agreed for the most part that we should be writing test cases for our code and adhering to some kind of coding standard, I checked in a few tests that touch all of the files in the application. These test for violations of POD syntax and POD coverage and for violations tested by Perl::Critic.&lt;br /&gt;&lt;br /&gt;When I got started, of course, not all files could pass POD checks or Perl::Critic, so I listed these that failed and made them TODO tests. If a file passed Perl::Critic at level 5, but not severity level 4, I made sure that it was tested at 5 and added a TODO test for it at 4, or whatever level we're shooting for. When files are modified, if the new code causes to file to no longer pass a POD syntax or coverage test or a Perl::Critic test, a developer will know that he needs to clean up his code to match the level of quality that was already there. If a new file is added, since it won't be in the list of current exceptions, it will be required to pass all of the tests at the desired level.&lt;br /&gt;&lt;br /&gt;By creating tests like this that test current levels of some measure of code quality, I can ensure that new code added will not be worse than the current level. The tests act as a ratchet that constantly ensures new code is measured as good as or better than the current code.&lt;br /&gt;&lt;br /&gt;I think that these three methods are pretty good ways to inject unit testing into your application. At the very least, they're pretty good responses next time someone claims that they can't start writing unit tests for their code since not all members of the team have &quot;drunk the Kool-Aid&quot;. Now go start writing better code.&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 31 Oct 2007 20:57:19 +0000</pubDate>
</item>
<item>
	<title>Andy Lester: New WWW::Mechanize and Test::WWW::Mechanize spiffiness</title>
	<guid isPermaLink="true">http://use.perl.org/~petdance/journal/34802?from=rss</guid>
	<link>http://use.perl.org/~petdance/journal/34802?from=rss</link>
	<description>For those of you using Mech for your testing of your website:&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;    $agent-&amp;gt;content_contains( qr/\QEnter keyword(s)/ )&lt;br /&gt;        or $agent-&amp;gt;dump_all( \*STDERR );&lt;br /&gt; &lt;br /&gt;not ok 14 - Content contains '(?-xism:Enter\ keyword\(s\))'&lt;br /&gt;#   Failed test 'Content contains '(?-xism:Enter\ keyword\(s\))''&lt;br /&gt;#   at t/simple-search.t line 31.&lt;br /&gt;#     searched: &quot;&amp;lt;HTML&amp;gt;\x{0a}&amp;lt;HEAD&amp;gt;\x{0a}&amp;lt;TITLE&amp;gt;TitleTales&amp;amp;#153;&amp;lt;/TITLE&amp;gt;&amp;lt;/HEA&quot;...&lt;br /&gt;#   can't find: &quot;(?-xism:Enter\ keyword\(s\))&quot;&lt;br /&gt;/buttonsd/bisac2.gif&lt;br /&gt;/graphics/bar.gif&lt;br /&gt;POST http://hoops.flr.follett.com:2112/simpsearch.php [simsearch]&lt;br /&gt;  clickval=                      (hidden readonly)&lt;br /&gt;  searchwords=                   (text)&lt;br /&gt;  S=&amp;lt;UNDEF&amp;gt;                      (checkbox) [*&amp;lt;UNDEF&amp;gt;/off|on/Include Out of Print / Please Order Direct Titles]&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt; No longer do you have to do a $mech-&amp;gt;save_content() and then run mech-dump on it.  How has it taken me so long to put this stuff in there?</description>
	<pubDate>Wed, 31 Oct 2007 20:56:14 +0000</pubDate>
</item>
<item>
	<title>Project Hum: Curses::UI under new ownership</title>
	<guid isPermaLink="false">tag:perlbuzz.com,2007:/project-hum//2.199</guid>
	<link>http://feeds.feedburner.com/~r/PerlBuzzProjectHum/~3/176996442/cursesui-under-new-ownership.html</link>
	<description>Shawn Boyette has taken over &lt;a href=&quot;http://search.cpan.org/dist/Curses-UI/&quot;&gt;Curses::UI&lt;/a&gt; from Marcus Theissen.  He tells me that &quot;as of last night, I no longer consider the old CVS repository authoritative.&quot;  There hasn't been a release since late 2004, so Shawn will be injected new life into the module.  There's not yet a new public repository (I highly recommend using Google Code's services at &lt;a href=&quot;http://code.google.com&quot;&gt;code.google.com&lt;/a&gt;), and any new bugs or changes should get sent to Shawn.


        
    &lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PerlBuzzProjectHum/~4/176996442&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 30 Oct 2007 14:06:10 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Sporting Weekend of Woe</title>
	<guid isPermaLink="false">urn:uuid:0f9bfafa-80b0-11dc-a2fa-127d1316f3fc</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/173383242/sporting_weekend_of_woe</link>
	<description>&lt;p&gt;This weekend has been a sporting weekend of woe.  England lost in the Rugby World Cup Final, although of course I'm glad that we made it that far.  Young Mr. Hamilton failed to capture the drivers world championship in his first season, and Forest only managed a draw at home against Doncaster.&lt;/p&gt;
&lt;p&gt;Still, I guess Orient are once again winning, which is good.&lt;/p&gt;
&lt;p&gt;And on the bright side, the Montreal Canadiens recorded their first home win of the season.  And the New England Patriots continued their unbeaten season with a blow-out at Miami.&lt;/p&gt;
&lt;p&gt;Saturday Katrien and I were in Mont Tremblant for much of the day, trying to enjoy what will be our last weekend together for a while – Katrien will back on the European side of the pond for about six weeks, which is going to feel quite strange.  Her Visa has not yet come through, and until it does she can only spend six months out of the year here.  We want to make sure she can be here at Christmas, and that means spending some time out of the country now.  She's looking forward to being in London, but it will seem strange.&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/173383242&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 22 Oct 2007 20:22:23 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Calgary Open Source Systems Festival: The largest free technology event in Calgary</title>
	<guid isPermaLink="false">http://linoramirez.wordpress.com/2007/10/21/calgary-open-source-systems-festival-the-largest-free-technology-event-in-calgary/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/172922840/</link>
	<description>This coming weekend is the Calgary Open Source Systems Festival (COSSFest 2007). For those open source lovers and those curious about open source, this is a must attend event. By the way, I will be giving two talks: one on Machine Learning Development with Perl and another on Open Source Business Analytics.
Here is the official [...]&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/172922840&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 21 Oct 2007 20:41:49 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Help! My Brain Sack is Leaking!</title>
	<guid isPermaLink="false">urn:uuid:b90f8df6-7a05-11dc-b4cf-39e0737e64f5</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/169610653/help__my_brain_sack_is_leaking_</link>
	<description>&lt;p&gt;I was on my way to visit a client on Friday morning, just about getting caught in the morning rush hour traffic, and I started to develop a headache.&lt;/p&gt;
&lt;p&gt;It kept getting worse and worse, and the next thing I knew I started feeling nauseous.  &quot;This isn't good&quot; I thought looking for an exit, somewhere.  It kept on getting worse and worse, and just as my vision was starting to blur, I got to an exit.  I pulled off the freeway and into a gas station, where I vomited.&lt;/p&gt;
&lt;p&gt;&quot;Shit&quot; I thought.  I can't visit a client like this.  It must be something I ate.  I was really feeling terrible at this point.  My hands and feet were starting to feel numb, I was an hour from home, and I didn't know what to do.&lt;/p&gt;
&lt;p&gt;Nothing else for it, I need to get home.&lt;/p&gt;
&lt;p&gt;That's pretty much the last thing I remember from Friday morning.&lt;/p&gt;
&lt;p&gt;The next thing I really knew, I woke up in bed at home.  Apparently I had called the people I was supposed to be meeting and canceled, called home and said I was on my way, driven back, stumbled into the house, very lucidly told Katrien what was wrong, and then fallen asleep mid-sentence.&lt;/p&gt;
&lt;p&gt;This of course, was rather worrying.&lt;/p&gt;
&lt;p&gt;It turns out that I'm suffering from a Post-Dural Puncture Headache.&lt;/p&gt;
&lt;p&gt;I had an epidural to try to help my back on Thursday, and it didn't go very well.  What has happened is that the sack that contains the brain, spinal nerves, and all that goodness (known as the &quot;dura&quot;) got punctured by the needle while the epidural procedure was being performed.  The Cerebral-Spinal Fluid that surrounds the brain is leaking out of the sack through this hole, and that gives you a headache. When you are upright (either sitting or standing) it gets worse and worse, because of course the fluid that is remaining in the sack goes to the bottom, leaving a nice big air bubble around your brain where liquid is supposed to be…&lt;/p&gt;
&lt;p&gt;So I'm stuck lying down.  As long as I'm lying down it doesn't hurt too much, but as soon as I stand up it's like I've got the worst hangover ever.&lt;/p&gt;
&lt;p&gt;All the pain of getting drunk, but none of the pleasure.&lt;/p&gt;
&lt;p&gt;Apparently you can get a &quot;blood patch&quot; to help heal the puncture faster however, this involves taking blood and then injecting it above the puncture so that it forms a clot.  I'm not sure that I'm too keen on that to be honest.&lt;/p&gt;
&lt;p&gt;Right now I'm fed up of doctors, medicine, and anything to do with my insides.
&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/169610653&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 14 Oct 2007 20:42:15 +0000</pubDate>
</item>
<item>
	<title>Glenn Loos-Austin: Fun: Test Embed</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-8996988.post-984125288669715514</guid>
	<link>http://junkchest.blogspot.com/2007/10/test-embed.html</link>
	<description>UPDATE: &lt;br /&gt;Here's a new version that's in development (and might have some bugs):&lt;br /&gt;&lt;br /&gt;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;&lt;br /&gt;We added the ability to embed stories from storybridge.tv on other people's websites. This is a test of some embed code:&lt;br /&gt;&lt;br /&gt;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;&lt;br /&gt;Here's some more.&lt;br /&gt;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;&lt;br /&gt;and here's another:&lt;br /&gt;&lt;br /&gt;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;</description>
	<pubDate>Mon, 08 Oct 2007 20:57:08 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Battlestar Galactica</title>
	<guid isPermaLink="false">urn:uuid:7d1c9dac-7546-11dc-8a31-39e0737e64f5</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/166762082/battlestar_galactica</link>
	<description>&lt;p&gt;I've just finished watching Battlestar Galactica Season 3, and now I need to know what happens in season four.  Of course it doesn't air for another 5 weeks or so, but I'm genuinely curious, and will probably make the effort to watch it on TV provided that I know &lt;em&gt;what channel it airs on here!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Does anybody know where to look for BSG in Canada? Help! I can't wait until the DVD release in a years time!&lt;/p&gt;&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/166762082&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 08 Oct 2007 20:41:51 +0000</pubDate>
</item>
<item>
	<title>Ask Bjørn Hansen: use.perl.org atom feed</title>
	<guid isPermaLink="true">http://use.perl.org/~ask/journal/34622?from=rss</guid>
	<link>http://use.perl.org/~ask/journal/34622?from=rss</link>
	<description>The use.perl RSS feed is messed up in some particular way that makes Google Reader unable to parse it (at least it was a few days ago).&lt;br /&gt;&lt;br /&gt;I setup a Feedburner feed to parse it and output something cleaner:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://feeds.feedburner.com/useperl&quot;&gt;http://feeds.feedburner.com/useperl&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
  - ask</description>
	<pubDate>Sat, 06 Oct 2007 20:56:22 +0000</pubDate>
</item>
<item>
	<title>Elliot Shank: Writing configurable Perl::Critic Policies.</title>
	<guid isPermaLink="true">http://use.perl.org/~elliot/journal/34470?from=rss</guid>
	<link>http://use.perl.org/~elliot/journal/34470?from=rss</link>
	<description>&lt;p&gt;As of &lt;a href=&quot;http://search.cpan.org/dist/Perl-Critic/&quot;&gt;Perl::Critic&lt;/a&gt; 1.07, I would like to discourage the creation of constructors for Policies.  Instead, I would encourage the use of &lt;a href=&quot;http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy.pm#initialize_if_enabled&quot;&gt;P::C::Policy::initialize_if_enabled()&lt;/a&gt;.  The reasoning is twofold.
&lt;/p&gt; &lt;p&gt;
One, this allows initialization to be deferred to the point where we know that the policy is going to be used.  P::C::PolicyFactory always instantiates every Policy that it can find.  It is up to the P::C::Config object to filter that set down.  Primarily, this is an issue for Policies which dynamically load other modules.
&lt;/p&gt; &lt;p&gt;
Two, this method enables the Policy to decide for itself whether it should be enabled.  This means that a Policy that depends upon a module that might not be present can remove itself from the set that violates() gets called on, thus speeding things up because it isn't being called on every &lt;a href=&quot;http://search.cpan.org/dist/PPI/lib/PPI/Element.pm&quot;&gt;PPI::Element&lt;/a&gt;.
&lt;/p&gt; &lt;p&gt;
This originated from &lt;a href=&quot;http://use.perl.org/~ChrisDolan/&quot;&gt;Chris Dolan's&lt;/a&gt; work on the Perl Foundation grant to create the remaining Policies that can be implemented that enforce one of the ideas in &lt;a href=&quot;http://www.perlfoundation.org/perl5/index.cgi?PBP&quot;&gt;PBP&lt;/a&gt;.  Specifically, for &lt;a href=&quot;http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/Documentation/PodSpelling.pm&quot;&gt;Documentation::PodSpelling&lt;/a&gt;, but this change has been made to all the configurable core Policies.  In particular, this helps &lt;a href=&quot;http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/CodeLayout/RequireTidyCode.pm&quot;&gt;CodeLayout::RequireTidyCode&lt;/a&gt;.
&lt;/p&gt; &lt;p&gt;
Differences from a constructor other than the obvious first parameter:
&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;The configuration is passed in as a hashref and not a hash.&lt;/li&gt;
&lt;li&gt;initialize_if_enabled() returns a boolean specifying whether the Policy should be enabled.&lt;/li&gt;
&lt;/ol&gt;
 &lt;p&gt;
This is how the two above policies bow out.
&lt;/p&gt;</description>
	<pubDate>Mon, 17 Sep 2007 20:56:04 +0000</pubDate>
</item>
<item>
	<title>Andy Lester: Fatuousness</title>
	<guid isPermaLink="false">tag:petdance.com,2007:/blog//1.33</guid>
	<link>http://petdance.com/blog/2007/09/fatuousness.html</link>
	<description>Back on September 5th, I gave a talk to the &lt;a href=&quot;http://c-spin.net/&quot;&gt;Chicago Software Process Improvement Network&lt;/a&gt;.  It was 10 minutes, and it was called &quot;Lessons Learned From Open Source Software Development.&quot;  I just got my feedback back, and the comments are shown below:

&lt;ul&gt;
&lt;li&gt;Could we get a copy of the slides?
&lt;/li&gt;&lt;li&gt;interesting and informative
&lt;/li&gt;&lt;li&gt;Enthusiastic approach to open source
&lt;/li&gt;&lt;li&gt;Useful background.
&lt;/li&gt;&lt;li&gt;probably made the evening worth coming to.
&lt;/li&gt;&lt;li&gt;Enlightening!
&lt;/li&gt;&lt;li&gt;Lester was upbeat and interesting
&lt;/li&gt;&lt;li&gt;Excellent - interested in having this speaker again
&lt;/li&gt;&lt;li&gt;interesting topic, wouldn't mind learning more about it. Great slides.
&lt;/li&gt;&lt;li&gt;Amazing, friendly presentation of many great ideas
&lt;/li&gt;&lt;li&gt;interesting and fun but mostly a rant
&lt;/li&gt;&lt;li&gt;fatuous
&lt;/li&gt;&lt;li&gt;somewhat disjointed
&lt;/li&gt;&lt;li&gt;I like more
&lt;/li&gt;&lt;li&gt;controversial/interesting
&lt;/li&gt;&lt;li&gt;simple and effective
&lt;/li&gt;&lt;/ul&gt;

&quot;Fatuous&quot;?  dictionary.com says

&lt;ol&gt;
&lt;li&gt;foolish or inane, esp. in an unconscious, complacent manner; silly.
&lt;/li&gt;&lt;li&gt;unreal; illusory.
&lt;/li&gt;&lt;/ol&gt;

I would like to hear what I said that was fatuous.  I'm intrigued.  Alas, I shall never know.</description>
	<pubDate>Mon, 17 Sep 2007 02:16:56 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Machine Learning Development with Perl</title>
	<guid isPermaLink="false">http://linoramirez.wordpress.com/2007/09/11/machine-learning-development-with-perl/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/155160569/</link>
	<description>I just posted in PerlMonks a draft of a 45 minutes-long talk on Machine Learning Development with Perl. Here is an extract of that post:
————————————————–
Machine Learning Development with Perl
The development of machine learning applications can be seen as a three-phase process involving: preparation, modeling, and implementation (See Fig. 1).
As a developer, you have to move [...]&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/155160569&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 11 Sep 2007 20:22:11 +0000</pubDate>
</item>
<item>
	<title>Planet Perl: Presenting AranduCorp</title>
	<guid isPermaLink="false">http://linoramirez.wordpress.com/2007/09/10/presenting-aranducorp/</guid>
	<link>http://feeds.feedburner.com/~r/PlanetPerl/~3/154775564/</link>
	<description>AranduCorp is a consulting firm focused on helping organizations improve their business processes, marketing, and sales. AranduCorp offers training and consulting services on predictive analytics and will soon offer affordable predictive analytics software solutions for small and medium size businesses.
For more information visit:
AranduCorp’s Website
AranduCorp’s Blog&lt;img width=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/PlanetPerl/~4/154775564&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 11 Sep 2007 20:22:11 +0000</pubDate>
</item>
<item>
	<title>Elliot Shank: Lesson of the day: Readonly, Exporter, and subroutine sigils</title>
	<guid isPermaLink="true">http://use.perl.org/~elliot/journal/34377?from=rss</guid>
	<link>http://use.perl.org/~elliot/journal/34377?from=rss</link>
	<description>&lt;p&gt;
They don't get along.

&lt;/p&gt;&lt;p&gt;
As of the recent 1.07 release, &lt;code&gt;Perl::Critic&lt;/code&gt;, has started using &lt;code&gt;Readonly&lt;/code&gt; to be more more self-compliant with &lt;cite&gt;Perl Best Practices&lt;/cite&gt;.  We had been avoiding use of &lt;code&gt;constant&lt;/code&gt; for the reasons described in the book, but had not been willing to add the &lt;code&gt;Readonly&lt;/code&gt; dependency until now.

&lt;/p&gt;&lt;p&gt;
The &lt;code&gt;Perl::Critic&lt;/code&gt; coding standard has been to use sigils for subroutines in &lt;code&gt;@EXPORT_OK&lt;/code&gt;, etc. and import lists, but &lt;code&gt;Exporter&lt;/code&gt; treats them as optional.  And, in fact, there's code that strips them off (line 47 in v5.58).  I haven't figured out the commonality, but in a few environments, this fails spectacularly.  Once we removed the subroutine sigils from everywhere, the problems have gone.

&lt;/p&gt;&lt;p&gt;
Explicitness: 0, Keyboard laziness: 1.&lt;/p&gt;</description>
	<pubDate>Sun, 09 Sep 2007 20:56:22 +0000</pubDate>
</item>
<item>
	<title>John Wang: What is the best digital voice recorder (DVR)?</title>
	<guid isPermaLink="false">urn:uuid:a5700aab-990f-402d-a53f-9db94b34f19c</guid>
	<link>http://www.dev411.com/blog/2007/09/05/what-is-the-best-digital-voice-recorder-dvr</link>
	<description>&lt;img src=&quot;http://feeds.feedburner.com/images/articles/200709/olympus_ds-30_206x400.jpg&quot; style=&quot;float: right;&quot; /&gt;

&lt;p&gt;I just recently picked up a digital voice recorder (aka DVR, not to be confused with digital video recorders) for recording conference calls and meetings. In three short meetings I have become a true believer. I always taken detailed meeting notes but that was because I would write notes during the meeting. With a DVR, I can concentrate on running the call and going back to catch the details later.&lt;/p&gt;

&lt;p&gt;For my first DVR I picked up the Olympus DS-30 from FRYs. The benefits that I keyed in on where the large-looking stereo speakers and the noise reduction. Since this is my first DVR I was easily impressed by the utility of it. So far I've recorded and played back on the device, copied the WMA files off using it as a USB storage device on Win XP and converted the WMA to OGG Vorbis using dbPowerAmp. The only thing that doesn't seem to work is the CD that it came with. XP would not recognize it at all but at least I don't need since it doubles as a USB device.&lt;/p&gt;

&lt;p&gt;Although it meets my current notetaking requirements easily, I've been thinking about whether it'd be good to use for recording podcasts. My current issue is that it records in WMA and not a FOSS standard. After looking over a number of DVRs, it seems that the higher end ones use WMA, LPEC, DSS, etc. but not common music formats such as MP3 and OGG. What native format do you think is the best for DVRs? Is it fine to record as WMA and convert to OGG Vorbis or are there better options?&lt;/p&gt;

&lt;p&gt;I don't know too much about voice recorders at the moment so I'm easy to please. Which ones do you like and what are important features for you?&lt;/p&gt;</description>
	<pubDate>Wed, 05 Sep 2007 20:57:33 +0000</pubDate>
</item>
<item>
	<title>John Wang: Database Abstraction - code vs infrastructure</title>
	<guid isPermaLink="false">urn:uuid:fd57e1bd-e67a-47e8-96e7-2cffbf7b196a</guid>
	<link>http://www.dev411.com/blog/2007/09/04/database-abstraction-code-vs-infrastructure</link>
	<description>&lt;p&gt;I've worked on a number of database-driven projects and no matter how much people want database abstraction, it was always difficult to code and maintain. I was recently reminded of this when I read this &lt;a href=&quot;http://www.drupal4hu.com/node/64&quot; title=&quot;My stance on database abstraction&quot;&gt;Drupal article on dropping PostgreSQL support&lt;/a&gt;. Not only can it be difficult to maintain support for multiple databases, but it may be difficult to find developers.&lt;/p&gt;

&lt;p&gt;One solution of modern programming is to move database abstraction from the code to the infrastructure using a ORM (Object-Relational Mapper) or Data Mapper. A ORM and Data Mapper abstracts the database for you so you no longer have to do tie db abstraction to each app. Not only does it let you code once for multiple databases it lets your users migrate their data from one database to another. This blog runs Typo which is based on Ruby on Rails and ActiveRecord. I've been contemplating migrating Typo from MySQL to PostgreSQL and I've been told that it would be as simple as exporting the data with YAML, updating the database.yml file and importing the data. I haven't gotten around to doing it yet but it is a powerful idea. ActiveRecord is a data mapper and isn't as flexible as a full blown ORM but it gets the job done for the most part. For a full-blown ORM, I think of Perl's DBIx::Class which provides a full OO interface to the RDBMS allowing you to code just once for multiple DBs without limiting you when you want to use some esoteric database-specific SQL. DBIx::Class is often used with the Catalyst Framework but is also used by itself.&lt;/p&gt;

&lt;p&gt;There are PHP frameworks out there like Symfony and Cake but do any of them have stand-alone ORMs? If so, could Drupal move to something like that and solve their maintainership problems once and for all? Drupal is part of the &lt;a href=&quot;http://gophp5.org&quot;&gt;Go PHP5&lt;/a&gt; effort so there should be no issue using PHP 5 OO. Something to think about for the Drupal folks if a PHP ORM is available.&lt;/p&gt;</description>
	<pubDate>Wed, 05 Sep 2007 20:21:51 +0000</pubDate>
</item>

</channel>
</rss>

