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

ファイルメーカーの検索で24kを超えた場合は?

発言者:大西 恒樹
( Date Sunday, October 27, 1996 02:52:39 )


ファイルメーカーとの連携で、検索結果が24kを超えてしまいます。
これを1回の検索で、そのデータをどこかに溜めておき、何回かに
分けてリターンする方法はありますでしょうか?

前薗 健一 さんからのコメント
( Sunday, October 27, 1996 03:56:58 )

WebSTAR のドキュメントにも書いてありますが、方法はあります。

1.検索結果をファイルに書いて、ファイルの redirect として
WebSTAR に reply する。
2.WebSTAR に対して検索結果を分割した reply を AESend する。

大西 恒樹 さんからのコメント
( Sunday, October 27, 1996 13:00:00 )

>WebSTAR のドキュメントにも書いてありますが、方法はあります。

前園さん、コメントありがとうございます。ドキュメントを探してみましたが、
ちょっと見当たりませんでした。どこにあるんでしょう?

前薗 健一 さんからのコメント
( Sunday, October 27, 1996 13:56:08 )

Developing CGIs.pdf というドキュメントです。

田中求之 さんからのコメント
( Sunday, October 27, 1996 15:04:14 )

24K を越えてしまった場合は、一つはファイルに書き出して、そこへリダイレクト
させるという方法と、もうひとつは Send Partial という WebSTAR の機能を
使って、データを分割して送り出すようにする方法とがあります。

Send Prtial については、このサーバーの Web Scripting Lab の中に
解説したページを作ってありますし、この会議室の List All (全登録メッセージの
タイトル一覧)が、実は Send Partial を使っています(トータルで軽く 24K
を越えますので)。

なんでしたら、この会議室の List All に使っているスクリプトをお見せしましょうか?

ファイルメーカーの場合だと、レコード毎のデータに分割して送り出すということに
なると思います。ただし、分割するために、処理速度は落ちますよ。

大西 恒樹 さんからのコメント
( Sunday, October 27, 1996 22:50:29 )

ありがとうございます。早速Send Partialのページ(気がつきませんでした)
を見て勉強しています。WebSTARのドキュメントも読みました。

ちょっと整理したいんですが、ファイルメーカーによる検索は、PartialServer
の側で行うことになりますよね。すると、検索キーになるpost_argsに収められた
情報はpartial.acgiからPartialServerへconnection_idを照会して渡される、
ということでしょうか?(的外れな質問?)

田中求之 さんからのコメント
( Sunday, October 27, 1996 23:16:42 )

>ちょっと整理したいんですが、ファイルメーカーによる検索は、PartialServer
>の側で行うことになりますよね。すると、検索キーになるpost_argsに収められた
>情報はpartial.acgiからPartialServerへconnection_idを照会して渡される、
>ということでしょうか?(的外れな質問?)

このあたりをどのようにプログラムするかが腕の見せ所ですよ (^_^)

ポイントとしては、Partial Server を呼び出す AppleEvent は自分で定義
するわけですから、パラメーターなども自由に決められるということです。つまり、
CGI から ParialServer に対しては、パラメーターによってなんでもデータを
渡すことができます(パラメーターを定義するのは、少し面倒ですが)。

普通に考えるならば、検索は CGI で行い、検索結果をパラメーターでP_Serverに
渡して表示させるという方法が、一番すっきりとしたスクリプトになると思います。


前薗 健一 さんからのコメント
( Monday, October 28, 1996 01:20:10 )

田中さんのフォローは、実に親切ですね。
それに比べて私のは... (^^;;

大西 恒樹 さんからのコメント
( Monday, October 28, 1996 13:20:39 )

お二人ともご親切にありがとうございます。
ご親切にすがってもう1つ質問させてください。

>CGI から ParialServer に対しては、パラメーターによってなんでもデータを
>渡すことができます

ということは、CGIで返送データを収めた変数(仮にmyDataとしましょう)を、
PartialServerでそのまま有効にする方法があるということですよね。
これはどうやればよいのでしょう?もしよろしければ、List Allのスクリプトを
見せてください。お願いします。

田中求之 さんからのコメント
( Monday, October 28, 1996 17:50:43 )

myData に検索結果のリストが入っているならば、まず CGI 側のスクリプトとしては

--- ここまでの処理で、myData に検索結果が入っている

ignoring application responses
  tell application "PartialServer"
    ヌevent xxxxYYYYネ connection_id given ヌclass dlstネ:myData
  end tell
end ignoring

return "<SEND_PARTIAL>"

----

このスクリプトによって class = dlst のパラメーターとして myData を
渡すことができます。これを受け取る側の Partial Server の方は、

on ヌevent xxxxYYYYネ myID given ヌclass dlstネ:myList

  --- ここに Send Partial の処理を収める

end ヌevent xxxxYYYYネ

というハンドラーを作っておきます。これによって myList の中に myData
のデータが収められます。あとはこの myData を分割して送り出すだけです。

田中求之 さんからのコメント
( Monday, October 28, 1996 17:56:46 )

この会議室の「すべての発言のリストアップ」で使っている PartialServer のスクリプトは
以下の通りです。

property crlf : (ASCII character 13) & (ASCII character 10)

property http_10_header : "HTTP/1.0 200 OK" & crlf & "Server: WebSTAR/1.0 ID/ACGI" & crlf & ツ
  "MIME-Version: 1.0" & crlf & "Content-type: text/html" & crlf & crlf

property conpath : "" --- 会議室メッセージの入ってるフォルダーのパス
property conHead : "" --- 会議室のヘッダーファイルのパス
property conFoot : "" --- 会議室のフッターファイルのパス

--- CGI によってファイルの名前のリストアップが行われ、それが myList に
--- 収められて渡される

on ヌevent xxxxYYYYネ myID given ヌclass dlstネ:myList
  
  --- 1 秒間だけ wait する
  set aDelay to (current date) + 1
  repeat while aDelay > (current date)
  end repeat
  
  --- ここからが処理
  
  try
    
    set myHead to readFromFile file conHead
    set myFoot to readFromFile file conFoot
    set pagenm to countDirItems file conpath
    
    
    tell application "WebSTAR"
      send partial (http_10_header & myHead & crlf ツ
        & "<h3>現在 " & (pagenm as string) & " の発言が登録されています</h3><HR><P>" & crlf ツ
        & "<H3>現在登録されている発言:</H3><OL>" & crlf) connection myID with more
    end tell
    
    
    repeat with myF in myList
      set tgF to (conpath & myF)
      try
        
        set myInfo to loadIndStrRsrc file tgF ID 5000
        
        set cmX to NumToDigitStr ((item 3 of myInfo) as integer) Digit 2
        
        set myData to "<LI><a href=\"webcon.mtxt$" & myF & "\">" & (item 1 of myInfo) & "</a><TT> [" & cmX & "]</TT><BR>" & crlf ツ
          & "<TT>( " & (item 2 of myInfo) & " )</TT><p>" & crlf
        
        tell application "WebSTAR"
          send partial myData connection myID with more
        end tell
        
      on error
        
      end try
      
    end repeat
    
    
    --- Last partial
    tell application "WebSTAR"
      send partial ("</OL><p>" & crlf ツ
        & "<HR><P><h3><UL><LI><a href=\"webcon.mtxt\">Back To Top Page</a><p>" & crlf ツ
        & "<li><a href=\"webConpost.html\">新規発言をポストする</a></UL></H3>") connection myID without more
    end tell
    
  on error
    tell application "WebSTAR"
      send partial "" connection myID without more
    end tell
  end try
  
end ヌevent xxxxYYYYネ

田中求之 さんからのコメント
( Monday, October 28, 1996 17:59:20 )

Send Partial には直接関係はありませんが、上のスクリプトでは、ファイルの情報
(タイトル、コメント数、最終更新日など)は、ファイルの情報記録用のリソースを
読み込んで得るようになっています(EasyBBS は、直接ファイルから情報を得ていま
すが、この会議室では、速度を上げるためにリソースを利用した方法に変更してあります)

大西 恒樹 さんからのコメント
( Monday, October 28, 1996 20:36:47 )

田中先生、ありがとうございました。
こんなわかりやすい説明はどこ探してもありません。
ひたすら、感謝、です。

大西 恒樹 さんからのコメント
( Tuesday, October 29, 1996 02:29:37 )

これで大丈夫、と思いきや、タイムアウト連発です。
class dlstにリストのアイテム数などの簡単なものを収めて渡してやると、
それほど時間をかけずにsend partialしてくるのに、リストそのものを
渡すと480秒でもタイムアウトします。

セルが約60×40レコード分のリストですが、単純に多すぎるのか、それとも
他に原因があるのか、どちらなんでしょう?何かポカやってる気もするんですが。

大西 恒樹 さんからのコメント
( Tuesday, October 29, 1996 12:31:38 )

その後、レコード数を変えながら試して見ましたが、15レコード分ぐらいまでは
問題なく1分以内で返してくれますが、20レコードになると途端にうんとも
すんとも言わなくなり、タイムアウトします。ちゃんと返って来たときは、
意図通りのページになっているので、スクリプト自体は問題ないとは思うんですが。

田中求之 さんからのコメント
( Tuesday, October 29, 1996 16:12:21 )

PartialServer の方に充分なメモリーを割り当ててありますか?

あとはリストの処理をどのようにおこなっているのか、という点が問題になって
きますが。

大西 恒樹 さんからのコメント
( Tuesday, October 29, 1996 17:14:32 )

おっしゃる通り、作りっ放しで、メモリーの割り当てを増やしていませんでした。
少し多めに割り当ててやると、ちゃんと動きました。本当にいつも的確な
ご指摘ありがとうございます。これでいろいろ意地悪なテストをして、問題が
なければ完成です。ありがとうございました。

田中求之 さんからのコメント
( Tuesday, October 29, 1996 18:47:58 )

アプリケーション(アプレット)のデフォルトの 200K では、ちょっと大きめの
データを渡すと、すぐにメモリーが足りなくてエラーになりますね。

普通のスクリプトであれば、メモリーが足りないなどの問題は、すぐにエラーメッセージで
分かるのですが、Partial Server の場合は、 ignoring application responses
で呼び出しますので、エラーが確認できません。ですから、大がかりなことをやると
デバッグが大変だったりします。

で、こういうときには、CONNECTION_ID が 0 以下の時にはデバッグモードに入る
というようにしておいて、WebSTAR へ send する代わりに、ファイルにデータを
書き出すようにしておくと、デバッグが楽に行えます。(サーバー運用時に CONNECTION
ID が 0 以下になることはありません)

もちろん、デバッグ時には、スクリプトエディタなどから普通に呼び出してテスト
します。

今後の開発の参考にしてください。

大西 恒樹 さんからのコメント
( Tuesday, October 29, 1996 20:46:53 )

ありがとうございます。勉強になります。