このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

EasyBBS DXb3の改造/未読コメントの色を変えたい

発言者:Kazushi Takahashi
( Date Tuesday, August 27, 1996 19:13:29 )


 EasyBBS DXb3の改造を通してAppleScriptを勉強中です。

 社内の業務連絡およびディスカッション、コミュニケーションの場と
してEasyBBSが定着してきています。

 で、今取り組んでいるテーマが
 1.各会議室のタイトル一覧で、未読コメントを含むタイトルの色を変える。
 2.タイトル一覧に最後にコメントした者の名前を付記する。
  の2点です。
  
 1については当初会議室フォルダに入っている各ページのファイル名に、更新日時
(コメントを付けた日時)のタイプスタンプか日時のシリアル値を付け加えることを
考えました。でもファイル名に付けられる文字数の制限を超えてしまいます。
 次に、現在ファイル名に使っているタイムスタンプをシリアル値にしてしまおうか
と思いました。でもTanaka's osaxはそのまま使いたい。
 それで、現在考えているのがNetscapeの独自タグである「ページ名#name」でタイ
トル一覧を作る。という方法です。
 
 2についてはまだ良く考えていないのですが、リーセントのページを作るあたりを
参考にしようと思います。
 
 以上、遅々として進んでいない自分のテーマですが、なにかアドバイスをいただけ
たら幸いです。

SBK さんからのコメント
( Tuesday, August 27, 1996 21:34:15 )

 たしか、RedDogとかいうアメリカのサイトは、個人がどこまでのページ
を見たかという情報を保持していましたが、私には、どうやってやるのか
かいもく見当もつきませんが、1は、非常に難しいのではないでしょうか。
(アドバイスになっていなくてすみません)

田中求之 さんからのコメント
( Wednesday, August 28, 1996 01:41:33 )

いずれも EasyBBS DX のスクリプトにかなり手を入れることになります。

1については、Netscape ユーザーだけを対象にするのであれば、不可能では
ありません。Cookie ヘッダーを使って、ユーザーの Netscape 側に訪れた
日時を記録させておき、このデータを元に書き込みのリストアップ等を行えば
よいからです。ただし、Cookie ヘッダーの処理がちょいと面倒になるとは
思いますが。また、ファイルの最終更新日を元に未読かどうかを判定する部分が
煩雑になります( Cookie ヘッダーは文字列しか記録できませんので)。

2については、Tanaka's osax を使えば、現在の EasyBBS DX のスクリ
プトをちょいと書き換えるだけで実現可能です。ただし、リストアップに
要する時間が長くなるのはしかたないですが。

1については、Cookie ヘッダーという Netscape 特有の機能を使うこと
になりますので、ご自分で調べてください( Netscape のサイトに Cookie
に関する資料はあります)。

2については、いきなり回答を書くのは面白くない(というか、実際にテスト
してない)ので、まずはヒントだけ。

コメントを付けた人に名前は、必ず Bold で表記されてる。また、「さんからの
コメント」という文字列がついている。このように、決まったパターンで書き込ま
れています。ですから、ファイルの中から、コメントを付けた人の名前だけ抜き出
すのは、それほど難しくないのです。

Kazushi Takahashi さんからのコメント
( Wednesday, August 28, 1996 11:09:42 )

ヒントをありがとうございます。 >SBKさん、田中さん
1はそんなに難しいですか...。はぁ...。
Cookieは使わないでいけるかと思っていたのです。

a.会議室の各ページのファイルの最後の行に、コメントタグで括ったmyType変数
(<!-- #960828105020 -->のように)を付け足す。
b.同様にnameタグも各ページの各コメントの頭に入れる。
c.makeListハンドラの中でタイトルのリストを作る際、このコメントタグの中味を
各タイトルのリンクに付け足す。

という方法でいけるかと(夢の中で)考えついたのですが。

#AppleScriptの習得が遅々として進まないのは、参考書が同僚達にキープされて
#しまっているから。...う〜む言い訳だ。

田中求之 さんからのコメント
( Wednesday, August 28, 1996 11:38:44 )

>1はそんなに難しいですか...。はぁ...。

アクセスした人にとっての「未読」を割り出すためには、それぞれの人が前回
いつアクセスしたかを記録しておき、それをもとに判定するしかありませんよね?

ですから、現状では Cookie を使うのが、中でも簡単と言うことです。

もちろん、CGI の側で、アクセス状況を記録しておき、それをもとに割り出す
方法もありますが。

Kazushi Takahashi さんからのコメント
( Wednesday, August 28, 1996 12:56:44 )

> アクセスした人にとっての「未読」を割り出すためには、それぞれの人が前回
> いつアクセスしたかを記録しておき、それをもとに判定するしかありませんよね?

 最初はそう思ったのですが、
 ホットテキスト(っていうのかなリンクを記述した部分)の部分は、一度行ったリンク
はブラウザが色を変えてくれますよね。(もちろんブラウザの設定によりますが)
 これを利用したいということです。

 新しいコメントが付いた時点で、ホットテキストとページ自体のURLを変更すればホッ
トテキストの部分の色が変わるのではないかと。
つまり、このページのURLは
http://mtlab.ecn.fpu.ac.jp/webcon.mtxt$960827191329.html
ですが、
http://mtlab.ecn.fpu.ac.jp/webcon.mtxt$960827191329.html#960828125420
のようにタイトル一覧のホットテキストを書き替えてしまいたい。
という意味です。
 そういうことなので

> もちろん、CGI の側で、アクセス状況を記録しておき、それをもとに割り出す
> 方法もありますが。

 という方法まではやろうとは思いません。

 

SBK さんからのコメント
( Wednesday, August 28, 1996 15:41:44 )

 なるほど、いい方法かもしれませんね。私は、田中さんのBBSシステムを
一部書き換える程度にしか使っていませんし、昨日始めてDX2を改良したば
かりなものですから、浅はかでした。
 Takahashiさんの言われるのは、各会議室で一覧リストを作るときに、
ただファイル名だけで一覧リストを作るのではなく、ファイル名+NAMEタグ
(最後に付けたコメントのNAMEタグ)でリストを作成すれば、そのファイル
を見ていても、その最後のコメントを見ていなければ、見読の色になったま
まになるので、色が変わって見えるのではないかということですね。
 発言を最初から見てしまうと効果がないのですが、最近の発言の一覧リスト
から飛んでくる人が大半ならば、うまくいくのではないでしょうか?
//

Kazushi Takahashi さんからのコメント
( Wednesday, August 28, 1996 16:11:06 )

そうそう、そういうことです。
 自分の投稿したメッセージに、「だれかコメントつけてくれたかな〜」と覗いた場合など、
 大体の自分の投稿時刻は覚えているんですが、投稿直後にコメントが付いた場合は見落
としがちなんですね。

ただ、この方法では必ず最後のコメントにジャンプしてしまいます。だから、タイトルを
クリックするとページの頭に、最終更新日をクリックすると最後のコメントに飛ぶように
ホットテキストを各タイトル2つ持たせようかな、と。

実際にはページの頭に飛ぶほうが使いやすいでしょうけど、最後のコメントに飛ぶほうは
未読コメントの有無を知らせるためのダミーとしてホットテキストにする。

 こんなイメージを描いてます。

田中求之 さんからのコメント
( Wednesday, August 28, 1996 19:23:32 )

なるほど、それで Recent のように、とおっしゃっていたのですね。

EasyBBS DX の場合、各コメントの先頭には、必ずname タグが入っています。ですから
会議室のトップページでページをリストアップする場合に、ページの中の最後の name
タグを抜き出して、リンクの中に埋め込むということは可能ですね。

最後の発言者の名前を抜き出すのと同じ方法で処理できますよ。


田中求之 さんからのコメント
( Wednesday, August 28, 1996 19:57:17 )

とりあえず、会議室のトップのリストアップの際に、そのページの最終発言者の
名前も表示するようにし、その最終発言者には、その発言への name タグ付きの
リンクを張るようにするスクリプトです。

EasyBBS DX b3 の中の makeList ハンドラーを以下のように書き換えます。
( checkLastPeople と checkLastNtag の2つのハンドラーを追加します)。

====
on makeList(myList)
  global msgFldr, myRoom
  
  set myData to {}
  repeat with myF in myList
    set tgF to alias (msgFldr & myF)
    set myTitle to getPageTitle tgF
    
    set tgLastname to checkLastPeople(tgF)
    set tgLastNtag to checkLastNtag(tgF)
    
    if myTitle = "" then set myTitle to myF
    
    set end of myData to "<li><b><a href=\"bbs.acgi?r=" & myRoom & "&" & myF & "\">" & myTitle & "</b></a><br>"
    set end of myData to "<TT>( " & ((modification date of (info for tgF)) as string) & " )</TT><br>"
    set end of myData to "最新の発言者:<a href=\"bbs.acgi?r=" & myRoom & "&" & myF & tgLastNtag & "\">" & tgLastname & "</a><P>"
    
  end repeat
  
  set AppleScript's text item delimiters to return
  set myData to myData as string
  set AppleScript's text item delimiters to {""}
  
  return myData
end makeList

on checkLastPeople(myFile)
  set myList to pickUpFrom myFile startOf "<b>" endOf "</B> さんからのコメント" with Trim
  if myList = {} then
    set myList to pickUpFrom myFile startOf "発言者:" endOf "<br>" with Trim
  end if
  return item -1 of myList
end checkLastPeople

on checkLastNtag(myFile)
  set myList to pickUpFrom myFile startOf "<a name=\"" endOf "\">" with Trim
  if myList = {} then
    return ""
  else
    return "#" & (item -1 of myList)
  end if
  
end checkLastNtag

=====

見栄えのことは考えずに、機能だけ実装したものです。

参考になれば幸いです。

Kazushi Takahashi さんからのコメント
( Thursday, August 29, 1996 00:01:01 )

#週末の楽しみ(スクリプトの改造)のはずが、回答の方が速かった。...う〜む

田中さん、ありがとうございます。
最初、やりたいことがうまく説明できなくて申し訳ありませんでした。
スクリプトの解析は明日させていただきます。(アルコールが抜けてから...というより、
Tanaka's osaxのマニュアルを読みながらでないとわからない)

>見栄えのことは考えずに、機能だけ実装したものです。
もともと見栄えくらいしか改造できないのが哀しい。 でもいつかきっと。



田中求之 さんからのコメント
( Thursday, August 29, 1996 00:58:14 )

肝心なことを言い忘れてました。

スクリプトはオンラインで書いたものですので、実際の動作テストは行っていません。
理論的には問題ないと思いますが、もしかしたらうまくいかないかも (^_^;;

その場合は pickupFrom で切り出している部分の検索文字列の違いが原因だと
思いますので、そのへんをチェックしてください。

>Tanaka's osaxのマニュアルを読みながらでないとわからない

pickUpFrom の機能をチェックしてくださいね。


…最近、自分でもマニュアルを読み返すことがあるワタシ (^_^;;

SBK さんからのコメント
( Thursday, August 29, 1996 20:14:12 )

Takahashiさん
 私も、この方法を使ってみたいので、上のソースのテスト結果の報告
お願いしたいのですが、よろしいでしょうか?(他力本願)

Kazushi Takahashi さんからのコメント
( Friday, August 30, 1996 09:03:18 )

報告が遅くなってすみません。
田中さんに作っていただいたスクリプトはそのままで動きました。 
     ありがとうございます >田中さん
ただ、発言者の名前を切り取るところはうまくいかないことがありました。
当方で独自にカスタマイズしていたところもあったので原因の切り分けには至ってません。

checkLastPeople のルーチンで
  set myList to pickUpFrom myFile startOf "発言者:" endOf "<br>" with Trim
のところを
  set myList to pickUpFrom myFile startOf "<h3>発言者:" endOf "</h3>" with Trim
にしました。

 使い勝手ですが、タイトル1件にホットテキストが2つあるのはあまり良くありません。
 タイトルをクリックしてブラウズする人は、もうひとつのホットテキストである最終発言
者名は色が変わりません。最終発言者をクリックする人はタイトルの色が変わりません。

 それで、やはりタイトルのみをホットテキストにすることにしました。そして、ここのリ
ンク先は「リンク先ページ#(タイムスタンプ)」にしました。途中に未読のコメントが
あっても必ず最終コメントに飛んでしまうのですが、ここは運用でカバーします。

 当方の場合利用者が限られているところもあり、自分の発言に誰かの返事があるかどうかは
すぐにわかるようになり、これでも随分助かります。

 田中さんのスクリプトでは、checkLastPeopleですべての発言者のリストをつくり、その最
後のitemを取り出すことで最終発言者を求めてます。これなら、既にできているファイルを
修正する必要がないですね。
 自分で書こうとしていたスクリプトでは、ファイル側にコメントタグで必要な情報を埋め
込んでしまおうとしてました。勉強になりました。

 ところで、次の質問ですが、
 修正日時を得るのにmodification date of (info for ファイル)を使ってますが、これで得
られる日時形式は長い方の形式になりますよね。これを短い形式にすることはできないでし
ょうか? カスタマイズしたレイアウトに似合わなくって。

田中求之 さんからのコメント
( Friday, August 30, 1996 17:48:42 )

スクリプトが参考になって何よりです。

modification date を短い形式にするのはできなかったと思います。date 型の
データを string に変更すると、長い形式になってしまうようです。

Kazushi Takahashi さんからのコメント
( Friday, August 30, 1996 23:16:26 )

>modification date を短い形式にするのはできなかったと思います。

がっかり。

でも、Date型から何らかの処理をすることで、求める形式に変換できるのでしょうね。
ただ、ただでさえ重くなってきた(カスタマイズのせいか?)CGIがますます遅くなる
のは困りますし。まぁ勉強のためにいろいろ試してみようと思います。

#Tanaka's osax次バージョンに期待するのもいいかしら。