PlaggerとHyperEstraierでWeb履歴を検索

一日の大半をWebブラウジングに費やしているような人は、その知識がWeb上の文章が対応しているといっても過言ではない。いや、これは言い過ぎですね。

上のは言い過ぎにしろ、中途半端な知識があって「あー、それどっかのWebページでみたんだけどなー、どこだっけなー」とイライラするってのはありがち。そこで、自分の観たWebページの内容をインデクシングして、すべて検索できるようにすれば快適に違いない。より抽象的に言うと、自分の頭ん中に入りきらなかったものを溜め込んでおく、シンクのようなものがあれば便利だよなー、って感じ。

というわけで、Plagger + Subscription::BrowserHistory + HyperEstraierを使った、観たWebページ検索ツールを作ってみた。

実は、このツールを使うと、わりと危険なことが起こる可能性がある。このエントリー最後に書いた注意を読んでから試したい人は試すと良いです。どうなってもうちは責任とれませんので。

HyperEstraierを準備する

まず、情報を溜め込むシンクを用意する必要がある。今回は、P2Pな機能があって柔軟性が高そうなHyperEstraierを利用した。HyperEstraierはすでにインストールしてあるという前提で話を進める。Mac OS XだとMacPortsからインストールできる。

Plaggerからデータをプッシュするために、HyperEstraierのノードマスタを起動する必要がある。ノードマスタはP2P機能をもったインデックス管理を行うHyperEstraierのサーバだ。くわしくは、P2P Guide of Hyper Estraier Version 1 (Japanese)を参照。

適当なディレクトリで、以下のようなコマンドを利用して、サーバを立ち上げる。

$ estmaster init casket 
$ estmaster start casket

これでサーバが立ち上がったので、http://localhost:1978/にアクセスできるようになる。このWebインターフェースから、ノードサーバを作成する。初期ID/Passはadmin/adminになっているので、自分用のユーザとPlagger用のノードサーバを作成する。ここではplaggerというノードサーバを作成した。このあたりも、P2P Guide of Hyper Estraier Version 1 (Japanese)のチュートリアルで触れられているので、適宜参照。

Plaggerの設定

HyperEstraierの準備ができたので、Plaggerの設定ファイルを作る。今回の入力はWeb履歴(= ブラウザの履歴)なので、野良プラグインのSubscription::BrowserHistoryを利用する。詳細ははこべにっき# - PlaggerとSubscription::BrowserHistoryで自分のWebブラウジングをトラッキングや、はこべにっき# - File::Morkで日本語が使えるようにを参照。

Subscription::BrowserHistoryはWebの履歴からURLを取り出すだけなので、本文はFilter::EntryFullTextを利用して取得する。そのとき、HTMLやtxt以外のバイナリデータは、検索対象にできないし、EntryFullTextでダウンロードして時間がかかってしまうので、expressionで除外している。

また、そのままだと、HTMLのタグが大量に含まれてしまって邪魔なので、Filter::Ruleのexpressionで強引にHTMLをstripしている。Filter::HTMLScrubberではHTMLをタグ全部消す方法がいまいちよくわかんなかったので。

また、2回目以降この設定でPlaggerを動作させたときに、無駄が無いようにFilter::Rule::Dedupedを使っている。

出力先はHyperEstraierなので、Search::Estraierというプラグインを使う。先ほど起動したノードマスタを指定する。

上記の点を考慮してYAMLを書くと以下のようになった。

plugins:
  - module: Subscription::BrowserHistory
    config:
      browser: Mozilla
      path: /path/to/your/history.dat

  - module: Filter::EntryFullText
    config:
      store_html_on_failure: 1
      force_upgrade: 1
    rule:
      expression: $args->{entry}->link !~ m!(jpe?g|png|gif|mpg|m2p|avi|mp4|mov|mp3|m4a|zip|lzh|gz|dmg)$!;

  - module: Filter::Rule
    rule:
      module: Deduped
      path: /path/to/cache/history2search.db
      expression: $args->{entry}->body(Plagger::Util::strip_html($args->{entry}->body));1

  - module: Search::Estraier
    config:
      url: http://localhost:1978/node/plagger
      username: user
      password: password

Plaggerの実行と検索

作成したYAMLを引数にPlaggerを実行すると、自分のブラウザの履歴に残っていたWebページがすべてダウンロードされる。ダウンロードされたWebページはHyperEstraierのノードサーバに入力されインデックスに追加される。結構時間がかかるのでまったり待とう。

処理が終わると、http://localhost:1978/node/plagger/search_uiからこれまでアクセスしたWebページの検索ができるようになっている。

これでちょっとした自分検索ツールの完成。あとはcronで定期的にこのYAMLを実行しておけば良いだけ。

注意(けっこうやばげ)

とりあえず作ってみたものの、いくつか問題がある。しかも、結構やばい感じの問題だったりするので注意。

Filter::EntryFullTextはとりあえず、履歴にあるURLにすべてアクセスする。そうするとアクセスしてはいけないURLにアクセスしてしまうかもしれない。URLによっては勝手にコメント投稿しちゃったり、お買い物で購入ボタンをぽちっと押してしまうかもしれない。基本的に認証はスルーできないはずなので、滅多にそんなことにはならないと思うけど。

あと、履歴が全部含まれるので、他人に検索されたりすると、見せたくないものまで見られるかも。プライバシーの問題という。

ともかく、履歴URLを片っ端からアクセスして、それをさらすという事。注意ですよ。

まとめ

このように自分のWeb履歴を検索できるようにしてみた。Google検索ではスポットのあたらない、自分のWeb上の軌跡を追う事でスムーズに情報をとりだせるようになるかもしれない。

HyperEstraierのサーバをパブリックなところに置いて、自分の使っているマシン全部でこのYAMLをPlaggerではしらせれば、Web履歴の一元管理も実現できたりもするので、工夫すればより実用的に使う事も可能だ。

ただし、たいていの場合Google検索で済んでしまったりする部分もあるわけで。自分の知識のうちデジタルにマッピングされている部分(Webの履歴、メール、ローカルのファイル、mixi)すべて一元的に検索するような仕組みがあれば、それこそ、自分の知識のシンクとして利用することができるようになるんじゃなかろうか。