Mathematica 9 is now available
6.1 変数

ドキュメント6. より高度なトピック

 

6.1 変数

このセクションではwebMathematica のページにおける変数の使い方について説明します.入力変数の処理や,スコープのようにwebMathematica のページのコードで局所変数を使う問題を取り上げます.

webMathematica には入力変数,ページ変数,セッション変数の3つの変数があります.$$で始まる変数は入力変数です.この変数はHTTPリクエストによって値を与えられ,ページが終了してカーネルがクリーンにされるとクリアされます.$$で始まらない変数は値を割り当てられたときにしか値を取りません.ページ変数の場合,ページがクリアされるときにこの割当てもなくなります.セッション変数の場合,値はHTTPセッションが終わるまで残ります.

以下で,これらの変数について詳しく説明します.

6.1.1 入力変数

入力変数は$$で始まり,名前がHTTPのリクエストで送られているものには値が与えられます.どれが入力変数かを知るのは重要なことなので,入力変数には特別の名前が与えられています.以下の例では,入力変数$$settingに入力要素に入れられた値が与えられます(入力要素がsettingという名前を使うからです).変数に値があるかどうかはMSP関数のMSPValueQを使って調べることができます.

<input type="text" name="setting" />

<msp:evaluate>
   If[ MSPValueQ[ $$setting],
      ....
      ]
</msp:evaluate>

入力変数の値を解釈すべきかどうかは重大なことです.変数の実際の文字列の値がユーザに適切なものであれば,それを使うべきでしょう.また,文字列の値がMathematica コマンドへの入力を表しているのなら,それを解釈する必要があるでしょう.解釈するためにはMathematica が解釈できるものでなければならず,結果はセキュリティシステムの認証をパスするようなものでなければなりません.セキュリティシステムに変更を加えるようなら,解釈しない値を使うことを考えた方がよいでしょう.

入力変数の解釈

Mathematica で入力変数を計算したい場合は,これを解釈しなければなりません.webMathematica には解釈のためのいろいろな関数があります.これらの関数はセキュリティ機能を使うので,他ではなくこれらを使うことが重要です.セキュリティ機能をバイパスすることはシステムのセキュリティを危険に晒すことになります.

MSPBlockMSPToExpressionは入力変数から式を得るために提供されているものです.もちろんこれはどんなタイプのインタラクティビティにも不可欠なことです.このプロセスには2つの段階があります.第1段階では解釈が,第2段階では認証が行われます.解釈によってMathematica への入力が決定され,認証によって実行されるMathematica のコマンドがサイトのセキュリティを危険に晒さないことが保証されます.

解釈は,Mathematica への入力を決定するパーサを呼び出すMathematica の関数ToExpressionに基づいて行われます.MSPBlockMSPToExpressionへの有効な入力は,Mathematica ブックにあるような通常のMathematica の入力かMathMLのどちらかです.次の例ではMathematica とMathMLの両方の入力を示しながら,MSPToExpressionを使って入力を処理しています.

まずMSPアプリケーションをロードし,次にセキュリティシステムをロックします.「セキュリティ」については該当箇所をご覧ください.

Needs[ "MSP`"];

SetSecurity[]

これでMSPToExpressionを使ってMathematica の入力の一部が解釈できます.

$$e1="x^y"

"x^y"

MSPToExpression[ $$e1]

xy

次の入力はMathMLです.

$$e2="<math><msup><mi>x</mi><mn>2</mn></msup></math>"

"<math><msup><mi>x</mi><mn>2</mn></msup></math>"

MSPToExpression[ $$e2]

x2

MSPBlockは入力変数の解釈された値を使う追加機能を提供します.これについてはMSPの関数のリファレンスに関するセクションでより詳しく説明してあります.

webMathematica はシステムのセキュリティを守るために検証を行います.検証ではサーバに送られたすべての入力をチェックして,Mathematica の計算で使っても安全かどうかを確かめます.「セキュリティ」のセクションにはこの件に関するより詳しい情報があります.

解釈された値と解釈されていない値

上述のように,入力変数を使うときは,常にその値をどのように扱うかを決めなければなりません.解釈されていない値を使って設定に基づいて選択することも可能です(これは文字列になります).また,Mathematica での計算に使えるように値を解釈することもできます.このセクションでは解釈された値と解釈されていない値の両方について説明します.前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/Examples/SimplifyIntegrate.jspでこのMSPに接続することができます.

次はMSPSelectOperation.mspform要素のリストです.

<form action="SimplifyIntegrate.jsp" method="post">
<msp:allocateKernel>
Input:
<br>
<msp:evaluate>
   integrand = Null;
   If[ MSPValueQ[ $$expr],
      integrand = MSPToExpression[ $$expr]] ;
</msp:evaluate>

<input type="text" name="expr" size="24"
value="<msp:evaluate> MSPValue[ $$expr, "Sin[x]^2"]</msp:evaluate>" />
<br/>
<br/>
<msp:evaluate>
   If[ integrand =!= Null,
      res = Integrate[ integrand, x] ;
      If[ $$simplify === "on", res = Simplify[ res]] ;
      MSPFormat[res, StandardForm]]
</msp:evaluate>

<br/>
<input type="submit" name="btnSubmit" value="Evaluate">
<br/>
Simplify result:
<input type="checkbox" name="simplify"
   <msp:evaluate> If[ $$simplify === "on", "checked=\"checked\""]</msp:evaluate>>
<br>
</msp:allocateKernel>
</form>

この例題にはリクエストで送信されるsimplifyexprの2つの入力変数があります.このうち最初のものは解釈されず起したいアクションを選択するのに使われます.2番目のものだけが,実際のMathematica の入力として解釈されます.これは内容の$$exprMSPToExpressionで解釈されている部分に現れています.これは通常のMathematica の式を表しており,Mathematica の関数Integrateへの入力として使われるので,こうする必要があるのです.チェックボックスの設定は変数$$simplifyによって実行され,値「on」があるかどうかテストされます.ですから解釈する必要はありません.一般に,必要がない場合は解釈しない方がよいでしょう.

MSPBlockとMSPToExpression

webMathematica は入力変数を解釈するためのMSPBlockMSPToExpressionの2つのMSP関数を提供します.このセクションでは両者を比較検討します.

MSPBlockは2者のうちの単純な方です.この関数は下記のように,値を解釈して使うためのコンパクトで簡単な方法を提供します.

<msp:evaluate>
   MSPBlock[ {$$expr, $$num},
      Expand[ $$expr^$$num]]
</msp:evaluate>

ボディの$$exprは,ここではExpand計算に使われていますが,入力変数$$exprの解釈された値を参照しています.$$exprの値が解釈できなかったりセキュリティテストに通らなかったりした場合は例外が投げられます.$$exprに値がない場合はMSPBlockは評価されず,nullという結果が返されます.

入力を解釈する別の方法にMSPToExpressionを使うものがあります.この方法は,ページ変数を使って解釈の結果を持てるようにします.これはMSPBlockの使用ほどきちんとしたものではありませんが,より表現に富んでいます.次の例をご覧ください.

<msp:evaluate>
   poly = Null;
   exponent = Null;
   If[ MSPValueQ[ $$expr, $$num],
      poly = MSPToExpression[ $$expr] ;
      exponent = MSPToExpression[ $$num]] ;
</msp:evaluate>

<msp:evaluate>
   If[ poly =!= Null && exponent =!= Null,
      Expand[ poly^exponent]]
</msp:evaluate>

この例題はwebMathematica $$exprの解釈された値をどのように取り出し,これをページ変数polyでどうやって保存するかを示しています.これは多くの異なる場所で解釈された値を使う場合に特に便利です.

6.1.2 ページ変数

BlockModuleFunctionのような標準的なMathematica のプログラミングコンストラクトはどれも,局所化とスコープという点に関してそれぞれ独自の動き方をします.その操作に関する詳細は,標準的なMathematica の参考文献でご覧ください.

msp:evaluateタグの中のMathematica コードにある変数を使うことができます.この変数は中間値を保存して計算に使うことができます.この変数はカーネルがクリアにされるときに一緒にクリアされるので,ModuleBlockのような正規のMathematica プログラム構造に入れるのは大切なことではありません.このため,これらはページ変数と呼ばれます.

以下の例ではページ変数tmpNullという値を持っています.この変数は次に入力変数$$exprMSPToExpressionをコールした結果を与えられます.MSPToExpressionが,例えばセキュリティエラー等のためにタスクを完了できなければ,例外が投げられ,tmpNullという値を持ち続けます.tmpNullでなくなっていれば,入力が問題なく処理されたことが分かるので,これを計算に使うことができます.

<msp:evaluate>
   tmp = Null;
   tmp = MSPToExpression[ $$expr] ;
</msp:evaluate>

<p>
<msp:evaluate>
   If[ tmp =!= Null,
      ....
      ]
</msp:evaluate>
</p>

ページが終了するとtmpもクリアされます.

6.1.3 セッション変数

あるページから次のページまで任意の値を保存したい場合は,MSPSessionVariableを使ってセッション変数を作ります.こうすると値をサーバに保存して別のページで使うことができます.これはHTTPセッションを使うので,特定のユーザのセッション変数は他のユーザには見えません(インターネットショッピングのショッピングカートが自分以外のユーザに見えないのと同じです).

以下のコード(部分)には2つの変数があります.このうちsavedInputMSPSessionVariableで宣言されたセッション変数で,xInputはページ変数です.2つめの評価でxInputに値があればその値はsavedInputに加えられます.

<msp:evaluate>
   MSPSessionVariable[ savedInput, {}];
   xInput = Null;
   xInput = MSPToExpression[ $$expr] ;
</msp:evaluate>

<p>
<msp:evaluate>
   If[ xInput =!= Null, savedInput = Append[ savedInput, xInput]];
</msp:evaluate>
</p>

セッション変数は計算の結果を割り当てて,後でそれを削除するというようにページ変数と同じように使うことができます.違いは,セッション変数の方はそのページが終了しても生き残る点です.

MSPSessionVariableの例題がSession.jspの項にありますので,そちらもご覧ください.



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT. CURRENT WEBMATHEMATICA DOCUMENTATION IS NOW AVAILABLE.