Documentation 8. 以前の webMathematica 技術![]() |
![]() ![]() |
このセクションではMSPの処理のさまざまな段階を説明します.先の項で説明したように,MSPはwebMathematica Webテクノロジーの旧形式です.
MSPのスクリプトはHTTPのトランザクションの一部として処理されます.クライアントがサーバにリクエストを送ると応答が返されます.HTTPのリクエストの機能のひとつにパラメータと値がサーバに送れるというものがあります.これはあらゆる動的な動作の基本です.パラメータは応答を選び制御するために使われるからです.応答は一般にHTMLページの形で送られますが,他の形を取ることもあります.例として画像,Mathematica ノートブック,何らかの形のXML等が挙げられます.
webMathematica テクノロジーの基本コンポーネントはMSPサーブレットです.これはリクエストを処理し,サイトから応答を返すために使われます.http://host/webMathematica/MSP/ScriptのようなURLでwebMathematica Webアプリケーションとそれが含んでいるMSPのサーブレットが見付けられます.これはデフォルトの設定ファイルweb.xmlによって可能になります.このファイルはURLにMSPを含むリクエストがMSPサーブレットに向けられるようにするサーブレットのマッピングの方法を設定します.
MSPサーブレットは各リクエストを別々のスレッドで扱うので,1度に2つ以上のリクエストを処理することができます.まず,スクリプト名を決定し,次にMathematica カーネルを入手して変数を割り当て,該当ページやそのページに含まれているmathletを処理し,必要なら後処理を行い,結果を返します.
MSPサーブレットの最初の仕事はスクリプト名を決定するためにURLを分割することです.一般に「MSP」というサーブレットの名前の後ろで,URLに置かれたパラメータに先行する部分を取り出します.これはPathInfoとして知られていてCGIの変数PATH_INFOと等しいものです.前置あるいは後置のスラッシュ記号(/)はPathInfoからは取り除かれます.PathInfoに複数の要素がある場合は,最初の要素が取り出されてセッションプール名と比較されます.一致したプールがあるとPathInfo(プール名が取り除かれたもの)がMSPスクリプトに使われ,これに対応するセッションプールが使われます.一致するものがなければPathInfo全体がMSPスクリプトの名前として使われ,Generalプールが使われます.
カーネルプールとはMathematica カーネルの集合のことです.これについては「複数カーネルプール」に関するセクションで説明してあります.デフォルトでは「Generalプール」という1つのプールしかありません.URLの残りの部分が使用するスクリプトを示します.この中にサブディレクトリに関する情報が含まれていることもあります.セッションプールやMSPの名前にはバックスラッシュ(\)やコロン(:)のような記号を入れることはできません.プラットフォームによってはこのような記号をパスのセパレータとして使うものもあるからです.では例題でこのプロセスを見ていきましょう.
http://host/webMathematica/MSP/ComputeというURLのPathInfoはComputeです.ここにはプールの名前は入っていません.ですからスクリプトはCompute.mspになり,カーネルのGeneralプールが使われます.
http://host/webMathematica/MSP/Examples/ComputeというURLでは,PathInfoはExamples/Computeです.Examplesという名前のセッションプールがあれば,このプールのCompute.mspというスクリプトが使われます.Examplesという名前のセッションプールがなければ,スクリプトはExamplesというサブディレクトリのCompute.mspになります.
http://host/webMathematica/MSP/Examples/Tests/ComputeというURLでは,PathInfoはExamples/Tests/Computeです.Examplesという名前のカーネルプールがあれば,Testsというサブディレクトリの中にあるこのプールのCompute.mspというスクリプトが使われます.Examplesという名前のカーネルプールがなければ,スクリプトはExamples/TestsというサブディレクトリのCompute.mspになります.
スクリプト名を$ScriptNameという変数で指定することもできます.これはURL上で設定できます.例えば,http://host/webMathematica/MSP?$ScriptName=Computeはhttp://host/webMathematica/MSP/Computeと同じスクリプトを参照します.
MSPサーブレットは,先のセクションで説明したように,選ばれたカーネルプールのMathematica カーネルをリクエストします.指定されたプールがない場合はGeneralプールが使われます.プールには計算のためにMathematica カーネルが待機しています.すぐ使えるカーネルがないときは,システムは使えるようになるまで待機します.プールしてあるものを使うので,複数のリクエストがMathematica カーネルを共有することができ,システムの応答時間が短くなります.
各リクエストが全く別のカーネルを呼び出す可能性がありますのでご注意ください.あるMathematica カーネルで何かを保存し,次回にまた使うことは期待できません.
リクエストで送られた変数は,次に値と共にMathematica カーネルに送られます.変数symと値funに,Mathematica の$$sym = "fun"という割当てが行われます.これで,値はMathematica の文字列として送られ,何らかの特別のアクションなしでは評価されなくなります.input要素だけが変数のソースではないのでご注意ください.例えば,画像マップも変数を転送します.webMathematica はこれらの変数の名前を付け替えて,ユーザのMSP中のMathematica コードと干渉し合うことを防ぎます.
各変数はスキャンされ,有効なMathematica のシンボルであるかどうか確認されます.「.」という記号はすべてバッククォート(`)で置き換えられます.またアンダースコア(_)は「U」で置き換えられます.名前の変換はJ/Link におけるそれと一致します.
以下は変数名の変換例です.
その後,各変数は文字,数字,ドル記号($),バッククォート記号(`)しか含んでいないことが確認されます.これにより,エクスクラメーション記号(!)で始まる変数を送る攻撃が抑止されます.エクスクラメーション記号で始まる変数はMathematica にオペレーティングシステムのシェルの操作を始めさせ可能性があるので,潜在的な危険性を孕んでいるのです.
各値はMathematica の文字列になります.ここで,バックスラッシュ記号(\)やダブルクォート記号(")があると,バックスラッシュ記号(\)が追加される形で拡張されます.値がエクスクラメーション記号(!)で始まっている場合は,スペースが加えられます.最後にダブルクォート(")が前後に加えられます.
Mathematica カーネルとのインタラクションはMSPIncludeを呼び出すことで始まります.MSPIncludeはMSPDirectoryにスクリプトを見付け,Mathletタグを求めてこれをスキャンします.各Mathletの内容が評価されます.この際,値を処理して画像を保存するMSPの関数を呼び出すこともあります.Mathletを処理した結果が文字列なら,この文字列はHTMLページに含まれるように返されます.結果が文字列でなければMSPFormatでフォーマットされます.これでMathletがHTMLの文字列を返せるようになります.また,常に文字列を返す必要があるわけではないので便利でもあります.
MSPExceptionが投げられた場合,それはMathletの処理コードで受け取られ,適切なエラーメッセージが挿入されます.
MSPReturnコマンドが評価されると,現行のものを含むすべてのMathletの処理が直ちに終了され,結果がMSPサーブレットに返されます.コンテントタイプはMSPサーブレットが決定できるような形で保存されます.MSPReturnコマンドが1つもなければ,MSPスクリプトの内容は,各Mathletがその評価の結果で置き換えられて返されます.この場合のコンテントタイプはデフォルトのtext/htmlですが,これはMSPPageOptionsのContentTypeオプションの設定を使って変えることができます.
各Mathletの処理はTimeConstrainedでラップされます.時間のパラメータはKernelTimeLimit設定パラメータから計算されます.
ページの処理中にMathematica のメッセージが生成されると,そのメッセージはMathLink 接続を通してMSPサーブレットに返されます.MathLink のパケットリスナがメッセージを捕らえ,MSPのログシステムにこれを送ります.これが詳細モードで起動されているとメッセージが表示されます.パケットリスナの説明はJ/Link のドキュメントにあります.
カーネルが結果を返した後,MSPサーブレットはカーネルにリクエストのコンテントタイプを決めるように求めます.一般に,これはtext/htmlですが,Mathematica ノートブック用のapplication/mathematicaやGIF画像用のimage/gifのようにこれとは違ったものの場合もあります.このように異なったコンテントタイプはMSP関数のMSPReturnによって,あるいはMSPPageOptionsのContentTypeオプションの設定で生成することができます.
$ContextPathがページがロードされる前の値に再設定されます.Needsを使うとページのリクエスト毎にパッケージをロードしなくて済みます.Mathematica ブックにはNeedsのさらに詳しい使い方が載っています.
カーネルはリクエストと共に送られたパラメータの値をクリアし,デフォルトコンテキストのシンボルをすべて除去してクリーンな状態になります.加えて,Javaオブジェクトの参照はどれも除去され,開かれたストリームはすべて閉じられます.そして,カーネルはカーネルプールに戻され,次のリクエストに備えます.
クライアントへの応答は結果とコンテントタイプからなっています.これでリクエストが完成しました.
画像が加わると,この手順が少し変わります.MSPFormatあるいはMSPShowが画像を生成すると,その画像はファイルに保存され,そのファイルを参照するimgタグが返されます.
<img src="/webMathematica/MSP?MSPStoreID=MSPStore1043815006_0&MSPStoreType=image/gif" alt="Created by webMathematica" />
SRC属性はMSPサーブレットを相対URLを介して参照し,ファイルの名前を与えるパラメータを渡します.MSPサーブレットはファイルの内容を返し,定期的に古い画像ファイルを削除する操作を行います.
設定ファイルには,画像が保存されているディレクトリ名がImageDirectoryで設定されます.プロットその他の画像がうまく動かない場合は,画像ディレクトリに関連した問題がないかどうかをログファイルで確認してください.ログファイルについては「ログ」をご参照ください.
ページ処理の概要は「webMathematica の技術」をご覧ください.
![]() ![]() |