hirax.net::Keywords::「IronRuby」のブログ



2009-10-06[n年前へ]

無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる 

 今日も、「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRuby」を使って色々なことをしてみよう、という話の続きです。もちろん、さらにパワーアップした可能性を追求してみたいと思います。

 数式処理環境であるMathematicaには、オプション製品としてgridMathematicaという製品があります。Mathematicaでグリッド・コンピューティングを実現する、というようなネーミングの製品ではありますが、実際にはMathematicaで並列(パラレル)計算を実現するための拡張オプションです。価格は・・・眼の球が10cmくらいは前に突き出てしまうほどのお値段になっています。

 さて、「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRuby」を使えば、色々なことができるわけです。そこで、今日はgridMathematicaが可能にするようなことを、誰でも入手可能なツールで実現してみることに挑戦してみようと思います。

 本来ならば、分散処理環境をRubyで実装したdRubyなどを使いたいところですが、いくつかの理由から、今日は(IronRubyで動作する)ごくごく普通のRubyライブラリを使って、Mathematicaカーネルをネットワーク上で並列計算させることができるコードを書いてみることにします。

 まずは、(無料配布されている)Mathematicaカーネルを扱うサーバ・アプリを書いてみます。といっても、単にこれだけのコードです。

class Mathematica
  require 'Wolfram.NETLink'
  include Wolfram::NETLink
  def initialize()    
  end
  def open
     @kernelLink=MathLinkFactory.CreateKernelLink()
     @kernelLink.WaitAndDiscardAnswer()
  end
 def do(command)
     @kernelLink.EvaluateToInputForm(command, 0)
  end
  def close
    @kernelLink.EvaluateToInputForm('MVClose[]', 0)
  end
end

require 'webrick'
include WEBrick
m=Mathematica.new
m.open
s=HTTPServer.new(:Port=>ARGV[0].to_i, 
                             :DocumentRoot=>'',
                             :RequestTimeout=>600,
                             :MaxClients=>1)
s.mount_proc("/restart") {m.close;m.open}
s.mount_proc("/shutdown") {s.shutdown}
s.mount_proc("/"){|req,res|
  res.body='use /evaluate/command'
  if /evaluate\/(.+)$/=~req.path
    res.body=m.do($1) 
  end
}
trap("INT"){m.close;s.shutdown}
s.start
 これは、例題のため、多くの処理をはしょっていますが、例題の範囲ではきちんと動作するコードです。ひとことで言えば、URIを介して渡されたコマンドを実行した結果を返すWEBサーバアプリです。

 ちなみに、このスクリプトを mathematicaServer.rb と名付ければ、

ir.exe mathematicaServer.rb 80
という具合で、ポート80番でコマンドを待ち受けるWEBサーバが起動します。あるいは、
ir.exe mathematicaServer.rb 81
とすれば、ポート81番でコマンドを待ち受けるWEBサーバが起動します。複数台のPC上で実行しても構いませんし、あるいは、(テスト用として)一台のPC上で複数のサーバを実行しても構いません。もちろん、多数台のPC上でサーバー群を立ち上げる方が高性能になるのは言うまでもありません。

 さて、ここまで来たら、後はそれらのサーバ群に"Mathematica"による並列計算をさせるスクリプトを書いてみることにしましょう。たとえば、こんな感じです。

require 'pp'
require 'net/http'
Net::HTTP.version_1_2
result=[]
threads = []
command='2+2'
uri=['localhost','localhost']
port=[80,81]
2.times do |i|
  threads.push( 
    Thread.new do
      Net::HTTP.start(uri[i],port[i]){ |http| 
        r=http.get('/evaluate/'+command);
                        result<<r.body;} 
    end
  )
end
threads.each do |t|  t.join end
pp result
 このスクリプトをmathematicaController.rbとでも名付け、
ir.exe mathematicaController.rb
という風に起動してやります。もちろん、この並列計算を行わせるコントローラ側はIronRubyである必要はありませんから、
ruby mathematicaController.rb
でも構いませんし、計算サーバ群は結局のところ単なるWEBサーバ群なのですから、Rubyプログラムである必要もありません。

 このスクリプトの内容はとても簡単です。上の例であれば、ローカルPC上で動いている、2つのMathematicaカーネルを使ったサーバに対して、"2+2"という計算をパラレル(並列)に投げて、その結果を受け取りまとめているわけです。その結果、

["4","4"]
という計算結果が最終的には手に入ることになります。httpを使い、また、コマンドのをエンコード処理を行わずGETで投げつけていますが、それはあくまで簡単なテスト用であるためです。

 Mathematicaという最高の開発環境を使い、並列計算も可能にし、さらに、そういったプログラムを自分で書くことができる・・・なんて、とても楽しそうではありませんか?この「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRubyを使って、遊んでみよう」というシリーズ!?の可能性はまだまだ広がりそうです。

 さまざまなデータに対し透過的にアクセスが可能で、並列計算もとても簡単にできたなら、色々なことができそうだ、と思えますよね?無料配布のMathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheaticaコンピューティングのプログラムは、実際のところ5分程度で作ることができます。

 無料配布のMathematicaカーネルなのに、それが実に多くのことができることに驚かされます。少し時間ができたとき、こんなプログラムを作って遊んでみるのはいかがでしょうか。

2009-10-09[n年前へ]

無料配布のMathematica PlayerとIronRubyで天文学計算をしてみよう 

 さらに、「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRuby」を使って色々なことをしてみよう、という話が続きます。

 今日は、Mathematicaを使って計算(入手)可能なデータの中から、天文学に関するデータを使った計算例を紹介してみます。具体的には、現在位置(緯度・経度)を指定した上で、次に太陽が昇ってくる時間を習得するスクリプトの例です。たとえば、東京タワーの緯度・経度を指定した上で、次の日の出時刻を計算してみることにしましょう。

include System
require 'Wolfram.NETLink'
include Wolfram::NETLink
kernelLink=MathLinkFactory.CreateKernelLink()
kernelLink.WaitAndDiscardAnswer()
com='$GeoLocation={35.658587,139.745425};'
com+='AstronomicalData["Sun","NextRiseTime"]'
result=kernelLink.EvaluateToInputForm(
  com, 0)
puts result
kernelLink.close
 これだけ、です。しかも実際に使っているMathematicaの命令は、
$GeoLocation={35.658587,139.745425};
AstronomicalData["Sun","NextRiseTime"]
だけです。これだけで、
{2009, 10, 13, 5, 46, 0.9059999999990396}
という風に、2009年10月13日5時46分0.9秒に陽が昇るのか、と結果をすぐに手に入れることができます。もちろん、"Sun"でなく、"Moon"なら優雅に月が昇る時刻を手に入れることができますし、たとえば、火星だって・木星だって…地平線から顔を出す瞬間の時刻を計算することができます。ラプラスの悪魔のごとく、物事が動くさまを手に入れることができます。

 こんな風に色々なデータに一瞬でアクセスできるとなれば、しかも、面倒なWEB APIを叩かなくても良いとなれば、色々なことをしてみたくなりますよね。

2009-10-12[n年前へ]

引数付きのMathLinkFactory.CreateKernelLinkの書き方 

 無料配布のMathematicaカーネルを(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRubyから使うときに、引数無しの"MathLinkFactory.CreateKernelLink() "を使うと、毎回ダイアログが開き"MathKernel.exe"のパスを尋ねられます。そして、毎回パスを入力します。

 その作業は、やはり面倒くさいものです。そこで、「MathLinkFactoryでリンクを作成する」といったドキュメントを頼りに、(「ありがち」なMathematicaカーネルのパスを指定して)自動でMathematicaカーネルと通信を開始するスクリプトを書いてみます。(大文字小文字が最初の記事投稿では間違えていたので、mathkernel.exeからMathKernel.exeへと修正してあります)

require 'pp'

class Mathematica
require 'Wolfram.NETLink'
include Wolfram::NETLink

def initialize
   @kernelLink=MathLinkFactory.CreateKernelLink(
    "-linkmode launch -linkname 
    'C:\\Program Files\\Wolfram Research\\
     Mathematica Player\\7.0
    \\MathKernel.exe'")
   @kernelLink.WaitAndDiscardAnswer()
 end

 def do(command)
   @kernelLink.EvaluateToInputForm(command, 0)
 end

 def close
   @kernelLink.EvaluateToInputForm(
       'MVClose[]', 0)
 end

end

m=Mathematica.new
pp m.do('Table[i,{i,1,10}]')
m.close
 CreateKernelに引数をつけただけですが、Mathematica Playerのインストール先が決まっているなら、とても便利で手間要らずになるのでここにメモしておくことにします。

2009-10-13[n年前へ]

MathematicaとMathematica Playerの描画関数の違いを調べてみる 

 引き続き、無料で使うことができるMathematica Playerでどれだけのことができるのかを、色々調べています。

 Mathematica Playerに付属するMathematicaKernel.exeが表示・出力機能以外は、ほぼ機能制限がない理由が少しわかってきたような気がしてきました。

 Mathematica Playerは、Mathematicaのノートブックを閲覧することはできても、変数などを変えるなどの変更作業はできません。そのため、Mathematicaで作成されたファイルをMathematica Playerで閲覧するだけであれば、計算・評価機能が必要ではないように思えます。

 しかし、Mathematica Playerではユーザー・インターフェースを用いて動的にインタラクティブにグラフなどを表示する機能を使うことができます。すなわち.nbp形式に変換されたMathematicaノートブック上でグラフを自由度高く変化させることができるのです。

 Wolfram(ウルフラム)のサイトでMathematicaノートブックを.nbp形式に変換し、その.nbpファイルの中身を眺めてみると、表示されたグラフの一部はGraphic要素の内容が圧縮された形式として保存されています。つまり、2次元画像ならば圧縮された2次元画素のリスト(にRaterize関数をかけた)形式に、折れ線グラフなどは圧縮された二次元座標のリストデータ(にLine関数をかけた)形式として保存されています。そして、それだけではなくて、Plot関数なども使われているのです。

 そして、そのPlot関数の中身を動的に変化させることができるようになっているように見えます。内容をきちんと理解できてはいませんが、ざっと眺めた限りでは、そういう風に動いているように見えます。つまり、すべて通常のMathematica構文により、(Mathematica Playerで再生される)動的なコンテンツも実現されている、という風に見えます。

ただし、それらのPlot関数は、通常のMathematicaで使うことができるPlot関数とは第一引数が大きく異なるようです。そのため、Mathematica Playerに付属するmathematicaKernel.exeのデータ描画・可視化関数を通常のMathematicaのデータ描画・可視化関数と全く同じに使うことはできそうにありません。多少工夫をすれば使えそうにも思えますが、単純に同じように使うことはできそうにありません。

 とはいえ、Mathematicaの数値・数式処理/解析機能・各種データ取得機能を使うことができるだけでも、十二分に素晴らしいわけで、もう少し、無料のMathematica Playerを活用してどれだけ凄いことができるのか、その可能性をまだまだ追求してみたい、と思います。

2009-10-17[n年前へ]

エクセルからMathematica(無料Player)の計算機能を使う 

 今日は、「Microsoft ExcelからMathematicaの計算機能を使う」ということをしてみたいと思います。エクセル(Excel)のシートにMathematicaのコマンドを入力して、その評価を(無料で使うことができるMathematica Playerに付属する)MathematicaKernel.exeに評価させよう、というわけです。もちろん、その評価された結果をさらに通常のエクセルの機能を使って操ってやろう、ということになります。

 ExcelからMathematicaの機能を使うには、色々な実現方法がありますが、今回は「無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる」で作った、「URIを介して渡されたコマンドを実行した結果を返すWEBサーバ・アプリケーション」とエクセル(Excel)の「WEBクエリ機能」(「Excel VBA WEB連携術―2007/2003対応 」参照)を使って実現してみることにします。

 まずは、「無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる」で作ったサーバを立ちあげましょう。たとえば、

ir.exe mathematicaServer.rb 80
という具合にして、適当なポート(この例であればhttpの標準ポートである80番)でコマンドを待ち受けるWEBサーバが起動します。

 次に、エクセルのセルを選択し、(エクセル2003くらいのバージョン以降に備わっている機能である)「WEBクエリ」をします。エクセル2007であれば、「データ」-「WEBクエリ」で、URLを入力してやるのです。つまり、今回の例であれば、"http://localhost/evaluate/2+2"といった風に入力をしてやれば良いわけです。すると、小さなブラウザ風の画面が表示され、そこに"2+2"の計算結果が表示されます。後は、下のブラウザ風画面の下にある「取り込み」ボタンを押すと、「開いています ダイアログ」が表示された後に、「データを返す先のセル選択ダイアログ」が表示され、セル中にMathematicaカーネルによる評価結果が入力されるのです。エクセルとマセマティカ・カーネルとの間で、httpを介してデータがやりとりされる、というわけです。

 その実行過程を、もしも、エクセル側のVBAマクロを使って行うと、こんな具合になります。

Sub httpGet()
 Range("E3").Select
 With Selection.QueryTable
  .Connection = "URL;http://localhost/evaluate/2+2"
   .WebSelectionType = xlEntirePage
   .WebFormatting = xlWebFormattingNone
   .WebPreFormattedTextToColumns = True
   .WebConsecutiveDelimitersAsOne = True
   .WebSingleBlockTextImport = False
   .WebDisableDateRecognition = False
   .WebDisableRedirections = False
   .Refresh BackgroundQuery:=False
 End With
End Sub

 つまり、エクセルを使っているように見えて、そのエクセルは実は単なるMathematicaカーネルのフロントエンドとして使われている、というようなワザも行うことができるわけです。しかも、そのMathematicaカーネルは、(無料で使うことができるMathematica Playerに付属する)MathematicaKernel.exeだったりするわけで、「安い・うまい・早い」の三拍子が揃った、超お手軽便利ツールになる可能性があります。そう考えると、プロトタイピングお手軽版ではなく、真面目にMathematicaカーネルを操作するWEBアプリを書いてみようか…という気になってきます。



■Powered by yagm.net