<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>ゆーすけべー日記</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/" />
    <link rel="self" type="application/atom+xml" href="http://yusukebe.com/atom.xml" />
    <id>tag:yusukebe.com,2010-02-02://1</id>
    <updated>2010-03-19T05:15:46Z</updated>
    <subtitle>天然パーマの Erogeek「ゆーすけべー - yusukebe」の日記だよん★</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 5.01</generator>

<entry>
    <title>sinatra ライクな MojaMoja(実験的な) を使ってみた</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/19/141253.html" />
    <id>tag:yusukebe.com,2010://1.2585</id>

    <published>2010-03-19T05:12:53Z</published>
    <updated>2010-03-19T05:15:46Z</updated>

    <summary> tokuhirom が面白い名前の（実験的な）sinatraみたいなframeworkを作ってた。 MojaMoja - (PoC)yet another s...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
tokuhirom が面白い名前の（実験的な）sinatraみたいなframeworkを作ってた。
</p>
<blockquote>
<p>
MojaMoja - (PoC)yet another sinatra-ish framework built on CPAN modules
</p>
<p>
<a href="http://github.com/tokuhirom/MojaMoja">tokuhirom's MojaMoja at master - GitHub</a>
</p>
</blockquote>
<p>
このモジュールは実験的で且つ、
そのうち（近いうち）、miyagawaさんがある意味似た様なPSGI micro web framework <b>kit</b>「Piglet」というものを出すと思われ、
特にMojaMoja使え！っていうエントリーじゃないのでご了承を。
</p>
<p>
まぁ何が面白いって、その名前と、
アプリの最後に
</p>
<pre class="prettyprint">
zigorou;
</pre>
<p>
って書くところですね！
zigorou;って書くと、plackup等で利用可能なアプリケーションハンドラを返してくれます。
使いかたしごく簡単で、
</p>

<pre class="prettyprint">
use MojaMoja;

get '/' =&gt; sub {
    return [ 200, [], ['Hello ZIGOROu'] ];
};

zigorou;
</pre>
<p>
と書いた zigorou.psgi を保存して、
</p>

<pre class="prettyprint">
plackup zigrou.psgi
</pre>

<p>
として http://localhost:5000/ とかにアクセスすれば「Hello ZIGOROu」が表示されます。
get '/' ...; の部分がルータ/ディスパッチャの役目を果たしているわけですね。
それと面白いのが、__DATA__以下のDATAセクションにテンプレート書ける点ですね。
</p>

<pre class="prettyprint">
use MojaMoja;

get '/hoge' =&gt; sub {
    my $req  = shift;
    my $name = $req-&gt;param('name');
    render('hoge.mt');
};

zigorou;

__DATA__

@@ hoge.mt
hogehoge &lt;?= $name ?&gt;
</pre>

<p>
という.psgiを作って、今度は http://localhost:5000/hoge?name=ZIGOROu
にアクセスすると「hogehoge ZIGOROu」が表示されます。
一つの.psgiファイルの中に全て書けますね。
</p>
<p>
で、さっきMojaMojaアプリの「2個目」として作ったのが、
YouTubeのビデオを連続再生するという代物。まぁグリモンとかJSでやれる範囲ですが、
どうしても.psgiでPerfumeをループで見たかったので作ってみました。
</p>

<pre class="prettyprint">
use MojaMoja;
 
get '/' =&gt; sub {
    my $html = render('index.mt');
    res( 200, [ 'Content-Type' =&gt; 'text/html' ], [$html] );
};
 
get '/loop' =&gt; sub {
    my ($req) = @_;
    my $url = $req-&gt;param('url')
      or return [ 302, [ 'Location' =&gt; $req-&gt;base ], [] ];
    my ($video_id) = $url =~ m!watch\?v=([^&amp;]+)!;
    my $html = render('loop.mt');
    res( 200, [ 'Content-Type' =&gt; 'text/html' ], [$html] );
};
 
zigorou;
 
__DATA__
 
@@ index.mt
&lt;html&gt;
&lt;body&gt;
&lt;form action=&quot;/loop&quot;&gt;
&lt;label&gt;Enter YouTube Video URL&lt;/label&gt;
&lt;input type=&quot;text&quot; name=&quot;url&quot; size=&quot;80&quot; /&gt;
&lt;input type=&quot;submit&quot; /&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
 
@@ loop.mt
&lt;html&gt;
&lt;body&gt;
&lt;object width=&quot;640&quot; height=&quot;385&quot;&gt;
&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/&lt;?= $video_id ?&gt;&amp;loop=1&amp;autoplay=1&quot;&gt;&lt;/param&gt;
&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;
&lt;embed src=&quot;http://www.youtube.com/v/&lt;?= $video_id ?&gt;&amp;loop=1&amp;autoplay=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;640&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>
このサクっと作れる感がいいですね。
で、上記した通りPigletというPSGI web micro framework <b>kit</b>がでてくるのし、
Mojolicious::Lite でも似た様なことできるので、
真似してもらわなくてもいいですが、
こういう大小フレームワークがあってそれぞれが使いやすくて場合によって使い分けをして、
それでいて全てがPSGI互換であったりするといい感じだと思ったというわけでした。
</p>
<p>
ただ、Perfumeを今すぐ.psgiでループ再生したい人、zigorou;とコードに書きたい人は、
MojaMoja使ってみるのもいいんではないでしょうか。
</p>

<ul>
  <li><a href="http://github.com/tokuhirom/MojaMoja">tokuhirom's MojaMoja at master - GitHub</a></li>
</ul>]]>
    </content>
</entry>

<entry>
    <title>Test::mysqld いい感じ</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/19/105245.html" />
    <id>tag:yusukebe.com,2010://1.2584</id>

    <published>2010-03-19T01:52:45Z</published>
    <updated>2010-03-19T01:53:32Z</updated>

    <summary> もう承知の方は承知かとおもいますが、最近使って感動したのでメモ。 MySQLをDBにもったモジュールのテストにokukazuho wareであるTest::m...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[
<p>
もう承知の方は承知かとおもいますが、最近使って感動したのでメモ。
MySQLをDBにもったモジュールのテストにokukazuho wareであるTest::mysqldはすごいいい感じっす。
</p>
<blockquote>
<p>
Test::mysqld automatically setups a mysqld instance in a temporary directory, and destroys it when the perl script exits.
</p>
<p>
<a href="http://search.cpan.org/~kazuho/Test-mysqld-0.11/lib/Test/mysqld.pm">Test::mysqld - search.cpan.org</a>
</p>
</blockquote>
<p>
テストコードの中などで使って、mysqldを全てテンポラリーなディレクトリで立ち上げてくれて、
そのテストが終わったら（ブロックを抜けたら）自動的にシャットダウン＆そのディレクトリものごと削除してくれるという代物。
がががーとほんとに「自動的に」やってくれる感がたまらない。
以下がTest::mysqld付属のテストをダンプ付きでやった時のスクリーンショット。
これでなんとなく雰囲気がわかるはず。
</p>
<p>
<img src="http://yusukebe.com/archives/files/100319/mysqld01.jpg" alt="" />
</p>
<p>
そこで、Kailasのプロジェクトで使いだしました。今のところは
個々のメソッドについては単体のテストスクリプトでテストして、
「usecase」って名前のテストスクリプトでそのAPIを使う全体のユースケースをテストしてみてます。
えっとーFailしてますが（汗）、まぁこんな感じで、シナリオが再現できるので楽しいです。
</p>
<p>
<img src="http://yusukebe.com/archives/files/100319/mysqld02.jpg" alt="" />
</p>
<p>
実はこのモジュール、<strong><a href="http://japan.perlassociation.org/">JPA</a>会長の</strong>lestrratさん（牧さん）に教えてもらったのですが、
あの方はMakefile.PLにいろいろ仕込ませてうはうはしているみたいですね。
</p>
<ul>
  <li><a href="http://mt.endeworks.jp/d-6/2009/10/things-ive-done-while-using-test-mysqld.html">Test::mysqldとかでテスト走らせる際に行ったいろんな事。 - D-6 [相変わらず根無し]</a></li>
</ul>
<p>
ということで、まだ使ったこと無い人は一度試してみると楽しいかもですよ！
</p>

]]>
    </content>
</entry>

<entry>
    <title>YouTubeの&quot;402 Payment Required&quot;と戦うために「listpod-app-lite」</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/15/183556.html" />
    <id>tag:yusukebe.com,2010://1.2583</id>

    <published>2010-03-15T09:35:56Z</published>
    <updated>2010-03-15T09:39:22Z</updated>

    <summary> 一昨年のちょうどこの季節、「YouTubeの動画をリストで保存、動画ポッドキャストを楽しめる」として、 ListPodというサービスをリリースしました。 ワデ...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="研究・制作活動" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
一昨年のちょうどこの季節、「YouTubeの動画をリストで保存、動画ポッドキャストを楽しめる」として、
ListPodというサービスをリリースしました。
</p>
<blockquote>
<p>
ワディット代表取締役、オモロキ取締役兼CTOの和田裕介氏は3月23日、YouTubeで公開されている動画のマイリストを作成し、ポッドキャストとして配信するサービス「ListPod」ベータ版を公開した
</p>
<p>
<a href="http://japan.cnet.com/news/media/story/0,2000056023,20369960,00.htm">YouTubeの動画をリストで保存、動画ポッドキャストを楽しめる「ListPod」:ニュース - CNET Japan</a>
</p>
</blockquote>
<p>
しかし、現在のところ<strong>ListPodはほぼ使えない状況にあります</strong>。
</p>
<blockquote>
<p>
Listpodに登録した動画をiTunesでダウンロードしようとすると、エラー「状況：中止されました（エラー = 500）」になります。なんとかしてください。
</p>
<p>
<a href="http://jbbs.livedoor.jp/bbs/read.cgi/computer/40787/1267825665/">iTunesダウンロードエラー - ListPodサポート掲示板</a>
</p>
</blockquote>

<p>
原因はYouTubeの動画ファイルのパスを解析するシステムで、
アクセス規制をされているためです。
このシステム上はエラーがでるため500番のエラーを吐きますが、
実際にYouTubeへリクエストを送って失敗した際、YouTube側から「<strong>402 Payment Required</strong>」というエラーコードが返ってきています。
</p>

<p>
アクセス数がまぁ一般の方がYouTubeにアクセスする数と比べて、
膨大なため、このシステムを運用しているIP空間全てにおいて、
YouTubeの規制がかかっている状況です。
そのため、こちらのクライアントPCからYouTubeの動画を見ようとすると、
たいてい「キャプチャ」画面が現れ、イラストで書かれた文字をその都度入力することになっております。
</p>

<p>
規制は受けていても、キャプチャを通過したブラウザならばしばらくはYouTubeの動画が見れるということになります。
ようはその状態のCookieを保持したユーザーエージェントからのアクセスならば、
ListPodのダウンロード機能が使えるわけです。
が、さすがにそれを公のサービスにするわけにもいかず、
また、何回かのアクセス毎にキャプチャを要求されるわけで、その度にサービスが止まるということになり、
今ままでのようなパブリックな空間でのListPod相当のサービスを提供することは、
<strong>非常に困難だ</strong>と言わざるをえません。
</p>

<blockquote>
<p>
ListPodは死んだのか？
</p>
</blockquote>

<p>
ある意味、そうかもしれないです。
この「402 Payment Required」は深刻な問題です。
しかし、希望はあります。一つのサービスに集中していたダウンロードという機能、
いやむしろListPodそのものを分散させる、つまり使いたい人の手元で動作するクライアントアプリケーションにすればいいのです。
</p>

<p>
てなわけで、前置きが長くなりましたが、
ListPodは死んだので、<a href="http://github.com/yusukebe/ListPod-App-Lite">listpod-app-lite</a>ってのを作ってみたよ！
</p>
<blockquote>
<p>
何ができるの？
</p>
</blockquote>
<p>
立ち上げて、指定されたURLをブラウザ開いて、そこのフォームにYouTubeの
プレイリストのURLを入れれば、それがPodcast用フィードになって、
動画がiTunesでダウンロードできたりするんだぜ！
もちろん、iPhoneやiPodでみれる形式だよ！
</p>
<blockquote>
<p>
どうやってインストールするの？
</p>
</blockquote>
<p>
GitHubにソース置いてあるから、git pullして perl Makefile.PL, make, make install ってやればインストールされて、listpod-app-lite ってコマンドが使えるようになるよ！依存モジュールはPlackとかTMTとかだけどXML系には依存してないから適当にインストールしてね！
</p>
<ul>
  <li><a href="http://github.com/yusukebe/ListPod-App-Lite">yusukebe's ListPod-App-Lite at master - GitHub</a></li>
</ul>
<blockquote>
<p>
なんでモジュールのrecommendsにAnyEventとAnyEvent::HTTPが入ってるの？
</p>
</blockquote>
<p>
俺のIP空間じゃあ、規制がかかってるんで、
キャプチャを突破した時点のクッキーがなくちゃいけないんだけど、
iTunesのクライアントとかじゃあそういう機能ないんで、
ちょっとトリッキーなことをしているからだよ。
Safariでキャプチャを突破（言葉が悪いけどごめんなさい）→
Safariのクッキーをlistpod-app-liteのUserAgentに読ませる→
動画のパスをそのクッキー使って取得する→
ダウンロードもそのユーザーエージェント使わないとだけど、普通にやるとブロッキングするから -s AnyEvent して、
ノンブロッキングでダウンロード→
iTunesへ→やったー★
って真似しちゃだめだよ！
</p>

<p>
以下スクリーンショット！
</p>
<p>
<img src="http://yusukebe.com/archives/files/100315/listpod01.jpg" alt="listpod" />
</p>
<p>
<img src="http://yusukebe.com/archives/files/100315/listpod02.jpg" alt="listpod" />
</p
<p>
<img src="http://yusukebe.com/archives/files/100315/listpod03.jpg" alt="listpod" />
</p>
<p>
<img src="http://yusukebe.com/archives/files/100315/listpod04.jpg" alt="listpod" />
</p>
<p>
<img src="http://yusukebe.com/archives/files/100315/listpod05.jpg" alt="listpod" />
</p>
<p>
<img src="http://yusukebe.com/archives/files/100315/listpod06.jpg" alt="listpod" />
</p>
<p>
<img src="http://yusukebe.com/archives/files/100315/listpod07.jpg" alt="listpod" />
</p>

<p>
というわけで、もしあればご要望受けつけております。
Enjoy!
</p>]]>
    </content>
</entry>

<entry>
    <title>Data::Validator::Simple ってのを作り出した</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/11/163925.html" />
    <id>tag:yusukebe.com,2010://1.2582</id>

    <published>2010-03-11T07:39:25Z</published>
    <updated>2010-03-11T07:41:52Z</updated>

    <summary> 親父と一緒にやってるBPMに変わる新しいアプリケーション「Kailas」の開発で、 必要になったので Data::Validator::Simple っていう...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
親父と一緒にやってるBPMに変わる新しいアプリケーション「Kailas」の開発で、
必要になったので Data::Validator::Simple っていうちっちゃいモジュールを作り出しました。
アプリの要求として、「条件分岐」させなくてはいけないところがあって、
その判定に使うってのが作ることになった主な目的です。
条件分岐というと if else 使いますが、それを抽象化して、
特定のルール、例えばその値が範囲内にあるかどうかという「BETWEEN」や、
文字列や数値が一緒かという「EQUAL_TO」などをパラメータと共に渡せば結果が返ってくるという具合です。
</p>
<p>
というといわゆるFormValidator::*を思い浮かべますし、
実際のところそれを使ってもよかったのですが、
今回特殊なパターンがでてくることを想定したり、
基本的にWebのFormから受け取るようなデータは扱わないつもりなので、
作ってみました。
</p>
<p>
とはいってもFormValidatorっぽい動きもしたいよねーとも思ったりしたので、
Data::Validator::Simple::Formオブジェクトがその役目を（ある程度）担うようにもできてます。
実践に使ってないのでなんとも言えませんが、その辺りは改良できればします。
</p>
<p>
まだdeveloper release扱いなので、APIが変わるかもしれませんが、
以下現状のSYNOPSISを解説。
</p>
<p>
まずは単一なデータの検証。
</p>
<pre class="prettyprint">
use Data::Validator::Simple;

my $data = Data::Validator::Simple-&gt;new( data =&gt; 5 );
my $result = $data-&gt;check( ['BETWEEN', 4, 10 ] );
if( $result ){
  print &quot;valid&quot;;
}else{
  print &quot;error&quot;;
}
</pre>
<p>
複雑なパターン。checkメソッドに配列で渡せば順番で評価。
渡す値がハッシュリファレンスでかつ評価が成功した場合、その中のsuccessを返します。
successの中身は何でもいいので、この辺りがKailasで生きてくるはずです。
</p>
<pre class="prettyprint">
my $data = Data::Validator::Simple-&gt;new( data =&gt; 5 );
my $result = $data-&gt;check(
    {
        rule    =&gt; [ 'EQUAL_TO', 6 ],
        success =&gt; 'fist_message',
    },
    {
        rule    =&gt; [ 'EQUAL_TO', 5 ],
        success =&gt; 'second_message',
    }
);
print $result; # second_message
</pre>
<p>
最後に、FormValidator的に使う方法。
</p>
<pre class="prettyprint">
my $q = CGI-&gt;new;
$q-&gt;param( id   =&gt; 'login_id' );
$q-&gt;param( name =&gt; 'user_name' );
my %params = $q-&gt;Vars;

my $form = Data::Validator::Simple-&gt;form;
my $results = $form-&gt;check(
    \%params,
    {
        id =&gt; [ 'ASCII', [ 'LENGTH', 4, 10 ] ],
        name =&gt; [ 'LENGTH', 4, 20  ]
    }
);
if( $results-&gt;{id} &amp;&amp; $results-&gt;{name} ){
  print &quot;valid&quot;;
}
</pre>
<p>
今のところValidateに使えるルールが少ないので、これは増やしていくと共に、
Web特有のそれ以外のケースにも対応したいです。
で、まぁかなーりFormValidator::Simpleを参考にしているので、
それでいいんじゃねーか！みたいなことはおいといて、
更なる発展を自分で祈って作っていきます。
</p>
<p>
0.01_01というバージョンでshipitしちゃったんで！
そのうちsearch.cpan.orgにインデックスされると思います。
</p>
<ul>
<li><a href="http://github.com/yusukebe/Data-Validator-Simple">yusukebe's Data-Validator-Simple at master - GitHub</a></li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>Perl vs PHP</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/07/103912.html" />
    <id>tag:yusukebe.com,2010://1.2581</id>

    <published>2010-03-07T01:39:12Z</published>
    <updated>2010-03-07T01:41:06Z</updated>

    <summary> Perl と PHP の比較をしてみましょう。 私はPHPから入った口ですが、 今は、どちらがよいかというと、個人的な意見としてはやはりPerlです。 それは...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
Perl と PHP の比較をしてみましょう。
私はPHPから入った口ですが、
今は、どちらがよいかというと、個人的な意見としてはやはりPerlです。
</p>
<p>
それは、PerlにはWebアプリ以外にも使える沢山のモジュールがCPANに用意されており、
PHPのように膨大な標準の関数を使ってせいぜいWebアプリを作るってだけではなく、
モジュールを入れさえすればそれで、CLI含めほぼなんでも出来てしまうからです。
</p>
<p>
＊もちろんPHPもCLI作れるけどねー^^;
</p>
<p>
例えば、PHPの標準のfopen関数でファイル以外にも指定したURLのコンテンツを開けます。
ところが、Perlの場合はそれをモジュールで解決しようとします。
</p>

<pre class="prettyprint">
# cpan &gt; install LWP::Simple
use LWP::Simple;
my $content = get('http://yusukebe.com/');
</pre>

<p>
PHPの場合fopen一発でできるところ、Perlではモジュールのインストールからしなくてはいけません。
一見するとめんどくさいですねー^^;
ところが、ちょっと発展させて、取得したコンテンツからh2タグの中身一覧を取得するといった複雑な処理を
考えてみましょう。
PHPの場合、どーするかわかりませんが、Perlだと便利なモジュールがあります。
今後、より複雑な処理を行うことを考えWeb::Scraperを使ってみます。
</p>

<pre class="prettyprint">
# cpan &gt; install Web::Scraper
use Web::Scraper;
use URI;

my $scraper = scraper {
    process &quot;h2.entry-title&quot;, 'titles[]' =&gt; 'TEXT';
};
my $res = $scraper-&gt;scrape( URI-&gt;new('http://yusukebe.com/') );
map { print $_ . &quot;\n&quot;} @{$res-&gt;{titles}};
</pre>
<pre class="prettyprint">
Twib in Yokohama.pm テクニカルトーク#5
実例で学ぶPerlにおけるリファレンス
Perl入門本を書こうとしている話
PHPの小文字から始まる関数が4405個もあってびっくりした件
Perl初心者向け勉強会(by カジュアルPerl)をやりますという予告
Twitterの友達が好きなアーティストがわかっちゃったりする「音探し」を作ってみた
Twitterで話題のYouTube動画が一目でわかるTubetter - ツベッターを作ってみた
CatalystアプリケーションをStarmanで運用しよう！
3/5 Yokohama.pm #5 が開催されます
オススメのIRCチャンネルを教えてください＠人力検索はてな
</pre>
<p>
CSSセレクタやXPathで指定した部分だけを配列に入れてくれたりして便利ですね！
こうした便利ーなモジュールがCPANには沢山あるので、
Perlの場合お好きな方法で楽してより多くの目的を達成することができるのです。
</p>
<p>
あと、PHPの場合オフィシャルの関数リファレンスを見たりしますが、
Perlの場合perldocというコマンドでモジュールに付属のドキュメントを見たり、
search.cpan.orgでは整形済みのそれを見たりすることができていいですね。
大抵「SYNOPSIS」っていうところのコードを実行すればモジュールの使い方がわかります。
</p>
<p>
まぁ、サーバの負荷うんぬんってのは状況によってはmod_perl使えばいいですし、
デプロイの話ってのはPSGIが標準化すれば手元で書いたコードがそのまま、レンタルサーバで動くぜみたいなことができるようになると思っています。
</p>
<p>
それにデバッグもPHPは簡単らしいのですが、
PerlだってData::Dumperモジュールや、YAMLモジュール使えば視覚的に中にどんなデータが入っているかが
わかります。
</p>

<pre class="prettyprint">
use Data::Dumper;
use YAML;
# use utf8;

my $ref = { name =&gt; 'yusukebe', zokuseis =&gt; [qw(メガネ エロ)] };
print &quot;Data::Dumper::Dumper\n&quot;;
print Dumper $ref;
print &quot;YAML::Dump\n&quot;;
print Dump $ref;
</pre>

<pre class="prettyprint">
Data::Dumper::Dumper
$VAR1 = { 
          'zokuseis' => [ 
                          'メガネ',
                          'エロ'
                        ],
          'name' => 'yusukebe'
        };
YAML::Dump
---
name: yusukebe
zokuseis:
  - メガネ
  - エロ
</pre>
<p>
私はもう今となってはPHPはほとんど触りませんが、
やはりWebの開発から小物スクリプトまでPerlに軍配が上がる、と思います。
</p>
<p>
モジュールのインストールがめんどいなーとかレンサバで動かないよーとかも
local::libやcpanmのおかげで解決しつつありますし、
上記した通りPSGIやPlackが頑張ってくれればWebアプリを動かすのもいろんな環境で楽できると思います。
</p>
<p>
それとPHPからPerlに移行したい！って人によっては
<a href="http://wikihub.org/wiki/php-funcref-in-perl">php-funcref-in-perl</a>っていう素晴らしいプロジェクトがあるので、
安心ですね^^
</p>
<p>
別にPHPをディスってるわけじゃないですが、
なんとなく書いてみましたよ！
</p>
<p>
元ネタ: <a href="http://phpspot.net/php/pgPHP%20vs%20Perl.html">PHP vs Perl - phpspot</a>
</p>
<p>
PS. 最近「ゆーすけべー日記」がperlcodesampleさん化しつつあるのは、
Perl書籍を書こうとしているからです^^;
</p>
]]>
    </content>
</entry>

<entry>
    <title>Twib in Yokohama.pm テクニカルトーク#5</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/06/100943.html" />
    <id>tag:yusukebe.com,2010://1.2580</id>

    <published>2010-03-06T01:09:43Z</published>
    <updated>2010-03-06T01:13:20Z</updated>

    <summary> Yokoahama.pm テクニカルトーク#5 に参加＆発表して来ました。 いやー和気あいあいとしていて、かつ初参加の人も結構いたのでよかったですね。 自分は...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
Yokoahama.pm テクニカルトーク#5 に参加＆発表して来ました。
いやー和気あいあいとしていて、かつ初参加の人も結構いたのでよかったですね。
自分は、Twib というサービスを「いかに個人でやりつつ、パフォーマンス上げてくか」
みたいな話を中心にさせていただきました。
今まで記事にしてなかった Twib の裏側現状編という感じです。
</p>
<p>
スライドはいかにアップしておきました。
</p>
<div style="width:425px" id="__ss_3348201"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/yusukebe/twib" title="Twib in Yokoahma.pm 2010/3/5">Twib in Yokoahma.pm 2010/3/5</a></strong><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=100304yokohamapm-100305183125-phpapp01&stripped_title=twib" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=100304yokohamapm-100305183125-phpapp01&stripped_title=twib" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/yusukebe">yusukebe</a>.</div></div>

<p>
注釈としてここで出てくる「取りこぼし」の問題の件なのですが、
これはTwitter APIを頑張って用いても、対象となる全件のツイートを取得するのが無理だという話ですね。
なんとかしたいっすなー。
他の方の発表はみなさん自由な雰囲気がよろしくて、
しっかりとそれぞれのPerlの話をしていました。
</p>
<p>
<img src="http://yusukebe.com/archives/files/100306/yokohamapm.jpg" alt="gfx" />
</p>
<p>
内容のログはいつも通り丁寧にhirataraさんがまとめてくていれますので、
参考にしてください。
Yokohama.pmというと我先に！と発表したがっちゃう自分がいますが、
まだ発表したことない！という方も次回はチャレンジしてみたらいかがでしょうかと思いました。
</p>

<ul>
  <li><a href="http://d.hatena.ne.jp/hiratara/20100305/1267747275">今日は Yokohama.pm #5 の日です - a geek born in Tomakomai</a></li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>実例で学ぶPerlにおけるリファレンス</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/04/111325.html" />
    <id>tag:yusukebe.com,2010://1.2579</id>

    <published>2010-03-04T02:13:25Z</published>
    <updated>2010-03-04T02:16:26Z</updated>

    <summary> Perlの文法が大体わかってくるとぶちあたる壁が「リファレンス」です。 Cを既にやっている人ですと「ポインタ」という概念を知っているので、 あまり違和感がない...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
Perlの文法が大体わかってくるとぶちあたる壁が「リファレンス」です。
Cを既にやっている人ですと「ポインタ」という概念を知っているので、
あまり違和感がないのですが( by lestrrat さん )、個人的にはこいつを理解した時に
「パーと」Perlに対する視界が開けた感じを受けました。
perlcodesampleさんもこう言ってます。
</p>

<blockquote>
<p>
<a href="http://d.hatena.ne.jp/perlcodesample/20100210/1264257759">Perlで一番ややこしく感じるのはリファレンスだと思う - サンプルコードによるPerl入門</a>
</p>
</blockquote>

<p>
でまぁ、そんな難しい話ではないし、
慣れれば全てリファレンスで扱うケースもありとのことなので、
コードを交えて解説してみたいと思います。
ツッコミ歓迎です。
ちなみに、僕がリファレンスを理解するきっかけになった「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113059/kamawada-22/">続・初めてのPerl</a>」の例を多いに参考にしています。
</p>
<p>
これから扱うサンプルは
</p>
<ul>
<li>萌え</li>
<li>メガネ</li>
<li>ギーク</li>
<li>エロ</li>
<li>嫁あり</li>
</ul>
<P>
という5つの人に関する属性があると過程して、
それぞれの人がどのような属性を持っているかをチェックして出力する簡単なプログラムです。
例えば、yusukebe には メガネ エロ という属性がある
という具合です。
これから例で示す人名らしき物はあくまで架空のものだと思ってください。
まずは素の配列のみを使ってそのデータ構造を書いてみます。
</p>

<pre class="prettyprint">
my @zokuseis = qw(萌え メガネ ギーク エロ 嫁あり);
my @miyagawa = qw(萌え ギーク);
my @yusukebe = qw(メガネ エロ);
</pre>
<p>
これをそれぞれの人が持っている属性と予め定義された「@zokuseis」の文字列と比較して、
マッチすれば出力するというプログラムは、
何も考えないでやると以下のようになります。
</p>

<pre class="prettyprint">
# 配列のみを使った場合

for my $zokusei (@zokuseis) {
    if ( grep $zokusei eq $_, @miyagawa ) {
        print &quot;miyagawa is $zokusei \n&quot;;
    }
}

for my $zokusei (@zokuseis) {
    if ( grep $zokusei eq $_, @yusukebe ) {
        print &quot;yusukebe is $zokusei \n&quot;;
    }
}
</pre>
<p>
2個ループがでてきて冗長ですね。
ということでこの部分一つのサブルーチンにまとめてしまいましょう。
</p>

<pre class="prettyprint">
# サブルーチンを使った場合

check_zokusei( 'miyagawa', @miyagawa );
check_zokusei( 'yusukebe', @yusukebe );

sub check_zokusei {
    my $name = shift;
    for my $zokusei (@zokuseis) {
        if ( grep $zokusei eq $_, @_ ) {
            print &quot;$name is $zokusei \n&quot;;
        }
    }
}
</pre>

<p>
ちょっとすっきりしました。
しかし、問題とやりたいことがいくつか。
</p>
<ul>
<li>check_zokuseiサブルーチン内で、@_ は配列の中身全てをコピーしているので、
配列が大きくなった時に無駄である。</li>
<li>check_zokuseiサブルーチンの引数として、第2引数以降の配列全て、つまり一度 shift した後の @_ が
属性名前の配列だとは限らないかもしれない。</li>
<li>データ構造を表す時点で miyagawa, yusukebe といった「名前」を定義したい。</li>
<li>メンバーが増えた時に毎回メソッドを実行するコードを書くのが面倒である。</li>
</ul>
<p>
で、ちょっとぶっ飛ばして、無名リファレンスと呼ばれてる方法で、
データ構造を定義してそれを扱うことにしてみます。
配列の無名リファレンスは [] 、ハッシュの無名リファレンスは {} で表現します。
変数に入れるときは、@ や % を使うのではなく $ つきのスカラー変数に入れます。
これを使うことで、ネストしたデータ構造を記述することができます。
データ定義は以下のようになりました。
</p>

<pre class="prettyprint">

my $members = [
    { name =&gt; 'miyagawa', zokuseis =&gt; [qw(萌え ギーク)] },
    { name =&gt; 'yusukebe', zokuseis =&gt; [qw(メガネ エロ)] },
    { name =&gt; 'nekokak',  zokuseis =&gt; [qw(ギーク 嫁あり)] },
    { name =&gt; 'Yappo',    zokuseis =&gt; [qw(ギーク エロ)] },
    { name =&gt; 'acotie',   zokuseis =&gt; [qw(萌え エロ)] },
];
</pre>

<p>
細かいことは置いといて、これでメンバーがどういう名前で、どのような属性を持っているかが、
一望できるようになりました。
このようにネストしたデータ構造を配列リファレンスとハッシュリファレンスを駆使して、
表現するとヒューマンリーダブルでもありわかりやすいと思います。
</p>
<p>
では、これを先ほどのように属性チェックさせてみます。
まず、配列リファレンスを「デリファレンス」という方法を用いて、素の配列に変換してから、
ループを回しています。スカラー変数名に @ と頭に付ければ、配列にデリファレンスされます。
そして、先ほど定義された無名のハッシュリファレンスをそのまま、
check_zokusei_with_ref に渡しています。
ハッシュの中身へのアクセスは、
$who-&gt;{name} のような形で実現しています。
</p>

<pre class="prettyprint">
for my $member (@$members) {
    check_zokusei_with_ref($member);
}

sub check_zokusei_with_ref {
    my $who = shift;
    for my $zokusei (@zokuseis) {
        if ( grep $zokusei eq $_, @{ $who-&gt;{zokuseis} } ) {
            print &quot;$who-&gt;{name} is $zokusei \n&quot;;
        }
    }
}
</pre>
<p>
最終的に出力は以下のようになりました。
</p>

<pre class="prettyprint">
miyagawa is 萌え
miyagawa is ギーク
yusukebe is メガネ
yusukebe is エロ
nekokak is ギーク
nekokak is 嫁あり
Yappo is ギーク 
Yappo is エロ 
acotie is 萌え 
acotie is エロ 
</pre>

<p>
ということで実例を用いて、素の配列だけで表現していたものを
リファレンスを使ってわかりやすくかつ効率的にデータを扱う方法をかなり駆け足で解説をしてきました。
文法的な部分はしょってますが、
リファレンスというものがなんなのかが多少でもわかれば幸いです。
「これ間違ってるお！」とか「こんなんじゃわかんねーよ！」とかご意見あったらください。
ということでEnjoy!
</p>
]]>
    </content>
</entry>

<entry>
    <title>Perl入門本を書こうとしている話</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/03/073717.html" />
    <id>tag:yusukebe.com,2010://1.2578</id>

    <published>2010-03-02T22:37:17Z</published>
    <updated>2010-03-02T22:40:17Z</updated>

    <summary> あんまこれからやることを書きたくはないと思っていたんだけど、 書いたらよりやる気になると思って書きます。 ていうか書いていいことなのかよくわかりませんが、書き...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
あんまこれからやることを書きたくはないと思っていたんだけど、
書いたらよりやる気になると思って書きます。
ていうか書いていいことなのかよくわかりませんが、書きます。
</p>
<p>
実は、今年の夏発売目標で、Perl入門本を書こうとしています。
某出版社さんから話があったのがきっかけです。
自分はPerlを教えるような立場ではないとは思いつつ、
昔から友達などにプログラミングの楽しさ、特にPerlについてを「うまく」教えたいなとは感じていました。
ということでいい機会なので乗っからせていただいてます。
</p>
<p>
世の中にはいいPerlの入門本があります。
特にオライリーの「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114276/kamawada-22/">初めてのPerl</a>」と「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113059/kamawada-22/">続・初めてのPerl</a>」は、
個人的に最初の一歩を踏み出すいい機会を与えてくれました。
大学に通っていた時に研究室でいらなくなったともらった「初めてのPerl」の初版がまた面白くって！
さらに、「続・初めてのPerl」ではリファレンスの概念がわかって、
そこからかなりPerlに対して納得がいくようになりました。
</p>
<p>
ただ、Perl本はあるとして、数が少ないのと、上記した二つは
「語り口調？が難しいすぎる」という問題があって、これはなかなか取っ付きにくいだろーと思います。
それと他の本はどうしても「Perl＝CGI」というペースで解説が進むものになっていて、
これがシンプルに理解をすることを妨げることになっている感じもします。
</p>
<p>
そこで、基本的には「初めてのPerl」の初版をかなり参考にしながら、CGIはとっぱらって、
自分なりの語り口調で構成案を練っているところです。
基本的なことほど教えるのが難しいと実感しつつ、多くの人に参考になるものしたいと
頑張ろうと思います。
</p>
<p>
以下にその書籍の企画意図みたいなものを書きますので、
それでこれからやろうとしていることがわかると思います。
執筆をする過程でいろいろな方に協力をしてもらう場面あるかもしれませんが、
よろしくお願いします。
</p>
<p>
まぁ、ようは
「自分が好きな人達に自分が好きなことを教えたい」
ってだけなんだけどねっ！
</p>
<p>
以下企画案。
</p>
<p>
Perlは実用的で「使える！」プログラミング言語です。
元々テキスト処理向けに作られた言語であるゆえ、
世の中に多く存在するテキストベースのシステムの管理に強いのが特徴です。
テキストと言えば、Webもその対象の中の一つで、最近ではmixiやlivedoorといった会社が
大規模Webシステムのバックエンドに採用しています。
</p>
<p>
また、テキスト整形やファイルフォーマットの変換など、
日常的に発生する業務おいても有効に活用できる機会が非常に多いです。
そして、Perlは実用的であると同時に「楽しい！」プログラミング言語です。
「TMTOWTDI ... There's More Than One Way To Do It(やり方はいくらでもある)」
というスローガンが表す通り一つのことを叶えるのに様々な記述方法があり、
それゆえに多くのやり方を私たちは見ることができます。
レベルや個人の趣向に応じて様々な楽しみ方があるのです。
</p>
<p>
また、CPANという仕組みにより先人達が作ったモジュールを再利用して楽をすることが可能です。
例えば、日付扱うモジュール、Webページにアクセスするモジュールなど多数存在し、
一から基本的な機能を記述する必要なく素早くシステムの目的に集中してプログラムを組むことができます。
このようにPerlは「使えて」「楽しい」言語なのです。
</p>
<p>
ところが、2010年1月現在、RubyやPythonなどの比較的新しい言語に押され、
Perlという言葉を目にする機会が少なくなってきています。
つまり、Perlはもう古い、ということなのでしょうか。確かに、Perlが古い言語であることは事実です。
しかし、だからといって全てのPerlプログラムが今の時代に合わないということはありません。
いわゆるCGIと呼ばれるプログラムの中には冗長な記述の上、パフォーマンスが悪い例があり、
一昔前に氾濫していたふしがあります。
Perlに対する悪評があるとしたら、その印象が強いからかもしれません。
ただ、Perlでも、しっかりとやり方さえ選べばよりモダンで高負荷にも耐えられるシステムを作ることができます。
</p>
<p>
本書では、現代のシステム開発において冒頭で述べたPerlの「使える！」「楽しい！」といった特徴を多くの方に
享受していただくため、より新しいPerlの入門書として位置づけます。
「やり方はいくらでもある」ために全てを網羅するのはもちろん不可能ですし、
そのような必要もありません。必要最低限のPerlをわかりやすく解説し、Perlの世界への導入としたいと思います。
冒頭ではPerlでのプログラミングの要素を一望できるようにサンプルプログラムを用意し、
簡単な解説をします。そして、後半部分では実用的なプログラムの例を取り上げ、
Perlの「使える！」もしくは「楽しい！」利用方法について紹介したいと思います。
なお、Perl入門本ではよく取り上げられるCGIについては詳しく「扱いません」。
CGIを扱うとPerlプログラムの本質とは離れた部分の説明が多くなるためです。
その代わり、後半部分のサンプルプログラムを掲載する部分で簡単に解説いたします。
さらに、近代の他言語では必須とも言われているオブジェクト指向プログラミングについても
「扱いません」。ただ、オブジェクト、つまりPerlにおけるモジュールの使い方についての記述は
盛り込みます。Perlの入門時においてオブジェクトの作り方までを学ぶとなるとなるとレベルが
本書の想定レベルからは離れるからです。
</p>

]]>
    </content>
</entry>

<entry>
    <title>PHPの小文字から始まる関数が4405個もあってびっくりした件</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/03/055123.html" />
    <id>tag:yusukebe.com,2010://1.2577</id>

    <published>2010-03-02T20:51:23Z</published>
    <updated>2010-03-02T21:17:40Z</updated>

    <summary> #perl-casual@freenode で話題になって、 PHPの関数の 機能をPerlで実現するにはどうすればいいのかの対になったリファレンスが欲しいよ...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
#perl-casual@freenode で話題になって、
PHPの関数の
機能をPerlで実現するにはどうすればいいのかの対になったリファレンスが欲しいよねー
ということになりました。junichiroさんによると需要があるみたいです。
詳しくは<a href="http://blog.yappo.jp/">Yappoさん</a>が書いてくれると思います。
そんで(ちょっとした僕の発言のおかげでWikiHubに迷惑をかけてごめんなさいな感じなのですがすいません＞＜)、
PHPのリファレンスサイトにのってる関数っていったいどんなのがあるんだ！というのを
くまなく調べることをしてみました。
あんまPHPよくわかってないのですが、クラスから派生してるっぽい関数は除きつつ、
小文字から始まる関数名の数を公式サイトから数えてみると、
なんと「4405」個もあったよ！
</p>
<p>
以下がそれを調べるために使えるPerlの簡単なスクレイパースクリプトです。
</p>

<pre class="prettyprint">
use Web::Scraper;
use URI;
my $url = 'http://php.net/manual/ja/indexes.php';
my $scraper = scraper {
    process 'dd.indexentry', 'functions[]' =&gt; 'TEXT';
};
my $res = $scraper-&gt;scrape(URI-&gt;new($url));
my @fs = grep { $_ =~ /^[^A-Z]/ } @{$res-&gt;{functions}};
print $#fs . &quot;\n&quot;;
</pre>
<p>
perldoc perlfuncでPerlの標準関数を調べると数が220個ほど。
ちょっと何を「標準」と呼んだらいいのかPHPの場合わかりかねますが、
リファレンスサイトに載ってるその数と比べるとだいぶー違いますね。
まぁ、Perlの場合は標準でついてくるモジュールの関数を使ったりしますから、
一概に比較はできませんが、言語の違いってのを改めて感じました。
</p>
<blockquote>
<p>
ちょw、この関数使わないだろw
</p>
</blockquote>
<p>
みたいなのもPHPにはあったりしますが、Perlの場合はそれをCPANモジュールで解決してるわけであって、
組み込みの関数でやるかモジュールインスコしてやるかはそれぞれ利点や不都合な点あるわけで...
ただ、Perlの場合は配列を操作する関数であっても、
どちらかというといくつかの関数を組み合わせて目的を達成するのに比べて、
PHPの場合はそれぞれがひとつずつ関数になっている感じは受けました。
僕はやっぱり柔軟なPerlのやり方の方(思想)が好きなーと思います。
自分は、確か、Perlより、PHPの方を最初に触りました。
問題を解決する関数がすぐに見つかればPHPは初心者にとって簡単という印象ですが、
わかってると、少し考えればいかようにも解決ができるPerlの方がいいなという具合です(思想的にね)。
よりスマートなやり方を好めばList::Utilモジュールを使うというような解決策もありますし。
</p>
<p>
いやーでもこんなたくさんあるとは知らなんだです。
まぁ、使う人が気持ちいい言語を使えばいいと思いましたね！
</p>
<ul>
<li><a href="http://php.net/manual/ja/indexes.php">PHP: 関数一覧 - Manual</a></li>
<li><a href="http://wikihub.org/wiki/php-funcref-in-perl">WikiHub :: php-funcref-in-perl :: README</a></li>
</ul>]]>
    </content>
</entry>

<entry>
    <title>Perl初心者向け勉強会(by カジュアルPerl)をやりますという予告</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/02/144218.html" />
    <id>tag:yusukebe.com,2010://1.2576</id>

    <published>2010-03-02T05:42:18Z</published>
    <updated>2010-03-02T05:43:30Z</updated>

    <summary> 今朝、「そろそろ...」とJapan Perl Association会長の牧さんからTwitterで声をかけられて、 一応企画のドラフトまで作りました。 そ...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[
<p>
今朝、「そろそろ...」と<a href="http://japan.perlassociation.org/jpa">Japan Perl Association</a>会長の牧さんからTwitterで声をかけられて、
一応企画のドラフトまで作りました。
それはどういうことかというと...。
<a href="http://perl-casual.org/">カジュアルPerl</a>のイベントとしてJPAの協力？にて「Perl初心者向け勉強会」を開催します！
予定ですが、日程は4/21(水曜日)19:00-21:00で、場所はおそらく初台のどこかになると思います。
最後にドラフトのプログラム原稿を貼付けておきますが、
テーマが「CPANとエディタ」となっております。
「CPANってなんぞー」という方を含め、少しでもPerlを勉強したいと思っている方に参加してもらいたいと思います。
内容は、スペシャルゲスト(世界のmさん予定があえば)を含め4人の方を講師に迎え、
それぞれライブコーディングを含めた講義？っぽい発表をみんなで聴くという形になります。
Perlは初心者向けの勉強会が非常に少ないというかそんなの聞いたことないので、
いい機会になればと思っています。
なるべく、常連なPerlerメンツにならないように参加資格を初心者向けに設定し、
ATNDで近日募集を開始しますので、よろしくお願いいたします。
何かご意見あれば、はてなブックマークなりTwitterなりでコメントくれればできる限り反映、リプライしたいと思います。
</p>

<script src="http://gist.github.com/319076.js?file=casual_talks_02.txt"></script>
]]>
    </content>
</entry>

<entry>
    <title>Twitterの友達が好きなアーティストがわかっちゃったりする「音探し」を作ってみた</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/03/01/203009.html" />
    <id>tag:yusukebe.com,2010://1.2575</id>

    <published>2010-03-01T11:30:09Z</published>
    <updated>2010-03-01T11:31:24Z</updated>

    <summary> 「気になるアーティストの人気な曲のYouTube動画を連続再生してくれて、 さらにテイスト似ているアーティストも提案してくれるから音楽探すのにぴったりだね」 ...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="研究・制作活動" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="twitteryoutube" label="twitter youtube" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
「気になるアーティストの人気な曲のYouTube動画を連続再生してくれて、
さらにテイスト似ているアーティストも提案してくれるから音楽探すのにぴったりだね」
という自分が欲しい機能を満たすシンプルなサービスを作ってみました。
ってのが最初の目的でしたが、機能をこれに追加して、一応目玉としては
「Twitterログイン(OAuthという仕組み)すると、自分がフォローしている一部の人が大好きな
アーティストがわかっちゃうかも！」というサービスになりました。
名前は「<a href="http://otosagashi.pulpsite.net/">音探し</a>」です。
</p>
<p>
<span class="hatena-bookmark-title"><a href="http://otosagashi.pulpsite.net/">音探し</a></span> <span class="hatena-bookmark-users"><a href="http://b.hatena.ne.jp/entry/otosagashi.pulpsite.net/"><img src="http://b.hatena.ne.jp/entry/image/http://otosagashi.pulpsite.net/" alt="音探し" title="音探し"></a></span> <span class="hatena-bookmark-b-mark"><a href="http://b.hatena.ne.jp/entry/otosagashi.pulpsite.net/"><img src="http://b.st-hatena.com/images/b_entry.gif" alt="音探し" title="音探し"></a></span> <span class="hatena-bookmark-b-ex-mark"><a href="http://b.hatena.ne.jp/my/add.confirm?url=http%3A%2F%2Fotosagashi.pulpsite.net%2F"><img src="http://b.st-hatena.com/images/append.gif" alt="このエントリーをはてなブックマークに追加" title="このエントリーをはてなブックマークに追加"></a></span><br />
<img src="http://yusukebe.com/archives/files/100301/otosagashi01.jpg" alt="otosagashi" />
</p>

<p>
こちらのスクリーンショットがアーティストページ。
そのアーティストの人気トラックが連続再生できるのでBGMにぴったりかも。
</p>
<p>
<img src="http://yusukebe.com/archives/files/100301/otosagashi02.jpg" alt="otosagashi" />
</p>
<p>
そして、次がトップページからTwitterログインしてからのお友達が「loves」なアーティストが
わかっちゃうというページです。
意外なアーティストを好きだったり、やっぱりこの人このアーティスト好きなんだというのがわかったりと
結構面白いです。
</p>
<p>
<img src="http://yusukebe.com/archives/files/100301/otosagashi03.jpg" alt="otosagashi" />
</p>
<p>
お分かりの人はお分かりの通り、Last.fmの機能をそのままAPI経由で使っています。
似たサービスがあると思うのですが、
日本語のシンプルなインターフェースがなかったので作ってみました。
ということでEnjoy!
</p>
]]>
    </content>
</entry>

<entry>
    <title>Twitterで話題のYouTube動画が一目でわかるTubetter - ツベッターを作ってみた</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/02/28/211103.html" />
    <id>tag:yusukebe.com,2010://1.2574</id>

    <published>2010-02-28T12:11:03Z</published>
    <updated>2010-02-28T12:12:11Z</updated>

    <summary> Twitter上で多くつぶやかれているYouTube動画がぱっとわかって、すぐ見れて、 さらにTwitter OAuthログインをすれば映像を見ながらそれにつ...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="研究・制作活動" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="twitteryoutube" label="twitter youtube" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
Twitter上で多くつぶやかれているYouTube動画がぱっとわかって、すぐ見れて、
さらにTwitter OAuthログインをすれば映像を見ながらそれについてツイートできちゃうという
「<a href="http://tubetter.pulpsite.net/">Tubetter - ツベッター</a>」というサイトを作ってみました。
</p>

<p>
<span class="hatena-bookmark-title"><a href="http://tubetter.pulpsite.net/">Tubetter - Twitterと一緒にYouTubeを楽しもう</a></span> <span class="hatena-bookmark-users"><a href="http://b.hatena.ne.jp/entry/tubetter.pulpsite.net/"><img src="http://b.hatena.ne.jp/entry/image/http://tubetter.pulpsite.net/" alt="Tubetter - Twitterと一緒にYouTubeを楽しもう" title="Tubetter - Twitterと一緒にYouTubeを楽しもう"></a></span><br />
<a href="http://tubetter.pulpsite.net/">
<img src="http://yusukebe.com/archives/files/100228/tubetter.jpg" alt="tubetter" />
</a>
</p>

<p>
拙作、Twitter上での人気URLを集める
<a href="http://twib.jp/">Twib</a>のYouTube特化版のようなものです。
だったら、Twib上でやれよって感じですが、ちょっとシステム的にそちらの方はあまり手を加えたくないという理由もありTubetterができました。
</p>
<p>
現在ページを見ると、チリ地震による津波の影響で<a href="http://tubetter.pulpsite.net/v/9iq9zoQZgwk">津波を実際に撮影した映像が今「435tweets」と多くつぶやかれていることがわかります</a>(作りが甘いのでこのページがちと重いのはあとで直します)。
この「435tweets」というかなり多くのサンプル数はTwitterの利用頻度の高まりや気軽さを示しているかもしれませんね。実際同じ動画のはてなブックマークの数を比べてみると、それは、現在「30users」と比べようがありません。多くの人のツイートを見ながら動画を拝見するとまた違った楽しみ方があると思います。
</p>
<p>
Twibと違う方法でTwitterの情報を取得している件で、今回はこのようにより多くの「tweets」を表示させることが可能になりました。
通常ですとTwitter公式のAPIから「youtube」というような検索クエリを発行してツイートを収集するわけですが、短縮URLの問題や取りこぼしが非常に多いという問題が存在しています。
しかし、Tubetterの場合は一部の動画、特に人気の高い動画のURLに関しては、
<a href="http://topsy.com/">topsy</a>というサービスのAPIを使うことにより取りこぼしが少なくっています。
topsyこそTwibのようにTwitter上でつぶやかれたURLを収集しランキングをつけて検索可能にした海外のサービスです。
APIの性質がリアルタイム性のあるTwitter公式のものとは違い、とあるURLに対する「反応」としてツイートを扱っているので、今回のようなサービスにはある程度適して使うことができているみたいです。
</p>
<p>
ちなみにtopsyのAPIを使っていたら、見たことがあるエラー画面出てきて、
</p>
<blockquote>
<p>
ちょw、Catalystのデフォルトエラーが画面じゃんwww
</p>
</blockquote>
<p>
って思ったところmiyagawaさんによれば、彼らはPerlガイとのこと。
ということでCatalystアプリからCatalyst製のAPIをこれでもかと叩かせていただいています。
</p>
<p>
ちょっとまだ作りが甘かったり、重かったりしてますが、様子をみて
改善しますので、よろしくお願いします。
Enjoy!
</p>

<ul>
  <li><span class="hatena-bookmark-title"><a href="http://tubetter.pulpsite.net/">Tubetter - Twitterと一緒にYouTubeを楽しもう</a></span> <span class="hatena-bookmark-users"><a href="http://b.hatena.ne.jp/entry/tubetter.pulpsite.net/"><img src="http://b.hatena.ne.jp/entry/image/http://tubetter.pulpsite.net/" alt="Tubetter - Twitterと一緒にYouTubeを楽しもう" title="Tubetter - Twitterと一緒にYouTubeを楽しもう"></a></span></li>
</ul>]]>
    </content>
</entry>

<entry>
    <title>CatalystアプリケーションをStarmanで運用しよう！</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/02/17/142334.html" />
    <id>tag:yusukebe.com,2010://1.2573</id>

    <published>2010-02-17T05:23:34Z</published>
    <updated>2010-02-17T06:54:46Z</updated>

    <summary> Starmanというmiyagawaさんが目下開発中のPerl製Webサーバがあります。 PSGIをサポートして高速であることが特徴です。 おとといにバージョ...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="catalyst" label="catalyst" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plack" label="plack" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[
<p>
<a href="http://github.com/miyagawa/Starman">Starman</a>というmiyagawaさんが目下開発中のPerl製Webサーバがあります。
PSGIをサポートして高速であることが特徴です。
おとといにバージョン0.1000がCPANにアップロードされたばかりという新しいものですが、
とあるエロサイトでStarmanを導入したので、その件について
書いてみたいと思います。
ちなみにStarmanについては日本語のドキュメントがほとんどなく、
全体を通して間違ったこと言ってる可能性あるのでツッコミ歓迎です。
</p>
<p>
PSGI/Plackが熱いと言われる昨今ですが、
miyagawaさんが口を酸っぱく言うように
「PlackはWebアプリケーションフレームワーク」ではなく、
今まで使っていたWAFをPlackが騒がれているからといってそれに置き換える必要はないということを
最初に記しておきます。
自分もPlackを使ってWAFもどきを作っていますが、
大抵のWebアプリに関してはCatalystを使っています。
Catalystはもちろん個人差がありますが一度慣れると開発が非常にしやすいので大好きです。
</p>
<p>
てなわけで、例に挙げるとある一番アクセスの多いエロサイトはCatalystで開発しています。
で、今回注目したいのはそのアプリケーションのデプロイの仕方です。
皆さん、Catalystアプリはどのように運用してますでしょうか？
僕は Apache + mod_perl ( Catalyst::Engine::Apache ) というパターンがほとんどです。
中には Lighttpd + FastCGI という組み合わせの方もいるかと思います。
おそらくそれで満足できるものかと思いますし、自分も Apache + mod_perl そして、
フロントに別の Apache を置いて静的コンテンツをサーブさせるというやり方で十分です。
しかし、新しモノ、それにPSGI、Perl製、高速、Starmanという響きに釣られ、
この度、Catalystアプリを Starman で動かすということにチャレンジしてみました。
</p>
<p>
まずは簡易なベンチマークをとってみましたという報告から。
実際に運用しているApache + mod_perlという環境と、
Starmanで立ち上げた場合、どちらがどれだけ高速か？
そのとあるエロサイトを対象にし、同じworker数になるように調節し、
ab でベンチマークをとると、細かい部分を抜きにして、以下の結果がでました
（そもそものアプリが遅いというのはおいといてね）。
</p>

<pre class="prettyprint">
Apache + mod_perl - Requests per second:    3.18 [#/sec] (mean)
Starman           - Requests per second:    4.43 [#/sec] (mean)
</pre>

<p>
Starmanの方が約140% fasterです。
メモリ消費量はそれほど変わりません。
(*追記: CoWで共有されているメモリがあるのでworkerの実消費メモリをみたら少なくなってました＞＜ )
ということでワクワクしながら早速本番投入してみます。
</p>

<p>
とその前に、CatalystアプリをStarmanで動かす手順について説明します。
StarmanはPSGIをサポートするので、最初にCatalystをPSGI互換にしましょう。
といっても、簡単で「Catalyst::Engine::PSGI」をインストールし、
Helperスクリプトで
</p>

<pre class="prettyprint">
$ script/myapp_create.pl PSGI
</pre>

<p>
とするだけで、plackupで起動可能な.psgiができます。
つまりCatalystアプリのPSGI化ができたことになり、
上記したWAFを変える必要はないということがなんとなくわかる気がします。
plackupコマンドでももちろん起動できますし、Starmanを入れると
</p>

<pre class="prettyprint">
$ starman myapp.psgi
</pre>

<p>
とすれば、starmanでCatalystアプリが起動します。
ちなみに現状のStarmanはPlackの開発版リリースを入れないと動かないのでご注意。
</p>
<p>
おし、これでCatalystアプリがStarmanで起動したぜ、ってことで、
いよいよ本番投入への準備です。
フロントサーバを構え、Starmanはリバースプロキシとして動作させたいので、
「Plack::Middleware::ReverseProxy」を.psgiで使い設定しましょう。
最終的にはこんな感じの.psgiになりました。
</p>

<pre class="prettyprint">
use Plack::Builder;
use XXX::Web;

XXX::Web-&gt;setup_engine('PSGI');
my $app = sub { XXX::Web-&gt;run(@_) };

builder {
    enable_if { $_[0]-&gt;{REMOTE_ADDR} eq '192.168.1.xxx' }
        &quot;Plack::Middleware::ReverseProxy&quot;;
            $app;
};
</pre>

<p>
最後にstarmanコマンドを使ってお好きなポート、お好きなworkerの数でサーバを起動します。
Plack::Standalone::Server::Prefork::Server::Starter を運用する時のように、
daemontoolsでプロセスを管理することにしました。
</p>

<pre class="prettyprint">
exec 2&gt;&amp;1
cd /home/yusuke/www/pulpsite/xxx || exit 1
exec /usr/bin/setuidgid www-data /usr/local/bin/starman \
--workers 20 --port 8080 ./xxx.psgi
</pre>

<p>
こんな感じの run スクリプトを書いて、それが入ったディレクトリを /services へシンボリックリンク張れば、
起動開始。
無事、今まで Apache で運用していたものとリプレースが済みました。
</p>
<p>
今回は実験的なサービスに、ということで早速Starmanを導入してみました。
今のところいい感じなので、しばらく様子をみたいと思います。
まだ、でてきたばかりのソフトウェアですが、
よろしければ参考にして使ってみてください。
</p>
<p>
PS.<br />
今度発売されるWEB+DB PRESSにはmiyagawaさんによるPSGI/Plack特集が載るらしいよ！
</p>

<div><div style="float:left"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774141593/kamawada-22/"><img src="http://ecx.images-amazon.com/images/I/61NVAApNjAL._SL160_.jpg"  alt="WEB+DB PRESS Vol.55" style="border:none;"/></a></div><div style="float:left;margin-left:15px;"><div style="font-size:12pt"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774141593/kamawada-22/">WEB+DB PRESS Vol.55</a></div><div style="font-size:7pt;font-family:verdana;">posted with <a href="http://yusukebe.com/b/amazon/search/">yusukebe.com::AmazonSearch</a> on 2010.2.17</div><div style="font-size:10pt;"><ul style="list-style-type:none;padding:0;"><li>WEB+DB PRESS編集部  </li><li>大型本 / 技術評論社 </li><li>Amazon 売り上げランキング: 789</li></ul></ul><a href="http://www.amazon.co.jp/WEB-DB-PRESS-Vol-55-PRESS%E7%B7%A8%E9%9B%86%E9%83%A8/dp/4774141593%3FSubscriptionId%3D0VEY2A9SVSFB81NQ9HG2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774141593">Amazon.co.jpで詳細を見る</a></div></div><div style="clear:left;"></div></div>]]>
    </content>
</entry>

<entry>
    <title>3/5 Yokohama.pm #5 が開催されます</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/02/16/094857.html" />
    <id>tag:yusukebe.com,2010://1.2572</id>

    <published>2010-02-16T00:48:57Z</published>
    <updated>2010-02-16T00:49:49Z</updated>

    <summary> Perl大好き！横浜大好き！どっちも、もしくはそのどちらかに該当したあなた！ 是非Yokohama.pm #5に参加してみてください。 2010年最初のYok...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="コミュニティ" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="yokohamapm" label="yokohama.pm" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
Perl大好き！横浜大好き！どっちも、もしくはそのどちらかに該当したあなた！
是非Yokohama.pm #5に参加してみてください。
2010年最初のYokohama.pmは3月5日です。
</p>
<p>
<b>*Yokohama.pmとは？</b>
<p>
<p>
というかそもそも「.pm」とは、perl-mongersの略で、
基本的にとある地域におけるPerlのユーザーコミュニティ。
Perl猿達。なので、YokohamaのPerl猿達という意味。
誰でもウェルカムな雰囲気でかつYokohamaのお洒落な人達が集まっています！
</p>
<p>
一般募集を受けて付けています。
僕は、発表する場合、「お口ディテクトのコツ」もしくは「エロサイト管理者の憂鬱3」をお届けしたいと
思います。
</p>
<ul>
  <li><a href="http://atnd.org/events/3180">Yokohama.pm #5 参加者募集 : ATND</a></li>
</ul>]]>
    </content>
</entry>

<entry>
    <title>オススメのIRCチャンネルを教えてください＠人力検索はてな</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/10/02/14/225554.html" />
    <id>tag:yusukebe.com,2010://1.2571</id>

    <published>2010-02-14T13:55:54Z</published>
    <updated>2010-02-14T14:22:50Z</updated>

    <summary> 某雑誌にIRCのことを書いていて（IRC自体古いんじゃない？とかってのはまぁ置いといて）、 オススメのIRCチャンネルを紹介したいなーと思いつつ、 Perl系...</summary>
    <author>
        <name>yusukebe</name>
        <uri>http://yusukebe.com</uri>
    </author>
    
        <category term="技術の話" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>
某雑誌にIRCのことを書いていて（IRC自体古いんじゃない？とかってのはまぁ置いといて）、
オススメのIRCチャンネルを紹介したいなーと思いつつ、
Perl系のチャンネルしか知らないことに気づいたので #coderepos とかで質問しまくりながら
（ご協力ありがとうございます）、
（初めて？か久しぶりに）人力検索はてなで質問してみてるよー
</p>
<p>
特に各言語別のオススメIRCチャンネルを知りたいので、
よかったら解答お願いします。
</p>

<ul>
<li><a href="http://q.hatena.ne.jp/1266152443">某雑誌のIRC特集について原稿書いてます。 各言語別のオススメIRCチャンネルがあったら教えてください。 特にRuby, PHP, Python あたりが知りたいです。 Perlの例: ・#plac.. - 人力検索はてな</a></li>
</ul>]]>
    </content>
</entry>

</feed>
