<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <generator>Plagger/0.7.17</generator>
    <link>http://ironman.enlightenedperl.org/</link>
    <description>Perl Iron Man Competition</description>
    <title>Planet Perl Iron Man</title>
    <pubDate>Wed, 10 Mar 2010 04:26:26 -0000</pubDate>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100310/1268189518</link>
      <description>  *  github pages をつかうと簡単に HTML のページを公開できる。

  *  Doxygen をつかうと簡単に HTML のドキュメントを生成できる。

ってことは、この2つを簡単にくみあわせられれば最強じゃね?

ということでやってみた。

gh-pages branch の生成はいつものようにおこなう。

$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx

そしたら、master にもどして、gh-pages branch を docs/ という名前で submodule にする

$ git co master
$ git submodule add -b gh-pages `git remote -v|grep origin|awk '{print$2}'` docs

doxygen の設定ファイルの雛形をつくる(Doxyfile という名前のファイルができる)

$ doxygen -g 

Doxyfile を編集する。今回は以下のように変更した。

--- Doxyfile.org        2010-03-10 10:32:29.000000000 +0900
+++ Doxyfile    2010-03-10 10:49:52.000000000 +0900
@@ -137,7 +137,7 @@
 # comments will behave just like regular Qt-style comments
 # (thus requiring an explicit @brief command for a brief description.)
 
-JAVADOC_AUTOBRIEF      = NO
+JAVADOC_AUTOBRIEF      = YES
 
 # If the QT_AUTOBRIEF tag is set to YES then Doxygen will
 # interpret the first line (until the first dot) of a Qt-style
@@ -186,7 +186,7 @@
 # For instance, some of the names that are used will be different. The list
 # of all members will be omitted, etc.
 
-OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_FOR_C  = YES
 
 # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
 # sources only. Doxygen will then generate output that is more tailored for
@@ -297,7 +297,7 @@
 # Private class members and static file members will be hidden unless
 # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
 
-EXTRACT_ALL            = NO
+EXTRACT_ALL            = YES
 
 # If the EXTRACT_PRIVATE tag is set to YES all private members of a class
 # will be included in the documentation.
@@ -568,7 +568,7 @@
 # directories like "/usr/src/myproject". Separate the files or directories
 # with spaces.
 
-INPUT                  =
+INPUT                  = src/
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -591,7 +591,7 @@
 # should be searched for input files as well. Possible values are YES and NO.
 # If left blank NO is used.
 
-RECURSIVE              = NO
+RECURSIVE              = YES
 
 # The EXCLUDE tag can be used to specify files and/or directories that should
 # excluded from the INPUT source files. This way you can easily exclude a
@@ -684,7 +684,7 @@
 # Note: To get rid of all source code in the generated output, make sure also
 # VERBATIM_HEADERS is set to NO.
 
-SOURCE_BROWSER         = NO
+SOURCE_BROWSER         = YES
 
 # Setting the INLINE_SOURCES tag to YES will include the body
 # of functions and classes directly in the documentation.
@@ -767,7 +767,7 @@
 # If a relative path is entered the value of OUTPUT_DIRECTORY will be
 # put in front of it. If left blank `html' will be used as the default path.
 
-HTML_OUTPUT            = html
+HTML_OUTPUT            = docs/
 
 # The HTML_FILE_EXTENSION tag can be used to specify the file extension for
 # each generated HTML page (for example: .htm,.php,.asp). If it is left blank
@@ -983,7 +983,7 @@
 # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
 # generate Latex output.
 
-GENERATE_LATEX         = YES
+GENERATE_LATEX         = NO
 
 # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
 # If a relative path is entered the value of OUTPUT_DIRECTORY will be

このように変更すれば、doxygen コマンド一発で docs/ 以下にファイルができるので、あとは Makefile
なりなんなりに以下のような設定を追記する。perl で EU::MM をつかってる場合には postambles() に追加すればよい。

docs: src/*.c src/*.h Doxyfile
    doxygen &amp;&amp; cd docs/ &amp;&amp; git add . &amp;&amp; git ci -m 'updated docs' &amp;&amp; git push origin gh-pages &amp;&amp; cd .. &amp;&amp; git ci -m 'updated docs' docs/

たったこれだけで gh-pages に doxyfile おけるので楽でよいとおもった。</description>
      <dc:date>2010-03-10T11:51:58+09:00</dc:date>
      <title>Doxygen を github-pages にあげるのをお気楽にやる方法</title>
      <pubDate>Wed, 10 Mar 2010 11:51:58 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;ul&gt;
				&lt;li&gt; github pages をつかうと簡単に HTML のページを公開できる。&lt;/li&gt;
				&lt;li&gt; Doxygen をつかうと簡単に HTML のドキュメントを生成できる。&lt;/li&gt;
			&lt;/ul&gt;
			&lt;p&gt;ってことは、この2つを簡単にくみあわせられれば最強じゃね?&lt;/p&gt;
			&lt;p&gt;ということでやってみた。&lt;/p&gt;
			&lt;p&gt;gh-pages branch の生成はいつものようにおこなう。&lt;/p&gt;
&lt;pre&gt;
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx
&lt;/pre&gt;

			&lt;p&gt;そしたら、master にもどして、gh-pages branch を docs/ という名前で submodule にする&lt;/p&gt;
&lt;pre&gt;
$ git co master
$ git submodule add -b gh-pages `git remote -v|grep origin|awk &amp;#39;{print$2}&amp;#39;` docs
&lt;/pre&gt;

			&lt;p&gt;doxygen の設定ファイルの雛形をつくる(Doxyfile という名前のファイルができる)&lt;/p&gt;
&lt;pre&gt;
$ doxygen -g 
&lt;/pre&gt;

			&lt;p&gt;Doxyfile を編集する。今回は以下のように変更した。&lt;/p&gt;
&lt;pre&gt;
--- Doxyfile.org	2010-03-10 10:32:29.000000000 +0900
+++ Doxyfile	2010-03-10 10:49:52.000000000 +0900
@@ -137,7 +137,7 @@
 # comments will behave just like regular Qt-style comments
 # (thus requiring an explicit @brief command for a brief description.)
 
-JAVADOC_AUTOBRIEF      = NO
+JAVADOC_AUTOBRIEF      = YES
 
 # If the QT_AUTOBRIEF tag is set to YES then Doxygen will
 # interpret the first line (until the first dot) of a Qt-style
@@ -186,7 +186,7 @@
 # For instance, some of the names that are used will be different. The list
 # of all members will be omitted, etc.
 
-OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_FOR_C  = YES
 
 # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
 # sources only. Doxygen will then generate output that is more tailored for
@@ -297,7 +297,7 @@
 # Private class members and static file members will be hidden unless
 # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
 
-EXTRACT_ALL            = NO
+EXTRACT_ALL            = YES
 
 # If the EXTRACT_PRIVATE tag is set to YES all private members of a class
 # will be included in the documentation.
@@ -568,7 +568,7 @@
 # directories like &amp;#34;/usr/src/myproject&amp;#34;. Separate the files or directories
 # with spaces.
 
-INPUT                  =
+INPUT                  = src/
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -591,7 +591,7 @@
 # should be searched for input files as well. Possible values are YES and NO.
 # If left blank NO is used.
 
-RECURSIVE              = NO
+RECURSIVE              = YES
 
 # The EXCLUDE tag can be used to specify files and/or directories that should
 # excluded from the INPUT source files. This way you can easily exclude a
@@ -684,7 +684,7 @@
 # Note: To get rid of all source code in the generated output, make sure also
 # VERBATIM_HEADERS is set to NO.
 
-SOURCE_BROWSER         = NO
+SOURCE_BROWSER         = YES
 
 # Setting the INLINE_SOURCES tag to YES will include the body
 # of functions and classes directly in the documentation.
@@ -767,7 +767,7 @@
 # If a relative path is entered the value of OUTPUT_DIRECTORY will be
 # put in front of it. If left blank `html&amp;#39; will be used as the default path.
 
-HTML_OUTPUT            = html
+HTML_OUTPUT            = docs/
 
 # The HTML_FILE_EXTENSION tag can be used to specify the file extension for
 # each generated HTML page (for example: .htm,.php,.asp). If it is left blank
@@ -983,7 +983,7 @@
 # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
 # generate Latex output.
 
-GENERATE_LATEX         = YES
+GENERATE_LATEX         = NO
 
 # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
 # If a relative path is entered the value of OUTPUT_DIRECTORY will be
&lt;/pre&gt;

			&lt;p&gt;このように変更すれば、doxygen コマンド一発で docs/ 以下にファイルができるので、あとは Makefile なりなんなりに以下のような設定を追記する。perl で EU::MM をつかってる場合には postambles() に追加すればよい。&lt;/p&gt;
&lt;pre&gt;
docs: src/&amp;#42;.c src/&amp;#42;.h Doxyfile
    doxygen &amp;#38;&amp;#38; cd docs/ &amp;#38;&amp;#38; git add . &amp;#38;&amp;#38; git ci -m &amp;#39;updated docs&amp;#39; &amp;#38;&amp;#38; git push origin gh-pages &amp;#38;&amp;#38; cd .. &amp;#38;&amp;#38; git ci -m &amp;#39;updated docs&amp;#39; docs/
&lt;/pre&gt;

			&lt;p&gt;たったこれだけで gh-pages に doxyfile おけるので楽でよいとおもった。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-10T11:51:58+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://d.hatena.ne.jp/tokuhirom/20100310/1268189518</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100310/1268176476</link>
      <description>#perl-casual でみんながつかってる pod parser をきいてみた。

いろいろ

Pod::POM

おれがふだんつかってるやつ。POM っていうなまえだけど、単に 2html な機能しかつかってない。2html
な部分のカスタマイズが容易だったのでそのままつかってる。

Pod::Simple

yusukebe さんがつかってた

Pod::HTMLEmbed

typesterさんがつくったやつ。

Pod::Eventual by rjbs

charsbar さんはこれつかってるらしい

Pod::XHtml

lestrrat さんはこれつかってるらしい

まとめ

とりあえず移行する理由がないので Pod::POM をつかいつづけようかとおもいました。</description>
      <dc:date>2010-03-10T08:14:36+09:00</dc:date>
      <title>Pod パーザいろいろ</title>
      <pubDate>Wed, 10 Mar 2010 08:14:36 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;#perl-casual でみんながつかってる pod parser をきいてみた。&lt;/p&gt;
			&lt;h4&gt;いろいろ&lt;/h4&gt;
			&lt;h5&gt;Pod::POM&lt;/h5&gt;
			&lt;p&gt;おれがふだんつかってるやつ。POM っていうなまえだけど、単に 2html な機能しかつかってない。2html な部分のカスタマイズが容易だったのでそのままつかってる。&lt;/p&gt;
			&lt;h5&gt;Pod::Simple&lt;/h5&gt;
			&lt;p&gt;yusukebe さんがつかってた&lt;/p&gt;
			&lt;h5&gt;Pod::HTMLEmbed&lt;/h5&gt;
			&lt;p&gt;typesterさんがつくったやつ。&lt;/p&gt;
			&lt;h5&gt;Pod::Eventual by rjbs&lt;/h5&gt;
			&lt;p&gt;charsbar さんはこれつかってるらしい&lt;/p&gt;
			&lt;h5&gt;Pod::XHtml&lt;/h5&gt;
			&lt;p&gt;lestrrat さんはこれつかってるらしい&lt;/p&gt;
			&lt;h4&gt;まとめ&lt;/h4&gt;
			&lt;p&gt;とりあえず移行する理由がないので Pod::POM をつかいつづけようかとおもいました。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-10T08:14:36+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://d.hatena.ne.jp/tokuhirom/20100310/1268176476</guid>
    </item>
    <item>
      <author>nobody@example.com (Thomas Fahle)</author>
      <dc:creator>nobody@example.com (Thomas Fahle)</dc:creator>
      <category>101 cpan perl</category>
      <link>http://perl-howto.de/2010/03/taskkensho-die-besten-cpan-module-ausgewahlt-von-der-enlightened-perl-organization.html</link>
      <description>Das Comprehensive Perl Archive Network bietet aktuell 17.551 Module von
8.032 Autoren zur freien Verwendung an.

Zugegebenermaßen fällt einem die Auswahl nicht immer leicht.

Task::Kensho von Chris Prather vereinfacht die Auswahl deutlich, in dem
es eine Liste der besten und modernen CPAN-Module zur Verfügung stellt
und diese Module und deren Abhängigkeiten auch gleich installiert.

Die Auswahl der Module aus den Bereichen Testing, objektorientierte
Programmierung, asynchrone Programmierung, XML-Entwicklung, Web
Entwicklung, Webcrawler, Datum und Uhrzeit, Datenbank Programmierung,
Excel/CSV Entwicklung, E-Mail, Konfiguration und vielen weiteren wurde
von den Mitgliedern der Enlightened Perl Organization vorgenommen.

cpan&gt; install Task::Kensho


Siehe auch
----------

  * Task::Kensho

  * enlightened perl organisation

  * Wikipdia: Kenshō

  * http://github.com/gitpan/Task-Kensho

  * Task::Kensho RPMs

  * Perl-Programmierung: Nützliche Module

[IMAGE]</description>
      <dc:date>2010-03-10T00:00:01+01:00</dc:date>
      <dc:subject>101 cpan perl</dc:subject>
      <title>Task::Kensho - Die besten CPAN-Module ausgewählt von der Enlightened Perl Organization</title>
      <pubDate>Wed, 10 Mar 2010 00:00:01 +0100</pubDate>
      <content:encoded>
        &lt;p&gt;
Das &lt;a href="http://www.cpan.org/"&gt;Comprehensive Perl Archive Network&lt;/a&gt; bietet aktuell &lt;a href="http://search.cpan.org/"&gt;17.551 Module von 8.032 Autoren&lt;/a&gt; zur freien Verwendung an. 
&lt;/p&gt;
&lt;p&gt;
Zugegebenermaßen fällt einem die Auswahl nicht immer leicht.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://search.cpan.org/perldoc?Task::Kensho"&gt;Task::Kensho&lt;/a&gt; von &lt;a href="http://search.cpan.org/~perigrin/"&gt;Chris Prather&lt;/a&gt; vereinfacht die Auswahl  deutlich, in dem es eine &lt;a href="http://cpansearch.perl.org/src/PERIGRIN/Task-Kensho-0.21/ranguard.suggest"&gt;Liste&lt;/a&gt; der besten und modernen CPAN-Module zur Verfügung stellt und diese Module und deren Abhängigkeiten auch gleich installiert.
&lt;p&gt;
Die Auswahl der Module aus den Bereichen  Testing,  objektorientierte Programmierung, asynchrone Programmierung, XML-Entwicklung, Web Entwicklung, Webcrawler, Datum und Uhrzeit, Datenbank Programmierung, Excel/CSV Entwicklung, E-Mail, Konfiguration und vielen weiteren wurde von den Mitgliedern der &lt;a href="http://www.enlightenedperl.org/"&gt;Enlightened Perl Organization&lt;/a&gt; vorgenommen.
&lt;/p&gt;
&lt;pre&gt;
cpan&amp;gt; install Task::Kensho
&lt;/pre&gt;

&lt;h2&gt;Siehe auch&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Task::Kensho"&gt;Task::Kensho&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.enlightenedperl.org/"&gt;enlightened perl organisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wikipdia: &lt;a href="http://de.wikipedia.org/wiki/Kensh%C5%8D"&gt;Kenshō&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/gitpan/Task-Kensho"&gt;http://github.com/gitpan/Task-Kensho&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://use.perl.org/~davorg/journal/38730"&gt;Task::Kensho RPMs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://de.wikibooks.org/wiki/Perl-Programmierung:_N%C3%BCtzliche_Module"&gt;Perl-Programmierung: Nützliche Module&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
        
    &lt;img src="http://feeds.feedburner.com/~r/PerlHowto/~4/aLxLHuESjUU"&gt;</content:encoded>
      <dcterms:modified>2010-03-10T00:00:01+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:perl-howto.de,2010://1.183</guid>
    </item>
    <item>
      <author>nobody@example.com (Jérôme Quelin)</author>
      <dc:creator>nobody@example.com (Jérôme Quelin)</dc:creator>
      <category>moose curses tests perl</category>
      <link>http://jquelin.blogspot.com/2010/03/on-testing.html</link>
      <description>testing is good for your modules. even the ones you know work as
intended. case in point: i wanted to refactor
curses::toolkit::object::coordinates to use moose.however, refactoring
such a core component of curses::toolkit without a test suite did not
sound such a good idea...

therefore i wrote some tests for this module - and i discovered 2 bugs in
this class. a small one that made an error message totally useless, and a
serious one that affected the semantics of some methods.

so, not counting the fact that refactoring was quite easy once the test
suite was in place, i also found some real bugs in the code. those tests
were not very funny to write, but at least i know that the roi was very
good! :-)</description>
      <dc:date>2010-03-09T16:57:00Z</dc:date>
      <dc:subject>moose curses tests perl</dc:subject>
      <title>on testing</title>
      <pubDate>Tue, 09 Mar 2010 16:57:00 -0000</pubDate>
      <content:encoded>testing is good for your modules. even the ones you know work as intended. case in point: i wanted to refactor &lt;a href="http://search.cpan.org/perldoc?Curses::Toolkit::Object::Coordinates"&gt;curses::toolkit::object::coordinates&lt;/a&gt; to use &lt;a href="http://search.cpan.org/dist/Moose"&gt;moose&lt;/a&gt;.however, refactoring such a core component of &lt;a href="http://search.cpan.org/perldoc?Curses::Toolkit"&gt;curses::toolkit&lt;/a&gt; without a test suite did not sound such a good idea...&lt;br /&gt;&lt;br /&gt;therefore i wrote some tests for this module - and i discovered 2 bugs in this class. a small one that made an error message totally useless, and a serious one that affected the semantics of some methods.&lt;br /&gt;&lt;br /&gt;so, not counting the fact that refactoring was quite easy once the test suite was in place, i also found some real bugs in the code. those tests were not very funny to write, but at least i know that the roi was very good! :-)&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-09T16:57:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-6162910877268067002.post-603952143173591048</guid>
    </item>
    <item>
      <author>nobody@example.com (Dave Jacoby)</author>
      <dc:creator>nobody@example.com (Dave Jacoby)</dc:creator>
      <category>perl ironman</category>
      <link>http://varlogrant.blogspot.com/2010/03/heavy-boots-of-lead.html</link>
      <description>I've joined the Perl Iron Man competition. Or whatever it is. Which means
I have to write about Perl.

I use it all the time, so that should be no problem. Just have to make it
interesting.

Which I can't right now.</description>
      <dc:date>2010-03-09T15:31:00Z</dc:date>
      <dc:subject>perl ironman</dc:subject>
      <title>Heavy Boots of Lead</title>
      <pubDate>Tue, 09 Mar 2010 15:31:00 -0000</pubDate>
      <content:encoded>I've joined the &lt;a href="http://www.enlightenedperl.org/ironman.html"&gt;Perl Iron Man&lt;/a&gt; competition. Or whatever it is. Which means I have to write about Perl.&lt;br /&gt;&lt;br /&gt;I use it all the time, so that should be no problem. Just have to make it interesting.&lt;br /&gt;&lt;br /&gt;Which I can't right now.&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-09T15:31:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-145332831106508186.post-7145144079842672613</guid>
    </item>
    <item>
      <author>nobody@example.com (Sam Graham)</author>
      <dc:creator>nobody@example.com (Sam Graham)</dc:creator>
      <category>perl ironman benchmarking analysis trim regexp optimization advanced tutorial</category>
      <link>http://www.illusori.co.uk/perl/2010/03/09/advanced_benchmark_analysis_2.html</link>
      <description>In my previous blog entry, "Advanced Benchmark Analysis I: Yet more
white-space trimming", I left you with the thought that our benchmarks
changed with changing input.

This article shows you how to analyze those changes and how to draw
conclusions from them.

Read more...</description>
      <dc:date>0</dc:date>
      <dc:subject>perl ironman benchmarking analysis trim regexp optimization advanced tutorial</dc:subject>
      <title>Advanced Benchmark Analysis II: Probing strengths and weaknesses</title>
      <pubDate>Tue, 09 Mar 2010 13:39:00 -0000</pubDate>
      <content:encoded>&lt;p&gt;In my previous blog entry, &amp;quot;Advanced Benchmark Analysis I: Yet more white-space trimming&amp;quot;, I left you with the thought that our benchmarks changed with changing input.&lt;/p&gt;&lt;p&gt;This article shows you how to analyze those changes and how to draw conclusions from them.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.illusori.co.uk/perl/2010/03/09/advanced_benchmark_analysis_2.html"&gt;Read more...&lt;/a&gt;&lt;/p&gt;</content:encoded>
      <dcterms:modified>0</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.illusori.co.uk/perl/2010/03/09/advanced_benchmark_analysis_2.html</guid>
    </item>
    <item>
      <author>nobody@example.com (mdk)</author>
      <dc:creator>nobody@example.com (mdk)</dc:creator>
      <category>Enlightened Perl Ironman North West England Perl Mongers Perl Mark Keating mdk nwe.pm perlanet</category>
      <link>http://mdk.per.ly/2010/03/09/ironboy-is-coming-soon/</link>
      <description>My, Apparent, Ironman Status
      My Ironman Status

For those of you who have been keeping up-to-date with things we are
working on a new version of the Ironman feed which will be called
all.things.per.ly and is currently being developed as Ironboy by the
members of northwestengland.pm and their associated friends who hang out
on irc.perl.org in the #northwestengland.pm. channel.

This post is just to let you know that we have finally worked through a
lot of the issues we were having with feed subscriptions (language
issues) and working to weed out spam signups as well as developing code
for the Perlanet which is replacing Plagger as the code the site runs on
(well, sort of, there’s Catalyst and stuff in there as well, but someone
else will be outlining the tech specs in a future post).

The eventual plan for the Ironboy code, once it is up and powering
all-things.per.ly is to rip out Plagger from the current
ironman.enlightenedperl.org and replace it with Ironboy (using Perlanet)
this should help us to fix some issues such as the badge updates
(finally).

Well keep watching as this will soon be a reality and we can all gush and
say cool, now let’s have this feature…

If you want to help us bring the next generation of Ironman into
existence then join the channel mentioned above and state you want to
help.

I should not that my co--leader Ian Norton (idn on irc) has been the
principal force and focus for this project and all extra bits of kudos
that are left over from praising all the people who are working on this
should be gathered up and heaped on his impressive shoulders.

-ttfn – Mark

ironsignup</description>
      <dc:date>2010-03-09T13:48:08+02:00</dc:date>
      <dc:subject>Enlightened Perl Ironman North West England Perl Mongers Perl Mark Keating mdk nwe.pm perlanet</dc:subject>
      <title>Ironboy is coming soon</title>
      <pubDate>Tue, 09 Mar 2010 13:48:08 +0200</pubDate>
      <content:encoded>&lt;div&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;img src="http://ironman.enlightenedperl.org/munger/mybadge/male/mdk.png" alt="My, Apparent, Ironman Status"&gt;&lt;/dt&gt;
&lt;dd&gt;My Ironman Status&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;p&gt;For those of you who have been keeping up-to-date with things &lt;a href="http://northwestengland.pm.org/"&gt;we&lt;/a&gt; are working on a new version of the &lt;a href="http://ironman.enlightenedperl.org/"&gt;Ironman&lt;/a&gt; feed which will be called all.things.per.ly and is currently being developed as Ironboy by the members of &lt;a href="http://northwestengland.pm.org/"&gt;northwestengland.pm&lt;/a&gt; and their associated friends who hang out on irc.perl.org in the #northwestengland.pm. channel.&lt;/p&gt;
&lt;p&gt;This post is just to let you know that we have finally worked through a lot of the issues &lt;a href="http://northwestengland.pm.org/"&gt;we&lt;/a&gt; were having with feed subscriptions (language issues) and working to weed out spam signups as well as developing code for the &lt;a href="http://search.cpan.org/dist/Perlanet/"&gt;Perlanet&lt;/a&gt; which is replacing &lt;a href="http://plagger.org/trac"&gt;Plagger&lt;/a&gt; as the code the site runs on (well, sort of, there&amp;#8217;s Catalyst and stuff in there as well, but someone else will be outlining the tech specs in a future post).&lt;/p&gt;
&lt;p&gt;The eventual plan for the Ironboy code, once it is up and powering all-things.per.ly is to rip out &lt;a href="http://plagger.org/trac"&gt;Plagger&lt;/a&gt; from the current &lt;a href="http://ironman.enlightenedperl.org/"&gt;ironman.enlightenedperl.org&lt;/a&gt; and replace it with Ironboy (using &lt;a href="http://search.cpan.org/dist/Perlanet/"&gt;Perlanet&lt;/a&gt;) this should help us to fix some issues such as the badge updates (finally).&lt;/p&gt;
&lt;p&gt;Well keep watching as this will soon be a reality and we can all gush and say cool, now let&amp;#8217;s have this feature&amp;#8230;&lt;/p&gt;
&lt;p&gt;If you want to help us bring the next generation of Ironman into existence then join the channel mentioned above and state you want to help.&lt;/p&gt;
&lt;p&gt;I should not that my co-&lt;del datetime="2010-03-09T11:44:31+00:00"&gt;conspirator&lt;/del&gt;-leader Ian Norton (idn on irc) has been the principal force and focus for this project and all extra bits of kudos that are left over from praising all the people who are working on this should be gathered up and heaped on his impressive shoulders.&lt;/p&gt;
&lt;p&gt;-ttfn &amp;#8211; Mark&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ironman.enlightenedperl.org/signup/new_feed"&gt;&lt;img src="http://mdk.per.ly/files/2009/09/ironsignup.png" alt="ironsignup"&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-09T13:48:08+02:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://mdk.per.ly/?p=439</guid>
    </item>
    <item>
      <author>nobody@example.com (fREW Schmidt)</author>
      <dc:creator>nobody@example.com (fREW Schmidt)</dc:creator>
      <category>Uncategorized</category>
      <link>http://blog.afoolishmanifesto.com/archives/1303</link>
      <description>In February of 2008 I figured out how to switch our servers from IIS to
Apache. The main reason I did that was because if you print to STDERR in
Perl while running under IIS the server would crash hard. In general it
just took some research and motivation. All was well with the world…. For
six months.

After switching to Apache we needed a way (previously accomplished with
PerlEx from ActiveState) to run certain scripts persistently. I did some
research and discovered that using mod_perl in win32 was feasible and you
can indeed turn it on for parts of your site. Yet again, all was well
with the world.

Unfortunately as time passed and we started using a deeper stack of Perl
(we originally were just using DBI, the Perl database layer, and
sometimes using Template::Toolkit, one of the most major Perl templating
systems,) we started seeing Apache crashing or leaking memory. Unlike IIS
crashes the cause and time till crash was unpredictable, but after some
work the issue was found and fixed.

During this time I and all but one of my coworkers switched to the most
excellent Strawberry Perl, the Windows Perl one might say. Logging in to
the servers to install packages with PPM quickly soured for me and I
spent probably 3 days worth of my time (half of which was unpaid!) trying
to find a way to use Strawberry persistently. If we could use Strawberry
on the servers installing dependencies would boil down to

1

cpanm --installdeps .

But I couldn’t seem to get mod_perl to build, mod_fcgid and mod_fastcgi
were both unworkable (for me anyway,) and I couldn’t get lighttpd +
FastCGI to work. So I gave up on that endeavor.

Nearly four months have passed since the crashing Apache issue was
originally solved and just days ago we deployed our first Catalyst
project (we have two more in the pipeline now!) We deployed onto mod_perl
and Apache on Windows. I would never recommend deploying onto Windows,
but I also realize that there are business reasons to do so and sometimes
it’s just what you have to do.

And all was well with the world…for two page requests. It turns out that
somewhere in our stack of Perl, Apache, mod_perl, and Windows there was
an issue that made the server consistently crash after nearly every other
request. I did some research, and even built up a replica of our deploy
on my machine (linux) to see if the issue was generic mod_perl. If it
were a problem in Linux it would be much easier to get free help from the
community, but alas, it ran perfectly on my machine.

While I was driving to a friend’s recently I had a thought; why not just
use the Catalyst development server or some other Perl based server and
just proxy to it with Apache? Heck, it’s actually very similar to one of
the recommended ways to deploy Catalyst in the Catalyst book .

Before I get into the details of this I need to point out that we are not
using HTTP::Prefork, thanks to Windows. If you have a large site you
really should not use Windows, for numerous reasons. That was the
conclusion that my boss and I came to anyway.

First off, here is the Apache configuration we ended up with:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

ServerRoot "C:/Program Files (x86)/Apache Software Foundation/Apache2.2"
ServerName "ourapp.foo.com"
Listen 80
LoadModule alias_module modules/mod_alias.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
LoadModule env_module modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

ExpiresActive On
ProxyRequests Off

&lt;Proxy balancer://my_cluster&gt;
BalancerMember http://127.0.0.1:39564
BalancerMember http://127.0.0.1:39565
&lt;/Proxy&gt;
ProxyPass / balancer://my_cluster/
# we don't use this because our app is a single page
# javascript application
# ProxyPassReverse / balancer://my_cluster/

DocumentRoot "C:/myapp/root/"
&lt;Location /static&gt;
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetHandler default-handler
&lt;/Location&gt;

LogLevel warn

LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\""
combined
LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
CustomLog "logs/access.log" common
DefaultType text/plain
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

So basically all we do in this configuration is have Apache serve the
static files and then proxy the requests to a couple of catalyst dev
servers. I used Srvany.exe and a couple of .bat files to start the
catalyst dev servers. It works much better than using mod_perl, and each
server sits at about 90M a piece. If we ended up getting a huge site and
for some strange reason needed to keep our outfacing server windows, we
could actually serve the catalyst parts on a linux server and have apache
proxy to those, so it scales very nicely.

Anyway, here’s to the next 6 months of serving! :-)


Related Posts:
--------------

  * Migrating from IIS to Apache

  * mod_perl: For Your Health!

  * What I want from the Perl 5 support policy

  * PerlCritic for Web Developers

  * Metrics + Debug!

  * Powered by Contextual Related Posts</description>
      <dc:date>2010-03-09T01:28:40Z</dc:date>
      <dc:subject>Uncategorized</dc:subject>
      <title>The Rise and Fall of mod_perl</title>
      <pubDate>Tue, 09 Mar 2010 01:28:40 -0000</pubDate>
      <content:encoded>&lt;p&gt;In February of 2008 I figured out how to &lt;a href="http://blog.afoolishmanifesto.com/archives/59"&gt;switch our servers from IIS to Apache&lt;/a&gt;.  The main reason I did that was because if you print to STDERR in Perl while running under IIS the server would crash hard.  In general it just took some research and motivation.  All was well with the world&amp;#8230;.  For six months.&lt;/p&gt;
&lt;p&gt;After switching to Apache we needed a way (previously accomplished with PerlEx from ActiveState) to run certain scripts persistently.  I did some research and discovered that &lt;a href="http://blog.afoolishmanifesto.com/archives/402"&gt;using mod_perl in win32&lt;/a&gt; was feasible and you can indeed turn it on for parts of your site.  Yet again, all was well with the world.&lt;/p&gt;
&lt;p&gt;Unfortunately as time passed and we started using a deeper stack of Perl (we originally were just using &lt;a href="http://search.cpan.org/perldoc?DBI"&gt;DBI&lt;/a&gt;, &lt;a href="http://search.cpan.org/perldoc?DBI"&gt;the Perl database layer&lt;/a&gt;,  and &lt;em&gt;sometimes&lt;/em&gt; using &lt;a href="http://search.cpan.org/perldoc?Template"&gt;Template::Toolkit&lt;/a&gt;, one of the most major &lt;a href="http://search.cpan.org/perldoc?Template"&gt;Perl templating systems&lt;/a&gt;,) we started seeing Apache crashing or leaking memory.  Unlike IIS crashes the cause and time till crash was unpredictable, but after some &lt;a href="https://rt.cpan.org/Public/Bug/Display.html?id=50454"&gt;work&lt;/a&gt; the issue was found and fixed.&lt;/p&gt;
&lt;p&gt;During this time I and all but one of my coworkers switched to the most excellent &lt;a href="http://strawberryperl.com/"&gt;Strawberry Perl&lt;/a&gt;, the &lt;a href="http://strawberryperl.com/"&gt;Windows Perl&lt;/a&gt; one might say.  Logging in to the servers to install packages with PPM quickly soured for me and I spent probably 3 days worth of my time (half of which was unpaid!) trying to find a way to use Strawberry persistently.  If we could use Strawberry on the servers installing dependencies would boil down to&lt;/p&gt;
&lt;div class="codecolorer-container text vibrant"&gt;&lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="text codecolorer"&gt;cpanm --installdeps .&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;But I couldn&amp;#8217;t seem to get mod_perl to build, mod_fcgid and mod_fastcgi were both unworkable (for me anyway,) and I couldn&amp;#8217;t get lighttpd + FastCGI to work.  So I gave up on that endeavor.&lt;/p&gt;
&lt;p&gt;Nearly four months have passed since the crashing Apache issue was originally solved and just days ago we deployed our &lt;a href="http://blog.afoolishmanifesto.com/archives/1039"&gt;first Catalyst project&lt;/a&gt; (we have two more in the pipeline now!)  We deployed onto mod_perl and Apache on Windows.  I would never recommend deploying onto Windows, but I also realize that there are business reasons to do so and sometimes it&amp;#8217;s just what you have to do.&lt;/p&gt;
&lt;p&gt;And all was well with the world&amp;#8230;for two page requests.  It turns out that &lt;strong&gt;somewhere&lt;/strong&gt; in our stack of Perl, Apache, mod_perl, and Windows there was an issue that made the server consistently crash after nearly every other request.  I did some &lt;a href="http://perl.apache.org/docs/2.0/api/Apache2/SizeLimit.html"&gt;research&lt;/a&gt;, and even built up a replica of our deploy on my machine (linux) to see if the issue was generic mod_perl.  If it &lt;strong&gt;were&lt;/strong&gt; a problem in Linux it would be much easier to get free help from the community, but alas, it ran perfectly on my machine.&lt;/p&gt;
&lt;p&gt;While I was driving to a friend&amp;#8217;s recently I had a thought; &lt;em&gt;why not just use the Catalyst development server or some other Perl based server and just proxy to it with Apache?&lt;/em&gt;  Heck, it&amp;#8217;s actually very similar to one of the recommended ways to deploy Catalyst in &lt;a href="http://www.amazon.com/gp/product/1430223650?ie=UTF8&amp;amp;tag=afooman-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1430223650"&gt;the Catalyst book&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=afooman-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1430223650" alt=""&gt;.&lt;/p&gt;
&lt;p&gt;Before I get into the details of this I need to point out that we are &lt;strong&gt;not&lt;/strong&gt; using HTTP::Prefork, thanks to Windows.  If you have a large site you really should not use Windows, for numerous reasons.  That was the conclusion that my boss and I came to anyway.&lt;/p&gt;
&lt;p&gt;First off, here is the Apache configuration we ended up with:&lt;/p&gt;
&lt;div class="codecolorer-container text vibrant"&gt;&lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;br /&gt;23&lt;br /&gt;24&lt;br /&gt;25&lt;br /&gt;26&lt;br /&gt;27&lt;br /&gt;28&lt;br /&gt;29&lt;br /&gt;30&lt;br /&gt;31&lt;br /&gt;32&lt;br /&gt;33&lt;br /&gt;34&lt;br /&gt;35&lt;br /&gt;36&lt;br /&gt;37&lt;br /&gt;38&lt;br /&gt;39&lt;br /&gt;40&lt;br /&gt;41&lt;br /&gt;42&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="text codecolorer"&gt;ServerRoot &amp;quot;C:/Program Files (x86)/Apache Software Foundation/Apache2.2&amp;quot;&lt;br /&gt;
ServerName &amp;quot;ourapp.foo.com&amp;quot;&lt;br /&gt;
Listen 80&lt;br /&gt;
LoadModule alias_module modules/mod_alias.so&lt;br /&gt;
LoadModule deflate_module modules/mod_deflate.so&lt;br /&gt;
LoadModule expires_module modules/mod_expires.so&lt;br /&gt;
LoadModule env_module modules/mod_env.so&lt;br /&gt;
LoadModule log_config_module modules/mod_log_config.so&lt;br /&gt;
LoadModule mime_module modules/mod_mime.so&lt;br /&gt;
LoadModule setenvif_module modules/mod_setenvif.so&lt;br /&gt;
LoadModule proxy_module modules/mod_proxy.so&lt;br /&gt;
LoadModule proxy_http_module modules/mod_proxy_http.so&lt;br /&gt;
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so&lt;br /&gt;
&lt;br /&gt;
ExpiresActive On&lt;br /&gt;
ProxyRequests Off&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Proxy balancer://my_cluster&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;BalancerMember http://127.0.0.1:39564&lt;br /&gt;
&amp;nbsp; &amp;nbsp;BalancerMember http://127.0.0.1:39565&lt;br /&gt;
&amp;lt;/Proxy&amp;gt;&lt;br /&gt;
ProxyPass / balancer://my_cluster/&lt;br /&gt;
# we don't use this because our app is a single page&lt;br /&gt;
# javascript application&lt;br /&gt;
# ProxyPassReverse / balancer://my_cluster/&lt;br /&gt;
&lt;br /&gt;
DocumentRoot &amp;quot;C:/myapp/root/&amp;quot;&lt;br /&gt;
&amp;lt;Location /static&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;SetOutputFilter DEFLATE&lt;br /&gt;
&amp;nbsp; &amp;nbsp;SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary&lt;br /&gt;
&amp;nbsp; &amp;nbsp;SetHandler default-handler&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LogLevel warn&lt;br /&gt;
&lt;br /&gt;
LogFormat &amp;quot;%h %l %u %t \&amp;quot;%r\&amp;quot; %&amp;gt;s %b \&amp;quot;%{Referer}i\&amp;quot; \&amp;quot;%{User-Agent}i\&amp;quot;&amp;quot; combined&lt;br /&gt;
LogFormat &amp;quot;%h %l %u %t \&amp;quot;%r\&amp;quot; %&amp;gt;s %b&amp;quot; common&lt;br /&gt;
CustomLog &amp;quot;logs/access.log&amp;quot; common&lt;br /&gt;
DefaultType text/plain&lt;br /&gt;
TypesConfig conf/mime.types&lt;br /&gt;
AddType application/x-compress .Z&lt;br /&gt;
AddType application/x-gzip .gz .tgz&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;So basically all we do in this configuration is have Apache serve the static files and then proxy the requests to a couple of catalyst dev servers.  I used &lt;a href="http://support.microsoft.com/kb/137890"&gt;Srvany.exe&lt;/a&gt; and a couple of .bat files to start the catalyst dev servers.  It works &lt;strong&gt;much&lt;/strong&gt; better than using mod_perl, and each server sits at about 90M a piece.  If we ended up getting a huge site and for some strange reason needed to keep our outfacing server windows, we could actually serve the catalyst parts on a linux server and have apache proxy to those, so it scales very nicely.&lt;/p&gt;
&lt;p&gt;Anyway, here&amp;#8217;s to the next 6 months of serving! &lt;img src="http://blog.afoolishmanifesto.com/wp-includes/images/smilies/icon_smile.gif" alt=":-)"&gt; &lt;/p&gt;
&lt;div id="crp_related"&gt;&lt;h2&gt;Related Posts:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.afoolishmanifesto.com/archives/59" rel="bookmark" class="crp_title"&gt;Migrating from IIS to Apache&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.afoolishmanifesto.com/archives/402" rel="bookmark" class="crp_title"&gt;mod_perl: For Your Health!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.afoolishmanifesto.com/archives/707" rel="bookmark" class="crp_title"&gt;What I want from the Perl 5 support policy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.afoolishmanifesto.com/archives/596" rel="bookmark" class="crp_title"&gt;PerlCritic for Web Developers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.afoolishmanifesto.com/archives/1075" rel="bookmark" class="crp_title"&gt;Metrics + Debug!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Powered by &lt;a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/"&gt;Contextual Related Posts&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-09T01:28:40Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://blog.afoolishmanifesto.com/?p=1303</guid>
    </item>
    <item>
      <author>nobody@example.com (D)</author>
      <dc:creator>nobody@example.com (D)</dc:creator>
      <category>perl</category>
      <link>http://mt.endeworks.jp/d-6/2010/03/old-tweets.html</link>
      <description>
松濤であった爆発の件について、そういえばtwitter使ってたなーと思って探したら全然見あたらない。なにせ4年近く前のことなのでそもそもそこにたどり着くラインがないのだ。
なので、一個だけブクマされてたtweetから超ローテクな方法で残りのヤツを捜した。その方法とは・・・一個ずつIDを増やして、HTTP
GETが通ったらOKというだけ。一旦書いてから走らせてそのまま放置して一晩おいておいたら大体とれてたくさい。
というわけで、松濤温泉施設爆発時の俺のtweet → ここ。

use strict;
use LWP::UserAgent;

my $base = 110764722;
my $ua = LWP::UserAgent-&gt;new();
my $i = $base;
while(1) {
    my $res = $ua-&gt;head("http://twitter.com/lestrrat/statuses/$i");
    if ($res-&gt;is_success) {
        print "http://twitter.com/lestrrat/statuses/$i\n";
    }
    $i++;
}

やー、ローテクですね。あまりオススメしませんｗ</description>
      <dc:date>2010-03-09T09:15:53+09:00</dc:date>
      <dc:subject>perl</dc:subject>
      <title>古いtweetを探すのは骨が折れる</title>
      <pubDate>Tue, 09 Mar 2010 09:15:53 +0900</pubDate>
      <content:encoded>
        松濤であった爆発の件について、そういえばtwitter使ってたなーと思って探したら全然見あたらない。なにせ4年近く前のことなのでそもそもそこにたどり着くラインがないのだ。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;なので、一個だけブクマされてたtweetから超ローテクな方法で残りのヤツを捜した。その方法とは・・・一個ずつIDを増やして、HTTP GETが通ったらOKというだけ。一旦書いてから走らせてそのまま放置して一晩おいておいたら大体とれてたくさい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;というわけで、松濤温泉施設爆発時の俺のtweet → &lt;a href="http://mt.endeworks.jp/d-6/2006/06/shoutou.html"&gt;ここ&lt;/a&gt;。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;pre class="code_listing"&gt;use strict;
use LWP::UserAgent;

my $base = 110764722;
my $ua = LWP::UserAgent-&amp;gt;new();
my $i = $base;
while(1) {
    my $res = $ua-&amp;gt;head("http://twitter.com/lestrrat/statuses/$i");
    if ($res-&amp;gt;is_success) {
        print "http://twitter.com/lestrrat/statuses/$i\n";
    }
    $i++;
}
&lt;/pre&gt;
&lt;div&gt;やー、ローテクですね。あまりオススメしませんｗ&lt;/div&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-09T09:15:53+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:mt.endeworks.jp,2010:/d-6//3.2463</guid>
    </item>
    <item>
      <author>nobody@example.com (G.Shank)</author>
      <dc:creator>nobody@example.com (G.Shank)</dc:creator>
      <category>Perl FormHandler</category>
      <link>http://catdev.blogspot.com/2010/03/htmlformhandler-result-object.html</link>
      <description>Sometime last year I re-structured HTML::FormHandler so that the input
and values that are produced by the form validation process are stored in
separate result objects. There is an alternate method 'run' (as opposed
to the usual 'process' method) to get these objects, or you can get them
from a form after 'process'.

I expected that those who were interested in using this would materialize
and provide input into what additional facilities/hooks were needed, but
as far as I can tell nobody has actually used the feature. I think that
it's a fair assumption that nobody actually knows about it, or can't
figure out the point.

The standard way to use FormHandler is (simplified) something like:

    my $form = MyApp::Form-&gt;new;
    $form-&gt;process( params =&gt; $params, item =&gt; $item, ...);
    if( $form-&gt;validated ) {
     ....
    }

When using the the result object, the form acts like a kind of factory,
and it looks like this:

    my $form = MyApp::Form-&gt;new;
    my $result = $form-&gt;run( params =&gt; $parsms, item =&gt; $item, ... );
    if( $result-&gt;validated ) {
       ...
    }

...and all the state is stored in the result objects, ideally leaving
none left in the form

Currently result objects refer back to some attributes of the form object
for rendering, since a number of rendering related definitions are stored
there. It would be possible to decouple that, but then you'd end up
having to define the validation and rendering aspects of the fields in
two places.

In practice, the separation between static (form definition) information
and ephemeral data is not nearly as clearcut as you might think. I find
that people often want to change attributes that would probably be
initially defined as static based on values that are passed in. It is
possible to do this in a clean way, of course. But since the previous
results are always cleared out at the beginning of each 'process' call,
in practice the difference between using the form with 'process' and
using it with 'run' aren't huge.

Nonetheless, I am sure there are people who have good use cases for this
alternative architecture, and would love to have people pound on it and
use it.</description>
      <dc:date>2010-03-08T23:20:00Z</dc:date>
      <dc:subject>Perl FormHandler</dc:subject>
      <title>HTML::FormHandler result object</title>
      <pubDate>Mon, 08 Mar 2010 23:20:00 -0000</pubDate>
      <content:encoded>&lt;p&gt;Sometime last year I re-structured HTML::FormHandler so that the input and values that are produced by the form validation process are stored in separate result objects. There is an alternate method 'run' (as opposed to the usual 'process' method) to get these objects, or you can get them from a form after 'process'.&lt;p&gt;
&lt;p&gt;I expected that those who were interested in using this would materialize and provide input into what additional facilities/hooks were needed, but as far as I can tell nobody has actually used the feature. I think that it's a fair assumption that nobody actually knows about it, or can't figure out the point.&lt;p&gt;
&lt;p&gt;The standard way to use FormHandler is (simplified) something like:&lt;/p&gt;
&lt;pre&gt;
    my $form = MyApp::Form-&amp;gt;new;
    $form-&amp;gt;process( params =&amp;gt; $params, item =&amp;gt; $item, ...);
    if( $form-&amp;gt;validated ) {
     ....
    }
&lt;/pre&gt;
&lt;p&gt;When using the the result object, the form acts like a kind of factory, and it looks like this:&lt;/p&gt;
&lt;pre&gt;
    my $form = MyApp::Form-&amp;gt;new;
    my $result = $form-&amp;gt;run( params =&amp;gt; $parsms, item =&amp;gt; $item, ... );
    if( $result-&amp;gt;validated ) {
       ...
    }
&lt;/pre&gt;
&lt;p&gt;...and all the state is stored in the result objects, ideally leaving none left in the form&lt;/p&gt;
&lt;p&gt;Currently result objects refer back to some attributes of the form object for rendering, since a number of rendering related definitions are stored there. It would be possible to decouple that, but then you'd end up having to define the validation and rendering aspects of the fields in two places.&lt;p&gt;
&lt;p&gt;In practice, the separation between static (form definition) information and ephemeral data is not nearly as clearcut as you might think. I find that people often want to change attributes that would probably be initially defined as static based on values that are passed in. It is possible to do this in a clean way, of course. But since the previous results are always cleared out at the beginning of each 'process' call, in practice the difference between using the form with 'process' and using it with 'run' aren't huge.&lt;/p&gt;
&lt;p&gt;Nonetheless, I am sure there are people who have good use cases for this alternative architecture, and would love to have people pound on it and use it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-08T23:20:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-7103012096530045108.post-444179292850913424</guid>
    </item>
    <item>
      <author>nobody@example.com (masak)</author>
      <dc:creator>nobody@example.com (masak)</dc:creator>
      <category>perl6</category>
      <link>http://use.perl.org/~masak/journal/40232?from=rss</link>
      <description>Ever wonder why bash closes if blocks with fi? This practice was
inctroduced in Algol 68, a language that Perl 6 was accused of
reinventing yesterday on the perl6-language list.

Curious, I went to the Wikipedia article to read up on Algol 68.

ALGOL 68 (short for ALGOrithmic Language 1968) is an imperative computer
programming language that was conceived as a successor to the ALGOL 60
programming language, designed with the goal of a much wider scope of
application and more rigorously defined syntax and semantics.

"Successor." "Wider scope of application". "More rigorously defined
syntax and semantics". Sound familiar?

ALGOL 68 has been criticized [...] for abandoning the simplicity of ALGOL
60 becoming a vehicle for complex or overly general ideas, and doing
little to make the compiler writer's task easy [...]

Oh dear. ☺ We even have the 'do little to make the compiler writer's task
easy' meme in Perl 6...

&lt;TimToady&gt; after all, Perl Philosphy is simply to torment the
implementors on behalf of the user (#perl6, 2008-10-09)
&lt;pmichaud&gt; aha! I have a quote for my keynote.

Besides that, there's all these other little parallels, such as

  * Algol 68 seemingly playing with words (they borrowed the term 'gomma'
    from Finnegan's Wake, but the feature it denoted got scrapped in a
    1973 revision),

  * something junction-like called 'multiple value',

  * a whole heap of values for different forms of nothing and
    undefinedness,

  * a newly-invented grammar formalism, and

  * a general feeling of deep ambitiousness and a desire to get things
    right.

So, there are deep similarities between Algol 68 and Perl 6. There's not
much to say to that, except perhaps "huh".

If there's anything in it all that's uplifting though, it's the second
paragraph of the article:

Contributions of ALGOL 68 to the field of computer science are deep and
wide ranging, although some of them were not publicly identified until
they were passed, in one form or another, to one of many subsequently
developed programming languages.

If that's not spot on for Perl 6, I think it will be in a decade or so.</description>
      <dc:date>2010-03-08T22:01:20Z</dc:date>
      <dc:subject>perl6</dc:subject>
      <title>The ghost of Algol 68</title>
      <pubDate>Mon, 08 Mar 2010 22:01:20 -0000</pubDate>
      <content:encoded>&lt;p&gt;Ever wonder why &lt;code&gt;bash&lt;/code&gt; closes &lt;code&gt;if&lt;/code&gt; blocks with &lt;code&gt;fi&lt;/code&gt;? This practice was inctroduced in &lt;a href="http://en.wikipedia.org/wiki/ALGOL_68"&gt;Algol 68&lt;/a&gt;, a language that Perl 6 &lt;a href="http://www.nntp.perl.org/group/perl.perl6.language/2010/03/msg33321.html"&gt;was accused of reinventing&lt;/a&gt; yesterday on the &lt;code&gt;perl6-language&lt;/code&gt; list.&lt;/p&gt;&lt;p&gt;Curious, I went to &lt;a href="http://en.wikipedia.org/wiki/ALGOL_68"&gt;the Wikipedia article&lt;/a&gt; to read up on Algol 68.&lt;/p&gt;&lt;p&gt;&lt;div class="quote"&gt;&lt;p&gt;ALGOL 68 (short for ALGOrithmic Language 1968) is an imperative computer programming language that was conceived as a successor to the ALGOL 60 programming language, designed with the goal of a much wider scope of application and more rigorously defined syntax and semantics.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;"Successor." "Wider scope of application". "More rigorously defined syntax and semantics". Sound familiar?&lt;/p&gt;&lt;p&gt;&lt;div class="quote"&gt;&lt;p&gt;ALGOL 68 has been criticized [...] for abandoning the simplicity of ALGOL 60 becoming a vehicle for complex or overly general ideas, and doing little to make the compiler writer's task easy [...]&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Oh dear. &amp;#9786; We even have the 'do little to make the compiler writer's task easy' meme in Perl 6...&lt;/p&gt;&lt;p&gt;&lt;div class="quote"&gt;&lt;p&gt; &lt;tt&gt;&amp;lt;TimToady&amp;gt; after all, Perl Philosphy is simply to torment the implementors on behalf of the user&lt;/tt&gt; (#perl6, &lt;a href="http://irclog.perlgeek.de/perl6/2008-10-09#i_614026"&gt;2008-10-09&lt;/a&gt;)&lt;br&gt;
&lt;tt&gt;&amp;lt;pmichaud&amp;gt; aha! I have a quote for my keynote.&lt;/tt&gt;&lt;/p&gt; &lt;/div&gt;&lt;p&gt;Besides that, there's all these other little parallels, such as&lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;Algol 68 seemingly playing with words (they borrowed the term 'gomma' from Finnegan's Wake, but the feature it denoted got scrapped in a 1973 revision),&lt;/li&gt;&lt;li&gt;something junction-like called 'multiple value',&lt;/li&gt;&lt;li&gt;a whole heap of values for different forms of nothing and undefinedness,&lt;/li&gt;&lt;li&gt;a newly-invented grammar formalism, and&lt;/li&gt;&lt;li&gt;a general feeling of deep ambitiousness and a desire to get things right.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So, there are deep similarities between Algol 68 and Perl 6. There's not much to say to that, except perhaps "huh".&lt;/p&gt;&lt;p&gt;If there's anything in it all that's uplifting though, it's the second paragraph of the article:&lt;/p&gt;&lt;p&gt;&lt;div class="quote"&gt;&lt;p&gt;Contributions of ALGOL 68 to the field of computer science are deep and wide ranging, although some of them were not publicly identified until they were passed, in one form or another, to one of many subsequently developed programming languages.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;If that's not spot on for Perl 6, I think it will be in a decade or so.&lt;/p&gt;</content:encoded>
      <dcterms:modified>2010-03-08T22:01:20Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://use.perl.org/~masak/journal/40232?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (Kiffin)</author>
      <dc:creator>nobody@example.com (Kiffin)</dc:creator>
      <category>Perl perl</category>
      <link>http://www.kiffingish.com/2010/03/perl-on-steroids.html</link>
      <description>Read this from beginning to end, and you then tell me with a straight
face that it hasn't completely changed your life.

I believe it is high time that we stop dilly-dallying around, that we
face the future for what it is, for what is was meant to be, and take the
challenge.

for 0..3 -&gt; $even, $odd {
    say "Even: $even \t Odd: $odd";
}

An appropriate theme song could be "Start of Something Beautiful" by
Procupine Tree (which just happened to be playing on RadioParadise twice
while reading and then re-reading the link above on alternating even and
odd days).</description>
      <dc:date>2010-03-08T22:12:32+01:00</dc:date>
      <dc:subject>Perl perl</dc:subject>
      <title>Perl on steroids</title>
      <pubDate>Mon, 08 Mar 2010 22:12:32 +0100</pubDate>
      <content:encoded>
        &lt;p&gt;
Read &lt;a href="http://perlgeek.de/en/article/5-to-6"&gt;this&lt;/a&gt; from beginning to end, and you then tell me with a straight face that it hasn't completely changed your life.
&lt;/p&gt;

&lt;p&gt;
I believe it is high time that we stop dilly-dallying around, that we face the future for what it is, for what is was meant to be, and take the challenge.
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for 0..3 -&amp;gt; $even, $odd {
    say "Even: $even \t Odd: $odd";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
An appropriate theme song could be "Start of Something Beautiful" by Procupine Tree (which just happened to be playing on RadioParadise twice while reading and then re-reading the link above on alternating even and odd days).
&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-08T22:12:32+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.kiffingish.com,2010://1.1816</guid>
    </item>
    <item>
      <author>nobody@example.com (admin)</author>
      <dc:creator>nobody@example.com (admin)</dc:creator>
      <category>Psychology</category>
      <link>http://p.einarsen.no/ending-the-long-quiet/</link>
      <description>It turns out I’ve done to my blog what I swore not to: Stop updating it.
However, I’ve also sworn that if I did I would come back to it and not
give up.

So what happened?

Well, it’s been quiet here because the heat turned up a few notches in my
day job, and the opportunities to actually apply psychological methods
turned plentiful. I’ve been involved heavily in recruitment in a (the)
major Perl employer these days, and while I’ve learnt plenty about the
minds of computer programmers, I also find myself in the situation where
there’s correspondingly little I can write about it. On one side because
there’s limits to how much detail I can write about before giving out
information best kept confidental, and on the other side because some
parts of a recruitment process needs to be kept inside the company to not
give candidates unfair advantages (or disadvantages).

Now in a related turn of events, I seem to be heading to the Nordic Perl
Workshop 2010 and I’m thinking about putting together a talk introducing
the idea of using methods from Psychology to Perl programming.
Alternatively just a general light-weight something about some subject
from the world of Psychology of Programming. Which leads me to, if anyone
who’s been reading the blog still follows it, what was your favourite
post? Or what post would you like to seen elaborated on? Or what would
just make a good talk?

Or to put it like the quintessential computer/psychology crossover, ELIZA,
would: Come, come, elucidate your thoughts!</description>
      <dc:date>2010-03-08T21:49:48+01:00</dc:date>
      <dc:subject>Psychology</dc:subject>
      <title>Ending The Long Quiet</title>
      <pubDate>Mon, 08 Mar 2010 21:49:48 +0100</pubDate>
      <content:encoded>&lt;p&gt;It turns out I&amp;#8217;ve done to my blog what I swore not to: Stop updating it. However, I&amp;#8217;ve also sworn that if I did I would come back to it and not give up.&lt;/p&gt;
&lt;p&gt;So what happened?&lt;/p&gt;
&lt;p&gt;Well, it&amp;#8217;s been quiet here because the heat turned up a few notches in my day job, and the opportunities to actually apply psychological methods turned plentiful. I&amp;#8217;ve been involved heavily in recruitment in a (the) major Perl employer these days, and while I&amp;#8217;ve learnt plenty about the minds of computer programmers, I also find myself in the situation where there&amp;#8217;s correspondingly little I can write about it. On one side because there&amp;#8217;s limits to how much detail I can write about before giving out information best kept confidental, and on the other side because some parts of a recruitment process needs to be kept inside the company to not give candidates unfair advantages (or disadvantages).&lt;/p&gt;
&lt;p&gt;Now in a related turn of events, I seem to be heading to the &lt;a href="http://npw2010.fsfi.is/" target="_blank"&gt;Nordic Perl Workshop 2010&lt;/a&gt; and I&amp;#8217;m thinking about putting together a talk introducing the idea of using methods from Psychology to Perl programming.  Alternatively just a general light-weight something about some subject from the world of Psychology of Programming.  Which leads me to, if anyone who&amp;#8217;s been reading the blog still follows it,  what was your favourite post? Or what post would you like to seen elaborated on?  Or what would just make a good talk?&lt;/p&gt;
&lt;p&gt;Or to put it like&lt;a href="http://en.wikipedia.org/wiki/ELIZA" target="_blank"&gt; the quintessential computer/psychology crossover, ELIZA&lt;/a&gt;, would: &lt;a href="http://nlp-addiction.com/eliza/" target="_blank"&gt;Come, come, elucidate your thoughts!&lt;/a&gt;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-08T21:49:48+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://p.einarsen.no/?p=327</guid>
    </item>
    <item>
      <author>nobody@example.com (manu)</author>
      <dc:creator>nobody@example.com (manu)</dc:creator>
      <category>Français cpan perl</category>
      <link>http://blog.bjornoya.be/lab_stacks/2010/03/limportance-de-lecosysteme-dun-langage.html</link>
      <description>En lisant le dernier « PragPub: The First Iteration » (le n°9, disponible
sur le site de PragProg), dans l'article « JavaScript: It's Not Just for
Browsers Any More » de Jason Huggins, je suis tombé sur une réflexion
intéressante :

  When we choose a technology to write an application, we don't just
  choose the language, we also choose the list of available libraries.
  If a language has many useful libraries with a vibrant community
  around them, it's going to be easier to write your application in
  less time.

Bon, dans mon cas, cela m'a fait pensé au Perl et au CPAN, mais je suis
sûr que d'autres liront autres choses :)</description>
      <dc:date>2010-03-08T21:13:23+01:00</dc:date>
      <dc:subject>Français cpan perl</dc:subject>
      <title>L'importance de l'écosystème d'un langage</title>
      <pubDate>Mon, 08 Mar 2010 21:13:23 +0100</pubDate>
      <content:encoded>
        &lt;p&gt;En lisant le dernier « &lt;i&gt;PragPub: The First Iteration&lt;/i&gt; » (&lt;a href="http://www.pragprog.com/magazines"&gt;le n°9, disponible sur le site de PragProg&lt;/a&gt;), dans l'article « &lt;i&gt;JavaScript: It's Not Just for Browsers Any More&lt;/i&gt; » de &lt;b&gt;Jason Huggins&lt;/b&gt;, je suis tombé sur une réflexion
intéressante : 
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When we choose a technology to write an application, we don't just choose the
language, we also choose the list of available libraries. If a language has
many useful libraries with a vibrant community around them, it's going to be
easier to write your application in less time.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Bon, dans mon cas, cela m'a fait pensé au &lt;a href="http://www.perl.org"&gt;Perl&lt;/a&gt; et au &lt;a href="http://search.cpan.org"&gt;CPAN&lt;/a&gt;, mais je suis sûr
que d'autres liront autres choses :)
&lt;/p&gt;
    </content:encoded>
      <dcterms:modified>2010-03-08T21:13:23+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blog.bjornoya.be,2010:/lab_stacks//1.24</guid>
    </item>
    <item>
      <author>nobody@example.com (osfameron)</author>
      <dc:creator>nobody@example.com (osfameron)</dc:creator>
      <category>mac osx rant tech</category>
      <link>http://greenokapi.net/blog/2010/03/08/notes-on-new-macbook-pro/</link>
      <description>So, I got a Macbook Pro from $new_company (about which more later) and,
as I believe is traditional, here are some notes about the experience.



Setup
=====

Very nice: no rebooting, things just work from more or less the moment
you take it out of the box. (Compare with recent Samsung N140 netbook,
whose Windows 7 install wanted several reboots to install all the
additional antivirus and other crap it comes bundled with.)



Apps
====

My parents, brother, gf, and her mother all have macbooks. And you have
to admit that out of the box they come with a rather well thought out set
of applications for real people. But of course everyone has different
needs, and I immediately installed the following:

(Some are payware, eek! I'm trying them out for 30-day trials, and may
get some through work, others I might be persuaded to pay myself, but
lets see)

  * Adobe Creative Suite 4 (Payware, but a friend works for Adobe, which
    made it seem very much worthwhile, if only for PhotoShop and
    InDesign)

  * Launchbar (App Launcher. Very nice, and apparently shinier than
    QuickSilver, but Payware)

  * Things (Task tracker, seems quite nice. Payware)

  * The Hit List (ditto, trying now after finishing the Things trial)

  * Omnigraffle (really nice design tool. Payware)

  * OmniOutliner (outlining tool. Payware)

  * Miro (torrent client and video player, Free)

  * VLC (Video player. Free)

  * VirtualBox (Virtual machine host. Free)

  * VMWare Fusion (Virtual machine. Payware)

  * Skype (VOIP client - yes, proprietary but family and work use it.
    Free)

  * Telephone (VOIP client without a stupid phone-like UI, yay! Free)

  * Google Chrome (Because Safari still sucks. Free)

  * Firefox (ditto)

  * OpenOffice (Office applications. Now native, so starts quickly unlike
    the old NeoOffice, yay! Free)

  * TextMate (Text editor. Though why would I want anything other than
    Vim. Payware)

  * MacVim (Text editor. Free)

  * Cha-Ching (Money manager. Crashed, not impressed. Payware)

  * Moneywell (ditto. Seemed more stable at least. Payware)

  * GitX (Git client. Shiny. Free)

  * The Haskell Platform (Much easier to install than last time I tried
    on ubuntu... Free)

  * Picasa (Photo manager, though I guess iPhoto is OK. Free)

  * Songbird (Music player. Free)

  * Tweetie (Twitter client. Free I think, I'm certainly not paying for
    one anyway)

Then some file storage apps:

  * DropBox (Remote file storage. Free)

  * BackBlaze (constant remote backup. Without any options. Yay. Bought
    immediately after free trial, as I really like the idea of not losing
    all my data, even though I'm too stupid to manage my own backup).

And some toys for the menu bar:

  * SlimBatteryMonitor

  * MenuMeters

  * MacFuse + fuse-ext2 (to copy my data from external ext3 disk)

  * Growl (Grrr!)

  * Candelair (to attempt to fix apple remote breakage in snow leopard)

And miscellaneous bits and bobs:

  * X-code and brew

  * Xiph-qt, to allow iTunes to play .ogg files

I've not had time to play with all of these, but the overall quality is
pretty good. Installation isn't too bad, though I don't think it's
intuitive to "just drag the icon to the applications folder". You can
tell it's not intuitive by the fact that every .dmg has a different
background image with a large arrow graphic trying to point it. Or by the
fact that my parents launch the one or two applications they've
downloaded by opening them from a .dmg that they have permanently
mounted... sigh...

Ah, there's even an article about this.

But OK, once you know how to do it, it's easy enough. Though I'd like apt,
and should look at MacPorts. I did install brew which is nice for
command-line apps.



Hardware
========

Hardware is nice. Mostly. It doesn't run too hot. I like the lighting on
the keyboard. Actually the keyboard is much nicer than I'd expected (One
of the few really excellent things about the thinkpad was its keyboard,
so I wasn't really expecting all that much from these odd scrabble-keys,
but I'll talk about that in more depth shortly).

The new Mac trackpad is OK. I think I'd rather have a button - it's not
as if you can click anywhere on the trackpad to click, it has to be near
the bottom, so why not just have a button? On the other hand,
tap-to-click works fine. Not having physical buttons means that there
isn't a middle-mouse button. Which is inconvenient in an ubuntu VM, as it
means there's no obvious way to do copy-paste in an xterm... I worried
about this for a while, then came up with the obvious workaround instead
-- use gnome-terminal... (who needs unicode, colours, or stability
anyway?)

The trackpad seems insensitive too for "click; move; click" sequences.
OK, this is mainly a problem for FreeCell and DiceWars, but annoying in
any case.

The screen is nice too. Oh, the screen: this was largely why I had a
sudden wild shift from a 12" supposedly "ultraportable" thinkpad to a 17"
MBP... I decided that I couldn't see enough on a small screen. OK, so the
17" is massive... embarrassingly so when you take it out on a train for
example, but it does make for a great machine to work on.

There are a couple of things I'm not so pleased with though: though the
machine doesn't run hot (like my thinkpad) it does tingle in a
semi-electric-shock way when the power adapter is plugged in (a quick
google suggests this is a fairly common problem). Also the headphones,
while loud and crisp, seem quite noisy. When you have the phones plugged
in, every time a noise occurs, the headphone socket then hisses for half
a minute, then switches itself off again.


Keyboard
--------

The most annoying thing about the keyboard is the odd positioning of the
keys. The # key is hidden away in Alt-3 (but without anything written on
the keyboard to hint that). Oddly under my ubuntu VM (with keyboard set
to Apple MBP) it insists on RightAlt-3. PgUp/PgDn are Fn-Up/Fn-Dn, which
is reasonable but unexpected. Also, there's only one delete key, which
behaves badly in Terminal.app until you set the appropriate options
correctly (why isn't that the default?). Yet, there are some oddities
taking up precious keyboard real estate:

  * WTF is the "±§" key for?

  * Why haven't they moved the Caps Lock key? OK, it's not entirely
    useless, but it has very few use-cases: shouting on IM, or writing
    COBOL. It should be somewhere towards the top-right of the keyboard,
    and not in a place that's easy to mistakenly press it. OK, so no
    other manufacturer moved CapsLock anywhere else, but Apple have
    supposedly "thought" different about the rest of the layout, so why
    not this?

Also, instead of Ctrl being at the very bottom-left (a lovely position,
which means you can press Ctrl without using a finger -- I use the pad of
my left hand) the "Fn" key is there instead. The Thinkpad shares this
idiocy. I've recently been using a 5-year-old HP laptop as a backup, and
despite it being underpowered and falling apart, the 2 things I really
liked, after using a thinkpad, were a) the Ctrl key being in the right
place, and b) that it had a trackpad. (The Thinkpad just had a clitmouse.
After 2 years I learnt how to use it, but still found it hateful. Never
again. But I digress.)


Media keys

Another oddity is the media keys. (Where by "oddity", I'm struggling for
a politer word than "batshit crazy clusterfuck").

I never really got media keys working satisfactorily under Linux, where
they mainly just spoke to the foreground application. So I was hoping
that a bit of Apple shiny would go a long way. Now I'm not a usability
expert, but I'm hoping that my expectation for what a Play/Pause button
should do might not be entirely insane or impractical:

  * if any running app that knows about play/pause declares it is
    "playing" then it should pause

  * else if the currently focused app knows about play/pause, then it
    should start playing

  * else launch the "default media app" and start playing (or, even
    better: don't do anything)

What actually happens is this:

  * The Play/Pause event is sent to every open app. So any app that cares
    about it will:

      * start playing if paused

      * pause if playing

  * also, if iTunes is closed, then it will open

So, if you have VLC open playing a video, and somebody calls you, you
press the Pause button. Then:

  * VLC stops playing

  * Oops, looks like you had Miro open, so it now starts playing

  * Looks like you didn't have iTunes open, you must have wanted that,
    right? So iTunes launches and then starts playing too...

But that's OK. You can press the Pause button to stop the chaos right?

  * Now Miro stops playing

  * iTunes stops playing

  * VLC starts playing again

Apparently this is breakage from 10.6 Snow Leopard, having been sane till
10.5. There is speculation that Apple are trying to make 3rd party apps
look bad by not responding "properly" to the media buttons, while Apple's
own apps do. If that's true, then it's not working. I don't blame VLC. I
don't blame Miro. Dear Apple, you fucked up, please sort it out.

(This isn't just me: various threads including
http://discussions.apple.com/thread.jspa?threadID=2122639 are whining
about this idiocy. The thread mentions a cunning back: if you have
QuickTime open, it acts as a prophylactic against iTunes opening. This is
apparently because the 'loginwindow' process has an exception hardcoded
into it not to launch iTunes if it detects QT running. So not in the
slightest bit insane then.)

I had the same issue with the remote. Yet it's shiny, but if it only
wants to play with iTunes and the useless Front Row (where by useless, I
mean doesn't play my videos, which is what I expected it to) then it's
basically a shiny paperweight. Thanks Apple. I've installed Candelair,
which may possibly help improve this but I've been disinclined to test
properly.



Power Management
================

When the machine resumes from sleep, the external monitor shows static
"snow" for half a minute or so. That's not particularly impressive. A
quick google suggests that older models had similar problems, perhaps
this resurfaces every now and then? I should probably check to see if
it's going to be a deteriorating hardware issue.

On the other hand, it actually resumes. From sleep-to-ram. And
hibernate-to-disk. Every time. Yes, every time!

(Can you tell I've been using Linux-on-laptop for the last 5 years?)

And though I don't think I'm getting anywhere near the 8 hours
advertised, I am to be fair running with a bright screen, a couple of VMs
and so on.



Windowing
=========

This is a mixed bag. Mainly, the windows are less useful/pretty than
Gnome: you can't set windows to Keep-on-top. You can only resize using
the bottom-right control, no Alt-to-drag option. No ability to maximize a
window (ok, so the need for this doesn't come up as often as I'd
expected, but when it does, it's annoying), and new windows don't get
tiled in pretty places as with gnome. Also, more often than I remember
happening under Linux, popup windows get placed underneath the windows
that created them. Meh.

I'm not sure whether I like Finder better than Nautilus. It seems to be
possible to use drag-to-copy into a folder of folders (rather than into
one of the subfolders). On the other hand "type-to-jump-to-filename"
seems to not work consistently (I haven't quite figured which state is
inhibiting this).

When you're using 2 monitors, Mac's single menu bar (on the top of the
screen instead of top of window) becomes a royal pain, as you have to
move the pointer from the external screen back to the laptop's one to use
it. I guess I should learn the command keys to do this without mouse.
Also, if you put the second screen immediately above the first, you
suddenly change the menu bar from being "a mile high" to being a thin
strip of stuff that you have to target. So don't do that (or learn those
key combinations).

Spaces... wasn't sure how to move apps between spaces. But the F8 view is
quite cute when you work out what it is (I was confused by it showing me
what looked like a 4x2 view instead of a 2x2 one... but of course I have
external monitor plugged in... d'oh.) Very cute is that Expose works
while you're in the thumbnail view.

Date/Time applet in menubar is underpowered. Compare to the Gnome one
that has a month calendar view, world date-time and weather. This one
can't even be configured to show the date in the menu bar. It's a prime
candidate for replacement with something actually useful.

The only thing I can think of that might explain the weak Date/Time
applet is that they are trying to sell you on the Dashboard one? If so,
it doesn't work. The Dashboard is a wonderful combination of ugly,
confusing, and useless. Every time I opened it (by accident, mostly) I
would struggle to either get it to do anything useful or, even better,
close again. Luckily there is a 'defaults' setting that prevents it from
opening again. Phew. Bizarre.



Virtual Machines
================

For dev work, I was planning to use VirtualBox, which has the nice
feature of being free. It has a few problems though:

  * networking seems to be hard to setup to work usefully.

  * Swallows some keys. Particularly Ctrl-Arrow to move between spaces,
    and Command-Space for launchbar.

VMWare solves these, though, oddly, it actually seemed slightly harder to
setup. Installing the "guest additions" had to download a large package,
and instead of running it itself expected me to read the system
documentation to know what to do with it (I just ran the perl script from
terminal, which works fine... Not sure why the README file couldn't have
just said that). Still, minimizing friction between guest and host
working is probably worth paying for.



Conclusion
==========

There are some niggles, and some outright baffling brokenness, but
actually I'm quite enjoying working on a Mac.</description>
      <dc:date>0</dc:date>
      <dc:subject>mac osx rant tech</dc:subject>
      <title>Notes on new Macbook Pro</title>
      <pubDate>Mon, 08 Mar 2010 13:54:52 -0000</pubDate>
      <content:encoded>&lt;p&gt;So, I got a Macbook Pro from &lt;tt&gt;$new_company&lt;/tt&gt; (about which more later)
and, as I believe is traditional, here are some notes about the experience.&lt;/p&gt;

&lt;h1&gt;Setup&lt;/h1&gt;

&lt;p&gt;Very nice: no rebooting, things just work from more or less the moment you take
it out of the box.  (Compare with recent Samsung N140 netbook, whose Windows 7
install wanted several reboots to install all the additional antivirus and
other crap it comes bundled with.)&lt;/p&gt;

&lt;h1&gt;Apps&lt;/h1&gt;

&lt;p&gt;My parents, brother, gf, and her mother all have macbooks.  And you have to
admit that out of the box they come with a rather well thought out set of
applications for real people.  But of course everyone has different needs, and
I immediately installed the following:&lt;/p&gt;

&lt;p&gt;(Some are payware, eek!  I'm trying them out for 30-day trials, and may get
some through work, others I might be persuaded to pay myself, but lets see)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adobe Creative Suite 4 (Payware, but a friend works for Adobe, which made it seem very much worthwhile, if only for PhotoShop and InDesign)&lt;/li&gt;
&lt;li&gt;Launchbar (App Launcher.  Very nice, and apparently shinier than QuickSilver, but Payware)&lt;/li&gt;
&lt;li&gt;Things (Task tracker, seems quite nice.  Payware)&lt;/li&gt;
&lt;li&gt;The Hit List (ditto, trying now after finishing the Things trial)&lt;/li&gt;
&lt;li&gt;Omnigraffle (really nice design tool. Payware)&lt;/li&gt;
&lt;li&gt;OmniOutliner (outlining tool. Payware)&lt;/li&gt;
&lt;li&gt;Miro (torrent client and video player, Free)&lt;/li&gt;
&lt;li&gt;VLC (Video player. Free)&lt;/li&gt;
&lt;li&gt;VirtualBox (Virtual machine host.  Free)&lt;/li&gt;
&lt;li&gt;VMWare Fusion (Virtual machine.  Payware)&lt;/li&gt;
&lt;li&gt;Skype (VOIP client - yes, proprietary but family and work use it.  Free)&lt;/li&gt;
&lt;li&gt;Telephone (VOIP client without a stupid phone-like UI, yay!  Free)&lt;/li&gt;
&lt;li&gt;Google Chrome (Because Safari still sucks.  Free)&lt;/li&gt;
&lt;li&gt;Firefox (ditto)&lt;/li&gt;
&lt;li&gt;OpenOffice (Office applications.  Now native, so starts quickly unlike the old NeoOffice, yay!  Free)&lt;/li&gt;
&lt;li&gt;TextMate (Text editor.  Though why would I want anything other than Vim. Payware)&lt;/li&gt;
&lt;li&gt;MacVim (Text editor.  Free)&lt;/li&gt;
&lt;li&gt;Cha-Ching (Money manager.  Crashed, not impressed.  Payware)&lt;/li&gt;
&lt;li&gt;Moneywell (ditto.  Seemed more stable at least. Payware)&lt;/li&gt;
&lt;li&gt;GitX (Git client. Shiny.  Free)&lt;/li&gt;
&lt;li&gt;The Haskell Platform (Much easier to install than last time I tried on ubuntu... Free)&lt;/li&gt;
&lt;li&gt;Picasa (Photo manager, though I guess iPhoto is OK.  Free)&lt;/li&gt;
&lt;li&gt;Songbird (Music player.  Free)&lt;/li&gt;
&lt;li&gt;Tweetie (Twitter client.  Free I think, I'm certainly not paying for one anyway)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then some file storage apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DropBox (Remote file storage.  Free)&lt;/li&gt;
&lt;li&gt;BackBlaze (constant remote backup.  Without any options.  Yay.  Bought immediately after free trial, as I really like the idea of not losing all my data, even though I'm too stupid to manage my own  backup).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And some toys for the menu bar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SlimBatteryMonitor&lt;/li&gt;
&lt;li&gt;MenuMeters&lt;/li&gt;
&lt;li&gt;MacFuse + fuse-ext2 (to copy my data from external ext3 disk)&lt;/li&gt;
&lt;li&gt;Growl (Grrr!)&lt;/li&gt;
&lt;li&gt;Candelair (to attempt to fix apple remote breakage in snow leopard)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And miscellaneous bits and bobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;X-code and brew&lt;/li&gt;
&lt;li&gt;Xiph-qt, to allow iTunes to play .ogg files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've not had time to play with all of these, but the overall quality is pretty
good.  Installation isn't too bad, though I don't think it's intuitive to "just
drag the icon to the applications folder".  You can tell it's not intuitive by
the fact that every .dmg has a different background image with a large arrow
graphic trying to point it.  Or by the fact that my parents launch the one or
two applications they've downloaded by opening them from a .dmg that they have
permanently mounted... sigh...  &lt;/p&gt;

&lt;p&gt;Ah, there's even an &lt;a href="http://daringfireball.net/2009/09/how_should_mac_apps_be_distributed"&gt;article&lt;/a&gt; about this. &lt;/p&gt;

&lt;p&gt;But OK, once you know how to do it, it's easy enough.  Though I'd like
&lt;tt&gt;apt&lt;/tt&gt;, and should look at MacPorts.  I did install &lt;tt&gt;brew&lt;/tt&gt; which
is nice for command-line apps.&lt;/p&gt;

&lt;h1&gt;Hardware&lt;/h1&gt;

&lt;p&gt;Hardware is nice.  Mostly.  It doesn't run too hot.  I like the lighting on the
keyboard.  Actually the keyboard is much nicer than I'd expected (One of the
few really excellent things about the thinkpad was its keyboard, so I wasn't
really expecting all that much from these odd scrabble-keys, but I'll talk
about that in more depth shortly).&lt;/p&gt;

&lt;p&gt;The new Mac trackpad is OK.  I think I'd rather have a button - it's not as if
you can click &lt;em&gt;anywhere&lt;/em&gt; on the trackpad to click, it has to be near the
bottom, so why not just have a button?  On the other hand, tap-to-click works
fine.  Not having physical buttons means that there isn't a middle-mouse
button.  Which is inconvenient in an ubuntu VM, as it means there's no obvious
way to do copy-paste in an xterm... I worried about this for a while, then came
up with the obvious workaround instead -- use gnome-terminal... (who needs
unicode, colours, or stability anyway?)&lt;/p&gt;

&lt;p&gt;The trackpad seems insensitive too for "click; move; click" sequences.  OK,
this is mainly a problem for FreeCell and DiceWars, but annoying in any case.&lt;/p&gt;

&lt;p&gt;The screen is nice too.  Oh, the screen: this was largely why I had a sudden
wild shift from a 12" supposedly "ultraportable" thinkpad to a 17" MBP... I
decided that I couldn't see enough on a small screen.  OK, so the 17" is
&lt;em&gt;massive&lt;/em&gt;... embarrassingly so when you take it out on a train for example, but
it does make for a great machine to work on.&lt;/p&gt;

&lt;p&gt;There are a couple of things I'm not so pleased with though: though the machine
doesn't run hot (like my thinkpad) it does tingle in a semi-electric-shock way
when the power adapter is plugged in (a quick google suggests this is a fairly
common problem).  Also the headphones, while loud and crisp, seem quite noisy.
When you have the phones plugged in, every time a noise occurs, the headphone
socket then hisses for half a minute, then switches itself off again.&lt;/p&gt;

&lt;h2&gt;Keyboard&lt;/h2&gt;

&lt;p&gt;The most annoying thing about the keyboard is the odd positioning of the keys.
The # key is hidden away in Alt-3 (but without anything written on the keyboard
to hint that).  Oddly under my ubuntu VM (with keyboard set to Apple MBP) it
insists on &lt;em&gt;Right&lt;/em&gt;Alt-3.  PgUp/PgDn are Fn-Up/Fn-Dn, which is reasonable but
unexpected.  Also, there's only one delete key, which behaves badly in
Terminal.app until you set the appropriate options correctly (why isn't that
the default?).  Yet, there are some oddities taking up precious keyboard real
estate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WTF is the "±§" key for?&lt;/li&gt;
&lt;li&gt;Why haven't they moved the Caps Lock key?  OK, it's not entirely useless, but it has very few use-cases: shouting on IM, or writing COBOL.  It should be somewhere towards the top-right of the keyboard, and not in a place that's easy to mistakenly press it.  OK, so no other manufacturer moved CapsLock anywhere else, but Apple have supposedly "thought" different about the rest of the layout, so why not this?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, instead of Ctrl being at the very bottom-left (a lovely position, which
means you can press Ctrl without using a finger -- I use the pad of my left
hand) the "Fn" key is there instead.  The Thinkpad shares this idiocy.  I've
recently been using a 5-year-old HP laptop as a backup, and despite it being
underpowered and falling apart, the 2 things I really liked, after using a
thinkpad, were a) the Ctrl key being in the right place, and b) that it had a
trackpad.  (The Thinkpad just had a clitmouse.  After 2 years I learnt how to
use it, but still found it hateful.  Never again.  But I digress.)&lt;/p&gt;

&lt;h3&gt;Media keys&lt;/h3&gt;

&lt;p&gt;Another oddity is the media keys.  (Where by "oddity", I'm struggling for a
politer word than "batshit crazy clusterfuck").&lt;/p&gt;

&lt;p&gt;I never really got media keys working satisfactorily under Linux, where they
mainly just spoke to the foreground application.  So I was hoping that a bit of
Apple shiny would go a long way.  Now I'm not a usability expert, but I'm
hoping that my expectation for what a Play/Pause button should do might not be
entirely insane or impractical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;if any running app that knows about play/pause declares it is "playing" then it should pause&lt;/li&gt;
&lt;li&gt;else if the currently focused app knows about play/pause, then it should start playing&lt;/li&gt;
&lt;li&gt;else launch the "default media app" and start playing (or, even better: don't do anything)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What actually happens is this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Play/Pause event is sent to every open app.  So any app that cares about it will:
&lt;ul&gt;
&lt;li&gt;start playing if paused&lt;/li&gt;
&lt;li&gt;pause if playing&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;also, if iTunes is closed, then it will open&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, if you have VLC open playing a video, and somebody calls you, you press the Pause button.  Then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VLC stops playing&lt;/li&gt;
&lt;li&gt;Oops, looks like you had Miro open, so &lt;b&gt;it&lt;/b&gt; now starts playing&lt;/li&gt;
&lt;li&gt;Looks like you didn't have iTunes open, you must have wanted that, right?  So iTunes launches and then starts playing too...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that's OK.  You can press the Pause button to stop the chaos right?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now Miro stops playing&lt;/li&gt;
&lt;li&gt;iTunes stops playing&lt;/li&gt;
&lt;li&gt;VLC starts playing again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apparently this is breakage from 10.6 Snow Leopard, having been sane till 10.5.
There is speculation that Apple are trying to make 3rd party apps look bad by
not responding "properly" to the media buttons, while Apple's own apps do.  If
that's true, then it's not working.  I don't blame VLC.  I don't blame Miro.
Dear Apple, you fucked up, please sort it out. &lt;/p&gt;

&lt;p&gt;(This isn't just me: various threads including
&lt;a href="http://discussions.apple.com/thread.jspa?threadID=2122639"&gt;http://discussions.apple.com/thread.jspa?threadID=2122639&lt;/a&gt; are whining about
this idiocy.  The thread mentions a cunning back: if you have QuickTime open,
it acts as a prophylactic against iTunes opening.  This is apparently because
the 'loginwindow' process has an exception hardcoded into it not to launch
iTunes if it detects QT running.  So not in the slightest bit insane then.)&lt;/p&gt;

&lt;p&gt;I had the same issue with the remote.  Yet it's shiny, but if it only wants to
play with iTunes and the useless Front Row (where by useless, I mean doesn't
play my videos, which is what I expected it to) then it's basically a shiny
paperweight.  Thanks Apple.  I've installed Candelair, which may possibly help
improve this but I've been disinclined to test properly.&lt;/p&gt;

&lt;h1&gt;Power Management&lt;/h1&gt;

&lt;p&gt;When the machine resumes from sleep, the external monitor shows static "snow"
for half a minute or so.  That's not particularly impressive.  A quick google
suggests that older models had similar problems, perhaps this resurfaces every
now and then?  I should probably check to see if it's going to be a
deteriorating hardware issue.&lt;/p&gt;

&lt;p&gt;On the other hand, it actually resumes.  From sleep-to-ram.  &lt;em&gt;And&lt;/em&gt;
hibernate-to-disk.  Every time.  Yes, every time!&lt;/p&gt;

&lt;p&gt;(Can you tell I've been using Linux-on-laptop for the last 5 years?)&lt;/p&gt;

&lt;p&gt;And though I don't think I'm getting anywhere near the 8 hours advertised, I am
to be fair running with a bright screen, a couple of VMs and so on.&lt;/p&gt;

&lt;h1&gt;Windowing&lt;/h1&gt;

&lt;p&gt;This is a mixed bag.  Mainly, the windows are less useful/pretty than Gnome:
you can't set windows to Keep-on-top.  You can only resize using the
bottom-right control, no Alt-to-drag option.  No ability to maximize a window
(ok, so the need for this doesn't come up as often as I'd expected, but when it
does, it's annoying), and new windows don't get tiled in pretty places as with
gnome.  Also, more often than I remember happening under Linux, popup windows
get placed underneath the windows that created them.  Meh.&lt;/p&gt;

&lt;p&gt;I'm not sure whether I like Finder better than Nautilus.  It seems to be
possible to use drag-to-copy into a folder of folders (rather than into one of
the subfolders).  On the other hand "type-to-jump-to-filename" seems to not
work consistently (I haven't quite figured which state is inhibiting this).&lt;/p&gt;

&lt;p&gt;When you're using 2 monitors, Mac's single menu bar (on the top of the screen
instead of top of window) becomes a royal pain, as you have to move the pointer
from the external screen back to the laptop's one to use it.  I guess I should
learn the command keys to do this without mouse.  Also, if you put the second
screen immediately above the first, you suddenly change the menu bar from being
"a mile high" to being a thin strip of stuff that you have to target.  So don't
do that (or learn those key combinations).&lt;/p&gt;

&lt;p&gt;Spaces... wasn't sure how to move apps between spaces.  But the F8 view is
quite cute when you work out what it is (I was confused by it showing me what
looked like a 4x2 view instead of a 2x2 one... but of course I have external
monitor plugged in... d'oh.)  Very cute is that Expose works while you're in
the thumbnail view.&lt;/p&gt;

&lt;p&gt;Date/Time applet in menubar is underpowered.    Compare to the Gnome one that
has a month calendar view, world date-time and weather.  This one can't even be
configured to show the date in the menu bar.  It's a prime candidate for
replacement with something actually useful.  &lt;/p&gt;

&lt;p&gt;The only thing I can think of that might explain the weak Date/Time applet is
that they are trying to sell you on the Dashboard one?  If so, it doesn't work.
The Dashboard is a wonderful combination of ugly, confusing, and useless.
Every time I opened it (by accident, mostly) I would struggle to either get it
to do anything useful or, even better, close again.  Luckily there is a
'defaults' setting that prevents it from opening again.  Phew.  Bizarre.&lt;/p&gt;

&lt;h1&gt;Virtual Machines&lt;/h1&gt;

&lt;p&gt;For dev work, I was planning to use VirtualBox, which has the nice feature of
being free.  It has a few problems though:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;networking seems to be hard to setup to work usefully.&lt;/li&gt;
&lt;li&gt;Swallows some keys.  Particularly Ctrl-Arrow to move between spaces, and Command-Space for launchbar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;VMWare solves these, though, oddly, it actually seemed slightly harder to
setup.  Installing the "guest additions" had to download a large package, and
instead of running it itself expected me to read the system documentation to
know what to do with it (I just ran the perl script from terminal, which works
fine... Not sure why the README file couldn't have just said that).  Still,
minimizing friction between guest and host working is probably worth paying
for.&lt;/p&gt;

&lt;h1&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;There are some niggles, and some outright baffling brokenness, but actually
I'm quite enjoying working on a Mac.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>0</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://greenokapi.net/blog/?p=175</guid>
    </item>
    <item>
      <author>nobody@example.com (Gabor Szabo)</author>
      <dc:creator>nobody@example.com (Gabor Szabo)</dc:creator>
      <category>Perl, Rehovot, Haifa, Israel, Moose</category>
      <link>http://szabgab.com/blog/2010/03/1268084373.html</link>
      <description>I am happy to announce that the Haifa Perl mongers are going to have a
meeting on the 15th March in the offices of Qualcomm in Matam, Haifa
organized by Shmuel Fomberg. On the agenda is Erez Schatz How to Talk to
Newbies and Yaron Meiry (aka Sawyer) Moose - A postmodern metaclass-based
object system for Perl 5 The meeting will start at 18:30.

For more details please see the announcement and/or contact Shmuel.

The regular Rehovot Perl Monger meeting is going to take place on 16th
March in the Weizmann Institute. Yaron Meiry (aka Sawyer) is going to
give a talk about Moose - A postmodern metaclass-based object system for
Perl 5

For more details please see the web site of the Rehovot Perl Mongers.</description>
      <dc:date>2010-03-08T13:39:33Z</dc:date>
      <dc:subject>Perl, Rehovot, Haifa, Israel, Moose</dc:subject>
      <title>Rehovot and Haifa Perl Monger meetings (15, 16 March)</title>
      <pubDate>Mon, 08 Mar 2010 13:39:33 -0000</pubDate>
      <content:encoded>&lt;p&gt;
I am happy to announce that the Haifa Perl mongers are going to have a meeting on 
the 15th March in the offices of Qualcomm in Matam, Haifa organized by 
&lt;a href="http://www.semuel.co.il/"&gt;Shmuel Fomberg&lt;/a&gt;. On the agenda is
&lt;a href=""&gt;Erez Schatz&lt;/a&gt; &lt;b&gt;How to Talk to Newbies&lt;/b&gt; and Yaron Meiry (aka &lt;a href="http://blogs.perl.org/users/sawyer_x/"&gt;Sawyer&lt;/a&gt;)
&lt;b&gt;&lt;a href="http://moose.perl.org/"&gt;Moose&lt;/a&gt; - A postmodern metaclass-based object system for Perl 5&lt;/b&gt;
The meeting will start at 18:30.
&lt;/p&gt;
&lt;p&gt;
For more details please see &lt;a href="http://mail.perl.org.il/pipermail/perl/2010-March/010848.html"&gt;the announcement&lt;/a&gt; and/or contact
Shmuel.
&lt;/p&gt;
&lt;p&gt;
The regular &lt;a href="http://rehovot.pm.org/"&gt;Rehovot Perl Monger&lt;/a&gt; meeting is going to take place on 16th March in the 
Weizmann Institute. Yaron Meiry (aka &lt;a href="http://blogs.perl.org/users/sawyer_x/"&gt;Sawyer&lt;/a&gt;) is going to give a talk about
&lt;a href="http://moose.perl.org/"&gt;Moose&lt;/a&gt; - A postmodern metaclass-based object system for Perl 5
&lt;/p&gt;
&lt;p&gt;
For more details please see the web site of the Rehovot Perl Mongers.
&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-08T13:39:33Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://szabgab.com/blog/2010/03/1268084373.html</guid>
    </item>
    <item>
      <author>nobody@example.com (dagolden)</author>
      <dc:creator>nobody@example.com (dagolden)</dc:creator>
      <category>cpan-testers metabase perl-programming ironman</category>
      <link>http://www.dagolden.com/index.php/708/cpan-testers-2-0-end-february-update-and-next-steps/</link>
      <description>It’s never great to post an “end-February” report a week into March, but
that’s how things are going lately. I’ve been busy with family and work
obligations that have meant less CT2.0 hacking. I’m sorry this is coming
late, but I hope I will give anyone interested a sense of where things
stand.

I should note that the original deadline for finishing CT2.0 was March 1
and clearly we’re not there yet. I’ve discussed the situation with Robert
and Ask at the Perl NOC, and they’ve been willing to extend the deadline
for cutting off CT1.0 for a while longer. Thank you, Robert and Ask, for
your understanding!

Progress in the last couple weeks:

  * I did some alpha testing of the CT2.0 Metabase hosted on Amazon.
    Based on that, I revised yet again (sigh) the user
    registration/credentials approach to minimize the hassle for old and
    new registrants.

  * Florian Ragwitz wrote a Catalyst app to help distribute new
    credentials files to legacy CT1.0 users. I haven’t deployed it yet
    (since I now need to regenerate all the credentials), but greatly
    appreciate his quick turnaround.

  * I implemented the Metabase search capabilities that Barbie will need
    to update the CPAN Testers statistics database. This will be based on
    the excellent SQL::Abstract approach to WHERE clause construction.

  * I wrote several helper modules to simplify configuration of a CPAN
    Testers metabase in preparation for deployment. The first of these
    has already been uploaded to CPAN: Net::Amazon::Config

  * I finalized the “version 0″ API for the Metabase web service and
    revised the interface between the Catalyst app and the Metabase to
    reflect the latest changes to the library.

In the last several weeks, members the #catalyst and #moose IRC channels
were very, very helpful and patiently answered my many stupid questions.
Thank you in particular to confound, perigrin, rafl, rjbs, stevan and
t0m.

Coming up:

  * Deploy all my new code onto the server for “beta” testing

  * Release all the code to CPAN that people will need to configure their
    clients for beta testing

  * Regenerate user profiles and deploy rafl’s app to distribute them to
    legacy users

  * Whip the server into production shape (e.g. proper boot scripts to
    auto-start the CT2.0 apps on restart)

  * Get back to work on legacy report migration

It’s at the point now where I suspect the “hard thinking” part is pretty
much done and it’s a lot of grotty but straightforward tasks to go.
Hopefully, beta testing won’t reveal any major issues and the end of
March update will be focused on planning on orderly transition from CT1.0
to CT2.0.</description>
      <dc:date>2010-03-08T04:59:04Z</dc:date>
      <dc:subject>cpan-testers metabase perl-programming ironman</dc:subject>
      <title>CPAN Testers 2.0 end-February update and next steps</title>
      <pubDate>Mon, 08 Mar 2010 04:59:04 -0000</pubDate>
      <content:encoded>&lt;p&gt;It&amp;#8217;s never great to post an &amp;#8220;end-February&amp;#8221; report a week into March, but that&amp;#8217;s how things are going lately.  I&amp;#8217;ve been busy with family and work obligations that have meant less CT2.0 hacking.  I&amp;#8217;m sorry this is coming late, but I hope I will give anyone interested a sense of where things stand.&lt;/p&gt;
&lt;p&gt;I should note that the original deadline for finishing CT2.0 was March 1 and clearly we&amp;#8217;re not there yet.  I&amp;#8217;ve discussed the situation with Robert and Ask at the &lt;a href="http://noc.perl.org/"&gt;Perl NOC&lt;/a&gt;, and they&amp;#8217;ve been willing to extend the deadline for cutting off CT1.0 for a while longer.  Thank you, Robert and Ask, for your understanding!&lt;/p&gt;
&lt;p&gt;Progress in the last couple weeks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I did some alpha testing of the CT2.0 Metabase hosted on &lt;a href="http://amazon.com/aws/"&gt;Amazon&lt;/a&gt;.  Based on that, I revised yet again &lt;em&gt;(sigh)&lt;/em&gt; the user registration/credentials approach to minimize the hassle for old and new registrants.&lt;/li&gt;
&lt;li&gt;Florian Ragwitz wrote a &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt; app to help distribute new credentials files to legacy CT1.0 users.  I haven&amp;#8217;t deployed it yet (since I now need to regenerate all the credentials), but greatly appreciate his quick turnaround.&lt;/li&gt;
&lt;li&gt;I implemented the Metabase search capabilities that Barbie will need to update the CPAN Testers statistics database.  This will be based on the excellent &lt;a href="http://search.cpan.org/perldoc?SQL::Abstract"&gt;SQL::Abstract&lt;/a&gt; approach to WHERE clause construction.&lt;/li&gt;
&lt;li&gt;I wrote several helper modules to simplify configuration of a CPAN Testers metabase in preparation for deployment.  The first of these has already been uploaded to CPAN: &lt;a href="http://search.cpan.org/perldoc?Net::Amazon::Config"&gt;Net::Amazon::Config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I finalized the &amp;#8220;version 0&amp;#8243; API for the Metabase web service and revised the interface between the Catalyst app and the Metabase to reflect the latest changes to the library.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the last several weeks, members the #catalyst and #moose IRC channels were very, very helpful and patiently answered my many stupid questions.  Thank you in particular to confound, perigrin, rafl, rjbs, stevan and t0m.&lt;/p&gt;
&lt;p&gt;Coming up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deploy all my new code onto the server for &amp;#8220;beta&amp;#8221; testing&lt;/li&gt;
&lt;li&gt;Release all the code to CPAN that people will need to configure their clients for beta testing&lt;/li&gt;
&lt;li&gt;Regenerate user profiles and deploy rafl&amp;#8217;s app to distribute them to legacy users&lt;/li&gt;
&lt;li&gt;Whip the server into production shape (e.g. proper boot scripts to auto-start the CT2.0 apps on restart)&lt;/li&gt;
&lt;li&gt;Get back to work on legacy report migration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;#8217;s at the point now where I suspect the &amp;#8220;hard thinking&amp;#8221; part is pretty much done and it&amp;#8217;s a lot of grotty but straightforward tasks to go.  Hopefully, beta testing won&amp;#8217;t reveal any major issues and the end of March update will be focused on planning on orderly transition from CT1.0 to CT2.0.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-08T04:59:04Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.dagolden.com/?p=708</guid>
    </item>
    <item>
      <author>nobody@example.com (Patrick)</author>
      <dc:creator>nobody@example.com (Patrick)</dc:creator>
      <category>Comp Perl</category>
      <link>http://blog.patspam.com/2010/perlsharedhosting</link>
      <description>  Latest Web::Simple master
  (git://git.shadowcat.co.uk/catagits/Web-Simple.git) is now using
  Plack, the perl web server directly for CGI and FastCGI and I hope do
  do another release shortly with notes on deploying as both on shared
  hosts (more specifically Dreamhost but with an invitation to bitch if
  they don’t work on other budget hosts).

  mst, ”Oh Subdispatch, Oh Subdispatch“

Every time someone mentions a cool new web framework like Web::Simple,
Dancer or Tatsumaki, my immediate reaction is to start thinking up cool
little niche web apps I could build with it. You know, the kind you
imagine yourself whipping up during your lunch break, that will probably
never get more than 10 curious users but just might turn into the next
big thing if only you got it up and running on a public server. And
that’s when the second thought immediately arrives: where am I going to
run this thing? Do I really think the idea has enough legs to justify
paying for a virtual server plan? Can I be bothered going through the
pain of figuring out how to deploy it on a shared hosting provider? And
normally that’s the point where I sigh wistfully and go back to reading
my RSS feeds.

The thing is, with the advent of things like local::lib it’s getting a
lot easier to deploy Perl web apps on shared hosting. And with most web
frameworks adopting Plack/PSGI, the work required to deploy Perl web apps
on budget hosts is converging into a similar sequence of steps.

So this time during my lunch break I started envisaging a centralised,
SEO-friendly information source (hello perlsharedhosting.com) that
cobbles together all of the currently available information into an easy
to digest form to make it ridiculously easy to choose a shared hosting
provider, deploy your web app and troubleshoot common problems.

A site that works like this:

  * The front page contains a list of Perl-friendly hosting providers,
    with a meta-score based on how many features they support (+) and how
    many unresolved issues they have (-), and maybe user review scores
    thrown into the mix too

  * Each hosting provider has a page of its own, listing in full which
    features are supported (used to compute the meta-score). Users can
    post comments on each of these pages, to leave testimonials (“I am
    currently running a Web::Simple site that gets x hits per hour on
    this host”) and note unresolved issues (“module X::Y fails to install
    on this host”). As issues get solved these become tips.

  * Each technology/feature/technique also gets a page of its own, with
    links to the official man pages, shared-hosting specific notes and
    again user comments

      * dependency related: local::lib, cpan, cpanm, ..

      * environment related: locating and running perl, paths, daemons,
        viewing error output, ..

      * web deployment related: CGI, FastCGI, ..

      * framework / web app related: Web::Simple, Dancer, MojoMojo,
        Catalyst, Tatsumaki, ..

I haven’t decided yet what engine would fit best.. MojoMojo is a
front-runner, and in fact the Catalyst Friendly Hosting page runs on
MojoMojo does a large chunk of what I’ve described above.

The site would be very “cookbook” oriented, since we’re specifically
targeting people who can’t be bothered learning the ins and outs of 10
different technologies (not to mention figuring out how to get them to
play nicely together) for the sake of deploying toy web applications on
cheap shared hosting. Just the essentials: this is what you need, this is
how you achieve it. And if you want to learn more, go here.

With that in place, we’d end up with a single, visible, place to research
and document the complications of running Perl web apps on shared
hosting. And if the site became popular, hosting providers might even
take notice and start offering more Perl-friendly shared environments. We
could have live demo pages running on different hosts, possibly even
donated by hosting providers if they see it as a way of showcasing their
Perl-friendliness (mojomojo.dreamhost.perlsharedhosting.com,
dancer.resellerzoom.perlsharedhosting.com, etc..).

I got as far as registering the domain name; I was planning on getting a
simple MojoMojo prototype up and running, but I got side-tracked
researching how to deploy it on my shared hosting account…</description>
      <dc:date>2010-03-08T01:23:45Z</dc:date>
      <dc:subject>Comp Perl</dc:subject>
      <title>PerlSharedHosting</title>
      <pubDate>Mon, 08 Mar 2010 01:23:45 -0000</pubDate>
      <content:encoded>&lt;blockquote&gt;&lt;p&gt;Latest Web::Simple master (git://git.shadowcat.co.uk/catagits/Web-Simple.git) is now using &lt;a href="http://plackperl.org/"&gt;Plack, the perl web server&lt;/a&gt; directly for CGI and FastCGI and I hope do do another release shortly with notes on deploying as both on shared hosts (more specifically &lt;a href="http://www.dreamhost.com/"&gt;Dreamhost&lt;/a&gt; but with an invitation to bitch if they don&amp;#8217;t work on other budget hosts).&lt;/p&gt;
&lt;p&gt;mst,  &amp;#8221;&lt;a href="http://www.shadowcat.co.uk/blog/matt-s-trout/oh-subdispatch-oh-subdispatch/"&gt;Oh Subdispatch, Oh Subdispatch&lt;/a&gt;&amp;#8220;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Every time someone mentions a cool new web framework like &lt;a href="http://search.cpan.org/perldoc?Web::Simple"&gt;Web::Simple&lt;/a&gt;, &lt;a href="http://perldancer.org/"&gt;Dancer&lt;/a&gt; or &lt;a href="http://search.cpan.org/perldoc?Tatsumaki"&gt;Tatsumaki&lt;/a&gt;, my immediate reaction is to start thinking up cool little niche web apps I could build with it. You know, the kind you imagine yourself whipping up during your lunch break, that will probably never get more than 10 curious users but just might turn into the next big thing if only you got it up and running on a public server. And that&amp;#8217;s when the second thought immediately arrives: where am I going to run this thing? Do I really think the idea has enough legs to justify paying for a virtual server plan? Can I be bothered going through the pain of figuring out how to deploy it on a shared hosting provider? And normally that&amp;#8217;s the point where I sigh wistfully and go back to reading my RSS feeds.&lt;/p&gt;
&lt;p&gt;The thing is, with the advent of things like &lt;a href="http://search.cpan.org/perldoc?local::lib"&gt;local::lib&lt;/a&gt; it&amp;#8217;s getting a lot easier to deploy Perl web apps on shared hosting. And with most web frameworks adopting &lt;a href="http://plackperl.org/"&gt;Plack/PSGI&lt;/a&gt;, the work required to deploy Perl web apps on budget hosts is converging into a similar sequence of steps.&lt;/p&gt;
&lt;p&gt;So this time during my lunch break I started envisaging a centralised, SEO-friendly information source (hello &lt;a href="http://perlsharedhosting.com"&gt;perlsharedhosting.com&lt;/a&gt;) that cobbles together all of the currently available information into an easy to digest form to make it ridiculously easy to choose a shared hosting provider, deploy your web app and troubleshoot common problems.&lt;/p&gt;
&lt;p&gt;A site that works like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The front page contains a list of Perl-friendly hosting providers, with a meta-score based on how many features they support (+) and how many unresolved issues they have (-), and maybe user review scores thrown into the mix too&lt;/li&gt;
&lt;li&gt;Each hosting provider has a page of its own, listing in full which features are supported (used to compute the meta-score). Users can post comments on each of these pages, to leave testimonials (&amp;#8220;I am currently running a Web::Simple site that gets x hits per hour on this host&amp;#8221;) and note unresolved issues (&amp;#8220;module X::Y fails to install on this host&amp;#8221;). As issues get solved these become tips.&lt;/li&gt;
&lt;li&gt;Each technology/feature/technique also gets a page of its own, with links to the official man pages, shared-hosting specific notes and again user comments
&lt;ul&gt;
&lt;li&gt;dependency related: &lt;a href="http://search.cpan.org/perldoc?local::lib"&gt;local::lib&lt;/a&gt;, cpan, &lt;a href="http://search.cpan.org/perldoc?App::cpanminus"&gt;cpanm&lt;/a&gt;, ..&lt;/li&gt;
&lt;li&gt;environment related: locating and running perl, paths, daemons, viewing error output, ..&lt;/li&gt;
&lt;li&gt;web deployment related: CGI, FastCGI, ..&lt;/li&gt;
&lt;li&gt;framework / web app related: &lt;a href="http://search.cpan.org/perldoc?Web::Simple"&gt;Web::Simple&lt;/a&gt;, &lt;a href="http://perldancer.org/"&gt;Dancer&lt;/a&gt;, &lt;a href="http://mojomojo.org/"&gt;MojoMojo&lt;/a&gt;, &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt;, &lt;a href="http://search.cpan.org/perldoc?Tatsumaki"&gt;Tatsumaki&lt;/a&gt;, ..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I haven&amp;#8217;t decided yet what engine would fit best.. &lt;a href="http://mojomojo.org/"&gt;MojoMojo&lt;/a&gt; is a front-runner, and in fact the &lt;a href="http://wiki.catalystframework.org/wiki/hosting"&gt;Catalyst Friendly Hosting&lt;/a&gt; page runs on &lt;a href="http://mojomojo.org/"&gt;MojoMojo&lt;/a&gt; does a large chunk of what I&amp;#8217;ve described above.&lt;/p&gt;
&lt;p&gt;The site would be very &amp;#8220;cookbook&amp;#8221; oriented, since we&amp;#8217;re specifically targeting people who can&amp;#8217;t be bothered learning the ins and outs of 10 different technologies (not to mention figuring out how to get them to play nicely together) for the sake of deploying toy web applications on cheap shared hosting. Just the essentials: this is what you need, this is how you achieve it. And if you want to learn more, go here.&lt;/p&gt;
&lt;p&gt;With that in place, we&amp;#8217;d end up with a single, visible, place to research and document the complications of running Perl web apps on shared hosting. And if the site became popular, hosting providers might even take notice and start offering more Perl-friendly shared environments. We could have live demo pages running on different hosts, possibly even donated by hosting providers if they see it as a way of showcasing their Perl-friendliness (mojomojo.dreamhost.perlsharedhosting.com, dancer.resellerzoom.perlsharedhosting.com, etc..).&lt;/p&gt;
&lt;p&gt;I got as far as registering the &lt;a href="http://perlsharedhosting.com"&gt;domain name&lt;/a&gt;; I was planning on getting a simple &lt;a href="http://mojomojo.org/"&gt;MojoMojo&lt;/a&gt; prototype up and running, but I got side-tracked researching how to deploy it on my shared hosting account&amp;#8230;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-08T01:23:45Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://blog.patspam.com/?p=1327</guid>
    </item>
    <item>
      <author>nobody@example.com (admin)</author>
      <dc:creator>nobody@example.com (admin)</dc:creator>
      <category>CeBit 2010 English CPAN EN Release</category>
      <link>http://padre-ide.de/blog/?p=127</link>
      <description>Perl::Staff has just been released as version 0.02 which includes updated
and new blog links to CeBit reports and fixes some POD char and
formatting errors.

Look at it on CPAN or grab and perldoc it :-)</description>
      <dc:date>2010-03-07T22:50:58+01:00</dc:date>
      <dc:subject>CeBit 2010 English CPAN EN Release</dc:subject>
      <title>Perl::Staff 0.02</title>
      <pubDate>Sun, 07 Mar 2010 22:50:58 +0100</pubDate>
      <content:encoded>&lt;p&gt;&lt;a href="http://search.cpan.org/perldoc?Perl::Staff"&gt;Perl::Staff&lt;/a&gt; has just been released as version 0.02 which includes updated and new blog links to CeBit reports and fixes some POD char and formatting errors.&lt;/p&gt;
&lt;p&gt;Look at it on CPAN or grab and perldoc it &lt;img src="http://padre-ide.de/blog/wp-includes/images/smilies/icon_smile.gif" alt=":-)"&gt; &lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-07T22:50:58+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://padre-ide.de/blog/?p=127</guid>
    </item>
    <item>
      <author>nobody@example.com (franck)</author>
      <dc:creator>nobody@example.com (franck)</dc:creator>
      <category>ironman github perl visualization</category>
      <link>http://lumberjaph.net/blog/index.php/2010/03/07/github-explorer-a-preview/</link>
      <description>For the last weeks, I’ve been working on the successor of CPAN Explorer.
This time, I’ve decided to create some visualizations (probably 8) of the
various communities using Github. I’m happy with the result, and will
soon start to publish the maps (statics and interactives) with some
analyses. I’m publishing two previews: the Perl community and the
european developers. These are not final results. The colors, fonts, and
layout may change. But the structure of the graphs will be the same. All
the data was collected using the github API.

the Perl community on github

Each node on the graph represents a developer. When a developer “follows”
another developer on github, a link between them is created. The color on
the Perl community map represent the countries of the developer. One of
the most visible things on this graph is that the japanese community is
tighly connected and shares very little contact with the foreign
developers. miyagawa obviously acts as a glue between japanese and
worldwide Perl hackers.

European developers on github

The second graph is a little bit more complex. It represents the European
developers on github. Here the colors represent the languages used by the
developers. It appears that ruby is by far the most represented language
on github, as it dominates the whole map. Perl is the blue cluster at the
bottom of the map, and the green snake is… Python.

Thanks to bl0b for his suggestions :)</description>
      <dc:date>2010-03-07T19:38:09+01:00</dc:date>
      <dc:subject>ironman github perl visualization</dc:subject>
      <title>github explorer - a preview</title>
      <pubDate>Sun, 07 Mar 2010 19:38:09 +0100</pubDate>
      <content:encoded>&lt;p&gt;For the last weeks, I&amp;#8217;ve been working on the successor of &lt;a href="http://cpan-explorer.org/"&gt;CPAN Explorer&lt;/a&gt;. This time, I&amp;#8217;ve decided to create some visualizations (probably 8) of the various communities using &lt;a href="http://github.com/"&gt;Github&lt;/a&gt;. I&amp;#8217;m happy with the result, and will soon start to publish the maps (statics and interactives) with some analyses. I&amp;#8217;m publishing two previews: the Perl community and the european developers. These are not final results. The colors, fonts, and  layout may change. But the structure of the graphs will be the same. All the data was collected using the &lt;a href="http://develop.github.com/"&gt;github API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/franck_/4413528529/sizes/l/"&gt;&lt;img src="http://franck.lumberjaph.net/github-perl-preview.png" alt="the Perl community on github"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Each node on the graph represents a developer. When a developer &amp;#8220;follows&amp;#8221; another developer on github, a link between them is created. The color on the Perl community map represent the countries of the developer. One of the most visible things on this graph is that the japanese community is tighly connected and shares very little contact with the foreign developers. miyagawa obviously acts as a glue between japanese and worldwide Perl hackers.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/franck_/4414287310/sizes/o/in/photostream/"&gt;&lt;img src="http://franck.lumberjaph.net/github-europe-preview.png" alt="European developers on github"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The second graph is a little bit more complex. It represents the European developers on github. Here the colors represent the languages used by the developers. It appears that ruby is by far the most represented language on github, as it dominates the whole map. Perl is the blue cluster at the bottom of the map, and the green snake is&amp;#8230; Python.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href="http://code.google.com/p/tinyaml/"&gt;bl0b&lt;/a&gt; for his suggestions :)&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-07T19:38:09+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://lumberjaph.net/blog/?p=608</guid>
    </item>
    <item>
      <author>nobody@example.com (sukria)</author>
      <dc:creator>nobody@example.com (sukria)</dc:creator>
      <category>Programming Dancer Perl</category>
      <link>http://www.sukria.net/fr/archives/2010/03/07/dancer-1-160-released/</link>
      <description>A new version of Dancer has been published to CPAN a few minutes ago,
it’s also available from the official website, in the download section.

As you can see, the project has now its own domain name:
http://perldancer.org, it’s clearly more shiny than the previous
subdomain I used ;) So feel free to update your bookmarks (even though
the old domain name now redirects to the new one).

Oh, and there is also a mailing list now, for people who like to share
experiences about Dancer; feel free to join.

The change set for 1.160 is impressive, thanks a lot to everybody who got
involved!

Happy dancing.</description>
      <dc:date>2010-03-07T19:03:44+01:00</dc:date>
      <dc:subject>Programming Dancer Perl</dc:subject>
      <title>Dancer 1.160 released</title>
      <pubDate>Sun, 07 Mar 2010 19:03:44 +0100</pubDate>
      <content:encoded>&lt;p&gt;A &lt;a href="http://search.cpan.org/~sukria/Dancer-1.160/"&gt;new version&lt;/a&gt; of &lt;a href="http://perldancer.org"&gt;Dancer&lt;/a&gt; has been published to CPAN a few minutes ago, it&amp;#8217;s also available from the official website, in &lt;a href="http://perldancer.org/download"&gt;the download section&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As you can see, the project has now its own domain name: &lt;a href="http://perldancer.org"&gt;http://perldancer.org&lt;/a&gt;, it&amp;#8217;s clearly more shiny than the previous subdomain I used ;) So feel free to update your bookmarks (even though the old domain name now redirects to the new one).&lt;/p&gt;
&lt;p&gt;Oh, and there is also a mailing list now, for people who like to share experiences about Dancer; feel free to &lt;a href="http://lists.perldancer.org/cgi-bin/listinfo/dancer-users"&gt;join&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://cpansearch.perl.org/src/SUKRIA/Dancer-1.160/CHANGES"&gt;change set&lt;/a&gt; for 1.160 is impressive, thanks a lot to everybody who got involved!&lt;/p&gt;
&lt;p&gt;Happy dancing.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-07T19:03:44+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.sukria.net/fr/?p=1485</guid>
    </item>
    <item>
      <author>nobody@example.com (Sewi)</author>
      <dc:creator>nobody@example.com (Sewi)</dc:creator>
      <category>CeBit 2010 Deutsch EN Perl PHP</category>
      <link>http://padre-ide.de/blog/?p=107</link>
      <description>Thank you for reading this article. If you continue, please read it
completly before judging or writing about it and expecially before using
any information written here!

We were talking to many PHP guys on CeBit 2010. I tried showing the huge
power of Perl but – as far as I remember – I never said anybody “forget
PHP”. Here are the most important items (odered by usual order of
appereance):


1. You don’t need to learn Perl

Neither PHP not Perl people like that fact, but PHP was originally based
on Perl. There are still many similarities between both considering
keywords and syntax. But most PHP people agree if you say: “If you know
PHP, you basically know a good amount of Perl.”


2. CPAN

There are about 20.000 modules for all kinds of things on CPAN, like
database access, file parsing, templating and math and all of them are
free. All CPAN modules could be installed by a CPAN client which usually
comes with your Perl.

Please tell me if you know any other language which has something
comparable.


3. DBIx::Class

Most of the PHP users also use MySQL but for the full time of CeBit 2010,
I met only one person (who actually was a database expert with some PHP
knowledge) who answered the question “Do you like to write SQL
statements, expecially SELECT JOINs over some tables?” with yes, all
others answered between “no”, “not really” and “less than writing PHP”.

Basically DBIx::Class abstracts the SQL statement layer: Your source
dosn’t need to contain one SQL statement any longer. The results are:

  * No need to SELECT JOIN, just point DBIx::Class to some property of
    the table row you need, maybe using a referenced table in just one
    line of source.

  * Once you got your object, you could use all referenced tables as
    simple childs. Sample: $user-&gt;customer-&gt;company gets the company name
    out of the customer table starting from the user table pointing to
    the customer table.

  * DBIx::Class reduces database load by fetchting the object when it’s
    first actually used, not at the time the object is created.

  * DBIx::Class makes SQL injection impossible because it’s encapsulated
    by DBIx::Class without any additional development.

  * Reduces development time of database actions by about 50% compared to
    writing SQL statements (depending on the developer, of course)

Nothing written above has anything to do with comparing PHP and Perl.
It’s just comparing DBIx::Class to $dbh-&gt;select… (or other ways sending
SQL statements in other languages). There is something on PHP which might
be compareable to DBIx::Class even (up to me) it isn’t nearly as powerful
as DBIx::Class, but most PHP – people I met on CeBit 2010 were still
writing plain SQL statements – as I did about eight month ago.

Also remember that using DBIx::Class will introduce a slight part of OOP
even to people who don’t actually use it. Up to me this would be the
preferred way of starting OOP development because it’s a slow start – you
could add more and more OOP as time goes by and you feel ready to look
into another world.


4. Catalyst and Template::Toolkit

There are technologies for PHP which are really better in many situations
than these two. Catalyst is a complete Web framework which reduces the
typical programming amount for weblications and Template::Toolkit (TT)
provides a very powerful template engine, but I was working together with
some webdesigners in the past which can’t handle it because it was too
programmish.

If you pass a DBIx::Class object to TT, the one writing the HTML code
could easily access all data of the table row including any child objects
and any future changes to the table structure without any additional
application source.


5. Coming back to CPAN

I wrote about three examples of the more than 20.000 CPAN modules, but if
you ask people what else do they want to do and live-search for it on
CPAN, it usually gives you some results. Please recheck this if/when the
CPAN search engine (which shows modules even on very slow relations to
the search) is being fixed.

Good samples to show are

  * Parse::CSV for parsing CSV files in two minutes development time
    instead of ten

  * Creating or modifiing PDF files

  * Accessing external things like network servers of any kind


6. How to start

Padre, the free Perl IDE comes with some few lessons within the examples,
not enough for really learning Perl but good for looking into the syntax.

The next step would be http://learn.perl.org for many more resources how
to learn Perl.

If you want to meet the community, look at the PerlMongers groups who
meet maybe also in your area.


If you don’t even want to look at Perl…
---------------------------------------

…you should at least try Padre which also has a PHP plugin for working on
PHP files. You’re welcome to improve it by testing or changing the
source.

Last notice: Writing Padre Plugins in PHP should theoretically be
possible using the Parrot engine, if you want to try it, please add your
experiences to the Padre Trac wiki.</description>
      <dc:date>2010-03-07T17:51:16+01:00</dc:date>
      <dc:subject>CeBit 2010 Deutsch EN Perl PHP</dc:subject>
      <title>Things I showed to people not knowing Perl but PHP</title>
      <pubDate>Sun, 07 Mar 2010 17:51:16 +0100</pubDate>
      <content:encoded>&lt;h3&gt;&lt;strong&gt;&lt;em&gt;Thank you for reading this article. If you continue, please read it completly before judging or writing about it and expecially before using any information written here!&lt;/em&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;We were talking to many PHP guys on &lt;a href="http://search.cpan.org/perldoc?Perl%3a%3aStaff#CeBit"&gt;CeBit 2010&lt;/a&gt;. I tried showing the huge power of Perl but &amp;#8211; as far as I remember &amp;#8211; I never said anybody &amp;#8220;forget PHP&amp;#8221;. Here are the most important items (odered by usual order of appereance):&lt;/p&gt;
&lt;h3&gt;1. You don&amp;#8217;t need to learn Perl&lt;/h3&gt;
&lt;p&gt;Neither PHP not Perl people like that fact, but PHP was originally based on Perl. There are still many similarities between both considering keywords and syntax. But most PHP people agree if you say: &amp;#8220;If you know PHP, you basically know a good amount of Perl.&amp;#8221;&lt;/p&gt;
&lt;h3&gt;2. CPAN&lt;/h3&gt;
&lt;p&gt;There are about 20.000 modules for all kinds of things on CPAN, like database access, file parsing, templating and math and all of them are free. All CPAN modules could be installed by a CPAN client which usually comes with your Perl.&lt;/p&gt;
&lt;p&gt;Please tell me if you know any other language which has something comparable.&lt;/p&gt;
&lt;h3&gt;3. DBIx::Class&lt;/h3&gt;
&lt;p&gt;Most of the PHP users also use MySQL but for the full time of CeBit 2010, I met only one person (who actually was a database expert with some PHP knowledge) who answered the question &amp;#8220;Do you like to write SQL statements, expecially SELECT JOINs over some tables?&amp;#8221; with yes, &lt;em&gt;all&lt;/em&gt; others answered between &amp;#8220;no&amp;#8221;, &amp;#8220;not really&amp;#8221; and &amp;#8220;less than writing PHP&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Basically DBIx::Class abstracts the SQL statement layer: Your source dosn&amp;#8217;t need to contain one SQL statement any longer. The results are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No need to SELECT JOIN, just point DBIx::Class to some property of the table row you need, maybe using a referenced table in just one line of source.&lt;/li&gt;
&lt;li&gt;Once you got your object, you could use all referenced tables as simple childs. Sample: $user-&amp;gt;customer-&amp;gt;company gets the company name out of the customer table starting from the user table pointing to the customer table.&lt;/li&gt;
&lt;li&gt;DBIx::Class reduces database load by fetchting the object when it&amp;#8217;s first actually used, not at the time the object is created.&lt;/li&gt;
&lt;li&gt;DBIx::Class makes SQL injection impossible because it&amp;#8217;s encapsulated by DBIx::Class without any additional development.&lt;/li&gt;
&lt;li&gt;Reduces development time of database actions by about 50% compared to writing SQL statements (depending on the developer, of course)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nothing written above has anything to do with comparing PHP and Perl. It&amp;#8217;s just comparing DBIx::Class to $dbh-&amp;gt;select&amp;#8230; (or other ways sending SQL statements in other languages). There is something on PHP which might be compareable to DBIx::Class even (up to me) it isn&amp;#8217;t nearly as powerful as DBIx::Class, but most PHP &amp;#8211; people I met on CeBit 2010 were still writing plain SQL statements &amp;#8211; as I did about eight month ago.&lt;/p&gt;
&lt;p&gt;Also remember that using DBIx::Class will introduce a slight part of OOP even to people who don&amp;#8217;t actually use it. Up to me this would be the preferred way of starting OOP development because it&amp;#8217;s a slow start &amp;#8211; you could add more and more OOP as time goes by and you feel ready to look into another world.&lt;/p&gt;
&lt;h3&gt;4. Catalyst and Template::Toolkit&lt;/h3&gt;
&lt;p&gt;There are technologies for PHP which are really better in many situations than these two. Catalyst is a complete Web framework which reduces the typical programming amount for weblications and &lt;a href="http://search.cpan.org/perldoc%3fTemplate%3a%3aToolkit"&gt;Template::Toolkit&lt;/a&gt; (TT) provides a very powerful template engine, but I was working together with some webdesigners in the past which can&amp;#8217;t handle it because it was too programmish.&lt;/p&gt;
&lt;p&gt;If you pass a &lt;a href="http://search.cpan.org/perldoc?DBIx::Class"&gt;DBIx::Class&lt;/a&gt; object to TT, the one writing the HTML code could easily access all data of the table row &lt;em&gt;including&lt;/em&gt; any child objects and any future changes to the table structure without any additional application source.&lt;/p&gt;
&lt;h3&gt;5. Coming back to CPAN&lt;/h3&gt;
&lt;p&gt;I wrote about three examples of the more than 20.000 CPAN modules, but if you ask people what else do they want to do and live-search for it on CPAN, it usually gives you some results. Please recheck this if/when the CPAN search engine (which shows modules even on very slow relations to the search) is being fixed.&lt;/p&gt;
&lt;p&gt;Good samples to show are&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Parse::CSV"&gt;Parse::CSV&lt;/a&gt; for parsing CSV files in two minutes development time instead of ten&lt;/li&gt;
&lt;li&gt;Creating or modifiing PDF files&lt;/li&gt;
&lt;li&gt;Accessing external things like network servers of any kind&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. How to start&lt;/h3&gt;
&lt;p&gt;Padre, the free &lt;a href="http://padre.perlide.org"&gt;Perl IDE&lt;/a&gt; comes with some few lessons within the examples, not enough for really learning Perl but good for looking into the syntax.&lt;/p&gt;
&lt;p&gt;The next step would be &lt;a href="http://learn.perl.org"&gt;http://learn.perl.org&lt;/a&gt; for many more resources how to learn Perl.&lt;/p&gt;
&lt;p&gt;If you want to meet the community, look at the &lt;a href="http://pm.org"&gt;PerlMongers&lt;/a&gt; groups who meet maybe also in your area.&lt;/p&gt;
&lt;h2&gt;If you don&amp;#8217;t even want to look at Perl&amp;#8230;&lt;/h2&gt;
&lt;p&gt;&amp;#8230;you should at least try Padre which also has a PHP plugin for working on PHP files. You&amp;#8217;re welcome to improve it by testing or changing the source.&lt;/p&gt;
&lt;p&gt;Last notice: Writing Padre Plugins in PHP should theoretically be possible using the Parrot engine, if you want to try it, please add your experiences to the &lt;a href="http://padre.perlide.org"&gt;Padre&lt;/a&gt; &lt;a href="http://padre.perlide.org/trac/"&gt;Trac wiki&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-07T17:51:16+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://padre-ide.de/blog/?p=107</guid>
    </item>
    <item>
      <author>nobody@example.com (Sewi)</author>
      <dc:creator>nobody@example.com (Sewi)</dc:creator>
      <category>CeBit 2010 EN Perl</category>
      <link>http://padre-ide.de/blog/?p=111</link>
      <description>Five days CeBit 2010 are over now. Perl was lucky to be one of 15 open
source projects who got a booth for free, sponsored by the CeBit and
Linux New Media.


Facts about CeBit 2010:
-----------------------

  * 334.000 visitors

  * 4.157 exhibitors from 68 countries

  * 3% more visitors per day (until friday)

  * 80% business visitors (until friday)

(source: http://www.cebit.de)

The first two days were the most successful ones in terms of business
contacts and interest in Perl.

Wednesday to friday also went good on contacts even if the amount of
private visitors increased a little bit each day.

Saturday was mostly private day, many young people came to our booth and
asked about Perl.


We planned to…
--------------

…introduce Perl to the companies we may meet there. Three special project
days were planned for Padre, Foswiki and OTRS where people of these
projects planned to be at the booth. We also had beermats of DBIx::Class,
Moose and Catalyst, some Tuits and many many marketing papers for
distribution.


We failed on…
-------------

…bringing Perl into the companies because we learned that most companies
already use Perl; for many applications like

  * basic network management

  * oneliners for quick testing

  * data conversion

  * preprocessing high volume print job data

  * many things in banking business

  * telecommunication and internet processing

  * health data processing and analysis

If I’d write down the company names for each sample, you’d be as
surprised as we were, but most people visiting us were developers or IT
managers and they’re usually not allowed to give us permission to write
that their company uses Perl.

Some few companies refused to be published at all for security reasons
and I will respect this, but the other Perl::Staff people and I are in
contact with the people we meet and I hope that we’ll be able to publish
the first company names with official approval during the next week.


We learned…
-----------

…many things including that we brought something for every visitor to our
booth:

  * Developers currently using (Visual) Basic, PHP or Phyton were mostly
    interested to hear about Perl and Padre

  * Java, C++ and C developers usually liked the idea that Perl could
    easily test their programs because most of them didn’t do any
    automated tests at all

  * All the OOP people (Java, C++ and others) were really impressed about
    Moose

  * Everybody using SQL statements wondered how much DBIx::Class could
    speed up their development

  * Most developers found Padre interesting (except of one guy using the
    Progress language which currently isn’t supported)

  * Businessmen not developing themself were impressed that Foswiki is
    able to limit read and/or write access to documents to users or
    groups and could be used for employees, the public homepage and
    printing brochures and manual books without maintaining three
    individual copies of the same document

  * A women leading the account department of her company confirmed
    heavily that customers like to write mails to the wrong department,
    ask the same things multiple times each day and love to write
    question mails without and required information. We “sold” her OTRS
    which manages incoming requests, has groups, allows tracing of
    who-did-what-and-when and simple forwarding of requests to the
    correct group while terms of open source “sold” stands for “promised
    to download and try it” :-)

  * It’s easier to actually run a booth even on such a big event like
    CeBit than we expected, but

  * it’s much more tiering to run a booth on such a big event like CeBit
    than we expected.


It was really nice…
-------------------

to meet szabgab, reneeb, getty and the other Perl::Staff people in
reality.

Szabgab and I had interesting discussions in the evening, some new ideas
were born and I learned many things about Perl, the Perl community and
Perl-related tools on the net.

Getty donated some Vodka to Hessen (actually to their booth people) and
also enjoyed the other after-CeBit-parties (I think).


Final results and thanks
------------------------

We talked to some of the people from other projects and Britta from Linux
New Media while packing our things together on Saturday evening and most
of them (including us) said that Perl was “the winner” of this event. I
think we were one of the projects getting the most visiters within the
Open Source Lounge, learned very much about running a booth and Perl
usage.

Very big thanks go to Andreas “ads”, the Postgres guy, he told us about
the OpenSource Lounge and how to get there.

Also thanks to reneeb and szabgab for organizing everything and Britta
from Linux New Media for inviting us and arranging an unplanned lighting
talk for szabgab.

Currently, we all would like to meet again on CeBit 2011…</description>
      <dc:date>2010-03-07T17:27:33+01:00</dc:date>
      <dc:subject>CeBit 2010 EN Perl</dc:subject>
      <title>CeBit 2010 is over</title>
      <pubDate>Sun, 07 Mar 2010 17:27:33 +0100</pubDate>
      <content:encoded>&lt;p&gt;Five days CeBit 2010 are over now. Perl was lucky to be one of 15 open source projects who got a booth for free, sponsored by the CeBit and Linux New Media.&lt;/p&gt;
&lt;h2&gt;Facts about CeBit 2010:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;334.000 visitors&lt;/li&gt;
&lt;li&gt;4.157 exhibitors from 68 countries&lt;/li&gt;
&lt;li&gt;3% more visitors per day (until friday)&lt;/li&gt;
&lt;li&gt;80% business visitors (until friday)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(source: &lt;a href="http://www.cebit.de/"&gt;http://www.cebit.de&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The first two days were the most successful ones in terms of business contacts and interest in Perl.&lt;/p&gt;
&lt;p&gt;Wednesday to friday also went good on contacts even if the amount of private visitors increased a little bit each day.&lt;/p&gt;
&lt;p&gt;Saturday was mostly private day, many young people came to our booth and asked about Perl.&lt;/p&gt;
&lt;h2&gt;We planned to&amp;#8230;&lt;/h2&gt;
&lt;p&gt;&amp;#8230;introduce Perl to the companies we may meet there. Three special project days were planned for Padre, Foswiki and OTRS where people of these projects planned to be at the booth. We also had beermats of DBIx::Class, Moose and Catalyst, some Tuits and many many marketing papers for distribution.&lt;/p&gt;
&lt;h2&gt;We failed on&amp;#8230;&lt;/h2&gt;
&lt;p&gt;&amp;#8230;bringing Perl into the companies because we learned that most companies already use Perl; for many applications like&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;basic network management&lt;/li&gt;
&lt;li&gt;oneliners for quick testing&lt;/li&gt;
&lt;li&gt;data conversion&lt;/li&gt;
&lt;li&gt;preprocessing high volume print job data&lt;/li&gt;
&lt;li&gt;many things in banking business&lt;/li&gt;
&lt;li&gt;telecommunication and internet processing&lt;/li&gt;
&lt;li&gt;health data processing and analysis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I&amp;#8217;d write down the company names for each sample, you&amp;#8217;d be as surprised as we were, but most people visiting us were developers or IT managers and they&amp;#8217;re usually not allowed to give us permission to write that their company uses Perl.&lt;/p&gt;
&lt;p&gt;Some few companies refused to be published at all for security reasons and I will respect this, but the other Perl::Staff people and I are in contact with the people we meet and I hope that we&amp;#8217;ll be able to publish the first company names with official approval during the next week.&lt;/p&gt;
&lt;h2&gt;We learned&amp;#8230;&lt;/h2&gt;
&lt;p&gt;&amp;#8230;many things including that we brought something for every visitor to our booth:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developers currently using (Visual) Basic, PHP or Phyton were mostly interested to hear about Perl and Padre&lt;/li&gt;
&lt;li&gt;Java, C++ and C developers usually liked the idea that Perl could easily test their programs because most of them didn&amp;#8217;t do any automated tests at all&lt;/li&gt;
&lt;li&gt;All the OOP people (Java, C++ and others) were really impressed about Moose&lt;/li&gt;
&lt;li&gt;Everybody using SQL statements wondered how much &lt;a href="http://search.cpan.org/perldoc?DBIx::Class"&gt;DBIx::Class&lt;/a&gt; could speed up their development&lt;/li&gt;
&lt;li&gt;Most developers found &lt;a href="http://padre.perlide.org"&gt;Padre&lt;/a&gt; interesting (except of one guy using the Progress language which currently isn&amp;#8217;t supported)&lt;/li&gt;
&lt;li&gt;Businessmen not developing themself were impressed that Foswiki is able to limit read and/or write access to documents to users or groups and could be used for employees, the public homepage and printing brochures and manual books without maintaining three individual copies of the same document&lt;/li&gt;
&lt;li&gt;A women leading the account department of her company confirmed heavily that customers like to write mails to the wrong department, ask the same things multiple times each day and love to write question mails without and required information. We &amp;#8220;sold&amp;#8221; her OTRS which manages incoming requests, has groups, allows tracing of who-did-what-and-when and simple forwarding of requests to the correct group while terms of open source &amp;#8220;sold&amp;#8221; stands for &amp;#8220;promised to download and try it&amp;#8221; &lt;img src="http://padre-ide.de/blog/wp-includes/images/smilies/icon_smile.gif" alt=":-)"&gt; &lt;/li&gt;
&lt;li&gt;It&amp;#8217;s easier to actually run a booth even on such a big event like CeBit than we expected, but&lt;/li&gt;
&lt;li&gt;it&amp;#8217;s much more tiering to run a booth on such a big event like CeBit than we expected.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;It was really nice&amp;#8230;&lt;/h2&gt;
&lt;p&gt;to meet szabgab, reneeb, getty and the other &lt;a href="http://search.cpan.org/perldoc?Perl::Staff"&gt;Perl::Staff&lt;/a&gt; people in reality.&lt;/p&gt;
&lt;p&gt;Szabgab and I had interesting discussions in the evening, some new ideas were born and I learned many things about Perl, the Perl community and Perl-related tools on the net.&lt;/p&gt;
&lt;p&gt;Getty donated some Vodka to Hessen (actually to their booth people) and also enjoyed the other after-CeBit-parties (I think).&lt;/p&gt;
&lt;h2&gt;Final results and thanks&lt;/h2&gt;
&lt;p&gt;We talked to some of the people from other projects and Britta from Linux New Media while packing our things together on Saturday evening and most of them (including us) said that Perl was &amp;#8220;the winner&amp;#8221; of this event. I think we were one of the projects getting the most visiters within the Open Source Lounge, learned very much about running a booth and Perl usage.&lt;/p&gt;
&lt;p&gt;Very big thanks go to &lt;a href="http://andreas.scherbaum.la/blog/"&gt;Andreas &amp;#8220;ads&amp;#8221;, &lt;em&gt;the&lt;/em&gt; Postgres guy&lt;/a&gt;, he told us about the OpenSource Lounge and how to get there.&lt;/p&gt;
&lt;p&gt;Also thanks to reneeb and &lt;a href="http://szabgab.com"&gt;szabgab&lt;/a&gt; for organizing everything and Britta from Linux New Media for inviting us and arranging an unplanned lighting talk for szabgab.&lt;/p&gt;
&lt;p&gt;Currently, we all would like to meet again on CeBit 2011&amp;#8230;&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-07T17:27:33+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://padre-ide.de/blog/?p=111</guid>
    </item>
    <item>
      <author>nobody@example.com (oylenshpeegul)</author>
      <dc:creator>nobody@example.com (oylenshpeegul)</dc:creator>
      <category>perl evil</category>
      <link>http://oylenshpeegul.vox.com/library/post/how-to-succeed-in-evil.html?_c=feed-atom</link>
      <description> I've just discovered the audiobook How to Succeed in Evil. I love
audiobooks because they allow me to "read" and knit at the same time. I
listened to the prologue and it seemed really interesting, so I wanted to
download the rest of the book. App...

Read and post comments | Send to a friend</description>
      <dc:date>2010-03-07T15:26:04Z</dc:date>
      <dc:subject>perl evil</dc:subject>
      <title>How to Succeed in Evil</title>
      <pubDate>Sun, 07 Mar 2010 15:26:04 -0000</pubDate>
      <content:encoded>
            
                &lt;div xmlns="http://www.w3.org/1999/xhtml" xmlns:at="http://www.sixapart.com/ns/at"&gt;
    
    
        
            
            
            I&amp;#39;ve just discovered the audiobook How to Succeed in Evil.  I love audiobooks because they allow me to &amp;quot;read&amp;quot; and knit at the same time. I listened to the prologue and it seemed really interesting, so I wanted to download the rest of the book. App...
        
    
                &lt;p&gt; 
    &lt;a href="http://oylenshpeegul.vox.com/library/post/how-to-succeed-in-evil.html?_c=feed-atom#comments"&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href="http://www.vox.com/share/6a011016685f0f860c0123de18e775860d?_c=feed-atom"&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;

                &lt;/div&gt;
            
        </content:encoded>
      <dcterms:modified>2010-03-07T15:26:04Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:vox.com,2010-03-07:asset-6a011016685f0f860c0123de18e775860d</guid>
    </item>
    <item>
      <author>nobody@example.com (manu)</author>
      <dc:creator>nobody@example.com (manu)</dc:creator>
      <category>Français cpan pearltrees perl rdf</category>
      <link>http://blog.bjornoya.be/lab_stacks/2010/03/pearltrees-rdf-perl.html</link>
      <description>Suite à quelques discussions récentes, je me suis replonger dans les
arcanes du RDF. En effet, Pearltrees offrant une possibilité
d'exportation des favoris en RDF, ma curiosité naturelle m'a poussée à
investiguer de manière à savoir ce que je pouvais faire concrètement avec
ce fichier. En plus, @SebDeclercq a été assez gentil que pour me
transmettre sa propre sauvegarde, m'épargnant ainsi la tâche fastidieuse
d'enrichir mes propres Pearltrees.

Donc, j'ai un fichier contenant plein de liens, et maintenant, je veux
exploiter ces informations. Comment faire ? Comme indiqué dans le billet
du blog de Nicolas Cynober, nous pouvons utiliser un outil comme SPARQLer
pour manipuler les informations. Dans SPARQLer, vous pourrez soumettre
votre requête écrite en SPARQL, et obtenir une réponse sous différent
format :

  *  en XML, avec la possibilité de renseigner un script XSLT permettant
    de transformer le document (par exemple en XHTML) ;

  *  en JSON ;

  *  ou encore simplement en texte.

Donc, c'est un outil très intéressant, mais il faut être en ligne, et
personnellement, j'aime bien avoir mes outils directement disponibles,
quelque soit mes accès au web. Et donc, se pose la question de savoir ce
que je peux avoir directement sur ma machine. Un petit tour par le CPAN,
et hop, voici quelques modules prometteurs :

  * RDF::Redland ;

  * RDF::Trine ;

  *  et celui qu'il me faut pour interroger le fichier via la SPARQL :
    RDF::Query.

Un petit cpan RDF::Query plus tard, je me retrouve donc avec un module
permettant d'interroger en SPARQL un store RDF.

Mais comment faire passer mon fichier pearltrees_export.rdf dans un store
RDF ? Relativement simplement, RDF::Trine propose dans son répertoire bin
quelques exemples de scripts qui vont nous aider :

  * rdf_init_store.pl qui, comme son nom l'indique, permet d'initialiser
    un magasin RDF ; j'ai donc lancé la commande suivante pour
    initialiser ma base de données : ./rdf_init_store.pl sqlite
    ./pearltrees.db '' '' pearltrees ce qui signifie donc :

      1.  initialise une base de données en utilisant SQLite ;

      2.  le nom de cette base de données est ./pearltrees.db 1;

      3.  le premier '' permet de spécifier le nom d'utilisateur pour la
        base de données, et il n'y en a pas dans le cas présent ;

      4.  le second '' permet de spécifier le mot de passe, idem que
        précédemment2

      5.  et finalement, pearltrees est le nom du modèle de données RDF,
        ici j'ai arbitrairement donné le nom de pearltrees ;

      6.  la commande une fois lancée me donne un message d'avertissement
        : Log4perl: Seems like no initialization happened. Forgot to call
        init()?, mais quand je vérifie via un sqlite3 pearltrees.db, je
        constate que les tables (Bnodes, Literals, Models, Resources et
        Statement2742456113224982524) ont bien été créées, donc, pas de
        soucis !

  * rdf_store_add_file.pl qui permet d'ajouter un fichier dans la base de
    données de triplets ; ce script s'utilise de la manière suivante
    ./rdf_store_add_file.pl sqlite ./pearltrees.db '' '' pearltrees
    sebdeclercq.rdf, ce qui suit la logique du script précédent
    (utilisation de SQLite, le nom de la base de données, le nom
    d'utilisateur, le mot de passe et le nom du modèle de données RDF.

Sur mon EeePC 1005HA, voici quelques statistiques :

  *  pour un fichier RDF de 421515 octets, j'obtiens une base de données
    de 1872896 octets ;

  *  le traitement du fichier prend un peu de temps, voici le résultat de
    time :

real    16m52.234s
user    3m33.573s
sys     0m17.757s

Après l'exécution de rdf_store_add_file.pl, nous nous retrouvons donc
avec une base de données qui pourra servir de base à RDF::Query.

Voici un petit script illustrant l'utilisation de RDF::Query :

#!/usr/bin/env perl

use strict;
use warnings;

use RDF::Trine;
use RDF::Trine::Store::DBI;
use RDF::Query;
use Data::Dump;

my $sparql = &lt;&lt;'SPARQL';
PREFIX pt: &lt;http://www.pearltrees.com/rdf/0.1/&gt;
PREFIX owl: &lt;http://www.w3.org/2002/07/owl#&gt;
PREFIX rdf: &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&gt;
PREFIX dc: &lt;http://purl.org/dc/elements/1.1/&gt;

SELECT ?title ?url
WHERE {
   ?pearl rdf:type pt:pearl;
          dc:title ?title;
          owl:sameAs ?url;
          pt:parentTree ?tree
}
ORDER BY DESC (?tree)
SPARQL

my $store =
  RDF::Trine::Store::DBI-&gt;new( 'pearltrees', 'DBI:SQLite:dbname=./pearltrees.db', '', '' );
my $model = RDF::Trine::Model-&gt;new($store);

my $querier = RDF::Query-&gt;new($sparql);

my $iterator = $querier-&gt;execute($model);
while ( my $row = $iterator-&gt;next ) {
    print $row-&gt;{title} . ' ' . $row-&gt;{url} . "\n";
}

Voilà pour aujourd'hui. Je suis en train de travailler sur un script
s'appuyant sur HTTP::Server::Simple et Template::Declare afin d'avoir une
interface plus agréable pour tester mes requêtes SPARQL.

Keep in touch…


Notes de bas de page:
---------------------

1 puisque nous utilisons SQLite, la base de données est en fait un
fichier

2 dans le cas d'une base de données MySQL, cela aurait été nécessaire
évidemment</description>
      <dc:date>2010-03-07T15:54:26+01:00</dc:date>
      <dc:subject>Français cpan pearltrees perl rdf</dc:subject>
      <title>Pearltrees, RDF &amp; Perl</title>
      <pubDate>Sun, 07 Mar 2010 15:54:26 +0100</pubDate>
      <content:encoded>
        &lt;p&gt;Suite à &lt;a href="http://sebdeclercq.wordpress.com/2010/02/03/rex-twitter-comme-outil-de-presence-en-ligne/#comments"&gt;quelques&lt;/a&gt; &lt;a href="http://sebdeclercq.wordpress.com/2010/02/22/rex-pourquoi-jutilise-pearltrees/"&gt;discussions&lt;/a&gt; &lt;a href="http://blog.bjornoya.be/lab_stacks/2010/02/pearltrees.html"&gt;récentes&lt;/a&gt;, je me suis replonger dans les arcanes
du &lt;a href="http://fr.wikipedia.org/wiki/Resource_Description_Framework"&gt;RDF&lt;/a&gt;. En effet, &lt;a href="http://pearltrees.com"&gt;Pearltrees&lt;/a&gt; offrant une possibilité d'exportation des favoris
en &lt;a href="http://fr.wikipedia.org/wiki/Resource_Description_Framework"&gt;RDF&lt;/a&gt;, ma curiosité naturelle m'a poussée à investiguer de manière à savoir
ce que je pouvais faire concrètement avec ce fichier. En plus, &lt;a href="http://twitter.com/SebDeclercq"&gt;@SebDeclercq&lt;/a&gt; a
été assez gentil que pour me transmettre sa propre sauvegarde, m'épargnant
ainsi la tâche fastidieuse d'enrichir &lt;a href="http://www.pearltrees.com/edipretoro/"&gt;mes propres Pearltrees&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Donc, j'ai un fichier contenant plein de liens, et maintenant, je veux
exploiter ces informations. Comment faire ? Comme indiqué dans le &lt;a href="http://nicolas.cynober.fr/blog/496,comment-recuperer-plus-dinfo-sur-son-compte-pearltrees.html"&gt;billet&lt;/a&gt; du
blog de &lt;a href="http://nicolas.cynober.fr/blog"&gt;Nicolas Cynober&lt;/a&gt;, nous pouvons utiliser un outil comme &lt;a href="http://www.sparql.org/sparql.html"&gt;SPARQLer&lt;/a&gt; pour
manipuler les informations. Dans &lt;a href="http://www.sparql.org/sparql.html"&gt;SPARQLer&lt;/a&gt;, vous pourrez soumettre votre
requête écrite en &lt;a href="http://fr.wikipedia.org/wiki/SPARQL"&gt;SPARQL&lt;/a&gt;, et obtenir une réponse sous différent format :
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
en XML, avec la possibilité de renseigner un script &lt;a href="http://fr.wikipedia.org/wiki/XSLT"&gt;XSLT&lt;/a&gt; permettant de
transformer le document (par exemple en XHTML) ;
&lt;/li&gt;
&lt;li&gt;
en JSON ; 
&lt;/li&gt;
&lt;li&gt;
ou encore simplement en texte.

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Donc, c'est un outil très intéressant, mais il faut être en ligne, et
personnellement, j'aime bien avoir mes outils directement disponibles, quelque
soit mes accès au web. Et donc, se pose la question de savoir ce que je peux
avoir directement sur ma machine. Un petit tour par le &lt;a href="http://search.cpan.org/"&gt;CPAN&lt;/a&gt;, et hop, voici
quelques modules prometteurs : 
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;i&gt;RDF::Redland&lt;/i&gt; ;
&lt;/li&gt;
&lt;li&gt;
&lt;i&gt;RDF::Trine&lt;/i&gt; ;
&lt;/li&gt;
&lt;li&gt;
et celui qu'il me faut pour interroger le fichier via la SPARQL :
&lt;i&gt;RDF::Query&lt;/i&gt;. 

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un petit &lt;code&gt;cpan RDF::Query&lt;/code&gt; plus tard, je me retrouve donc avec un module
permettant d'interroger en SPARQL un &lt;i&gt;store&lt;/i&gt; RDF. 
&lt;/p&gt;
&lt;p&gt;
Mais comment faire passer mon fichier &lt;code&gt;pearltrees_export.rdf&lt;/code&gt; dans un store
RDF ? Relativement simplement, RDF::Trine propose dans son répertoire &lt;a href="http://cpansearch.perl.org/src/GWILLIAMS/RDF-Trine-0.117/bin/"&gt;bin&lt;/a&gt;
quelques exemples de scripts qui vont nous aider : 
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://cpansearch.perl.org/src/GWILLIAMS/RDF-Trine-0.117/bin/rdf_init_store.pl"&gt;rdf_init_store.pl&lt;/a&gt; qui, comme son nom l'indique, permet d'initialiser un
&lt;i&gt;magasin&lt;/i&gt; RDF ; j'ai donc lancé la commande suivante pour initialiser ma
base de données : &lt;code&gt;./rdf_init_store.pl sqlite ./pearltrees.db '' '' pearltrees&lt;/code&gt;
ce qui signifie donc :
&lt;ol&gt;
&lt;li&gt;
initialise une base de données en utilisant SQLite ;
&lt;/li&gt;
&lt;li&gt;
le nom de cette base de données est &lt;code&gt;./pearltrees.db&lt;/code&gt; &lt;sup&gt;&lt;a class="footref" name="fnr.1" href="#fn.1"&gt;1&lt;/a&gt;&lt;/sup&gt;;
&lt;/li&gt;
&lt;li&gt;
le premier '' permet de spécifier le nom d'utilisateur pour la base de
données, et il n'y en a pas dans le cas présent ;
&lt;/li&gt;
&lt;li&gt;
le second '' permet de spécifier le mot de passe, idem que
précédemment&lt;sup&gt;&lt;a class="footref" name="fnr.2" href="#fn.2"&gt;2&lt;/a&gt;&lt;/sup&gt;
&lt;/li&gt;
&lt;li&gt;
et finalement, &lt;code&gt;pearltrees&lt;/code&gt; est le nom du modèle de données RDF, ici j'ai
arbitrairement donné le nom de &lt;code&gt;pearltrees&lt;/code&gt; ;
&lt;/li&gt;
&lt;li&gt;
la commande une fois lancée me donne un message d'avertissement :
&lt;i&gt;Log4perl: Seems like no initialization happened. Forgot to call      init()?&lt;/i&gt;, mais quand je vérifie via un &lt;code&gt;sqlite3 pearltrees.db&lt;/code&gt;, je
constate que les tables (&lt;i&gt;Bnodes&lt;/i&gt;, &lt;i&gt;Literals&lt;/i&gt;, &lt;i&gt;Models&lt;/i&gt;, &lt;i&gt;Resources&lt;/i&gt; et
&lt;i&gt;Statement2742456113224982524&lt;/i&gt;) ont bien été créées, donc, pas de soucis !     
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://cpansearch.perl.org/src/GWILLIAMS/RDF-Trine-0.117/bin/rdf_store_add_file.pl"&gt;rdf_store_add_file.pl&lt;/a&gt; qui permet d'ajouter un fichier dans la base de
données de triplets ; ce script s'utilise de la manière suivante
&lt;code&gt;./rdf_store_add_file.pl sqlite ./pearltrees.db '' '' pearltrees   sebdeclercq.rdf&lt;/code&gt;, ce qui suit la logique du script précédent (utilisation de
SQLite, le nom de la base de données, le nom d'utilisateur, le mot de passe
et le nom du modèle de données RDF.

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sur mon EeePC 1005HA, voici quelques statistiques : 
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
pour un fichier RDF de 421515 octets, j'obtiens une base de données de
1872896 octets ;
&lt;/li&gt;
&lt;li&gt;
le traitement du fichier prend un peu de temps, voici le résultat de
&lt;code&gt;time&lt;/code&gt; :

&lt;/li&gt;
&lt;/ul&gt;


&lt;pre class="example"&gt;real    16m52.234s
user    3m33.573s
sys     0m17.757s
&lt;/pre&gt;



&lt;p&gt;
Après l'exécution de &lt;a href="http://cpansearch.perl.org/src/GWILLIAMS/RDF-Trine-0.117/bin/rdf_store_add_file.pl"&gt;rdf_store_add_file.pl&lt;/a&gt;, nous nous retrouvons donc avec une
base de données qui pourra servir de base à &lt;a href="http://search.cpan.org/dist/RDF-Query/"&gt;RDF::Query&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Voici un petit script illustrant l'utilisation de &lt;a href="http://search.cpan.org/dist/RDF-Query/"&gt;RDF::Query&lt;/a&gt; : 
&lt;pre class="brush: perl"&gt;
#!/usr/bin/env perl

use strict;
use warnings;

use RDF::Trine;
use RDF::Trine::Store::DBI;
use RDF::Query;
use Data::Dump;

my $sparql = &amp;lt;&amp;lt;'SPARQL';
PREFIX pt: &amp;lt;http://www.pearltrees.com/rdf/0.1/&amp;gt;
PREFIX owl: &amp;lt;http://www.w3.org/2002/07/owl#&amp;gt;
PREFIX rdf: &amp;lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;gt;
PREFIX dc: &amp;lt;http://purl.org/dc/elements/1.1/&amp;gt;

SELECT ?title ?url
WHERE {
   ?pearl rdf:type pt:pearl;
          dc:title ?title;
          owl:sameAs ?url;
          pt:parentTree ?tree
}
ORDER BY DESC (?tree)
SPARQL

my $store =
  RDF::Trine::Store::DBI-&amp;gt;new( 'pearltrees', 'DBI:SQLite:dbname=./pearltrees.db', '', '' );
my $model = RDF::Trine::Model-&amp;gt;new($store);

my $querier = RDF::Query-&amp;gt;new($sparql);

my $iterator = $querier-&amp;gt;execute($model);
while ( my $row = $iterator-&amp;gt;next ) {
    print $row-&amp;gt;{title} . ' ' . $row-&amp;gt;{url} . &amp;quot;\n&amp;quot;;
}
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Voilà pour aujourd'hui. Je suis en train de travailler sur un script
s'appuyant sur &lt;a href="http://search.cpan.org/dist/HTTP-Server-Simple/"&gt;HTTP::Server::Simple&lt;/a&gt; et &lt;a href="http://search.cpan.org/dist/Template-Declare/"&gt;Template::Declare&lt;/a&gt; afin d'avoir une
interface plus agréable pour tester mes requêtes SPARQL.
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;Keep in touch&amp;hellip;&lt;/i&gt;
&lt;/p&gt;




&lt;div id="footnotes"&gt;
&lt;h2 class="footnotes"&gt;&lt;strong&gt;Notes de bas de page:&lt;/strong&gt;&lt;/h2&gt;
&lt;div id="text-footnotes"&gt;
&lt;p class="footnote"&gt;&lt;sup&gt;&lt;a class="footnum" name="fn.1" href="#fnr.1"&gt;1&lt;/a&gt;&lt;/sup&gt; puisque nous utilisons &lt;a href="http://www.sqlite.org"&gt;SQLite&lt;/a&gt;, la base de données est en fait un
fichier
&lt;/p&gt;
&lt;p class="footnote"&gt;&lt;sup&gt;&lt;a class="footnum" name="fn.2" href="#fnr.2"&gt;2&lt;/a&gt;&lt;/sup&gt; dans le cas d'une base de données &lt;a href="http://www.mysql.com"&gt;MySQL&lt;/a&gt;, cela aurait été nécessaire
évidemment
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
    </content:encoded>
      <dcterms:modified>2010-03-07T15:54:26+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blog.bjornoya.be,2010:/lab_stacks//1.23</guid>
    </item>
    <item>
      <author>nobody@example.com (gfx)</author>
      <dc:creator>nobody@example.com (gfx)</dc:creator>
      <category>perl</category>
      <link>http://d.hatena.ne.jp/gfx/20100307/1267965116</link>
      <description>Makefile.PLで開発者用のモジュールを宣言するにはM::I::AuthorRequiresがあるが、これはモジュールがインストールされていなければdieするので、結局は手作業でモジュールをインストールしなければならない。

しかし、今やcpanmがあるので、「モジュールのリスト」さえあればインストールするのは簡単だ。

まず、author/requires.cpanm
に以下の用にモジュールをリストする。このリストはcpanmの引数として扱われるので、--verboseなどのcpanmのオプションも書くこともできる。また、コメント(#)も使える。

（この例は Mouse/author/requires.cpanm よりコピペしたもの）

# modules which the authors require:
# $ cpanm &lt; author/requires.cpanm
# see also App::cpanminus (a.k.a. cpanm)

# Module::Install stuff
Module::Install
Module::Install::AuthorTests
Module::Install::XSUtil

# Test stuff
Test::More
Test::Exception
Test::LeakTrace
Test::Output

# required by recipes
Regexp::Common
Locale::US
HTTP::Headers
use Params::Coerce
URI

あとは、このリストについてドキュメントに書くなり、Makefile.PLに細工をするなりすればよい。

たとえば、Makefile.PLに以下のように記述すると、--authorオプションを与えたときにこのモジュールリストをインストールできる*1。

# スクリプトの冒頭BEGIN{ if(grep{ $_ eq '--author' } @ARGV){
    system "$^X -S cpanm &lt; author/requires.cpanm";
}}use Module::Install;
...

単にリストを与える以上のことをしたいときは、App::cpanminus を使ったスクリプトを書いてもいい*2。

#!perluse warnings;use strict;use App::cpanminus::script;
my @args = qw(    Module::Install    Module::Install::XSUtil    Test::LeakTrace);
my $app = App::cpanminus::script-&gt;new;$app-&gt;parse_options(@args);$app-&gt;doit;__END__

*1：3/8
inc/.authorがあるときにcpanmを起動するのは時間がかかりすぎるのでコード修正。インストールを試みるのは--author付きのときだけでよい。

*2：ただし、以下のスクリプトはまだ動かない模様。</description>
      <dc:date>2010-03-07T21:31:56+09:00</dc:date>
      <dc:subject>perl</dc:subject>
      <title>[perl] Install developper’s prerequisites with cpanm</title>
      <pubDate>Sun, 07 Mar 2010 21:31:56 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;Makefile.PLで開発者用のモジュールを宣言するにはM::I::AuthorRequiresがあるが、これはモジュールがインストールされていなければdieするので、結局は手作業でモジュールをインストールしなければならない。&lt;/p&gt;
			&lt;p&gt;しかし、今や&lt;a href="http://search.cpan.org/dist/App-cpanminus"&gt;cpanm&lt;/a&gt;があるので、「モジュールのリスト」さえあればインストールするのは簡単だ。&lt;/p&gt;
			&lt;p&gt;まず、author/requires.cpanm に以下の用にモジュールをリストする。このリストはcpanmの引数として扱われるので、--verboseなどのcpanmのオプションも書くこともできる。また、コメント(#)も使える。&lt;/p&gt;
			&lt;p&gt;（この例は Mouse/author/requires.cpanm よりコピペしたもの）&lt;/p&gt;
&lt;pre&gt;
# modules which the authors require:
# $ cpanm &amp;#60; author/requires.cpanm
# see also App::cpanminus (a.k.a. cpanm)

# Module::Install stuff
Module::Install
Module::Install::AuthorTests
Module::Install::XSUtil

# Test stuff
Test::More
Test::Exception
Test::LeakTrace
Test::Output

# required by recipes
Regexp::Common
Locale::US
HTTP::Headers
use Params::Coerce
URI
&lt;/pre&gt;

			&lt;p&gt;あとは、このリストについてドキュメントに書くなり、Makefile.PLに細工をするなりすればよい。&lt;/p&gt;
			&lt;p&gt;たとえば、Makefile.PLに以下のように記述すると、&lt;del datetime="2010-03-08T14:50:24+09:00"&gt;M::I流のauthor modeのときか、&lt;/del&gt;--authorオプションを与えたときにこのモジュールリストをインストールできる&lt;span class="footnote"&gt;&lt;a href="/gfx/#f1" name="fn1" title="3/8 inc/.author&amp;#x304C;&amp;#x3042;&amp;#x308B;&amp;#x3068;&amp;#x304D;&amp;#x306B;cpanm&amp;#x3092;&amp;#x8D77;&amp;#x52D5;&amp;#x3059;&amp;#x308B;&amp;#x306E;&amp;#x306F;&amp;#x6642;&amp;#x9593;&amp;#x304C;&amp;#x304B;&amp;#x304B;&amp;#x308A;&amp;#x3059;&amp;#x304E;&amp;#x308B;&amp;#x306E;&amp;#x3067;&amp;#x30B3;&amp;#x30FC;&amp;#x30C9;&amp;#x4FEE;&amp;#x6B63;&amp;#x3002;&amp;#x30A4;&amp;#x30F3;&amp;#x30B9;&amp;#x30C8;&amp;#x30FC;&amp;#x30EB;&amp;#x3092;&amp;#x8A66;&amp;#x307F;&amp;#x308B;&amp;#x306E;&amp;#x306F;--author&amp;#x4ED8;&amp;#x304D;&amp;#x306E;&amp;#x3068;&amp;#x304D;&amp;#x3060;&amp;#x3051;&amp;#x3067;&amp;#x3088;&amp;#x3044;&amp;#x3002;"&gt;*1&lt;/a&gt;&lt;/span&gt;。&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synComment"&gt;# スクリプトの冒頭&lt;/span&gt;
&lt;span class="synPreProc"&gt;BEGIN&lt;/span&gt;{ &lt;span class="synStatement"&gt;if&lt;/span&gt;(&lt;span class="synStatement"&gt;grep&lt;/span&gt;{ &lt;span class="synIdentifier"&gt;$_&lt;/span&gt; &lt;span class="synStatement"&gt;eq&lt;/span&gt; &lt;span class="synConstant"&gt;'--author'&lt;/span&gt; } &lt;span class="synIdentifier"&gt;@ARGV&lt;/span&gt;){
    &lt;span class="synStatement"&gt;system&lt;/span&gt; &lt;span class="synConstant"&gt;&amp;#34;&lt;/span&gt;&lt;span class="synIdentifier"&gt;$^X&lt;/span&gt;&lt;span class="synConstant"&gt; -S cpanm &amp;#60; author/requires.cpanm&amp;#34;&lt;/span&gt;;
}}
&lt;span class="synStatement"&gt;use &lt;/span&gt;Module::Install;
...
&lt;/pre&gt;

			&lt;p&gt;単にリストを与える以上のことをしたいときは、App::cpanminus を使ったスクリプトを書いてもいい&lt;span class="footnote"&gt;&lt;a href="/gfx/#f2" name="fn2" title="&amp;#x305F;&amp;#x3060;&amp;#x3057;&amp;#x3001;&amp;#x4EE5;&amp;#x4E0B;&amp;#x306E;&amp;#x30B9;&amp;#x30AF;&amp;#x30EA;&amp;#x30D7;&amp;#x30C8;&amp;#x306F;&amp;#x307E;&amp;#x3060;&amp;#x52D5;&amp;#x304B;&amp;#x306A;&amp;#x3044;&amp;#x6A21;&amp;#x69D8;&amp;#x3002;"&gt;*2&lt;/a&gt;&lt;/span&gt;。&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synPreProc"&gt;#!perl&lt;/span&gt;
&lt;span class="synStatement"&gt;use warnings&lt;/span&gt;;
&lt;span class="synStatement"&gt;use strict&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;App::cpanminus::script;

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;@args&lt;/span&gt; = &lt;span class="synConstant"&gt;qw(&lt;/span&gt;
&lt;span class="synConstant"&gt;    Module::Install&lt;/span&gt;
&lt;span class="synConstant"&gt;    Module::Install::XSUtil&lt;/span&gt;
&lt;span class="synConstant"&gt;    Test::LeakTrace&lt;/span&gt;
&lt;span class="synConstant"&gt;)&lt;/span&gt;;

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$app&lt;/span&gt; = App::cpanminus::script-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;;
&lt;span class="synIdentifier"&gt;$app&lt;/span&gt;-&amp;#62;parse_options(&lt;span class="synIdentifier"&gt;@args&lt;/span&gt;);
&lt;span class="synIdentifier"&gt;$app&lt;/span&gt;-&amp;#62;doit;
&lt;span class="synComment"&gt;__END__&lt;/span&gt;
&lt;/pre&gt;

		&lt;/div&gt;
		&lt;div class="footnote"&gt;
			&lt;p class="footnote"&gt;&lt;a href="/gfx/#fn1" name="f1"&gt;*1&lt;/a&gt;：3/8 inc/.authorがあるときにcpanmを起動するのは時間がかかりすぎるのでコード修正。インストールを試みるのは--author付きのときだけでよい。&lt;/p&gt;
			&lt;p class="footnote"&gt;&lt;a href="/gfx/#fn2" name="f2"&gt;*2&lt;/a&gt;：ただし、以下のスクリプトはまだ動かない模様。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-07T21:31:56+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://d.hatena.ne.jp/gfx/20100307/1267965116</guid>
    </item>
    <item>
      <author>nobody@example.com (marcus)</author>
      <dc:creator>nobody@example.com (marcus)</dc:creator>
      <category>Article Mojolicious MVC Perl slides web</category>
      <link>http://marcus.nordaaker.com/2010/03/slides-from-my-mojolicious-presentation/</link>
      <description>I recently held a introduction to the Mojolicious web framework for
Oslo.pm. Here are the slides:

MojoliciousView more presentations from marcusramberg.</description>
      <dc:date>2010-03-07T11:42:17+01:00</dc:date>
      <dc:subject>Article Mojolicious MVC Perl slides web</dc:subject>
      <title>Slides from my Mojolicious presentation</title>
      <pubDate>Sun, 07 Mar 2010 11:42:17 +0100</pubDate>
      <content:encoded>&lt;p&gt;I recently held a introduction to the Mojolicious web framework for Oslo.pm. Here are the slides:&lt;/p&gt;
&lt;div id="__ss_3338291"&gt;&lt;strong&gt;&lt;a href="http://www.slideshare.net/marcusramberg/mojolicious-3338291" title="Mojolicious"&gt;Mojolicious&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mojolicious-key-100304142250-phpapp02&amp;amp;stripped_title=mojolicious-3338291" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;div&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/marcusramberg"&gt;marcusramberg&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-07T11:42:17+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://marcus.nordaaker.com/?p=3347</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <category>strawberry perl</category>
      <link>http://csjewell.dreamwidth.org/9590.html</link>
      <description>The last week or so, a lot of the work on Strawberry Perl has gone to
making sure that what I'm calling the "gcc4" toolchains from the mingw64
project will work to build Strawberry Perl.

And it's looking like that will happen, as the two toolchains (a 32-bit
one and a 64-bit one) will work, at least as far as building what's been
called "Vanilla Perl" in the past is concerned.

There are three XS modules in current versions of Strawberry that have
issues with 64-bitness that I know of so far. (Compress::unLZMA,
Math::Pari, and Crypt::OpenSSL.) I may find out about more as I attempt
to build Strawberry Perl.

KMX has built new versions of the libraries that some XS modules rely on
(postgresql, mysql, libgd, libtiff, libjpeg, etc.) that should not have
name conflicts with other DLL's on the system, and the 32-bit versions
will work with both the gcc3 and gcc4 toolchains.

I'm attempting a 32-bit build tonight of Strawberry Perl with 5.11.5,
gcc4, and the new libraries. After that, I'll attempt to do the same with
5.10.1.

Soon will also be a 64-bit test with 5.11.5 and the 64-bit "new
libraries".

As I've previously stated, 5.10.x versions of Strawberry will be 32-bit
only, and will stay on the current "gcc3" toolchain. They WILL use the
new libraries - which will solve DLL problems that have sometimes occured
when other programs have DLL's with the same name.

I've said in the past that we'd have a 64-bit version of Strawberry
available for April. That will be both true and false, for I won't be
able to release a non-beta version of 5.12.0 before April 30th (for that
to happen, I'd have to have the perl 5.12.0 tarball available to build
upon before April 2nd, and I don't think that'll happen, with apologies
to the perl5-porters.)

There will be a 64-bit beta available soon - most likely by the end of
this month. While I'm currently testing 64-bitness with 5.11.5, 5.11.6
will probably be available in 2 weeks, and I'll release the beta soon
after that. There will be NO non-beta 5.11.x versions of Strawberry Perl
- as those perl versions are practically betas themselves.

The intent is to have 3 or 4 beta test versions of Strawberry Perl for
the first beta towards the April release:


  1. A 32-bit 5.10.1.2.


  2. A 32-bit 5.11.6.0.


  3. A 64-bit 5.11.6.0.


  4. A 32-bit 5.10.1.2 with the Professional additions may or may not
    happen.




Watch for the 5.10.1.2 beta to come out around St. Patrick's Day, with
5.11.6.0 betas a week or so afterwards.</description>
      <dc:date>2010-03-07T07:21:28Z</dc:date>
      <dc:subject>strawberry perl</dc:subject>
      <title>Looking to the future.</title>
      <pubDate>Sun, 07 Mar 2010 07:21:28 -0000</pubDate>
      <content:encoded>The last week or so, a lot of the work on Strawberry Perl has gone to making sure that what I'm calling the "gcc4" toolchains from the mingw64 project will work to build Strawberry Perl.&lt;br /&gt;&lt;br /&gt;And it's looking like that will happen, as the two toolchains (a 32-bit one and a 64-bit one) will work, at least as far as building what's been called "Vanilla Perl" in the past is concerned.&lt;br /&gt;&lt;br /&gt;There are three XS modules in current versions of Strawberry that have issues with 64-bitness that I know of so far. (Compress::unLZMA, Math::Pari, and Crypt::OpenSSL.) I may find out about more as I attempt to build Strawberry Perl.&lt;br /&gt;&lt;br /&gt;KMX has built new versions of the libraries that some XS modules rely on (postgresql, mysql, libgd, libtiff, libjpeg, etc.) that should not have name conflicts with other DLL's on the system, and the 32-bit versions will work with both the gcc3 and gcc4 toolchains.&lt;br /&gt;&lt;br /&gt;I'm attempting a 32-bit build tonight of Strawberry Perl with 5.11.5, gcc4, and the new libraries.  After that, I'll attempt to do the same with 5.10.1.&lt;br /&gt;&lt;br /&gt;Soon will also be a 64-bit test with 5.11.5 and the 64-bit "new libraries".&lt;br /&gt;&lt;br /&gt;As I've previously stated, 5.10.x versions of Strawberry will be 32-bit only, and will stay on the current "gcc3" toolchain. They WILL use the new libraries - which will solve DLL problems that have sometimes occured when other programs have DLL's with the same name.&lt;br /&gt;&lt;br /&gt;I've said in the past that we'd have a 64-bit version of Strawberry available for April.  That will be both true and false, for I won't be able to release a non-beta version of 5.12.0 before April 30th (for that to happen, I'd have to have the perl 5.12.0 tarball available to build upon before April 2nd, and I don't think that'll happen, with apologies to the perl5-porters.)&lt;br /&gt;&lt;br /&gt;There will be a 64-bit beta available soon - most likely by the end of this month.  While I'm currently testing 64-bitness with 5.11.5, 5.11.6 will probably be available in 2 weeks, and I'll release the beta soon after that. There will be NO non-beta 5.11.x versions of Strawberry Perl - as those perl versions are practically betas themselves.&lt;br /&gt;&lt;br /&gt;The intent is to have 3 or 4 beta test versions of Strawberry Perl for the first beta towards the April release:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;A 32-bit 5.10.1.2.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A 32-bit 5.11.6.0.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A 64-bit 5.11.6.0.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A 32-bit 5.10.1.2 with the Professional additions may or may not happen.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Watch for the 5.10.1.2 beta to come out around St. Patrick's Day, with 5.11.6.0 betas a week or so afterwards.</content:encoded>
      <dcterms:modified>2010-03-07T07:21:28Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:urn:lj:dreamwidth.org:atom1:csjewell:9590</guid>
    </item>
    <item>
      <author>nobody@example.com (Gabor Szabo)</author>
      <dc:creator>nobody@example.com (Gabor Szabo)</dc:creator>
      <category>Perl, community, CeBIT</category>
      <link>http://szabgab.com/blog/2010/03/1267974609.html</link>
      <description>CeBIT was way more successful than I expected. Thanks to Renee Baecker,
the main organizer and the other people who were at the stand during the
week we made a lot of contacts with individual developers and companies
using Perl. We also talked to quite a number of people who have heard
about Perl but never tried it and some people who never heard about it.

It was both very hard to be there standing 8-9 hours and almost
constantly talking to people every day but it was also a lot of fun.

Originally we were requested to always have two people at the stand but
it turned out that there were times when even 7 of the Perl::Staff
members could not handle the number of visitors at the same time. We were
lucky as our stand was part of the Open Source Lounge of 15 projects
slightly out of the main stream of people. On one hand that meant many
people walking along the main alleys missed it but on the other hand
those who came by had more space and time to talk to us.

It was very heart warming to see people coming to the booth with no or
even negative view on Perl and leaving with a feeling that they saw some
really cool things they want to try now.


So what were we showing?
------------------------

To people with now real Perl knowledge or people who used Perl 10 years
ago we showed some modern Perl code such as Moose, MooseX::Declare and
some related stuff. We showed them Padre so they can see you can write
large desktop applications in Perl. We were also showing Catalyst,
especially to PHP programmers but also to others who were web developers.

On one of the days there were two Foswiki developers and they showed
their wiki to the people interested in that. I think OTRS got a bit less
attention on our stand but they had their own booth very they made a lot
of business contacts.

The strategy was simple. Some of us were standing in the alley and as
people walked by we gave them a flyer and then started to talk to them.
Obviously there were many who were not interested, we just let them go. I
was the only presenter who did not speak German my strategy was to first
ask them if they speak English. With many people it was clear that they
don't know English well enough for a conversation or just prefer German.
That gave me a chance to direct them closer to the booth to talk to "one
of our other representative, who speaks German". So in fact I was acting
a lot as the "catch man". I think it worked out quite well. When they
were OK speaking English or even preferred that language then I kept the
conversation going on. I asked what are they using Perl for, or if they
did not know or have not used Perl I asked what other languages are they
using and what kind of things are they using. That usually gave me an
opportunity to ask if they would like to see some modern technologies in
Perl. Most of them were interested so we stepped to one of the computers
we set up (we had 2 sometimes 3 computers on our booth, which was high
enough so we did not have to bend over to view the screens or type).
There I showed them Padre, some code in Padre. Sometimes I showed a few
pages from the Moose documentation and some small examples in Catalyst.

There were several people who were interested in Perl 6. For them I
opened the web-page of my Perl 6 training slides and showed a few pages
just to get them impressed by some of the nice features of the language.

Others, as I saw started by asking if the visitor "Knew Perl?" and from
that point some kind of a conversation evolved in German that I could not
follow anyway but that will be described by the other presenters. (Renee
and Sewi have already written. All the reflections will be linked from
the TPF wiki page related to Perl on CeBIT)


Some Improvements
-----------------

There were a lot of things we could improve in our presentation. First of
all none of us knew all the things we wanted to show and we did not have
ready made pages to show them. So I'd like to have several slide-shows
that we can load on all the computers we are using for presentation and
that each one of us can use to present various technologies. After all I
don't need to be an expert in Catalyst in order to give a short
introduction and show a few examples, assuming they were already prepared
and I went over the slides with someone who is an expert.

Same with the Perl 6 examples. Others kept referring people to me to show
Perl 6 examples but we could have put together a few slides with
interesting examples that we can flip though pointing out the nice
features. Within the slides we could even have instructions - show the
Rakudo web site now, or in other cases to show the web page of the CPAN
Testers.

This of course needs more preparation and even some time before the event
starts to show the slides to each other but it pays off as it will make
the presentation smoother.

Even that does not mean there won't be questions that need some more
thinking on how to answer. There can also be cases when the knowledge of
the presenter ends and there are still questions but then we can find the
other presenter who has deeper knowledge in that subject or refer the
person to the community channels where can get more information. After
all, a large part of what we would like to achieve is that our visitors
will start learning more about these subjects and start to participate in
our communities.


Pictures
--------

Some pictures from the Perl stand on CeBIT.</description>
      <dc:date>2010-03-07T07:10:09Z</dc:date>
      <dc:subject>Perl, community, CeBIT</dc:subject>
      <title>Perl on CeBIT</title>
      <pubDate>Sun, 07 Mar 2010 07:10:09 -0000</pubDate>
      <content:encoded>&lt;p&gt;
CeBIT was way more successful than I expected. Thanks to &lt;a href="http://reneeb-perlblog.blogspot.com/"&gt;Renee Baecker&lt;/a&gt;, 
the main organizer and the other people who were at the stand during the week we made a lot of contacts with 
individual developers and companies using Perl. We also talked to quite a number of people who
have heard about Perl but never tried it and some people who never heard about it.
&lt;/p&gt;
&lt;p&gt;
It was both very hard to be there standing 8-9 hours and almost constantly talking to people
every day but it was also a lot of fun.
&lt;/p&gt;
&lt;p&gt;
Originally we were requested to always have two people at the stand but it turned out that there 
were times when even 7 of the &lt;a href="http://cpan.uwinnipeg.ca/dist/Perl-Staff"&gt;Perl::Staff&lt;/a&gt; members could not handle the number of 
visitors at the same time. We were lucky as our stand was part of the Open Source Lounge
of 15 projects slightly out of the main stream of people. On one hand that meant many 
people walking along the main alleys missed it but on the other hand those who came by had 
more space and time to talk to us.
&lt;/p&gt;
&lt;p&gt;
It was very heart warming to see people coming to the booth with no or even negative view on 
Perl and leaving with a feeling that they saw some really cool things they want to try now.
&lt;/p&gt;
&lt;p&gt;
&lt;h2&gt;So what were we showing?&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;
To people with now real Perl knowledge or people who used Perl 10 years ago we showed some modern 
Perl code such as &lt;a href="http://cpan.uwinnipeg.ca/dist/Moose"&gt;Moose&lt;/a&gt;, &lt;a href="http://cpan.uwinnipeg.ca/dist/MooseX-Declare"&gt;MooseX::Declare&lt;/a&gt; and some related stuff. We showed 
them &lt;a href="http://padre.perlide.org/"&gt;Padre&lt;/a&gt; so they can see you can write large desktop 
applications in Perl. We were also showing &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt;,
especially to PHP programmers but also to others who were web developers.
&lt;/p&gt;
&lt;p&gt;
On one of the days there were two &lt;a href="http://foswiki.org/"&gt;Foswiki&lt;/a&gt; developers and they showed 
their wiki to the people interested in that. I think &lt;a href="http://otrs.org/"&gt;OTRS&lt;/a&gt; got a bit less
attention on our stand but they had their own booth very they made a lot of business contacts.
&lt;/p&gt;
&lt;p&gt;
The strategy was simple. Some of us were standing in the alley and as people walked by we gave 
them a flyer and then started to talk to them. Obviously there were many who were not interested,
we just let them go. I was the only presenter who did not speak German my strategy was to first 
ask them if they speak English. With many people it was clear that they don't know English well enough for
a conversation or just prefer German. That gave me a chance to direct them closer to the booth to
talk to "one of our other representative, who speaks German". So in fact I was acting a lot as the
"catch man". I think it worked out quite well. 
When they were OK speaking English or even preferred that language then I kept the conversation going on.
I asked what are they using Perl for, or if they did not know or have not used Perl I asked what other 
languages are they using and what kind of things are they using. That usually gave me an opportunity to
ask if they would like to see some modern technologies in Perl. Most of them were interested so we stepped
to one of the computers we set up (we had 2 sometimes 3 computers on our booth, which was high enough 
so we did not have to bend over to view the screens or type). There I showed them Padre, some code in Padre.
Sometimes I showed a few pages from the Moose documentation and some small examples in Catalyst.
&lt;/p&gt;
&lt;p&gt;
There were several people who were interested in Perl 6. For them I opened the web-page of my Perl 6 
training slides and showed a few pages just to get them impressed by some of the nice features of the
language.
&lt;/p&gt;
&lt;p&gt;
Others, as I saw started by asking if the visitor "Knew Perl?" and from that point some kind of a 
conversation evolved in German that I could not follow anyway but that will be described
by the other presenters. (Renee and Sewi have already written. All the reflections will be 
linked from the TPF wiki page related to 
&lt;a href="http://www.perlfoundation.org/perl5/index.cgi?events_2010_cebit"&gt;Perl on CeBIT&lt;/a&gt;)
&lt;/p&gt;
&lt;p&gt;
&lt;h2&gt;Some Improvements&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;
There were a lot of things we could improve in our presentation. First of all none of us knew all 
the things we wanted to show and we did not have ready made pages to show them. So I'd like to
have several slide-shows that we can load on all the computers we are using for presentation and
that each one of us can use to present various technologies. After all I don't need to be an expert
in Catalyst in order to give a short introduction and show a few examples, assuming they were 
already prepared and I went over the slides with someone who is an expert.
&lt;/p&gt;
&lt;p&gt;
Same with the Perl 6 examples. Others kept referring people to me to show Perl 6 examples but we 
could have put together a few slides with interesting examples that we can flip though pointing 
out the nice features. Within the slides we could even have instructions - show the Rakudo web 
site now, or in other cases to show the web page of the CPAN Testers.
&lt;/p&gt;
&lt;p&gt;
This of course needs more preparation and even some time before the event starts to 
show the slides to each other but it pays off as it will make the presentation smoother.
&lt;/p&gt;
&lt;p&gt;
Even that does not mean there won't be questions that need some more thinking on how to answer. 
There can also be cases when the knowledge of the presenter ends and there are still questions
but then we can find the other presenter who has deeper knowledge in that subject or refer
the person to the community channels where can get more information. After all, a large part of 
what we would like to achieve is that our visitors will start learning more about these subjects
and start to participate in our communities.
&lt;/p&gt;
&lt;p&gt;
&lt;h2&gt;Pictures&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;
Some &lt;a href="http://cebit.perl-magazin.de/gallery.html"&gt;pictures from the Perl stand on CeBIT&lt;/a&gt;.
&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-07T07:10:09Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://szabgab.com/blog/2010/03/1267974609.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Daisuke Maki)</author>
      <dc:creator>nobody@example.com (Daisuke Maki)</dc:creator>
      <category>jpa</category>
      <link>http://blog.perlassociation.org/2010/03/jpa.html</link>
      <description>JPAサイトにいくつか変更しなおしました。最新のpixisエンジンに合わせPlack/PSGI (Starman) 上で動作するようにしたほか、Perl
関連資料ページ、Perl採用情報ページを新設しました。
またこれとは別にテストとしてPerlで開発を受注できる会社リストのWikiページを作成してみましたので、もしあなたの会社や知っている会社がPerl開発を受注できるのであれば是非Wikiに追加してください。</description>
      <dc:date>2010-03-07T11:41:14+09:00</dc:date>
      <dc:subject>jpa</dc:subject>
      <title>JPAサイト内変更について</title>
      <pubDate>Sun, 07 Mar 2010 11:41:14 +0900</pubDate>
      <content:encoded>
        &lt;a href="http://japan.perlassociation.org"&gt;JPAサイト&lt;/a&gt;にいくつか変更しなおしました。最新のpixisエンジンに合わせ&lt;a href="http://plackperl.org"&gt;Plack/PSGI&lt;/a&gt; (&lt;a href="http://search.cpan.org/dist/Starman"&gt;Starman&lt;/a&gt;) 上で動作するようにしたほか、&lt;a href="http://japan.perlassociation.org/resource"&gt;Perl 関連資料ページ&lt;/a&gt;、&lt;a href="http://japan.perlassociation.org/recruit"&gt;Perl採用情報ページ&lt;/a&gt;を新設しました。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;またこれとは別にテストとしてPerlで開発を受注できる会社リストのWikiページを作成してみましたので、もしあなたの会社や知っている会社がPerl開発を受注できるのであれば是非Wikiに追加してください。&lt;/div&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-07T11:41:14+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blog.perlassociation.org,2010://3.41</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link>http://chris.prather.org/brewing-up-a-storm.md.html</link>
      <description>Brewing Up a Storm
==================

Because I recently had the opportunity to do a fresh re-install of my
world1, I've spent the last few days playing with App::perlbrew.
App::perlbrew is the invention of Kang-min Liu aka gugod, and the basic
idea is that it's a perl manager. It will install and track several
different installations of Perl for you, allowing you to switch between
them at will.

$perlbrew installed
perl-5.10.1
perl-5.8.9
perl-5.6.2

$perlbrew switch perl-5.10.1
$perl -v
This is perl, v5.10.1 (*) built for darwin-2level

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

Having seen what power some simple scripting can do in the form of
Miyagawa's App::cpanminus, I started tinkering with perlbrew. It started
with perl 5.10.1 not installing properly on Snow Leopard2, so the first
thing I added was a way to force install.

perlbrew install -f perl-5.10.1

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

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

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

Today I integrated it with local::lib so that if you have local::lib
installed it will drop the proper configuration in the perlbrew
configuration scripts so that when you install new modules they get
installed into your perlbrew managed directories3.

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

$perlbrew install perl-5.10.1 --as=debugging-perl -D=debugging

I would like to integrate a plugin system4, but all in all I'm very happy
with it. Much thanks to gugod for making it to start with, and to
Miyagawa for getting me itching for small lightweight tools in my
toolchain. If you're interested in my changes, you can check them out on
my github

By: Chris Prather on 2010-03-07T00:00:00

Tags:

------------------------------------------------------------------------

  1. 

    Last week I upgraded my trusty Macbook Pro from OSX 10.5 (Leopard) to
    OSX 10.6 (Snow Leopard), using a "complete wipe". The old system had
    been around for ~3 years and was showing the cruft so it was time. ↩

  2. 

    Apparently there is an issue with Snow Leopard's locales, and a
    single test fails. ↩

  3. 

    Full disclosure, I got this to the proof of concept stage but not
    really much further. It currently expects local::lib to be installed
    to $HOME/perl5 (which is the default). If you have it installed
    somewhere else, you'll need to manually set up the environment. ↩

  4. 

    Having recently played with plugins in cpanminus I have to say
    they're incredibly nifty. The github plugin is especially nice. I
    especially would like a plugin to allow swapping Git in for several
    parts of the system. ↩</description>
      <dc:date>2010-03-07T01:00:00+01:00</dc:date>
      <title>Brewing Up a Storm</title>
      <pubDate>Sun, 07 Mar 2010 01:00:00 +0100</pubDate>
      <content:encoded>&lt;h1 id="brewingupastorm"&gt;Brewing Up a Storm&lt;/h1&gt;

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

&lt;pre&gt;&lt;code&gt;$perlbrew installed
perl-5.10.1
perl-5.8.9
perl-5.6.2

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

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

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

&lt;pre&gt;&lt;code&gt;perlbrew install -f perl-5.10.1
&lt;/code&gt;&lt;/pre&gt;

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

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

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

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

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

&lt;pre&gt;&lt;code&gt;$perlbrew install perl-5.10.1 --as=debugging-perl -D=debugging
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;By: Chris Prather on 2010-03-07T00:00:00&lt;/p&gt;

&lt;p&gt;Tags: &lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;

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

&lt;li id="fn:2"&gt;&lt;p&gt;Apparently there is an issue with Snow Leopard's locales, and a single test fails.&lt;a href="#fnref:2" class="reversefootnote"&gt;&amp;#160;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

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

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

&lt;/ol&gt;
&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-07T01:00:00+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://chris.prather.org/brewing-up-a-storm.md.html</guid>
    </item>
    <item>
      <author>nobody@example.com (ReneeB)</author>
      <dc:creator>nobody@example.com (ReneeB)</dc:creator>
      <link>http://reneeb-perlblog.blogspot.com/2010/03/perlcebit-tag-5.html</link>
      <description>Es ist geschafft! 5 Tage CeBIT! Unser diesjähriger CeBIT-Triathlon heißt:
Stehen, Laufen, über Perl reden.

Unser insgesamt 9-köpfiges Team hat diese drei Disziplinen mit Bravour
gemeistert. Ein paar Zahlen, die den bisherigen Einsatz dokumentieren:

* Rund 80 Kilo Werbematerial rund um Perl wurde unter die Leute gebracht.
* 1 Autopanne
* Ca. 25 Liter Getränke vertilgt (darunter der harte körperliche Einsatz
eines unserer Helfer bei der Völkerverständigung mit russischen
CeBIT-Ausstellern)
* 1 große Packung mit kleinen Schokoladentafeln
* und noch vieles mehr...

Heute waren unter den Besuchern der CeBIT sehr viele Jugendliche, die man
vorher überhaupt nicht gesehen hat. Thomas hatte sehr viel Erfolg dabei,
die Broschüren unter den Besuchern zu verteilen und einen Teil zu unserem
Stand zu lotsen. Auch so kann Perl-Programmierer-Nachwuchs generiert
werden ;-)

Schon gestern abend hatte Torsten geklärt, dass wir heute einen
ungeplanten Lightning Talk auf der "CeBIT Open Source Forum"-Bühne halten
können. Doch wer sollte das machen? Es waren keine Folien vorbereitet.
Geplant war, den Vortrag ganz am Schluss zu halten. Aber dann kam alles
anders! Schon am Anfang hat ein Vortragender viel weniger Zeit benötigt
als geplant. Britta kam auf uns zu und meinte, dass das eine gute
Gelegenheit für den Lightning Talk wäre. Jetzt musste innerhalb von
wenigen Minuten jemand bestimmt werden, der den Vortrag hält. Und die
Wahl fiel auf Gábor.

Ich denke, dass der Vortrag über Padre sehr gut ankam. Viele Leute haben
ihre Tour durch die Halle unterbrochen, um Gábor zu lauschen.

Ansonsten gab es eigentlich keine besonderen Vorkommnisse. Um 18 Uhr
haben wir dann unseren Stand abgebaut. Da wir das meiste Material
verteilt hatten, blieb nicht viel übrig, das weggeräumt werden musste. Um
halb sieben habe ich dann das Gelände verlassen und bin Richtung Hotel
gefahren.

Abschließend möchte ich mich bei Gábor, Torsten, Sebastian, Thomas,
Bernhard, Michael, Robert und Oliver für die Unterstützung und Hilfe beim
Perl-Stand bedanken!

Jetzt wartet die Nachbereitung in der nächsten Woche. Die Leute, mit
denen wir hier Kontakt bekommen haben, müssen kontaktiert werden und wir
müssen unsere Erfahrungen aufschreiben, damit wir es in Zukunft einfacher
haben.

Die CeBIT war für uns ein voller Erfolg!</description>
      <dc:date>2010-03-06T21:29:00Z</dc:date>
      <title>Perl@CeBIT - Tag 5</title>
      <pubDate>Sat, 06 Mar 2010 21:29:00 -0000</pubDate>
      <content:encoded>Es ist geschafft! 5 Tage &lt;a href="http://cebit.de/"&gt;CeBIT&lt;/a&gt;! Unser diesjähriger CeBIT-Triathlon heißt: Stehen, Laufen, über &lt;a href="http://perl.org/"&gt;Perl&lt;/a&gt; reden.&lt;br /&gt;&lt;br /&gt;Unser insgesamt &lt;a href="http://www.perlfoundation.org/perl5/index.cgi?events_2010_cebit"&gt;9-köpfiges Team&lt;/a&gt; hat diese drei Disziplinen mit Bravour gemeistert. Ein paar Zahlen, die den bisherigen Einsatz dokumentieren:&lt;br /&gt;&lt;br /&gt;* Rund 80 Kilo Werbematerial rund um Perl wurde unter die Leute gebracht.&lt;br /&gt;* 1 Autopanne&lt;br /&gt;* Ca. 25 Liter Getränke vertilgt (darunter der harte körperliche Einsatz eines unserer Helfer bei der Völkerverständigung mit russischen CeBIT-Ausstellern)&lt;br /&gt;* 1 große Packung mit kleinen Schokoladentafeln&lt;br /&gt;* und noch vieles mehr...&lt;br /&gt;&lt;br /&gt;Heute waren unter den Besuchern der CeBIT sehr viele Jugendliche, die man vorher überhaupt nicht gesehen hat. &lt;a href="http://thomas-fahle.de/"&gt;Thomas&lt;/a&gt; hatte sehr viel Erfolg dabei, die Broschüren unter den Besuchern zu verteilen und einen Teil zu unserem Stand zu lotsen. Auch so kann Perl-Programmierer-Nachwuchs generiert werden ;-)&lt;br /&gt;&lt;br /&gt;Schon gestern abend hatte Torsten geklärt, dass wir heute einen ungeplanten Lightning Talk auf der "CeBIT Open Source Forum"-Bühne halten können. Doch wer sollte das machen? Es waren keine Folien vorbereitet. Geplant war, den Vortrag ganz am Schluss zu halten. Aber dann kam alles anders! Schon am Anfang hat ein Vortragender viel weniger Zeit benötigt als geplant. Britta kam auf uns zu und meinte, dass das eine gute Gelegenheit für den Lightning Talk wäre. Jetzt musste innerhalb von wenigen Minuten jemand bestimmt werden, der den Vortrag hält. Und die Wahl fiel auf Gábor.&lt;br /&gt;&lt;br /&gt;Ich denke, dass der Vortrag über &lt;a href="http://padre.perlide.org/"&gt;Padre&lt;/a&gt; sehr gut ankam. Viele Leute haben ihre Tour durch die Halle unterbrochen, um Gábor zu lauschen.&lt;br /&gt;&lt;br /&gt;Ansonsten gab es eigentlich keine besonderen Vorkommnisse. Um 18 Uhr haben wir dann unseren Stand abgebaut. Da wir das meiste Material verteilt hatten, blieb nicht viel übrig, das weggeräumt werden musste. Um halb sieben habe ich dann das Gelände verlassen und bin Richtung Hotel gefahren.&lt;br /&gt;&lt;br /&gt;Abschließend möchte ich mich bei Gábor, Torsten, Sebastian, Thomas, Bernhard, Michael, Robert und Oliver für die Unterstützung und Hilfe beim Perl-Stand bedanken!&lt;br /&gt;&lt;br /&gt;Jetzt wartet die Nachbereitung in der nächsten Woche. Die Leute, mit denen wir hier Kontakt bekommen haben, müssen kontaktiert werden und wir müssen unsere Erfahrungen aufschreiben, damit wir es in Zukunft einfacher haben.&lt;br /&gt;&lt;br /&gt;Die CeBIT war für uns ein voller Erfolg!&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-06T21:29:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-31159397.post-1298823338738259351</guid>
    </item>
    <item>
      <author>nobody@example.com (chromatic)</author>
      <dc:creator>nobody@example.com (chromatic)</dc:creator>
      <category>CPAN modern perl perl Perl 5</category>
      <link>http://www.modernperlbooks.com/mt/2010/03/configuration-free-cpan-installations.html</link>
      <description>Module::Install exists because installing CPAN distributions is not
always perfectly easy.

Unfortunately, it didn't help—at least, not entirely. According to the
completely unscientific process by which I install CPAN distributions,
Module::Install accounts for a greater amount of pain than it should, at
least according to its frequency of use. (Again, this is completely
unscientific. I could guess that half of the CPAN client sessions which
encounter Module::Install require me to fix things manually, but it's
probably closer to 20%. It's more memorable because of my severe dislike
for M::I prompting to install dependencies during configuration time.)

M::I addresses a real bootstrapping problem. I want to be able to use
libraries during configuration, building, testing, and installation. I
don't know which versions of those libraries you have available. Bundling
known-good versions of those libraries with the distribution itself
solves part of that problem...

... except when it doesn't. If I were to use M::I, I would have to
re-release all of my distributions for every new release of every bundled
library, at least if they contain important bug fixes for the various
platforms about which I care. The cheap perfume of static linking leaves
its musk heavy in the air.

It's easy to fall into the trap of a false dilemma. "You fool!" you
prepare to comment below. "It's either that or the chaos of trying to
make do with whatever version of those dependencies users may or may not
have installed on their systems!" You're right; those are two
possibilities. They're not the only two possibilities.

Part of the real problem is that bootstrapping during configuration is
much too late. By the time you're running the configuration system,
you're already running the configuration system. If your version of the
configuration system is too old or too new, you have a problem. Bail out?
Revert? Upgrade? There's no good heuristic for determining this. (The
CPAN itself has an opinion. That's part of the problem.)

M::I hackers do deserve credit for helping to develop the META.yml
standard. (I think M::I is the wrong approach, but I intend no slight
toward its users, advocates, and developers. Invention requires the
courage to get things wrong sometimes, even as it requires the courage to
abandon false leads.) The META.yml specification is a big step in the
right direction. If most CPAN modules have static requirements and follow
a standard set of conventions, there's little or no configuration
necessary. A sufficiently smart CPAN client can perform the appropriate
configuration without running code from the distribution itself.

You can't avoid that in all cases; distributions with XS components, for
example, need to probe system information. Good luck writing a
sufficiently smart CPAN client and getting the community to agree on
specific standards that let you find OpenGL headers in a cross-platform
fashion, for example. Yet if 80% of CPAN distributions can get by with
static, upload-time configuration, a lot of complexity of installation
can go away.

Yes, that would make Module::Build and ExtUtils::MakeMaker unnecessary
for (probably) most CPAN distributions, at least at the point of
configuration, building, and installation. (I'm a recent fan of
Dist::Zilla for automating away tedium on behalf of distribution
maintainers; there's less need for Module::Install in such a world. If I
never write another Build.PL again, so much the better.)

That helps, but the real problem with CPAN installations is that the CPAN
itself is merely an uploading, indexing, and mirroring system. Projects
such as META.yml attempt to add (and extract) meaning from the system,
but they cannot work around one fundamental design feature of the CPAN.
That limitation is the source of most woes for end users.

Clever readers (or experienced CPAN users) have already identified this
limitation. I'll reveal it in the next installment.</description>
      <dc:date>2010-03-06T20:11:00Z</dc:date>
      <dc:subject>CPAN modern perl perl Perl 5</dc:subject>
      <title>Configuration-Free CPAN Installations</title>
      <pubDate>Sat, 06 Mar 2010 20:11:00 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;&lt;a href="http://www.modernperlbooks.com/mt/2010/03/whats-wrong-with-moduleinstall.html"&gt;Module::Install
exists because installing CPAN distributions is not always perfectly
easy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unfortunately, it didn't help&amp;mdash;at least, not entirely.  According to
the completely unscientific process by which I install CPAN distributions,
&lt;code&gt;Module::Install&lt;/code&gt; accounts for a greater amount of pain than it
should, at least according to its frequency of use.  (Again, this is completely
&lt;em&gt;unscientific&lt;/em&gt;.  I could guess that half of the CPAN client sessions
which encounter Module::Install require me to fix things manually, but it's
probably closer to 20%.  It's more memorable because of my severe dislike for
M::I &lt;em&gt;prompting&lt;/em&gt; to install dependencies during configuration time.)&lt;/p&gt;

&lt;p&gt;M::I addresses a real bootstrapping problem.  I want to be able to use
libraries during configuration, building, testing, and installation.  I don't
know which versions of those libraries you have available.  Bundling known-good
versions of those libraries with the distribution itself solves part of that
problem...&lt;/p&gt;

&lt;p&gt;... except when it doesn't.  If I were to use M::I, I would have to
re-release all of my distributions for every new release of every bundled
library, at least if they contain important bug fixes for the various platforms
about which I care.  The cheap perfume of static linking leaves its musk heavy
in the air.&lt;/p&gt;

&lt;p&gt;It's easy to fall into the trap of a false dilemma.  "You fool!" you prepare
to comment below.  "It's either that or the chaos of trying to make do with
whatever version of those dependencies users may or may not have installed on
their systems!"  You're right; those are two possibilities.  They're not the
only two possibilities.&lt;/p&gt;

&lt;p&gt;Part of the real problem is that bootstrapping during configuration is much
too late.  By the time you're running the configuration system, you're already
running the configuration system.  If your version of the configuration system
is too old or too new, you have a problem.  Bail out?  Revert?  Upgrade?
There's no good heuristic for determining this.  (The CPAN itself has an
opinion.  That's part of the problem.)&lt;/p&gt;

&lt;p&gt;M::I hackers do deserve credit for helping to develop the &lt;em&gt;META.yml&lt;/em&gt;
standard.  (I think M::I is the wrong approach, but I intend no slight toward
its users, advocates, and developers.  Invention requires the courage to get
things wrong sometimes, even as it requires the courage to abandon false
leads.) The &lt;a href="http://module-build.sourceforge.net/META-spec-current.html"&gt;META.yml&lt;/a&gt;
specification is a big step in the right direction.  If &lt;em&gt;most&lt;/em&gt; CPAN
modules have static requirements and follow a standard set of conventions,
there's little or no configuration necessary.  A sufficiently smart CPAN client
can perform the appropriate configuration without running code from the
distribution itself.&lt;/p&gt;

&lt;p&gt;You can't avoid that in all cases; distributions with XS components, for
example, need to probe system information.  Good luck writing a sufficiently
smart CPAN client and getting the community to agree on specific standards that
let you find OpenGL headers in a cross-platform fashion, for example.  Yet if
80% of CPAN distributions can get by with static, upload-time configuration, a
lot of complexity of installation can go away.&lt;/p&gt;

&lt;p&gt;Yes, that would make &lt;code&gt;Module::Build&lt;/code&gt; and
&lt;code&gt;ExtUtils::MakeMaker&lt;/code&gt; unnecessary for (probably) most CPAN
distributions, at least at the point of configuration, building, and
installation.  (I'm a recent fan of &lt;a href="http://search.cpan.org/perldoc?Dist::Zilla"&gt;Dist::Zilla&lt;/a&gt; for
automating away tedium on behalf of distribution maintainers; there's less need
for &lt;code&gt;Module::Install&lt;/code&gt; in such a world.  If I never write another
&lt;em&gt;Build.PL&lt;/em&gt; again, so much the better.)&lt;/p&gt;

&lt;p&gt;That helps, but the real problem with CPAN installations is that the CPAN
itself is merely an uploading, indexing, and mirroring system.  Projects such
as &lt;em&gt;META.yml&lt;/em&gt; attempt to add (and extract) meaning from the system, but
they cannot work around one fundamental design feature of the CPAN.
&lt;em&gt;That&lt;/em&gt; limitation is the source of most woes for end users.&lt;/p&gt;

&lt;p&gt;Clever readers (or experienced CPAN users) have already identified this
limitation.  I'll reveal it in the next installment.&lt;/p&gt;

        
    </content:encoded>
      <dcterms:modified>2010-03-06T20:11:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.modernperlbooks.com,2010:/mt//1.158</guid>
    </item>
    <item>
      <author>nobody@example.com (Yanick)</author>
      <dc:creator>nobody@example.com (Yanick)</dc:creator>
      <category>perl git gitpan</category>
      <link>http://babyl.dyndns.org/techblog/2010/03/on-the-peril-of-importing-remote-tags-in-git.html</link>
      <description>originally published in the Pythian Blog.

So mothers keep your hackers at home
Don't let them journey all alone
Tell them this world is full of danger
And to shun the repositories of strangers
        - The Tag Set of Strangers, 
                (with apologies to) Nick Cave and the Bad Seeds

One of the things I love about Git is how I can add branches from remote
repositories in mine at will without fearing to mess up anything. The
remote branches will not clash with my own, even if they share the same
names, because they are referenced as repository/branch. However, as for
anything else, you can still poke yourself in the eye if you try hard
enough:

$ git remote
bob

$ git checkout -b bob/baroque
Switched to a new branch 'bob/baroque'

$ git fetch bob
From ../bob
* [new branch]      baroque    -&gt; bob/baroque

$ git checkout bob/baroque
warning: refname 'bob/baroque' is ambiguous.
Already on 'bob/baroque'

Here, I created a local branch called bob/baroque, which will end up
having the same name as the branch baroque imported from Bob's
repository. Confusing, but not the end of the world. I can still see the
difference branches with gitk and access the local and remote branches
via git checkout remotes/bob/baroque and git checkout remotes/bob/baroque.[1]
The lesson to take out from this, of course, is simply not to use slashes
in branch names and sidestep the whole issue.

[1] The fiendish-minded reader probably wonder at this point what would
happen if I was to create another local branch called remotes/bob/baroque.
I would deserve to be shot, that's what would happen.

With tags, surprisingly, the matter is much more prickly. Not only tags
are not kept to the ''namespace'' of their repository of origin, but git
fetch has a very dangerous default behavior:

$ git log -n 1 somework
commit 483d008c6207554236232fef4e8cd22cfb4b9bb8
Author: Yanick Champoux &lt;yanick@babyl.dyndns.org&gt;
Date:   Wed Mar 3 21:14:43 2010 -0500

    some work on my repo

$ git fetch --tags bob
From ../b
- [tag update]      somework   -&gt; somework

$ git log -n 1 somework
commit 5f7f8eddd2d44e359fe8bc0d1a2f1642d073cad9
Author: Yanick Champoux &lt;yanick@babyl.dyndns.org&gt;
Date:   Wed Mar 3 21:15:25 2010 -0500

    some work from Bob

Yes, if there is a conflict, fetch --tags will silently clobber the local
tags with their remote counterparts. Hope you remember all the commits
you painstakingly tagged in the last six months... This behavior is so
mind-bogglingly dangerous that, to this day, I wonder if I'm not missing
something obvious.

Now, granted, it's fairly rare to import tags from remote repositories.
But there are instances, like when adding the gitpan history of your
module to your repository, where it's relevant. In those cases, for your
own sake, make sure that the remote tags won't clash with yours. Even
better, don't use fetch --tags at all. Instead, do something akin to:

$ git ls-remote --tags bob | perl -nae'$F[1]=~s#refs/tags#bob#; `git tag $F[1] $F[0]`'

This will name remote tags using the repository/tag convention. Even
better, if the tag already exist, Git will complain and it won't be
clobbered by the new version.</description>
      <dc:date>2010-03-06T18:37:15Z</dc:date>
      <dc:subject>perl git gitpan</dc:subject>
      <title>On the Peril of Importing Remote Tags in Git</title>
      <pubDate>Sat, 06 Mar 2010 18:37:15 -0000</pubDate>
      <content:encoded>
        &lt;div align="right"&gt;originally published in the &lt;a href="http://www.pythian.com/news/9067/on-the-perils-of-importing-remote-tags-in-git/"&gt;Pythian Blog&lt;/a&gt;.&lt;/div&gt;

&lt;pre&gt;&lt;code&gt;So mothers keep your hackers at home
Don't let them journey all alone
Tell them this world is full of danger
And to shun the repositories of strangers
        - The Tag Set of Strangers, 
                (with apologies to) Nick Cave and the Bad Seeds
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;One of the things I love about Git is how I can add branches from remote repositories in mine at will without fearing to mess up anything.  The remote branches will not clash with my own, even if they share the same names, because they are referenced as &lt;em&gt;repository&lt;/em&gt;/&lt;em&gt;branch&lt;/em&gt;.  However, as for anything else, you can still poke yourself in the eye if you try hard enough:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git remote
bob

$ git checkout -b bob/baroque
Switched to a new branch 'bob/baroque'

$ git fetch bob
From ../bob
* [new branch]      baroque    -&amp;gt; bob/baroque

$ git checkout bob/baroque
warning: refname 'bob/baroque' is ambiguous.
Already on 'bob/baroque'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here, I created a local branch called &lt;em&gt;bob/baroque&lt;/em&gt;, which will end up having the same name as the branch &lt;em&gt;baroque&lt;/em&gt; imported from Bob's repository. Confusing, but not the end of the world.  I can still see the difference branches with &lt;code&gt;gitk&lt;/code&gt; and access the local and remote branches via &lt;code&gt;git checkout remotes/bob/baroque&lt;/code&gt; and &lt;code&gt;git checkout remotes/bob/baroque&lt;/code&gt;.[1] The lesson to take out from this, of course, is simply not to use slashes in branch names and sidestep the whole issue.&lt;/p&gt;

&lt;p&gt;[1] The fiendish-minded reader probably wonder at this point what would happen if I was to create another local branch called &lt;code&gt;remotes/bob/baroque&lt;/code&gt;.  I would deserve to be shot, that's what would happen.&lt;/p&gt;

&lt;p&gt;With tags, surprisingly, the matter is much more prickly.  Not only tags are not kept to the ''namespace'' of their repository of origin, but &lt;code&gt;git fetch&lt;/code&gt; has a very dangerous default behavior:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git log -n 1 somework
commit 483d008c6207554236232fef4e8cd22cfb4b9bb8
Author: Yanick Champoux &amp;lt;yanick@babyl.dyndns.org&amp;gt;
Date:   Wed Mar 3 21:14:43 2010 -0500

    some work on my repo

$ git fetch --tags bob
From ../b
- [tag update]      somework   -&amp;gt; somework

$ git log -n 1 somework
commit 5f7f8eddd2d44e359fe8bc0d1a2f1642d073cad9
Author: Yanick Champoux &amp;lt;yanick@babyl.dyndns.org&amp;gt;
Date:   Wed Mar 3 21:15:25 2010 -0500

    some work from Bob
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Yes, if there is a conflict, &lt;code&gt;fetch --tags&lt;/code&gt; will silently clobber the local tags with their remote counterparts.  Hope you remember all the commits you painstakingly tagged in the last six months... This behavior is so mind-bogglingly dangerous that, to this day, I wonder if I'm not missing something obvious.&lt;/p&gt;

&lt;p&gt;Now, granted, it's fairly rare to import tags from remote repositories.  But there are instances, like when adding the &lt;a href="http://github.com/gitpan"&gt;gitpan&lt;/a&gt; history of your module to your repository, where it's relevant.  In those cases, for your own sake, make sure that the remote tags won't clash with yours. Even better, don't use &lt;code&gt;fetch --tags&lt;/code&gt; at all.  Instead, do something akin to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git ls-remote --tags bob | perl -nae'$F[1]=~s#refs/tags#bob#; `git tag $F[1] $F[0]`'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will name remote tags using the &lt;code&gt;repository/tag&lt;/code&gt; convention.  Even better, if the tag already exist, Git will complain and it won't be clobbered by the new version.  &lt;/p&gt;

        

    </content:encoded>
      <dcterms:modified>2010-03-06T18:37:15Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:babyl.dyndns.org,2010:/techblog//1.176</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100307/push</link>
      <description>PubSubHubbub(以下PuSH)は、フィードの更新をリアルタイムに通知するためのプロトコルである。

ウェブ上にころがっている"PuSH"の情報は、"Pub" の部分を実装する方法か、「PubSubHubbub
の本家GAE実装を手元でうごかしてみたよ」という記事しかなくて、"Sub"を実装する方法について解説しているブログなどはみあたらなかったので、ここに記す(英語だといくつかあった)。

基本的に、ほとんどの人が興味あるのは "Pub"
の部分である。自分のブログの更新情報等をリアルタイムにおくりつけたいと考えるからである。実際、ほとんどのブログソフトウェアではすでに PuSH
対応がすんでいる。see MT-PuSH, etc.

しかし、私は今まさに Subscriber をつくりたいとおもったのである。なぜならば、"friendfeed.com/cpan" の更新情報を
PuSH でうけとり、リアルタイムに手元の情報を更新しようとおもったからである。

さて、"Sub" の部分については、いくつかのライブラリ実装もあるようだ。しかし、Perl のものはない。なんでだろう。

http://code.google.com/p/pubsubhubbub/wiki/SubscriberClients

というわけで、しょうがないのでプロトコル仕様を読む。

http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html

以下のようなフローで購読処理が完了するようだ。

処理の方法

サブスクライブ要求を hub にだす。

hub.callback

コールバックURL

hub.mode

"subscribe" または "unsubscribe" という文字列

hub.topic

購読したいフィードの URL

hub.verify

自分がおくった文字列かどうかを確認するための秘密の文字列

(他にもoptionalな項目がいくつかある)

この部分は、URL を生成して HTTP Request をなげてつかう。

しかし、リファレンス実装の GAE hub には、これをおくるための web ui がついているので、これを利用するのが簡単だ。https://pubsubhubbub.appspot.com/subscribe

hub は、204 no content を返すので、submit ボタンをおしてもなにも変化しないことに注意。ボタンをおしたら、callback
url にリクエストがとんでくるはずである。

確認リクエストがとんでくるので、これを処理する

hub は、スパム防止のために、sub にたいして「本当におまえがおくったんけ？」というリクエストをなげる。

そのリクエストには以下の項目がふくまれる(optionalな項目は省略)。

hub.mode

"subscribe"という文字列

hub.topic

購読対象のURL

hub.challenge

hubが生成したランダムな文字列

これにたいして、レスポンスは 200 OK で、content body に hub.challenge をそのままいれてやればよい。

定期的な確認

subscriber
には有効期限が設定されており、期限がおわったら、再度確認リクエストがくるので、その時にもちゃんと応答してやらなくてはならない。

Perl による簡単な実装例

"*.psgi" 形式による簡単な疑似コードをここに紹介する。

use Plack::Request;use XML::Feed;sub {
  my $req = Plack::Request-&gt;new();
  if ($req-&gt;param('hub.mode') eq 'subscribe') {
    my $topic = $req-&gt;param('hub.topic');
    my $challenge = $req-&gt;param('hub.challenge');
    if ($topic eq 'ここに購読したいURLを書く') {
       return [200, [], [$challenge]];
    } else {
       return [500, [], ["unknown feed"]];
    }
  } else {
    # 実際のフィードにたいする処理はここにかく    my $feed = XML::Feed-&gt;parse(\($req-&gt;content));
    ...
    return [200, [], ["OK"]]; # 2xx をかえして成功をつげる。  }
}

ここにいたり、なぜ "Sub" のライブラリが Perl に無いのかを知る。そう。必要ないのだ。

まとめ

PubSubHubbub の "Sub" の実装について解説した。今回の場合、friendfeed からの情報取得だったので、realtime
streaming API を利用してもよかったのだが、更新頻度がそれほどないフィードであること、より汎用的なプロトコルであうことから
PubSubHubbub を利用することにした。

PubSubHubbub の場合、webhook で実装可能であるから、デーモンの数が増えないのが利点のひとつだとかんじた。

【追記】

フィードを処理した後のところのレスポンスを追加。</description>
      <dc:date>2010-03-07T00:00:00+09:00</dc:date>
      <title>リアルタイムWebのためのPubSubHubbub の Subscriber を構築する方法</title>
      <pubDate>Sun, 07 Mar 2010 00:00:00 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;PubSubHubbub(以下PuSH)は、フィードの更新をリアルタイムに通知するためのプロトコルである。&lt;/p&gt;
			&lt;p&gt;ウェブ上にころがっている"PuSH"の情報は、"Pub" の部分を実装する方法か、「PubSubHubbub の本家GAE実装を手元でうごかしてみたよ」という記事しかなくて、"Sub"を実装する方法について解説しているブログなどはみあたらなかったので、ここに記す(英語だといくつかあった)。&lt;/p&gt;
			&lt;p&gt;基本的に、ほとんどの人が興味あるのは "Pub" の部分である。自分のブログの更新情報等をリアルタイムにおくりつけたいと考えるからである。実際、ほとんどのブログソフトウェアではすでに PuSH 対応がすんでいる。see MT-PuSH, etc.&lt;/p&gt;
			&lt;p&gt;しかし、私は今まさに Subscriber をつくりたいとおもったのである。なぜならば、"friendfeed.com/cpan" の更新情報を PuSH でうけとり、リアルタイムに手元の情報を更新しようとおもったからである。&lt;/p&gt;
			&lt;p&gt;さて、"Sub" の部分については、いくつかのライブラリ実装もあるようだ。しかし、Perl のものはない。なんでだろう。&lt;/p&gt;
			&lt;p&gt;&lt;a href="http://code.google.com/p/pubsubhubbub/wiki/SubscriberClients" target="_blank"&gt;http://code.google.com/p/pubsubhubbub/wiki/SubscriberClients&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;というわけで、しょうがないのでプロトコル仕様を読む。&lt;/p&gt;
			&lt;p&gt;&lt;a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html" target="_blank"&gt;http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;以下のようなフローで購読処理が完了するようだ。&lt;/p&gt;
			&lt;h4&gt;処理の方法&lt;/h4&gt;
			&lt;h5&gt;サブスクライブ要求を hub にだす。&lt;/h5&gt;

			&lt;table&gt;
				&lt;tr&gt;&lt;th&gt;hub.callback&lt;/th&gt;&lt;td&gt;コールバックURL&lt;/td&gt;&lt;/tr&gt;
				&lt;tr&gt;&lt;th&gt;hub.mode&lt;/th&gt;&lt;td&gt;"subscribe" または "unsubscribe" という文字列&lt;/td&gt;&lt;/tr&gt;
				&lt;tr&gt;&lt;th&gt;hub.topic&lt;/th&gt;&lt;td&gt;購読したいフィードの URL&lt;/td&gt;&lt;/tr&gt;
				&lt;tr&gt;&lt;th&gt;hub.verify&lt;/th&gt;&lt;td&gt;自分がおくった文字列かどうかを確認するための秘密の文字列&lt;/td&gt;&lt;/tr&gt;
			&lt;/table&gt;
			&lt;p&gt;(他にもoptionalな項目がいくつかある)&lt;/p&gt;
			&lt;p&gt;この部分は、URL を生成して HTTP Request をなげてつかう。&lt;/p&gt;
			&lt;p&gt;しかし、リファレンス実装の GAE hub には、これをおくるための web ui がついているので、これを利用するのが簡単だ。&lt;a href="https://pubsubhubbub.appspot.com/subscribe" target="_blank"&gt;https://pubsubhubbub.appspot.com/subscribe&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;hub は、204 no content を返すので、submit ボタンをおしてもなにも変化しないことに注意。ボタンをおしたら、callback url にリクエストがとんでくるはずである。&lt;/p&gt;
			&lt;h5&gt;確認リクエストがとんでくるので、これを処理する&lt;/h5&gt;
			&lt;p&gt;hub は、スパム防止のために、sub にたいして「本当におまえがおくったんけ？」というリクエストをなげる。&lt;/p&gt;
			&lt;p&gt;そのリクエストには以下の項目がふくまれる(optionalな項目は省略)。&lt;/p&gt;

			&lt;table&gt;
				&lt;tr&gt;&lt;th&gt;hub.mode&lt;/th&gt;&lt;td&gt;"subscribe"という文字列&lt;/td&gt;&lt;/tr&gt;
				&lt;tr&gt;&lt;th&gt;hub.topic&lt;/th&gt;&lt;td&gt;購読対象のURL&lt;/td&gt;&lt;/tr&gt;
				&lt;tr&gt;&lt;th&gt;hub.challenge&lt;/th&gt;&lt;td&gt;hubが生成したランダムな文字列&lt;/td&gt;&lt;/tr&gt;

			&lt;/table&gt;
			&lt;p&gt;これにたいして、レスポンスは 200 OK で、content body に hub.challenge をそのままいれてやればよい。&lt;/p&gt;
			&lt;h5&gt;定期的な確認&lt;/h5&gt;
			&lt;p&gt;subscriber には有効期限が設定されており、期限がおわったら、再度確認リクエストがくるので、その時にもちゃんと応答してやらなくてはならない。&lt;/p&gt;
			&lt;h4&gt; Perl による簡単な実装例&lt;/h4&gt;
			&lt;p&gt;"*.psgi" 形式による簡単な疑似コードをここに紹介する。&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Plack::Request;
&lt;span class="synStatement"&gt;use &lt;/span&gt;XML::Feed;
&lt;span class="synStatement"&gt;sub&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;{
  &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$req&lt;/span&gt; = Plack::Request-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;();
  &lt;span class="synStatement"&gt;if&lt;/span&gt; (&lt;span class="synIdentifier"&gt;$req&lt;/span&gt;-&amp;#62;param(&lt;span class="synConstant"&gt;'hub.mode'&lt;/span&gt;) &lt;span class="synStatement"&gt;eq&lt;/span&gt; &lt;span class="synConstant"&gt;'subscribe'&lt;/span&gt;) {
    &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$topic&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$req&lt;/span&gt;-&amp;#62;param(&lt;span class="synConstant"&gt;'hub.topic'&lt;/span&gt;);
    &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$challenge&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$req&lt;/span&gt;-&amp;#62;param(&lt;span class="synConstant"&gt;'hub.challenge'&lt;/span&gt;);
    &lt;span class="synStatement"&gt;if&lt;/span&gt; (&lt;span class="synIdentifier"&gt;$topic&lt;/span&gt; &lt;span class="synStatement"&gt;eq&lt;/span&gt; &lt;span class="synConstant"&gt;'ここに購読したいURLを書く'&lt;/span&gt;) {
       &lt;span class="synStatement"&gt;return&lt;/span&gt; [&lt;span class="synConstant"&gt;200&lt;/span&gt;, [], [&lt;span class="synIdentifier"&gt;$challenge&lt;/span&gt;]];
    } &lt;span class="synStatement"&gt;else&lt;/span&gt; {
       &lt;span class="synStatement"&gt;return&lt;/span&gt; [&lt;span class="synConstant"&gt;500&lt;/span&gt;, [], [&lt;span class="synConstant"&gt;&amp;#34;unknown feed&amp;#34;&lt;/span&gt;]];
    }
  } &lt;span class="synStatement"&gt;else&lt;/span&gt; {
    &lt;span class="synComment"&gt;# 実際のフィードにたいする処理はここにかく&lt;/span&gt;
    &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$feed&lt;/span&gt; = XML::Feed-&amp;#62;parse(\(&lt;span class="synIdentifier"&gt;$req&lt;/span&gt;-&amp;#62;content));
    ...
    &lt;span class="synStatement"&gt;return&lt;/span&gt; [&lt;span class="synConstant"&gt;200&lt;/span&gt;, [], [&lt;span class="synConstant"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;]]; &lt;span class="synComment"&gt;# 2xx をかえして成功をつげる。&lt;/span&gt;
  }
}
&lt;/pre&gt;

			&lt;p&gt;ここにいたり、なぜ "Sub" のライブラリが Perl に無いのかを知る。そう。必要ないのだ。&lt;/p&gt;
			&lt;h4&gt;まとめ&lt;/h4&gt;
			&lt;p&gt;PubSubHubbub の "Sub" の実装について解説した。今回の場合、friendfeed からの情報取得だったので、realtime streaming API を利用してもよかったのだが、更新頻度がそれほどないフィードであること、より汎用的なプロトコルであうことから PubSubHubbub を利用することにした。&lt;/p&gt;
			&lt;p&gt;PubSubHubbub の場合、webhook で実装可能であるから、デーモンの数が増えないのが利点のひとつだとかんじた。&lt;/p&gt;
			&lt;p&gt;【追記】&lt;/p&gt;
			&lt;p&gt;フィードを処理した後のところのレスポンスを追加。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-07T00:00:00+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://d.hatena.ne.jp/tokuhirom/20100307/push</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100306/1267868239</link>
      <description>CPAN のメタデータは以下の3つにより配布されている。

  *  authors/01mailrc.txt.gz

  *  modules/02packages.details.txt.gz

  *  modules/03modlist.data.gz

いずれも gzip した状態で 200KB を越えるようなわりと大きなテキストファイルなので、これを web site や、CLI
等から直接利用すると、速度が遅くなる。

そこで、以下のような解決策がかんがえられているみたいです。

CPAN::SQLite

http://search.cpan.org/~rkobes/CPAN-SQLite-0.199/

上記ファイルから SQLite にデータをつっこむスクリプトを提供。検索用のメソッドも提供してくれる。

なお、一部の検索系のメソッドに SQL Injection 脆弱性があるので注意。ユーザーからの入力を直接いれさせると大変危険なので注意が必要。

(作者に連絡済だが、「次回リリースするときにでもなおしてやんよ」などと呑気なことをいってらっしゃるので、注意を喚起するものである)

また、正規化がわりといきすぎていて、02packages.details.txt.gz だと一行におさまっている、パッケージ名から dist
ファイル名の生成という一番基本的な動作が、これをつかうと、3つのテーブルを JOIN しなくてはいけなかったりして、ちょっとアレゲである。

CPAN Meta DB by id:miyagawa

http://cpanmetadb.appspot.com/

curl http://cpanmetadb.appspot.com/v1.0/package/Plack::Request

のようにアクセスすると、パッケージ名から、ダウンロードするファイルとバージョン番号が YAML でかえってくるという API である。

高速で、容易に利用可能なので便利である。ただし、これは機能が1つしかない。ので、マッチしなければつかえません(あたりまえ)

CPANDB

http://search.cpan.org/dist/CPANDB/

adamk が http://svn.ali.as/db/cpandb.bz2 という sqlite
のファイルを配布してやるから、それをつかえばいいよ、というプロジェクトである。

CPANDB.pm のドキュメントが TBD なかんじだが、実際には ORLite
を利用しているだけなので、対した問題ではない。これをつかうのが嫌であれば、DBIx::Skinny なり DBIC なりで schema を
dump して普通につかえばよろしい。

これは非常に筋がいいアプローチだとおもうのだが、更新頻度が低いようで、今日ダウンロードしてデータをしらべてみたら、Plack のバージョンが
0.911 のもののデータまでしかはいっていなかった。

2月25日には 0.912 がでているので、今日が
3月6日であることをかんがえると、ちと更新頻度に難がある(自分のユーズケースではすくなくともつかえない)。

ただし、schema のネーミングなどの感じからすると CPAN::SQLite よりもこちらの方が好みである。

CPANIDX

http://search.cpan.org/dist/App-CPANIDX/

こちらは bingos 氏によるもので、メタデータからの SQLite DB の生成(mysql にも対応しているようです)。

FastCGI による web api interface の提供も行っています。

また、API は実際に bingos さんのサーバーでうごいてるみたいです。

http://cpanidx.bingosnet.co.uk/cpandb/yaml/auth/BINGOS

ただ、この API は、ネットワーク的にとおいため、日本からだと結構おそいです</description>
      <dc:date>2010-03-06T18:37:19+09:00</dc:date>
      <title>CPAN 関連の API などのメタデータについての雑感</title>
      <pubDate>Sat, 06 Mar 2010 18:37:19 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;CPAN のメタデータは以下の3つにより配布されている。&lt;/p&gt;
			&lt;ul&gt;
				&lt;li&gt; authors/01mailrc.txt.gz&lt;/li&gt;
				&lt;li&gt; modules/02packages.details.txt.gz&lt;/li&gt;
				&lt;li&gt; modules/03modlist.data.gz&lt;/li&gt;
			&lt;/ul&gt;
			&lt;p&gt;いずれも gzip した状態で 200KB を越えるようなわりと大きなテキストファイルなので、これを web site や、CLI 等から直接利用すると、速度が遅くなる。&lt;/p&gt;
			&lt;p&gt;そこで、以下のような解決策がかんがえられているみたいです。&lt;/p&gt;
			&lt;h4&gt;CPAN::SQLite&lt;/h4&gt;
			&lt;p&gt;&lt;a href="http://search.cpan.org/~rkobes/CPAN-SQLite-0.199/" target="_blank"&gt;http://search.cpan.org/~rkobes/CPAN-SQLite-0.199/&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;上記ファイルから SQLite にデータをつっこむスクリプトを提供。検索用のメソッドも提供してくれる。&lt;/p&gt;
			&lt;p&gt;なお、一部の検索系のメソッドに SQL Injection 脆弱性があるので注意。ユーザーからの入力を直接いれさせると大変危険なので注意が必要。&lt;/p&gt;
			&lt;p&gt;(作者に連絡済だが、「次回リリースするときにでもなおしてやんよ」などと呑気なことをいってらっしゃるので、注意を喚起するものである)&lt;/p&gt;
			&lt;p&gt;また、正規化がわりといきすぎていて、02packages.details.txt.gz だと一行におさまっている、パッケージ名から dist ファイル名の生成という一番基本的な動作が、これをつかうと、3つのテーブルを JOIN しなくてはいけなかったりして、ちょっとアレゲである。&lt;/p&gt;
			&lt;h4&gt;CPAN Meta DB by &lt;a href="http://d.hatena.ne.jp/miyagawa/"&gt;id:miyagawa&lt;/a&gt;&lt;/h4&gt;
			&lt;p&gt;&lt;a href="http://cpanmetadb.appspot.com/" target="_blank"&gt;http://cpanmetadb.appspot.com/&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;curl &lt;a href="http://cpanmetadb.appspot.com/v1.0/package/Plack::Request" target="_blank"&gt;http://cpanmetadb.appspot.com/v1.0/package/Plack::Request&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;のようにアクセスすると、パッケージ名から、ダウンロードするファイルとバージョン番号が YAML でかえってくるという API である。&lt;/p&gt;
			&lt;p&gt;高速で、容易に利用可能なので便利である。ただし、これは機能が1つしかない。ので、マッチしなければつかえません(あたりまえ)&lt;/p&gt;
			&lt;h4&gt;CPANDB&lt;/h4&gt;
			&lt;p&gt;&lt;a href="http://search.cpan.org/dist/CPANDB/" target="_blank"&gt;http://search.cpan.org/dist/CPANDB/&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;adamk が &lt;a href="http://svn.ali.as/db/cpandb.bz2" target="_blank"&gt;http://svn.ali.as/db/cpandb.bz2&lt;/a&gt; という sqlite のファイルを配布してやるから、それをつかえばいいよ、というプロジェクトである。&lt;/p&gt;
			&lt;p&gt;CPANDB.pm のドキュメントが TBD なかんじだが、実際には ORLite を利用しているだけなので、対した問題ではない。これをつかうのが嫌であれば、DBIx::Skinny なり DBIC なりで schema を dump して普通につかえばよろしい。&lt;/p&gt;
			&lt;p&gt;これは非常に筋がいいアプローチだとおもうのだが、更新頻度が低いようで、今日ダウンロードしてデータをしらべてみたら、Plack のバージョンが 0.911 のもののデータまでしかはいっていなかった。&lt;/p&gt;
			&lt;p&gt;2月25日には 0.912 がでているので、今日が 3月6日であることをかんがえると、ちと更新頻度に難がある(自分のユーズケースではすくなくともつかえない)。&lt;/p&gt;
			&lt;p&gt;ただし、schema のネーミングなどの感じからすると CPAN::SQLite よりもこちらの方が好みである。&lt;/p&gt;
			&lt;h4&gt;CPANIDX&lt;/h4&gt;
			&lt;p&gt;&lt;a href="http://search.cpan.org/dist/App-CPANIDX/" target="_blank"&gt;http://search.cpan.org/dist/App-CPANIDX/&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;こちらは bingos 氏によるもので、メタデータからの SQLite DB の生成(mysql にも対応しているようです)。&lt;/p&gt;
			&lt;p&gt;FastCGI による web api interface の提供も行っています。&lt;/p&gt;
			&lt;p&gt;また、API は実際に bingos さんのサーバーでうごいてるみたいです。&lt;/p&gt;
			&lt;p&gt;&lt;a href="http://cpanidx.bingosnet.co.uk/cpandb/yaml/auth/BINGOS" target="_blank"&gt;http://cpanidx.bingosnet.co.uk/cpandb/yaml/auth/BINGOS&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;ただ、この API は、ネットワーク的にとおいため、日本からだと結構おそいです&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-06T18:37:19+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://d.hatena.ne.jp/tokuhirom/20100306/1267868239</guid>
    </item>
    <item>
      <author>nobody@example.com (ash)</author>
      <dc:creator>nobody@example.com (ash)</dc:creator>
      <category>Приложения movabletype perl</category>
      <link>http://onperl.ru/onperl/2010/03/bus-number-i-pr.html</link>
      <description>Да здравствует перл! Этот блог работает на перле, но писали его
неизвестные мне люди Я тут зашел куда-то в админской части, и увидел
массу комментариев, которые, оказывается, висят неодобренными. :-O

Часть я пооткрывал, а часть (ай!) удалил. Перл + юзабилити часто так же
несовместимо, как и многие другие продукты, созданный программистами.

И еще я забыл с собой зарядное устройство от телефона.

А следующий пост будет про автобус номер один, которую начали обсуждать в
комментах в прошлый раз.</description>
      <dc:date>2010-03-06T09:47:46+01:00</dc:date>
      <dc:subject>Приложения movabletype perl</dc:subject>
      <title>Bus number и пр.</title>
      <pubDate>Sat, 06 Mar 2010 09:47:46 +0100</pubDate>
      <content:encoded>
        &lt;p&gt;Да здравствует перл! Этот блог работает на перле, но писали его неизвестные мне люди Я тут зашел куда-то в админской части, и увидел массу комментариев, которые, оказывается, висят неодобренными. :-O&amp;nbsp;&lt;/p&gt;&lt;p&gt;Часть я пооткрывал, а часть (ай!) удалил. Перл + юзабилити часто так же несовместимо, как и многие другие продукты, созданный программистами.&lt;/p&gt;
&lt;p&gt;И еще я забыл с собой зарядное устройство от телефона.&lt;/p&gt;&lt;p&gt;А следующий пост будет про&amp;nbsp;&lt;i&gt;автобус номер один&lt;/i&gt;, которую начали обсуждать в комментах в прошлый раз.&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-06T09:47:46+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:onperl.ru,2010:/onperl//1.160</guid>
    </item>
    <item>
      <author>nobody@example.com (gfx)</author>
      <dc:creator>nobody@example.com (gfx)</dc:creator>
      <link>http://d.hatena.ne.jp/gfx/20100306/1267856898</link>
      <description>Yokohama.pm#5に参加しました。Shibuya.pmとはまた違った雰囲気で楽しかったです。

Yokohama.pm テクニカルトーク#5 (id:clouder)

内容については id:hiratara さんの記事が詳しいです。

今日は Yokohama.pm #5 の日です

私はPerl 5.12の新機能について発表してきました。

Perl 5.12 features*1

*1：前夜祭を入れると6回目ではないかという声が挙がったため、スライドではIDを5.1にしてあります。5.5という説もあります。</description>
      <dc:date>2010-03-06T15:28:18+09:00</dc:date>
      <title> [perl][Yokohama.pm] Yokohama.pm#5に参加しました</title>
      <pubDate>Sat, 06 Mar 2010 15:28:18 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;Yokohama.pm#5に参加しました。Shibuya.pmとはまた違った雰囲気で楽しかったです。&lt;/p&gt;
			&lt;p&gt;&lt;a href="http://yokohama.pm.org/2010/02/yokohamapm-5.html"&gt;Yokohama.pm テクニカルトーク#5&lt;/a&gt; (&lt;a href="http://d.hatena.ne.jp/clouder/"&gt;id:clouder&lt;/a&gt;)&lt;/p&gt;
			&lt;p&gt;内容については &lt;a href="http://d.hatena.ne.jp/hiratara/"&gt;id:hiratara&lt;/a&gt; さんの記事が詳しいです。&lt;/p&gt;
			&lt;p&gt; &lt;a href="http://d.hatena.ne.jp/hiratara/20100305/1267747275"&gt;今日は Yokohama.pm #5 の日です&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;私はPerl 5.12の新機能について発表してきました。&lt;/p&gt;
			&lt;p&gt;&lt;a href="http://gfx.github.com/yokohama.pm/TechTalk-5/main/index.html"&gt;Perl 5.12 features&lt;/a&gt;&lt;span class="footnote"&gt;&lt;a href="/gfx/#f1" name="fn1" title="&amp;#x524D;&amp;#x591C;&amp;#x796D;&amp;#x3092;&amp;#x5165;&amp;#x308C;&amp;#x308B;&amp;#x3068;6&amp;#x56DE;&amp;#x76EE;&amp;#x3067;&amp;#x306F;&amp;#x306A;&amp;#x3044;&amp;#x304B;&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x58F0;&amp;#x304C;&amp;#x6319;&amp;#x304C;&amp;#x3063;&amp;#x305F;&amp;#x305F;&amp;#x3081;&amp;#x3001;&amp;#x30B9;&amp;#x30E9;&amp;#x30A4;&amp;#x30C9;&amp;#x3067;&amp;#x306F;ID&amp;#x3092;5.1&amp;#x306B;&amp;#x3057;&amp;#x3066;&amp;#x3042;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x3002;5.5&amp;#x3068;&amp;#x3044;&amp;#x3046;&amp;#x8AAC;&amp;#x3082;&amp;#x3042;&amp;#x308A;&amp;#x307E;&amp;#x3059;&amp;#x3002;"&gt;*1&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
		&lt;/div&gt;
		&lt;div class="footnote"&gt;
			&lt;p class="footnote"&gt;&lt;a href="/gfx/#fn1" name="f1"&gt;*1&lt;/a&gt;：前夜祭を入れると6回目ではないかという声が挙がったため、スライドではIDを5.1にしてあります。5.5という説もあります。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-06T15:28:18+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://d.hatena.ne.jp/gfx/20100306/1267856898</guid>
    </item>
    <item>
      <author>nobody@example.com (D)</author>
      <dc:creator>nobody@example.com (D)</dc:creator>
      <category>日常</category>
      <link>http://mt.endeworks.jp/d-6/2010/03/ll2010.html</link>
      <description>100305_2046~02.jpgYokohama Perl Mongersのみんなが関内に向かう途中で電車が止まって右往左往している間、僕は昨年
LLTVに出させてもらった縁からアスキーメディアワークスさんでPerlの権益のために声を張ろうと思ってLLふんふん2010のブレストに行ってきましたよ。
結果的には声を張るような状況ではなく、ドミノピザと景品で当てたというブラッセルズのケグからビールをぐびぐび飲みながら壁にペタペタとネタを貼っていくという2時間でありました。最後の片付けはバスの時間あやばかったのでバックれました。すみません。
というわけで今年は7/31に虎ノ門のニッショーホールで開催だそうです。内容はまだ未定。今回のブレスト内でのネタがどれだけ反映されるのでしょうね。
YAPCは多分10月ですよ（ぼそ）</description>
      <dc:date>2010-03-06T10:52:27+09:00</dc:date>
      <dc:subject>日常</dc:subject>
      <title>LLふんふん2010のブレストに行ってきた</title>
      <pubDate>Sat, 06 Mar 2010 10:52:27 +0900</pubDate>
      <content:encoded>
        &lt;span class="mt-enclosure mt-enclosure-image"&gt;&lt;img alt="100305_2046~02.jpg" src="http://mt.endeworks.jp/d-6/100305_2046~02.jpg"&gt;&lt;/span&gt;
&lt;div&gt;&lt;a href="http://yokohama.pm.org/"&gt;Yokohama Perl Mongers&lt;/a&gt;のみんなが関内に向かう途中で電車が止まって右往左往している間、僕は昨年 &lt;a href="http://ll.jus.or.jp/2009/"&gt;LLTVに出させてもらった&lt;/a&gt;縁から&lt;a href="http://asciimw.jp/"&gt;アスキーメディアワークス&lt;/a&gt;さんでPerlの権益のために声を張ろうと思ってLLふんふん2010のブレストに行ってきましたよ。&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;結果的には声を張るような状況ではなく、ドミノピザと景品で当てたという&lt;a href="http://www.brussels.co.jp/"&gt;ブラッセルズ&lt;/a&gt;のケグからビールをぐびぐび飲みながら壁にペタペタとネタを貼っていくという2時間でありました。最後の片付けはバスの時間あやばかったのでバックれました。すみません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;というわけで今年は7/31に虎ノ門の&lt;a href="http://www.nissho.or.jp/nissho-hall/index.html"&gt;ニッショーホール&lt;/a&gt;で開催だそうです。内容はまだ未定。今回のブレスト内でのネタがどれだけ反映されるのでしょうね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;YAPCは多分10月ですよ（ぼそ）&lt;/div&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-06T10:52:27+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:mt.endeworks.jp,2010:/d-6//3.2461</guid>
    </item>
    <item>
      <author>nobody@example.com (Sewi)</author>
      <dc:creator>nobody@example.com (Sewi)</dc:creator>
      <category>CeBit 2010 DE Perl</category>
      <link>http://padre-ide.de/blog/?p=104</link>
      <description>Eigentlich wollte ich jeden Abend hier ein bisschen über die CeBit 2010
und unsere Erlebnisse auf dem Perl-Stand bloggen. Eigentlich.

Die Realität sieht so aus, dass das gesamte Perl::Staff – Team @ CeBit
Abends einfach nur fertig ist :-)

Wir hatten sehr sehr viele interessante Gespräche und mussten
feststellen, das unser Plan, Firmen für Perl zu begeistern, in den
allermeisten Fällen undurchführbar ist – weil fast jede Firma es bereits
nutzt.

Wir haben von vielen interessanten Applikationen erfahren, wurden aber in
aller Regel gebeten, keine Firmennamen oder Anwendungsdetails zu
veröffentlichen, bevor die entsprechen Marketingabteilungen der Firmen
ihr OK gegeben haben.

Hier vorab eine kleine Liste von Branchen, in denen Perl teilweise sogar
sehr weitreichend engesetzt wird:

  * Banken

  * Telekommunikation (SMS, Datenaufbereitung, Datenbankkopplung)

  * ISPs

  * Consulting

  * Wetterdatenaufbereitung

Morgen ist der letzte CeBit-Tag und das ist einerseits schade, denn es
macht viel Spaß mit den Leuten über Perl zu reden und andererseits gut,
weil die Energie und Konzentration jeden Tag nachlässt – bei allem Spaß
ist es auch ein ziemlicher Stress.

Als CeBit Fazit kann man bereits jetzt sagen, das ich nicht annähernd mit
diesem Erfolg gerechnet hätte. Wir haben fast durchgehend Leute auf dem
Stand, sehr sehr viele kannten Perl bereits und fast allen konnten wir
Perl nahebringen oder zumindest einige neue Informationen und
Arbeitserleichterungen vermitteln. Zudem haben wir viele sehr
interessante Kontakte knüpfen können, die nächste Woche nachbearbeitet
und gepflegt werden müssen.</description>
      <dc:date>2010-03-05T23:55:25+01:00</dc:date>
      <dc:subject>CeBit 2010 DE Perl</dc:subject>
      <title>CeBit und die Illusionen&amp;#8230;</title>
      <pubDate>Fri, 05 Mar 2010 23:55:25 +0100</pubDate>
      <content:encoded>&lt;p&gt;Eigentlich wollte ich jeden Abend hier ein bisschen über die CeBit 2010 und unsere Erlebnisse auf dem Perl-Stand bloggen. Eigentlich.&lt;/p&gt;
&lt;p&gt;Die Realität sieht so aus, dass das gesamte &lt;a href="http://search.cpan.org/perldoc?Perl::Staff"&gt;Perl::Staff&lt;/a&gt; &amp;#8211; Team @ CeBit Abends einfach nur fertig ist &lt;img src="http://padre-ide.de/blog/wp-includes/images/smilies/icon_smile.gif" alt=":-)"&gt; &lt;/p&gt;
&lt;p&gt;Wir hatten sehr sehr viele interessante Gespräche und mussten feststellen, das unser Plan, Firmen für Perl zu begeistern, in den allermeisten Fällen undurchführbar ist &amp;#8211; weil fast jede Firma es bereits nutzt.&lt;/p&gt;
&lt;p&gt;Wir haben von vielen interessanten Applikationen erfahren, wurden aber in aller Regel gebeten, keine Firmennamen oder Anwendungsdetails zu veröffentlichen, bevor die entsprechen Marketingabteilungen der Firmen ihr OK gegeben haben.&lt;/p&gt;
&lt;p&gt;Hier vorab eine kleine Liste von Branchen, in denen Perl teilweise sogar sehr weitreichend engesetzt wird:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Banken&lt;/li&gt;
&lt;li&gt;Telekommunikation (SMS, Datenaufbereitung, Datenbankkopplung)&lt;/li&gt;
&lt;li&gt;ISPs&lt;/li&gt;
&lt;li&gt;Consulting&lt;/li&gt;
&lt;li&gt;Wetterdatenaufbereitung&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Morgen ist der letzte CeBit-Tag und das ist einerseits schade, denn es macht viel Spaß mit den Leuten über Perl zu reden und andererseits gut, weil die Energie und Konzentration jeden Tag nachlässt &amp;#8211; bei allem Spaß ist es auch ein ziemlicher Stress.&lt;/p&gt;
&lt;p&gt;Als CeBit Fazit kann man bereits jetzt sagen, das ich nicht annähernd mit diesem Erfolg gerechnet hätte. Wir haben fast durchgehend Leute auf dem Stand, sehr sehr viele kannten Perl bereits und fast allen konnten wir Perl nahebringen oder zumindest einige neue Informationen und Arbeitserleichterungen vermitteln. Zudem haben wir viele sehr interessante Kontakte knüpfen können, die nächste Woche nachbearbeitet und gepflegt werden müssen.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-05T23:55:25+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://padre-ide.de/blog/?p=104</guid>
    </item>
    <item>
      <author>nobody@example.com (ash)</author>
      <dc:creator>nobody@example.com (ash)</dc:creator>
      <category>Мероприятия Сообщество arnhem netherlands perl workshop</category>
      <link>http://onperl.ru/onperl/2010/03/gollandskij-perl-vorkshop-2010-goda.html</link>
      <description>Только что вернулся в гостиницу с седьмого голландского Perl-воркшопа. Он
проходил в хостеле Stayok в городе Арнеме.

Это город в ста километрах от Амстердама, в часе езды электричкой (и еще
полчаса от вокзала, то есть почти что московские расстояния от спальных
районов до центра :-)

Как всегда, я сразу обращаю внимание на посещаемость, и даже под вечер
она была около 90 % — из 39 зарегистрированных посетителей я насчитал 35.

Часть выступлений была на голланском языке (он напоминает смесь немецкого
и английского с примесью французской картавости), поэтому все остальные,
которые на английском, сразу стали вдвое интереснее :-)

Особенно хорош был Мартин Берендз, сделавший обзор интерпретаторов и
компиляторов Perl 6, существующих в марте 2010 года. Мартин упомянул
неофициальное понятие bus number, которое равно числу ведущих
разработчиков проекта.

Леон Тиммерманс подкинул еще одну лингвошутку — unintentional feature
(имеется в виду баг).

Через какое-то время должны появиться видеозаписи (их делали местные
организаторы).

[IMAGE]

А после обеда сначала пошел мокрый снег, а потом — к вечеру — дождь;
электричку пришлось ждать полчаса; и я теперь весь промокшый, но
довольный :-)</description>
      <dc:date>2010-03-05T21:25:52+01:00</dc:date>
      <dc:subject>Мероприятия Сообщество arnhem netherlands perl workshop</dc:subject>
      <title>Голландский Perl-воркшоп 2010 года</title>
      <pubDate>Fri, 05 Mar 2010 21:25:52 +0100</pubDate>
      <content:encoded>
        &lt;p&gt;Только что вернулся в гостиницу с седьмого &lt;a href="http://www.perlworkshop.nl/nlpw2010/"&gt;голландского Perl-воркшопа&lt;/a&gt;. Он проходил в хостеле &lt;a href="http://www.stayokay.com/index.php?pageID=3207&amp;amp;hostelID=356025&amp;amp;language=en"&gt;Stayok&lt;/a&gt; в городе &lt;a href="http://www.arnhem.nl/english"&gt;Арнеме&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Это город &lt;a href="http://whoyougle.ru/place/distance?from=&amp;#x410;&amp;#x43C;&amp;#x441;&amp;#x442;&amp;#x435;&amp;#x440;&amp;#x434;&amp;#x430;&amp;#x43C;&amp;amp;to=&amp;#x410;&amp;#x440;&amp;#x43D;&amp;#x435;&amp;#x43C;"&gt;в ста километрах от Амстердама&lt;/a&gt;, в часе езды электричкой (и еще полчаса от вокзала, то есть почти что московские расстояния от спальных районов до центра :-)&lt;/p&gt;&lt;p&gt;Как всегда, я сразу обращаю внимание на посещаемость, и даже под вечер она была около 90 % — из 39 зарегистрированных посетителей я насчитал 35.&lt;/p&gt;&lt;p&gt;Часть выступлений была на голланском языке (он напоминает смесь немецкого и английского с примесью французской картавости), поэтому все остальные, которые на английском, сразу стали вдвое интереснее :-)&lt;/p&gt;&lt;p&gt;Особенно хорош был &lt;a href="http://www.perlworkshop.nl/nlpw2010/user/4915"&gt;Мартин Берендз&lt;/a&gt;, сделавший обзор интерпретаторов и компиляторов Perl 6, существующих в марте 2010 года. Мартин упомянул неофициальное понятие &lt;i&gt;bus number&lt;/i&gt;, которое равно числу ведущих разработчиков проекта.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.perlworkshop.nl/nlpw2010/user/5015"&gt;Леон Тиммерманс&lt;/a&gt; подкинул еще одну лингвошутку —&amp;nbsp;&lt;i&gt;unintentional feature&lt;/i&gt; (имеется в виду &lt;i&gt;баг&lt;/i&gt;).&lt;/p&gt;&lt;p&gt;Через какое-то время должны появиться видеозаписи (их делали местные организаторы).&lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://img.onperl.ru/dpw-t-shirt.jpg"&gt;&lt;/p&gt;&lt;p&gt;А после обеда сначала пошел мокрый снег, а потом — к вечеру — дождь; электричку пришлось ждать полчаса; и я теперь весь промокшый, но довольный :-)&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-05T21:25:52+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:onperl.ru,2010:/onperl//1.159</guid>
    </item>
    <item>
      <author>nobody@example.com (ReneeB)</author>
      <dc:creator>nobody@example.com (ReneeB)</dc:creator>
      <link>http://reneeb-perlblog.blogspot.com/2010/03/perlcebit-tag-4.html</link>
      <description>Heute wird es wohl eher ein kurzer Bericht, weil die CeBIT langsam an mir
"nagt". Das rumstehen, rumlaufen und den ganzen Tag mit Besuchern
sprechen ist ziemlich anstrengend. Aber das geht nicht nur mir so, wenn
ich bei uns in die Runde schaue...

Heute war wesentlich weniger los als gestern, aber trotzdem gab es wieder
viele Gespräche. Und die Pläne, zusammen mit PostgreSQL im nächsten Jahr
einen eigenen Stand zu machen, werden weiter verfolgt. Wenn es so klappt,
wie wir uns das im Moment vorstellen, könnte das sehr interessant für
Besucher werden.

Heute habe ich einige Bekannte getroffen, von denen ich es nicht
unbedingt erwartet habe. Zwei ehemalige Schulkameraden und einen
Entwickler von e-tecture. Für e-tecture habe ich vor ein paar Jahren als
externer Perl-Programmierer gearbeitet und bin immer noch regelmäßig in
Frankfurt.

Am Stand hatten wir heute den Schwerpunkt "OTRS". Einigen Besuchern
konnte ich eine kurze Einführung in das System geben und die vielen
Vorzüge der Software schmackhaft machen. Bei manchen steht eine
Evaluierung von Tools an. Vielleicht habe ich es ja geschafft, ein paar
Pluspunkte für OTRS zu nennen, die dann entscheidend sind.

So langsam gehen unsere Giveaways zur Neige. Die mitgebrachten Hefte vom
Perl-Magazin "$foo" sind schon komplett verteilt, genauso die Postkarten
mit Daten der nächsten Perl-Events. Auch die LiveDVDs kommen gut an.

Von den Broschüren haben wir aber noch jede Menge. Davon haben wir wohl
etwas viel gedruckt. Mal schauen, was morgen noch weggeht.

Achso, heute abend wurde deutlich, dass Green-IT schon wieder out ist:
White-IT ist hier der Trend -- denn der Winter ist zurück. Ich bin aus
der Halle rausgekommen und stand mitten im Schnee. Ich hoffe, dass das
bis Sonntag wieder alles weg ist...</description>
      <dc:date>2010-03-05T19:23:00Z</dc:date>
      <title>Perl@CeBIT - Tag 4</title>
      <pubDate>Fri, 05 Mar 2010 19:23:00 -0000</pubDate>
      <content:encoded>Heute wird es wohl eher ein kurzer Bericht, weil die &lt;a href="http://cebit.de"&gt;CeBIT&lt;/a&gt; langsam an mir "nagt". Das rumstehen, rumlaufen und den ganzen Tag mit Besuchern sprechen ist ziemlich anstrengend. Aber das geht nicht nur mir so, wenn ich bei uns in die Runde schaue...&lt;br /&gt;&lt;br /&gt;Heute war wesentlich weniger los als gestern, aber trotzdem gab es wieder viele Gespräche. Und die Pläne, zusammen mit &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; im nächsten Jahr einen eigenen Stand zu machen, werden weiter verfolgt. Wenn es so klappt, wie wir uns das im Moment vorstellen, könnte das sehr interessant für Besucher werden.&lt;br /&gt;&lt;br /&gt;Heute habe ich einige Bekannte getroffen, von denen ich es nicht unbedingt erwartet habe. Zwei ehemalige Schulkameraden und einen Entwickler von &lt;a href="http://www.etecture.de/de"&gt;e-tecture&lt;/a&gt;. Für e-tecture habe ich vor ein paar Jahren als externer Perl-Programmierer gearbeitet und bin immer noch regelmäßig in Frankfurt.&lt;br /&gt;&lt;br /&gt;Am Stand hatten wir heute den Schwerpunkt "&lt;a href="http://otrs.org"&gt;OTRS&lt;/a&gt;". Einigen Besuchern konnte ich eine kurze Einführung in das System geben und die vielen Vorzüge der Software schmackhaft machen. Bei manchen steht eine Evaluierung von Tools an. Vielleicht habe ich es ja geschafft, ein paar Pluspunkte für OTRS zu nennen, die dann entscheidend sind.&lt;br /&gt;&lt;br /&gt;So langsam gehen unsere Giveaways zur Neige. Die mitgebrachten Hefte vom &lt;a href="http://www.perl-magazin.de"&gt;Perl-Magazin "$foo"&lt;/a&gt; sind schon komplett verteilt, genauso die Postkarten mit Daten der nächsten Perl-Events. Auch die &lt;a href="http://sourceforge.net/projects/perl-appliances/files/cebit-2010/perl-cebit-2010-ubuntu-9.10-desktop-i386.iso/download"&gt;LiveDVDs&lt;/a&gt; kommen gut an.&lt;br /&gt;&lt;br /&gt;Von den &lt;a href="http://cebit.perl-magazin.de/Perl.pdf"&gt;Broschüren&lt;/a&gt; haben wir aber noch jede Menge. Davon haben wir wohl etwas viel gedruckt. Mal schauen, was morgen noch weggeht.&lt;br /&gt;&lt;br /&gt;Achso, heute abend wurde deutlich, dass Green-IT schon wieder out ist: White-IT ist hier der Trend -- denn der Winter ist zurück. Ich bin aus der Halle rausgekommen und stand mitten im Schnee. Ich hoffe, dass das bis Sonntag wieder alles weg ist...&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-05T19:23:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-31159397.post-1006604771443324034</guid>
    </item>
    <item>
      <author>nobody@example.com (karen)</author>
      <dc:creator>nobody@example.com (karen)</dc:creator>
      <category>Iron Man Perl</category>
      <link>http://martian.org/karen/2010/03/05/tissue-paper-man/</link>
      <description>A while ago I joined the Perl Iron Man Challenge to motivate me to write
more regularly about Perl. I’m not sure how successful that has been. I
was reading Leonard’s post about how he finds it hard to come up with a
topic every week, but he has managed to do this for eight months. I think
the longest consecutive run for me was eight weeks.

I should have things to write about as I am working on a variety of
community projects. But lots of what I do isn’t overly exciting and I
find it hard to be inspired to write about it. Even when I am really
pleased about something, like Dave Mitchell’s grant being accepted, I
can’t think of anything much to say. Maybe someday I’ll get better at
this.</description>
      <dc:date>0</dc:date>
      <dc:subject>Iron Man Perl</dc:subject>
      <title>Tissue Paper Man</title>
      <pubDate>Fri, 05 Mar 2010 17:14:21 -0000</pubDate>
      <content:encoded>&lt;p&gt;A while ago I joined the &lt;a href="http://ironman.enlightenedperl.org/"&gt;Perl Iron Man Challenge &lt;/a&gt;to motivate me to write more regularly about Perl.  I&amp;#8217;m not sure how successful that has been.  I was reading Leonard&amp;#8217;s &lt;a href="http://blog.lib.umn.edu/leonard/perl/2010/03/perl-is-still-great-i-just-have-little-else-to-talk-about.html#comments"&gt;post &lt;/a&gt;about how he finds it hard to come up with a topic every week, but he has managed to do this for eight months.  I think the longest consecutive run for me was eight weeks.&lt;/p&gt;
&lt;p&gt;I should have things to write about as I am working on a variety of community projects.  But lots of what I do isn&amp;#8217;t overly exciting and I find it hard to be inspired to write about it.  Even when I am really pleased about something, like Dave Mitchell&amp;#8217;s &lt;a href="http://news.perlfoundation.org/2010/02/grant_proposal_fixing_perl5_co.html"&gt;grant&lt;/a&gt; being accepted, I can&amp;#8217;t think of anything much to say.  Maybe someday I&amp;#8217;ll get better at this.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>0</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://martian.org/karen/?p=2079</guid>
    </item>
    <item>
      <author>nobody@example.com (Michael Canzoneri)</author>
      <dc:creator>nobody@example.com (Michael Canzoneri)</dc:creator>
      <category>links</category>
      <description>  * [GO] Chunking, Subtlety, and Whitespace - Modern Perl Books, a Modern
    Perl Blog</description>
      <dc:date>2010-03-05T14:44:00Z</dc:date>
      <dc:subject>links</dc:subject>
      <title>Links and Notes for 2010-02-16</title>
      <pubDate>Fri, 05 Mar 2010 14:44:00 -0000</pubDate>
      <content:encoded>        &lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;            &lt;ul&gt;&lt;li&gt;[&lt;a href="http://www.modernperlbooks.com/mt/2010/02/chunking-subtlety-and-whitespace.html"&gt;GO&lt;/a&gt;] Chunking, Subtlety, and Whitespace - Modern Perl Books, a Modern Perl Blog&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;        &lt;/div&gt;    &lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-05T14:44:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-7692555825490799910.post-7587518028968371537</guid>
    </item>
    <item>
      <author>nobody@example.com (leonard)</author>
      <dc:creator>nobody@example.com (leonard)</dc:creator>
      <category>ironman perl writers block</category>
      <link>http://blog.lib.umn.edu/leonard/perl/2010/03/perl-is-still-great-i-just-have-little-else-to-talk-about.html</link>
      <description> After blogging every week for eight months I find that I have to work to
come up with a topic. last week I nearly missed my deadline, because
nothing new related to Perl happened to me.

How do you guys come up with new topics to write about after 30-40
entries?

I will probably write soon about passing projects along as I have changed
jobs and will no longer be at the University of Minnesota.

Let me know what inspires you to write new entries</description>
      <dc:date>2010-03-05T14:38:53Z</dc:date>
      <dc:subject>ironman perl writers block</dc:subject>
      <title>Perl is still great, I just have little else to talk about</title>
      <pubDate>Fri, 05 Mar 2010 14:38:53 -0000</pubDate>
      <content:encoded>
        After blogging every week for eight months I find that I have to work to come up with a topic. last week I nearly missed my deadline, because nothing new related to Perl happened to me.&lt;br /&gt;&lt;br /&gt;How do you guys come up with new topics to write about after 30-40 entries?&lt;br /&gt;&lt;br /&gt;I will probably write soon about passing projects along as I have changed jobs and will no longer be at the University of Minnesota.&lt;br /&gt;&lt;br /&gt;Let me know what inspires you to write new entries&lt;br /&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-05T14:38:53Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blog.lib.umn.edu,2010:/leonard/perl//10510.222546</guid>
    </item>
    <item>
      <author>nobody@example.com (mateu)</author>
      <dc:creator>nobody@example.com (mateu)</dc:creator>
      <category>Catalyst Perl DBIC HTML::FormHandler</category>
      <link>http://www.catalyzed.org/2010/03/an-introduction-to-formhandler.html</link>
      <description>Abstract
========

There is more than one way to handle forms in your Catalyst/DBIC
application. This paper speaks to the HTML::FormHandler way. Let's start
with a simple example of building a registration form to allow new users
to register with your website application1. We will look at how to build
a registration form object and use it in a Catalyst controller.
Furthermore, the form will integrate with a DBIC connected database to
persist the registration information submitted via the form.



Build a Form Class
==================

We build a registration form class that uses the DBIC model like so:

package Bracket::Form::Register;

use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Model::DBIC';
with 'HTML::FormHandler::Render::Table';

has '+item_class' =&gt; ( default =&gt; 'Player' );

has_field 'first_name' =&gt; ( type =&gt; 'Text' );
has_field 'last_name'  =&gt; ( type =&gt; 'Text' );
has_field 'email'      =&gt; (
        type   =&gt; 'Email',
        required =&gt; 1,
        unique =&gt; 1,
);
has_field 'password'         =&gt; ( type =&gt; 'Password' );
has_field 'password_confirm' =&gt; ( type =&gt; 'PasswordConf' );
has_field 'submit' =&gt; ( type =&gt; 'Submit', value =&gt; 'Register' );

has '+unique_messages' =&gt;
  ( default =&gt; sub { { player_email =&gt;
                                  'Email already registered' } } );


no HTML::FormHandler::Moose;
__PACKAGE__-&gt;meta-&gt;make_immutable;

1


DBIC Model
----------

Notice that we're extending the DBIC model so we can easily create
records in our players (think users) table. The '+item_class' attribute
is where we specifiy the DBIC Result class that we bind the form to. In
our case this is the Player class that corresponds to the player table in
our database. Player is synonymous with the more commonly found user
table where one has a username and password column.


Form Field Types
----------------

FormHandler has a Moose-like attribute declarer has_field. This allows
one to declare fields where the type is a HTML::FormHandler::Field such
as 'Text', 'Email', 'Password' etc. These type declarations enable cheap
and effective validation. For example, a field with type Email will be
checked using Email::Valid. In addition we set the email field as
required and unique.


Render as a Table
-----------------

I've asked for the rendering to be in table form with the
'HTML::FormHandler::Render::Table role.



Make the Form Available in a Controller
=======================================

In order to have an instance of the registration form object available in
a Catalyst controller I do:

use Bracket::Form::Register;

has 'register_form' =&gt; (
        isa     =&gt; 'Bracket::Form::Register',
        is      =&gt; 'rw',
        lazy    =&gt; 1,
        default =&gt; sub { Bracket::Form::Register-&gt;new },
);

Later in a controller action I will be able to access the form via
$self-&gt;register_form.



Use the Form in a Controller Action
===================================

sub register : Global {
        my ( $self, $c ) = @_;

        # Stash the form and the template to render it
        $c-&gt;stash(
                template =&gt; 'form/auth/register.tt',
                form     =&gt; $self-&gt;register_form,
        );

        # Create an empty row object for the desired table
        my $new_player = $c-&gt;model('DBIC::Player')-&gt;new_result( {} );

        # Process the for with the parameters, a schema and a row object
        $self-&gt;register_form-&gt;process(
                item      =&gt; $new_player,
                params =&gt; $c-&gt;request-&gt;parameters,
        );

        # This returns on GET (new form) and a POSTed form that's invalid.
        return if !$self-&gt;register_form-&gt;is_valid;

        # At this stage the form has validated
        $c-&gt;flash-&gt;{status_msg} = 'Registration initiated';
        $c-&gt;response-&gt;redirect( $c-&gt;uri_for('/login') );
}

Here we have one action that handles both the GET and POST request
methods of the form. On GET, HTML::FormHandler will see that there are no
parameters to process and just return the form. On POST, it will check
that the parameters are valid and then process them accordingly. In our
case this means, create a new user record from the form fields where each
form field that corresponds to a column in our player table will be used
to populate the column.


Stash the Form and Template
---------------------------

We start the action body off by stashing the form and template that will
be used to render it. All we need in the template2 is:

[% form.render %]


New Row Object
--------------

Since we want to create a new record in our Player class, we create a new
row object of that nature with DBIC's new_result() method3.


Arguments to Process
--------------------

Next we process the form with the following key/value combinations:

  * item := which gets our row object, $new_player, where we'll store the
    form data

  * params := the parameters in our context

Note that since we're passing in a DBIC row object as our item the schema
is inferred. If one is passing in a primary key this can be done by
passing in the primary key as 'item_id' and additionally pass the schema.
For example:

$self-&gt;form-&gt;process(
    item_id =&gt; 1,
    params =&gt; $c-&gt;request-&gt;parameters,
    schema =&gt; $c-&gt;model('DBIC')-&gt;schema,
)


Validation
----------

The form is then validated and returned in its orginal form if it's not
valid. Otherwise we have a successful registration and proceed to login5.



Conclusion
==========

FormHandler enables one to efficiently define forms and bind them to a
DBIC model. In addition, it allows types to be declared on fields which
are then used in validation. It also supports other form field properties
such as: unique and required. In short, it does all that is needed for
basic form handling without having to write a single line of HTML.



Footnotes
=========

1 Instead of the proverbial 'MyApp', I'm using the application name
'Bracket'. This is for a NCAA tournament bracket app. I'm cooking up.
Ping me if your interested in it.

2 We're using a Template Toolkit view.

3 The row is not actually inserted yet, just prepared to be.

4 When we pass a row object item to process() we don't need to specify
the schema.

5 An upcoming article will discuss how to build a login form backed with
authentication in Catalyst using FormHandler and DBIC.</description>
      <dc:date>2010-03-05T13:02:01Z</dc:date>
      <dc:subject>Catalyst Perl DBIC HTML::FormHandler</dc:subject>
      <title>An Introduction to FormHandler</title>
      <pubDate>Fri, 05 Mar 2010 13:02:01 -0000</pubDate>
      <content:encoded>
            &lt;h1&gt;Abstract&lt;/h1&gt;

&lt;p&gt;There is more than one way to handle forms in your Catalyst/DBIC application.  This paper speaks to the &lt;span class="caps"&gt;HTML&lt;/span&gt;::FormHandler way.  Let's start with a simple example of building a registration form to allow new users to register with your website application&lt;sup class="footnote"&gt;&lt;a href="http://www.catalyzed.org/2010/03/an-introduction-to-formhandler.html#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;.  We will look at how to build a registration form object and use it in a Catalyst controller.  Furthermore, the form will integrate with a &lt;span class="caps"&gt;DBIC &lt;/span&gt;connected database to persist the registration information submitted via the form.&lt;/p&gt;
            &lt;h1&gt;Build a Form Class&lt;/h1&gt;

&lt;p&gt;We build a registration form class that uses the &lt;span class="caps"&gt;DBIC &lt;/span&gt;model like so:&lt;/p&gt;



&lt;pre&gt;
package Bracket::Form::Register;

use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Model::DBIC';
with 'HTML::FormHandler::Render::Table';

has '+item_class' =&amp;gt; ( default =&amp;gt; 'Player' );

has_field 'first_name' =&amp;gt; ( type =&amp;gt; 'Text' );
has_field 'last_name'  =&amp;gt; ( type =&amp;gt; 'Text' );
has_field 'email'      =&amp;gt; (
	type   =&amp;gt; 'Email',
        required =&amp;gt; 1,
	unique =&amp;gt; 1,
);
has_field 'password'         =&amp;gt; ( type =&amp;gt; 'Password' );
has_field 'password_confirm' =&amp;gt; ( type =&amp;gt; 'PasswordConf' );
has_field 'submit' =&amp;gt; ( type =&amp;gt; 'Submit', value =&amp;gt; 'Register' );

has '+unique_messages' =&amp;gt;
  ( default =&amp;gt; sub { { player_email =&amp;gt;
                                  'Email already registered' } } );


no HTML::FormHandler::Moose;
__PACKAGE__-&amp;gt;meta-&amp;gt;make_immutable;

1
&lt;/pre&gt;



&lt;h2&gt;&lt;span class="caps"&gt;DBIC&lt;/span&gt; Model&lt;/h2&gt;

&lt;p&gt;Notice that we're extending the &lt;span class="caps"&gt;DBIC &lt;/span&gt;model so we can easily create records in our players (think users) table.  The '+item_class' attribute is where we specifiy the &lt;span class="caps"&gt;DBIC&lt;/span&gt; Result class that we bind the form to.  In our case this is the Player class that corresponds to the player table in our database.  Player is synonymous with the more commonly found  user table where one has a username and password column.&lt;/p&gt;

&lt;h2&gt;Form Field Types&lt;/h2&gt;

&lt;p&gt;FormHandler has a Moose-like attribute declarer &lt;b&gt;has_field&lt;/b&gt;.  This allows one to declare fields where the type is a &lt;span class="caps"&gt;HTML&lt;/span&gt;::FormHandler::Field such as '&lt;b&gt;Text&lt;/b&gt;', '&lt;b&gt;Email&lt;/b&gt;', '&lt;b&gt;Password&lt;/b&gt;' etc.   These type declarations enable cheap and effective validation.  For example, a field with type Email will be checked using &lt;b&gt;Email::Valid&lt;/b&gt;.  In addition we set the email field as &lt;b&gt;required&lt;/b&gt; and &lt;b&gt;unique&lt;/b&gt;.&lt;/p&gt;

&lt;h2&gt;Render as a Table&lt;/h2&gt;

&lt;p&gt;I've asked for the rendering to be in table form with the 'HTML::FormHandler::Render::Table role.&lt;/p&gt;

&lt;h1&gt;Make the Form Available in a Controller&lt;/h1&gt;

&lt;p&gt;In order to have an instance of the registration form object available in a Catalyst controller I do:&lt;/p&gt;



&lt;pre&gt;
use Bracket::Form::Register;

has 'register_form' =&amp;gt; (
	isa     =&amp;gt; 'Bracket::Form::Register',
	is      =&amp;gt; 'rw',
	lazy    =&amp;gt; 1,
	default =&amp;gt; sub { Bracket::Form::Register-&amp;gt;new },
);
&lt;/pre&gt;



&lt;p&gt;Later in a controller action I will be able to access the form via $self-&amp;gt;register_form.&lt;/p&gt;

&lt;h1&gt;  Use the Form in a Controller Action&lt;/h1&gt;



&lt;pre&gt;
sub register : Global {
	my ( $self, $c ) = @_;

        # Stash the form and the template to render it
	$c-&amp;gt;stash(
		template =&amp;gt; 'form/auth/register.tt',
		form     =&amp;gt; $self-&amp;gt;register_form,
	);

        # Create an empty row object for the desired table
	my $new_player = $c-&amp;gt;model('DBIC::Player')-&amp;gt;new_result( {} );

        # Process the for with the parameters, a schema and a row object
	$self-&amp;gt;register_form-&amp;gt;process(
		item      =&amp;gt; $new_player,
		params =&amp;gt; $c-&amp;gt;request-&amp;gt;parameters,
	);

	# This returns on GET (new form) and a POSTed form that's invalid.
	return if !$self-&amp;gt;register_form-&amp;gt;is_valid;

	# At this stage the form has validated
	$c-&amp;gt;flash-&amp;gt;{status_msg} = 'Registration initiated';
	$c-&amp;gt;response-&amp;gt;redirect( $c-&amp;gt;uri_for('/login') );
}
&lt;/pre&gt;



&lt;p&gt;Here we have one action that handles both the &lt;span class="caps"&gt;GET &lt;/span&gt;and &lt;span class="caps"&gt;POST &lt;/span&gt;request methods of the  form.  On &lt;span class="caps"&gt;GET, HTML&lt;/span&gt;::FormHandler will see that there are no parameters to process and just return the form.  On &lt;span class="caps"&gt;POST, &lt;/span&gt;it will check that the parameters are valid and then process them accordingly.  In our case this means, create a new user record from the form fields where each form field that corresponds to a column in our player table will be used to populate the column.&lt;/p&gt;

&lt;h2&gt;Stash the Form and Template&lt;/h2&gt;

&lt;p&gt;We start the action body off by stashing the form and template that will be used to render it.  All we need in the template&lt;sup class="footnote"&gt;&lt;a href="http://www.catalyzed.org/2010/03/an-introduction-to-formhandler.html#fn2"&gt;2&lt;/a&gt;&lt;/sup&gt; is:&lt;/p&gt;



&lt;pre&gt;
[% form.render %]
&lt;/pre&gt;



&lt;h2&gt;New Row Object &lt;/h2&gt;

&lt;p&gt;Since we want to create a new record in our Player class, we create a new row object of that nature with &lt;span class="caps"&gt;DBIC'&lt;/span&gt;s &lt;b&gt;new_result()&lt;/b&gt; method&lt;sup class="footnote"&gt;&lt;a href="http://www.catalyzed.org/2010/03/an-introduction-to-formhandler.html#fn3"&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;h2&gt;Arguments to Process&lt;/h2&gt;

&lt;p&gt;Next we process the form with the following key/value combinations:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;item := which gets our row object, $new_player, where we'll store the form data&lt;/li&gt;
&lt;li&gt;params := the parameters in our context&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Note that since we're passing in a &lt;span class="caps"&gt;DBIC &lt;/span&gt;row object as our item the schema is inferred.  If one is passing in a primary key this can be done  by passing in the primary key as 'item_id' and additionally pass the schema.  For example:&lt;/p&gt;



&lt;pre&gt;
$self-&amp;gt;form-&amp;gt;process(
    item_id =&amp;gt; 1,
    params =&amp;gt; $c-&amp;gt;request-&amp;gt;parameters,
    schema =&amp;gt; $c-&amp;gt;model('DBIC')-&amp;gt;schema,
)
&lt;/pre&gt;



&lt;h2&gt;Validation&lt;/h2&gt;

&lt;p&gt;The form is then validated and returned in its orginal form if it's not valid.  Otherwise we have a successful registration and proceed to login&lt;sup class="footnote"&gt;&lt;a href="http://www.catalyzed.org/2010/03/an-introduction-to-formhandler.html#fn5"&gt;5&lt;/a&gt;&lt;/sup&gt;.  &lt;/p&gt;

&lt;h1&gt; Conclusion&lt;/h1&gt;

&lt;p&gt;FormHandler enables one to efficiently define forms and bind them to a &lt;span class="caps"&gt;DBIC &lt;/span&gt;model.  In addition, it allows types to be declared on fields which are then used in validation.  It also supports other form field properties such as: &lt;b&gt;unique&lt;/b&gt; and &lt;b&gt;required&lt;/b&gt;.   In short, it does all that is needed for basic form handling without having to write a single line of &lt;span class="caps"&gt;HTML.&lt;/span&gt;&lt;/p&gt;


&lt;h1&gt;Footnotes&lt;/h1&gt;

&lt;p class="footnote" id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt;  Instead of the proverbial 'MyApp', I'm using the application name 'Bracket'.  This is for a &lt;span class="caps"&gt;NCAA &lt;/span&gt;tournament bracket app. I'm cooking up.  Ping me if your interested in it.&lt;/p&gt;

&lt;p class="footnote" id="fn2"&gt;&lt;sup&gt;2&lt;/sup&gt; We're using a Template Toolkit view.&lt;/p&gt;

&lt;p class="footnote" id="fn3"&gt;&lt;sup&gt;3&lt;/sup&gt; The row is not actually inserted yet, just prepared to be.&lt;/p&gt;

&lt;p class="footnote" id="fn4"&gt;&lt;sup&gt;4&lt;/sup&gt; When we pass a row object item to process() we don't need to specify the schema.&lt;/p&gt;

&lt;p class="footnote" id="fn5"&gt;&lt;sup&gt;5&lt;/sup&gt; An upcoming article will discuss how to build a login form backed with authentication in Catalyst using FormHandler and &lt;span class="caps"&gt;DBIC.&lt;/span&gt;&lt;/p&gt;
        </content:encoded>
      <dcterms:modified>2010-03-05T13:02:01Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.catalyzed.org,2010://1.81</guid>
    </item>
    <item>
      <author>nobody@example.com (redspike)</author>
      <dc:creator>nobody@example.com (redspike)</dc:creator>
      <category>journal</category>
      <link>http://use.perl.org/~redspike/journal/40226?from=rss</link>
      <description>Well after what seems like several decades I am finally going to Review
'Intermediate Perl by Randal L. Schwartz, brian d foy and Tom Phoenix.
The book is on the whole very well written and has an amusing style which
belies its importance. Initially I read Randal Schwartz and Tom Phoenix
and brian d foy which gave me the basics, enough in fact to use some cgi
scripts that, although now need a re-write to due my added knowledge, are
still in use today.

I then went onto Programming Perl by Larry Wall, Tom Christiansen, Jon
Orwant which I read as a sort of novel, when I told this to Larry Wall at
a YAPC he said that it was mostly fiction anyway. It introduced me to
alot of the advanced features in Perl but was a bit heavy going. After I
had read it I wondered if there was something inbetween this and Learning
Perl, something intermediate.

I know it seems obvious not but I did not look for a book called
Intermediate Perl. I found this sort of pattern happening a lot in my
jourmey through Perl, the obvious is so obvious I miss it. I have tried
to start looking for the obvious before I hare off and look for the
complicated and down right obscure which always seem more easy to see. As
I had not cultivated the culture of 'The Bleeding Obvious' I bought a few
others which, although good in their way were not really suitable at the
time for where I was at. Eventually I got a copy of 'Intermediate Perl'
and it all made more sense.

I read another review online which suggested a different order in which
to read the chapters. The suggested thing was to read Ch 3 after reading
Ch 10 and then read Ch 15 because it was thought that you need to know
about modules after learning about building larger programs. This I did
and it seemed to make more sense. Apart from my normal gripe about not
explaining how to get help through Perldoc and a few examples which when
typed in verbatum do not work (bottom of page 4 in particular its is not
that it is wrong but to make it run you have to do a little more than is
written) the book helped alot. This kind of thing is not a problem half
way through the book, any book, a little assumed knowledge has been
learned, but it is important to make things absolutey implicit in the
first few examples. Implied knowledge is an easy way to dishearted anyone
and could in extreme cases cause someone to give up. Reading it through
at least twice meant that a few things clicked eventually and gave me a
sense of achievement when I understood the concepts and put some of them
to the test. The story of Gilligan, Skipper, The professor and crew meant
a simple but powerful thread kept the example real. Although imagined,
these examples explained in fairly simple terms some very complicated
ideas that I found fairly easy to apply to real world applications.
Having read 'Programming Perl' first meant that I had gone a long way to
understanding many of the ideas but anyone going about it in the right
order would have less of a virtical wall to look at when they got to the
'Camel'. I use Intermediate Perl as a reference at the moment and to
re-read certain chapters when I have a quiet moment.

I would recommend this book to anyone who has just got through Learning
Perl or who is coming to Perl from another language and wants to start in
a comfortable place before scaling the heights.

Whilst reading the chapter on references I was struck by the one of the
many lighthning strikes out of the snaffed and blurreddy that is 'The
Bleeding Obvious'. It may be called a reference but I thought that that
was just its name. Unlike a the fact that a variable is called a variable
because its value can vary but not its declared name,(I know that that is
not necessarily the case as it is its address in memory that does not
change or perhaps something else that I don't know yet, but humour me) a
reference is called a reference because it is a reference to some thing,
usually a scalar, array, subroutine or hash or something. As a reference
it refers to something. You cannot believe how I wondered how I had
managed to get through at least 3 rather large books before it finally
sank in. I am not sure if it was the fact I did not read the right books
in the right order or the fact that I was not really reading what I was
reading. Either way, I have had the same experience several times. I
think that because it has always been pointed out that Larry Wall is a
linguist and therefore has crafted Perl in a liguistic way that I assumed
the opposite. I have the same experience with other languages and with
other things too but that is part of the joys, or not, of not taking the
obvious as obvious. Tell me one thing and I will often assume the
opposite because that is what I thought you meant, and just when I think
I have got it I will the think the opposite of the opposite which is of
course the obvious but not everytime. Sounds dumb when you write it down
but with everyone trying to be so damn clever I am not sure who is
genuinely clever and who is trying to look clever by inference. In
Larry's case I think he is just being genuine.

I will do a more indepth review of this book as it has helped me a great
dealm but this will do to get started for now.</description>
      <dc:date>2010-03-05T10:34:59Z</dc:date>
      <dc:subject>journal</dc:subject>
      <title>Intermeditae Perl Review</title>
      <pubDate>Fri, 05 Mar 2010 10:34:59 -0000</pubDate>
      <content:encoded>&lt;p&gt;Well after what seems like several decades I am finally going to Review 'Intermediate Perl by Randal L. Schwartz, brian d foy and Tom Phoenix. The book is on the whole very well written and has an amusing style which belies its importance. Initially I read Randal Schwartz and Tom Phoenix and brian d foy which gave me the basics, enough in fact to use some cgi scripts that, although now need a re-write to due my added knowledge, are still in use today. &lt;/p&gt;&lt;p&gt;I then went onto Programming Perl by Larry Wall, Tom Christiansen, Jon Orwant which I read as a sort of novel, when I told this to Larry Wall at a YAPC he said that it was mostly fiction anyway. It introduced me to alot of the advanced features in Perl but was a bit heavy going. After I had read it I wondered if there was something inbetween this and Learning Perl, something intermediate. &lt;/p&gt;&lt;p&gt;I know it seems obvious not but I did not look for a book called Intermediate Perl. I found this sort of pattern happening a lot in my jourmey through Perl, the obvious is so obvious I miss it. I have tried to start looking for the obvious before I hare off and look for the complicated and down right obscure which always seem more easy to see. As I had not cultivated the culture of &lt;b&gt;'The Bleeding Obvious'&lt;/b&gt; I bought a few others which, although good in their way were not really suitable at the time for where I was at. Eventually I got a copy of 'Intermediate Perl' and it all made more sense.&lt;/p&gt;&lt;p&gt;I read another review online which suggested a different order in which to read the chapters. The suggested thing was to read Ch 3 after reading Ch 10 and then read Ch 15 because it was thought that you need to know about modules after learning about building larger programs. This I did and it seemed to make more sense. Apart from my normal gripe about not explaining how to get help through Perldoc and a few examples which when typed in verbatum do not work (bottom of page 4 in particular its is not that it is wrong but to make it run you have to do a little more than is written) the book helped alot. This kind of thing is not a problem half way through the book, any book, a little assumed knowledge has been learned, but it is important to make things absolutey implicit in the first few examples. Implied knowledge is an easy way to dishearted anyone and could in extreme cases cause someone to give up. Reading it through at least twice meant that a few things clicked eventually and gave me a sense of achievement when I understood the concepts and put some of them to the test. The story of Gilligan, Skipper, The professor and crew meant a simple but powerful thread kept the example real. Although imagined, these examples explained in fairly simple terms some very complicated ideas that I found fairly easy to apply to real world applications. Having read 'Programming Perl' first meant that I had gone a long way to understanding many of the ideas but anyone going about it in the right order would have less of a virtical wall to look at when they got to the 'Camel'. I use Intermediate Perl as a reference at the moment and to re-read certain chapters when I have a quiet moment.&lt;/p&gt;&lt;p&gt;I would recommend this book to anyone who has just got through Learning Perl or who is coming to Perl from another language and wants to start in a comfortable place before scaling the heights.&lt;/p&gt;&lt;p&gt;Whilst reading the chapter on references I was struck by the one of the many lighthning strikes out of the snaffed and blurreddy that is &lt;b&gt;'The Bleeding Obvious'&lt;/b&gt;. It may be called a reference but I thought that that was just its name. Unlike a the fact that a variable is called a variable because its value can vary but not its declared name,(I know that that is not necessarily the case as it is its address in memory that does not change or perhaps something else that I don't know yet, but humour me) a reference is called a reference because it is a reference to some thing, usually a scalar, array, subroutine or hash or something. As a reference it refers to something. You cannot believe how I wondered how I had managed to get through at least 3 rather large books before it finally sank in. I am not sure if it was the fact I did not read the right books in the right order or the fact that I was not really reading what I was reading. Either way, I have had the same experience several times. I think that because it has always been pointed out that Larry Wall is a linguist and therefore has crafted Perl in a liguistic way that I assumed the opposite. I have the same experience with other languages and with other things too but that is part of the joys, or not, of not taking the obvious as obvious. Tell me one thing and I will often assume the opposite because that is what I thought you meant, and just when I think I have got it I will the think the opposite of the opposite which is of course the obvious but not everytime. Sounds dumb when you write it down but with everyone trying to be so damn clever I am not sure who is genuinely clever and who is trying to look clever by inference. In Larry's case I think he is just being genuine. &lt;/p&gt;&lt;p&gt;I will do a more indepth review of this book as it has helped me a great dealm but this will do to get started for now.&lt;/p&gt;</content:encoded>
      <dcterms:modified>2010-03-05T10:34:59Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://use.perl.org/~redspike/journal/40226?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (Sam Graham)</author>
      <dc:creator>nobody@example.com (Sam Graham)</dc:creator>
      <category>perl ironman benchmarking analysis trim regexp optimization intermediate tutorial</category>
      <link>http://www.illusori.co.uk/perl/2010/03/05/advanced_benchmark_analysis_1.html</link>
      <description>Seems my previous blog, "Some simple "white-space trim" benchmarks"
caught people's attention, and I've received some interesting suggestions
and observations worthy of a followup article, this also gives me the
chance to delve into explaining more advanced benchmark analysis.

So, deep breath, here goes.

Read more...</description>
      <dc:date>0</dc:date>
      <dc:subject>perl ironman benchmarking analysis trim regexp optimization intermediate tutorial</dc:subject>
      <title>Advanced Benchmark Analysis I: Yet more white-space trimming</title>
      <pubDate>Fri, 05 Mar 2010 09:43:00 -0000</pubDate>
      <content:encoded>&lt;p&gt;Seems my previous blog, &amp;quot;Some simple &amp;quot;white-space trim&amp;quot; benchmarks&amp;quot; caught people&amp;#39;s attention, and I&amp;#39;ve received some interesting suggestions and observations worthy of a followup article, this also gives me the chance to delve into explaining more advanced benchmark analysis.&lt;/p&gt;&lt;p&gt;So, &lt;i&gt;deep breath&lt;/i&gt;, here goes.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.illusori.co.uk/perl/2010/03/05/advanced_benchmark_analysis_1.html"&gt;Read more...&lt;/a&gt;&lt;/p&gt;</content:encoded>
      <dcterms:modified>0</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.illusori.co.uk/perl/2010/03/05/advanced_benchmark_analysis_1.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Alias)</author>
      <dc:creator>nobody@example.com (Alias)</dc:creator>
      <category>journal</category>
      <link>http://use.perl.org/~Alias/journal/40225?from=rss</link>
      <description>With Miyagawa's cpanminus (or as I like to think of it, cpantiny, but hey
it's his module) now officially the New Shiny of the moment, the same old
arguments are resurfacing about less is more, and worse is better.

And the great wheel of opinion circles again.

Rather than bother commenting on cpanminus itself (I suspect many could
guess my opinions) I thought I would add some caveats to the praise, that
hopefully can help you identify and engineer your own equivalent
successes.

1. These "subset" modules are truly successful only when you make the
accuracy trade offs worth it.

Thus, the installation must be effortless, the user interface must be
super-simple, zero-conf is an absolute must, and the module must succeed
in all those niches where the "real" application is too hard, too big, or
too clumsy.

If your accuracy is going to suck, NOTHING else is allowed to suck.

2. As I hint about with "real" these subset modules work best when they
are an alternative solution, not the only solution.

If you are inaccurate and the only solution, you are an annoying
limitation.

If you are inaccurate and an alternate solution, you are handy because
you create a kind of user-pays situation. Simple people with simple use
cases get a simple solution. Hardcore people with hardcore needs get a
hardcore solution.

So if you want to make a small solution, it has to be a subset of
something larger that works better. It can't be the only solution.

3. 99% is a just a marketing number, but the real number does matter.

Why? Take a look at the Heavy 100 index (http://ali.as/top100/") and
you'll notice that many major and popular CPAN modules (like, say,
Catalyst) have more than 100 dependencies.

With a 99% success rate (using stupidly naive "statistics") every single
module on that Top 100 list will fail to install. In a large system with
lots of recursive dependencies, it doesn't take much for your install
count to grow to 20 or 50 or 100 dependencies.

So you need to be sure about WHICH subset you want to support, so you can
be sure what percentage you REALLY need.

For example, despite all the work to support it, there is only one single
module currently using Bzip2. Would it be worth it to remove bzip2
support entirely from the CPAN and help that author to convert? Probably.

The biggest benefits of these alternate solutions are often not only to
do what they do. It's to demonstrate what is possible, pushing the
competitors to do it as well.</description>
      <dc:date>2010-03-05T07:29:44Z</dc:date>
      <dc:subject>journal</dc:subject>
      <title>When a 99% solutions works, and when it doesn't</title>
      <pubDate>Fri, 05 Mar 2010 07:29:44 -0000</pubDate>
      <content:encoded>&lt;p&gt;With Miyagawa's cpanminus (or as I like to think of it, cpantiny, but hey it's his module) now officially the New Shiny of the moment, the same old arguments are resurfacing about less is more, and worse is better.&lt;/p&gt;&lt;p&gt;And the great wheel of opinion circles again.&lt;/p&gt;&lt;p&gt;Rather than bother commenting on cpanminus itself (I suspect many could guess my opinions) I thought I would add some caveats to the praise, that hopefully can help you identify and engineer your own equivalent successes.&lt;/p&gt;&lt;p&gt;1. These "subset" modules are truly successful only when you make the accuracy trade offs worth it.&lt;/p&gt;&lt;p&gt;Thus, the installation must be effortless, the user interface must be super-simple, zero-conf is an absolute must, and the module must succeed in all those niches where the "real" application is too hard, too big, or too clumsy.&lt;/p&gt;&lt;p&gt;If your accuracy is going to suck, NOTHING else is allowed to suck.&lt;/p&gt;&lt;p&gt;2. As I hint about with "real" these subset modules work best when they are an alternative solution, not the only solution.&lt;/p&gt;&lt;p&gt;If you are inaccurate and the only solution, you are an annoying limitation.&lt;/p&gt;&lt;p&gt;If you are inaccurate and an alternate solution, you are handy because you create a kind of user-pays situation. Simple people with simple use cases get a simple solution. Hardcore people with hardcore needs get a hardcore solution.&lt;/p&gt;&lt;p&gt;So if you want to make a small solution, it has to be a subset of something larger that works better. It can't be the only solution.&lt;/p&gt;&lt;p&gt;3. 99% is a just a marketing number, but the real number does matter.&lt;/p&gt;&lt;p&gt;Why? Take a look at the Heavy 100 index (&lt;a href="http://ali.as/top100/"&gt;http://ali.as/top100/"&lt;/a&gt;) and you'll notice that many major and popular CPAN modules (like, say, Catalyst) have more than 100 dependencies.&lt;/p&gt;&lt;p&gt;With a 99% success rate (using stupidly naive "statistics") every single module on that Top 100 list will fail to install. In a large system with lots of recursive dependencies, it doesn't take much for your install count to grow to 20 or 50 or 100 dependencies.&lt;/p&gt;&lt;p&gt;So you need to be sure about WHICH subset you want to support, so you can be sure what percentage you REALLY need.&lt;/p&gt;&lt;p&gt;For example, despite all the work to support it, there is only one single module currently using Bzip2. Would it be worth it to remove bzip2 support entirely from the CPAN and help that author to convert? Probably.&lt;/p&gt;&lt;p&gt;The biggest benefits of these alternate solutions are often not only to do what they do. It's to demonstrate what is possible, pushing the competitors to do it as well.&lt;/p&gt;</content:encoded>
      <dcterms:modified>2010-03-05T07:29:44Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://use.perl.org/~Alias/journal/40225?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (jmarca)</author>
      <dc:creator>nobody@example.com (jmarca)</dc:creator>
      <category>code couchdb research transportation</category>
      <link>http://contourline.wordpress.com/2010/03/04/way-too-much-cool-stuff-going-on/</link>
      <enclosure>HASH(0x3ad01bb0)</enclosure>
      <description>So I finally spent an hour playing with node.js.


I did some hacking with node.js and my CouchDB application for processing
traffic detector information. I have 12 databases, each holding one month
of data. For technical reasons, it is not workable to merge those 12
databases into one, and anyway in the end I’ll have 144 (one for each
Caltrans district if all goes well) for each year of data. So it makes
sense to start sharding things up now in a rational manner. A month of
data gets processed pretty quickly by my view generator.

The problem comes in with querying the view, and merging the results.
Ordinarily, one would want to ask something like “what is the average
volume and occupancy of the traffic at this node every five minutes from
8am to 12am on a weekday over the last 12 months. To answer that
question, I need to merge the output of 12 different views. While each
view response comes up lickety split because couchdb is awesome like
that, I either have to put the merging burden on the client, or else come
up with a merging solution on my own.

Enter node.js. The cool think about node.js is that it uses JavaScript.
I’m used to writing event-based programming in js for web apps. I don’t
ordinarily write threaded or event based programming on the server side
(while I should, I know). I’ve often looked at all of the different event
approaches for perl, and I know it is possible to write threaded Java,
but I’ve never really done anything with either of them. My usual
solution is to write multiple parallel jobs and spawn them all. Which
actually works pretty well as long as you keep an eye on top.

With node.js, however, my brain is doing the right thing. I just get it.
I read the documentation for the node couchdb library I found on github,
and saw that it had one event queue per couchdb client. So I wired up 12
clients, connected each to one of my 12 databases, wrote a loop to fire
off 12 requests, each with a callback that updated a global hash value.

The results were very pretty. The output was properly aggregated, and the
response was just a little bit slower than just running a single query
for a single month:

real    0m0.320s
user    0m0.067s
sys     0m0.007s

vs

real    0m0.179s
user    0m0.047s
sys     0m0.013s

I suspect most of the time was spent sending the larger data set down,
rather than much time computing views or responding to requests.

So this brings me to another problem I’ve been trying to solve. What I
really need are not the average traffic flow stats, but the average and
standard deviation. But computing that in a view that is numerically
stable is more challenging. While a simple summing up operation finished
up in 2 days, computing the standard deviation and average for the 12
months is has been running for 3 days and is only about a third of the
way there, with the views currently hitting about 16G.

Perhaps a better way that might be possible with an external server like
node is to generate the reduce function on request. I’ve already computed
the map function I’m interested in. All I have to do not ask for the
reduce, and then I can play with the views on my own. I miss out on
caching the results, of course, but on the other hand, I can do this
while I wait for the real view to finish, and switch over when it is
done.

And that is the beauty of node.js. It is javascript, so the map and
reduce code that I write in CouchDB can be plopped more or less as is
into node.js. Write a little switch at the top to check if the view is
complete, and if not, get the values from a parallel view (same map, no
reduce), and compute the requested reduction on them.

Furthermore, since the reduce approach already requires that reduce can
also re-reduce, I can run all 12 calls independently of each other in
their own callbacks, and then fire off a 13th callback when they are all
done to merge the 12 results by calling the same reduce function.

Of course, I haven’t done any of this yet, but I have high hopes.</description>
      <dc:date>2010-03-05T06:23:57Z</dc:date>
      <dc:subject>code couchdb research transportation</dc:subject>
      <title>Way too much cool stuff going on</title>
      <pubDate>Fri, 05 Mar 2010 06:23:57 -0000</pubDate>
      <content:encoded>&lt;p&gt;So I finally spent an hour playing with node.js.  &lt;/p&gt;
&lt;p&gt;&lt;span id="more-277"&gt;&lt;/span&gt;&lt;br /&gt;
I did some hacking with node.js and my CouchDB application for processing traffic detector information.  I have 12 databases, each holding one month of data. For technical reasons, it is not workable to merge those 12 databases into one, and anyway in the end I&amp;#8217;ll have 144 (one for each Caltrans district if all goes well) for each year of data.  So it makes sense to start sharding things up now in a rational manner.   A month of data gets processed pretty quickly by my view generator.&lt;/p&gt;
&lt;p&gt;The problem comes in with querying the view, and merging the results. Ordinarily, one would want to ask something like &amp;#8220;what is the average volume and occupancy of the traffic at this node every five minutes from 8am to 12am on a weekday over the last 12 months.  To answer that question, I need to merge the output of 12 different views.  While each view response comes up lickety split because couchdb is awesome like that, I either have to put the merging burden on the client, or else come up with a merging solution on my own.&lt;/p&gt;
&lt;p&gt;Enter node.js.  The cool think about node.js is that it uses JavaScript. I&amp;#8217;m used to writing event-based programming in js for web apps.  I don&amp;#8217;t ordinarily write threaded or event based programming on the server side (while I should, I know).  I&amp;#8217;ve often looked at all of the different event approaches for perl, and I know it is possible to write threaded Java, but I&amp;#8217;ve never really done anything with either of them.  My usual solution is to write multiple parallel jobs and spawn them all.  Which actually works pretty well as long as you keep an eye on top.  &lt;/p&gt;
&lt;p&gt;With node.js, however, my brain is doing the right thing.  I just get it.  I read the documentation for the node couchdb library I found on github, and saw that it had one event queue per couchdb client.  So I wired up 12 clients, connected each to one of my 12 databases, wrote a loop to fire off 12 requests, each with a callback that updated a global hash value.  &lt;/p&gt;
&lt;p&gt;The results were very pretty.  The output was properly aggregated, and the response was just a little bit slower than just running a single query for a single month:&lt;/p&gt;
&lt;pre&gt;
real	0m0.320s
user	0m0.067s
sys	0m0.007s
&lt;/pre&gt;
&lt;p&gt;vs&lt;/p&gt;
&lt;pre&gt;
real	0m0.179s
user	0m0.047s
sys	0m0.013s
&lt;/pre&gt;
&lt;p&gt;I suspect most of the time was spent sending the larger data set down, rather than much time computing views or responding to requests.  &lt;/p&gt;
&lt;p&gt;So this brings me to another problem I&amp;#8217;ve been trying to solve.  What I really need are not the average traffic flow stats, but the average and standard deviation.  But computing that in a view that is numerically stable is more challenging.  While a simple summing up operation finished up in 2 days, computing the standard deviation and average for the 12 months is has been running for 3 days and is only about a third of the way there, with the views currently hitting about 16G.  &lt;/p&gt;
&lt;p&gt;Perhaps a better way that might be possible with an external server like node is to generate the reduce function on request.  I&amp;#8217;ve already computed the map function I&amp;#8217;m interested in.  All I have to do not ask for the reduce, and then I can play with the views on my own.  I miss out on caching the results, of course, but on the other hand, I can do this while I wait for the real view to finish, and switch over when it is done.&lt;/p&gt;
&lt;p&gt;And that is the beauty of node.js.  It is javascript, so the map and reduce code that I write in CouchDB can be plopped more or less as is into node.js.  Write a little switch at the top to check if the view is complete, and if not, get the values from a parallel view (same map, no reduce), and compute the requested reduction on them.&lt;/p&gt;
&lt;p&gt;Furthermore, since the reduce approach already requires that reduce can also re-reduce, I can run all 12 calls independently of each other in their own callbacks, and then fire off a 13th callback when they are all done to merge the 12 results by calling the same reduce function.  &lt;/p&gt;
&lt;p&gt;Of course, I haven&amp;#8217;t done any of this yet, but I have high hopes.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/contourline.wordpress.com/277/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/comments/contourline.wordpress.com/277/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/contourline.wordpress.com/277/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/delicious/contourline.wordpress.com/277/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/contourline.wordpress.com/277/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/stumble/contourline.wordpress.com/277/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/contourline.wordpress.com/277/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/digg/contourline.wordpress.com/277/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/contourline.wordpress.com/277/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/reddit/contourline.wordpress.com/277/"&gt;&lt;/a&gt; &lt;img alt="" src="http://stats.wordpress.com/b.gif?host=contourline.wordpress.com&amp;amp;blog=718724&amp;amp;post=277&amp;amp;subd=contourline&amp;amp;ref=&amp;amp;feed=1"&gt;</content:encoded>
      <dcterms:modified>2010-03-05T06:23:57Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://contourline.wordpress.com/?p=277</guid>
    </item>
    <item>
      <author>nobody@example.com (rjbs)</author>
      <dc:creator>nobody@example.com (rjbs)</dc:creator>
      <link>http://rjbs.manxome.org/rubric/entry/1819</link>
      <description>I proposed a grant for Dist::Zilla improvements to The Perl Foundation,
and a notice of its approval was posted yesterday. I've gotten to work.

A number of the things I proposed to do have been on my mind for quite a
while, but I haven't been able to commit to working on them. I had some
of them already sketched out in branches that were unready to merge. Last
night, I rebased and merged them, resolved a few conflicts, and tried to
cut a development release. Unfortunately, I foolishly cut a production
release.

Fortunately, nothing seems to have been horribly broken. A few missing
prerequisites were exposed here and there, but those have been fixed.
Some other, more serious problem were fixed tonight, and I cut an actual
dev release. You can see most of my "to do" list in the git repository,
if you're not content with the summary in the grant proposal.

So far, I've been checking out upstream test coverage, adding a proper
logging facility, and changing the way prerequisites are registered. The
logging changes are mostly to facilitate better testing so I can start
writing tests for the entirety of Dist::Zilla as it stands now, before I
get to any more refactoring or extension. The upstream coverage is mostly
an issue because if we test lots of Dist::Zilla, but not the code written
to make it go, that's a big coverage gap. I'd like to make sure that all
the code (that I wrote) to make Dist::Zilla work is adequately tested. I
want to be able to rely on this code, after all!

The prereq stuff has just been on my mind and in the margin notes of my
recent CPAN work, especially as it related to fixing some bugs in the
excellent AutoPrereq module. It may introduce a few bugs in the short
term, but those should clear up. It will also make it much easier to
report prerequisites, including build-time or configure-time prereqs. In
another release or two, the AutoPrereq plugin should be able to report
libraries found in ./t as being test requirements, separate from runtime
requirements, for example.

When these tasks are complete, I'll be moving on to testing Dist::Zilla
itself. That means writing some tools to make that easier, and probably a
few changes to how Dist::Zilla works here and there, to improve
diagnostics and configuration.

For now, I'm happy that I'm going to be able to spend some time on this.
It's sorely needed improvement.</description>
      <dc:date>2010-03-04T23:18:09-05:00</dc:date>
      <title>beginning work on dzil grant!</title>
      <pubDate>Thu, 04 Mar 2010 23:18:09 -0500</pubDate>
      <content:encoded>&lt;p&gt;I proposed &lt;a href="http://news.perlfoundation.org/2010/02/2010_grant_proposal_improve_di.html"&gt;a grant for Dist::Zilla
improvements&lt;/a&gt; to The Perl Foundation, and a &lt;a href="http://news.perlfoundation.org/2010/03/2010q1_grant_proposals_results.html"&gt;notice of its approval&lt;/a&gt; was posted yesterday.  I've gotten to work.&lt;/p&gt;

&lt;p&gt;A number of the things I proposed to do have been on my mind for quite a while,
but I haven't been able to commit to working on them.  I had some of them
already sketched out in branches that were unready to merge.  Last night, I
rebased and merged them, resolved a few conflicts, and tried to cut a
development release.  Unfortunately, I foolishly cut a production release.&lt;/p&gt;

&lt;p&gt;Fortunately, nothing seems to have been horribly broken.  A few missing
prerequisites were exposed here and there, but those have been fixed.  Some
other, more serious problem were fixed tonight, and I cut an actual dev
release.  You can see most of my "to do" list &lt;a href="http://git.codesimply.com/?p=Dist-Zilla.git;a=tree;f=todo;h=bfcc53e7b8ddcaf0521a5d0d9d2a2e8d9afa0251;hb=27f4e0ec979dcea4a028902d3d041bb084aab39e"&gt;in the git
repository&lt;/a&gt;,
if you're not content with the summary in the grant proposal.&lt;/p&gt;

&lt;p&gt;So far, I've been checking out upstream test coverage, adding a proper logging
facility, and changing the way prerequisites are registered.  The logging
changes are mostly to facilitate better testing so I can start writing tests
for the entirety of Dist::Zilla as it stands now, before I get to any more
refactoring or extension.  The upstream coverage is mostly an issue because
if we test lots of Dist::Zilla, but not the code written to make it go, that's
a big coverage gap.  I'd like to make sure that all the code (that I wrote) to
make Dist::Zilla work is adequately tested.  I want to be able to rely on this
code, after all!&lt;/p&gt;

&lt;p&gt;The prereq stuff has just been on my mind and in the margin notes of my recent
CPAN work, especially as it related to fixing some bugs in the excellent
AutoPrereq module.  It may introduce a few bugs in the short term, but those
should clear up.  It will also make it much easier to report prerequisites,
including build-time or configure-time prereqs.  In another release or two, the
AutoPrereq plugin should be able to report libraries found in &lt;code&gt;./t&lt;/code&gt; as being
test requirements, separate from runtime requirements, for example.&lt;/p&gt;

&lt;p&gt;When these tasks are complete, I'll be moving on to testing Dist::Zilla itself.
That means writing some tools to make that easier, and probably a few changes
to how Dist::Zilla works here and there, to improve diagnostics and
configuration.&lt;/p&gt;

&lt;p&gt;For now, I'm happy that I'm going to be able to spend some time on this.  It's
sorely needed improvement.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-04T23:18:09-05:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://rjbs.manxome.org/rubric/entry/1819</guid>
    </item>
    <item>
      <author>nobody@example.com (g013m)</author>
      <dc:creator>nobody@example.com (g013m)</dc:creator>
      <category>Perl Planeta Linux Software Libre Linux</category>
      <link>http://blog.g013m.com.ve/?p=147#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
      <description>Revisando algunos archivos guardados de trabajos que hice para las clases
en la universidad, conseguí un programa que hice en Perl para un curso
que se llamaba Computación Emergente. Es una implementación de el juego
de la vida bastante sencilla, lo interesante de esto es que nadie en el
curso conocía algo sobre Perl, y todos hicieron la implementación en
Matlab, por que según era más fácil para manejar las matrices, y hacer
las iteraciones, etc, etc .. así que pensé en hacerlo usando otras
herramientas, y esto fue lo que salió, la idea es crear una matriz de N x
N y ejecutar todas las reglas o algoritmos en un determinado número de
iteraciones. El código quizás se pueda mejorar, pero con esto bastó para
sacar 20 en esta asignación ;) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84

#!/usr/share/bin/perl use Modern::Perl;use Math::MatrixReal; 
say"Indique el valor de N, se creara un grid NxN: ";my $n = &lt;STDIN&gt;;chomp($n);say "Indique la cantidad de iteraciones: ";my $iter = &lt;STDIN&gt;;chomp($iter); my ($x,$y); my $grid = Math::MatrixReal-&gt;new_random($n,$n,{bounded_by=&gt;[-1,2], integer=&gt;1});$grid-&gt;display_precision(0); system('clear');say "INICIO";impgrid($grid);sleep(2); for (my $it = 1; $it &lt;= $iter; $it++) {my $gridtemp = $grid-&gt;clone();$gridtemp-&gt;each( sub{        my (undef,$i,$j) = @_; 
                        #say "$i -- $j";                        my $newval = evalua($i,$j);                        $gridtemp-&gt;assign($i,$j,$newval); 
                } 
                ); system('clear');$gridtemp-&gt;display_precision(0);say "Iteracion = $it";impgrid($gridtemp);sleep(1); 
 $grid = $gridtemp ;$grid-&gt;display_precision(0); } sub impgrid {        my $pgrid = shift;        for (my $i=1; $i&lt;=$n; $i++) {         for (my $ii =1; $ii &lt;= $n; $ii++) {                my $valc = $pgrid-&gt;element($i,$ii);                my $printc = "*";                $printc = " " if $valc == 0;                print "$printc ";         }         print "\n";        }} sub evalua {        $x= shift;        $y = shift;        my $tot = 0;        my ($xant,$xsig,$yant,$ysig) = vecinos($x,$y);        my $newval = 0;        my $celula = $grid-&gt;element($x,$y);        $tot = $tot + $grid-&gt;element($xant,$y);        $tot = $tot + $grid-&gt;element($xant,$ysig);        $tot = $tot + $grid-&gt;element($x,$ysig);        $tot = $tot + $grid-&gt;element($xsig,$ysig);        $tot = $tot + $grid-&gt;element($xsig,$y);        $tot = $tot + $grid-&gt;element($xsig,$yant);        $tot = $tot + $grid-&gt;element($x,$yant);        $tot = $tot + $grid-&gt;element($xant,$yant);        $newval = 1 if ( (($celula == 1) &amp;&amp; (($tot == 2) || ($tot == 3))) || (($celula == 0) &amp;&amp; ($tot == 3)) );        return $newval;} sub vecinos {        my $x = shift;        my $y = shift;        my $xant = ( $x == 1 ) ? $n : ( $x - 1 );        my $xsig = ( $x == $n ) ? 1 : ( $x + 1 );        my $yant = ( $y == 1 ) ? $n : ( $y - 1 );        my $ysig = ( $y == $n ) ? 1 : ($y + 1);        return ($xant,$xsig,$yant,$ysig);}

Estoy usando el modulo Math::MatrixReal que permite interactuar de una
manera rápida y sencilla con matrices.</description>
      <dc:date>2010-03-04T22:27:41-04:30</dc:date>
      <dc:subject>Perl Planeta Linux Software Libre Linux</dc:subject>
      <title>Juego de la vida en Perl</title>
      <pubDate>Thu, 04 Mar 2010 22:27:41 -0430</pubDate>
      <content:encoded>&lt;p&gt;Revisando algunos archivos guardados de trabajos que hice para las clases en la universidad, conseguí un programa que hice en Perl para un curso que se llamaba Computación Emergente. Es una implementación de &lt;a href="http://es.wikipedia.org/wiki/Juego_de_la_vida"&gt;el juego de la vida&lt;/a&gt; bastante sencilla, lo interesante de esto es que nadie en el curso conocía algo sobre Perl, y todos hicieron la implementación en Matlab, por que según era más fácil para manejar las matrices, y hacer las iteraciones, etc, etc .. así que pensé en hacerlo usando otras herramientas, y esto fue lo que salió, la idea es crear una matriz de N x N y ejecutar todas las reglas o algoritmos en un determinado número de iteraciones. El código quizás se pueda mejorar, pero con esto bastó para sacar 20 en esta asignación &lt;img src="http://blog.g013m.com.ve/wp-includes/images/smilies/icon_wink.gif" alt=";)"&gt; :&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="perl"&gt;&lt;span&gt;#!/usr/share/bin/perl&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;use&lt;/span&gt; Modern&lt;span&gt;::&lt;/span&gt;&lt;span&gt;Perl&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;use&lt;/span&gt; Math&lt;span&gt;::&lt;/span&gt;&lt;span&gt;MatrixReal&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
say&lt;span&gt;&amp;quot;Indique el valor de N, se creara un grid NxN: &amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$n&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;lt;STDIN&amp;gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;chomp&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$n&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
say &lt;span&gt;&amp;quot;Indique la cantidad de iteraciones: &amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$iter&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;lt;STDIN&amp;gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;chomp&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$iter&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;my&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$x&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$y&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; Math&lt;span&gt;::&lt;/span&gt;&lt;span&gt;MatrixReal&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;new_random&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$n&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$n&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;#123;&lt;/span&gt;bounded_by&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; integer&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;display_precision&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;system&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'clear'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
say &lt;span&gt;&amp;quot;INICIO&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
impgrid&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$it&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;$it&lt;/span&gt; &lt;span&gt;&amp;lt;=&lt;/span&gt; &lt;span&gt;$iter&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;$it&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$gridtemp&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;$gridtemp&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;each&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;sub&lt;/span&gt;&lt;span&gt;&amp;#123;&lt;/span&gt; 	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;undef&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$j&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;@_&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; 
			&lt;span&gt;#say &amp;quot;$i -- $j&amp;quot;;&lt;/span&gt;
			&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$newval&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; evalua&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$j&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
			&lt;span&gt;$gridtemp&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;assign&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$j&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$newval&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; 
		&lt;span&gt;&amp;#125;&lt;/span&gt; 
		&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;system&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'clear'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;$gridtemp&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;display_precision&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
say &lt;span&gt;&amp;quot;Iteracion = $it&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
impgrid&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$gridtemp&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span&gt;$grid&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$gridtemp&lt;/span&gt; &lt;span&gt;;&lt;/span&gt;
&lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;display_precision&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;sub&lt;/span&gt; impgrid &lt;span&gt;&amp;#123;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$pgrid&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;shift&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$i&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;$i&lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt;$n&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;$i&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
	 &lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$ii&lt;/span&gt; &lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;$ii&lt;/span&gt; &lt;span&gt;&amp;lt;=&lt;/span&gt; &lt;span&gt;$n&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;$ii&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
	 	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$valc&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$pgrid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$ii&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
		&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$printc&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
		&lt;span&gt;$printc&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;$valc&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
		&lt;span&gt;print&lt;/span&gt; &lt;span&gt;&amp;quot;$printc &amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	 &lt;span&gt;&amp;#125;&lt;/span&gt;
	 &lt;span&gt;print&lt;/span&gt; &lt;span&gt;&amp;quot;&lt;span&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;sub&lt;/span&gt; evalua &lt;span&gt;&amp;#123;&lt;/span&gt;
	&lt;span&gt;$x&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;shift&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;$y&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;shift&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$xant&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$xsig&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$yant&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$ysig&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; vecinos&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$x&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$y&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$newval&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$celula&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$x&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$y&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$xant&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$y&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$xant&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$ysig&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$x&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$ysig&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$xsig&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$ysig&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$xsig&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$y&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$xsig&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$yant&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$x&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$yant&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;$grid&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$xant&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$yant&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;$newval&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$celula&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;||&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;||&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$celula&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$tot&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;return&lt;/span&gt; &lt;span&gt;$newval&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;sub&lt;/span&gt; vecinos &lt;span&gt;&amp;#123;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$x&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;shift&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$y&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;shift&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$xant&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;$x&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;?&lt;/span&gt; &lt;span&gt;$n&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;$x&lt;/span&gt; &lt;span&gt;-&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$xsig&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;$x&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;$n&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;?&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;$x&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$yant&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;$y&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;?&lt;/span&gt; &lt;span&gt;$n&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;$y&lt;/span&gt; &lt;span&gt;-&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;my&lt;/span&gt; &lt;span&gt;$ysig&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt; &lt;span&gt;$y&lt;/span&gt; &lt;span&gt;==&lt;/span&gt; &lt;span&gt;$n&lt;/span&gt; &lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;?&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$y&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
	&lt;span&gt;return&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;$xant&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$xsig&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$yant&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;$ysig&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Estoy usando el modulo &lt;a href="http://search.cpan.org/~leto/Math-MatrixReal-2.05/lib/Math/MatrixReal.pm"&gt;Math::MatrixReal &lt;/a&gt;que permite interactuar de una manera rápida y sencilla con matrices.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-04T22:27:41-04:30</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://blog.g013m.com.ve/?p=147</guid>
    </item>
    <item>
      <author>nobody@example.com (Jay)</author>
      <dc:creator>nobody@example.com (Jay)</dc:creator>
      <category>perl</category>
      <link>http://headrattle.blogspot.com/2010/03/ack-is-awesome.html</link>
      <description>Wow! People have been telling me this for years, but I was getting along
OK with my old school Unix craziness:

$ find ./ | grep -v svn | xargs grep '\-\&gt;Promotion'

But today I couldn't get that working. Something with xargs escaping of
-&gt; just refused to fly.

So I installed ack and ran it:

# cpan App::Ack
$ ack '\-\&gt;Promotion'

And it found what I was looking for with zero fuss!

Control/SG.pm
335:      $self-&gt;Promotion($promo_hash);

View/Web/Phoenix/lib/Phoenix/Controller/SG.pm
2844:      $c-&gt;log-&gt;debug("you have these PromotionCode's already: " . (join ", ", keys %{$sg-&gt;Promotion}));
2846:      unless ($sg-&gt;Promotion-&gt;{$preauth}) {

Holy buckets! That is AWESOME! Thanks Andy!</description>
      <dc:date>2010-03-04T23:08:00Z</dc:date>
      <dc:subject>perl</dc:subject>
      <title>ack is awesome!</title>
      <pubDate>Thu, 04 Mar 2010 23:08:00 -0000</pubDate>
      <content:encoded>Wow! People have been telling me this for years, but I was getting along OK with my old school Unix craziness:&lt;pre&gt;$ find ./ | grep -v svn | xargs grep '\-\&amp;gt;Promotion'&lt;/pre&gt;But today I couldn't get that working. Something with xargs escaping of -&amp;gt; just refused to fly.&lt;br /&gt;&lt;br /&gt;So I installed ack and ran it:&lt;pre&gt;# cpan App::Ack&lt;br /&gt;$ ack '\-\&amp;gt;Promotion'&lt;br /&gt;&lt;/pre&gt;And it found what I was looking for with zero fuss!&lt;pre&gt;Control/SG.pm&lt;br /&gt;335:      $self-&amp;gt;Promotion($promo_hash);&lt;br /&gt;&lt;br /&gt;View/Web/Phoenix/lib/Phoenix/Controller/SG.pm&lt;br /&gt;2844:      $c-&amp;gt;log-&amp;gt;debug("you have these PromotionCode's already: " . (join ", ", keys %{$sg-&amp;gt;Promotion}));&lt;br /&gt;2846:      unless ($sg-&amp;gt;Promotion-&amp;gt;{$preauth}) {&lt;br /&gt;&lt;/pre&gt;Holy buckets! That is AWESOME! Thanks Andy!&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-04T23:08:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-958563956206735505.post-307458491534513748</guid>
    </item>
    <item>
      <author>nobody@example.com (D)</author>
      <dc:creator>nobody@example.com (D)</dc:creator>
      <category>日常 perl</category>
      <link>http://mt.endeworks.jp/d-6/2010/03/perl-company-list.html</link>
      <description>
Perlを使うことのできる中小企業（地方企業含む）って結構いると思うんだけど、そういうのをとりまとめたリストを作って公表するとか、もしくは弊社(endeworks)と取引のあるところと今後の仕事の際にそういう会社に仕事を流して関係を築いていくとか、そういうのって需要あるのかなぁ？
発注したい側、受注したい側、両方とも意見が聞けると嬉しい。
追記1: 見切り発車でこんなwikiページも作ってみました。よろしかったら書き込んでください！
追記2: リンク先間違ってました！直しました！</description>
      <dc:date>2010-03-05T07:23:26+09:00</dc:date>
      <dc:subject>日常 perl</dc:subject>
      <title>Perlで受注できる企業リスト</title>
      <pubDate>Fri, 05 Mar 2010 07:23:26 +0900</pubDate>
      <content:encoded>
        Perlを使うことのできる中小企業（地方企業含む）って結構いると思うんだけど、そういうのをとりまとめたリストを作って公表するとか、もしくは弊社(endeworks)と取引のあるところと今後の仕事の際にそういう会社に仕事を流して関係を築いていくとか、そういうのって需要あるのかなぁ？&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;発注したい側、受注したい側、両方とも意見が聞けると嬉しい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;追記1: 見切り発車で&lt;a href="http://wiki.perlassociation.org/jobs"&gt;こんなwikiページも作ってみました&lt;/a&gt;。よろしかったら書き込んでください！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;追記2: リンク先間違ってました！直しました！&lt;/div&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-05T07:23:26+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:mt.endeworks.jp,2010:/d-6//3.2460</guid>
    </item>
    <item>
      <author>nobody@example.com (Chris)</author>
      <dc:creator>nobody@example.com (Chris)</dc:creator>
      <category>Trading perl</category>
      <link>http://www.imaginarybillboards.com/?p=123</link>
      <description>So you’ve graduated a fine university with a degree in math, economics,
CS, or some other actually useful piece of paper showing you know
(theoretically anyway) how to do something of use to society.
Congratulations! At job fairs all over the country at the best schools,
or perhaps the schools that company recruiters went to anyway, trading
companies want to hand you the keys to a decent salary, possible
ridiculous bonus, hot secretaries, and the best office digs money can
buy. Oh, and a couple billion dollar trading limit if that’s what you’re
into.

Should you take it?

Do you like money?

Do you like money more than anything else in the world?

That’s the question you have to ask yourself. You’ll make more than
enough to live on. You’ll probably get a bonus ranging from a couple
months salary to the type of money your parents wouldn’t be comfortable
thinking about. The office will be wonderfully furnished, and the work
will be interesting. They’ll only hire the hottest HR women, the
prettiest secretaries. Free drinks, snacks, bar after hours, a car
service, free insurance, paid breakfast lunch and dinner. It’s a crazy
world.

It’s also all you’ll have.

Traders – you’re in it for money. That’s what you *do* after all. Play
along for a couple of years, save your bonuses, and start a restaurant.
Live a life of boring luxury if you want. IT folks, you’re my people. I
don’t do it for the money – it’s sure as heck nice though. You probably
do it because it’s coolest work you’ll ever find. You can use your
beloved language (ahem, perl) because it’s what you’re the fastest and
most productive in. The best, fastest, newest everything you can find.
But you’re working for the traders. The traders make the company money,
you are an expense. Sure, they give lip service saying that you’re all
equal, but you’re not, are you? When they stay late so they can have more
profits on their books it’s a measurable thing that shows up at the end
of the year in their bonus. When you stay late, it’s so you don’t get
yelled at. Uptime doesn’t measure to actual dollars.


Why you should say yes

  * It pays well!

  * There’s no place in the world like the financial industry. The
    companies nearly literally do nothing but create money. Salaries are
    good, bonuses are better. I don’t know of anyplace in the world you
    can make as much. Period.

  * Benefits

  * Benefits match salaries. 100% paid health, vision, dental, AD&amp;D, life
    insurance policies. Free food. Paid transportation – public, light
    rail, parking passes. Drinks and frequent outings and parties. Snacks
    and gym memberships.

  * It’s interesting work

  * Figuring out low latency systems, writing programs that handle
    billions of dollars, tying systems made of dozens or hundreds of
    smaller programs together. New algorithms, different languages, the
    flexibility to change things. All make for time flying doing cool
    things.

  * Smart people

  * The smartest people money can buy! They’re not hidden in a think tank
    or back room either – they’re right next to you making your brilliant
    ideas sound silly and trivial in comparison. So many great people to
    learn from. Steal their book lists, read their favorite websites,
    pick their brains. Making you smarter makes the company money too,
    after all.

  * Office environment

  * Ever seen a trader’s station? The only limiting factor in the number
    of screens they get is their peripheral vision. Six 30″ lcd’s
    orientated vertically with 19″ monitors on top of that. Tech people
    get the hand-me-downs, of course, but you still get rather good
    hardware usually. Aeron chairs, anything ergonomic the office manager
    can find. Shiny toys bought by vendors for the company. Giant-screen
    TV’s everywhere. Kitchen to hang out in. Everything is beautiful and
    functional.

  * Cool toys

  * Brand new routers, switches, servers. Fiber. Network cards with their
    own operating system. Fiber fabrics that use different frequencies of
    light to get more bandwidth. GPS time servers. At least gigabit
    everything. Terabyte storage arrays. Entire floors of a building
    designed around cooling. Datacenters. It’s really freaking cool.


Why you should say no

  * You’re admitting you’re a whore

  * There’s no nicer way to put this one. You are saying that you value
    money over anything else. Health, morality, family. You’re only in it
    for the money, and the company you work for doesn’t do anything but
    make money.

  * You will burn out

  * Ten hour days will get you fired for not showing up. The pace is
    frantic, at the end of the day your brain melts. Adrenaline from the
    awesome parts of the job doesn’t do it after a while. Sleep is for
    poor people.

  * The work stops being interesting

  * Yes, you can spend another year working to make your system trade
    faster. Just like last year. There isn’t even a target to shoot for.
    Just “faster”.

  * Smart, but narrowly focused people

  * The mighty Wolfram is famous for this. ”I’ll see you this weekend”
    “No, I’m watching the super bowl.” ”What’s a super bowl?” The people
    around you (and you, by extension) focus so much on the ways to make
    the company more money that nothing else exists. You have to be so
    good at what you do to stay ahead that that’s all you can focus on.

  * Work-life balance does not exist

  * See also You will burn out, above. They buy you for the hefty fees
    you are making. Wake up early to get in before market open, work,
    then study your job when you get home. We were actually planning to
    put convertible couches into the conference rooms for sleeping.

  * Chaotic work environment

  * Ever been to a casino? That’s a lot like the floor. You don’t even
    have the token courtesy of cubicle walls to stop the ringing,
    talking, yelling, sheep noises, etc. Add to that constant
    interruptions and a lot of work gets done. Badly.

  * Paranoia

  * These companies are secretive, and for good reason. Everything from
    hardware, to network paths, to what programming language is fodder
    for the enemy. Trading is a zero-sum game, after all.


Is it worth it?

Hell yes. Or maybe not. Try it. If it doesn’t go against your ethics, you
don’t mind taking a few years off from productive life, and can keep
yourself broad enough while making it in the world there, it’s an amazing
experience. And the money doesn’t hurt.

At least if you can handle the negatives. And they’re real. You’re
supporting traders. You can be the head of IT, the lead SysAdmin, the
brilliant network engineer. Whatever. You’re a monkey who works for the
lowest trader. If the company talks about work-life balance, it’s because
they’ve had trouble with people quitting recently and that’s what they
mentioned. If they don’t, it’s because they don’t believe in it. That
said, it’s amazing work. It’s fast work. It’s educating work. It’s
inspiring and depressing. If you can disassociate yourself from what you
do, and be awesome at doing it, it’s really really worth it. Personally?
I have no problems admitting I do what I do for money if the job is
interesting enough that I’d do it anyway. Give more to charity if it
bothers you. If you can’t handle time time, though, you’re not going to
do well. All I can do is try to present it so you can make an educated
choice.</description>
      <dc:date>2010-03-04T21:28:09Z</dc:date>
      <dc:subject>Trading perl</dc:subject>
      <title>High frequency trading – Should I work for a trading company?</title>
      <pubDate>Thu, 04 Mar 2010 21:28:09 -0000</pubDate>
      <content:encoded>&lt;p&gt;So you&amp;#8217;ve graduated a fine  university with a degree in math, economics, CS, or some other actually useful piece of paper showing you know (theoretically anyway) how to do something of use to society.  Congratulations!  At job fairs all over the country at the best schools, or perhaps the schools that company recruiters went to anyway, trading companies want to hand you the keys to a decent salary, possible ridiculous bonus, hot secretaries, and the best office digs money can buy.  Oh, and a couple billion dollar trading limit if that&amp;#8217;s what you&amp;#8217;re into.&lt;/p&gt;
&lt;p&gt;Should you take it?&lt;/p&gt;
&lt;p&gt;Do you like money?&lt;/p&gt;
&lt;p&gt;Do you like money more than anything else in the world?&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s the question you have to ask yourself.  You&amp;#8217;ll make more than enough to live on.  You&amp;#8217;ll probably get a bonus ranging from a couple months salary to the type of money your parents wouldn&amp;#8217;t be comfortable thinking about.  The office will be wonderfully furnished, and the work will be interesting.  They&amp;#8217;ll only hire the hottest HR women, the prettiest secretaries.  Free drinks, snacks, bar after hours, a car service, free insurance, paid breakfast lunch and dinner.  It&amp;#8217;s a crazy world.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s also all you&amp;#8217;ll have.&lt;/p&gt;
&lt;p&gt;Traders &amp;#8211; you&amp;#8217;re in it for money.  That&amp;#8217;s what you *do* after all.  Play along for a couple of years, save your bonuses, and start a restaurant.  Live a life of boring luxury if you want.  IT folks, you&amp;#8217;re my people.  I don&amp;#8217;t do it for the money &amp;#8211; it&amp;#8217;s sure as heck nice though.  You probably do it because it&amp;#8217;s coolest work you&amp;#8217;ll ever find.  You can use your beloved language (ahem, perl) because it&amp;#8217;s what you&amp;#8217;re the fastest and most productive in. The best, fastest, newest everything you can find.  But you&amp;#8217;re working for the traders.  The traders make the company money, you are an expense.  Sure, they give lip service saying that you&amp;#8217;re all equal, but you&amp;#8217;re not, are you?  When they stay late so they can have more profits on their books it&amp;#8217;s a measurable thing that shows up at the end of the year in their bonus.  When you stay late, it&amp;#8217;s so you don&amp;#8217;t get yelled at.  Uptime doesn&amp;#8217;t measure to actual dollars.&lt;/p&gt;
&lt;h3&gt;Why you should say yes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It pays well!&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;blockquote&gt;
&lt;li&gt;There&amp;#8217;s no place in the world like the financial industry.  The companies nearly literally do nothing but create money.  Salaries are good, bonuses are better.  I don&amp;#8217;t know of anyplace in the world you can make as much.  Period.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Benefits&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;Benefits match salaries. 100% paid health, vision, dental, AD&amp;amp;D, life insurance policies.  Free food.  Paid transportation &amp;#8211; public, light rail, parking passes.  Drinks and frequent outings and parties.  Snacks and gym memberships.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;li&gt;It&amp;#8217;s interesting work&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;Figuring out low latency systems, writing programs that handle billions of dollars, tying systems made of dozens or hundreds of smaller programs together.  New algorithms, different languages, the flexibility to change things.  All make for time flying doing cool things.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;li&gt;Smart people&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;The smartest people money can buy!  They&amp;#8217;re not hidden in a think tank or back room either &amp;#8211; they&amp;#8217;re right next to you making your brilliant ideas sound silly and trivial in comparison.  So many great people to learn from.  Steal their book lists, read their favorite websites, pick their brains.  Making you smarter makes the company money too, after all.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;li&gt;Office environment&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;Ever seen a trader&amp;#8217;s station?  The only limiting factor in the number of screens they get is their peripheral vision.  Six 30&amp;#8243; lcd&amp;#8217;s orientated vertically with 19&amp;#8243; monitors on top of that.  Tech people get the hand-me-downs, of course, but you still get rather good hardware usually.  Aeron chairs, anything ergonomic the office manager can find.  Shiny toys bought by vendors for the company.  Giant-screen TV&amp;#8217;s everywhere.  Kitchen to hang out in.  Everything is beautiful and functional.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;li&gt;Cool toys&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;Brand new routers, switches, servers.  Fiber.  Network cards with their own operating system.  Fiber fabrics that use different frequencies of light to get more bandwidth.  GPS time servers.  At least gigabit everything.  Terabyte storage arrays.  Entire floors of a building designed around cooling.  Datacenters.  It&amp;#8217;s really freaking cool.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;/ul&gt;
&lt;h3&gt;Why you should say no&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You&amp;#8217;re admitting you&amp;#8217;re a whore&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;There&amp;#8217;s no nicer way to put this one.  You are saying that  you value money over anything else.  Health, morality, family.  You&amp;#8217;re only in it for the money, and the company you work for doesn&amp;#8217;t do anything but make money.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;li&gt;You will burn out&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;Ten hour days will get you fired for not showing up.  The pace is frantic, at the end of the day your brain melts.  Adrenaline from the awesome parts of the job doesn&amp;#8217;t do it after a while.  Sleep is for poor people.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;li&gt;The work stops being interesting&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;Yes, you can spend another year working to make your system trade faster.  Just like last year.  There isn&amp;#8217;t even a target to shoot for.  Just &amp;#8220;faster&amp;#8221;.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;li&gt;Smart, but narrowly focused people&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;The mighty Wolfram is famous for this.  &amp;#8221;I&amp;#8217;ll see you this weekend&amp;#8221; &amp;#8220;No, I&amp;#8217;m watching the super bowl.&amp;#8221;  &amp;#8221;What&amp;#8217;s a super bowl?&amp;#8221;  The people around you (and you, by extension) focus so much on the ways to make the company more money that nothing else exists.  You have to be so good at what you do to stay ahead that that&amp;#8217;s all you can focus on.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;li&gt;Work-life balance does not exist&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;See also You will burn out, above.  They buy you for the hefty fees you are making.  Wake up early to get in before market open, work, then study your job when you get home.  We were actually planning to put convertible couches into the conference rooms for sleeping.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;li&gt;Chaotic work environment&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;Ever been to a casino?  That&amp;#8217;s a lot like the floor.  You don&amp;#8217;t even have the token courtesy of cubicle walls to stop the ringing, talking, yelling, sheep noises, etc.  Add to that constant interruptions and a lot of work gets done.  Badly.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;li&gt;Paranoia&lt;/li&gt;
&lt;blockquote&gt;
&lt;li&gt;These companies are secretive, and for good reason.  Everything from hardware, to network paths, to what programming language is fodder for the enemy.  Trading is a zero-sum game, after all.&lt;/li&gt;
&lt;/blockquote&gt;
&lt;/ul&gt;
&lt;h3&gt;Is it worth it?&lt;/h3&gt;
&lt;p&gt;Hell yes.  Or maybe not.  Try it.  If it doesn&amp;#8217;t go against your ethics, you don&amp;#8217;t mind taking a few years off from productive life, and can keep yourself broad enough while making it in the world there, it&amp;#8217;s an amazing experience.  And the money doesn&amp;#8217;t hurt.&lt;/p&gt;
&lt;p&gt;At least if you can handle the negatives.  And they&amp;#8217;re real.  You&amp;#8217;re supporting traders.  You can be the head of IT, the lead SysAdmin, the brilliant network engineer.  Whatever.  You&amp;#8217;re a monkey who works for the lowest trader.  If the company talks about work-life balance, it&amp;#8217;s because they&amp;#8217;ve had trouble with people quitting recently and that&amp;#8217;s what they mentioned.  If they don&amp;#8217;t, it&amp;#8217;s because they don&amp;#8217;t believe in it.  That said, it&amp;#8217;s amazing work.  It&amp;#8217;s fast work.  It&amp;#8217;s educating work.  It&amp;#8217;s inspiring and depressing.  If you can disassociate yourself from what you do, and be awesome at doing it, it&amp;#8217;s really really worth it.  Personally?  I have no problems admitting I do what I do for money if the job is interesting enough that I&amp;#8217;d do it anyway.  Give more to charity if it bothers you.  If you can&amp;#8217;t handle time time, though, you&amp;#8217;re not going to do well.  All I can do is try to present it so you can make an educated choice.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-04T21:28:09Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.imaginarybillboards.com/?p=123</guid>
    </item>
    <item>
      <author>nobody@example.com (Chris)</author>
      <dc:creator>nobody@example.com (Chris)</dc:creator>
      <category>Trading perl</category>
      <link>http://www.imaginarybillboards.com/?p=110</link>
      <description>Prop trading shops don’t just get free access to all of the exchanges
they’re on. Seats are expensive, and for what they’re doing, not really
necessary either. They generally get something called Sponsored Access. A
big company will sponsor them on the exchange in return for a fee. But
it’s not just access to the exchange. If you’re a small trading company,
you may have a few dozen million dollars in the real world. So you prove
that to, say, Goldman Sachs and they say “Sure, we’ll sponsor you. And so
you can trade more, here’s some leverage to play with too!”. Of course,
they bill you for how much you trade, so it’s in their interest to let
you leverage yourself. So now your measly 8 figures has turned into 10 or
more figures of leveraged money.

  Look up haircut sometime if you want to know how it all relates to
  how much you can leverage.

So, your sponsor takes on the risk of you trading somewhat in their name.
At the end of the day, they have a list of what you traded, and you have
a list of what you traded. The folks in mid-office then have to deal with
your clearing firm and your sponsor so everyone agrees just what happened
when the traders were out playing all day. The clearing firm is the
go-between the two parties of the trade. Basically, they’re a really
valuable lubricant in the wheels of the market. So GS gets the list from
your clearing firm, you send what you think you traded, and hopefully you
don’t get a call from them asking where the 10,000 shares of Berkshire
are in your list.


Clearing – in practice

It’s fairly simple actually. You get a method by which you send your
report. Let’s say FTP. You upload it with a certain filename format to a
server with a given username and password. Easy. The hard part is
generating the file. You could have one database, you could have a
hundred. There could be one format, or dozens. You could have to download
and parse text files. And don’t forget versioning either. So you download
all the executions you made. Then you have to group them by exchange,
symbol, and side, and add them up and average them out. So your file goes
from, say, 200,000 shares of AAPL traded to three lines:

AAPL,B,100203, 190.91,blah,blah
AAPL,S,101238,191.33,blah,blah
AAPL,SS,2231,191.02,blah,blah

You combine all of them together for that particular exchange, in that
particular format, and upload it to your firm. They compare it with their
(much simpler to generate, because they only have one potential input)
file and if there’s a problem they email and/or call. It’s a surprisingly
simple program in perl. Collect your data from all the different sources,
put it into a huge hash, print it out to a file, upload it. Put in error
checking and notification. Do this for every exchange you trade on, at
the specified time(s) daily.

Only two important things to note:

  If that file is wrong or doesn’t get uploaded – they don’t trade the
  next day until it’s fixed.

  “The next financial crisis will be caused by a divide-by-zero error
  in someone’s perl script” (Citation needed)


Compliance

A huge amount of time and money is spent on compliance at these firms.
And at the same time it’s a total afterthought. The traders rule the
roost, and they don’t care about it – until they can’t trade anymore or
their bonus is lower because of a failed audit. Essentially here’s what
it comes down to. You have to keep track of every trade and every order
you make, and keep it forever. Sure, they say seven years, or five years,
but it’s forever. For one – seven years really is forever in computer
terms. Creating something that’s archivable over that long is essentially
creating it forever. And for two – there’s nothing saying that a year
from now they won’t want the records for 10 years, or 15 years.

So you’re keeping track of every order and every trade. While you’re
doing it, you have to keep your positions at the time if at all possible.
Why? Shorting stocks for example. Traders are allowed to short, but it
goes against the haircut and reduces the amount they can trade. If it’s
on the easy-to-borrow list though, it’s a different story. Anyway, the
regulators come in and you have to prove that you weren’t shorting a
stock. Which means you have to know or be able to derive your position at
that time. Then you have to prove that at the millisecond you placed the
order, it wouldn’t be a short. Which also means accurate time across the
board of your systems. It’s fun, see?

  The easy to borrow list is exactly like it sounds. A list of things
  that are easy to borrow. Some stocks are so available to trade – so
  liquid – that they get on a special list that doesn’t really count as
  short selling! Link

In addition to ordering what and when, you also have to be able to prove
who. So every trader has to have a unique login so you can prove who did
what. If Bob over in the corner is doing something illegal or unethical,
you have to be able to prove it was bob doing it. That way when he’s
caught he’ll just take himself down and not the company. So you have to
record every method by which someone can communicate with evil peoples.
You have to keep (like I said, pretty much forever):

  * Email

  * Chat

  * Phone

  * Tin can and string

  * Any other electronic medium

  Funny story – one time the network went down for some reason. Most
  places use IP phones now, which use the network. Just to be safe, we
  had to call the exchanges to cancel our orders – but no phones! So we
  all whip out our cell phones and call that way. 1- You can’t do that
  since they’re not logged and monitored. and 2- “Does anyone have
  something other than AT&amp;T? I can’t call anyone!”

Email has to go through your email servers and be backed up, instant
messaging has to go through a proxy that logs all conversation, phones
(at least for traders) have to keep recordings, etc etc. One of my better
scripts was actually to do a daily dump of chat logs, bundle them per
user, and send it as an email to a special email address. Killing two
birds with one stone! Regulators will seriously come in and say “we want
every communication trader X made from this date to this date.” And you
say “okay” or you get a fine. They also do spot-checks at least once per
year. ”Give us everything you traded from this date to this date.” And
you say “okay” or you get a fine. Incidentally, if you want to see
roughly what the code for chat log retention looked like:

#!/usr/bin/perl
use strict;use warnings;
use include;
my $ch='chat_host';
my $cu='chat_user';
my $cp='chat_pass';
my @worries=();
my $to='chatlogs@mycompany.com';
my $today=&amp;include::getdate('YYYY-MM-DD');
my @senders = &amp;include::sql($ch,$cu,$cp,"select distinct(senderid) from message_log where date(modified)='$today'")
  or &amp;freakout($!);
foreach my $sender(@senders)
{
  my @lines=&amp;include::sql($ch,$cu,$cp,"select msg_text from message_log where date(modified)='$today' and senderid='$sender'");
  if(!scalar(@lines))
  {
    push(@worries,"No lines for $sender");
    next;
  }
  &amp;include::send_email($to,join("_",split(" ",$sender)).'@backuphost.mycompany.com','Chat logs for $today',join("\n",@lines))
    or push(@worries,$!);
}
if(scalar(@worries))
{
  &amp;include::send_email('me@mycompany.com','chat_backups@backuphost.mycompany.com','Possible problems with chat backups',join("\n",@worries));
}
sub freakout
{
  my $wtf=shift;
  &amp;include::send_email('me@mycompany.com','chat_backups@backuphost.mycompany.com','Error with chat logs for $today',$wtf);
  exit(1);
}

It’s a simplified but only because the hard stuff is hidden in my include
module I keep around to make my life easier – it was(is) literally this
short. We traded every single day and there was chat (and chatbots) every
day, so if there wasn’t anything in the logs there was definitely a
problem. In plain language:

Do some housekeeping (includes, variable setup for hostnames and the like, the date, etc)
Get a list of everyone who sent an IM that day and if there's a problem, send a freakout email with what happened.
For every person in that list, send an email with their name as the "from" address and the chats they sent as the body
  (if there's a problem, add it to the list of worrying things)
If anything is worrying, send an email to that effect to me.

The reason this is so simple is kind of a lucky coincidence. The chat
logs are in one table, the ID is the name of the person, and the text of
the log includes the time and who it’s to. If it didn’t, I’d have to have
another line to get the identity of the person – no big deal. I’d also
have to have a temporary array of lines that I’d append the “to”, “time”,
and “text” to as one entry, then send the email with the contents of that
array instead.</description>
      <dc:date>2010-03-04T21:09:06Z</dc:date>
      <dc:subject>Trading perl</dc:subject>
      <title>High Frequency Trading – Clearing</title>
      <pubDate>Thu, 04 Mar 2010 21:09:06 -0000</pubDate>
      <content:encoded>&lt;p&gt;Prop trading shops don&amp;#8217;t just get free access to all of the exchanges they&amp;#8217;re on.  Seats are expensive, and for what they&amp;#8217;re doing, not really necessary either.  They generally get something called Sponsored Access.  A big company will sponsor them on the exchange in return for a fee.  But it&amp;#8217;s not just access to the exchange.  If you&amp;#8217;re a small trading company, you may have a few dozen million dollars in the real world.  So you prove that to, say, Goldman Sachs and they say &amp;#8220;Sure, we&amp;#8217;ll sponsor you.  And so you can trade more, here&amp;#8217;s some leverage to play with too!&amp;#8221;.  Of course, they bill you for how much you trade, so it&amp;#8217;s in their interest to let you leverage yourself.  So now your measly 8 figures has turned into 10 or more figures of leveraged money.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Look up &lt;a href="http://financial-dictionary.thefreedictionary.com/Haircut"&gt;haircut&lt;/a&gt; sometime if you want to know how it all relates to how much you can leverage.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So, your sponsor takes on the risk of you trading somewhat in their name.  At the end of the day, they have a list of what you traded, and you have a list of what you traded.  The folks in mid-office then have to deal with your clearing firm and your sponsor so everyone agrees just what happened when the traders were out playing all day.  The clearing firm is the go-between the two parties of the trade.  Basically, they&amp;#8217;re a really valuable lubricant in the wheels of the market.  So GS gets the list from your clearing firm, you send what you think you traded, and hopefully you don&amp;#8217;t get a call from them asking where the 10,000 shares of Berkshire are in your list.&lt;/p&gt;
&lt;h3&gt;Clearing &amp;#8211; in practice&lt;/h3&gt;
&lt;p&gt;It&amp;#8217;s fairly simple actually.  You get a method by which you send  your report.  Let&amp;#8217;s say FTP.  You upload it with a certain filename format to a server with a given username and password.  Easy.  The hard part is generating the file.  You could have one database, you could have a hundred.  There could be one format, or dozens.  You could have to download and parse text files.  And don&amp;#8217;t forget versioning either.  So you download all the executions you made.  Then you have to group them by exchange, symbol, and side, and add them up and average them out. So your file goes from, say, 200,000 shares of AAPL traded to three lines:&lt;/p&gt;
&lt;pre&gt;AAPL,B,100203, 190.91,blah,blah
AAPL,S,101238,191.33,blah,blah
AAPL,SS,2231,191.02,blah,blah&lt;/pre&gt;
&lt;p&gt;You combine all of them together for that particular exchange, in that particular format, and upload it to  your firm.  They compare it with their (much simpler to generate, because they only have one potential input) file and if there&amp;#8217;s a problem they email and/or call.  It&amp;#8217;s a surprisingly simple program in perl.  Collect your data from all the different sources, put it into a huge hash, print it out to a file, upload it.  Put in error checking and notification.  Do this for every exchange you trade on, at the specified time(s) daily.&lt;/p&gt;
&lt;p&gt;Only two important things to note:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;If that file is wrong or doesn&amp;#8217;t get uploaded &amp;#8211; they don&amp;#8217;t trade the next day until it&amp;#8217;s fixed.&lt;/p&gt;
&lt;p&gt;&amp;#8220;The next financial crisis will be caused by a divide-by-zero error in someone&amp;#8217;s perl script&amp;#8221; (Citation needed)&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3&gt;Compliance&lt;/h3&gt;
&lt;p&gt;A huge amount of time and money is spent on compliance at these firms.  And at the same time it&amp;#8217;s a total afterthought.  The traders rule the roost, and they don&amp;#8217;t care about it &amp;#8211;  until they can&amp;#8217;t trade anymore or their bonus is lower because of a failed audit.  Essentially here&amp;#8217;s what it comes down to.  You have to keep track of every trade and every order you make, and keep it forever.  Sure, they say seven years, or five years, but it&amp;#8217;s forever.  For one &amp;#8211; seven years really is forever in computer terms.  Creating something that&amp;#8217;s archivable over that long is essentially creating it forever.  And for two &amp;#8211; there&amp;#8217;s nothing saying that a year from now they won&amp;#8217;t want the records for 10 years, or 15 years.&lt;/p&gt;
&lt;p&gt;So you&amp;#8217;re keeping track of every order and every trade.  While you&amp;#8217;re doing it, you have to keep your positions at the time if at all possible.   Why?  Shorting stocks for example.  Traders are allowed to short, but it goes against the haircut and reduces the amount they can trade.  If it&amp;#8217;s on the easy-to-borrow list though, it&amp;#8217;s a different story.  Anyway, the regulators come in and you have to prove that you weren&amp;#8217;t shorting a stock.  Which means you have to know or be able to derive your position at that time.  Then you have to prove that at the millisecond you placed the order, it wouldn&amp;#8217;t be a short.  Which also means accurate time across the board of your systems.  It&amp;#8217;s fun, see?&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The easy to borrow list is exactly like it sounds.  A list of things that are easy to borrow.  Some stocks are so available to trade &amp;#8211; so liquid &amp;#8211; that they get on a special list that doesn&amp;#8217;t really count as short selling! &lt;a href="http://www.investopedia.com/terms/e/easytoborrowlist.asp"&gt;Link&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In addition to ordering what and when, you also have to be able to prove who.  So every trader has to have a unique login so you can prove who did what.   If Bob over in the corner is doing something illegal or unethical, you have to be able to prove it was bob doing it.  That way when he&amp;#8217;s caught he&amp;#8217;ll just take himself down and not the company.  So you have to record every method by which someone can communicate with evil peoples.  You have to keep (like I said, pretty much forever):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Chat&lt;/li&gt;
&lt;li&gt;Phone&lt;/li&gt;
&lt;li&gt;Tin can and string&lt;/li&gt;
&lt;li&gt;Any other electronic medium&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;Funny story &amp;#8211; one time the network went down for some reason.  Most places use IP phones now, which use the network.  Just to be safe, we had to call the exchanges to cancel our orders &amp;#8211; but no phones!  So we all whip out our cell phones and call that way.  1- You can&amp;#8217;t do that since they&amp;#8217;re not logged and monitored. and 2- &amp;#8220;Does anyone have something other than AT&amp;amp;T?  I can&amp;#8217;t call anyone!&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Email has to go through your email servers and be backed up, instant messaging has to go through a proxy that logs all conversation, phones (at least for traders) have to keep recordings, etc etc.  One of my better scripts was actually to do a daily dump of chat logs, bundle them per user, and send it as an email to a special email address.  Killing two birds with one stone!   Regulators will seriously come in and say &amp;#8220;we want every communication trader X made from this date to this date.&amp;#8221;  And you say &amp;#8220;okay&amp;#8221; or you get a fine.  They also do spot-checks at least once per year.  &amp;#8221;Give us everything you traded from this date to this date.&amp;#8221;  And you say &amp;#8220;okay&amp;#8221; or you get a fine.  Incidentally, if you want to see roughly what the code for chat log retention looked like:&lt;/p&gt;
&lt;pre&gt;#!/usr/bin/perl
use strict;use warnings;
use include;
my $ch='chat_host';
my $cu='chat_user';
my $cp='chat_pass';
my @worries=();
my $to='chatlogs@mycompany.com';
my $today=&amp;amp;include::getdate('YYYY-MM-DD');
my @senders = &amp;amp;include::sql($ch,$cu,$cp,"select distinct(senderid) from message_log where date(modified)='$today'")
  or &amp;amp;freakout($!);
foreach my $sender(@senders)
{
  my @lines=&amp;amp;include::sql($ch,$cu,$cp,"select msg_text from message_log where date(modified)='$today' and senderid='$sender'");
  if(!scalar(@lines))
  {
    push(@worries,"No lines for $sender");
    next;
  }
  &amp;amp;include::send_email($to,join("_",split(" ",$sender)).'@backuphost.mycompany.com','Chat logs for $today',join("\n",@lines))
    or push(@worries,$!);
}
if(scalar(@worries))
{
  &amp;amp;include::send_email('me@mycompany.com','chat_backups@backuphost.mycompany.com','Possible problems with chat backups',join("\n",@worries));
}
sub freakout
{
  my $wtf=shift;
  &amp;amp;include::send_email('me@mycompany.com','chat_backups@backuphost.mycompany.com','Error with chat logs for $today',$wtf);
  exit(1);
}&lt;/pre&gt;
&lt;p&gt;It&amp;#8217;s a  simplified but only because the hard stuff is hidden in my include module I keep around to make my life easier &amp;#8211; it was(is) literally this short.  We traded every single day and there was chat (and chatbots) every day, so if there wasn&amp;#8217;t anything in the logs there was definitely a problem.  In plain language:&lt;/p&gt;
&lt;pre&gt;Do some housekeeping (includes, variable setup for hostnames and the like, the date, etc)
Get a list of everyone who sent an IM that day and if there's a problem, send a freakout email with what happened.
For every person in that list, send an email with their name as the "from" address and the chats they sent as the body
  (if there's a problem, add it to the list of worrying things)
If anything is worrying, send an email to that effect to me.&lt;/pre&gt;
&lt;p&gt;The reason this is so simple is kind of a lucky coincidence.  The chat logs are in one table, the ID is the name of the person, and the text of the log includes the time and who it&amp;#8217;s to.  If it didn&amp;#8217;t, I&amp;#8217;d have to have another line to get the identity of the person &amp;#8211; no big deal.  I&amp;#8217;d also have to have a temporary array of lines that I&amp;#8217;d append the &amp;#8220;to&amp;#8221;, &amp;#8220;time&amp;#8221;, and &amp;#8220;text&amp;#8221; to as one entry, then send the email with the contents of that array instead.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-04T21:09:06Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.imaginarybillboards.com/?p=110</guid>
    </item>
    <item>
      <author>nobody@example.com (Kiffin)</author>
      <dc:creator>nobody@example.com (Kiffin)</dc:creator>
      <category>Perl perl</category>
      <link>http://www.kiffingish.com/2010/03/seventh-dutch-perl-workshop.html</link>
      <description>Going to attend the 7th Dutch Perl Workshop tomorrow in Arnhem.

Cannot wait to get up bright and early for a fun and relaxing day
dedicated to the fascinating world of Perl. Last year was a blast and
with lots of interesting talks I look forward to the trip.

During the ninety minute drive east, I'm going to crank up my latest
Porcupine Tree CD and prepare myself for the busy day of mental
gymnastics.</description>
      <dc:date>2010-03-04T22:07:24+01:00</dc:date>
      <dc:subject>Perl perl</dc:subject>
      <title>Seventh Dutch Perl Workshop</title>
      <pubDate>Thu, 04 Mar 2010 22:07:24 +0100</pubDate>
      <content:encoded>
        &lt;p&gt;
Going to attend the &lt;a href="http://www.perlworkshop.nl/nlpw2010/"&gt;7th Dutch Perl Workshop&lt;/a&gt; tomorrow in Arnhem.
&lt;/p&gt;

&lt;p&gt;
Cannot wait to get up bright and early for a fun and relaxing day dedicated to the fascinating world of Perl. Last year was a blast and with lots of interesting talks I look forward to the trip.
&lt;/p&gt;

&lt;p&gt;
During the ninety minute drive east, I'm going to crank up my latest &lt;a href="http://en.wikipedia.org/wiki/The_Incident_%28album%29"&gt;Porcupine Tree CD&lt;/a&gt; and prepare myself for the busy day of mental gymnastics.
&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-04T22:07:24+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.kiffingish.com,2010://1.1815</guid>
    </item>
    <item>
      <author>nobody@example.com (ash)</author>
      <dc:creator>nobody@example.com (ash)</dc:creator>
      <category>CPAN Версии Perl Язык 5.10 5.10.1 cpan perl</category>
      <link>http://onperl.ru/onperl/2010/03/perl-510-v-2010-m-i-i-ii.html</link>
      <description>Часть I
История и статистика
--------------------

Perl 5.10 увидел свет в 20 день рождения языка — 18 декабря 2007 года.
Уже прошло более двух лет, и за это время успели появиться девелоперские
версии 5.11.0, 5.11.1, 5.11.2, 5.11.3 и 5.11.4, и вот-вот появится версия
5.12, предназначенная для использования в реальных приложениях.

Perl 5.10 представил много нововведений, и сегодня интересно посмотреть,
как часто они используются авторами модулей CPAN — модулей, появившихся
после релиза 5.10, либо обновленных с того времени.

На CPAN сейчас хранится около 80 000 модулей в 20 000 дистрибутивах,
список авторов содержит около 8000 имен. Как часто здесь используются
фичи Perl 5.10?

Ответ: новые фичи встречаются в двух сотнях модулей, созданных сотней
авторов.


Часть II
Фичи Perl 5.10
--------------

Кратко о том, что появилось в Perl 5.10.

— Встроенная функция say, которая работает аналогично print, но добавляет
перевод строки.

— Оператор сопоставления (смартматчинга) ~~ сопоставляет свои аргументы
согласно здравому смыслу (и, разумеется, четким правилам, описанным в
документации). Например, в этих примерах аргументы имеют разный тип, но
используется один и тот же оператор.

$a ~~ /\d/

$a ~~ @list

@list ~~ %hash

— Составной оператор выбора под условным названием switch. С помощью
новых ключевых слов given, when и default возможно создать условную
конструкцию, аналогичную switch/case в C и других языках. Важное отличие
в том, что внутри given происходит не простое сравнение, а сопоставление
(или смартматчинг).

given($x) {
    when(/a/) {...}
    when('b') {...}
    default   {...}
}

— Модификатор state позволяет создавать лексические переменные,
сохраняющие значение между вызовами подпрограммы. Использование state
похоже на объявление автоматической переменной со словом static в C.

sub counter {
    state $c = 0;
    return ++$c;
}

— Новшества в регулярных выражениях. Регулярные выражения существенно
переработаны, в частности, добавлены именованные сохраняющие скобки. В
этой статье про регулярные выражение почти не упоминается, поскольку они
достойны отдельного рассказа.

(?&lt;name&gt;)
\K
\R
%+
%-
\g&lt;name&gt;

— Бинарный оператор defined-or (//). Возвращает первый из аргументов,
который содержит определенное (не undef) значение. Может использоваться и
в варианте с присвоением.

Следующие два примера иллюстрируют логику, которая часто прослеживается в
сообщениях о вакансиях.

$city = $arg // 'Moscow';

$vacancy{city} //= 'Moscow';


Продолжение будет.</description>
      <dc:date>2010-03-04T21:59:02+01:00</dc:date>
      <dc:subject>CPAN Версии Perl Язык 5.10 5.10.1 cpan perl</dc:subject>
      <title>Perl 5.10 в 2010-м — части I и II</title>
      <pubDate>Thu, 04 Mar 2010 21:59:02 +0100</pubDate>
      <content:encoded>
        &lt;h2&gt;Часть I&lt;br /&gt;
История и статистика&lt;/h2&gt;

&lt;p&gt;Perl 5.10 увидел свет в 20 день рождения языка — 18 декабря 2007 года. Уже прошло более двух лет, и за это время успели появиться девелоперские версии 5.11.0, 5.11.1, 5.11.2, 5.11.3 и 5.11.4, и вот-вот появится версия 5.12, предназначенная для использования в реальных приложениях.&lt;/p&gt;

&lt;p&gt;Perl 5.10 представил много нововведений, и сегодня интересно посмотреть, как часто они используются авторами модулей CPAN — модулей, появившихся после релиза 5.10, либо обновленных с того времени.&lt;/p&gt;

&lt;p&gt;На CPAN сейчас хранится около 80 000 модулей в 20 000 дистрибутивах, список авторов содержит около 8000 имен. Как часто здесь используются фичи Perl 5.10?&lt;/p&gt;

&lt;p&gt;Ответ: новые фичи встречаются в двух сотнях модулей, созданных сотней авторов.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;h2&gt;Часть II&lt;br /&gt;
Фичи Perl 5.10&lt;/h2&gt;

&lt;p&gt;Кратко о том, что появилось в Perl 5.10.&lt;/p&gt;

&lt;p&gt;— Встроенная функция &lt;b&gt;say&lt;/b&gt;, которая работает аналогично print, но добавляет перевод строки.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;— Оператор сопоставления&lt;/b&gt; (смартматчинга) ~~ сопоставляет свои аргументы согласно здравому смыслу (и, разумеется, четким правилам, описанным в документации). Например, в этих примерах аргументы имеют разный тип, но используется один и тот же оператор.&lt;/p&gt;

&lt;pre&gt;$a ~~ /\d/

$a ~~ @list

@list ~~ %hash&lt;/pre&gt;

&lt;p&gt;— Составной оператор выбора под условным названием &lt;b&gt;switch&lt;/b&gt;. С помощью новых ключевых слов given, when и default возможно создать условную конструкцию, аналогичную switch/case в C и других языках. Важное отличие в том, что внутри given происходит не простое сравнение, а сопоставление (или смартматчинг).&lt;/p&gt;

&lt;pre&gt;given($x) {
    when(/a/) {...}
    when('b') {...}
    default   {...}
}&lt;/pre&gt;

&lt;p&gt;— Модификатор &lt;b&gt;state&lt;/b&gt; позволяет создавать лексические переменные, сохраняющие значение между вызовами подпрограммы. Использование state похоже на объявление автоматической переменной со словом static в C.&lt;/p&gt;

&lt;pre&gt;sub counter {
    state $c = 0;
    return ++$c;
}&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;— Новшества в регулярных выражениях.&lt;/b&gt; Регулярные выражения существенно переработаны, в частности, добавлены именованные сохраняющие скобки. В этой статье про регулярные выражение почти не упоминается, поскольку они достойны отдельного рассказа.&lt;/p&gt;

&lt;pre&gt;(?&amp;lt;name&amp;gt;)
\K
\R
%+
%-
\g&amp;lt;name&amp;gt;&lt;/pre&gt;

&lt;p&gt;— Бинарный оператор &lt;b&gt;defined-or (&lt;tt&gt;//&lt;/tt&gt;)&lt;/b&gt;. Возвращает первый из аргументов, который содержит определенное (не undef) значение. Может использоваться и в варианте с присвоением.&lt;/p&gt;

&lt;p&gt;Следующие два примера иллюстрируют логику, которая часто прослеживается в сообщениях о вакансиях.&lt;/p&gt;

&lt;pre&gt;$city = $arg // 'Moscow';

$vacancy{city} //= 'Moscow';&lt;/pre&gt;

&lt;p&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Продолжение будет.&lt;/i&gt;&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-04T21:59:02+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:onperl.ru,2010:/onperl//1.158</guid>
    </item>
    <item>
      <author>nobody@example.com (ReneeB)</author>
      <dc:creator>nobody@example.com (ReneeB)</dc:creator>
      <link>http://reneeb-perlblog.blogspot.com/2010/03/perlcebit-tag-3.html</link>
      <description>5.00 Uhr: Ich bin hellwach. 5.50 Uhr: Ich bin immer noch hellwach. 6.00
Uhr: Der Wecker klingelt und ich schlafe ein... Um halb sieben wache ich
wieder auf. Jetzt muss ich wohl langsam aufstehen. Verspätet tauche ich
beim Frühstück auf. Ist aber auch egal, da ich die letzten Tage immer
viel zu früh auf der Messe war. Diesmal bin ich nicht so früh, aber immer
noch überpünktlich.

Einigen Polizisten in Hannover sollte man mal erklären, dass DEUTLICHE
Handzeichen eher zum Erfolg führen als mal kurz zwei Finger hinter dem
Rücken um 3 cm zu bewegen und einen dann blöd anschauen warum man nicht
losfährt.

Am Stand angekommen, packe ich ein paar Taschen mit den Sachen, die wir
an interessierte Besucher ausgeben. Heute will ich eine Runde durch die
Hallen drehen und bei Firmen vorbeischauen, bei denen ich weiß, dass sie
Perl einsetzen.

Um kurz nach 9 Uhr taucht dann Oliver auf, einer von zwei Vertretern von
Foswiki. Heute war "Foswiki-Tag" an unserem Stand. Schnell noch etwas
umdekoriert um mehr auf Foswiki aufmerksam zu machen. Dann tauchen auch
die anderen auf. Heute sind wir echt stark besetzt: Getty, Sewi, Gábor,
Bernhard, Robert, Michael (auch ein Foswiki-Vertreter), Oliver und ich.
Die sind aber auch notwendig, da eigentlich immer Besucher an unserem
Stand stehen. Mit so viel Resonanz hätte ich niemals gerechnet. Umso
schöner ist es...

Gábor und ich haben dann die Runde gedreht, um mit ein paar Unternehmen
zu sprechen. Dort bringe ich jeweils eine gepackte Tasche vorbei. Zitat:
"Ist eher ungewöhnlich, wenn man als Standbetreiber etwas von Besuchern
in die Hand gedrückt bekommt und nicht umgekehrt". Insgesamt ist die
Resonanz sehr positiv, dass wir auf die Unternehmen zugegangen sind. Wir
haben einige interessante Dinge erfahren, wie und wofür Perl in den
Unternehmen eingesetzt wird.

Eigentlich wollte ich heute einen halben Tag beim ((otrs))-Stand sein,
aber bei uns war viel zu viel los. Ich hoffe, ich schaffe es am Samstag.
Morgen werde ich es nicht schaffen, weil wir selbst an unserem Stand
einen OTRS-Tag haben.

Sehr viele Leute sind bei uns aufgetaucht von Lehreren/Dozenten an
(Hoch-)schulen bis hin zu Managern. Auch die Organisatoren vom Free and
Open Source Software Learning Centre e.V. haben kurz vorbeigeschaut und
uns gefragt, ob wir grundsätzlich bereit wären, mal bei einem ihrer
Veranstaltungen etwas über Perl zu erzählen. Natürlich sind wir das!

Abends wurden noch die Linux New Media Awards 2010 vergeben, in deren
Anschluss es eine kleine Party gab. Die Awards wurden auf der Bühne neben
unserem Stand vergeben. Dadurch hatten wir nochmal etwas
"Laufkundschaft". Bei der Party gab es auch Bier, ein idealer Zeitpunkt,
um noch mehr Werbung für Perl zu machen: Wir haben einfach überall unsere
Bierdeckel verteilt. Dadurch haben sich noch einige Gespräche ergeben.

Da auch der PostgreSQL-Stand sehr gut läuft, haben wir überlegt, ob wir
im nächsten Jahr nicht zusammen einen größeren Stand machen sollten. Also
ich bin absolut dafür!</description>
      <dc:date>2010-03-04T19:11:00Z</dc:date>
      <title>Perl@CeBIT - Tag 3</title>
      <pubDate>Thu, 04 Mar 2010 19:11:00 -0000</pubDate>
      <content:encoded>5.00 Uhr: Ich bin hellwach. 5.50 Uhr: Ich bin immer noch hellwach. 6.00 Uhr: Der Wecker klingelt und ich schlafe ein... Um halb sieben wache ich wieder auf. Jetzt muss ich wohl langsam aufstehen. Verspätet tauche ich beim Frühstück auf. Ist aber auch egal, da ich die letzten Tage immer viel zu früh auf der Messe war. Diesmal bin ich nicht so früh, aber immer noch überpünktlich.&lt;br /&gt;&lt;br /&gt;Einigen Polizisten in Hannover sollte man mal erklären, dass DEUTLICHE Handzeichen eher zum Erfolg führen als mal kurz zwei Finger hinter dem Rücken um 3 cm zu bewegen und einen dann blöd anschauen warum man nicht losfährt.&lt;br /&gt;&lt;br /&gt;Am Stand angekommen, packe ich ein paar Taschen mit den Sachen, die wir an interessierte Besucher ausgeben. Heute will ich eine Runde durch die Hallen drehen und bei Firmen vorbeischauen, bei denen ich weiß, dass sie &lt;a href="http://perl.de/"&gt;Perl&lt;/a&gt; einsetzen.&lt;br /&gt;&lt;br /&gt;Um kurz nach 9 Uhr taucht dann &lt;a href="http://de.linkedin.com/in/oliverkrueger"&gt;Oliver&lt;/a&gt; auf, einer von zwei Vertretern von &lt;a href="http://foswiki.org/"&gt;Foswiki&lt;/a&gt;. Heute war "Foswiki-Tag" an unserem Stand. Schnell noch etwas umdekoriert um mehr auf Foswiki aufmerksam zu machen. Dann tauchen auch die anderen auf. Heute sind wir echt stark besetzt: Getty, Sewi, Gábor, Bernhard, Robert, &lt;a href="http://michaeldaumconsulting.com/Main/WebHome"&gt;Michael&lt;/a&gt; (auch ein Foswiki-Vertreter), Oliver und ich. Die sind aber auch notwendig, da eigentlich immer Besucher an unserem Stand stehen. Mit so viel Resonanz hätte ich niemals gerechnet. Umso schöner ist es...&lt;br /&gt;&lt;br /&gt;Gábor und ich haben dann die Runde gedreht, um mit ein paar Unternehmen zu sprechen. Dort bringe ich jeweils eine gepackte Tasche vorbei. Zitat: "Ist eher ungewöhnlich, wenn man als Standbetreiber etwas von Besuchern in die Hand gedrückt bekommt und nicht umgekehrt". Insgesamt ist die Resonanz sehr positiv, dass wir auf die Unternehmen zugegangen sind. Wir haben einige interessante Dinge erfahren, wie und wofür Perl in den Unternehmen eingesetzt wird.&lt;br /&gt;&lt;br /&gt;Eigentlich wollte ich heute einen halben Tag beim &lt;a href="http://otrs.com/"&gt;((otrs))&lt;/a&gt;-Stand sein, aber bei uns war viel zu viel los. Ich hoffe, ich schaffe es am Samstag. Morgen werde ich es nicht schaffen, weil wir selbst an unserem Stand einen &lt;a href="http://otrs.org/"&gt;OTRS&lt;/a&gt;-Tag haben.&lt;br /&gt;&lt;br /&gt;Sehr viele Leute sind bei uns aufgetaucht von Lehreren/Dozenten an (Hoch-)schulen bis hin zu Managern. Auch die Organisatoren vom &lt;a href="http://www.fosslc.de/"&gt;Free and Open Source Software Learning Centre e.V. &lt;/a&gt;haben kurz vorbeigeschaut und uns gefragt, ob wir grundsätzlich bereit wären, mal bei einem ihrer Veranstaltungen etwas über Perl zu erzählen. Natürlich sind wir das!&lt;br /&gt;&lt;br /&gt;Abends wurden noch die &lt;a href="http://www.heise.de/open/meldung/CeBIT-Linux-New-Media-Awards-verliehen-946400.html"&gt;Linux New Media Awards 2010 vergeben&lt;/a&gt;, in deren Anschluss es eine kleine Party gab. Die Awards wurden auf der Bühne neben unserem Stand vergeben. Dadurch hatten wir nochmal etwas "Laufkundschaft". Bei der Party gab es auch Bier, ein idealer Zeitpunkt, um noch mehr Werbung für Perl zu machen: Wir haben einfach überall unsere &lt;a href="http://mdk.per.ly/2010/02/24/a-mat-to-put-beer-on-as-opposed-to-the-matt-you-put-beer-in/"&gt;Bierdeckel&lt;/a&gt; verteilt. Dadurch haben sich noch einige Gespräche ergeben.&lt;br /&gt;&lt;br /&gt;Da auch der &lt;a href="http://www.postgresql.de/"&gt;PostgreSQL&lt;/a&gt;-Stand sehr gut läuft, haben wir überlegt, ob wir im nächsten Jahr nicht zusammen einen größeren Stand machen sollten. Also ich bin absolut dafür!&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-04T19:11:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-31159397.post-3990341961575783093</guid>
    </item>
    <item>
      <author>nobody@example.com (draegtun)</author>
      <dc:creator>nobody@example.com (draegtun)</dc:creator>
      <category>Programming perl reddit</category>
      <link>http://transfixedbutnotdead.com/2010/03/04/been-reddited/</link>
      <enclosure>HASH(0x3ad71c90)</enclosure>
      <description>Been very busy with work lately so it nearly slipped completely past me
that I had a large spike in traffic to this blog last week with over
1200+ unique hits on one day.

The culprit: Reddit (Programming). My post Anyone for Perl 6
metaprogramming? had been posted there .

My first blog entry to make reddit *blush*

Glad it created enough stir, comments &amp; even points (29 in total… 59 up &amp;
30 down!). Unfortunately some of the commenters didn’t follow link on my
page to previous post and so didn’t understand the full context (only 17
of the 1200+ reddit surge actually did click the said link).

Apart from quick scans to see if anything interesting is on Perl Reddit,
I don’t go to Reddit anymore. I much prefer Hacker News. In fact its been
so long that I couldn’t remember what my password was so I gave up even
trying to leave a comment on the Reddit post :)

/I3az/

Update: Gosh I also nearly missed that it had been posted to Hacker News
only few days later as well!

Update 2: Things go from weird to bizarre. You can now buy a T-shirt with
my post title :-)</description>
      <dc:date>2010-03-04T18:58:08Z</dc:date>
      <dc:subject>Programming perl reddit</dc:subject>
      <title>Been reddited</title>
      <pubDate>Thu, 04 Mar 2010 18:58:08 -0000</pubDate>
      <content:encoded>&lt;p&gt;Been very busy with work lately so it nearly slipped completely past me that I had a large spike in traffic to this blog last week with over 1200+ unique hits on one day.&lt;/p&gt;
&lt;p&gt;The culprit: &lt;a href="http://www.reddit.com/r/programming/"&gt;Reddit (Programming)&lt;/a&gt;.  My post &lt;a href="http://transfixedbutnotdead.com/2010/01/14/anyone-for-perl-6-metaprogramming/"&gt;Anyone for Perl 6 metaprogramming?&lt;/a&gt; had been &lt;a href="http://www.reddit.com/r/programming/comments/b692l/anyone_for_perl_6_metaprogramming/"&gt;posted there &lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My first blog entry to make reddit  *blush*&lt;/p&gt;
&lt;p&gt;Glad it created enough stir, comments &amp;amp; even points (29 in total&amp;#8230;  59 up &amp;amp; 30 down!).  Unfortunately some of the commenters didn&amp;#8217;t follow link on my page to previous post and so didn&amp;#8217;t understand the full context (only 17 of the 1200+ reddit surge actually did click the said link).&lt;/p&gt;
&lt;p&gt;Apart from quick scans to see if anything interesting is on &lt;a href="http://www.reddit.com/r/perl/"&gt;Perl Reddit&lt;/a&gt;, I don&amp;#8217;t go to Reddit anymore.  I much prefer &lt;a href="http://news.ycombinator.com/"&gt;Hacker News&lt;/a&gt;.   In fact its been so long that I couldn&amp;#8217;t remember what my password was so I gave up even trying to leave a comment on the Reddit post &lt;img src="http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif" alt=":)"&gt; &lt;/p&gt;
&lt;p&gt;/I3az/&lt;/p&gt;
&lt;p&gt;Update:  Gosh I also nearly missed that it &lt;a href="http://news.ycombinator.com/item?id=1151932"&gt;had been posted&lt;/a&gt; to &lt;a href="http://news.ycombinator.com/item?id=1151932"&gt;Hacker News&lt;/a&gt; only few days later as well!&lt;/p&gt;
&lt;p&gt;Update 2: Things go from &lt;a href="http://www.reddit.com/r/programming/shirt/b692l/anyone_for_perl_6_metaprogramming/"&gt;weird to bizarre&lt;/a&gt;.  You can now buy a T-shirt with my post title &lt;img src="http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif" alt=":-)"&gt; &lt;/p&gt;
&lt;br /&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/draegtun.wordpress.com/873/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/comments/draegtun.wordpress.com/873/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/draegtun.wordpress.com/873/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/delicious/draegtun.wordpress.com/873/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/draegtun.wordpress.com/873/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/stumble/draegtun.wordpress.com/873/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/draegtun.wordpress.com/873/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/digg/draegtun.wordpress.com/873/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/draegtun.wordpress.com/873/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/reddit/draegtun.wordpress.com/873/"&gt;&lt;/a&gt; &lt;img alt="" src="http://stats.wordpress.com/b.gif?host=transfixedbutnotdead.com&amp;amp;blog=351142&amp;amp;post=873&amp;amp;subd=draegtun&amp;amp;ref=&amp;amp;feed=1"&gt;</content:encoded>
      <dcterms:modified>2010-03-04T18:58:08Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://transfixedbutnotdead.com/?p=873</guid>
    </item>
    <item>
      <author>nobody@example.com (Andrew Grangaard)</author>
      <dc:creator>nobody@example.com (Andrew Grangaard)</dc:creator>
      <category>perl5 perl iron man social coding perl 6</category>
      <link>http://www.lowlevelmanager.com/2010/03/perlmonks.html</link>
      <description>
You gained 7 experience points. Maybe you should blog about it.
--perlmonks.org


Hey, when was the last time you were at Perlmonks.org?  Go answer some questions, it'll remind you why you love perl so much.  

Here I answer a fun classic unix programming question: How do I change settings in my shell from a program?, with the general answer of "no."  Has anyone actually gone through the windy </description>
      <dc:date>2010-03-04T17:45:00Z</dc:date>
      <dc:subject>perl5 perl iron man social coding perl 6</dc:subject>
      <title>perlmonks</title>
      <pubDate>Thu, 04 Mar 2010 17:45:00 -0000</pubDate>
      <content:encoded>
You gained 7 experience points. Maybe you should blog about it.
--perlmonks.org


Hey, when was the last time you were at Perlmonks.org?  Go answer some questions, it'll remind you why you love perl so much.  

Here I answer a fun classic unix programming question: How do I change settings in my shell from a program?, with the general answer of "no."  Has anyone actually gone through the windy </content:encoded>
      <dcterms:modified>2010-03-04T17:45:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-6019741717555751737.post-4583759581544008106</guid>
    </item>
    <item>
      <author>nobody@example.com (bakkushan)</author>
      <dc:creator>nobody@example.com (bakkushan)</dc:creator>
      <category>Perl coding style error checking Perl 5</category>
      <link>http://howcaniexplainthis.blogspot.com/2010/03/coding-styles-that-make-me-twitch-part.html</link>
      <description>One of the worst programming habits I know of, is assuming that
everything will work out; you just perform the command/function call, and
it has to work. In other words: do not bother checking for error
conditions or propagating them, because they are not going to happen
anyway. right?

Wrong.

But the code works. Mostly. Except when an error condition occurs. And it
will, eventually.

In some instances, such code is a glorified shell script. I have ranted
about that before. But catching error conditions properly can be tricker
than with in-Perl functions and modules. Especially if you have no
control over what the external program does, but the original programmer
did.

Even with in-Perl functions and modules, you might run into, ehrm,
interesting usage.

Usually, the root of the problem is that the original programmer did not
foresee that some his code could grow into something else.

While it may have been a good idea to create an SQL query wrapper to hide
parts of what DBI does for auto-committing statements:

------------------------------------------------------------------------

sub do_sql {
    my $qry = shift;
    my $ignore = shift;
    if (!$dh) {
        &amp;slogin();
        return if (!$dh);
    }
    my $sh = $dh-&gt;prepare($qry);
    if ($sh &amp;&amp; !$sh-&gt;execute) {
        if ($sh-&gt;errstr =~ /(MySQL server has\
 gone away)|(Lost connection to MySQL server)/) {
            &amp;log("Lost MySQL, reconnecting.");
            &amp;slogin();
            return if (!$dh);
            $sh = $dh-&gt;prepare($sqlstmt);
            undef $sh if ($sh &amp;&amp; !$sh-&gt;execute);
        } else {
            undef $sh;
        }
    }
    &amp;log("SQL failed: '$qry'.") if (!$sh &amp;&amp; !$ignore);
    return $sh;
}

------------------------------------------------------------------------

that is no guarantee that the implementation will be future-proof, when
the subroutine is used like this:

------------------------------------------------------------------------

my $sh=&amp;do_sql("SELECT * FROM tab1 WHERE\
 x&lt;&gt;'$cgi-&gt;{data}' AND y&lt;&gt;42");
if (my $res=$sh-&gt;fetchrow_hashref) {
    $cgi-&gt;{ref}=$res-&gt;{ref};
}
&amp;do_sql("UPDATE tab1 SET x='$cgi-&gt;{newdata}',\
 y=23, z='$cgi-&gt;{ref}'");
&amp;do_sql("UPDATE tab2 SET tab1_changed='yes'");
&amp;log("Updated tab1, ready for externals");
# Process the changes made above:
system("/usr/local/bin/changestuff.pl");
&amp;log("Finished processing");

------------------------------------------------------------------------

Imagine now that changestuff.pl also performs changes in the database
tables mentioned above, and that the code above is called in a cron job
every minute or so.

Here is an attempt at listing the worst parts:

  * do_sql only pretends to do proper error checking, it mostly does not
    do anything useful about the error situations.

  * The query result seems of little consequence.

  * There is an obvious need for bound variables in the prepared
    statement, but do_sql does not support that. So the code pretends the
    problem does not exist.

  * When do_sql is used for updates, there is no check whether the
    returned statement handle ($sh) is empty or not, there is no way of
    knowing whether we are clobbering the database.

  * Why do we not care whether the external commands succeeds or not?

  * SQL transactions, anyone?

  * Yeah, other parts of the style sucks, too.

Now imagine the example above multiplied to thousands of lines of
inter-dependant code.

I am happy to say that I do not see things like this too often.

However, cleaning up code like this is a PITA, and it is often easier
just to close your eyes, add your own code, and leave well enough alone.</description>
      <dc:date>2010-03-04T16:00:00Z</dc:date>
      <dc:subject>Perl coding style error checking Perl 5</dc:subject>
      <title>Coding styles that make me twitch, part 8</title>
      <pubDate>Thu, 04 Mar 2010 16:00:00 -0000</pubDate>
      <content:encoded>One of the worst programming habits I know of, is assuming that everything will work out; you just perform the command/function call, and it has to work. In other words: do not bother checking for error conditions or propagating them, because they are not going to happen anyway. right?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Wrong.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;But the code works. Mostly. Except when an error condition occurs. And it will, eventually.&lt;br /&gt;&lt;br /&gt;In some instances, such code is a glorified &lt;em title="&amp;quot;Not that there&amp;#39;s anything wrong with that&amp;quot; - some shell scripts are pretty nice"&gt;shell script&lt;/em&gt;. I have ranted about that before. But catching error conditions properly can be tricker than with in-Perl functions and modules. Especially if you have no control over what the external program does, but the original programmer did.&lt;br /&gt;&lt;br /&gt;Even with in-Perl functions and modules, you might run into, ehrm, &lt;em&gt;interesting usage&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Usually, the root of the problem is that the original programmer did not foresee that some his code could grow into something else.&lt;br /&gt;&lt;br /&gt;While it may have been a good idea to create an SQL query wrapper to hide parts of what DBI does for &lt;em title="yeah, I know"&gt;auto-committing statements&lt;/em&gt;:&lt;hr&gt;&lt;small&gt;&lt;pre&gt;sub do_sql {&lt;br /&gt;    my $qry = shift;&lt;br /&gt;    my $ignore = shift;&lt;br /&gt;    if (!$dh) {&lt;br /&gt;        &amp;amp;slogin();&lt;br /&gt;        return if (!$dh);&lt;br /&gt;    }&lt;br /&gt;    my $sh = $dh-&amp;gt;prepare($qry);&lt;br /&gt;    if ($sh &amp;amp;&amp;amp; !$sh-&amp;gt;execute) {&lt;br /&gt;        if ($sh-&amp;gt;errstr =~ /(MySQL server has\&lt;br /&gt; gone away)|(Lost connection to MySQL server)/) {&lt;br /&gt;            &amp;amp;log("Lost MySQL, reconnecting.");&lt;br /&gt;            &amp;slogin();&lt;br /&gt;            return if (!$dh);&lt;br /&gt;            $sh = $dh-&amp;gt;prepare($sqlstmt);&lt;br /&gt;            undef $sh if ($sh &amp;amp;&amp;amp; !$sh-&amp;gt;execute);&lt;br /&gt;        } else {&lt;br /&gt;            undef $sh;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &amp;amp;log("SQL failed: '$qry'.") if (!$sh &amp;amp;&amp;amp; !$ignore);&lt;br /&gt;    return $sh;&lt;br /&gt;}&lt;/pre&gt;&lt;/small&gt;&lt;hr&gt;that is no guarantee that the implementation will be &lt;em title="or even present-proof"&gt;future-proof&lt;/em&gt;, when the subroutine is used like this:&lt;hr&gt;&lt;small&gt;&lt;pre&gt;my $sh=&amp;amp;do_sql("SELECT * FROM tab1 WHERE\&lt;br /&gt; x&amp;lt;&amp;gt;'$cgi-&amp;gt;{data}' AND y&amp;lt;&amp;gt;42");&lt;br /&gt;if (my $res=$sh-&amp;gt;fetchrow_hashref) {&lt;br /&gt;    $cgi-&amp;gt;{ref}=$res-&amp;gt;{ref};&lt;br /&gt;}&lt;br /&gt;&amp;amp;do_sql("UPDATE tab1 SET x='$cgi-&amp;gt;{newdata}',\&lt;br /&gt; y=23, z='$cgi-&amp;gt;{ref}'");&lt;br /&gt;&amp;amp;do_sql("UPDATE tab2 SET tab1_changed='yes'");&lt;br /&gt;&amp;amp;log("Updated tab1, ready for externals");&lt;br /&gt;# Process the changes made above:&lt;br /&gt;system("/usr/local/bin/changestuff.pl");&lt;br /&gt;&amp;amp;log("Finished processing");&lt;/pre&gt;&lt;/small&gt;&lt;hr&gt;Imagine now that changestuff.pl also performs changes in the database tables mentioned above, and that the code above is called in a cron job every minute or so.&lt;br /&gt;&lt;br /&gt;Here is an attempt at listing the worst parts:&lt;ul&gt;&lt;li&gt;&lt;code&gt;do_sql&lt;/code&gt; only pretends to do proper error checking, it mostly does not do anything useful about the error situations.&lt;/li&gt;&lt;li&gt;The query result seems of little consequence.&lt;/li&gt;&lt;li&gt;There is an obvious need for bound variables in the prepared statement, but &lt;code&gt;do_sql&lt;/code&gt; does not support that. So the code pretends the problem does not exist.&lt;/li&gt;&lt;li&gt;When &lt;code&gt;do_sql&lt;/code&gt; is used for updates, there is no check whether the returned statement handle (&lt;code&gt;$sh&lt;/code&gt;) is empty or not, there is no way of knowing whether we are clobbering the database.&lt;/li&gt;&lt;li&gt;Why do we not care whether the external commands succeeds or not?&lt;/li&gt;&lt;li&gt;SQL transactions, anyone?&lt;/li&gt;&lt;li&gt;Yeah, other parts of the style sucks, too.&lt;/li&gt;&lt;/ul&gt;Now imagine the example above multiplied to thousands of lines of inter-dependant code.&lt;br /&gt;&lt;br /&gt;I am happy to say that I do not see things like this &lt;em&gt;too&lt;/em&gt; often.&lt;br /&gt;&lt;br /&gt;However, cleaning up code like this is a PITA, and it is often easier just to close your eyes, add your own code, and leave well enough alone.&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-04T16:00:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-753668960778118906.post-510923512390174814</guid>
    </item>
    <item>
      <author>nobody@example.com (Andy Brown - SetitesUK)</author>
      <dc:creator>nobody@example.com (Andy Brown - SetitesUK)</dc:creator>
      <category>daemon perl Moose crontab</category>
      <link>http://vampiresoftware.blogspot.com/2010/03/crontab-or-daemon.html</link>
      <description>So here is an interesting choice I need to make.

I have just rewritten a bit of code to email interested parties when a
run with their data on it reaches 2 points. One when it reaches run
complete (i.e. the instrument has done all it's processing) and then
again when the data has been post-processed and qc'd and deposited in the
central archive space for them to obtain.

I'm quite pleased with the code. It is more robust than the previous hack
which we had never intended to be all encompassing, and actually mails
the parties that should be interested (rather than some 'user' which may
or may not be the right person).

It is, of course, also written using Moose.

However, now I have to decide, which do I choose, a cronjob, or a daemon
process.

Cronjob:

Pros - very quick. Just decide how often to launch it, and run the
script.
Cons - need to remember which node the cronjob is running, need to do
something with the outputs (logs, etc), need to ensure that jobs don't
relaunch on top of each other

Daemon:

Pros - Use a monitor to keep us informed it is still running, cyclical so
won't launch over each other, write to a log file easy
Cons - Need to write a daemon controller script

I'm sure that there are others, I'm mostly babbling and writing this down
as I think. Certainly, for the first release of this, I will start it as
a cronjob, but down the line, I think I will move this to a Daemon, once
the script has been in a production environment for a while. (i.e. we
know it is working correctly!)</description>
      <dc:date>2010-03-04T15:45:00Z</dc:date>
      <dc:subject>daemon perl Moose crontab</dc:subject>
      <title>crontab or daemon</title>
      <pubDate>Thu, 04 Mar 2010 15:45:00 -0000</pubDate>
      <content:encoded>So here is an interesting choice I need to make.&lt;br /&gt;&lt;br /&gt;I have just rewritten a bit of code to email interested parties when a run with their data on it reaches 2 points. One when it reaches run complete (i.e. the instrument has done all it's processing) and then again when the data has been post-processed and qc'd and deposited in the central archive space for them to obtain.&lt;br /&gt;&lt;br /&gt;I'm quite pleased with the code. It is more robust than the previous hack which we had never intended to be all encompassing, and actually mails the parties that should be interested (rather than some 'user' which may or may not be the right person).&lt;br /&gt;&lt;br /&gt;It is, of course, also written using Moose.&lt;br /&gt;&lt;br /&gt;However, now I have to decide, which do I choose, a cronjob, or a daemon process.&lt;br /&gt;&lt;br /&gt;Cronjob:&lt;br /&gt;&lt;br /&gt;Pros - very quick. Just decide how often to launch it, and run the script.&lt;br /&gt;Cons - need to remember which node the cronjob is running, need to do something with the outputs (logs, etc), need to ensure that jobs don't relaunch on top of each other&lt;br /&gt;&lt;br /&gt;Daemon:&lt;br /&gt;&lt;br /&gt;Pros - Use a monitor to keep us informed it is still running, cyclical so won't launch over each other, write to a log file easy&lt;br /&gt;Cons - Need to write a daemon controller script&lt;br /&gt;&lt;br /&gt;I'm sure that there are others, I'm mostly babbling and writing this down as I think. Certainly, for the first release of this, I will start it as a cronjob, but down the line, I think I will move this to a Daemon, once the script has been in a production environment for a while. (i.e. we know it is working correctly!)&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-04T15:45:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-1158653486009791669.post-3882170311150275323</guid>
    </item>
    <item>
      <author>nobody@example.com (kappa)</author>
      <dc:creator>nobody@example.com (kappa)</dc:creator>
      <category>journal</category>
      <link>http://use.perl.org/~kappa/journal/40222?from=rss</link>
      <description>A questionable, but interesting nevertheless article in USA Wired
mentions Perl:

  ...tweets about Lady Gaga’s lingerie can help someone debugging Perl
  code. (Or a tweet about Perl code may help Lady Gaga’s underwear
  stylist.)</description>
      <dc:date>2010-03-04T13:16:45Z</dc:date>
      <dc:subject>journal</dc:subject>
      <title>Wired about serendipity (and Perl)</title>
      <pubDate>Thu, 04 Mar 2010 13:16:45 -0000</pubDate>
      <content:encoded>&lt;p&gt;A questionable, but interesting nevertheless &lt;a href="http://www.wired.com/magazine/2010/02/st_essay_distraction/"&gt;article in USA Wired&lt;/a&gt; mentions Perl:&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt;&lt;nobr&gt; &lt;wbr&gt;&lt;/nobr&gt;&lt;i&gt;...tweets about Lady Gaga&amp;#8217;s lingerie can help someone debugging Perl code. (Or a tweet about Perl code may help Lady Gaga&amp;#8217;s underwear stylist.)&lt;/i&gt;&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;</content:encoded>
      <dcterms:modified>2010-03-04T13:16:45Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://use.perl.org/~kappa/journal/40222?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (D)</author>
      <dc:creator>nobody@example.com (D)</dc:creator>
      <category>日常 perl</category>
      <link>http://mt.endeworks.jp/d-6/2010/03/post-146.html</link>
      <description>「だからどうだ」ってことですけど、（perlだとreverseあるので本来なら1オペで終わっちゃうけど）とりあえずループを使わずに与えた配列を逆にするコードの自己最短コードはこうなりました：

sub r{@_?(pop,r(@_)):()};

もう少し読みやすく展開するとこんな感じですね。ただの再帰処理です：

sub myreverse {
   if (@_ &gt; 0) {
      return (pop @_, myreverse(@_));
   } else {
      return ();
   }
}

popで配列の最後の要素を最初に回して、残りを再帰処理してるだけー</description>
      <dc:date>2010-03-04T18:32:05+09:00</dc:date>
      <dc:subject>日常 perl</dc:subject>
      <title>ループを使わずに配列を逆にするヤツ</title>
      <pubDate>Thu, 04 Mar 2010 18:32:05 +0900</pubDate>
      <content:encoded>
        &lt;div&gt;「だからどうだ」ってことですけど、（perlだとreverseあるので本来なら1オペで終わっちゃうけど）とりあえずループを使わずに与えた配列を逆にするコードの自己最短コードはこうなりました：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;pre class="code_listing"&gt;sub r{@_?(pop,r(@_)):()};
&lt;/pre&gt;

&lt;div&gt;もう少し読みやすく展開するとこんな感じですね。ただの再帰処理です：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;pre class="code_listing"&gt;sub myreverse {
   if (@_ &amp;gt; 0) {
      return (pop @_, myreverse(@_));
   } else {
      return ();
   }
}
&lt;/pre&gt;

&lt;div&gt;popで配列の最後の要素を最初に回して、残りを再帰処理してるだけー&lt;/div&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-04T18:32:05+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:mt.endeworks.jp,2010:/d-6//3.2459</guid>
    </item>
    <item>
      <author>nobody@example.com (Michele Beltrame)</author>
      <dc:creator>nobody@example.com (Michele Beltrame)</dc:creator>
      <category>conferenza ironman italia italiano perl pisa yapc yapceu yapceu2010</category>
      <link>http://www.cattlegrid.info/blog/2010/03/qualche-novita-su-yapceurope-2.html</link>
      <description>Il sito è in inglese, la conferenza è inglese, ma è organizzata in Italia
e tutti gli appassionati di Perl e i curiosi sono i benvenuti!

Ecco qualche notizia sull'organizzazione:

  * È online il nuovo sito, con un layout decisamente più professionale.

  * Abbiamo pubblicato la Call for Sponsors: con circa 320 partecipanti,
    YAPC::Europe è una vetrina importante anche per le aziende italiane.

  * La Call for Papers è disponibile: un talk (in inglese) è una buona
    occasione per parlare di un proprio progetto, e garantisce l'ingresso
    alla conferenza.

  * È disponibile anche la Call for Training Courses, dedicata a chiunque
    è interessato a tenere un corso (a pagamento) nei giorni
    immediatamente precedenti la conferenza.

Ci vediamo a Pisa dal 4 al 6 Agosto!</description>
      <dc:date>2010-03-03T22:38:53Z</dc:date>
      <dc:subject>conferenza ironman italia italiano perl pisa yapc yapceu yapceu2010</dc:subject>
      <title>Qualche novità su YAPC::Europe 2010</title>
      <pubDate>Wed, 03 Mar 2010 22:38:53 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;Il &lt;a href="http://conferences.yapceurope.org/ye2010/"&gt;sito&lt;/a&gt; è in inglese, la conferenza è inglese, ma è organizzata in Italia e tutti gli appassionati di Perl e i curiosi sono i benvenuti!&lt;/p&gt;

&lt;p&gt;Ecco qualche notizia sull'organizzazione:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;È online &lt;a href="http://conferences.yapceurope.org/ye2010/"&gt;il nuovo sito&lt;/a&gt;, con un layout decisamente più professionale.&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Abbiamo pubblicato la &lt;a href="http://conferences.yapceurope.org/ye2010/call_for_sponsors.html"&gt;Call for Sponsors&lt;/a&gt;: con circa 320 partecipanti, &lt;span class="caps"&gt;YAPC&lt;/span&gt;::Europe è una vetrina importante anche per le aziende italiane.&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;La &lt;a href="http://conferences.yapceurope.org/ye2010/call_for_papers.html"&gt;Call for Papers&lt;/a&gt; è disponibile: un talk (in inglese) è una buona occasione per parlare di un proprio progetto, e garantisce l'ingresso alla conferenza.&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;È disponibile anche la &lt;a href="http://conferences.yapceurope.org/ye2010/call_for_training_courses.html"&gt;Call for Training Courses&lt;/a&gt;, dedicata a chiunque è interessato a tenere un corso (a pagamento) nei giorni immediatamente precedenti la conferenza.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;b&gt;Ci vediamo a Pisa dal 4 al 6 Agosto!&lt;/b&gt;&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-03T22:38:53Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.cattlegrid.info,2010:/blog//1.219</guid>
    </item>
    <item>
      <author>nobody@example.com (richard)</author>
      <dc:creator>nobody@example.com (richard)</dc:creator>
      <category>Miscellaneous c++ perl</category>
      <link>http://richard.wallman.org.uk/2010/03/chainsaws-and-scalpels/</link>
      <description>I work in Perl &amp;#8211; a lot. As a result, I&amp;#8217;ve got used to working in Perl, and have maybe grown a little too reliant on it, and some of the features it provides&amp;#8230;
I&amp;#8217;ve got a pet project I&amp;#8217;m working on. It is, somewhat surprisingly, not written in Perl (which is usually my weapon of [...]</description>
      <dc:date>0</dc:date>
      <dc:subject>Miscellaneous c++ perl</dc:subject>
      <title>Chainsaws and scalpels</title>
      <pubDate>Wed, 03 Mar 2010 21:58:28 -0000</pubDate>
      <content:encoded>I work in Perl &amp;#8211; a lot. As a result, I&amp;#8217;ve got used to working in Perl, and have maybe grown a little too reliant on it, and some of the features it provides&amp;#8230;
I&amp;#8217;ve got a pet project I&amp;#8217;m working on. It is, somewhat surprisingly, not written in Perl (which is usually my weapon of [...]</content:encoded>
      <dcterms:modified>0</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://richard.wallman.org.uk/?p=127</guid>
    </item>
    <item>
      <author>nobody@example.com (Sascha    )</author>
      <dc:creator>nobody@example.com (Sascha    )</dc:creator>
      <link>http://my.opera.com/EinSascha/blog/show.dml/8429341</link>
      <description>Das ist der letzte Beitrag aus der Grundlagen-Serie und soll Tipps für
Perl-Anfänger bieten.</description>
      <dc:date>2010-03-03T21:43:47+01:00</dc:date>
      <title>
    Mit Perl Anfangen
  </title>
      <pubDate>Wed, 03 Mar 2010 21:43:47 +0100</pubDate>
      <content:encoded>&lt;strong&gt;Das ist der letzte Beitrag aus der Grundlagen-Serie und soll Tipps für Perl-Anfänger bieten.&lt;/strong&gt;</content:encoded>
      <dcterms:modified>2010-03-03T21:43:47+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://my.opera.com/EinSascha/blog/8429341</guid>
    </item>
    <item>
      <author>nobody@example.com (Gabor Szabo)</author>
      <dc:creator>nobody@example.com (Gabor Szabo)</dc:creator>
      <category>Perl, community, CeBIT</category>
      <link>http://szabgab.com/blog/2010/03/1267676778.html</link>
      <description>I really have no energy to write much. The first day of CeBIT was a bit
low on visitors but even that went quite well. I met with several people
I wanted to talk. Especially interesting were the chats with the people
from the Eclipse Foundation.

Today, on the second day, was a lot busier. Many people were walking
around and many people came to the Perl stand as well. There are always
3-4 Perl::Staff people at the stand and usually they are busy talking to
visitors.

Some PHP and Ruby developers came and we could show them interesting
things that can be done with Perl, Moose, Catalyst and DBIx::Class. Many
people also liked Padre, you know the Perl IDE

There were many people who said that the main problem they are facing is
the lack of Perl developers and some of them told us that they are
actually considering switching language because of this. It seems to them
that it is easy to find programmers to many other languages, something
that was the case with Perl as well a few year ago but now there don't
seem to be any Perl programmers. I wonder what could be the reason of
that? Where are does developers gone? Have they stopped using Perl and
have they remove Perl from their CV? Are there many more jobs now filled
by those developers without new developers learning Perl to fill the
newly created jobs? Maybe the expectations from a Perl developer are now
higher than 5-10 years ago so the same people who could counted as Perl
developers 5 years ago aren't considered as such any more?

Anyway we have a lot more work to do in the coming days. I'll try to add
some pictures to the next report.

Renee made some nice pictures of Perl on CeBIT</description>
      <dc:date>2010-03-03T20:26:18Z</dc:date>
      <dc:subject>Perl, community, CeBIT</dc:subject>
      <title>Two days into CeBIT</title>
      <pubDate>Wed, 03 Mar 2010 20:26:18 -0000</pubDate>
      <content:encoded>&lt;p&gt;
I really have no energy to write much. The first day of CeBIT was a bit low on visitors but even that went quite well. 
I met with several people I wanted to talk. Especially interesting were the chats with the people from the Eclipse Foundation.
&lt;/p&gt;
&lt;p&gt;
Today, on the second day, was a lot busier. Many people were walking around and many people came to the Perl stand as well. 
There are always 3-4 &lt;a href="http://cpan.uwinnipeg.ca/dist/Perl-Staff"&gt;Perl::Staff&lt;/a&gt; people at the stand and usually they are busy talking to visitors.
&lt;/p&gt;
&lt;p&gt;
Some PHP and Ruby developers came and we could show them interesting things that can be done with 
Perl, &lt;a href="http://moose.perl.org/"&gt;Moose&lt;/a&gt;, &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt; 
and &lt;a href="http://cpan.uwinnipeg.ca/dist/DBIx-Class"&gt;DBIx::Class&lt;/a&gt;. Many people also liked Padre, you know &lt;a href="http://padre.perlide.org/"&gt;the Perl IDE&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
There were many people who said that the main problem they are facing is the lack of Perl developers and some 
of them told us that they are actually considering switching language because of this. It seems to them that it is 
easy to find programmers to many other languages, something that was the case with Perl as well a few year ago but now
there don't seem to be any Perl programmers. I wonder what could be the reason of that? Where are does developers gone?
Have they stopped using Perl and have they remove Perl from their CV? Are there many more jobs now filled by those developers 
without new developers learning Perl to fill the newly created jobs?
Maybe the expectations from a Perl developer are now higher than 5-10 years ago so the same people who could counted as 
Perl developers 5 years ago aren't considered as such any more?
&lt;/p&gt;
&lt;p&gt;
Anyway we have a lot more work to do in the coming days. I'll try to add some pictures to the next report.
&lt;/p&gt;
&lt;p&gt;
Renee made some nice pictures of 
&lt;a href="http://cebit.perl-magazin.de/gallery.html"&gt;Perl on CeBIT&lt;/a&gt;
&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-03T20:26:18Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://szabgab.com/blog/2010/03/1267676778.html</guid>
    </item>
    <item>
      <author>nobody@example.com (ash)</author>
      <dc:creator>nobody@example.com (ash)</dc:creator>
      <category>Не Perl myself perl story</category>
      <link>http://onperl.ru/onperl/2010/03/10.html</link>
      <description>На основе записей в трудовой книжке.

1999, Москва

— Я программирую на Perl. Особенность в том, одно и то же действие можно
записать по-разному. Это и непривычно, и немного сложно, но интересно.

Это сказал мой товарищ, который в то время делал сайт одного из
поставщика радиодеталей. Я же в то время писал на C++ программы для
обработки данных физических экспериментов по сталкиванию частиц, делал
статистический анализ данных, замаскированных шумом, и пытался применять
новейшие математические приемы — вейвлеты — для анализа
электрокардиограмм.

В книжных магазинах моего родного города я давно видел несколько книг с
большими буквами PERL. Неосознанно я хотел узнать, что это, но тогда
буквы значили не больше, чем аббревиатура VRML. Не хочу сказать, что
произнесенные между делом слова товарища повлияли на мой выбор, но и
отрицать этого не стану.

2000—2010, Москва

С этого года Perl стал меня кормить. За десять лет я совершенствовал себя
и свои знания в журнале «Радио», фонде научных исследований «Прагматика
культуры», студии Артемия Лебедева (да-да, там я тоже делал некоторые
вещи на перле), российском информационном агентстве «РИА Новости»,
компании Q1 и в ООО «Гностик».

2010, Амстердам

В марте я подписал контракт с компанией Booking.com — еще одним лидером
интернетов, который знает толк в перле и где не стыдно работать.</description>
      <dc:date>2010-03-03T21:07:51+01:00</dc:date>
      <dc:subject>Не Perl myself perl story</dc:subject>
      <title>10+</title>
      <pubDate>Wed, 03 Mar 2010 21:07:51 +0100</pubDate>
      <content:encoded>
        &lt;p&gt;На основе записей в трудовой книжке.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;1999, Москва&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;— Я программирую на Perl. Особенность&amp;nbsp;в том,&amp;nbsp;одно и то же действие можно записать по-разному. Это и непривычно, и немного сложно, но интересно.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Это сказал мой товарищ, который в то время делал сайт одного из поставщика радиодеталей. &lt;/em&gt;&lt;a href="http://shitov.ru/sci/"&gt;&lt;em&gt;Я же в то время&lt;/em&gt;&lt;/a&gt;&lt;em&gt; писал на C++ программы для обработки данных физических экспериментов по сталкиванию частиц, делал статистический анализ данных, замаскированных шумом, и пытался применять новейшие математические&amp;nbsp;приемы — вейвлеты — для анализа электрокардиограмм.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;В книжных магазинах моего родного города я давно видел несколько книг с большими буквами PERL. Неосознанно я хотел узнать, что это, но тогда буквы значили не больше, чем аббревиатура VRML. Не хочу сказать, что произнесенные между делом слова товарища&amp;nbsp;повлияли на мой выбор, но и отрицать этого не стану.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;2000—2010, Москва&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;С этого года Perl стал меня кормить. За десять лет я совершенствовал себя и свои знания в журнале «&lt;/em&gt;&lt;a href="http://www.radio.ru/"&gt;&lt;em&gt;Радио&lt;/em&gt;&lt;/a&gt;&lt;em&gt;», фонде научных исследований «&lt;/em&gt;&lt;a href="http://artpragmatica.ru"&gt;&lt;em&gt;Прагматика культуры&lt;/em&gt;&lt;/a&gt;&lt;em&gt;», &lt;/em&gt;&lt;a href="http://artlebedev.ru/"&gt;&lt;em&gt;студии Артемия Лебедева&lt;/em&gt;&lt;/a&gt;&lt;em&gt; (да-да, там я тоже делал некоторые вещи на перле), российском информационном агентстве «&lt;/em&gt;&lt;a href="http://rian.ru"&gt;&lt;em&gt;РИА Новости&lt;/em&gt;&lt;/a&gt;&lt;em&gt;», компании &lt;/em&gt;&lt;a href="http://magic.ru"&gt;&lt;em&gt;Q1&lt;/em&gt;&lt;/a&gt;&lt;em&gt; и в ООО «&lt;/em&gt;&lt;a href="http://whoyougle.ru/"&gt;&lt;em&gt;Гностик&lt;/em&gt;&lt;/a&gt;&lt;em&gt;».&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;2010, Амстердам&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;В марте я подписал контракт с&amp;nbsp;компанией &lt;/em&gt;&lt;a href="http://booking.com/"&gt;&lt;em&gt;Booking.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;— еще одним лидером интернетов, который знает толк в перле и где не стыдно работать.&lt;/em&gt;&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-03T21:07:51+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:onperl.ru,2010:/onperl//1.157</guid>
    </item>
    <item>
      <author>nobody@example.com (ReneeB)</author>
      <dc:creator>nobody@example.com (ReneeB)</dc:creator>
      <link>http://reneeb-perlblog.blogspot.com/2010/03/perlcebit-tag-2.html</link>
      <description>Wie schon letzte Nacht, war ich auch diesmal pünktlich um 2 Uhr wach.
Halb so wild, weil mir noch ein paar Ideen für meinen Vortrag gekommen
sind. Gegen 4 Uhr bin ich dann wieder eingeschlafen. Als der Wecker
geklingelt hat, konnte ich mich nicht gleich dazu durchringen,
aufzustehen. Also den Wecker weitergedrückt.

Aber das Weiterdrücken des Weckers hilft irgendwann auch nicht mehr. Es
wird Zeit aufzustehen. Duschen, Frühstücken und im Auto warten... und
warten... und warten. Die Straße vor dem Hotel ist morgens voll mit
Autos. Keine Chance rauszukommen. Irgendwann habe ich es doch geschafft,
mich in die lange Schlange einzureihen.

Auf der Messe angekommen, bin ich gleich zum Stand. Ich habe ein paar
Kleinigkeiten umgebaut, damit die Leute besser und schneller unsere
Broschüre finden. Gestern sind wir nur recht wenige losgeworden. Da waren
sie auch etwas versteckt. Das musste sich ändern. Kann ja nicht sein,
dass die Leute an unserem Stand vorbeischauen, ohne sich irgendwie über
Perl zu informieren ;-)

Als ich fertig war, habe ich mich noch mit dem Mann von der Security
unterhalten. Er scheint aber kein Perl einzusetzen. Aber ich habe ja noch
ein paar Tage Zeit, ihn zu überzeugen ;-)

Um neun ging dann der zweite Tag auf der CeBIT richtig los. Die Hallen
haben sich dann schon langsam gefüllt. Schon in den ersten Minuten konnte
man sehen, dass es heute wohl etwas voller werden würde.

Erste Aufgabe: Info-Stand für den Postboten spielen...

Um halb zehn bin ich dann erstmal zur LPI-Bühne gegangen, um mich dort
kurz mit den technischen Gegebenheiten vertraut zu machen. Nix
kompliziertes, also noch genug Zeit. Kurz zum ((otrs))-Stand, um kurz
"Guten Morgen" zu sagen. Hier noch einen Hinweis auf den OTRS::ITSM 2.0-Workshop
morgen im Convention Center um 14.00 Uhr in den Vortrag eingebaut. Warum
kann ich es eigentlich nicht lassen, 5 Minuten vor einem Vortrag noch
einige Sachen an den Folien zu ändern??

Egal... Ab zur LPI-Bühne. Kurzer Aufbau. Handy klingelt. Warum
ausgerechnet jetzt? Ach, wo der Vortrag stattfindet? Ein interessierter
Perl-Programmierer steht bei uns am Stand und fragt danach. Da habe ich
wohl eine entscheidende Info in der Statusmeldung bei XING vergessen.
Notiz ist mittlerweile geschrieben, dass das nicht mehr passiert (hoffe
ich jedenfalls). Keine zwei Minuten kann ich die Person beim Vortrag
begrüßen. Noch gibt es kleinere technische Probleme mit dem Mikrofon. Es
verzögert sich alles. Dann darf ich anfangen. Anfangs haben ganze 3(!!)
Personen dagesessen. Aber nach zwei Minuten standen schon etliche
Besucher drumrum. Der Titel ist wohl doch nicht so schlecht gewählt...
Insgesamt schätze ich die Zuhörerschar (die länger als 10 Minuten
zugehört haben) auf 30-40 Personen. Nicht schlecht, denke ich.

Und hier gibt's die Folien und meine Notizen:
http://www.renee-baecker.de/vortraege.html

Nach dem Vortrag habe ich mich noch mit ein paar Zuhörern unterhalten.
War sehr interessant!

Zurück zum Perl-Stand, dort sehe ich, dass "phaylon" mittlerweile zu
unserem Team dazugestoßen ist. Und alle Helfer sind in Gespräche mit
Besuchern vertieft. Während wir gestern immer mal wieder Leerlauf hatten,
ist das heute ganz anders. Teilweise warten mehrere Leute darauf, dass
einer der Helfer Zeit hat. Das zeigt mir, dass das Interesse an Perl
vorhanden ist. Auch einige Programmierneulinge wollen wissen, wo man
einen guten Einstieg in Perl bekommen kann. Perl-Programmierernachwuchs,
wir freuen uns auf euch und eure coolen Apps!

Dann ist der CeBIT-Tag für mich schon fast gelaufen. Ich muss nach
Goslar, mein Auto aus der Werkstatt holen. Eine Stunde hin, Leihwagen
abgeliefert, Auto geholt, bei McDonald's Mittagspause gemacht, eine
Stunde zurück. Heute geht die CeBIT nur noch 2 Stunden...

Gabor hat mir erzählt, dass immer sehr viel los war am Stand und dass
einige interessante Kontakte geknüpft wurden. (Und die $foo-Exemplare
nehmen rapide ab ;-) ).

Ich habe heute auch ein paar Bilder von unserem Stand hochgeladen:
http://cebit.perl-magazin.de/gallery.html</description>
      <dc:date>2010-03-03T19:22:00Z</dc:date>
      <title>Perl@CeBIT - Tag 2</title>
      <pubDate>Wed, 03 Mar 2010 19:22:00 -0000</pubDate>
      <content:encoded>Wie schon letzte Nacht, war ich auch diesmal pünktlich um 2 Uhr wach. Halb so wild, weil mir noch ein paar Ideen für meinen &lt;a href="http://www.linuxhotel.de/cebit/thema/Foswiki_Padre_und_OTRS.html"&gt;Vortrag&lt;/a&gt; gekommen sind. Gegen 4 Uhr bin ich dann wieder eingeschlafen. Als der Wecker geklingelt hat, konnte ich mich nicht gleich dazu durchringen, aufzustehen. Also den Wecker weitergedrückt.&lt;br /&gt;&lt;br /&gt;Aber das Weiterdrücken des Weckers hilft irgendwann auch nicht mehr. Es wird Zeit aufzustehen. Duschen, Frühstücken und im Auto warten... und warten... und warten. Die Straße vor dem Hotel ist morgens voll mit Autos. Keine Chance rauszukommen. Irgendwann habe ich es doch geschafft, mich in die lange Schlange einzureihen.&lt;br /&gt;&lt;br /&gt;Auf der Messe angekommen, bin ich gleich zum Stand. Ich habe ein paar Kleinigkeiten umgebaut, damit die Leute besser und schneller unsere &lt;a href="http://cebit.perl-magazin.de/Perl.pdf"&gt;Broschüre&lt;/a&gt; finden. Gestern sind wir nur recht wenige losgeworden. Da waren sie auch etwas versteckt. Das musste sich ändern. Kann ja nicht sein, dass die Leute an unserem Stand vorbeischauen, ohne sich irgendwie über &lt;a href="http://perl.org"&gt;Perl&lt;/a&gt; zu informieren ;-)&lt;br /&gt;&lt;br /&gt;Als ich fertig war, habe ich mich noch mit dem Mann von der Security unterhalten. Er scheint aber kein Perl einzusetzen. Aber ich habe ja noch ein paar Tage Zeit, ihn zu überzeugen ;-)&lt;br /&gt;&lt;br /&gt;Um neun ging dann der zweite Tag auf der &lt;a href="http://cebit.de"&gt;CeBIT&lt;/a&gt; richtig los. Die Hallen haben sich dann schon langsam gefüllt. Schon in den ersten Minuten konnte man sehen, dass es heute wohl etwas voller werden würde.&lt;br /&gt;&lt;br /&gt;Erste Aufgabe: Info-Stand für den Postboten spielen...&lt;br /&gt;&lt;br /&gt;Um halb zehn bin ich dann erstmal zur &lt;a href="http://www.linuxhotel.de/cebit/lpi_buehne.html"&gt;LPI-Bühne&lt;/a&gt; gegangen, um mich dort kurz mit den technischen Gegebenheiten vertraut zu machen. Nix kompliziertes, also noch genug Zeit. Kurz zum &lt;a href="http://otrs.com"&gt;((otrs))&lt;/a&gt;-Stand, um kurz "Guten Morgen" zu sagen. Hier noch einen Hinweis auf den &lt;a href="http://www.otrs.com/en/products/otrsitsm/"&gt;OTRS::ITSM&lt;/a&gt; 2.0-&lt;a href="http://blog.kuhn-kt.de/?p=419"&gt;Workshop morgen im Convention Center&lt;/a&gt; um 14.00 Uhr in den Vortrag eingebaut. Warum kann ich es eigentlich nicht lassen, 5 Minuten vor einem Vortrag noch einige Sachen an den Folien zu ändern??&lt;br /&gt;&lt;br /&gt;Egal... Ab zur LPI-Bühne. Kurzer Aufbau. Handy klingelt. Warum ausgerechnet jetzt? Ach, wo der Vortrag stattfindet? Ein interessierter Perl-Programmierer steht bei uns am Stand und fragt danach. Da habe ich wohl eine entscheidende Info in der Statusmeldung bei &lt;a href="http://xing.com"&gt;XING&lt;/a&gt; vergessen. Notiz ist mittlerweile geschrieben, dass das nicht mehr passiert (hoffe ich jedenfalls). Keine zwei Minuten kann ich die Person beim Vortrag begrüßen. Noch gibt es kleinere technische Probleme mit dem Mikrofon. Es verzögert sich alles. Dann darf ich anfangen. Anfangs haben ganze 3(!!) Personen dagesessen. Aber nach zwei Minuten standen schon etliche Besucher drumrum. Der Titel ist wohl doch nicht so schlecht gewählt... Insgesamt schätze ich die Zuhörerschar (die länger als 10 Minuten zugehört haben) auf 30-40 Personen. Nicht schlecht, denke ich.&lt;br /&gt;&lt;br /&gt;Und hier gibt's die Folien und meine Notizen: &lt;a href="http://www.renee-baecker.de/vortraege.html"&gt;http://www.renee-baecker.de/vortraege.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nach dem Vortrag habe ich mich noch mit ein paar Zuhörern unterhalten. War sehr interessant!&lt;br /&gt;&lt;br /&gt;Zurück zum Perl-Stand, dort sehe ich, dass "phaylon" mittlerweile zu unserem Team dazugestoßen ist. Und alle Helfer sind in Gespräche mit Besuchern vertieft. Während wir gestern immer mal wieder Leerlauf hatten, ist das heute ganz anders. Teilweise warten mehrere Leute darauf, dass einer der Helfer Zeit hat. Das zeigt mir, dass das Interesse an Perl vorhanden ist. Auch einige Programmierneulinge wollen wissen, wo man einen guten Einstieg in Perl bekommen kann. Perl-Programmierernachwuchs, wir freuen uns auf euch und eure coolen Apps!&lt;br /&gt;&lt;br /&gt;Dann ist der CeBIT-Tag für mich schon fast gelaufen. Ich muss nach Goslar, mein Auto aus der Werkstatt holen. Eine Stunde hin, Leihwagen abgeliefert, Auto geholt, bei McDonald's Mittagspause gemacht, eine Stunde zurück. Heute geht die CeBIT nur noch 2 Stunden...&lt;br /&gt;&lt;br /&gt;Gabor hat mir erzählt, dass immer sehr viel los war am Stand und dass einige interessante Kontakte geknüpft wurden. (Und die $foo-Exemplare nehmen rapide ab ;-) ).&lt;br /&gt;&lt;br /&gt;Ich habe heute auch ein paar Bilder von unserem Stand hochgeladen: &lt;a href="http://cebit.perl-magazin.de/gallery.html"&gt;http://cebit.perl-magazin.de/gallery.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-03T19:22:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-31159397.post-5527501966702356892</guid>
    </item>
    <item>
      <author>nobody@example.com (nothingmuch)</author>
      <dc:creator>nobody@example.com (nothingmuch)</dc:creator>
      <category>modules kiokudb perl</category>
      <link>http://feedproxy.google.com/~r/yuvalkogman/~3/Ez7wAqwbDLo/kiokudb-introduces-schema-versioning.html</link>
      <description>I've just released KiokuDB version 0.37, which introduces class
versioning.

This feature is disabled by default to avoid introducing errors to
existing schemas[1]. To try it out pass check_class_versions =&gt; 1 to
connect:

KiokuDB-&gt;connect(
    dsn =&gt; ...,
    check_class_versions =&gt; 1,
);

To use this feature, whenever you make an incompatible change to a class,
also change the $VERSION. When KiokuDB tries to load an object that has
been stored before the change was made, the version mismatch is detected
(versions are only compared as strings, there is no meaning to the
values).

Without any configuration this mismatch will result in an error at load
time, but the KiokuDB::Role::Upgrade::Handlers::Table role allows you to
declaratively add upgrade handlers to your classes:

package Foo;
use Moose;

with qw(KiokuDB::Role::Upgrade::Handlers::Table);

use constant kiokudb_upgrade_handlers_table =&gt; {

    # we can mark versions as being equivalent in terms of their
    # data. 0.01 to 0.02 may have introduced an incompatible API
    # change, but the stored data should be compatible
    "0.01" =&gt; "0.02",

    # on the other hand, after 0.02 there may have been an
    # incompatible data change, so we need to convert
    "0.02" =&gt; sub {
        my ( $self, %args ) = @_;

        return $args{entry}-&gt;derive(
            class_version =&gt; our $VERSION, # up to date version
            data =&gt; ..., # converted entry data
        );
    },
};

For more details see the documentation, especially
KiokuDB::TypeMap::Entry::MOP.

[1] In the future this might be enabled by default, but when data without
any version information is found in the database it is assumed to be up
to date.

[IMAGE]</description>
      <dc:date>2010-03-03T18:15:00Z</dc:date>
      <dc:subject>modules kiokudb perl</dc:subject>
      <title>KiokuDB Introduces Schema Versioning</title>
      <pubDate>Wed, 03 Mar 2010 18:15:00 -0000</pubDate>
      <content:encoded>&lt;p&gt;I've just released &lt;a href="http://search.cpan.org/dist/KiokuDB"&gt;KiokuDB&lt;/a&gt; version &lt;a href="http://cpansearch.perl.org/src/NUFFIN/KiokuDB-0.37/Changes"&gt;0.37&lt;/a&gt;, which introduces class versioning.&lt;/p&gt;

&lt;p&gt;This feature is &lt;em&gt;disabled&lt;/em&gt; by default to avoid introducing errors to existing schemas&lt;sup&gt;&lt;a href="#0582E125-4992-4913-A217-C1680E067A1B" name="71CDC4C9-3810-461B-A72C-F95B42BE9D78"&gt;[1]&lt;/a&gt;&lt;/sup&gt;. To try it out pass &lt;tt&gt;check_class_versions =&amp;gt; 1&lt;/tt&gt; to &lt;tt&gt;connect&lt;/tt&gt;:&lt;/p&gt;

&lt;pre class="fake-gist" id="fake-gist-320734"&gt;KiokuDB-&amp;gt;connect(
    dsn =&amp;gt; ...,
    check_class_versions =&amp;gt; 1,
);&lt;/pre&gt;

&lt;p&gt;To use this feature, whenever you make an incompatible change to a class, also change the &lt;tt&gt;$VERSION&lt;/tt&gt;. When KiokuDB tries to load an object that has been stored before the change was made, the version mismatch is detected (versions are only compared as strings, there is no meaning to the values).&lt;/p&gt;

&lt;p&gt;Without any configuration this mismatch will result in an error at load time, but the &lt;a href="http://search.cpan.org/perldoc?KiokuDB::Role::Upgrade::Handlers::Table"&gt;&lt;tt&gt;KiokuDB::Role::Upgrade::Handlers::Table&lt;/tt&gt;&lt;/a&gt; role allows you to declaratively add upgrade handlers to your classes:&lt;/p&gt;

&lt;pre class="fake-gist" id="fake-gist-320735"&gt;package Foo;
use Moose;

with qw(KiokuDB::Role::Upgrade::Handlers::Table);

use constant kiokudb_upgrade_handlers_table =&amp;gt; {

    # we can mark versions as being equivalent in terms of their
    # data. 0.01 to 0.02 may have introduced an incompatible API
    # change, but the stored data should be compatible
    "0.01" =&amp;gt; "0.02",

    # on the other hand, after 0.02 there may have been an
    # incompatible data change, so we need to convert
    "0.02" =&amp;gt; sub {
        my ( $self, %args ) = @_;

        return $args{entry}-&amp;gt;derive(
            class_version =&amp;gt; our $VERSION, # up to date version
            data =&amp;gt; ..., # converted entry data
        );
    },
};&lt;/pre&gt;

&lt;p&gt;For more details see the documentation, especially &lt;a href="http://search.cpan.org/perldoc?KiokuDB::TypeMap::Entry::MOP"&gt;&lt;tt&gt;KiokuDB::TypeMap::Entry::MOP&lt;/tt&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;&lt;a name="0582E125-4992-4913-A217-C1680E067A1B" href="#71CDC4C9-3810-461B-A72C-F95B42BE9D78"&gt;[1]&lt;/a&gt;&lt;/sup&gt; In the future this might be enabled by default, but when data without any version information is found in the database it is assumed to be up to date.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/yuvalkogman/~4/Ez7wAqwbDLo"&gt;</content:encoded>
      <dcterms:modified>2010-03-03T18:15:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-876358347971598886.post-2399456088063444272</guid>
    </item>
    <item>
      <author>nobody@example.com (sukria)</author>
      <dc:creator>nobody@example.com (sukria)</dc:creator>
      <category>Programming Dancer Perl</category>
      <link>http://www.sukria.net/fr/archives/2010/03/03/about-performances/</link>
      <description>I recently focused on Dancer’s core with a single target in mind:
optimization.
After having heavily refactored the Dancer::Route class, I started
benchmarking Dancer.

To start with, I’ve created a set of test applications, in order to bench
different kinds of application (from a hello world app to a huge one).

All these applications are available in this repository, if you like to
see more precisely what I did.

The first test I did was to bench a “hello-world” application, with PSGI,
Dancer 1.150 and the last version of the master branch.

hello.psgi .................... 1420 req/s
hello.dancer (1.150) .......... 1260 req/s
hello.dancer (github/master) .. 1320 req/s

You can see that Dancer “master” is about 100 req/s faster than 1.150,
this is mainly thanks to Dancer::Route::Builder: Dancer now compiles all
the routes defined by the application at startup time, and don’t spend
time whenever a request is handled to do that job.

Moreover, thanks to SawyerX, Dancer now caches route resolution via
Dancer::Route::Cache, and that increases response-time drastically when
accessing an application with lots of routes.

Here is another bench that I did against an application with 676 routes
handlers.

big.dancer (1.150, no cache, no route compiler) ...  110 req/s
big.dancer (GH, no cache, route compiler) .........  130 req/s
big.dancer (GH, cache, route compiler) ............ 1300 req/s

It appears clearly here that with a big number of route handlers,
Dancer’s response-time decreases. I wanted to see more precisely how that
occurs, and I run a bench in order to compare the response-time when
varying the number of route hanlders.

As you can see on this graph, thanks to route caching, we now have a
roughly constant response-time, no matter how many route handlers we have
in the applicaiton.

These improvements will be shipped with the next CPAN version, either
1.151 or 1.160 if we have the time to add some new features as well.

Stay tuned.</description>
      <dc:date>2010-03-03T17:13:36+01:00</dc:date>
      <dc:subject>Programming Dancer Perl</dc:subject>
      <title>About performances</title>
      <pubDate>Wed, 03 Mar 2010 17:13:36 +0100</pubDate>
      <content:encoded>&lt;p&gt;I recently focused on Dancer&amp;#8217;s core with a single target in mind: optimization.&lt;br /&gt;
After having heavily refactored the Dancer::Route class, I started benchmarking Dancer.&lt;/p&gt;
&lt;p&gt;To start with, I&amp;#8217;ve created a set of test applications, in order to bench different kinds of application (from a hello world app to a huge one). &lt;/p&gt;
&lt;p&gt;All these applications are available in this &lt;a href="http://github.com/sukria/Dancer-Benchmark"&gt;repository&lt;/a&gt;, if you like to see more precisely what I did.&lt;/p&gt;
&lt;p&gt;The first test I did was to bench a &amp;#8220;hello-world&amp;#8221; application, with PSGI, Dancer 1.150 and the last version of the master branch. &lt;/p&gt;
&lt;pre&gt;
hello.psgi .................... 1420 req/s
hello.dancer (1.150) .......... 1260 req/s
hello.dancer (github/master) .. 1320 req/s
&lt;/pre&gt;
&lt;p&gt;You can see that Dancer &amp;#8220;master&amp;#8221; is about 100 req/s faster than 1.150, this is mainly thanks to &lt;a href="http://github.com/sukria/Dancer/blob/master/lib/Dancer/Route/Builder.pm"&gt;Dancer::Route::Builder&lt;/a&gt;: Dancer now compiles all the routes defined by the application at startup time, and don&amp;#8217;t spend time whenever a request is handled to do that job.&lt;/p&gt;
&lt;p&gt;Moreover, thanks to &lt;a href="http://blogs.perl.org/users/sawyer_x/2010/02/dancer-gets-route-caching.html"&gt;SawyerX&lt;/a&gt;, Dancer now caches route resolution via &lt;a href="http://github.com/sukria/Dancer/blob/master/lib/Dancer/Route/Cache.pm"&gt;Dancer::Route::Cache&lt;/a&gt;, and that increases response-time drastically when accessing an application with lots of routes.&lt;/p&gt;
&lt;p&gt;Here is another bench that I did against an application with 676 routes handlers.&lt;/p&gt;
&lt;pre&gt;
big.dancer (1.150, no cache, no route compiler) ...  110 req/s
big.dancer (GH, no cache, route compiler) .........  130 req/s
big.dancer (GH, cache, route compiler) ............ 1300 req/s
&lt;/pre&gt;
&lt;p&gt;It appears clearly here that with a big number of route handlers, Dancer&amp;#8217;s response-time decreases. I wanted to see more precisely how that occurs, and I run a bench in order to compare the response-time when varying the number of route hanlders.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.sukria.net/fr/wp-content/uploads/2010/03/dancer-bench1.png"&gt;&lt;img src="http://www.sukria.net/fr/wp-content/uploads/2010/03/dancer-bench1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As you can see on this graph, thanks to route caching, we now have a roughly constant response-time, no matter how many route handlers we have in the applicaiton.&lt;/p&gt;
&lt;p&gt;These improvements will be shipped with the next CPAN version, either 1.151 or 1.160 if we have the time to add some new features as well.&lt;/p&gt;
&lt;p&gt;Stay tuned.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-03T17:13:36+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.sukria.net/fr/?p=1451</guid>
    </item>
    <item>
      <author>nobody@example.com (Sam Graham)</author>
      <dc:creator>nobody@example.com (Sam Graham)</dc:creator>
      <category>perl ironman benchmarking trim regexp optimization basic tutorial</category>
      <link>http://www.illusori.co.uk/perl/2010/03/03/white_space_trim.html</link>
      <description>Laufeyjarson asked on Monday, about stripping whitespace from both ends
of a string. The comments contains lots of suggestions, but no hard
figures, so I thought I'd reproduce them here along with the code used to
generate the benchmarks - it provides a simple example of how to write a
quick and reliable benchmark.

Read more...</description>
      <dc:date>0</dc:date>
      <dc:subject>perl ironman benchmarking trim regexp optimization basic tutorial</dc:subject>
      <title>Some simple "white-space trim" benchmarks</title>
      <pubDate>Wed, 03 Mar 2010 15:38:00 -0000</pubDate>
      <content:encoded>&lt;p&gt;Laufeyjarson asked on Monday, about stripping whitespace from both ends of a string. The comments contains lots of suggestions, but no hard figures, so I thought I&amp;#39;d reproduce them here along with the code used to generate the benchmarks - it provides a simple example of how to write a quick and reliable benchmark.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.illusori.co.uk/perl/2010/03/03/white_space_trim.html"&gt;Read more...&lt;/a&gt;&lt;/p&gt;</content:encoded>
      <dcterms:modified>0</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.illusori.co.uk/perl/2010/03/03/white_space_trim.html</guid>
    </item>
    <item>
      <author>nobody@example.com (SF)</author>
      <dc:creator>nobody@example.com (SF)</dc:creator>
      <category>Sieve Perl 6</category>
      <link>http://lastofthecarelessmen.blogspot.com/2010/03/lazy-sieve-of-eratosthenes-sidetracked.html</link>
      <description>A Hacker News article about the Sieve of Eratosthenes got me thinking
about how to do a lazy, infinite Sieve in Perl 6. (I didn't read the
whole article, because I wanted to produce my own implementation first!)
Unfortunately, my attempt to do so turned up what seems to be a very
major bug lurking in Rakudo's gather / take.

Basically, my notion was this. The Sieve essentially consists of crossing
off multiples from a list each time you find a new prime. So what if
instead of taking the list to be a fixed limited, fixed array of numbers,
you made it an actual infinite lazy list? All you need is a function
which, given two infinite lists of numbers, takes the least element at
the front of the lists and returns that. Then you when find a new prime,
you take your existing list and use that function to merge in the list of
multiples of the new prime.

So I started to code this up, and instantly ran into weirdness.

sub sorted-infinite-sequence-merge(Iterator $a-iterator, Iterator $b-iterator)
{
    my $a = $a-iterator.get;
    my $b = $b-iterator.get;

    gather loop {
        my $next = $a min $b;
        # say "$a, $b, $next";
        take $next;
        $a = $a-iterator.get if $a == $next;
        $b = $b-iterator.get if $b == $next;
    }
}

sorted-infinite-sequence-merge((1..100).iterator.map({$_*3}), (1..100).iterator.map({$_*4})).batch(20).perl.say;
sorted-infinite-sequence-merge((3, 6 ... *), (4, 8 ... *)).batch(20).perl.say



That code generates the following two lists:


(3, 4, 6, 8, 9, 12, 15, 16, 18, 20, 21, 24, 27, 28, 30, 32, 33, 36, 39, 40)
(4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80)



As you can see, the first list is clearly correct. The second list (which
calls the same merge function, but using source lists generated via
series instead of Range) is clearly incorrect. I believe this must
represent some sort of gather/take bug triggered by nested gather/take
operations.

Help?</description>
      <dc:date>2010-03-03T15:03:00Z</dc:date>
      <dc:subject>Sieve Perl 6</dc:subject>
      <title>Lazy Sieve of Eratosthenes, sidetracked</title>
      <pubDate>Wed, 03 Mar 2010 15:03:00 -0000</pubDate>
      <content:encoded>A Hacker News article about the Sieve of Eratosthenes got me thinking about how to do a lazy, infinite Sieve in Perl 6.  (I didn't read the whole article, because I wanted to produce my own implementation first!)  Unfortunately, my attempt to do so turned up what seems to be a very major bug lurking in Rakudo's gather / take.&lt;br /&gt;&lt;br /&gt;Basically, my notion was this.  The Sieve essentially consists of crossing off multiples from a list each time you find a new prime.  So what if instead of taking the list to be a fixed limited, fixed array of numbers, you made it an actual infinite lazy list?  All you need is a function which, given two infinite lists of numbers, takes the least element at the front of the lists and returns that.  Then you when find a new prime, you take your existing list and use that function to merge in the list of multiples of the new prime.&lt;br /&gt;&lt;br /&gt;So I started to code this up, and instantly ran into weirdness. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sorted&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;infinite&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;sequence&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;merge&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Iterator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Iterator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;my&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;my&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;gather&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;my&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;min&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# say &amp;quot;$a, $b, $next&amp;quot;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;take&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;sorted&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;infinite&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;sequence&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;merge&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;iterator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;.&lt;span&gt;batch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;.&lt;span&gt;perl&lt;/span&gt;.&lt;span&gt;say&lt;/span&gt;;&lt;br /&gt;&lt;span&gt;sorted&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;infinite&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;sequence&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;merge&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;.&lt;span&gt;batch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;.&lt;span&gt;perl&lt;/span&gt;.&lt;span&gt;say&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That code generates the following two lists:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(3, 4, 6, 8, 9, 12, 15, 16, 18, 20, 21, 24, 27, 28, 30, 32, 33, 36, 39, 40)&lt;br /&gt;(4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the first list is clearly correct.  The second list (which calls the same merge function, but using source lists generated via series instead of Range) is clearly incorrect.  I believe this must represent some sort of gather/take bug triggered by nested gather/take operations.&lt;br /&gt;&lt;br /&gt;Help?&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-03T15:03:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-739580098595224395.post-694200985208026</guid>
    </item>
    <item>
      <author>nobody@example.com (Chas. Owens)</author>
      <dc:creator>nobody@example.com (Chas. Owens)</dc:creator>
      <category>silly considered harmful perl</category>
      <link>http://feedproxy.google.com/~r/svok/~3/nK2Hok795KI/parts-of-perl-you-never-knew-existed.html</link>
      <description>This is a list of some of the darker, scarier, or lesser known areas of
Perl. I am going to be grouping them into a set of talks to scare,
disgust, and delight the DC Perl Mongers. There is no ordering to them In
this post; I am just trying to start a list of talk items.

  * Prototypes

  * what happens when you add a &amp; to the start of a function call (aka
    why you shouldn't)

  * split in void context

  * goto function

  * values vs variables (a superset of lists vs arrays)

  * wantarray and contexts (void, scalar, list)

  * pseudohashes

  * tie

  * typeglobs

  * PadWalker

  * source filters

  * adding methods to existing classes

  * interpolating things that aren't scalars or arrays

  * when to use each vs keys

  * warnings

      * how to disable certain warnings without affecting other warnings

      * how to add categories

  * B::Deparse, showing the magic Perl does for you

      * while (&lt;&gt;), while (readline), and while(readdir)

      * default values for split, print, etc.

  * do file

  * weird operators

  * special variables

      * %main::

      * $]

      * $"

      * $,

      * $/ and $\

      * %SIG

  * what strict does and why

      * symbolic references

      * barewords

  * regex magic

      * \k

      * \g

      * \G

      * \Q

      * differences between scalar and list context

      * recursion

[IMAGE]</description>
      <dc:date>2010-03-03T12:47:00Z</dc:date>
      <dc:subject>silly considered harmful perl</dc:subject>
      <title>Parts of Perl you never knew existed</title>
      <pubDate>Wed, 03 Mar 2010 12:47:00 -0000</pubDate>
      <content:encoded>This is a list of some of the darker, scarier, or lesser known areas of Perl.  I am going to be grouping them into a set of talks to scare, disgust, and delight the &lt;a href="http://dc.pm.org"&gt;DC Perl Mongers&lt;/a&gt;.  There is no ordering to them In this post; I am just trying to  start a list of talk items.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Prototypes&lt;/li&gt;&lt;li&gt;what happens when you add a &amp; to the start of a function call (aka why you shouldn't)&lt;/li&gt;&lt;li&gt;split in void context&lt;/li&gt;&lt;li&gt;goto function&lt;/li&gt;&lt;li&gt;values vs variables (a superset of lists vs arrays)&lt;/li&gt;&lt;li&gt;wantarray and contexts (void, scalar, list) &lt;/li&gt;&lt;li&gt;pseudohashes&lt;/li&gt;&lt;li&gt;tie&lt;/li&gt;&lt;li&gt;typeglobs&lt;/li&gt;&lt;li&gt;PadWalker&lt;/li&gt;&lt;li&gt;source filters&lt;/li&gt;&lt;li&gt;adding methods to existing classes&lt;/li&gt;&lt;li&gt;interpolating things that aren't scalars or arrays&lt;/li&gt;&lt;li&gt;when to use each vs keys&lt;/li&gt;&lt;li&gt;warnings &lt;ul&gt;&lt;li&gt;how to disable certain warnings without affecting other warnings&lt;/li&gt;&lt;li&gt;how to add categories&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;B::Deparse, showing the magic Perl does for you &lt;ul&gt;&lt;li&gt;while (&amp;lt;&amp;gt;), while (readline), and while(readdir)&lt;/li&gt;&lt;li&gt;default values for split, print, etc.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;do file&lt;/li&gt;&lt;li&gt;&lt;a href="http://svok.blogspot.com/2009/09/adventures-in-ignorance-what-i-have.html"&gt;weird operators&lt;/a&gt;&lt;/li&gt;&lt;li&gt;special variables &lt;ul&gt;&lt;li&gt;%main::&lt;/li&gt;&lt;li&gt;$]&lt;/li&gt;&lt;li&gt;$"&lt;/li&gt;&lt;li&gt;$,&lt;/li&gt;&lt;li&gt;$/ and $\&lt;/li&gt;&lt;li&gt;%SIG&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;what strict does and why &lt;ul&gt;&lt;li&gt;symbolic references&lt;/li&gt;&lt;li&gt;barewords&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;regex magic &lt;ul&gt;&lt;li&gt;\k&lt;/li&gt;&lt;li&gt;\g&lt;/li&gt;&lt;li&gt;\G&lt;/li&gt;&lt;li&gt;\Q&lt;/li&gt;&lt;li&gt;differences between scalar and list context&lt;/li&gt;&lt;li&gt;recursion&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svok/~4/nK2Hok795KI"&gt;</content:encoded>
      <dcterms:modified>2010-03-03T12:47:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-4206098438326334482.post-6210689785664588571</guid>
    </item>
    <item>
      <author>nobody@example.com (Steven Haryanto)</author>
      <dc:creator>nobody@example.com (Steven Haryanto)</dc:creator>
      <category>steven perl</category>
      <link>http://id-perl.blogspot.com/2010/03/on-reading-code.html</link>
      <description>Last week I started using github, forked a project, and read some of
miyagawa's beautiful code. Later on the weekend, I imitated a particular
style I found from his code to improve my own code.

And then I realized: during the course of many years as a programmer, I
really really seldom read other people's code, especially real-world
code. Sure, I do whenever I have to patch something. But other than that,
practically never.

Other than code, I do read an awful lot: books, magazines, mailing lists,
forums, blogs, web pages. I have never doubted the benefits of reading
for improving knowledge and understanding, so why haven't I read more
code? A couple of reasons I can think of:

1. We programmers are not paid to read code. We are paid to write
programs, to churn out lines upon lines of code. Heck, we're not even
paid to write good code, we're paid to get the job done.

2. Reading code is hard. It can really drain your brain. Imagine a recipe
book where the flow of instructions is not linear (jump to line X, jump
to page Y and then return here), where a misplaced character can destroy
the whole recipe, and where everything is so interdependent and
interlinked that you need to read everything twice first before you can
begin to understand it.

3. Reading code is boring. Can you really curl up with a good program the
way you can with an exciting novel?

4. Reading code is not necessary. A good reusable piece of code need not
be read anyway, all you need is its API documentation. Programmers are
hired regardless of their ability to read real-world code, there are no
interview tests in reading code other than a few or at most a dozen lines
of it. Heck, programmers are even hired despite their inability to write
any code at all.

After experiencing that one session of code reading can do some wonders,
I'll make it a program to read more (good) other people's code.</description>
      <dc:date>2010-03-03T12:26:00Z</dc:date>
      <dc:subject>steven perl</dc:subject>
      <title>On reading code</title>
      <pubDate>Wed, 03 Mar 2010 12:26:00 -0000</pubDate>
      <content:encoded>Last week I started using github, forked a project, and read some of &lt;a href="http://github.com/miyagawa/"&gt;miyagawa&lt;/a&gt;'s beautiful code. Later on the weekend, I imitated a particular style I found from his code to improve my own code.&lt;br /&gt;&lt;br /&gt;And then I realized: during the course of many years as a programmer, I really really seldom read other people's code, especially real-world code. Sure, I do whenever I have to patch something. But other than that, practically never.&lt;br /&gt;&lt;br /&gt;Other than code, I do read an awful lot: books, magazines, mailing lists, forums, blogs, web pages. I have never doubted the benefits of reading for improving knowledge and understanding, so why haven't I read more code? A couple of reasons I can think of:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. We programmers are not paid to read code.&lt;/b&gt; We are paid to write programs, to churn out lines upon lines of code. Heck, we're not even paid to write good code, we're paid to get the job done.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Reading code is hard.&lt;/b&gt; It can really drain your brain. Imagine a recipe book where the flow of instructions is not linear (jump to line X, jump to page Y and then return here), where a misplaced character can destroy the whole recipe, and where everything is so interdependent and interlinked that you need to read everything twice first before you can begin to understand it. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Reading code is boring.&lt;/b&gt; Can you really curl up with a good program the way you can with an exciting novel?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Reading code is not necessary.&lt;/b&gt; A good reusable piece of code need not be read anyway, all you need is its API documentation. Programmers are hired regardless of their ability to read real-world code, there are no interview tests in reading code other than a few or at most a dozen lines of it. Heck, programmers are even hired &lt;a href="http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html"&gt;despite their inability to write any code at all&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After experiencing that one session of code reading can do some wonders, I'll make it a program to read more (good) other people's code.&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-03T12:26:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-3035323255246508397.post-523411473437743080</guid>
    </item>
    <item>
      <author>nobody@example.com (Jérôme Quelin)</author>
      <dc:creator>nobody@example.com (Jérôme Quelin)</dc:creator>
      <category>tk perl</category>
      <link>http://jquelin.blogspot.com/2010/03/tkaction-to-simplify-access-to-gui.html</link>
      <description>in a typical graphical application, menu entries are often also available
in toolbars or other widgets. and sometimes, you want to enable or
disable a given action, and this means having to update all those entries
and widgets everywhere this action is allowed / forbidden.

this is not fun.

therefore, i wrote tk::action, a module to help managing actions in a tk
gui: just create a new object, associate some widgets and bindings with
add_widget() / add_binding() and then de/activate the whole action at
once with enable() or disable().

simple and efficient, as you can see on this synopsis:</description>
      <dc:date>2010-03-03T12:22:00Z</dc:date>
      <dc:subject>tk perl</dc:subject>
      <title>tk::action to simplify access to a gui action</title>
      <pubDate>Wed, 03 Mar 2010 12:22:00 -0000</pubDate>
      <content:encoded>&lt;p&gt;in a typical graphical application, menu entries are often also available in toolbars or other widgets. and sometimes, you want to enable or disable a given action, and this  means having to update all those entries and widgets everywhere this action is allowed / forbidden.&lt;/p&gt;&lt;p&gt;this is not fun.&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;therefore, i wrote &lt;a href="http://search.cpan.org/perldoc?Tk::Action"&gt;tk::action&lt;/a&gt;, a module to help managing actions in a &lt;a href="http://search.cpan.org/dist/Tk"&gt;tk&lt;/a&gt; gui:  just create a new object, associate some widgets and bindings with &lt;code&gt;add_widget()&lt;/code&gt; / &lt;code&gt;add_binding()&lt;/code&gt;  and then de/activate the whole action at once with &lt;code&gt;enable()&lt;/code&gt;  or &lt;code&gt;disable()&lt;/code&gt;.&lt;/p&gt;simple and efficient, as you can see on this synopsis:&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-03T12:22:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-6162910877268067002.post-2309274065923248929</guid>
    </item>
    <item>
      <author>nobody@example.com (martinjevans)</author>
      <dc:creator>nobody@example.com (martinjevans)</dc:creator>
      <category>DBIx::Log4perl Perl</category>
      <link>http://www.martin-evans.me.uk/node/60</link>
      <description>I've just released v0.20 of DBIx::Log4perl. DBIx::Log4perl is a Perl
extension for DBI to selectively log DBI methods, SQL, parameters,
result-sets, transactions etc to a Log::Log4perl handle.

This release fixes a problem where execute_array tuple status was
reported at INFO level instead of DEBUG level and adds the
DBIX_L4P_LOG_DELAYBINDPARAM constant which delays logging bind_param
methods in DBI until the execute method is called.

read more</description>
      <dc:date>0</dc:date>
      <dc:subject>DBIx::Log4perl Perl</dc:subject>
      <title>DBIx::Log4perl release 0.20 - bugfix and new feature</title>
      <pubDate>Wed, 03 Mar 2010 08:15:33 -0000</pubDate>
      <content:encoded>&lt;p&gt;I've just released v0.20 of &lt;a href="http://search.cpan.org/dist/DBIx-Log4perl/"&gt;DBIx::Log4perl&lt;/a&gt;. DBIx::Log4perl is a Perl extension for DBI to selectively log DBI methods, SQL, parameters, result-sets, transactions etc to a Log::Log4perl handle.&lt;/p&gt;
&lt;p&gt;This release fixes a problem where execute_array tuple status was reported at INFO level instead of DEBUG level and adds the DBIX_L4P_LOG_DELAYBINDPARAM constant which delays logging bind_param methods in DBI until the execute method is called.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.martin-evans.me.uk/node/60" target="_blank"&gt;read more&lt;/a&gt;&lt;/p&gt;</content:encoded>
      <dcterms:modified>0</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:60 at http://www.martin-evans.me.uk</guid>
    </item>
    <item>
      <author>nobody@example.com (Daisuke Maki)</author>
      <dc:creator>nobody@example.com (Daisuke Maki)</dc:creator>
      <category>jpa perl</category>
      <link>http://blog.perlassociation.org/2010/03/perl-casual-jpa-meetup.html</link>
      <description> このたびカジュアルPerlの勉強会に便乗協賛させていただく形でカジュアルPerl + JPAで4/21 に
Perl初心者向けの勉強会を執り行う事になりました。
今回はより初心者の方が来やすいようにと、以下のような参加資格となってますので、お気軽にどうぞ。

  参加資格: Perl初心者(リファレンスまでがわかるくらいがいいかも?)  CPAN Authorは後ろで立ち見決定  定員:70名以下内訳  初心者枠(50名): CPAN Author じゃない！ YAPCとかで発表したことがない  CPAN Author枠(20名): CPAN Author または、YAPC, shibuya.pm,yakohama.pmで発表をしたことがある方


私も喋らせてもらう予定ですが、多分CPAN, git, local::lib, cpanm, Catalystあたりの説明を絡めながらHello
World的なものをライブコーディングするつもりです。Perlで開発をする際の具体的なイメージができるような形にできるといいなと考えてます。
その他内容については詳しくはこちらをご覧下さい。まだ募集は始まっていませんが、皆様のご来場をお待ちしております！</description>
      <dc:date>2010-03-03T16:06:07+09:00</dc:date>
      <dc:subject>jpa perl</dc:subject>
      <title>カジュアルperl + JPA で勉強会をします。</title>
      <pubDate>Wed, 03 Mar 2010 16:06:07 +0900</pubDate>
      <content:encoded>
        このたびカジュアルPerlの勉強会に&lt;span class="Apple-style-span"&gt;便乗&lt;/span&gt;協賛させていただく形でカジュアルPerl + JPAで4/21 に Perl初心者向けの勉強会を執り行う事になりました。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回はより初心者の方が来やすいようにと、以下のような参加資格となってますので、お気軽にどうぞ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class="webkit-indent-blockquote"&gt;&lt;span class="Apple-style-span"&gt;&lt;pre&gt;&lt;div class="line" id="LC9"&gt;参加資格: Perl初心者(リファレンスまでがわかるくらいがいいかも?)&lt;/div&gt;&lt;div class="line" id="LC10"&gt;CPAN Authorは後ろで立ち見決定&lt;/div&gt;&lt;div class="line" id="LC11"&gt;定員:70名以下内訳&lt;/div&gt;&lt;div class="line" id="LC12"&gt;初心者枠(50名): CPAN Author じゃない！ YAPCとかで発表したことがない&lt;/div&gt;&lt;div class="line" id="LC13"&gt;CPAN Author枠(20名): CPAN Author または、YAPC, shibuya.pm,yakohama.pmで発表をしたことがある方&lt;/div&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;私も喋らせてもらう予定ですが、多分CPAN, git, local::lib, cpanm, Catalystあたりの説明を絡めながらHello World的なものをライブコーディングするつもりです。Perlで開発をする際の具体的なイメージができるような形にできるといいなと考えてます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;その他内容については詳しくは&lt;a href="http://yusukebe.com/archives/10/03/02/144218.html"&gt;こちらをご覧下さい&lt;/a&gt;。まだ募集は始まっていませんが、皆様のご来場をお待ちしております！&lt;/div&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-03T16:06:07+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blog.perlassociation.org,2010://3.40</guid>
    </item>
    <item>
      <author>nobody@example.com (Lech)</author>
      <dc:creator>nobody@example.com (Lech)</dc:creator>
      <category>future perlisnotdead</category>
      <link>http://perl.baczynski.com/future/perl-good-as-java</link>
      <description>If we compare languages by number of jobs offers, and take into account
just one site with job offers, we may think that:

Perl as good as java, python and PHP are way above

There are a few articles about growing popularity of open source and
languages like PHP and Python in corporate world. See cnet, o’rly and
gazeta (in Polish).

Until now, java and .NET seemed to be the most popular in corporate
world. Now is time for Python, PHP, Perl, and open source solutions. For
example Farmville, very popular online game, with million of users, is
said to run on LAMP stack.

There is also opinion that companies like Zend or ActiveState give
“corporate face” to open source. And yes, open source is not free (as
free beer) – you often have to (or are willing to) pay for support,
knowledge, contractors etc. (vide MySQL Enterprise).

But, returning to the title of this post – on the graph in cnet article-
you can see that there is the same amout of job offers for java and perl
developers, some more for .NET, much much more and rising for PHP and
even more (and rising more) for python.

Share and Enjoy: Print Digg del.icio.us Facebook Mixx Google Bookmarks
email LinkedIn MySpace Reddit RSS Slashdot StumbleUpon
Suggest to Techmeme via Twitter Technorati Twitter Twitthis
Yahoo! Bookmarks Yahoo! Buzz

See also:

  1. Perl – why not popular

  2. Perl is dead – or is it not?

  3. Inevitable parrot 2</description>
      <dc:date>2010-03-03T05:44:19+01:00</dc:date>
      <dc:subject>future perlisnotdead</dc:subject>
      <title>Perl as good as java, python and PHP way above</title>
      <pubDate>Wed, 03 Mar 2010 05:44:19 +0100</pubDate>
      <content:encoded>&lt;p&gt;If we compare languages by number of jobs offers, and take into account just one site with job offers, we may think that:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perl as good as java, python and PHP are way above&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are a few articles about growing popularity of open source and languages like PHP and Python in corporate world. See &lt;a href="http://news.cnet.com/8301-13505_3-10453213-16.html" target="_blank"&gt;cnet&lt;/a&gt;, &lt;a href="http://radar.oreilly.com/2009/07/open-source-is-infiltrating-th.html" target="_blank"&gt;o&amp;#8217;rly&lt;/a&gt; and &lt;a href="http://technologie.gazeta.pl/technologie/1,82008,7561902,Python_i_PHP_bez_kompleksow_wchodza_do_swiata_aplikacji.html" target="_blank"&gt;gazeta (in Polish)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Until now, java and .NET seemed to be the most popular in corporate world. Now is time for Python, PHP, Perl, and open source solutions. For example Farmville, very popular online game, with million of users, is said to run on LAMP stack.&lt;/p&gt;
&lt;p&gt;There is also opinion that companies like Zend or ActiveState give &amp;#8220;corporate face&amp;#8221; to open source. And yes, open source is not free (as free beer) &amp;#8211; you often have to (or are willing to) pay for support, knowledge, contractors etc. (vide MySQL Enterprise).&lt;/p&gt;
&lt;p&gt;But, returning to the title of this post &amp;#8211; on the graph in &lt;a href="http://news.cnet.com/8301-13505_3-10453213-16.html" target="_blank"&gt;cnet article&lt;/a&gt;- you can see that there is the same amout of job offers for java and perl developers, some more for .NET, much much more and rising for PHP and even more (and rising more) for python.&lt;/p&gt;



Share and Enjoy:


	&lt;a rel="nofollow" target="_blank" href="http://www.printfriendly.com/print?url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;partner=sociable" title="Print"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/printfriendly.png" alt="Print"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://digg.com/submit?phase=2&amp;amp;url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;bodytext=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la" title="Digg"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/digg.png" alt="Digg"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;notes=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la" title="del.icio.us"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/delicious.png" alt="del.icio.us"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;t=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="Facebook"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/facebook.png" alt="Facebook"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="Mixx"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/mixx.png" alt="Mixx"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;amp;bkmk=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;annotation=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la" title="Google Bookmarks"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/googlebookmark.png" alt="Google Bookmarks"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="mailto:?subject=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;body=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java" title="email"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/email_link.png" alt="email"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.linkedin.com/shareArticle?mini=true&amp;amp;url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;source=Perl+Perl%2C+CPAN%2C+YAPC...+et+ceatera&amp;amp;summary=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la" title="LinkedIn"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/linkedin.png" alt="LinkedIn"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.myspace.com/Modules/PostTo/Pages/?u=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;t=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="MySpace"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/myspace.png" alt="MySpace"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="Reddit"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/reddit.png" alt="Reddit"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://perl.baczynski.com/feed" title="RSS"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/rss.png" alt="RSS"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://slashdot.org/bookmark.pl?title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java" title="Slashdot"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/slashdot.png" alt="Slashdot"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;title=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="StumbleUpon"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/stumbleupon.png" alt="StumbleUpon"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://twitter.com/home/?status=tip%20@Techmeme%20http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java%20Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above" title="Suggest to Techmeme via Twitter"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/techmeme.png" alt="Suggest to Techmeme via Twitter"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://technorati.com/faves?add=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java" title="Technorati"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/technorati.png" alt="Technorati"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://twitter.com/home?status=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above%20-%20http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java" title="Twitter"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/twitter.png" alt="Twitter"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="" title="Twitthis"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/" alt="Twitthis"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://bookmarks.yahoo.com/toolbar/savebm?u=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;t=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;opener=bm&amp;amp;ei=UTF-8&amp;amp;d=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la" title="Yahoo! Bookmarks"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/yahoomyweb.png" alt="Yahoo! Bookmarks"&gt;&lt;/a&gt;
	&lt;a rel="nofollow" target="_blank" href="http://buzz.yahoo.com/submit/?submitUrl=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-good-as-java&amp;amp;submitHeadline=Perl%20as%20good%20as%20java%2C%20python%20and%20PHP%20way%20above&amp;amp;submitSummary=If%20we%20compare%20languages%20by%20number%20of%20jobs%20offers%2C%20and%20take%20into%20account%20just%20one%20site%20with%20job%20offers%2C%20we%20may%20think%20that%3A%0D%0A%0D%0APerl%20as%20good%20as%20java%2C%20python%20and%20PHP%20are%20way%20above%0D%0A%0D%0AThere%20are%20a%20few%20articles%20about%20growing%20popularity%20of%20open%20source%20and%20la&amp;amp;submitCategory=science&amp;amp;submitAssetType=text" title="Yahoo! Buzz"&gt;&lt;img src="http://perl.baczynski.com/wp-content/plugins/sociable/images/yahoobuzz.png" alt="Yahoo! Buzz"&gt;&lt;/a&gt;


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

&lt;p&gt;See also:&lt;ol&gt;&lt;li&gt;&lt;a href="http://perl.baczynski.com/future/perl-why-not-popular" rel="bookmark" title="Permanent Link: Perl &amp;ndash; why not popular"&gt;Perl &amp;#8211; why not popular&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl.baczynski.com/future/perl-is-dead-not" rel="bookmark" title="Permanent Link: Perl is dead &amp;ndash; or is it not?"&gt;Perl is dead &amp;#8211; or is it not?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl.baczynski.com/perl-6/inevitable-parrot-2" rel="bookmark" title="Permanent Link: Inevitable parrot 2"&gt;Inevitable parrot 2&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;</content:encoded>
      <dcterms:modified>2010-03-03T05:44:19+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://perl.baczynski.com/?p=242</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/set-phasers-to-stun.html</link>
      <description>Did you ever wonder how BEGIN, CHECK, END and so on are called in Perl?
Well, they didn't have a good name, until recently.

The Perl 6 spec listed them under closure traits, which is unwieldy, and
not really exact either. Now they are called phasers, because they tell
you which execution phase the block or statement runs in.

There are so many possible puns that I'll refrain from writing any.</description>
      <title>Set Phasers to Stun!</title>
      <content:encoded>

&lt;p&gt;Did you ever wonder how &lt;code&gt;BEGIN&lt;/code&gt;, &lt;code&gt;CHECK&lt;/code&gt;,
&lt;code&gt;END&lt;/code&gt; and so on are called in Perl? Well, they didn't have a good
name, until &lt;a href="http://irclog.perlgeek.de/perl6/2009-11-06#i_1695188"&gt;recently&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Perl 6 spec listed them under &lt;em&gt;closure traits&lt;/em&gt;, which is
unwieldy, and not really exact either. &lt;a href="http://perlcabal.org/svn/pugs/revision/?rev=29004"&gt;Now they are called
&lt;em&gt;phasers&lt;/em&gt;&lt;/a&gt;, because they tell you which execution phase the block or
statement runs in.