ネットワーク上のアプリケーションを操作する

1997.3.31


 AppleScriptでは、ローカルマシン上のアプリケーションだけでなく、ネットワーク上のアプリケーションもAppleTalk経由で操作することができます。ここではリモートマシンを操作する方法と注意点を述べます。


下準備

 とりあえずハードウェア的にネットワーク環境が正しく構築されている必要があります。ネットワークはEtherTalkでもLocalTalkでも問題なく使用できます。またソフトウェア的には次の項目をチェックしておいて下さい。

  1. ローカルMacとリモートMacの両方がAppleTalkを使用していること
  2. ローカルMacとリモートMacの両方にAppleScriptがインストールされていること
  3. 自分がリモートMacの利用者であり、利用者設定で「プログラムリンク」がチェックされていること
  4. リモートMacの共有設定で、プログラムリンクが開始されていること

 以上が正しく設定されていれば、リモートMacを操作することができます。


基本的な操作

 別に難しいことはなにもありません。操作したいアプリケーションを

application "AppName" of machine "MachineName" [ of Zone "ZoneName" ]

 と指定するだけです。マシン名やゾーン名を覚えていない場合は、「choose application」命令を使えば簡単に知ることができます。一度「choose application」を実行してみればどんな風に使うかはすぐ分かるでしょう。

 さて、実際にリモートマシンのアプリケーションに命令を送ってみましょう。次の例では、リモートマシン「Performa 520」のFinderに命令を送ります。

  tell application "Finder" of machine "Performa 520"
    list folder (path to extensions folder)
  end tell

 これを実行すると、リモートマシンのFinderはそのマシンの機能拡張フォルダの内容をリストにして返します。ローカルマシンのアプリケーションに命令を出すのと全く同じですよね。


問題点

 上の例を実行してみると分かりますが、初めてスクリプトを実行するときはリモートマシンがかならずパスワードを訊いてきます。これは操作するアプリケーション毎に行われるため、5つも6つものアプリケーションを操作しようとすると非常に面倒です。特にアプレットでリモートマシンを操作しようとした場合、アプレットを起動する度にすべてのアプリケーションに対してユーザ確認を行わなければならないため、操作が非常に煩雑になります。

 また、スクリプトをコンパイルするときには、操作される側のアプリケーションが起動していなければなりません。ローカルのアプリケーションならば「...はどこにありますか?」と尋ねてきますが、リモートの場合にはコンパイルできないのです。これはスクリプトをコンパイルするとき、必ずリモートマシンが起動しており、必要なアプリケーションをすべて起動しておかなければならないことを示しています。


解決策

 まず、パスワードですが、これはセキュリティの問題もあってなかなか解決できません。しかし、パスワード入力を1度にする方法はあります。

 もっとも確実なのは、スクリプト実行のためのアプレットをリモート側に常駐させておき、ローカル側からはこのアプレットに対してのみ命令を出す方法です。これなら対象となるアプリケーションは一つだけですから、パスワードの入力も一度ですみます。

 アプレットの使い方は2つあります。

 一つ目は、アプレットに必要な操作内容をすべてサブルーチンとして登録しておき、ローカルからはそのサブルーチンを呼び出すだけ、という方法です。

 ローカル側:
  tell application "DoCommand" of machine "Performa 520"
    FileSearch()
  end tell

 リモート側:
  on FileSearch()
    --必要な処理を書いておく
  end FileSearch

 これは遅いネットワーク環境でもすばやい処理が可能となりますが、新たな機能を追加したりスクリプトを変更する場合、スクリプトの終了やファイルの書き換え、スクリプトの起動などを行う必要があり大変です。

 二つ目は、ローカルで作成したスクリプトオブジェクトをリモートのアプレットに与え、それを実行させるという方法です。

 ローカル側:
  on run
    tell application "DoCommand" of machine "Performa 520"
      DoCommand (SendScript)
    end tell
  end run

  script SendScript
    tell application "Finder"
      beep 2
    end tell
  end script

 リモート側:
  on DoCommand (theScript)
    tell theScript to run
  end DoCommand

 これはローカル側ですべてのスクリプトを記述できるため大変便利ですが、貧弱なネットワーク環境ではスクリプトの送信に時間がかかります。もっとも現状ではAppleScriptの実行速度自体が遅いため、それほど問題にはならないと思いますが。一般的にはこの方法が簡便でいいと思います。

 さて、次はスクリプトをコンパイルするときの問題を考えてみましょう。

 指定されるアプリケーションは、上の方法を使えばたった一つですみます。しかしコンパイル時に必ずそのアプレットを起動しておく必要があったり、アプレットに命令を出す部分にはリモートマシン名を書き込む必要があったりで、やはり少々めんどうです。これは、アプリケーションの参照を変数に取り込むことで解決できます。

 ローカル側:
  property pApp : ""
  on run
    if pApp is "" then set pApp to (choose application)
    tell pApp
      DoCommand (SendScript)
    end tell
  end run

  script SendScript
    tell application "Finder"
      beep 2
    end tell
  end script

 この方法は、例えば毎回異なるマシンやアプレットに命令を出す場合などにも応用可能です。

 ただ、アプリケーションの参照を変数に取り込むという方法は、そのアプリケーションがアプレットである場合にのみ有効です。例えばFinderやExcel等を変数に入れても、それらの機能を変数にtellすることで呼び出すことはできません。変数で呼び出した場合は、あらかじめアプリケーションの辞書情報を読み込んでおくことができないからです。そういう意味でも、リモートマシンのアプレットを経由した命令方法が便利であると分かると思います。

 さらに、もうひとつ。ローカル側のアプレットからリモートマシンを操作する場合、ローカルのアプレットを起動する度にユーザの認証が必要になります。滅多に使わないアプレットならそれでもいいでしょうが、頻繁に使う場合は非常にめんどうです。従って、これを回避する方法も考えなければなりません。

 毎回ユーザの確認が必要になるのは、アプレットが毎回終了するからです。つまり、アプレットを終了させなければ問題はおきないわけです。しかしながら、アプレットをすべて常駐型にしておくわけにもいきません。それなら、というわけで、スクリプトの受け渡し専用の常駐型アプレットを作成し、ネットワークを利用するアプレットはそのアプレットに対して命令を送るようにしてみます。

 命令を出すアプレット:(ローカル)
  tell application "Script Sender"
    SendCommand (SendScript)
  end tell

 常駐型アプレット「Script Sender」:(ローカル)
  on SendCommand (theScript)
    tell application "DoCommand" of machine "Performa 520"
      DoCommand (theScript)
    end tell
  end SendCommand

 常駐型アプレット「DoCommand」:(リモート)
  on DoCommand (theScript)
    tell theScript to run
  end DoCommand

 この方法の欠点は、命令伝達経路にアプレットが2つも挟まっているということです。そのぶん命令が遅れますので、パフォーマンスは多少なりと低下します。アプレットを頻繁に使う場合には便利ですけど。

 正直な話、別にこんなことをしなくても、常駐型のHyperCardやFaceSpanでスクリプトを書けばいいわけですが、この例はあえてアプレットにこだわった場合のものです。筆者はAppleScriptの手軽さに惹かれて使いはじめたので、動作の重いHyperCardやFaceSpanをあんまり使う気にはなれないのです。


有効な利用法

 リモートマシンを操作できれば、工夫次第で色々なことができそうですね。例えばエディタを使ったチャットシステムなども簡単に作ることができますし、簡単な電子メール配送システムを作ることだってできます。

 しかし、せっかくリモートMac(つまり他のCPU)を使うのだから、ローカルマシンの作業効率を上げるために使ってみるのもおもしろいのではないでしょうか。何せ完全なマルチタスクになりますからね。

 一つの例としては、リモートマシンにFTPを行わせる、というのがあります。例えばWWWを巡回中にダウンロードしたいファイルを見つけたら、そのURLをアプレットに渡してリモートマシンのFetchやAnarchieにダウンロードを行わせるわけです。(これはネットワークが専用線接続していないと無理ですが…)

 大きいファイルの場合、ダウンロードはブラウズを終了してからもずっと続くことになりますが、自分の仕事用マシンでWWWを見ている場合はブラウズが終了すればすぐ他の作業に移りたいですよね。しかしダウンロード中はエラーが怖くて大した作業はできませんから、仕事の効率はひどく悪くなります。こういった場合、他のマシンがダウンロードを行ってくれればなんの問題もなく作業ができるわけです。

 また、これは将来的にですが、画像に何らかの処理を行いたい場合、リモートのPhotoshopを使って目的の画像に効果をかけながら、ローカルではページレイアウトソフトの準備をしたりテキスト入力を行うことも可能になります。

 以前はCPUが貴重で不足していたため、その解決策としてUNIXのようなシステムが生まれましたが、現在は一人が複数のCPUを利用できることも珍しくなくなりました。自分の隣で遊んでいるCPUを活用すれば、もっとMacを便利にできるかもしれませんね。


Tipsに戻る
AppleScriptのページに戻る
このホームページに関するお問い合わせは、karino@drycarbon.comまで。