Author: 山田 泰司

# ブラウザの履歴データベースのテキスト入出力コマンド

Copyright (C) 1999,2000 Taiji Yamada <taiji@aihara.co.jp>

## ブラウザの履歴データベースのテキスト出力コマンド

UNIX の Netscape の履歴データベースファイルって `~/.netscape/history.db` または `~/.netscape/history.dat` にありますが、これはバイナリファイルなので `more` とか `less` とかで見てもよくわかりません。Communicator の「履歴」ウィンドウでその内容は見れますが、やはりテキストで `grep` とかかけたい時があると思います。例えば、「あそこのサイト、ブックマークしとくの忘れた！」とか、「自分、Linux 関係のページって今までどのぐらい見たんだろう」とかとか。

そこで、Netscape の履歴データベースから「タイトル」と「URL」を抽出し、テキストに吐き出すコマンド `history-db-list` を作成しました。

以下のようにすると、標準出力に一行毎に「URL[TAB]TITLE」の形式で出力されます。

`% history-db-list`

また、以下のように `"-a"` オプションを付けると、最終閲覧日時、初閲覧日時、エクスパイア日時、アクセス回数の属性、`"-T"` オプションを付けると無題の URL を含めてすべて表示します。

`% history-db-list -a -T`

また、HTML 形式で出力するスクリプト `show-history.pl` も作成しました。

`% show-history.pl > filename.html`

これは内部で `history-db-list` を使っています。

但し、`show-history.pl` が生成した HTML は人によっては非常に大きくなるので、Netscape のブラウザで見るには辛いかもしれません。そこで、以下のような使い方を用意しました。

`% history-db-list | grep '[Ll]inux' | show-history.pl - > filename.html`

これで、履歴の中の Linux に関する URL がブラウザで閲覧できます。

また、`show-history.pl` を `show-history.cgi` というファイル名にしたとして、HTTP 経由での利用も考慮してあります。その場合、以下の URL のような使い方になると思います。

`http://www.foo.ac.jp/~bar/private/history-db/show-history.cgi?-g+[Ll]inux`

但し、そもそも `~/.netscape/history.dat` はオーナー以外は読み込み許可がされてませんし、`~/.netscape` もオーナー以外は入れませんので、HTTP 経由の使用はセキュリティやプライバシーを十分検討した上で運用しない場合は推奨できません。

## テキスト入力による、ブラウザの履歴データベース作成及び追加コマンド

上記の履歴データベースが生成したテキストを標準入力から読み込んで、指定したデータベースファイルに書き込むコマンド `history-db-write` も作成しました。例えば、以下のように使用します。

`% history-db-list -a -T ~/.netscape/history.dat | history-db-write ./history.dat`

ここで `"./history.dat"` は作成されるデータベースファイルです。また、`history-db-list` の `"-a"` オプションは必須です。また、既にあるデータベースにエントリを追加する場合は、以下のようにアペンドオプション `"-A"` を指定します。

`% history-db-list -a -T ~/.netscape.old/history.dat | history-db-write -A ./history.dat`

但し、SPARC プロセッサや Pentium プロセッサなど異機種間で history.dat を変換もしくはマージする場合、ビッグエンディアン、リトルエンディアンの問題で、最終閲覧日時、初閲覧日時、エクスパイア日時、アクセス回数の属性が正しく表示されない場合があります。そのような場合、`history-db-list` もしくは `history-db-write` に `"-C"` オプションを付加してエンディアン変換を行うことが出来ます。これについては、次節の Solaris における Communicator 4.0x から 4.5x へのアップグレードの際の活用例を参考にして下さい。

## Applications

`history-db-list, history-db-write` の応用例を紹介します。

### Solaris における Communicator 4.0x から 4.5x へのアップグレードの際の活用例

SPARC の Solaris で Communicator 4.5x を使うと Navigator 3.x の頃から使われていた `history.db` は使用しなくなり、新たに `history.dat` という履歴データベースファイルが使用されます。よって、そのままでは Communicator 4.5x では過去の履歴を継承できません。しかし、データベースファイルの形式が抜本的に変更されているわけではなく、実は、`history.dat` ではリトルエンディアンのファイル形式に変更されているだけです。よって、`history-db-list` と `history-db-write` を使って、`history.db` を `history.dat` 形式に変換することが出来ます。例えば、以下のようにします。

> `% cd ~/tmp`
> `% history-db-list -a -T ~/.netscape/history.db | sort > history-db.all`
> `% history-db-write -C history.dat < history-db.all`

`"-C"` オプションは、エンディアンのタイプを変更する為のオプションです。カレントディレクトリに新規作成された `history.dat` が `~/.netscape/history.db` から変換されたデータベースファイルです。念の為、以下のように確認するといいと思います。日付などがおかしな値になっていないことを確認して下さい。

> `% history-db-list -a -T -C history.dat | sort | less`

さらに、既に Communicator 4.5x を運用していて `~/.netscape/history.dat` が既に作成されている方は、以下のようにしてデータベースをマージすることも出来ます。

> `% history-db-list -a -T -C ~/.netscape/history.dat | sort > history-dat.all`
> `% history-db-write -C -A history.dat < history-dat.all`

`"-A"` はデータベースに追加する場合に指定する為のオプションです。これを付けないと `history-db-write` は、常に新規のデータベースを作成します。やはりマージされたデータベースを、以下のように確認するのがいいかと思います。

> `% history-db-list -a -T -C history.dat | sort | less`

データベースファイル `history.dat` が正しく作成されたら、以下のように `~/.netscape` に移動します。

> `% mv ~/.netscape/history.db ~/.netscape/history.db.org`
> `% mv history.dat ~/.netscape/history.dat`

### データベースファイルのダイエット

データベースファイルがあまり大きくなり過ぎると、Communicator 自体の速度も遅くなってきます。履歴の自動消去機能で、ある程度はそれほど大きくならないように出来ますが、そもそも履歴データベースには「タイトルが無く、残っていても活用できない URL」や「Navigator 3.x」の頃から残ってしまっているゴミ、「404 Not Found の URL」などがあります。これらを削除すれば、データベースファイルを相当ダイエットすることが出来ます。以下は、そのダイエットの例です。

> `% history-db-list -a ~/.netscape/history.dat | \`
> `grep -v 'Bad Request'| \`
> `grep -v 'Authorization Required'| \`
> `grep -v 'Forbidden'| \`
> `grep -v '[nN]ot [fF]ound'| \`
> `grep -v 'Internal Server Error'| \`
> `grep -v 'Error [45]0[0-9]' | \`
> `grep -v '\(GIF\|PNG\|JPEG\) 画像 .* \(ピクセル\|ドット\)' | \`
> `sort > history-list.all`
> `% history-db-write ./history.dat < history-list.all`

この例では、`history-db-list` に `"-T"` オプションを付けていないので無題の URL は無条件に出力しておらず、さらに、`'grep -v'` で不要そうな URL を除外しています。およそ経験的に3分の1のサイズになります。そして netscape が軽くなります。

### EBW3 への応用例

作者は ebw3 という CD-ROM 辞書サーバを使って英単語を調べているのですが、Netscape の履歴データベースから「一度は調べたことのある、自分だけの英単語帳」というのを作ることが可能です。そのためのスクリプト `show-history-ebw3-result.pl` を `show-history.pl` を元に作成し、以下のように使っています。

`% history-db-list -a | sort +1 > history-list.all`
`% show-history-ebw3-result.pl - < history-list.all > my-dictionary.html`

ちなみにここで、`history-db-list` の `"-a"` オプションは、最終閲覧日時、初閲覧日時、エクスパイア日時、アクセス回数の情報を付加するためのもので、必ずしも必要ではありません。

このようにすると今まで調べたことのある英単語についての自分だけの辞書が、下図のように作成されます。

また、以下のようにすると指定した日時以降に調べた英単語のみの辞書を作成します。この場合は、上記で示した `history-db-list` には `"-a"` オプションが必須です。

`% show-history-ebw3-result.pl -a 1999/03/20 - < history-list.all > my-dictionary-19990320.html`

他にもいろいろと応用が考えられると思います。

## Problems

Netscape の history.db のフォーマットについて良く知って作成したわけではないので、破壊されている URL を表示することがあります。調べ次第、修正しますが、詳しい方がいらっしゃいましたら教えて下されば幸いです。この問題はバージョン 0.4 より解決しています。

## History & distributions

- history-db-0.6.tar.gz … `history-db-list` と `history-db-write` に関して URL のタイトルが非常に長いとコアダンプしてしまう問題に対処。
タブや改行を含むような URL のタイトルに対処。その他、細かな変更。
`history.dat` をデータベースのデフォルトのファイル名にした。
また、db-2 以降の Berkeley DB でも試みましたが駄目でした。どうも db-2.* や db-3.* は C インターフェースは互換があるけど、データベースファイル自体の互換は無い、って FAQ に書いてあった。それなのに Netscape の履歴をダンプ出来るようなことも FAQ に書いてあるけど、作者が調べた限り「嘘」だと思う。ゆえに db-2 以降がベースの DB が組み込まれている Perl5 だと `history-db-list.pl も`動かないはず。この辺りの問題に関して、尾関さんに御協力頂きました。ありがとうございました。
- history-db-0.5.tar.gz … `history-db-list` の逆を行う `history-db-write` を用意しました。これは、作者が Communicator 4.0x から 4.5x へ移行したので、`history.db` を `history.dat` へ継承する為に必要だったからです。また、`history-list.pl, history-db-list.pl, history-db-list.c, history-db-write.c` に `"-C"` オプションを加え、エンディアン変換を行えるようにしました。これも作者の Communicator 4.5x への移行で必要だったからです。`"-C"` オプションによるエンディアン変換は、上記の解説を読んで、良く理解して使用しないと、様々な属性がおかしな値になる可能性があります。データベースに書き込む時は特に注意して下さい。それに、PC-UNIX の場合はおそらくあまり必要無いと思います。
- history-db-0.4.tar.gz … Berkeley UNIX データベースによる実装。これにより history-list の実装の方法をいくつか用意しました。どの history-list を使うかは、効率やインストール環境などによって選ぶと良いでしょう。

- `history-ls.pl` … 旧バージョンの `history-list.pl` と等価な実装。
- `history-list.pl` … 旧バージョンの `history-list.pl` をベースに、最終閲覧日時、初閲覧日時、エクスパイア日時、アクセス回数も出力できるようにしました。
これらの `history-ls.pl, history-list.pl` はバイナリファイルの単なる字句解析による実装なので、データベースの Perl モジュールなどは不要ですが、破壊されている URL を表示することがままあります。正確さを重視するなら以下の実装方法を選ぶ必要があります。
- `history-db-list.pl` … Berkeley UNIX データベースの Perl モジュール DB_File-1.65.tar.gz を用いて、`~/.netscape/history.db` のデータベース形式に則った実装をしました。よって、最終閲覧日時、初閲覧日時、エクスパイア日時、アクセス回数も出力できます。但しこのスクリプトには、DB_File-1.65.tar.gz 及び Berkeley UNIX データベースライブラリ db-1.85.tgz が必要です。
- `history-db-list.c` … Berkeley UNIX データベースライブラリ db-1.85.tgz を用いた、`~/.netscape/history.db` のテキスト表示コマンドの C 言語バージョン。やはり、これが最も動作が速いです。但し、このプログラムをコンパイルするには db-1.85.tgz が必要です。

show-history.pl では内部でこれらのコマンドのうちのどれかを必要としますが、デフォルトでは `history-db-list.c` の実行形式 `history-db-list` が指定されています。所望のコマンドに書き換えてお使い下さい。
- history-db-0.3.tar.gz … `history-list.pl` で重複表示を抑制、`show-history.pl` でソートオプション追加など。
- history-db-0.2.tar.gz … `show-history.pl` で URL の表示のバグを修正。
- history-db-0.1.tar.gz

このサイトに関するご意見ご要望は taiji@aihara.co.jp までお願いします。

Copyright (C) 1999 Taiji Yamada, All rights reserved.