酒井法雄のVBコンプリート

5ActiveXMicrosoftのインターネット戦略 その2

インターネットに出遅れたMicrosoftが大々的に発表したActiveX構想。前回に引き続き、Microsoftのインターネット戦略とその分析をしてみよう。

有限会社イント・ツーワン 酒井 法雄 (E-mail norio@int21.co.jp)

先月は3月のPDC、4月のインターネットデイで発表されたMicrosoftのインターネット戦略について解説するつもりだったが、情報をまとめるのに時間がかかり、原稿が予想外に膨大なものとなったため、先月号では予定したページに掲載することができなかった。インターネットについての基礎的な話から入ったため、どうしても量が多かったのだ。肝心のところで「以下次号」となってしまったわけで、最新の情報というにはちょっと古くなった嫌いもあるが、今回はMicrosoftの提案する部分について述べることにしよう。

前回に述べたとおり、Microsoftはサーバー側、クライアント側ともにインターネットに乗り遅れた。単に乗り遅れたというなら一つずつの製品で挽回していけばよいわけだが、そうはいかない事情があった。というのも、MicrosoftはWindowsというOSそのもの、そしてWindowsをベースとした開発ツール、アプリケーションを扱う、いわば総合ソフトウェアベンダーである。その根底にあるのはWindowsやWindows NTというOSだ。

ところが、インターネット、具体的にはHTTPというプロトコルをベースにしたWWWクライアント/サーバー技術では、OSは何でもいいということになってしまった。逆に何でも動くのがメリットなのである。かえって独自なものは嫌われる、いわゆるオープンな時代に突入したと言えるのである。これは、Windowsでユーザーの囲い込みをしてきたMicrosoftにとってはとてつもないダメージになってしまう。自社OSや製品の特色を活かしながらもオープンなインターネットに対応しなくてはならないのである。

このような状況で、Microsoftのゴールは三つあると思われる。

一つ目は、クライアント側であるWebブラウザの市場を制覇することだ。

二つ目は、これ以上UNIXを普及させないこと、すなわちWindows NTをサーバーの標準とすることだ。

三つ目は、電子マネーなどの従来から投資してきた技術をそこへ融合することだ。

 

一つ目のゴールを達成するために、MicrosoftはWindows 95 PlusにInternet Explorerをバンドルした。しかし、これは思ったほどの成功はなかった。世界的にはやはりNetscapeの標準は揺らいでいない。しかし、国内ではお手軽にインターネットを楽しむ人々にInternet Explorerは使われているようだ。

そもそもNetscapeが標準たりえたのは、HTTPをここまで普及させた原動力であるNCSA Mosaicの作者が作った会社の製品だからだ。使いやすさやプラグインなどの拡張性、Javaのサポート、さらには事実上タダ同然でばらまくといった戦法が功を奏したのだ。

Internet Explorerを標準とするためには、これらの標準を取り入れた上で、Microsoft独自の仕様を盛り込む必要があった。

 

二つ目のゴールを達成するためには、MicrosoftもWWW Serverを作る必要があった。しかも、Windows NT上で動作するいわゆるBack Office系の製品との融合を確立すれば、それは強みになる。もちろん、Windows NTのセキュリティシステムとの連携も忘れてはならないことだ。

三つ目のゴールは、先の二つのゴールが達成されていればたやすいことのはずだ。クライアント、サーバーともに標準となればいいのである。

 

そして、PDCで発表されたのが、一連のプロダクトとアーキテクチャー、そして例によって将来の展望であった。これらの製品群、そしてアーキテクチャーだけで一冊の本が書けるほどの内容である。その膨大な内容を総称して、ActiveXと呼んでいる。ActiveXは製品名でもアーキテクチャーでもない。個々にActiveXなんとかというアーキテクチャーはあるが、ActiveXと言ったときには、Microsoftがインターネットに取り組むに当たっての総称、あるいは旗印と考えてよいだろう。すなわち、ActiveXとはマーケティング的に「Microsoftはインターネットに本格的に取り組むぞ」という意欲を示す合い言葉なのである。決して、OCXとかOLEの新しい呼び方ではない。

では、ActiveX構想にはどのようなものがあるのだろうか。まずは各アーキテクチャーと製品のの概要を述べよう。

クライアント系

Java Scriptの代わりにVisual Basicの言語仕様でHTMLにスクリプトを埋め込むことができるようにした仕組みだ。Microsoftとしては32bit Windows用Internet Explorer 3.0に搭載する。言語仕様は公開(バイナリならびにソースライセンスのロイヤリティーはフリー)するので他のプラットホームにはサードパーティが移植することを期待しているようだ。IE 3.0に標準で搭載される。

VB ScriptやJava Scriptですべきことは、基本的には同じことである。ということは、言語が違っているだけという捉え方もあながち外れてはいない。ならば、Web Browser、すなわちMicrosoftならばIE 3.0からHTMLを拡張するスクリプトを実行できるという仕組みがあれば、そこからむしろ複数の言語を使うことができるようになっていた方がよい。これが、ActiveX Scriptである。ActiveX ScriptエンジンのインターフェイスはOLEベースで仕様が公開されている。これに合わせていろいろな言語のエンジンを呼び出せるようにしようというものだ。IE 3.0ではVB Scriptの他にJava Scriptもサポートされる。

Javaアプレットに近い位置づけのものである。Javaとの違いは、基本的にはOCXの拡張である点だ。すなわち、OLEベースのカスタムコントロールである。Javaのように単体で動作させてもいいし、VB Scriptと組み合わせて実行させることもできる。すなわち、Internet Explorer 3.0がVisual Basic環境になったようなものである。

また、従来OCXと呼んでいたもの、すなわちOLEベースのカスタムコントロールも、今後はすべてActiveXの仕様に合わせて共通化させる。すなわち、従来のOCXは仕様を変更してActiveXコントロールとなり、Visual Basicでもインターネット用ブラウザでも使えるようになる。ActiveXコントロールは従来のOCXに比較してサイズや速度が大幅に改善されており、インターネットでの利用に向いたものとなっている。ActiveXコントロールを作成するための標準プラットホームとしてVisualC++ 4.1が提供されるが、クラスがサポートされるのは4.2からである。

新しいMicrosoftのアーキテクチャーを使うためのブラウザ。HTML 3.0、VB ScriptおよびActiveXをサポートする。現在、英語β版がリリースされている。

インターネット用標準プロトコルであるTCP/IPおよびその上位レイヤーに属するプロトコル、すなわちSMTPやFTP、さらにはHTTPなども扱うことができるActiveXコントロール集。すでにβ版をmicrosoft.comからダウンロードできる。

ActiveXコントロールの開発が可能になる。コンパイラも含まれるので、Visual Basic単体としても非常に期待される製品だ。おそらく年内には発売されるだろう。

後述するIISのISAPI用ActiveX開発キット。www.microsoft.comからダウンロード可能。

ActiveXコントロールの作成やMicrosoft製WWW ServerであるInternet Information Server(IIS)で提供されるInternet Server API(ISAPI)を使うことができるようになる。これはMFCでサポートされる。4.1ではISAPI、4.2ではActiveX用クラス、4.3ではActive Documentsコンテナのサンプルが含まれるという。ここまでの出荷は年内に行われる予定。

サーバー系

Windows NT Server用WWW Server。HTTP、FTP、Gopherのサーバーである。Workstationでは動作しない。英語版はすでに2/14よりインターネットで無償配布をしており、日本語版は5月に出荷を開始している。基本的には無料の製品であり、近々発売されるWindows NT 4.0(日本語版は年末か?)にはバンドルされる。IISには次のようなMicrosoft独自のアーキテクチャーも含まれているが、それが本領を発揮するのはIIS Version 2.0に含まれる予定のActiveXサーバーフレームワークが登場してからだろう。

IISにはCGIのインターフェイスに加えて、独自のAPIセットISAPIが含まれている。このAPIセットを呼び出すDLLでCGIの代わりをさせようというものだ。

ISAPIから呼び出されるDLLを使って、ODBCデータソースに接続することができる。

サーバー側にAciveXコントロールを配置することができる。これはJavaアプレットのようにクライアント側にダウンロードして実行させるものの他に、サーバー側のAPIと組み合わせて使うことができる。

VRMLに対応したMicrosoftのソリューション。

次期Windows NT。ネットワークOLEをサポートし、IISをバンドルする。年内には日本語版が発売されるだろう。

次期SQL Server。異種レプリケーションをサポート,、分散トランザクション機能、列単位でのロックといった基本機能の強化に加えて、インターネットで使われることを前提にした様々な拡張がなされている。Windows NT 4.0より前に出荷されるようだ。

メイルやニュースに対応したバックエンド処理をするサーバー。

汎用機などとSNAで接続するためのサーバー。

リモートメンテナンス用サーバー。

インターネットで商業目的のWWWサイトを構築するためのサーバー。暗号化や認証などの機能を実現している。

TPモニター。97年に発売予定。

この他にも細かいアーキテクチャーや製品などが目白押しである。たとえば、WordでHTMLを書けるようになるなどということから始まって、WordやExcel、さらにはエクスプローラまでもインターネットのブラウザ機能を搭載するというのだ。

というわけで、本当に驚くほどのラインナップだが、今後開発者にとって重要と思われる点について、さらに述べることにしよう。

IISActiveXの仕組み

本来この連載はVisual Basicの記事だから、VB ScriptすなわちVisual Basic For Script Editionについて解説したいところだが、すでに述べたようにサーバー側のしくみやActiveX技術にも密接に関係するところだ。そこで、まずはIISとActiveから話をしよう。

IISの基本スペックには次のような特徴がある。

WWW Serverは、当然ながら多くのアクセスをこなすことになる。閑古鳥が鳴いているようなところもあるだろうが、イントラネットで使用するときには、それなりに多くのアクセスがあるはずだ。ましてや人気のあるインターネットのページともなれば、かなりのパフォーマンスを必要とする。この点で、IISはダントツのベンチマークをたたき出しているとMicrosoftは言っている。

リソースへのアクセスコントロールとユーザーレベルセキュリティを装備している。これは、実際にはWindows NT Serverのドメインディレクトリサービスをそのまま利用するので、アカウントの二重管理の必要はない。しかし、Windows NTのACLではグループの階層化などで自由度が低いため、その問題をひきずることになる。もっともこれは、他のMicrosoftの製品、すなわちSQL Serverなどにも言えることだ。また、NTFSによるページ単位でのアクセス権コントロールも可能である。

また、特定のIPアドレスを持つクライアントコンピュータからのアクセスを禁止、もしくは特定のIPアドレスのクライアントからのアクセスのみを許可する機能を持っている。

また、回線上のデータ機密保護としてSSLを使ったデータ暗号化機能やサーバー認証機能も持っている。

IISには、もちろんCGIを使って環境変数と標準入出力をベースにしたアプリケーションによる拡張ができる。ただし、これはMS-DOSでのものと同様である。

さらには、ISAPIを使ったDLLを作成した拡張ができる。これには二つの機能がある。一つはApplication APIsと呼ばれ、データベースやメッセージングなどのバックエンドシステムとの連携や、拡張機能の追加をする。もう一つは、Filter APIsと呼ばれ、ブラウザ、サーバー間のHTTPプロトコルパケットを処理するフィルター機能の追加が可能である(図PPT 11)。

これらのプログラムはDLLで作ることになるわけだが、ここで使われるものはActiveXサーバーアプリケーションと呼ばれる。

ISAPIでのプログラミングは基本的にDLLを作成することだ。このDLLの中で、ISAPI関数を呼び出してインターフェイスを取る。必要に応じて、DLLからODBCなどを使ってRDBMSサーバーにアクセスするということもできる。

このようにCGIと違って拡張方式がDLLであるため、インプロセス、すなわち一つのプロセスが常に起動してある状態となり、起動にかかるオーバーヘッドがない(図PPT 12)。この点が高速たるゆえんである。しかし、デバッグするたびにサーバーを止めなくてはならないし、クリティカルなバグがあると、IIS自体が停止してしまうという問題点もある。また、それだけのためにわけのわからないオープンとは言い難いAPIを使うというのはどうかと思ってしまう。インターネットでの律速段階はネットワークのトラフィックではないのだろうか。

それはともかく、ISAPIには、次のようなものがある。

※アプリケーション

サーバーから呼び出されるポイント

CGIでのmain()。リクエストの度に呼び出される。

CGIでのgetenv()。

クライアントからの引数取得

クライアントへの標準出力

URLのリダイレクションやセッションのマネージメントをサポートし、共通サービスとAPIの拡張をする。

※フィルター

フィルターのオン/オフを知る。

フィルターのメインプロシージャ。リクエストの度に呼び出される。

URLのリダイレクションやセッションのマネージメントをサポートし、フィルターの拡張をする。

ISAPIの詳細は、ActiveX SDKにある。ここでも、ActiveXOLEOCXとは

独立したものであることが分かるだろう。

データベースコネクション

ISAPI用のDLLとしてあらかじめ用意されているInternet Database Connector (HTTPODBC.DLL)を使えば、ODBC対応RDBMSと連携することが可能だ。これには、プログラミングは不要で、ODBCを経由してDBに渡すSQL文の定義を拡張子IDCのファイルに作成し、処理結果をHTMLに整形するための元とも言えるHTML拡張のHTX形式スクリプトを作成する。

たとえば、サンプルで用意されている次のようなHTMPのページを見てみよう。

<FORM METHOD="POST" ACTION="/scripts/samples/sample3.idc"><P>

年間売上数を入力してください: <INPUT NAME="sales" VALUE="5000" ><P>

<INPUT TYPE="SUBMIT" VALUE="クエリーを実行">

このページ(図PPT 13)では、入力用テキストボックスがあり、実行ボタンを押すと指定された値を/scripts/samples/sample3.idcに渡す。この拡張子がつけられていたときには、自動的にHTTPODBC.DLLが呼び出され、そこで次のような内容のsample3.idcが解釈される。

Datasource: Web SQL

Username: sa

Template: sample3.htx

SQLStatement:

+SELECT au_lname, ytd_sales

+ from pubs.dbo.titleview

+ where ytd_sales > %sales%

ここには、ODBCデータソース、ログイン名、テンプレートとなるHTXファイル、SQL文などを指定する。なお、実際にはパスワードなどもっと多くの項目を指定することができる。ここで、 %sales%は、元のHTMLファイルで指定された入力項目の名前であり、その内容が比較される。このように%でくくったものが前のHTMLから渡された変数名ということになる。

次に、ここで指定されているsample3.htxの主要な部分は次のようになっている。

<H2><I>売り上げが <%idc.sales%></I> 以上の著者</H2>

<TABLE BORDER>

<%begindetail%>

<%if CurrentRecord EQ 0 %>

<caption>Query results:</caption>

<TR><TH><B>著者</B></TH><TH><B>年間売り上げ<BR>(US ドル)</B></TH></TR>

<%endif%>

<TR><TD><A HREF="/scripts/samples/sample3a.idc?lname=<%au_lname%>"><%au_lname%></A></TD><TD align="right">$<%ytd_sales%></TD></TR>

<%enddetail%>

</TABLE>

<%begindetail%>と<%enddetail%>の間で、取得したレコードが繰り返して評価される。ここで、最初にある<%if CurrentRecord EQ 0 %>は、組み込み変数CurrentRecordが0、すなわち最初のレコードでテーブルタイトルを出している。それ以外のときには、

HREF="/scripts/samples/sample3a.idc?lname=<%au_lname%>"><%au_lname%></A></TD><TD align="right">$<%ytd_sales%></TD></TR>

で、一覧を表示している。

この後では、次のような文があり、最後のレコードまで行ってもCurrentRecordが0のときには、検索対象となるものがなかったときの処理と、そうでないときの処理が記述されている。

<%if CurrentRecord EQ 0 %>

<I><B>売り上げが </I><%idc.sales%> 以上の著者はいません。</B>

<%else%>

<P>

<HR>

著者名をクリックすると、発刊された作品が表\示されます

<%endif%>

こうしてHTTPODBC.DLLは条件に合った部分だけを実行し、結果のHTMLを作成してサーバーに返すという処理をしている。同様にして、検索結果をクリックすると、その詳細ページが表示されるようになっている。

このように、データベースコネクションでは基本的に一つのSQL文で一つのページを作るように構成される。この方式では限界画ある。したがって問題があるときには、トランザクションやHTML 3.0のフレームを使うなどして拡張する必要があるだろう。

Visual Basic For Script Edition

MicrosoftはOLE AutomationでOSレベルにVisual Basicを持ち込み、Visual Basic for Applications Edition(VBA)とした。そして、インターネットにもやはりVisual Basicを持ってきた。それがVisual Basic For Script Edition、いわゆるVB Scriptである。VB ScriptはVBAコンパチの言語仕様を持つ。とはいえ、HTMLと組み合わせて使う必要から、細かい注意は必要だ。

いよいよ、マシン境界のないインターネットというプラットホームにもVisual Basicが登場したわけだ。これがうまくいけば、他のOSにもVisual Basicが移植されるようになるだろう。

VB ScriptはJava Scriptと同様にHTMLに組み込んだ形で実行される。実行するのはブラウザだから、現在のところInternet Explore 3.0β以上が必要となる。VB Scriptは、OLEオートメーションをサポートし、ActiveXコントロールをサポートする。このため、 Internet Explore 3.0にはActiveX Scripting 対応エンジンを搭載している。ここでは、ホストとスクリプトエンジンを IOleScript により分離している。接続には公開された OLE インターフェイスをベースとしている。したがって、ActiveX Scripting ホストは、自動的に複数のスクリプトエンジンに対応することができるわけだ。したがって、Java Scriptなども対応できるというわけだ。

VB Scriptでは、危険性のある言語仕様を制限し、DLL の呼び出しやファイル I/Oなどは一切できないようになっている。これはセキュリティを考えれば当然のことであるが、ActiveXコントロールを使えば自由に拡張することができる。これは逆にセキュリティの面では不安要素である。

ActiveXコントロールとVB Script

ActiveXコントロールは、クライアント側でも使われる。このときの動作は見掛け上はJavaアプレットと同様で、必要に応じてダウンロードされる。このとき、セキュリティのために、図(PPT 18左)のようなダイアログが表示される。しかしActiveXコントロールはOCXの拡張版であるから、システムのレジストリデータベースに登録する必要があり、この作業までが自動実行される。逆に、すでにユーザーのクライアントマシンにVisual Basicなどがインストールされており、既存のActiveXがインストールされていれば、それが自動的に使われる。ただし、この機能は原稿執筆時のIE3.0αでは動作しない。あらかじめ必要なActiveXをダウンロードする必要がある。

ActiveXコントロールはアニメーションなどをするものを単体で動作させることもできるが、VB Scriptと組み合わせて使えば、いろいろな効果をあげることができる(図PPT14)。次にwww.microsoft.comにあったActiveXとVBScriptの例を示す(図PPT15)。

左側のものは、チャートのActiveXとタイマーのActiveXを組み合わせたもので、一定時間ごとにチャートの種類が変わっていくというデモだ。次にソースの抜粋を示す。

オブジェクトの定義部分



<HTML>
<HEAD>
<TITLE>Chart Control</TITLE>
...

<OBJECT
	classid="clsid:{99B42120-6EC7-11CF-A6C7-00AA00A47DD2}"
	id=sprlbl1
        width=50
        height=200
	align=left
	hspace=20
	vspace=0
>
<param name="_extentX" value="50" >
<param name="_extentY" value="700" >
<param name="angle" value="90" >
<param name="alignment" value="3" >
<param name="BackStyle" value="0" >
<param name="caption" value="Cool Controls">
<param name="FontName" value="Arial">
<param name="FontSize" value="20">
<param name="FontBold" value="1">
</OBJECT>

<OBJECT
	classid="{FC25B780-75BE-11CF-8B01-444553540000}"
	id=chart1
	width=300
	height=150
        align=center
	hspace=0
	vspace=0
>
<param name="_extentX" value="300">
<param name="_extentY" value="150">
<param name="ChartStyle" value="0">
<param name="ChartType" value="0">
<param name="hgridStyle" value="0">
<param name="vgridStyle" value="0">
<param name="colorscheme" value="1">
<param name="rows" value="4">
<param name="columns" value="4">
<param name="data[0][0]" value="30">
<param name="data[0][1]" value="60">
<param name="data[0][2]" value="20">
<param name="data[0][3]" value="40">
<param name="data[1][0]" value="31">
<param name="data[1][1]" value="61">
<param name="data[1][2]" value="21">
<param name="data[1][3]" value="41">
<param name="data[2][0]" value="32">
<param name="data[2][1]" value="62">
<param name="data[2][2]" value="22">
<param name="data[2][3]" value="42">
<param name="data[3][0]" value="33">
<param name="data[3][1]" value="63">
<param name="data[3][2]" value="23">

<param name="data[3][3]" value="43">
</object>

リストを見ると、拡張された<OBJECT ..>タグでActiveXのクラスIDと位置などの基本的な位置などを規定している。プロパティは、

<param name="_extentX" value="300">

のように<param name ...>タグで規定している。

ちなみに、クラスIDは従来のOLEやOCXと同様に、ActiveXコントロールを作成したマシンのネットワークカードのIDをベースとして作成される。このため、基本的には作成したActiveXコントロールは世界に一つしかないユニークなもののはずだ。しかし、ネットワークカードのないマシンで作成されたOCXや、クラスIDを偽造されたときなど、セキュリティの面では穴がある。

次に、テキストが続く。

表示されるテキスト部分

<H3>Chart Types</H3>

<P>The Chart control supports the following types of charts.

<BR>

<UL>

<LI>Pie Chart

<LI>Point Chart

<LI>Line Chart

<LI>Area Chart

<LI>Bar Chart

<LI>Column Chart

<LI>Stocks Chart

</UL>

...

次に、タイマーActiveXの定義がある。ここではTimeOutプロパティに750msec、EnableプロパティをTrueにしていると思われる。

タイマーのオブジェクト定義部分

<OBJECT id=timer classid="{59CCB4A0-727D-11CF-AC36-00AA00A47DD2}" >

<param name="TimeOut" value="750">

<param name="enable" value="1">

</OBJECT>

タイマーイベント自体は、VB Scriptで記述される。これは、タグ<script language="VBS">から</script>までがVB Scriptと解釈される。

内容としては、通常のVisual Basicの構文と同じである。

タイマーイベントを規定するVB Script


<script language="VBS">
sub timer_time
	i = chart1.chartstyle
	chart1.chartstyle = chart1.chartstyle + 1
	if i = chart1.chartstyle then
		chart1.chartstyle = 0
		i = chart1.charttype
		chart1.charttype = chart1.charttype + 1
		if i = chart1.charttype then
			chart1.charttype = 0
			chart1.chartstyle = 0
		end if
	end if
end sub
</script>
</FONT>
</BODY>
</HTML>


もう一つのデモは、もう少し実用的だ。これはピザの注文をとるページである。左側のオプションボタンでピザの種類を決めると、右側にトッピングがチェックボックスで表示される。同時に、中央下側のテキストボックスに説明が、さらに下に総合計が表示される仕組みだ。他にも文字が流れる機能やらいろいろあるが、ここの部分に注目しよう。

SetIngredientsは、引数に指定された値によってトッピングの種類のチェックボックスの値を設定するものだ。

SetTotalCostは、フォーム上にあるコントロールの指定に合わせて、トータルコストを計算し、テキストボックスsumに表示するものだ。

SetDescriptionTextは、指定された文字列を中央のテキストボックスに表示する。

以下、DoHawaiianやDoNewYorkなどは、フォーム定義<FORM Name="OrderForm">の下で

<INPUT TYPE=RADIO NAME=RadioGroup onClick="DoHawaiian">Hawaiian

のように、あらじめ定義されたラジオボタンが押されたときに呼び出される。

DoOrderではオーダー前にAlert関数を使ってメッセージボックスを出すことができる。

HTTPを使う限り、インタラクティブな操作には必ずサーバーから新しいページが送られてくる必要があったが、このようにVB Scriptを使えば必要最低限のことはクライアント側で処理することができる。

※VB Script部分


<SCRIPT LANGUAGE="VBS">
'-------------------------------------------------
'-- SetIngredients
'--
'--   Checks/unchecks the appropriate checkboxes on the page.
'--   Recomputes cost of the pizza.
'-------------------------------------------------

SUB SetIngredients(bPepperoni, bOnion, bPineapple, bSalmon, bAnchovies, bHam)
Dim Form
   Set Form = document.OrderForm
   Form.Pepperoni.checked  = bPepperoni
   Form.Onion.checked      = bOnion
   form.Pineapple.checked  = bPineapple
   Form.Salmon.checked     = bSalmon
   Form.Anchovies.checked  = bAnchovies
   Form.Ham.checked        = bHam
   SetTotalCost
END SUB

'-------------------------------------------------
'-- SetTotalCost
'--
'-- This method will set the total cost of the
'-- pizza.
'--
'-------------------------------------------------
SUB SetTotalCost
Dim Form
   Set Form = document.OrderForm
   '----------
   '-- Get total number of toppings.
   '----------
   total = Form.Pepperoni.checked + _
           Form.Onion.checked     + _
           Form.Pineapple.checked + _
           Form.Salmon.checked    + _
           Form.Anchovies.checked + _
           Form.Ham.checked
   '----------
   '-- The price of a pizza is $10... then add the number of
   '-- toppings.
   '----------
   Form.sum.value = "$" + CStr(10 + (total * 2)) + ".00"
END SUB

'-------------------------------------------------
'-- SetDescriptionText
'--
'-- This method will set the description of the pizza.
'--
'-------------------------------------------------
SUB SetDescriptionText(strToSet)
  document.OrderForm.Text1.value = strToSet
END SUB

'-------------------------------------------------
'-- When the user clicks the order button,
'-- submit the order and alert the user that their
'-- order will be arriving soon...
'-------------------------------------------------
SUB DoOrder
   '----------
   '-- Make sure the total cost is set and
   '-- give the user a nice message.
   '----------
   SetTotalCost
   SetDescriptionText "Thank you, your pizza will arrive piping hot."
   '-- Alert is a method on the window object
   Alert "Thank you, your pizza will arrive piping hot. Your account " + _
         "was billed " + document.OrderForm.sum.value + "."
END SUB

'-------------------------------------------------
'-- HAWAIIAN PIZZA
'--
'--   A Hawaiian pizza contains Pineapple and Ham.
'-------------------------------------------------

SUB DoHawaiian
   SetIngredients False, False, True, False, False, True
   SetDescriptionText "Our aloha special. Taste the exotic flavor of the big island."
END SUB

'-------------------------------------------------
'-- CHICAGO PIZZA
'--
'--   A Chicago pizza contains Onion and Pepperoni.
'-------------------------------------------------
SUB DoChicago
   SetIngredients True, True, False, False, False, False
   SetDescriptionText "Capone's favorite."
END SUB

'-------------------------------------------------
'-- Seattle PIZZA
'--
'--   A Seattle pizza contains Rain... However,
'--   Rain is not a valid choice so the user can
'--   only select Salmon.
'-------------------------------------------------

SUB DoSeattle
   SetIngredients False, False, False, True, False, False
   SetDescriptionText "Our best rainy day pizza. For the fish lover in you."
END SUB

'-------------------------------------------------
'-- NEWYORK PIZZA
'--
'--   A New York pizza contains Pepperoni.
'-------------------------------------------------
Sub DoNewYork
   SetIngredients True, False, False, False, False, False
   SetDescriptionText "For a taste of the Big Apple"
END SUB

'-------------------------------------------------
'-- THEWORKS PIZZA
'--
'--   A pizza with the works contains everything.
'-------------------------------------------------
SUB DoTheWorks
   SetIngredients True, True, True, True, True, True
   SetDescriptionText "Our most popular"
END SUB

SUB SendComments
    Alert "Thank you, your comments have been sent."
End SUB
</SCRIPT>

※ フォーム定義
<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=700>
<TR>
     <TD>
	<TABLE CELLPADDING=0 CELLSPACING=0>
          <TR>
            <TD COLSPAN=2 ROWSPAN=2>
             <IMG SRC="/ie/images/THEPIZZA.GIF" HEIGHT=95 WIDTH=100>
            </TD>
            <TD HEIGHT=8 WIDTH=25>
            </TD>
          </TR>
          <TR>
            <TD BGCOLOR=GRAY>
            </TD>
          </TR>
          <TR>
            <TD HEIGHT=8 WIDTH=10>
            </TD>
            <TD BGCOLOR=GRAY WIDTH=75>
            </TD>
            <TD BGCOLOR=GRAY>
            </TD>
          </TR>
        </TABLE>
     </TD>
     <TD BGCOLOR="003355" colspan=2 width=1280><FONT COLOR=WHITE SIZE=6 FACE=ARIAL><MARQUEE BEHAVIOR=SLIDE DIRECTION=RIGHT BGCOLOR="003355" ALIGN=MIDDLE>Microsoft Pizza From The Rainy State...</MARQUEE></FONT></TD>
</TR>
<TR>
      <TD VALIGN=TOP>
                <TABLE WIDTH=100 HEIGHT=800 BORDER=0 cellpadding=5 align=right VALIGN=TOP bgcolor="ffcc66">
			<TR>
                        <TD>
                        <font face=arial size=+1><B>Pizza from the Northwest</B></FONT>
                        <P><FONT face=arial SIZE=1><B>Try our 5 delicious varieties of pizza delivered hot to your office.</B></FONT>
			</TR>
                        </TD>
		</TABLE>
      </TD>
<TD>
<FORM Name="OrderForm">
<TABLE BGCOLOR="#FFFFCC" WIDTH=180 ALIGN=LEFT>
   <TR><TD BGCOLOR=NAVY ALIGN=CENTER><FONT COLOR=FFFFCC>Pick A Style...</TD></TR>
   <TR><TD><IMG SRC="/ie/images/SLICE.GIF" ALT="*" ALIGN=CENTER> <INPUT TYPE=RADIO NAME=RadioGroup onClick="DoHawaiian">Hawaiian  </TD></TR>
   <TR><TD><IMG SRC="/ie/images/SLICE.GIF" ALT="*" ALIGN=CENTER> <INPUT TYPE=RADIO NAME=RadioGroup onClick="DoChicago"> Chicago   </TD></TR>
   <TR><TD><IMG SRC="/ie/images/SLICE.GIF" ALT="*" ALIGN=CENTER> <INPUT TYPE=RADIO NAME=RadioGroup onClick="DoNewYork"> New York  </TD></TR>
   <TR><TD><IMG SRC="/ie/images/SLICE.GIF" ALT="*" ALIGN=CENTER> <INPUT TYPE=RADIO NAME=RadioGroup onClick="DoSeattle"> Seattle   </TD></TR>
   <TR><TD><IMG SRC="/ie/images/SLICE.GIF" ALT="*" ALIGN=CENTER> <INPUT TYPE=RADIO NAME=RadioGroup onClick="DoTheWorks">The Works </TD></TR>
</TABLE>
<TABLE BGCOLOR="#FFFFCC" WIDTH=180 ALIGN=RIGHT>
   <TR><TD BGCOLOR=NAVY ALIGN=CENTER><FONT COLOR=FFFFCC>Toppings...</TD></TR>
   <TR><TD><INPUT TYPE=CHECKBOX NAME=Pepperoni onClick="SetTotalCost">Pepperoni </TD></TR>
   <TR><TD><INPUT TYPE=CHECKBOX NAME=Onion onClick="SetTotalCost">    Onion     </TD></TR>
   <TR><TD><INPUT TYPE=CHECKBOX NAME=Pineapple onClick="SetTotalCost">Pineapple </TD></TR>
   <TR><TD><INPUT TYPE=CHECKBOX NAME=Salmon onClick="SetTotalCost">   Salmon    </TD></TR>
   <TR><TD><INPUT TYPE=CHECKBOX NAME=Anchovies onClick="SetTotalCost">Anchovies </TD></TR>
   <TR><TD><INPUT TYPE=CHECKBOX NAME=Ham onClick="SetTotalCost">      Ham       </TD></TR>
</TABLE>

<FONT FACE="WINGDINGS" SIZE=6>
   <MARQUEE DIRECTION=RIGHT ALIGN=MIDDLE>F</MARQUEE>
</FONT>
<BR>
<CENTER>
   <CENTER>
      <BR><FONT SIZE=4>Order Now!</FONT>
      <BR><BR>
      <INPUT TYPE=BUTTON VALUE="Order" NAME="Order" onClick="DoOrder"><INPUT TYPE=RESET VALUE="Reset">
      <BR><BR>
      <FONT SIZE=2>
      <I> The cost for a Pizza is $10.00 </I> <BR>
      <I> Each additional topping is $2.00 </I>
   </CENTER>
   <BR CLEAR=LEFT>
   <BR CLEAR=RIGHT>
   <BR>
   Description: <INPUT NAME=Text1 SIZE=60>
   Total = <INPUT NAME=Sum VALUE="$0.00" SIZE=8><BR>
</CENTER>
<BR>

</FORM>
<HR>
<FORM ID=FORM2>
<CENTER>
<H2>Customer Satisfaction Survey</H2><P>
Pick your favorite pizzas:<P>
<SELECT MULTIPLE NAME="Computer">
	<OPTION VALUE=Hawaiian>Hawaiian
        <OPTION VALUE=Chicago>Chicago
        <OPTION VALUE=NewYork>New York
        <OPTION VALUE=Seattle>Seattle
        <OPTION VALUE="The Works">The Works
</SELECT><P>

Pick your favorite topping:<P>
<SELECT NAME="Corporation">
          <OPTION VALUE=Pepperoni>Pepperoni
          <OPTION VALUE=Onion>Onion
          <OPTION VALUE=Pineapple>Pineapple
          <OPTION VALUE=Salmon>Salmon
          <OPTION VALUE=Anchovies>Anchovies
          <OPTION VALUE=Ham>Ham
</SELECT><P>

Enter your comments here:<P>
<TEXTAREA NAME="Text4" ROWS=5 COLS=50></TEXTAREA><P>
<INPUT TYPE=BUTTON VALUE="Send" NAME="Send" onClick="SendComments"><INPUT TYPE=RESET VALUE="Reset">
</CENTER>
</FORM>

フォーム定義部の対応

	CONTROL				TAG
	ButtonCtl Object			INPUT TYPE=BUTTON
	CheckboxCtl Object		INPUT TYPE=CHECKBOX
	ComboCtl Object			SELECT MULTIPLE
	ListCtl Object			SELECT 
	PasswordCtl Object		INPUT TYPE=PASSWORD
	RadioCtl Object			INPUT TYPE=RADIO
	TextAreaCtl Object		TEXTAREA 
	TextCtl Object			INPUT NAME
このように、VB ScriptとActiveXコントロールは、Visual Basicユーザーにとってみればハードルが低い。比較的カンタンに使いこなすことができるだろう。ただし、セキュリティの面ではまだまだ不安な側面もあることは否めない。それは、今後ブラッシュアップされていくことだろう。

現在のところ、Microsoftはセキュリティ以外の部分に熱心だ。それは分散オブジェクト環境である。つまり、サーバーからActiveXコントロールをダウンロードしてくるだけでなく、サーバーサイドにあるActiveXアプリケーションとクライアントサイドにあるActiveXコントロールが通信をしようというのだ。Visual Basic 4.0のリモートOLE、Windows NT 4.0のネットワークOLEがまさにそういう仕組みであるから、そのままインターネットに持ってきたと考えればよい(図PPT 16通常のクライアントサイドのOLE Automation、17インターネットでのOLE Automation)。この技術をDCOM(Distributed Componet Object Model)と呼んでいる。従来のOLEの核だったCOMを分散処理に合わせて拡張したものである。実際には、この仕組みがWindows NT 4.0に搭載されることになる。

ICP

Internet Control Packは、32bitのInternet用ActiveX コントロール集である。Windowsアプリケーション開発者をインターネットの世界へというのがテーマのようだが、前述したとおり、これではExchangeサーバーもWindows NTもいらなくなってしまう。

ともあれ、ActiveXというのはOCXだから、VB, VC++, Access などで利用することができる。比較的上位のプロトコルに合わせて作成されているので、WinSock APIやプロトコルに対する詳しい知識はなくてもなんとかなってしまう。さらに、フリーライセンスである。

本当にいいのだろうか...

ICPには、次のようなものがある。

クライアントおよびサーバー用があり、相手を指定する、すなわちTCP/IPを使った通信を実現する。実行時には非表示であり、双方向のデータ交換が可能だ。これさえあれば何でもできる。

クライアントおよびサーバー用があり、相手を指定しない、すなわちUDPでのブロードキャストを使った通信ができる。実行時には非表示であり、双方向のデータ交換が可能だ。これさえあれば本当に何でもできる。

FTPクライアントのコントロール。ファイル転送を実現する。実行時は非表示。

HTTPクライアントのコントロールである。つまり、HTMLドキュメントを直接取得できるものだ。MIMEの情報も得られる。

ここまでくると病気だが、HTMLデータの分析とレイアウトをしてしまうコントロールだ。つまり、ブラウザが作れてしまう。主な特徴は次の通り。

ニュースサーバへの接続、ニュースグループ・記事のリスト表示、記事の取得・投稿ができるコントロールである。

SMTPメールサーバーへのアクセスをし、インターネットメールの投函ができる。

POP3プロトコルによるメールサーバーへのアクセスをし、メールサーバーからのインターネットメールの取得が可能になる。あの重いExchangeはもう必要ない。

というわけで、実はウチでも作って売ろうとしていたものばかりであり、本当はすでに大半ができていたのだが売り物にならなくなった。残念だ。しかし、どうにかしてMicrosoftはインターネットの分野でも注目を浴びようとしているとしか思えない。こんなものをタダで配ってしまったら、本当にExchangeとかWindows NTは使われなくなってしまう。

サードパーティの動き

Microsoftがこれだけの動きを見せたのにいち速く対応した会社がある。カナダのNcompass Labs(www.ncompasslabs.com)だ。ここでは、Netscape対応のプラグインを使って、OCXを自動的にダウンロードする仕組みを作ってしまった。MicrosoftのActiveX構想に合わせて、早くもActiveXコントロールでも同様の仕組みになっている(図PPT 19,20)。

19の左側は、Wordのドキュメントを自動ダウンロードしてエンベッドしたもの。右側はクレーンのカスタムコントロールと操作をするパッドのカスタムコントロールで、クレーンの動きを制御するデモだ。20の左側はキューブがくるくるまわり、その面にビットマップを貼り付けることができるというものだ。ただし、執筆時にはVB Scriptはまだサポートされていない。

この方式でもセキュリティは甘く、ダウンロード前に確認のダイアログが出るだけだ(PPT 18右)。

ダウンロードすると、自動的にレジストリに登録されるので、Visual Basicに貼り付けて実行することも可能だ(PPT 20右)。

このように、VB ScriptおよびActiveX構想を実現しても、Inernet Explorerがシェアを取れるとは限らないことは容易に予想できる。

インターネットに合わせたBack Officeラインナップ

インターネットに合わせてBack Office系製品も充実してくる。これは、主に先に述べたIISを中心とするものだ。中でも4/27にバージョンアップするSQL Server 6.5では、Internet Database Connectorとの連携処理性能を最適化する。

たとえば、テーブルを HTML文書化するウィザードやWeb Assistantなども装備される。これは、トリガやスケジュールベースでHTMLを自動更新するというものだ。その他にもまた、IISのログもDBに蓄積することが可能だ。

ただし、インターネットからの利用ライセンスが新たに設定され、これが何と50万円である。NT Serverと合わせて70万円以上は基本ソフトとしてかかるということになる。また、IISの特性上デバッグ用にもう一つサーバーが必要となれば、もはや基本ソフトだけで100万円を越えてしまうし、ハードウェアも別に必要になってしまう。これは安いとは言えないような気がする。

HTML化を自動でおこなうウィザードは、Exchangeサーバーにも搭載され、図(PPT 21)のように各Back Office Serverはインターネットに対応して連携することになる。Microsoftでは、Fire WallやMarchant Serverなど他のサーバーラインナップも合わせて、将来的には図(PPT22)のようなラインナップにするという。

Microsoftはインターネットでも主導権を取れるのか

インターネットに遅れを取ったMicrosoftは、一気に形成を逆転すべく続々と製品やアーキテクチャーを投入したという印象だ。確かに、Microsoftの製品だけでもサーバー、クライアントともにかなりのレベルでシステムを構築できるだろう。しかし、UNIX主流できたインターネットでこれらの製品がどの程度受け入れられるかは、まだわからない。

また、これだけ製品を出すと矛盾点もある。たとえば、ICPを使えば、IE 3.0ばかりかVisual BasicでもTCP/IPに適したメイルやニュース、基本的な通信、UDP、FTPなどのアプリケーションを作ることができる。これは、サーバーがタダで手に入るFree BSDなどのUNIXで構築されたときにも使うことができるのだ。それならExchange ServerもIISもNT Serverもなくてもいいのである。現状ではその方がオープンで汎用性のあるクライアントアプリケーションになるのだ。

ちなみに、Free BSDは基本的に4.4BSD Liteであるから、完璧なUNIX OSであり、WWW Serverをはじめとしてほんどすべての仕組みやアプリケーションが、まるでPCのDOSベースと同様にカンタンにインストールできるようになっている。もちろんそれなりの知識は必要になるが、もはや、UNIXといえども難しく高価なものではなくなってきているのだ。このときの問題といえば、データベースとのコネクションがないことくらいだが、これくらいは「作ればあるもん」と言っておこう。現に、弊社ではUNIXでインターネット関係の標準的な既存ソフトウェアを使い、Windows NT用のOracleやSQL Serverと接続できるような構成にしたシステムを作り、すでに稼働させている。

このように考えてくると、IISのアドバンテージはインターネットの世界においてはさほど感じられない。しかし、イントラネットでは別である。やはり一人は専任の管理者を置かなくては運用できないUNIXと違って、Windows NTベースでのシステムの運用や管理は楽である。ただし、IISでのIDCを使ったデータアクセスは基本的に一つのSQL文に対応した画面としなくてはならないので、自由度の点では今一歩であり、複雑な処理には向かない。より高度なことをするには、ISAPIが必須になる。

とはいえ、IISやActiveXコントロール、VB Scriptは必ずある程度の普及はするであろうから、Netscapeをはじめとする他のブラウザもプラグインなどの仕組みで対応するようになるはずだ。となると、今度はIE 3.0のアドバンテージにも疑問が出ないではない。

否定的なことばかりを書いたような印象を持たれたかもしれないが、このMicrosoftのインターネット戦略が間違っているわけではない。私がMicrosoftの立場でも、既存の製品ラインナップを考えたらこのようにするだろう。逆に、短期間でよくここまでかんばったなという印象だ。クライアントとなるOSがWindowsベースである以上、これらの戦略がかなり受け入れられることは確かであろう。その間に、さらによい方向性を模索することになるのだろう。

ここまで書いて、どうもVisual Basicの記事ではなくなってしまったような気がしないでもない。しかし、やはりインターネットという新しいメディアでも、MicrosoftはVisual Basicを中心として据えているのだ。Visual Basicユーザーにとっては何とも嬉しいような複雑な話である。