<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel rdf:about="http://blog.livedoor.jp/xaicron/">
<title>にひりずむ::しんぷる</title>
<link>http://blog.livedoor.jp/xaicron/</link>
<description>正確性の欠如したプログラミング関連のことを
適当に記述していくブログ - xaicron
</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="http://blog.livedoor.com/?v=2.0" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<items>
 <rdf:Seq>
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53666280.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53663328.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53557385.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53522762.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53514791.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53380670.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53367118.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53323815.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53284031.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53277465.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53273473.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53251833.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53229780.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53181958.html" />
  <rdf:li rdf:resource="http://blog.livedoor.jp/xaicron/archives/53091000.html" />
 </rdf:Seq>
</items>
</channel>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53666280.html">
<title>Data::Dumper と Data::Dump の実行速度の違い</title>
<link>http://blog.livedoor.jp/xaicron/archives/53666280.html</link>
<description>
Data::Dump はデフォルトでそれなりに整形して表示してくれるのと、コンテキストを見てよしなに処理を変えてくれるので、スクリプトのデバッグなどに使うのはまぁまぁ便利だったりします。


が、この子は PurePerl で実装されているので実行速度が結構遅いです。


どのく...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2012-02-11T04:12:12+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
<a href="https://metacpan.org/module/Data::Dump">Data::Dump</a> はデフォルトでそれなりに整形して表示してくれるのと、コンテキストを見てよしなに処理を変えてくれるので、スクリプトのデバッグなどに使うのはまぁまぁ便利だったりします。
</p>
<p>
が、この子は PurePerl で実装されているので実行速度が結構遅いです。
</p>
<p>
どのくらい遅いかというと
</p>
<pre>
<span class="res">use</span> strict;
<span class="res">use</span> warnings;
<span class="res">use</span> Benchmark <span class="qot">qw(cmpthese :hireswallclock)</span>;
<span class="res">use</span> Data::Dump ();
<span class="res">use</span> Data::Dumper ();

<span class="res">my</span> <span class="var">$data</span> = {
    <span class="bre">foo</span> => [<span class="qot">qw/bar/</span>],
    <span class="bre">bar</span> => {
        <span class="bre">hoge</span> => <span class="qot">'piyo'</span>,
    },
    <span class="bre">heavy</span> => So::Heavy::Object->new(10),
};

cmpthese <span class="bre">-1</span>, {
    <span class="qot">'Data::Dump'</span> => <span class="res">sub</span> {
        <span class="res">my</span> <span class="var">$res</span> = Data::Dump::dump(<span class="var">$data</span>);
    },
    <span class="qot">'Data::Dumper'</span> => <span class="res">sub</span> {
        <span class="res">my</span> <span class="var">$res</span> = Data::Dumper::Dumper(<span class="var">$data</span>);
    },
}, <span class="qot">'all'</span>;

<span class="res">package</span> So::Heavy::Object;

<span class="res">sub</span> new {
    <span class="res">my</span> (<span class="var">$class</span>, <span class="var">$depth</span>) = <span class="var">@_</span>;
    <span class="res">bless</span> [ <span class="var">$depth</span>, <span class="var">$depth</span> ? <span class="var">$class</span>->new(--<span class="var">$depth</span>) : () ], <span class="var">$class</span>;
}
</pre>

<p>
こんなのを実行すると、
</p>
<pre class="term">
Benchmark: running Data::Dump, Data::Dumper for at least 1 CPU seconds...
Data::Dump: 1.09744 wallclock secs ( 1.09 usr  0.00 sys +  0.00 cusr  0.00 csys =  1.09 CPU) @ 1644.04/s (n=1792)
Data::Dumper: 1.0532 wallclock secs ( 1.05 usr  0.00 sys +  0.00 cusr  0.00 csys =  1.05 CPU) @ 10240.00/s (n=10752)
                Rate   Data::Dump Data::Dumper
Data::Dump    1644/s           --         -84%
Data::Dumper 10240/s         523%           --
</pre>

<p>
こんくらいの差がでる。
</p>
<p>
Web アプリケーションなどで log を出す場合には、Data::Dumper を使ったほうがオーバーヘッドが少ないし、
</p>
<pre>
<span class="res">local</span> <span class="var">$Data::Dumper::Terse</span>  = 1;
<span class="res">local</span> <span class="var">$Data::Dumper::Indent</span> = 0;
<span class="res">local</span> <span class="var">$Data::Dumper::Pair</span>   = <span class="qot">'=>'</span>;
</pre>

<p>
みたいにすると一行にみっちりと詰まって出るのでよいですね。インデントとか余計な物が消えて、出力される文字の量が減るので実行速度も若干上がるし<span class="footnote"><a title="上の例だと 12000/s ぐらいになる" name="zZBfDtOtMe_fn1" href="#zZBfDtOtMe_f1">*1</a></span>、ディスク容量の削減にもつながってハッピーです。
</p>
<p>
ただし、<code> $Data::Dumper::Useqq = 1 </code> とかするとかなり遅くなるので注意が必要。
<br />改行されたデータが食わされる可能性があったら使わざるを得ないかもしれませんが。
</p>
<p>
あと、あんまり関係ないけどテストとかで Data::Dumper とかを使ってるコードをたまに見かけますが
</p>
<pre>
<span class="res">use</span> Test::More;
<span class="res">use</span> Data::Dumper;

<span class="comment"># do something...</span>

<span class="res">warn</span> <span class="bre">Dumper</span> <span class="var">$data</span>

<span class="comment"># do something...</span>
</pre>

<p>
これは
</p>
<pre>
<span class="res">use</span> Test::More;
<span class="comment"># do something...</span>

note <span class="bre">explain</span> <span class="var">$data</span>;

<span class="comment"># do something...</span>
</pre>

<p>
みたいに<code> note explain {expr} </code>構文を使っとくと捗りますね。
<br />別にどっちでもいいんですけど。
</p>
<div class="titlebody"><h3 class="title">まとめ</h3></div>

<p>
素直に <a href="https://metacpan.org/module/Log::Minimal">Log::Minimal</a> を使っておけばこのへんのこと考える必要が無いのでハッピーですね。
</p><div class="footnote">
<ul>
    <li><a name="zZBfDtOtMe_f1" href="#zZBfDtOtMe_fn1">*1</a> : 上の例だと 12000/s ぐらいになる</li>
</ul>
</div>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53666280" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53663328.html">
<title>復数のカラムでソート</title>
<link>http://blog.livedoor.jp/xaicron/archives/53663328.html</link>
<description>
意外とみんな知らない感じなのかな。そして使う機会が滅多にないので知らなくてOK。


use strict;
use warnings;
use 5.12.1;
use Data::Dumper;

my @data = (
   ['nekokak', '1130', '1900'],
   ['nekokak', '1000', '1800'],
   ['zigorou', '1230', '2000'],
   ['zi...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2012-02-10T01:06:57+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
意外とみんな知らない感じなのかな。そして使う機会が滅多にないので知らなくてOK。
</p>
<pre>
<span class="res">use</span> strict;
<span class="res">use</span> warnings;
<span class="res">use</span> 5.12.1;
<span class="res">use</span> Data::Dumper;

<span class="res">my</span> <span class="var">@data</span> = (
   [<span class="qot">'nekokak'</span>, <span class="qot">'1130'</span>, <span class="qot">'1900'</span>],
   [<span class="qot">'nekokak'</span>, <span class="qot">'1000'</span>, <span class="qot">'1800'</span>],
   [<span class="qot">'zigorou'</span>, <span class="qot">'1230'</span>, <span class="qot">'2000'</span>],
   [<span class="qot">'zigorou'</span>, <span class="qot">'1130'</span>, <span class="qot">'2100'</span>],
   [<span class="qot">'xaicron'</span>, <span class="qot">'1300'</span>, <span class="qot">'2200'</span>],
   [<span class="qot">'xaicron'</span>, <span class="qot">'1400'</span>, <span class="qot">'2330'</span>],
);

<span class="var">$Data::Dumper::Terse</span>  = 1;
<span class="var">$Data::Dumper::Indent</span> = 0;
<span class="res">say</span> <span class="res">join</span> <span class="qot">"\n"</span>, <span class="bre">Dumper</span> <span class="res">sort</span> {
    <span class="var">$a</span>->[0] <span class="res">cmp</span> <span class="var">$b</span>->[0] <span class="res">or</span> <span class="var">$b</span>->[1] <=> <span class="var">$a</span>->[1] 
} <span class="var">@data</span>;
</pre>

<p>
復数の条件でソートしたい場合は、<code>or</code> で連結していけばよい。
</p>
<p>
<code> perldoc -f sort </code> するといろんなレシピがあって結構楽しいです。
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53663328" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53557385.html">
<title>親プロセスと子プロセスでデータを送受信する方法のメモ</title>
<link>http://blog.livedoor.jp/xaicron/archives/53557385.html</link>
<description>
大体いつもスクラッチで書いてて忘れるのでメモ。

pipe を使う場合


pipe() とか socketpair() とか色々方法はあるけど、素直に IO::Pipe 使っとくと簡単便利。コアモジュールですし。


use strict;
use warnings;
use IO::Pipe;

my $pipes    = [];
my $children = [];...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2012-01-11T22:44:53+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
大体いつもスクラッチで書いてて忘れるのでメモ。
</p>
<div class="titlebody"><h3 class="title">pipe を使う場合</h3></div>

<p>
<code>pipe()</code> とか <code>socketpair()</code> とか色々方法はあるけど、素直に IO::Pipe 使っとくと簡単便利。コアモジュールですし。
</p>
<pre>
<span class="res">use</span> strict;
<span class="res">use</span> warnings;
<span class="res">use</span> IO::Pipe;

<span class="res">my</span> <span class="var">$pipes</span>    = [];
<span class="res">my</span> <span class="var">$children</span> = [];
<span class="res">for</span> <span class="res">my</span> <span class="var">$i</span> (1..10) {
    <span class="res">push</span> <span class="var">@$pipes</span>, <span class="res">my</span> <span class="var">$pipe</span> = IO::Pipe->new;
    <span class="res">my</span> <span class="var">$pid</span> = <span class="res">fork</span>;
    <span class="res">if</span> (<span class="var">$pid</span>) {
        <span class="comment"># parent</span>
        <span class="var">$pipe</span>->reader;
        <span class="res">push</span> <span class="var">@$children</span>, <span class="var">$pid</span>;
        <span class="res">next</span>;
    }
    <span class="comment"># child</span>
    <span class="res">die</span> $! <span class="res">unless</span> <span class="res">defined</span> <span class="var">$pid</span>;
    <span class="var">$pipe</span>->writer;
    <span class="res">print</span> {<span class="var">$pipe}</span> <span class="qot">"pid: $$, index: <span class="var">$i</span>\n"</span>;
    <span class="res">exit</span>;
}

<span class="res">for</span> <span class="res">my</span> <span class="var">$pid</span> (<span class="var">@$children</span>) {
    <span class="res">waitpid</span>(<span class="var">$pid</span>, 0);
}

<span class="res">for</span> <span class="res">my</span> <span class="var">$pipe</span> (<span class="var">@$pipes</span>) {
    <span class="res">print</span> <<span class="var">$pipe</span>>;
}
</pre>

<p>
この書き方だと、すべての子プロセスの終了を待ってから初めて親プロセスで読み込みを始めているけど、<code>use POSIX 'wait_h'</code> して <code>waitpid(-1, WNOHANG)</code> すれば終わった奴から読み込めるはず。
</p>
<div class="titlebody"><h3 class="title">ファイルに書く場合</h3></div>

<p>
pipe だと、送受信できるサイズに限界があるので、ファイルを使ったほうが巨大なデータを送る場合は安全。
</p>
<pre>
<span class="res">use</span> strict;
<span class="res">use</span> warnings;
<span class="res">use</span> File::Temp <span class="qot">qw(tempdir)</span>;
<span class="res">use</span> File::Slurp <span class="qot">qw(write_file read_file)</span>;

<span class="res">my</span> <span class="var">$tmpdir</span> = <span class="bre">tempdir</span> <span class="bre">CLEANUP</span> => 1;

<span class="res">my</span> <span class="var">$children</span> = [];
<span class="res">for</span> <span class="res">my</span> <span class="var">$i</span> (1..10) {
    <span class="res">my</span> <span class="var">$pid</span> = <span class="res">fork</span>;
    <span class="res">if</span> (<span class="var">$pid</span>) {
        <span class="comment"># parent</span>
        <span class="res">push</span> <span class="var">@$children</span>, <span class="var">$pid</span>;
        <span class="res">next</span>;
    }
    <span class="comment"># child</span>
    <span class="res">die</span> $! <span class="res">unless</span> <span class="res">defined</span> <span class="var">$pid</span>;
    <span class="bre">write_file</span> <span class="qot">"<span class="var">$tmpdir</span>/$$"</span>, <span class="qot">"pid: $$, index: <span class="var">$i</span>\n"</span>;
    <span class="res">exit</span>;
}

<span class="res">for</span> <span class="res">my</span> <span class="var">$pid</span> (<span class="var">@$children</span>) {
    <span class="res">waitpid</span>(<span class="var">$pid</span>, 0);
    <span class="res">print</span> <span class="bre">read_file</span> <span class="qot">"<span class="var">$tmpdir</span>/<span class="var">$pid</span>"</span>;
}
</pre>

<p>
pipe の時と基本的な書き方は変わらない。pid 毎にファイルを作っておいたほうが何かと便利かもってぐらい。
</p>
<p>
ちなみに pipe もファイルも単なるバイト列しか送受信できないので、データ構造を送りたい場合はなんかしらのシリアライザーを使う必要がある。JSON とか Data::MessagePack とかそのへん。
</p>
<div class="titlebody"><h3 class="title">Parallel::ForkManager の場合</h3></div>

<p>
ちなみに、Parallel::ForkManager 0.7.6 からは、<code>run_on_finish()</code> で子プロセスからデータを受信できる。
<br />実際には、子プロセスの <code>finish()</code> のタイミングで pid 毎にファイルに <code>Storable::store()</code> して、親プロセスでは <code>Storable::retrieve()</code> しているので、さっき書いたようなことと一緒。
</p>
<pre>
<span class="res">use</span> strict;
<span class="res">use</span> warnings;
<span class="res">use</span> Parallel::ForkManager 0.7.6;
<span class="res">use</span> Data::Dumper;

<span class="res">my</span> <span class="var">$pm</span> = Parallel::ForkManager->new(3);
<span class="var">$pm</span>->run_on_finish(<span class="res">sub</span> {
    <span class="res">my</span> (<span class="var">$pid</span>, <span class="var">$exit_code</span>, <span class="var">$ident</span>, <span class="var">$exit_signal</span>, <span class="var">$core_dump</span>, <span class="var">$data</span>) = <span class="var">@_</span>;
    <span class="res">print</span> <span class="bre">Dumper</span> <span class="var">$data</span>;
});
<span class="res">for</span> <span class="res">my</span> <span class="var">$i</span> (1..10) {
    <span class="var">$pm</span>->start <span class="res">and</span> <span class="res">next</span>;
    <span class="var">$pm</span>->finish(<span class="bre">0</span>, { <span class="bre">pid</span> => $$, <span class="res">index</span> => <span class="var">$i }</span>);
}

<span class="var">$pm</span>->wait_all_children;
</pre>

<div class="titlebody"><h3 class="title">まとめ</h3></div>

<p>
プロセス間通信ってめんどいですね。
</p>
<p>
ちなみに、ここに書いてあるプログラムはエラーハンドリングとかシグナルとか考慮してないし、いろいろとあれです。親プロセスから子プロセスに書きこむやつとか書いてないし。めんどいから DBD::SQLite っていうのもありですね。
</p>
<p>
あと、別に fork したいんじゃなくて並列処理をしたくてその結果を受け取りたいんだぜって場合は Coro::Channel とか使うとシンプルに書けるんじゃないかと思います。
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53557385" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53522762.html">
<title>2011年まとめ</title>
<link>http://blog.livedoor.jp/xaicron/archives/53522762.html</link>
<description>
そろそろ元旦も開けて落ち着いた感もあるのでまとめておこう。


1月

エロ画像を収集してた

2月

Furl をいじりだした

3月

Kagura っていう　WAF を書いてた
地震で漫画がすべて本棚から落ちる

4月

Amazon.co.uk で 攻殻機動隊全部揃えた (まだ観終わってない)
Sub::R...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2012-01-02T13:07:54+09:00</dc:date>
<dc:subject>Diary</dc:subject>
<content:encoded><![CDATA[<p>
そろそろ元旦も開けて落ち着いた感もあるのでまとめておこう。
</p>
<ul>
<li>1月</li>
<ul>
<li>エロ画像を収集してた</li>
</ul>
<li>2月</li>
<ul>
<li>Furl をいじりだした</li>
</ul>
<li>3月</li>
<ul>
<li>Kagura っていう　WAF を書いてた</li>
<li>地震で漫画がすべて本棚から落ちる</li>
</ul>
<li>4月</li>
<ul>
<li>Amazon.co.uk で 攻殻機動隊全部揃えた (まだ観終わってない)</li>
<li>Sub::Retry にパッチ送った</li>
<li>CPAN モジュールガイド購入</li>
</ul>
<li>5月</li>
<ul>
<li>dotcloud が始まったりした</li>
<li>Yokohama.pm#7</li>
<li>DNS とか調べてたっぽい</li>
<li>atsort コマンド作成</li>
</ul>
<li>6月</li>
<ul>
<li>perl segv golf</li>
<li>クリスマス</li>
<li>WEB+DB Press vol.63 に記事が載った</li>
</ul>
<li>7月</li>
<ul>
<li>App::envfile 書いた</li>
<li>Test::Flatten 書いた</li>
<li>Furl に執拗にパッチ送った</li>
</ul>
<li>8月</li>
<ul>
<li>Data::WeightedRoundRobin 書いた</li>
<li>C80</li>
<li>四半世紀経過</li>
<li>ISUCON で文字化け FAILED</li>
</ul>
<li>9月</li>
<ul>
<li>IO::Prompt::Simple 書いた</li>
<li>閃乱カグラ！！！１</li>
<li>configure_requires について</li>
<li>perl は言語内にイテレーターないからあれげ</li>
</ul>
<li>10月</li>
<ul>
<li>YAPC::Asia 2011</li>
<li>いろいろとモジュール更新してた</li>
</ul>
<li>11月</li>
<ul>
<li>Test::Mock::Guard とかいじってた</li>
<li>is_deeeeeeeeeply</li>
<li>Yokohama.pm#8</li>
</ul>
<li>12月</li>
<ul>
<li>Perl Advent Calendar</li>
<li>MySQL Casual Advent Calendar</li>
<li>WEB+DB Press vol.66 にグラビア写真が載った</li>
<li>C81</li>
</ul>
</ul>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53522762" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53514791.html">
<title>LWP での SSL 接続で certificate verify failed しちゃう件の解決方法</title>
<link>http://blog.livedoor.jp/xaicron/archives/53514791.html</link>
<description>

要は、オレオレ証明書使ってるサーバーに https でアクセスすると die しちゃうわけですが、無視したいときもあるわけです。


そういう時は、


$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;



とすれば OK ですね。っていうのを zigorou さんに教えてもらいました。ちなみ...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-12-30T23:00:49+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[
<p>
要は、オレオレ証明書使ってるサーバーに https でアクセスすると die しちゃうわけですが、無視したいときもあるわけです。
</p>
<p>
そういう時は、
</p>
<pre>
<span class="var">$ENV</span>{<span class="bre">PERL_LWP_SSL_VERIFY_HOSTNAME</span>} = 0;
</pre>

<p>
とすれば OK ですね。っていうのを zigorou さんに教えてもらいました。ちなみにこの ENV は <a href="https://metacpan.org/release/LWP-Protocol-https">LWP::Protocol::https</a> にはコードの中にしか出てこなくて、<a href="https://metacpan.org/release/LWP">LWP</a><span class="footnote"><a title="LWP::UserAgent でなく LWP" name="shiYtDgjet_fn1" href="#shiYtDgjet_f1">*1</a></span> の POD に書かれてました。
</p>
<p>
あとは、
</p>
<pre>
LWP::UserAgent->new(<span class="bre">ssl_opts</span> => { <span class="bre">verify_hostname</span> => <span class="bre">0</span> });
</pre>

<p>
でもいいですね。こっちは LWP::Protocol::https に書いてありました。ちゃんとドキュメント読めって感じですが、LWP はいろんなところに分散していて、ちょっとした機能がなかなか探しづらいですね。
</p>
<div class="titlebody"><h3 class="title">追記</h3></div>

<p>
よくみたら、普通に <a href="https://metacpan.org/release/LWP-UserAgent">LWP::UserAgent</a> の POD に書いてあって
</p>
<pre>
<span class="var">$ua</span>->ssl_opts(<span class="bre">verify_hostname</span> => 0);
<span class="res">say</span> <span class="var">$ua</span>->ssl_opts(<span class="qot">'verify_hostname'</span>); <span class="comment"># 0</span>
</pre>

<p>
とかできるし、<code>PERL_LWP_SSL_VERIFY_HOSTNAME</code> のことも書いてあったので、本当にちゃんとドキュメント読みましょう！！１１１
</p><div class="footnote">
<ul>
    <li><a name="shiYtDgjet_f1" href="#shiYtDgjet_fn1">*1</a> : LWP::UserAgent でなく LWP</li>
</ul>
</div>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53514791" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53380670.html">
<title>Mac OSX に MySQL と Q4M と Handler Socket を一発で入れるスクリプト</title>
<link>http://blog.livedoor.jp/xaicron/archives/53380670.html</link>
<description>
こんにちは！ MySQL Casual Advent Calendar の三日目がやって参りました。皆様いかがお過ごしでしょうか。僕は例年通り、クリスマスをどうやってなくすかに頭を悩ませています。


さて、自分は MySQL のこととかあんまりよくわからないんですが、仕事で Q4M とか HandlerS...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-12-03T17:23:55+09:00</dc:date>
<dc:subject>MySQL</dc:subject>
<content:encoded><![CDATA[<p>
こんにちは！ <a href="http://mysql-casual.org/2011/11/mysql-casual-advent-calendar-2011.html">MySQL Casual Advent Calendar</a> の三日目がやって参りました。皆様いかがお過ごしでしょうか。僕は例年通り、クリスマスをどうやってなくすかに頭を悩ませています。
</p>
<p>
さて、自分は MySQL のこととかあんまりよくわからないんですが、仕事で Q4M とか HandlerSocket とか使う機会があります。
<br />更に言うと、手元の Mac の環境でそれらを手軽に使いたいので、簡単にセットアップが出来ると嬉しいですね。
</p>
<p>
というわけで、一発で MySQL と Q4M と HandlerSocket のセットアップが出来ちゃうシェルスクリプトを書きました！大変カジュアルですね！！
</p>
<p>
前提条件として、Xcode と homebrew は入っているものとします。
</p>
<pre class="term">
$ zsh -c "$(curl -fsSL https://raw.github.com/gist/1426403)"
</pre>

<p>
とか実行すればOKです！
</p>
<p>
このスクリプトのとってもカジュアルなところを2、3説明すると、
</p>
<ol>
<li>brew install の時に一回 MySQL をビルドしてるけど終わると消えちゃうので、もう一回ビルドしている</li>
<li>テストとか一切走らせない</li>
<li>エラーが起きてもお構いなしに最後まで処理する</li>
</ol>
<p>
といったところでしょうか。
</p>
<p>
ちなみに、MySQL5.1系を入れているのは Q4M が<strong>現時点では</strong> 5.1系しか対応していない為です。
<br />HS は 5.5とかでも普通に動くよって作者の人が言ってました。
</p>
<div class="titlebody"><h3 class="title">まとめ</h3></div>

<p>
という訳で、コマンド一発叩くだけで手元で Q4M と HS が入った状態の MySQL5.1 が手に入るのでとってもお手軽で良い感じですね。
<br /><del>誰かバイナリ配布してください</del>
</p>
<p>
さて、明日は椅子とMySQL4をこよなく愛するスーパーインフラエンジニアの kazeburo さんです。
<br />お楽しみに！！
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53380670" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53367118.html">
<title>Perl Advent Calendar - Test Track に参加して、豪華景品を当てよう！</title>
<link>http://blog.livedoor.jp/xaicron/archives/53367118.html</link>
<description>
こんにちは！例年のように Perl Advent Calendar が始まっています。


今年は Test Track っていうのをやっているので、テストに一家言あるぜっ！て人はぜひぜひ参加してみてください！


募集は ATND で行なっていますので、お気軽に。
記事の書き方は、コチラを参照して...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-12-02T01:19:59+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
こんにちは！例年のように <a href="http://perl-users.jp/articles/advent-calendar/2011/">Perl Advent Calendar</a> が始まっています。
</p>
<p>
今年は <a href="http://perl-users.jp/articles/advent-calendar/2011/test/">Test Track</a> っていうのをやっているので、テストに一家言あるぜっ！て人はぜひぜひ参加してみてください！
</p>
<p>
募集は <a href="http://atnd.org/events/22667">ATND</a> で行なっていますので、お気軽に。
<br />記事の書き方は、<a href="http://perl-users.jp/articles/advent-calendar/help.html">コチラ</a>を参照してください。
<br />writer 権限は twitter で @xaicron まで言ってくれれば追加します。
</p>
<p>
景品は、自分の書いた記事が、電子書籍化される権利です！今すぐ応募しよう！！
</p>
<p>
はてさて、25日書けるかな？
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53367118" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53323815.html">
<title>carton と cpanm と pm-uninstall の小話</title>
<link>http://blog.livedoor.jp/xaicron/archives/53323815.html</link>
<description>

carton ができてきたお陰で、それを使っている限りは、モジュールのアンインストールがさっくりとできるようになるので、App::pmuninstall はそれなりの役目を終えたかも的な話をどっかでしたようなしなかったような気がするんですが、それによって pm-uninstall が今後一...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-11-26T18:26:45+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[
<p>
<a href="https://metacpan.org/release/carton">carton</a> ができてきたお陰で、それを使っている限りは、モジュールのアンインストールがさっくりとできるようになるので、<a href="https://metacpan.org/release/App-pmuninstall">App::pmuninstall</a> はそれなりの役目を終えたかも的な話をどっかでしたようなしなかったような気がするんですが、それによって <code>pm-uninstall</code> が今後一切使う必要がないかというとそうでもなく、<code>carton</code> 環境じゃない所ではいままで通り使うことはあると思いますです。
</p>
<p>
ちなみに、<a href="https://metacpan.org/release/App-cpanminus">App::cpanminus</a> の 1.5000 以上を使っている場合、モジュールのインストール情報がとある場所に保存されるようになったので、<code>pm-uninstall</code> の 0.25 からはそれを元にモジュールを削除するようになったので、新しいバージョンを使っているといいことがあると思います。<span class="footnote"><a title="なかったら今まで通りの処理で削除します" name="xbWBGGPtvd_fn1" href="#xbWBGGPtvd_f1">*1</a></span>
</p>
<p>
ただし、まだまだEXPERIMENTALな機能なので、今後も変更があるかもしれませんです。
</p>
<p>
っていうのを最近 id:antipop さんに聞かれたので忘れないうちにメモっておくの巻。
</p><div class="footnote">
<ul>
    <li><a name="xbWBGGPtvd_f1" href="#xbWBGGPtvd_fn1">*1</a> : なかったら今まで通りの処理で削除します</li>
</ul>
</div>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53323815" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53284031.html">
<title>Yokohama.pm#8 で LT しました #yokohamapm</title>
<link>http://blog.livedoor.jp/xaicron/archives/53284031.html</link>
<description>
風邪とかリリースとかで色々と行けそうになかったので、事前に irc とか twitter でごめんなさいしてたんですが、ボスがリリース中に irc で和ませてくれたので、無事に yokohama.pm に行けました。


そういえば、初参加からずっと何かしらトークしてますね。


今回は直前...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-11-19T02:28:48+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
風邪とかリリースとかで色々と行けそうになかったので、事前に irc とか twitter でごめんなさいしてたんですが、<a href="http://twitter.com/#!/hidek/status/137423085694484481">ボスがリリース中に irc で和ませてくれた</a>ので、無事に yokohama.pm に行けました。
</p>
<p>
そういえば、初参加からずっと何かしらトークしてますね。
</p>
<p>
今回は直前に仕事がいろいろと舞い込んできてしまったので何もネタを用意できておらず、どうしようかなーと思っていましたが、なんとなく会場に行くまでの電車の中で思いついたので良かったです。
</p>
<p>
会場についてから Yahoo API アカウント取ったり、頑張ってモジュール書いたり irc bot を書いたりプレゼン書いたりとやってて結構大変でしたが、なんとかなりましたね。
</p>
<p>
コードは以下にあげときました。
</p>
<!-- raw html start -->
<p class="favicon"><img src="https://github.com/favicon.ico" alt=" " width="16" height="16" /><a href="https://github.com/xaicron/p5-Acme-Shiin">xaicron/p5-Acme-Shiin - GitHub</a><a href="http://b.hatena.ne.jp/entry/https://github.com/xaicron/p5-Acme-Shiin"><img src="http://b.hatena.ne.jp/entry/image/https://github.com/xaicron/p5-Acme-Shiin" alt="はてブ" /></a></p>
<!-- raw html end -->

<p>
LT 見てない人のために簡単に説明すると、<code>マジレス -&gt; mjrs</code> とか <code>確かに -&gt; tskn</code> にしてくれる超便利で鼻毛が出ちゃうモジュールです。
</p>
<pre>
<span class="res">use</span> Acme::Shiin;

<span class="res">my</span> <span class="var">$config</span> = pit_get(<span class="qot">&#39;Acme::Shiin&#39;</span>, <span class="res">require</span> =&gt; {
    <span class="bre">app_id</span> =&gt; <span class="qot">&#39;your app_id&#39;</span>,
});
<span class="res">my</span> <span class="var">$shiin</span> = Acme::Shiin-&gt;new(<span class="bre">app_id</span> =&gt; <span class="var">$config</span>-&gt;{<span class="bre">app_id</span>});
<span class="res">say</span> <span class="var">$shiin</span>-&gt;shiinize(<span class="qot">&#39;マジレス&#39;</span>); <span class="comment"># mjrs</span>
</pre>

<p>
漢字をひらがなに変換するために、Yahoo のルビ振り API を使っているので Yahoo appId が必要です。
</p>
<p>
処理の流れとしては
</p>
<ol>
<li>漢字をひらがなに</li>
<li>カタカナをひらがなに</li>
<li>母音を削除</li>
<li>手で頑張って書いたマップで適当に置換する</li>
</ol>
<p>
とかでだいぶ適当な実装ですね。XML はめんどかったんで、自力で正規表現でぶっこぬいてます。
</p>
<p>
ちなみに irc bot は AnySan があったのですごい簡単でしたね。ほぼ SYNOPSYS のコピペです。
</p>
<pre>
<span class="comment">#!/usr/bin/env perl</span>

<span class="res">use</span> strict;
<span class="res">use</span> warnings;
<span class="res">use</span> lib <span class="qot">&#39;lib&#39;</span>;
<span class="res">use</span> AnySan;
<span class="res">use</span> AnySan::Provider::IRC;
<span class="res">use</span> Config::Pit;
<span class="res">use</span> Acme::Shiin;

<span class="res">my</span> <span class="var">$config</span> = pit_get(<span class="qot">&#39;Acme::Shiin&#39;</span>, <span class="res">require</span> =&gt; {
    <span class="bre">app_id</span> =&gt; <span class="qot">&#39;your app_id&#39;</span>,
});
<span class="res">my</span> <span class="var">$shiin</span> = Acme::Shiin-&gt;new(<span class="bre">app_id</span> =&gt; <span class="var">$config</span>-&gt;{<span class="bre">app_id</span>});

<span class="res">my</span> <span class="var">$irc</span> = irc
    <span class="qot">&#39;localhost&#39;</span>,
    <span class="bre">port</span>     =&gt; <span class="bre">6667</span>,
    <span class="bre">key</span>      =&gt; <span class="qot">&#39;oppai&#39;</span>,
    <span class="bre">nickname</span> =&gt; <span class="qot">&#39;shiinize&#39;</span>,
    <span class="bre">channels</span> =&gt; {
        <span class="qot">&#39;#shiin&#39;</span> =&gt; {},
    };          

AnySan-&gt;register_listener(
    <span class="bre">shiinize</span> =&gt; {
        <span class="bre">cb</span> =&gt; <span class="res">sub</span> {
            <span class="res">my</span> <span class="var">$receive</span> = <span class="res">shift</span>;
            <span class="res">my</span> <span class="var">$ret</span> = <span class="var">$shiin</span>-&gt;shiinize(<span class="var">$receive</span>-&gt;message);
            <span class="var">$receive</span>-&gt;send_replay(<span class="var">$ret</span>);
        },
    },
); 

AnySan-&gt;run;
</pre>

<p>
やっぱり一番大変だったのは、ひらがなのマップを作るところでしたし、意外とひらがなって羅列できないですねってことがわかりました。
<br />次回は体調万全で挑みたいと思います。
</p>
<p>
また、いつも mjrs してくれる gfx 氏にこのモジュールを捧げます。
</p>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53284031" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53277465.html">
<title>is_deeply の結果が見難くて生きるのが辛い件</title>
<link>http://blog.livedoor.jp/xaicron/archives/53277465.html</link>
<description>
そう思ってる人がいっぱいいるってことなので、こんな感じのを書いたらいいのかなと思った。
適当です。


use strict;
use warnings;
use Test::More;
use String::Diff;
use Data::Dumper;
use Term::ANSIColor qw(color);

sub is_deeeeeeeeeply {
    my ($got, $expect...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-11-17T23:29:14+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
そう思ってる人がいっぱいいるってことなので、こんな感じのを書いたらいいのかなと思った。
<br />適当です。
</p>
<pre>
<span class="res">use</span> strict;
<span class="res">use</span> warnings;
<span class="res">use</span> Test::More;
<span class="res">use</span> String::Diff;
<span class="res">use</span> Data::Dumper;
<span class="res">use</span> Term::ANSIColor <span class="qot">qw(color)</span>;

<span class="res">sub</span> is_deeeeeeeeeply {
    <span class="res">my</span> (<span class="var">$got</span>, <span class="var">$expects</span>, <span class="var">$desc</span>) = <span class="var">@_</span>; 
    <span class="res">local</span> <span class="var">$Test::Builder::Level</span> = <span class="var">$Test::Builder::Level</span> + 1;
    <span class="res">local</span> <span class="var">$Data::Dumper::Terse</span>    = 1;
    <span class="res">local</span> <span class="var">$Data::Dumper::Sortkeys</span> = 1;
    <span class="res">local</span> <span class="var">$Data::Dumper::Indent</span>   = 0;
        
    <span class="res">my</span> <span class="var">$got_str</span>     = Data::Dumper::Dumper(<span class="var">$got</span>).<span class="qot">&quot;\n&quot;</span>;
    <span class="res">my</span> <span class="var">$expects_str</span> = Data::Dumper::Dumper(<span class="var">$expects</span>).<span class="qot">&quot;\n&quot;</span>;
    <span class="bre">ok</span> <span class="var">$got_str</span> <span class="res">eq</span> <span class="var">$expects_str</span>, <span class="var">$desc</span> <span class="res">or</span> <span class="res">do</span> {;
        <span class="bre">note</span> String::Diff::diff(<span class="var">$got_str</span>, <span class="var">$expects_str</span>, (
            <span class="bre">remove_open</span>  =&gt; color(<span class="qot">&#39;black on_red&#39;</span>),
            <span class="bre">remove_close</span> =&gt; color(<span class="qot">&#39;reset&#39;</span>),
            <span class="bre">append_open</span>  =&gt; color(<span class="qot">&#39;black on_green&#39;</span>),
            <span class="bre">append_close</span> =&gt; color(<span class="qot">&#39;reset&#39;</span>),
        )); 
    };  
}

is_deeeeeeeeeply [ <span class="bre">nekokak</span> =&gt; { <span class="bre">dis</span> =&gt; <span class="qot">&#39;false&#39;</span> } ], [ <span class="bre">nekokak</span> =&gt; { <span class="bre">dis</span> =&gt; <span class="qot">&#39;true&#39;</span> } ], <span class="qot">&#39;really?&#39;</span>;

done_testing;
</pre>

<p>
まぁ CPAN には <a href="https://metacpan.org/release/Test-Differences-Color">Test::Differences::Color</a> とかいろいろありますね。
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53277465" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53273473.html">
<title>DBIx::QueryLog で SQL::Tokenizer の依存をやめた</title>
<link>http://blog.livedoor.jp/xaicron/archives/53273473.html</link>
<description>
0.21 にアップしてリリースしました。


 copmact  するときに、SQL::Tokenizer に依存していたんだけど、あんまり良い感じになってなかったので自力で SQL を Parse してほげほげすることにしました。


なんか壊れてるんじゃねっ！って思ったらテストケース送ってくれれば...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-11-17T01:29:13+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
0.21 にアップしてリリースしました。
</p>
<p>
<code> copmact </code> するときに、SQL::Tokenizer に依存していたんだけど、あんまり良い感じになってなかったので自力で SQL を Parse してほげほげすることにしました。
</p>
<p>
なんか壊れてるんじゃねっ！って思ったらテストケース送ってくれれば対応しますです。
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53273473" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53251833.html">
<title>最近の Test::Mock::Guard</title>
<link>http://blog.livedoor.jp/xaicron/archives/53251833.html</link>
<description>
ただのスタブなのにモックを名乗っていることで有名な Test::Mock::Guard ですが、スタブ化したメソッドの呼び出し回数を知りたいことが何気なく需要としてあったので、某アザラシのアイコンの人に実装してもらいました。
が、一部バグってたので直しました。やっぱりスタブ...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-11-13T18:09:10+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
ただのスタブなのにモックを名乗っていることで有名な <a href="https://metacpan.org/release/Test-Mock-Guard">Test::Mock::Guard</a> ですが、スタブ化したメソッドの呼び出し回数を知りたいことが何気なく需要としてあったので、<a href="http://twitter.com/ikasam_a">某アザラシのアイコンの人</a>に実装してもらいました。
<br />が、一部バグってたので直しました。やっぱりスタブなのにモックを名乗っているのが原因なのでしょうか。
</p>
<p>
主に、とあるメソッドでの条件分岐などで、呼び出されたかどうかを知りたい場合に使います。
</p>
<pre>
<span class="res">use</span> strict;
<span class="res">use</span> warnings;
<span class="res">use</span> Test::More;
<span class="res">use</span> Test::Mock::Guard <span class="qot">qw(mock_guard)</span>;

{
    <span class="res">package</span> SomeClass;
    
    <span class="res">sub</span> new { <span class="res">bless</span> {}, <span class="bre">__PACKAGE__</span> }

    <span class="res">sub</span> some_method {
        <span class="res">my</span> (<span class="var">$self</span>, <span class="var">$args</span>) = <span class="var">@_</span>;
        <span class="res">return</span> <span class="var">$args</span> ? <span class="var">$self</span>-&gt;foo : <span class="var">$self</span>-&gt;bar;
    }

    <span class="res">sub</span> foo { <span class="qot">&#39;foo&#39;</span> }

    <span class="res">sub</span> bar { <span class="qot">&#39;bar&#39;</span> }
}

<span class="res">my</span> <span class="var">$obj</span> = SomeClass-&gt;new;

subtest <span class="qot">&#39;called foo&#39;</span> =&gt; <span class="res">sub</span> {
    <span class="res">my</span> <span class="var">$guard</span> = <span class="bre">mock_guard</span> <span class="var">$obj</span> =&gt; {
        <span class="bre">foo</span> =&gt; <span class="qot">&#39;hoge&#39;</span>,
        <span class="bre">bar</span> =&gt; <span class="qot">&#39;fuga&#39;</span>,
    };
    <span class="bre">is</span> +<span class="var">$obj</span>-&gt;some_method(1), <span class="qot">&#39;hoge&#39;</span>;
    <span class="bre">is</span> <span class="var">$guard</span>-&gt;call_count(<span class="var">$obj</span>, <span class="qot">&#39;foo&#39;</span>), 1;
    <span class="bre">is</span> <span class="var">$guard</span>-&gt;call_count(<span class="var">$obj</span>, <span class="qot">&#39;bar&#39;</span>), 0;
};

done_testing;
</pre>

<p>
こんな感じで簡単ですね。
</p>
<p>
ちなみにスタブ化してないメソッドに対して <code>call_count</code> をやると、<code>undef</code> が返ってきますが、あんまり気にしなくていいでしょう。
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53251833" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53229780.html">
<title>最近の .proverc</title>
<link>http://blog.livedoor.jp/xaicron/archives/53229780.html</link>
<description>
prove はカレントの .proverc ってファイルにオプションを書けるので色々と書いておくと便利。


最近は、以下のようにしてる。


--exec &quot;perl -Ilib -It/lib -MTest::Flatten -MTest::Name::FromLine&quot;
--color
--merge
--timer
-w



こんくらい書いておくとまぁ大体いい...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-11-09T01:25:16+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
<a href="https://metacpan.org/release/prove">prove</a> はカレントの <code>.proverc</code> ってファイルにオプションを書けるので色々と書いておくと便利。
</p>
<p>
最近は、以下のようにしてる。
</p>
<pre class="term">
--exec &quot;perl -Ilib -It/lib -MTest::Flatten -MTest::Name::FromLine&quot;
--color
--merge
--timer
-w
</pre>

<p>
こんくらい書いておくとまぁ大体いい感じになる。
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53229780" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53181958.html">
<title>DBIx::QueryLog 更新</title>
<link>http://blog.livedoor.jp/xaicron/archives/53181958.html</link>
<description>
デフォは STDERR に出力しててたんですが、$DBIx::QueryLog::OUTPUT にファイルハンドルなら何でも設定できるようになりました。
が、今考えたら、Log::Minimal みたいな感じにしたほうがよかった！
一応、DBIx::QueryLog-&gt;logger($logger) とかで logger 指定できるのでい...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-10-31T01:14:34+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
デフォは <code>STDERR</code> に出力しててたんですが、<code>$DBIx::QueryLog::OUTPUT</code> にファイルハンドルなら何でも設定できるようになりました。
<br />が、今考えたら、<a href="https://metacpan.org/release/Log-Minimal">Log::Minimal</a> みたいな感じにしたほうがよかった！<br />
一応、<code>DBIx::QueryLog->logger($logger)</code> とかで logger 指定できるのでいいんですけど。
</p>
<p>
あと、<code>color</code> と <del>compress</del><code>compact</code> と <code>useqq</code> っていうオプションを追加しました。
<br />それぞれ <code>env DBIX_QUERYLOG_(COLOR|<del>COMPRESS</del>COMPACT|USEQQ)</code> とかでも設定できます。
</p>

<ins>compress は compact にかわりました</ins>

<p>
軽く例を上げると、<code>useqq</code> は
</p>
<pre>
<span class="comment"># local $Data::Dumper::Useqq  = 1;</span>
<span class="comment"># local $Data::Dumper::Terse  = 1;</span>
<span class="comment"># local $Data::Dumper::Indent = 0;</span>
<span class="comment"># とした Data::Dumper::Dumper を通す</span>
DBIx::QueryLog-&gt;useqq(1); <span class="comment"># or <span class="var">$ENV</span>{DBIX_QUERYLOG_USEQQ} = 1</span>
<span class="res">my</span> <span class="var">$row</span> = <span class="var">$dbh</span>-&gt;selectrow_hashref(&lt;&lt; <span class="hrd">&#39;SQL&#39;</span>, <span class="bre">undef</span>, <span class="qot">&#39;nekokak&#39;</span>);
<span class="hrd">SELECT * FROM</span>
<span class="hrd">   dis</span>
<span class="hrd">WHERE name = ?</span>
<span class="hrd">SQL</span>
<span class="comment"># =&gt; &quot;SELECT * FROM\n    dis\nWHERE name = &#39;nekokak&#39;\n&quot;</span>
</pre>

<p>
って感じになります。
</p>
<p>
<del>compress</del><code>compact</code> は空白を全部スペース一個に変えます。<a href="https://metacpan.org/release/SQL-Tokenizer">SQL::Tokenizer</a> とか使ってるのでそのへんのオーバヘッドはあるでしょう
</p>
<pre>
DBIx::QueryLog-&gt;<del>compress</del>compact(1); <span class="comment"># or <span class="var">$ENV</span>{DBIX_QUERYLOG_<del>COMPRESS</del>COMPACT} = 1</span>
<span class="res">my</span> <span class="var">$row</span> = <span class="var">$dbh</span>-&gt;selectrow_hashref(&lt;&lt; <span class="hrd">&#39;SQL&#39;</span>, <span class="bre">undef</span>, <span class="qot">&#39;nekokak&#39;</span>);
<span class="hrd">    SELECT * FROM</span>
<span class="hrd">    dis</span>
<span class="hrd">WHERE      name = ?</span>
<span class="hrd">SQL</span>
<span class="comment"># =&gt; SELECT * FROM dis WHERE name = &#39;nekokak&#39;&quot;</span>
</pre>

<p>
SQL を完全なまま再現したいけど一行にしたい場合は、useqq で、壊れてもいいから短くしたいなら compress ってところですね。
<br />いちおう、useqq は unprintable な文字を printable にしてくれるっていう副作用もあるので、両方指定するのもありです。
</p>
<p>
あと、color はそのまんまで、<a href="https://metacpan.org/release/Term-ANSIColor">Term::ANSIColor</a> のやつを使えます。
</p>
<pre>
DBIx::QueryLog-&gt;color(<span class="qot">&#39;black on_yellow&#39;</span>); <span class="comment"># or <span class="var">$ENV</span>{DBIX_QUERYLOG_COLOR} = &quot;black on_yellow&quot;</span>
</pre>

<p>
ちなみに、自分は DBIx::QueryLog は本番環境でがっつり使うってよりは、手元の環境とかでデバッグ時に use してやるだけで全部の SQL が吐かれるので便利って感じで使ってます。
<br />メソッドをラップするので、若干のオーバヘッドがありますし。
</p>
<p>
本番環境とかでその瞬間の SQL をトレースしたい場合は、tcpdump を使ったほうが効率的ですね！
</p>



<div class="titlebody"><h3 class="title">追記</h3></div>

<p>
version 0.18 から、Log::Minimal みたいに、$OUTPUT に <code>sub { ... } </code> を渡せるようになりましたので何でもやり放題ですね。やった！
</p>
<pre>
<span class="res">local</span> <span class="var">$DBIx</span>::QueryLog::OUTPUT = <span class="res">sub</span> {
    <span class="res">my</span> <span class="var">%args</span> = <span class="var">@_</span>;
    <span class="res">printf</span> <span class="qot">&quot;<span class="var">%s</span>\n&quot;</span>, <span class="var">$args</span>{<span class="bre">sql</span>};
};
</pre>

<p>
<code>%args</code> に何が渡ってくるかは、POD を参照のこと。
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53181958" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.livedoor.jp/xaicron/archives/53091000.html">
<title>Data::WeightedRoundRobin の紹介</title>
<link>http://blog.livedoor.jp/xaicron/archives/53091000.html</link>
<description>
YAPC で少し紹介しようと思って、DEMO も用意してたんですが、時間がなくて諦めたので、ちょろっと紹介しときます。


Data::WeightedRoundRobin は重み付けされた値をベストエフォートな感じでラウンドロビンしてくれるモジュールです。


使い方は簡単で、以下のような感...</description>
<dc:creator>xaicron</dc:creator>
<dc:date>2011-10-19T02:30:21+09:00</dc:date>
<dc:subject>Perl</dc:subject>
<content:encoded><![CDATA[<p>
YAPC で少し紹介しようと思って、DEMO も用意してたんですが、時間がなくて諦めたので、ちょろっと紹介しときます。
</p>
<p>
<a href="https://metacpan.org/release/Data-WeightedRoundRobin">Data::WeightedRoundRobin</a> は重み付けされた値をベストエフォートな感じでラウンドロビンしてくれるモジュールです。
</p>
<p>
使い方は簡単で、以下のような感じ。
</p>
<pre>
<span class="res">use</span> Data::WeightedRoundRobin;

<span class="res">my</span> <span class="var">$wrr</span> = Data::WeightedRoundRobin-&gt;new([
    { <span class="bre">value</span> =&gt; <span class="qot">&#39;hidek&#39;</span>,   <span class="bre">weight</span> =&gt; <span class="bre">65</span> },
    { <span class="bre">value</span> =&gt; <span class="qot">&#39;zigorou&#39;</span>, <span class="bre">weight</span> =&gt; <span class="bre">80</span> },
    { <span class="bre">value</span> =&gt; <span class="qot">&#39;nekokak&#39;</span>, <span class="bre">weight</span> =&gt; <span class="bre">75</span> },
]);

<span class="res">say</span> <span class="var">$wrr</span>-&gt;<span class="res">next</span> <span class="res">for</span> 1..100;
</pre>

<p>
こうすると、大体
</p>
<pre>
hidek : <span class="bre">zigorou</span> : <span class="bre">nekokak</span> = <span class="bre">65</span> : <span class="bre">80</span> : 70
</pre>

<p>
ぐらいの頻度で返ってきます。
<br />例でわかるように、別に weight を百分率にする必要も特になく、0 以上の値なら何でも良いです。0.1とか。
</p>
<p>
DB への負荷分散では、value に IP を突っ込んでやってます。そうすると、DNSルックアップがなくなってハッピーです。
</p>
<p>
とりあえず、手元の MBA で next のベンチとってみたら、秒間34万回とか出てたので、まぁまぁいいんじゃないでしょうか。
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=2787244&name=xaicron&pid=53091000" width="1" height="1" />
]]>
</content:encoded>
</item>

</rdf:RDF>

