<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>へぼい日記</title>
	<atom:link href="http://blog.everqueue.com/chiba/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.everqueue.com/chiba</link>
	<description>perlのこととかjavascriptのこととかwebのこととかを書いていくかも</description>
	<lastBuildDate>Sun, 16 Oct 2011 10:39:37 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/feed/" />
		<item>
		<title>YAPC::Asia Tokyo 2011に参加してきました</title>
		<link>http://blog.everqueue.com/chiba/2011/10/16/545/</link>
		<comments>http://blog.everqueue.com/chiba/2011/10/16/545/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 10:36:39 +0000</pubDate>
		<dc:creator>chiba</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.everqueue.com/chiba/?p=545</guid>
		<description><![CDATA[YAPC::Asia Tokyo 2011に参加してきました。 ブログ書くまでがYAPCというわけで印象にのこったセッションを中心に参加報告を。 前夜祭 myfinderさんの「サービス運用者のための継続的監視」はさすが [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://yapcasia.org/2011/">YAPC::Asia Tokyo 2011</a>に参加してきました。</p>
<p>ブログ書くまでがYAPCというわけで印象にのこったセッションを中心に参加報告を。</p>
<h3>前夜祭</h3>
<p>myfinderさんの「サービス運用者のための継続的監視」はさすが日本で1番目か2番目か3番目のSNSの運用をされてるだけあってさすがという感じでした。自分は小規模システムばかりやっていて開発者も運用についてかなりコミットしなきゃいけない状況で働いているのですが、ここまできちんとできてないなーと痛感。さっそく監視項目をどんどん増やしていこうと思いました。</p>
<p>会場外のプチ懇親会的なものでは、ほぼボッチでしたが夏菜子推しTを装備していたsugyanさんと初めて挨拶させていただくなど。</p>
<h3>一日目</h3>
<p>寝坊＆体調不良で昼から参加。Jesse Vincentさんの「Perl 5.16 and beyond」とmalaさんの「Webアプリケーション高速化」が聞けなかったのが残念。動画とか公開されるのかな。</p>
<p>onishiさんの「新はてなダイアリーの裏側」では、はてなダイアリーが今秋Hatena Blogになることが発表されたりしていて、ユーザ毎サブドメイン運用でjavascript解禁なんて話があってセキュリティ対策とかどーなのかなーと興味深かったです。二日目のcho45さんの「ぼくがかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく 」でそこらへんの話も詳しくされたぽいのですが裏セッションを聞いてて見れなかったです。</p>
<p>徳丸さんの「Webアプリでパスワード保護はどこまでやればいいか」ではレインボーテーブルの原理を丁寧に説明されていて（徳丸本にも書いてあるのですが読み飛ばしてしまっていたので）、なるほどなーと思ったり、高速化するGPUの脅威に対抗するためにサービス側でもGPUを使ってハッシュ生成（ストレッチング回数を増やす）するという対策を示しておられたのが印象的でした。</p>
<p>makamakaさんの「Perl Mongerなりきりカードゲームの考案と実践」はとにかく面白すぎましたｗ会場のウケをとった回数だけならきっとベストスピーカー賞なんじゃないでしょうか。</p>
<p>懇親会ではほぼボッチでしたが、miyagawaさんに僕のビール持って行っちゃってませんかという(濡れ衣の)難癖をつけるなどしました。（わざとじゃありません。すみません）</p>
<h3>二日目</h3>
<p>若干遅刻気味だったので大岡山駅からダッシュで会場に向かい、ぎりぎりkazuhoさんの「続 Unix Programming with Perl」の開始に間に合いました。昨年の発表もそうでしたが正しくプログラミングするとはどういうことなのかということを徹底的に意識されている感じで非常に勉強になりました。</p>
<p>Ricardo Signes(rjbs)さんの「闇のEメール伝説」はEmail::モジュールの話をするのかなーと思って行ってみたら、SMTPやMIMEのRFCにまつわるメールのカオス状況をおもしろおかしく発表されるという感じでした。英語は正直ほぼ聞き取れてなかったのですがスライドを見るとだいたいは把握できたし、<a href="http://blog.everqueue.com/chiba/2009/08/08/239/">メールアドレスの正規表現</a>をやってたときにRFCがupdateされて古いRFCがobsoleteになっても新しいRFC自体にobsなsyntaxが残ってたりしてカオスってるのを把握してたのでそうそうそうだよねーという感じで楽しく聞けました。</p>
<p>スイーツエリアで開催されたmotemenさんの「Teto でニコニコ音声ストリーミング 」は便利そうだし、技術的にも面白そうなので是非使ってみてコードも読みたいなーと思いました。</p>
<p>勝手に後夜祭では、ほぼボッチは回避しつついろんな方と話すことができました。途中YappoさんとEmail::Senderの非Moose化てどうなんでしょうねーという話をしていたらcharsbarさんに折角本人がいるんだから直接いいなよとrjbsさんの前に連れていかれcharsbarさんに通訳をしてもらいながらお話を聞くことができました。RoleがMooseとMouseで完全に共通化されてないからAny::Mooseは使えないよねーという話だと理解したのですが正直完全には理解できず。英語ェ…。周りに集まってきたPerlHackerの面々が直接英語で議論しているのを目の当たりにしてほんと英語どうにかしないと駄目だなと再度感じた次第。charsbarさんその節はありがとうございました。力不足で大して議論を深める役には立てませんでしたが貴重な経験になりました。</p>
<p>というわけで三日間非常に楽しめました。<br />
牧さん櫛井さんをはじめJPAのみなさん、ボランティアスタッフのみなさん、スピーカーのみなさん、お疲れ様でした＆ありがとうございました。<br />
来年はスピーカーとして若干でも貢献したいとおもいます!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.everqueue.com/chiba/2011/10/16/545/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/2011/10/16/545/" />
	</item>
		<item>
		<title>ISUCONに参加してきました</title>
		<link>http://blog.everqueue.com/chiba/2011/08/30/530/</link>
		<comments>http://blog.everqueue.com/chiba/2011/08/30/530/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 18:18:58 +0000</pubDate>
		<dc:creator>chiba</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.everqueue.com/chiba/?p=530</guid>
		<description><![CDATA[なんでもありのWebアプリケーション高速化バトル、#isuconに山形組として参加してきました。 結果はみなさんご存知の通り、藤原組さんの圧勝という感じになりました。 自分はというと、DBボトルネックの解消までは藤原組さ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.livedoor.jp/techblog/archives/66528186.html">なんでもありのWebアプリケーション高速化バトル、#isucon</a>に山形組として参加してきました。<br />
結果はみなさんご存知の通り、<a href="http://d.hatena.ne.jp/sfujiwara/20110827/1314460582">藤原組</a>さんの圧勝という感じになりました。<br />
自分はというと、DBボトルネックの解消までは藤原組さんとほぼ同じ手法で解決して、4700req/minあたりのbest scoreを出した後には有効なチューニングが行えずに<a href="http://blog.nomadscafe.jp/2011/08/http-load-isucon.html">nginx導入の罠</a>にひっかかって200req/minとかになってしまって泣きながらapacheに戻したりしつつ、最後はサイドバーのcacheをmmapにいれる作業をしていたらバグでfailするようになってしまってぎりぎりでDBのボトルネック解消直後にロールバックして、10000req/3minくらいがたしか最終スコアだったと思います。failしたチームを除けば下から数えたほうが早い感じになってかなり悔しい結果でした。</p>
<p>DBボトルネック解消直後にappサーバを一つにしぼったところたいして結果は変わらず、ああたかが10並列だしサーバ分散するほうが無駄なのかなとリバースプロキシでplackで直接80番ポートをlistenするとどうなるかなーと思ったりもしていたのですが、debianでdaemontools慣れしていた自分はceontosでsupervisordという構成にひるんでしまってそこまで踏み込めなかったので、帰ってきてからPSGI単体のアプリでどこまでチューニングできるかってのをやってみました。</p>
<p>で、できたのが<a href="https://gist.github.com/1178857">https://gist.github.com/1178857</a>これです。<a href="http://search.cpan.org/~stash/Feersum/">Feersum</a>で動かしてあげると、自分の環境で96550req/minのベストスコアがでました。一応永続化もしているので(デーモン化の設定さえすれば)再起動後も有効な、ISUCONレギュレーション完全対応なPSGIアプリになっています。ISUCONアプリの全体像を簡単に見通したい方にもオヌヌメです。といってもこのやりかたはたかが10並列でたかが3分間のアクセス（とpost数）とわかっているからできる構成なので実際の運用にそのまま生かせるような内容にはなっていませんので、そこのところご注意くださいです。</p>
<p>こんなわくわくするイベントを開催してくださったlivedoorの担当者の皆様ありがとうございました！</p>
<p>追記: その後nginxとも組み合わせてやってみたところ(<a href="https://gist.github.com/1179323">psgiもこんなかんじに修正して</a>)<br />
<a href="http://blog.everqueue.com/chiba/wp-content/uploads/2011/08/isucon2.jpg"><img src="http://blog.everqueue.com/chiba/wp-content/uploads/2011/08/isucon2.jpg" alt="" title="isucon2" width="260" height="174" class="alignnone size-full wp-image-538" /></a><br />
までいきました。nginxでは静的ファイルをserveして、keepalive,gzipオフ。</p>
<p>追記: nginx embeded perlで242686req/minでました。<a href="https://gist.github.com/1181564">https://gist.github.com/1181564</a><br />
nginx +proxy cacheでexpireしないようにして試すと、(当然FAILするけど)fetchesが30万前後だったのでまぁここらが自分的には限界 </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.everqueue.com/chiba/2011/08/30/530/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/2011/08/30/530/" />
	</item>
		<item>
		<title>DBD::mysql 4.020がリリースされました</title>
		<link>http://blog.everqueue.com/chiba/2011/08/22/517/</link>
		<comments>http://blog.everqueue.com/chiba/2011/08/22/517/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 17:56:45 +0000</pubDate>
		<dc:creator>chiba</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.everqueue.com/chiba/?p=517</guid>
		<description><![CDATA[DBD::mysqlの4.020が昨日リリースされました。 このリリースにはmysql_server_prepare=1を使っている場合のバグの修正が5件ほど含まれています。(ChangeLog) DBD::mysql  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://search.cpan.org/dist/DBD-mysql/">DBD::mysql</a>の4.020が昨日リリースされました。<br />
このリリースにはmysql_server_prepare=1を使っている場合のバグの修正が5件ほど含まれています。(<a href="http://cpansearch.perl.org/src/CAPTTOFU/DBD-mysql-4.020/ChangeLog">ChangeLog<a />)</p>
<p></a><a href="http://d.hatena.ne.jp/tociyuki/20110805/1312514580">DBD::mysql で mysql_server_prepare=1 のとき TEXT 型の欄が自動 utf8::decode されなくなる</a></p>
<p>こちらのブログで指摘されていた件を直してパッチを送ろうと思っておもむろにmysql_server_prepare=1の状態でDBD::mysqlのテストを実行したら失敗しまくったため、<a href="https://twitter.com/#!/nihen/status/99537355341443072">もう駄目かもしれない</a>と思ったのですが、何故か<a href="https://twitter.com/#!/nihen/status/100630106774581248">mysql_server_prepareと心中する腹をくくり</a>一応すべてのテストを通すようにパッチを送りまくってみたところ取り込まれたという感じになりました。(リリース後に2つほどさらに<a href="https://github.com/CaptTofu/DBD-mysql/pulls">pull req</a>していますが…。)</p>
<p>TEXT型がdecodeされない件はユーザ側で回避できない話ではないんだと思いますが、LONGBLOBで4GBのメモリをアロケートしようとする件はDB構成によっては回避のしようもなく、mysql_server_prepare=1はほとんど使われてないんだなぁという印象を持ちました。</p>
<p>一応改めて整理しておくと、mysqlのサーバーサイドのPrepared Statementは以前はクエリキャッシュがされないというかなり致命的なデメリットがありましたがバージョン5.1.17以降でC API等から利用されるバイナリプロトコルではキャッシュされるようになり、また5.1.22以降からはテキストプロトコル上でのPREPARE, EXECUTEでもキャッシュされるようになっています。(詳細は<a href="http://dev.mysql.com/doc/refman/5.1-olh/ja/query-cache-operation.html">クエリキャッシュの動作</a>を参照してください。)</p>
<p>mysqlのPrepared Statementはbind値を展開した後のクエリの結果をキャッシュしてくれるいわゆるQueryCacheのみの対応となっています。パラメータ値に依存しない実行計画をキャッシュしてくれるわけでは無いのでメリットは薄いと思われる部分はあるとは思うのですが、<a href="http://blog.everqueue.com/chiba/2009/01/12/85/">通信データが大きい場合には速い</a>というメリットも持っています。(今回のDBD::mysqlのバグはそのメリットを享受するべきLONGBLOBがほぼ動かないというひどいものではありましたが)</p>
<p><a href="http://krow.livejournal.com/599921.html">memory leakのような現象が起きるという中の人の指摘</a>もあったりしますが、これはステートメントハンドルやコネクションの管理をクライアント側できちんと行えば問題ないと思っていたりもします。（大規模環境でどうなのかというわれるとちょっとどうなのかなと思わなくもないですが）</p>
<p>というわけで、やはりまあ積極的に利用を勧める理由も無いのですが、積極的に回避する理由も無いとも思ってますので是非使えるかたは使ってみてください。で、DBD::mysql的にもMySQL本体的にも枯れてくれるとうれしいなと思ってます。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.everqueue.com/chiba/2011/08/22/517/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/2011/08/22/517/" />
	</item>
		<item>
		<title>Gearmanのはまりどころ</title>
		<link>http://blog.everqueue.com/chiba/2011/01/22/493/</link>
		<comments>http://blog.everqueue.com/chiba/2011/01/22/493/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 12:19:36 +0000</pubDate>
		<dc:creator>chiba</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.everqueue.com/chiba/?p=493</guid>
		<description><![CDATA[最近Gearmanに入門しているのですが、いろいろとはまったのでメモ。 $worker->workは&#8221;Do one job&#8221;ではなくDo job loop Gearman::WorkerのPODに [...]]]></description>
			<content:encoded><![CDATA[<p>最近Gearmanに入門しているのですが、いろいろとはまったのでメモ。</p>
<h3>$worker->workは&#8221;Do one job&#8221;ではなくDo job loop</h3>
<p><a href="http://search.cpan.org/~dormando/Gearman-1.11/lib/Gearman/Worker.pm">Gearman::WorkerのPOD</a>には</p>
<pre>
$worker->work while 1;
</pre>
<p>みたいなサンプルが書いてあったり</p>
<pre>
Gearman::Job->work(%opts)

Do one job and returns (no value returned). You can pass "on_start" "on_complete" and "on_fail" callbacks in %opts.
</pre>
<p>って書いてあるのですが(しかもこれは、Gearman::JobではなくてGearman::Workerだし、、、)<br />
workはオプション無しで呼ばれた場合はwhile 1なんかなくてもloopします。<br />
work_once的な動きにしたいのであれば</p>
<pre>
$worker->work(stop_if => sub { 1 });
</pre>
<p>とすればいいです。stop_ifをmax_requests_per_child的な動きにしたい場合はkazeburoさんの<a href="https://github.com/kazeburo/gearman-starter.pl/blob/master/gearman-starter.pl#L186">gearman-starter.pl</a>を参考にするといいです。</p>
<p>ちなみにこれは作者にメールでパッチも送ったりもしたのですが<a href="https://rt.cpan.org/Public/Bug/Display.html?id=46373">このRT</a>が同じ内容。1年半ぐらい放置みたいなので直る気配なし。</p>
<h3>Gearman::Client->job_serversはArrayRefを受け取れるけど、Gearman::Worker->job_serversは受け取れない</h3>
<p>結構はまりました。</p>
<pre>
my $clinet = Gearman::Clinet->new;
$client->job_servers(['127.0.0.1']);
</pre>
<p>はokだけど</p>
<pre>
my $worker = Gearman::Worker->new;
$worker->job_servers(['127.0.0.1']);
</pre>
<p>は駄目。正しくは</p>
<pre>
my $worker = Gearman::Worker->new;
$worker->job_servers('127.0.0.1');
</pre>
<p>としなければならない。これも<a href="https://rt.cpan.org/Public/Bug/Display.html?id=63110">RT</a>にあがってますね。</p>
<h3>Gearman::Workerはfork safeじゃないんでfork後生成</h3>
<p>まぁDBIのdbhとかと一緒ですね。いくつかのネット上の例でParallel::Preforkなんかと組み合わせて使う時に<br />
親プロセスで$worker作って共有している例<a href="#chu-20110122-01">注1</a>があったのですが、ちゃんとやるなら子供で生成すること。<br />
一見普通に動いちゃうのですが通信がまざって変になるかもしれないです。</p>
<h3>まとめ</h3>
<p>あたらしくCPANモジュールを使い出す時にはPODと共にRTも一緒に見ておくとよい。</p>
<p><a name="chu-20110122-01">注1</a><br />
<a href="http://www.slideshare.net/kazuho/writing-prefork-workers-servers">ここの11p</a>とか<a href="http://d.hatena.ne.jp/tokuhirom/20100201/1264989237">ここ</a>(もう直ってる)とか。ちなみにkazuhoさんの書いたものだと去年のadvent calendarの<a href="http://perl-users.jp/articles/advent-calendar/2010/english/4">Writing a prefork server / daemon using Parallel::Prefork</a>は子供でworker生成してます。この記事は、graceful shutdownやSIGHUPによるconfig reloadへの示唆が含まれているので必見ですです</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.everqueue.com/chiba/2011/01/22/493/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/2011/01/22/493/" />
	</item>
		<item>
		<title>X-Content-Type-Options: nosniffのつけ方</title>
		<link>http://blog.everqueue.com/chiba/2011/01/06/484/</link>
		<comments>http://blog.everqueue.com/chiba/2011/01/06/484/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 03:49:29 +0000</pubDate>
		<dc:creator>chiba</dc:creator>
				<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://blog.everqueue.com/chiba/?p=484</guid>
		<description><![CDATA[Apache mod_headersでできます Header set X-Content-Type-Options nosniff Nginx add_header X-Content-Type-Options nosn [...]]]></description>
			<content:encoded><![CDATA[<h3>Apache</h3>
<p>mod_headersでできます</p>
<pre>
Header set X-Content-Type-Options nosniff
</pre>
<h3>Nginx</h3>
<pre>
add_header X-Content-Type-Options nosniff;
</pre>
<p>但し、上記だとproxyなんかで既にX-Content-Type-Options: nosniff;が付いていると</p>
<pre>
X-Content-Type-Options: nosniff, nosniff
</pre>
<p>のようなヘッダになってしまう。問題ないかもしれないが気になる場合は<a href="http://wiki.nginx.org/NginxHttpHeadersMoreModule">NginxHttpHeadersMoreModule</a>を使って</p>
<pre>
more_set_headers 'X-Content-Type-Options: nosniff';
</pre>
<p>とすると良いのかも。</p>
<h3>Plack</h3>
<p><a href="http://search.cpan.org/~chiba/Plack-Middleware-Header/">Plack::Middleware::Header</a>を使うと簡単です。</p>
<pre>
enable 'Header', set => ['X-Content-Type-Options' => 'nosniff'];
</pre>
<p>参考: <a href="http://d.hatena.ne.jp/hasegawayosuke/20110106/p1">X-Content-Type-Options: nosniff つかわないやつは死ねばいいのに!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.everqueue.com/chiba/2011/01/06/484/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/2011/01/06/484/" />
	</item>
		<item>
		<title>日本の休日をPerlから求める</title>
		<link>http://blog.everqueue.com/chiba/2010/11/15/464/</link>
		<comments>http://blog.everqueue.com/chiba/2010/11/15/464/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 09:11:18 +0000</pubDate>
		<dc:creator>chiba</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.everqueue.com/chiba/?p=464</guid>
		<description><![CDATA[日本の休日には「国民の祝日」と「振替休日」と「国民の休日」ってのがあるのですがそれをPerlから求めるにはどうしたらいいんだという話。 #perl-casualでたずねたところいろいろと方法を教えてもらいました。 定番ネ [...]]]></description>
			<content:encoded><![CDATA[<p>日本の休日には「国民の祝日」と「振替休日」と「国民の休日」ってのがあるのですがそれをPerlから求めるにはどうしたらいいんだという話。<br />
#perl-casualでたずねたところいろいろと方法を教えてもらいました。<br />
定番ネタだし、それ三週目といわれたりしたのでまとめてみますたという流れ。</p>
<p>そもそも休日というのは法律で決められるものなので、改正もあり最近だと2005年に改正があったりしています。<br />
また、「国民の祝日」の中には「春分の日」や「秋分の日」のように翌年分を2月に官報で発表なんてものもあったりします。<br />
やっかいですね。</p>
<h2>CPANモジュールを使う</h2>
<h3><a href="http://search.cpan.org/~kztomita/Calendar-Japanese-Holiday/">Calendar::Japanese::Holiday</a></h3>
<p>最終更新日が2007年なようですが</p>
<pre>
use Calendar::Japanese::Holiday;
say isHoliday(2011, 3, 21);
say isHoliday(2011, 9, 23);
</pre>
<p>こんな感じで未来の秋分・春分の日も計算で求められているのでそれなりに信頼感はあるかと思います。<br />
ただし、「振替休日」に関しては下記のように第三引数に1をいれないと求めてくれないので注意。</p>
<pre>
use Calendar::Japanese::Holiday;
say isHoliday(2009, 5, 6); # これだと駄目
say isHoliday(2009, 5, 6, 1); # これならOK
</pre>
<h3><a href="http://coderepos.org/share/browser/lang/perl/DateTime-Holiday-Japanese">DateTime::Holiday::Japanese</a></h3>
<p>CPANモジュールではないですが、coderepos上に<a href="http://d.hatena.ne.jp/fbis/">fbis</a>さん作のモジュールもあがっています。</p>
<pre>
use DateTime::Holiday::Japanese qw/is_holiday/;
say is_holiday(year => 2011, month => 3, day => 21);
say is_holiday(year => 2011, month => 9, day => 23);
</pre>
<p>Calendar::Japanese::Holidayと同様に更新は2007年からされていないようですが秋分春分の日は計算で出しています。<br />
今日2009-2011のテストデータを追加してパスするのは確認しています。coderepos上にあるので法律変わったら誰かが更新してくれるんじゃないかという期待感あり。DateTime依存。</p>
<h2>ネット経由で情報を定期的にとってくる</h2>
<h3>Google Calendar Data API</h3>
<p>japanese@holiday.calendar.google.com<br />
 => 「振替休日」「国民の休日」には非対応(「国民の祝日」カレンダーだからそれが正しいんだよ派)<br />
outid3el0qkcrsuf89fltf7a4qbacgt9@import.calendar.google.com<br />
 => 「振替休日」「国民の休日」にも対応。使えそう<br />
<a href="https://www.mozilla.org/projects/calendar/holidays.html">https://www.mozilla.org/projects/calendar/holidays.html</a>のJapan Holidaysと同じデータぽいのかな。</p>
<h3>政府</h3>
<p><a href="http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html">「国民の祝日」について</a>が一番信頼できそうなネット上の情報な気もするが、別にこのページを維持すること自体を法律で定めているわけでもないし今年と来年のデータしかないのでそこまで使えるってわけでもない。「振替休日」と「国民の休日」については例だけなので将来的にどう表示されるのかも判然としない。<br />
目視確認なら法律と官報を確認するに次いで信頼性はあるかと。</p>
<h2>休日DBを独自に作成して運用者がメンテ</h2>
<p>最強</p>
<h2>まとめ</h2>
<p>CPANモジュールの&#8221;その時点での法律計算&#8221;系は手軽さはあるが、今後の法改正を見越すと若干難ありか。<br />
モジュール自体が毎年来年分のテストを追加してリリースされることが保障されていて、<br />
使う側も毎年保守ができるのであれば特に問題はなさそう。<br />
さらにモジュール自体もgithubなんかで複数人で保守されているといいなという話。<br />
API系は信頼できるものを政府が出してくれるとうれしいなーというところ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.everqueue.com/chiba/2010/11/15/464/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/2010/11/15/464/" />
	</item>
		<item>
		<title>XslateはSyntaxを変えても基本的には実運用上の速度は変わらない</title>
		<link>http://blog.everqueue.com/chiba/2010/08/13/434/</link>
		<comments>http://blog.everqueue.com/chiba/2010/08/13/434/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 10:54:00 +0000</pubDate>
		<dc:creator>chiba</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.everqueue.com/chiba/?p=434</guid>
		<description><![CDATA[TTの158倍速いというxslateですが、このベンチマークはSyntax::Kolonを使っています。 TT互換なSyntaxであるところの、Syntax::TTerseを使うとどうなるのかなということでhttp:// [...]]]></description>
			<content:encoded><![CDATA[<p>TTの158倍速いという<a href="http://xslate.org/">xslate</a>ですが、このベンチマークはSyntax::Kolonを使っています。<br />
TT互換なSyntaxであるところの、Syntax::TTerseを使うとどうなるのかなということで<a href="http://github.com/nihen/p5-Text-Xslate/tree/add_tterse_bench">http://github.com/nihen/p5-Text-Xslate/tree/add_tterse_bench</a>のbenchmark/x-rich-enc.plとbenchmark/x-poor-env.plにTTerseも追加してみました。</p>
<p>以下結果</p>
<pre>
%perl benchmark/x-rich-env.pl
Perl/5.12.1 i686-linux
Text::Xslate/0.1056
Text::MicroTemplate/0.15
Text::MicroTemplate::Extended/0.11
Template/2.22
Text::ClearSilver/0.10.5.4
HTML::Template::Pro/0.9502
1..5
ok 1 - TTerse: Text::Xslate::Syntax::TTerse
ok 2 - TT: Template-Toolkit
ok 3 - MT: Text::MicroTemplate
ok 4 - TCS: Text::ClearSilver
ok 5 - HTP: HTML::Template::Pro
Benchmarks with 'include' (datasize=100)
          Rate     TT     MT    TCS    HTP Xslate TTerse
TT      78.6/s     --   -69%   -94%   -95%   -99%   -99%
MT       257/s   227%     --   -82%   -84%   -98%   -98%
TCS     1412/s  1697%   450%     --   -11%   -89%   -89%
HTP     1586/s  1918%   517%    12%     --   -88%   -88%
Xslate 13241/s 16752%  5054%   838%   735%     --    -1%
TTerse 13397/s 16951%  5115%   849%   745%     1%     --
</pre>
<pre>
%perl benchmark/x-poor-env.pl
Perl/5.12.1 i686-linux
Text::Xslate/0.1056
Template/2.22
HTML::Template/2.9
Text::MicroTemplate/0.15
Text::MicroTemplate::Extended/0.11
1..4
ok 1 - TTerse: Text::Xslate::Syntax::TTerse
ok 2 - TT: Template-Toolkit
ok 3 - MT: Text::MicroTemplate
ok 4 - HT: HTML::Template
Benchmarks with 'include' (datasize=100)
         Rate     TT TTerse Xslate     HT     MT
TT     49.5/s     --   -27%   -28%   -61%   -80%
TTerse 67.9/s    37%     --    -1%   -47%   -73%
Xslate 68.5/s    38%     1%     --   -46%   -73%
HT      127/s   157%    88%    86%     --   -50%
MT      253/s   411%   273%   269%    99%     --
</pre>
<p>このように誤差の範囲ぐらいの差しか無く同様に速い。<br />
これはなぜかというと、Xslateは様々なSyntaxで書かれたテンプレートを共通の中間コードにコンパイルし、それをキャッシュしているためその中間コードはほぼ同一のものになるからです。<br />
一応そのコンパイル部分には差が現れるが、ファイルキャッシュもできない環境というのはほぼありえないので実運用上、速度の差は無いと言ってよいとおもわれる。というわけでTT使ってる人は安心してTTerseに移行してみるといいと思うです。（互換性がどの程度あるのかは使ってないから知らないけど!)</p>
<p>ちなみにコンパイル部分のみのベンチマーク</p>
<pre>
% perl author/bench_compile.pl
Parser: Kolon v.s. TTerse
         Rate tterse  kolon
tterse 80.1/s     --   -42%
kolon   139/s    74%     --
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.everqueue.com/chiba/2010/08/13/434/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/2010/08/13/434/" />
	</item>
		<item>
		<title>Path::AttrRouterにHTTPメソッド制限できる機能を追加してみた</title>
		<link>http://blog.everqueue.com/chiba/2010/07/10/417/</link>
		<comments>http://blog.everqueue.com/chiba/2010/07/10/417/#comments</comments>
		<pubDate>Sat, 10 Jul 2010 14:53:26 +0000</pubDate>
		<dc:creator>chiba</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.everqueue.com/chiba/?p=417</guid>
		<description><![CDATA[Path::AttrRouterというtypesterさんが開発されているdispatcherがあって、Catalyst-likeなControllerのattributeを拾ってきてルーティングテーブルを作成してくれる [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/typester/Path-AttrRouter">Path::AttrRouter</a>というtypesterさんが開発されているdispatcherがあって、Catalyst-likeなControllerのattributeを拾ってきてルーティングテーブルを作成してくれるのが便利で使っています。</p>
<p>で、HTTPメソッドを考慮したルーティングを行ってくれる機能が欲しかったので追加してみました。<br />
<a href="http://github.com/nihen/Path-AttrRouter/tree/method_support">method_supportブランチ</a>としてforkしてgithubにあげてあります。</p>
<p>使い方はこんな感じです。</p>
<pre>
use Path::AttrRouter;

{
    package MyController;
    use base 'Path::AttrRouter::Controller';

    sub index :Path { print &quot;index\n&quot; }
    sub post :Path Method('POST') { print &quot;post\n&quot; }
}

my $router = Path::AttrRouter-&gt;new( search_path =&gt; 'MyController' );

my $m;

$m = $router-&gt;match('/', 'GET');
$m-&gt;dispatch; # index

$m = $router-&gt;match('/', 'POST');
$m-&gt;dispatch; # post
</pre>
<p>Methodが指定されなかったsubroutineはGET, HEADがデフォルトになるようになってます。<br />
一応後方互換性は考慮してあり、$router-&gt;matchの第二引数が空の場合は<br />
どのメソッドでもマッチするようになっています。</p>
<p>本家にとりこまれればうれしいけれど取り込まれなければ別distとして継承使って作り直すかもです。</p>
<p>ところで、諸事情により前職を退職していまして、ブログURLを移転しています。<br />
RSSリーダーに登録されていた方等は再度登録お願い致しますです。<br />
一応302飛ばすようにしてはあるんですが、RSSリーダーって自動的にそこらへん追跡してくれないんすかね。</p>
<p>追記(2010-07-11 17:17)<br />
<a href="http://twitter.com/#!/typester/status/18255875606">http://twitter.com/#!/typester/status/18255875606</a><br />
とのことです。確かにPath::名前スペースなのでHTTPメソッドに依存するのは筋悪でした。<br />
HTTP::AttrRouterとかで作ってみようかなーと考え中。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.everqueue.com/chiba/2010/07/10/417/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/2010/07/10/417/" />
	</item>
		<item>
		<title>PlackにおけるCSRFとDNS-Rebinding対策</title>
		<link>http://blog.everqueue.com/chiba/2009/12/20/402/</link>
		<comments>http://blog.everqueue.com/chiba/2009/12/20/402/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 02:32:53 +0000</pubDate>
		<dc:creator>chiba</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.everqueue.com/chiba/?p=402</guid>
		<description><![CDATA[最近のwebセキュリティ界隈ではCSRFやDNS-Rebindingが話題ですが、Plackでアプリケーションサーバを立ち上げる際にこれらの対策をどのように行うかについてまとめてみました。 まず、CSRF対策ですが、拙作 [...]]]></description>
			<content:encoded><![CDATA[<p>最近のwebセキュリティ界隈ではCSRFやDNS-Rebindingが話題ですが、Plackでアプリケーションサーバを立ち上げる際にこれらの対策をどのように行うかについてまとめてみました。</p>
<p>まず、CSRF対策ですが、拙作の<a href="http://search.cpan.org/~chiba/Plack-Middleware-RefererCheck/">Plack::Middleware::RefererCheck</a>を使うことにより、RefererのチェックによるCSRF対策が行えます。CSRF対策としては、onetime token方式も存在しますが、個人的にはRefererチェックが導入が楽で好きではあります。Refererを送信しないクライアントを対象にしたサービスを運営される方は別途onetime token方式の対策をおこなってください。</p>
<p>Plack::Middleware::RefererCheckの使い方はこのようになります。(SYNOPSYSからの抜粋)</p>
<pre>
use Plack::Builder;

builder {
  enable 'RefererCheck', host =&gt; 'www.example.com', same_scheme =&gt; 1, error_app =&gt; sub { [403, [], ['Forbidden']] };
  $app;
};

# or more simply(host from $env-&gt;{HTTP_HOST} and same_scheme =&gt; 0)
# this is vulnerabilly for DNS Rebinding
builder {
  enable 'RefererCheck';
  $app;
};
</pre>
<p>さて、コード中にも書いてあるように後者のチェック用hostをHTTP_HOSTから取得する方法はDNS-Rebindingに脆弱です。しかし前者のように固定hostを設定することにより、DNS-Rebindingへの対策も同時にできることになります。尚、onetime token方式ではXHRのsame originポリシーの崩壊によりDNS-Rebindingへの対策を単体で行うことはできません。</p>
<p>このようにRefererCheckを固定hostで行うことによりCSRF対策においてはDNS-Rebindingに対応できますが、CSRFから保護されるページ以外についても当然DNS-Rebindingでのアクセスははじきたいところです。apache等においてはname base virtual hostを活用することにより、期待するホスト名以外のアクセスをはじくことができますが、PlackでもPlack::App::URLMap(mount)を使うことにより同様のことが可能です。</p>
<pre>
use Plack::Builder;
builder {
  mount 'http://example.com/' =&gt; builder {
    mount '/app' =&gt; $app;
    mount '/admin' =&gt; $admin_app;
 }
}
</pre>
<p>このようにすることにより、example.com以外のHOSTでのアクセスは404となります。mountは上記の例のように、hostの指定とpath_infoの指定を同時に行えるもので、apacheでいうとVirtualhostとLocationを一緒にしたような機能になります。なので、上記のコードは下記のコードと等価です。</p>
<pre>
use Plack::Builder;
builder {
  mount 'http://example.com/app/' =&gt; $app;
  mount 'http://example.com/admin/' =&gt; $admin_app;
}
</pre>
<p>もちろんホスト名を違うものをmountできますのでPlack単体でVirtualhostな運用もできます。URLMap便利ですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.everqueue.com/chiba/2009/12/20/402/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/2009/12/20/402/" />
	</item>
		<item>
		<title>Plack::Middleware::Header</title>
		<link>http://blog.everqueue.com/chiba/2009/12/03/396/</link>
		<comments>http://blog.everqueue.com/chiba/2009/12/03/396/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 14:19:23 +0000</pubDate>
		<dc:creator>chiba</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.everqueue.com/chiba/?p=396</guid>
		<description><![CDATA[Plack::Middleware::Headerをgithubに上げました。 これは、Plack::Middlewareレイヤーでレスポンスヘッダを設定するもので、Apacheでいうところのmod_headersに相当 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/nihen/Plack-Middleware-Header">Plack::Middleware::Header</a>をgithubに上げました。</p>
<p>これは、Plack::Middlewareレイヤーでレスポンスヘッダを設定するもので、Apacheでいうところの<a href="http://httpd.apache.org/docs/2.2/ja/mod/mod_headers.html">mod_headers</a>に相当します。</p>
<p>使い方はこんな感じです。</p>
<pre>
use Plack::Builder;
builder {
    enable 'Header',
        set =&gt; ['X-Plack-One' =&gt; '1'],
        append =&gt; ['X-Plack-Two' =&gt; '2'],
        unset =&gt; ['X-Plack-Three'];
    $app;
};
</pre>
<p>自分はPlack::Middleware::Staticと併用してExpiresをつけたりするのに使うために作りました。IEがExpires: -1とかやっておかないとしばらくキャッシュしてIf-Modifled-Sinceなリクエストも投げてくれなくなっちゃうという弊害があったので。</p>
<p>あと、IE関連では、If-Modified-Sinceの値に&#8221;;length=***&#8221;という余計なものが付いてきてしまい(<a href="http://hail2u.net/blog/blosxom/last_modified_plugin.html">ここ</a>や<a href="http://bakera.jp/ebi/topic/586">ここ</a>を参照)、Middleware::ConditionalGETを有効にしても304を吐けなかったりしていたので、それを取り除くためのMiddlewareも<a href="https://gist.github.com/53853dc0cbdf73833519">書いてみました</a>。こちらは名前とかがきもいのでgistレベル。</p>
<p>追記(2009-12-13 21:27): <a href="http://search.cpan.org/~chiba/Plack-Middleware-Header/">cpan</a>にアップしました。あと、If-Modified-SinceのIEバグの件はmiyagawaさんが<a href="http://github.com/miyagawa/Plack/commit/8f3711b0a4689ad57c15c0cb83e0fbe5d50b5296">ConditionalGET側で対応してくれました</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.everqueue.com/chiba/2009/12/03/396/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.everqueue.com/chiba/2009/12/03/396/" />
	</item>
	</channel>
</rss>

