<?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/"
	>

<channel>
	<title>Selfkleptomaniac</title>
	<atom:link href="http://selfkleptomaniac.org/feed" rel="self" type="application/rss+xml" />
	<link>http://selfkleptomaniac.org</link>
	<description>Blogging is a disease: selfkleptomania, your normal condition.</description>
	<lastBuildDate>Wed, 10 Mar 2010 02:38:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>findの小ネタ</title>
		<link>http://selfkleptomaniac.org/archives/1340</link>
		<comments>http://selfkleptomaniac.org/archives/1340#comments</comments>
		<pubDate>Wed, 10 Mar 2010 02:38:28 +0000</pubDate>
		<dc:creator>y</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tuit]]></category>

		<guid isPermaLink="false">http://selfkleptomaniac.org/archives/1340</guid>
		<description><![CDATA[Linux（ext3）にNASでマウントした領域をfindで検索するとき、普通に実行しても再帰的に検索はしてくれないのね。
実際には2階層下にファイルがある：

$ ls -R nas_mnt_point
a b c

nas_mnt_point/a
a.txt

nas_mnt_point/b
b.txt

nas_mnt_point/
c.txt

でもfindでは：

$ find nas_mnt_point
nas_mnt_point/a
nas_mnt_point/b
nas_mnt_point/c

で、symlinkと同じように-followオプションを付けると：

$ find nas_mnt_point -follow
nas_mnt_point/a
nas_mnt_point/a/a.txt
nas_mnt_point/b
nas_mnt_point/b/b.txt
nas_mnt_point/c
nas_mnt_point/c/c.txt

それだけ。
]]></description>
			<content:encoded><![CDATA[<p>Linux（ext3）にNASでマウントした領域をfindで検索するとき、普通に実行しても再帰的に検索はしてくれないのね。</p>
<p>実際には2階層下にファイルがある：</p>
<pre>
$ ls -R nas_mnt_point
a b c

nas_mnt_point/a
a.txt

nas_mnt_point/b
b.txt

nas_mnt_point/
c.txt
</pre>
<p>でもfindでは：</p>
<pre>
$ find nas_mnt_point
nas_mnt_point/a
nas_mnt_point/b
nas_mnt_point/c
</pre>
<p>で、symlinkと同じように-followオプションを付けると：</p>
<pre>
$ find nas_mnt_point -follow
nas_mnt_point/a
nas_mnt_point/a/a.txt
nas_mnt_point/b
nas_mnt_point/b/b.txt
nas_mnt_point/c
nas_mnt_point/c/c.txt
</pre>
<p>それだけ。</p>
<img src="http://selfkleptomaniac.org/?ak_action=api_record_view&id=1340&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://selfkleptomaniac.org/archives/1340/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>春</title>
		<link>http://selfkleptomaniac.org/archives/1339</link>
		<comments>http://selfkleptomaniac.org/archives/1339#comments</comments>
		<pubDate>Fri, 26 Feb 2010 05:34:35 +0000</pubDate>
		<dc:creator>y</dc:creator>
				<category><![CDATA[Family]]></category>

		<guid isPermaLink="false">http://selfkleptomaniac.org/archives/1339</guid>
		<description><![CDATA[まめはオリンピックよりストレッチマンの方が好き。

]]></description>
			<content:encoded><![CDATA[<p>まめはオリンピックよりストレッチマンの方が好き。</p>
<p><a href="http://selfkleptomaniac.org/wp-content/uploads/2010/02/l_800_600_16E14AF2-11C6-462C-9362-404AC163C6B2.jpeg"><img src="http://selfkleptomaniac.org/wp-content/uploads/2010/02/l_800_600_16E14AF2-11C6-462C-9362-404AC163C6B2.jpeg" alt="" width="300" height="225" class="alignnone size-full wp-image-364" /></a></p>
<img src="http://selfkleptomaniac.org/?ak_action=api_record_view&id=1339&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://selfkleptomaniac.org/archives/1339/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SoftBankはちょっと怖い</title>
		<link>http://selfkleptomaniac.org/archives/1208</link>
		<comments>http://selfkleptomaniac.org/archives/1208#comments</comments>
		<pubDate>Wed, 27 Jan 2010 08:21:39 +0000</pubDate>
		<dc:creator>y</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://selfkleptomaniac.org/?p=1208</guid>
		<description><![CDATA[SoftBankのユーザ向けサービス「My SoftBank」に、ちょっと奇妙な機能がある。PC版のサービスで、ワンタイムパスワードを発行して所定のフォームからログインすると、端末からアクセスしたURLの履歴を期間指定して一覧できる。
ところで、SoftBankといえばドメイン名がないなど独自の書式のURLを特に自社サービスや課金まわりで多用することで知られている。例えばYahoo!ケータイのトップ画面はhttp://ptl/menu/だ。他にも、デジタルコンテンツのダウンロードに固有なURLなどがあるわけだが、その手のものもいろいろと見えてしまう。また、GPSの送信履歴からいろいろと面白い行動履歴を追うこともできる。
]]></description>
			<content:encoded><![CDATA[<p>SoftBankのユーザ向けサービス「<a href="https://mb.softbank.jp/scripts/japanese/mysoftbank/loginForm.jsp?mid=103">My SoftBank</a>」に、ちょっと奇妙な機能がある。PC版のサービスで、ワンタイムパスワードを発行して所定のフォームからログインすると、端末からアクセスしたURLの履歴を期間指定して一覧できる。</p>
<p>ところで、SoftBankといえばドメイン名がないなど独自の書式のURLを特に自社サービスや課金まわりで多用することで知られている。例えばYahoo!ケータイのトップ画面はhttp://ptl/menu/だ。他にも、デジタルコンテンツのダウンロードに固有なURLなどがあるわけだが、その手のものもいろいろと見えてしまう。また、GPSの送信履歴からいろいろと面白い行動履歴を追うこともできる。</p>
<img src="http://selfkleptomaniac.org/?ak_action=api_record_view&id=1208&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://selfkleptomaniac.org/archives/1208/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>当社比100倍のススメ</title>
		<link>http://selfkleptomaniac.org/archives/1333</link>
		<comments>http://selfkleptomaniac.org/archives/1333#comments</comments>
		<pubDate>Fri, 22 Jan 2010 17:58:11 +0000</pubDate>
		<dc:creator>y</dc:creator>
				<category><![CDATA[Fun]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://selfkleptomaniac.org/archives/1333</guid>
		<description><![CDATA[ウェブ開発の世界で、コードや設計の見直しが必要なのに、あまり時間や労力を割いてもらえないのが、速度の問題である。セキュリティなら見直しどころかとにかく素早く確実に対処する必要があるわけで、これは有無をいわさず誰もが取り掛かるであろうが（そうでなければ転職するべき）、遅いソフトウェアについては、まあ動いてはいるわけだし、もっと優れたハードウェアに載せ替えることで対応できるならそちらを選択するのも現実的だと考えられがちだ。高速化なんて、実際やってみても成果が上がるとは限らず、また開発者も無理な日程でリリースしてきたコードを今更また眺めるのは苦痛でしかない。いっそ書き直してやるならまだしも、あれやこれやと最適化するのは考えるだけでも面倒くさい。
しかし、実際には遅いウェブサイトは機会損失であり、いくら昔と比べてハードウェアが安価になり、仮想化技術が発達したとはいえ、それだって無料だったり無限に増設可能なわけではない。PCサーバ1台の増設をサービスのプロデューサに納得してもらうのは結構難しいことだ。仮想環境だってたくさん立ち上げるにはそれなりの実環境が必要になる。不景気の中で運用コストが上がる解決方法しか提示できないのは競争力に問題があるといわざるをえない。よって、スケールアウトは常に正しい解決ではない。
もちろん、最初から最大限に速度を追求してシステムを組むのは素晴らしいことで、誰もが実践するべきだ。しかし、そんなに簡単なことなら速度が問題になることなどあり得ないわけで、実際にはこの点を追求し過ぎるとリリースしなければいけない期日を守るのがとても難しくなってしまう。遅いのも機会損失だが、リリースできなければ機会が存在さえしなくなってしまうので、エンジニアリング過多は根治されるべき疾患だ。
期末が近づいてきたので、この2年くらいの自分の仕事をざっと整理してみたのだが、一昨年の暮れから今年の始まりにかけて、よく考えたらずっと既存のソフトウェアの高速化ばかりやってきた気がする。最初の立ち上げから1年以上経過したサービスがとうとう音を上げてしまったこともあれば、作ったばかりなのに社内の別チームから要求された速度が到底達成不可能だったので急遽なんとかしなければいけなくなったケースもある。恨み言をいわせてもらえば、ハードウェアやシステム構成の選定は当の検品屋連中だったりするので、そいつらの見積りが甘いのが原因なのだが、お客さんの求めるものがあってのソフトウェアであるわけで、理不尽だと叫んでもプログラムは速くはなってくれない。
そんなとき、誰もが思いつくのは、出力データや処理結果をキャッシュして速度を稼ぐ方法だろう。ご多分に漏れず自分もだいたいいつもそうやってきた。ウェブ上のプログラムには、大変ありがたいことにエントリーポイントがひとつしかない。そう、リクエストを受け付ける場所だ。出所の同じHTTPのリクエストは同時に一ヶ所にしか届かない。そこから、中間の処理があって、出力先は最終的にはリクエストを送ってきたクライアントになる。
前提条件 => 処理実行 => 処理結果
ネットワークの遅延や巨大なレスポンスによるクライアント側の負担といった問題は、普通はそんなには起きない。単純に考えると、結局はウェブ上のサービスはリクエストという前提条件があり、ソフトウェアによる処理があり、レスポンスという処理結果があるだけだ。
ということは、前提条件と処理結果の関係を把握して、その近道を探すのが高速化の第一歩ということになる。ここでのチェックポイントは
「前提条件（リクエスト）と処理結果（レスポンス）の関係」
の検討だ。自分で作業する場合は、まず
（１）リクエストをグループ化することができるか
を考える。メソッド（GETや、POSTときどきDELETEやPUTみたいな動詞）、リクエストURI、クエリで処理結果が同じになるグループを作成することができれば近道は見えたようなものだ。
例：GETのみ、docomoのゲートウェイを通過、FOMA端末、/listsへのアクセス、クエリは「type=used&#038;maker=toyota」であればレスポンスは共通
この場合、リクエストを受け付けた際に既に同じレスポンスを返したかどうか判定して、していなければ通常の処理を実行してキャッシュを作成、キャッシュが作成済みであれば処理をすっ飛ばしてキャッシュからデータを返す、という単純な対応が可能かもしれない。キャッシュの実装内容はシステムのI/O負荷により異なるだろうが、そこは後で検討すればいい。ストラテジーパターンで変更できるようにするとか、まあいろいろ手はある。
そこで問題になるのが、動的コンテンツを提供する場合、まあ当然ながら静的なコンテンツで速度が問題になるのはほとんどあり得ないだろうから当たり前だが、レスポンスとして返されるコンテンツの内容の更新頻度だ。リクエスト毎に内容が変わるのであれば、単純なキャッシュでは対応できない。そこで
（２）更新頻度のグループ化
について検討することになる。いまどきカウンタなんか載せているサイトは絶滅しているだろうが、それでも刻一刻と在庫状況が変化したり、コメント数が増えていくようなコンテンツはたくさんある。
ページ全体が同じ頻度で更新されることは稀だろう。同じリクエストとみなしていいグループに常に新しいContent-typeを返すことはあり得ないが、オークションの入札状況のようにサーバ側のリソースに変化があればそれを常に反映する必要のある部分もあれば、人気の検索語のように1時間くらいに1回更新しても誰も気づかないようなものもある。
例：更新頻度最大 = 入札状況、更新頻度中程度 = 残り3時間以内の商品、更新頻度低 = ホットな検索語
更新頻度のグループがあまりに細分化されている場合は、運用者とよく話し合って、可能な限り単純化していくことが必要になる。サービスの品質に影響がない程度に、できれば3パターンくらいになるとちょうどいい。
3パターンくらいであれば、キャッシュした全体のデータに部分的なキャッシュを組み合わせてレスポンスを作り上げるだけのプログラムをリクエストを受けた場所で処理して済ませることができる。
それから、もっとサーバに楽をさせてあげたいときは
（３）クライアント側に処理を肩代わりできるか
を検討する。PC向けサービスであればクッキーに格納できるデータもあるだろう。JavaScriptにあらかじめ呼び出されそうなデータを格納してしまってもいい。検索候補を表示するのに正直にデータを毎回取得したりせず、サーバ側からは定期的に更新するだけのデータをブラウザ側に先に送っておけば、毎回非同期通信が走ることもない。
もちろん、第三者からアクセスされてはいけないデータもあるので、なんでもかんでもこのやり方が正しいわけではないが、なんでもかんでもサーバ側で処理するのも同様に正しくはない。でも、推測不可能なハッシュ値を格納しておいてそれをキーとしてmemcachedにデータを探しに行って、なければDBに問い合わせるといった対応も可能だ。
３はちょっと話が逸れたが、１と２は「前提条件（リクエスト）と処理結果（レスポンス）の関係」の検討だ。これらがクリアになれば、途中の処理をどれだけ端折ってレスポンスを作成することができるか考えるのはそんなに難しいことではなくなる。
そうなると次にやるべきことは
「処理実行の副作用への対処」
ということになる。アクセスログのように勝手にサーバ側で実行される副作用なら深く考えることもないだろうが（カスタム形式に必要な処理があれば別だ）、検索履歴の保存やアフィリエイトからのアクセスの記録など、サーバ側に直接レスポンスとは関係のない副作用が生じるケースがあれば、それに対応しておかないとサービスには深刻な影響がある。関数型言語をかじったことのある人なら、ある関数が副作用を持つことで前提条件と結果の関係だけで安心することができないことを充分教育されているだろうから、この副作用というものについては手続型言語しかやったことのない人に比べれば敏感かもしれない。
というわけで、単純な考察に相応しい単純な結論として、高速化が可能なプログラムを作るには、上の手続きの反対をまず心がけることだ。リクエストがグループ化可能なレベルになるように要件を定義して、出力するコンテンツの更新頻度をなるべく単純なグループに分類可能に保ち、それから副作用に慎重になる。RESTfulなサービスにする意味はリクエストのグループ化に貢献することにある。更新頻度の単純化と副作用を最小限にすることはキャッシュ戦略を容易にしてくれる。アルゴリズムやプログラミング手法で高速化することも非常に重要であり、キャッシュは万能ではないが、ウェブサイトを100倍速くしたいなら、まずはこんなところから手をつけてみるといいのではないかと思われる。
当然ながら、RAMが128MBでCPUがCeleronの500MHzというサーバで1秒間に100もの動的コンテンツへのリクエストを受けるといった無謀な環境で大冒険している人は、こんなことを検討する必要はこれっぽっちもない。手元の中古のデスクトップを抱えてデータセンタに駆けつけてケーブルを引っこ抜いて差し替えて、全部のリクエストに「ごめんね」と返すだけの設定が完了したら、あとはなるべく遠くまで逃げることだ。追いかけてくる連中も、そんなに賢いことはあり得ないので、深刻に気に病むこともない。
]]></description>
			<content:encoded><![CDATA[<p>ウェブ開発の世界で、コードや設計の見直しが必要なのに、あまり時間や労力を割いてもらえないのが、速度の問題である。セキュリティなら見直しどころかとにかく素早く確実に対処する必要があるわけで、これは有無をいわさず誰もが取り掛かるであろうが（そうでなければ転職するべき）、遅いソフトウェアについては、まあ動いてはいるわけだし、もっと優れたハードウェアに載せ替えることで対応できるならそちらを選択するのも現実的だと考えられがちだ。高速化なんて、実際やってみても成果が上がるとは限らず、また開発者も無理な日程でリリースしてきたコードを今更また眺めるのは苦痛でしかない。いっそ書き直してやるならまだしも、あれやこれやと最適化するのは考えるだけでも面倒くさい。</p>
<p>しかし、実際には遅いウェブサイトは機会損失であり、いくら昔と比べてハードウェアが安価になり、仮想化技術が発達したとはいえ、それだって無料だったり無限に増設可能なわけではない。PCサーバ1台の増設をサービスのプロデューサに納得してもらうのは結構難しいことだ。仮想環境だってたくさん立ち上げるにはそれなりの実環境が必要になる。不景気の中で運用コストが上がる解決方法しか提示できないのは競争力に問題があるといわざるをえない。よって、スケールアウトは常に正しい解決ではない。</p>
<p>もちろん、最初から最大限に速度を追求してシステムを組むのは素晴らしいことで、誰もが実践するべきだ。しかし、そんなに簡単なことなら速度が問題になることなどあり得ないわけで、実際にはこの点を追求し過ぎるとリリースしなければいけない期日を守るのがとても難しくなってしまう。遅いのも機会損失だが、リリースできなければ機会が存在さえしなくなってしまうので、エンジニアリング過多は根治されるべき疾患だ。</p>
<p>期末が近づいてきたので、この2年くらいの自分の仕事をざっと整理してみたのだが、一昨年の暮れから今年の始まりにかけて、よく考えたらずっと既存のソフトウェアの高速化ばかりやってきた気がする。最初の立ち上げから1年以上経過したサービスがとうとう音を上げてしまったこともあれば、作ったばかりなのに社内の別チームから要求された速度が到底達成不可能だったので急遽なんとかしなければいけなくなったケースもある。恨み言をいわせてもらえば、ハードウェアやシステム構成の選定は当の検品屋連中だったりするので、そいつらの見積りが甘いのが原因なのだが、お客さんの求めるものがあってのソフトウェアであるわけで、理不尽だと叫んでもプログラムは速くはなってくれない。</p>
<p>そんなとき、誰もが思いつくのは、出力データや処理結果をキャッシュして速度を稼ぐ方法だろう。ご多分に漏れず自分もだいたいいつもそうやってきた。ウェブ上のプログラムには、大変ありがたいことにエントリーポイントがひとつしかない。そう、リクエストを受け付ける場所だ。出所の同じHTTPのリクエストは同時に一ヶ所にしか届かない。そこから、中間の処理があって、出力先は最終的にはリクエストを送ってきたクライアントになる。</p>
<p>前提条件 => 処理実行 => 処理結果</p>
<p>ネットワークの遅延や巨大なレスポンスによるクライアント側の負担といった問題は、普通はそんなには起きない。単純に考えると、結局はウェブ上のサービスはリクエストという前提条件があり、ソフトウェアによる処理があり、レスポンスという処理結果があるだけだ。</p>
<p>ということは、前提条件と処理結果の関係を把握して、その近道を探すのが高速化の第一歩ということになる。ここでのチェックポイントは</p>
<p>「前提条件（リクエスト）と処理結果（レスポンス）の関係」</p>
<p>の検討だ。自分で作業する場合は、まず</p>
<p>（１）リクエストをグループ化することができるか</p>
<p>を考える。メソッド（GETや、POSTときどきDELETEやPUTみたいな動詞）、リクエストURI、クエリで処理結果が同じになるグループを作成することができれば近道は見えたようなものだ。</p>
<p>例：GETのみ、docomoのゲートウェイを通過、FOMA端末、/listsへのアクセス、クエリは「type=used&#038;maker=toyota」であればレスポンスは共通</p>
<p>この場合、リクエストを受け付けた際に既に同じレスポンスを返したかどうか判定して、していなければ通常の処理を実行してキャッシュを作成、キャッシュが作成済みであれば処理をすっ飛ばしてキャッシュからデータを返す、という単純な対応が可能かもしれない。キャッシュの実装内容はシステムのI/O負荷により異なるだろうが、そこは後で検討すればいい。ストラテジーパターンで変更できるようにするとか、まあいろいろ手はある。</p>
<p>そこで問題になるのが、動的コンテンツを提供する場合、まあ当然ながら静的なコンテンツで速度が問題になるのはほとんどあり得ないだろうから当たり前だが、レスポンスとして返されるコンテンツの内容の更新頻度だ。リクエスト毎に内容が変わるのであれば、単純なキャッシュでは対応できない。そこで</p>
<p>（２）更新頻度のグループ化</p>
<p>について検討することになる。いまどきカウンタなんか載せているサイトは絶滅しているだろうが、それでも刻一刻と在庫状況が変化したり、コメント数が増えていくようなコンテンツはたくさんある。</p>
<p>ページ全体が同じ頻度で更新されることは稀だろう。同じリクエストとみなしていいグループに常に新しいContent-typeを返すことはあり得ないが、オークションの入札状況のようにサーバ側のリソースに変化があればそれを常に反映する必要のある部分もあれば、人気の検索語のように1時間くらいに1回更新しても誰も気づかないようなものもある。</p>
<p>例：更新頻度最大 = 入札状況、更新頻度中程度 = 残り3時間以内の商品、更新頻度低 = ホットな検索語</p>
<p>更新頻度のグループがあまりに細分化されている場合は、運用者とよく話し合って、可能な限り単純化していくことが必要になる。サービスの品質に影響がない程度に、できれば3パターンくらいになるとちょうどいい。</p>
<p>3パターンくらいであれば、キャッシュした全体のデータに部分的なキャッシュを組み合わせてレスポンスを作り上げるだけのプログラムをリクエストを受けた場所で処理して済ませることができる。</p>
<p>それから、もっとサーバに楽をさせてあげたいときは</p>
<p>（３）クライアント側に処理を肩代わりできるか</p>
<p>を検討する。PC向けサービスであればクッキーに格納できるデータもあるだろう。JavaScriptにあらかじめ呼び出されそうなデータを格納してしまってもいい。検索候補を表示するのに正直にデータを毎回取得したりせず、サーバ側からは定期的に更新するだけのデータをブラウザ側に先に送っておけば、毎回非同期通信が走ることもない。</p>
<p>もちろん、第三者からアクセスされてはいけないデータもあるので、なんでもかんでもこのやり方が正しいわけではないが、なんでもかんでもサーバ側で処理するのも同様に正しくはない。でも、推測不可能なハッシュ値を格納しておいてそれをキーとしてmemcachedにデータを探しに行って、なければDBに問い合わせるといった対応も可能だ。</p>
<p>３はちょっと話が逸れたが、１と２は「前提条件（リクエスト）と処理結果（レスポンス）の関係」の検討だ。これらがクリアになれば、途中の処理をどれだけ端折ってレスポンスを作成することができるか考えるのはそんなに難しいことではなくなる。</p>
<p>そうなると次にやるべきことは</p>
<p>「処理実行の副作用への対処」</p>
<p>ということになる。アクセスログのように勝手にサーバ側で実行される副作用なら深く考えることもないだろうが（カスタム形式に必要な処理があれば別だ）、検索履歴の保存やアフィリエイトからのアクセスの記録など、サーバ側に直接レスポンスとは関係のない副作用が生じるケースがあれば、それに対応しておかないとサービスには深刻な影響がある。関数型言語をかじったことのある人なら、ある関数が副作用を持つことで前提条件と結果の関係だけで安心することができないことを充分教育されているだろうから、この副作用というものについては手続型言語しかやったことのない人に比べれば敏感かもしれない。</p>
<p>というわけで、単純な考察に相応しい単純な結論として、高速化が可能なプログラムを作るには、上の手続きの反対をまず心がけることだ。リクエストがグループ化可能なレベルになるように要件を定義して、出力するコンテンツの更新頻度をなるべく単純なグループに分類可能に保ち、それから副作用に慎重になる。RESTfulなサービスにする意味はリクエストのグループ化に貢献することにある。更新頻度の単純化と副作用を最小限にすることはキャッシュ戦略を容易にしてくれる。アルゴリズムやプログラミング手法で高速化することも非常に重要であり、キャッシュは万能ではないが、ウェブサイトを100倍速くしたいなら、まずはこんなところから手をつけてみるといいのではないかと思われる。</p>
<p>当然ながら、RAMが128MBでCPUがCeleronの500MHzというサーバで1秒間に100もの動的コンテンツへのリクエストを受けるといった無謀な環境で大冒険している人は、こんなことを検討する必要はこれっぽっちもない。手元の中古のデスクトップを抱えてデータセンタに駆けつけてケーブルを引っこ抜いて差し替えて、全部のリクエストに「ごめんね」と返すだけの設定が完了したら、あとはなるべく遠くまで逃げることだ。追いかけてくる連中も、そんなに賢いことはあり得ないので、深刻に気に病むこともない。</p>
<img src="http://selfkleptomaniac.org/?ak_action=api_record_view&id=1333&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://selfkleptomaniac.org/archives/1333/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>刑事まめ</title>
		<link>http://selfkleptomaniac.org/archives/1331</link>
		<comments>http://selfkleptomaniac.org/archives/1331#comments</comments>
		<pubDate>Fri, 15 Jan 2010 02:37:31 +0000</pubDate>
		<dc:creator>y</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Family]]></category>

		<guid isPermaLink="false">http://selfkleptomaniac.org/?p=1331</guid>
		<description><![CDATA[中国当局とGoogleの不穏な動きに目を光らせるまめぞう。

]]></description>
			<content:encoded><![CDATA[<p>中国当局とGoogleの不穏な動きに目を光らせるまめぞう。</p>
<p><a href="http://selfkleptomaniac.org/wp-content/uploads/2010/01/p_1024_768_58A539B2-572E-4EC7-B6DE-AD346767C551.jpeg"><img src="http://selfkleptomaniac.org/wp-content/uploads/2010/01/p_1024_768_58A539B2-572E-4EC7-B6DE-AD346767C551.jpeg" alt="" width="225" height="300" class="alignnone size-full wp-image-364" /></a></p>
<img src="http://selfkleptomaniac.org/?ak_action=api_record_view&id=1331&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://selfkleptomaniac.org/archives/1331/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google、中国からの撤退を示唆</title>
		<link>http://selfkleptomaniac.org/archives/1327</link>
		<comments>http://selfkleptomaniac.org/archives/1327#comments</comments>
		<pubDate>Wed, 13 Jan 2010 05:14:10 +0000</pubDate>
		<dc:creator>y</dc:creator>
				<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://selfkleptomaniac.org/archives/1327</guid>
		<description><![CDATA[ということで、公式ブログをささっと訳出。面白いことになってまいりました。
*原文はHTMLのコメントになっています。
A new approach to China
1/12/2010 03:00:00 PM

名前の知られた企業の常として、私たちは毎日あらゆるレベルのサイバー攻撃に晒されています。12月の中頃にも、私たちの企業インフラは中国発のかなり高度な、目標の絞りこまれた攻撃を受け、その結果Googleの知的財産が盗難の被害に遭っています。しかし、当初は単なるセキュリティ事件に思われたものが、実際そうではあるのですが、全く異なる問題であることがすぐに明らかになったのです。

第一に、攻撃はGoogleだけを狙ったものではありませんでした。調査の過程で、インターネット関連や金融、科学技術、メディア、化学分野といった幅広い分野に渡る少なくとも20の世界規模の企業が同様に攻撃目標となっていたことを突き止めました。私たちは現在これらの企業に問題を通知し、同時に関連する米国の機関と共同で作業を進めています。

第二に、私たちは攻撃者の最終目標が中国の人権活動家たちのGmailアカウントにアクセスすることだったという証拠を手に入れました。現在までの調査では、攻撃は目標を達成できなかったと思われます。2つのGmailアカウントの情報にアクセスされていましたが、それもアカウント情報（アカウントが作成された日付など）とメールの件名に限定されており、メール本文にはアクセスされていません。

第三に、本件の調査の過程で、今回のGoogleへの攻撃とは関係なく、私たちはGmailユーザで米国や中国、ヨーロッパを拠点とする中国国内の問題にかかわる人権活動家たちのアカウントが日常的に第三者によりアクセスされていることを発見しました。これらのアカウントはGoogleのセキュリティ対策を掻い潜ってアクセスされていたわけではありませんが、大半は一般のパソコンに仕込まれたフィッシング詐欺や悪意のあるコンピュータウィルスによるものと思われます。

私たちはGoogleとそのユーザのセキュリティを強固にするためのインフラや設計の改善のために今回の攻撃から得られた情報を利用しています。個人ユーザの皆様は、信頼できるアンチウィルスソフトウェアやアンチスパイウェアプログラムをコンピュータにインストールして、OSの更新プログラムで最新のパッチを適用し、ウェブブラウザをアップデートしてください。インスタントメッセージや電子メールに表示されるリンクをクリックする際やパスワードのような個人情報をオンラインで提供するかどうか質問される場合は常に注意してください。私たちのお勧めするサイバーセキュリティについての詳細はこちらでご覧頂けます。今回のような攻撃について更に知りたい方は米国政府のレポート（PDFファイル）やNart Villeneuveのブログ、GhostNetのスパイ事件についてのこちらのプレゼンテーションをお読みください。

私たちが今回の攻撃についての情報をこのような形で公表するのは、セキュリティと人権問題への影響だけが理由ではありません。この情報がさらに幅広い国際的な言論の自由についての議論の核心に迫るものだからです。過去20年間、中国の経済改革と市民の起業の才は非常に多くの中国人民を貧困から救いあげてきました。この国はさらなる世界の経済発展の中心となっているのは間違いありません。

私たちはさらなる情報へのアクセスが中国の人々に利益をもたらし、より開かれたインターネットが検索結果を検閲することになる不快さを上回ることを信じて2006年の1月にGoogle.cnを立ち上げました。当時、私たちは「自分たちのサービスを制限する新しい法律や規制を含め、中国の状況をより注視していく。もし先に概説した目標を達成することが出来ないと判断した際には、中国へのアプローチを再考するのに躊躇はしない」ことを言明していました。

暴露されたこれら一連の攻撃や監視、それに過去数年間に渡るウェブ上の言論の自由を制限しようとする試みにより、私たちは中国での事業運営が実行可能であるかどうか再考するべきであるという結論に至りました。私たちはこれ以上Google.cnで検索結果を検閲し続けるつもりはありません。今後数週間、法律の範囲内で可能な限り検閲のない検索エンジンを運営することをベースに中国政府と議論していきます。これによりGoogle.cnの閉鎖もあり得るでしょうし、中国国内のオフィスの閉鎖の可能性もあります。

中国での事業運営の見直しの決定は厳しいものであり、その潜在的な影響も大きいものであることは理解しています。この変更は米国本社の決定であり、Google.cnの今日の成功を支えるべく懸命に働いている中国国内の従業員の考えや意思決定によるものでないことをここに明言しておきます。私たちはこのような非情に困難な問題を解決すべく責任を持って取り組んでいます。
]]></description>
			<content:encoded><![CDATA[<p>ということで、<a href="http://googleblog.blogspot.com/2010/01/new-approach-to-china.html">公式ブログ</a>をささっと訳出。面白いことになってまいりました。</p>
<p>*原文はHTMLのコメントになっています。</p>
<p>A new approach to China<br />
1/12/2010 03:00:00 PM<br />
<!--Like many other well-known organizations, we face cyber attacks of varying degrees on a regular basis. In mid-December, we detected a highly sophisticated and targeted attack on our corporate infrastructure originating from China that resulted in the theft of intellectual property from Google. However, it soon became clear that what at first appeared to be solely a security incident--albeit a significant one--was something quite different.--><br />
名前の知られた企業の常として、私たちは毎日あらゆるレベルのサイバー攻撃に晒されています。12月の中頃にも、私たちの企業インフラは中国発のかなり高度な、目標の絞りこまれた攻撃を受け、その結果Googleの知的財産が盗難の被害に遭っています。しかし、当初は単なるセキュリティ事件に思われたものが、実際そうではあるのですが、全く異なる問題であることがすぐに明らかになったのです。</p>
<p><!--First, this attack was not just on Google. As part of our investigation we have discovered that at least twenty other large companies from a wide range of businesses--including the Internet, finance, technology, media and chemical sectors--have been similarly targeted. We are currently in the process of notifying those companies, and we are also working with the relevant U.S. authorities.--><br />
第一に、攻撃はGoogleだけを狙ったものではありませんでした。調査の過程で、インターネット関連や金融、科学技術、メディア、化学分野といった幅広い分野に渡る少なくとも20の世界規模の企業が同様に攻撃目標となっていたことを突き止めました。私たちは現在これらの企業に問題を通知し、同時に関連する米国の機関と共同で作業を進めています。</p>
<p><!--Second, we have evidence to suggest that a primary goal of the attackers was accessing the Gmail accounts of Chinese human rights activists. Based on our investigation to date we believe their attack did not achieve that objective. Only two Gmail accounts appear to have been accessed, and that activity was limited to account information (such as the date the account was created) and subject line, rather than the content of emails themselves.--><br />
第二に、私たちは攻撃者の最終目標が中国の人権活動家たちのGmailアカウントにアクセスすることだったという証拠を手に入れました。現在までの調査では、攻撃は目標を達成できなかったと思われます。2つのGmailアカウントの情報にアクセスされていましたが、それもアカウント情報（アカウントが作成された日付など）とメールの件名に限定されており、メール本文にはアクセスされていません。</p>
<p><!--Third, as part of this investigation but independent of the attack on Google, we have discovered that the accounts of dozens of U.S.-, China- and Europe-based Gmail users who are advocates of human rights in China appear to have been routinely accessed by third parties. These accounts have not been accessed through any security breach at Google, but most likely via phishing scams or malware placed on the users' computers.--><br />
第三に、本件の調査の過程で、今回のGoogleへの攻撃とは関係なく、私たちはGmailユーザで米国や中国、ヨーロッパを拠点とする中国国内の問題にかかわる人権活動家たちのアカウントが日常的に第三者によりアクセスされていることを発見しました。これらのアカウントはGoogleのセキュリティ対策を掻い潜ってアクセスされていたわけではありませんが、大半は一般のパソコンに仕込まれたフィッシング詐欺や悪意のあるコンピュータウィルスによるものと思われます。</p>
<p><!--We have already used information gained from this attack to make infrastructure and architectural improvements that enhance security for Google and for our users. In terms of individual users, we would advise people to deploy reputable anti-virus and anti-spyware programs on their computers, to install patches for their operating systems and to update their web browsers. Always be cautious when clicking on links appearing in instant messages and emails, or when asked to share personal information like passwords online. You can read more here about our cyber-security recommendations. People wanting to learn more about these kinds of attacks can read this U.S. government report (PDF), Nart Villeneuve's blog and this presentation on the GhostNet spying incident.--><br />
私たちはGoogleとそのユーザのセキュリティを強固にするためのインフラや設計の改善のために今回の攻撃から得られた情報を利用しています。個人ユーザの皆様は、信頼できるアンチウィルスソフトウェアやアンチスパイウェアプログラムをコンピュータにインストールして、OSの更新プログラムで最新のパッチを適用し、ウェブブラウザをアップデートしてください。インスタントメッセージや電子メールに表示されるリンクをクリックする際やパスワードのような個人情報をオンラインで提供するかどうか質問される場合は常に注意してください。私たちのお勧めするサイバーセキュリティについての詳細は<a href="http://googleblog.blogspot.com/2009/11/next-steps-in-cyber-security-awareness.html">こちら</a>でご覧頂けます。今回のような攻撃について更に知りたい方は米国政府の<a href="http://www.uscc.gov/researchpapers/2009/NorthropGrumman_PRC_Cyber_Paper_FINAL_Approved%20Report_16Oct2009.pdf">レポート</a>（PDFファイル）や<a href="http://www.nartv.org/">Nart Villeneuveのブログ</a>、GhostNetのスパイ事件についての<a href="http://www.scribd.com/doc/13731776/Tracking-GhostNet-Investigating-a-Cyber-Espionage-Network">こちら</a>のプレゼンテーションをお読みください。</p>
<p><!--We have taken the unusual step of sharing information about these attacks with a broad audience not just because of the security and human rights implications of what we have unearthed, but also because this information goes to the heart of a much bigger global debate about freedom of speech. In the last two decades, China's economic reform programs and its citizens' entrepreneurial flair have lifted hundreds of millions of Chinese people out of poverty. Indeed, this great nation is at the heart of much economic progress and development in the world today.--><br />
私たちが今回の攻撃についての情報をこのような形で公表するのは、セキュリティと人権問題への影響だけが理由ではありません。この情報がさらに幅広い国際的な言論の自由についての議論の核心に迫るものだからです。過去20年間、中国の経済改革と市民の起業の才は非常に多くの中国人民を貧困から救いあげてきました。この国はさらなる世界の経済発展の中心となっているのは間違いありません。</p>
<p><!--We launched Google.cn in January 2006 in the belief that the benefits of increased access to information for people in China and a more open Internet outweighed our discomfort in agreeing to censor some results. At the time we made clear that "we will carefully monitor conditions in China, including new laws and other restrictions on our services. If we determine that we are unable to achieve the objectives outlined we will not hesitate to reconsider our approach to China."--><br />
私たちはさらなる情報へのアクセスが中国の人々に利益をもたらし、より開かれたインターネットが検索結果を検閲することになる不快さを上回ることを信じて2006年の1月にGoogle.cnを立ち上げました。当時、私たちは「自分たちのサービスを制限する新しい法律や規制を含め、中国の状況をより注視していく。もし先に概説した目標を達成することが出来ないと判断した際には、中国へのアプローチを再考するのに躊躇はしない」ことを言明していました。</p>
<p><!--These attacks and the surveillance they have uncovered--combined with the attempts over the past year to further limit free speech on the web--have led us to conclude that we should review the feasibility of our business operations in China. We have decided we are no longer willing to continue censoring our results on Google.cn, and so over the next few weeks we will be discussing with the Chinese government the basis on which we could operate an unfiltered search engine within the law, if at all. We recognize that this may well mean having to shut down Google.cn, and potentially our offices in China.--><br />
暴露されたこれら一連の攻撃や監視、それに過去数年間に渡るウェブ上の言論の自由を制限しようとする試みにより、私たちは中国での事業運営が実行可能であるかどうか再考するべきであるという結論に至りました。私たちはこれ以上Google.cnで検索結果を検閲し続けるつもりはありません。今後数週間、法律の範囲内で可能な限り検閲のない検索エンジンを運営することをベースに中国政府と議論していきます。これによりGoogle.cnの閉鎖もあり得るでしょうし、中国国内のオフィスの閉鎖の可能性もあります。</p>
<p><!--The decision to review our business operations in China has been incredibly hard, and we know that it will have potentially far-reaching consequences. We want to make clear that this move was driven by our executives in the United States, without the knowledge or involvement of our employees in China who have worked incredibly hard to make Google.cn the success it is today. We are committed to working responsibly to resolve the very difficult issues raised.--><br />
中国での事業運営の見直しの決定は厳しいものであり、その潜在的な影響も大きいものであることは理解しています。この変更は米国本社の決定であり、Google.cnの今日の成功を支えるべく懸命に働いている中国国内の従業員の考えや意思決定によるものでないことをここに明言しておきます。私たちはこのような非情に困難な問題を解決すべく責任を持って取り組んでいます。</p>
<img src="http://selfkleptomaniac.org/?ak_action=api_record_view&id=1327&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://selfkleptomaniac.org/archives/1327/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>変なCSRF対策</title>
		<link>http://selfkleptomaniac.org/archives/1325</link>
		<comments>http://selfkleptomaniac.org/archives/1325#comments</comments>
		<pubDate>Mon, 28 Dec 2009 18:15:46 +0000</pubDate>
		<dc:creator>y</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://selfkleptomaniac.org/archives/1325</guid>
		<description><![CDATA[au端末のみアクセス可能なサイトでクロスサイトリクエストフォージェリー対策が必要になったのだが、ワンタイムトークンとかのよくある手段だとおもしろくないので、何かないかと考えてみた。
auの端末からのリクエストには、端末の契約情報に紐づいた一意のID（サブスクライバID）がリクエストヘッダとして送信される。そこで、こんなのを作ってみた。
（１）リモートアドレスでauのデートウェイからのリクエスト以外は弾く
（２）POSTリクエストを受け付けるURIはサブスクライバIDで異なる
まあ（１）はよくあることなのでいいとして、（２）はこんな感じになっている。公開するURLは「http://example.com/form」とかいう形式になっている。au端末からそのURLへのリクエストがあると、サーバ側で「https://example.com/xxxxxxxxxx/」にリダイレクトする。この「xxxxxxxxxx」はサブスクライバIDとサーバ側に保持している特定のsaltとなる文字列（例えば創世記の全文）から生成されたハッシュ値になっている。リクエストしてきた端末のサブスクライバIDから生成したハッシュ値とURIのハッシュ値が一致すればリクエストを通して、そうでなければ弾く。リダイレクト処理が入るので「http://example.com/form」へのPOSTリクエストはリクエストボディーの内容が消えたGETのリクエストになってしまうから、もし第三者がこのURLに対してCSRFを仕掛けてきても無効化される。ハッシュ値付きの正しいURLにPOSTリクエストを投げるようにしたくても、端末が送信するサブスクライバIDとsalt値とハッシュ値の生成ルールが分からなければ犠牲者の端末専用のURLが推測できないため攻撃用のフォームを作ることができない。
あとは.htaccessなどで存在しないディレクトリへのアクセスをリライトしてしまえばおしまい。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

とかいう感じ。いやっほう。
あんまり見たことないやり方なので破り方があるかどうかちゃんと検証できてない気がするけど、思いつかないので実戦投入した。
]]></description>
			<content:encoded><![CDATA[<p>au端末のみアクセス可能なサイトで<a href="http://ja.wikipedia.org/wiki/クロスサイトリクエストフォージェリ">クロスサイトリクエストフォージェリー</a>対策が必要になったのだが、ワンタイムトークンとかのよくある手段だとおもしろくないので、何かないかと考えてみた。</p>
<p>auの端末からのリクエストには、端末の契約情報に紐づいた一意のID（サブスクライバID）がリクエストヘッダとして送信される。そこで、こんなのを作ってみた。</p>
<p>（１）リモートアドレスでauのデートウェイからのリクエスト以外は弾く<br />
（２）POSTリクエストを受け付けるURIはサブスクライバIDで異なる</p>
<p>まあ（１）はよくあることなのでいいとして、（２）はこんな感じになっている。公開するURLは「http://example.com/form」とかいう形式になっている。au端末からそのURLへのリクエストがあると、サーバ側で「https://example.com/xxxxxxxxxx/」にリダイレクトする。この「xxxxxxxxxx」はサブスクライバIDとサーバ側に保持している特定のsaltとなる文字列（例えば創世記の全文）から生成されたハッシュ値になっている。リクエストしてきた端末のサブスクライバIDから生成したハッシュ値とURIのハッシュ値が一致すればリクエストを通して、そうでなければ弾く。リダイレクト処理が入るので「http://example.com/form」へのPOSTリクエストはリクエストボディーの内容が消えたGETのリクエストになってしまうから、もし第三者がこのURLに対してCSRFを仕掛けてきても無効化される。ハッシュ値付きの正しいURLにPOSTリクエストを投げるようにしたくても、端末が送信するサブスクライバIDとsalt値とハッシュ値の生成ルールが分からなければ犠牲者の端末専用のURLが推測できないため攻撃用のフォームを作ることができない。</p>
<p>あとは.htaccessなどで存在しないディレクトリへのアクセスをリライトしてしまえばおしまい。</p>
<pre>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</pre>
<p>とかいう感じ。いやっほう。</p>
<p>あんまり見たことないやり方なので破り方があるかどうかちゃんと検証できてない気がするけど、思いつかないので実戦投入した。</p>
<img src="http://selfkleptomaniac.org/?ak_action=api_record_view&id=1325&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://selfkleptomaniac.org/archives/1325/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ダースまめの野望</title>
		<link>http://selfkleptomaniac.org/archives/1317</link>
		<comments>http://selfkleptomaniac.org/archives/1317#comments</comments>
		<pubDate>Tue, 15 Dec 2009 01:22:52 +0000</pubDate>
		<dc:creator>y</dc:creator>
				<category><![CDATA[Baseball]]></category>
		<category><![CDATA[Family]]></category>
		<category><![CDATA[Fun]]></category>

		<guid isPermaLink="false">http://selfkleptomaniac.org/?p=1317</guid>
		<description><![CDATA[「ダースまめ」は考えました。

ぼくもライトセーバーがほしいな。
思い立ったらすぐ行動、それが暗黒卿の生きる道です。
しめしめ、お母ちゃんは見当たらないぞ。

これはライトセーバーかな？

やったあ、ライトセーバーをゲット（たぶん）だ！

ご満悦の暗黒卿。

こうして、宇宙を征服するはずの暗黒卿「ダースまめ」は、すっかり野球選手になってしまいましたとさ。

]]></description>
			<content:encoded><![CDATA[<p>「ダースまめ」は考えました。</p>
<p><a href="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_1024_768_177CD9E7-5028-47F5-A710-175226325D5A.jpeg"><img src="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_1024_768_177CD9E7-5028-47F5-A710-175226325D5A.jpeg" alt="" width="225" height="300" class="alignnone size-full wp-image-364" /></a></p>
<p>ぼくもライトセーバーがほしいな。</p>
<p>思い立ったらすぐ行動、それが暗黒卿の生きる道です。</p>
<p>しめしめ、お母ちゃんは見当たらないぞ。</p>
<p><a href="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_2048_1536_0233B589-14F3-46FD-B626-1A3B184CCBFA.jpeg"><img src="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_2048_1536_0233B589-14F3-46FD-B626-1A3B184CCBFA.jpeg" alt="" width="225" height="300" class="alignnone size-full wp-image-364" /></a></p>
<p>これはライトセーバーかな？</p>
<p><a href="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_2048_1536_96D79BDA-7411-4B40-ACB8-C280563161A4.jpeg"><img src="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_2048_1536_96D79BDA-7411-4B40-ACB8-C280563161A4.jpeg" alt="" width="225" height="300" class="alignnone size-full wp-image-364" /></a></p>
<p>やったあ、ライトセーバーをゲット（たぶん）だ！</p>
<p><a href="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_2048_1536_C9982388-B67E-4028-A02F-8EDBE65555FF.jpeg"><img src="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_2048_1536_C9982388-B67E-4028-A02F-8EDBE65555FF.jpeg" alt="" width="225" height="300" class="alignnone size-full wp-image-364" /></a></p>
<p>ご満悦の暗黒卿。</p>
<p><a href="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_800_600_C212868F-368B-4EFD-B9DC-A3263302B3D8.jpeg"><img src="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_800_600_C212868F-368B-4EFD-B9DC-A3263302B3D8.jpeg" alt="" width="225" height="300" class="alignnone size-full wp-image-364" /></a></p>
<p>こうして、宇宙を征服するはずの暗黒卿「ダースまめ」は、すっかり野球選手になってしまいましたとさ。</p>
<p><a href="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_800_600_4DB827B9-1095-430A-9599-B931575EF185.jpeg"><img src="http://selfkleptomaniac.org/wp-content/uploads/2009/12/p_800_600_4DB827B9-1095-430A-9599-B931575EF185.jpeg" alt="" width="225" height="300" class="alignnone size-full wp-image-364" /></a></p>
<img src="http://selfkleptomaniac.org/?ak_action=api_record_view&id=1317&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://selfkleptomaniac.org/archives/1317/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>携帯サイトのセキュリティ対策（ざっくり）</title>
		<link>http://selfkleptomaniac.org/archives/1308</link>
		<comments>http://selfkleptomaniac.org/archives/1308#comments</comments>
		<pubDate>Tue, 08 Dec 2009 07:56:44 +0000</pubDate>
		<dc:creator>y</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://selfkleptomaniac.org/?p=1308</guid>
		<description><![CDATA[携帯サイト構築で忘れがちなセキュリティ対策を記録しておく。もちろん、外部に公開されているサーバで余計なポートが開放されていたり要らないサービスが起動していたりするのは論外。
SSL
SSLを利用している場合、基本的にSSLv3とTLS1以外を利用することはないので切っておく。特にNull暗号をオフにしておく必要がある。
Apacheだとこんな感じ。

SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:!EXP:!eNULL:!aNULL

Poundだとこんな感じ。

ListenHTTPS
  Ciphers "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:!EXP:!eNULL:!aNULL"

Apache
リクエストヘッダのHost部分を書き換えられることを前提とした設定をしていないケースが多いと思われる。VirtualHostの先頭にデフォルトの設定を入れて対応する。mod_rewriteは入っているものとみなす。
Apacheのバージョンが低い場合のTRACEメソッドの禁止も追加。


  DocumentRoot /var/www/html
  ServerName default.host.name
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/server-status
  RewriteRule .* - [F]
  #TRACEメソッドの禁止
  RewriteCond %{REQUEST_METHOD} ^TRACE
  RewriteRule .* - [F]


Aliasで指定されたiconsやmanualは不要なので削除。

#Alias /icons/ "/var/www/icons/"
#
#
以下このディレクティブの最後まで。

PHP
基本的な設定はされているものとして、忘れがちなのをいくつか。php.iniの場合は
バージョン情報を晒さない。

expose_php = Off

リモートファイルをスクリプトとして読み込ませない。

allow_url_fopen = Off

リモートファイルをスクリプトとして読み込ませない。

display_errors = Off

続く、かも。
]]></description>
			<content:encoded><![CDATA[<p>携帯サイト構築で忘れがちなセキュリティ対策を記録しておく。もちろん、外部に公開されているサーバで余計なポートが開放されていたり要らないサービスが起動していたりするのは論外。</p>
<h3>SSL</h3>
<p>SSLを利用している場合、基本的にSSLv3とTLS1以外を利用することはないので切っておく。特にNull暗号をオフにしておく必要がある。</p>
<p>Apacheだとこんな感じ。</p>
<pre>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:!EXP:!eNULL:!aNULL
</pre>
<p>Poundだとこんな感じ。</p>
<pre>
ListenHTTPS
  Ciphers "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:!EXP:!eNULL:!aNULL"
</pre>
<h3>Apache</h3>
<p>リクエストヘッダのHost部分を書き換えられることを前提とした設定をしていないケースが多いと思われる。VirtualHostの先頭にデフォルトの設定を入れて対応する。mod_rewriteは入っているものとみなす。</p>
<p>Apacheのバージョンが低い場合のTRACEメソッドの禁止も追加。</p>
<pre>
<VirtualHost *:80>
  DocumentRoot /var/www/html
  ServerName default.host.name
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/server-status
  RewriteRule .* - [F]
  #TRACEメソッドの禁止
  RewriteCond %{REQUEST_METHOD} ^TRACE
  RewriteRule .* - [F]
</VirtualHost>
</pre>
<p>Aliasで指定されたiconsやmanualは不要なので削除。</p>
<pre>
#Alias /icons/ "/var/www/icons/"
#
#<Directory "/var/www/icons">
以下このディレクティブの最後まで。
</pre>
<h3>PHP</h3>
<p>基本的な設定はされているものとして、忘れがちなのをいくつか。php.iniの場合は</p>
<p>バージョン情報を晒さない。</p>
<pre>
expose_php = Off
</pre>
<p>リモートファイルをスクリプトとして読み込ませない。</p>
<pre>
allow_url_fopen = Off
</pre>
<p>リモートファイルをスクリプトとして読み込ませない。</p>
<pre>
display_errors = Off
</pre>
<p>続く、かも。</p>
<img src="http://selfkleptomaniac.org/?ak_action=api_record_view&id=1308&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://selfkleptomaniac.org/archives/1308/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PubsubSearch</title>
		<link>http://selfkleptomaniac.org/archives/1302</link>
		<comments>http://selfkleptomaniac.org/archives/1302#comments</comments>
		<pubDate>Mon, 23 Nov 2009 14:17:55 +0000</pubDate>
		<dc:creator>y</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://selfkleptomaniac.org/archives/1302</guid>
		<description><![CDATA[このサイトの右上の検索ボックスに手を入れて、Ferret + Rubyで全文検索するようにした。Pubsubhubbubを使って更新内容がPOSTリクエストとしてHubに送信されるので、Ferretの検索インデックスはHubからのPOSTを受け付けるSubscriberが更新する。

サイト更新 --POST--> Pubsubhubbub --POST--> Ferretのインデックス更新

で？といわれたら、それ以上でも以下でもないとしかいいようがない。しかも小っ恥ずかしいことに新規追加にバグがあったので直した。
]]></description>
			<content:encoded><![CDATA[<p>このサイトの右上の検索ボックスに手を入れて、<a href="http://ferret.selfkleptomaniac.org/">Ferret + Rubyで全文検索</a>するようにした。<a href="http://code.google.com/p/pubsubhubbub/">Pubsubhubbub</a>を使って更新内容がPOSTリクエストとしてHubに送信されるので、Ferretの検索インデックスはHubからのPOSTを受け付けるSubscriberが更新する。</p>
<pre>
サイト更新 --POST--> Pubsubhubbub --POST--> Ferretのインデックス更新
</pre>
<p>で？といわれたら、それ以上でも以下でもないとしかいいようがない。しかも小っ恥ずかしいことに新規追加にバグがあったので直した。</p>
<img src="http://selfkleptomaniac.org/?ak_action=api_record_view&id=1302&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://selfkleptomaniac.org/archives/1302/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
