2011-11-05[n年前へ]
■「Wolfram CDF PlayerをMathematicaとして使う方法」をRubyでもっと簡単にしてみた
「Wolfram CDF PlayerをMathematicaとして使う方法」を、Rubyコードを書くことで「もっと簡単」「わずか3ステップ」にしてみました。
Wolfram Mathematicaはプログラミング言語であり、優れた開発環境です。数式処理言語としてスタートしたMathematicaですが、今では汎用言語と言っても良いくらいに、さまざまなことができるようになっています。
しかし、そんなMathematicaの「玉にキズ」な点が「お値段」です。Mathematica を趣味で使う人たちのために295ドルで「Mathematica ホームエディション」が発売されています。今の円相場なら295ドルは2万3千円ほどになりそうなものですが、残念ながら、日本では(消費税を含めて)7万350円とかなりのお値段になってしまいます。
そこで、出てくるのが「Mathematicaで作られた「処理アプリケーション」を実行させることができるWolfram CDF Player(かつてWolfram Mathematica Player と呼ばれていたもの)で、汎用的な計算をさせよう」という要望です。無料で配布されているWolfram CDF Player はMathematicaで作られたコードを実行することができまずが、ユーザが任意の数式を入力して処理させることはできません。しかし、そんな”再生専用”MathematicaであるWolfram CDF Playerは、基本的にはMathematicaと同じ処理エンジンが組み込まれていますから、このWolfram CDF Playerに任意の処理をさせてしまおうというアイデアです。 (ここでは触れませんが、CDF PlayerはMathematicaで作られたアプリケーションを実行しているに過ぎない、という点もライセンス上実は重要なポイントです)
「Wolfram CDF PlayerをMathematicaとして使う方法」は「”決まったURL”から数式を読み込み、その数式を処理するプログラムをMathematicaで作り、そのプログラムをWolfram CDF Playerで再生させる」というアイデア・実装です。このアイデアのポイントになるのは、Wolfram CDF Playerは「”決まった一定のURL”から数式を読み込む」という「非任意」の処理をしているように見えて、実は”そのURL”が出力する数式を任意に変化させることで、任意の数式処理をさせてやる、ということです。「入力した数式をサーバに記憶させ、そのサーバからWolfram CDF Playerが数式を読み込み・処理を行う」という手順で、任意のプログラムをWolfram CDF Playerに実行させることができます。
しかし、「Wolfram CDF PlayerをMathematicaとして使う方法」で書かれている「ローカル・コンピュータに、PHPをインストールして・HTTPサーバを動かす」という手順は少しばかり面倒です。そこで、Rubyで同じことをもっと簡単にさせることができるコードを書いてみました。つまり、与えられた数式を記憶し・返すというWEBアプリをRubyで書いてみたのです。
require 'webrick' include WEBrick contents = '' s=HTTPServer.new(:Port=>80, :DocumentRoot=>'') s.mount_proc("/shutdown"){s.shutdown} s.mount_proc("/"){ |req,res| res.body = 'Work!?' if req.query['body'] contents = req.query['body'] res.body = req.query['callback'] + '.()' else res.body = contents if contents != '' end } trap("INT"){ s.shutdown } s.startこのコードをmath.rbとでも名付けてファイルに保存したら、
ruby math.rbと打ち(あるいはOSX などであれば、ポート80を開くにはルート権限が必要なので、 sudo ruby math.rbとでも打ち)、Universal Mathematica Manipulator 3にアクセスすれば、Mathematicaと同等の機能を使うことができます。 (ちなみに、http://localhost/shutdownにアクセスすれば、このRuby Webサーバは動作終了します)
Universal Mathematica Manipulator 3の左側の領域で数式を入力し”TAB”キーを押します。すると、(Rubyで書かれたローカルで動く)HTTPサーバがその数式を記憶します。そして、右側の領域で"eval"を押せば、ブラウザに埋め込まれたWolfram CDF PlayerがRuby HTTPサーバへと数式を探しに行き、結果として、任意のMathematicaプログラムを処理した結果が実行される、というわけです。もちろん、前もって、Wolfram CDF Playerをダウンロード&インストールしておくことも必要です。
下の画像は、Universal Mathematica Manipulator 3とRubyで書いたWEBサーバで下記コードを実行させてみた際の実行結果です。音楽教室の必需品、ルートヴィヒ・ヴァン・ベートーヴェンの姿が浮かび上がります。あなたなら、どんな風に遊んでみたくなりますか?…やることは簡単「Wolfram CDF Playerのインストール・Rubyコードのコピペ保存&実行・そしてUniversal Mathematica Manipulator 3にアクセスする」のわずか3ステップです。
ExampleData[{"Geometry3D","Beethoven"}]