←前回

短期集中連載

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

 

第3回 AppleScript Studioの拡張と可能性を考える


■ネットワークを利用する

 今回は、AppleScript Studioを更に拡張していく方法について紹介していこう。まずはネットワークを利用する方法について。

 インターネットが普及した現在、プログラムを作る際には「ネットワークを利用する」ということは非常に多い。AppleScriptの場合、ネットワークを利用した機能はいくつか用意されている。ざっと整理するとこんな感じだろうか。

  • インターネットロケーションファイルと呼ばれる特殊なファイルの形でURLを保存したり、それを開いてWebブラウザで表示させたりできる
  • ファイルのアップ/ダウンロードを行なう命令を持っている
  • XML-RPC 、SOAPのサーバーをスクリプトから呼び出せる
  • (後述する)UNIXコマンドの形でネットワーク関係の機能を呼び出す

 Mac OS XにおけるAppleScriptのネットワーク機能は、簡単なファイルのやりとりやSOAPサーバーの利用など以前よりずいぶんと強化されたが、それでも独自のネットワーク機能を構築したりできるわけではない。例えば、簡単なファイル転送プログラムは作れるだろうが、AppleScript単体でクライアント&サーバー型プログラムなどを作るのはかなり難しいだろう。

【画面1】
SOAPサーバーにレート情報を問い合わせて表示するプログラム。こうした簡単なネットワーク利用のプログラムも作れる

 では、具体的にこれらの機能を利用している例として、SOAPサーバーを使って現在のドル/ユーロのレートを表示するプログラムを挙げておこう(図1)。このプログラムで、SOAPサーバーからレート情報を受け取っている部分のスクリプトはリスト1のようになっている。なお、「--」で始まる行はコメント文だ。


【リスト1】


01 -- 貨幣単位と値をおさめるリスト
02 property country : {"usa", "euro"} -- 米ドルとユーロ
03 property retenum : {0, 0}
04 
05 --  SOAPサーバーからレート情報を得る処理
06 try
07     with timeout of 60 seconds
08         -- これよりサーバーに問い合わせ
09         tell application "http://services.xmethods.net:80/soap"
10             repeat with i from 1 to (country count)
11                 set cname to item i of country
12                 -- サーバーから情報を受け取り変数retenumの指定の場所におさめる
13                 set item i of retenum to call soap {method name:"getRate",
14                 method namespace uri:"urn:xmethods-CurrencyExchange",
15                 SOAPAction:"", parameters:{country1:cname, country2:"japan"}}
16             end repeat
17         end tell
18     end timeout
19 end try

※11~15行目は改行せず、1行で書いてください(ここではレイアウトの都合上、改行しています)



 抜粋なので、これだけでこのプログラムが動くわけではないが、利用がどのようになっているかイメージできるんじゃないだろうか。上のスクリプトからSOAPを利用している部分だけを抜き出して整理すると、こんな感じで実行されているのがわかるはずだ。


01 tell application "……SOAPサーバーのURL指定……"
02     set 変数 to call soap {method name:メソッド名,
03     method namespace uri:Method Namespace URIの指定,
04     SOAPAction:SOAPActionの指定, parameters:{パラメータの指定}}
05 end tell
※2~4行目は改行せず、1行で書いてください(ここではレイアウトの都合上、改行しています)



 SOAPに問い合わせを行なう場合に必要な情報をcall soap {……}という形でまとめ、それを「tell application サーバー」という形でサーバーに送っている。実際には、利用するサーバーに必要な各種情報を調べないといけないが、少なくともそうしたアクセスのための情報さえわかれば、比較的簡単にスクリプトから利用できることはわかるだろう。

■UNIXコマンドをスクリプトから利用する

【画面2】
UNIXコマンドを利用した画面キャプチャ。ウィンドウ単位で保存できる

 Mac OS XはUNIXの技術を用いて作られている。このことを多くのユーザーは案外忘れている。だがAppleScript Studioを使っているなら、この重要な事実を思い出すべきだ。AppleScriptでは、UNIXコマンドを簡単にスクリプトから呼び出すことができるからだ。

 その簡単な利用例として、画面のキャプチャを保存するソフトを挙げておこう(図2)。これは、全画面、選択範囲、選択ウィンドウのいずれかをキャプチャし、PDFファイルとしてデスクトップに保存するツール。このソフトの、キャプチャを行なっている部分はリスト2のようになっている。


【リスト2】


on doCap()
    -- 保存するファイルのパスを変数pに用意
    set p to string value of text field "pathtxt" of window "win1" & "/"
    set p to p & "capture" & fnum & ".pdf"
    set t to ""
    -- ラジオボタンによりオプションの文字列を変数tに設定
    set cc to name of current cell of matrix "targetmatrix" of window "win1"
    if cc = "screen" then
        set t to "-m"
    else if cc = "selection" then
        set t to "-is"
    else if cc = "window" then
        set t to "-iW"
    end if
    -- UNIXコマンドを実行
    do shell script "screencapture" & space & t & space & p
    set fnum to fnum + 1
end doCap



 画面キャプチャを行なうのは、Mac OS Xに用意されている「screencapture」というUNIXコマンド。これは、オプションの指定により、全体をキャプチャしたり、マウスで選択した領域やウィンドウだけをキャプチャしたりできる。これを「do shell script」という命令で実行している。これがUNIXコマンドを実行するためのもので、こんな形で呼び出す。


do shell script "…実行するUNIXコマンド…"



 実行するコマンドを、テキストとして渡すだけで、それを実行する。もちろん、実行後に値を返すようなものはそれを受け取ることもできる。

 Macユーザーは「コマンドを打ち込む」ということに拒否反応を示す人が多く、多くのユーザーはコマンドなどとは無縁でいる。が、AppleScript Studioできれいなインターフェイスをつけてあげれば誰でも使うことができる。これだけでも、「AppleScript Studio+UNIXコマンド」の意義は大きいだろう。

■AppleScript Studioにない機能を呼び出す

【画面3】
AppleScriptだけで書いたマルバツ・ゲーム。本来ならば不可能なはずの描画も、call methodを使えばこの通り

 AppleScript Studioでは、まだサポートされていない機能が数多くある。その中でもっとも重要なものといえば「グラフィック」だろう。AppleScript Studioでは、グラフィックの描画が行なえないのだ。

 だが同時に「使えない機能を使えるようにするための仕組み」もAppleScript Studioには備わっている。それが「call method」と呼ばれるものだ。これはCocoaフレームワークのクラス内にあるメソッドを呼び出す命令で、これによりAppleScript Studioにない機能でもフレームワークから直接利用できるようになる。

 図3は、このcall methodを利用し、すべてAppleScriptだけで作成したマルバツ・ゲームだ。ウィンドウ上をクリックしてコンピュータと対戦できる。

 このプログラムで、円や線を描画している部分だけを抜き出してみるとリスト3のようになる。


【リスト3】

01 -- 指定した2点を結ぶ線を描くハンドラ
02 on drawLine(x1, y1, x2, y2, w)
03     -- ベジエ曲線オブジェクトを作る
04     set bz to call method "bezierPath" of class "NSBezierPath"
05     -- 線の太さを設定
06     call method "setLineWidth:" of bz with parameters {w}
07     -- 描画地点を移動
08     call method "moveToPoint:" of bz with parameters {{x1, y1}}
09     -- 指定地点までの線を作成
10     call method "lineToPoint:" of bz with parameters {{x2, y2}}
11     -- 作成されたベジエ曲線を描画
12     call method "stroke" of bz
13 end drawLine
14 
15 -- 指定した領域に円を描くハンドラ
16 on drawOval(x1, y1, x2, y2, w)
17     -- 指定領域に描く円のベジエ曲線オブジェクトを作成
18     set bz to call method "bezierPathWithOvalInRect:"
19     of class "NSBezierPath"
20     with parameters {{x1, y1, x2, y2}}
21     -- 線の太さを設定
22     call method "setLineWidth:" of bz with parameters {w}
23     -- 作成されたベジエ曲線を描画
24     call method "stroke" of bz
25 end drawOval
※18~20行目は改行せず、1行で書いてください(ここではレイアウトの都合上、改行しています)



 「call method」という文がずらりと並んでいることがわかるだろう。これは、ざっと整理すれば以下のような形で書かれている。


call method "…メソッド名…" of クラス/オブジェクト with parameters { …パラメータの指定… }



 もちろん、メソッド名やパラメータなどは別途調べないといけないが、それらさえわかれば、このようにしてAppleScriptから利用できるのだ。これでCocoaの描画関係の機能を呼び出し、本来ならばAppleScriptで実現不可能なグラフィックの描画を可能にしていたわけというわけ。

 call methodは万能ではなく、これでも利用できない機能はある。そうした場合には、Objective-Cで必要な部分だけを定義し、それをcall methodから呼び出すこともできる。「AppleScript Studio+Objective-C」という開発スタイルは、今後広く使われそうだ。

 なお、ここで紹介した3つの完成プログラムをダウンロードできるようにした。参考にしていただきたい。

□サンプルプログラムのダウンロード
http://pc.watch.impress.co.jp/docs/2003/0214/sample.sit

◆     ◆     ◆

……というわけで、3回に渡って集中的に「AppleScript Studio」というMac OS Xの開発環境について説明してきた。「だいたいこんな感じ」という大ざっぱな話しかできなかったので、なんだかよくわからないまま終わってしまった人も多かったことだろう。

 ただ、少なくとも「全Mac OS Xに標準で用意されている、簡単にアプリケーションを作れる環境」というのがどんなものか、その概要ぐらいは見えてきたことと思う。これが一般ユーザーの間に浸透し、「Mac OS Xでは、誰もが当たり前のように、必要なアプリケーションを自分で作っている」という時代になったら……。そんな淡い期待を抱かせてくれる開発ツール、それがAppleScript Studioなのだ。

□関連記事
【1月28日】【AppleScript】第2回 Cocoaアプリを作成する
http://pc.watch.impress.co.jp/docs/2003/0128/apple2.htm
【1月21日】【AppleScript】第1回 AppleScript Studioってなんだ?
http://pc.watch.impress.co.jp/docs/2003/0121/apple1.htm

(2003年2月14日)

[Text by 掌田津耶乃]


【PC Watchホームページ】


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

Copyright (c) 2003 Impress Corporation All rights reserved.