AppleScript 2.0 (3)

いったいいつまで AppleScript 2.0 で話を持たせるのか。とはいうものの、変更点が多過ぎなんですよね。そんなわけで、不具合。まず、以下のスクリプト。

Script Editor で開く

tell application "Finder"
    set the folderList to folders of desktop

    repeat with thisFolder in folderList
        set thisFolder to thisFolder
        repeat with thisItem in files of thisFolder
            set label index of thisItem to 1
        end repeat
    end repeat
end tell

特別変なことをしていないと思うのですが...このスクリプトは実行してもファイルのラベルの色が変わりません。原因は、二度目の繰り返しの files of thisFolder の部分。repeat with - in - の繰り返しでこの書き方ができなくなっているようなのです(できました...よね?)。以下のようにいったん変数に入れると正しく処理されます。

Script Editor で開く

tell application "Finder"
    set the folderList to folders of desktop

    repeat with thisFolder in folderList
        set thisFolder to thisFolder
        set fileList to files of thisFolder
        repeat with thisItem in fileList
            set label index of thisItem to 1
        end repeat
    end repeat
end tell

って、これ、Mac OS X 10.4 の頃からですね。ちょっと Mac OS X 10.4 で調べてみました。いつからなんでしょうか。全く知りませんでした。Finder では複数参照も使えなくなっているし...だんだんと退化しているような気が...。

さて。フォルダアクションが一新されたようです。従来、フォルダアクションは Finder が操作を行っていたのですが、フォルダアクション専用のサーバーが追加されたようです。以下、アップルからの引用。

フォルダアクションの起動がFinderからファイルシステムに変更され、信頼性が向上しました。フォルダアクションには専用のサーバが用意され、フォルダアクションごとに新しいFolder Actions Dispatcherアプリケーションが実行されます。

アップル - Mac OS X Leopard - 新機能 - 300を越える新機能

『フォルダアクションごとに新しいFolder Actions Dispatcherアプリケーションが実行されます』とあるけど、これがよく分からない。フォルダアクション設定を起動してフォルダアクションをなんらかのフォルダに設定すると確かに Folder Actions Dispatcher はプロセスに表示されます。しかし、複数のフォルダにフォルダアクションを設定したからといって、複数の Folder Actions Dispatcher がプロセスに表示されるわけではなく、一つだけです。『フォルダアクションごとに新しい...』ってそういう意味ではないのかな?

しかし、なんらかの拍子に複数の Folder Actions Dispatcher がプロセスに表示されることがあります。こうなると、ASUG のメーリングリストで指摘があった処理が行われない状態になってしまうようです。

どういったことを行うと複数の Folder Actions Dispatcher がプロセスに表示されるのか分かりませんが、フォルダアクションに関する操作は System Events、フォルダアクション設定、Folder Actions Dispatcher の 3 種類のアプリケーションで行うことができます(いずれもスクリプタブル)。これらをスクリプトで操作しているうちに複数の Folder Actions Dispatcher がプロセスに表示されたのでした。

System Events とフォルダアクション設定は、それぞれ用語説明がかぶっているなかなか凶悪な素敵仕様です。どちらか一方は必要ないと思いますが。もし、フォルダアクションで処理が実行されない、ということがあったとき、もしかしたらプロセスに複数の Folder Actions Dispatcher があるかもしれません。こういう時はどちらもいったんプロセスを終了させて、再度フォルダアクションをオンにすると症状が改善されるかもしれません(確信はないですが)。

えーと。間違い。アップルの。先ほど引用した部分に間違いがありました。『フォルダアクションごとに新しいFolder Actions Dispatcherアプリケーションが実行されます』ってのは、勘違いか、もしくは間違い。フォルダアクションごとに新しい AppleScript Runner が実行されるのでした。先に書いたような現象が起きる可能性はありますが、AppleScript Runner がフォルダアクションを実行しているのでした。正しい引用は以下。

Enjoy greater reliability with folder actions, which are triggered by the file system instead of the Finder. Folder actions now have their own server, as each folder action now runs its own copy of the new AppleScript Runner application.

AppleScript: Features

つまり、フォルダアクション専用のサーバーってのが Folder Actions Dispatcher で、このサーバーが AppleScript Runner を管理しているのかな。ちなみにこの AppleScript Runner もスクリプタブルで、do script という命令だけを持っています。

ちなみに AppleScript ユーティリティもスクリプタブルになり、スクリプトメニューの動作をスクリプトで制御することができます。

Mac OS X 10.5 Leopard の大目玉...Scripting Bridge ですね。あんまり、触れたくないんですが。分かってないから。Apple がドキュメントといくつかのサンプルを公開しているので Ruby や Python、Objective-C を利用する人にはサンプルを見ただけで記述の仕方は理解できるのではないでしょうか。いずれの言語を利用するにしても、用語説明を参照する必要はありますが(属性や命令を調べるため)。

Objective-C は、従来からプログラムの中に AppleScript を混ぜることができたのですが、Scripting Bridge では、より Objective-C らしく簡潔にプログラムを記述することができるようになっています。

一応、リンクだけ張っておきます。

うん。手抜きだな。ちょっとだけ補足。

Mac OS には Open Scripting Architecture(OSA)と呼ばれる機構が備わっています。これは、アプリケーション間でメッセージを送受信するための機構です。OSA では AppleEvent と呼ばれるメッセージをアプリケーション間で送受信します。アプリケーションは受け取ったメッセージを解釈し、処理を行います。

このようにアプリケーション間でのメッセージの送受信を行うためにはアプリケーションが OSA に対応している必要があります。Mac OS X 上の Cocoa/Carbon アプリケーションはほとんどの場合 OSA に対応しています。

OSA に対応しているアプリケーションに AppleEvent を送信し、処理を行わせる...。実際のところ、AppleEvent を直接記述してアプリケーションに送信すれば目的は達成できます。が、AppleEvent をそのまま記述するというのはなかなかできるものではありません。そこで AppleEvent を直接記述する代わりに英語のような文法で AppleEvent を記述できるようにしました。これが AppleScript です。

AppleScript は英語のような文法で処理を記述しますが、実際に実行するときに AppleEvent に翻訳されます。アプリケーションは、結果を AppleEvent で返しますが、AppleEvent は AppleScript に翻訳されて返されます。

AppleScript と各アプリケーションの間に入って AppleEvent の翻訳を行うのが AppleScript Component です。AppleScript とアプリケーションがどのように動作しているかを以下に図示します。

AppleScript の技術的な背景

実行時の AppleEvent への逐次翻訳があるから AppleScript は処理速度が遅くなるのです(それでも、今の Intel プロセッサ搭載の Mac ではそれほどの遅さは感じませんが)。Scripting Bridge でもどこかで AppleEvent への翻訳を行っていると思われます(調べれば分かることなのですが)。この点では速度的にどの言語を使っても差はないと思います。しかし、それでも速度的には差が出てくると思います。なぜなら、それぞれの言語は AppleEvent への翻訳とは関係のない部分で速度差があるから。繰り返しやリスト(配列)の処理をとっても AppleScript よりも速く結果を出せるだろうと思います。

より、速度を求めるなら、また、これらの言語の特徴が必要なら採用はありだと思います(例えば、Objective-C なら Mac OS の全てのフレームワークを活用できるわけですし)。いわゆる、適材適所ですね。

0 件のコメント :

コメントを投稿