SQL による『集合知プログラミング』の実装
『集合知プログラミング』のコードを Oracle の SQL (+PL/SQL) で実装するという意欲的な試みをする人がいた。Oracle Data Mining の開発マネージャである Marcos M. Campos さん。
http://3.1415.jp/sites/default/files/blogger_importer/09/collective-intelligence-1-building-rss.html
<p>『集合知プログラミング』より前は、ビジネス向け、データ解析者向けのデータマイニング本がほとんどであった。開発者向けのデータマイニング技術の本が出たことに感銘を受けて、Oracle の SQL でも実装してみることにした、とのこと。第一回目は、RSSフィードの取得処理まで。</p>
<p>Oracle が XML を扱えることは知っていたが、HTTP も使えるそうだ。</p>
<pre class="prettyprint">
req := UTL_HTTP.BEGIN_REQUEST(url);
resp := UTL_HTTP.GET_RESPONSE(req);
IF (resp.status_code >=400 AND
resp.status_code <= 599)
THEN
res := null;
ELSE
res := httpuritype(url).getXML();
END IF;
</pre>
<p>Oracle なら robust で scalable な集合知実装になる、という前提の元に書いているが、コストを考えずに RAC を使えば、そうなるのかもしれない。しかし、安いサーバを並べて並列処理をするなら、他の方法で実装するほうが、Oracle のライセンスが不要な分だけ、安い。</p>
<p>協調フィルタリングのように、同じ演算を何度も繰り返すような種類の集合知実装なら、SQL での実装も選択肢の一つになりえる。一台の DBサーバで処理速度が間に合う規模のデータと更新頻度に収まっていれば、問題ない。全データをアプリに fetch して、結果を RDB に書き込むよりも、RDB 内部で処理を完結させた方が速そう。</p>
<p>アプリに全データを一気に読み込んで計算すると、メモリが足りるかどうかを気にする必要がある。メモリのことを気にするのは嫌だといって、必要なデータを逐次 RDB から取得すると、javascript:void(0)遅くなる。全て RDB で実装すれば、巨大なデータであっても、中間テーブルに書き出すなどして、RDBMS が適切に処理してくれる。</p>
Algorithms Of The Intelligent Web の発刊は 2009年3月までに
だそうです。
<blockquote>
My book “Algorithms of the Intelligent Web” should be released by March 2009.
http://www.marmanis.com/web/guest/201
</blockquote>
<p>著者は Haralambos Marmanis さん。見慣れない感じのお名前ですが、どこの国系の方なんでしょうかね。Marmanis を Google の「ウェブ全体から検索」で探しても 3870件しか該当がありません。かなり希少なお名前のようです。</p>
LikedIn の公開プロフィールはこちら
http://www.linkedin.com/pub/0/490/539
Many Eyes - データ解析の集合知
IBM alphaworks が提供しているデータとグラフの共有サイト Many Eyes で遊んでみた。
<p>
『我輩は猫である』のタグクラウド
<img style=”display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 130px;” src=”http://3.1415.jp/sites/default/files/blogger_importer/s320/ManyEyes_%25E6%2588%2591%25E8%25BC%25A9%25E3%2581%25AF%25E7%258C%25AB%25E3%2581%25A7%25E3%2581%2582%25E3%2582%258B_TagCloud_0.png” border=”0” alt=”“id=”BLOGGER_PHOTO_ID_5272152286438850306” />
</p>
<p>
『我輩は猫である』のワードツリー
<img style=”display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 174px;” src=”http://3.1415.jp/sites/default/files/blogger_importer/s320/ManyEyes_%25E6%2588%2591%25E8%25BC%25A9%25E3%2581%25AF%25E7%258C%25AB%25E3%2581%25A7%25E3%2581%2582%25E3%2582%258B_WordTree_0.png” border=”0” alt=”“id=”BLOGGER_PHOTO_ID_5272152446972636882” />
</p>
<p>他の人がアップロードしたデータに対して、多様な visualization を行い、その図を共有することができる。データと分析結果を共有して、大勢の人の目が入れば、一人では見えなかったものも見えるようになりますよ、というのがサービスの趣旨。</p>
<p>エクセルのような定型データと、フリーテキストを扱うことが出来る。ただし、日本語のフリーテキストには対応していない。上記の図は、若干の手間をかけてある。</p>
<ol>
<li>
日本語テキストをどこかから入手する。今回は、青空文庫の『我輩は猫である』を用いた。
http://www.aozora.gr.jp/cards/000148/card789.html
</li>
<li>
ルビが邪魔なので削除する。テキストエディタで、正規表現で置換した
<pre class="prettyprint">
s/《[^《]》//
s/|//
</pre>
</li>
<li>
入力者注も削除する。
<pre class="prettyprint">
s/[#[^[]]//
</pre>
</li>
<li>
茶筌にかけて分かち書きする。
<pre class="prettyprint">
$ chasen -F”%m “ < ~/neko.txt > neko_splitted.txt
</pre>
</li>
<li>
「てをには」を削除する。というよりも、ひらがな一文字を全て削除する。スペースに挟まれていない場合に除去されないので、下記の置換を三回行う。
<pre class="prettyprint">
s/\s[あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ]\s//
</pre>
</li>
<li>
句読点と記号を削除する。
<pre class="prettyprint">
s/[、。…「」―?]//
</pre>
</li>
</ol>
iPhone のマルチタッチに続くコンピュータインタフェース
Brain Scanners, Fingercams Take Computer Interfaces Beyond Multitouch
http://blog.wired.com/gadgets/2008/09/brain-scanners.html
<p>iPhone のマルチタッチスクリーンは、次世代のインタフェースを感じさせる。キーボードとマウスという、既存のインタフェースの延長線上にない、革命的なインタフェースだ。これから先のディスプレイデバイスは、マルチタッチができることが前提となってゆくことは間違いない。</p>
<p>マルチタッチが初めて提唱されたのは、1982年のこと。世の人に知られるようになり、世の標準になるその一歩を踏み出すまでに25年かかった。この記事で紹介されている、最先端の研究も、世に広く知られるようになるまでには、10年、20年を要するのだろう。</p>
<p>Neurotransmitters と呼ばれるデバイスは、近赤外線を額に照射して、その反射光の計測によって脳の働きの活発さを見るもの。血中酸素量が推測できる。人が集中すれと、より多くの酸素が必要とされることを利用している。</p>
<p>FingerSight は、指先につける小さなカメラ。指先の動きを、カメラ画像の解析によって判断する。アプリケーション上で、ダイヤルを回す、ドアノブを回すなどの動作に変換することができる。</p>
LVS が FIN を落とす
ちょっと前に、Webアプリの Load Balancer として、LVS(Linux Virtual Server) を DR (Direct Routing) 構成で用いてみました。LVS はオープンソースの LB。BIG-IP など使うと安くても数百万円コースですが、LVS なら安いサーバ 2台で Active-Standby な LB を組めます。DR は、クライアントへのレスポンスを LB を通さずに返す方式。NAT 方式だと行きも帰りも LB を通りますが、DR は行きだけなので、LB がスループットのボトルネックになりにくいという長所があります。その代り、設定はちょっと手間がかかります。
<p>だいたいうまく動いていたのですが、ある月曜日に突然、社内からアクセスすると、だんだんと動作が遅くなって、しまいには自社のプロキシが「サーバが反応しないからアクセスできないよ」という趣旨のエラーを返し始める、という問題が出てきました。</p>
<pre>
Webアプリと社内ネットワークの概要
DB - Web - LB - Router — Internet — Router - Proxy - Client
</pre>
<p>時間に追われながら、調査を開始しました。まず、週末に、社内のHTTPプロキシサーバが置き換わり、処理能力がパワーアップしていました。前の週との間で変わったのはプロキシだけなので、とても怪しいのですが、プロキシの何が悪いのか、まったくわかりません。</p>
<p>社外からアクセスすると通常の速度なので、Webアプリ側の処理には問題なさそうです。サーバの Load Average も余裕あり。Webサーバ上の tcpdump で調べると、Webサーバからクライアントへ ACK を返すタイミングが変なことがわかりました。一通りの HTTP request - response が終わったあとに、ちょっとの空白時間を挟んで、まとめて ACK が返ります。謎。目処が立たないので、別の対策でしのいで、サービス正常化を優先させることにしました。</p>
<p>それからしばらく後の再調査で、Webサーバで FIN_WAIT_2 が大量発生していることが判りました。TIME_WAIT がたくさんなら普通ですが、FIN_WAIT_2 の多発は何かありそうです。</p>
<p>tcpdump で各所のパケットをキャプチャし、丹念に動作を追うと、LVS がクライアントからの FIN を落としているために Webサーバに届いていないことが確認できました。ググると、LVS の DR 構成は、帰りのパケットが LVS を通らないために netfilter(iptables) がコネクションの確立を認識せず、FIN を通さないということが判りました。netfilter で TCP の state を見ないようにすることで、無事解決です。</p>
<pre>
> For one of my dozen of services ( a straight TCP connection), the
> TCP-FIN packets that are arriving on the load balancer are never
passed
> to the real server.
Basically, all packets (SYN and non-SYN) are allowed by the “–state
NEW” iptables but not by the ESTABLISHED,RELATED, because the director
never sees the replies from the real server and so never creates a
conntrack for that connection.
When a FIN packet arrives, it is not validated as a –state NEW,
because
it’s flag FIN is activated and so, that particular packet is dropped.
(snip)
So the solution is to change the iptables rule from
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport $VPORT -j ACCEPT
to
-A RH-Firewall-1-INPUT -m tcp -p tcp –dport $VPORT -j ACCEPT
http://archives.free.net.ph/message/20080425.113313.b51288d0.ja.html
</pre>