<?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>へぼへぼCTO日記</title>
	<atom:link href="http://www.geminium.com/chiba_blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.geminium.com/chiba_blog</link>
	<description>perlのこととかjavascriptのこととかwebのこととかを書いていくかも</description>
	<lastBuildDate>Sun, 20 Dec 2009 02:38:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/feed/" />
		<item>
		<title>PlackにおけるCSRFとDNS-Rebinding対策</title>
		<link>http://www.geminium.com/chiba_blog/2009/12/20/402/</link>
		<comments>http://www.geminium.com/chiba_blog/2009/12/20/402/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 02:32:53 +0000</pubDate>
		<dc:creator>Chiba Masahiro</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.geminium.com/chiba_blog/?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://www.geminium.com/chiba_blog/2009/12/20/402/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/2009/12/20/402/" />
	</item>
		<item>
		<title>Plack::Middleware::Header</title>
		<link>http://www.geminium.com/chiba_blog/2009/12/03/396/</link>
		<comments>http://www.geminium.com/chiba_blog/2009/12/03/396/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 14:19:23 +0000</pubDate>
		<dc:creator>Chiba Masahiro</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.geminium.com/chiba_blog/?p=396</guid>
		<description><![CDATA[				Plack::Middleware::Headerをgithubに上げました。
				これは、Plack::Middlewareレイヤーでレスポンスヘッダを設定するもので、Apacheでいうところのmod_he [...]]]></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://www.geminium.com/chiba_blog/2009/12/03/396/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/2009/12/03/396/" />
	</item>
		<item>
		<title>patternがemptyな場合には前回成功時のpatternが使われるというハマりポイント</title>
		<link>http://www.geminium.com/chiba_blog/2009/11/26/390/</link>
		<comments>http://www.geminium.com/chiba_blog/2009/11/26/390/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 17:42:23 +0000</pubDate>
		<dc:creator>Chiba Masahiro</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.geminium.com/chiba_blog/?p=390</guid>
		<description><![CDATA[				
print "match1\n" if "baz" =~ m{};
"foo" =~ m{foo};
print "match2\n" if "baz" =~ m{};

				の結果は
				
match [...]]]></description>
			<content:encoded><![CDATA[				<pre>
print "match1\n" if "baz" =~ m{};
"foo" =~ m{foo};
print "match2\n" if "baz" =~ m{};
</pre>
				<p>の結果は</p>
				<pre>
match1
</pre>
				<p>である。なぜなら<a href="http://search.cpan.org/~dapm/perl-5.10.1/pod/perlreref.pod">perldoc perlreref</a>に書いてある通り、</p>
				<pre>
If 'pattern' is an empty string, the last successfully matched regex is used.
</pre>
				<p>であるから。</p>
				<p>patternを動的に生成してたりする時に空になっちゃうケースなんかがあると思うので、その場合はマッチ処理自体を回避するようにしたほうがよいかと思われます。</p>
				<p>最初バグかと思いました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geminium.com/chiba_blog/2009/11/26/390/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/2009/11/26/390/" />
	</item>
		<item>
		<title>Casual Talks#1でLTしてきました</title>
		<link>http://www.geminium.com/chiba_blog/2009/11/21/381/</link>
		<comments>http://www.geminium.com/chiba_blog/2009/11/21/381/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 13:35:56 +0000</pubDate>
		<dc:creator>Chiba Masahiro</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.geminium.com/chiba_blog/?p=381</guid>
		<description><![CDATA[				昨日(11/20)にperl-casualのCasual Talks#1にて拙作のFormValidator::NestedについてLTしてきました。
				slideをslideshareにあげておきました。 [...]]]></description>
			<content:encoded><![CDATA[				<p>昨日(11/20)に<a href="http://perl-casual.org/">perl-casual</a>のCasual Talks#1にて拙作の<a href="http://search.cpan.org/~chiba/FormValidator-Nested/">FormValidator::Nested</a>についてLTしてきました。</p>
				<p>slideをslideshareにあげておきました。</p>
				<div style="width:425px;text-align:left;margin: 0.5em 30px 1em" id="__ss_2551782"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/nihen/form-validator-nested" title="Form Validator Nested">Form Validator Nested</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=formvalidator-nested-091121055519-phpapp01&#038;stripped_title=form-validator-nested" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=formvalidator-nested-091121055519-phpapp01&#038;stripped_title=form-validator-nested" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
				<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/nihen">nihen</a>.</div>
				</div>
				<p>得られた教訓<br />
				 1. 実際に話し始めると早口気味になるのでスライド大目ぐらいが自分にはちょうどいいかも<br />
				 2. プロジェクターにつなぐときはねじをちゃんとしめておく<br />
				 3. やっぱり笑いを一つぐらいとっといたほうが場は暖かくなる<br />
				  (PAUSE ID requestの際にcatalyst-pluginを作りたいと書いていたと言ったときに若干嘲笑気味の笑いはありましたがｗ)</p>
				<p>自分以外も発表が初めてだという方も多かったのに、発表が皆さんうまくて非常に面白かったです。またの機会があったら今回の教訓を踏まえまた発表できたら幸いです。</p>
				<p>主催されたyusukebeさん、会場の用意や二次会の(実質)幹事をされたnobjasさんお疲れ様でした。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geminium.com/chiba_blog/2009/11/21/381/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/2009/11/21/381/" />
	</item>
		<item>
		<title>JSocketを使ってPOSTもストリーミングするPlackアプリ</title>
		<link>http://www.geminium.com/chiba_blog/2009/10/20/371/</link>
		<comments>http://www.geminium.com/chiba_blog/2009/10/20/371/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 18:58:37 +0000</pubDate>
		<dc:creator>Chiba Masahiro</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.geminium.com/chiba_blog/?p=371</guid>
		<description><![CDATA[				さて、前エントリでJSocketというのを作ったと書いたのですが、これは実はjavascriptで動くtwitter streamクライアントを作るならばmultipart/mixedを使うべきというのを読んで、 [...]]]></description>
			<content:encoded><![CDATA[				<p>さて、<a href="http://www.geminium.com/chiba_blog/2009/10/20/365/">前エントリ</a>で<a href="http://github.com/nihen/JSocket">JSocket</a>というのを作ったと書いたのですが、これは実は<a href="http://mattn.kaoriya.net/software/lang/javascript/20091013002658.htm">javascriptで動くtwitter streamクライアントを作るならばmultipart/mixedを使うべき</a>というのを読んで、レスポンスがpollではなくてストリーミングできるというのを知って、リクエストもやりたいよというふうに思ったのがきっかけでした。</p>
				<p>まず、XHRでできないかを試してみたのですが、xhr.send(data)を一回読んでしまうと少なくともjavascript側ではリクエストは完了したと思ってしまって、再度xhr.send(data)しても反応はありませんでした。</p>
				<p>そこでJSocketの登場です。JSocketを使うとhttpリクエストを断続的に送信することができます。やったですね。</p>
				<p>で、Plack::Server::Coroを使って試しに<br />
				<a href="http://chiba.geminium.jp:9999/static/index.html">リアルタイムチャット</a><br />
				を作ってみました。どうぞお試し下さい。レスポンスもJSocketを使っていますのでmultipartに比べてboundary分お得だったりもします。テキストエリアに入力された文字がストリーミングで送信され、また他人のデータもストリーミングで受信できていると思います。ちなみに自分の発言もサーバから持ってきてるので一人でも確認できます。</p>
				<p>ちなみにこれを1つのコネクションでやってしまおうというのがWebsocketなんだろうという認識ですね。ただwebsocketはhttpの上に一応のってますがハンドシェイク以外の部分はhttp/1.0やhttp/1.1的には正しくないでしょうし、JSocketでの二重接続であれば正しいhttpとしてふるまえるはずで、現行のapacheやproxy等でも扱える可能性があったりします。</p>
				<p>あ、チャットのサンプルコードも<a href="http://github.com/nihen/placksamples/tree/master/chatstream/">github</a>にあげてあります。</p>
				<pre>
plackup -s Coro --app chat.psgi
</pre>
				<p>という感じでPlack::Server::Coroをお使いください。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geminium.com/chiba_blog/2009/10/20/371/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/2009/10/20/371/" />
	</item>
		<item>
		<title>javascriptからsocketが扱えるJSocketを作りました</title>
		<link>http://www.geminium.com/chiba_blog/2009/10/20/365/</link>
		<comments>http://www.geminium.com/chiba_blog/2009/10/20/365/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 15:18:49 +0000</pubDate>
		<dc:creator>Chiba Masahiro</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.geminium.com/chiba_blog/?p=365</guid>
		<description><![CDATA[				javascriptからsocketを扱いたいなぁという事象が発生したんですが(それについては別エントリで)、SocketJSというのがあるんですがDownloadするところがなぜかSSLになっていてCAがCAc [...]]]></description>
			<content:encoded><![CDATA[				<p>javascriptからsocketを扱いたいなぁという事象が発生したんですが(それについては<a href="http://www.geminium.com/chiba_blog/2009/10/20/371/">別エントリ</a>で)、<a href="http://dev.dschini.org/socketjs/">SocketJS</a>というのがあるんですが<a href="https://thinkforge.org/projects/socketjs/">Downloadするところ</a>がなぜかSSLになっていてCAがCAcertでfirefoxだとデフォルトでは見れないので、かっとなって自分で作ってみました。今も反省していません。</p>
				<p>コードは<a href="http://github.com/nihen/JSocket">github</a>からどうぞ。<br />
				使い方はjs/jsocket.jsに軽く書いてあります。</p>
				<pre>
/*
 * Jsocket - Socket on Javascript
 * Author: Masahiro Chiba &lt;nihen@megabbs.com&gt;
 * Depends:
 *  - jQuery: http://jquery.com/
 *  - jQuery TOOLS - Flashembed: http://flowplayer.org/tools/flashembed.html
 * SYNOPSIS:
 *  JSocket.init('/static/JSocket.swf', function () {
 *     socket = new JSocket({
 *         connectHandler: connectHandler,
 *         dataHandler:    dataHandler,
 *         closeHandler:   closeHandler,
 *         errorHandler:   errorHandler
 *     });
 *     socket.connect(location.hostname, location.port || 80);
 *  });
 *  function connectHandler() {
 *      socket.write("GET / HTTP/1.0\x0D\x0A\x0D\x0A");
 *      socket.flush();
 *  }
 *  function dataHandler(data) {
 *      alert(data);
 *      socket.close();
 *  }
 *  function closeHandler() {
 *      alert('lost connection')
 *  }
 *  function errorHandler(errorstr) {
 *      alert(errorstr);
 *  }
 *
 * */
</pre>
				<p>こんな感じですね。flashの力を借りているので、<a href="http://gimite.net/pukiwiki/index.php?Flash%A4%CE%A5%BD%A5%B1%A5%C3%A5%C8%A5%DD%A5%EA%A5%B7%A1%BC%A5%D5%A5%A1%A5%A4%A5%EB">Flashのソケットポリシーファイル</a>とかを参考にポリシーファイルを配布するサーバを立ち上げておいてから使ってください。まる。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geminium.com/chiba_blog/2009/10/20/365/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/2009/10/20/365/" />
	</item>
		<item>
		<title>mod_psgi試してみた</title>
		<link>http://www.geminium.com/chiba_blog/2009/10/16/358/</link>
		<comments>http://www.geminium.com/chiba_blog/2009/10/16/358/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 09:17:20 +0000</pubDate>
		<dc:creator>Chiba Masahiro</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.geminium.com/chiba_blog/?p=358</guid>
		<description><![CDATA[				mod_psgi をインストールしてみたをみて速くなるなら試してみようということでmod_psgiを試してみますた。
				まずはこんな感じの簡単なPSGIアプリで。
				
my $app = sub {
 [...]]]></description>
			<content:encoded><![CDATA[				<p><a href="http://d.hatena.ne.jp/sfujiwara/20091015/1255607578">mod_psgi をインストールしてみた</a>をみて速くなるなら試してみようということで<a href="http://github.com/spiritloose/mod_psgi">mod_psgi</a>を試してみますた。</p>
				<p>まずはこんな感じの簡単なPSGIアプリで。</p>
				<pre>
my $app = sub {
    return ['200', [Content-Length => '5'], ['hello']];
};
</pre>
				<pre>
ab -n 10000 -c 100
mod_psgi
 Requests per second:    1403.51 [#/sec] (mean)
mod_perl
 Requests per second:    668.33 [#/sec] (mean)
Standalone
 Requests per second:    702.46 [#/sec] (mean)
Standalone::Prefork
 Requests per second:    725.78 [#/sec] (mean)
</pre>
				<p>おおおお。超絶早いですね!<br />
				(plackupの際に-E product(development以外ならなんでもおｋ)をつけないとだいぶ遅くてそれをそのまま載せてたのを修正しました)</p>
				<p>で、お次は、<a href="http://search.cpan.org/~miyagawa/Catalyst-Engine-PSGI/">Catalyst::Engine::PSGI</a>を使ってCatalystのhello worldなアプリを。</p>
				<pre>
catalyst.pl Hello
</pre>
				<p>で作って、debugモードを切って、Root.pmのindexで</p>
				<pre>
    $c->response->content_type('text/plain');
    $c->response->body( 'hello' );
</pre>
				<p>こんな感じにしたもの。</p>
				<pre>
ab -n 1000 -c 10
mod_psgi
 Requests per second:    207.87 [#/sec] (mean)
mod_perl
 Requests per second:    144.94 [#/sec] (mean)
cat-standalone
 Requests per second:    184.95 [#/sec] (mean)
</pre>
				<p>おおおおお。早いですね!!これはこれだけでも乗り換える意味がありそうだ。と思ってたんですが現在実運用中のCatalystアプリでやってみたところ&#8221;child pid 32320 exit signal Segmentation fault (11)&#8221;とかいって死にました。うーむ。これは再現する最小構成を探って<a href="http://d.hatena.ne.jp/spiritloose/">id:spiritloose</a>さんにフィードバックしたいところですね。</p>
				<p>casual-perlerな人たちは今持ってるCatalystアプリをmod_psgi+Catalyst::Engine::PSGIで動かしてどんどんフィードバックするといいんじゃないかな！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geminium.com/chiba_blog/2009/10/16/358/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/2009/10/16/358/" />
	</item>
		<item>
		<title>Archer and Git</title>
		<link>http://www.geminium.com/chiba_blog/2009/10/16/351/</link>
		<comments>http://www.geminium.com/chiba_blog/2009/10/16/351/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 18:17:31 +0000</pubDate>
		<dc:creator>Chiba Masahiro</dc:creator>
				<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.geminium.com/chiba_blog/?p=351</guid>
		<description><![CDATA[				最近会社のレポジトリ管理も順次gitに移行しようとしてるのですが、今までArcher&#038;svnでデプロイしていたものをgit用にarcher.ymlを書き換えしてみた。
				
				汎用的にはこんな [...]]]></description>
			<content:encoded><![CDATA[				<p>最近会社のレポジトリ管理も順次gitに移行しようとしてるのですが、今までArcher&#038;svnでデプロイしていたものをgit用にarcher.ymlを書き換えしてみた。</p>
				<p><script src="http://gist.github.com/211153.js"></script></p>
				<p>汎用的にはこんな感じ。中央サーバのレポジトリにreleaseというブランチを作っておいて、作業者もそれの追跡ローカルブランチなreleaseを作っておくというのが前提。releaseに直接コミットは厳禁。</p>
				<p>git stash saveがあるから作業ディレクトリを別に用意する必要ないかなぁとか思ってこんな形にしてみた。今のところ満足してるけど運用しているうちになんか不具合がでるかもしれない。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geminium.com/chiba_blog/2009/10/16/351/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/2009/10/16/351/" />
	</item>
		<item>
		<title>Acme::Coro::Sukeをリリースしました</title>
		<link>http://www.geminium.com/chiba_blog/2009/10/12/346/</link>
		<comments>http://www.geminium.com/chiba_blog/2009/10/12/346/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 06:44:51 +0000</pubDate>
		<dc:creator>Chiba Masahiro</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.geminium.com/chiba_blog/?p=346</guid>
		<description><![CDATA[				多分、5人以上の人が思いついたけどあまりのくだらなさに作成を断念したといううわさのAcme::Coro::Sukeを先ほどCPANにリリースしました。(githubにもあげてあります)
				これは、Coroの [...]]]></description>
			<content:encoded><![CDATA[				<p>多分、5人以上の人が思いついたけどあまりのくだらなさに作成を断念したといううわさの<a href="http://search.cpan.org/~chiba/Acme-Coro-Suke/">Acme::Coro::Suke</a>を先ほどCPANにリリースしました。(<a href="http://github.com/nihen/acme-coro-suke">github</a>にもあげてあります)</p>
				<p>これは、Coroのasyncと基本的には同じ動作をするbenzoというブロック定義ができるようになるもので、benzoブロックにCoroがスレッドを切り替えるたびに、「うわぁ…べんぞうさんの中…すごくあったかいナリぃ… 」とコロちゃんが囁やいてくれるモジュールです。<br />
				一番簡単な使い方は以下のようになります。</p>
				<pre>
use Coro;
use Acme::Coro::Suke;
benzo {
};
cede;
</pre>
				<p>enjoy Acme::Coro::Suke!</p>
				<p>CPANに上げる三つめのモジュールがAcmeモジュールというのはこれはひどい。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geminium.com/chiba_blog/2009/10/12/346/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/2009/10/12/346/" />
	</item>
		<item>
		<title>Re: PSGI Implのsendfileについて</title>
		<link>http://www.geminium.com/chiba_blog/2009/10/07/327/</link>
		<comments>http://www.geminium.com/chiba_blog/2009/10/07/327/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 06:29:06 +0000</pubDate>
		<dc:creator>Chiba Masahiro</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.geminium.com/chiba_blog/?p=327</guid>
		<description><![CDATA[				PSGI Implのsendfileについてですが、自分の今のところのイメージを書いておくです。
				on Plack::Server
				
				$res-&#62;[2]がGLOBだったら filen [...]]]></description>
			<content:encoded><![CDATA[				<p><a href="http://blog.yappo.jp/yappo/archives/000689.html">PSGI Implのsendfileについて</a>ですが、自分の今のところのイメージを書いておくです。</p>
				<h4>on Plack::Server</h4>
				<ul>
				<li>$res-&gt;[2]がGLOBだったら fileno($res-&gt;[2])して sendfile に fd を渡す</li>
				<li>$res-&gt;[2]->can(&#8216;fileno&#8217;) が生えてたら、$res-&gt;[2]-&gt;filenoからfdを取って使う</li>
				<li>$res-&gt;[2]->can(&#8216;path&#8217;) が生えてたら、$res-&gt;[2]-&gt;pathからファイルパスを取って使う</li>
				</ul>
				<p>$env->{psgix.sendfile}を使わない以外は一緒</p>
				<h4>on app</h4>
				<p>realfileをserveしたい時は</p>
				<ul>
				<li>GLOBを返す</li>
				<li>-&gt;pathを生やしたIO-Handle-likeなオブジェクトを返す</li>
				</ul>
				<p>の二種類の方法があって、後者のほうがあらゆるサーバで最適化される可能性がある。かといって前者だからといってクライアントに届くresponseが変わることはないと期待される。後者において-&gt;filenoの実体のファイルと-&gt;pathが違うものだった場合の動作は未定義。</p>
				<h4>on middleware</h4>
				<ul>
				<li>Plack::Middleware::XSendfile<br />
				    responseから-&gt;pathが取れる場合にはそれをヘッダのX-Sendfileにセットするようなmiddleware。<a href="http://github.com/nihen/Plack/blob/impl-psgixsendfile/lib/Plack/Middleware/XSendfile.pm">これ</a>のpsgix.sendfileサポートを無くしたやつのイメージ。<br />
				    X-Sendfileヘッダをセットする場合というのはbackendがlightyの場合とかだと思うけど、それをセットしていいかどうかはPlackは知り得ない。かといってappでセットしていて必要のない時に外にファイルPATHが出ていくものいくない。というわけでappでは-&gt;path付きオブジェクトを返すだけにして、このmiddlewareをbackendにあわせて付けたり外したりする。Plack::Server::*のsendfile(2)サポートとかとはまったく関係無い。
				</li>
				<li>Plack::Middleware::GuessPath<br />
				    GLOBからファイルPathを推測して-&gt;path付きのオブジェクトに変換しちゃうMiddleware。マルチプラットフォーム対応が課題。Plack::Middleware::XSendfileより先に実行する。Plack::Server::*のsendfile(2)サポートとも関係する。
				</li>
				</ul>
				<p><em><br />
				追記(10/7 17:24): 大体ここに書いてある感じで追加されたみたいです。詳しくは本家specの<a href="http://github.com/miyagawa/psgi-specs/commit/0e5b33e0abc7f586e1034977cf76da9cd5d59a36">changeset</a>をご覧ください。<a href="http://github.com/miyagawa/Plack/blob/master/lib/Plack/Middleware/XSendfile.pm">Plack::Middleware::XSendfile</a>も追加されたみたいです。miyagawaさん仕事ハヤス、、、。<br />
				</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.geminium.com/chiba_blog/2009/10/07/327/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.geminium.com/chiba_blog/2009/10/07/327/" />
	</item>
	</channel>
</rss>
