<?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>Sat, 13 Mar 2010 05:26:48 -0000</pubDate>
    <item>
      <author>nobody@example.com (chromatic)</author>
      <dc:creator>nobody@example.com (chromatic)</dc:creator>
      <category>modern perl perl 5 perl 6 perl programming teaching</category>
      <link>http://www.modernperlbooks.com/mt/2010/03/learning-to-fail-to-learn.html</link>
      <description>I've been writing about Moose in the Modern Perl book draft recently.
Moose is clearly the right way to teach object orientation in the context
of Perl 5, and I've enjoyed how Moose makes doing the right thing easy.

Yesterday I explained inheritance in the context of Moose and Perl 5 OO.

I'd already explained Perl roles. If I didn't have to acknowledge that
people reading the book will eventually run across legacy code, I could
happily gloss over inheritance as an idea that turns out to be much less
useful than it first appears. I suspect that inheritance seems great to
OO novices because it's spectacular and interesting: code appears
seemingly for free out of nowhere! That's easy to understand, while the
subtle utility of polymorphism and parametric polymorphism require you to
have struggled with the problems they solve so you understand their
value.

Would so many of us appreciate Moose if we hadn't wasted so much time
doing things the hard way?

I spend a lot of time thinking about how to teach people to appreciate
and to understand modern Perl in ways that do not lead them down the dark
alleys and bumpy roads where I had to learn to program the hard way. I'm
very stubborn, and I'm perfectly comfortable taking apart something to
figure out how it works. (The people who fix bugs in your favorite
programming languages likely share this trait.)

I don't believe that attribute is a necessary precondition for learning
to program well.

However, I do wonder if it's more difficult to understand the value of a
non-obvious system until you realize the drawbacks of the system you do
understand. I've seen novices insist that they absolutely must use
symbolic references instead of hashes, or that manual iteration instead
of list transformation is so much easier, or what have you that I wonder
about the diactic value of trying to show people the best general
approach as I understand it now first, then mentioning other ways that
aren't as good.

Consider an example. I know better ways to write Test::Builder because
I've implemented it three times now, in Perl 5, Perl 6, and PIR. I like
to think I'd have listened if someone suggested infelicities in its
original design, but only the experience of implementing and using it
helped me to understand what it really needed to do.

I wonder. Is it possible to teach Perl 5 in such a way that novices don't
have to suffer all of the miscues that the rest of us have in the past
decade? If so, how do I do that? (If not, what does that imply about new
adoption of Perl 5 and adoption of Perl 6 in general?)

Maybe I'm conflating learning a language with learning how to design
programs—but how do you separate the two when your goal is merely to
teach people how to solve problems?</description>
      <dc:date>2010-03-12T22:41:26Z</dc:date>
      <dc:subject>modern perl perl 5 perl 6 perl programming teaching</dc:subject>
      <title>Learning to Fail to Learn</title>
      <pubDate>Fri, 12 Mar 2010 22:41:26 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;I've been writing about &lt;a href="http://moose.perl.org/"&gt;Moose&lt;/a&gt; in the &lt;a href="http://github.com/chromatic/modern_perl_book/"&gt;Modern Perl book draft&lt;/a&gt; recently.  Moose is clearly the right way to teach object orientation in the context of Perl 5, and I've enjoyed how Moose makes doing the right thing easy.&lt;/p&gt;

&lt;p&gt;Yesterday I explained inheritance in the context of Moose and Perl 5 OO.&lt;/p&gt;

&lt;p&gt;I'd already explained &lt;a href="http://www.modernperlbooks.com/mt/2009/04/the-why-of-perl-roles.html"&gt;Perl roles&lt;/a&gt;.  If I didn't have to acknowledge that people reading the book will eventually run across legacy code, I could happily gloss over inheritance as an idea that turns out to be much less useful than it first appears.  I suspect that inheritance seems great to OO novices because it's spectacular and interesting: code appears seemingly for free out of nowhere!  That's easy to understand, while the subtle utility of polymorphism and parametric polymorphism require you to have struggled with the problems they solve so you understand their value.&lt;/p&gt;

&lt;p&gt;Would so many of us appreciate Moose if we hadn't wasted so much time doing things the hard way?&lt;/p&gt;

&lt;p&gt;I spend a lot of time thinking about how to teach people to appreciate and to understand modern Perl in ways that do not lead them down the dark alleys and bumpy roads where I had to learn to program the hard way.  I'm very stubborn, and I'm perfectly comfortable taking apart something to figure out how it works.  (The people who fix bugs in your favorite programming languages likely share this trait.)&lt;/p&gt;

&lt;p&gt;I don't believe that attribute is a necessary precondition for learning to program well.&lt;/p&gt;

&lt;p&gt;However, I do wonder if it's more difficult to understand the value of a
non-obvious system until you realize the drawbacks of the system you do
understand.  I've seen novices insist that they absolutely must use symbolic
references instead of hashes, or that manual iteration instead of list
transformation is so much easier, or what have you that I wonder about the
diactic value of trying to show people the best general approach as I
understand it now first, then mentioning other ways that aren't as good.&lt;/p&gt;

&lt;p&gt;Consider an example.  I &lt;em&gt;know&lt;/em&gt; better ways to write &lt;a href="http://search.cpan.org/perldoc?Test::Builder"&gt;Test::Builder&lt;/a&gt; because
I've implemented it three times now, in Perl 5, Perl 6, and PIR.  I like to
think I'd have listened if someone suggested infelicities in its original
design, but only the experience of implementing and using it helped me to
understand what it really needed to do.&lt;/p&gt;

&lt;p&gt;I wonder.  Is it possible to teach Perl 5 in such a way that novices don't
have to suffer all of the miscues that the rest of us have in the past decade?
If so, how do I do that?  (If not, what does that imply about new adoption of
Perl 5 and adoption of Perl 6 in general?)&lt;/p&gt;

&lt;p&gt;Maybe I'm conflating learning a language with learning how to design
programs&amp;mdash;but how do you separate the two when your goal is merely to
teach people how to solve problems?&lt;/p&gt;

        
    </content:encoded>
      <dcterms:modified>2010-03-12T22:41:26Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.modernperlbooks.com,2010:/mt//1.160</guid>
    </item>
    <item>
      <author>nobody@example.com (codeholic)</author>
      <dc:creator>nobody@example.com (codeholic)</dc:creator>
      <category>pm simpsons futurama perl</category>
      <link>http://ru.ivan.fomichev.name/2010/03/perl-in-springfield.html</link>
      <description>New New York

Интересно, кто в Спрингфилде программирует на Perl? Барт? Лиза? Или,
может быть, Мо? Ждем появления NewNewYork.pm.</description>
      <dc:date>2010-03-12T18:46:00Z</dc:date>
      <dc:subject>pm simpsons futurama perl</dc:subject>
      <title>Perl in Springfield</title>
      <pubDate>Fri, 12 Mar 2010 18:46:00 -0000</pubDate>
      <content:encoded>&lt;div&gt;&lt;img src="http://files.ivan.fomichev.name/images/futurama.jpg" alt="New New York"&gt;&lt;/div&gt;&lt;p&gt;Интересно, кто в Спрингфилде &lt;a href="http://springfield.pm.org/"&gt;программирует на Perl&lt;/a&gt;? Барт? Лиза? Или, может быть, Мо? Ждем появления &lt;a href="http://en.wikipedia.org/wiki/Futurama#Setting"&gt;NewNewYork.pm&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-12T18:46:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-7773842696592603324.post-7588258573225746002</guid>
    </item>
    <item>
      <author>nobody@example.com (ReneeB)</author>
      <dc:creator>nobody@example.com (ReneeB)</dc:creator>
      <category>CeBIT2010 CeBIT</category>
      <link>http://reneeb-perlblog.blogspot.com/2010/03/nachtrag-zur-cebit-video-mit-gabor.html</link>
      <description>Gábor wurde auf der CeBIT vom Linux Magazin interviewed. Neben ein paar
allgemeinen Fragen kam natürlich auch die Frage nach Perl 6 auf. Ich
finde seine Antwort sehr sehr gut!

Schaut es euch einfach an:
http://www.linux-magazin.de/NEWS/Video-Perl-Projekt-gibt-sich-die-Ehre

Vielleicht habe ich Glück und mein Vortrag wird bei RadioTux noch
veröffentlicht. Von den meisten anderen Vorträgen sind die Aufnahmen
schon online. Ob es von meinem Vortrag eine Aufnahme gibt, weiß ich
nicht.</description>
      <dc:date>2010-03-12T12:11:00Z</dc:date>
      <dc:subject>CeBIT2010 CeBIT</dc:subject>
      <title>Nachtrag zur CeBIT - Video mit Gábor online</title>
      <pubDate>Fri, 12 Mar 2010 12:11:00 -0000</pubDate>
      <content:encoded>Gábor wurde auf der CeBIT vom Linux Magazin interviewed. Neben ein paar allgemeinen Fragen kam natürlich auch die Frage nach Perl 6 auf. Ich finde seine Antwort sehr sehr gut!&lt;br /&gt;&lt;br /&gt;Schaut es euch einfach an: &lt;a href="http://www.linux-magazin.de/NEWS/Video-Perl-Projekt-gibt-sich-die-Ehre"&gt;http://www.linux-magazin.de/NEWS/Video-Perl-Projekt-gibt-sich-die-Ehre&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vielleicht habe ich Glück und mein Vortrag wird bei RadioTux noch veröffentlicht. Von den meisten anderen Vorträgen sind die Aufnahmen schon online. Ob es von meinem Vortrag eine Aufnahme gibt, weiß ich nicht.&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-12T12:11:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-31159397.post-4323127805332883537</guid>
    </item>
    <item>
      <author>nobody@example.com (ReneeB)</author>
      <dc:creator>nobody@example.com (ReneeB)</dc:creator>
      <category>Devel::Cover CGI</category>
      <link>http://reneeb-perlblog.blogspot.com/2010/03/develcover-fur-cgi-programme.html</link>
      <description>Devel::Cover ist ein super Tool, mit dem man prüfen kann, ob die
Testsuite für ein Programm/Modul wirklich den gesamten Code testet. 100%
Abdeckung zu erreichen ist äußerst schwierig. Und selbst bei 98%
Testabdeckung heißt es nicht, dass in der Software keine Fehler mehr sind
- wie Curtis 'Ovid' Poe diese Woche feststellen musste.

Devel::Cover misst die Abdeckung für verschiedene Sachen:

  * Statements

  * Branches

  * Conditions

  * POD

  * Subroutines

100% Abdeckung bei Statements sagt nicht besonders viel aus. Nimmt man
als Beispiel "print 'yes' if $x || $y", dann kann man 100% erreichen,
indem man $x einen "wahren" Wert gibt. Aber man hier nicht alle Fälle
getestet.

Am meisten nutze ich die Abdeckung der "Conditions". Da hier von
Devel::Cover alle Kombinationen von Bedingungen angezeigt werden und ob
man das getestet hat. Hier kann man noch große Lücken in den Tests
aufdecken:


Zu genau will ich hier aber gar nicht auf Devel::Cover eingehen.

Man braucht nicht immer eine Testsuite, um mit dem Tool etwas sinnvolles
zu tun. Gestern wurde ich gefragt, ob und wie man einfache CGI-Programme
damit überprüfen kann. Hintergrund ist der, dass unnötiger Code
identifiziert werden sollte, damit das aufgeblähte Skript etwas
zusammengeschrumpft werden kann.

Das CGI-Skript braucht keine Parameter, so dass ein einziger Durchlauf
reicht, um unnötigen Code zu identifizieren. Bei etwas komplexeren
Skripten muss man mehrere Läufe mit unterschiedlichen Bedingungen
starten.

Mit zwei zusätzlichen Zeilen in der Apache-Config kann man Devel::Cover
für alle CGI-Skripte aktivieren:

SetEnv DEVEL_COVER_OPTIONS "-ignore,CGI,-silent,1"
SetEnv PERL5OPT "-MDevel::Cover"



Und für ein einziges Skript fügt man diese Zeile in das Skript ein:

use Devel::Cover qw(-ignore CGI -silent 1);



Mit PERL5OPT kann man dem Perl-Interpreterer Optionen mitgeben. In diesem
Fall ist das "-MDevel::Cover", was bewirkt, dass Devel::Cover eingebunden
wird. Die Optionen für Devel::Cover sagen folgendes aus:

  -ignore,CGI =&gt; Erstelle für Dateien, die CGI im Namen/Pfad haben
  keine Auswertung
  -silent,1 =&gt; Mache keine Ausgaben

Vor allem letztere Option ist wichtig, da sonst ein "Premature end of
header" kommt. Devel::Ignore gibt nämlich eine Auswertung auf STDOUT aus,
bevor das Skript einen Header senden konnte. Ist das ausgeschaltet,
erstellt Devel::Cover einfach nur die Datenbank, die dann in HTML
umgewandelt werden kann.</description>
      <dc:date>2010-03-12T08:48:00Z</dc:date>
      <dc:subject>Devel::Cover CGI</dc:subject>
      <title>Devel::Cover für CGI-Programme</title>
      <pubDate>Fri, 12 Mar 2010 08:48:00 -0000</pubDate>
      <content:encoded>&lt;a href="http://search.cpan.org/dist/Devel-Cover"&gt;Devel::Cover&lt;/a&gt; ist ein super Tool, mit dem man prüfen kann, ob die Testsuite für ein Programm/Modul wirklich den gesamten Code testet. 100% Abdeckung zu erreichen ist äußerst schwierig. Und selbst bei 98% Testabdeckung heißt es nicht, dass in der Software keine Fehler mehr sind - wie &lt;a href="http://blogs.perl.org/users/ovid/2010/03/100-test-coverage.html"&gt;Curtis 'Ovid' Poe diese Woche feststellen musste&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Devel::Cover misst die Abdeckung für verschiedene Sachen:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Statements&lt;/li&gt;&lt;li&gt;Branches&lt;/li&gt;&lt;li&gt;Conditions&lt;/li&gt;&lt;li&gt;POD&lt;/li&gt;&lt;li&gt;Subroutines&lt;/li&gt;&lt;/ul&gt;100% Abdeckung bei Statements sagt nicht besonders viel aus. Nimmt man als Beispiel "&lt;tt&gt;print 'yes' if $x || $y&lt;/tt&gt;", dann kann man 100% erreichen, indem man &lt;tt&gt;$x&lt;/tt&gt; einen "wahren" Wert gibt. Aber man hier nicht alle Fälle getestet.&lt;br /&gt;&lt;br /&gt;Am meisten nutze ich die Abdeckung der "Conditions". Da hier von Devel::Cover alle Kombinationen von Bedingungen angezeigt werden und ob man das getestet hat. Hier kann man noch große Lücken in den Tests aufdecken:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://renee-baecker.de/images/Conditions.png"&gt;&lt;img src="http://renee-baecker.de/images/Conditions.png" alt=""&gt;&lt;/a&gt;&lt;br /&gt;Zu genau will ich hier aber gar nicht auf Devel::Cover eingehen.&lt;br /&gt;&lt;br /&gt;Man braucht nicht immer eine Testsuite, um mit dem Tool etwas sinnvolles zu tun. Gestern wurde ich gefragt, ob und wie man einfache CGI-Programme damit überprüfen kann. Hintergrund ist der, dass unnötiger Code identifiziert werden sollte, damit das aufgeblähte Skript etwas zusammengeschrumpft werden kann.&lt;br /&gt;&lt;br /&gt;Das CGI-Skript braucht keine Parameter, so dass ein einziger Durchlauf reicht, um unnötigen Code zu identifizieren. Bei etwas komplexeren Skripten muss man mehrere Läufe mit unterschiedlichen Bedingungen starten.&lt;br /&gt;&lt;br /&gt;Mit zwei zusätzlichen Zeilen in der Apache-Config kann man Devel::Cover für alle CGI-Skripte aktivieren:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;SetEnv DEVEL_COVER_OPTIONS "-ignore,CGI,-silent,1"&lt;br /&gt;SetEnv PERL5OPT "-MDevel::Cover"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Und für ein einziges Skript fügt man diese Zeile in das Skript ein:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;use Devel::Cover qw(-ignore CGI -silent 1);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Mit &lt;tt&gt;PERL5OPT&lt;/tt&gt; kann man dem Perl-Interpreterer Optionen mitgeben. In diesem Fall ist das &lt;tt&gt;"-MDevel::Cover"&lt;/tt&gt;, was bewirkt, dass Devel::Cover eingebunden wird. Die Optionen für Devel::Cover sagen folgendes aus:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;-ignore,CGI =&amp;gt; Erstelle für Dateien, die CGI im Namen/Pfad haben keine Auswertung&lt;br /&gt;-silent,1 =&amp;gt; Mache keine Ausgaben&lt;/blockquote&gt;Vor allem letztere Option ist wichtig, da sonst ein "Premature end of header" kommt. Devel::Ignore gibt nämlich eine Auswertung auf &lt;span&gt;STDOUT&lt;/span&gt; aus, bevor das Skript einen Header senden konnte. Ist das ausgeschaltet, erstellt Devel::Cover einfach nur die Datenbank, die dann in HTML umgewandelt werden kann.&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-12T08:48:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-31159397.post-1808651093032613493</guid>
    </item>
    <item>
      <author>nobody@example.com (ash)</author>
      <dc:creator>nobody@example.com (ash)</dc:creator>
      <category>Версии Perl Язык 5.10 5.10.1 cpan perl</category>
      <link>http://onperl.ru/onperl/2010/03/perl-510-v-2010-m-chast--chasti-iii.html</link>
      <description>Часть III
Как пишут другие
----------------

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


Как включить режим Perl 5.10

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

Cпособы, которыми пользуются авторы, как нельзя лучше демоснтрируют
принцип TIMTOWTDI:

use 5.010000;
use 5.01001;
use 5.010;
use 5.010_000;
use 5.10.0;
use v5.10.0;
use v5.10;
use feature ':5.10';

Строки, начинающиеся с буквы v, либо содержащие две точки, называются
v-string (version string или, иногда, vector string). При объявлении
версии интерпретатора следущие варианты эквивалентны.

5.10.0
v5.10.0
v5.10

Обратите внимание, если при указании версии используется обычное число (с
одной десятичной точкой), то следует писать не 5.10, а 5.010.


say для отладки

Функцию say удобно использовать во время отладки программы для вывода
промежуточных значений переменных. На CPAN можно найти следы такой
отладки — закомментированный вызов say.

given ($action) {
    when (/^include_cmd:/) {
        my $cmd = $child-&gt;content;
        $cmd =~ /^include_cmd:(\s*)/;
        my $ws = $1 || '';
        $cmd =~ s/^include_cmd:\s*//;
        #say("cmd:$ws$cmd");
        $cmd = cwd() . '/' . $cmd;
        @output = qx($cmd);
        $child-&gt;content($ws . join($ws, @output));
    }

Pod::Elemental::Transformer::Include — 08 Jan 2010
include output via files and commands

(Здесь и далее рядом с примером кода указано название модуля, откуда взят
пример, дата выхода его первой версии и авторское описание; пунктуация,
отступы и пробелы в коде в большинстве случаев сохранены.)


// и //= для значений по умолчанию

Пожалуй, самое распространенное применение оператора defined-or —
установка значений по умолчанию.

В частности, удобно пользоваться вариантом с присвоением.

$port //=  5432;
$host //= 'localhost';

$col  //= '';

Pg::Loader — 07 Jul 2008
Perl extension for loading Postgres tables

$attrz{ maxjob  } //= 1;
$value //= 1;

$attrz{ $_ } //= 0;
$attrz{ verbose } //= '';
$attrz{ debug   } //= '';
$val //= 1;
$exit //= 0;
$skipz-&gt;{ $job_id } //= 'Skip on SIGHUP'

Parallel::Depend — 12 Aug 2009
Parallel-dependent dispatch of perl or shell code

Чуть более сложный пример — с обращением к встроенной функции:

sub import   {
    shift;
    my %args = @_;
    # we do not care about autoviv
    $^H{fixedtime} = $args{epoch_offset} // 
                     CORE::time;
}

fixedtime — 14 Aug 2008
lexical pragma to fix the epoch offset for time related functions

Defined-or используют и непосредственно при передаче аргументов функциям.

say $answer //      "I don't know enough to answer you yet.";

Hailo — 29 Jan 2010
A pluggable Markov engine analogous to MegaHAL

Следует обратить внимание, что оператор возможно использовать не только с
истинными скалярами.

my $marpa_version  =  $Parse::Marpa::VERSION // 'undef';
my $source_version =  $Parse::Marpa::Source::VERSION // 'undef';

$options //= {};

Parse::Marpa — 14 Dec 2008
Generate Parsers from any BNF grammar

В следующем примере помимо многократного использования // интересно
отметить, что say передается файловый дескриптор.

my $nulling_symbol =
  $rhs_symbol-&gt;[Parse::Marpa::Internal::Symbol::NULL_ALIAS] // $rhs_symbol;

$action //= $default_action;

say {$trace_fh}
    'Problems compiling action for original rule: ',
    Parse::Marpa::brief_original_rule($rule);

my $clone = $clone_arg // 1;
my $current_parse_set = $parse_set_arg // $default_parse_set;

$choice //= 0;

$lines //= [0];
$source_options //= {};

Parse::Marpa::Internal::Evaluator — 14 Dec 2008
Generate Parsers from any BNF grammar

Наконец, и сам файловый дескриптор удобно вписывается в работу с
defined-or:

my $trace_fh = $arg_trace_fh // (*STDERR);

my $trace_fh = shift;
$trace_fh //= *STDERR;

Parse::Marpa::Recognizer — 14 Dec 2008
Generate Parsers from any BNF grammar


// внутри return

Оператор defined-or часто встречается внутри вызова return, опять же
чтобы вернуть определенное значение, если оно не получено на предыдущих
шагах.

return $self-&gt;_get_infection( $disease-&gt;id ) // 0;

my $val = $self-&gt;_get($key) // $default-&gt;{$key};


return @{ $self-&gt;_players // [] };

Games::Pandemic::City, Games::Pandemic::Config — 07 Sep 2009
Games::Risk — 18 Oct 2008

Иногда в одном из операндов // вызывают фукнции, которые могут привести к
досрочному завершению программы или выходу из блока.

sub homedir {
  my ($self) = @_;
  require File::HomeDir;
  return File::HomeDir-&gt;my_home
    // croak 'File::HomeDir says you have no home
              directory';
}

App::RSS2Leafnode — 02 Feb 2010
post RSS feeds to newsgroups

А вот пример, когда операндом является целый блок кода do:

sub config_filename {
  my ($self) = @_;
  return $self-&gt;{'config_filename'} // do {
    require File::Spec;
    File::Spec-&gt;catfile ($self-&gt;homedir, '.rss2leafnode.conf');
  };
}

App::RSS2Leafnode — 02 Feb 2010
post RSS feeds to newsgroups

В частных случаях // действует лишь внутри части выражения, передаваемое
return.

return  isodate_to_rfc822($date // $self-&gt;{'now822'});

return URI::Title::title
    ({ url  =&gt; ($resp-&gt;request-&gt;uri // ''),
       data =&gt; $resp-&gt;decoded_content   (charset =&gt; 'none')});

App::RSS2Leafnode — 02 Feb 2010
post RSS feeds to newsgroups


return внутри //

Весьма распространена и противоположная конструкция, когда в одном из
плеч // делают попытку возврата из подпрограммы.

my $b_time = $self-&gt;item_to_timet($b_item)
   // return $a_item;

my $a_time = $self-&gt;item_to_timet($a_item) 
   // return $b_item;;

my $str = $self-&gt;item_to_date($item) 
   // return;

App::RSS2Leafnode — 02 Feb 2010
post RSS feeds to newsgroups

// легко объединяется в цепочку, поэтому возможно написать конструкцию,
которая делает несколько попыток присвоить defined-значение:

return (elt_to_email ($item-&gt;first_child('author'))
        // elt_to_email ($item   -&gt;first_child('dc:creator'))
        // elt_to_email ($item   -&gt;first_child('dc:contributor'))
        // non_empty ($item-&gt;first_child_text('wiki:username'))

        // elt_to_email ($channel-&gt;first_child('dc:creator'))
        // elt_to_email ($channel-&gt;first_child('author'))
        // elt_to_email ($channel-&gt;first_child('managingEditor'))
        // elt_to_email ($channel-&gt;first_child('webMaster'))

        // elt_to_email ($item   -&gt;first_child('dc:publisher'))
        // elt_to_email ($channel-&gt;first_child('dc:publisher'))

        // non_empty ($channel-&gt;first_child_text('title'))

        # RFC822
        // 'nobody@'.$self-&gt;uri_to_host
       );

App::RSS2Leafnode — 02 Feb 2010
post RSS feeds to newsgroups

Возможен и подход, при котором возвращается одна-единственная переменная,
которая перед этим проходит через несколько проверок с оператором
defined-or:

sub item_to_language {
  my ($self, $item) = @_;
  my $content;
  my $ret = (elt_to_language($item)
             // elt_to_language($item-&gt;first_child('content')));
  for (;;) {
    $item = $item-&gt;parent // last;
    $ret //= elt_to_language($item);
  }
  $ret //= $self-&gt;{'resp'}-&gt;content_language;
  return $ret;
}

App::RSS2Leafnode — 02 Feb 2010
post RSS feeds to newsgroups


Несколько //

Объединение в цепочку нам уже встречалось, однако на нем следует
задержать внимание еще раз.

my $captures    = $arg {captures}       // [];
my $comment     = escape $arg {comment} // $name // "";
my $upgrade     = $arg {utf8_upgrade}   // 1;
my $downgrade   = $arg {utf8_downgrade} // 1;
my $match       = $arg {match}          // 1;

Games::Wumpus — 24 Nov 2009
Play Hunt the Wumpus


Продолжение будет.</description>
      <dc:date>2010-03-12T08:35:18+01:00</dc:date>
      <dc:subject>Версии Perl Язык 5.10 5.10.1 cpan perl</dc:subject>
      <title>Perl 5.10 в 2010-м — первая часть части III</title>
      <pubDate>Fri, 12 Mar 2010 08:35:18 +0100</pubDate>
      <content:encoded>
        &lt;h2&gt;Часть III&lt;br /&gt;Как пишут другие&lt;/h2&gt;
&lt;p&gt;В этом разделе собраны и сгруппированы примеры использования новых возможностей Perl 5.10, которые встречаются в модулях на CPAN.&lt;/p&gt;
&lt;h3&gt;Как включить режим Perl 5.10&lt;/h3&gt;
&lt;p&gt;Поскольку новые ключевые слова могут сделать программу несовместимой с предыдущими версиями компилятора, необходимо дать явные указания, чтобы активировать соответствующие фичи Perl 5.10.&lt;/p&gt;
&lt;p&gt;Cпособы, которыми пользуются авторы, как нельзя лучше демоснтрируют принцип TIMTOWTDI:&lt;/p&gt;&lt;pre&gt;use 5.010000;
use 5.01001;
use 5.010;
use 5.010_000;
use 5.10.0;
use v5.10.0;
use v5.10;
use feature ':5.10';&lt;/pre&gt;
&lt;p&gt;Строки, начинающиеся с буквы v, либо содержащие две точки, называются v-string (version string или, иногда, vector string). При объявлении версии интерпретатора следущие варианты эквивалентны.&lt;/p&gt;&lt;pre&gt;5.10.0
v5.10.0
v5.10&lt;/pre&gt;
&lt;p&gt;Обратите внимание, если при указании версии используется обычное число (с одной десятичной точкой), то следует писать не 5.10, а 5.010.&lt;/p&gt;
&lt;h3&gt;say для отладки&lt;/h3&gt;
&lt;p&gt;Функцию say удобно использовать во время отладки программы для вывода промежуточных значений переменных. На CPAN можно найти следы такой отладки —&amp;nbsp;закомментированный вызов say.&lt;/p&gt;&lt;pre&gt;given ($action) {
    when (/^include_cmd:/) {
        my $cmd = $child-&amp;gt;content;
        $cmd =~ /^include_cmd:(\s*)/;
        my $ws = $1 || '';
        $cmd =~ s/^include_cmd:\s*//;
        #say("cmd:$ws$cmd");
        $cmd = cwd() . '/' . $cmd;
        @output = qx($cmd);
        $child-&amp;gt;content($ws . join($ws, @output));
    }&lt;/pre&gt;
&lt;p&gt;Pod::Elemental::Transformer::Include — 08 Jan 2010&lt;br /&gt;include output via files and commands&lt;/p&gt;
&lt;p&gt;(Здесь и далее рядом с примером кода указано название модуля, откуда взят пример, дата выхода его первой версии и авторское описание; пунктуация, отступы и пробелы в коде в большинстве случаев сохранены.)&lt;/p&gt;
&lt;h3&gt;// и //= для значений по умолчанию&lt;/h3&gt;
&lt;p&gt;Пожалуй, самое распространенное применение оператора defined-or — установка значений по умолчанию.&lt;/p&gt;
&lt;p&gt;В частности, удобно пользоваться вариантом с присвоением.&lt;/p&gt;&lt;pre&gt;$port //=  5432;
$host //= 'localhost';

$col  //= '';&lt;/pre&gt;
&lt;p&gt;Pg::Loader — 07 Jul 2008&lt;br /&gt;Perl extension for loading Postgres tables&lt;/p&gt;&lt;pre&gt;$attrz{ maxjob  } //= 1;
$value //= 1;

$attrz{ $_ } //= 0;
$attrz{ verbose } //= '';
$attrz{ debug   } //= '';
$val //= 1;
$exit //= 0;
$skipz-&amp;gt;{ $job_id } //= 'Skip on SIGHUP'&lt;/pre&gt;
&lt;p&gt;Parallel::Depend — 12 Aug 2009&lt;br /&gt;Parallel-dependent dispatch of perl or shell code&lt;/p&gt;
&lt;p&gt;Чуть более сложный пример —&amp;nbsp;с обращением к встроенной функции:&lt;/p&gt;&lt;pre&gt;sub import   {
    shift;
    my %args = @_;
    # we do not care about autoviv
    $^H{fixedtime} = $args{epoch_offset} // 
                     CORE::time;
}&lt;/pre&gt;
&lt;p&gt;fixedtime — 14 Aug 2008&lt;br /&gt;lexical pragma to fix the epoch offset for time related functions&lt;/p&gt;
&lt;p&gt;Defined-or используют и непосредственно при передаче аргументов функциям.&lt;/p&gt;&lt;pre&gt;say $answer //      "I don't know enough to answer you yet.";&lt;/pre&gt;
&lt;p&gt;Hailo — 29 Jan 2010&lt;br /&gt;A pluggable Markov engine analogous to MegaHAL&lt;/p&gt;
&lt;p&gt;Следует обратить внимание, что оператор возможно использовать не только с истинными скалярами.&lt;/p&gt;&lt;pre&gt;my $marpa_version  =  $Parse::Marpa::VERSION // 'undef';
my $source_version =  $Parse::Marpa::Source::VERSION // 'undef';

$options //= {};&lt;/pre&gt;
&lt;p&gt;Parse::Marpa — 14 Dec 2008&lt;br /&gt;Generate Parsers from any BNF grammar&lt;/p&gt;
&lt;p&gt;В следующем примере помимо многократного использования &lt;tt&gt;//&lt;/tt&gt; интересно отметить, что say передается файловый дескриптор.&lt;/p&gt;&lt;pre&gt;my $nulling_symbol =
  $rhs_symbol-&amp;gt;[Parse::Marpa::Internal::Symbol::NULL_ALIAS] // $rhs_symbol;

$action //= $default_action;

say {$trace_fh}
    'Problems compiling action for original rule: ',
    Parse::Marpa::brief_original_rule($rule);

my $clone = $clone_arg // 1;
my $current_parse_set = $parse_set_arg // $default_parse_set;

$choice //= 0;

$lines //= [0];
$source_options //= {};&lt;/pre&gt;
&lt;p&gt;Parse::Marpa::Internal::Evaluator — 14 Dec 2008&lt;br /&gt;Generate Parsers from any BNF grammar&lt;/p&gt;
&lt;p&gt;Наконец, и сам файловый дескриптор удобно вписывается в работу с defined-or:&lt;/p&gt;&lt;pre&gt;my $trace_fh = $arg_trace_fh // (*STDERR);

my $trace_fh = shift;
$trace_fh //= *STDERR;&lt;/pre&gt;
&lt;p&gt;Parse::Marpa::Recognizer — 14 Dec 2008&lt;br /&gt;Generate Parsers from any BNF grammar&lt;/p&gt;
&lt;h3&gt;// внутри return&lt;/h3&gt;
&lt;p&gt;Оператор defined-or часто встречается внутри вызова return, опять же чтобы вернуть определенное значение, если оно не получено на предыдущих шагах.&lt;/p&gt;&lt;pre&gt;return $self-&amp;gt;_get_infection( $disease-&amp;gt;id ) // 0;

my $val = $self-&amp;gt;_get($key) // $default-&amp;gt;{$key};


return @{ $self-&amp;gt;_players // [] };&lt;/pre&gt;
&lt;p&gt;Games::Pandemic::City, Games::Pandemic::Config — 07 Sep 2009&lt;br /&gt;Games::Risk — 18 Oct 2008&lt;/p&gt;
&lt;p&gt;Иногда в одном из операндов &lt;tt&gt;//&lt;/tt&gt; вызывают фукнции, которые могут привести к досрочному завершению программы или выходу из блока.&lt;/p&gt;&lt;pre&gt;sub homedir {
  my ($self) = @_;
  require File::HomeDir;
  return File::HomeDir-&amp;gt;my_home
    // croak 'File::HomeDir says you have no home
              directory';
}&lt;/pre&gt;
&lt;p&gt;App::RSS2Leafnode — 02 Feb 2010&lt;br /&gt;post RSS feeds to newsgroups&lt;/p&gt;
&lt;p&gt;А вот пример, когда операндом является целый блок кода &lt;tt&gt;do&lt;/tt&gt;:&lt;/p&gt;&lt;pre&gt;sub config_filename {
  my ($self) = @_;
  return $self-&amp;gt;{'config_filename'} // do {
    require File::Spec;
    File::Spec-&amp;gt;catfile ($self-&amp;gt;homedir, '.rss2leafnode.conf');
  };
}&lt;/pre&gt;
&lt;p&gt;App::RSS2Leafnode — 02 Feb 2010&lt;br /&gt;post RSS feeds to newsgroups&lt;/p&gt;
&lt;p&gt;В частных случаях &lt;tt&gt;//&lt;/tt&gt; действует лишь внутри части выражения, передаваемое &lt;tt&gt;return&lt;/tt&gt;.&lt;/p&gt;&lt;pre&gt;return  isodate_to_rfc822($date // $self-&amp;gt;{'now822'});

return URI::Title::title
    ({ url  =&amp;gt; ($resp-&amp;gt;request-&amp;gt;uri // ''),
       data =&amp;gt; $resp-&amp;gt;decoded_content   (charset =&amp;gt; 'none')});&lt;/pre&gt;
&lt;p&gt;App::RSS2Leafnode — 02 Feb 2010&lt;br /&gt;post RSS feeds to newsgroups&lt;/p&gt;
&lt;h3&gt;return внутри //&lt;/h3&gt;
&lt;p&gt;Весьма распространена и противоположная конструкция, когда в одном из плеч &lt;tt&gt;//&lt;/tt&gt; делают попытку возврата из подпрограммы.&lt;/p&gt;&lt;pre&gt;my $b_time = $self-&amp;gt;item_to_timet($b_item)
   // return $a_item;

my $a_time = $self-&amp;gt;item_to_timet($a_item) 
   // return $b_item;;

my $str = $self-&amp;gt;item_to_date($item) 
   // return;&lt;/pre&gt;
&lt;p&gt;App::RSS2Leafnode — 02 Feb 2010&lt;br /&gt;post RSS feeds to newsgroups&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;//&lt;/tt&gt; легко объединяется в цепочку, поэтому возможно написать конструкцию, которая делает несколько попыток присвоить defined-значение:&lt;/p&gt;&lt;pre&gt;return (elt_to_email ($item-&amp;gt;first_child('author'))
        // elt_to_email ($item   -&amp;gt;first_child('dc:creator'))
        // elt_to_email ($item   -&amp;gt;first_child('dc:contributor'))
        // non_empty ($item-&amp;gt;first_child_text('wiki:username'))

        // elt_to_email ($channel-&amp;gt;first_child('dc:creator'))
        // elt_to_email ($channel-&amp;gt;first_child('author'))
        // elt_to_email ($channel-&amp;gt;first_child('managingEditor'))
        // elt_to_email ($channel-&amp;gt;first_child('webMaster'))

        // elt_to_email ($item   -&amp;gt;first_child('dc:publisher'))
        // elt_to_email ($channel-&amp;gt;first_child('dc:publisher'))

        // non_empty ($channel-&amp;gt;first_child_text('title'))

        # RFC822
        // 'nobody@'.$self-&amp;gt;uri_to_host
       );&lt;/pre&gt;
&lt;p&gt;App::RSS2Leafnode — 02 Feb 2010&lt;br /&gt;post RSS feeds to newsgroups&lt;/p&gt;
&lt;p&gt;Возможен и подход, при котором возвращается одна-единственная переменная, которая перед этим проходит через несколько проверок с оператором defined-or:&lt;/p&gt;&lt;pre&gt;sub item_to_language {
  my ($self, $item) = @_;
  my $content;
  my $ret = (elt_to_language($item)
             // elt_to_language($item-&amp;gt;first_child('content')));
  for (;;) {
    $item = $item-&amp;gt;parent // last;
    $ret //= elt_to_language($item);
  }
  $ret //= $self-&amp;gt;{'resp'}-&amp;gt;content_language;
  return $ret;
}&lt;/pre&gt;
&lt;p&gt;App::RSS2Leafnode — 02 Feb 2010&lt;br /&gt;post RSS feeds to newsgroups&lt;/p&gt;
&lt;h3&gt;Несколько //&lt;/h3&gt;
&lt;p&gt;Объединение в цепочку нам уже встречалось, однако на нем следует задержать внимание еще раз.&lt;/p&gt;&lt;pre&gt;my $captures    = $arg {captures}       // [];
my $comment     = escape $arg {comment} // $name // "";
my $upgrade     = $arg {utf8_upgrade}   // 1;
my $downgrade   = $arg {utf8_downgrade} // 1;
my $match       = $arg {match}          // 1;&lt;/pre&gt;
&lt;p&gt;Games::Wumpus — 24 Nov 2009&lt;br /&gt;Play Hunt the Wumpus&lt;/p&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-12T08:35:18+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:onperl.ru,2010:/onperl//1.163</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/choosing-test-names.html</link>
      <description>Which test names do you prefer?

"tong() method can connect to database"
"tong() method can disconnect from database"
"sha() method can delete an existing file"
"sha() method fails when deleting a non-existing file"

or:

"tong 1"
"tong 2"
"sha 1"
"sha 2"

They are both rather extreme, but if I had to choose, I would still
rather go with the shorter ones. I tend to treat test names more like
unique IDs, and when things go wrong I just look up the actual test code.

I wouldn't mind verbose test names though if they can somehow be
automatically generated (a future Google Translate project, perhaps?)
from code, because they are just repeating what the code says.

To repeat myself, it's the DRY principle.</description>
      <dc:date>2010-03-12T07:02:00Z</dc:date>
      <dc:subject>steven perl</dc:subject>
      <title>Choosing test names</title>
      <pubDate>Fri, 12 Mar 2010 07:02:00 -0000</pubDate>
      <content:encoded>Which test names do you prefer?&lt;br /&gt;&lt;br /&gt;"tong() method can connect to database"&lt;br /&gt;"tong() method can disconnect from database"&lt;br /&gt;"sha() method can delete an existing file"&lt;br /&gt;"sha() method fails when deleting a non-existing file"&lt;br /&gt;&lt;br /&gt;or:&lt;br /&gt;&lt;br /&gt;"tong 1"&lt;br /&gt;"tong 2"&lt;br /&gt;"sha 1"&lt;br /&gt;"sha 2"&lt;br /&gt;&lt;br /&gt;They are both rather extreme, but if I had to choose, I would still rather go with the shorter ones. I tend to treat test names more like unique IDs, and when things go wrong I just look up the actual test code.&lt;br /&gt;&lt;br /&gt;I wouldn't mind verbose test names though if they can somehow be automatically generated (a future Google Translate project, perhaps?) from code, because they are just repeating what the code says.&lt;br /&gt;&lt;br /&gt;To repeat myself, it's the DRY principle.&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-12T07:02:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-3035323255246508397.post-5553137168208404210</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/20100312/1268375555</link>
      <description>未使用の変数があるかどうかテストするTest::Varsというモジュールを書いた。

  * http://github.com/gfx/Perl-Test-Vars

  * http://search.cpan.org/dist/Test-Vars/

使用感は以下のようになる。

$ perl -MTest::Vars -e 'vars_ok "Test::Builder";'# $pack is used once in &amp;Test::Builder::_caller_context at .../Test/Builder.pm line 1118# $pack is used once in &amp;Test::Builder::_message_at_caller at .../Test/Builder.pm line 1889# $ok is used once in &amp;Test::Builder::finalize at .../Test/Builder.pm line 264not ok 1 - Test::Builder#   Failed test 'Test::Builder'#   at -e line 1.# Tests were run but no plan was declared and done_testing() was not seen.

もっとも、Test::Perl::Criticにも未使用変数の検出機能はあるので、普通はそちらを使えばいい。

これは単に構文木のスキャンがやりたかったので書いた。後悔はしていない。</description>
      <dc:date>2010-03-12T15:32:35+09:00</dc:date>
      <dc:subject>perl</dc:subject>
      <title>[perl] Test::Vars to detect unused variables</title>
      <pubDate>Fri, 12 Mar 2010 15:32:35 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;未使用の変数があるかどうかテストするTest::Varsというモジュールを書いた。&lt;/p&gt;
			&lt;ul&gt;
				&lt;li&gt; &lt;a href="http://github.com/gfx/Perl-Test-Vars"&gt;http://github.com/gfx/Perl-Test-Vars&lt;/a&gt;&lt;/li&gt;
				&lt;li&gt; &lt;a href="http://search.cpan.org/dist/Test-Vars/"&gt;http://search.cpan.org/dist/Test-Vars/&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
			&lt;p&gt;使用感は以下のようになる。&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
$ perl &lt;span class="synSpecial"&gt;-MTest&lt;/span&gt;::Vars &lt;span class="synSpecial"&gt;-e&lt;/span&gt; &lt;span class="synStatement"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;vars_ok &amp;#34;Test::Builder&amp;#34;;&lt;/span&gt;&lt;span class="synStatement"&gt;'&lt;/span&gt;
&lt;span class="synComment"&gt;# $pack is used once in &amp;#38;Test::Builder::_caller_context at .../Test/Builder.pm line 1118&lt;/span&gt;
&lt;span class="synComment"&gt;# $pack is used once in &amp;#38;Test::Builder::_message_at_caller at .../Test/Builder.pm line 1889&lt;/span&gt;
&lt;span class="synComment"&gt;# $ok is used once in &amp;#38;Test::Builder::finalize at .../Test/Builder.pm line 264&lt;/span&gt;
not ok &lt;span class="synConstant"&gt;1&lt;/span&gt; - Test::Builder
&lt;span class="synComment"&gt;#   Failed test 'Test::Builder'&lt;/span&gt;
&lt;span class="synComment"&gt;#   at -e line 1.&lt;/span&gt;
&lt;span class="synComment"&gt;# Tests were run but no plan was declared and done_testing() was not seen.&lt;/span&gt;
&lt;/pre&gt;

			&lt;p&gt;もっとも、&lt;a href="http://search.cpan.org/perldoc?Test::Perl::Critic"&gt;Test::Perl::Critic&lt;/a&gt;にも未使用変数の検出機能はあるので、普通はそちらを使えばいい。&lt;/p&gt;
			&lt;p&gt;これは単に構文木のスキャンがやりたかったので書いた。後悔はしていない。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-12T15:32:35+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://d.hatena.ne.jp/gfx/20100312/1268375555</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/40241?from=rss</link>
      <description>Yes, threads suck. And in several different ways. Slow, memory-bloating,
etc etc etc.

However, threads work.

Installing them from the CPAN on Windows, Mac and Linux works.

Using them as they are intended to be used works on Windows, Mac and
Linux.

Integration with Wx works on Windows, Mac and Linux.

And using them to saturate a 4 CPU core development machine works,
without resorting to having both them AND external processes.

And they work well enough that nobody has yet had an itch strong enough
to step up and replace our task management code with something else that
can support more than one CPU (and since our task system is derived from
Process.pm, it is specifically designed to make it easy to use
alternative backends).

So threads work, but they suck. Or at least, interpreter-copy sucks.

And in an IDE scenario where your process needs to load 50-100 meg of
code just to drive the cooler IDE functions they suck even harder.

Fortunately, Padre has a rather forgiving attitude to things sucking.

We would rather have someone commit something that works and sucks, than
not have it committed at all. And Padre is full of all kinds of features
that work but suck. And slowly, gradually, they suck less.

The most recent couple of releases have come with stability warnings due
to the arrival of our second-generation "Slave Driver" threading model.

The Slave Driver mechanism attempts to specifically contain and reduce
the problems associated with threads.

During startup, we load the minimum number of modules required to conduct
communication across threads, and then immediately spawn off a master
thread which will remain unused while our main thread continues onward
and loads up as much code as it likes.

Later on, when we need to do background work, this master thread is then
further cloned into a slave thread which will bloat out incrementally,
loading only the code it needs to execute the task.

While the slave driver mechanism itself landed a few weeks ago, the final
step of pushing the master spawn point up into the start-up code just
landed today.

The result of this is a change in our per-thread cost from 34meg per
thread to about 20meg per thread (for a total reduction in memory in a
low-usage case from 90meg to 60meg).

If not for the fact that loading Wx is an all or nothing proposition, we
could probably cut this in half again. And while a collection of half a
dozen 35meg threads (about the maximum we are likely to need to saturate
4 CPU cores) in a thread pool is a nasty amount of RAM, even for an IDE,
half a dozen 10meg threads is a lot closer to a tolerable memory cost.

And if we can drop this further to around 5 meg, we get close to the
memory cost of a forking/process model, which is the only other
parallelism model available in the short term that supports many cores
transparently.</description>
      <dc:date>2010-03-12T05:26:21Z</dc:date>
      <dc:subject>journal</dc:subject>
      <title>Making threads suck less in Padre</title>
      <pubDate>Fri, 12 Mar 2010 05:26:21 -0000</pubDate>
      <content:encoded>&lt;p&gt;Yes, threads suck. And in several different ways. Slow, memory-bloating, etc etc etc.&lt;/p&gt;&lt;p&gt;However, threads work.&lt;/p&gt;&lt;p&gt;Installing them from the CPAN on Windows, Mac and Linux works.&lt;/p&gt;&lt;p&gt;Using them as they are intended to be used works on Windows, Mac and Linux.&lt;/p&gt;&lt;p&gt;Integration with Wx works on Windows, Mac and Linux.&lt;/p&gt;&lt;p&gt;And using them to saturate a 4 CPU core development machine works, without resorting to having both them AND external processes.&lt;/p&gt;&lt;p&gt;And they work well enough that nobody has yet had an itch strong enough to step up and replace our task management code with something else that can support more than one CPU (and since our task system is derived from Process.pm, it is specifically designed to make it easy to use alternative backends).&lt;/p&gt;&lt;p&gt;So threads work, but they suck. Or at least, interpreter-copy sucks.&lt;/p&gt;&lt;p&gt;And in an IDE scenario where your process needs to load 50-100 meg of code just to drive the cooler IDE functions they suck even harder.&lt;/p&gt;&lt;p&gt;Fortunately, Padre has a rather forgiving attitude to things sucking.&lt;/p&gt;&lt;p&gt;We would rather have someone commit something that works and sucks, than not have it committed at all. And Padre is full of all kinds of features that work but suck. And slowly, gradually, they suck less.&lt;/p&gt;&lt;p&gt;The most recent couple of releases have come with stability warnings due to the arrival of our second-generation "Slave Driver" threading model.&lt;/p&gt;&lt;p&gt;The Slave Driver mechanism attempts to specifically contain and reduce the problems associated with threads.&lt;/p&gt;&lt;p&gt;During startup, we load the minimum number of modules required to conduct communication across threads, and then immediately spawn off a master thread which will remain unused while our main thread continues onward and loads up as much code as it likes.&lt;/p&gt;&lt;p&gt;Later on, when we need to do background work, this master thread is then further cloned into a slave thread which will bloat out incrementally, loading only the code it needs to execute the task.&lt;/p&gt;&lt;p&gt;While the slave driver mechanism itself landed a few weeks ago, the final step of pushing the master spawn point up into the start-up code just landed today.&lt;/p&gt;&lt;p&gt;The result of this is a change in our per-thread cost from 34meg per thread to about 20meg per thread (for a total reduction in memory in a low-usage case from 90meg to 60meg).&lt;/p&gt;&lt;p&gt;If not for the fact that loading Wx is an all or nothing proposition, we could probably cut this in half again. And while a collection of half a dozen 35meg threads (about the maximum we are likely to need to saturate 4 CPU cores) in a thread pool is a nasty amount of RAM, even for an IDE, half a dozen 10meg threads is a lot closer to a tolerable memory cost.&lt;/p&gt;&lt;p&gt;And if we can drop this further to around 5 meg, we get close to the memory cost of a forking/process model, which is the only other parallelism model available in the short term that supports many cores transparently.&lt;/p&gt;</content:encoded>
      <dcterms:modified>2010-03-12T05:26:21Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://use.perl.org/~Alias/journal/40241?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (rjbs)</author>
      <dc:creator>nobody@example.com (rjbs)</dc:creator>
      <link>http://rjbs.manxome.org/rubric/entry/1823</link>
      <description>In short, there was just too much copy and paste. It wasn't really
trivial, either. Here's an example of code that appeared in both
Pod::Weaver::Role::Plugin and Dist::Zilla::Role::Plugin:

for my $method (qw(log log_debug log_fatal)) {
  Sub::Install::install_sub({
    code =&gt; sub {
      my ($self, @rest) = @_;
      my $arg = _HASHLIKE($rest[0]) ? (shift @rest) : {};
      local $arg-&gt;{prefix} = '[' . $self-&gt;plugin_name . '] '
                           . (defined $arg-&gt;{prefix} ? $arg-&gt;{prefix} : '');

      $self-&gt;weaver-&gt;logger-&gt;$method($arg, @rest);
    },
    as   =&gt; $method,
  });
}

This is gross for a few reasons, but I think that its basic grossness
should be obvious. I didn't want anyone to have to copy this around. The
replacement is really nice:

has logger =&gt; (
  is   =&gt; 'ro',
  lazy =&gt; 1,
  handles =&gt; [ qw(log log_debug log_fatal) ],
  default =&gt; sub {
    $_[0]-&gt;weaver-&gt;logger-&gt;proxy({
      proxy_prefix =&gt; '[' . $_[0]-&gt;plugin_name . '] ',
    });
  },
);

We say, "I'm a plugin of something with a logger. If I need to log
anything, I'll ask for a proxy to that logger, and my proxy will have a
custom prefix."

This proxy is a Log::Dispatchouli::Proxy, which closely emulates much of
Log::Dispatchouli, but with some bits localized and some bits off limits.
For example, that proxy_prefix can't be changed after the fact, but we
could turn debugging on or off without affecting the parent logger.

Because I'm using proper delegation again, I can make things lazy again,
and I can make it easy to tweak the behavior of one plugin for testing
purposes.

This logging work has taken more time than I expected, but I think it
will really pay dividends. I hope to get the new logging code documented
and all the relevant updates deployed to the CPAN tomorrow. For now, I'm
beat and I'm going to bed.</description>
      <dc:date>2010-03-11T23:15:10-05:00</dc:date>
      <title>logging changes in Dist::Zilla were not complete</title>
      <pubDate>Thu, 11 Mar 2010 23:15:10 -0500</pubDate>
      <content:encoded>&lt;p&gt;In short, there was just too much copy and paste.  It wasn't really trivial,
either.  Here's an example of code that appeared in both
Pod::Weaver::Role::Plugin and Dist::Zilla::Role::Plugin:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for my $method (qw(log log_debug log_fatal)) {
  Sub::Install::install_sub({
    code =&amp;gt; sub {
      my ($self, @rest) = @_;
      my $arg = _HASHLIKE($rest[0]) ? (shift @rest) : {};
      local $arg-&amp;gt;{prefix} = '[' . $self-&amp;gt;plugin_name . '] '
                           . (defined $arg-&amp;gt;{prefix} ? $arg-&amp;gt;{prefix} : '');

      $self-&amp;gt;weaver-&amp;gt;logger-&amp;gt;$method($arg, @rest);
    },
    as   =&amp;gt; $method,
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is gross for a few reasons, but I think that its basic grossness should be
obvious.  I didn't want anyone to have to copy this around.  The replacement is
really nice:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;has logger =&amp;gt; (
  is   =&amp;gt; 'ro',
  lazy =&amp;gt; 1,
  handles =&amp;gt; [ qw(log log_debug log_fatal) ],
  default =&amp;gt; sub {
    $_[0]-&amp;gt;weaver-&amp;gt;logger-&amp;gt;proxy({
      proxy_prefix =&amp;gt; '[' . $_[0]-&amp;gt;plugin_name . '] ',
    });
  },
);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We say, "I'm a plugin of something with a logger.  If I need to log anything,
I'll ask for a proxy to that logger, and my proxy will have a custom prefix."&lt;/p&gt;

&lt;p&gt;This proxy is a Log::Dispatchouli::Proxy, which closely emulates much of
Log::Dispatchouli, but with some bits localized and some bits off limits.  For
example, that &lt;code&gt;proxy_prefix&lt;/code&gt; can't be changed after the fact, but we could turn
debugging on or off without affecting the parent logger.&lt;/p&gt;

&lt;p&gt;Because I'm using proper delegation again, I can make things lazy again, and I
can make it easy to tweak the behavior of one plugin for testing purposes.&lt;/p&gt;

&lt;p&gt;This logging work has taken more time than I expected, but I think it will
really pay dividends.  I hope to get the new logging code documented and all
the relevant updates deployed to the CPAN tomorrow.  For now, I'm beat and I'm
going to bed.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-03-11T23:15:10-05:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://rjbs.manxome.org/rubric/entry/1823</guid>
    </item>
    <item>
      <author>nobody@example.com (Kartik)</author>
      <dc:creator>nobody@example.com (Kartik)</dc:creator>
      <category>Perl Showcase EyeCandy SDL Perl</category>
      <link>http://feedproxy.google.com/~r/YetAnotherPerlGameHackeryapgh/~3/WYwrXTKlVjI/sdl-perl-showcase.html</link>
      <description>SDL_Mixer and Effects

[IMAGE]
This demo shows the new work we have finished for SDL_Mixer support in
SDL_perl . (FROGGS++)


  *  Plays ogg files in local directory

  *  Uses threads and SDL_Mixer effects to extract realtime stereo stream
    data

  *  Visulizes stream data as an oscilloscope



Get it at: playlist.pl, you need some .ogg files to play in the same
directory. Use the down key to go through them.


SDL_TTF support


[IMAGE]

This shows the current work on SDL_TTF support. UTF8 and Uncicode are
supported.

See the t/ttf.t test in github SDL_perl.



Spinner (Destiny Swirl) Arcade Game

And finally as a proof of concept we have been working a simple arcade
game to test our bugs, and scope out our high level bindings. You can get
it at the Spinner repo. This wiki page will help you set up for your
platforms. [IMAGE][IMAGE]

[IMAGE]
[IMAGE]

[IMAGE]</description>
      <dc:date>2010-03-12T03:29:00Z</dc:date>
      <dc:subject>Perl Showcase EyeCandy SDL Perl</dc:subject>
      <title>SDL Perl Showcase</title>
      <pubDate>Fri, 12 Mar 2010 03:29:00 -0000</pubDate>
      <content:encoded>&lt;b&gt;&lt;br /&gt;
SDL_Mixer and Effects&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator"&gt;&lt;a href="http://1.bp.blogspot.com/_NnqjAQEn1Xo/S5mzzlA_BPI/AAAAAAAAAJ4/5n62-vSSKzs/s1600-h/playlist.png" imageanchor="1"&gt;&lt;img src="http://1.bp.blogspot.com/_NnqjAQEn1Xo/S5mzzlA_BPI/AAAAAAAAAJ4/5n62-vSSKzs/s320/playlist.png"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
This demo shows the new work we have finished for SDL_Mixer support in &lt;a href="http://github.com/kthakore/SDL_perl"&gt;SDL_perl&lt;/a&gt; . (FROGGS++)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&amp;nbsp;Plays ogg files in local directory&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Uses threads and SDL_Mixer effects to extract realtime stereo stream data&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Visulizes stream data as an&amp;nbsp;oscilloscope&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Get it at: &lt;a href="http://github.com/garu/Spinner/raw/master/data/music/playlist.pl"&gt;playlist.pl&lt;/a&gt;, you need some&lt;a href="http://github.com/garu/Spinner/tree/master/data/music/"&gt; .ogg files&lt;/a&gt; to play in the same directory. Use the down key to go through them.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
SDL_TTF support &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator"&gt;&lt;a href="http://1.bp.blogspot.com/_NnqjAQEn1Xo/S5mz8HnVpkI/AAAAAAAAAKQ/4TV0wJG_GNM/s1600-h/TTF.png" imageanchor="1"&gt;&lt;img src="http://1.bp.blogspot.com/_NnqjAQEn1Xo/S5mz8HnVpkI/AAAAAAAAAKQ/4TV0wJG_GNM/s320/TTF.png"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
This shows the current work on SDL_TTF support. UTF8 and Uncicode are supported. &lt;br /&gt;
&lt;br /&gt;
See the&lt;a href="http://github.com/kthakore/SDL_perl/tree/redesign/t/ttf.t"&gt; t/ttf.t &lt;/a&gt;test in github SDL_perl.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
Spinner (Destiny Swirl) Arcade Game&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;And finally as a proof of concept we have been working a simple arcade game to test our bugs, and scope out our high level bindings. You can get it at the &lt;a href="http://github.com/garu/Spinner/"&gt;Spinner repo&lt;/a&gt;. This &lt;a href="http://sdlperl.ath.cx/projects/SDLPerl/wiki/TPMFeb2010"&gt;wiki page &lt;/a&gt;will help you set up for your platforms.&amp;nbsp;&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://1.bp.blogspot.com/_NnqjAQEn1Xo/S5mz1i9fuDI/AAAAAAAAAKA/nWCGR2U2k6I/s1600-h/spinner.png" imageanchor="1"&gt;&lt;img src="http://1.bp.blogspot.com/_NnqjAQEn1Xo/S5mz1i9fuDI/AAAAAAAAAKA/nWCGR2U2k6I/s320/spinner.png"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://2.bp.blogspot.com/_NnqjAQEn1Xo/S5mz7Cwi6RI/AAAAAAAAAKI/qV-UwiGaS6E/s1600-h/spinnerII.png" imageanchor="1"&gt;&lt;img src="http://2.bp.blogspot.com/_NnqjAQEn1Xo/S5mz7Cwi6RI/AAAAAAAAAKI/qV-UwiGaS6E/s320/spinnerII.png"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/X-mK4PVNtPgjwyZDLyCCH9bV1b0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/X-mK4PVNtPgjwyZDLyCCH9bV1b0/0/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/X-mK4PVNtPgjwyZDLyCCH9bV1b0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/X-mK4PVNtPgjwyZDLyCCH9bV1b0/1/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/YetAnotherPerlGameHackeryapgh/~4/WYwrXTKlVjI"&gt;</content:encoded>
      <dcterms:modified>2010-03-12T03:29:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-3102167581424744259.post-2785864569764497133</guid>
    </item>
    <item>
      <author>nobody@example.com (Gabor Szabo)</author>
      <dc:creator>nobody@example.com (Gabor Szabo)</dc:creator>
      <category>Perl, community, CeBIT, Python</category>
      <link>http://szabgab.com/blog/2010/03/1268387636.html</link>
      <description>Sewi, Phaylon and the Foswiki developers have already written very good
posts about CeBIT and the Perl booth in English and Renee in German (see
all posts listed on the Perl::Staff page and on our wiki. (though I don't
know what interesting discussions Sewi mentions as neither of us could
actually talk in the evenings...)

I must say a big, big public thanks to Sebastian Willing (Sewi) and Tanja
who took me in their house occupying their living room for a whole week
during CeBIT. Not only made that the whole trip affordable but it was
really nice to be with them and to get to know each other a little bit
more.

I also would like to thank the people of Perl::Staff for being at the
Perl booth. First of all to Renee Baecker who prepared most of the new
material for the fair and who took me from Frankfurt and back again.
Thanks to Torsten Raudssus, (aka. Getty or the man with the wings), who
did not have a blog a week ago and only reads the recent upload feed of
CPAN. If you'd like to get his attention, you'll need to write the text
in the documentation of a module and upload to CPAN.

Thanks also to Thomas Fahle, Robert 'phaylon' Sedlacek, Bernhard
Schmalhofer (barney), Oliver Kr\x{00fc}ger and Michael Daum, the last two
from the Foswiki team.

Our good neighbour Andreas \x{201c}ads\x{201d} Scherbaum, the friendly
Postgres guy helped us a lot both before and during the event and of
course Britta Wuelfing from Linux Magazin who was our contact person
before and during CeBIT.

The materials we used and distributed were sponsored by TPF - The Perl
Foundation, by YEF - YAPC Europe Foundation and we also got a bunch of
beermats from EPO - Enlightened Perl Organization.

The postcards with the few projects and the list of Perl Events that we
used in FOSDEM were still very good. The community business cards were
also working in some cases but less good than in FOSDEM and IMHO the
tuits were almost unused. Both because of some language barrier and
because that did not fit the type of people visiting CeBIT and our booth.

The big blue promotional material Renee prepared was used well but I
think it would have been more useful if it was in German. For future
events we should have similar things in several languages. The content of
those pages can be found on the wiki page"

The beermats were quite useful - in many cases after some discussion, I
asked people if they drink beer. Most of them did not understand what a
stupid question. Of course they drink beer. They then liked very much the
beermats. We also had a special event in the evening of the 3rd day when
we there was a party just next to us. People got free beer and we
supplied the "open source beermats, based on Perl". People liked it very
much.

We managed to draw a smile on the faces of many visitors which I think is
one of the big things we can do. Create positives feelings associated
with Perl.

I think that made us a few more friends. Well, maybe except that Python
enthusiast who used the opportunity of the beermats to give the standard
we-use-python-and-hate-perl speech. That reminds me that we actually had
a few Python programmers at the stand. They initially did not want to
hear anything saying "We are python programmers, we don't care about
Perl" but then we could lure them to our computers and show them some
modern perl code that impressed them. So there are Python programmers
that are open minded and the appropriate amount of friendliness can bring
them closer. This probably is related to what Robert Sedlacek wrote in
the Other dynamic languages section.


The catch man
-------------

When you walk around in area frequently visited by tourists you often see
people standing in-front of the restaurants and various other
establishements and trying to direct people to enter the place. In a
large part that was what I was doing. As people passed by our stand I
gave them either a postcard and when we ran out of it some other
promotional material. As they looked at the material I soon asked if they
speak English. That surprised them a bit and many said they speak German
which just gave me the opportunity to point at one of the other
Perl::Staff members standing near-by and telling them they speak German.

That was both good as it freed me to go to the next person but it was
also better for the visitors that they could speak in their mother
tongue. I think that's important. So while we are preparing to attend
more events, and I'd be happy to visit more such events and kick-start
the local Perl::Staff group but it should be just that. Kick-starting the
local group as the visitors will prefer to talk in the local language
anyway.

We have listed many many tech events on our wiki page but I am sure we
left out a lot more. We are also looking for people who will want to
participate in promoting Perl. As other have already mentioned it is both
hard work but it is also fun. It is very different from sitting in a
cubical and coding or even talking to fellow Perl hackers on a YAPC but
it can be rewarding both personall - especially in the evening when you
can finally rest ... ;-) - but also professionally.


Pictures
--------

BTW There are some pictures as well about Perl on CeBIT.</description>
      <dc:date>2010-03-12T01:53:56Z</dc:date>
      <dc:subject>Perl, community, CeBIT, Python</dc:subject>
      <title>Another report about CeBIT, Perl and the community</title>
      <pubDate>Fri, 12 Mar 2010 01:53:56 -0000</pubDate>
      <content:encoded>&lt;p&gt;
&lt;a herf="http://padre-ide.de/blog/?p=111"&gt;Sewi&lt;/a&gt;,
&lt;a href="http://blogs.perl.org/users/robert_phaylon_sedlacek/2010/03/perl-in-germany-my-cebit-recap.html"&gt;Phaylon&lt;/a&gt;
and the &lt;a href="http://blog.foswiki.org/2010/03/foswiki-on-cebit-2010/"&gt;Foswiki&lt;/a&gt; developers
have already written very good posts about CeBIT and the Perl booth in English
and Renee in German (see all posts listed on the &lt;a href="http://cpan.uwinnipeg.ca/dist/Perl-Staff"&gt;Perl::Staff&lt;/a&gt; page and on 
&lt;a href="http://www.perlfoundation.org/perl5/index.cgi?events_2010_cebit"&gt;our wiki&lt;/a&gt;.
(though I don't know what interesting discussions Sewi mentions as neither of us could actually talk in the evenings...)
&lt;/p&gt;
&lt;p&gt;
I must say a big, big public thanks to Sebastian Willing (Sewi) and Tanja who took me in their house occupying their living room
for a whole week during &lt;a href="http://www.cebit.de/"&gt;CeBIT&lt;/a&gt;. Not only made that the whole trip affordable 
but it was really nice to be with them and to get to know each other a little bit more.
&lt;/p&gt;
&lt;p&gt;
I also would like to thank the people of &lt;a href="http://cpan.uwinnipeg.ca/dist/Perl-Staff"&gt;Perl::Staff&lt;/a&gt; for being at the Perl booth. First of all
to &lt;a href="http://reneeb-perlblog.blogspot.com/"&gt;Renee Baecker&lt;/a&gt; who prepared most of the new material
for the fair and who took me from Frankfurt and back again. Thanks to &lt;a href="http://www.raudssus.de/"&gt;Torsten Raudssus&lt;/a&gt;, 
(aka. Getty or the man with the wings), who did not have a blog a week ago and only reads the 
&lt;a href="http://search.cpan.org/recent"&gt;recent upload feed of CPAN&lt;/a&gt;.
If you'd like to get his attention, you'll need to write the text in the documentation of a module and upload to CPAN.
&lt;/p&gt;
&lt;p&gt;
Thanks also to &lt;a href="http://perl-howto.de/"&gt;Thomas Fahle&lt;/a&gt;, 
&lt;a href="http://www.catalyzed.org/mt/mt-cp.cgi?__mode=view&amp;amp;id=34&amp;amp;blog_id=1"&gt;Robert 'phaylon' Sedlacek&lt;/a&gt;, 
&lt;a href="http://use.perl.org/~Bernhard/journal/"&gt;Bernhard Schmalhofer (barney)&lt;/a&gt;, 
&lt;a href="http://foswiki.org/Main/OliverKrueger"&gt;Oliver Kr\x{00fc}ger&lt;/a&gt; and 
&lt;a href="http://michaeldaumconsulting.com/"&gt;Michael Daum&lt;/a&gt;, the last two from the 
&lt;a href="http://foswiki.org/"&gt;Foswiki&lt;/a&gt; team.
&lt;/p&gt;
&lt;p&gt;
Our good neighbour &lt;a href="http://andreas.scherbaum.la/blog/"&gt;Andreas \x{201c}ads\x{201d} Scherbaum, the friendly Postgres guy&lt;/a&gt;
helped us a lot both before and during the event and of course Britta Wuelfing from 
&lt;a href="http://www.linux-magazin.de/"&gt;Linux Magazin&lt;/a&gt; who was our contact person before and during CeBIT.
&lt;/p&gt;
&lt;p&gt;
The materials we used and distributed were sponsored by &lt;a href="http://www.perlfoundation.org/"&gt;TPF - The Perl Foundation&lt;/a&gt;, 
by &lt;a href="http://www.yapceurope.org/"&gt;YEF - YAPC Europe Foundation&lt;/a&gt; and we also got a bunch of beermats 
from &lt;a href="http://www.enlightenedperl.org/"&gt;EPO - Enlightened Perl Organization&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
The postcards with the few projects and the list of Perl Events that we used in FOSDEM were still very good. 
The community business cards were also working in some cases but less good than in FOSDEM and IMHO the tuits were 
almost unused. Both because of some language barrier and because that did not fit the type of people visiting CeBIT
and our booth.
&lt;/p&gt;
&lt;p&gt;
The big blue promotional material Renee prepared was used well but I think it would have been more useful if it was in
German. For future events we should have similar things in several languages. The content of those pages can be
found on the &lt;a href="http://www.perlfoundation.org/perl5/index.cgi?events_2010_cebit"&gt;wiki page"&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The beermats were quite useful - in many cases after some discussion, I asked people if they drink beer. Most of them
did not understand what a stupid question. Of course they drink beer. They then liked very much the beermats.
We also had a special event in the evening of the 3rd day when we there was a party just next to us. People 
got free beer and we supplied the "open source beermats, based on Perl". People liked it very much.
&lt;/p&gt;
&lt;p&gt;
We managed to draw a smile on the faces of many visitors which I think is one of the big things we can do. 
&lt;b&gt;Create positives feelings associated with Perl.&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
I think that made us a few more friends. Well, maybe except that Python enthusiast who used the opportunity of the 
beermats to give the standard we-use-python-and-hate-perl speech. That reminds me that we actually had a few Python
programmers at the stand. They initially did not want to hear anything saying 
"We are python programmers, we don't care about Perl" but then we could lure them to our computers and show them some
modern perl code that impressed them. So there are Python programmers that are open minded and the appropriate amount
of friendliness can bring them closer. This probably is related to what 
&lt;a href="http://blogs.perl.org/users/robert_phaylon_sedlacek/2010/03/perl-in-germany-my-cebit-recap.html"&gt;Robert Sedlacek&lt;/a&gt; 
wrote in the &lt;i&gt;Other dynamic languages&lt;/i&gt; section.
&lt;/p&gt;
&lt;p&gt;
&lt;h2&gt;The catch man&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;
When you walk around in area frequently visited by tourists you often see people standing in-front of 
the restaurants and various other establishements and trying to direct people to enter the place. 
In a large part that was what I was doing. As people passed by our stand I gave them either a postcard 
and when we ran out of it some other promotional material. As they looked at the material I soon asked
if they speak English. That surprised them a bit and many said they speak German which just gave me the 
opportunity to point at one of the other Perl::Staff members standing near-by and telling them they
speak German.
&lt;/p&gt;
&lt;p&gt;
That was both good as it freed me to go to the next person but it was also better for the visitors that 
they could speak in their mother tongue. I think that's important. So while we are preparing to attend
more events, and I'd be happy to visit more such events and kick-start the local Perl::Staff group but
it should be just that. Kick-starting the local group as the visitors will prefer to talk in the local 
language anyway.
&lt;/p&gt;
&lt;p&gt;
We have listed many many tech &lt;a href="http://www.perlfoundation.org/perl5/index.cgi?events"&gt;events on our wiki page&lt;/a&gt;
but I am sure we left out a lot more. We are also looking for people who will want to participate in 
promoting Perl. As other have already mentioned it is both hard work but it is also fun. It is very different from
sitting in a cubical and coding or even talking to fellow Perl hackers on a YAPC but it can be rewarding 
both personall - especially in the evening when you can finally rest ... ;-) - but also professionally.
&lt;/p&gt;
&lt;p&gt;
&lt;h2&gt;Pictures&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;
BTW There are some pictures as well about &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-12T01:53:56Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://szabgab.com/blog/2010/03/1268387636.html</guid>
    </item>
    <item>
      <author>nobody@example.com (monkey)</author>
      <dc:creator>nobody@example.com (monkey)</dc:creator>
      <category>CPAN Debian FreeBSD IronMan Linux OS X PC-BSD Perl Ubuntu</category>
      <link>http://scratching.psybermonkey.net/2010/03/12/perl-how-to-install-cpan-module-the-easier-way/</link>
      <description>Following IronMan Challenge posts not only for the sake of seeing What Color of Hair &amp;#038; Shirt ends up with Matt but the posts have been much enlightening. Recently in IronMan Challenge, there&amp;#8217;s been much talk about one of Miyagawa&amp;#8217;s project, App::cpanminus. Basically, cpanminus is a tool to install perl module from CPAN, without the [...]&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?i=YxoGv_K7Y0A:N9kxpJpqwgY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?i=YxoGv_K7Y0A:N9kxpJpqwgY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?i=YxoGv_K7Y0A:N9kxpJpqwgY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScratchingMyNeeds/~4/YxoGv_K7Y0A" height="1" width="1"/&gt;</description>
      <dc:date>2010-03-12T01:32:00Z</dc:date>
      <dc:subject>CPAN Debian FreeBSD IronMan Linux OS X PC-BSD Perl Ubuntu</dc:subject>
      <title>Perl – How to install CPAN module, the easier way</title>
      <pubDate>Fri, 12 Mar 2010 01:32:00 -0000</pubDate>
      <content:encoded>Following IronMan Challenge posts not only for the sake of seeing What Color of Hair &amp;#038; Shirt ends up with Matt but the posts have been much enlightening. Recently in IronMan Challenge, there&amp;#8217;s been much talk about one of Miyagawa&amp;#8217;s project, App::cpanminus. Basically, cpanminus is a tool to install perl module from CPAN, without the [...]&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?i=YxoGv_K7Y0A:N9kxpJpqwgY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?i=YxoGv_K7Y0A:N9kxpJpqwgY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?i=YxoGv_K7Y0A:N9kxpJpqwgY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?a=YxoGv_K7Y0A:N9kxpJpqwgY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScratchingMyNeeds?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScratchingMyNeeds/~4/YxoGv_K7Y0A" height="1" width="1"/&gt;</content:encoded>
      <dcterms:modified>2010-03-12T01:32:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://scratching.psybermonkey.net/?p=2180</guid>
    </item>
    <item>
      <author>nobody@example.com (richard)</author>
      <dc:creator>nobody@example.com (richard)</dc:creator>
      <category>Miscellaneous catalyst fastcgi nginx perl</category>
      <link>http://richard.wallman.org.uk/2010/03/one-week-on-catalyst-still-going-strong/</link>
      <description>Last Friday, I took my first Catalyst application live. It was a particularly tense time &amp;#8211; this was a live, public facing release of a completely new server stack. The short version: Catalyst rocks!
Previously, pretty much all of my serious stuff has been hand-rolled stuff in Apache/mod_perl, so starting a new project using nginx/FastCGI/Catalyst was [...]</description>
      <dc:date>0</dc:date>
      <dc:subject>Miscellaneous catalyst fastcgi nginx perl</dc:subject>
      <title>One week on &amp;#8211; Catalyst still going strong</title>
      <pubDate>Thu, 11 Mar 2010 23:34:25 -0000</pubDate>
      <content:encoded>Last Friday, I took my first Catalyst application live. It was a particularly tense time &amp;#8211; this was a live, public facing release of a completely new server stack. The short version: Catalyst rocks!
Previously, pretty much all of my serious stuff has been hand-rolled stuff in Apache/mod_perl, so starting a new project using nginx/FastCGI/Catalyst was [...]</content:encoded>
      <dcterms:modified>0</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://richard.wallman.org.uk/?p=134</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/8738461</link>
      <description>Wir haben die Umgebungsvariablen in unserem Programm geändert. Ich wurde
damit beauftragt. Vielleicht weil ich der ansässige Perl-Guru bin.
Vielleicht, weil ich mich über die unprofessionellen (weil konsistent
inkosistenten) Namen beschwerte hatte. Wahrscheinlicher ist jedoch, dass
ich einfach der am geringsten bezahlte Programmierer im Team bin.

Die einfache Strategie: Nach alten Variablen suchen und durch neue
ersetzen. Das ist ein typischer Fall für ein Einweg-Perl-Programm. Das
Skript ist also nicht besonders hübsch, sondern soll nur seinen Job
machen und wird dann nie wieder so gebraucht.

Zunächst erstellte ich eine Liste mit alten und neuen Variablen (die
Liste hatte ich auch schon mit Perl erstellt, aber das war nicht so
interessant):

@ReplaceHash = qw(
ALT_VARIABLE NEU_VARIABLE
ALT_VARIABLE1 NEU_VARIABLE1
ALT_VARIABLE2 NEU_VARIABLE2
ALT_VARIABLE3 NEU_VARIABLE3
);

qw steht übrigens für quote words und übersetzt die Liste qw(Hund Katze
Maus) in ("Hund", "Katze", "Maus"). Es wird also ein Array zurück
geliefert. Eine der vielen Vereinfachungen, die man erst richtig schätzen
lernt, wenn man in anderen Programmiersprachen Listen umständlich und
unleserlich initialisieren muss.

Die Namen sind natürlich nur exemplarisch, tatsächlich ginge es um ca. 20
verschiedene Variablen, die ersetzt werden mussten, und sie hatten kaum
etwas gemeinsam. Das war auch der Grund, warum sie ersetzt werden
sollten.

Der zweite Trick ist: Hashes (Dictionaries) kann man wie Arrays (Listen)
behandeln, wobei die geraden Einträge (0,2,4,6,8) die keys
(Schlüsselworte) darstellen, die ungeraden (1,3,5,7,9) die Werte.
ReplaceHash{ALT_VARIABLE} enthält folglich NEU_VARIABLE.

@OldVariables = (keys %ReplaceHash);
$SearchString = join ("|", ReplaceHash);

hier erstelle ich aus den Schlüsselwerten (ALT_VARIABLE, ALT_VARIABLE1,
ALT_VARIABLE2, ALT_VARIABLE3) einen Such-Text, der sich leicht in einer
Such-Anweisung (/$SearchString/) nutzen lässt.
$SearchString enthält danach
"ALT_VARIABLE|ALT_VARIABLE1|ALT_VARIABLE2|ALT_VARIABLE3". benutzt man ihn
als Such-Text findet er "ALT_VARIABLE" oder "ALT_VARIABLE1" oder
"ALT_VARIABLE2" oder "ALT_VARIABLE3".

jetzt kann ich mit

while (&lt;MyFileHandle&gt;)
{
    next unless ($_ =~ /($SearchString)/);
    $old = $1;
    $new = $ReplaceHash{$old};
    print $_;
    $_ =~ s/$old/$new/;
    print $_;
}

schon einen ersten Probelauf durchführen. In $1 steht der gefundene alte
Variablenname, $ReplaceHash{$old} liefert immer den passenden neuen Namen
(aus der selbst-erstellten Liste).

(Da ich das ganze über mehrere Dateien laufen ließ, habe ich das
Perl-Module Find genutzt. Mehr dazu hier. Seeeeehr praktisch.)

Als nächstes ersetze ich (GNU-Tools sei dank) $_ =~ s/$old/$new/; durch
system ("sed -i s/$old/$new/g $FileName");. sed öffnet die Datei
$FileName und ersetzt in ihr Texte wie schon das s///-Kommando in Perl,
nur dass man sich um nichts weiter kümmern muss.

Das war der normale Teil. Jetzt komme ich zu dem verrückten Aspekt. Ich
musste auch die Dokumentation anpassen. Die war in LaTeX geschrieben und
da müssen Unterstriche (_) mit einem Rückstrich (\, Backslash, offiziell:
Gegenschrägstrich) maskiert, da LaTeX sonst mit dem Text nicht arbeiten
kann. Im LaTeX-Rohtext stehen also ALT\_VARIABLE statt ALT_VARIABLE also
muss ich auch nach ALT\_VARIABLE suchen.

Kein Problem.

$SearchString =~ s/_/\\_/;

erledigt das Problem - scheinbar.

next unless ($_ =~ /($SearchString)/);

funktioniert bereits, aber

system ("sed -i s/$old/$new/g $FileName");

liefert ein lustiges Beispiel für das Auswerten und Auflösen von
Rückstrichen.

system ("sed -i s/$old/$new/g $FileName"); #so geht's los
system ("sed -i s/ALT\_VARIABLE/NEU\_VARIABLE/g MeineDatei.tex"); # das "sieht perl"
#(Perl-Skript ende)
sed -i s/ALT_VARIABLE/NEU_VARIABLE/g MeineDatei.tex # das kommt auf der Kommandozeile an.


also brauche ich mehr Rückstriche.

$old =~ s/\\/\\\\\\\\/g;
$new =~ s/\\/\\\\\\\\/g;
system ("sed -i s/$old/$new/g $FileName"); #so geht's los
system ("sed -i s/ALT\\\\_VARIABLE/NEU\\\\_VARIABLE/g MeineDatei.tex"); # das "sieht perl"
#(Perl-Skript ende)
sed -i s/ALT\\_VARIABLE/NEU\\_VARIABLE/g MeineDatei.tex # das kommt auf der Kommandozeile an.
Danach wird gesucht: "ALT\_VARIABLE"
Das wird eingefügt: "NEU\_VARIABLE"



Um einen Rückstrich als Suchausdruck zu erfassen, muss ich ihn doppelt
nutzen. Perl erwartet, dass nach einem Maskierungszeichen ein besonderes
Zeichen kommt. Würde ich nur s/\/\\\\\\\\/g schreiben, würde es den 2.
Schrägstrich (rot) nicht als Ende des Such-Ausdrucks erkennen, er ist ja
maskiert.

Gleiches gilt für den Ersetzen-Ausdruck. Auch hier steht jedes
Rückstrich-Pärchen für einen tatsächlich eingefügten Rückstrich. Beim
Auswerten des Ausdrucks im system-Befehl, werden wieder doppelte
Rückstriche zu einfachen Rückstrichen reduziert. Auf der Kommandozeile
werden wieder doppelte Rückstriche zu einem einfachen Rückstrich
reduziert. Um also nach einem Rückstrich mit einem Programm wie sed zu
suchen, musste ich mit 8 Rückstrichen starten.

Es gibt vielleicht eine elegantere Methode, aber die Recherche hätte mich
sicher mehr Zeit gekostet, als dieses Skript wert war.</description>
      <dc:date>2010-03-12T00:32:33+01:00</dc:date>
      <title>
    Backslashes in Perl
  </title>
      <pubDate>Fri, 12 Mar 2010 00:32:33 +0100</pubDate>
      <content:encoded>Wir haben die Umgebungsvariablen in unserem Programm geändert. Ich wurde damit beauftragt. Vielleicht weil ich der ansässige Perl-Guru bin. Vielleicht, weil ich mich über die unprofessionellen (weil konsistent inkosistenten) Namen beschwerte hatte. Wahrscheinlicher ist jedoch, dass ich einfach der am geringsten bezahlte Programmierer im Team bin.
&lt;br/&gt;
&lt;br/&gt;Die einfache Strategie: Nach alten Variablen suchen und durch neue ersetzen. Das ist ein typischer Fall für ein Einweg-Perl-Programm. Das Skript ist also nicht besonders hübsch, sondern soll nur seinen Job machen und wird dann nie wieder so gebraucht.
&lt;br/&gt;
&lt;br/&gt;Zunächst erstellte ich eine Liste mit alten und neuen Variablen (die Liste hatte ich auch schon mit Perl erstellt, aber das war nicht so interessant):
&lt;br/&gt;
&lt;br/&gt;&lt;pre&gt;@ReplaceHash = qw(
ALT_VARIABLE NEU_VARIABLE
ALT_VARIABLE1 NEU_VARIABLE1
ALT_VARIABLE2 NEU_VARIABLE2
ALT_VARIABLE3 NEU_VARIABLE3
);&lt;/pre&gt; qw steht übrigens für quote words und übersetzt die Liste &lt;i&gt;qw(Hund Katze Maus)&lt;/i&gt; in &lt;i&gt;("Hund", "Katze", "Maus")&lt;/i&gt;. Es wird also ein Array zurück geliefert. Eine der vielen Vereinfachungen, die man erst richtig schätzen lernt, wenn man in anderen Programmiersprachen Listen umständlich und unleserlich initialisieren muss.
&lt;br/&gt;
&lt;br/&gt;Die Namen sind natürlich nur exemplarisch, tatsächlich ginge es um ca. 20 verschiedene Variablen, die ersetzt werden mussten, und sie hatten kaum etwas gemeinsam. Das war auch der Grund, warum sie ersetzt werden sollten.
&lt;br/&gt;
&lt;br/&gt;Der zweite Trick ist: Hashes (Dictionaries) kann man wie Arrays (Listen) behandeln, wobei die geraden Einträge (0,2,4,6,8) die keys (Schlüsselworte) darstellen, die ungeraden (1,3,5,7,9) die Werte. &lt;i&gt;ReplaceHash{ALT_VARIABLE}&lt;/i&gt; enthält folglich &lt;i&gt;NEU_VARIABLE&lt;/i&gt;. 
&lt;br/&gt;
&lt;br/&gt;&lt;pre&gt;@OldVariables = (keys %ReplaceHash);
$SearchString = join ("|", ReplaceHash);&lt;/pre&gt; hier erstelle ich aus den Schlüsselwerten (ALT_VARIABLE, ALT_VARIABLE1, ALT_VARIABLE2, ALT_VARIABLE3) einen Such-Text, der sich leicht in einer Such-Anweisung (/$SearchString/) nutzen lässt.
&lt;br/&gt;$SearchString enthält danach "ALT_VARIABLE|ALT_VARIABLE1|ALT_VARIABLE2|ALT_VARIABLE3". benutzt man ihn als Such-Text findet er "ALT_VARIABLE" oder "ALT_VARIABLE1" oder "ALT_VARIABLE2" oder "ALT_VARIABLE3".
&lt;br/&gt;
&lt;br/&gt;jetzt kann ich mit &lt;pre&gt;while (&amp;lt;MyFileHandle&amp;gt;)
{
    next unless ($_ =~ /($SearchString)/);
    $old = $1;
    $new = $ReplaceHash{$old};
    print $_;
    $_ =~ s/$old/$new/;
    print $_;
}&lt;/pre&gt; schon einen ersten Probelauf durchführen. In $1 steht der gefundene alte Variablenname, $ReplaceHash{$old} liefert immer den passenden neuen Namen (aus der selbst-erstellten Liste).
&lt;br/&gt;
&lt;br/&gt;(Da ich das ganze über mehrere Dateien laufen ließ, habe ich das Perl-Module Find genutzt. &lt;a href="http://www.adp-gmbh.ch/perl/find.html" target="_blank"&gt;Mehr dazu hier&lt;/a&gt;. Seeeeehr praktisch.)
&lt;br/&gt;
&lt;br/&gt;Als nächstes ersetze ich (GNU-Tools sei dank) &lt;i&gt;$_ =~ s/$old/$new/;&lt;/i&gt; durch &lt;i&gt;system ("sed -i s/$old/$new/g $FileName");&lt;/i&gt;. sed öffnet die Datei $FileName und ersetzt in ihr Texte wie schon das s///-Kommando in Perl, nur dass man sich um nichts weiter kümmern muss.
&lt;br/&gt;
&lt;br/&gt;Das war der normale Teil. Jetzt komme ich zu dem verrückten Aspekt. Ich musste auch die Dokumentation anpassen. Die war in LaTeX geschrieben und da müssen Unterstriche (_) mit einem Rückstrich (\, Backslash, offiziell: Gegenschrägstrich) maskiert, da LaTeX sonst mit dem Text nicht arbeiten kann. Im LaTeX-Rohtext stehen also ALT\_VARIABLE statt ALT_VARIABLE also muss ich auch nach ALT\_VARIABLE suchen.
&lt;br/&gt;
&lt;br/&gt;Kein Problem.&lt;pre&gt;$SearchString =~ s/_/\\_/;&lt;/pre&gt;erledigt das Problem - scheinbar.
&lt;br/&gt;&lt;pre&gt;next unless ($_ =~ /($SearchString)/);&lt;/pre&gt; funktioniert bereits, aber &lt;pre&gt;system ("sed -i s/$old/$new/g $FileName");&lt;/pre&gt; liefert ein lustiges Beispiel für das Auswerten und Auflösen von Rückstrichen.
&lt;br/&gt;&lt;pre&gt;system ("sed -i s/$old/$new/g $FileName"); #so geht's los
system ("sed -i s/ALT\_VARIABLE/NEU\_VARIABLE/g MeineDatei.tex"); # das "sieht perl"
#(Perl-Skript ende)
sed -i s/ALT_VARIABLE/NEU_VARIABLE/g MeineDatei.tex # das kommt auf der Kommandozeile an.
&lt;/pre&gt;
&lt;br/&gt;also brauche ich mehr Rückstriche. 
&lt;br/&gt;&lt;pre&gt;
$old =~ s/\\/\\\\\\\\/g;
$new =~ s/\\/\\\\\\\\/g;
system ("sed -i s/$old/$new/g $FileName"); #so geht's los
system ("sed -i s/ALT\\\\_VARIABLE/NEU\\\\_VARIABLE/g MeineDatei.tex"); # das "sieht perl"
#(Perl-Skript ende)
sed -i s/ALT\\_VARIABLE/NEU\\_VARIABLE/g MeineDatei.tex # das kommt auf der Kommandozeile an.
Danach wird gesucht: "ALT\_VARIABLE"
Das wird eingefügt: "NEU\_VARIABLE"
&lt;/pre&gt;
&lt;br/&gt;
&lt;br/&gt;Um einen Rückstrich als Suchausdruck zu erfassen, muss ich ihn doppelt nutzen. Perl erwartet, dass nach einem Maskierungszeichen ein besonderes Zeichen kommt. Würde ich nur s/\&lt;span&gt;/&lt;/span&gt;\\\\\\\\/g schreiben, würde es den 2. Schrägstrich (rot) nicht als Ende des Such-Ausdrucks erkennen, er ist ja maskiert.
&lt;br/&gt;
&lt;br/&gt;Gleiches gilt für den Ersetzen-Ausdruck. Auch hier steht jedes Rückstrich-Pärchen für einen tatsächlich eingefügten Rückstrich. Beim Auswerten des Ausdrucks im system-Befehl, werden wieder doppelte Rückstriche zu einfachen Rückstrichen reduziert. Auf der Kommandozeile werden wieder doppelte Rückstriche zu einem einfachen Rückstrich reduziert. Um also nach einem Rückstrich mit einem Programm wie sed zu suchen, musste ich mit 8 Rückstrichen starten.
&lt;br/&gt;
&lt;br/&gt;Es gibt vielleicht eine elegantere Methode, aber die Recherche hätte mich sicher mehr Zeit gekostet, als dieses Skript wert war.</content:encoded>
      <dcterms:modified>2010-03-12T00:32:33+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://my.opera.com/EinSascha/blog/8738461</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/40240?from=rss</link>
      <description>I need a persistent reliable distributed job queue with a good Perl
interface.

TheSchwartz would be great but it looks dead. Brad Fitzpatrick is in the
valhalla of Google, last release was in 2008 and cpantesters report more
failures than successes.

gearman is not reliable. It won't retry jobs on another worker nor
workers can return failed jobs.

Resque is too ruby-specific.

beanstalkd looks almost fine, but it does not distinguish between job
types. You cannot easily register one worker for sending emails and
another worker for converting images.

Should I start looking into various Java-based monstrosities like
ActiveMQ?</description>
      <dc:date>2010-03-11T22:45:46Z</dc:date>
      <dc:subject>journal</dc:subject>
      <title>Job queues</title>
      <pubDate>Thu, 11 Mar 2010 22:45:46 -0000</pubDate>
      <content:encoded>I need a persistent reliable distributed job queue with a good Perl interface.

&lt;p&gt; &lt;a href="http://search.cpan.org/dist/TheSchwartz/"&gt;TheSchwartz&lt;/a&gt; would be great but it looks dead. Brad Fitzpatrick is in the valhalla of Google, last release was in 2008 and cpantesters report more failures than successes.

&lt;/p&gt;&lt;p&gt; &lt;a href="http://gearman.org/"&gt;gearman&lt;/a&gt; is not reliable. It won't retry jobs on another worker nor workers can return failed jobs.

&lt;/p&gt;&lt;p&gt; &lt;a href="http://github.com/defunkt/resque"&gt;Resque&lt;/a&gt; is too ruby-specific.

&lt;/p&gt;&lt;p&gt; &lt;a href="http://kr.github.com/beanstalkd/"&gt;beanstalkd&lt;/a&gt; looks almost fine, but it does not distinguish between job types. You cannot easily register one worker for sending emails and another worker for converting images.

&lt;/p&gt;&lt;p&gt;Should I start looking into various Java-based monstrosities like ActiveMQ?&lt;/p&gt;</content:encoded>
      <dcterms:modified>2010-03-11T22:45:46Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://use.perl.org/~kappa/journal/40240?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (SF)</author>
      <dc:creator>nobody@example.com (SF)</dc:creator>
      <category>Perl 6</category>
      <link>http://lastofthecarelessmen.blogspot.com/2010/03/progress-and-congress.html</link>
      <description>So, it's was interesting to see the relative receptions of my last two
posts. Laziness, the Catch caused a massive flurry on discussion on
#perl6, and eventual plans for how to overhaul Perl 6 and Rakudo to deal
with it. As far as I know, though, there's been no development in this
area in Rakudo, so the scary bug is still very much present.

On the other hand, the Lazy Sieve of Eratosthenes gather / take bug is
generally acknowledged, but doesn't have any momentum towards a patch at
all, as far as I can see from #perl6.

On the gripping hand, at least a few of the file operators (another issue
with the E03 update) now work, thanks to lue++.

It does seem like a fantastic amount of progress is being made on Rakudo
at the moment. I just hope these issues get addressed before Rakudo Star.</description>
      <dc:date>2010-03-11T22:04:00Z</dc:date>
      <dc:subject>Perl 6</dc:subject>
      <title>Progress and Congress</title>
      <pubDate>Thu, 11 Mar 2010 22:04:00 -0000</pubDate>
      <content:encoded>So, it's was interesting to see the relative receptions of my last two posts.  &lt;a href="http://lastofthecarelessmen.blogspot.com/2010/02/e03-laziness-catch.html"&gt;Laziness, the Catch&lt;/a&gt; caused a massive flurry on discussion on #perl6, and eventual plans for how to overhaul Perl 6 and Rakudo to deal with it.  As far as I know, though, there's been no development in this area in Rakudo, so the scary bug is still very much present.&lt;br /&gt;&lt;br /&gt;On the other hand, the &lt;a href="http://lastofthecarelessmen.blogspot.com/2010/03/lazy-sieve-of-eratosthenes-sidetracked.html"&gt;Lazy Sieve of Eratosthenes&lt;/a&gt; gather / take bug is generally acknowledged, but doesn't have any momentum towards a patch at all, as far as I can see from #perl6.&lt;br /&gt;&lt;br /&gt;On the gripping hand, at least a few of the file operators (another issue with the E03 update) now work, thanks to lue++.&lt;br /&gt;&lt;br /&gt;It does seem like a fantastic amount of progress is being made on Rakudo at the moment.  I just hope these issues get addressed before Rakudo Star.&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-11T22:04:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-739580098595224395.post-9027074704128440220</guid>
    </item>
    <item>
      <author>nobody@example.com (draegtun)</author>
      <dc:creator>nobody@example.com (draegtun)</dc:creator>
      <category>Programming perl regex</category>
      <link>http://transfixedbutnotdead.com/2010/03/11/regex-brain-fart/</link>
      <enclosure>HASH(0x1cc1a858)</enclosure>
      <description>Yesterday I got stuck for far too long on a simple regex not doing what I
expected it to do. Here is an example:

sub prefix {
    return $1 if $_[0] =~ m/^(\w+)_/;
    return 'unknown';
}

say prefix( 'radio_some_very_long_var_name' );
say prefix( 'comment_blahblah'              );

I was “hoping” to see radio and comment but got back an incorrect
radio_some_very_long_var on first item (and unfortunately I hadn’t
noticed the _name had been dropped. That may have saved a lot of the
heartache!).

I looked long and hard at the regex thinking…

  what is wrong with \w+ ?

Of course what was wrong was me :(

\w regex includes matching the _ (underscore) :)

From perlre pod

  \w – Match a “word” character (alphanumeric plus “_”)

I don’t think I’ve ever needed the pleasure of knowing that… but I do
now! Here’s the correct regex i needed:

m/^([A-Za-z]+)_/

Doh!

/I3az/</description>
      <dc:date>2010-03-11T20:03:02Z</dc:date>
      <dc:subject>Programming perl regex</dc:subject>
      <title>Regex brain fart!</title>
      <pubDate>Thu, 11 Mar 2010 20:03:02 -0000</pubDate>
      <content:encoded>&lt;p&gt;Yesterday I got stuck for far too long on a simple&lt;/em&gt; regex not doing what I expected it to do.  Here is an example:&lt;/p&gt;
&lt;pre class="brush: perl;"&gt;
sub prefix {
    return $1 if $_[0] =~ m/^(\w+)_/;
    return 'unknown';
}

say prefix( 'radio_some_very_long_var_name' );
say prefix( 'comment_blahblah'              );
&lt;/pre&gt;
&lt;p&gt;I was &amp;#8220;hoping&amp;#8221; to see &lt;em&gt;radio&lt;/em&gt; and &lt;em&gt;comment&lt;/em&gt; but got back an incorrect &lt;em&gt;radio_some_very_long_var&lt;/em&gt; on first item (and unfortunately I hadn&amp;#8217;t noticed the &lt;em&gt;_name&lt;/em&gt; had been dropped.  That may have saved a lot of the heartache!).&lt;/p&gt;
&lt;p&gt;I looked long and hard at the regex thinking&amp;#8230;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;what is wrong with \w+ ?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Of course what was wrong was me  &lt;img src="http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif" alt=":("&gt;      &lt;/p&gt;
&lt;p&gt;\w regex includes matching the _ (underscore)  &lt;img src="http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif" alt=":)"&gt; &lt;/p&gt;
&lt;p&gt;From &lt;a href="http://perldoc.perl.org/perlre.html"&gt;perlre pod&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;\w  &amp;#8211;  Match a &amp;#8220;word&amp;#8221; character (alphanumeric plus &amp;#8220;_&amp;#8221;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I don&amp;#8217;t think I&amp;#8217;ve ever needed the pleasure of knowing that&amp;#8230; but I do now!  Here&amp;#8217;s the correct regex i needed:&lt;/p&gt;
&lt;pre class="brush: perl;"&gt;
m/^([A-Za-z]+)_/
&lt;/pre&gt;
&lt;p&gt;Doh!&lt;/p&gt;
&lt;p&gt;/I3az/&lt;/p&gt;
&lt;br /&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/draegtun.wordpress.com/888/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/comments/draegtun.wordpress.com/888/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/draegtun.wordpress.com/888/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/delicious/draegtun.wordpress.com/888/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/draegtun.wordpress.com/888/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/stumble/draegtun.wordpress.com/888/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/draegtun.wordpress.com/888/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/digg/draegtun.wordpress.com/888/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/draegtun.wordpress.com/888/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/reddit/draegtun.wordpress.com/888/"&gt;&lt;/a&gt; &lt;img alt="" src="http://stats.wordpress.com/b.gif?host=transfixedbutnotdead.com&amp;amp;blog=351142&amp;amp;post=888&amp;amp;subd=draegtun&amp;amp;ref=&amp;amp;feed=1"&gt;</content:encoded>
      <dcterms:modified>2010-03-11T20:03:02Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://transfixedbutnotdead.com/?p=888</guid>
    </item>
    <item>
      <author>nobody@example.com (ktat)</author>
      <dc:creator>nobody@example.com (ktat)</dc:creator>
      <category>翻訳</category>
      <link>http://d.hatena.ne.jp/ktat/20100312/1268332534</link>
      <description>アホな記事は新しい記事で忘れよう。

というわけで、tran、久々に手を入れてみた。

http://github.com/ktat/tran


init 死んでたんじゃないかと思います。直したつもり。

backpanから、ソースを取得するようにしました。

他はドキュメントの修正。


CPANには結構ないバージョンが多いので、自動でbackpanから取りたいなーとは思ってたんですが、僕はbackpan.perl.org
を見てしまっていて、ここには、Authorからの一覧しかないんです。

で、どうにもならんなーとか、思ってましたが、ちょい前に、IRCで backpan.cpan.org
を教えてもらい。こっちなら、module名からの一覧があるので、これを使うようにしました。


依存の多いモジュールはオプションにして、本体は依存少なくても動くようになればいいなぁ。Data::Visitorの依存を切ったら、Mooseからは離れられるかもしれない。


テスト書いたら、CPANにあげたいが...。結構先になっちゃいそうだ。</description>
      <dc:date>2010-03-12T03:35:34+09:00</dc:date>
      <dc:subject>翻訳</dc:subject>
      <title>[翻訳]tran</title>
      <pubDate>Fri, 12 Mar 2010 03:35:34 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;アホな記事は新しい記事で忘れよう。&lt;/p&gt;
			&lt;p&gt;というわけで、tran、久々に手を入れてみた。&lt;/p&gt;
			&lt;p&gt;&lt;a href="http://github.com/ktat/tran" target="_blank"&gt;http://github.com/ktat/tran&lt;/a&gt;&lt;/p&gt;
			&lt;br&gt;

			&lt;p&gt;init 死んでたんじゃないかと思います。直したつもり。&lt;/p&gt;
			&lt;p&gt;backpanから、ソースを取得するようにしました。&lt;/p&gt;
			&lt;p&gt;他はドキュメントの修正。&lt;/p&gt;
			&lt;br&gt;

			&lt;p&gt;CPANには結構ないバージョンが多いので、自動でbackpanから取りたいなーとは思ってたんですが、僕はbackpan.perl.org を見てしまっていて、ここには、Authorからの一覧しかないんです。&lt;/p&gt;
			&lt;p&gt;で、どうにもならんなーとか、思ってましたが、ちょい前に、IRCで backpan.cpan.org を教えてもらい。こっちなら、module名からの一覧があるので、これを使うようにしました。&lt;/p&gt;
			&lt;br&gt;

			&lt;p&gt;依存の多いモジュールはオプションにして、本体は依存少なくても動くようになればいいなぁ。Data::Visitorの依存を切ったら、Mooseからは離れられるかもしれない。&lt;/p&gt;
			&lt;br&gt;

			&lt;p&gt;テスト書いたら、CPANにあげたいが...。結構先になっちゃいそうだ。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-12T03:35:34+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://d.hatena.ne.jp/ktat/20100312/1268332534</guid>
    </item>
    <item>
      <author>nobody@example.com (Dave Cross)</author>
      <dc:creator>nobody@example.com (Dave Cross)</dc:creator>
      <category>Programming frameworks legacy code programming rewrites</category>
      <link>http://perlhacks.com/2010/03/crufty-old-perl.php</link>
      <description> It's eighteen months since I wrote "Why Corporates Hate Perl" and it's
worth pointing out that the company I discussed in that article which was
dropping Perl in favour of PHP and Java is still employing as many good
Perl programmers as it can find.

I talked in that article about some rather unsubtle social engineering
that had been going on at that company. Management had started to talk
about Perl as a "legacy language" in an attempt to persuade the business
that they really don't want their applications written in Perl. That
doesn't seem to have been as successful as I feared it would be.

But there's another kind of social engineering that I've seen going on.
And this is happening at the developer level. I've lost count of the
number of times I've been sitting in meetings with developers, discussing
ways to improve the quality of crufty old Perl code when someone throws
in the (more than half-serious) suggestion that we should just rewrite
the whole thing using Rails or Django.

There seems to be this idea that switching to a new framework in a new
language will act as some time of magic bullet and that suddenly all of
our problems will be solved. There are so many ways that this perception
is flawed, Here are my two favourites.

  1. The current system is old and crufty not because it's written in
    Perl, but because it was written by people who didn't understand the
    business requirements fully, didn't know their tools particularly
    well or were under pressure to deliver on a timescale that didn't
    give them time to design the system properly. Often it's a
    combination of all three. Given the time to rewrite the system from
    scratch, of course it will be better. But it will be better because
    the business is better understood and tools and techniques have been
    improved - not because it's no longer written in Perl.

  2. Frameworks in other languages are not easier to use or more powerful
    than frameworks in Perl. Anything that you can do with Rails or
    Django you can do just as easily with Catalyst. It's using a
    framework that's the big win here, not the particular framework that
    you use. Sure, if you're a Ruby house then using a Ruby framework
    will probably match your existing developers' skills more closely but
    if your current system is written in Perl then, hopefully, you have a
    team of people with Perl skills and that's going to be the language
    you'll want to look at.


I'm tired of Perl being seen as a second-class citizen in the dynamic
languages world. I freely admit that there's a lot of bad Perl code out
there (I'll even admit to writing some of it) but it's not bad Perl code
because it's Perl, it's bad Perl code because it's bad code.

This is what the Perl marketing initiative is for. We need people to know
that Perl is not the same language that they stopped using ten years ago.
Modern Perl can compete with any of the features of any other dynamic
language.

By al means, try to get the time to rewrite your crufty old systems. But
rewrite them in Modern Perl. You'll enjoy it and you'll be really
productive.

p.s. I should point out that I'm not talking about any specific client
here. This is based on conversations that I've had at various companies
over the last couple of years and also discussions with many developers
in many pubs.</description>
      <dc:date>2010-03-11T19:05:36+01:00</dc:date>
      <dc:subject>Programming frameworks legacy code programming rewrites</dc:subject>
      <title>Crufty Old Perl</title>
      <pubDate>Thu, 11 Mar 2010 19:05:36 +0100</pubDate>
      <content:encoded>
            It's eighteen months since I wrote "&lt;a href="http://www.oreillynet.com/onlamp/blog/2008/08/why_corporates_hate_perl.html"&gt;Why Corporates Hate Perl&lt;/a&gt;" and it's worth pointing out that the company I discussed in that article which was dropping Perl in favour of PHP and Java is still employing as many good Perl programmers as it can find.&lt;br /&gt;&lt;br /&gt;I talked in that article about some rather unsubtle social engineering that had been going on at that company. Management had started to talk about Perl as a "legacy language" in an attempt to persuade the business that they really don't want their applications written in Perl. That doesn't seem to have been as successful as I feared it would be.&lt;br /&gt;&lt;br /&gt;But there's another kind of social engineering that I've seen going on. And this is happening at the developer level. I've lost count of the number of times I've been sitting in meetings with developers, discussing ways to improve the quality of crufty old Perl code when someone throws in the (more than half-serious) suggestion that we should just rewrite the whole thing using Rails or Django.&lt;br /&gt;&lt;br /&gt;There seems to be this idea that switching to a new framework in a new language will act as some time of magic bullet and that suddenly all of our problems will be solved. There are so many ways that this perception is flawed, Here are my two favourites.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The current system is old and crufty not because it's written in Perl, but because it was written by people who didn't understand the business requirements fully, didn't know their tools particularly well or were under pressure to deliver on a timescale that didn't give them time to design the system properly. Often it's a combination of all three. Given the time to rewrite the system from scratch, of course it will be better. But it will be better because the business is better understood and tools and techniques have been improved - not because it's no longer written in Perl.&lt;/li&gt;&lt;li&gt;Frameworks in other languages are not easier to use or more powerful than frameworks in Perl. Anything that you can do with Rails or Django you can do just as easily with Catalyst. It's using a framework that's the big win here, not the particular framework that you use. Sure, if you're a Ruby house then using a Ruby framework will probably match your existing developers' skills more closely but if your current system is written in Perl then, hopefully, you have a team of people with Perl skills and that's going to be the language you'll want to look at.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I'm tired of Perl being seen as a second-class citizen in the dynamic languages world. I freely admit that there's a lot of bad Perl code out there (I'll even admit to writing some of it) but it's not bad Perl code because it's Perl, it's bad Perl code because it's bad code.&lt;br /&gt;&lt;br /&gt;This is what the Perl marketing initiative is for. We need people to know that Perl is not the same language that they stopped using ten years ago. Modern Perl can compete with any of the features of any other dynamic language.&lt;br /&gt;&lt;br /&gt;By al means, try to get the time to rewrite your crufty old systems. But rewrite them in Modern Perl. You'll enjoy it and you'll be really productive.&lt;br /&gt;&lt;br /&gt;p.s. I should point out that I'm not talking about any specific client here. This is based on conversations that I've had at various companies over the last couple of years and also discussions with many developers in many pubs.&lt;br /&gt;
            
        </content:encoded>
      <dcterms:modified>2010-03-11T19:05:36+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:perlhacks.com,2010://1.52</guid>
    </item>
    <item>
      <author>nobody@example.com (Michele Beltrame)</author>
      <dc:creator>nobody@example.com (Michele Beltrame)</dc:creator>
      <category>corso ironman italia italiano oreilly perl tutorial</category>
      <link>http://www.cattlegrid.info/blog/2010/03/introduzione-a-perl-da-oreilly.html</link>
      <description>La O'Reilly School of Technology ha reso disponibile la prima parte del
corso di perl del Perl Programming Certificate.

In questa parte introduttiva vengono spiegate le basi del linguaggio, dai
tipi di dati alle subroutine, dai loop all'accesso ai file esterni. Il
corso, per accedere al quale basta un browser (e il pagamento della quota
d'iscrizione ;-)) prevede molti aspetti pratici.

Se la qualità è quella che di solito si trova nei libri O'Reilly, ci sono
buone possibilità che questo corso sia un buon modo per apprendere il
linguaggio.</description>
      <dc:date>2010-03-11T16:17:22Z</dc:date>
      <dc:subject>corso ironman italia italiano oreilly perl tutorial</dc:subject>
      <title>Introduzione a Perl da O'Reilly School of Technology</title>
      <pubDate>Thu, 11 Mar 2010 16:17:22 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;La &lt;a href="http://www.oreillyschool.com/"&gt;&lt;span class="caps"&gt;O'R&lt;/span&gt;eilly School of Technology&lt;/a&gt; ha reso disponibile la prima parte del &lt;a href="http://www.oreillyschool.com/courses/perl1/?utm_content=em-ost-npa-Perl1-split-B-sans-offer&amp;amp;utm_campaign=OST&amp;amp;utm_source=iPost&amp;amp;utm_medium=email&amp;amp;imm_mid=0561ad&amp;amp;cmp=em-ost-npa-Perl1-split-B-sans-offer"&gt;corso di perl del Perl Programming Certificate&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In questa parte introduttiva vengono spiegate le basi del linguaggio, dai tipi di dati alle subroutine, dai loop all'accesso ai file esterni. Il corso, per accedere al quale basta un browser (e il pagamento della quota d'iscrizione ;-)) prevede molti aspetti pratici.&lt;/p&gt;

&lt;p&gt;Se la qualità è quella che di solito si trova nei libri &lt;span class="caps"&gt;O'R&lt;/span&gt;eilly, ci sono buone possibilità che questo corso sia un buon modo per apprendere il linguaggio.&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-11T16:17:22Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.cattlegrid.info,2010:/blog//1.220</guid>
    </item>
    <item>
      <author>nobody@example.com (ash)</author>
      <dc:creator>nobody@example.com (ash)</dc:creator>
      <category>Не Perl gearman gearmand perl</category>
      <link>http://onperl.ru/onperl/2010/03/rmfunc-gearman.html</link>
      <description>Те, кто использовал Gearman в работе, наверняка сталкивались с ситуацией,
когда разрабатываемый воркер либо падает во время отладки, либо по
забывчивости не был подключен, но при этом приложение уже начало посылать
запросы на выполнение задач, обслуживаемых этим воркером.

В статусе job-сервера такие задачи видны с «перекошенным» счетчиком:

  new_feature 14 0 0

То есть запросы на выполнение этой задачи в очедери уже есть, но
обслужить ее некому. Непрятность здесь может быть в том, что как только
подключится воркер, весь этот пул запросов потечет сразу к нему, и при
отладке это крайне неудобно. Перезагружать job-сервер, чтобы обнулить
счетчики, тоже не лучший выход, поскольку придется перезапустить все
воркеры.

Мариан Маринов, технический архитектор компании SiteGround, сегодня
добавил в интерфейс команду rmfunc, которая позволяет удалить функцию из
списка зарегистрированных.

Пользоваться новой командой крайне просто:

  $ telnet localhost 4730
  Trying 127.0.0.1...
  Connected to localhost.
  Escape character is '^]'.
  status
  new_feature 14 0 0
  .
  rmfunc new_feature
  OK
  status
  .

Запрос на удаление функции, для которой существует «живой» воркер,
завершается с ошибкой ERR there are still connected workers.

P. S. Сейчас весь код находится в отдельной ветке.</description>
      <dc:date>2010-03-11T14:26:25+01:00</dc:date>
      <dc:subject>Не Perl gearman gearmand perl</dc:subject>
      <title>Команда rmfunc в job-сервере Gearman</title>
      <pubDate>Thu, 11 Mar 2010 14:26:25 +0100</pubDate>
      <content:encoded>
        &lt;p&gt;Те, кто использовал &lt;a href="http://onperl.ru/cgi-bin/mt/mt-search.cgi?blog_id=1&amp;amp;tag=gearman&amp;amp;limit=20"&gt;Gearman&lt;/a&gt; в работе, наверняка сталкивались с ситуацией, когда разрабатываемый воркер либо падает во время отладки, либо по забывчивости не был подключен, но при этом приложение уже начало посылать запросы на выполнение задач, обслуживаемых этим воркером.&lt;/p&gt;
&lt;p&gt;В &lt;a href="http://onperl.ru/onperl/2009/12/gearman-4-monitoring.html"&gt;статусе&lt;/a&gt; job-сервера такие задачи видны с «перекошенным» счетчиком:&lt;/p&gt;&lt;tt&gt;
&lt;blockquote dir="ltr"&gt;
&lt;p&gt;new_feature &lt;span&gt;14&lt;/span&gt; 0 0&lt;/p&gt;&lt;/blockquote&gt;&lt;/tt&gt;
&lt;p&gt;То есть запросы на выполнение этой задачи в очедери уже есть, но обслужить ее некому. Непрятность здесь может быть в том, что как только подключится воркер, весь этот пул запросов потечет сразу к нему, и при отладке это крайне неудобно. Перезагружать job-сервер, чтобы обнулить счетчики, тоже не лучший выход, поскольку придется перезапустить все воркеры.&lt;/p&gt;
&lt;p&gt;Мариан Маринов, технический архитектор компании &lt;a href="http://siteground.com/"&gt;SiteGround&lt;/a&gt;, сегодня&amp;nbsp;&lt;a href="http://bazaar.launchpad.net/~mm-yuhu/gearmand/server-funcs/revision/332/libgearman-server/server.c"&gt;добавил в интерфейс команду rmfunc&lt;/a&gt;, которая позволяет удалить функцию из списка зарегистрированных.&lt;/p&gt;
&lt;p&gt;Пользоваться новой командой крайне просто:&lt;/p&gt;&lt;tt&gt;
&lt;blockquote dir="ltr"&gt;
&lt;p&gt;$ telnet localhost 4730&lt;br /&gt;Trying 127.0.0.1...&lt;br /&gt;Connected to localhost.&lt;br /&gt;Escape character is '^]'.&lt;br /&gt;status&lt;br /&gt;new_feature 14 0 0&lt;br /&gt;.&lt;br /&gt;&lt;span&gt;rmfunc new_feature&lt;/span&gt;&lt;br /&gt;OK&lt;br /&gt;status&lt;br /&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/tt&gt;
&lt;p&gt;Запрос на удаление функции, для которой существует «живой» воркер, завершается с ошибкой &lt;span&gt;ERR there are still connected workers&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;P. S. Сейчас весь код находится в отдельной ветке.&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-11T14:26:25+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:onperl.ru,2010:/onperl//1.162</guid>
    </item>
    <item>
      <author>nobody@example.com (Andy Brown - SetitesUK)</author>
      <dc:creator>nobody@example.com (Andy Brown - SetitesUK)</dc:creator>
      <category>mental health R-mode Pragmatic Thinking and Learning L-mode programming pragprog perl ironman</category>
      <link>http://vampiresoftware.blogspot.com/2010/03/artificial-intelligence-vs-human-brain.html</link>
      <description>Here is a plea to all people working on Artificial Intelligence.

Please think about what you are doing, and try to avoid loose wiring.

My wife has suffered from Post-Natal depression ever since the birth of
our son 4 and half years ago. Yesterday, I took her into hospital again
to ensure that she is safe (she is plagued by voices at the moment)
whilst the new medication ramps up to a level which is therapeutic for
her.

This, as you may expect, is quite distressing for all of us. We have
support systems in place though, and my work are being frankly fantastic
about it all.

It gets me thinking though. I can program computers to get them to behave
in particular ways, but how do you rewrite the programming in a brain.

I recently read 'Pragmatic Thinking and Learning - Refactor your Wetware'
by Andy Hunt (www.pragprog.com).

This is great for yourself, or even trying to suggest to others. I have
found some easy to apply tips and some which I need to get round to
trying, but one thing it shows is that we have set ways of doing things.
Our Logic/Linear-mode (L-mode) tends to be dominant, and seems to have
the most influence, unless, as the book suggests, we deliberately try to
get information from our Rich-mode (R-mode).

The key thing with this though is that we control the flow of
information, we determine if we will do it. We seem to have a controlling
Sensible-mode (S-mode).

And this is what I like about Computer Programming. A computer really
only sources from L-mode, and it allows the L-mode to control it. So I
can write a program that is logical, instructs the computer, and it
doesn't get anything else influencing it (well, assuming I have taken
care of external running factors such as OS, file locations...)

My wife though, is not controlling her own thoughts. What is, we don't
know, but not her. Her S-mode seems to lose it's control. Whether the
thoughts are L-mode or R-mode based (traditionally, it would look like
those things are "Right-brain" thought processes, although when she
explains her thoughts, you could argue the Logic-mode is having a say).

Luckily, this time, my wife's S-mode seems to be working enough to stop
her finishing the act, but she is getting somewhere close to it (popping
enough pills out of a blister pack, but at the last minute, throwing them
in the bin instead of taking them).

So where am I going with this.

My opening request is to think about AI, and not introduce loose wiring.
Truly Artificial Intelligence should be able to think both in L-mode and
have R-mode, but with an overriding S-mode to control all the thoughts.

I like programming because what I produce only has to act logically. I am
in turmoil because my wife has some 'loose wires' which are not allowing
her to act completely rationally, and I can't fix the bug in the program
to correct it.

If AI is a true goal of the computer technology industry, then lets hope
that the coding which goes into it won't allow for the loose wires which
screw up the controller, or else we might just have a lot of depressive
machines which need careful looking after whilst we feed them lots of
pill programs to try to make them better.

Here's hoping that the pills my wife is now taking soon start to sort out
her programming. I'm glad I never became a psychiatrist.

signup banner</description>
      <dc:date>2010-03-11T13:07:00Z</dc:date>
      <dc:subject>mental health R-mode Pragmatic Thinking and Learning L-mode programming pragprog perl ironman</dc:subject>
      <title>Artificial Intelligence vs the human brain</title>
      <pubDate>Thu, 11 Mar 2010 13:07:00 -0000</pubDate>
      <content:encoded>Here is a plea to all people working on Artificial Intelligence.&lt;br /&gt;&lt;br /&gt;Please think about what you are doing, and try to avoid loose wiring.&lt;br /&gt;&lt;br /&gt;My wife has suffered from Post-Natal depression ever since the birth of our son 4 and half years ago. Yesterday, I took her into hospital again to ensure that she is safe (she is plagued by voices at the moment) whilst the new medication ramps up to a level which is therapeutic for her.&lt;br /&gt;&lt;br /&gt;This, as you may expect, is quite distressing for all of us. We have support systems in place though, and my work are being frankly fantastic about it all.&lt;br /&gt;&lt;br /&gt;It gets me thinking though. I can program computers to get them to behave in particular ways, but how do you rewrite the programming in a brain.&lt;br /&gt;&lt;br /&gt;I recently read 'Pragmatic Thinking and Learning - Refactor your Wetware' by Andy Hunt (www.pragprog.com).&lt;br /&gt;&lt;br /&gt;This is great for yourself, or even trying to suggest to others. I have found some easy to apply tips and some which I need to get round to trying, but one thing it shows is that we have set ways of doing things. Our Logic/Linear-mode (L-mode) tends to be dominant, and seems to have the most influence, unless, as the book suggests, we deliberately try to get information from our Rich-mode (R-mode).&lt;br /&gt;&lt;br /&gt;The key thing with this though is that we control the flow of information, we determine if we will do it. We seem to have a controlling Sensible-mode (S-mode).&lt;br /&gt;&lt;br /&gt;And this is what I like about Computer Programming. A computer really only sources from L-mode, and it allows the L-mode to control it. So I can write a program that is logical, instructs the computer, and it doesn't get anything else influencing it (well, assuming I have taken care of external running factors such as OS, file locations...)&lt;br /&gt;&lt;br /&gt;My wife though, is not controlling her own thoughts. What is, we don't know, but not her. Her S-mode seems to lose it's control. Whether the thoughts are L-mode or R-mode based (traditionally, it would look like those things are "Right-brain" thought processes, although when she explains her thoughts, you could argue the Logic-mode is having a say).&lt;br /&gt;&lt;br /&gt;Luckily, this time, my wife's S-mode seems to be working enough to stop her finishing the act, but she is getting somewhere close to it (popping enough pills out of a blister pack, but at the last minute, throwing them in the bin instead of taking them).&lt;br /&gt;&lt;br /&gt;So where am I going with this.&lt;br /&gt;&lt;br /&gt;My opening request is to think about AI, and not introduce loose wiring. Truly Artificial Intelligence should be able to think both in L-mode and have R-mode, but with an overriding S-mode to control all the thoughts.&lt;br /&gt;&lt;br /&gt;I like programming because what I produce only has to act logically. I am in turmoil because my wife has some 'loose wires' which are not allowing her to act completely rationally, and I can't fix the bug in the program to correct it.&lt;br /&gt;&lt;br /&gt;If AI is a true goal of the computer technology industry, then lets hope that the coding which goes into it won't allow for the loose wires which screw up the controller, or else we might just have a lot of depressive machines which need careful looking after whilst we feed them lots of pill programs to try to make them better.&lt;br /&gt;&lt;br /&gt;Here's hoping that the pills my wife is now taking soon start to sort out her programming. I'm glad I never became a psychiatrist.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ironman.enlightenedperl.org/signup/new_feed"&gt;&lt;img alt="signup banner" src="http://enlightenedperl.org/images/ironsignup.png"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt=""&gt;&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-03-11T13:07:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-1158653486009791669.post-1711534881757063827</guid>
    </item>
    <item>
      <author>nobody@example.com (D)</author>
      <dc:creator>nobody@example.com (D)</dc:creator>
      <category>開発 anyevent perl</category>
      <link>http://mt.endeworks.jp/d-6/2010/03/anyevent-aio.html</link>
      <description>まだこう、細かいpros/consがわからないのでなんとも言えないんだけど、とりあえずaio_open/aio_writeと普通のopen/print/closeで同じ事した場合とでベンチマークとか取ってみた。これでいいのかなー
環境はMac OS X 10.5.8, 2.4 GHz Intel Core 2 Duo, 4GM RAM.

Comparing with buffer size 10...
         Rate normal    aio
normal 80.0/s     --   -19%
aio    99.0/s    24%     --
Comparing with buffer size 100...
         Rate normal    aio
normal 80.0/s     --   -18%
aio    97.1/s    21%     --
Comparing with buffer size 1000...
         Rate normal    aio
normal 76.9/s     --   -13%
aio    88.5/s    15%     --
Comparing with buffer size 10000...
         Rate normal    aio
normal 52.4/s     --   -27%
aio    71.9/s    37%     --
Comparing with buffer size 100000...
         Rate normal    aio
normal 15.9/s     --   -63%
aio    42.7/s   169%     --


コードはこちら、githubで。</description>
      <dc:date>2010-03-11T21:05:29+09:00</dc:date>
      <dc:subject>開発 anyevent perl</dc:subject>
      <title>AnyEvent::AIOをとりあえず試す</title>
      <pubDate>Thu, 11 Mar 2010 21:05:29 +0900</pubDate>
      <content:encoded>
        &lt;div&gt;まだこう、細かいpros/consがわからないのでなんとも言えないんだけど、とりあえずaio_open/aio_writeと普通のopen/print/closeで同じ事した場合とでベンチマークとか取ってみた。これでいいのかなー&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;環境はMac OS X 10.5.8, 2.4 GHz Intel Core 2 Duo, 4GM RAM.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;pre class="code_listing"&gt;Comparing with buffer size 10...
         Rate normal    aio
normal 80.0/s     --   -19%
aio    99.0/s    24%     --
Comparing with buffer size 100...
         Rate normal    aio
normal 80.0/s     --   -18%
aio    97.1/s    21%     --
Comparing with buffer size 1000...
         Rate normal    aio
normal 76.9/s     --   -13%
aio    88.5/s    15%     --
Comparing with buffer size 10000...
         Rate normal    aio
normal 52.4/s     --   -27%
aio    71.9/s    37%     --
Comparing with buffer size 100000...
         Rate normal    aio
normal 15.9/s     --   -63%
aio    42.7/s   169%     --
&lt;/pre&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;コードはこちら、&lt;a href="http://gist.github.com/328974"&gt;github&lt;/a&gt;で。&lt;/div&gt;

        
    </content:encoded>
      <dcterms:modified>2010-03-11T21:05:29+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:mt.endeworks.jp,2010:/d-6//3.2468</guid>
    </item>
    <item>
      <author>nobody@example.com (jozef)</author>
      <dc:creator>nobody@example.com (jozef)</dc:creator>
      <category>journal</category>
      <link>http://use.perl.org/~jozef/journal/40239?from=rss</link>
      <description>&lt;a href="http://pkg-perl.alioth.debian.org/howto/RFP.html"&gt;http://pkg-perl.alioth.debian.org/howto/RFP.html&lt;/a&gt;</description>
      <dc:date>2010-03-11T10:35:49Z</dc:date>
      <dc:subject>journal</dc:subject>
      <title>How to get a CPAN module into Debian</title>
      <pubDate>Thu, 11 Mar 2010 10:35:49 -0000</pubDate>
      <content:encoded>&lt;a href="http://pkg-perl.alioth.debian.org/howto/RFP.html"&gt;http://pkg-perl.alioth.debian.org/howto/RFP.html&lt;/a&gt;</content:encoded>
      <dcterms:modified>2010-03-11T10:35:49Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://use.perl.org/~jozef/journal/40239?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (jozef)</author>
      <dc:creator>nobody@example.com (jozef)</dc:creator>
      <category>journal</category>
      <link>http://use.perl.org/~jozef/journal/40238?from=rss</link>
      <description>"The squeeze freeze is also just around the corner AFAIK so I don't think
there's much chance of 5.12 making it in. If somebody wants to step up
and push for it, they should definitely talk to the release team first."

http://lists.debian.org/debian-perl/2010/03/msg00045.html</description>
      <dc:date>2010-03-11T10:01:23Z</dc:date>
      <dc:subject>journal</dc:subject>
      <title>Perl 5.12 for Squeeze?</title>
      <pubDate>Thu, 11 Mar 2010 10:01:23 -0000</pubDate>
      <content:encoded>&lt;p&gt;"The squeeze freeze is also just around the corner AFAIK so I don't think there's much chance of 5.12 making it in. If somebody wants to step up and push for it, they should definitely talk to the release team first."&lt;/p&gt;&lt;p&gt; &lt;a href="http://lists.debian.org/debian-perl/2010/03/msg00045.html"&gt;http://lists.debian.org/debian-perl/2010/03/msg00045.html&lt;/a&gt; &lt;/p&gt;</content:encoded>
      <dcterms:modified>2010-03-11T10:01:23Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://use.perl.org/~jozef/journal/40238?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (Yanick)</author>
      <dc:creator>nobody@example.com (Yanick)</dc:creator>
      <category>perl cache cpan darkpan dpanneur proxy</category>
      <link>http://babyl.dyndns.org/techblog/2010/03/dpanneur---your-friendly-darkpancpan-proxy-corner-store.html</link>
      <description>dépanneur
CC BY-NC-SA 2.0

There were two things I wanted to do for some time now. The first was to
come up with a way to quickly and easily set up a DarkPAN mirror, so that
we would have more control over our dependency chain at work. The second
one was to make a portable CPAN proxy service, so that I can always have
access to my favorite modules, even if the machine I'm working on has no
Internet access. Last week, I finally had a few rount tuits to spend on
that type of background itch, and the result is dpanneur (for dépanneur,
French Canadian for convenience store).

Installation

As it stands, dpanneur is a very thin Catalyst application gluing
together the goodiness of CPAN::Cache and MyCPAN::App::DPAN, and throwing
in Git as the archive manager.

To get it running, first fetch it from Github

$ git clone git://github.com/yanick/dpanneur.git

then check that you have all the dependencies

$ perl Makefile.PL

and run the scrip that will create the module repository

$ ./script/create_repo

For now, the module repository is hard-coded to be in the subdirectory
cpan of dpanneur. A branch called proxy is created and checked out.
Eventually, I'll use GitStore to push newly fetched modules to the
repository, but for the time being if dpanneur is to be used as a proxy,
that branch must remain the one being checked out.

All that is left is to fire up the server in whichever mode you prefer
(single-thread test server would do nicely for now)

$ ./script/dpanneur_server.pl

and there you are, running your first dpanneur. Congrats! :-)

Using it as a caching proxy

You can use the server as a caching proxy, either for its own sake, or to
seed the DarkPAN branches. To do that, you just have to configure your
cpan client to use http://yourmachine:3000/proxy:

$ cpan
cpan[1]&gt; o conf urllist = http://localhost:3000/proxy
cpan[2]&gt; reload index
cpan[3]&gt; install Acme::EyeDrops
Running install for module 'Acme::EyeDrops'
Running make for A/AS/ASAVIGE/Acme-EyeDrops-1.55.tar.gz
Fetching with LWP: 
    http://localhost:3000/proxy/authors/id/A/AS/ASAVIGE/Acme-EyeDrops-1.55.tar.gz
etc..

As the modules are downloaded, they are also saved and committed within
the repo

[dpanneur]$ cd cpan

[cpan (proxy)]$ git log -n 3
commit d065ad152f2204295334c5475104a3da517b6ae1
Author: Yanick Champoux &lt;yanick@babyl.dyndns.org&gt;
Date:   Wed Mar 10 20:32:52 2010 -0500

    authors/id/A/AS/ASAVIGE/Acme-EyeDrops-1.55.tar.gz

commit e8d2e83d1b16e2e0713d125f9a4bd2742681f859
Author: Yanick Champoux &lt;yanick@babyl.dyndns.org&gt;
Date:   Wed Mar 10 20:31:42 2010 -0500

    authors/id/D/DC/DCONWAY/Acme-Bleach-1.12.tar.gz

commit 7e0b4b600bac8424c519199ee96dc56ffbb177eb
Author: Yanick Champoux &lt;yanick@babyl.dyndns.org&gt;
Date:   Wed Mar 10 20:30:47 2010 -0500

    modules/03modlist.data.gz

Using it as a DarkPAN server

Enabling DarkPAN repos is not much more involving. All we have to do is
to create a branch with the modules we want and have the 'dpan' utility
bundled with MyCPAN::App::DPAN generate the right files for us.

To continue with the example of the previous section, let's say that we
want a DarkPAN branch containing Acme::EyeDrops, but not Acme::Bleach.
Then we'd do

                        # only necessary if you are running 
                        # the server while you work on the branch
[dpanneur]$ git clone cpan cpan-work   

[dpanneur]$ cd cpan-work

                        # branch just before we imported Acme::Bleach
[cpan-work (proxy)]$ git branch pictoral 7e0b4b600bac8424c519199ee96dc56ffbb177eb

[cpan-work (proxy)]$ git checkout pictoral
Switched to branch 'pictoral'

                        # cherry-pick the Acme::EyeDrops commit
[cpan-work (pictoral)]$ git cherry-pick d065ad152f2204295334c5475104a3da517b6ae1

                        # rebuild the module list
[cpan-work (pictoral)]$ dpan

                        # commit the new 02packages.details.txt.gz
[cpan-work (pictoral)]$ git add .
[cpan-work (pictoral)]$ git commit -m "dpan processing"

                        # push back to the mothership
[cpan-work (pictoral)]$ git push origin pictoral

And that's it. Now point the cpan client to
http://yourmachine:3000/pictoral, and you'll get the limited mirror.

cpan[1]&gt; o conf urllist http://localhost:3000/pictoral                                               
cpan[2]&gt; reload index

cpan[3]&gt; i Acme::EyeDrops
Strange distribution name [Acme::EyeDrops]
Module id = Acme::EyeDrops
    CPAN_USERID  ASAVIGE (Andrew J. Savige &lt;asavige@cpan.org&gt;)
    CPAN_VERSION 1.55
    CPAN_FILE    A/AS/ASAVIGE/Acme-EyeDrops-1.55.tar.gz
    UPLOAD_DATE  2008-12-02
    MANPAGE      Acme::EyeDrops - Visual Programming in Perl
    INST_FILE    /usr/local/share/perl/5.10.0/Acme/EyeDrops.pm
    INST_VERSION 1.55


cpan[4]&gt; i Acme::Bleach
Strange distribution name [Acme::Bleach]
No objects found of any type for argument Acme::Bleach</description>
      <dc:date>2010-03-11T03:22:32Z</dc:date>
      <dc:subject>perl cache cpan darkpan dpanneur proxy</dc:subject>
      <title>dpanneur - your friendly darkpan/CPAN proxy corner store</title>
      <pubDate>Thu, 11 Mar 2010 03:22:32 -0000</pubDate>
      <content:encoded>
        &lt;div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/21253803@N06/4127553776/"&gt;
&lt;a rel="cc:attributionURL" href="http://www.flickr.com/photos/21253803@N06/"&gt;&lt;img src="http://babyl.dyndns.org/techblog/depanneur.jpg" alt="d&amp;eacute;panneur"&gt;&lt;br/&gt;
&lt;/a&gt;
&lt;a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.0/"&gt;CC BY-NC-SA 2.0&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;There were two things I wanted to do for some time now.  The first was to come up with a way to quickly and easily set up a DarkPAN mirror, so that we would have more control over our dependency chain at work. The second one was to make a portable CPAN proxy service, so that I can always have access to my favorite modules, even if
the machine I'm working on has no Internet access.  Last week, I finally had a few
rount tuits to spend on that type of background itch, and the result is &lt;a href="http://github.com/yanick/dpanneur"&gt;dpanneur&lt;/a&gt; (for &lt;em&gt;dépanneur&lt;/em&gt;, French Canadian for &lt;em&gt;convenience store&lt;/em&gt;).  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As it stands, &lt;em&gt;dpanneur&lt;/em&gt; is a very thin  Catalyst application gluing together the goodiness of &lt;a href="http://search.cpan.org/dist/CPAN-Cache"&gt;CPAN::Cache&lt;/a&gt; and &lt;a href="http://search.cpan.orgl/dist/MyCPAN-App-DPAN"&gt;MyCPAN::App::DPAN&lt;/a&gt;, and throwing in Git as the archive manager.&lt;/p&gt;

&lt;p&gt;To get it running, first fetch it from Github&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git clone git://github.com/yanick/dpanneur.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;then check that you have all the dependencies&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ perl Makefile.PL
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and run the scrip that will create the module repository&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./script/create_repo
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For now, the module repository is hard-coded to be in the subdirectory &lt;em&gt;cpan&lt;/em&gt; of &lt;em&gt;dpanneur&lt;/em&gt;.  A branch called &lt;em&gt;proxy&lt;/em&gt; is created and checked out. Eventually, I'll use GitStore to push newly fetched modules to the repository, but for the time being if &lt;em&gt;dpanneur&lt;/em&gt; is to be used as a proxy, that branch must remain the one being checked out.&lt;/p&gt;

&lt;p&gt;All that is left is to fire up the server in whichever mode you prefer (single-thread test server would do nicely for now)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./script/dpanneur_server.pl
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and there you are, running your first dpanneur. Congrats! :-)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using it as a caching proxy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can use the server as a caching proxy, either for its own sake, or to seed the DarkPAN branches.  To do that, you just have to configure your cpan client to use &lt;em&gt;http://yourmachine:3000/proxy&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cpan
cpan[1]&amp;gt; o conf urllist = http://localhost:3000/proxy
cpan[2]&amp;gt; reload index
cpan[3]&amp;gt; install Acme::EyeDrops
Running install for module 'Acme::EyeDrops'
Running make for A/AS/ASAVIGE/Acme-EyeDrops-1.55.tar.gz
Fetching with LWP: 
    http://localhost:3000/proxy/authors/id/A/AS/ASAVIGE/Acme-EyeDrops-1.55.tar.gz
etc..
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As the modules are downloaded, they are also saved and committed within the repo&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[dpanneur]$ cd cpan

[cpan (proxy)]$ git log -n 3
commit d065ad152f2204295334c5475104a3da517b6ae1
Author: Yanick Champoux &amp;lt;yanick@babyl.dyndns.org&amp;gt;
Date:   Wed Mar 10 20:32:52 2010 -0500

    authors/id/A/AS/ASAVIGE/Acme-EyeDrops-1.55.tar.gz

commit e8d2e83d1b16e2e0713d125f9a4bd2742681f859
Author: Yanick Champoux &amp;lt;yanick@babyl.dyndns.org&amp;gt;
Date:   Wed Mar 10 20:31:42 2010 -0500

    authors/id/D/DC/DCONWAY/Acme-Bleach-1.12.tar.gz

commit 7e0b4b600bac8424c519199ee96dc56ffbb177eb
Author: Yanick Champoux &amp;lt;yanick@babyl.dyndns.org&amp;gt;
Date:   Wed Mar 10 20:30:47 2010 -0500

    modules/03modlist.data.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Using it as a DarkPAN server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enabling DarkPAN repos is not much more involving.  All we have to do is to create a branch with the modules we want and have the 'dpan' utility bundled with MyCPAN::App::DPAN generate the right files for us. &lt;/p&gt;

&lt;p&gt;To continue with the example of the previous section, let's say that we want a DarkPAN branch containing Acme::EyeDrops, but not Acme::Bleach.  Then we'd do&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;                        # only necessary if you are running 
                        # the server while you work on the branch
[dpanneur]$ git clone cpan cpan-work   

[dpanneur]$ cd cpan-work

                        # branch just before we imported Acme::Bleach
[cpan-work (proxy)]$ git branch pictoral 7e0b4b600bac8424c519199ee96dc56ffbb177eb

[cpan-work (proxy)]$ git checkout pictoral
Switched to branch 'pictoral'

                        # cherry-pick the Acme::EyeDrops commit
[cpan-work (pictoral)]$ git cherry-pick d065ad152f2204295334c5475104a3da517b6ae1

                        # rebuild the module list
[cpan-work (pictoral)]$ dpan

                        # commit the new 02packages.details.txt.gz
[cpan-work (pictoral)]$ git add .
[cpan-work (pictoral)]$ git commit -m "dpan processing"

                        # push back to the mothership
[cpan-work (pictoral)]$ git push origin pictoral
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And that's it.  Now point the cpan client to &lt;em&gt;http://yourmachine:3000/pictoral&lt;/em&gt;, and you'll get the limited mirror.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cpan[1]&amp;gt; o conf urllist http://localhost:3000/pictoral                                               
cpan[2]&amp;gt; reload index

cpan[3]&amp;gt; i Acme::EyeDrops
Strange distribution name [Acme::EyeDrops]
Module id = Acme::EyeDrops
    CPAN_USERID  ASAVIGE (Andrew J. Savige &amp;lt;asavige@cpan.org&amp;gt;)
    CPAN_VERSION 1.55
    CPAN_FILE    A/AS/ASAVIGE/Acme-EyeDrops-1.55.tar.gz
    UPLOAD_DATE  2008-12-02
    MANPAGE      Acme::EyeDrops - Visual Programming in Perl
    INST_FILE    /usr/local/share/perl/5.10.0/Acme/EyeDrops.pm
    INST_VERSION 1.55


cpan[4]&amp;gt; i Acme::Bleach
Strange distribution name [Acme::Bleach]
No objects found of any type for argument Acme::Bleach
&lt;/code&gt;&lt;/pre&gt;

        

    </content:encoded>
      <dcterms:modified>2010-03-11T03:22:32Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:babyl.dyndns.org,2010:/techblog//1.177</guid>
    </item>
    <item>
      <author>nobody@example.com (martinjevans)</author>
      <dc:creator>nobody@example.com (martinjevans)</dc:creator>
      <category>Perl</category>
      <link>http://www.martin-evans.me.uk/node/61</link>
      <description>Sometimes something comes along that truly impresses me. get_iplayer is
one of those things. As a UK resident who uses iplayer three or four
times a week and a Perl fan get_iplayer really caught my interest. The
idea that you can list all of the BBCs iplayer content then download
whatever you like to watch whenever you like really did interest me.

First I tried downloading it from github but it failed to find updates.
Then I noticed it was available as an Ubuntu package and installed it.
After that a:

get_iplayer

read more</description>
      <dc:date>0</dc:date>
      <dc:subject>Perl</dc:subject>
      <title>get_iplayer - download BBC iplayer content</title>
      <pubDate>Wed, 10 Mar 2010 23:00:13 -0000</pubDate>
      <content:encoded>&lt;p&gt;Sometimes something comes along that truly impresses me. &lt;a href="http://github.com/jjl/get_iplayer"&gt;get_iplayer&lt;/a&gt; is one of those things. As a UK resident who uses iplayer three or four times a week and a Perl fan get_iplayer really caught my interest. The idea that you can list all of the BBCs iplayer content then download whatever you like to watch whenever you like really did interest me.&lt;/p&gt;
&lt;p&gt;First I tried downloading it from github but it failed to find updates. Then I noticed it was available as an Ubuntu package and installed it. After that a:&lt;/p&gt;
&lt;p&gt;&lt;div class="geshifilter"&gt;&lt;div class="text geshifilter-text"&gt;get_iplayer&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.martin-evans.me.uk/node/61" target="_blank"&gt;read more&lt;/a&gt;&lt;/p&gt;</content:encoded>
      <dcterms:modified>0</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:61 at http://www.martin-evans.me.uk</guid>
    </item>
    <item>
      <author>nobody@example.com (chromatic)</author>
      <dc:creator>nobody@example.com (chromatic)</dc:creator>
      <category>CPAN modern perl perl 5 system administration</category>
      <link>http://www.modernperlbooks.com/mt/2010/03/what-cpan-doesnt-do.html</link>
      <description>Configuration-Free CPAN Installations and What's Wrong with
Module::Install both hinted at a fundamental difficulty in managing
software from the CPAN. Enough teasing.

The fundamental assumption of the CPAN that makes managing software
through CPAN clients difficult is that newer software can always replace
older software.

That's not the CPAN's problem, not really. Perl 5 has this version number
problem too, and it's the source of much of the backwards compatibility
troubles in the Perl 5 world.

On the CPAN, no one agrees on what version numbers mean. No one agrees on
backwards compatibility concerns. No one agrees about what makes one
release "stable" and another release "testing" or what you can change in
an API.

I'm not sure it's the job of CPAN or the CPAN maintainers to try to solve
this problem. The lack of rules and ceremony over the function of
uploaded code and the loose agreement on the form of uploaded code have
allowed CPAN to thrive where other languages with their own packaging and
distribution systems have fragmented into incompatible, warring fiefdoms.

Even still, fighting over whether Module::Build is of the devil because
(insert silly reason here) or complaining that Module::Install is a
stupid patch over a pile of nasty, almost unsupported hacks misses the
real point. The best possible improvement in the Perl 5/CPAN ecosystem is
to know which versions of which distributions work together, and for end
users to be able to download a known-working graph of their desired
distribution and its dependencies.

In other words, the big problem isn't that Module::Install has a nicer
interface (arguable) or ExtUtils::MakeMaker is a horrific pile of
barely-working hacks that shouldn't have survived into the 21st century
(indisputable). The problem is the integration of separate components
managed by separate maintainers with wildly disparate ideas of the
semantics of change over indeterminate periods of time.

At any single given point in time, any given CPAN distribution should
work correctly with its currently available upstream dependencies. With
the current system, we cannot guarantee that perturbation in those
dependency graphs will percolate to users at any point in the future.

In my mind, arguing over whether an improvement to the CPAN ecosystem can
take over for every use case of the current tools is stupid and wrong
(or, more charitably, a silly distraction). Improving the user and
developer experiences of the current tools and the current system is
good, but the real improvements in the system will not occur at the
interface level.

(Of course, the problem with Adam's point of view is that requiring any
credible replacement to handle every possible failure case before
stamping it with an imprimatur is that "better" is not an all or nothing
concern. I have no illusion that it's possible to fix the Perl 5
versioning scheme for every case. If we can fix it for 90% of cases,
surely that's a reasonable improvement.)</description>
      <dc:date>2010-03-10T22:29:20Z</dc:date>
      <dc:subject>CPAN modern perl perl 5 system administration</dc:subject>
      <title>What CPAN Doesn't Do</title>
      <pubDate>Wed, 10 Mar 2010 22:29:20 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;&lt;a href="http://www.modernperlbooks.com/mt/2010/03/configuration-free-cpan-installations.html"&gt;Configuration-Free CPAN Installations&lt;/a&gt; and &lt;a href="http://www.modernperlbooks.com/mt/2010/03/whats-wrong-with-moduleinstall.html"&gt;What's Wrong with Module::Install&lt;/a&gt; both hinted at a fundamental difficulty in managing software from the CPAN.  Enough teasing.&lt;/p&gt;

&lt;p&gt;The fundamental assumption of the CPAN that makes managing software through CPAN clients difficult is that &lt;em&gt;newer software can always replace older software&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That's not the CPAN's problem, not really.  &lt;a href="http://www.modernperlbooks.com/mt/2009/12/the-guess-the-version-game.html"&gt;Perl
5 has this version number problem too&lt;/a&gt;, and it's the source of much of the
backwards compatibility troubles in the Perl 5 world.&lt;/p&gt;

&lt;p&gt;On the CPAN, no one agrees on what version numbers mean.  No one agrees on
backwards compatibility concerns.  No one agrees about what makes one release
"stable" and another release "testing" or what you can change in an API.&lt;/p&gt;

&lt;p&gt;I'm not sure it's the job of CPAN or the CPAN maintainers to try to solve this problem.  The lack of rules and ceremony over the &lt;em&gt;function&lt;/em&gt; of uploaded code and the loose agreement on the &lt;em&gt;form&lt;/em&gt; of uploaded code have allowed CPAN to thrive where other languages with their own packaging and distribution systems have fragmented into incompatible, warring fiefdoms.&lt;/p&gt;

&lt;p&gt;Even still, fighting over whether &lt;code&gt;Module::Build&lt;/code&gt; is of the devil
because (insert silly reason here) or complaining that
&lt;code&gt;Module::Install&lt;/code&gt; is a stupid patch over a pile of nasty, almost
unsupported hacks misses the real point.  The best possible improvement in the
Perl 5/CPAN ecosystem is to know which versions of which distributions work
together, and for end users to be able to download a known-working graph of
their desired distribution and its dependencies.&lt;/p&gt;

&lt;p&gt;In other words, the big problem isn't that &lt;code&gt;Module::Install&lt;/code&gt; has
a nicer interface (arguable) or &lt;code&gt;ExtUtils::MakeMaker&lt;/code&gt; is a horrific
pile of barely-working hacks that shouldn't have survived into the 21st century
(indisputable).  The problem is the integration of separate components managed
by separate maintainers with wildly disparate ideas of the semantics of change
over indeterminate periods of time.&lt;/p&gt;

&lt;p&gt;At any single given point in time, any given CPAN distribution should work correctly with its currently available upstream dependencies.  With the current system, we cannot guarantee that perturbation in those dependency graphs will percolate to users at any point in the future.&lt;/p&gt;

&lt;p&gt;In my mind, &lt;a href="http://use.perl.org/~Alias/journal/40225"&gt;arguing over
whether an improvement to the CPAN ecosystem can take over for every use case
of the current tools&lt;/a&gt; is stupid and wrong (or, more charitably, a silly
distraction).  Improving the user and developer experiences of the current
tools and the current system is good, but the real improvements in the system
will not occur at the interface level.&lt;/p&gt;

&lt;p&gt;(Of course, the problem with Adam's point of view is that requiring any
credible replacement to handle every possible failure case before stamping it
with an imprimatur is that "better" is not an all or nothing concern.  I have
no illusion that it's possible to fix the Perl 5 versioning scheme for every
case.  If we can fix it for 90% of cases, surely that's a reasonable
improvement.)&lt;/p&gt;

        
    </content:encoded>
      <dcterms:modified>2010-03-10T22:29:20Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:www.modernperlbooks.com,2010:/mt//1.159</guid>
    </item>
    <item>
      <author>nobody@example.com (Bob)</author>
      <dc:creator>nobody@example.com (Bob)</dc:creator>
      <category>Programming ironman Perl</category>
      <link>http://techblog.geeksqueal.com/2010/03/10/simplicity-elegance-reliability/</link>
      <description>Coding simplicity. Comments on how and why to get there. Quotes from Dijkstra. Article from Reinvigorated Programmer. </description>
      <dc:date>2010-03-10T20:55:26Z</dc:date>
      <dc:subject>Programming ironman Perl</dc:subject>
      <title>Simplicity, Elegance, Reliability</title>
      <pubDate>Wed, 10 Mar 2010 20:55:26 -0000</pubDate>
      <content:encoded>Coding simplicity. Comments on how and why to get there. Quotes from Dijkstra. Article from Reinvigorated Programmer. </content:encoded>
      <dcterms:modified>2010-03-10T20:55:26Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://techblog.geeksqueal.com/?p=93</guid>
    </item>
    <item>
      <author>nobody@example.com (Sam Graham)</author>
      <dc:creator>nobody@example.com (Sam Graham)</dc:creator>
      <category>perl ironman testing release-testing module-build template-benchmark module-authoring</category>
      <link>http://www.illusori.co.uk/perl/2010/03/10/author_release_tests.html</link>
      <description>Today I released a new beta of Template::Benchmark (v0.99_07) and one of
the changes, along with the addition of 4 new template engine plugins
(Tenjin, Template::Tiny, Text::Template::Simple and NTS::Template), is
that it splits the author/release tests away from the install tests.

This was a royal PITA, so I thought I'd cover the how and why of what was
done.

Read more...</description>
      <dc:date>0</dc:date>
      <dc:subject>perl ironman testing release-testing module-build template-benchmark module-authoring</dc:subject>
      <title>Author/Release tests with Module::Build and Template::Benchmark</title>
      <pubDate>Wed, 10 Mar 2010 19:24:00 -0000</pubDate>
      <content:encoded>&lt;p&gt;Today I released a new beta of Template::Benchmark (v0.99_07) and one of the changes, along with the addition of 4 new template engine plugins (Tenjin, Template::Tiny, Text::Template::Simple and NTS::Template), is that it splits the author/release tests away from the install tests.&lt;/p&gt;&lt;p&gt;This was a royal PITA, so I thought I&amp;#39;d cover the how and why of what was done.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.illusori.co.uk/perl/2010/03/10/author_release_tests.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/10/author_release_tests.html</guid>
    </item>
    <item>
      <author>nobody@example.com (John Napiorkowski)</author>
      <dc:creator>nobody@example.com (John Napiorkowski)</dc:creator>
      <category>perl ironman cpanminus local-lib</category>
      <link>http://jjnapiorkowski.vox.com/library/post/bootstrapping-locallib-part-2.html?_c=feed-atom</link>
      <description> The cpanminus people (http://github.com/miyagawa/cpanminus) have this
cool idea where you can just use the script hosted from github without
even having to download it. So you can do: curl -L cpanmin.us | perl -
--help and just use it. Th...

Read and post comments | Send to a friend</description>
      <dc:date>2010-03-10T19:19:16Z</dc:date>
      <dc:subject>perl ironman cpanminus local-lib</dc:subject>
      <title>Bootstrapping local::lib, part 2</title>
      <pubDate>Wed, 10 Mar 2010 19:19:16 -0000</pubDate>
      <content:encoded>
            
                &lt;div xmlns="http://www.w3.org/1999/xhtml" xmlns:at="http://www.sixapart.com/ns/at"&gt;
         The cpanminus people (http://github.com/miyagawa/cpanminus) have this cool idea where you can just use the script hosted from github without even having to download it.  So you can do:       curl -L cpanmin.us | perl - --help  and just use it.  Th...   &lt;p&gt; 
    &lt;a href="http://jjnapiorkowski.vox.com/library/post/bootstrapping-locallib-part-2.html?_c=feed-atom#comments"&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href="http://www.vox.com/share/6a00fa9675c31f000201240bad2305860e?_c=feed-atom"&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;

                &lt;/div&gt;
            
        </content:encoded>
      <dcterms:modified>2010-03-10T19:19:16Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:vox.com,2010-03-10:asset-6a00fa9675c31f000201240bad2305860e</guid>
    </item>
    <item>
      <author>nobody@example.com (holidays-l)</author>
      <dc:creator>nobody@example.com (holidays-l)</dc:creator>
      <category>Perl</category>
      <link>http://d.hatena.ne.jp/holidays-l/20100311/p1</link>
      <description>URI Escapeするときはuriフィルタ（urlフィルタ）でいいんだけど、その逆のURI
Unescapeのやり方が（TT標準内には）見つけられなかった。

のでCGI.pmにやらせてみた。

#! /usr/bin/perluse Template;
Template-&gt;new-&gt;process(\*DATA);
__DATA__[%    SET link = 'http://example.jp/wiki/%E3%83%86%E3%82%B9%E3%83%88';    USE CGI('uri=' _ link);    CGI.params.uri;%]

実行結果

http://example.jp/wiki/テスト

注意：CGI.pmのUNICODE周りの問題で文字化けする可能性あり。（TT側で調整可能）</description>
      <dc:date>2010-03-11T00:00:00+09:00</dc:date>
      <dc:subject>Perl</dc:subject>
      <title>[Perl] Template-ToolkitでURI Unescape</title>
      <pubDate>Thu, 11 Mar 2010 00:00:00 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;URI Escapeするときはuriフィルタ（urlフィルタ）でいいんだけど、その逆のURI Unescapeのやり方が（TT標準内には）見つけられなかった。&lt;/p&gt;
			&lt;p&gt;のでCGI.pmにやらせてみた。&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synPreProc"&gt;#! /usr/bin/perl&lt;/span&gt;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Template;
Template-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;-&amp;#62;process(\*DATA);

&lt;span class="synComment"&gt;__DATA__&lt;/span&gt;
&lt;span class="synComment"&gt;[%&lt;/span&gt;
&lt;span class="synComment"&gt;    SET link = 'http://example.jp/wiki/%E3%83%86%E3%82%B9%E3%83%88';&lt;/span&gt;
&lt;span class="synComment"&gt;    USE CGI('uri=' _ link);&lt;/span&gt;
&lt;span class="synComment"&gt;    CGI.params.uri;&lt;/span&gt;
&lt;span class="synComment"&gt;%]&lt;/span&gt;
&lt;/pre&gt;

			&lt;p&gt;実行結果&lt;/p&gt;
&lt;pre&gt;
http://example.jp/wiki/テスト
&lt;/pre&gt;

			&lt;p&gt;注意：CGI.pmのUNICODE周りの問題で文字化けする可能性あり。（TT側で調整可能）&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-11T00:00:00+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://d.hatena.ne.jp/holidays-l/20100311/p1</guid>
    </item>
    <item>
      <author>nobody@example.com (ash)</author>
      <dc:creator>nobody@example.com (ash)</dc:creator>
      <category>Мероприятия 2010 europe fun perl yapc::europe</category>
      <link>http://onperl.ru/onperl/2010/03/logotipcheg.html</link>
      <description>Несмотря на то, что проектирование интерфейсов — задача, которую
програмисты не всегда решают успешно, картинка на новом сайте
YAPC::Europe 2010 — великолепна.

Тема конференции — The Renaissance of Perl, проходит она в Италии, и лук
в стиле записок Леонардо Ди Каприо, — прекрасен.

YAPC::Europe 2010

Да, а на ютубе (британцы говорят ючуб, кстати) есть ролик про качества
перла.</description>
      <dc:date>2010-03-10T15:57:40+01:00</dc:date>
      <dc:subject>Мероприятия 2010 europe fun perl yapc::europe</dc:subject>
      <title>Логотипчег YAPC::Europe 2010</title>
      <pubDate>Wed, 10 Mar 2010 15:57:40 +0100</pubDate>
      <content:encoded>
        &lt;p&gt;Несмотря на то, что проектирование интерфейсов — задача, которую програмисты &lt;a href="http://onperl.ru/onperl/2010/03/on-interfaces.html"&gt;не всегда решают успешно&lt;/a&gt;, картинка на новом сайте &lt;a href="http://yapceurope.org/2010"&gt;YAPC::Europe 2010&lt;/a&gt; — великолепна.&lt;/p&gt;
&lt;p&gt;Тема конференции&amp;nbsp;— The Renaissance of Perl, проходит она в Италии, и лук в стиле&amp;nbsp;записок Леонардо &lt;strike&gt;Ди Каприо&lt;/strike&gt;, — прекрасен.&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://yapceurope.org/2010"&gt;&lt;img alt="YAPC::Europe 2010" src="http://img.onperl.ru/onion-leonardo.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Да, а на ютубе (британцы говорят &lt;em&gt;ючуб&lt;/em&gt;, кстати) есть &lt;a href="http://www.youtube.com/watch?v=Nx7v815bYUw"&gt;ролик про качества перла&lt;/a&gt;.&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-10T15:57:40+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:onperl.ru,2010:/onperl//1.161</guid>
    </item>
    <item>
      <author>nobody@example.com (D)</author>
      <dc:creator>nobody@example.com (D)</dc:creator>
      <category>開発 cgi perl plack</category>
      <link>http://mt.endeworks.jp/d-6/2010/03/cgi-development-with-plack-2.html</link>
      <description>前のエントリ書いたら宮川さんにオススメ方法を教えてもらった

  http://twitter.com/miyagawa/status/10271128928

  plackup \

  -L Shotgun

  -MPlack::App::WrapCGI

  -e 'Plack::App::WrapCGI-&gt;new(script =&gt; "/path/to/cgiscript.cgi")'


だそうです！これなら全ての要件を満たせるもよう！そしてapp.psgiを作る必要ありません。
今これやってみて一つだけ問題点。多分POD入りのCGIは動かない。それと、__DATA__は見てくれるけど、__END__があると動かない。__END__さっき簡単なパッチのpull
requestを送っておきました！
なお、-L Shotgunを使うと CGIファイルの中身は実行時までコンパイルされないのでご注意（つまり、plackup
-rもいらないってことですね）</description>
      <dc:date>2010-03-10T23:16:37+09:00</dc:date>
      <dc:subject>開発 cgi perl plack</dc:subject>
      <title>CGIをPlackで開発(2)</title>
      <pubDate>Wed, 10 Mar 2010 23:16:37 +0900</pubDate>
      <content:encoded>
        &lt;a href="http://mt.endeworks.jp/d-6/2010/03/cgi-development-with-plack.html"&gt;前のエントリ&lt;/a&gt;書いたら宮川さんにオススメ方法を教えてもらった&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class="webkit-indent-blockquote"&gt;&lt;a href="http://twitter.com/miyagawa/status/10271128928"&gt;http://twitter.com/miyagawa/status/10271128928&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote class="webkit-indent-blockquote"&gt;&lt;a href="http://twitter.com/miyagawa/status/10271128928"&gt;&lt;/a&gt;plackup \&lt;/blockquote&gt;&lt;blockquote class="webkit-indent-blockquote"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;-L Shotgun&lt;/blockquote&gt;&lt;blockquote class="webkit-indent-blockquote"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;-MPlack::App::WrapCGI&lt;/blockquote&gt;&lt;blockquote class="webkit-indent-blockquote"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;-e 'Plack::App::WrapCGI-&amp;gt;new(script =&amp;gt; "/path/to/cgiscript.cgi")'&lt;/blockquote&gt;&lt;blockquote class="webkit-indent-blockquote"&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;だそうです！これなら全ての要件を満たせるもよう！そしてapp.psgiを作る必要ありません。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今これやってみて一つだけ問題点。&lt;span class="Apple-style-span"&gt;多分POD入りのCGIは動かない。&lt;/span&gt;それと、__DATA__は見てくれるけど、__END__があると動かない。__END__さっき簡単なパッチのpull requestを送っておきました！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;なお、-L Shotgunを使うと CGIファイルの中身は実行時までコンパイルされないのでご注意（つまり、plackup -rもいらないってことですね）&lt;/div&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-10T23:16:37+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:mt.endeworks.jp,2010:/d-6//3.2467</guid>
    </item>
    <item>
      <author>nobody@example.com (acidcycles)</author>
      <dc:creator>nobody@example.com (acidcycles)</dc:creator>
      <category>Uncategorized</category>
      <link>http://acidcycles.wordpress.com/2010/03/10/appprove-3-06-brings-some-great-productivity-improvements/</link>
      <description>I don’t know how I overlooked this, but App::Prove 3.06 brings some
excellent changes that are a massive help to productivity. At work, our
test suite can take up to 10 minutes to run (on bad days) which isn’t
huge, but when I’m trying to use TDD I find that this is just too slow to
be usable. I was discussing this in #catalyst last night, and amongst
other great information (some future blog posts lined up, stay tuned!),
ijw mentioned that prove --state might be something of interest to me

However, my man entry for prove doesn’t even have a –state option, but
looking at App::Prove on CPAN shows that this is a killer feature. Here’s
how it works

–state allows you to log the status of App::Prove between runs, and do
some interesting things with them. Essentially, state tracking captures
the order that tests are ran, and the result of running them. The
“failed” state is of most interesting to me, which runs only the tests
that failed in the last run. So, in the cases that we introduce a bug
somewhere, I can run all the tests, then repeatedly run the failing tests
until they all pass.

Another option I’ve just noticed now is the -j option, which allows you
to run multiple tests in parallel. Me and rafl have been talking about a
forking test harness, which is just a little bit beyond what -j does. -j,
like make -j, allows you to specify parallel test execution. If you’re
sensible, and your tests don’t interact with the world, this should allow
you to run lots of tests together. Sadly, our tests do touch the world,
so we can’t do this just yet.</description>
      <dc:date>2010-03-10T13:58:41Z</dc:date>
      <dc:subject>Uncategorized</dc:subject>
      <title>App::Prove 3.06 brings some great productivity improvements!</title>
      <pubDate>Wed, 10 Mar 2010 13:58:41 -0000</pubDate>
      <content:encoded>&lt;p&gt;I don&amp;#8217;t know how I overlooked this, but App::Prove 3.06 brings some excellent changes that are a massive help to productivity. At work, our test suite can take up to 10 minutes to run (on bad days) which isn&amp;#8217;t huge, but when I&amp;#8217;m trying to use TDD I find that this is just too slow to be usable. I was discussing this in #catalyst last night, and amongst other great information (some future blog posts lined up, stay tuned!), ijw mentioned that &lt;code&gt;prove --state&lt;/code&gt; might be something of interest to me&lt;/p&gt;
&lt;p&gt;However, my man entry for prove doesn&amp;#8217;t even have a &amp;#8211;state option, but looking at App::Prove on CPAN shows that this is a killer feature. Here&amp;#8217;s how it works&lt;/p&gt;
&lt;p&gt;&amp;#8211;state allows you to log the status of App::Prove between runs, and do some interesting things with them. Essentially, state tracking captures the order that tests are ran, and the result of running them. The &amp;#8220;failed&amp;#8221; state is of most interesting to me, which runs only the tests that failed in the last run. So, in the cases that we introduce a bug somewhere, I can run all the tests, then repeatedly run the failing tests until they all pass.&lt;/p&gt;
&lt;p&gt;Another option I&amp;#8217;ve just noticed now is the -j option, which allows you to run multiple tests in parallel. Me and rafl have been talking about a forking test harness, which is just a little bit beyond what -j does. -j, like make -j, allows you to specify parallel test execution. If you&amp;#8217;re sensible, and your tests don&amp;#8217;t interact with the world, this should allow you to run lots of tests together. Sadly, our tests do touch the world, so we can&amp;#8217;t do this just yet.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/acidcycles.wordpress.com/71/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/comments/acidcycles.wordpress.com/71/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/acidcycles.wordpress.com/71/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/delicious/acidcycles.wordpress.com/71/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/acidcycles.wordpress.com/71/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/stumble/acidcycles.wordpress.com/71/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/acidcycles.wordpress.com/71/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/digg/acidcycles.wordpress.com/71/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/acidcycles.wordpress.com/71/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/reddit/acidcycles.wordpress.com/71/"&gt;&lt;/a&gt; &lt;img alt="" src="http://stats.wordpress.com/b.gif?host=acidcycles.wordpress.com&amp;amp;blog=2388432&amp;amp;post=71&amp;amp;subd=acidcycles&amp;amp;ref=&amp;amp;feed=1"&gt;</content:encoded>
      <dcterms:modified>2010-03-10T13:58:41Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://acidcycles.wordpress.com/?p=71</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/40236?from=rss</link>
      <description>There's a new site by Mark Keating from UK: Presenting Perl. It's
reportedly based on something called IdiotBox(?!).

There's also YAPC.tv which is more attractive. It also has more features,
e.g. RSS feeds.

And it's too bad that we still have only two videos from YAPC::Europe
2009 available on the web after almost a year and an excplicit written
permission from everyone to publish the recordings.

(surprise) Programmers are more interested in producing tools for content
than in producing content.</description>
      <dc:date>2010-03-10T13:41:40Z</dc:date>
      <dc:subject>journal</dc:subject>
      <title>Presenting Perl</title>
      <pubDate>Wed, 10 Mar 2010 13:41:40 -0000</pubDate>
      <content:encoded>&lt;p&gt;There's a new site by Mark Keating from UK: &lt;a href="http://www.presentingperl.org/"&gt;Presenting Perl&lt;/a&gt;. It's reportedly based on something called IdiotBox(?!).

&lt;/p&gt;&lt;p&gt;There's also &lt;a href="http://yapc.tv/"&gt;YAPC.tv&lt;/a&gt; which is more attractive. It also has more features, e.g. RSS feeds.

&lt;/p&gt;&lt;p&gt;And it's too bad that we still have &lt;a href="http://videos.sapo.pt/tag.html?yapceu09"&gt;only two videos&lt;/a&gt; from YAPC::Europe 2009 available on the web after almost a year and an excplicit written permission from everyone to publish the recordings.

&lt;/p&gt;&lt;p&gt; &lt;i&gt;(surprise) Programmers are more interested in producing tools for content than in producing content.&lt;/i&gt;&lt;/p&gt;</content:encoded>
      <dcterms:modified>2010-03-10T13:41:40Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://use.perl.org/~kappa/journal/40236?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (D)</author>
      <dc:creator>nobody@example.com (D)</dc:creator>
      <category>日常 cgi perl plack</category>
      <link>http://mt.endeworks.jp/d-6/2010/03/cgi-development-with-plack.html</link>
      <description>
ちょっと案件で簡単なCGIスクリプトをを開発することになった。StarmanとかTwiggyでほとんど全て書いているのに今更CGIとかそういう突っ込みはとりあえずおいておいて・・・環境を作るのも面倒くさいし、簡単にサーバーを立ち上げたり落としたりしたい。
そこでPlackです！
追記：その後もらったコメントによると、こちらのほうがよさそうです。






具体的にはplackupとCGI::Emulate::PSGIを使います。
何も考えずにとりあえず開発したいので、以下のようにapp.psgiにコードを書いていく。

use strict;
use CGI::Emulate::PSGI;
return CGI::Emulate::PSGI-&gt;handler(sub {
    CGI::initialize_globals(); # 重要# ここから#!/usr/bin/env perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);

sub main {
    my $q = CGI-&gt;new();
    ....
}

main();
# ここまでがCGIのコード});

あとで本当に単純にコピペしたいのでshebangもそのまま書いちゃうし、インデントもその部分だけファイルに書いたかのように記述していっちゃいます。
これを以下のように-rオプションをつけて起動。app.psgiのCGIコードに変更を加える度にサーバーも再起動して新しいコードを適用してくれる。

plackup -r -a app.psgi



これはいいわー。</description>
      <dc:date>2010-03-10T20:59:26+09:00</dc:date>
      <dc:subject>日常 cgi perl plack</dc:subject>
      <title>CGIをPlackで開発</title>
      <pubDate>Wed, 10 Mar 2010 20:59:26 +0900</pubDate>
      <content:encoded>
        ちょっと案件で簡単なCGIスクリプトをを開発することになった。StarmanとかTwiggyでほとんど全て書いているのに今更CGIとかそういう突っ込みはとりあえずおいておいて・・・環境を作るのも面倒くさいし、簡単にサーバーを立ち上げたり落としたりしたい。&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そこで&lt;a href="http://plackperl.org"&gt;Plack&lt;/a&gt;です！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;追記：その後もらったコメントによると、&lt;a href="http://mt.endeworks.jp/d-6/2010/03/cgi-development-with-plack-2.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;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;具体的にはplackupと&lt;a href="http://search.cpan.org/dist/CGI-Emulate-PSGI"&gt;CGI::Emulate::PSGI&lt;/a&gt;を使います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;何も考えずにとりあえず開発したいので、以下のようにapp.psgiにコードを書いていく。&lt;/div&gt;
&lt;pre class="code_listing"&gt;use strict;
use CGI::Emulate::PSGI;
return CGI::Emulate::PSGI-&amp;gt;handler(sub {
    CGI::initialize_globals(); # 重要
&lt;span&gt;# ここから&lt;/span&gt;
#!/usr/bin/env perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);

sub main {
    my $q = CGI-&amp;gt;new();
    ....
}

main();

&lt;span&gt;# ここまでがCGIのコード&lt;/span&gt;
});
&lt;/pre&gt;
&lt;div&gt;あとで本当に単純にコピペしたいのでshebangもそのまま書いちゃうし、インデントもその部分だけファイルに書いたかのように記述していっちゃいます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これを以下のように-rオプションをつけて起動。app.psgiのCGIコードに変更を加える度にサーバーも再起動して新しいコードを適用してくれる。&lt;/div&gt;

&lt;pre class="code_listing"&gt;plackup -r -a app.psgi
&lt;/pre&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これはいいわー。&lt;/div&gt;&lt;/div&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-10T20:59:26+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:mt.endeworks.jp,2010:/d-6//3.2466</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/learn-perl-now.html</link>
      <description> （はいはい、まず言語論争するつもりないから、そういうコメント禁止ね）
1. 論旨
新たな就職氷河期到来が叫ばれる昨今、就職に困っている学生さんもたくさんおろう。「技術があればチャンスはあるかも」って思う人もたくさんおろう。その際にプログラミングでもいっちょやってみっか、って思う人もたくさんおろう。
そこでとりあえず言語を選ぶよね。「就職を有利にするため」という条件をクリアするためにあなたなら何を選ぶ？Java? C#? Ruby? PHP?
（ちなみに自分は大学を卒業した時点で一番得意だったのはJavaですよ）
色々選択肢はあるのは当たり前なので他の言語も排除はしないけど、僕としては自分の今持っている情報と経験から、Perlは覚えておいて損は全くない！と言い切れる。それは至極単純な理由で、需要より供給が圧倒的に少ないから。
就職情報サイトで一番多く当たる言語とかはもちろんそれだけ需要があるという事でもあるのは当然だけれども、それはつまり供給もほうも当然多いのです。競争も激しいし、当然ながら1人当たりの価値は下がります（この場合の価値というのは給料という意味ではなく、採用する企業側からみたあなたの価値....
採用するときにどれだけハングリーな目で見てもらえるか、です）
JPAの会員になってくれてる企業のうちアクティブに採用を検討している会社は（採用基準も高いところも多いけれど）、それはそれは切実にPerlエンジニアをほしがってます。今から少しでも多くPerlの知識を身につけておけば、競争が比較的少ない分野で輝くことができる可能性が高いわけですよ。
あなたのゴールはなんですか？クールな言語を覚えること？流行物やバズワードに乗ること？それとも・・・仕事を見つけること？重要なのは採用してもらい、社会に出て、そこで経験を積むことなはず。
株式相場でもそうだけれども、勝ちたいなら基本的には逆張りしないといけないですよ。そういう意味で全く持って Perlは良いオプションだと思います。
ちなみに名の通ってるPerlを使用している企業の中ではWeb系の企業が多いのでPerlを選ぶ＝Web系のキャリアに就くと思っている人もいるかもしれないが、Perlはもともと面倒なシステム管理タスクなどを簡単に包括的に行うためのツールとして作られているので、Web系に限らずその後もっと広いシステム領域に自分の仕事を広げていくつもりだったとしてPerlという言語は悪いチョイスではないと思います。
2. ただし書き
・・・とここまで書いておいてなんだけど、だからと言ってPerl勉強すればいいってもんじゃない。色々なただし書きがついてきます。
ここからはまとまりにくいのだけど、とりあえず羅列してみる：

  * 今回僕はPerlを便利なツールで、覚えておいて損はない、そして今ならある程度のPerl力があれば就職できる可能性が高いよ！って言いたいだけ。

  * Perlを覚える事にしたとしても、それだけでは何にもならない。優秀なプログラマーは第1言語以外のどの言語を与えても資料さえあればそれなりのものが作れる。重要なのは言語の仕様ではなくて、プログラムを書く時の考え方だから。だから他の言語も一緒に覚えればいいと思う。

  * Perlに関してはバッシングが結構ひどいけど、少なくとも「言語仕様」を叩く人の言うことは8割ほど引いて聞いておけ。他人のコードを読めないとのたまう人は自分が得意とする言語・環境以外のデバッグができないだけだし、まずいコードを書く人はどの言語で書かせてもまずいコードを書く。


3. ということで
今はPerlは戦略的に就活を行うなら、早い内から手に入れておいて役に立つスキルのひとつだと思う。ただしYMMV
4. ついでに
あくまで個人的な意見ですが、今から新たにPerlの何かを覚える目標としてはPlack/PSGIともっと進んだところでは非同期プログラミングはいい題材だと思います。技術的なレベルはちょっと高いけど、その辺りを目指すと外れはないかな〜。まぁこれは本当に個人的意見なので初心者には辛いかもしれません。
あとこれからPerlを覚えようって方には（もっと他にもあるだろうけど）とりあえずPerl関連書籍やPerl関連資料のページも作りましたよ。
あと、Perlメインでなくてもいいので、Perlで開発を受注できる！という会社の方は是非こちらに書き込んでください！数が揃えばJPAサイトのほうに移します。</description>
      <dc:date>2010-03-10T14:43:10+09:00</dc:date>
      <dc:subject>仕事 perl</dc:subject>
      <title>学生諸君、Perlを勉強したまえ（ただし書き付き）</title>
      <pubDate>Wed, 10 Mar 2010 14:43:10 +0900</pubDate>
      <content:encoded>
        （はいはい、まず言語論争するつもりないから、そういうコメント禁止ね）&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. 論旨&lt;/div&gt;&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;そこでとりあえず言語を選ぶよね。「就職を有利にするため」という条件をクリアするためにあなたなら何を選ぶ？Java? C#? Ruby? PHP? （ちなみに自分は大学を卒業した時点で一番得意だったのはJavaですよ）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;色々選択肢はあるのは当たり前なので他の言語も排除はしないけど、僕としては自分の今持っている情報と経験から、Perlは覚えておいて損は全くない！と言い切れる。それは至極単純な理由で、需要より供給が圧倒的に少ないから。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;就職情報サイトで一番多く当たる言語とかはもちろんそれだけ需要があるという事でもあるのは当然だけれども、それはつまり供給もほうも当然多いのです。競争も激しいし、当然ながら1人当たりの価値は下がります（この場合の価値というのは給料という意味ではなく、採用する企業側からみたあなたの価値.... 採用するときにどれだけハングリーな目で見てもらえるか、です）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://japan.perlassociation.org"&gt;JPA&lt;/a&gt;の会員になってくれてる企業のうち&lt;a href="http://japan.perlassociation.org/recruit"&gt;アクティブに採用を検討している会社&lt;/a&gt;は（採用基準も高いところも多いけれど）、それはそれは切実にPerlエンジニアをほしがってます。今から少しでも多くPerlの知識を身につけておけば、競争が比較的少ない分野で輝くことができる可能性が高いわけですよ。&lt;/div&gt;&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;株式相場でもそうだけれども、勝ちたいなら基本的には逆張りしないといけないですよ。そういう意味で全く持って Perlは良いオプションだと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ちなみに名の通ってるPerlを使用している企業の中ではWeb系の企業が多いのでPerlを選ぶ＝Web系のキャリアに就くと思っている人もいるかもしれないが、Perlはもともと面倒なシステム管理タスクなどを簡単に包括的に行うためのツールとして作られているので、Web系に限らずその後もっと広いシステム領域に自分の仕事を広げていくつもりだったとしてPerlという言語は悪いチョイスではないと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. ただし書き&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・・・とここまで書いておいてなんだけど、だからと言ってPerl勉強すればいいってもんじゃない。色々なただし書きがついてきます。&lt;/div&gt;&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;&lt;ul&gt;&lt;li&gt;今回僕はPerlを便利なツールで、覚えておいて損はない、そして今ならある程度のPerl力があれば就職できる可能性が高いよ！って言いたいだけ。&lt;/li&gt;&lt;li&gt;Perlを覚える事にしたとしても、それだけでは何にもならない。優秀なプログラマーは第1言語以外のどの言語を与えても資料さえあればそれなりのものが作れる。重要なのは言語の仕様ではなくて、プログラムを書く時の考え方だから。だから他の言語も一緒に覚えればいいと思う。&lt;/li&gt;&lt;li&gt;Perlに関してはバッシングが結構ひどいけど、少なくとも「言語仕様」を叩く人の言うことは8割ほど引いて聞いておけ。他人のコードを読めないとのたまう人は自分が得意とする言語・環境以外のデバッグができないだけだし、まずいコードを書く人はどの言語で書かせてもまずいコードを書く。&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. ということで&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;今はPerlは戦略的に就活を行うなら、早い内から手に入れておいて役に立つスキルのひとつだと思う。ただし&lt;a href="http://ejje.weblio.jp/content/YMMV"&gt;YMMV&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. ついでに&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;あくまで個人的な意見ですが、今から新たにPerlの何かを覚える目標としては&lt;a href="http://plackperl.org"&gt;Plack/PSG&lt;/a&gt;Iともっと進んだところでは&lt;a href="http://gihyo.jp/dev/serial/01/modern-perl/0013"&gt;非同期プログラミング&lt;/a&gt;はいい題材だと思います。技術的なレベルはちょっと高いけど、その辺りを目指すと外れはないかな〜。まぁこれは本当に個人的意見なので初心者には辛いかもしれません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;あとこれからPerlを覚えようって方には（もっと他にもあるだろうけど）とりあえず&lt;a href="http://japan.perlassociation.org/books"&gt;Perl関連書籍&lt;/a&gt;や&lt;a href="http://japan.perlassociation.org/resource"&gt;Perl関連資料&lt;/a&gt;のページも作りましたよ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;あと、Perlメインでなくてもいいので、&lt;a href="http://wiki.perlassociation.org/jobs"&gt;Perlで開発を受注できる！という会社の方は是非こちらに書き込んでください&lt;/a&gt;！数が揃えばJPAサイトのほうに移します。&lt;/div&gt;
        
    </content:encoded>
      <dcterms:modified>2010-03-10T14:43:10+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:mt.endeworks.jp,2010:/d-6//3.2464</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-php-corporate</link>
      <description>Remember when I wrote about Perl, Python and PHP taking bigger part in
corporate world? Here is nice analysis that shows that PHP growth in this
one particular job ads service is not linked to the growing search for
“multilingual” developers (java or .net or C#, VB, ASP – and PHP) but for
PHP-focused developers.

Other interesting thing is that the jaw-dropping chart shown in the “crashing
the enterprise party.” article shows growth of given language job ads,
not absolute number. See absolute number for opening your eyes :)

See, that absolute numbers show that Perl is higher than PHP and Python,
although PHP and Pyhon are rising, while Perl is on one level.

One more thing – Savio compared PHP and other langs + PHP combbniations (see
here). What if we add Perl? See. Wow.


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 as good as java, python and PHP way above

  2. Nice people I met at YAPC::EU – continued

  3. Inevitable parrot 2</description>
      <dc:date>2010-03-10T05:44:48+01:00</dc:date>
      <dc:subject>future perlisnotdead</dc:subject>
      <title>Perl, PHP, corporate – continued.</title>
      <pubDate>Wed, 10 Mar 2010 05:44:48 +0100</pubDate>
      <content:encoded>&lt;p&gt;Remember when I wrote about Perl, Python  and PHP taking &lt;a href="http://perl.baczynski.com/future/perl-good-as-java" target="_blank"&gt;bigger part&lt;/a&gt; in corporate world? &lt;a rel="nofollow" href="http://www.infoworld.com/d/open-source/php-job-growth-not-linked-multilingual-developers-979" target="_blank"&gt;Here&lt;/a&gt; is nice analysis that shows that PHP growth in this one particular job ads service is not linked to the growing search for &amp;#8220;multilingual&amp;#8221; developers (java or .net or C#, VB, ASP &amp;#8211; &lt;strong&gt;and&lt;/strong&gt; PHP) but for PHP-focused developers.&lt;/p&gt;
&lt;p&gt;Other interesting thing is that the jaw-dropping chart shown in the &amp;#8220;&lt;a rel="nofollow" href="http://news.cnet.com/8301-13505_3-10453213-16.html" target="_blank"&gt;crashing the enterprise party&lt;/a&gt;.&amp;#8221; article shows growth of given language job ads, not absolute number. See &lt;a rel="nofollow" href="http://www.indeed.com/jobtrends?q=Java%2C+PHP%2C+Perl%2C+.Net%2C+Python"&gt;absolute number for opening your eyes&lt;/a&gt; &lt;img src="http://perl.baczynski.com/wp-includes/images/smilies/icon_smile.gif" alt=":)"&gt; &lt;/p&gt;
&lt;p&gt;See, that absolute numbers show that Perl is &lt;strong&gt;higher&lt;/strong&gt; than PHP and Python, although PHP and Pyhon are &lt;strong&gt;rising&lt;/strong&gt;, while Perl is on &lt;strong&gt;one level.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One more thing &amp;#8211; Savio compared PHP and other langs + PHP combbniations (&lt;a href="http://www.indeed.com/jobtrends?q=PHP%2C+.%28NET+or+C%23+or+VB+or+ASP%29+%26+PHP%2C+Java+%26+PHP&amp;amp;l="&gt;see here&lt;/a&gt;). What if we &lt;a href="http://www.indeed.com/jobtrends?q=PHP%2C+%28.NET+or+C%23+or+VB+or+ASP%29+%26+PHP%2C+Java+%26+PHP%2Cperl&amp;amp;l="&gt;add Perl? See. Wow.&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
&lt;/strong&gt;&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-php-corporate&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-php-corporate&amp;amp;title=Perl%2C%20PHP%2C%20corporate%20-%20continued.&amp;amp;bodytext=Remember%20when%20I%20wrote%20about%20Perl%2C%20Python%20%20and%20PHP%20taking%20bigger%20part%20in%20corporate%20world%3F%20Here%20is%20nice%20analysis%20that%20shows%20that%20PHP%20growth%20in%20this%20one%20particular%20job%20ads%20service%20is%20not%20linked%20to%20the%20growing%20search%20for%20%22multilingual%22%20developers%20%28java%20o" 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-php-corporate&amp;amp;title=Perl%2C%20PHP%2C%20corporate%20-%20continued.&amp;amp;notes=Remember%20when%20I%20wrote%20about%20Perl%2C%20Python%20%20and%20PHP%20taking%20bigger%20part%20in%20corporate%20world%3F%20Here%20is%20nice%20analysis%20that%20shows%20that%20PHP%20growth%20in%20this%20one%20particular%20job%20ads%20service%20is%20not%20linked%20to%20the%20growing%20search%20for%20%22multilingual%22%20developers%20%28java%20o" 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-php-corporate&amp;amp;t=Perl%2C%20PHP%2C%20corporate%20-%20continued." 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-php-corporate&amp;amp;title=Perl%2C%20PHP%2C%20corporate%20-%20continued." 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-php-corporate&amp;amp;title=Perl%2C%20PHP%2C%20corporate%20-%20continued.&amp;amp;annotation=Remember%20when%20I%20wrote%20about%20Perl%2C%20Python%20%20and%20PHP%20taking%20bigger%20part%20in%20corporate%20world%3F%20Here%20is%20nice%20analysis%20that%20shows%20that%20PHP%20growth%20in%20this%20one%20particular%20job%20ads%20service%20is%20not%20linked%20to%20the%20growing%20search%20for%20%22multilingual%22%20developers%20%28java%20o" 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%2C%20PHP%2C%20corporate%20-%20continued.&amp;amp;body=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-php-corporate" 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-php-corporate&amp;amp;title=Perl%2C%20PHP%2C%20corporate%20-%20continued.&amp;amp;source=Perl+Perl%2C+CPAN%2C+YAPC...+et+ceatera&amp;amp;summary=Remember%20when%20I%20wrote%20about%20Perl%2C%20Python%20%20and%20PHP%20taking%20bigger%20part%20in%20corporate%20world%3F%20Here%20is%20nice%20analysis%20that%20shows%20that%20PHP%20growth%20in%20this%20one%20particular%20job%20ads%20service%20is%20not%20linked%20to%20the%20growing%20search%20for%20%22multilingual%22%20developers%20%28java%20o" 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-php-corporate&amp;amp;t=Perl%2C%20PHP%2C%20corporate%20-%20continued." 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-php-corporate&amp;amp;title=Perl%2C%20PHP%2C%20corporate%20-%20continued." 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%2C%20PHP%2C%20corporate%20-%20continued.&amp;amp;url=http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-php-corporate" 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-php-corporate&amp;amp;title=Perl%2C%20PHP%2C%20corporate%20-%20continued." 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-php-corporate%20Perl%2C%20PHP%2C%20corporate%20-%20continued." 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-php-corporate" 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%2C%20PHP%2C%20corporate%20-%20continued.%20-%20http%3A%2F%2Fperl.baczynski.com%2Ffuture%2Fperl-php-corporate" 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-php-corporate&amp;amp;t=Perl%2C%20PHP%2C%20corporate%20-%20continued.&amp;amp;opener=bm&amp;amp;ei=UTF-8&amp;amp;d=Remember%20when%20I%20wrote%20about%20Perl%2C%20Python%20%20and%20PHP%20taking%20bigger%20part%20in%20corporate%20world%3F%20Here%20is%20nice%20analysis%20that%20shows%20that%20PHP%20growth%20in%20this%20one%20particular%20job%20ads%20service%20is%20not%20linked%20to%20the%20growing%20search%20for%20%22multilingual%22%20developers%20%28java%20o" 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-php-corporate&amp;amp;submitHeadline=Perl%2C%20PHP%2C%20corporate%20-%20continued.&amp;amp;submitSummary=Remember%20when%20I%20wrote%20about%20Perl%2C%20Python%20%20and%20PHP%20taking%20bigger%20part%20in%20corporate%20world%3F%20Here%20is%20nice%20analysis%20that%20shows%20that%20PHP%20growth%20in%20this%20one%20particular%20job%20ads%20service%20is%20not%20linked%20to%20the%20growing%20search%20for%20%22multilingual%22%20developers%20%28java%20o&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-good-as-java" rel="bookmark" title="Permanent Link: Perl as good as java, python and PHP way above"&gt;Perl as good as java, python and PHP way above&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl.baczynski.com/yapc/nice-people-met-yapceu-continued" rel="bookmark" title="Permanent Link: Nice people I met at YAPC::EU &amp;ndash; continued"&gt;Nice people I met at YAPC::EU &amp;#8211; continued&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-10T05:44:48+01:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://perl.baczynski.com/?p=251</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/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</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link>http://sedition.com/a/2898</link>
      <description>The consequences of inclimate weather

I’ve been reading Climate Audit for a bit now. Its sobriety strikes me. I
have learned that my general fears—public climate science is being done
by those who fundamentally underestimate its complexity—were optimistic
and the real situation is worse. The public face of climate science is
cronyism, bullying, agenda pushing, sloppy research practices, politics,
and preconceptions being used in lieu of judgement. If the statute of
limitations had not run out on certain violations we could also call it
criminal.


The smartest guys in the world

Something you’ll note in a lot of fringe “science” is that there are few
individuals who are experts or trained or qualified in anything. The
vaccine linkage to autism is an excellent example of this. The expert was
a doctor who paid kids at birthday parties for blood samples and the
study he wrote that supported the tripe has been repudiated. Most of the
other experts I’ve noticed who supported the idea have been chiropractors
and dentists.

The climatologists who are telling us we have to change the world economy
or we’ll destroy the planet ought to be physicists, statisticians,
meteorologists, oceanographers, and chaos theorists. A few seem to be.
Many are not. It’s a bit hard to determine for many in fact. Here are
some of the actual areas of expertise of climatologists that weren’t hard
to find: Electrician, soft porn novelist, botanist, and more than one
n/a…

Something you should note in a lot of publicized information is how
terribly and completely wrong the acknowledged experts are. Climate Audit
recently reminded us that Enron was considered the best managed company
in America. It was in point of fact one of the worst. Given enough time,
no amount of expert testimony could hide that.

I think you all forget too quickly just how bad things really are.

To punish, reform, and correct the financial institutions that got us
into the mortgage mess the experts recommended giving them as much money
as they needed. If you’ve read the news this week you know that AIG
losses were underestimated and that Fannie Mae continues to bleed money
and wants another fifteen billion dollars now. Don’t pretend you were
away at the time, you know what happened. No amount of candy coating can
change it. No amount of expert testimony to Congress will get the jobs or
the houses back. These are the experts. Every field that becomes mired in
politics, every issue which becomes political, seems to land here.
Education? Jobs? Lobbying? Corporate political donations? Accounting?
Homes? Health care? Oh, but not climate change! That’s pure and clean.

Climate Audit got me interested in amateur science again. So in one hour
I went from knowing almost nothing about where the temperature evidence
comes from to getting one of the raw data sets and parsing and graphing
it. La–

Couch potato climatology

So, I have independently validated global average temperatures as
reported in a certain data set are rising over the last 200 years.

What does this mean? I have plenty of ideas. I have no proof. Neither do
the experts. To prove your ideas in science they must be verifiable. One
of the predictions in climate science was that oceanic storms would rise
in severity and frequency. Yet hurricanes have hit records for mildness
in years that were predicted to be peaks. The prediction being completely
opposed to the observation means the theory was wrong; it’s invalid and
it’s time to try again. Data is not science. Inductive reasoning is no
better than a Ouija board in complex systems.

Carbon dioxide has been drastically higher in the past. Life did not
abate. The Earth has been much warmer in the past. It kept spinning and
plants and animals and other bearers of ribonucleic schemes kept on
keeping on. That graph is 200 years. There has been 500,000,000 years of
biologically relevant weather on Earth. 200 years would be an
indiscernible wink on a graph of that time line.

So, some ideas.

The oceans are somewhere between 70% and 99% of the livable space in the
world depending on how you measure. They are also the primary gas
exchange regulation system in the world. We barely understand how they
work. Major discoveries are being made right now. Any predictions about
global warming that are not founded there are more than flawed. They are
no better than numerology.

Humans have altered the albedo of the Earth significantly with
deforestation, agriculture, and architecture. Not coincidentally, I say,
most of this was in the last 200 years. Granted I only started reading
climate change literature recently. I’m a newbie. I haven’t seen albedo
mentioned yet though Googling for it with “climate science” turned up
quite a bit. It’s not something that can be reasonably left out of any
theories that make conclusions or predictions.

Rural v urban heat change

Some reports try to address the heat reservoirs of urban centers. Those
that don’t are suspect.

The energy in a system is more than its surface temperatures. I’m
appalled at how limited the temperature data is that is being used to
make grand conclusions about the actual heat energy at work on the Earth.
Without comprehensive sea temperatures and atmospheric readings from each
sphere, the conclusions are based on huge assumptions and wishful
thinking. The science to do this is only a few decades old—satellites and
deep sea research equipment—and it is not being fully applied.

A simple example is the difference between two equal volumes of water and
air at 25°C. The plain temperature reading inadequately expresses the
energy difference and completely ignores the changes that take place in
the energy over temperature ranges. Simplistically: water resists getting
warmer more than air does and the warmer it gets, the stronger the
resistance.

This is complex and the conclusions that are coming from the government
backed and funded experts appear to be every bit as naïve as the
temperature graph I created above.

I’m not a PhD in physics or statistics or meteorology or anything for
that matter. I’m just someone who took and interest. And you don’t have
to take my word for it that my research was valid because the code to
repeat it is below; and here is a github gist of it. If I’m wrong or
lying or being tricky to serve an agenda you can find out on your own. No
Freedom of Information request required.

Take an interest. Get your head above the waves. Make yourself part of a
species worth preserving.

#!/usr/bin/env perluse warnings;use strict;use List::Util qw( first );use Statistics::Descriptive;use HTML::Entities;use Time::Progress;use URI::GoogleChart;use LWP::Simple qw( mirror );use File::HomeDir;use File::Spec;$| = 1; # For Time::Progress
#---------------------------------------------------------------------my $home_dir = File::HomeDir-&gt;my_home;my $v2_mean_file = File::Spec-&gt;catfile($home_dir,"v2.mean");unless ( -s $v2_mean_file ){    my $ghcn_v2_mean_uri = "ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/v2/v2.mean.Z";    my $v2_mean_file_z = File::Spec-&gt;catfile($home_dir,"v2.mean.Z");    print "Mirroring $ghcn_v2_mean_uri...\n";    mirror($ghcn_v2_mean_uri, $v2_mean_file_z);    print "Gunzipping $v2_mean_file_z...\n";    system("gunzip", $v2_mean_file_z) == 0        or die "Couldn't gunzip $v2_mean_file_z: $?";}open my $fh, "&lt;", $v2_mean_file    or die "Couldn't open $v2_mean_file for reading: $!";
# Data lines are 78 chars long.my $progress = Time::Progress-&gt;new;$progress-&gt;attr( min =&gt; 1, max =&gt; int( ( -s $fh ) / 78 ) );my %years;my $line = 1;while ( &lt;$fh&gt; ){    chomp;    my ( $station, $year, @months ) = unpack("A12A4(A5)*", $_);    # next if $year =~ /2010/;
    # Contains a missing record, so toss the whole year.    next if first { /-9999/ } @months;    my $stat = $years{$year} ||= Statistics::Descriptive::Full-&gt;new();    for ( 0 .. 11 )    {        $months[$_] /= 10;        $stat-&gt;add_data($months[$_]);    }    # last if $line++ &gt; 15000; # For faster testing.    print $progress-&gt;report("Parsing temperature data %40b%p%L%E\r", $line++);}my @years = sort keys %years;for my $year ( @years ){    printf("%d %5.2f %5.2s %5.1f %5.1f\n",           $year,           $years{$year}-&gt;mean,           $years{$year}-&gt;variance,           $years{$year}-&gt;min,           $years{$year}-&gt;max,           );}my $title = "GHCN v2 Raw Global Mean Temperatures in \x{B0}F $years[0]\x{2013}$years[-1]";my $chart = URI::GoogleChart    -&gt;new("lines", 500, 150,          # label =&gt; [ @years ],          data =&gt;  [ map { $years{$_}-&gt;mean * 9 / 5 + 32 } sort keys %years ],          title =&gt; $title,          range_show =&gt; "left",          encoding =&gt; "s",          color =&gt; "CC0033",          chxt =&gt; "x",          chxl =&gt; join("|",                       "0:",                       $years[0],                       $years[@years*.125],                       $years[@years*.25],                       $years[@years*.375],                       $years[@years*.5],                       $years[@years*.625],                       $years[@years*.75],                       $years[@years*.875],                       $years[-1])    );print "\nURI\n$chart\n\n";printf(qq{Image\n&lt;img src="%s" alt="%s" /&gt;\n\n},       encode_entities($chart),       encode_entities($title),    );exit 0;__DATA__=pod

=head1 NAME

GHCN v2 Raw Global Mean Temperatures Google Chart Generator

=head1 USAGE

The script will take several minutes or longer to run. It provides
output of its progress and estimated run time.

The output is a summary of the yearly data and Google chart URI
composed from the data with a corresponding HTML image tag.

=head1 INSTALL

You might need to install some of these modules: L&lt;List::Util&gt;
L&lt;Statistics::Descriptive&gt;, L&lt;Time::Progress&gt;, L&lt;URI::GoogleChart&gt;,
L&lt;LWP::Simple&gt;, L&lt;HTML::Entities&gt;, L&lt;File::HomeDir&gt;, L&lt;File::Spec&gt;. A
couple of them are core so should be present already no matter your
setup.

The script relies upon the tool C&lt;gunzip&gt; being available. If it's
not, you'll need to uncompress the data file yourself.

=head1 SEE ALSO

L&lt;ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/v2/&gt; and
L&lt;ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/v2/v2.temperature.readme&gt;.

=head1 LICENSE

Copyright (E&lt;copy&gt;) 2008 Ashley Pond V.

This program is free software; you can redistribute it or modify it or
both under the same terms as Perl itself.

=head1 DISCLAIMER OF WARRANTY

Because this software is licensed free of charge, there is no warranty
for the software, to the extent permitted by applicable law. Except
when otherwise stated in writing the copyright holders or other
parties provide the software "as is" without warranty of any kind,
either expressed or implied, including, but not limited to, the
implied warranties of merchantability and fitness for a particular
purpose. The entire risk as to the quality and performance of the
software is with you. Should the software prove defective, you assume
the cost of all necessary servicing, repair, or correction.

In no event unless required by applicable law or agreed to in writing
will any copyright holder, or any other party who may modify and/or
redistribute the software as permitted by the above license, be liable
to you for damages, including any general, special, incidental, or
consequential damages arising out of the use or inability to use the
software (including but not limited to loss of data or data being
rendered inaccurate or losses sustained by you or third parties or a
failure of the software to operate with any other software), even if
such holder or other party has been advised of the possibility of such
damages.

=cut</description>
      <dc:date>2010-03-10T00:00:42Z</dc:date>
      <title>The consequences of inclimate weather –or– Take an interest</title>
      <pubDate>Wed, 10 Mar 2010 00:00:42 -0000</pubDate>
      <content:encoded>
&lt;p class="center"&gt;
&lt;img src="http://sedition.com/img/d/r/double-rainbow.jpg" alt="The consequences of inclimate weather"&gt;
&lt;/p&gt;
&lt;p&gt;I’ve been reading &lt;a href="http://climateaudit.org/"&gt;Climate Audit&lt;/a&gt; for a bit now. Its sobriety strikes me. I have learned that my general fears—public climate science is being done by those who fundamentally underestimate its complexity—were optimistic and the real situation is worse. The public face of climate science is cronyism, bullying, agenda pushing, sloppy research practices, politics, and preconceptions being used in lieu of judgement. If the statute of limitations had not run out on certain violations we could also call it criminal.&lt;/p&gt;
&lt;h3&gt;The smartest guys in the &lt;del&gt;room&lt;/del&gt; &lt;ins&gt;world&lt;/ins&gt;&lt;/h3&gt;&lt;iframe class="left" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt; &lt;/iframe&gt;
&lt;p&gt;Something you’ll note in a lot of fringe “science” is that there are few individuals who are experts or trained or qualified in anything. The vaccine linkage to autism is an excellent example of this. The expert was a doctor who paid kids at birthday parties for blood samples and the study he wrote that supported the tripe has been repudiated. Most of the other experts I’ve noticed who supported the idea have been chiropractors and dentists.&lt;/p&gt;

&lt;p&gt;The climatologists who are telling us we have to change the world economy or we’ll destroy the planet ought to be physicists, statisticians, meteorologists, oceanographers, and chaos theorists. A few seem to be. Many are not. It’s a bit hard to determine for many in fact. Here are some of the actual areas of expertise of climatologists that weren’t hard to find: Electrician, soft porn novelist, botanist, and more than one n/a…&lt;/p&gt;

&lt;p&gt;Something you should note in a lot of publicized information is how terribly and completely wrong the acknowledged experts are. Climate Audit recently reminded us that Enron was considered the best managed company in America. It was in point of fact one of the worst. Given enough time, no amount of expert testimony could hide that.&lt;/p&gt;

&lt;p&gt;I think you all forget too quickly just how bad things really are.&lt;/p&gt;

&lt;p&gt;To punish, reform, and correct the financial institutions that got us into the mortgage mess the experts recommended giving them as much money as they needed. If you’ve read the news this week you know that AIG losses were underestimated and that Fannie Mae continues to bleed money and wants another fifteen billion dollars now. Don’t pretend you were away at the time, you know what happened. No amount of candy coating can change it. No amount of expert testimony to Congress will get the jobs or the houses back. These are the experts. Every field that becomes mired in politics, every issue which becomes political, seems to land here. Education? Jobs? Lobbying? Corporate political donations? Accounting? Homes? Health care? Oh, but not climate change! That’s pure and clean.&lt;/p&gt;

&lt;p&gt;Climate Audit got me interested in amateur science again. So in one hour I went from knowing almost nothing about where the temperature evidence comes from to getting one of the raw data sets and parsing and graphing it. La–&lt;/p&gt;
&lt;p class="center"&gt;
&lt;img src="http://chart.apis.google.com/chart?cht=lc&amp;amp;chs=500x150&amp;amp;chco=CC0033&amp;amp;chtt=GHCN+v2+Raw+Global+Mean+Temperatures+in+%C2%B0F+1702%E2%80%932009&amp;amp;chxl=0:%7C1702%7C1742%7C1780%7C1818%7C1857%7C1895%7C1933%7C1971%7C2009&amp;amp;chxr=1,42,57&amp;amp;chxt=x,y&amp;amp;chd=s:IMRRcUaZXQWYOTYZWUaZZPScXaaXWkZaZZYNAPNXGUMPQQcGGNHLMSNYUWTVaUZSTUTUaaYYNNXXTcQbPMOXVXbbZbgWZfcRejfZbTgYTWWgQXRWPUYaRXgTYcbWXLUUTWaTSQMQQVSWRScTUTVZcafYZeegadXcXefdhfhgkikgmpupqpqkkhkljnokjioknoporommlorpsprrosqplipppvrpmqpnplquqqupmmpoknnmmjmllnntvzxwuwuvuxyywwwxxwvvsvttptssrpmokkmnnm41wuyyww20uv0vxz049z" alt="Couch potato climatology"&gt;
&lt;/p&gt;
&lt;p&gt;So, I have independently validated global average temperatures as reported in a certain data set are rising over the last 200 years.&lt;/p&gt;

&lt;p&gt;What does this mean? I have plenty of ideas. I have no proof. Neither do the experts. To prove your ideas in science they must be verifiable. One of the predictions in climate science was that oceanic storms would rise in severity and frequency. Yet hurricanes have hit records for mildness in years that were predicted to be peaks. The prediction being completely opposed to the observation means the theory was wrong; it’s invalid and it’s time to try again. Data is not science. Inductive reasoning is no better than a Ouija board in complex systems.&lt;/p&gt;

&lt;p&gt;Carbon dioxide has been drastically higher in the past. Life did not abate. The Earth has been much warmer in the past. It kept spinning and plants and animals and other bearers of ribonucleic schemes kept on keeping on. That graph is 200 years. There has been 500,000,000 years of biologically relevant weather on Earth. 200 years would be an indiscernible wink on a graph of that time line.&lt;/p&gt;

&lt;p&gt;So, some ideas.&lt;/p&gt;

&lt;p&gt;The oceans are somewhere between 70% and 99% of the livable space in the world depending on how you measure. They are also the primary gas exchange regulation system in the world. We barely understand how they work. Major discoveries are being made right now. Any predictions about global warming that are not founded there are more than flawed. They are no better than numerology.&lt;/p&gt;

&lt;p&gt;Humans have altered the albedo of the Earth significantly with deforestation, agriculture, and architecture. Not coincidentally, I say, most of this was in the last 200 years. Granted I only started reading climate change literature recently. I’m a newbie. I haven’t seen albedo mentioned yet though Googling for it with “climate science” turned up quite a bit. It’s not something that can be reasonably left out of any theories that make conclusions or predictions.&lt;/p&gt;
&lt;p class="center"&gt;
&lt;a href="http://scienceandpublicpolicy.org/images/stories/papers/originals/Rate_of_Temp_Change_Raw_and_Adjusted_NCDC_Data.pdf"&gt;&lt;img src="http://sedition.com/img/r/u/h/rural-urban-heat.gif" alt="Rural v urban heat change"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Some reports try to address the heat reservoirs of urban centers. Those that don’t are suspect.&lt;/p&gt;

&lt;p&gt;The energy in a system is more than its surface temperatures. I’m appalled at how limited the temperature data is that is being used to make grand conclusions about the actual heat energy at work on the Earth. Without comprehensive sea temperatures and atmospheric readings from each sphere, the conclusions are based on &lt;i&gt;huge&lt;/i&gt; assumptions and wishful thinking. The science to do this is only a few decades old—satellites and deep sea research equipment—and it is not being fully applied.&lt;/p&gt;

&lt;p&gt;A simple example is the difference between two equal volumes of water and air at 25°C. The plain temperature reading inadequately expresses &lt;a href="http://en.wikipedia.org/wiki/Specific_heat_capacity"&gt;the energy difference&lt;/a&gt; and completely ignores the changes that take place in the energy over temperature ranges. Simplistically: water resists getting warmer more than air does and the warmer it gets, the stronger the resistance.&lt;/p&gt;

&lt;p&gt;This is &lt;i&gt;complex&lt;/i&gt; and the conclusions that are coming from the government backed and funded experts appear to be every bit as naïve as the temperature graph I created above.&lt;/p&gt;

&lt;p&gt;I’m not a PhD in physics or statistics or meteorology or anything for that matter. I’m just someone who took and interest. And you don’t have to take my word for it that my research was valid because the code to repeat it is below; and here is a &lt;a href="http://gist.github.com/316989"&gt;github gist&lt;/a&gt; of it. If I’m wrong or lying or being tricky to serve an agenda you can find out on your own. No Freedom of Information request required.&lt;/p&gt;

&lt;p&gt;Take an interest. Get your head above the waves. Make yourself part of a species worth preserving.&lt;/p&gt;
&lt;pre class="perl"&gt;#!/usr/bin/env perl
&lt;span class="word"&gt;use&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;warnings&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;use&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;strict&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;use&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;List::Util&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quotelike_words"&gt;qw( first )&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;use&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;Statistics::Descriptive&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;use&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;HTML::Entities&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;use&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;Time::Progress&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;use&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;URI::GoogleChart&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;use&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;LWP::Simple&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quotelike_words"&gt;qw( mirror )&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;use&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;File::HomeDir&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;use&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;File::Spec&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;

&lt;span class="magic"&gt;$|&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="comment"&gt;# For Time::Progress&lt;/span&gt;

#---------------------------------------------------------------------
&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$home_dir&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;File::HomeDir&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;my_home&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$v2_mean_file&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;File::Spec&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;catfile&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;$home_dir&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="quote_double"&gt;"v2.mean"&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;unless&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;-s&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$v2_mean_file&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;
&lt;span class="structure"&gt;{&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$ghcn_v2_mean_uri&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/v2/v2.mean.Z"&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$v2_mean_file_z&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;File::Spec&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;catfile&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;$home_dir&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="quote_double"&gt;"v2.mean.Z"&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;print&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"Mirroring $ghcn_v2_mean_uri...\n"&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;mirror&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;$ghcn_v2_mean_uri&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$v2_mean_file_z&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;print&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"Gunzipping $v2_mean_file_z...\n"&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;system&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="quote_double"&gt;"gunzip"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$v2_mean_file_z&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;==&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;
&lt;span class="whitespace"&gt;        &lt;/span&gt;&lt;span class="operator"&gt;or&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;die&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"Couldn't gunzip $v2_mean_file_z: $?"&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="structure"&gt;}&lt;/span&gt;

&lt;span class="word"&gt;open&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$fh&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"&amp;lt;"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$v2_mean_file&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="operator"&gt;or&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;die&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"Couldn't open $v2_mean_file for reading: $!"&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;

# Data lines are 78 chars long.
&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$progress&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;Time::Progress&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;new&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="symbol"&gt;$progress&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;attr&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;min&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;max&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;int&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;-s&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$fh&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;/&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;78&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;

&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;%years&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$line&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;

&lt;span class="word"&gt;while&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quotelike_readline"&gt;&amp;lt;$fh&amp;gt;&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;
&lt;span class="structure"&gt;{&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;chomp&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$station&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$year&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;@months&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;unpack&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="quote_double"&gt;"A12A4(A5)*"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="magic"&gt;$_&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
    # next if $year =~ /2010/;
    # Contains a missing record, so toss the whole year.
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;next&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;if&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;first&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;{&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="regexp_match"&gt;/-9999/&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;}&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;@months&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="whitespace"&gt;
    &lt;/span&gt;&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$stat&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;$year&lt;/span&gt;&lt;span class="structure"&gt;}&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;||&lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;Statistics::Descriptive::Full&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;new&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="whitespace"&gt;
    &lt;/span&gt;&lt;span class="word"&gt;for&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;..&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;11&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="structure"&gt;{&lt;/span&gt;
&lt;span class="whitespace"&gt;        &lt;/span&gt;&lt;span class="symbol"&gt;$months&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="magic"&gt;$_&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;/=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="whitespace"&gt;        &lt;/span&gt;&lt;span class="symbol"&gt;$stat&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;add_data&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;$months&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="magic"&gt;$_&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="structure"&gt;}&lt;/span&gt;
    # last if $line++ &amp;gt; 15000; # For faster testing.
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;print&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$progress&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;report&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="quote_double"&gt;"Parsing temperature data %40b%p%L%E\r"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$line&lt;/span&gt;&lt;span class="operator"&gt;++&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="structure"&gt;}&lt;/span&gt;

&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;@years&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;sort&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;keys&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;%years&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;for&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$year&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;@years&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;
&lt;span class="structure"&gt;{&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="word"&gt;printf&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="quote_double"&gt;"%d %5.2f %5.2s %5.1f %5.1f\n"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;           &lt;/span&gt;&lt;span class="symbol"&gt;$year&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;           &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;$year&lt;/span&gt;&lt;span class="structure"&gt;}&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;mean&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;           &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;$year&lt;/span&gt;&lt;span class="structure"&gt;}&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;variance&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;           &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;$year&lt;/span&gt;&lt;span class="structure"&gt;}&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;min&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;           &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;$year&lt;/span&gt;&lt;span class="structure"&gt;}&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;max&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;           &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="structure"&gt;}&lt;/span&gt;

&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$title&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"GHCN v2 Raw Global Mean Temperatures in \x{B0}F $years[0]\x{2013}$years[-1]"&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;
&lt;span class="word"&gt;my&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$chart&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;URI::GoogleChart&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;new&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="quote_double"&gt;"lines"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;500&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;150&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
          # label =&amp;gt; [ @years ],
&lt;span class="whitespace"&gt;          &lt;/span&gt;&lt;span class="word"&gt;data&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="whitespace"&gt;  &lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;map&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;{&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;{&lt;/span&gt;&lt;span class="magic"&gt;$_&lt;/span&gt;&lt;span class="structure"&gt;}&lt;/span&gt;&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="word"&gt;mean&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;*&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;9&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;/&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;5&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;+&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;32&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;}&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;sort&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;keys&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;%years&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;          &lt;/span&gt;&lt;span class="word"&gt;title&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="symbol"&gt;$title&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;          &lt;/span&gt;&lt;span class="word"&gt;range_show&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"left"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;          &lt;/span&gt;&lt;span class="word"&gt;encoding&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"s"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;          &lt;/span&gt;&lt;span class="word"&gt;color&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"CC0033"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;          &lt;/span&gt;&lt;span class="word"&gt;chxt&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"x"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;          &lt;/span&gt;&lt;span class="word"&gt;chxl&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="word"&gt;join&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="quote_double"&gt;"|"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;                       &lt;/span&gt;&lt;span class="quote_double"&gt;"0:"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;                       &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;                       &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;@years&lt;/span&gt;&lt;span class="operator"&gt;*&lt;/span&gt;&lt;span class="number_float"&gt;.125&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;                       &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;@years&lt;/span&gt;&lt;span class="operator"&gt;*&lt;/span&gt;&lt;span class="number_float"&gt;.25&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;                       &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;@years&lt;/span&gt;&lt;span class="operator"&gt;*&lt;/span&gt;&lt;span class="number_float"&gt;.375&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;                       &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;@years&lt;/span&gt;&lt;span class="operator"&gt;*&lt;/span&gt;&lt;span class="number_float"&gt;.5&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;                       &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;@years&lt;/span&gt;&lt;span class="operator"&gt;*&lt;/span&gt;&lt;span class="number_float"&gt;.625&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;                       &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;@years&lt;/span&gt;&lt;span class="operator"&gt;*&lt;/span&gt;&lt;span class="number_float"&gt;.75&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;                       &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;@years&lt;/span&gt;&lt;span class="operator"&gt;*&lt;/span&gt;&lt;span class="number_float"&gt;.875&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;                       &lt;/span&gt;&lt;span class="symbol"&gt;$years&lt;/span&gt;&lt;span class="structure"&gt;[&lt;/span&gt;&lt;span class="number"&gt;-1&lt;/span&gt;&lt;span class="structure"&gt;]&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;

&lt;span class="word"&gt;print&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="quote_double"&gt;"\nURI\n$chart\n\n"&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;

&lt;span class="word"&gt;printf&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="quote_interpolate"&gt;qq{Image\n&amp;lt;img src="%s" alt="%s" /&amp;gt;\n\n}&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;       &lt;/span&gt;&lt;span class="word"&gt;encode_entities&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;$chart&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;       &lt;/span&gt;&lt;span class="word"&gt;encode_entities&lt;/span&gt;&lt;span class="structure"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;$title&lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;span class="whitespace"&gt;    &lt;/span&gt;&lt;span class="structure"&gt;)&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;

&lt;span class="word"&gt;exit&lt;/span&gt;&lt;span class="whitespace"&gt; &lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="structure"&gt;;&lt;/span&gt;

&lt;span class="separator"&gt;__DATA__&lt;/span&gt;
&lt;span class="data"&gt;
=pod

=head1 NAME

GHCN v2 Raw Global Mean Temperatures Google Chart Generator

=head1 USAGE

The script will take several minutes or longer to run. It provides
output of its progress and estimated run time.

The output is a summary of the yearly data and Google chart URI
composed from the data with a corresponding HTML image tag.

=head1 INSTALL

You might need to install some of these modules: L&amp;lt;List::Util&amp;gt;
L&amp;lt;Statistics::Descriptive&amp;gt;, L&amp;lt;Time::Progress&amp;gt;, L&amp;lt;URI::GoogleChart&amp;gt;,
L&amp;lt;LWP::Simple&amp;gt;, L&amp;lt;HTML::Entities&amp;gt;, L&amp;lt;File::HomeDir&amp;gt;, L&amp;lt;File::Spec&amp;gt;. A
couple of them are core so should be present already no matter your
setup.

The script relies upon the tool C&amp;lt;gunzip&amp;gt; being available. If it's
not, you'll need to uncompress the data file yourself.

=head1 SEE ALSO

L&amp;lt;ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/v2/&amp;gt; and
L&amp;lt;ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/v2/v2.temperature.readme&amp;gt;.

=head1 LICENSE

Copyright (E&amp;lt;copy&amp;gt;) 2008 Ashley Pond V.

This program is free software; you can redistribute it or modify it or
both under the same terms as Perl itself.

=head1 DISCLAIMER OF WARRANTY

Because this software is licensed free of charge, there is no warranty
for the software, to the extent permitted by applicable law. Except
when otherwise stated in writing the copyright holders or other
parties provide the software "as is" without warranty of any kind,
either expressed or implied, including, but not limited to, the
implied warranties of merchantability and fitness for a particular
purpose. The entire risk as to the quality and performance of the
software is with you. Should the software prove defective, you assume
the cost of all necessary servicing, repair, or correction.

In no event unless required by applicable law or agreed to in writing
will any copyright holder, or any other party who may modify and/or
redistribute the software as permitted by the above license, be liable
to you for damages, including any general, special, incidental, or
consequential damages arising out of the use or inability to use the
software (including but not limited to loss of data or data being
rendered inaccurate or losses sustained by you or third parties or a
failure of the software to operate with any other software), even if
such holder or other party has been advised of the possibility of such
damages.

=cut&lt;/span&gt;&lt;/pre&gt;

    </content:encoded>
      <dcterms:modified>2010-03-10T00:00:42Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://sedition.com/a/2898</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</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link>http://www.shadowcat.co.uk/blog/matt-s-trout/hire-a-dev-shop-too/</link>
      <description>Digg! submit to reddit Delicious RSS Feed Readers

So you and the rest of your team are slamming out code, features rolling
down the pipeline but you're starting to accrue technical debt and you
know that things are slowing down a little bit and the releases are
getting buggier and so you ask management for some clean up time. And the
response is the answer you always knew you were going to get:

"We can't really push the deadlines back, there are business side
concerns to this launch as well."

So you shrug and maybe you think maybe you should call your significant
other and beg forgiveness for the overtime you're about to commit and
then it just gets worse!

"What about if we got you some outside help for a while?"

Stereotypes of outside development experiences flash before your eyes -
the guy who produces "results" by hacking that can barely even be
described as "shortest path" given it'll probably need rewriting twice
before it ever hits production; the people who come in and say "of course
this will work but first we have to rewrite everything"; even the world
famous Brilliant Paula. Or perhaps worse, people who'll sneer at your
competency but not ever actually do anything.

Well, I'm here to tell you that it doesn't have to be like that.

Outside development shops can bring substantial value to your process
provided they are engaged to work as part of your team, not independently
from it.

Brad Hargreaves' recent article When You Should Hire a Dev Shop (other
than "never") struck a chord with me, since it outlines a lot of good
reasons why to not outsource your primary development in the vast
majority of cases - reasons I thoroughly agree with - and yet a
significant percentage of Shadowcat's clients are startup or still
startup-ish companies and I also thoroughly believe that they made a good
choice by hiring us.

[IMAGE]

So the question is, how do we resolve this apparent contradiction?

The answer is - there is no contradiction. Brad is absolutely right that
in almost all cases you need a brilliant team in-house for your project,
since they'll be steeped in your business domain and have direct access
to the stakeholders (in a small startup this might be early stage
customers rather than internal business staff). As Joel Spolsky famously
outlines:

If it's a core business function -- do it yourself, no matter what.

However, that doesn't mean that you should do everything yourself.

If you're writing a web app, you're probably going to use a web framework
- in perl, Catalyst is probably the most popular and if you're using an
RDBMS as a backing store you'll probably also be using DBIx::Class to
provide ORM facilities. In ruby, perhaps you'd be using Ruby on Rails. In
python, Django. This reliance on open source software is "outsourcing" of
a sort - though depending how critical the libraries in question are to
your success you may have done more or less research and code reading in
the process of selecting it.

The key question, then, to ask yourself, is:

Which parts of my stack are core business functions and which aren't?

The odds are that the finer details of running servers probably aren't,
so long as you're confident they'll stay up, so you might push that out
to Amazon Web Services. You're unlikely to write your own operating
system either (unless you're Google, who by this point effectively have
done so several times).

So ... are the details of effective abstraction patterns, or of how to
set up a robust deployment infrastructure that works well with your
chosen release cycle pattern, or even how to integrate memcached into
your ORM part of your core competencies?

I'd argue that they aren't.

What's essential to you is the code that handles your business domain,
the code that customers (or stakeholders) directly interactive with to
get stuff done. And you're the only people who can do that. On the other
hand, while having a well managed process from development through to
production is important - and one can very definitely argue that the
production deploy is a core competency so you'd better know how to do
that one yourself - there's no reason you can't let somebody else handle
the details.

You know more about your business domain and core competencies than
anybody you can hire.

Outside experts on the technologies will know them better because they're
focused on the technology.

Which is precisely where Open Source tied consultancies like Shadowcat
come in. We make impedence mismatches between what our clients are trying
to create and what the tools they're using were designed for go away by
having long experience bending those tools to the needs of projects. We
put together strategies for deployment management and then dry run them
with clients until they know for sure they could do a deployment
themselves in the middle of a hurricane. We teach techniques that we
think are applicable to what's being worked on and let our clients decide
whether those techniques are what they need right now.

The critical part of that is "let our clients decide" - we always work
with an in-house team, and in the cases of clients whose teams are
undermanned or just being assembled we work with them to help them build
that team out. We also often take on the technology side components of
getting new starters up to speed so that existing developers can continue
to focus on delivering features - you can't beat the Mythical Man Month
problem but you can certainly ameliorate it with a little help.

None of this would work well without a strong team inside the client that
knows and cares about their business domain in a way an outside company
never can - and the few times we've been persuaded by clients to try and
become primary developers of code with only business staff working in
house, it's been an unmitigated disaster. Which brings two more rules:

An open source consultancy helps you apply your chosen technologies to
your chosen problem in the way that makes it easiest for your team to
make progress.

A competent consultancy makes an overpriced incompetent contract
development house.

So maybe my definition of a "dev shop" is stretching it a little compared
to the post I was inspired by, but I think there's interesting thoughts
here about how you deploy and best use your resources within a startup -
and hopefully you'll look at the outsourcing possibilities in a new
light.

If you want to flame me for posting borderline advertorial content, tell
me I'm wrong and need to update the post with your essential point (I
might!) or are feeling inspired and want to talk about how Shadowcat
could work with your team to achieve the sort of good things I describe,
I'm available as always on mst@shadowcat.co.uk.

For the moment, however, I'm very aware that it's not many hours until a
deployment process we've put together and dry-run with a client's team a
few times is going to have its first real live test tomorrow with their
client watching, so I'm off to get some sleep, happy in the knowledge
that I got through this entire post without using the word synergy once.

... ah, nuts.

-- mst, out.</description>
      <dc:date>0</dc:date>
      <title>You Should Hire A Dev Shop Too</title>
      <pubDate>Tue, 09 Mar 2010 22:00:00 -0000</pubDate>
      <content:encoded>
&lt;p&gt;&lt;a href="http://digg.com/"&gt; &lt;img alt="Digg!" src="http://digg.com/img/badges/16x16-digg-guy.gif"&gt; &lt;/a&gt; &lt;a href="http://www.reddit.com/submit"&gt; &lt;img alt="submit to reddit" src="http://www.reddit.com/static/spreddit1.gif"&gt; &lt;/a&gt; &lt;a href="http://delicious.com/save"&gt; &lt;img alt="Delicious" src="http://static.delicious.com/img/delicious.small.gif"&gt; &lt;/a&gt; &lt;a&gt;&lt;img alt="" src="http://i.newsvine.com/_vine/images/identity/button_seednewsvine.gif"&gt;&lt;/a&gt; &lt;a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.yoursite.com%2Farticle.php%26title%3DThe%2BArticle%2BTitle"&gt; &lt;img alt="" src="http://cdn.stumble-upon.com/images/16x16_su_3d.gif"&gt;&lt;/a&gt; &lt;a title="Social Bookmark"&gt;&lt;img alt="RSS Feed Readers" src="http://www.seocentro.com/bookmark-rss/images/rss_button01.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div id="blog"&gt;&lt;p&gt;So you and the rest of your team are slamming out code, features rolling down the pipeline but you're starting to accrue technical debt and you know that things are slowing down a little bit and the releases are getting buggier and so you ask management for some clean up time. And the response is the answer you always knew you were going to get:&lt;/p&gt;&lt;i&gt;&amp;#34;We can't really push the deadlines back, there are business side concerns to this launch as well.&amp;#34;&lt;/i&gt;&lt;p&gt;So you shrug and maybe you think maybe you should call your significant other and beg forgiveness for the overtime you're about to commit and then it &lt;b&gt;just gets worse!&lt;/b&gt;&lt;/p&gt;&lt;i&gt;&amp;#34;What about if we got you some outside help for a while?&amp;#34;&lt;/i&gt;&lt;p&gt;Stereotypes of outside development experiences flash before your eyes - the guy who produces &amp;#34;results&amp;#34; by hacking that can barely even be described as &amp;#34;shortest path&amp;#34; given it'll probably need rewriting twice before it ever hits production; the people who come in and say &amp;#34;of course this will work but first we have to rewrite everything&amp;#34;; even the world famous &lt;a href="http://thedailywtf.com/Articles/The_Brillant_Paula_Bean.aspx"&gt;Brilliant Paula&lt;/a&gt;. Or perhaps worse, people who'll sneer at your competency but not ever actually &lt;b&gt;do anything&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Well, I'm here to tell you that it doesn't have to be like that.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Outside development shops can bring substantial value to your process provided they are engaged to work as part of your team, not independently from it.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://bhargreaves.com"&gt;Brad Hargreaves'&lt;/a&gt; recent article &lt;a href="http://bhargreaves.com/2010/03/hire-dev-shop-other-never/"&gt;When You Should Hire a Dev Shop (other than &amp;#34;never&amp;#34;)&lt;/a&gt; struck a chord with me, since it outlines a lot of good reasons why to not outsource your &lt;i&gt;primary development&lt;/i&gt; in the vast majority of cases - reasons I thoroughly agree with - and yet a significant percentage of Shadowcat's clients are startup or still startup-ish companies and I also thoroughly believe that they made a good choice by hiring us.&lt;/p&gt;&lt;p&gt;&lt;a href="http://4simpsons.wordpress.com/2007/07/06/opposites-2/"&gt;&lt;img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;So the question is, how do we resolve this apparent contradiction?&lt;/p&gt;&lt;p&gt;The answer is - &lt;b&gt;there is no contradiction&lt;/b&gt;. Brad is absolutely right that in almost all cases you need a brilliant team in-house for your project, since they'll be steeped in your business domain and have direct access to the stakeholders (in a small startup this might be early stage customers rather than internal business staff). As &lt;a href="http://www.joelonsoftware.com/articles/fog0000000007.html"&gt;Joel Spolsky famously outlines&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;b&gt;If it's a core business function -- do it yourself, no matter what.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;However, that doesn't mean that you should do everything yourself.&lt;/p&gt;&lt;p&gt;If you're writing a web app, you're probably going to use a web framework - in perl, &lt;a href="http://catalystframework.org"&gt;Catalyst&lt;/a&gt; is probably the most popular and if you're using an RDBMS as a backing store you'll probably also be using &lt;a href="http://search.cpan.org/dist/DBIx-Class/"&gt;DBIx::Class&lt;/a&gt; to provide ORM facilities. In ruby, perhaps you'd be using &lt;a href="http://rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt;. In python, &lt;a href="http://www.djangoproject.com"&gt;Django.&lt;/a&gt; This reliance on open source software is &amp;#34;outsourcing&amp;#34; of a sort - though depending how critical the libraries in question are to your success &lt;a href="../choosing-a-library/"&gt;you may have done more or less research and code reading in the process of selecting it&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The key question, then, to ask yourself, is:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Which parts of my stack are core business functions and which aren't?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The odds are that the finer details of running servers probably aren't, so long as you're confident they'll stay up, so you might push that out to &lt;a href="http://aws.amazon.com/"&gt;Amazon Web Services&lt;/a&gt;. You're unlikely to write your own operating system either (unless you're &lt;a href="http://www.google.com"&gt;Google, who by this point effectively have done so several times&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;So ... are the details of effective abstraction patterns, or of how to set up a robust deployment infrastructure that works well with your chosen release cycle pattern, or even how to &lt;a href="http://search.cpan.org/perldoc?DBIx::Class::Cursor::Cached"&gt;integrate memcached into your ORM&lt;/a&gt; part of your core competencies?&lt;/p&gt;&lt;p&gt;I'd argue that they aren't.&lt;/p&gt;&lt;p&gt;What's essential to you is the code that handles your business domain, the code that customers (or stakeholders) directly interactive with to get stuff done. And you're the only people who can do that. On the other hand, while having a well managed process from development through to production is important - and one can very definitely argue that the production deploy is a core competency so you'd better know how to do that one yourself - there's no reason you can't let somebody else handle the details.&lt;/p&gt;&lt;p&gt;&lt;b&gt;You know more about your business domain and core competencies than anybody you can hire.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Outside experts on the technologies will know them better because they're focused on the technology.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Which is precisely where Open Source tied consultancies like Shadowcat come in. We make impedence mismatches between what our clients are trying to create and what the tools they're using were designed for go away by having long experience bending those tools to the needs of projects. We put together strategies for deployment management and then dry run them with clients until they know for sure they could do a deployment themselves in the middle of a hurricane. We teach techniques that we think are applicable to what's being worked on and let our clients decide whether those techniques are what they need right now.&lt;/p&gt;&lt;p&gt;The critical part of that is &amp;#34;let our clients decide&amp;#34; - we always work with an in-house team, and in the cases of clients whose teams are undermanned or just being assembled we work with them to help them build that team out. We also often take on the technology side components of getting new starters up to speed so that existing developers can continue to focus on delivering features - you can't beat the Mythical Man Month problem but you can certainly ameliorate it with a little help.&lt;/p&gt;&lt;p&gt;None of this would work well without a strong team inside the client that knows and cares about their business domain in a way an outside company never can - and the few times we've been persuaded by clients to try and become primary developers of code with only business staff working in house, it's been an unmitigated disaster. Which brings two more rules:&lt;/p&gt;&lt;p&gt;&lt;b&gt;An open source consultancy helps you apply your chosen technologies to your chosen problem in the way that makes it easiest for your team to make progress.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;A competent consultancy makes an overpriced incompetent contract development house.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;So maybe my definition of a &amp;#34;dev shop&amp;#34; is stretching it a little compared to the post I was inspired by, but I think there's interesting thoughts here about how you deploy and best use your resources within a startup - and hopefully you'll look at the outsourcing possibilities in a new light.&lt;/p&gt;&lt;p&gt;If you want to flame me for posting borderline advertorial content, tell me I'm wrong and need to update the post with your essential point (I might!) or are feeling inspired and want to talk about how Shadowcat could work with your team to achieve the sort of good things I describe, I'm available as always on mst@shadowcat.co.uk.&lt;/p&gt;&lt;p&gt;For the moment, however, I'm very aware that it's not many hours until a deployment process we've put together and dry-run with a client's team a few times is going to have its first real live test tomorrow with &lt;i&gt;their&lt;/i&gt; client watching, so I'm off to get some sleep, happy in the knowledge that I got through this entire post without using the word &lt;i&gt;synergy&lt;/i&gt; once.&lt;/p&gt;&lt;p&gt;... ah, nuts.&lt;/p&gt;&lt;p&gt;-- mst, out.&lt;/p&gt;&lt;/div&gt;

</content:encoded>
      <dcterms:modified>0</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://www.shadowcat.co.uk/blog/matt-s-trout/hire-a-dev-shop-too/</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 (Michael Canzoneri)</author>
      <dc:creator>nobody@example.com (Michael Canzoneri)</dc:creator>
      <category>links</category>
      <description>  * [GO] canviz - JavaScript library for drawing Graphviz graphs to a web
    browser canvas

  * [GO] tbaggery - Smack a Ho.st

  * [GO] How Genetics Works | FlowingData

  * [GO] YouTube - Pedigree Dogs ad shot 1000 FPS using the Phantom
    camera

  * [GO] iProcessing

  * [GO] The 99% Rule - Modern Perl Books, a Modern Perl Blog

  * [GO] CWE - 2010 CWE/SANS Top 25 Most Dangerous Programming Errors

  * [GO] doane paper grid+lines</description>
      <dc:date>2010-03-08T14:43:00Z</dc:date>
      <dc:subject>links</dc:subject>
      <title>Links and Notes for 2010-03-05</title>
      <pubDate>Mon, 08 Mar 2010 14:43: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://code.google.com/p/canviz/"&gt;GO&lt;/a&gt;] canviz - JavaScript library for drawing &lt;a href="http://www.graphviz.org/" rel="nofollow"&gt;Graphviz&lt;/a&gt; graphs to a web browser canvas&lt;/li&gt;&lt;li&gt;[&lt;a href="http://tbaggery.com/2010/03/04/smack-a-ho-st.html"&gt;GO&lt;/a&gt;] tbaggery - Smack a Ho.st&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://flowingdata.com/2010/03/05/how-genetics-works/"&gt;GO&lt;/a&gt;] How Genetics Works | FlowingData&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://www.youtube.com/watch?v=mUCRZzhbHH0"&gt;GO&lt;/a&gt;] YouTube - Pedigree Dogs ad shot 1000 FPS using the Phantom camera&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://luckybite.com/iprocessing/"&gt;GO&lt;/a&gt;] iProcessing&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://www.modernperlbooks.com/mt/2010/03/the-99-rule.html"&gt;GO&lt;/a&gt;] The 99% Rule - Modern Perl Books, a Modern Perl Blog&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://cwe.mitre.org/top25/#Listing"&gt;GO&lt;/a&gt;] CWE - 2010 CWE/SANS Top 25 Most Dangerous Programming Errors&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[&lt;a href="http://doanepaper.com/"&gt;GO&lt;/a&gt;] doane paper grid+lines&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-08T14:43:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:tag:blogger.com,1999:blog-7692555825490799910.post-8488187068427877552</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 (ktat)</author>
      <dc:creator>nobody@example.com (ktat)</dc:creator>
      <category>perl</category>
      <link>http://d.hatena.ne.jp/ktat/20100308/1267980455</link>
      <description>どうやるんだっけーって、ソース見てて、あーこれでいけるっぽいやー。

って、思ってたら、前調べてた orz

  Module::Install の場合、

  tests_recursive;

  って、書くらしい。

  http://d.hatena.ne.jp/ktat/20080515/1210864386


ま...これは、t/以下を再帰的に追加するっていう話なので、全然違うディレクトリに追加したければ、以下を(そんなケースは不要だが)。

Makefile.PLに、

tests "t/*.t t/*/*.t";

Module::Install::Metadataに以下のような定義があって、このへんは、それっぽく使えるということのような気がします。

my @boolean_keys = qw{        sign};
my @scalar_keys = qw{        name        module_name        abstract        author        version        distribution_type        tests        installdirs};
my @tuple_keys = qw{        configure_requires        build_requires        requires        recommends        bundles        resources};
my @resource_keys = qw{        homepage        bugtracker        repository};
my @array_keys = qw{        keywords};</description>
      <dc:date>2010-03-08T01:47:35+09:00</dc:date>
      <dc:subject>perl</dc:subject>
      <title>[perl] Module::Install で test ディレクトリに t/ 以外を追加する</title>
      <pubDate>Mon, 08 Mar 2010 01:47:35 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;どうやるんだっけーって、ソース見てて、あーこれでいけるっぽいやー。&lt;/p&gt;
			&lt;p&gt;って、思ってたら、前調べてた orz&lt;/p&gt;
			&lt;blockquote title="http://d.hatena.ne.jp/ktat/20080515/1210864386" cite="http://d.hatena.ne.jp/ktat/20080515/1210864386"&gt;
			&lt;p&gt;Module::Install の場合、&lt;/p&gt;
			&lt;p&gt; tests_recursive;&lt;/p&gt;
			&lt;p&gt;って、書くらしい。&lt;/p&gt;
			&lt;cite&gt;&lt;a href="http://d.hatena.ne.jp/ktat/20080515/1210864386" target="_blank"&gt;http://d.hatena.ne.jp/ktat/20080515/1210864386&lt;/a&gt;&lt;/cite&gt;&lt;/blockquote&gt;
			&lt;br&gt;

			&lt;p&gt;ま...これは、t/以下を再帰的に追加するっていう話なので、全然違うディレクトリに追加したければ、以下を(そんなケースは不要だが)。&lt;/p&gt;
			&lt;p&gt;Makefile.PLに、&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
tests &lt;span class="synConstant"&gt;&amp;#34;t/*.t t/*/*.t&amp;#34;&lt;/span&gt;;
&lt;/pre&gt;

			&lt;p&gt;Module::Install::Metadataに以下のような定義があって、このへんは、それっぽく使えるということのような気がします。&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;@boolean_keys&lt;/span&gt; = &lt;span class="synConstant"&gt;qw{&lt;/span&gt;
&lt;span class="synConstant"&gt;        sign&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;@scalar_keys&lt;/span&gt; = &lt;span class="synConstant"&gt;qw{&lt;/span&gt;
&lt;span class="synConstant"&gt;        name&lt;/span&gt;
&lt;span class="synConstant"&gt;        module_name&lt;/span&gt;
&lt;span class="synConstant"&gt;        abstract&lt;/span&gt;
&lt;span class="synConstant"&gt;        author&lt;/span&gt;
&lt;span class="synConstant"&gt;        version&lt;/span&gt;
&lt;span class="synConstant"&gt;        distribution_type&lt;/span&gt;
&lt;span class="synConstant"&gt;        tests&lt;/span&gt;
&lt;span class="synConstant"&gt;        installdirs&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;@tuple_keys&lt;/span&gt; = &lt;span class="synConstant"&gt;qw{&lt;/span&gt;
&lt;span class="synConstant"&gt;        configure_requires&lt;/span&gt;
&lt;span class="synConstant"&gt;        build_requires&lt;/span&gt;
&lt;span class="synConstant"&gt;        requires&lt;/span&gt;
&lt;span class="synConstant"&gt;        recommends&lt;/span&gt;
&lt;span class="synConstant"&gt;        bundles&lt;/span&gt;
&lt;span class="synConstant"&gt;        resources&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;@resource_keys&lt;/span&gt; = &lt;span class="synConstant"&gt;qw{&lt;/span&gt;
&lt;span class="synConstant"&gt;        homepage&lt;/span&gt;
&lt;span class="synConstant"&gt;        bugtracker&lt;/span&gt;
&lt;span class="synConstant"&gt;        repository&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;@array_keys&lt;/span&gt; = &lt;span class="synConstant"&gt;qw{&lt;/span&gt;
&lt;span class="synConstant"&gt;        keywords&lt;/span&gt;
&lt;span class="synConstant"&gt;}&lt;/span&gt;;
&lt;/pre&gt;

		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-03-08T01:47:35+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:kitty,2006:http://d.hatena.ne.jp/ktat/20100308/1267980455</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>
      <category>Perl::Staff CeBIT2010 CeBIT</category>
      <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>
      <dc:subject>Perl::Staff CeBIT2010 CeBIT</dc:subject>
      <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://pubsub