ホームHTMLに役立つヒントADSLでMACサーバ・実験室 > AS Tree BBSの設計

AS Tree BBSの設計

 非力なマシンでも実用的な速度で動くツリー形式掲示板が欲しい。ってわけでまずは設計。さて、はたして完成まで行くのか(?_?) 名前はとりあえずeasyBBS TR。考え方はeasyBBSが元になっているから。そのtree表示版という意味である。

 →2001/12/29 名前について、本家easyBBSの田中求之さんから「easyBBS」の名前を使わないでほしいとのクレームをうけました。そこでAS Tree BBSと改名しました。


AS Tree BBSの設計][データ構造の考察][インストール


●最近の状況 ▲ページトップ

 以下、最新状況はこちら

2001/12/19
 AppleScriptでCGIを作る基礎から勉強中。おおざっぱなところはわかってきた。Tanaka's OSAXの翻訳も進んでいる。
 少しずつスクリプトを書き始めた。

2001/12/17
 perlでツリー表示、日付順表示、新規発言は順調に実装できた。問題はコメント発言である。これ、面倒なんだよなぁ。
 で、現在までのところで、開発しているG3マシンで0.8秒程度かかっている。このサーバ(PB5300)では4倍から5倍の時間が(もっとかな?)かかる見込みなので、5倍としても4秒という遅さである。コメント発言の処理はさらに時間がかかる。やはりperlでは無理だな。
 これ以上perlで開発するのはあきらめてAppleScriptに戻るか。

2001/12/16
 データ構造の考察は終わったのでAppleScriptの勉強。最初から躓いてしまった。取り合えずperlでやってみようかな? 遅くなりそうだなぁ。

2001/12/14
 まーだどんなものにしようか設計をいじっている状態。考えれば考えるほどeasyBBSってよくできてるなと感心する。あちこち同様の問題にぶつかっているのだ。

2001/12/13
 どんな手法が使えるのか研究するために、Tanaka's OSAXの機能を研究しはじめた。ところが、解説ページ「Tanaka's OSAX 2.0ディクショナリ」が英文で難航中。ちびちび日本語訳をはじめた。公開できないのが残念。

2001/12/12
 このページを作り始めた。

●開発の留意点 ▲ページトップ

・目標はツリー表示のeasyBBS
 ・スレッドをツリー表示にして、話の流れを把握しやすくする。
 ・各スレッド(easyBBSでいう発言)の中の発言にはタイトルも付けられるようにする。

・カスタマイズできるようにアップルスクリプトで書く。データ構造からして、perlでは処理が遅くなるはず(perlは1ファイルの中のある部分を取り替えたり付け足したりというのが苦手なのだ。perlでやるならタブ区切りの簡易データベース構造にするか、1発言1ファイルとするほうが楽。それだとフツーのcgiと変わらない)。

・高速化のためにTanaka's OSAXを使う。

・高速化のために、easyBBSシリーズ同様、できるだけHTMLファイルをただ出力するだけ、という仕様にする。本来ツリー式はデータベースを持ち、それを元に各発言ファイルを有機的につなぎ合わせて表示するのがスジ。しかし、その方式ではcgiの負荷が必然的に高くなる。できるだけつなぎ合わせるファイルを少なくしようというのが狙い。
 ただし、easyBBSが基本的に書き込み操作以外はHTMLを送り出すだけなのに対し、こちらは必ずファイルの作業をかますことになるので低速化は否めないだろう。

●ファイルの構成 ▲ページトップ

AS_BBSフォルダ
  │
  ├AS_BBS.cgi
  │
  ├会議室その1
  │ ├発言1-A
  │ ├発言1-B
  │ ├発言2-A
  │ ├発言2-B
  │ ├ …
  │ 
  ├会議室その2
  │ ├発言1-A
  │ ├発言1-B
  │ ├発言2-A
  │ ├発言2-B
  │ ├ …
  │ 
  …

 左のように、1つの発言(スレッド)をAとBの2ファイルに分けて記録していく。表示するときには、これらを組み合わせて表示する(画面イメージは「画面表示イメージ」を参照)。

 Aブロックはツリーだけを受け持つ。このため、Aブロックだけを連続して表示させると、ツリー一覧画面ができあがる。

 Bブロックには発言の内容が蓄積されていく。

 ここが問題で、ちょっと検証してみる。

●単独発言
┌─────────────────────┐
│1.タイトル 名前・メール 発言日時   │
│ 本文本文本文本文本文本文本文本文本文  │
│ 本文本文本文本文本文本文本文本文本文  │
└─────────────────────┘

●順当な発言
┌─────────────────────┐
│1.タイトル 名前・メール 発言日時   │
│ 本文本文本文本文本文本文本文本文本文  │
│ 本文本文本文本文本文本文本文本文本文  │
│                     │
│2.タイトル 名前・メール 発言日時   │
│ 本文本文本文本文本文本文本文本文本文  │
│ 本文本文本文本文本文本文本文本文本文  │
└─────────────────────┘

●発言1、2の後に、発言3が1のコメントとしてつけられた場合
┌─────────────────────┐
│1.タイトル 名前・メール 発言日時   │
│ 本文本文本文本文本文本文本文本文本文  │
│ 本文本文本文本文本文本文本文本文本文  │
│                     │
│3.タイトル 名前・メール 発言日時   │
│ 本文本文本文本文本文本文本文本文本文  │
│ 本文本文本文本文本文本文本文本文本文  │
│                     │
│2.タイトル 名前・メール 発言日時   │
│ 本文本文本文本文本文本文本文本文本文  │
│ 本文本文本文本文本文本文本文本文本文  │
└─────────────────────┘
 というのを期待するよなぁ、やっぱり。しかし、これだとどの位置に挿入するか計算するのに、ツリーが複雑になるほど時間がかかるようになる。

 できるだけ挿入位置を探しやすいように、コメント文を挿入しておくのがいいだろう。<!--■発言番号■-->なんて具合。これをさがして、その前に発言一式を挿入する。

 スレッドを読み込んだ後、デリミタをにして分解し、<!--■発言番号終わり■-->+発言内容一式をデリミタにセットし直して構成し直し、元のファイルに上書き出力するという手法。

 Aブロックの手法も同様だ。

 コメント時には、どの発言に対するコメントかわかるように、やはりコメントを頼りに対象発言を表示するようにする。コメントする場合の「コメント」ボタンを表示するときには、ちゃんと「○○番にコメントする」として発言番号を出力すればよい。

 モードとしては、何も指定がないなら一覧表示、commentならコメントモード、newなら新規発言、発言番号ならその発言ファイルを表示といったところか。

 この方式では、Bブロックファイルを無制限の大きさにするわけにはいかないので、easyBBSと同様にファイルの大きさを制限する必要がある。デフォルトで200KB程度にするのが良さそうだ。
 あー、メモリ喰いそう。
 で、200KBを越す場合には、新しいファイルを自動的につくって、その発言にリンクを貼るようにする。これで一応スレッドを追うことができる。

●表示画面イメージ ▲ページトップ

●スレッド一覧画面

┏━━━━━━━━━━━━━━━━━┓
┃┌───────────────┐┃
┃│   発言1−Aブロック   │┃
┃│●======        │┃
┃│  ●======      │┃
┃│    ●======    │┃
┃└───────────────┘┃
┃┌───────────────┐┃
┃│   発言2−Aブロック   │┃
┃│●======        │┃
┃│  ●======      │┃
┃│    ●======    │┃
┃└───────────────┘┃
┃┌───────────────┐┃
┃│   発言3−Aブロック   │┃
┃│●======        │┃
┃│  ●======      │┃
┃│    ●======    │┃
┃└───────────────┘┃
┗━━━━━━━━━━━━━━━━━┛

●各スレッド表示画面

┏━━━━━━━━━━━━━━━━━┓
┃┌───────────────┐┃
┃│   発言1−Aブロック   │┃
┃│●======        │┃
┃│  ●======      │┃
┃│    ●======    │┃
┃└───────────────┘┃
┃┌───────────────┐┃
┃│   発言1−Bブロック   │┃
┃│●タイトル・名前等      │┃
┃│ 本文本文本文本文本文本文本文│┃
┃│ 本文本文本文本文本文本文本文│┃
┃│ 本文本文本文本文本文本文本文│┃
┃│               │┃
┃│●タイトル・名前等      │┃
┃│ 本文本文本文本文本文本文本文│┃
┃│ 本文本文本文本文本文本文本文│┃
┃│ 本文本文本文本文本文本文本文│┃
┃│               │┃
┃│●タイトル・名前等      │┃
┃│ 本文本文本文本文本文本文本文│┃
┃│ 本文本文本文本文本文本文本文│┃
┃│ 本文本文本文本文本文本文本文│┃
┃└───────────────┘┃
┗━━━━━━━━━━━━━━━━━┛

●発言時

 ポイントは発言時だ。最初の書き込みなら問題はない。該当の会議室に日付と時間を付けたAとBファイルを出力すればよい。
 何かにコメントするときが問題だ。コメント元の発言だけ切り出して表示しなくてはならない。高速にできるか不安。Tanaka's OSAXを研究しよう。
 さらに、200KBを超える場合はそのコメントに「ファイルサイズの制限を越えるので○○番に続きます」と1文を入れ、リンクを貼る必要がある。その上で自動的に新しいファイルをつくってやる。こちらにはどこからの続きなのかわかるようにしなくてはならない。


ホームHTMLに役立つヒントADSLでMACサーバ・実験室 > AS_BBSの設計