機能アップ

機能がアップしているからかどうか分からないのだけど、次のような参照の書き方が利用できます。これって、今までも出来ていました?

Script Editor で開く

on run
    tell application "iCal"
        activate
        set theDate to current date

        set todoList to {}
        repeat with thisCalendarTodos in todos of calendars -- 1
            set propList to properties of thisCalendarTodos -- 2
            if propList is not {} then
                repeat with thisItem in propList
                    set dueDate to due date of thisItem
                    if dueDate is greater than theDate then
                        set num to dueDate - theDate
                        set finalDays to num div days
                        set theText to "残りの日数:" & finalDays & " 日" & return
                        display dialog theText buttons {"OK"} default button 1 giving up after 15 with title (summary of thisItem as string) with icon 1
                    end if
                end repeat
            end if
        end repeat
    end tell
end run

このスクリプトは、iCal の全 ToDo の期限を調べるスクリプトです。これ自体は、何の変哲もないのですが...、スクリプトで、2 とコメントしている部分が以前から出来ていたのかどうかが気になるのです。

repeat - in - の部分で全カレンダーの全 ToDo を取得しています。これは、全カレンダーの全 ToDo の参照になります。この参照から中身を取り出すには、contents of - とします。ここまでは、いいのです。その次の参照に対して properties としている部分です。これで、カレンダーの全 ToDo の全ての属性が取得できます

理屈としては理解できます。ただ、こういった記述が以前は出来なかったような気がするのです(出来たのかもしれませんが...)。こういう記述が使えるなら、繰り返しが極力短く記述できます。また、参照に対して処理を行うので処理速度的にも問題なしです。

AppleScript には、まだまだ知られざるアプローチが多々ありそうです。

WWDC のサンプル

過ぎ去られた話題の WWDC。Intel のことはともかく...前回、リファレンスに色々追加されています...といったことを書いたまま、尻切れとんぼで話を打ち切ってしまいました。

なぜかというと、サンプルが非常に濃い内容だったのです。そっちに夢中になっていて書くのを終えてしまったのでした。どんなものが追加されたかというと、前回も書いた Automator Programming Guide。次に、Xcode 2.0 のプロジェクトを 2.1 にアップデートする UpdateXcodeSubprojects。AppleScript で作成する Automator アクションをステップバイステップで解説する Duplicate Finder Items。そして、ScriptView

ScriptView は、AppleScript Studio で作る Script Editor です。これもステップバイステップの解説が付属しています。実際に中身を見るまでは半信半疑だったのですが、本当に AppleScript Studio で Script Editor が作れてしまいます。というのも、Developer Tools には Script Editor のインターフェースが付属しているからなのです。これは知りませんでした。このインターフェースを使えば、Script Editor の作成ができます。

/Developer/Extras/Palettes/OSAPalette.palette がそのインターフェースです。これを Interface Builder に追加すれば、Script Editor のインターフェースが作成できます。スクリプティングのほとんどの作業はこのインターフェースが受け持っており、AppleScript Studio で行うのは欲しい機能の追加です。

ということで、自分好みの Script Editor を作るのが流行る....かも。そんなことないか。

Xcode 2.1

Xcode 2.1 がダウンロードできますが...。752 MB って巨大です。このバージョンから Shell Script Automator Action なるものが作成できるようになっていますね。

AppleScript のアクションとはまた違い、シェルスクリプトを実行するアクションです。これでいまいち盛り上がらない Automator が少しでも盛り上がってくれるといいのですが。

Xcode 2.1 とともにリファレンスにもいろいろと追加されていますね。Automator Programming Guide は、AppleScript で作成するアクションの手っ取り早い入門書ですが、Cocoa バインディングの部分にも多少の解説が割かれているので、Cocoa バインディングを知らない人にとって参考になるかも。

Safari の選択文字列

Mac OS X 10.4 の Safari 1.3 で選択文字列を取得するスクリプトが動かなくなっていました。Safari のセキュリティが強化された結果らしいのですが。

Safari のスクリプティングって結局のところ JavaScript なんですが、選択文字列の取得は do JavaScript で行っていたんです。で、Safari 1.3 は、JavaScript の脆弱性に対処がなされているようで、このスクリプトを使っても空文字列しか返ってこないのです(Mac OS X 10.3.9 の頃からのことですが)。

いろいろと探してみると、やっぱり JavaScript を使うのですが、選択文字列を取得する方法がありました。

Script Editor で開く

tell application "Safari"
    set selectedText to ""
    if exists front document then
        set selectedText to do JavaScript "getSelection()+''" in front document
    end if
    return selectedText
end tell

何が違うのかがよく分かっていないのですが。分からないので JavaScript について調べる。JavaScript 使えば、画像もリンクも簡単に見つけられる、ということに今更気づく...。

QuickTime File Suite

System Events に QuickTime File Suite なるものが新しく追加されていて、これを使えば QuickTime Player を起動しなくても動画や音声ファイルについて色々調べられる、と思ったのですが。

基本的には次のようにすると属性を調べることができます。次のスクリプトは Movies フォルダーに mov ファイルがあるとして...。

Script Editor で開く

tell application "System Events"
    set QTFiles to files of movies folder of user domain whose name extension of it is "mov"
    --QuickTime file クラスに変換
    set theFile to item 1 of QTFiles
    set QTFile to QuickTime file (path of theFile)
    --データの取り出し
    set QTData to contents of QTFile
    --属性を調べる
    presentation mode of QTData
end tell

--> stop

結果がおかしいです。stop ってなんですか?そんなのどこにも載っていないのですが。この属性だけでなく、他の属性もなんだか結果がおかしいです。

QuickTime File Suite にあるクラスの属性は、QuickTime Player で調べることができるものです。両者で比べてみると結果にかなりの違いが見られます。これは、System Events の使い方がおかしいのか。それとも System Events のバグなのか...。せっかく QuickTime Player の起動なしで調べられると思ったのに。