<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>perl-mongers.org</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/" />
    <link rel="self" type="application/atom+xml" href="http://perl-mongers.org/atom.xml" />
    <id>tag:perl-mongers.org,2008-05-19://1</id>
    <updated>2010-01-02T16:06:20Z</updated>
    <subtitle>Yet Another Perl Mongers</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.21-en</generator>

<entry>
    <title>CPAN モジュールインストール時にデフォルトで yes と答える方法</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2010/01/cpan_yes.html" />
    <id>tag:perl-mongers.org,2010://1.94</id>

    <published>2010-01-02T15:43:22Z</published>
    <updated>2010-01-02T16:06:20Z</updated>

    <summary>明けましておめでとうございます！ mumumu です。 僕は普段 Perl を使...</summary>
    <author>
        <name>mumumu.myopenid.com</name>
        <uri>http://mumumu.myopenid.com/</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>明けましておめでとうございます！ <a href="http://mumumuorg.blogspot.com/">mumumu</a> です。</p>
<br />
<p>僕は普段 Perl を使ってないんだけど、たまに CPAN module をインストールする機会があります。その際に毎回うざいなって思うのが、依存関係にあるモジュールをインストールしますか？ って以下のように聞かれること。このときエンターキーを連打したくないわけです。</p>
<pre>
---- Unsatisfied dependencies detected during ----
----       MIYAGAWA/XML-Atom-0.37.tar.gz      ----
    XML::LibXML [requires]
    XML::XPath [requires]
Shall I follow them and prepend them to the queue
of modules we are processing right now? [yes]
</pre>
<p>つまり僕がやりたいのは、こうした CPAN の問いかけに自動で yes と答えて貰うようにしたいということ。 </p>
<p>ちょっとぐぐったら yes コマンドを使ったりとか、PERL_AUTOINSTALL=&#39;--defaultdeps&#39; の環境変数を設定したりだとかいろいろ出てきたけど、<a href="http://d.hatena.ne.jp/tokuhirom">tokuhiromさん</a> に教えて貰った以下の方法が一番効いたので書いておくことにしますです。</p>
<pre>
$ sudo perl -MCPAN -e shell
cpan&gt; o conf prerequisites_policy follow
cpan&gt; o conf commit
</pre>
<p> 多分慣れた人には当然なんだろうけど、たまに使う俺はちょっと感動しますた(´ー｀; )</p>

]]>
        
    </content>
</entry>

<entry>
    <title>Catalyst::Controller::Resources で Chaind を楽しよう</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2009/06/catalyst-controller-resources.html" />
    <id>tag:perl-mongers.org,2009://1.93</id>

    <published>2009-06-14T15:43:31Z</published>
    <updated>2009-06-14T15:59:31Z</updated>

    <summary>どうも、お久しぶりの vkgtaro です。自分の blog に書こうかと思った...</summary>
    <author>
        <name>vkgtaro.jp</name>
        <uri>http://vkgtaro.jp/</uri>
    </author>
    
    <category term="ctalystcatalystcontrollerresources" label="Ctalyst Catalyst::Controller::Resources" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>どうも、お久しぶりの vkgtaro です。自分の blog に書こうかと思ったんだけど、購読者数が多いこちらに書くよ！</p>
<br />
<p>JPA の活動とか charsbar さんの連載で Catalyst が盛り上がってきてますね。と言うことで、Catalyst::Controller::Resources を紹介したいと思います。（JPA のセミナーでは Action::REST が紹介されてたようだけど、個人的には Resources が好きです。Resources 使うために Catalyst 使ってると言っても過言じゃないくらい。）</p>
<br />
<p>Resources を使うと HTTP method の GET / POST / PUT / DELETE に応じた Chained がカンタンに作れます。Ruby on Rails をやったことある人だと map.resources と言えばわかるのかな？　僕は rails やったことがないのでわからないんですけれども。</p>
<br />
<p>使い方はこんな風に Catalyst::Controller の代わりに Catalyst::Controller::Resources を使うだけ。</p>

<pre>
<span class="synStatement">package</span><span class="synType"> Jnsn::Controller::Articles;</span>

<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>parent <span class="synConstant">&#39;Catalyst::Controller::Resources&#39;</span>;
</pre>

<p>これで、以下のような URI / method と action のマップができる。</p>

<table>
<tr>



</tr>
<tr>
<td> /articles                   </td>
<td> get     </td>
<td> Articles#list </td>
</tr>
<tr>
<td> /articles/new               </td>
<td> get     </td>
<td> Articles#post </td>
</tr>
<tr>
<td> /articles                   </td>
<td> post    </td>
<td> Articles#create </td>
</tr>
<tr>
<td> /articles/{article_id}      </td>
<td> get     </td>
<td> Articles#show </td>
</tr>
<tr>
<td> /articles/{article_id}/edit </td>
<td> get     </td>
<td> Articles#edit </td>
</tr>
<tr>
<td> /articles/{article_id}      </td>
<td> put     </td>
<td> Articles#update </td>
</tr>
<tr>
<td> /articles/{article_id}      </td>
<td> delete  </td>
<td> Articles#destroy </td>
</tr>
</table>

<p>
これは、対応する action を作らなければ実際にはチェーンされません。<br />
なので必要ない URI は作りたくないという人も安心です。
</p>
<br />
<p>ちなみに {article_id} は、3番めの引数として渡ってくるよ。</p>

<pre>
<span class="synComment"># PUT /articles/{article_id}</span>
<span class="synStatement">sub</span><span class="synIdentifier"> update </span>{
    <span class="synStatement">my</span> (<span class="synIdentifier">$self</span>, <span class="synIdentifier">$c</span>, <span class="synIdentifier">$article_id</span>) = <span class="synIdentifier">@_</span>;
}
</pre>

<p>この id を特定して何かの操作をするものを member, そうじゃないやつを collection と REST では言うみたいですね。（内部的には member と colllection に chain してるのは起動時のデバッグログでわかりますね。）</p>
<br />
<p>Resources の魅力はまだあります。articles に属している comments を作りたいなぁ、URI は /articles/{article_id}/comments/{comment_id} みたくしたいなぁ、と思ったら Comments コントローラ内でこうすればいいです。</p>

<pre>
<span class="synStatement">package</span><span class="synType"> Jnsn::Controller::Articles::Comments;</span>

<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;

<span class="synStatement">use </span>parent <span class="synConstant">&#39;Catalyst::Controller::Resources&#39;</span>;

__PACKAGE__-&gt;config(
    <span class="synConstant">belongs_to </span>=&gt; <span class="synConstant">&#39;Articles&#39;</span>,
);
</pre>

<p>こうすることによって Articles::Comments は Catalyst のチェーン的に Articles に属します。</p>

<table>
<tr>



</tr>
<tr>
<td> /articles/{article_id}/comments </td>
<td> get </td>
<td> Articles::Comments#list </td>
</tr>
<tr>
<td> /articles/{article_id}/comments/new </td>
<td> get </td>
<td> Articles::Comments#post </td>
</tr>
<tr>
<td> /articles/{article_id}/comments </td>
<td> post </td>
<td> Articles::Comments#create </td>
</tr>
<tr>
<td> /articles/{article_id}/comments/{comment_id} </td>
<td> get </td>
<td> Articles::Comments#show </td>
</tr>
<tr>
<td> /articles/{article_id}/comments/{comment_id}/edit </td>
<td> get </td>
<td> Articles::Comments#edit </td>
</tr>
<tr>
<td> /articles/{article_id}/comments/{comment_id} </td>
<td> put </td>
<td> Articles::Comments#update </td>
</tr>
<tr>
<td> /articles/{article_id}/comments/{comment_id} </td>
<td> delete </td>
<td> Articles::Comments#destroy </td>
</tr>
</table>

<p>
さらに、マップにない action を追加したいなぁと思ったら、config で追加しましょう。<br />
article 追加時の確認画面と編集時の確認画面を追加してみます。
</p>

<pre>
<span class="synComment"># Jnsn::Controller::Articles;</span>
__PACKAGE__-&gt;config(
    <span class="synConstant">collection </span>=&gt; {
        <span class="synConstant">confirm </span>=&gt; <span class="synConstant">&#39;post&#39;</span>,
    },
    <span class="synConstant">member </span>=&gt; {
        <span class="synConstant">confirm_edit </span>=&gt; <span class="synConstant">&#39;post&#39;</span>,
    }
);

<span class="synComment"># POST /articles/confirm</span>
<span class="synStatement">sub</span><span class="synIdentifier"> confirm </span>{
    <span class="synStatement">my</span> (<span class="synIdentifier">$self</span>, <span class="synIdentifier">$c</span>) = <span class="synIdentifier">@_</span>;
}

<span class="synComment"># POST /articles/{article_id}/confirm_edit</span>
<span class="synStatement">sub</span><span class="synIdentifier"> confirm_edit </span>{
    <span class="synStatement">my</span> (<span class="synIdentifier">$self</span>, <span class="synIdentifier">$c</span>, <span class="synIdentifier">$article_id</span>) = <span class="synIdentifier">@_</span>;
}
</pre>

<p>ね、カンタンでしょう？</p>
<br />
<p>ブラウザーから PUT と DELETE 送れない問題は <a href="http://search.cpan.org/~drolsky/Catalyst-Request-REST-ForBrowsers/">Catalyst::Request::REST::ForBrowser</a> を使うとうまくできるよ。</p>
<p>（参考：<a href="http://d.hatena.ne.jp/ZIGOROu/20090124/1232810879">Catalyst::Controller::Resources でオーバーロード POST を使いたい - Yet Another Hackadelic</a>）</p>
<br />
<p>なお、この記事は Catalyst 5.80004, Catalyst::Controller::Resources 0.07 で書いてます。Cat 5.7 系で Resources 使うときは 0.04 を使うといいですよ！</p>

]]>
        
    </content>
</entry>

<entry>
    <title>__DATA__ で色んなことを考えてみよう</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2009/01/__data.html" />
    <id>tag:perl-mongers.org,2009://1.89</id>

    <published>2009-01-19T12:09:00Z</published>
    <updated>2009-01-19T12:35:38Z</updated>

    <summary>こんばんは。ビンゴ中西です。 Perlでは、 __DATA__ と書いた部分より...</summary>
    <author>
        <name>ビンゴ中西</name>
        <uri>http://www.hatena.ne.jp/bingo_nakanishi_perl/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>こんばんは。ビンゴ中西です。</p>
<br />

<p>Perlでは、</p>
<pre>
<span class="synComment">__DATA__</span>
</pre>
<p>と書いた部分より下は、</p>
<p>まるで、すでにファイルをopenしたかのように使えます。</p>

<h4> 例1</h4>
<pre>
<span class="synStatement">use strict</span>;
<span class="synStatement">use </span>Data::Dumper;

<span class="synStatement">while</span>(<span class="synIdentifier">&lt;DATA&gt;</span>){
  <span class="synStatement">print</span> <span class="synIdentifier">$_</span>;
}


<span class="synComment">__DATA__</span>
<span class="synComment">ここは、ファイルのように</span>
<span class="synComment">扱えますよ！</span>
</pre>

<h4> 結果</h4>
<pre>
ここは、ファイルのように
扱えますよ！
</pre>


<p>こんな感じです。</p>
<p>ファイルを使って本処理を進めるまえに、ちょっとしたことを考えるのに便利です。</p>


<h4> データ構造をどのようにするか？</h4>
<p>たとえば、CSVのファイルをどのような構造で持つか</p>
<p>といったことは、</p>

<h4> 例2</h4>
<pre>
<span class="synStatement">use strict</span>;
<span class="synStatement">use </span>Data::Dumper;

<span class="synStatement">my</span> <span class="synIdentifier">@c</span>;
<span class="synStatement">while</span>(<span class="synIdentifier">&lt;DATA&gt;</span>){
  <span class="synStatement">chomp</span> <span class="synIdentifier">$_</span>;
  <span class="synStatement">push</span> <span class="synIdentifier">@c</span>, [<span class="synStatement">split</span> <span class="synConstant">&#39;,&#39;</span>, <span class="synIdentifier">$_</span>];
}
<span class="synStatement">print</span> <span class="synIdentifier">Dumper</span> <span class="synIdentifier">\@c</span>;


<span class="synComment">__DATA__</span>
<span class="synComment">OK,bbbb,ccc</span>
<span class="synComment">NG,eee,ffff</span>
</pre>

<h4> 結果</h4>
<pre>
$VAR1 = [
          [
            &#39;OK&#39;,
            &#39;bbbb&#39;,
            &#39;ccc&#39;
          ],
          [
            &#39;NG&#39;,
            &#39;eee&#39;,
            &#39;ffff&#39;
          ]
        ];
</pre>

<h4> 例3</h4>
<pre>
<span class="synStatement">use strict</span>;
<span class="synStatement">use </span>Data::Dumper;

<span class="synStatement">my</span> <span class="synIdentifier">$c</span> = {};
<span class="synStatement">while</span>(<span class="synIdentifier">&lt;DATA&gt;</span>){
  <span class="synStatement">chomp</span> <span class="synIdentifier">$_</span>;
  <span class="synStatement">my</span> <span class="synIdentifier">@d</span>   = <span class="synStatement">split</span> <span class="synConstant">&#39;,&#39;</span>, <span class="synIdentifier">$_</span>;
  <span class="synStatement">my</span> <span class="synIdentifier">$key</span> = <span class="synStatement">shift</span> <span class="synIdentifier">@d</span>;
  <span class="synIdentifier">$c</span>-&gt;{<span class="synIdentifier">$key</span>} = <span class="synIdentifier">\@d</span>;
}
<span class="synStatement">print</span> <span class="synIdentifier">Dumper</span> <span class="synIdentifier">$c</span>;


<span class="synComment">__DATA__</span>
<span class="synComment">OK,bbbb,ccc</span>
<span class="synComment">NG,eee,ffff</span>
</pre>

<h4> 結果</h4>
<pre>
$VAR1 = {
          &#39;OK&#39; =&gt; [
                    &#39;bbbb&#39;,
                    &#39;ccc&#39;
                  ],
          &#39;NG&#39; =&gt; [
                    &#39;eee&#39;,
                    &#39;ffff&#39;
                  ]
        };
</pre>

<p>などと書いてみて、考えることができます。</p>

<h4> もっと考えをおし進めて</h4>
<p>もっと考えをおし進めて、ファイルの内容と処理をどう結びつけようか</p>
<p>なんてことも　こんな風に考えれます。</p>

<h4> 例4</h4>
<pre>
<span class="synStatement">use strict</span>;

<span class="synStatement">my</span> <span class="synIdentifier">$f</span> = {
         <span class="synConstant">&#39;OK&#39;</span> =&gt;<span class="synIdentifier"> </span><span class="synStatement">sub</span><span class="synIdentifier"> </span>{ <span class="synStatement">print</span> <span class="synConstant">&quot;</span><span class="synIdentifier">@_</span><span class="synConstant">&quot;</span> . <span class="synConstant">&#39;は 大丈夫です&#39;</span>, <span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; },
         <span class="synConstant">&#39;NG&#39;</span> =&gt;<span class="synIdentifier"> </span><span class="synStatement">sub</span><span class="synIdentifier"> </span>{ <span class="synStatement">print</span> <span class="synConstant">&quot;</span><span class="synIdentifier">@_</span><span class="synConstant">&quot;</span> . <span class="synConstant">&#39;は ダメです&#39;</span>,   <span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; }
        };

<span class="synStatement">my</span> <span class="synIdentifier">$c</span> = {};
<span class="synStatement">while</span>(<span class="synIdentifier">&lt;DATA&gt;</span>){
  <span class="synStatement">chomp</span> <span class="synIdentifier">$_</span>;
  <span class="synStatement">my</span> <span class="synIdentifier">@d</span>   = <span class="synStatement">split</span> <span class="synConstant">&#39;,&#39;</span>, <span class="synIdentifier">$_</span>;
  <span class="synStatement">my</span> <span class="synIdentifier">$key</span> = <span class="synStatement">shift</span> <span class="synIdentifier">@d</span>;
  <span class="synIdentifier">$f</span>-&gt;{<span class="synIdentifier">$key</span>}-&gt;(<span class="synIdentifier">@d</span>);
}


<span class="synComment">__DATA__</span>
<span class="synComment">OK,bbbb,ccc</span>
<span class="synComment">NG,eee,ffff</span>
</pre>

<h4>  結果</h4>
<pre>
bbbb cccは 大丈夫です
eee ffffは ダメです
</pre>


<p>ファイルを open したりといったことを考えなくていいですし、</p>
<p>考えるファイルの中身も、ソースと同じファイルに入っているので、編集が容易です。</p>

]]>
        
    </content>
</entry>

<entry>
    <title>Re: 高階関数の考え方でmapを見てみる</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2009/01/re_map.html" />
    <id>tag:perl-mongers.org,2009://1.88</id>

    <published>2009-01-15T03:45:13Z</published>
    <updated>2009-01-15T06:02:12Z</updated>

    <summary>高階関数の考え方でmapを見てみる 記事の意図から外れちゃうかもしれないけど、、...</summary>
    <author>
        <name>http://coderepos.org/share/wiki/Committers/yappo</name>
        <uri>http://coderepos.org/share/wiki/Committers/yappo</uri>
    </author>
    
    <category term="dankogai" label="dankogai" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p><a href="http://perl-mongers.org/2009/01/map.html">高階関数の考え方でmapを見てみる</a></p>
<p>記事の意図から外れちゃうかもしれないけど、、、</p>
<br />
<p>それprototypeでできるよ。</p>

<pre>
<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;

<span class="synStatement">sub</span><span class="synIdentifier"> my_map (&amp;@) </span>{
    <span class="synStatement">my</span> <span class="synIdentifier">$code</span> = <span class="synStatement">shift</span>;
    <span class="synStatement">my</span> <span class="synIdentifier">@array</span>;
    <span class="synStatement">for</span> <span class="synStatement">my</span> <span class="synIdentifier">$val</span> (<span class="synIdentifier">@_</span>) {
        <span class="synStatement">push</span> <span class="synIdentifier">@array</span>, <span class="synIdentifier">$code</span>-&gt;(<span class="synIdentifier">$val</span>);
    }
    <span class="synStatement">return</span> <span class="synIdentifier">@array</span>;
}

<span class="synStatement">my</span> <span class="synIdentifier">@c</span> = <span class="synConstant">1.</span>.<span class="synConstant">4</span>;
my_map { <span class="synStatement">print</span> <span class="synConstant">&quot;aa</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; } <span class="synIdentifier">@c</span>;

<span class="synStatement">print</span> <span class="synConstant">&quot;---------</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
<span class="synStatement">my</span> <span class="synIdentifier">@d</span> = my_map { <span class="synIdentifier">$_</span>[<span class="synConstant">0</span>] ** <span class="synConstant">2</span> } <span class="synIdentifier">@c</span>;
<span class="synStatement">print</span> <span class="synConstant">&quot;</span><span class="synIdentifier">@d</span><span class="synConstant">&quot;</span>, <span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;

<span class="synStatement">print</span> <span class="synConstant">&quot;--------</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
my_map  { <span class="synIdentifier">$_</span>[<span class="synConstant">0</span>]++ } <span class="synIdentifier">@c</span>;
<span class="synStatement">print</span> <span class="synConstant">&quot;</span><span class="synIdentifier">@c</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
</pre>


<pre>
 perl ./bingo.pl 
aa
aa
aa
aa
---------
1 4 9 16
--------
2 3 4 5
</pre>

]]>
        
    </content>
</entry>

<entry>
    <title>高階関数の考え方でmapを見てみる</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2009/01/map.html" />
    <id>tag:perl-mongers.org,2009://1.87</id>

    <published>2009-01-14T12:42:08Z</published>
    <updated>2009-01-14T13:24:29Z</updated>

    <summary>ビンゴ中西と申します。 関数が、関数に渡せることが書かれていましたので、 map...</summary>
    <author>
        <name>ビンゴ中西</name>
        <uri>http://www.hatena.ne.jp/bingo_nakanishi_perl/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>ビンゴ中西と申します。</p>
<br />
<p>関数が、関数に渡せることが書かれていましたので、</p>
<p>mapのことを考えたいと思います。</p>
<pre>
<span class="synIdentifier">@c</span> = <span class="synStatement">map</span> { <span class="synIdentifier">$_</span>*<span class="synConstant">2</span> } <span class="synConstant">1.</span>.<span class="synConstant">3</span>;
<span class="synStatement">print</span> <span class="synConstant">&quot;</span><span class="synIdentifier">@c</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
</pre>
<p>結果：</p>
<pre>
2 4 6
</pre>

<p>これって、</p>
<p>map の {  } の部分に sub を付けてみると、</p>
<p>まあ、無名関数を map に与えたみたい！</p>
<br />
<p>ということで、map のように振る舞う。my_mapという関数を簡単に書いてみました。</p>


<pre>
<span class="synStatement">use strict</span>;

<span class="synStatement">sub</span><span class="synIdentifier"> my_map</span>{
  <span class="synStatement">my</span> <span class="synIdentifier">@array</span>;
  <span class="synStatement">for</span>(@{<span class="synIdentifier">$_</span>[<span class="synConstant">1</span>]}){
    <span class="synStatement">push</span> <span class="synIdentifier">@array</span>, <span class="synIdentifier">$_</span>[<span class="synConstant">0</span>]-&gt;(<span class="synIdentifier">$_</span>);
  }
  <span class="synStatement">return</span> <span class="synIdentifier">@array</span>;
}

<span class="synStatement">my</span> <span class="synIdentifier">@c</span> = <span class="synConstant">1.</span>.<span class="synConstant">4</span>;
my_map(<span class="synIdentifier"> </span><span class="synStatement">sub</span>{ <span class="synStatement">print</span> <span class="synConstant">&quot;aa</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; }, <span class="synIdentifier">\@c</span>);

<span class="synStatement">print</span> <span class="synConstant">&quot;---------</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
<span class="synStatement">my</span> <span class="synIdentifier">@d</span> = my_map(<span class="synIdentifier"> </span><span class="synStatement">sub</span>{ <span class="synIdentifier">$_</span>[<span class="synConstant">0</span>] ** <span class="synConstant">2</span> }, <span class="synIdentifier">\@c</span>);
<span class="synStatement">print</span> <span class="synConstant">&quot;</span><span class="synIdentifier">@d</span><span class="synConstant">&quot;</span>, <span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;

<span class="synStatement">print</span> <span class="synConstant">&quot;--------</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
my_map(<span class="synIdentifier"> </span><span class="synStatement">sub</span><span class="synIdentifier"> </span>{ <span class="synIdentifier">$_</span>[<span class="synConstant">0</span>]++ }, <span class="synIdentifier">\@c</span> );
<span class="synStatement">print</span> <span class="synConstant">&quot;</span><span class="synIdentifier">@c</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
</pre>

<p>結果：</p>
<pre>
aa
aa
aa
aa
---------
1 4 9 16
--------
2 3 4 5
</pre>

<p>mapに似たような機能で grep というのがありますが、おなじように</p>
<p>grep に与える {  } の部分はなにか関数を渡しているように感じられます。</p>
<br />
<p>私は、関数に、関数が渡せるということを知ってmapがすんなり理解できた気がしました。</p>
<br />
<p>私の下手な関数は使わずに、ぜひ、map と grep　という機能をどんどん使って楽しいプログラミングを行いましょう〜</p>
<br />

<p>※本記事は、mapの代替品を作ったというわけや、mapを完全に再現したというわけではありません。</p>

]]>
        
    </content>
</entry>

<entry>
    <title>関数は第一級オブジェクト</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2009/01/post_5.html" />
    <id>tag:perl-mongers.org,2009://1.86</id>

    <published>2009-01-13T17:28:44Z</published>
    <updated>2009-01-13T18:38:44Z</updated>

    <summary><![CDATA[Perlの関数は第一級オブジェクトなので&quot;物&quot;として扱えます...]]></summary>
    <author>
        <name>hiratara.dyndns.org</name>
        <uri>http://d.hatena.ne.jp/hiratara</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>Perlの関数は第一級オブジェクトなので&quot;物&quot;として扱えます。関数オブジェクトは処理内容であり、任意のタイミングでそれを実行することができます。</p>
<br />
<p>Perlでは関数リファレンスと呼ばれるものによって関数オブジェクトを表します。関数リファレンスは、関数名を与えないsubで生成したり、関数名に \&amp; をつけることで取得できます。</p>

<pre>
<span class="synStatement">my</span> <span class="synIdentifier">$hello_function</span> =<span class="synIdentifier"> </span><span class="synStatement">sub</span><span class="synIdentifier"> </span>{
    <span class="synStatement">print</span> <span class="synConstant">&quot;hello</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
};

<span class="synStatement">sub</span><span class="synIdentifier"> bye </span>{
    <span class="synStatement">print</span> <span class="synConstant">&quot;bye</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
};

<span class="synStatement">my</span> <span class="synIdentifier">$bye_function</span>   = <span class="synIdentifier">\&amp;bye</span>;

<span class="synIdentifier">$hello_function</span>-&gt;();
<span class="synIdentifier">$bye_function</span>-&gt;();
</pre>

<p>関数は&quot;物&quot;なので、もっと自由なことができます。例えば、他の関数にお好みの関数を作ってもらうことができます。</p>

<pre>
<span class="synStatement">sub</span><span class="synIdentifier"> greeting_function</span>{
    <span class="synStatement">my</span> <span class="synIdentifier">$greeting</span> = <span class="synStatement">shift</span>;
    <span class="synStatement">return</span><span class="synIdentifier"> </span><span class="synStatement">sub</span><span class="synIdentifier"> </span>{
        <span class="synStatement">print</span> <span class="synConstant">&quot;</span><span class="synIdentifier">$greeting</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>;
    };
}

<span class="synStatement">my</span> <span class="synIdentifier">$hello_function</span> = greeting_function(<span class="synConstant">&#39;hello&#39;</span>);
<span class="synStatement">my</span> <span class="synIdentifier">$bye_function</span>   = greeting_function(<span class="synConstant">&#39;bye&#39;</span>);

<span class="synIdentifier">$hello_function</span>-&gt;();
<span class="synIdentifier">$bye_function</span>-&gt;();
</pre>

<p>ここでもう一つ、関数はクロージャであると言う性質が出て来ています。greeting_functionで生成する関数の中に $greeting が登場していますが、これは外の世界の変数です。Perlの関数はクロージャとなるように実装されていますので、生成される関数は外の世界の変数 $greeting をそのまま参照し続けます。</p>
<br />
<p>クロージャの性質を使うと、生成されたコンテキストによって処理内容が変わる関数を作成できます。先ほどの例だと、引数が &#39;hello&#39; の時は&#39;hello&#39;を表示する関数、引数が&#39;bye&#39;の時は&#39;bye&#39;を表示する処理がそれぞれ生成されました。</p>
<br />
<p>逆に、関数の呼び出しによって関数作成元のコンテキストに影響を与えることも出来ます。</p>

<pre>
<span class="synStatement">sub</span><span class="synIdentifier"> call_with_greeting</span>{
    <span class="synStatement">my</span> <span class="synIdentifier">$function</span> = <span class="synStatement">shift</span>;
    <span class="synIdentifier">$function</span>-&gt;(<span class="synConstant">&#39;hello&#39;</span>);
    <span class="synIdentifier">$function</span>-&gt;(<span class="synConstant">&#39;bye&#39;</span>);
}

<span class="synStatement">my</span> <span class="synIdentifier">@greetings</span>;
<span class="synStatement">my</span> <span class="synIdentifier">$callback</span> =<span class="synIdentifier"> </span><span class="synStatement">sub</span><span class="synIdentifier"> </span>{
    <span class="synStatement">my</span> <span class="synIdentifier">$greeting</span> = <span class="synStatement">shift</span>;
    <span class="synStatement">push</span> <span class="synIdentifier">@greetings</span>, <span class="synIdentifier">$greeting</span>;
}

call_with_greeting(<span class="synIdentifier">$callback</span>);

<span class="synStatement">print</span> <span class="synStatement">map</span> {<span class="synConstant">&quot;</span><span class="synIdentifier">$_</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>} <span class="synIdentifier">@greetings</span>;
</pre>

<p>$callbackが呼ばれる度に、@greetingsに挨拶文が加えられます。call_with_greeting関数内で$callbackを呼び出すことで、call_with_greeting関数外(生成した時のコンテキスト)に含まれる@greetingsを変化させていることに注目して下さい。</p>
<br />

<p>関数オブジェクトから新しい関数オブジェクトを作る関数を揃えると、以下のようなコーディングもできます。</p>

<pre>
sub greeting_function{
    my ($greeting, $print_function) = @_;
    return sub {
        $print_function-&gt;($greeting);
    }
}

sub with_newline{
    my $function = shift;
    return sub {
        $function-&gt;(map {&quot;$_\n&quot;} @_);
    }
}

sub print{
    print @_;
}

sub executer{
    my @functions = @_;
    $_-&gt;() foreach @functions;
}

my $hello_function = greeting_function(&#39;hello&#39;, with_newline(\&amp;print));
my $bye_function   = greeting_function(&#39;bye&#39;  , with_newline(\&amp;print));

executer($hello_function, $bye_function);
</pre>

<p>与えられたwith_newline、greeting_functionといった道具を駆使して、print関数から目的の関数を作ってます。</p>
<br />
<p>そして、メインルーチンでは関数の作成だけに専念し、実行に関してはexecuterに任せています。このように、処理を作成する場所と実行する場所を分離することも出来ます。</p>

]]>
        
    </content>
</entry>

<entry>
    <title>実用！ TypePadで複数blogにカテゴリー追加</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2008/12/_typepadblog.html" />
    <id>tag:perl-mongers.org,2008://1.85</id>

    <published>2008-12-26T03:21:40Z</published>
    <updated>2008-12-26T03:37:33Z</updated>

    <summary>クリスマス終わりましたね！ しらんけど。 ということで、年末なんで、メンテナンス...</summary>
    <author>
        <name>CL</name>
        <uri>http://blog.dtpwiki.jp/dtp/</uri>
    </author>
    
    <category term="typepad" label="TypePad" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wwwmechanize" label="WWW::Mechanize" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>クリスマス終わりましたね！ しらんけど。</p>

<p>ということで、年末なんで、メンテナンスもかねて、blogの整理をしているんですけれども、使っているサービスが、かつてBoxerBLOGだったTypePad.jpでして、これでblogを50こぐらい作っている状況なのですが、これらのblogで、投稿するときに設定できるカテゴリーを増やすとき、今までは50回blogのコントロールパネルでしこしこ入力していたわけですけれども、単純労働過ぎるので、スクリプトを作りました。</p>

<p>TypePad.jpは、その名の通り、TypePad ASPで構築されていますので、DBを直接いじれません。従って、人間が実際行うやり方をまねる方法、つまりロボットを作ることになります。</p>

<p>以下のスクリプトは、WWW::Mechanizeを使ったTypePad系blogの複数blogカテゴリ追加スクリプトとなります。</p>

<p>クリスマス前に使ったので大丈夫だと思いますが、こっちでは保証しませんのであしからず。</p>

<p>FileName: add_category.pl</p>

<pre class="prettyprint">
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use WWW::Mechanize;
my $login_id = &#39;login_id&#39;;
my $password = &#39;password&#39;;
my $add_category_word = &#39;便座カバー&#39;;
my $base_url = &#39;https://www.typepad.jp/t/app&#39;; # TypePad.jp
# my $base_url = &#39;https://app.cocolog-nifty.com/t/app&#39;; # ココログ
my $categores_url = &quot;$base_url/weblog/configure?__mode=categories&amp;blog_id=&quot;;
my $bloglist = [
  20721, # ブログ1。ログイン後のblog一覧のソースから取得しておこう
  26969, # ブログ2
  21919, # ブログ3
];
 
# 開始
 
my $mech = WWW::Mechanize-&gt;new();     # Mechオブジェクト用意
$mech-&gt;agent_alias( &#39;Windows IE 6&#39; ); # IE6になりきる
 
# ログイン
 
$mech-&gt;get( $base_url ); # ログインする：認証ページへ
$mech-&gt;form_number( 1 ); # 認証ページの最初のフォームを選択
$mech-&gt;set_visible( $login_id, $password ); # ログイン・パスワード入力
$mech-&gt;submit(); # 送信
 
# カテゴリー追加処理
 
foreach my $blog_id (@$bloglist) { # $blog_idを$bloglistから1つずつ入力
  my $url = &quot;$categores_url$blog_id&quot;; # 各blogのカテゴリーメンテページURL生成
  print &quot;$url\n&quot;;
  $mech-&gt;get($url);      # カテゴリーメンテページに移動
  $mech-&gt;form_number(1); # カテゴリーメンテページの最初のフォームを選択
  $mech-&gt;field( &#39;category-new&#39;               # 新しいカテゴリー名を
    =&gt; encode(&#39;utf8&#39;, $add_category_word),); # 入力
  $mech-&gt;submit();       # 送信
}
 
exit;
 
__END__</pre>

これ必要な人がどんだけいるかわかりませんけれども、お使いくださいませ。]]>
        
    </content>
</entry>

<entry>
    <title>HTMLから本文を抜き出せるモジュールHTML::ExtractContent </title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2008/10/extract-content-from-html.html" />
    <id>tag:perl-mongers.org,2008://1.83</id>

    <published>2008-10-10T11:44:31Z</published>
    <updated>2008-10-10T12:07:30Z</updated>

    <summary>こういうの無いかなぁと思ってました。 例えば任意のサイトのサマリを作りたい時、H...</summary>
    <author>
        <name>mattn.myopenid.com</name>
        <uri>http://mattn.kaoriya.net/</uri>
    </author>
    
    <category term="htmlextractcontent" label="HTML::ExtractContent" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>こういうの無いかなぁと思ってました。</p>
<br />
<p>例えば任意のサイトのサマリを作りたい時、HTMLをテキスト化して一定文字数で削る訳ですが、どこからどこまでが本文かはそのサイト製作者の意図する所であってなかなか難しい処理かと思います。</p>
<p>今回ご紹介する<a href="http://search.cpan.org/dist/HTML-ExtractContent/">HTML::ExtractContent</a>はHTMLの内容を判断しコンテンツの本文らしき部分を抜き出せる凄いモジュールです。</p>
<p>ソースを見ましたがテキストに含めるかどうかの閾値が設定されており、かつ句読点まで判断しています。ソースはutf-8で書かれており、おそらく作者は日本人(もしくは日本通)かと思われます。</p>
<p>試しに<a href="http://perl-mongers.org/2008/09/template-refine.html">先日の記事URL</a>から本文を抜き出してみたいと思います。</p>
<pre>
<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>HTML::ExtractContent;
<span class="synStatement">use </span>LWP::UserAgent;

<span class="synStatement">my</span> <span class="synIdentifier">$agent</span> = LWP::UserAgent-&gt;<span class="synStatement">new</span>;
<span class="synStatement">my</span> <span class="synIdentifier">$res</span> = <span class="synIdentifier">$agent</span>-&gt;get(<span class="synConstant">&#39;http://perl-mongers.org/2008/09/template-refine.html&#39;</span>);

<span class="synStatement">my</span> <span class="synIdentifier">$extractor</span> = HTML::ExtractContent-&gt;<span class="synStatement">new</span>;
<span class="synIdentifier">$extractor</span>-&gt;extract(<span class="synIdentifier">$res</span>-&gt;decoded_content);
<span class="synStatement">print</span> <span class="synIdentifier">$extractor</span>-&gt;as_text;
</pre>
<p>コードもこれだけ。そして実行結果。</p>
<pre>
Template::Refineというモジュールを見つけました。リンク先にある通り、ruleを使うことで簡単にテンプレートの値を置き換える事が出来ます。このモジュールの良い所は、テンプレートファイルにテンプレートエンジン専用の識別子を記述しなくて良い所。どうやって指定するかというと、XPathを使います。リンク先から引用すると
my $username = &#39;Test User&#39;;
my $rule = simple_replace {
my $node = shift;
return replace_text $node, $username;
} &#39;//*[@class=&quot;username&quot;]&#39;;
といった感じにルールを決め
$frag = $frag-&gt;process($rule);
say $frag-&gt;render;
と実行する事でテンプレートへの反映が行われます。まるでWeb::Scraperの様ですね。
今日はサンプルとして、美輪明宏のチンコの有無を返すAPIから得た結果をテンプレートに反映してみたいと思います。
まずテンプレート
&lt;p&gt;美輪明宏にチンコは...&lt;span class=&quot;miwa&quot;&gt;...&lt;/span&gt;。&lt;/p&gt;
確かにテンプレート専用の識別子は使用していません。そしてperlのコード
use strict;
use warnings;
use Encode;
use Perl6::Say;
use LWP::Simple;
use JSON;
use Template::Refine::Fragment;
use Template::Refine::Utils qw(replace_text simple_replace);
my $miwa = from_json(get &quot;http://dzfl.jp/mojo/&quot;);
my $rule = simple_replace {
my $node = shift;
return replace_text $node, encode_utf8($miwa-&gt;{miwa} ? &#39;ある&#39; : &#39;ない&#39;);
} &#39;//*[@class=&quot;miwa&quot;]&#39;;
my $frag = Template::Refine::Fragment-&gt;new_from_file(&#39;template.html&#39;);
print $frag-&gt;process($rule)-&gt;render;
HTMLのmiwaというクラス属性を持ったノードに対して&quot;ある&quot;/&quot;ない&quot;というテキストで置換しています。
簡単ですね。テンプレートエンジン専用の識別子を使用しないので、HTMLの属性値さえ決めておけば、テンプレートの殆どをデザイナさんに任せてしまう事も出来る様になります。
すばらしいですね。
</pre>
<p>ちゃんと本文が取れています。ヘッダ部やページ右にあるナビゲータの文字は含まれていません。</p>
<p>すばらしいですね。他のアプリケーションにも簡単に取り込めそうですし期待が膨らみます。</p>
<br />
<p>どなたかこれを使ったウェブサービスを作ってみませんか。</p>

]]>
        
    </content>
</entry>

<entry>
    <title>実用！ Perlでクロネコヤマト荷物照会</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2008/09/perl-kuronekoyamato.html" />
    <id>tag:perl-mongers.org,2008://1.82</id>

    <published>2008-09-21T09:44:06Z</published>
    <updated>2008-09-23T17:49:05Z</updated>

    <summary>仕事をしていると、荷物を宅配便で送る業務っていうのがあるんですけれども、宅配便業...</summary>
    <author>
        <name>CL</name>
        <uri>http://blog.dtpwiki.jp/dtp/</uri>
    </author>
    
    <category term="webscraper" label="Web::Scraper" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wwwmechanize" label="WWW::Mechanize" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>仕事をしていると、荷物を宅配便で送る業務っていうのがあるんですけれども、宅配便業者さんに引き渡した後、ちゃんと届いたか確認したいってことありますよね。</p>
<p>というわけで、今回はPerlでクロネコヤマトの荷物照会のページをスクレイピングして、荷物の状況表示を回収するPerlスクリプトです。</p>
<p>応用すると、未配達の荷物を追跡して問い合わせるロボットなんかが作れるかもしれません。</p>
<p>今回は、モジュールにしてみましたので、ディレクトリをしっかり掘って使ってみてください。</p>
<p>Filename: WebService/KuronekoYamato.pm</p>
<pre class="prettyprint">
package WebService::KuronekoYamato;
 
use warnings;
use strict;
use Carp;
 
use version; our $VERSION = qv(&#39;0.0.1&#39;);
 
# Other recommended modules (uncomment to use):
#  use IO::Prompt;
#  use Perl6::Export;
#  use Perl6::Slurp;
#  use Perl6::Say;
use Encode;
use WWW::Mechanize;
use Web::Scraper;
use YAML::Syck;
 
 
# Module implementation here
 
# コンストラクタ
sub new {
  my ( $class ) = shift;
  my $mech = WWW::Mechanize-&gt;new();
  $mech-&gt;agent_alias( &#39;Windows IE 6&#39; );
  $mech-&gt;get(&#39;http://toi.kuronekoyamato.co.jp/cgi-bin/tneko?init&#39;);
  my $self = { mech =&gt; $mech, };
  bless $self;
}
 
# ヤマト運輸に問い合わせ
sub check {
  my $self    = shift;
  my $numbers = shift; # 荷物問い合わせ番号のリストのリファレンス
  # フォームの問い合わせは10件ごとなので10件ごとのリストのリストにする
  my $list; # 10件ごとに分割されたリストのリストが入る
  my $j = -1; #添え字調整
  foreach ( my $i = 0; $i &lt; $#$numbers + 1; $i++ ) {
    $j++ unless $i % 10;
    push @{$list-&gt;[$j]}, $numbers-&gt;[$i];
  }
  # _requestを呼んで実際にWebアクセスする
  my $result = [];
  foreach my $item( @$list ) {
    my $res = _request($self, $item);
    push @$result, @$res; # 返答は最大10件なので、$resultにためていく
  }
  return $result; # 集まったリストを返す
}
 
# 実際にリストからアクセスする
sub _request {
  my $self = shift;
  my $list = shift;
  $self-&gt;{mech}-&gt;form_number(1);
  for ( my $i = 0; $i &lt; $#$list + 1; $i++) {
    my $field = sprintf &quot;number%02d&quot;, $i+1;
    $self-&gt;{mech}-&gt;set_fields( $field =&gt; $list-&gt;[$i]);
  }
  $self-&gt;{mech}-&gt;submit;
  
  # Web::Scraper による解析
  my $s = scraper {
    process &#39;//tr/td[1]/input/../../td[2][contains(. , &quot;-&quot;)]/..&#39;,
    &#39;tneko[]&#39; =&gt; scraper {
      process &#39;//td[2]&#39;,
      number =&gt; &#39;TEXT&#39;,
      process &#39;//td[3]&#39;,
      date =&gt; &#39;TEXT&#39;,
      process &#39;//td[4]&#39;,
      status =&gt; &#39;TEXT&#39;,
    },
  };
  my $res = $s-&gt;scrape( # Shift_JISをUTF-8に変換
              encode(&#39;utf8&#39;, decode(&#39;cp932&#39;, $self-&gt;{mech}-&gt;content() ) )
            );
  # 得られた結果をリストで返す
  return $res-&gt;{tneko};
}
 
sub dump {
  my $self = shift;
  print Dump($self);
  return;
}
 
1; # Magic true value required at end of module
__END__</pre>

使うときは、

<pre class="prettyprint">
#!/usr/bin/perl
 
use lib qw(lib/);
package main;
use strict;
use warnings;
use YAML::Syck;
use WebService::KuronekoYamato;
use utf8;
 
 
my $n = WebService::KuronekoYamato-&gt;new();
my $res = $n-&gt;check([
  240000000000,
  240000000011,
]);
 
print Dump($res);
exit;</pre>

<p>こんな感じで使うといいんじゃないでしょうか。身の回りにあるクロネコヤマトの発送伝票で試してみてください。</p>
<p>ねえよ。</p>
<p>今回のは、CoreReposにも置いてあります。正直言ってPerlのモジュールやらオブジェクト指向がよくわかっていないっぽいので、修正してもらえればなあとも思ってたり。</p>
<p><a href="http://svn.coderepos.org/share/lang/perl/WebService-KuronekoYamato/">http://svn.coderepos.org/share/lang/perl/WebService-KuronekoYamato/</a></p>
<p>～～～</p>
<p>このようなスクリプトがあったところで、大事なのは、荷物が動いていなかったときの交渉と手配だったりすることは言うまでもありません。</p>
<p>今回のエントリは、<br />
<a href="http://blog.dtpwiki.jp/dtp/2007/08/user_scriptoper_7948.html">M.C.P.C.: クロネコヤマトの荷物お問い合わせシステムでテキストボックスへフォーカスを合わせるUser Script（Opera用）</a><br />
<a href="http://blog.dtpwiki.jp/dtp/2006/09/plagger_6158.html">M.C.P.C.: Plaggerでクロネコヤマトの荷物お問い合わせが出来ればいいよね</a><br />
あたりが元ネタです。</p>]]>
        
    </content>
</entry>

<entry>
    <title>perlはモジュール(cpan)がすてき！</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2008/09/perlcpan.html" />
    <id>tag:perl-mongers.org,2008://1.81</id>

    <published>2008-09-12T14:37:33Z</published>
    <updated>2008-09-12T15:08:12Z</updated>

    <summary>大阪から、こんばんはこんばんは！ perlはモジュールが素敵なんだよ。たぶん、あ...</summary>
    <author>
        <name>tomyhero [livedoor.com]</name>
        <uri>http://profile.livedoor.com/tomyhero/</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lyricsfetcherlyricwiki" label="Lyrics::Fetcher::LyricWiki" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>大阪から、こんばんはこんばんは！</p>
<br />
<p>perlはモジュールが素敵なんだよ。たぶん、あなたの隣の席の、白い歯が似合うハンサムボーイより素敵だよ！</p>
<br />
<p>NIrvanaのRape Meの歌詞が見たい！とか急に思うよね。　思っちゃうよね。そういうときは、もちろんcpan 検索だね。</p>

<h4> モジュール探す</h4>

<p><a href="http://search.cpan.org/search?query=lyrics">http://search.cpan.org/search?query=lyrics</a></p>
<br />
<p>色々みつかったね！そのうちの一つをピックアップしたよ！</p>

<h4> モジュールインストール</h4>

<p>インストール！</p>
<pre>
sudo cpan install Lyrics::Fetcher::LyricWiki
</pre>

<h4> ソース</h4>

<p>歌詞をプリントアウトするよ</p>

<pre>
#!/usr/bin/perl

use strict;
use warnings;
use Lyrics::Fetcher::LyricWiki;
print Lyrics::Fetcher::LyricWiki-&gt;fetch(&#39;nirvana&#39; , &#39;rape me&#39;);
</pre>

<p>良い子のみんな、表示できたよね！　結果貼付けると、著作権的に怒られるかもしれないから、</p>
<p>自粛したよ。よくわかってないけどね！</p>

<h4> 最後に</h4>

<p>普通にgoogleで検索するより何か、ワクワクするでしょ。　こういった面白モジュールがたくさんみつかるのはperlが一番じゃないかな！　</p>
<br />
<p>ワクワクモジュールみつけたら、perl-mongers.orgに記事書くと良いと思うよ！</p>
<br />
<p>:wq!</p>




]]>
        
    </content>
</entry>

<entry>
    <title>Web::ScraperライクなテンプレートエンジンTemplate::Refine</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2008/09/template-refine.html" />
    <id>tag:perl-mongers.org,2008://1.80</id>

    <published>2008-09-11T13:06:19Z</published>
    <updated>2008-09-11T13:39:28Z</updated>

    <summary>Template::Refineというモジュールを見つけました。リンク先にある通...</summary>
    <author>
        <name>mattn.myopenid.com</name>
        <uri>http://mattn.kaoriya.net/</uri>
    </author>
    
    <category term="templaterefine" label="Template::Refine" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p><a href="http://blog.jrock.us/articles/Template%3A%3ARefine.pod">Template::Refine</a>というモジュールを見つけました。リンク先にある通り、ruleを使うことで簡単にテンプレートの値を置き換える事が出来ます。このモジュールの良い所は、テンプレートファイルにテンプレートエンジン専用の識別子を記述しなくて良い所。どうやって指定するかというと、XPathを使います。リンク先から引用すると</p>
<pre>
<span class="synStatement">my</span> <span class="synIdentifier">$username</span> = <span class="synConstant">&#39;Test User&#39;</span>;
<span class="synStatement">my</span> <span class="synIdentifier">$rule</span> = simple_replace {
    <span class="synStatement">my</span> <span class="synIdentifier">$node</span> = <span class="synStatement">shift</span>;
    <span class="synStatement">return</span> replace_text <span class="synIdentifier">$node</span>, <span class="synIdentifier">$username</span>;
} <span class="synConstant">&#39;//*[@class=&quot;username&quot;]&#39;</span>;
</pre>
<p>といった感じにルールを決め</p>
<pre>
<span class="synIdentifier">$frag</span> = <span class="synIdentifier">$frag</span>-&gt;process(<span class="synIdentifier">$rule</span>);
say <span class="synIdentifier">$frag</span>-&gt;render;
</pre>
<p>と実行する事でテンプレートへの反映が行われます。まるでWeb::Scraperの様ですね。</p>
<p>今日はサンプルとして、<a href="http://dzfl.jp/blog/2007/07/29/miwa-mojo-api/">美輪明宏のチンコの有無を返すAPI</a>から得た結果をテンプレートに反映してみたいと思います。</p>
<p>まずテンプレート</p>
<pre>
<span class="synIdentifier">&lt;</span><span class="synStatement">p</span><span class="synIdentifier">&gt;</span>美輪明宏にチンコは...<span class="synIdentifier">&lt;</span><span class="synStatement">span</span><span class="synIdentifier"> </span><span class="synType">class</span><span class="synIdentifier">=</span><span class="synConstant">&quot;miwa&quot;</span><span class="synIdentifier">&gt;</span>...<span class="synIdentifier">&lt;/</span><span class="synStatement">span</span><span class="synIdentifier">&gt;</span>。<span class="synIdentifier">&lt;/</span><span class="synStatement">p</span><span class="synIdentifier">&gt;</span>
</pre>
<p>確かにテンプレート専用の識別子は使用していません。そしてperlのコード</p>
<pre>
<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>Encode;
<span class="synStatement">use </span>Perl6::Say;
<span class="synStatement">use </span>LWP::Simple;
<span class="synStatement">use </span>JSON;
<span class="synStatement">use </span>Template::Refine::Fragment;
<span class="synStatement">use </span>Template::Refine::Utils <span class="synConstant">qw(replace_text simple_replace)</span>;

<span class="synStatement">my</span> <span class="synIdentifier">$miwa</span> = from_json(get <span class="synConstant">&quot;http://dzfl.jp/mojo/&quot;</span>);
<span class="synStatement">my</span> <span class="synIdentifier">$rule</span> = simple_replace {
    <span class="synStatement">my</span> <span class="synIdentifier">$node</span> = <span class="synStatement">shift</span>;
	<span class="synStatement">return</span> replace_text <span class="synIdentifier">$node</span>, encode_utf8(<span class="synIdentifier">$miwa</span>-&gt;{miwa} ? <span class="synConstant">&#39;ある&#39;</span> : <span class="synConstant">&#39;ない&#39;</span>);
} <span class="synConstant">&#39;//*[@class=&quot;miwa&quot;]&#39;</span>;

<span class="synStatement">my</span> <span class="synIdentifier">$frag</span> = Template::Refine::Fragment-&gt;new_from_file(<span class="synConstant">&#39;template.html&#39;</span>);
<span class="synStatement">print</span> <span class="synIdentifier">$frag</span>-&gt;process(<span class="synIdentifier">$rule</span>)-&gt;render;
</pre>
<p>HTMLのmiwaというクラス属性を持ったノードに対して&quot;ある&quot;/&quot;ない&quot;というテキストで置換しています。</p>
<p>簡単ですね。テンプレートエンジン専用の識別子を使用しないので、HTMLの属性値さえ決めておけば、テンプレートの殆どをデザイナさんに任せてしまう事も出来る様になります。</p>
<p>すばらしいですね。</p>

]]>
        
    </content>
</entry>

<entry>
    <title>Getopt::Chainでgitライクなsubcommandを処理する</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2008/08/getoptchaingitsubcommand.html" />
    <id>tag:perl-mongers.org,2008://1.79</id>

    <published>2008-08-24T02:49:56Z</published>
    <updated>2008-08-24T13:04:15Z</updated>

    <summary>Yokohama.pmでxcezxさんがMonday Moduleのtech t...</summary>
    <author>
        <name>http://www.hatena.ne.jp/dann/</name>
        <uri>http://www.hatena.ne.jp/dann/</uri>
    </author>
    
    <category term="commandline" label="commandline" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="getoptchain" label="Getopt::Chain" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mondaymodule" label="monday-module" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>Yokohama.pmでxcezxさんがMonday Moduleのtech talkをされていたので、早速書いてみました。</p>
<p><a href="http://d.hatena.ne.jp/xcezx/">http://d.hatena.ne.jp/xcezx/</a></p>
<br />
<p>今回紹介するのは、gitのようなsubcommandのoptionを処理してくれるモジュールです。</p>
<p>gitだと、例えば以下のようにcommitサブコマンドにオプションを渡します。このオプションなどをパースしてくれて、簡単に取得できるようにしてくれます。</p>

<blockquote>
<p>  git.pl init --quiete</p>
<p>  git.pl commit -a -m &#39;Hello&#39;</p>
</blockquote>

<p>commands以下にsubcommandの記述を書くと、そのsubcommandのcontextで引数の値などを取得する事ができます。例えば、commitサブコマンドのmオプションの値とかが簡単にとれるようになります。</p>

<pre>
<span class="synPreProc">#!/usr/bin/env perl</span>
<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>Getopt::Chain;
<span class="synStatement">use </span>Perl6::Say;

main();

<span class="synStatement">sub</span><span class="synIdentifier"> main </span>{
    setup_commands();
}

<span class="synStatement">sub</span><span class="synIdentifier"> setup_commands </span>{
    Getopt::Chain-&gt;process(
        <span class="synConstant">options </span>=&gt; [<span class="synConstant">qw/ version /</span>],
        <span class="synConstant">run </span>=&gt;<span class="synIdentifier"> </span><span class="synStatement">sub</span><span class="synIdentifier"> </span>{
            <span class="synStatement">my</span> <span class="synIdentifier">$context</span>   = <span class="synStatement">shift</span>;
            <span class="synStatement">my</span> <span class="synIdentifier">@arguments</span> = <span class="synIdentifier">@_</span>;
            say <span class="synIdentifier">$context</span>-&gt;local_option(<span class="synConstant">&#39;version&#39;</span>);
        },

        <span class="synConstant">commands </span>=&gt; {
            <span class="synConstant">init </span>=&gt; {
                <span class="synConstant">options </span>=&gt; [<span class="synConstant">qw/ quiet|q template=s shared=s/</span>],
                <span class="synConstant">run     </span>=&gt; ¥<span class="synIdentifier">&amp;init</span>,
            },
            <span class="synConstant">commit </span>=&gt; {
                <span class="synConstant">options </span>=&gt; [<span class="synConstant">qw/ auto|a message|m=s /</span>],
                <span class="synConstant">run     </span>=&gt; ¥<span class="synIdentifier">&amp;commit</span>,
            },
        }
    );
}

<span class="synComment"># sub commands</span>
<span class="synStatement">sub</span><span class="synIdentifier"> init </span>{
    <span class="synStatement">my</span> <span class="synIdentifier">$context</span>   = <span class="synStatement">shift</span>;
    <span class="synStatement">my</span> <span class="synIdentifier">@arguments</span> = <span class="synIdentifier">@_</span>;

    <span class="synStatement">if</span>(<span class="synIdentifier">$context</span>-&gt;local_option(<span class="synConstant">&#39;quiet&#39;</span>)) {
        say <span class="synConstant">&#39;Only print error and warning messages.&#39;</span>;
    }
    say <span class="synIdentifier">$context</span>-&gt;local_option(<span class="synConstant">&#39;template&#39;</span>);
}

<span class="synStatement">sub</span><span class="synIdentifier"> commit </span>{
    <span class="synStatement">my</span> <span class="synIdentifier">$context</span>   = <span class="synStatement">shift</span>;
    <span class="synStatement">my</span> <span class="synIdentifier">@arguments</span> = <span class="synIdentifier">@_</span>;
    say <span class="synIdentifier">$context</span>-&gt;local_option(<span class="synConstant">&#39;message&#39;</span>);
}

<span class="synComment">__END__</span>
</pre>

]]>
        
    </content>
</entry>

<entry>
    <title>CatalystとConfig</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2008/08/catalystconfig.html" />
    <id>tag:perl-mongers.org,2008://1.78</id>

    <published>2008-08-14T14:11:00Z</published>
    <updated>2008-08-14T14:29:47Z</updated>

    <summary>こんにちはこんにちは！ tomyheroです！　トミヘロじゃなくて、とぅーまいひ...</summary>
    <author>
        <name>tomyhero [livedoor.com]</name>
        <uri>http://profile.livedoor.com/tomyhero/</uri>
    </author>
    
    <category term="catalyst" label="Catalyst" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="configmulti" label="Config::Multi" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>こんにちはこんにちは！ tomyheroです！　トミヘロじゃなくて、とぅーまいひーろ　って読むんだよ！</p>
<br />
<p>今自分の中で流行ってる、CatalystとConfig周りの実装をこっそり晒そうと思うよ。　</p>

<h4> aim</h4>

<p>catalystアプリだけじゃなくて、外からでも使えるように実装したほうがいいとおもうんだよ！</p>

<h4> MyApp::Config</h4>

<p><a href="http://search.cpan.org/dist/Config-Multi/">Config::Multi</a>をシングルトンで、どこでもつかえるようにするよ。　 MyApp::Utils　というので、設定ファイルのパスをとってますね！これについては、後で書くよ！</p>

<pre>
<span class="synStatement">package</span><span class="synType"> MyApp::Config;</span>

<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>Config::Multi;
<span class="synStatement">use </span>MyApp::Utils;
<span class="synStatement">use base</span> <span class="synConstant">&#39;Class::Singleton&#39;</span>;

<span class="synStatement">our</span> <span class="synIdentifier">$FILES</span> ;
<span class="synStatement">sub</span><span class="synIdentifier"> _new_instance </span>{
    <span class="synStatement">my</span> <span class="synIdentifier">$cm</span> = Config::Multi-&gt;<span class="synStatement">new</span>(
        {
        <span class="synConstant">dir </span>=&gt; MyApp::Utils::path_to(<span class="synConstant">&#39;conf&#39;</span>)-&gt;stringify ,
        <span class="synConstant">app_name    </span>=&gt; <span class="synConstant">&#39;myapp&#39;</span> ,
        <span class="synConstant">extension   </span>=&gt; <span class="synConstant">&#39;yml&#39;</span>
    });
    <span class="synStatement">my</span> <span class="synIdentifier">$config</span> = <span class="synIdentifier">$cm</span>-&gt;load();
    <span class="synIdentifier">$FILES</span> = <span class="synIdentifier">$cm</span>-&gt;files;
    <span class="synStatement">return</span> <span class="synIdentifier">$config</span>;
}
<span class="synStatement">sub</span><span class="synIdentifier"> files </span>{
    <span class="synStatement">return</span> <span class="synIdentifier">$FILES</span>;
}

<span class="synConstant">1</span>;
</pre>

<h4> MyApp::Utils</h4>

<p>アプリケーションのUtilsモジュールだよ。Catalyst::Utilsだと、カタリスト依存しちゃうから、自分で作っちゃった方が良いと思うよ。 path_toとかのコードは、Catalystを参考にパクると良いと思うよ。</p>

<pre>
<span class="synStatement">package</span><span class="synType"> MyApp::Utils;</span>

<span class="synStatement">use warnings</span>;
<span class="synStatement">use strict</span>;
<span class="synStatement">use </span>Path::Class::Dir;
<span class="synStatement">use </span>Path::Class::File;
<span class="synStatement">use </span>FindBin;

<span class="synStatement">sub</span><span class="synIdentifier"> home </span>{
    <span class="synStatement">return</span> <span class="synIdentifier">$ENV</span>{MYAPP_HOME} ||  Path::Class::Dir-&gt;<span class="synStatement">new</span>(  <span class="synIdentifier">$FindBin::Bin</span>, <span class="synConstant">&#39;./../&#39;</span> );
}

<span class="synStatement">sub</span><span class="synIdentifier"> path_to </span>{
    <span class="synStatement">my</span> ( <span class="synIdentifier">@path</span> ) = <span class="synIdentifier">@_</span>;
    <span class="synStatement">my</span> <span class="synIdentifier">$path</span> = Path::Class::Dir-&gt;<span class="synStatement">new</span>( <span class="synIdentifier">&amp;home</span> , <span class="synIdentifier">@path</span> );
    <span class="synStatement">warn</span> <span class="synIdentifier">$path</span>;
    <span class="synStatement">if</span> ( <span class="synStatement">-d</span> <span class="synIdentifier">$path</span> ) { <span class="synStatement">return</span> <span class="synIdentifier">$path</span> }
    <span class="synStatement">else</span> { <span class="synStatement">return</span> Path::Class::File-&gt;<span class="synStatement">new</span>( <span class="synIdentifier">&amp;home</span>, <span class="synIdentifier">@path</span> ) }
}

<span class="synConstant">1</span>;
</pre>

<h4> MyApp::Plugin::Config</h4>

<p>オレオレコンフィグプラグインを作るよ！</p>
<p>ぶっちゃけ、MyApp::Config　を $c-&gt;config にぶっ込んでるだけだよ。</p>
<pre>
<span class="synStatement">package</span><span class="synType"> MyApp::Plugin::Config;</span>

<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>MyApp::Config;
<span class="synStatement">use </span>NEXT;

<span class="synStatement">our</span> <span class="synIdentifier">$VERSION</span> =<span class="synConstant">&#39;0.02&#39;</span>;

<span class="synStatement">sub</span><span class="synIdentifier"> setup </span>{
    <span class="synStatement">my</span> <span class="synIdentifier">$c</span> = <span class="synStatement">shift</span>;
    <span class="synStatement">my</span> <span class="synIdentifier">$config</span> = MyApp::Config-&gt;instance();

    <span class="synStatement">if</span>( <span class="synIdentifier">$c</span>-&gt;debug ) {
        <span class="synStatement">my</span> <span class="synIdentifier">$files</span> = MyApp::Config-&gt;files();
        <span class="synStatement">for</span> <span class="synStatement">my</span> <span class="synIdentifier">$file</span> ( @{<span class="synIdentifier">$files</span>} ) {
            <span class="synIdentifier">$c</span>-&gt;<span class="synStatement">log</span>-&gt;debug( <span class="synConstant">&#39;Load Config &#39;</span> . <span class="synIdentifier">$file</span> );
        }
    }

    <span class="synIdentifier">$c</span>-&gt;config( <span class="synIdentifier">$config</span> ) ;
    <span class="synIdentifier">$c</span>-&gt;NEXT::setup( <span class="synIdentifier">@_</span> );
}

<span class="synConstant">1</span>;
</pre>

<h4>  MyApp::Web</h4>

<p>カタリストアプリだよ。プラグイン読み込むよ。</p>

<pre>
<span class="synStatement">package</span><span class="synType"> MyApp::Web;</span>

<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>Catalyst::Runtime <span class="synConstant">&#39;5.70&#39;</span>;
<span class="synStatement">use </span>Catalyst <span class="synConstant">qw/+MyApp::Plugin::Config/</span>;
<span class="synStatement">our</span> <span class="synIdentifier">$VERSION</span> = <span class="synConstant">&#39;0.01&#39;</span>;
__PACKAGE__-&gt;setup;

<span class="synConstant">1</span>;
</pre>

<h4>  conf/myapp_web.yml</h4>

<p>設定ファイルだよ。</p>

<pre>
---
name: Config Sample
</pre>

<h4> MyApp::Web::Controller::Root</h4>

<p>コンフィグデータが、ちゃんととれてるか表示するよ！</p>

<pre>
<span class="synStatement">package</span><span class="synType"> MyApp::Web::Controller::Root;</span>

<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use base</span> <span class="synConstant">&#39;Catalyst::Controller&#39;</span>;

__PACKAGE__-&gt;config-&gt;{namespace} = <span class="synConstant">&#39;&#39;</span>;

<span class="synStatement">sub</span><span class="synIdentifier"> default : Private </span>{
    <span class="synStatement">my</span> ( <span class="synIdentifier">$self</span>, <span class="synIdentifier">$c</span> ) = <span class="synIdentifier">@_</span>;
    <span class="synIdentifier">$c</span>-&gt;response-&gt;body(  <span class="synIdentifier">$c</span>-&gt;config-&gt;{name} );
}

<span class="synStatement">sub</span><span class="synIdentifier"> end : ActionClass(&#39;RenderView&#39;) </span>{}

<span class="synConstant">1</span>;
</pre>

<p>たぶんみえてるんじゃないかな！</p>

<h4> おわり</h4>

<p>以上だよ。　</p>
<p>ちなみに、 MyApp::Config はどこからでも呼べるから、ガンガン呼ぶと良いと思うよ。多い日も安心だね！</p>
<br />
<p>:wq!</p>

]]>
        
    </content>
</entry>

<entry>
    <title>HTTP::Asyncで速度アップ</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2008/08/speed-up-with-http-async.html" />
    <id>tag:perl-mongers.org,2008://1.77</id>

    <published>2008-08-12T12:35:05Z</published>
    <updated>2008-08-12T12:53:17Z</updated>

    <summary>こんにちは！ tomyhero です！ 一つのリクエスト内で、複数のAPIを叩い...</summary>
    <author>
        <name>tomyhero [livedoor.com]</name>
        <uri>http://profile.livedoor.com/tomyhero/</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="httpasync" label="HTTP::Async" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="httprequest" label="HTTP::Request" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lwpuseragent" label="LWP::UserAgent" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="timehires" label="Time::HiRes" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p>こんにちは！ tomyhero です！</p>
<br />
<p>一つのリクエスト内で、複数のAPIを叩いたり、フィードを読み込んだりすると重くなって行きますよね！　たとえば、複数のアフィリエイト広告APIを叩くときとか！</p>
<br />
<p>そういうときは、<a href="http://search.cpan.org/dist/HTTP-Async/">HTTP::Async</a> を使うと良いと思います！ </p>
<p>リクエストの結果を待たないで、次のリクエストを投げてくれます！で、後で回収をおこなうことができます。</p>

<h4> サンプルコード</h4>

<pre>
<span class="synPreProc">#!/usr/bin/perl </span>

<span class="synStatement">use </span>HTTP::Async;
<span class="synStatement">use </span>HTTP::Request;
<span class="synStatement">use </span>LWP::UserAgent;
<span class="synStatement">use </span>Data::Dumper;
<span class="synStatement">use </span>Perl6::Say;
<span class="synStatement">use </span>Time::HiRes <span class="synConstant">qw/gettimeofday tv_interval/</span> ;

<span class="synComment"># 適当なurl.本来なら別ドメインのサイトが良いと思う。攻撃ぽくなるので。</span>
<span class="synStatement">our</span> <span class="synIdentifier">@urls</span> = (
    <span class="synConstant">&#39;http://clip.livedoor.com/rss/recent&#39;</span>,
    <span class="synConstant">&#39;http://clip.livedoor.com/rss/hot&#39;</span>,
    <span class="synConstant">&#39;http://clip.livedoor.com/rss/popular&#39;</span>,
);


<span class="synIdentifier">&amp;normal</span>();
<span class="synIdentifier">&amp;async</span>();

<span class="synStatement">sub</span><span class="synIdentifier"> async </span>{
     <span class="synStatement">my</span> <span class="synIdentifier">$t0</span> = [gettimeofday];
    <span class="synStatement">my</span> <span class="synIdentifier">$async</span> = HTTP::Async-&gt;<span class="synStatement">new</span>;

    <span class="synStatement">for</span> <span class="synStatement">my</span> <span class="synIdentifier">$url</span> (<span class="synIdentifier">@urls</span>) {
        <span class="synIdentifier">$async</span>-&gt;add( HTTP::Request-&gt;<span class="synStatement">new</span>( <span class="synConstant">GET </span>=&gt; <span class="synIdentifier">$url</span> ) );
    }

    <span class="synStatement">my</span> <span class="synIdentifier">@results</span> = ();
    <span class="synStatement">while</span> ( <span class="synStatement">my</span> ( <span class="synIdentifier">$response</span>, <span class="synIdentifier">$id</span> ) = <span class="synIdentifier">$async</span>-&gt;wait_for_next_response ) {
        <span class="synStatement">push</span> <span class="synIdentifier">@results</span>, +{ <span class="synConstant">id </span>=&gt; <span class="synIdentifier">$id</span>, <span class="synConstant">content </span>=&gt; <span class="synIdentifier">$response</span>-&gt;content };
    }

    <span class="synIdentifier">@results</span> = <span class="synStatement">sort</span> { <span class="synIdentifier">$a</span>-&gt;{<span class="synConstant">&quot;id&quot;</span>} <span class="synStatement">cmp</span> <span class="synIdentifier">$b</span>-&gt;{<span class="synConstant">&quot;id&quot;</span>} } <span class="synIdentifier">@results</span>;

    <span class="synStatement">my</span> <span class="synIdentifier">$elapsed</span> = tv_interval ( <span class="synIdentifier">$t0</span>, [gettimeofday]);
    say <span class="synConstant">&#39;async :&#39;</span>  . <span class="synIdentifier">$elapsed</span>;
    <span class="synComment">#warn Dumper \@results;</span>
}

<span class="synStatement">sub</span><span class="synIdentifier"> normal </span>{
     <span class="synStatement">my</span> <span class="synIdentifier">$t0</span> = [gettimeofday];
    <span class="synStatement">my</span> <span class="synIdentifier">@results</span> = ();
    <span class="synStatement">for</span> <span class="synStatement">my</span> <span class="synIdentifier">$url</span> (<span class="synIdentifier">@urls</span>) {
        <span class="synStatement">my</span> <span class="synIdentifier">$ua</span> = LWP::UserAgent-&gt;<span class="synStatement">new</span>;
        <span class="synStatement">my</span> <span class="synIdentifier">$response</span> = <span class="synIdentifier">$ua</span>-&gt;get(<span class="synConstant">&#39;http://search.cpan.org/&#39;</span>);
        <span class="synStatement">push</span> <span class="synIdentifier">@results</span> , <span class="synIdentifier">$response</span>-&gt;content;
    }

    <span class="synStatement">my</span> <span class="synIdentifier">$elapsed</span> = tv_interval ( <span class="synIdentifier">$t0</span>, [gettimeofday]);
    say <span class="synConstant">&#39;normal:&#39;</span> . <span class="synIdentifier">$elapsed</span>;
<span class="synComment">#    warn Dumper \@results;</span>
}
</pre>


<h4> 結果</h4>
<p>ネットワークをかいしてるので、正確ではないですが、目安にはなります。</p>

<pre>
normal:1.315056
async :0.368374
</pre>

<p>add_with_opts()　モジュールを使うと、proxyや、timeoutの設定ができたりしますよ。</p>

<h4> 最後に</h4>

<p>早いサイトって良いですよね！　</p>
<br />
<p>試してませんが、<a href="http://search.cpan.org/dist/ParallelUserAgent/">ParallelUserAgent</a>もいいのかも！　場合によってはforkでもいいのかも！</p>
<br />
<p>:wq!</p>



]]>
        
    </content>
</entry>

<entry>
    <title>PHP使いによるCatalyst初心者記事</title>
    <link rel="alternate" type="text/html" href="http://perl-mongers.org/2008/08/catalystcontrolleratompub.html" />
    <id>tag:perl-mongers.org,2008://1.75</id>

    <published>2008-08-08T19:49:12Z</published>
    <updated>2008-08-11T12:59:18Z</updated>

    <summary>mumumu です。普段 PHPを使ってWebアプリケーションを書いたり、C, ...</summary>
    <author>
        <name>mumumu.myopenid.com</name>
        <uri>http://mumumu.myopenid.com/</uri>
    </author>
    
    <category term="catalyst" label="Catalyst" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://perl-mongers.org/">
        <![CDATA[<p><a href="http://mumumuorg.blogspot.com">mumumu</a> です。普段 PHPを使ってWebアプリケーションを書いたり、C, C++ を書いたりしています。</p>
<p>今回 <a href="http://tools.ietf.org/rfc/rfc5023.txt">Atompub</a> サーバを書くことになり、一番まともな実装(<a href="http://search.cpan.org/~takeru/Catalyst-Controller-Atompub-v0.5.1/lib/Catalyst/Controller/Atompub.pm">Catalyst::Controller::Atompub</a>) がある Perl を使うことにしました。</p>
<br />
<p>Catalyst::Controller::Atompub を使うからには当然 Catalyst を使うことになるわけですが、2年振りにPerlを書いたことと、フレームワークの流儀も全く解っていなかったことから結構ハマりました。以下では、それを脈絡なく書いていこうと思います。普段PHP使いだからって石を投げないでくだしあ( ;´Д⊂ヽ</p>

<h3>Catalystを学ぶにあたって</h3>

<p>「perl Catalyst」でぐぐったところ、まとまった記事がすぐに出てこなかったことから、私は <a href="http://search.cpan.org/~zarquon/Catalyst-Manual-5.7013/lib/Catalyst/Manual/Tutorial.pod">Catalyst::Manual::Tutorial</a> を順に読んでいろいろ試していきましたが、後で調べたら <a href="http://www.tcool.org/catalyst/Intro.html">はじめてのCatalyst</a> というマニュアルの翻訳を見つけました。MVCフレームワークに触れたことがある人には、凄くいい資料ではないでしょうか。<a href="http://www.tcool.org/catalyst/Cookbook.html">Catalystクックブック</a> も素晴らしいです。</p>
<br />
<p>以下では、こうして学びながら特に引っ掛かった点をピックアップして書いていきます。</p>

<h3>Catalystのインストール</h3>

<p>環境は Debian GNU/Linux etch を使いました。これには、既にパッケージとして libcatalyst-perl (5.7.006)等が用意されていますが、<a href="http://lazy-people.org/">lazy-people.org</a> の <a href="http://d.hatena.ne.jp/tomyhero">tomyheroさん</a> から</p>

<pre>
(tomyhero) install Task::Catalyst
(tomyhero) install HTML::Parser
(tomyhero) install Template
(tomyhero) install Encode
(tomyhero) この辺ふるいのはいってると、文字コード周りでgdgdになる。
(tomyhero) FYI
</pre>

<p>という有難い情報があったので、CPAN から直接インストール(執筆時点での最新版は 5.7014) することにしました。256MBしか割り当てていないバーチャルマシン上での作業なので予想はしてたんですが、上の Task::Catalyst, HTML::Parser, Template, Encode を最新にするのに1時間掛かりました。依存関係でいろいろ聞かれたりしますが、「y」で通して（たぶん）大丈夫です。個人的には XML::LibXML が XML::LibXML::Common を先にインストールしてくれなくてエラーになったりしましたが、もう一度 XML::LibXML::Common -&gt; XML::LibXML の順でインストールし直すと大丈夫でした。</p>
<br />
<p>最後に、肝心の Catalyst::Controller::Atompub のインストールです。これに30分。</p>
<p>これは滞りなくいきました。CPANから多数のモジュールをインストールするとなると、非常に時間が掛かるものですが、「y」を押しながら気長に他のことをしましょう。</p>

<pre>
# perl -MCPAN -e shell
cpan&gt; install Catalyst::Runtime Catalyst::Plugin::ConfigLoader Catalyst::Plugin::Static::Simple Catalyst::Model::DBIC::Schema DBIx::Class::Schema::Loader DBD::SQLite Catalyst::View::TT Catalyst::Controller::Atompub Catalyst::Action::RenderView
</pre>

<p>インストールが終わったら、プロジェクトを作りましょう。今回は説明のため、Sample というプロジェクトにします。</p>

<pre>
$ catalyst.pl Sample
(....ディレクトリ構造とか最低限の雛形とかいろんなものが生成される)
$ cd Sample/
</pre>

<p>プロジェクトを作ったあとは、一応動作確認しておきます。Catalyst には、開発用のWebサーバが用意されています。以下のようにして起動します。</p>
<pre>
$ script/sample_server.pl
.....  Sampleプロジェクトの情報がずらずらと表示
[info] sample1 powered by Catalyst 5.7014
You can connect to your server at http://example.com:3000
</pre>

<p>無事起動したら、<a href="http://example.com:3000">http://example.com:3000</a> にブラウザからアクセスしてみましょう。</p>
<p>以下のような画面にアクセスできるはずです。この開発用サーバ起動の操作は何度も使うことになります。</p>
<br />
<p><a href="http://perl-mongers.org/sample_hello.png"><img alt="http://perl-mongers.org/sample_hello.png" src="http://perl-mongers.org/sample_hello.png" /></a></p>

<h3>URLルーティング</h3>

<p>Webアプリケーションフレームワークを実際に使うにあたって、私がまず関心を持つのはURLルーティング、すなわち「特定のURLに対応した処理をどこに書くか」ということです。Catalystにはこの点で多彩なやり方が用意されており、多少混乱しました。</p>
<br />
<p>Catalyst では コントローラー にURLに対応した処理をサブルーチン(関数)として記述します。まずは適当にコントローラーを生成します。script/sample_create.pl が様々な雛形を自動で生成してくれるようになっていますので、それを利用します。</p>

<pre>
$ script/sample_create.pl controller hello
 exists &quot;/home/mumumu/Sample/script/../lib/Sample/Controller&quot;
 exists &quot;/home/mumumu/Sample/script/../t&quot;
 created &quot;/home/mumumu/Sample/script/../lib/Sample/Controller/hello.pm&quot;
 created &quot;/home/mumumu/Sample/script/../t/controller_hello.t&quot;
</pre>

<p>hello コントローラーが追加されました。lib/Sample/Controller/hello.pm を開き、podの部分を除いた(間違っても use strict, use warnings は除かないように！)部分は以下のようになっています。ここでは、sub index ... の部分に注目します。</p>
<br />
<p>(lib/Sample/Controller/hello.pm)</p>
<pre>
<span class="synStatement">package</span><span class="synType"> Sample::Controller::hello;</span>

<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>parent <span class="synConstant">&#39;Catalyst::Controller&#39;</span>;

<span class="synStatement">sub</span><span class="synIdentifier"> index :Path :Args(0) </span>{
    <span class="synStatement">my</span> ( <span class="synIdentifier">$self</span>, <span class="synIdentifier">$c</span> ) = <span class="synIdentifier">@_</span>;

    <span class="synComment">#</span>
    <span class="synComment">#    http://example.com/hello/ や http://example.com/hello へのリクエスト</span>
    <span class="synComment">#    に対して、「Matched Sample::Controller::hello in hello.」を表示する。</span>
    <span class="synComment">#</span>
    <span class="synIdentifier">$c</span>-&gt;response-&gt;body(<span class="synConstant">&#39;Matched Sample::Controller::hello in hello.&#39;</span>);
}

<span class="synConstant">1</span>;
</pre>

<p>indexって何か意味あるの？ それ以前に :Path とか :Args とか Perlの文法的にアリなの？ と調べること2時間。:Path や :Args は <a href="http://search.cpan.org/~nwclark/perl-5.8.7/lib/attributes.pm">アトリビュート</a> と呼ばれる、属性を変更するハンドラを呼び出すためのおまじないみたいですが、ここは黒魔術だと思ってあまりキニシナイことにしました。とりあえず、「:ほげほげ」をサブルーチン名の後に書くことで、ルーティングのやり方を指定できるようです。このほげほげを Catalyst の世界ではアクションと呼ぶようです。</p>
<br />
<p>上の 「index :Path :Args(0)」のアクション指定は、 Catalyst にビルトインされた特別なアクションで、<a href="http://example.com/hello/">http://example.com/hello/</a> や、<a href="http://example.com/hello">http://example.com/hello</a> のように、パッケージ名から、Controllerまでの部分を除いたもの(ここではhello) のあとに引数を何も与えなかった場合に呼び出されるアクションらしいです。</p>
<br />
<p>また、サブルーチンの引数について説明をしておくと、第1引数 $self は、Sample::Controller::hello オブジェクト(オブジェクト指向でいうところの this) です。 第2引数に $c が指定されていますが、これは「コンテキストオブジェクト」というもので、ここからリクエストやレスポンスのオブジェクトはもちろん、データベース操作に使えるModelなど、Webアプリケーションにおける処理に必要な様々なオブジェクトを取り出すことができます。アクション指定をしたサブルーチンの引数には必ずこの $c がついている（はず）ですので、様々な操作が行えるはずです。</p>
<br />
<p>私が主に使ったアクションを「ちょっとだけ」以下に並べておきます。正直たくさんあって参りました。</p>
<br />
<p>ここでアクション指定をすべて説明はできないので、詳細は<a href="http://cpansearch.perl.org/~zarquon/Catalyst-Manual-5.7013/lib/Catalyst/Manual/Intro.pod#Action_types">マニュアルにあるアクションの一覧</a> を見るとよいと思います。私自身も未だによくわかってないアクションがかなりありますネ(´ー｀; )</p>

<pre>
<span class="synStatement">package</span><span class="synType"> Sample::Controller::hello;</span>
<span class="synComment">#</span>
<span class="synComment">#  Path アクション</span>
<span class="synComment">#  </span>
<span class="synComment">#  Path の引数の先頭にスラッシュを入れないと、パッケージ名から Controller まで</span>
<span class="synComment">#  を除いた部分(ここではhello) からの相対URLにマッチする。</span>
<span class="synComment">#  以下の場合は http://example.com/hello/foo/bar や、</span>
<span class="synComment">#  http://example.com/hello/foo/bar/baz などのリクエストに対して hoge が呼ば</span>
<span class="synComment">#  れる。</span>
<span class="synComment">#  </span>
<span class="synComment">#  これに対して:Path(&#39;/foo/bar&#39;) として先頭にスラッシュを入れると、絶対指定となり、</span>
<span class="synComment">#  http://example.com/foo/bar や、http://example.com/foo/bar/baz などが呼ばれたと</span>
<span class="synComment"># きに hoge が呼ばれる</span>
<span class="synComment">#</span>
<span class="synStatement">sub</span><span class="synIdentifier"> hoge :Path(&#39;foo/bar&#39;) </span>{
    <span class="synComment"># ....</span>
}
</pre>

<pre>
<span class="synComment">#</span>
<span class="synComment">#  Regex アクション</span>
<span class="synComment">#  </span>
<span class="synComment">#  パッケージ名に関係なく、マッチするURLを正規表現で指定する</span>
<span class="synComment">#  以下の場合は、http://example.com/foo/hoge としたときは サブルーチンhoge</span>
<span class="synComment">#  が呼ばれるが、http://example.com/hoge では呼ばれない</span>
<span class="synComment">#</span>
<span class="synStatement">sub</span><span class="synIdentifier"> hoge :Regex(&#39;^(\w+?)/hoge&#39;) </span>{
    <span class="synComment"># ....</span>
}
</pre>

<pre>
<span class="synStatement">package</span><span class="synType"> Sample::Controller::hello;</span>
<span class="synComment">#</span>
<span class="synComment">#  Local アクション</span>
<span class="synComment">#  </span>
<span class="synComment">#  URLが、必ずパッケージ名から、Controllerまでの部分を除いたもの</span>
<span class="synComment">#  (ここではhello) で始まり、あとにサブルーチン名が続いたものにマッチすること</span>
<span class="synComment">#  を指定する。</span>
<span class="synComment">#</span>
<span class="synComment">#  以下の場合は、http://example.com/hello/hoge/foo や </span>
<span class="synComment">#  http://example.com/hello/hoge としたときに、サブルーチンhoge</span>
<span class="synComment">#  が呼ばれるが、http://example.com/hoge では呼ばれない</span>
<span class="synComment">#</span>
<span class="synStatement">sub</span><span class="synIdentifier"> hoge :Local </span>{
    <span class="synComment"># ....</span>
}
</pre>

<pre>
<span class="synComment">#</span>
<span class="synComment">#  default アクション</span>
<span class="synComment">#</span>
<span class="synComment">#  どのアクションにもURLがマッチしない場合に呼ばれる。404ページやエラーページ</span>
<span class="synComment">#  の作成に便利</span>
<span class="synComment">#</span>
<span class="synStatement">sub</span><span class="synIdentifier"> default :Private </span>{
    <span class="synComment"># ....</span>
}
</pre>

<h3> データベース操作</h3>

<p>さて、アクション指定をしたサブルーチン内では、マッチしたURLに対して様々な操作ができることがわかりました。URLルーティングに続いて、私が次に関心を持つのは、Webアプリケーションに欠かせないデータベースの操作です。Catalyst ではどうしたらいいのでしょうか？</p>
<br />
<p>以下、順を追って説明したいと思います。なお、私は今回 sqlite3 を使いました。</p>
<p>まずはデータベースの構造（スキーマ）です。本当は Atompub 用のスキーマを書きたいのですが、そこは割愛して、説明のための簡単なスキーマを作ります。</p>

<pre>
$ cd Sample
$ sqlite3 sample.db
SQLite version 3.5.9
Enter &quot;.help&quot; for instructions
sqlite&gt; CREATE TABLE sample (
     ...&gt;   id            INTEGER PRIMARY KEY,
     ...&gt;   sample_text        TEXT
     ...&gt;);
sqlite&gt;
</pre>

<p>次にデータベースにアクセスするための Model クラスを作ります。Perl では、ORM(Object Relational Mapping) という、DBアクセスを楽にプログラムから行うためのモジュールとして、DBICというものがあります。ここではそれを利用するように指定してクラスを生成します。コントローラーを作ったときと同じく、script/sample_create.pl を使います。</p>
<p>  </p>
<p>script/sample_create.pl への引数として、いろいろごちゃごちゃと指定していますが、順番に以下の表の通りです。</p>
<p>  </p>
<table>
<tr>


</tr>
<tr>
<td>model</td>
<td>作成対象（model or  view or controller)</td>
</tr>
<tr>
<td>DB</td>
<td>作成するクラス名（ちゃんと書くとSample::Model::DB）</td>
</tr>
<tr>
<td>DBIC::Schema</td>
<td>スーパークラス名（Catalyst::Model::DBIC::Schema）</td>
</tr>
<tr>
<td>Sample::Schema</td>
<td>スキーマ情報のクラス名</td>
</tr>
<tr>
<td>dbi:SQLite:dbname=sample.db</td>
<td>接続情報</td>
</tr>
</table>
<p>  </p>
<pre>
 $ script/sample_create.pl model DB DBIC::Schema Sample::Schema create=static dbi:SQLite:sample.db 
 exists &quot;/home/mumumu/Sample/script/../lib/Sample/Model&quot;
 exists &quot;/home/mumumu/Sample/script/../t&quot;
Dumping manual schema for Sample::Schema to directory /home/mumumu/Sample/script/../lib ...
Schema dump completed.
created &quot;/home/mumumu/Sample/script/../lib/Sample/Model/DB.pm&quot;
created &quot;/home/mumumu/Sample/script/../t/model_DB.t&quot;
</pre>
<p>    </p>
<p>いろいろと生成されたようです。具体的には、lib/Sample/Schema/Sample.pm に、テーブルの定義がdumpされてクラスが自動生成されているのがわかると思います。また、lib/Sample/Schema.pm には、スキーマをロードするクラス、そしてlib/Sample/Model/DB.pm には、DBの接続設定が書かれているようです。皆さんの目で確認してみて下さい。</p>
<br />
<p>これらを使って、Perlプログラムからレコードを挿入してみます。URLルーティングのところで説明した、hello コントローラーを以下のように書き換えてみます。</p>
<br />
<p>(lib/Sample/Controller/hello.pm)</p>
<pre>
<span class="synStatement">package</span><span class="synType"> Sample::Controller::hello;</span>

<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>parent <span class="synConstant">&#39;Catalyst::Controller&#39;</span>;

<span class="synStatement">sub</span><span class="synIdentifier"> index :Path :Args(0) </span>{
    <span class="synStatement">my</span> ( <span class="synIdentifier">$self</span>, <span class="synIdentifier">$c</span> ) = <span class="synIdentifier">@_</span>;

    <span class="synComment">#    自動生成した sample スキーマクラスを使って sample_text カラムに</span>
    <span class="synComment">#    挿入する </span>
    <span class="synIdentifier">$c</span>-&gt;model(<span class="synConstant">&#39;DB::sample&#39;</span>)-&gt;update_or_create({
        <span class="synConstant">sample_text </span>=&gt; <span class="synConstant">&#39;im catalyst newbie. testing hello!&#39;</span>,
    });

    <span class="synComment">#</span>
    <span class="synComment">#    http://example.com/hello/ や http://example.com/hello へのリクエスト</span>
    <span class="synComment">#    に対して、「Matched Sample::Controller::hello in hello.」を表示する。</span>
    <span class="synComment">#</span>
    <span class="synIdentifier">$c</span>-&gt;response-&gt;body(<span class="synConstant">&#39;Matched Sample::Controller::hello in hello.&#39;</span>);
}

<span class="synConstant">1</span>;
</pre>

<p>自動生成したクラスは、「$c-&gt;model(&#39;スキーマ名&#39;)-&gt;DBアクセスのメソッド」 のようにして使います。上記の例では DB::sample がスキーマ名で、 DBアクセスのメソッドとして update_or_create を使っています。とりあえずこの使い方は「おまじない」のようなもの、としておきましょう。</p>
<br />
<p>しかし、「DBアクセスのメソッド」は他にもたくさんあるはずです。SELECT や DELETE, UPDATE とか、、それらの詳細については、<a href="http://search.cpan.org/~ash/DBIx-Class-0.08010/lib/DBIx/Class/Manual.pod">DBIX::Class::Manual</a> 等を参考にしてみてください。</p>
<br />
<p>書き換えたあと、プロジェクトを作り、動作確認したときの要領で開発用サーバを起動し、<a href="http://example.com:3000/hello">http://example.com:3000/hello</a> にアクセスしてみましょう。相も変わらず「Matched Sample::Controller::hello in hello.」と表示されるだけですが、データベースの中身は変わっています。ちょっと確かめてみましょう。</p>

<pre>
$ sqlite3 sample.db
SQLite version 3.5.9
Enter &quot;.help&quot; for instructions
sqlite&gt; select * from sample;
1|im catalyst newbie. testing hello!  &lt;- 挿入されたレコード！
sqlite&gt;
</pre>

<p>1番のidで、im catalyst newbie. testing hello!　と挿入されているのがわかると思います。これは lib/Sample/Controller/hello.pm の indexアクションに書いたものです。</p>

<h4> sqliteに関する注意点</h4>

<p>sqlite は単一ファイルにデータベースの情報を格納します。よって、Webサーバ経由でPerlからアクセスする場合は、sqliteコマンドで作ったファイル(ここではsample.db) がWebサーバの権限で読み書きできなければいけません。「Unable to Open Database!」のようなエラーが出る場合は、この点を真っ先に疑うようにしましょう。</p>
<br />
<p>また、こうした問題は往々にして sample_server.pl を使った開発サーバにおいてよりも、Apache + mod_perl のような、デプロイ後の環境で往々にして起こりがちです。パーミッションとdbファイルのパスはきちんと確認しておくようにしましょう。</p>
<br />
<p>Catalyst と sqlite は面倒な関係にあるようです。lazy-people.org の tomyhero氏は以下のようにIRCで叫んでいました。</p>

<pre>
 (tomyhero) sqliteで十分ではなくて、sqliteのほうが
 (tomyhero) めんどうなんだお！
 (tomyhero) myssqlとかつかったほうがいいお
</pre>

<h3> その他びっくりしたこと、小さな疑問等（ひとりごと的に）</h3>

<ul>
<li> DBIC と DBIx::Class って同じものかどうか未だに区別がつかない</li>
<li> 入力の validate はどこに書けばいいの？と思ったら、validateのフローはばっさりカットされているようだ。型にハマったLazyな方法ないかしら</li>
<li> 設定ファイルは 2方式あるらしく、Catalyst::Manual::Tutorial では、Apacheの設定ファイルライクな方式が使われていた。どっちがいいんだろうねーと思いつつ、結局慣れ親しんだyamlに走った</li>
<li> デプロイしてみて、動かすのにこれだけ苦労したのは久しぶりかも。SSLを絡めたらとたんにfastCGIで動かなくなったりとかあったけど、最終的には Apache + mod_perl2 に落ち着いた</li>
</ul>

<h3> とりあえずのおわり</h3>

<p>あれ、View はどうしたの？ とか、Atompubの記述が全く出てこないぢゃないかとか、いろいろツッコミどころはあるとは思いますが、長くなってきたので今回はこの辺で。。ということで(´ー｀; )  View 以外にも Basic 認証についても結構ひっかかったりしたので、それについても機会があったら書きたいと思います。</p>
<br />
<p>最後に、<a href="http://lazy-people.org">lazy-people.org</a> の皆さんには多くの助言を頂きました。この場を借りて御礼申し上げます。</p>

]]>
        
    </content>
</entry>

</feed>
