レベル: 中級 Cameron Laird (Cameron@Lairds.com), Vice President, Phaseit, Inc.
2002年 7月 01日 Webプログラミングのための資料は山ほどありますが、「パチパチ」と音を立てるような刺激的なことでエンドユーザーに特別な印象を与えることを目的としたものがほとんどです。他方、サーバー・フレンドリーなWebアプリケーションを構築するための簡明ながらも効果的な技法については、ほとんど知られていません。今月の「サーバー・クリニック」では、サーバー・サイドのどんな言語にでも応用できる2つの効果的な考え方を説明します。
「サーバー・クリニック」の最初のコラムは、みなさんのほとんどが必要とする言語だとして、Expectを懸命に宣伝しているようにみえたでしょうか。そのコラムを発行して以来、その宣伝をどの程度信用してよいのかという質問が、たくさんの読者から寄せられました。
はっきり言って、答は「イエス」です。2002年4月のコラムで説明したとおり、Expectは、他のどんな言語よりも、システム・プログラマーがサーバー処理に必要としそうな用途関し汎用的な言語になっています。
しかし、だからといって、他の言語なんか捨ててしまえといっているわけではありません。現実問題として、このコラムを読む方は、すでに少なくとも1つは他の言語を知っていると考えてよいでしょうし、そのことは結構なことです。読者のLeam Hallは、このコラムの
ディスカッション・フォーラム に投稿したコメントの中で、質問の理由をいくつか説明しています。システム・アドミニストレーターである彼にとって最も切実な問題は、Expectが、shほど、あるいはawkと比べても、利用しやすい環境にあるとは考えられないことです。UNIXホストなら、すべて が、これらのユーティリティーを確実に提供しています。Expectを問題なくすぐに使えるようにしているホストは、ごくわずかです。
6月のコラムでは、配備の問題の重要性に焦点を当てました。もちろん、現下のニーズに対応しようというときに、何十台、何百台ものホストにExpectをインストールしなければならないというのが現実的でないことはわかっています。それでも、「遠隔制御」という技術的な解決策があり、これが、そのような場合に役に立つことも多々あります。この話題については、
ディスカッション・フォーラムで他にも議論されていますので、そちらも参照してください。
Expectと他の言語との関係には、協力という可能性もあります。私は、現在、JavaやPythonなどの言語を使って仕事をしたいが、Expectの能力も目いっぱい活用したいというプログラマーのために、両方の言語の特長を組み合わせて利用するためのクラスを研究中です。これについては、年内中に、また言及したいと思います。
簡単な棒グラフ
ExpectではCGI (コモン・ゲートウェイ・インターフェース) を介してWebページに棒グラフを表示するというようなこともできるのだろうか、という質問を寄せられた読者もいました。以下に示すように、これは、たやすいことです。10行もあれば充分です。ただ、この手法がよく知られていないだけのことです。また、多くの人が、そういうのはPerlでしかコーディングできないと誤解して信じています。
Webページに棒グラフを表示する方法として、私は、少なくともアーキテクチャー的に8通りの別個な方法を知っています。その最も一般的な方法は、1994年10月にNetscapeのバージョン0.9のベータ版がディレーション技法を可能にしたときに初めて考案されたもののようです。最近ではあまり使用されなくなっていますが、私は、今でも、この方法が、さまざまな種類のブラウザーとの互換性とサーバー・サイドの負荷の軽さを最もうまく両立させていると見ています。この手法、さらにはそれに関連する「シングル・ピクセル」技法を世に広めたのは、Dave SiegelというWebデザイナーでした。一方、Robert M. FreeもGIF*DOTという商標名で、それとほとんど同じことを行っています。また、Mal Sutherlandは、そのWeb Developmentシリーズで、シングル・ピクセル技法を教えています。
図1. Expectでコーディングした簡単な棒グラフ
ごく簡単なディレーションのコーディングによって、図1のような結果を得ることができます。Expectでは、これを以下のようにコーディングすることができます。
リスト1. barchart_expect.cgiのソース・コード
#!/usr/local/bin/expect
puts "Content-type: text/html\n"
# This is just an image of a single blue pixel.
set blue http://starbase.neosoft.com/~claird/tmp/blue.gif
puts "<HTML><BODY>
<table border='0' cellspacing='1' cellpadding='0' bgcolor='#ffffcc'>
<tr valign=bottom>"
set heights_to_chart [list 100 10 30 20 70 59 88 11 66 62]
foreach height $heights_to_chart {
puts "<td><img src='$blue' width='15' height='$height'></td>"
}
puts </tr></table></BODY></HTML>
|
棒の部分を「クリック可能」にしたり、凡例をつけたり、動的な計算にしたがって着色するといったことも、ほんの数行追加するだけで実現できます。といっても、重要なのは、基本的にどんな言語でも、Cであれ、shであれ、Rubyであれ、もちろんExpectでも、Iconでも、アセンブリー言語でも、このような図を生成できるということを理解しておくことです。今度みなさんが棒グラフを表示する必要があるときには、ディレーションと好みの言語を使って、サーバー・サイドでWeb生成を実現してみてください。
モニター
Expectは、また、他のサーバー・サイド言語と同様、Web「モニター」の構築機能を備えています。
みなさんは、これまで、Webアプリケーションで、リモート変数に注意を払わなければならないことがあったでしょうか。たとえば、お天気サイトを訪れた場合、比較的最新の気温が表示されるように、「リロード」とか「リフレッシュ」を数分おきに押すということがあります。
もちろん、この手法には、美観的なまずさがあります。リフレッシュを行うたびに、ブラウザーは、少なくとも一時的に真っ白になります。そのような画面の乱れは余計であり、欲しいのは、画面はそのままで、テキストかグラフィックの一部だけが更新されるWebページです。たとえば、視覚的な効果には、サーバーの負荷が閾値を超えたときに色を緑から赤に変えるとか、一番新しく接続された3本の電話番号を表示するとか、大規模な製品プロセスで一番最近解析された蛋白質の配列 (protein sequences) を表示するといったことがあるでしょう。
多くの開発者がそのようなアプリケーションにしたいと思っており、私も4種類のソリューションを開発してきましたが、そのようなモニターを自分でコーディングできるWeb技術者は、わずかしかいないようです。中でも最も素晴らしいのは、私がDOM 2モニターと呼んでいるものです。これは、クライアント側のJavaScriptの機能を利用してDOMノードのdata を更新します。
今回の記事も含め「サーバー・クリニック」の連載記事では、しばしば、サンプル・コードをいろいろな種類の言語で表現したいと思います。まずはDOM 2モニターをExpectで記述しましたが、同じアイデアをいろいろな言語で実現できることを強調するために、次の例はPythonで記述します。
図2. Pythonでコーディングした簡単なDOM 2モニター
以下の参考文献に示したURLをたどれば、「ライブの」モニターを確認することができます。図2で示したページは、「画面の切り替え (flashing)」を起こすことなく、ほとんどは、そのままの表示で、サーバーの時刻の表示だけが秒を刻みます。このページを生成しているのは、以下のソース・コードです。
リスト2. monitor_python.cgiのソース・コード
#!/usr/local/bin/python
import sys
import time
print "Content-type: text/html\n"
print """
<HTML><HEAD>
<title>Web application 'monitor' demonstration</title>
</HEAD><BODY> <p id ="x1">Replace me.</p>
<p>You need IE 5.5, Netscape 6, or Mozilla 0.9.5,
or greater, to see this effect.
</body>
"""
print """<script language="JavaScript" type="text/javascript">
myP=document.getElementById("x1");
myTextNode=myP.childNodes[0];
</script>
"""
while 1:
time.sleep(1)
print """
<script>
myTextNode.data = 'The time at the server is %s.'
</script>""" % time.ctime(time.time())
sys.stdout.flush()
|
この設計でサーバー・サイドの言語が行っているのは、わずかな作業だけであり、周期的にスリープしては、クライアントで解釈されるJavaScriptのテキストを送出しているだけのことです。この場合、重い作業を行っているのはブラウザーです。データがどっと押し寄せるたびに、ブラウザーはJavaScriptの変数を更新し、それらの変数にしたがって変わる表示を更新する必要があります。
まとめ
そう、Expectは、広い範囲の問題を解決します。しかし、Expectですべてを行おうとしても、おそらく、うまくいかないでしょう。とくに、すでに他の言語で満足している場合には。そうです、ExpectはCGIにも使えます。たとえば、Web上の棒グラフとかモニターなどは、わずか数行で実現できます。しかしながら、Expectが、そのようなWebアプリケーション用の唯一の言語だというわけではありません。実際、本稿で2つの例を紹介しましたので、それらの例を、みなさんの知っている言語に合わせて書き換えることも可能です。
ディスカッション・フォーラムに参加して、みなさんが作成したWebモニターのことを紹介してください。Webモニターを使えば、Webブラウザーでどこからでもサーバーの状態を監視したり、他の人にサーバーの状態を示したりすることができますので、私は非常に重宝しています。モニターするのに適した変数には、以下のようなものがあります。
- マザーボードの温度
- 化学物質の濃度の測定値
- 大規模な電気通信回路のテストの中間結果
- システム負荷
- 現在ログインしているアカウント数
- 大規模なシミュレーションにおける部分的な計算結果
「サーバー・クリニック」の次回以降のコラムでは、システム・プログラミングに関係する他のWebプログラミング技法、仮想ファイル・システムの考え方、「並列性 (concurrency)」の意味、他いろいろなことを取り上げたいと考えています。
参考文献
-
.gif color dot は、Tcl言語を使って1ピクセルのカラー画像を動的に生成します。
- CameronがこれまでdeveloperWorks に寄稿した「サーバー・クリニック」のコラムは、以下のとおりです。
- developerWorks のLinuxゾーンには、他にもLinux関係の記事が多数掲載されています。
著者について  | 
|  | Cameronは、Phaseit, Inc. の常勤のコンサルタントです。オープン・ソースなどの技術的なトピックについて、数々の執筆や発言を行っています。Cameronのメール・アドレスはclaird@phaseit.net です。 |
記事の評価
|