Home>Monologue> Part of Script factory. scriptfactory@mac.com .

OSA Menuの特殊な事情

Contents

Intorucuction

OSA Menuとは、最前面のアプリケーションによって、内容が変化するスクリプト専用のMenuをMenubarに追加してくれる機能拡張です。これによってすべてのアプリケーションを、擬似的にattachableなアプリケーションにする事が出来ます。

僕はScriptingな人間なので??OSA Menuは手放せないsoftwareの一つになっております。とっても大好きなOSA Menuなんですが、Mac上でscriptingというMacintosh Userでも数%の人しかやらないと思われる事に関わる物となると、色々と一筋縄では行かない状況にあります。自分が気付いているOSA Menuの特殊事情に付いてつらつらと・・・。

まず、OSA Menuの基本から。そもそもAttachableなアプリケーションとは・・・知っている人は飛ばしてください。 普通、どんなスクリプト言語もそれを実行するruntime環境が必要です。attachableとはスクリプトのruntime環境になれるアプリケーションの事をいいます。具体的にはスクリプトのためのmenuを持っているアプリケーションがそれにあたるといえるでしょう。 OSA Menuの場合、擬似的ではありますが、すべてのアプリケーションに対してスクリプトメニューをつけられるので便利な事このうえないです。また、各項目にshortcut keyを割り当てる事も出来ますので、ますます便利です。

また、スクリプトの動作を加速する事も出来ます。これは本当に便利なのですが、taskを完全に独占してしまうし、うまく動かないスクリプトが少なく無い事が玉に傷です。どういうスクリプトが動かないのか、その法則が良くつかめませんが、scriptableなアプリケーションであってもattachableでないアプリケーションというのは、強引にtaskに割り込まれると困ったことが起きたりするのでしょうかね?

Options for Compatibility

一応、OSA Menuの方で互換性が取れないスクリプトに対して逃げ道を用意してくれています。以下の設定をいじるとよいでしょう。

Use Finder to run Applets/Droplets

この設定をONにすると、アプリケーション形式で保存されているスクリプトは、そのアプリケーションとして起動します。いちいちアプリケーションとして起動するのはうっとうしいものですが、でも、処理に時間のかかるものや、大きなめもりを必要とするようなスクリプトの場合、独立したアプリケーションとして実行するのがいいんじゃないでしょうか?

ちょっと前までのversionでは、この設定はまともに動かなかったのですが、現在のversion(version 1.2.2)ではちゃんと動くようです。OSA Menuの互換性とは別に、非常に有効なoptionであると思います。

Run scripts more compatibly

defaultの状態では、OSA Menuは最前面のapplicationのtaskを乗っ取ってスクリプトを実行するようですが(本当はどういう仕組みになっているのかどうかわかりませんが)、この設定をONにすると、background applicationとしてのOSA Menuがスクリプトの実行媒体となります。background applicationであるものの一般的な方法でスクリプトが実行されると思われるので、原理的にはどんなスクリプトでも動くんじゃないかとおもわれます。

ただし、この設定をONにすると、スクリプトの動作が劇的に遅くなります(涙)。普通のappletやdropletより遅いとき少なく無いです。やっぱ、常にbackgroundにいるからなんでしょうか?

Problems of "Run scripts more compatibly" option

compatible mode(Run scripts more compatiblyがONの状態)だとなんでもOKかというと、それはそれで問題があります。background applicationということで以下の点に気をつけてスクリプトを書かなければいけません。

一切のエラーメッセージが表示されない

多分OSA Menuの作者の方がサボっているだけだと思うんですが、どういうわけかスクリプトでerrorが起きても一切のエラーメッセージが表示されません。スクリプトが途中で止まっても、じぇんじぇんわからんのです。そのためスクリプトが動かない原因がつかめず、compatible modeのどこがcompatibleなんじゃ-、と思われている方も少なく無いと想像します。

なんか動かんという場合は、スクリプト全体をtry blockで囲って、エラーをcatchしてdisplay dialogで明示的にエラーメッセージを表示させることをお薦めします。

自分自身をactivateしてはいけない

他のアプリケーションへのtell blockで囲まれていないところで、activate commandを書くと、background applicationであるOSA Menuを最前面にもってこい!!というになります。しかし、background applicationは前面に持ってくることなどできず、エラーが起きてスクリプトが止まります。しかし!!エラーメッセージが一切表示されないので、止まっているのか、処理が遅いだけなのかよくわからず間抜けな時間を過ごさせてくれます。

clipboardの内容を取得は、最前面のアプリケーションへのtell block内で行う

これは、別にOSA Menuの場合に限ったことではなく、スクリプトの実行媒体となっているアプリケーションがbackgroundにいるときはcurrent applicationからclipboard内容は取得できません。appletやdroplet、もしくは普通のアプリケーションの場合は自分自身をactivateしてからclipboardにaccessすればいいのですが、background applicationであるOSA Menuはそれができません。ですから、最前面のアプリケーションへのtell block内で行う必要があります。

こんな感じです。

tell application (path to frontmost application as string) 
    set theValue to the clipboard 
end tell

Dialog Directorによるダイアログは他のアプリケーションへのtell block内で行う

OSA Menuの中でDialog Directorによるダイアログを作ると、一応ダイアログは開かれるようですが、しかし!!OSA Menuはbackgroud applicationであります。決してそのダイアログは前面に出てくれず、ダイアログを操作することは不可能です(涙)。そして、OSごとクラッシュというのが悲しい末路でありましょうか。

じゃあ、floting windowはどうだ!!と言うと、これもwindowは開かれるのですが、クリックを全然受け付けてくれない(涙)。

という訳で、唯一の解決方法は、他のアプリケーション内でダイアログを開くことです。clipboardにaccessするときの要領で、最前面のアプリケーションへのtell block内でDialog Directorのダイアログを開くとよろしいかと思います。

でも、Dialog Directorによるinterfaceを持ったスクリプトは、「Use Finder to run Applets/Droplets」の設定をONにして、独立したアプリケーションとして起動するのが無難かと思います。

割り当てメモリは500Kbyte前後である

background applicationとしてのOSA Menuの割り当てメモリは500Kbyte前後のようです。これ以上メモリを要求するスクリプトは動きません。appletやdropletの割り当てめもりが500Kbyteである場合のことを考えてみてください。500Kbyteという数字は余裕のある値とは思えませぬ。ちょっと大きなスクリプトになると500Kbyteなどすぐに消費してしまいます。そして、たとえメモり不足が原因でスクリプトが動かなくてもOSA Menuはうんともすんとも言いません。例によってエラーメッセージを一切出さないのです(涙)。

background applicationのメモリ割り当ての変更は一筋縄では行きません。resourceを直接いじらなきゃいけない。もうちょっとmemoryを割り当ててくれよ・・・と思うのは僕だけでしょうか。でも、そもそもの諸悪の原因はMac OSにあります。Dynamicにメモリを割り当てられないOSが悪い。とにかく悪い。めちゃくちゃ悪い。一生のお願いだから今すぐどうにかしてくれ!!>アップル

この問題をいくらか解決すべく、OSA Menu Sizerというものを作りました。このスクリプトはOSA Menuのresourceを書き換えて、background applicationとしての割り当てメモリを変更します。OSの再起動を必要なのが、玉に傷ですが。

などなどいろいろ問題あるのですが、僕は大喜びで使っています。


This page was last built on Wed, Feb 17, 2016 ; 10:01:23 AM . Thanks for checking it out!