GO HOME
「AppleScript Programming for Mac OS X」追補情報
ここは、拙著のAppleScript入門書「AppleScript Programming for Mac OS X」(ソシム、524頁CD-ROM付、4200円)に関するコーナーです。現在、初版の見直し作業をしていますが、校正情報やよくある質問の答えなどを ここでまとめて掲載します。また、記述間違い、校正漏れ、「これが全然わかんない!」といったことがあれば、どうぞ掌田津耶乃(tuyano@mac.com)まで御連絡ください。ここで補足していきたいと思 います。
★バグ・校正情報★
※ここでは、ソースコードや内容に関する記述間違い、校正ミスなどについて整理しておく予定です。現在、まだチェックの途中ですが、確認したと ころまで掲載しておきます。
※P.107 下から2行目
「ver. 10.1.4ではwith propertiesで属性を指定しても作成されたウィンドウに反映されない」とありますが、現行のver. 10.2では、この問題は解決しており、「make new Finder window with properties {bounds:{100, 100, 300, 300}}」というようにしてFinderウィンドウを作成することが可能です。
※P.129 中央付近
●repead with inを使った・・ → ●repeat with inを使った・・
※P.147 returnの説明について
ここでは「return 値」という形で「値を返すもの」と説明してありますが、この後に、単に「return」だけの使い方が出てきます。ですので「値をつけず、returnだ けで『現在の処理を抜ける』のにも使う」ということを、ここで補足しておきます。
※P.176 /System/Library/ScriptingAdditions/ 内のファイル
ここにはスクリプティング機能追加ファイルとして5つのファイルが挙げてありますが、ver. 10.2では、これらの他に「Digital Hub Scripting」「Keychain Scripting」という2つのファイルが追加になっています。
※P.262 下から2行目後半
「どのdisplay dialog命令で・・・」 → 「どのdisplay alert命令で・・」
※P.295以降 (誤)NSProgressIndicatior → (正) NSProgressIndicator
なぜか、この単語だけすべて綴りの末尾付近にiがまじってしまっています。どうも置換作業の際に間違えたようです。正式名は 「NSProgressIndicator」です。
※P.318 NSFormの設定 (誤)Name: "matrix1" → (正)Name: "form1"
NSFormの名前が、その前のNSMatrix名のまま「matrix1」となっていました。正しくは「form1」です。
※P.406 リスト7-9 on showSelTextハンドラ5行目
「end tell if r = 0 then」 → 「end tell」「if r = 0 then」の2行に分かれる。
本来、2行の文が、なぜか1行につながって掲載されてしまいました。CD-ROM収録のプロジェクトでは正常な状態になっているはずです。
※P.481 「スクリプト内の・・」小見出しの開始部分
「第4章で」 → 「第5章で」
※P.506 リストA-2 下から8行目
「log str1」という文がありますが、これはデバッグ用に入れておいたものを消し忘れてしまったものです。スクリプトの実行には不要ですので削除してけっこう です。
※8.1 アプリケーションとドキュメント の説明について
P.439〜450まで、10.1専用の説明と10.2専用の説明が入り交じり、非常に分かりにくくなっています。また、1か所不要な項目が誤って記載さ れていたことがわかり、これが更にわかりにくくしていたようです。大変理解しづらい記述となってしまい、申し訳ありませんでした。
10.2をお使いの方は、この部分は10.1専用の説明の部分を飛ばしてお読み頂ければと思います。わかりにくいので、以下に整理しておきます。
- P.433〜438の「ムービープレーヤーを作る」の説明に従い作成をする。(両方兼 用)
- P.439からの「ムービーを開くスクリプトの作成」で、各コントロール名の設定だけ行い、スクリプトに関する部分は無視する。(スクリプトの説明部分は10.1専用)
- P.444の「Mac OS X 10.2のドキュメントデータ処理」に進み、その説明を読んだ上で、P.447からの「スクリプトをMac OS X 10.2向けに修正する」に従ってスクリプト部分を作成する。(10.2専用)
- この「スクリプトをMac OS X 10.2向けに修正する」では、「AppleScript」設定の最初の項目部分「Application/will openをOFFにする」は不要なものでした。これは、10.2 ではいじる必要のないものです。この文だけカットして考えて下さい。
このような流れとなります。非常に分かりにくいので、面倒ですが配付されているサンプルプロジェクトを見ながら各項目を確認しつつ理解していただければと 思います。
※この他、何か発見したら御一報くださいませ。また、わかりにくい部分などあれば、極力ここでサポートしていきたいと思っていますので、「いくら読んでも 意味が通じない」ということがあればご連絡下さい。
★追補情報コーナー★
※ここでは、本書に関する追加補足的な情報を公開していきます。本文で足りなかった内容を補ったり、不完全な部分を修正したりできればと思いま す。
● [重要] Pantherのopenハンドラ問題について
現在リリースされているPanther (ver.10.3.3) のXcodeでAppleScript Studioを利用する場合、Applicationのon openハンドラをONにすると、アプリケーションにファイルをドロップした際にプログラムが強制終了するという現象が確認されました。これはXcode のAppleScript Application全般で再現することを確認しました。
現状としては、対処方法はありません。ドロップレットに関してはScript Editorで作成すると問題なく動きますのでそちらを使って下さい。それ以外のものについては、バグが修正されるのをひたすら待つしかないようです。
● [重要] Mac OS X 10.2のAppleScript Studioプロジェクトの問題について
本書223頁で、10.2付属のDeveloper ToolsでAppleScript Studioプロジェクトを作成した際、保存時にスクリプトファイルが消失する問題について触れています。が、この他に消失問題の解消について報告をいた だいたので捕足しておきます。
これは、スクリプトファイルのエンコード方式により生ずる問題のようです。新規プロジェクトの作成後、スクリプトファイルを開いてから、「形式」メ ニューの「ファイルエンコーディング」より「日本語(Mac OS)」を選んで下さい。そして保存すれば、きちんとスクリプトファイルが保存できるはずです。あるいは、初期状態でスクリプトファイルに記述されている コメント文をすべて削除しても、一応保存できる状態になるようです。
(※どうやら、デフォルトで作成されるスクリプトのコメント部分に日本語の半角文字がまじっているため、通常のMac OS Romanで保存できないことが原因のようです)
なお、これらの対処は、新規プロジェクトを作成後、スクリプトを修正していない状態で行なって下さい。何か書いて、保存時のエラーが生じた後では、これ らの方法を用いても問題は解決しません。(この場合、最初からプロジェクトを作成し直したほうがよいでしょう)
※この問題の原因と問題の解消法について
拙著「Java & Cocoaプログラミングバイブル」の読者の方よりpure Javaプロジェクトで生ずる同様の問題についてご連絡があり、その解決法がAppleScript Studioでも通用することがわかりましたのでご報告します。
このプロジェクトの問題が発生するのは、ユーザの名前が日本語に設定されている場合のみで、ユーザ名が英語の場合には発生しません。ですので、システム 環境設定でユーザの名前を英語に変更すれば、この問題は解消できます。ただし、一番最初に作成したユーザの名前は(普通のやり方では)変更できません。新 たにユーザを作成し、普段はそちらを使うようにするとよいでしょう。
このように英語のユーザ名にしておくと、スクリプトファイルの冒頭に書き出されるコメント文も化けませんし、そのままの状態で問題なくスクリプトが記 述・保存できます。ただし! 日本語を入力しようとすると「ファイルのエンコーディングを変更しないとダメ!」という警告ダイアログが現れます。(ここで エンコーディングをUnicodeにしておけば、ちゃんと日本語も使えます。が、それでもビルドエラーがでるようで、結局、日本語の文字列を使用する場合 にはMacOS(日本語)に手作業で変更しないといけないようです)
●「≠」「≦」「≧」記号の問題について
比較演算の記号として、AppleScriptでは「/=」「<=」「>=」といったものが使われます。これらは文法チェック時に「≠」 「≦」「≧」記号に置き換えられます。が、AppleScript Studioでは、これらの記号が理解されなくなり、文法チェックに失敗したり、スクリプトファイルの保存ができなくなったりする現象が確認されていま す。
この問題は、どうやらScript Editorで、記号類の表示フォーマットを英語フォントに変更していると起こるようです。これは自分の環境で問題がなくとも、配付した先の環境で設定が 変更されていれば問題を起こすので、配付するプロジェクトを作成する人は注意して下さい。個人的には、問題が解決するまで、これらの記号は使わないでスク リプトを書くしかないように思います。「A ≠ B」ならば「A is not B」に、「A ≦ B」ならば「A < B or A = B」に、それぞれ置き換えてスクリプトを書くのがよいでしょう。
●NSProgressIndicator の「スピニングタイプ」表示について
本書では「スピニングタイプは設定がうまく反映されない」とありますが、これはInterface Builderのファイルフォーマットの問題のようです。「Preferences」メニューを選び、「General」タブにある「Nib File Compatibility」のラジオボタンを「10.2 and later format」に変更すると、次に起動したときから10.2以降のフォーマットでNibファイルを作成するようになります。これでスピニングタイプの表示 もできるようになるはずです。
ただし、このようにすると、作成するNibファイルはすべて10.2以降でしか動かないものになってしまいます。ですので、通常は従来フォーマットと同 じものにしておき、必要なときだけ10.2フォーマットに切り替えるようにするのがよいでしょう。
●リスト7-6 のPOSIX PathからMacのファイルパスへの変換についてリスト7-6でファイルアクセスのサンプルを作成していますが、ここではPOSIX PathをMacのファイルパスに戻す必要があるため、そのハンドラを自作しています。が、「POSIX fileを使えばPOSIX Pathのテキストからfileが取得できる」とのご連絡を頂きましたので、ここに掲載しておきます。(なお、動作チェックは10.2にて行なっていま す)
POSIX Pathで得られたテキストは「as POSIX file」でfileとして取得できます。これを更にas textやas Unicode Textでテキストに変換すれば、通常のHFS形式のファイルパスが得られます。これを利用すれば、POSIXtoMACPATHは例えば以下のように簡 単なものにできます。
on POSIXtoMACPATH(pathStr)
set f to pathStr as POSIX file
set p to f as text
return p
end POSIXtoMACPATH
●Unicode Textが必要なケースについて
本書では、通常のTextとUnicode Textについて「まぁ、だいたいas Textでテキストにして使えば問題ない」と説明しました。基本はそうなんですが、時に「Unicode Textでないといけない」ということがありますので捕足しておきます。
例えば、「ドロップレットで、ドロップしたファイルのパスをテキストアイテムデリミッターで分解する」という処理を考えてみましょう。ファイルのパス は:記号で区切られていますから、これでリスト分解すれば、ディレクトリの各要素が自由に得られるはずです。
ざっと考えるのは、こんな感じのものでしょう。が、実際にやって見ると、これでリストpathitemsに収められるのは、pathStrがそのまま項 目として収められているリストとなります(例 {"BootHD:Users:Taro:Documents:Sample.txt"} といった形)。つまり、:記号でリスト分解されないのです。on open dropItems
set doropedFile to item 1 of dropItems
set pathStr to doropedFile as text -- ★
set AppleScript's text item delimiters to ":"
set pathitems to text items of pathStr
・・・リストpathitemsを使って処理をする・・・
end open
これは、取り出したパスのテキストpathStrをas textしたために生じます。★マークの文を、以下のように修正してみると、うまくいくことがわかります。
「as Unicode text」とユニコードテキストにキャストすることで、きちんとリスト分解し処理できるようになります(例 {"BootHD","Users","Taro","Documents","Sample.txt"} となる)。このように、「as Unicode Textしないとうまく機能しないテキスト処理もある」ということを知っておきましょう。set pathStr to doropedFile as Unicode text
では、なぜ「text」でいい場合と「unicode text」でないといけない場合があるのか。これには、理解しておかなければいけない重要な事実があります。それは、Mac OS XのAppleScript機能には「text(plain text)」でテキストを得るものと、unicode textでテキストを得るものの2種類がある、ということです。要するに、AppleScriptのテキスト関係の機能自体が、2つの異なる(?)働きの ものが1つに組み合わせられてできているのです。それなのに、両者をまとめて「統一された1つのものである」かのように多くの人が錯覚してしまっている、 ここに最大の問題があります。
試しに、Script Editorを使い、「Standard Addition」の用語説明を開いてみて下さい。そこで「chooose file」とか「say」とか、用意されている予約語の説明を調べてみましょう。それらで使われる値はすべて「plain text」とあるはずです。では、「Finder」や、AppleScript StudioのCocoaフレームワークの用語説明を見てみましょう。これらでは、予約語に用いられている値のほぼすべてが「unicode text」(一部、international text)となっているはずです。
つまり、こういうことです。AppleScriptのコア部分のいくつかの機能とStandard AdditionなどMac OS 9からの移植組の機能は、その互換性を保つためからかテキストはplain textが基本となっています。が、Mac OS Xから新たに作られたもの(FinderもXでは完全に新しいものに作りかえられています)は、Mac OS Xのシステムがユニコードを基本としているためからか、テキストはunicode textが基本となっているのです。これらが混在しているのがMac OS XのAppleScriptなのです。
ですので、Mac OS Xでテキストを扱う場合には、そのテキストがplain textかunicode textかを確認するようにしましょう。
●8-2. Dropletプロジェクトのスクリプト設定について
本書では、文字化けしないアプレットを作るために、Project BuilderのDropletプロジェクトを使うことを提案しています。が、10.2では「Project Builderのスクリプトファイルが保存できない問題」のために、スクリプトファイルを一度削除してから再度組み込むことも提唱しています。
というわけで、アプレットを作ろうと思い、Project BuilderでDropletのプロジェクトを作成し、スクリプトファイルの再組み込みを行なってスクリプトを作成することでしょう。すると、なぜか実 行してもidleやopenイベントハンドラが実行されないことに気づくはずです。
これは、スクリプトファイルを一度削除し、再組み込みすると、Interface BuilderでAppleScript設定のスクリプトファイルの設定が初期状態に戻ってしまうためです。Dropletを開発する場合には、スクリプ トファイルの再組み込みをした後、以下の作業をして下さい。
- MainMenu.nibをInterface Builderで開く。
- Nibファイルウィンドウで「File's Owner」を選択し、InfoウィンドウのAppleScriptを開く。
- Applicationの中に「idle」「open」の2つの項目がONになっていることを確認する。
- その下のスクリプトファイルのチェックがはずれているはずなのでONにする。
- すべて保存すれば完了。これできちんとイベントが機能するはずです。
●AppleScript Studioの更なる拡張について
本書では触れていませんが、更なる応用編として「Objective-Cを使って、本来AppleScript Studioにないはずの機能を追加し、スクリプトから利用する」という方法について、AppleScript Studio入門教室の8で触れています。興味の ある方はどうぞ。
※なお、製作ソフトウェアのページにて、「ASKDrawView Kit」という、グラフィック描画コントロールのキットを配付しています。これはAppleScript Studioから利用できるObjective-Cクラスで、AppleScript Studioでグラフィックの描画やイメージの表示を可能にするものです。興味のある方は、こちらか らどうぞ。
★FAQコーナー★
※ここでは、本書の内容についての質問にお答えします。読んでいて不明な点などありましたら、どうぞ掌田津耶乃までお問い合わせください。その場合は、必ずお使いのOSのバージョン など動作環境について明記ください。
●AppleScript Studioは、ハイパーカードの代りになりますか?
答え) ・・・「おいおい、こんな都合のいい質問がほんとに来たのかよ?」と思った人。その通り、筆者のでっちあげです(笑)。けど、そう思ったことはありません か? 私はあります。
AppleScript Studioは、ハイパーカードとはまったく違うものです。アプローチも考え方も全然違いますし、ハイパーカードで簡単にできたことの多くができません。 ですから、ハイパーカードの「代り」とはならないことでしょう。――が、少なくとも「すべてのMac OS Xユーザーが(他の言語に比べれば)割と簡単に専門知識なしにプログラムを作れる環境」であることは間違いありません。このことを、もっと重視すべきで す。私たちは、本当に久しぶりに「誰もが簡単にプログラムを作るための道具」を手にしたのですから。
失ったものは、もう戻っては来ません。無い物ねだりを続けても希望のものが手に入るわけではありません。AppleScript Studioは、今、現に私たちの手の中にあるのです。ならば、使いましょう。ハイパーカードの代りとなりうるものか、使わってみなくちゃわからないんで すから。ね?
●先にCocoa-Javaの本も出され てますが、ほんとのところ、AppleScriptとどっちがいいですか?答え) こういう「Cocoa開発には、ほんとはどれがいいんですか?」という質問はけっこうあるのですが、これはなんともご返事のしようがありません。「何を重 視するかによって違う」からです。もし、Javaの基礎知識があるのなら「Javaがいい」でしょうし、Cの基本がわかるなら「Objective-Cが いい」でしょう。が、「プログラミング言語なんて本格的に勉強したことなどほとんどない」というなら、「AppleScriptが一番」だろうと思いま す。
AppleScript Studioは、完璧なものではありません。いえ、どちらかというと「かなり荒削りで、使えない機能が山ほどある」ものなのです。が、Objective -CやJavaなどとは比較にならないぐらい簡単であることも確かです。そのどちらを重視するかで、あなたが選ぶべき言語は決まります。・・・個人的に は、最初から難しいものに挑戦して挫折するよりも、まず簡単なものから始めて「プログラミングというのがどんなに楽しいか」をよくわかってから次へ進むの がよいと思いますよ。
●特に第2部なんですが、バージョンがい くつだとどうだ〜というのが多くてわかりにくいです。
答え) これは、おっしゃる通りで大変申し訳ないと思っています。AppleScript Studioは、ver. 1.0, 1.1, 1.2で微妙に変わっています。単に機能が増えただけでなく、「変わっている」のです。つまり1.0のやり方が1.1では違っていたり、1.2では別のや り方が用意されたりということがあちこちであるのです。
わかりやすくするのであれば、「10.2以降のみ対応」としてAppleScript Studio 1.2だけの内容にすればすっきりしたでしょう。しかし、現状ではまだまだ10.1は使われており、それらを使う多くのユーザを切り捨てるわけにはいきま せん。このため、あちこちに「ver. 1.1では〜」とか「ver. 1.2では〜」といった注釈だらけのスタイルになってしまいました。わかりにくいですが、やむを得ない措置だったと考えて下さい。
●プロジェクトをビルドしたら、数Mbもの巨大アプリになってしまっ たんですが。
答え)これは、リンク情報の不具合からか、不要なライブラリをぶらさ げたままプログラムファイルが作成されてしまうためのようです。そうすると、1つのアプリが数Mbに巨大化してしまうことがあります。「build」フォ ルダ内のものを全て削除し、再度ビルドしてみて下さい。
●付属のCD-ROMに入っているアプレットがうまく起動しません。
答え)おそらく、10.2を使っているためでしょう。本書は 10.1.5以降で動くように考えてあるため、10.2で使う場合には一度アプレットを再保存しないといけません。本書のAppendix 2で、プロジェクトが動かない場合の対応について説明していますので、そちらを参照下さい。
●6-2. マトリックスとセルで、「セルは『軽い』」ってどういう意味?
応え)セルと通常のコントロールの違いについての説明で、「セルの方が軽い」といっていますが、「軽い」とは「メモリとCPUをそれほど消費しない」とい うことです。あるオブジェクトが長いコードで実現されており、何かの操作をする度に膨大な処理を行なうようになっていた場合と、それより遥かに短いコード で作られていて同じ操作もはるかに短い処理ですむ場合を比較して考えてみて下さい。セルと通常のコントロールの違いは、そういうことと考えればよいでしょ う。
プログラムの世界では、よく「軽い、重い」という表現をするのであまり気にせず使ってしまいましたが、馴染みのない人もいることと思います。これは、そ ういう意味合いと考えて下さい。
●Interface Builderで保存する時に「Save Documents」ってアラートが現れます。本にはこの説明がないのですが、これは何でしょう?
![]()
答え) これは、Mac OS X 10.2より、Interface Builderが新しいフォーマットになっていることが原因です。例えば新しいフォーマットからサポートされているコントロールを使用しているのに、 Interface Builderでデフォルトの保存フォーマットが古いものになっていたりすると、こうした確認のアラートが現れるわけです。
「Preferences」メニューを選び、現れたウィンドウの「General」にある「Nib File Compatibility」というところをチェックして下さい。これを「Boss Format」にしておけば、両方のフォーマットを利用可能になります。
GO BACKGO HOME