hirax.net::inside out::2011年11月05日

最新記事(inside out)へ  |   年と月を指定して記事を読む(クリック!)

2011年10月 を読む << 2011年11月 を読む >> 2011年12月 を読む

2011-11-05[n年前へ]

「Wolfram CDF PlayerをMathematicaとして使う方法」をRubyでもっと簡単にしてみた  share on Tumblr 

 「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"}]

「Wolfram CDF PlayerをMathematicaとして使う方法」をRubyでさらに簡単にしてみた