(※翻訳者注意)この文書は、Apple Inc. の「AppleScript Release Notes for Mac OS X version 10.5」を市川せうぞー(英検4級)が個人的に日本語翻訳(意訳)したものです。わたしと同じように英文が苦手な人のために訳しました。ですから間違っている可能性があります。正しい詳細については、原文を参照してください。また、翻訳間違いなどに気づかれた方はお知らせください。
このリリースノートは、Mac OS X 10.5に付属するAppleScript 2.0の新機能と、解消された不具合についての文書です。より古いバージョンに関しては以下を参照してください。AppleScript Release Notes (Mac OS X 10.4 and earlier).
AppleScript 2.0では、AppleScript 1.1〜1.10.7で書かれたスクリプトが動作します。もし最新の機能を使わなければ、古いスクリプタブルアプリケーションや、AppleScript 1.5以上のスクリプティング追加機能との互換もあります。
ユニコードサポート
アプリケーションオブジェクト
スクリプタブルネットワーク参照
スクリプト対応度とVoiceOver
コマンドラインサポート
その他の拡張
バグフィックス
ディベロッパーノート
AppleScript 2.0は、ユニコードベースです。ユーザーはあらゆる種類のテキスト(または文字種)を入力するかもしれませんが、AppleScript 2.0はユーザーの言語設定に関わらずこうした文字列をユニコードテキストとして保持します。たとえば、以下のコードではそれぞれ異なった言語の文字を混在させ、正しい結果を返します。
set jp to "日本語" |
set ru to "Русский" |
jp & " and " & ru -- "日本語 and Русский"を結果として返します |
ユニコードテキストと非ユニコードテキストの区別はありません。「class of "ほげほげ"」が返すのはテキストクラスひとつだけです。テキストクラスはユニコードテキストクラスと機能的に同等であり、どんな文字種も含められます。さらに2つの新機能:
テキストオブジェクトにidプロパティが追加されました。コード番号(10進)との相互変換も可能です。
idプロパティはコード番号と文字をそれぞれ相互変換します。例)「id of "愛"」は「24859」を返します。逆に「character id 24859」は「愛」を返します。文字列では結果をリストで返します。例)「id of "愛してる"」は「{24859, 12375, 12390, 12427}」を返します。「string id {24859, 12375, 12390, 12427}」は「"愛してる"」を返します(「text id {24859, 12375, 12390, 12427}」が構文エラーになるのはバグです。「string」「character」または「Unicode text」としなければなりません)。「ASCII character」と「ASCII number」のレガシーコマンドも動作はしますが、すべてのユニコード範囲をカバーしません。[2915643]
コンビネーション文字でも正しく1文字とカウントします。
複数の文字で1文字を表現するコンビネーション文字があります。たとえば、「é」という文字はU+00E9 (LATIN SMALL LETTER E WITH ACUTE)1文字で表現できますが、「e」U+0065(LATIN SMALL LETTER E)と「́」U+0301(COMBINING ACUTE ACCENT)の結合文字で表現することもあるでしょう。AppleScript2.0ではこうした文字を正しく1文字とカウントします。[4192557]
旧バージョンでのテキストアイテムデリミタ(text item delimiters)のマッチングは、「considering」も「ignoring」も共に尊重されます。«constant conszkhk»などの拡張属性はサポートしません。
全ユニコード化では「read」「write」コマンドとテキストエンコーディングの変更を余儀なくされました。以前はユーザーのプライマリエンコーディングとUTF-16(あるいは引数パラメータにしたがって)を使用して書き込みされていました。テキストクラスがひとつとなった現在、エンコードを決定するために以下のパラメータを使用できます。「no as(無指定)」「as text」「as string」はユーザーのプライマリエンコーディングを使用します。「as Unicode text」はUTF-16を使用します。AppleScript 2.0とそれ以前のバージョンでスクリプトを動かしたい場合は、必ず「as text」または「as as Unicode text」パラメータを指定してください。 [4421553]
AppleScript 2.0以前との互換性のために、「string」と「Unicode text」はまだ定義されていますが、テキストクラスにとっては同義語となっています。たとえば以下の3つのコードは同じ効果をもたらします。
someObject as text |
someObject as string |
someObject as Unicode text |
さらに、「text」「string」「Unicode text」は比較において等価です。たとえば「class of "foo"」は「text」を返しますが、「class of "foo" is string」は「true」を返します。アプリケーション的にこの3つの書き方はまだ存在しますが、AppleScript自身は関知しません。
AppleScript 2.0は世界中の文字を正しく表現するのと同様、スクリプト中のテキストもまた厳密に保持します。AppleScript構文で使用される「≠」や「¬」などの非ASCII文字は「AppleScript Language Guide for AppleScript 1.3.7」の通りにタイプしなければなりません。アジアの国々の言語との互換性のため、「«」「»」は「《」「》」と同義語として許容されています(※訳者注:日本語環境で「《〜〜》」とタイプすると、コンパイル時に「«〜〜»」に自動変換されます)。
すべてのテキストがユニコードテキストである現在、スクリプトは常にユニコードテキストとして振る舞います。特定のwordエレメントではロケールに依存した振る舞いを見せるかもしれません。AppleScript 2.0とそれ以前の環境で同様の結果を得るためには、必ず「words of someText as Unicode text」としてください。
テキストアイテムデリミタ(text item delimiters)の「considering」「ignoring」属性を尊重したために「case-insensitive」(大文字小文字を無視する)がデフォルトになっています。AppleScript 2.0とそれ以前の環境で同様の結果を得るためには、これらの属性を自明的に付加してください。
AppleScript 2.0のスクリプトはすべてのテキストをユニコードテキストとして格納するため、どんなテキスト定数もユニコードテキストのクラスの使用とみなします。こうしたスクリプトを編集する場合は、いずれのバージョン上でもAppleScript 1.3に戻ります。アラビア語やタイ語などのユニコード文字のみを含むスクリプトは動作するでしょうが、AppleScript 2.0のスクリプトエディタでは正しく編集できないでしょう。この時、ユニコードにしか存在しない文字は失われます。
新しく追加されたidプロパティを使えるのはAppleScript 2.0のみです。
AppleScriptのアプリケーションオブジェクトは、いくつかの新機能を使いやすくするために再デザインされています。新しい機能ではありませんが、より直感的な使い勝手を提供します。
アプリケーションが起動中かどうか?
System Eventsは、アプリケーションが起動しているかどうかを調べられますが、スクリプトに何行かを余分に書く必要があります。AppleScript 2.0のアプリケーションオブジェクトでは、System Eventsを呼び出さないでその答えを得られます。例えば、以下のスクリプトは、iTunesをポーズしますが、iTunesが起動中でないと動作しないでしょう。
tell application "iTunes" |
if it is running -- "if running" または "if running is true"でも同じ |
pause |
end if |
end tell |
アプリケーションの起動中には、tellブロックを介することなく、このように書くことができました。
if application "iTunes" is running |
tell application "iTunes" to pause |
end if |
アプリケーションが最前面かどうか?
アプリケーションオブジェクトは起動中と同等のfrontmostプロパティを含んでいます。その情報はSystem Eventsから入手可能ですが、そのアプリケーションが前面でなければなりません。しかし、バックグランドでのみ動作するアプリケーションやSystem EventsのようなUIのためのアプリケーション、稼働中でないアプリケーションなどのfrontmostの値は常に「false」です。
アプリケーションのバージョンを得る
たいていのアプリケーションはversionプロパティを持っていますが、それを得るためにはアプリケーションが起動させる必要があります(起動させたくないのに)。新しく搭載されたversionプロパティは、アプリケーションをラウンチすることなく(イベントを送ることなく)、テキストとしてアプリケーションバージョンを返します。これを呼び出すには、アプリケーション名のnameプロパティと対応しています。
id(署名またはバンドル識別子)によるターゲットアプリケーションの特定 [3858040]
旧AppleScriptでこれを行うためには、Finderでたくさんの行を書く必要がありました。AppleScript 2.0では「id」によってアプリケーションオブジェクトを扱えます(idはバンドル識別子か4文字の署名コードのどちらかです)。たとえば、「application "Mail"」「application id "com.apple.mail"」「application id "emal"」はすべてMail.app(アプリケーションオブジェクト)を指し、スクリプトはtellブロックに対して動作します。下記のとおり。
tell application id "com.apple.mail" |
get unread count of inbox |
end tell |
対応するidプロパティを利用して、tellするために必要なidを得ることができます。
get id of application "TextEdit" |
-- "com.apple.TextEdit"が返る |
-- 'tell application id "com.apple.TextEdit"'と使えることがわかる |
上記のコードはアプリケーションが起動している必要はありません。
スクリプトを動作させるとき、アプリケーション固有のidが見つからなくてもAppleScriptはそれがどこにあるかを尋ねることなく、エラーを返します。tryブロックを使えば、エラーを補足できます。
配布用のスクリプトはidフォームを利用するべきです。もしユーザーがアプリケーションの名前を変更したとしてもスクリプトは意図通りに動作するでしょう。
さらにこれらへの対応を簡便にするために、アプリケーションの振る舞いが変わります。
アプリケーションは隠されます。
アプリケーションにコマンドを送る必要があるとき、AppleScriptは常にアプリケーションをラウンチしていました(それは時に見た目を損ないます)。AppleScript 2.0ではアプリケーションのラウンチは隠されます(デフォルト)。スクリプト上で明示的に「launch」または「activate」しなければ、アプリケーションは見えません。
必要になるまでアプリケーションの場所を探しません。
スクリプト実行時、AppleScript 2.0はコマンドを送る必要があるまでアプリケーションの場所を探さないでしょう。コンパイル済みスクリプトまたはスクリプト(アプリケーション)は、ターゲットアプリケーションの参照を含んでいます。ユーザーのシステムにアプリケーションが存在しなくても、AppleScript 2.0は関連するtellブロックにぶつかるまで、場所を見つけられないのを問題にしません。旧AppleScriptでは、スクリプトを実行する前にすべてのアプリケーション参照(の場所)を見つけようとします。
スクリプトを開くとき、AppleScriptは、スクリプト全体で参照をつけられたすべてのアプリケーションの場所を見つけようとします。キャンセルボタンをクリックすると、そのアプリケーションの検索は中止されます。この時スクリプトは、アプリケーション独自の予約語を生のコード(AppleEvent)として表示するかもしれませんが、開くことはできます。旧AppleScriptでは、キャンセルボタンをクリックすると、開くこと自体をやめてしまいます。
アプリケーションの場所を、ダイナミックに書き換えます。
アプリケーションオブジェクトとtellブロックの中身は、スクリプトの動作中はいつも評価されます。これはアプリケーション特有のコピーが「スタック」する問題を軽減します。
[4356296]
Uses of the built-in application properties will fall back to sending an event to the application in older versions of AppleScript, but the application may not handle them the same, or handle them at all. (Most applications will handle name, version, and frontmost; id and running are uncommon.) The other new features above require AppleScript 2.0.
(※訳者注意:この文はうまく翻訳できませんでした。アプリケーションにイベントを送ったあとにバックグランドになるかどうかというような意味ではないかと推測します)
旧AppleScriptでは、アプリケーションにイベントを送ると自分自身はバックグランドになりますが、アプリケーションプロパティの用法はそれを関知しないかもしれません(多くのアプリケーションではハンドル名とバージョン、前面にあるかどうかが優先され、idで動作していることは稀です)。それ以外の新機能では、AppleScript2.0が必要です。
ネットワークプレファレンス(network preferences)はSystem Eventsの新しいスイーツとして、より使いやすくなりました。スクリプトは、様々なネットワーク設定を点検したり、そのサービスに接続(または切断)したりできます。たとえば、以下のスクリプトは、現在の環境設定でPPPoEの場所を見つけて(PPPoEサービスが存在するなら)そこに接続します。
tell application "System Events" |
tell network preferences |
tell current location |
set aPPPoEService to a reference to (first service whose kind is 10) |
if exists aPPPoEService then |
connect aPPPoEService |
end if |
end tell |
end tell |
end tell |
AppleScriptユーティリティとフォルダアクションセットアップはスクリプタブルです。そして、スクリプトエディタのスクリプト対応度は、Cocoa Scriptingの改良によって向上しています。 現在これら3つのアプリケーションは、VoiceOver(自動読み上げ)対応です。
AppleScript 2.0ではコメント(トークン)として「--」だけでなく「#」も使用できます。これはAppleScript(テキストフォーマット)で書かれたスクリプトの最初の行に、「#!/usr/bin/osascript」と記述することができ、Unixの実行指定を与えられることを意味します。osascriptの使い方については、ターミナル上から「man osascript」を実行してください。 [2468788]
コマンドラインツール「/usr/bin/osadecompile
」はコンパイル済み(またはアプリケーション形式)のスクリプトをテキストに戻します [4501123]
"osascript(1)" と "osacompile(1)"のテキストエンコーディング は、UTF-16とプライマリエンコーディングに加え、UTF-8を正しく扱えます。スクリプトのエンコーディングがUTF-8でもUTF-16でもなければ、プライマリエンコーディングを使用します。
コンパイル済み(またはアプリケーション形式)のスクリプト中に「#」が使用されていても、旧AppleScript上で動作します。旧環境でこのスクリプトを編集すると「--」が代わりに使用されます(※訳者注:...とありますが、実際に旧環境で編集するとコメント行が失われることがありました)。テキスト形式のスクリプトに「#!/usr/bin/osascript」と書かれていても、旧AppleScript上では動作しません。「#」文字以降は構文エラーを起こすでしょう。
辞書ビューアーは他のクラスから継承するクラス定義のすべてのプロパティとエレメントを表示します。 この表示のオン・オフを切り替えたいなら、「スクリプトエディタ」メニューの「環境設定...」-「一般」タブで「用語説明で継承した項目を表示」チェックボックスを設定してください。 [4950321]
スクリプトエディタはテキスト定数中に存在する「タブ文字」「改行文字(CR)」「復帰文字(LF)」をエスケープして、「\t」「\r」「\n」と表示できます。実文字とエスケープ文字との表示を切り替えたい場合は、「スクリプトエディタ」メニューの「環境設定...」-「編集」タブで「文字列中のタブや改行文字をエスケープ」チェックボックスを設定してください。 [4911918]
diskクラスの「server」と「zone」プロパティは、AppleShareボリューム用です。 [3554247]
System Eventsは「downloads folder」プロパティがあります。 [5255406]
System Eventsには新しい「Security Suite」スィーツがあります。システム環境設定の「セキュリティ」パネルの設定をコントロールできます。 [4358335]
「process」クラスに「bundle identifier」プロパティがあります。 [4782866]
「Property List Suite」は新しく「property list files」「property list items」を作成します。 [4728058, 5392953]
XML要素中に「name」または「id」属性があれば、エレメント中の「name」または「id」プロパティにおのおの反映されるでしょう。「XML element named」「XML element id」として動作します。 [4437103, 4441834]
Image EventsはRAWイメージをサポートします。 [4250666]
「pad」コマンドはオプションとして「with pad color」を持ちます。[5234464]
「save」コマンドには、JPEG圧縮レベルを指定するオプション「with compression level」があります。[3614780]
「delay」コマンドは、CPUへの負担を軽減しました。 [3178086]
「1 + character 2 of "9"」のような数式として不当な式を渡されたとき、ランダムな数字ではなく、エラーを返すようにした。 [4029175]
「repeat」の反復回数に実数(realクラス)が渡されたとき、エラーではなくて整数(integerクラス)に丸められて実行します。 [4215670]
「application」と 「date」オブジェクト以外の、「alias "..."」や「POSIX file "..."」などの参照はコンパイル時に評価されません。タイプされたままの状態で残ります。 [4444698]
AppleScriptはもうスクリプトメモリ使用量を32MBに制限しません。 [4511477]
空文字列の段落数をカウントすると0を返します。「count paragraph of ""」の結果は「0」となります。 [4588706]
Rawデータのリテラル(«data ...»)は、もう127バイトに制限されません。 [4986420]
「choose from list」に2000以上のリストが渡された時もダイアログサイズは正しくなります。
[4102349]
「display dialog」に2000行以上のテキストが渡された時もダイアログサイズは正しくなります。
[4314839]
「display dialog」のテキスト中に「
^0」「^1」「^2」「^3」といったテキストが含まれていても正しく表示します。 [4831383]
「do shell script」コマンドはリモートアプリケーション上ではtellできません。 [4241641]
スクリプトエディタはスクリプト中にアジア文字が入っていても、エラー位置を正しくレポートします。[3457168]
ライブラリウインドウではアジア文字を含んだアプリケーション名を正しく処理します。 [5080569]
disk
オブジェクトは同名のディスクを見分けます。 [4141496]
インテルプロセッサ環境で、「file type」「creator type」プロパティは正しく設定できます。 [4788442]
「UI element」で「focused」プロパティをセットできるようになりました。[4756520]
「process」クラスの「frontmost」プロパティは、System EventsのUI elementで常に「false」となるでしょう。この意味は「first process whose frontmost is true」などと書いた時、最前面のアプリケーションパスを返すからです。[4175274, 5100612]
「process」クラスはAppleScript(アプリケーションバンドル形式)に正しいプロセス名を返します。 [4381260]
ユニバーサルアクセスがオフの時、GUI Scriptingコマンドを使用するとより多くの(エラー)情報が得られるでしょう。 [4774412]
データベースイベントの性能が向上しました。 [4124666]
フォルダーアクションは、安定性と性能の向上のために再設計されました。 [3663310, 3693421, 4614337]
フォルダアクションセットアップはスクリプトバンドルにアクションをつけられます。[4036743]
AppleScript 2.0は、アプリケーションのsdef辞書を直接読むことができます。 これは、用語辞書を得るためだけにアプリケーションをラウンチする必要はないことを意味します。 [4569425]
sdef形式自体はいくつかの変更があります; 詳細に関してsdef(5)のmanページを参照してください。 特に、sdefsは現在、XIncludeの使用を推奨します。 sdefsを処理するアプリケーションはそれを扱えるようにするべきです。 10.4sdef形式はまだサポートされていますが、機会があれば変更するべきです。
いくつかのオープンスクリプティングアーキテクチャ(OSA)APIには、ユニコードスクリプトを取り扱うために多くの部分で書き直されました。新しいAPIはMac OS Xバージョン10.5以降で利用可能であり、代表的なものを除けば、古いAPIも利用可能です(新しい関数はサポートされません)。追加された詳細に関しては「Open Scripting Architecture Reference」を参照してください
old | new |
---|---|
これらはCFAttributedStringRefとして出力されます。これはスタイルドユニコードテキストをハンドリングできることを意味しますが、2以前では不可能です。言語コンポーネントが直接OSACopySourceStringかOSACopyDisplayStringをサポートしないと、OSAGetSourceとOSADisplayをスルーします。 | |
これらは、OSACopySourceStringとOSACopyDisplayStringによって返されたCFAttributedStringRefに適用するのに属性のCFDictionariesのCFArrayを使用します。 | |
|
OSALoadFileとOSADoScriptFileは、UTF-8としてテキストコード化されたテキストスクリプトを処理します。 [4490939]
しばらく「not implemented」としてマークされていた様々なOSADebugger APIを取り除きました。 [3918369]
スクリプティング機能追加(Scripting Additions)は、書きやすさとパフォーマンスの向上のために、新しいアーキテクチャで書かれました。 詳細については Native Scripting Additions を参照してください。 [4236732]
「scripting addition」のローダーは環境変数DYLD_FRAMEWORK_PATHによって指定されたディレクトリを捜すでしょう。実行ファイルを動作させる時、Xcodeはこの値をプロジェクトディレクトリにセットします。そして、最初に「scripting addition」をインストールしないで、直接Xcodeから実行とデバッグできます。 [5027805]
2007-11-17 とりあえず日本語にしただけ。