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

WEB共有用のカウンターCGI

発言者:重松修
( Date Friday, December 19, 1997 19:46:15 )


WEB共有用にカウンターCGIを作りました。
よろしければ、お試しください。

→  THE TAO OF FUTUREBASIC

重松修 さんからのコメント
( Monday, December 22, 1997 14:07:37 )

WEB共有用の第2段として、会議室ソフトを開発しました。バージョンは2.1です。
WebConferencing Ver 2.0以前からはファイル形式がかわっていますが、
コンバーターでコンバートする事ができます。

ただし、ユーザー定義アクションを使わない仕様にしましたので、会議室への
アクセス方法は変更になります。

興味がある人はお試しください。

→  THE TAO OF FUTUREBASIC 会議室

木下@キー・プランニング さんからのコメント
( Thursday, December 25, 1997 17:13:59 )

WEB共有用のlog作成CGIなんてものは、あるのでしょうか?
もしあったら、教えて下さい。
(WEB共有は結構面白いと思うのですが、logが取れないのが残念です)

重松修 さんからのコメント
( Thursday, December 25, 1997 18:51:14 )

残念ながら私はWeb共有の詳しい仕様について全く知りません。
以前Appleに問い合わせたら、Appleも資料がなくて全く分からないと言う事
でした。

counter.acgiはいまはまだ開発途上版なので、単にカウントをするだけですが、
そのあたりの事情を考慮してアクセス報告機能を作っています。

それと気になっている事なんですけど、こういうグラフィックカウンタなどで
GIFを生成した場合やはりUNISYSだったかどこかに、ライセンス料を支払う
必要が発生するのでしょうか?

一応、君子危うきに近寄らずって事で、今はJPEGに変換しているのですが。。。

重松修 さんからのコメント
( Friday, February 27, 1998 00:14:54 )

ここのところ3ヶ月くらいテストして特に不具合がないので、正式版として
リリースしました。あくまでも私の環境で動いているので、他の環境は分か
りません。

フリーソフトです。

このバージョンではログ取り機能は実装していません。もう少し、お待ちを。

重松修 さんからのコメント
( Saturday, April 04, 1998 01:27:05 )

counter.acgiですが、いくつかのマイナーバグを修正いたしました。

メモリが大変に少ない状態でもしかしたらイメージにゴミが混ざるかもしれ
ない不具合を修正してあります。

機能には特に変更はありません。

現在の最新版は1.1リリース3です。

永田豊 さんからのコメント
( Wednesday, April 08, 1998 09:19:46 )

私もこの記事を拝見して、早速 counter.acgi を落としてみました。
初歩的な質問で恐縮ですが、これが動作するのに必要な
「JPEG 圧縮をサポートする QuickTime」とはどのバージョンでしょうか?
無償でダウンロードできる QuickTime 3.0 では動くといいのですか。

重松修 さんからのコメント
( Wednesday, April 08, 1998 12:54:01 )

ダウンロードいただき、ありがとうございます。

QuickTimeは多分1.6(1)以降だったと思いますが、最近のものは2.5日本語
版、3.0英語版で動作確認を行っています。

ただし、JPEGの圧縮はちょっと時間がかかりますので、あまりに古いマシン、
例えば、68030などをサーバにすると、やっぱりきついかもしれません。
ちなみに、www.ravi.ne.jpはCentris650(68040/25Mhz)です。

永田豊 さんからのコメント
( Thursday, April 09, 1998 08:57:47 )

コメントありがとうございます。
QuickTime 3.0 Pro の説明に、JPEG うんぬんと書いてありましたので、
これを有償で入手しないとダメなのかと思っていました。助かりました。

猫の手 さんからのコメント
( Thursday, April 09, 1998 09:35:33 )

 counter.acgiは、うちの475でも軽快に動作を始めています。
入れたとたんに、アクセス数が気になるものですね。

 ところで、futureBasicでのcgiの作成は、割合に簡単なんでしょうか。
それと、アップルスクリプトのアプリケーションと比較して、
同じ動作をさせるとしたらやっぱりfbの方が高速なんでしょうか。

 それと、例えば、osaxを作ったりもできるのですか?
質問ばっかりですが。

重松修 さんからのコメント
( Tuesday, April 14, 1998 16:32:40 )

FutureBasicでのCGI作成ですが、私は簡単だと思います。
しかし、やはりある程度のものを作るとなると、ハンドルやポインタなどというある程度のマックのプログラムの
知識は必要になります。もし、それらが大丈夫であれば、AppleScriptよりも圧倒的に高速に動作するCGIを作成
できると思います。特にインラインアセンブラでの記述も可能ですから、これ以上早くなりません!と言うレベル
のものが作れると思います。これは、TOOLBOXの追加なども自在にできることを意味します。
OSAX作りですが、多分できると思います。基本的にINITやPhotoshopプラグインも作れますので。あと、XCMDとかも
作れます。BASICですけど、色々できるんですよ。
ただ、残念ながら私は作り方を知りません。今度メーリングリストで確認してみますね。
私は使い捨てはAppleScript、ある程度使うものは、FutureBasicで作成しています。
CGIのサンプルプログラムは私のホームページにソースをアップロードしてあります。一応見てみてください。

→  THE TAO OF FUTUREBASIC

田中求之 さんからのコメント
( Tuesday, April 14, 1998 17:02:26 )

コードリソースが作れる環境であれば、osax は作れます。XCMD が作れるのであれば
問題ないはずです。ただし、内部でのデータの処理に関して、AppleEvent の知識が
必要になりますので、Inside Macintosh は必要になりますね。


猫の手 さんからのコメント
( Friday, April 17, 1998 12:31:19 )

 そうかぁ、やっぱり泥沼、失礼、深みにはまって行くわけですね。
osaxは、あきらめて、cgiの方には挑戦してみるかなぁ。
それとも、アップルスクリプトのcgiからデータ渡して、
処理だけ結果を返してもらうようにするのがいいかな。

重松修 さんからのコメント
( Friday, April 17, 1998 17:18:38 )

まあ、メモリ管理を自らやることを泥沼ととるか、それによりもたらされる
メリットと天秤に掛けることになると思いますが、FutureBasicの問題点は
パスカル文字列しか、BASICレベルでは使えないんですね。

簡単なものならば、当然間に合いますが、ちょっと凝ったもの、
例えばこういう会議室CGIなどは本文が255文字に収まることはあり得ないし、
URLエンコードされますから、なおさらです。

田中先生のEasyBBS程の機能はありませんが、wconfというFutureBasicで
書いたCGI会議室も動いています。

http://www.ravi.ne.jp/cgi-bin/wconf.acgi$list,FBII
http://www.ravi.ne.jp/cgi-bin/wconf.acgi$list,guppy
http://www.ravi.ne.jp/cgi-bin/wconf.acgi$list,usagicParkSquare

どれも、おなじCGIですが、テンプレートで見た目をかなりカスタマイズで
きます。もちろん、以前のメッセージにも適応されますから、ホームページ
を更新してデザインが変わったら、会議室も簡単に模様替えできるってこと
です。

FB用のCGI雛形はすでに私が書いてますから、FBを修得していれば、かなり
短期でCGIが開発可能と思います。速度的には、10倍〜100倍は速いと思い
ます。

私の所は、今全部FutureBasicで書いたものに置き換わってます。

田中求之 さんからのコメント
( Friday, April 17, 1998 17:42:58 )

>パスカル文字列しか、BASICレベルでは使えないんですね。

HyperTalk でも osax 開発の場合は同じようなもんですよ。下手に文字列を
いじるスクリプトをかくと、HyperCard の Callback を呼ぶ(文字列比較の
Callback)可能性がありますので(osax では当然のことながら HC のコール
バックは使えない)、文字列の操作は、すべて ASCII コードを見ながら処理
するという方法をとってます。たとえば return を探すなら、13 (十進法)
になっているバイトをサーチする、という感じですね。

文字列はハンドルかポインターで持ちますもので、そいつを先頭から順番に
1バイトごとにコードを見ていって、文字列を探すと行ったことはいろいろな
とこでやってます。下手に凝るより、力任せに順番に見ていった方が早いん
ですもん (^_^;;

重松修 さんからのコメント
( Saturday, April 18, 1998 16:00:30 )

FBでOSAXですが、まだ誰もやってないようです。
ところで、田中先生は、caseを無視して検索するにはどうされていますか?
たとえば、iso-2022-jpはISO-2022-JPでもいいわけですし、Iso-2022Jpと
書いてあるかもしれないと言えば、書いてあるかもしれないわけで、
私は、これまた最初の1文字を拾ってケースを変換して、検索の最初の1文字
と一致した場合に検証する長さを読み込んで大文字に変換して、比較
しています。Mungerはケースを無視しないでサーチするので。

田中求之 さんからのコメント
( Saturday, April 18, 1998 20:00:34 )

function EqualCase tgA, tgB
  if myCaseFlg then
    return (tgA = tgB)
  else
    if tgA <= 65 and tgA <= 90 then put tgA+32 into tgA
    if tgB <= 65 and tgB <= 90 then put tgB+32 into tgB
    return (tgA = tgB)
  end if
end EqualCase

というような関数を使って文字単位での一致を調べるようにしてます。
(tgA, tgB は ASCII コード、myCaseFlg は case sensitive で調べるか
どうかを指示する boolean のフラグ)

文字列の場合は、重松さん同様に、先頭の一文字が一致したら、その後の部分を
以下のような関数に通して一致するかどうかを見てます。

function MatchHandle tgHandle,keyHandle,xOff
  
  -- tgHandle のオフセット xOFF 以降が keyHandle と一致するか
  -- どうかを判定する

  put GetHandleSize(tgHandle) into strLen
  put GetHandleSize(keyHandle) into keyLen
  
  if strLen-xOff < keyLen then return false
  
  put keyLen-1 into scanLen
  put true into matchFlg
  repeat with y = 1 to scanLen
    -- offset 0 は一致していることは確定済みなので offset 1 よりチェック
    put CharToNum(tgHandle@@.charType[y+xOff]) into tgA
    put CharToNum(keyHandle@@.charType[y]) into tgB
    if EqualCase(tgA, tgB) then next repeat
    
    return false
  end repeat
  
  return matchFlg
  
end MatchHandle

田中求之 さんからのコメント
( Saturday, April 18, 1998 20:08:02 )

あ、写し間違い (^_^;;

>    if tgA <= 65 and tgA <= 90 then put tgA+32 into tgA
>    if tgB <= 65 and tgB <= 90 then put tgB+32 into tgB

ここは、

    if tgA >= 65 and tgA <= 90 then put tgA+32 into tgA
    if tgB >= 65 and tgB <= 90 then put tgB+32 into tgB
           ↑
です

重松修 さんからのコメント
( Sunday, April 19, 1998 01:36:34 )

ちょっと気付かなかったのは、
offset 0 は一致していることは確定済みなので offset 1 よりチェック
の部分ですね。
私はいちいちoffset 0 から再度チェックしてました。(^^;;

FutureBASICでは、UCASE$というパスカル文字列を大文字に変換する
命令がありますので、

BLOCKMOVE [hndl&]+offset&,@t$+1,LEN(s$)
IF s$=UCASE$(t$) THEN found& = offset& : offset& = size&-1

としていたのですが。(^^:;

本来は、マルチバイト文字の兼ね合いもありますから、相当難しい気がし
ます。こういうのは、飯森さんがすごいソリューションをしってらっしゃる
ような気もします。

和友 さんからのコメント
( Wednesday, April 22, 1998 03:24:03 )

counter.acgi_1.1r3 をさっきまで試用してたのですが、すぐハングしました。
仮想メモリを使ってたのですが、OFFにする事で安定しました。
ただ64Mではメモリが足りず、仮想メモリが必須なので現在使用することをあきらめてます。
ちなみにOSはJ1-8.1です。

すみません、なんかただのグチになっちゃいました。
ではでは




重松修 さんからのコメント
( Wednesday, April 22, 1998 12:31:06 )

和友さん、不具合でご迷惑をおかけしました。

メモリ的に苦しいマシンでのチェックを行ってないので、もしかしたら、
メモリ関連に不完全な部分があるのかもしれません。

ところで、CPUは68030か603(e)ではありませんでしょうか?これも、私が
確認していないCPUなので。。。68020以前の石では奇数アドレスのアクセス
するので絶対に動かないはずですが、もしよろしければ、
shige@ravi.ne.jpかa1297991@cc.aoyama.ac.jpに詳しい環境をメールして
頂けませんでしょうか?よろしくお願いします。

猫の手 さんからのコメント
( Thursday, April 23, 1998 12:56:44 )

 counter.acgiは、一度quitすると、カウンタはリセットされてしまうのですか?

重松修 さんからのコメント
( Thursday, April 23, 1998 13:15:52 )

正常に終了すれば、カウンターの内容は保持されます。

もし、よくクラッシュするなどの問題があれば、その都度かきこむようにしても良いかなとは思いますが、
終了する際に書き戻すようにしています。あるいは、1分おきとか。

思ったよりも沢山の方に使って頂いているようなので、もうちょっと使い勝手の良いものに、バージョンアップ
しようと思います。何かリクエストがあれば、言って頂ければ対処できる範囲で対処します。ただし、
ちょっと学校が忙しいので、5月にならないとリリースできないと思います。

もし、バグかな、と思う症状がありましたら、なるべく詳しく教えて下さい。私の環境では問題なく動いているので
すが、すべてのマシンでチェックしているわけではないので、思わぬバグが潜んでいる可能性はありますので。

武藤くん@リクエスト さんからのコメント
( Thursday, April 23, 1998 13:27:20 )

いまテスト中なんですけど、
CGIにも張り付けることができるので、
メインのカウンターにしようかなと思っているところです。

リクエスト

1)カウントの数字を簡単に変更できればうれしい(^^
2)URLでカウンターを指定すると、他のプロバイダーからも
  カウンターが使えるので、制限できればうれしい(^^
3)画像ファイルをフォルダで指定できればうれしい(^^

m(__)m 贅沢でしょうか?

和友@職場 さんからのコメント
( Thursday, April 23, 1998 15:18:27 )

和友です。
そのとおりPerfoma 6260(PPC603e 100Mhz)なのです。(^^;
今は会社からなので自宅に戻ってから環境を確認します。

あと、私もリクエストがありまして...
アプリのリソースに情報を保存してるみたいですが、
できれば任意のテキストファイルなんかに保存して欲しいなーと思ってます。
理由はアプリのリソースが変更されるってのがなんとなく怖くて、
テキストファイルに保存してあると弄りやすいからです。(^^)

回答ありがとうございます。
ではでは

重松修 さんからのコメント
( Thursday, April 23, 1998 18:12:47 )

カウンタを外部ファイルにしていないのは、特に理由がありませんので、
外部のテキストファイルに次から変更しますね。
テキストですから、カウントを変更したければ、エディタで開いて書き換え
るだけでそういう意味でのメンテナンスも楽になると思います。

しかし、他のプロバイダから使えないようにするというのは、勝手に使われ
内容にという意味ですよね。なかには、複数にミラーしている場合がある
ので、闇雲に拒否するのではなく、空のテキストファイルをカウンタの
フォルダに入れることによりカウントを開始する仕様に変更しようと
思います。そうすれば、第三者が勝手にカウンタを作れませんので。

あるいは、counter.acgiにログインして、WWWベースで管理する方が良い
でしょうか?

次はちゃんとログも取るようにしようと思います。

武藤くん さんからのコメント
( Thursday, April 23, 1998 20:33:03 )

ありがたきしあわせ。m(__)m
会議室とかのCGIにカウンタを付けられたらいいなぁと思ってたんで、
こ、これはすごいカウンタだと、、、、
easyBBSにもカウンタが付けられたんで感動しました。

(余談):いま一番安定しているソフトがeasyBBSなんです。
 WebSTARがコケてもeasyBBSはコケない。
 perlのCGIがコケてもeasyBBSはコケない。
 それにコケないカウンタがあれば、ニッコリです。

>他のプロバイダから使えないようにするというのは、勝手に使われ
>内容にという意味ですよね。

そうなんです。ケチというわけではないのですが、
メモリやらサーバーの負担を考えると、
少しでも付加を軽くしたいなぁと、、、、、(^^;

重松修 さんからのコメント
( Friday, April 24, 1998 17:04:04 )

counter.acgi 1.2b1 を登録しました。

このソフトから、counter.acgiと同じ階層に「CounterData」というフォルダ
をcounter.acgiを起動すると作ります。その中に、SimpleTextなどで例えば、
最初からカウントしたければ、「0」とだけ書いたテキストファイルに
アルファベットで書いて放り込めばそれを読みとります。ファイル名は
アルファベット(A-Z)以外使わないで下さい。

その他の使い方は今までと同じです。

オフスクリーン描画の時にまず99.99%発生することは考えられないメモリ
不足エラー発生時にハンドルを一つ破棄し忘れるバグを修正しました。
一応、24bitアドレスに対応する為もルーチンも組み込みましたが、
32bitアドレスモード以外での動作は保証しません。

これはあくまでβ版です。バグがある可能性が大きいことを、あらかじめ
ご了承下さい。

# ログを取る機能のあるものは別パッケージにするつもりです。

猫の手 さんからのコメント
( Friday, April 24, 1998 19:43:51 )

 なんだか、希望が噴出して、たくさんオプションを付けることになってし
まって、申しわけありません。

 システムがクラッシュしたから、カウンターがリセットしてしまったんです
ね。新しいバージョンで試してみます。アクセスカウンタって、単純だけど、
ページを書いている人間には励みになりますね。

 たった今、UNIXシステムが、クラッシュしてしまいました。サポート業者は
捕まらないし、月曜まで死んだままです。疲れました。

武藤くん さんからのコメント
( Saturday, April 25, 1998 19:05:20 )

counter.acgi 1.2b1 をさっそく使ってみました。

新しいカウントファイルをCounterDataフォルダに入れると

ディスクエラー(ファイル番号)1
-39

とダイアログが出て止まってしまいます。
続行を押すとそのまま使えるようです。
中止を押すと終了しますが、再度アプリを立ちあげても
同じくディスクエラーがでます。
一応、2台のサーバーで試してみました。

使い勝手はとっても良いです。
会議室にカウンタをつけたら、利用者に喜ばれました(^^;

武藤くん さんからのコメント
( Saturday, April 25, 1998 19:14:56 )

リソースいじくるアプリってなんでしたっけ?
むかーし、ちょこっといじくったことがあるのですが、
忘れてしまいました。
できれば、入手先も教えていただけないでしょうか。

お願いしますm(__)m

田中求之 さんからのコメント
( Saturday, April 25, 1998 19:24:44 )

ResEdit ですね

Apple のサイトにあると思います

武藤くん さんからのコメント
( Saturday, April 25, 1998 19:26:53 )

ありがとうございます。
さっそく、宝探しにいってきます(^^:

重松修 さんからのコメント
( Saturday, April 25, 1998 22:57:32 )

書き忘れましたが、ケースを無視するために引数を大文字に変換します。
よって、ファイル名は必ず「大文字アルファベット+数字」で構成してくだ
さい。

引数の方は、別に大文字、小文字、無視しますので関係ないです。それでも、
エラーがでれば教えて下さい。

ちょっと滅多に使わないFutureBASICのステートメントを使ったので、
ディスクエラーの対策が完璧にまだできていません。ディスクエラーが
でたら、無視して続行して、メニューから終了を選んで下さい。
そうしないと、メモリ不足エラーに備えたハンドルの破棄をしませんから、
メモリにゴミがたまります。

武藤くん さんからのコメント
( Sunday, April 26, 1998 15:29:44 )

タグの記入を大文字に、カウントファイルを大文字にしても
同じディスクエラーがでました。

重松修 さんからのコメント
( Sunday, April 26, 1998 16:09:55 )

あれれ、私の所では、うまく動くんですが。。。(T_T)

ところで、ディスクエラーを無視して続行した場合、テキストファイルの
カウントは増えていますか?それとも増えていませんでしょうか?

また、テキストを編集したアプリや他のアプリで該当ファイルを開いて
いないことも確認してみて下さい。m(__)m

武藤くん さんからのコメント
( Sunday, April 26, 1998 18:49:00 )

続行するとカウントは増えていきます。
ファイルは開いていません。

ただ、一度続行したファイルは、正常にカウントします。
新規に作ったファイルだけがディスクエラーをおこします、


田中求之 さんからのコメント
( Sunday, April 26, 1998 21:33:59 )

>ディスクエラー(ファイル番号)1
>-39

これって、EOF 検出ですから、ファイルサイズより大きなデータを読み込もうとした
時に出るものですよね(読み込みは正常に行われて、読み込んだサイズが Bufferの
サイズに返される)。

ファイル読み込みの際に EOF のチェック(ファイルサイズのチェック)をどこかで
忘れている(空のファイルなのに無理やり何バイトかを読み込もうとしている)と
いったミスはありませんか?



重松修 さんからのコメント
( Monday, April 27, 1998 21:54:11 )

えーっと多分ですが、ただ単に0とだけ書いたのでは?

0<CR>

とすると、新規のでもうまく動くと思います。(^^;;
一応大文字小文字は関係ないと思いますが、念のためにファイル名は大文字
にして置いて下さい。

重松修 さんからのコメント
( Monday, April 27, 1998 22:23:01 )

ただいま、<CR>を忘れてもディスクエラーにならないようにエラー対策を
強化したβ2をアップロードしましたので、お試し下さい。m(__)m

また、この版から、DEFAULTが存在しなかった場合 *DEFALUTだけ* 自動生成
します。それ以外は、初期値を書いたテキストファイルを入れない限り
勝手にカウントされません。すべて、0を返して、カウンタとして機能
しません。

不具合がありましたら、どんどんいっていただければ、できる限り対処しま
すので、よろしくお願いします。

和友 さんからのコメント
( Tuesday, April 28, 1998 00:00:09 )

やっちゃいました(^^; <すべて、0を返して、カウンタとして機能しません。
そうか...(笑)

また落ちてしまったので、何度か実験してみます。
ICQが悪いのかな? あとはNetscapeぐらいですし。

失礼しました。ではでは

和友@職場 さんからのコメント
( Tuesday, April 28, 1998 10:16:40 )

和友です。
えーと、結論から言いますと安定して動作しました。
(使っているのはβ2です。)

私の場合、DEFALUTではなくCOUNTと指定してたのですが、
所定のフォルダに同名称のファイルを置いてませんでした。
これが今回のフリーズの原因だと思われます。
早速ファイルを作って確認すると共有を切るまでの3時間安定動作しました。

# READ MEファイルを読んでない証拠ですね。すみません。m(_ _)m

重松修さん、ありがとうございます。

ではでは

武藤くん さんからのコメント
( Tuesday, April 28, 1998 13:06:10 )

>えーっと多分ですが、ただ単に0とだけ書いたのでは?
>0<CR>

そのとおりでした(^^;