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



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アプリを書いてみようか…という気になってきます。

2009-10-21[n年前へ]

無料のMathematicaカーネルとIronRubyでP2Pグリッド数式処理システムを作ってみよう 

少し前、「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRuby」を使い、「無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる」 という記事で、Mathematicaで並列計算を可能にするためのコード例を書きました。制御用マシンと計算用サーバ間の通信はhttpを使い、多数のサーバ群で高機能数式処理並列計算を実行することができるシステムを無料で構築しよう、というアイデア・実装です。

 今日は、その時書いたコードをもう少し書きなおしてみました。書き直した点をひとことで言えば、それは「制御用マシン(用ソフト)」「計算用サーバソフト」といった区別をなくしたクラスを作ってみたということになります。また、それに加えてコマンドの投げ方を替えた&コマンドを投げる際にURLエンコードをかけるようにした、という変更を行いました。それが、下の(Iron)Rubyクラスです。

 というわけで、まずはこんなコードを書いてみましょう。名前は、mathnode.rbとでもしておきます。

class Mathematica
  require 'Wolfram.NETLink'
  include Wolfram::NETLink
  PAR="-linkmode launch -linkname
 'C:\\Program Files\\Wolfram Research\\
Mathematica Player\\7.0\\MathKernel.exe'"
  def initialize()    
  end
  def open
    @kernelLink=MathLinkFactory.CreateKernelLink(PAR)
    @kernelLink.WaitAndDiscardAnswer()
  end
 def do(q)
     @kernelLink.EvaluateToInputForm(q, 0)
  end
  def close
    @kernelLink.EvaluateToInputForm('MVClose[]', 0)
  end
end

class Mathnode
  require 'webrick'
  include WEBrick
  require 'net/http'
  require 'uri'  
  Net::HTTP.version_1_2
  attr_reader :server
  
  def initialize()    
    @m=Mathematica.new
    @m.open
  end

  def start(port)
    @server=Thread.new do
      @s=HTTPServer.new(:Port=>port, 
                             :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'
        res.body=URI.encode(@m.do(URI.decode(req.query['q']) )) if req.query['q']
      }
      trap("INT"){@m.close;@s.shutdown}
      @s.start
    end
  end

  def stop
    @server.shutdown
  end
  
  def sendCommand(host,port,q)
    result=''
    Net::HTTP.start(host,port){ |http| 
        r=http.get('/evaluate?q='+URI.encode(q))
        result=URI.decode( r.body )
    } 
    result
  end

end
 このクラスを使い、たとえば、こんなコードを書きます。
require 'mathnode.rb'
mathnode=Mathnode.new
mathnode.start(ARGV[0].to_i)
mathnode.server.join
名前は、node.rbとでもしておきましょうか。そして、コマンドラインから、こんな風に実行します。引数は、httpでコマンドを待ち受けるTCP/IPのポート番号です。
ir.exe node.rb 80
これで、ポート番号80を用い、プロトコルはhttpで、コマンドを待ち受け続けるサーバが立ち上がります。

 さて、同じmathnode.rbを使って、今度は計算をさせるための制御用コントローラを書いてみましょう。名前は、main.rbとでもしましょうか。

require 'mathnode.rb'
mathnode=Mathnode.new
puts mathnode.sendCommand(
  'localhost',ARGV[0].to_i,
  'Solve[x+y==3,x]')
これで、先ほど立ち上げた「計算用サーバ」に対して、x+y==3という一次代数方程式をxについて解かさせるプログラムのできあがり、です。使い方は、
ir.exe main.rb 80
です。これで、localhostの80番ポートでMathematicaコマンドを待ち受けるサーバに、x+y==3という一次代数方程式をxについて解かせるプログラムの出来上がりです。

 重要なのは、「計算用サーバ」と「制御用コントローラ」は、主従関係にあるようなクラスではなく、完全に同一のクラスである、ということです。ですから、peer to peer でデータ・命令を投げ合うグリッド計算システムを書き上げることもできるわけです。

 もちろん、前回「無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる」で書いたようなプログラムとして、こんな風に書いても構いません。

require 'pp'
require 'net/http'
require 'uri'

Net::HTTP.version_1_2
result=[]
threads = []
command='Solve[x+y==3,x]'
uri=['localhost']
port=[80]
2.times do |i|
  threads.push( 
    Thread.new do
      Net::HTTP.start(uri[i],port[i]){ |http| 
        r=http.get('/evaluate?q='+URI.encode(command));
        result<<URI.decode( r.body );} 
    end
  )
end
threads.each do |t|  t.join end
pp result
 これでも、全く同じ計算結果を得ることができる、無料のMathematica並列計算環境ができあがります。

 実際の使い勝手としては、「制御用マシン」「計算用サーバ群」という作りでも良いような気もしますが、それだけではつまらないので、今日はP2Pグリッド数式処理システムを作ってみた、というわけです。無料で使える道具だけで作ることができて、なおかつ、広い可能性が感じられるもの、ではないでしょうか。

2009-10-27[n年前へ]

「無料MathematicaPlayer+IronRuby+AJAX」で数式処理フロントエンドを作ってみよう 

3行で書ける(WEBブラウザ・インターフェースの)数式処理フロントエンド

 ウルフラム・リサーチから無料で配布されているMathematica Playerには、最高に高度な数式処理プログラムである Mathematicaのエンジンが内蔵されています。そこで、そのMathematicaのエンジン部である MathKernel(Mathematica Playerと一緒に配布されている)を.NETのインターフェースを用いて操作し、(.NETによるRuby実装である)IronRubyで自由自在に数式処理をすることに挑戦してきました。その準備作業や使い方は、「無料配布のMathematicaカーネルをIronRubyから自由自在に使ってみよう」から始まる、いくつもの(ラクガキ)記事を読めばわかると思います。

 今日は、以前書いたコードを少し書き直してみました。ひとつは、Mathematicaで数式処理をするノード(サーバ)を書くためのIronRubyクラスです(mathnode2.rb)。128行ほどの短いコードですが、さすがにここにそのまま引用するには少し長いので、リンクするにとどめておきます(IronRubyのコードは、ここに置いておきました)。

 といっても、以前のバージョンから実際にはほとんど変わっていません。httpを介したWEB I/Fに関して、いくつか修正をしたことと、せっかく(速度や機能を犠牲にして)httpを介したI/F仕様にしたのだから、ユーザー・インターフェースを介しても計算環境を簡単に使うことができる(AJAXによる)コマンド&結果表示機能を実装してみた、ということくらいです。もちろん、httpを通信プロトコルに採用しているからといって、「人間が操作することありき」で作成したわけではありません。単に、(たとえば「MathematicaPlayer+IronRubyでMathematica風AJAX WEBアプリ」の動作動画 のように)色々と流用可能だから、実装コードの行数が短くて済みそうだったから、という理由です。

 「ユーザー・インターフェースを介しても計算環境を簡単に使うことができる機能」というのを具体的に書けば、AJAXを使ったMathematica Player フロントエンドもIronRubyコード中に実装してみたのです。CSSなどは使わず1ファイルで計算&WEBサーバの機能を実装していますので、色々カスタマイズしがいのあるサンプルではないか、と思います。

 たとえば、今日書いた'mathnode2.rb'を使い(利用して)、たとえばこんなIronRubyコードを書いてみます(Mathematica Playerや.NET/LINK、あるいは、IronRubyの準備は前もってしておいてください)。

require 'mathnode2.rb'
mathnode=Mathnode.new
mathnode.start(ARGV[0].to_i)
mathnode.server.join
このコードを、"freeMathAlpha.rb"という名前でもつけ(このサンプルスクリプトも先のリンク先に置いてあります)、そのスクリプトを起動してみます。
ir.rb freeMathAlpha.rb 80
ここで、引数の80は(コマンド受信用として)httpで使うポート番号です。もちろん、80番である必要はありません。

 さて、こうすると、Mathematica計算用のノード(サーバ)が起動します。また、これまでに書いてきたように、異なるポートで複数立ち上げることもできます。

 この状態で、ためしにブラウザを立ち上げてhttp://localhost/にアクセスしてみましょう(たとえば、80番ポートで立ち上げたのでなく、81番ポートで立ち上げたのであれば、http://localhost:81/にアクセスしてみましょう。すると、ブラウザ上で下のスクリーンショットのような画面が現れ、あなたのブラウザ上でMathematicaを使うことができるようになります。入力も出力も、通常のMathematicaと同じような(似たような)画面構成ですから、Mathematicaを使ったことがある方であれば、簡単に使うことができると思います。

 さて、実際に使ってみると、有料版Mathematicaでは使うことができても、Mathematica Player付属のカーネルでは使うことができない関数がいくつもあることに気づかされます。けれど、その一方で、方程式を解いたり・数値処理をする分には、実にたくさんの機能を使うことができることにも、同時に気付かされます。本家 "WolframAlpha"ほどではないにしても、WEBベースの数式演算処理サーバが稼働し始めるのは、なかなかに楽しいものです。

 Matheatica Player、Ironruby、.NET/LINK、ブラウザ…どれも無料で使うことができるものばかりです。せっかくですから、一度は遊んでみると面白いのではないでしょうか。WEBブラウザ・インターフェースの数式処理フロントエンドもあることですし、ね。

「無料MathematicaPlayer+IronRuby+AJAX」で数式処理WEBアプリを作ろう「無料MathematicaPlayer+IronRuby+AJAX」で数式処理フロントエンドを作ってみよう






2009-10-29[n年前へ]

「MathematicaPlayer+IronRubyでMathematica風AJAX WEBアプリ」の動作動画  

 「無料MathematicaPlayer+IronRuby+AJAX」で数式処理フロントエンドを作ってみよう がどのように動作するか・どのように使うことができるのか、をわかりやすく眺め・わかりやすく感じることができるように、ブラウザ上で使っている最中の画面をキャプチャしてみました。それが、下に貼り付けた動画になります。



 IronRubyやMathematica、あるいは、.NETと言われても・・・何か敷居が高く感じてしまうという方も多いかもしれません。あるいは、使ってみたいけれど、ダウンロード・インストールするのが面倒だ・わかりにくい・・・、とか、そういった作業をする時間がないよ・・・という人も多いかもしれません。

 そこで、「とりあえず、どんな具合になるのか知りたい」という方のために、今日はとりあえず動作画面を誰でも眺めることができるようにしてみました。私がIronRubyで書いたコードもとても単純ですから、適当に直したり・カスタマイズしてみると、とても面白いのではないでしょうか。もちろん、「ここ修正すべし」といったアドバイスなど、大歓迎です。



■Powered by yagm.net