2015-09-04T16:13:15+09:00
AppleScirpt: 私の run ハンドラ
twitter でちょっと話題になったので、僕の run ハンドラのテンプレートを詳しく解説するぜ。
ポイントは、二つ。
このように書くことによって、二つのご利益がある。一番目のご利益は、main ハンドラ以下で発生したエラーを確実に知ることができること。アプリケーションによっては、スクリプトの実行中に置きたエラーを全く教えてくれなかったりする。例えば、スクリプトメニュー。スクリプトメニューから実行したスクリプトでエラーが発生しても、な〜んも起きない。異常終了したら、警告を出してくれてる優しさがあってもいいともうのだけど、所詮頼れるのは自分だけという弱肉強食の掟を体得させる愛でしょうか?
仕方が無いから、常に自前で処理することにしている。ちなみに、error number -128 の場合はダイアログを表示しないようにしているのは、ダイアログでキャンセルボタンが押された時に発生するエラーだから。キャンセルボタンを押したからといって、エラーを発生させるのはいかがなものかと思うが、diplay dialog コマンドの昔からの仕様なので文句を言ってもはじまらない。
第2のご利益は、不要なデータが保存されないようにすること。もっとも、こちらは副次的な効果だと思っている。
皆さん、「property の変更はスクリプトの実行終了後に保存され、次回の実行時には変更された property が使用される。」というのはご存知でしたか?つまり、AppleScript はデータを書き出したりせずとも、それ自身がデータの格納場所になれるんだぜ。これ自身は、いろいろ使いでのある有用な性質だ。
AppleScript Applet や Droplet、スクリプトバンドルの場合は、バンドル内の Contents/Resources/Scripts/main.scpt というファイルが実行の度に書き換えられる。
さて、ここからが本題ですが、run ハンドラ内に限っては、一見 local 変数の様にみえる変数でも、実際は property だったりする。run ハンドラはユーザー定義のハンドラとは違って、ちょっと特殊なんだ。run ハンドラ内の変数も、明示的に宣言された property と同じように保存される。
上のサンプルのように、メインの処理はユーザー定義のハンドラで行うようにすれば、巨大なデータとかパスワードとか、保存したらうれしくないデータが不用意に保存されてしまう危険性が無くなる。
ところで、アプレットの実行の度に、必ず main.scpt が更新されるかというと、そういうことではないようだ。property の変更が行わていない場合は、main.scpt は更新されない。実行の度に保存されるかと思い込んでいたけど、確かめたら違った。結構、賢く振る舞っているようだ。見直したぜ > Apple。
ところで、上のサンプルの on error 文にある変数 msg と errno はなぜかローカル変数と扱われているようで、保存されない。なぜかはわからん。