GO BACK

AppleScript Studio教室 その5

「UNIXコマンドを使おう!」



■UNIXコマンドを利用する

 さて、普通ならばこのへんでCocoaのコントロールの使い方をずらずらと説明していくのでしょうが、正直いってめんどくさいです(笑)。それに、意味もなく部品の使い方ばかり説明されてもつまらないでしょう? ——たぶん、AppleScriptを勉強してみようと思う人の最大の不安要因は「実用になるものが作れるのか?」ということでしょう。そこで、簡単なアプリを作りながら、必要な部品はその都度説明していくことにします。

 AppleScript Studioで作れる、もっとも簡単で実用的なアプリ、それは「UNIXコマンドを利用したもの」でしょう。Mac OS Xは、ご存じのようにUNIXをベースに構築されています。そのため、さまざまなUNIXコマンドを内部に持っているのです。中にはターミナルを使ってコマンドを利用してみた人もいることでしょう。

 多くのMac OS Xユーザーは、いくら「用意してある」からといってUNIXコマンドなんて使いません。だって、せっかくMacを買ったのに、何が悲しゅうてコマンド入力なんてせにゃならんのです? ——そこに、AppleScriptの介入する余地があります。AppleScriptには、UNIXコマンドを実行するための命令が用意されているんです。そして、AppleScript Studioを使えばボタンやテキストフィールドも自由に使える。ということは? 「肝心の機能はUNIXコマンドにやってもらって、そのインターフェイスを用意する」だけで、ちょっとした実用アプリが作れてしまう、ということになります。

 AppleScriptからUNIXコマンドを実行する命令は、以下のようなものです。

do shell script 《実行するコマンドのテキスト》

 ここで《》部分に実行するコマンドの文を指定すれば、それが実行されます。また、コマンドの中には様々な値を返すものもありますが、そうしたものはこの命令実行直後にresultを使って得ることができます。

 では簡単な例として、「超簡単電卓」を作ってみましょう。——では、AppleScript Studioのアプリケーションプロジェクトを新しく作成して下さい。そして、デザインウィンドウに以下のように3つの部品を作製します。

・NSTextFieldを2つ
 これは、既に使ったことのある部品ですからわかりますね。テキストの編集可能なNSTextFieldを2つ配置します。これは、計算する式を入力するためのものと、結果を書き出すために使うものです。式の方は少し大きめにしておきましょう。
 そしてAppleScriptの名前を、式用を「f_field」、答え用を「q_field」と設定しておきます。

・NSButtonを1つ
 計算を実行するためのボタンです。プッシュボタンタイプのものを1つ作成し、Titleを「計算」とでもしておきましょう。そしてAppleScriptの名前を「calcbtn」とし、clickedイベントと使用するスクリプトファイルのチェックをONにしておきます。

 そして、配置しているウィンドウのAppleScriptの名前を「win1」と設定し、部品類は出来上がりです。後はProject Builderに戻り、NSButtonのclickedイベントハンドラを記述するだけです。これは以下のようになります。

on clicked theObject
if name of theObject is "calcbtn" then
set str1 to string value of text field "f_field" of window "win1"
do shell script "echo" & space & "'" & str1 & "' | bc"
set ans to result
set contents of text field "q_field" of window "win1" to ans
end if
end clicked


 たったこれだけです。できたらプロジェクトをビルド&実行してみましょう。そして式のテキストフィールドに計算する式(+−*/()^といった演算記号が使えます)を入力し、ボタンを押すと、計算結果が答えのテキストフィールドに書き出されます。いわゆる電卓と違い、式を直接テキストで書き込めるので、けっこう便利でしょ?

式の結果を表示する


 これは、「bc」という式のテキストを計算するコマンドを使ったものです。まずtext field "f_field"からstring valueを取りだし、それを元に以下のようにしてコマンドを実行しています。

do shell script "echo" & space & "'" & str1 & "' |bc"

 このコマンドは、「echo 《式のテキスト》 | bc」と実行することで、式のテキストを計算した結果を出力します。それをresultから変数に取り出し、contents of text field "q_field"に設定しているだけです。実に簡単ですね? なお、途中にあるspaceというのは、半角スペースを示す定数です。別に " " と半角スペースのテキストをそのまま書いてもかまいません。好みで使って下さい。

 UNIXコマンドは、実にたくさんのものが標準で組み込まれています。それを、たった1行のdo shell script文だけで、こんなに簡単に利用できてしまうのです。なんだか、誰にでも実用アプリが作れそうな気がしてきたでしょう?


■超簡易カレンダーを作る

 基本がわかったら、もうちょっと実用的なものを作ってみましょう。例えば、「超簡易カレンダー」なんてどうでしょう?——まず、AppleScript Studioのアプリケーションプロジェクトを新規に用意して下さい。そしてデザインウィンドウに、以下の4つの部品を配置します。

・NSText Fieldを2つ
 テキスト編集の可能なNSTextFieldを2つ配置して下さい。これは、年と月の数字を入力するためのものです。それぞれ、AppleScriptの名前を「yfield」「mfield」としておきましょう。
 また、わかりやすくするために、更にテキスト編集のできないNSTextField(System Font Textと表示されたもの)を使って「年」「月」というテキスト表示を作り、yfieldとmfieldの横に配置しておくとよいでしょう。

・NSButtonを1つ
 カレンダーを表示するためのボタンです。通常のプッシュボタンのTypeのものを1つ配置し、Titleに「表示」とでも設定しておきましょう。そしてInfoウィンドウの「AppleScript」を表示し、名前を「calbtn」に、clickedイベントとスクリプトファイルのチェックをONにしておきます。

・NSTextViewを1つ
 これは初めて登場する部品です。ツールパレットの左から5番目のアイコンの中にあります。右上のテキストがいろいろ書き込まれた部品が、NSTextViewです。

NSTextViewの部品

 この部品には、いろいろなオプションが用意されています。詳細は後で説明するので、とりあえずNSTextViewを配置して適当な大きさに調整し、Infoウィンドウで以下のアトリビュート(とAppleScript設定)を変更して下さい。


 以上、部品の設定が一通りできたら、例によってウィンドウのAppleScriptの名前を「win1」として作業終了です。後は、Project Builderに戻って、clickedハンドラに以下のスクリプトを記述すれば完成です。

on clicked theObject
if name of theObject is "calbtn" then
tell window "win1"
set y to integer value of text field "yfield"
set m to integer value of text field "mfield"
do shell script "cal" & space & m & space & y
set ans to result
set contents of text view "caltext" of scroll view "calscroll" to ans
end tell
end if
end clicked


 これで、プロジェクトをビルド&実行してみて下さい。そして現れたウィンドウで年と月を入力し、ボタンをクリックして下さい。その年月のカレンダーが表示されますよ。たったこれだけのスクリプトで、割とまともなカレンダーソフトが作れてしまうなんて、すごいじゃないですか!

カレンダーの実行画面


■NSTextViewとcalコマンド

 さて、ここではまず「NSTextView」というものが登場しました。これについてから説明してましょう。——これは、長いテキストを扱うための専用部品です。テキスト関係としては「NSTextField」というのが既に登場しましたが、これは1行のテキストを入力するためのものでした。何行にも渡るような長いテキストや、リッチテキストなどを扱う場合には、このNSTextViewが用いられるのです。

 このNSTextViewは、長い文を扱えるようにするため、ちょっと面白い構造になっています。まず「NSScrollView」というスクロールバーを持った部品があり、その中にNSTextViewというテキストを扱う部品が組み込まれた形になっているのです。こうすることで、長い文章の場合には自動的にスクロールバーが表示されスクロールしながらテキスト編集ができるようになっているのですね。

 このスクロール用の部品NSScrollViewの中にNSTextViewが組み込まれているという構造を、よく頭に入れておいてください。でなければ、NSScrollViewが選択されているのに勘違いして「NSTextViewを設定しているのだ」と思ってしまったりするかも知れません。

 マトリックスのところで「内部に組み込まれている部品を選択するには、部品を選択してから更にダブルクリックする」といいました。このことは、他の部品でも共通しています。ある部品の中に更に部品が組み込まれているときは、ダブルクリックすることで内部の部品が選択できるのです。

 従って、NSTextViewの設定などを行なう場合には、まずNSTextViewを選択し、(この段階では外側のNSScrollViewが選択されているので)更にダブルクリックすると内側のNSTextViewが選択できるわけですね。——実はアトリビュートに関してはNSScrollViewは表示されないので、ただ選択するだけでNSTextViewのアトリビュートが設定できるようになるのですが、AppleScriptの設定などを行なう場合には「ダブルクリックして内側の部品を選択する」ということをよく頭に入れて作業しないといけません。

 では、NSTextViewに用意されている主な部品について、ここで簡単にまとめておきましょう。

 ざっとこのぐらい覚えておけばいいでしょう。今回、カレンダーは半角のテキストでないときれいに表示されないので、Multiple Font AllowedをOFFにしてフォント変更できないようにしたわけですね。

 もう1つ、do shell scriptで使っているコマンドについても触れておきましょう。これは「cal」というものです。これは以下のような形で呼び出します。

cal [ 月 年]

 単に「cal」と実行すれば、現在の月のカレンダーのテキストを返します。また「cal 1 2002」というようにすると、2002年1月のカレンダーを返します。

 ここでは、月と年のテキストフィールドの値をそれぞれ変数におさめ、「do shell script "cal" & space & m & space & y」という形で実行していますね。これで特定の年月のカレンダーデータのテキストが返ります。

 あとは、返されたresultを変数に取り出し、NSTextViewのcontentsに設定しているだけです。この部分を見ると、「contents of text view "caltext" of scroll view "calscroll"」というように、NSScrollViewの中のNSTextViewという形で記述していることがわかるでしょう。このscroll view "calscroll"の部分を忘れると、スクリプトはうまく動かなくなります。

 Cocoaのコントロールは、組み込みの状態をきちんと指定しないといけません。先ほど「NSScrollViewの中にNSTextViewが組み込まれていることを忘れるな!」といったのは、それがわかってないとスクリプトできちんと参照できないからなのですね。

 また、ここでは「tell window "win1"」というようにして、window "win1"に対して命令を送っていますね。Cocoaの場合、部品の組み込み状態が複雑になってくると「○○ of ○○ of ○○ of ・・」と長い長い参照を書かないといけなくなってしまいます。そこで、適当なオブジェクトに対してtellするようにするわけです。そうすれば、tell構文内は、そのオブジェクト内の指定だけ書けば済むようになります。例えば、

・set X of ABC of EFG of XYZ to "A"

  ↓

・tell XYZ
  set X of ABC of EFG to "A"
 end tell

  ↓

・tell EFG of XYZ
  set X of ABC to "A"
 end tell

  ↓

・tell ABC of EFG of XYZ
  set X to "A"
 end tell

 ——これらは、すべて同じことをしている、ってことがわかりますか? こんな具合に、適当なオブジェクトにtellすることで、そのオブジェクト内の処理の記述を簡略化することが可能なのです。Cocoaのコントロールを多用するようになってくると、こうしたtellの利用はわかりやすいスクリプトを書く上で重要になってきます。今の内から、こうした「オブジェクトにtellする」というやり方に慣れておくとよいでしょう。

 

GO NEXT


GO HOME