CDFMathematica 開発元 Wolfram Research 社のサイトでは、現在、CDF を大きく取り上げている。CDF は Computable Document Format の略で、計算可能なドキュメントファイル形式のこと。Mathematica 8 で作成した、スライダーやボタンで操作/再計算できるドキュメントをこの CDF 形式で保存しておくと、無償配布されている Wolfram CDF Player で操作/再計算できる。ちょうど、Adobe PDF にとっての AcrobatReader と同じで、作るには有償ソフトがいるけど作成物を使うのは無償ソフトで OK という形態だ。

当然ながら、CDF Player では、Mathematica ユーザーが CDF ファイル内に用意した範囲の計算しかできないのだが、CDF Player の計算エンジンにも Mathematica 同等の能力があるのだから(とは言っても、Import/Export といった入出力関数は封印されているし、Parallel〜 系の並列関連関数も使えない。また CDF Player ではもちろん保存もできない)、なんとかこれを汎用に使えないかを考えたくなるのは人情(?)。こんな話、Mathematica 代理店のブログに掲載するようなことじゃないのかもしれないけども、今回はそんな話。

このブログでも何度か紹介した矢吹さんのブログでは、UMM という名前で、このひとつの解を公開されている。CDF Player で入力できるテキスト入力フィールドは数値しか受け付けないので、任意の Mathematica 式を単一の長い数字列に変換する仕組みを別途用意し、CDF ファイル内のプログラムで逆変換することで任意式の評価を可能にしておられるとのこと。実現の方法がとってもインテリ。いつものことながらスゴイなぁ。

僕が見つけた方法はもっと泥臭。あれこれ試して気付いたのだけど、CDF Player は、J/Link で組んだ Java プログラム経由でならテキストファイルの読み込みが可能なようなのだ。この方法なら CDF Player の使用許諾にも抵触してないように見える。というわけで、テキストファイルに Mathematica 式を書いて保存しておき、これを J/Link 経由で読み込んで ToExpression する CDF ファイルを用意する。ただそんだけ。

書いてみたのが下記のスクリプト。Mathematica で評価実行したものを CDF ファイルとして保存して使うことを想定。
テキストファイル内で使うシンボル名と重複しにくいように umj` というコンテキストを付けた変数名にしたり、ファイルの再読み込みに対応したりするためにごちゃごちゃ書いてはいるけど、やってることはいたってシンプル。

Manipulate[
 If[umj`savedSymbols == {}, umj`savedSymbols = Names["Global`*"]];
 If[StringQ[umj`str], umj`reset[]; ToExpression[umj`str],
  "Mathematica式の書かれたテキストファイルを指定して下さい。"],
 Row[{
   Button["ファイル指定", SystemDialogInput["FileOpen"]
     // If[StringQ[#], umj`str = umj`load[umj`path = #]] &,
    Method -> "Queued"],
   Button["再読み込み", umj`str = umj`load[umj`path],
    Enabled -> Dynamic[StringQ[umj`str]]],
   Button["クリア", umj`reset[]; umj`path = ""; umj`str = Null,
    Enabled -> Dynamic[StringQ[umj`str]]]
   }, Spacer[8]],
 Row[{"ファイル: ", Dynamic[umj`path]}],
 {{umj`str, Null}, ControlType -> None},
 {{umj`path, ""}, ControlType -> None},
 {{umj`savedSymbols, {}}, ControlType -> None},
 TrackedSymbols :> {umj`str},
 SynchronousUpdating -> False, ContinuousAction -> False,
 Initialization :> (
   umj`reset[] := Remove @@ DeleteCases[
      Names["Global`*"], _?(MemberQ[umj`savedSymbols, #] &)];
   umj`load[path_] := Module[{br, s},
     Needs["JLink`"]; JLink`InstallJava[];
     br = JLink`JavaNew["java.io.BufferedReader",
      JLink`JavaNew["java.io.InputStreamReader",
       JLink`JavaNew["java.io.FileInputStream", path], "UTF-8"]];
     s = StringJoin[
      Riffle[Most@NestWhileList[br@readLine[] &, "", # =!= Null &],
       "\n"]];
     br@close[]; JLink`UninstallJava[]; s];
   )]

このスクリプト、例によってノーサポートなので、興味のある方は at your own risk でどうぞ。

※この記事の内容は執筆者の個人的見解で、ヒューリンクスによる公式情報ではありません。[免責事項]

トラックバック

この記事へのトラックバックURL
http://blog.hulinks.co.jp/cgi/mt/mt-tb.cgi/479
内容に対しての関連性がみられないものは削除する場合があります

コメントの投稿

Emailアドレスは表示されません。は必須項目です。
ヒューリンクス取り扱い製品の内容や購入に関するお問い合わせはヒューリンクスサイト連絡先へお願いいたします。投稿前にその他の注意事項もご覧ください。

HULINKS サイトの新着情報