Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

HtmlApplication

HTMLアプリケーション

このテキストはアスキーから出版されたWindows 2000 Magazineに寄稿したものの初稿の一部を復元したものです。

スクリプトを実行するためには、必ずしもコマンドラインを使用しなければならないわけではない。特にダイナミックHTML(DHTML)をちょっと利用すれば、簡単にマウスだけで操作可能なアプリケーションを作ることができる。これはインターネットエクスプローラ4.0以降の非常に便利な機能だ。

今度は、このインターネットエクスプローラのオマケ機能、HTMLアプリケーションを使ってみよう。

インターネットエクスプローラとスクリプト言語

振り返ってみれば、1996年から1997年にかけてマイクロソフトがインターネットエクスプローラに対してつぎ込んだ開発力というのは、凄まじいの一語につきる。

Windows95が大成功をおさめた時点では何も無い状態だったのが、あれよあれよという間に、ネットスケーププラグイン、Java、ActiveXコントロール(OLEコントロール'97)と、その時点で使える技術を総動員してHTMLだけでは実現できない表現力を実現したバージョン3.0を出してきたのだから。

それらのインターネットエクスプローラに対する技術投入の中で、一際異彩を放ったのがJScriptとVBScriptという2つのスクリプト言語を扱えるようにしたことだった。JScriptでHTML要素を操作できるようにする、ということはネットスケープナビゲータに取って代わるためには必須だということは理解できるが(それだけでなく、ECMAに働きかけて言語仕様の標準化まで、ある意味自社に都合が良いように行っているのだから――ネットスケープナビゲータがJavaScriptの仕様をマイクロソフトが真似できないように拡張することに対して、標準化という名目でブレーキをかけたと言える――単に技術面だけではなく政治面でまで総力を上げたのが見て取れる)、それだけに留まらず、Visual Basicにそっくりなスクリプト言語まで搭載したということは注目に値する。少なくてもインターネットではともかく、企業内イントラネットでは、IE3.0と、続くIIS3.0のActive Server Pageの2つによってネットスケープ社との競争はほぼ勝負がついたと言っていいだろう。

この時、インターネットエクスプローラが2つのスクリプト言語を透過に扱えるように考えられたのが、ActiveScriptingというCOMの仕様だ。ActiveScriptingでは、スクリプト言語がホストアプリケーション(この場合だとインターネットエクスプローラ)に提供しなければならない一連のコマンドセットと、ホストアプリケーションがスクリプト言語に提供しなければならない一連のコマンドセット(実行環境の情報を提供する)の仕様がCOMのインターフェイスとして定義されている。これらのインターフェイス仕様は公開されているため、マイクロソフト以外でもインターネットエクスプローラなどで利用できるスクリプト言語を提供することが可能だ。

というわけで、筆者はActiveScriptingインターフェイスをRubyに被せることができたし、インターネットエクスプローラ上でRubyスクリプトを動かすことができるわけだ。

HTMLアプリケーションの意義

HTMLアプリケーションは、インターネットエクスプローラの機能のうち、ActiveScriptを動かすこと、HTML要素をオブジェクトとしてスクリプトに提供することを抜き出して、一切のセキュリティチェックをはずしたものだ。従って、通常のHTMLでは実行不可能な、安全ではないActiveXコントロール(例えばFileSystemObject)を使用することも可能だ。公式化すれば、HTMLアプリケーション=Windowsスクリプティングホスト−コマンドライン引数+HTMLという感じだ。

当然、使用できるRubyは、ActiveScriptRuby版だけになってしまうので、RubyエントリーパッケージなどのCygwin版やMingw版などしかインストールしていない場合は、別にActiveScriptRubyをインストールするか、あるいは使用そのものをあきらめて欲しいただし、(嫌でなければ)VBScriptやJScriptを動かすことも当然可能であるから、必ずしもHTMLアプリケーションに意味が無いわけではない。

Helloworldアプリケーション

まず、簡単なプログラムとしてHello Worldを、HTMLアプリケーション(以降HTAと記す)で作成してみよう。

Hello.hta

リストは2009年最新版のActiveScriptRubyに合わせて修正済み

<html>
<head><title>Hello World</title><head>
<body>
  <center>Hello World !!</center>
  <br>
  <center>
    <input type="button" onclick="close"
 language="RubyScript" value="END">
  </center>
</body>
</html>

HTAはプログラム扱いなので、WindowsNT4.0やWindows2000なら、コマンドプロンプトから直接Hello.htaと入力するか、エクスプローラからのダブルクリックで実行可能だ(図hta.tif)。見ての通り、非常にシンプルなウィンドウで表示される。

この中でスクリプトが使用されているのは、ENDと書かれたボタンのonlickイベントの部分だけだ。このボタンをクリックすると、languageで指定されたRubyScript(ActiveScriptRubyActiveScript名)がonclickで指定された「Window.close」というスクリプトを実行するため、Windowオブジェクトのcloseメソッドが呼び出されてHTAが終了する。ただそれだけなのだが、それでも、この例でさえHTAと通常のHTMLで動作が異なることが確認できる。

実際に、上のHTAのファイル名をHello.htmと変更してから、同様に実行すると、ボタンをクリックしたところで、「ウィンドウは、表示中のWebページにより閉じられようとしています。このウィンドウを閉じますか?」というメッセージが表示されることが確認できるだろう(図html.tif)。スクリプトによって勝手にウィンドウが閉じられるということが何らかのユーザーに対する脅威となりえると考えてこのようなチェックが入っているわけだが、HTAでは一切のセキュリティチェックが無いため、黙って終了してしまうわけだ。

ActiveScriptRubyでの決まりごと

HTAでActiveScriptRubyを使用する場合、VBScriptやJScriptには存在しない制約があるので、まず書いておこう。

2009年現在、以下の制限は存在しないが、原文のまま残す。

  1. デフォルトオブジェクト(Windowオブジェクト)の省略ができない
  2. スクリプトと結びついたオブジェクトには必ずid属性が必要

デフォルトオブジェクト(Windowオブジェクト)の省略ができない

例えばJScriptであれば、いきなり

alert("I like JScript!!");

と記述できるが(window.alert("I like...");と記述しても良い)、ActiveScriptRubyでは

Window.alert "I like Ruby !!!!"

と、Window(または@window)オブジェクトの記述が必要だ。

スクリプトと結びついたオブジェクトには必ずid属性が必要

例えばJScriptであれば、Hello.htaの終了ボタンを <input type="button" onclick="window.close();" language="JSciprt" value="END">

のように記述できるが、Hello.htaを見ての通りActiveScriptRubyの場合、id=xxxxという記述が必須となる。

他のスクリプトとの相違点

ついでに、他のスクリプト言語との相違点についても書いておこう。

JScriptとの相違点は、デフォルトオブジェクトについての制約以外には、以下の点がある。

JScriptとの相違点

  1. ActiveScriptRubyは、OLEオートメーション型配列(VBArray)を直接扱える。
  2. ActiveScriptRubyは、イベントの引数を取ることができる(JScriptはイベントの引数を取れない)。

VBScriptとの相違点は、JScriptと同様にメソッドの引数の取り扱いに制限を持つことだ。

VBScriptとの相違点

  1. ActiveScriptRubyは、ByRef型の引数を扱えない(引数はすべて値渡しとなる)。

HTAの用途

次のHTAを見てみよう。このプログラムは、Systemディレクトリ内の拡張子がexeの全ファイルの名前、サイズ、更新時刻を列挙し、テーブルに格納するプログラムだ。

sysprog.hta

<html>
<head>
<title>プログラム情報</title>
<script language="RubyScript">
Sysdir = "#{ENV['windir']}\\system32" # 定数はhead内のスクリプトブロックで定義する。

def showinf
  tbl = Window.tbl
  while tbl.rows.length > 1
    tbl.deleteRow 1
  end
  Dir.open(Sysdir).each do |fl|
    if fl.index(/\.exe\z/i) != nil
      tr = tbl.insertRow -1
      s = "#{Sysdir}\\#{fl}"
      td = tr.insertCell -1
      td.innerText = fl.downcase
      td = tr.insertCell -1
      td.innerText = File::size s
      td = tr.insertCell -1
      td.innerText = File::mtime s
    end
  end
  sleep 1  #おまじない ←タイミングを取らないと競合が起きる
end

</script>
</head>
<body onload="showinf" language="RubyScript">
<table id="tbl" border="2">
 <tr>
  <th>ファイル名</th><th>サイズ</th><th>日付</th>
 </tr>
</table>
<hr>
<center>
  <input type="button" id="rfrs" onclick="showinf" value="Refresh"
   language="RubyScript">
</center>
</body>
</html>

実行例(図proghta.tif)

同じことを行うスクリプトは、次のようになる。

sysprog.rb

Sysdir = "#{ENV['windir']}\\system32"

def showinf
  Dir.open(Sysdir).each do |fl|
    if fl.index(/\.exe\z/i) != nil
      s = "#{Sysdir}\\#{fl}"
      print "#{fl.downcase}, #{File::size s}, #{File::mtime s}\n"
    end
  end
end

showinf

実行例(図progscr.tif)

実行して比べてみるとHTAの速度の遅さが(筆者のP掘800で5〜6秒必要である)目に付くはずだ。実際は普通のスクリプトのほうが即座に表示が可能なためにHTAの遅さが際立つだけなのだが、ファイル量が多いと半端な待ち時間ではなくなる。試しに、正規表現内のexeをdllに変えてみるとわかると思う。

それではHTAにすると何が嬉しいだろうか?

理由は幾つもある。

まず、エクスプローラからのダブルクリック実行に非常に向いていることだ。これはコマンドラインで実行するスクリプトより明らかにアドバンテージだ。

また、この例では、直接拡張子やディレクトリをHTA内に埋め込んであるが、TEXTタグを使用して入力させるように修正することも簡単だ。

つまり、プログラムを実際に起動し使用する者に対して余分な負荷がかからない(知識を要求しないと言っても良い)ということだ。

関連することだが、ファイルへリダイレクトしたりせずとも、結果がきちんと残るということもある。

さらに、HTA自体がインターネットエクスプローラであるために得られるオマケもある。それは、印刷が極めて簡単だということだ。HTAのウィンドウにはメニューもツールバーもないが、右クリックはインターネットエクスプローラと共通だからだ(図htamenu.tif)。お好みであれば、レイアウトに凝ったりすることも可能である。

要するに、ちょっとしたシステム情報の取得やログの表示といった処理に非常に向いているわけだ。

例えば、幾つかの管理ツールをファイルサーバに置いておき、PC使用時のトラブルが発生した場合、報告して来た利用者にその場で実行させて結果を報告させる、というような状況を考えてみよう。

暇と余裕があれば、VBか何かでプログラムを作って置いておいてもいいかも知れないが、たいていの用事はそれこそ、特定のディレクトリの特定のファイルをチェックして貰ったり、レジストリの特定のキーをチェックして貰えばすむことが多いはずだ。わざわざコンパイルまでして本格的なプログラムを作る必要はそうそうは無い。しかし、電話口などで、いちいちエクスプローラの詳細表示の出し方を説明したり、レジストリエディターの起動方法などを説明したりするのは気が遠くなるような作業である。同様に、コマンドプロンプトを開かせてコマンド名を指示したりすることも楽しい作業では無い。結局、バッチファイルや、通常のWindowsScriptホストでは役不足だ。

すなわち、こういった用途にHTAは非常に向いている。通常のHTMLと異なりアクセス制限が無いため、レジストリ操作やファイル操作が可能だということも、特定用途の管理ツール向きだ。


まとめ

今回は、(OSを問わずに使われているという意味で)もっとも標準的なRuby開発環境としてMeadow(Emacs)、WindowsでのデファクトスタンダードなRuby統合開発環境のRubyWin、そしてコマンドラインを使用しないスクリプト実行環境?としてHTMLアプリケーションを取り上げた。

Meadowは、歴史と文化という重荷を背負っているために良くも悪くも癖のある環境だ。それだけにどこへ行っても使えるという点と、非常に奥行きを持った点は見逃すことはできないだろう。

いっぽうRubyWinは、Windowsネイティブなアプリケーションならではの取っ付きの良さが、魅力的な環境だ。一部、Ruby自身の制約(注)に起因する制限があったりするが、その点を割り引いても相当に完成度は高い。ただ、作者自身が0.0.2とバージョンに0を2つも付けていることからうかがえるように、必ずしも完成したアプリケーションとは言えない点もあるかも知れないが、そこはオープンソースなのであるから、不満を感じたら自分で修正してやるくらいの気持ちが必要であろう(修正が有効に思えたら、必ず助田さんにフィードバックしよう)。

最後のHTMLアプリケーションは、RubyWinと同様に一部Ruby自身の制約(注)に起因する制限があるが、簡単なHTMLの知識だけである程度のGUIを備えたスクリプトが手軽に作成できるという面で、筆者は気に入っている。特にちょっとしたツールを作る場合の有効度が非常に高い。

注)この点については、Ruby側から見れば「WindowsのOS的な制約により」と逆の言い方ができることは付け加えておこう。

Last modified:2010/07/07 22:09:48
Keyword(s):
References: