原です。

In message "[ruby-list:22494] [Q] blade internal design"
    on 00/05/13, Hideto ISHIBASHI <hideto-i / rr.iij4u.or.jp> writes:
|
|石橋"rubyholic"秀仁です
|# To: ruby-list, Cc: 原さま m(__)m
|
|いま、bladeの実装にとても興味があります。というのも、
|  [ruby-list:19581],[ruby-list:19630],[ruby-list:19698]
|    Re: ruby-list の過去ログの作り方
|  [ruby-list:19722] [PROPOSAL] Reimplement 'blade'
|あたりを参考に、取り組んでみようと思いましたので。

ああ、ついに石橋さんが始めるのですね。そういえば、1999年中になんとか
まとめると言っておきながら早半年。(^^; 実は去年の暮れにいじり始めたので
すが、結局実りませんでした。

|bladeの仕組みについて確認させて頂いてもよろしいでしょうか?
|以下にぼくの推測を書いてみました。
|
| 用語の定義 (便宜上)
|  * ヘッダ情報:メールヘッダのSubject:,From:,Date:,In-Reply-To:など
|  * 通し番号:"[ruby-list:19581]"の"19581" (fmlでは "X-Mail-Count: .*")
|  * ML名:"[ruby-list:19581]"の"ruby-list" (fmlでは "X-ML-Name: .*")

通し番号は結構問題です。ML の場合はヘッダから取れますが、News の場合は
ローカルに拾得した順番を番号にしています。前にローカルサーバのつける番号
を利用していたのですが、サーバがクラッシュした瞬間に意味がなくなりました。

| データ構造
|  * メールはそのままファイルに保存。通し番号をファイル名にする。
|    複数のMLに対応するため、メールはMH形式でML名のフォルダに保存?

そうです。単にファイル名を通し番号にして、ML 名のディレクトリに放り込ん
でいるだけです。

|  * DBはメールのヘッダ情報だけを持つ。テーブルは (いまのところ) 一つ。
|    タプルは、代表的なヘッダフィールド (Subject:など) と通し番号。
|    通し番号がテーブルの主キー。

DB は ruby の Dbm モジュールを使って2つです。

  a. 通し番号 => Message-Id
  b. 通し番号 => コメント元、コメント先、被コメント先などの通し番号の列

CGI で使うので高速な処理が必要となるので、a.から(a. の reverse を作り)
b. を構成してします。また、通し番号と Subject の対応は

 c.プレーンテキスト

で持っています。

|  * DBはメール本文を持たない。主キー (通し番号) から本体ファイルを参照。

そうです。ただし、処理しているメールのヘッダ情報を使って b. を作りますが、
a. には、Message-Id 情報しか残しません。

| 検索方式
|  * ヘッダ情報や通し番号での検索はDBで (SQLのselect文)

これは c. を読んでます。

|  * 本文中キーワード検索はnamazuで

そうです。namazu さまさまです。

|これから作業していきたいので、
|bladeの実装で工夫されたところや、
|参考になりそうな tips など、
|情報を与えて下されば幸いです m(__)m > 原さま & all

幾つか思いつく事を書きます。

1.数万通のメールを1つのディレクトリに入れて各種の処理をすると、Linux で
は不具合があるという噂があったが、大丈夫らしい。

2.DB はスクリプトのバグなどでしばしば作り直しになるから、大量なメールを
扱う場合に備えて、部分的な作り直しが可能にしておいたほうがよい。また、デ
バッグのためにも途中で処理を中断しても自動的に古い DB を復活される様にし
ておく。

3.コメントツリーは Message-Id, Reference を見ている。両方無い場
合は本文の引用文を見て前方の番号のメールを探すようにした。ただし、どうして
もコメント先が見つからない場合は適当な所であきらめる様にしておかないとえ
らい事になる。

あれ、あまり無いな。(^^; 思い出したらまた書きます。