←前回

短期集中連載

Mac OS X開発の秘密兵器
「AppleScript Studio」

 

第2回 Cocoaアプリを作成する


■シンプルな計算機を作る

 前回、AppleScript Studioがどういうものか簡単に紹介したが、あれだけでは具体的にどのようなものなのかイメージしにくかったことだろう。今回は、実際にアプリケーションを作成しながら、開発の仕組みを見ていくことにしたい。

 例として作成するのは、簡単な電卓プログラムだ。数字と四則演算のキーが並び、それらを押して入力し計算を行なう。ただし、普通の入力方式だとちょっとスクリプトが面倒になるので、いわゆる逆ポーランド方式(数字を入力して演算キーを押すと、既にある結果に対して演算を行なう)のものにしよう。では、順を追って説明していきたい。

・プロジェクトの作成

 開発は、まずProject Builderを使ってプロジェクトを作成するところから始まる。Project Builderから「新規プロジェクト」メニューを選ぶと、作成するプロジェクトの種類を選択する画面が現れる(画面1)。ここで「AppleScript Application」というのを選び、名前などを入力すると、AppleScript Studioによるアプリケーションのプロジェクトが作成される。

 作成されたプロジェクトには、AppleScriptのスクリプトファイルの他、さまざまなファイルがあらかじめ用意される。中でも重要なのは「MainMenu.nib」というファイルだ。これはInterface Builderのファイルで、このアプリケーションで使われるウィンドウ/メニューといったGUIのデータが組み込まれているファイルなのだ(画面2)。

【画面1】
Project Builderでは、新規プロジェクトを作成する際、このようなアシスタントが現れ、ここから利用するプログラムのタイプを選ぶ
【画面2】
作成されたプロジェクトには、初期状態で必要なファイル類が組み込まれている。この内、「Script」フォルダにはいっているのがスクリプトファイル、「MainMenu.nib」がGUIデータのファイルだ

・インターフェイスのデザイン

 このMainMenu.nibファイルをダブルクリックすると、Interface Builderが起動し、何もないウィンドウ1枚からなるGUIのデザイン画面が現れる。このウィンドウにさまざまな部品を配置して画面をデザインしていく。

 部品の配置は、「パレット」と呼ばれる部品のテンプレート集から必要なものをマウスでドラッグ&ドロップして行なう。このパレットは部品の種類ごとにジャンル分けして整理されており、初期状態で50個以上のものが用意されている。

 今回は、「NSTextField」というテキストを入力/表示する部品を2つと、「NSMatrix」という複数の部品を配列のように組み込んで利用する部品を2つ作成してみた。画面3が、ウィンドウに部品を配置した状態だ。ややわかりにくいが、ずらりと並ぶボタン類のうち、数字キーと「C」「AC」キーは縦4列×横4行にボタンを並べたNSMatrix、四則演算キーは縦1列×横4行に並べたNSMatrixとなっている。NSMatrixは、こんな具合にいくつもの部品を一元的に管理できるのだ。

【画面3】
Interface Builderで、電卓のウィンドウをデザインした状態。右側に見えるのがパレットで、ここから部品をドラッグして配置する

・配置した部品の設定

 作成した部品は、Infoウィンドウというものを使って細かな設定を行なえるようになっている。画面4が、設定中の画面だ。これはNSMatrix内に組み込まれているボタンの1つを選択し、その表示テキストを変更しているところ。右にあるInfoウィンドウに、選択した部品に関する細かな設定情報が表示されているのがわかるだろう。このようにInterface Builderでは「編集する部品を選択する」「その部品の設定がInfoウィンドウに現れる」「設定を変更する」という手順で、部品の細かな状態や動作を変更できる。

 ここまでの作業は、AppleScript StudioだけでなくProject BuilderとInterface Builderを使ったすべてのアプリケーション開発で共通している。どんな開発言語を使う場合でも、これらの作業はまったく同じなので、使う言語に関わりなく情報交換やデザインしたGUIデータのやり取りが可能になる。Javaで開発していたプログラムのGUIをAppleScript Studioで再利用する、なんてことが簡単に行なえるのだ。

【画面4】
Interface Builderで、電卓のウィンドウをデザインした状態。右側に見えるのがパレットで、ここから部品をドラッグして配置する

■AppleScript Studio特有の作業

 基本的なデザインができたら、次にソースコード(AppleScriptのスクリプト)の作成をする。ここで、AppleScript Studioとその他の言語では作業が分かれてくる。

 他の言語(Objective-CやJava)の場合、「接続」と呼ばれる方式で、使用するオブジェクトやイベント類を関連づけていく。これはCocoaアプリケーション特有のもので、作成したプログラム(クラス)内のメソッドや変数が、デザインしたGUIのどの部品やイベントに相当するかということを1つ1つ関連づけていくのだ。これは、まぁ慣れてしまえば直感的でわかりやすいのだが、初めて開発を行なう人には何をやってるのかさっぱりわからない感がある。少なくとも、その原理をしっかり理解しておかないと自由に扱えるようになるのは難しいだろう。

 AppleScript Studioの場合は、もっと直接的で明確だ。Infoウィンドウに用意されているAppleScript専用の設定画面を呼び出し、そこに表示される一覧から使用するイベントとスクリプトファイルをチェックしていけばいいのだ(画面5)。実にわかりやすい。

【画面5】
Infoウィンドウから「AppleScript」という項目を選択すると、選択した部品で使用するイベントとスクリプトファイルの設定を行なえるようになる

 AppleScript Studioの場合、「あらかじめ用意されたイベントの中から必要なものを選んで使う」という仕組みなので、このような「一覧から選ぶ」というシンプルな設定で済んでしまう。反面、用意されているもの以外はまったく使えない。このあたりの割り切りのよさがAppleScript Studioの長所でもあるし欠点でもある。「ここまではできます、ここから先は一切できません」というのがはっきりしていて、できる範囲内では非常にわかりやすく単純に設計ができるように考慮されているのだ。

 こうしてAppleScriptに関する設定が完了したら、最後にProject Builderに戻ってスクリプトを記述すればいい。あらかじめ用意されているスクリプトファイルを開き、そこにスクリプトを書き込むのだ。今回の電卓アプリのスクリプトを以下にあげておこう。

【リスト】

on clicked theObject
    set keyname to title of current cell of theObject
    if name of theObject is "numButton" then
        typeNum(keyname)
        set keyflag to true
    else if name of theObject is "calcButton" then
        tell window "calc"
            set lastNum to double value of text field "answer"
            set calcNum to double value of text field "input"
        end tell
        if keyname is "+" then
            set lastNum to lastNum + calcNum
        else if keyname is "-" then
            set lastNum to lastNum - calcNum
        else if keyname is "*" then
            set lastNum to lastNum * calcNum
        else if keyname is "/" then
            set lastNum to lastNum / calcNum
        end if
        set calcNum to 0
        tell window "calc"
            set double value of text field "answer" to lastNum
            set double value of text field "input" to calcNum
        end tell
    end if
end clicked

on typeNum(keyname)
    tell window "calc"
        if keyname is "C" then
            set double value of text field "input" to 0
        else if keyname is "AC" then
            set double value of text field "input" to 0
            set double value of text field "answer" to 0
        else
            set calcNum to double value of text field "input"
            set calcNum to calcNum * 10 + keyname
            set double value of text field "input" to calcNum
        end if
    end tell
end typeNum

 AppleScriptのスクリプトは「ハンドラ」と呼ばれるものの集まりとして構成されている。ハンドラというのは、一般にサブルーチンとかメソッドといったものに相当するもの。1つのスクリプトファイルには複数のハンドラが用意でき、必要に応じてハンドラを呼び出して処理を実行する仕組みになっている。

 ハンドラは、通常「on ハンドラ名」で始まり「end ハンドラ名」で終わる。つまり、ここでは「clicked」「typeNum」という2つのハンドラが用意されているわけだ。clickedハンドラはボタンをクリックした時に呼び出されるもので、typeNumは数字キーを押したときの処理をまとめたものだ。

 詳細は脇に置くとして、スクリプトを記述して完成したプロジェクトを実行してみよう。画面6が起動した電卓アプリの画面だ。数字を入力し、「+」ボタンを押すと、その数字が上段の数字に加算される。同様に「数字を入力して演算キーを押すと、下段の数字が上段の数字に演算される」という形で計算がされる。慣れるまではちょっとわかりにくいかも知れないが、「この程度のスクリプトで十分使える電卓が作れるのだ」ということは感じてもらえただろう。

【画面6】
完成した電卓アプリ。数字キーを押すと下の段に数字が表示され、演算キーを押すとその値と上の値を演算した結果を上の段に表示する

■AppleScript Studioの用途とは?

 今回のスクリプトは、基本的に「2つのフィールドから数字を取り出す」「押したボタンのタイトルを調べ、それに応じて計算の処理をする」「最後に変更された値をそれぞれフィールドに書き出す」という作業を、押したボタンの種類に応じて行なっているだけだ。AppleScriptの具体的な文法などはわからなくとも、リストをよく読めばやっていることはなんとなく想像がつくはずなので、ざっと眺めてみて欲しい。

 ざっとアプリ作成の過程を紹介したが、開発部分に関しては非常にわかりやすくできていることはわかった。では、作られたプログラムに欠点などはないのだろうか。

 実際に使ってみると、それほど多量の処理でなければ、ほとんど一般的なアプリと変わらないレベルで動くことがわかる。メニューやウィンドウといったものはまったく普通のアプリと変わらず使えるし、反応も速い。

 だが、実際の処理速度は本格言語で作られたプログラムと比べるとかなり劣る。例えば数十MBのテキストを処理するような場合、perlなどを使えばあっという間のものがAppleScriptでは数分かかる、ということもザラだ。そういう点では、AppleScript Studioは向き不向きがはっきりした開発環境といえる。

 コンピュータを使っていると、多量のデータを処理したり、同じことを何度となく繰り返して行なったりすることがよくある。それほど複雑ではないけれどかったるい作業。

 そうしたものをちょちょいとやってくれる簡単なプログラムがあれば……と思っても、「じゃあC言語で書けば?」といわれては困ってしまう。例え本格言語をかじったことがあっても、そんなものに仕事を放り出して3日も徹夜しなきゃならないとしたら、毎日「面倒だ」とぼやきながら、かったるい作業を続けたほうがマシと思うだろう。

 だが、「3時間もあれば作れる」というならどうだろう。ちょっと作っておくか、という気になるんじゃないだろうか。AppleScript Studioは、まさにそうしたことにうってつけのものなのだ。

 さて、次回はUNIXコマンドやSOAPサーバの利用、Cocoaフレームワークを直接コールするテクなどを紹介し、AppleScript Studioの可能性について検証していこう。

□関連記事
【1月21日】【AppleScript】第1回 AppleScript Studioってなんだ?
http://pc.watch.impress.co.jp/docs/2003/0121/apple1.htm

(2003年1月28日)

[Text by 掌田津耶乃]


【PC Watchホームページ】


PC Watch編集部 pc-watch-info@impress.co.jp 個別にご回答することはいたしかねます。

Copyright (c) 2003 Impress Corporation All rights reserved.