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

AppleScriptのバグ??

発言者:なんとか中級者です
( Date Thursday, May 01, 1997 03:15:09 )


一つ質問なのですが下のCGIスクリプトを見てください
このCGIスクリプトはアイドル時間に何かをやるスクリプトなのですが
アイドル時間に何かエラーが発生すると通常ならばエラートラップされるはずなのですが
エラートラップされずシステムエラーなどで必ずハングアップしてしまいます
不思議な事に先にこのCGIをダブルクリックして起動しておくとシステムエラーなどは起きず正常に処理されます
これはAppleScriptのバグなんでしょうか?、もしバグなら先に起動しておいてエラーが
正しく処理されるのならば、先に起動しておいてやるとなれば何か問題はあるでしょうか?

---------------------------------------------------------------------------------------------------
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

on idle
  set myData to Myevn()
  return 10
end idle

on ヌevent WWWスsdocネ path_args given ヌclass kforネ:http_search_args
  
  try

    return http_10_header & "OK" & crlf
    
  on error errMsg number errNb
    
    return http_10_header & crlf & "ERROR!!" & errMsg
    
  end try
  
end ヌevent WWWスsdocネ


on Myevn()
  
  try
    set myList to "ABC"
    ---わざとエラーを発生させる
    set a to (item 100 of myList)
    
  on error
    beep
  end try
  
  return {}
  
end Myevn
----------------------------------------------------------------------------------------

ぶしつけな質問とは思いますが宜しくお願いします。

hODA さんからのコメント
( Thursday, May 01, 1997 08:43:04 )

不思議な問題です。
idle に原因があるのは明らかなのですが。

idle はイベントクラスが ascr ではなく misc なので、AppleScript に
管轄があるのではなくて、個々のアップレットイベントループの中で時間を調べて
スクリプトに送っているのではないでしょうか?

証拠1
 FaceSpan のアップレットには ヌevent miscidleネ が送られない。
証拠2
 OSA コンポーネントを UserTalk に選択して

 on idle( ) {
   dialog.notify( "Hello from idle" ) ; }

 というスクリプトを持つアップレットを作るとちゃんと動く。

そうすると原因の一端はアップレットのスクリプト実行アリゴリズムの方にあるかも
知れません。

起動前のアップレットのハンドラーをいきなり外から呼び出すと、

run handler -> idle handler -> 目的の handler 

の順で呼び出されるようです。これも AppleScript 本体の仕様ではなくて
アップレットの実行アリゴリズムで決まるようです。
実は前に Speech Recognition Manager を使った変種のアップレットを
作ったことがあるのですが、これにはスクリプトに idle が送られるように
自分で実装しました。なるべく似せて作ったのですがこのアップレットは
上のような場合、

run handler -> 目的の handler -> idle handler

の順で呼び出します。幸か不幸か上の CGI スクリプトも問題なく動きます。
ハンドラーの呼び出し順に原因があるかどうかは分かりませんが、
とりあえず呼び出し順がそうなので、これを利用して

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

global firstAccess
set firstAccess to true

on idle
   if not firstAccess then
      set myData to Myevn()
   else
      set firstAccess to false
   end if
   return 10
end idle

(以下略)

とすればハングアップは避けられるかと思います。
根本的な原因は分かりませんが。

→  変種のアップレット

狩野正嗣 さんからのコメント
( Thursday, May 01, 1997 13:51:24 )

 アプレットをWWWサーバアプリケーションやNetscape
Navigatorから起動した場合、スクリプトの実行に問題が
起こることが多いようです。こういう時も、あらかじめア
プレットを起動しておくことでエラーを回避することがで
きます。

 不思議なのは、アプレットをWWWサーバから起動した
場合などに、アプレットからディレクトリの相対パスが認
識できなくなったり、特定のサブルーチンがインストール
されなくなったりすることですね。なにか根本的な問題が
あるように思います。個人的な見解では、一般のソフトウ
ェアからアプレットを呼び出すとき、AppleScriptのスク
リプティングコンポーネントがうまくインストールされな
いのではないか、という印象ですが… やっぱりよく分か
りません (^ ^;)

 ちなみに他のアプレットなどからアプレットを呼び出し
たときには、なんの問題もなく動作することを確認してい
ます。


田中求之 さんからのコメント
( Thursday, May 01, 1997 16:25:09 )

>アイドル時間に何かエラーが発生すると通常ならばエラートラップされるはずなのですが
>エラートラップされずシステムエラーなどで必ずハングアップしてしまいます

私のところでは、なんの問題もなく立ち上がりますし、CGI として OK を返し
ますけど?? もちろん、定期的に beep も鳴ります。

(PM8100/AV + MacOS 7.6J)

システムのバージョンの違いもあるのかな?

なんとか中級物です さんからのコメント
( Friday, May 02, 1997 03:05:08 )

>(PM8100/AV + MacOS 7.6J)
>システムのバージョンの違いもあるのかな?

うちのマックはPM8500/150でMacOS 7.6.1です
ObjectSupportLibとかなんか関係あるのでしょうか?

なんとか中級物です さんからのコメント
( Saturday, May 03, 1997 04:55:30 )

また興味深い現象を発見したので報告します
まず、下のCGIスクリプトを見てください

----------------------------------------------------------------------------------------
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 ax : "0"


on ヌevent WWWスsdocネ path_args given ヌclass kforネ:http_search_args
  
  try
    ---myPage は宣言していないのでエラーになる
    return http_10_header & myPage
    
  on error errMsg number errNb
    
    return http_10_header & crlf & "ERROR!!" & errMsg
    
  end try
  
end ヌevent WWWスsdocネ
----------------------------------------------------------------------------------------

クライアントのブラウザーから実行するとかならずエラーになるCGIなのですが
通常に実行するにはなんら問題ないのですが、エラーの処理がかさなった場合(連続してブラウザーから実行)に
かならずシステムエラーやフリーズといった具合にみごと100%固まってしまいます
私のマシーンは8500/150 の MacOS 7.6.1 なので 別ドライブのSYSTEM 7.5.3 R2 でも同様の結果になります

もしかしてエラートラップ中のエラートラップの様な事になっているのでしょうか?
アップルスクリプトはマルチスレッドでは動作しないと思うので確実に1つ1つの処理を繰り返しているとおもうのですが
みなさんのご意見を聞かせてください。

田中求之 さんからのコメント
( Saturday, May 03, 1997 09:25:07 )

> アップルスクリプトはマルチスレッドでは動作しないと思うので確実に1つ1つの処理
> を繰り返しているとおもうのですが

スクリプトの実験は行っていませんが、連続して呼び出した場合の動作について、コメント
しておきます。

たとえば上の CGI のハンドラーの実行中に、さらに呼び出しがかかった場合、先に
実行されていた処理が一時中断されて、後から呼び出しがかかった処理の方が行われる
ようになっています。つまり、連続して呼び出しを行った場合 First-in Last-out
の順番で処理が行われます。

これは、ハンドラーの re-entrancy を保証するための AppleScript の仕様で、
ハンドラーの再帰呼び出しを可能にするためにこうなっているのです。

これについては、以前、実験した結果を報告したページがありますのでごらんください。

エラーの場合は、この仕組みがどこかで破綻するのかな?

システムエラーの場合、エラーの ID はなにですか?

→  AppleScript のアプレットの処理の順番

なんとか中級物です さんからのコメント
( Saturday, May 03, 1997 19:32:33 )

>システムエラーの場合、エラーの ID はなにですか?

エラータイプ10です


なんとか中級物です さんからのコメント
( Saturday, May 03, 1997 22:53:00 )

軽く何回かエラーを発生させた場合にはアプレットは
常駐せずに終了してしまいます
サーバーからの要求によって起動して結果を.返すのですが
同じく常駐せずに終了してしまいます
そうしているうちにフリーズといった現象も確認されています

かずや さんからのコメント
( Sunday, May 04, 1997 23:50:15 )

初めて書き込みをさせていただきます
似たような話題なのでここに書き込ませていただきます
自社でサーバーを立ち上げて運営しているのですが
スクリプトがたまにtype2のエラーで以上終了してしまうことがあります
端末からの要求でまたそのスクリプトは起動するのですが何回か繰り返しているうちにフリーズといった具合です...
なにか私の作ったスクリプトになにかバグでもあるのでしょうか?
それとtype2のエラーとは何でしょうか?、先輩方なにとぞお願いします。

田中求之 さんからのコメント
( Monday, May 05, 1997 01:05:43 )

type 2 のエラーというのは、Address Error と呼ばれるものです。
これが AppleScript で起こるということは、たいていは osax の
バグか、あるいは INIT などのコンフリクトが原因ですね。

どのような処理を行っている CGI なのですか?


かずや さんからのコメント
( Monday, May 05, 1997 21:17:24 )

さっそくの回答ありがとうございます

>どのような処理を行っている CGI なのですか?

えっと、社内でのチャットや伝言板、画像のデータベースの検索など
いろいろやっております。
今は使用していないのですがあのよく固まるTCP/IP Scripting Add PPCをいれているのですが
関係あるのでしょうか?

田中求之 さんからのコメント
( Monday, May 05, 1997 23:47:53 )

osax は、使用していないのであれば、問題は起こさないはずです。

AppleScript のエラーに関しては、私も「なぜだ?」と思うようなエラーが出る
ことがあります。どの部分がエラーの原因になっているのかが判明すれば対処の
方法もありますが、システムエラーで異常終了する場合というのは、たいてい、
原因が特定できないことが多いですね。CGI に割り当ててあるメモリーが少なく、
また、処理がかなり重なった場合などにエラーが出やすい、ぐらいのことしか
わかっていません。ただし、これも、あくまで私の CGI の場合の話ですが (^_^;;