« 2005年06月09日 | top | 2005年06月14日 »

2005年06月13日

週末のquick hack

今週末はすこし時間があったが、外が暑すぎて本屋に行く気力もないし、
自宅でいくつかのquick hackをしていた。
都市を流れる風の精密なシミュレーションを元にした都市計画というのは無理なものかなあ。
プログラムは後で使いかたを書いてから RAA に投稿しようと思う。

1) spotlightの限界

私は日頃から、web全体をインクリメンタルサーチしたいと考えていた。
googleサジェストのような侯補のリストだけが出るのではなく、Mac OSXのspotlightのように、
結果も同時に変化しながら表示されるものが欲しいのだ。
理想は、動的に検索結果のサイトのサムネイルが表示されるものだ。

Wikipedia がデータベース全部のダンプデータを公開しているので、
手はじめに、それを静的なHTMLに展開してPowerbookに置き、spotlightにインデクスを作らせて、
インクリメンタル検索できるようにしてみようと考えた。Rubyによる変換プログラムがなかったので、
簡単なプログラムを書いて試してみた。手順と結果は以下の通り。

1. 750MBのbz2ファイルをdownload.wikipedia.orgからダウンロードする。
2. 必要なSQLを抜きだす。非圧縮で2GBになる。これに10分かかる。(画像なし)
3. MySQLにすべてinsertする。さらに20分
4. mkhtml.rbというプログラムでHTML化する。内部リンクもぜんぶ変換する。
適当なアルゴリズムなので、P4 3GHzのLinuxで、18時間もかかってしまう。
5. 出力された4GB分、1000ディレクトリ、160万ファイルのHTMLを、パワーブックにコピー
6. spotlightが、まるまる2日かけて700MBのインデクスを作成(/.Spotlight-V100/)。
その間、パワーブックはちょっと重い状態が続く。

さて、wikipediaをインクリメンタルサーチできたらいいな、
と思いながら使ってみたところ、まったく使いものにならなかった。
wikipedia以外の、普段のファイルを探すのにも1分近くかかるようになってしまった。
spotlightは、160万ファイル、4GBのテキストという状態には耐えられないようだ。
spotlightを元に戻すためにファイルをぜんぶ消すと、もとの状態に戻った。
spotlightは、あくまで、個人用PCにおける、少ないファイル用にチューニングされているようだ。

もしかすると、分散処理をする中央サーバーにajax的にアクセスしておなじ機能を
実現するほうが簡単なのかもしれない。あるいは、ドキュメントの動的検索専用に特化した、
HDD内蔵の電子辞書も面白いかもしれない。


2) 大きな画像

20000x20000ピクセル程度の画像を作って紙に印刷することによって、
ディスプレイでは不可能な表現が可能になるかもしれない。
OpenGLでは4000x4000ピクセルに固定の制限があることがわかっているし、Processingでは、
デフォルトでは1ピクセルあたり20バイトも物理メモリを使うのでうまくない。
GIFだと1ピクセルあたり1バイトだろうということで、GD/Cを使って試してみた。source
いろんなサイズの画像に5万本の直線を引くサンプル
画像の部分をクリックすると次のサイズに移行する。
Safariだと 16000x16000あたりで、ブラウザが画像表示をあきらめるようだ。
IEだと3200が限界で、FireFoxだと8000が限界だった。(メモリ2GBのマシン)
Safariがかなりまともに作ってあることがよくわかる。

というわけで、ブラウザだと20000ピクセルをそのまま見ることができない。
20000の画像をAdobe illustratorを使って小さくしようとしたら こんな風になって、処理を完了できなかった。
convertコマンドを使って小さくしようとしたら、
4GBのファイルを/tmpに作ってHDDを壊しそうな勢いだったが、
30分ぐらいかけて変換できた。

8000のGIFを試しに紙に印刷してみたら、普通のプリンタは、
1ドット幅の線とか点を表示するためにはチューニングされていないせいか、
常にかすれた線になってしまうが、ディスプレイでは不可能な質感は予想通り、ちゃんと出た。

ラスタデータではなくベクタデータを使えば、画像を見るときに
動かしながら見ることによって圧倒的な情報量を詰めこめるが、
ベクターデータは情報量が増えると、それに比例してCPUの処理が煩雑になり、
レスポンスが悪化していくという問題がある。たとえばFlushで5万本も線がある状態は、
ほとんど使いものにならないはずだ。

無制限なサイズのラスタデータを操作しやすい画像処理系というニッチがあるような気がした。

さて、とても大きなラスタ画像が可能になれば、
flickrの写真についているすべてのタグを余すところなく1枚の画像に入れて眺めたり、
日本にある全てのブログの更新状況とトラックバック関係を1枚の画像に入れたり
といったことができるかもしれない。それを紙に印刷して楽しめるかもしれない。
そう考えて、今度は technoratiのweb APIをすこしハックしてみた。

3) technorati API
RAAを見ると Rubyのライブラリがあったので、さっそくライセンスキーを取得して試してみたが、
1日に500回しかアクセスできない(GoogleAPIよりケチ)のと、単純なクエリに10秒以上も待たされるなど、
まともなハック環境ではなかったのであきらめた。
データベースを公開しないことで、ハックの機会がいちじるしく減っている。残念なことだ。
特例を作ってもらえないかどうか今度コンタクトを取ってみることにしよう。

Posted by ringo : 08:25 | TrackBack