Archive for 10月, 2011

2011/10/18 指定アプリの指定タグの文字列をアプリ内のLocalizableStringsから取得する v3

バンドルIDを指定してアプリケーションのパスを求め、その中のローカライズ文字列テーブルから指定ラベルに該当する文字を取り出すAppleScriptの改良版です。

プロセスを確認して、起動中であればプロセスから情報を取得。起動中ではない場合には、Finder経由で実行ファイルのパスを求めるようにしています。

スクリプト名:指定アプリの指定タグの文字列をアプリ内のLocalizableStringsから取得する v3

set aRes to retLocalizedStringFromApp("135.006", "com.apple.itunes") of me
–> "ライブラリ"–Japanese
–> "LIBRARY"–English
–> "BIBLIOTHÈQUE"–French
–> ""–Simply Chinese
–> "資料庫"–Traditional Chinese
–> "MEDIATHEK"–Deutsch

–指定バンドルIDのアプリケーション内のResourcesフォルダの中の現在のロケールのフォルダ内のLocalizable.strings内の指定タグに対応する値を取得
–iTunesのような「不適切なローカライズ」に対応するために、リソース内のローカライズデータからオブジェクト名を取得
on retLocalizedStringFromApp(locLabel, bundleID)
  
  
set pRes to retExistenceOfProcessByBundleID(bundleID) of me
  
  
if pRes is not equal to false then
    –指定Bundle IDのプロセスが起動していた場合
    
tell application "System Events"
      tell pRes
        set appFile to application file
      end tell
    end tell
    
  else
    –指定Bundle IDのプロセスが起動していなかった場合
    
tell application "Finder"
      try
        set appFile to application file id bundleID
      on error
        return
      end try
    end tell
    
    
set appFile to appFile as alias
  end if
  
  
  
set aStr to localized string locLabel in bundle appFile
  
end retLocalizedStringFromApp

–指定のバンドルIDのプロセスが起動していればプロセスへの参照を返す、なければfalseを返す
on retExistenceOfProcessByBundleID(bundleID)
  tell application "System Events"
    set aProc to every process whose bundle identifier is equal to bundleID
    
if aProc = {} then return false
    
    
set aProc to contents of first item of aProc
    
return aProc
  end tell
end retExistenceOfProcessByBundleID

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

本ルーチンを使って、iTunesの「ライブラリ」に該当する文字列を取り出すテストを行い、実際に使用ユーザー環境の言語を変更してログインし直し、各言語で動作確認を行ってみました。

スクリプト名:iTunes_control_Japanese
tell application “iTunes”
  tell source “ライブラリ”
    tell playlist “ライブラリ”
      count every track
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:iTunes_control_English
tell application “iTunes”
  tell source “LIBRARY”
    tell playlist “LIBRARY”
      count every track
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:iTunes_control_Deteuch
tell application “iTunes”
  tell source “MEDIATHEK”
    tell playlist “MEDIATHEK”
      count every track
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:iTunes_control_French
tell application “iTunes”
  tell source “BIBLIOTHÈQUE”
    tell playlist “BIBLIOTHÈQUE”
      count every track
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:iTunes_control_Chinese (simplified)
tell application “iTunes”
  tell source
    tell playlist
      count every track
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

スクリプト名:iTunes_control_Chinese (traditional)
tell application “iTunes”
  tell source “資料庫”
    tell playlist “資料庫”
      count every track
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

……で、冒頭のScriptを使うと、これらの各言語環境ごとにバラバラのオブジェクト名を記述しなければならなかった部分が、1本のScriptでカバーできるはずです。

スクリプト名:指定アプリの指定タグの文字列をアプリ内のLocalizableStringsから取得する v3.1
–すべての言語環境でこのプログラムに統一できるはず
set aRes to retLocalizedStringFromApp(“135.006″, “com.apple.itunes”) of me

tell application “iTunes”
  tell source aRes
    tell playlist aRes
      count every track
    end tell
  end tell
end tell

–指定バンドルIDのアプリケーション内のResourcesフォルダの中の現在のロケールのフォルダ内のLocalizable.strings内の指定タグに対応する値を取得
–iTunesのような「不適切なローカライズ」に対応するために、リソース内のローカライズデータからオブジェクト名を取得
on retLocalizedStringFromApp(locLabel, bundleID)
  
  
set pRes to retExistenceOfProcessByBundleID(bundleID) of me
  
  
if pRes is not equal to false then
    –指定Bundle IDのプロセスが起動していた場合
    
tell application “System Events”
      tell pRes
        set appFile to application file
      end tell
    end tell
    
  else
    –指定Bundle IDのプロセスが起動していなかった場合
    
tell application “Finder”
      try
        set appFile to application file id bundleID
      on error
        return
      end try
    end tell
    
    
set appFile to appFile as alias
  end if
  
  
  
set aStr to localized string locLabel in bundle appFile
  
end retLocalizedStringFromApp

–指定のバンドルIDのプロセスが起動していればプロセスへの参照を返す、なければfalseを返す
on retExistenceOfProcessByBundleID(bundleID)
  tell application “System Events”
    set aProc to every process whose bundle identifier is equal to bundleID
    
if aProc = {} then return false
    
    
set aProc to contents of first item of aProc
    
return aProc
  end tell
end retExistenceOfProcessByBundleID

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/10/18 指定アプリの指定タグの文字列をアプリ内のLocalizableStringsから取得する v2

指定アプリの内部リソースから指定ラベルに該当する文字列を取り出すAppleScriptの改良版です。アプリケーション名を指定してプロセスを取得するのではなく、Finderに対してアプリケーションのバンドルIDを指定してアプリケーションの実行ファイルのパスを求めるようにして処理するものです。

ただ、Mac OS X 10.6上だとFinderへのAppleScriptからのアクセスが途中からとても遅くなってしまったので、なんでもかんでもFinderに問い合わせるのは避けたいところです。

スクリプト名:指定アプリの指定タグの文字列をアプリ内のLocalizableStringsから取得する v2

set aRes to retLocalizedStringFromApp("135.006", "com.apple.itunes") of me

on retLocalizedStringFromApp(locLabel, appID)
  
  
tell application "Finder"
    try
      set appFile to application file id appID
    on error
      return
    end try
  end tell
  
  
set appFile to appFile as alias
  
  
set aStr to localized string locLabel in bundle appFile
  
end retLocalizedStringFromApp

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/10/18 指定アプリの指定タグの文字列をアプリ内のLocalizableStringsから取得する

Amazonダウンローダー内でAppleScriptを使っている箇所があり、案の定、オブジェクト名までローカライズされているiTunesの特性を理解せずに作られているために、日本語環境ではまともに動かなくて大笑いしましたが……このような悲劇が起こらないように、いろいろ考えておりました。

結局のところ、アプリケーションのバンドル内のResourcesフォルダの各言語フォルダの中に入っているLocalizable.stringsファイル内から該当するデータを取り出せればよいのだろうか、と考えました。

locali.jpg

そこで、実際にLocalizable.stringsを調査して、実際にオブジェクト名に該当するものを探しだし、ラベルを指定して取り出せるようにしてみました。

Localizable.stringsには文字定数とか画面に表示する文字列なんかを入れておくわけで、このケースでも画面上に「ライブラリ」と表示するためのデータが格納されているわけですが、それがAppleScriptのオブジェクト名と同じであるために、結果オーライで取り出してみることにしました。

本バージョンでは、アプリケーション名とLocalizable.strings内のラベルを指定します。対象のアプリケーションが起動していることが実行条件です。

スクリプト名:指定アプリの指定タグの文字列をアプリ内のLocalizableStringsから取得する

set aRes to retLocalizedStringFromApp(“135.006″, “iTunes”) of me

on retLocalizedStringFromApp(locLabel, appName)
  
  
launchAnApp(appName) of me
  
  
tell application “System Events”
    set aProc to process appName
    
if aProc = “” then return
    
    
tell aProc
      set appPath to application file
    end tell
  end tell
  
  
set aStr to localized string locLabel in bundle appPath –ライブラリ
  
end retLocalizedStringFromApp

on launchAnApp(appName)
  tell application appName to launch
end launchAnApp

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/10/16 CotEditorをAppleScriptから操作する3

オープンソースのテキストエディタ「CotEditor」をAppleScriptから操作するシリーズの第3弾。あくまで基礎的な部分を地道に検証することが重要なので、AppleScriptで非常によく使う「selection」(選択部分)について調べてみました。

CotEditor上で、このように選択した状態で、選択部分のプロパティを取得して、その詳細を調べてみることにします。

cot40.jpg

selectionのプロパティはこのようにして取得できます。

スクリプト名:CotEditorでselectionのプロパティを取得する0
tell application “CotEditor”
  tell document 1
    set aSel to properties of selection
  end tell
end tell
–>

(*
{line range:{1, 2}, class:selection-object, character range:{0, 16}, contents:”てすとだよ
日本語を打つてすと。”}
*)

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

問題はここからです。

まずは、line rangeを取り出してみます。これは、選択部分の行の範囲を取得するというものです。

スクリプト名:CotEditorでselectionのプロパティを取得する1
tell application “CotEditor”
  tell document 1
    set aSel to properties of selection
    
set lineRange to line range of aSel
    
–> {1, 2}
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

次に、character rangeを取得してみましょう。選択部分が何文字目から何文字目までなのかを取得できるはずです。

が……

スクリプト名:CotEditorでselectionのプロパティを取得する2
tell application “CotEditor”
  tell document 1
    set aSel to properties of selection
    
set charRange to character range of aSel
    
  end tell
end tell

–> error “CotEditor でエラーが起きました:range of document 1 を取り出すことはできません。” number -1728 from range of document 1

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

「character range」という予約語がきちんとAppleScriptの処理系に認識されていないようです。そのために、エラーが発生してしまいます。

真面目にcharacter rangeという予約語を生かせる方向に努力するか、あるいは先人(マイクロソフトとかアドビとか)にならって「characterRange」などという、微妙に既存の予約語と重ならないような予約語を作ってみるといいんじゃないでしょうか。

現状のままだと、比較的初心者(中級者ぐらいでも)にとっては、エラーの所在がOSにあるのか、AppleScriptの処理系にあるのか、アプリケーションに存在するのかがまるっきり分かりません。OSは動いているし、アプリケーションも普通に動作していれば、AppleScriptに問題があると考えるのが普通です。ところが、アプリケーション側の対応が不適切なケースが割と多いのが実際のところです。

「AppleScriptが分からない」というつまづきは、こうしたアプリケーション側の「ダメな実装」にも原因が(かなり)あるわけで、古くはCodeWarriorがデフォルトで出力していたAppleScript用語辞書(select tell targetという予約語が入っているのが目印)が、Script対応でないのに辞書が含まれるためAppleScript初心者を惑わせたという歴史的経緯があります。

世界的に有名な(たぶん、世界一)バカ実装では、アドビのIllustrator CS2で、色のR(赤)、G(緑)、B(青)のチャネルを示す属性に「r」「g」「b」という1文字の予約語を割り当てたというものがあります。1文字の変数と衝突して、なかなか問題の所在が分かりませんでした。さすがにこれはCS3で直りましたが、アドビの独創性豊かなバカ実装は、Appleといい勝負だと思います。

最後に、選択部分の内容(contents)を求めてみましょう。

スクリプト名:CotEditorでselectionのプロパティを取得する3
tell application “CotEditor”
  tell document 1
    set aSel to properties of selection
    
set aCon to contents of aSel
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

さすがにこの部分にバグは確認されませんでした。

この確認は、単に「辞書どおりに書いて実行できるかどうか」というレベルの確認であり、長期間連続して処理をするとアプリケーションがクラッシュするとか、そういうレベルの確認ではありません(Photoshop CS3で3日間、5000回ぐらい巨大なJPEGファイルをオープン/クローズしてクラッシュしないか確認したことがありました)。

また、データサイズが小さいときの挙動と大きいときの挙動が違ったり、アプリケーションによってはドキュメントオープン後に内部の状態が安定するまでに時間がかかるようなケースもあるので、そのあたりの様子を見ながらScriptを書くことが重要です。

2011/10/13 Safari 5.1.1、iPhoto 9.2が登場。AppleScript用語辞書に変更なし

Safari 5.1.1とiPhoto 9.2アップデートが登場しました。また、Mac OS X 10.7.2のアップデートも登場しています。iOS5のアップデートも出てはいるものの、まだアップデートサーバーとつながらずアップデートできず……。

Safari 5.1.1とiPhoto 9.2については前バージョンであるSafari 5.1とiPhoto 9.1.5からAppleScript用語辞書の内容に変更がないことを確認しました。

2011/10/12 CotEditorをAppleScriptから操作する2

オープンソースのテキストエディタ「CotEditor」をAppleScriptから操作するシリーズの続編です。

基礎的な命令を試してみます。documentのプロパティを取得。

スクリプト名:CotEditorでdocumentのプロパティを取得する
tell application “CotEditor”
  tell document 1
    properties
  end tell
end tell
–>

(*
{line ending:LF, line spacing:0.0, coloring style:”なし”, modified:true, alpha only textView:true, transparency:1.0, contents:”てすとだよ
日本語を打つてすと。
Abcdefgh Ijklmn Opqrstu”, name:”名称未設定”, wrap lines:true, class:document, path:missing value, text:”てすとだよ
日本語を打つてすと。
Abcdefgh Ijklmn Opqrstu”, IANA charset:”utf-8″, encoding:”Unicode(UTF-8)”, length:40}
*)

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

いろいろと面白そうなプロパティがあります。では、ウィンドウの透明度を変えてみましょう。

スクリプト名:CotEditorでウィンドウの透明度を変更する1
tell application “CotEditor”
  tell document 1
    set transparency to 1
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

このScriptを実行した状態が以下の画面です。

cot21.jpg

ここから、

スクリプト名:CotEditorでウィンドウの透明度を変更する2
tell application “CotEditor”
  tell document 1
    set transparency to 0.5
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

を実行すると、

cot22.jpg

のように、Script中で指定したとおり透明度が0.5(1.0が完全不透明状態、0が透明状態)になります。

ただし、この透明度の設定が環境設定値と連動していないようで、

cot23.jpg

(一度AppleScriptから透明度の変更を行うと)環境設定の値を変更しても、画面表示は変わりません。また、AppleScriptから設定した透明度がこの環境設定には反映されません。

2011/10/12 iTunes10.5が登場。AppleScript用語辞書に変更なし

iCloudへの対応など新機能を盛り込んだiTunes 10.5が公開されました。さっそく、AppleScript用語辞書を前バージョンのiTunes 10.4.1と比較してみたところ、差異はとくにありませんでした。

2011/10/10 CotEditorをAppleScriptから操作する

日本人の手によるオープンソース・アプリケーション「CotEditor」のバージョン1.2をAppleScriptから操作してみました。

以前から存在は知っていたものの、デザインなどのフィーリングが合わなかったので常用するには到っていませんでした。

co1.jpg
▲TextWrangler

co2.jpg
▲mi

co3.jpg
▲CotEditor

AppleScriptの用語辞書を見てみたところ、

cot00.jpg

ちょっと面白そうな命令が並んでいたので、どのぐらいの実装レベルなのか試してみることにしました。

基本的なところから、アプリケーションにプロパティをくれるよう依頼してみると……常識的なレベルの動作は行っているようです。

スクリプト名:CotEditorのアプリケーションのプロパティを取得
tell application “CotEditor”
  properties
end tell
–> {name:”CotEditor”, frontmost:false, class:application, version:”1.2″}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

次に、ドキュメントを1枚表示した状態で、Windowの枚数をカウント。1ドキュメントしか開いていないのにWindowの数が「8」と返ってきました。何か暗雲漂う雰囲気です。おかしな動作を起こしそうな予感がします。

スクリプト名:CotEditorでWindowの枚数をカウント
tell application “CotEditor”
  set a to count every window
end tell
–> 8

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

ためしに、すべてのウィンドウに対してvisibleの設定を行ってみたところ…………

cot01.jpg

スクリプト名:CotEditorでWindowのvisibleを書き換える
tell application “CotEditor”
  activate
  
  
set aList to every window
  
repeat with i in aList
    tell i
      set visible to true
    end tell
  end repeat
  
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

予想どおり、補助パレットからドロワーから何からすべて表示状態になってしまいました。

cot02.jpg

慌てて、すべてのウィンドウのvisible属性をfalseにして、一度終了させて再度起動…………すると、今度はドキュメントのウィンドウも何も表示されなくなってしまいました。

スクリプト名:CotEditorでドキュメント関連のWindowのみvisibleにする
tell application “CotEditor”
  set wList to every window
  
repeat with i in wList
    set aProp to properties of i
    
set aDoc to document of aProp
    
    
if aDoc is not equal to missing value then
      set visible of i to true
      
set zoomed of i to true
    end if
  end repeat
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

こんな(↑)感じでしばし試行錯誤して、結局preferenceファイルを削除して再度立ち上げることで回復しましたが、ちょっとアプリケーション起動時の初期化動作が甘いのと、関係ないウィンドウをAppleScriptの操作対象にしているのが問題であるように思われました。

ウィンドウのvisible制御は実戦的なAppleScriptではよくやる話なので、visible属性をいじくると異常動作を行うレベルだと、本気のAppleScriptは組めない感じがします。

2011/10/10 文字列中に指定文字が何個入っているかカウントする v2

文字列中に指定文字が何個入っているかカウントし、出現数と出現位置のリストを返すAppleScriptです。

スクリプト名:文字列中に指定文字が何個入っているかカウントする v2
set a to “Joe A Hisaishi”
set aTargChar to ” “

set bList to countAcharInStrAndDetectPos(a, aTargChar) of me
–> {2, {4, 6}} –指定文字の出現回数カウント、登場位置リスト

–文字列中に指定文字が何個入っているかカウントし、登場位置をリストで返す
on countAcharInStrAndDetectPos(aStr, aTargChar)
  set aList to {}
  
set posC to 1
  
  
considering case
    set aHit to offset of aTargChar in aStr
    
    
if aHit is not equal to 0 then
      set aaList to characters of aStr
      
set aCount to 0
      
      
repeat with i in aaList
        
        
set j to contents of i
        
        
if j = aTargChar then
          set aCount to aCount + 1
          
set the end of aList to posC
        end if
        
        
set posC to posC + 1
        
      end repeat
      
      
      
return {aCount, aList}
    else
      return {0, {}}
    end if
  end considering
end countAcharInStrAndDetectPos

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/10/09 Numbersで選択中の内容をText to Speechで読み上げる

Numbersで選択中の内容をMac OS X 10.7で採用された日本語の読み上げキャラクター(kyoko)を指定して読み上げるAppleScriptです。

numbers1.jpg

このような(1列の)選択状態のデータを読み上げます。複数行×複数列の内容を読み上げる場合には、適当に内容を変更してください。

日本語音声の「Kyoko」をインストールしていない状態(OSのインストール直後の状態)では日本語音声は出ないので、その点は注意してください。

Kyokoを指定しなければ(英語+数字の範囲であれば)、Mac OS X 10.6/10.5/10.4でも使えますし、そういう環境では「SayKana」などのフリーのツールを使えば日本語による読み上げは可能です

スクリプト名:Numbersで選択中の内容をText to Speechで読み上げる
tell application “Numbers”
  tell table 1 of sheet 1 of document 1
    set aList to value of every cell of selection range
  end tell
end tell

repeat with i in aList
  say i using “Kyoko”
end repeat

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/10/09 Mail.appで添付ファイルを指定してメール送信

Mail.appで指定のファイルを添付してメールを作成・送信するAppleScriptです。

★本Scriptを実行する際には、最初に送信先のアドレスを書き換えてからにしてください

Googleで「AppleScript Mail attachment」とキーワードを入れると(海外のサイトに掲載されているAppleScriptが)ザクザク出てくる程度の内容ではあるのですが、本Blogの過去の記事検索では出てこなかったので、掲載しておきます。

この基本的なサンプルをさらに書き換えると、

・choose fileなどというユーザーに場所を尋ねる(放置状態だと処理が止まってしまう)やりかたではなく、指定フォルダ中の指定ファイルを自動で指定
・添付ファイルの各種情報を取得して、その内容をメールの本文に反映させる
・所定の容量以上の場合には、添付しないでDropboxにアップロードしてそのURLをメール本文に添付して送信
・複数のファイルを添付指定(ループで)して送信

などのAppleScriptに発展させていけます。もちろん、サブルーチン化して使い回しのきく部品に仕立てると有用性はもっと上がります。

けっこうよく使う処理で……何か遠隔地で稼働しているMacのシステムからエラーを返す場合とか、必要な場合に画面のスナップショットをとって添付して送信してくるとか、シンプルではあるものの依然としてメールによるレポートが有用な手段であることに違いはありません。

Twitterで実行結果を知らせてくるとか、iChat経由でメッセージを送ってくるとか、Blogに新規記事を作成してレポートしてくるといった処理もAppleScriptで割と楽勝でできる昨今ですが、とりあえずMailで情報を送るやりかたは最低限マスターしておきたいものです。

スクリプト名:添付ファイルを指定してメール送信
set theName to “ぴよまるさん”
set theAddress to “maro@piyocast.com”
set theSubject to “メールの題名ですぴよ”
set theBody to “ぴよまるさんへ

メールにファイルを添付しましたよ〜。ぴよ〜。

ひよこさんより

set theAttachment to choose file with prompt “添付ファイルを選択してください”

tell application “Mail”
  set newMessage to make new outgoing message with properties {subject:theSubject, content:theBody & return & return}
  
tell newMessage
    set visible to false –サイレントでメール作成(メールのウィンドウを表示しない)
    
    
–受取人の指定
    
make new to recipient at end of to recipients with properties {name:theName, address:theAddress}
    
    
–添付ファイルの指定
    
tell content
      make new attachment with properties {file name:theAttachment} at after the last paragraph
    end tell
    
    
–メール送信
    
send
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/10/08 アプリケーション構成が変わったGrowl 1.3への対応

Mac OS X 10.0が出た頃から「こんなのがあったらいいのに」と思っていたAppleScript対応メッセージ表示ソフト「Growl」。長らくフリー配布されてきましたが、目下Mac OS X 10.7, Lion対応のGrowl 1.3がAppStoreから170円で絶賛発売中!

growl1.jpg

日常的に使用しているあらゆる自作のAppleScriptで、Growlにメッセージ表示や途中経過の報告を行わせており、サードパーティのアプリケーションのうち活用度はダントツではないかと思えるほど。なくなってもらっては困ります。

Growlバージョン1.2まではGrowl本体(Preferences Pane)とGrowlHelperAppという2つのアプリケーションに分かれており、AppleScriptからはGrowlHelperAppに対してメッセージを投げていました。

AppStoreで公開する場合に、Preferences Paneという形態ではAppleの承認が下りなかったのか、はたまたPreferences Paneの仕様が変わって自由度がなくなったのか(たぶん前者)……

バージョン1.3は、「Growl」というアプリケーションが1つ存在するという形態に変更になりました。

当然のように、Growlに対してAppleScriptからtellしてみると……当然のように動きます。バージョン1.3以降のGrowlを対象にAppleScriptを書く場合には、「GrowlHelperApp」ではなく「Growl」にtellするように書く必要があるというわけです。

従来のバージョン1.2用に書いたAppleScriptをオープンしようとすると「GrowlHelperAppはどれですか?」とAppleScriptエディタが尋ねてくるので、かわりに「Growl」を指定すれば大丈夫です。

気になるのが、バージョン1.2と1.3の間でGrowlAppHelper/GrowlのAppleScript用語辞書の内容がどの程度変更されているのか、という話。

AppleScript用語辞書を(ASDictionaryで)書き出してdiffツールで(Apple純正FileMergeを愛用中)比較してみると、25ヶ所も違っていると言われます。メジャーなアプリケーションのマイナーバージョンアップの割に、ずいぶんと変更されているものです。

ただ、個別に確認してみると、ほとんどが「string」を「text」に書き換えた箇所であり、気にするほどのものではありませんでした。

ここで「すべて」ではなく「ほとんど」と書いたのは、大きな変更点が2つあるためです。

growl2.jpg

1つは、「Growl Suite」の「notify」コマンドのオプション「PICT image」が廃止になったこと。64ビット環境ではPICTの表示はサポートされていないのと、「PICT? ナニソレ???」というぐらいにPICTの存在感がMac OS X環境では消え失せたので、ほぼ影響はないでしょう。

もう1つは機能追加。

新たに「Gworl Control」suiteが追加され、「close all notifications」「pause」「resume」「disabling incoming network」「enable incoming network」「show rollup」「hide rollup」の7つの命令が追加になりました。また、applicationのpropertyに「is paused」と「allows incoming network」の2つの、アプリケーションの状態を示す属性が追加されました。

概要はこんなところですが、じゃあ本当にバージョン1.2用に作ったAppleScriptが、バージョン1.3上で問題なく動くかというのは…………やはり実際に試して確認するほかないでしょう。多分、大丈夫だとは思いますけれども。