|
5.7 Mathematica パッケージとアプリケーション
5.7 Mathematica パッケージとアプリケーション webMathematica はMathematica のコードをHTMLに埋め込む方法を提供します.コードの量が多い場合は,コードをMathematica のパッケージに入れてこのパッケージを参照するようにする方が便利でしょう.また,既存のMathematica のパッケージやアプリケーションを使用するためにはスクリプトが必要な場合もあります.たくさんのMathematica のパッケージが収録されているものの例としては標準アドオンパッケージが挙げられます.このセクションでは,Mathematica のコードとパッケージの使い方について説明します. 5.7.1 パッケージをロードする パッケージをロードするコードを加えるのは比較的簡単です.簡単な例をご覧ください.
<%@ page language="java" %> <%@ taglib uri="/webMathematica-taglib" prefix="msp" %>
<html> <head> <title>Live 3D Plotting</title> </head>
<body text="#171717" bgcolor = "#ffffff"> <html> <head> <title>ConvexHull Computation</title> </head> <body bgcolor="#FFFFFF"> <h1>ConvexHull Computation</h1> <msp:allocateKernel> <msp:evaluate>Needs["DiscreteMath`ComputationalGeometry`"]; </msp:evaluate> <msp:evaluate>ConvexHull[ {{1, 5}, {4, 1}, {10, 2}, {5, 4}}]</msp:evaluate> </msp:allocateKernel> </body> </html>
<msp:evaluate>というタグはNeedsを使ってパッケージをロードします.これとは別のあまりお勧めできない方法に,Getを使うものがあります.この方法ではページがロードされる度にパッケージがロードされるので,あまり効率的ではありません.Needsを使うと,パッケージのロードは初回だけになります. ここで重要な点は,一方のタグがパッケージをロードし,他方がパッケージの関数を使う点です.パッケージをロードするタグはパッケージの関数を使うべきではありません.もしもタグがパッケージの関数を使うと,シンボルのシャドーイング(隠蔽)の問題が起り,使いたい関数を隠してしまいます.シンボルのシャドーイングに関してはMathematica ブックをご参照ください.隠されたシンボルができると,警告メッセージが出されます.このメッセージのテキストはMSPGetMessagesで見ることができます.また,VerboseLogがオンになっていると,この警告メッセージがログファイルに表示されます.verbose logging(詳細ログ情報)とログファイルについての詳細は「ログ」と「カーネルモニタ」のセクションをご覧ください. 最後にパッケージのサブコンテキストの使い方の問題があります.Mathematica のアプリケーションパッケージにはサブコンテキストにシンボルを置くものも多いので,サブコンテキストの使い方が問題となる場合もあるでしょう.例えば,画像処理のパッケージではサブコンテキストが使われています.この例はImageProcessingアプリケーションパッケージをインストールしていないシステムでは動きませんのでご了承ください.
Needs["ImageProcessing`"]
Context[ ImageRead]
"ImageProcessing`ImageData`"
ここで,ImageRead関数はImageProcessing`ImageData`コンテキストで定義されています.MSPスクリプトを書くためには,MSPスクリプトにあるMathletで直接使いたいシンボルを含むコンテキスト全部にNeeds文を含めなければなりません.ですから,ImageRead関数が使いたければImageProcessing`アプリケーションとImageRead関数を含むコンテキストにNeeds文を挿入しなければならなくなります.次の例をご覧ください.
<msp:evaluate> Needs["ImageProcessing`"]; Needs["ImageProcessing`ImageData`"];</msp:evaluate> <msp:evaluate> ImageRead[ "datafile"]</msp:evaluate>
パッケージが正しく使われていないと感じたら,MSPスクリプトの中で直接使っているシンボルのコンテキストにNeeds文があるかどうか調べてみるとよいでしょう.ひとつの調べ方として,使っている関数のコンテキストをチェックする簡単なMSPを書いてみることが考えられます.
<msp:evaluate> Needs["ImageProcessing`"]; Needs["ImageProcessing`ImageData`"];</msp:evaluate> <msp:evaluate> Context[ ImageRead]</msp:evaluate>
画像処理のアプリケーションをインストールしてこのスクリプトをサーバで実行するとImageProcessing`ImageData`が結果として戻されます.これで,画像処理のアプリケーションから関数を適切に参照していることが分かります. パッケージのロードにMasterメカニズムを使う場合にもこれと同様の問題があります.この場合も個々のコンテキストにNeeds文を含めるか,あるいはシンボルの完全コンテキスト名を参照するかしなければならないでしょう.もちろん,前者を使うとMasterメカニズムを使う利点がなくなってしまいます.以下は完全コンテキストを使った例です.
<msp:evaluate> Needs["Graphics`Master`"];</msp:evaluate> <msp:evaluate> color = Graphics`Color`Red </msp:evaluate>
5.7.2 パッケージを書く 一定量のコードをご自分でお書きになる場合は,これをMathematica のパッケージとしてまとめ,webMathematica にロードすると便利です.webMathematica ページに入れるMathematica のコードはなるべく少なくしたいでしょうから,これは特にwebMathematica にとって重要なことです.パッケージの書き方に関する参照文書はたくさんあります.「付録」にある「リンク」の「Mathematica パッケージ」をご覧ください.パッケージのロードの仕方は前のセクションをご覧ください.パッケージを置く場所は次のセクションで説明します. パッケージはMathematica のレイアウトのどこかに置くか,あるいはそのパッケージを使うMSPと同じディレクトリに入れるとよいでしょう.サブディレクトリのスクリプトの位置を見付けるセクションでも説明しましたが,サブディレクトリもMathematica のパスにあります. ご自分のコードにMathematica のパッケージ形式は使わず大域的な定義を使われる場合は,スクリプトにアクセスする度にこれをロードする必要があります.これは,スクリプトにアクセスした際の後処理の問題のためです.コードはMathematica のパッケージにお入れになるようお勧めします. 5.7.3 パッケージをインストールする Mathematica コードのパッケージが使えるときは,これをwebMathematica が使える場所にインストールしてください.方法はたくさんあります.続くセクションではこのことについて見てみます. webMathematica アプリケーション webMathematica はwebMathematica/WEB-INF/ApplicationsにあるApplicationsディレクトリを提供します.このディレクトリはパッケージやアプリケーションを追加するのに使うことができます.ここに追加されたリソースはwebMathematica だけが使えます. $AddOnsDirectory $AddOnsDirectoryディレクトリは,パッケージやアプリケーション等のリソースをMathematica の全ユーザと1つのマシンにインストールされた全Mathematica で使えるようにインストールするための場所です.パッケージやアプリケーションは$AddOnsDirectory/Applicationsにインストールすることができます.ここだとwebMathematica から使うことができます. $UserAddOnsDirectory $UserAddOnsDirectoryディレクトリは,パッケージやアプリケーションを任意のマシンの特定のユーザが使えるようにするためのインストール場所です.パッケージやアプリケーションは$UserAddOnsDirectory/Applicationsにインストールすることができます.ここに置かれたパッケージやアプリケーションには,webMathematica サーバを実行している任意のユーザしかアクセスすることができません. スクリプトディレクトリ パッケージやアプリケーションを置くこの他の場所に,JSPのスクリプトが置かれているディレクトリがあります.デフォルトではこのディレクトリからファイルをロードすることはできません.MSPの関数MSPPageDirectoryを使えばMathematica のパスにこの場所を加えることができます.下記ではNeedsを使ってパッケージをロードし,Getを使ってデータファイルをロードしています.
<msp:evaluate> Block[{$Path=Append[$Path, MSPPageDirectory[]}, Needs["MyPackage`"]; Get[ "Data.m"]; ] </msp:evaluate>
こうすると,最小限の再配列でJSPのディレクトリとコードを別にインストールしてあるwebMathematica に移動することができるようになります. この方法の欠点は,直接リクエストすればMyFile.mというコードがWebサーバから直接ダウンロードできてしまう点です.ここにプライベート情報が含まれていると,セキュリティ問題になる可能性があります. $TopDirectory パッケージやアプリケーションをMathematica のレイアウト内にインストールすることもできます.こうすると,これらはそのMathematica のインストールでしか使えません.一般に,これはあまりお勧めできません. PackagesDirectory パッケージやアプリケーションをPackagesDirectory設定パラメータで指定されたディレクトリに置くことも可能です. 絶対ファイル名 コードをインストールする最後の方法は,絶対パス名を使うことです.次の例をご覧ください.
<msp:evaluate>Get[ "d:\\My Work\\LastOneThatWorked\\MyFile.m"]</msp:evaluate>
このようなロード方法は大変一般的ですが,通常あまりよい方法ではありません.こうするとコードが不安定になり,管理に手間がかかるようになります.ほんのちょっと手間をかけるだけで,前述の方法のどれかを使うことができます.
     
|