|
8.6 MSPスクリプトの例題
8.6 MSPスクリプトの例題 以下はMSPのサンプルです.それぞれにMSPの詳細や特徴が現れています.この全サンプルのソースがMSPScripts/ExamplesディレクトリににあるMathematica MSPアプリケーションに収められています. 8.6.1 はじめに:Hello.msp 前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/MSP/Examples/HelloでこのMSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります). この例ではMathematica のDate[]関数を評価します.結果はこのページにアクセスする度に変化し,これが実際に動的なプロセスであることを示します.サーバは「Hello」のリクエストを見てHello.mspというMSPを探します.このページのソースはMSPScripts/Examples/Hello.mspにあります.
<html> <head> <title>Hello World (MSP)</title> </head> <body> <h1>Hello World (MSP)</h1> <h4>Date[]</h4> <%Mathlet Date::usage %> <p>Its current value is:</p> <%Mathlet Date[] %> </body> </html>
これはほば標準的なHTMLですが,<%Mathlet expr %>という2つのMathletのタグが含まれています.Mathematica はこのタグの付いたものすべてに関し,内容を評価しフォーマットした結果で置換します.これで新しいHTMLドキュメントが作成され,それがクライアントに返されます. この例ではユーザはページを呼び出しているだけですから,ちっとも面白くないでしょう.インタラクティブな動作をさせるためには,ユーザ自身がリクエストに入力値を加えて送らなければなりません.次の例「Variables.msp」ではこれについて考えてみましょう. 8.6.2 変数を使う:Variables.msp 前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/MSP/Examples/VariablesでこのMSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).この例では変数が入力にどのように連結されるかが示されます.このページのソースはMSPScripts/Examples/Variables.mspにあります.
<html> <head> <title>Assigning Variables</title> </head> <body> <h1>Assigning Variables</h1> <form action="Variables" method="post"> Enter something: <input type="text" name="input" size="10"> <br> <%Mathlet $$input %> <br> <input type="submit" name="submitButton" value="Evaluate"> </form> </body> </html>
これにはformとinput要素が入っていて,先程のものよりも複雑になっていますが,これはクライアントとのインタラクションを行う重要な方法です. form要素はinput要素を持つHTMLのブロックです.submitタイプのinputを送ることでformが活性化されます.submitはinputタグに関連した名前と値をサーバに送信します.ここでは,form要素の最初のタグには2つの属性があります.action属性はformが活性化されたときに接続するURLを参照します.ここではオリジナルのVariablesスクリプトを示す相対URLが参照されています.method属性はブラウザにどのHTTPメソッドを使うかを指示します.ここではpostメソッド(これが一般的です)になっています. この例には2つのinputタグがあります.最初のタグはページのユーザがテキストを入力することを許可し,2つ目のタグは,押されるとformを送るボタンを指定します.formは,送信されるとinput要素からの情報をaction属性で指定されたURLに送ります.この場合は同一のMSPです.ユーザが入力した情報はMathematica のカーネルに送られ,Mathematica のシンボルに割り当てられます.シンボル名はname属性の値の前に$$を付けたものになります.ここではname属性はinputで,Mathematica のシンボル$$inputがinput要素の内容に割り当てられます. このページに最初にアクセスしたときは,$$inputの値はありません.テキストフィールドに値が記入され,「Evaluate」ボタンが押されて,はじめてテキストが表示されます.値はMathematicaの文字列で,「5+7」のような計算を入力しても実際の計算は行われない点に注意してください.Mathematica で入力を解釈し評価したい場合はMSP関数のどれかを使わなければなりません. Mathematica のシンボルはすべて$$で始まっているので,サーバから定義を受けるMathematica のシンボルをその他のシンボルと見分けることができます.これは画像マップのようなサーバからのシンボルが他のMathematica のシンボルと重ならないようにするために必要です. 8.6.3 MSPの関数を使う:Expand.msp 前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/MSP/Examples/ExpandでこのMSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).ここでは多項式と指数が入力できます.submitボタンを押すと,多項式がベキ乗され,展開されます.そして,結果が書かれたHTMLページが返されます.このページのソースはMSPScripts/Examples/Expand.mspにあります.
<html> <head> <title>Expanding Polynomials</title> </head> <body> <h1>Expanding Polynomials</h1> <form action="Expand" method="post"> Enter a polynomial (e.g. x+y): <input type="text" name="expr" size="10"> Enter a positive integer (e.g. 4): <input type="text" name="num" size="3"> <br> <%Mathlet MSPBlock[{$$expr, $$num}, Expand[$$expr^$$num]] %> <br> <input type="submit" name="submitButton" value="Evaluate"> </form> </body> </html>
これにも前の例で説明したformとinputのタグが付いています.また,Mathletは標準的な使われ方ではないMathematica の関数を参照しています. formが送られるとサーバはMathematica カーネルに接続します.ここでは2つのシンボル$$exprと$$numが2つのinput要素からのテキストに割り当てられます.テキストがなければシンボルは定義されません. 次にMathematica がMathletを評価します.MSPBlockコマンドはプログラミングコンストラクトで,ここでは$$exprと$$numの2つの変数を検査します.もしどちらかに値がなければMSPBlockはヌル文字列を返します.ですから,はじめてこのページにアクセスしたときには結果が見えないのです.次にMathematica が両変数の値を解釈します.成功すると解釈の結果が第2引数あるいはMSPBlockのボディに代入されます.この例では$$exprの値がすべて$$exprの値を解析したもので置き換えられています.$$numも同様に処理されます.次に,その結果が評価され,フォーマットされてHTMLページに置かれます.そしてそのHTMLページがクライアントに返されるのです. Mathematica による変数の解釈がうまくいかない場合が2つ考えられます.ひとつは入力がf[}のようにMathematica の有効な入力ではない場合,もうひとつはReadList["/etc/passwd"]のように危険な入力である場合です.どちらの場合も入力は拒否され,エラーメッセージが出されます.これは,システムのセキュリティ機能を示しています.これについては「セキュリティ」のセクションで説明します. 8.6.4 グラフィックス:Plot.msp 前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/MSP/Examples/Plot経由でこのMSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).ユーザはこれを使って関数を入力し,プロットすることができます.このページのソースはMSPScripts/Examples/Plot.mspにあります.
<html> <head> <title>Plot</title> </head> <body> <h1>Plot</h1> <form action="Plot" method="post"> Enter a function: <input type="text" name="fun" size="24" value="<%Mathlet MSPValue[ $$fun, "Sin[x]^2"] %>"> Enter a number: <input type="text" name="x1" size="24" value="<%Mathlet MSPValue[ $$x1, "10"] %>"> <br/> <%Mathlet MSPBlock[{$$fun, $$x1}, MSPShow[Plot[$$fun, {x, 0, $$x1}]]] %> <hr/> <input type="submit" name="btnSubmit" value="Evaluate"> </form> </body> </html>
この例では,はじめてページがリクエストされたときに,2つのテキストinput要素がMathletを使って値を埋めます.入力を提案したり,前の入力を保存したりすることが役に立つことが多々あります.2つのMathletがMSPValueを使って第1引数の変数の値を返すか,その変数に値がなければ第2引数の値を返します.これは引用された属性値の行内での拡張の提供というMathletの新しい使い方の例です.Mathletはこのページのシンタックスのために完全にコンテキストを離れて評価され,ページのどんな部分でも補いながらどこへでも行くことができます. 続いて3番目のMathletが評価します.MSPBlockが,$$funと$$x1の両方にPlotコマンドで使える有効な値があることを確認します.MSPShowがサーバに画像を保存し,この画像を参照するのに必要なHTMLを返します.ブラウザの「View Source(ソースコードの表示)」オプションを使うと,そのページが画像をどのように参照しているかを見ることができます.画像にはGIF形式が使われます.第3引数を設定すると,JPEGのような他の形式で画像を保存することもできます.これに関しては「MSP関数のリファレンス」のセクションをご覧ください. 8.6.5 タイプセットの画像:Integrate.msp 前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/MSP/Examples/IntegrateでこのMSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).ユーザはここで関数を入力し,これを積分することができます.結果はタイプセットシステムでフォーマットされ,画像として保存されます.このページのソースはMSPScripts/Examples/Integrate.mspにあります.
<%Mathlet integrand = Null; If[ MSPValueQ[ $$expr], integrand = MSPToExpression[ $$expr]] ; %>
<html> <head> <title>Integration</title> </head> <body> <h1>Integrate a function</h1> <form action="Integrate" method="post">Input: <br> <input type="text" name="expr" size="24" value="<%Mathlet MSPValue[ $$expr, "Sin[x]^2"] %>"> <br/> <%Mathlet If[ integrand =!= Null, MSPFormat[Integrate[integrand, x], StandardForm] %> <br/> <input type="submit" name="btnSubmit" value="Evaluate"> </form> </body> </html>
この例ではMathletが式を積分し,MSPFormatを使って結果をStandardFormでフォーマットします.これが画像を生成し,画像への参照を返します.これがうまくいくためには,Mathematica のフロントエンドを使わなければなりません. この例はMSPToExpressionを使ってのページを範囲とした変数の使い方も示しています.これは少々複雑ですが表現力の豊かなMSPBlockの使用に代る選択肢です.ページ変数のintegrandはNullに初期化され,後に,変数の値が変更されると積分が行われます.この入力変数に実際の値がある場合にのみ$$exprの解釈された値が割り当てられます.$$exprを解釈しているときにセキュリティエラーのようなエラーがあると例外が投げられ,新たな値にintegrandが割り当てられることはありません.変数の使い方でページを範囲とする以外に,セッションを範囲とする方法もあります.これにはMSPSessionVariableを使います. 8.6.6 ライブ3Dプロット:Plot3DLive.msp 前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/MSP/Examples/Plot3DLiveでこのMSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).ユーザはここで関数を入力し,LiveGraphics3Dのアプレットを使ってプロットすることができます.このページのソースはMSPScripts/Examples/Plot3DLive.mspにあります.
<html> <head> <title>Live 3D Plotting</title> </head> <%Mathlet $ImageBackground = "#ffffff"; $ImageSize = {300, 300}; %> <body bgcolor = "#ffffff"> <h1>Live 3D Plotting</h1> <form action="Plot3DLive" method="post"> Plot3D of <input type="text" name="fun" size="22" value = "<%Mathlet MSPValue[ $$fun, "Sin[x y]^2"] %>"> <br/> x from: <input type="text" name="x0" size="10" value = "<%Mathlet MSPValue[ $$x0, "-2"] %>"> to: <input type="text" name="x1" size="10" value = "<%Mathlet MSPValue[ $$x1, "2"] %>"> <br/> y from: <input type="text" name="y0" size="10" value = "<%Mathlet MSPValue[ $$y0, "-2"] %>"> to: <input type="text" name="y1" size="10" value = "<%Mathlet MSPValue[ $$y1, "2"] %>"> <br/> Number of points to plot: <input type="text" name="pts" size="5" value = "<%Mathlet MSPValue[ $$pts, "20"] %>"> <br/> <%Mathlet MSPBlock[ {$$fun, $$x0, $$x1, $$y0, $$y1, $$pts}, MSPLive3D[ Plot3D[$$fun, {x, $$x0, $$x1}, {y, $$y0, $$y1}, PlotPoints -> $$pts]]] %> <br/> <input type="submit" name="btnSubmit" value="Evaluate"> </form> </body> </html>
この例ではたくさんのMathletを使ってパラメータを設定しています.最後のMathletがこれらのパラメータの値を取り,これを使ってPlot3Dを呼び出します.この結果はLiveGraphics3Dアプレットを呼び出すMSPLive3Dに伝えられます.これで3Dグラフィックスオブジェクトのリアルタイムの回転ができるようになります. 8.6.7 一般的な内容を返す:Content.msp 前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/MSP/Examples/ContentでこのMSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります). 今まで見てきた例では,どれもHTMLがブラウザに返されていましたが,いろいろなフォーマットを使った一般的な内容をWebで扱うこともできます.MSPはMSPReturnを使って任意の内容を返すことができます.次はいろいろなフォーマットがどのように返されるかの例です.ソースはMSPScripts/Examples/Content.mspとMSPScripts/Examples/Content.mにあります. まず,これがMSPのソースです.
<html> <head> <title>General Content</title> </head> <body bgcolor="#ffffff"> <h1>General Content</h1> <form action="Content" method="post"> <p> This example generates a notebook, converts it into a specific format and returns that format. </p> <%Mathlet If[ MSPValueQ[ $$button], Get[ "Content.m"]; MSPReturn @@ GeneralContent[ $$button]] %> <br> <input type="Submit" name="button" value="Notebook"> <input type="Submit" name="button" value="PostScript"> <input type="Submit" name="button" value="GIF"> </form> </body> </html>
これがMathematica のソースです.
MakeNotebook[] := UseFrontEnd[ Module[ {nb, nbobj}, nb = NotebookCreate[] ; NotebookWrite[ nb, Cell[ "A Dynamically Created Notebook", "Title"]] ; NotebookWrite[ nb, Cell[ "Converted to " <> $$button, "Subtitle"]] ; NotebookWrite[ nb, Cell[ "The date is " <> ToString[ Date[]], "Text"]] ; nbobj = NotebookGet[ nb] ; NotebookClose[ nb] ; nbobj]]
GeneralContent[ fmt_] := Module[ {nbobj}, nbobj = MakeNotebook[] ; UseFrontEnd[ Switch[ fmt, "Notebook", {ToString[ nbobj, InputForm], "application/mathematica"}, "PostScript", {DisplayString[ nbobj, "EPS"], "application/eps"}, "GIF", {DisplayString[ nbobj, "GIF"], "image/gif"}, _, "Unknown format"] ]]
この例では1つの評価で変数$$buttonをテストします.formのボタンの1つを起動することでこの変数が値を持つと,それは返すフォーマットタイプを指定するのに使われ,関数GeneralContentに渡されます.この関数のMathematica のコードは,変数が設定されるとロードされるようになっている別のパッケージにあります.GeneralContentは簡単なノートブックを作る関数MakeNotebookを呼びます.MakeNotebookは,Mathematica Notebook APIとJ/Link の関数UseFrontEndを使ってノートブックを生成します.実際には,これはもっと興味深いノートブックを構築するのに使われます.MSPReturnはノートブックの表現形をコンテントタイプと共にサーバに返します.これがブラウザに返されます.ブラウザが適切に設定されていれば,必要なヘルパーアプリケーションが配置されます. 実際の例では,動的に生成されたノートブックがクライアントからのリクエストと共に送られた情報を使います. 特別な内容を返したい,またその内容と一緒に使いたいファイル名を設定したい場合は,MSPReturnの引数が3つあるタイプを使うとよいでしょう.これについては「MSP関数のリファレンス」セクションをご覧ください. MSPPageOptionsを使うと,これとは別の方法でMSPスクリプトから内容が返されるように設定することができます.これについては後で詳述します. 8.6.8 アプレット:TextApplet.msp 次の例ではMathematica のパワーを使ったWebサイトをアプレットから呼び出してみます.これはクライアントとサーバプログラミングの組合せで行われます.このセクションにはJavaのプログラミングも出てきます. 前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/MSP/Examples/TextAppletでこのMSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).このページのソースはMSPScripts/Examples/TextApplet.mspとwebMathematica/WEB-INF/src/ExampleApplets/TextApplet.javaにあります. これがMSPのソースです.
<%Mathlet If[ MSPValueQ[ $$Compute], MSPReturn[ "Date[] returns " <> ToString[ Date[]], "text/plain"]] %> <html> <title>Applet Test</title> <body> <p> Here is an applet that gets a result from Mathematica: <br> <applet CODE="TextApplet.class" archive = "<%Mathlet $WebApplication <> "/Resources/applets/MSPExamples.jar" %> " width=400 height=30> <param name="ArgumentURL" Value="TextApplet?Compute=True"> </applet> <p> Hitting refresh will cause the page to update. </body> </html>
次はアプレットのためのソース,TextApplet.javaです.
import java.applet.Applet; import java.awt.*; import java.net.*; import java.io.*; public class TextApplet extends Applet { public void paint(Graphics g) { super.paint(g); try { URL url=new URL(getDocumentBase(), getParameter("ArgumentURL")); InputStream in=url.openStream(); ByteArrayOutputStream out=new ByteArrayOutputStream(); byte[] b=new byte[1024]; int len; while((len=in.read(b, 0, 1024)) != -1) { out.write(b, 0, len); } b=out.toByteArray(); g.drawBytes(b, 0, b.length-1, 20, 20); } catch (Exception e) { System.out.println("Error "+e); } } }
これは非常に単純なアプレットです.paintメソッドがURLへの接続を開きます.そのURLはアプレットをロードしたドキュメントとparamタグから渡されたArgumentURLというパラメータの値によって名付けられています.これによってTextApplet MSPが呼ばれ,日付け計算が返されます. 8.6.9 Javaのコールバック:Request.msp この例ではJ/Link によって提供される機能である,MSPがJavaを呼び出す方法を示します.J/Link はMathematica にJavaを呼び出させたり,JavaにMathematica を呼び出させたりできます.Javaから呼び出したMathematica がJavaへコールバックすることも可能です.この機能についてはJ/Link のマニュアルに詳述されています.この例には多少のJavaの知識が必要です. この例はHttpServletRequestオブジェクトのメソッドをどのように呼び出すかのデモンストレーションです.HttpServletRequestオブジェクトとは,サーブレットエンジンがHTTPのリクエストに関する情報を保持するJavaのオブジェクトです.HttpServletRequestについては,サーブレット関連の書籍やhttp://java.sun.com/products/servlet/にあるサーブレットAPIについてのドキュメントをご参照ください. 前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/MSP/Examples/PlotScriptでこのMSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).このページのソースはMSPScripts/Examples/PlotScript.mspとMSPScripts/Examples/PlotScript1.mspにあります. これがRequest.mspのソースです.
<html> <head> <title>Request Information</title> </head> <body bgcolor="#ffffff">
<h1>Request Information</h1>
<h4>HTTP Method</h4>
<%Mathlet $ServletRequest@getMethod[] %>
<h4>Header Names and Values</h4>
<%Mathlet JavaBlock[ Block[ {headers, res, $PathWidth = 100}, headers = $ServletRequest@getHeaderNames[] ; res = Rest[ NestWhileList[ Module[ { name = headers@nextElement[]}, {name, $ServletRequest@getHeader[name]}] &, 1, headers@hasMoreElements[] &]] ; MSPFormat[ TableForm[res ], OutputForm] ] ] %> </body> </html>
最初のMathletは$ServletRequestオブジェクトのgetMethodメソッドを呼び出します.すると使用されたHTTPメソッド(通常GET)が返されます.2番目のMathletはgetHeaderNamesで返されるJavaのEnumerationを使ってヘッダから名前と値を抽出するもう少し洗練されたコードを使います.これはTableFormによってフォーマットされて返されます. 8.6.10 ファイルのアップロード:UploadFile.msp この例題はwebMathematica のサーバへのファイルのアップロードの方法を示します. 前述のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/MSP/Examples/UploadFileでこのMSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).使われているスクリプトは2つです.最初のスクリプトがファイルを送信する形式を持ち,2番目のスクリプトがファイルを読んでその内容を表示します.このページのソースはMSPScripts/Examples/UploadFile.mspとMSPScripts/Examples/UploadFileAction.mspにあります.以下はUploadFile.mspの一部です.
<form method=post enctype="multipart/form-data" action="UploadFileAction"> <p> Enter a file to upload: </p> <br /> <input type="file" size=40 name="file"> <br /> <br /> <input type="reset" value="Clear"> <input type="submit" value="Submit"> </form>
ここにはMathematica の計算は含まれていないので,実際にはHTMLのページです.これはUploadFileAction.mspが簡単に参照できるようにMSPとして書かれています.multipart/form-data というform要素を使っています.この要素はファイルを送信する標準的な方法です.フォームはUploadFileAction.mspに送信されます.次はそのUploadFileAction.mspです.
<html> <head> <title>Upload File Action</title> </head> <body> <p> File contents: </p> <br> <pre> <%Mathlet file = "FileName" /. MSPGetUploadFile[]; Read[ file, Record, RecordSeparators-> {}] %> </pre>
<p> <a href="UploadFile">Upload another file?</a> </p>
</body> </html>
これは関数MSPGetUploadFileを使います.この関数がファイルをアップロードしてサーバ上に保存します.サーバはサーバ上で使われるファイル名,クライアントで使われたオリジナルのファイル名,コンテントタイプ等の便利な情報のリストを返します.アップロードするファイルが複数の場合には,MSPGetUploadFileが例外を投げます.複数のファイルをアップロードする場合はMSPGetUploadFileListを使うとよいでしょう.この例では,その後ファイルの内容が読まれ,描画されます.もちろんその他のインポート関数を使い,続けて計算をしても簡単にできるでしょう.
|