2009-11-05[n年前へ]
■無料のMathematica Player + IronRuby でグラフィック出力
無料のWolfram Mathematica Playerに付属のMathematicaカーネルではグラフィック出力ができず、グラフ描画や各種グラフィック機能を有効利用するための方法を試行錯誤していました。そんな中、「Mathematica Player+IronPython関連記事」中の、無料のMathematica Playerで画像を出力してみた(IronPythonで)」で実に技術を駆使した方法で、その問題が解決されていました。
基本的な計算は、Mathematica Playerに付属するMathematicaカーネルにやらせ、その結果を画像にするRasterize部分を、Mathematica Playerにやらせる、そしてその結果を.NET/LINKで「操作スクリプト」に送りつける(スクリプト側はデータを受け取る)という、具合です。こういったスクリプトをさらりと書けるようになりたいものです…。
さて、というわけで、IronRubyで同様のことをしてみました。まずは、クラスなどは作らず、ただ単に「(ネットワークからの)データ取得→計算・画像作成→Windows上でフォーム上に描画」ということを順を追って行うスクリプトを書いてみました。それが、下になります。
# c.f. http://boxheadroom.com/2009/10/30/mathematica_ipy_image # c.f. http://d.hatena.ne.jp/arikui/20070918/1190050541 com='ExampleData[{"Geometry3D","Beethoven"}] ' width=1000 include System require 'System.Windows.Forms' require 'System.Drawing' require 'mscorlib' require 'Wolfram.NETLink' include Wolfram::NETLink kernelLink=MathLinkFactory.CreateKernelLink() kernelLink.WaitAndDiscardAnswer() kernelLink.EvaluateToInputForm( '$ct={{0,0,1},{0,1,0},{1,0,0}};',0) tmpl='$im=Rasterize['+com+ ', ImageSize->'+width.to_s+',Background->Black];' kernelLink.EvaluateToInputForm(tmpl,0) k=kernelLink.EvaluateToInputForm( '$im=ImageData[$im,"Byte"];',0) k=kernelLink.EvaluateToInputForm( '$im2=$ct.#&[#]&/@#&/@$im;',0) kernelLink.PutFunction( "EvaluatePacket",1) kernelLink.PutSymbol("$im2") kernelLink.EndPacket() kernelLink.WaitForAnswer() ret=kernelLink.GetObject() height=ret.length/width/3 form=System::Windows::Forms::Form.new() form.width = width form.height = height graph=System::Windows::Forms::PictureBox.new() graph.width=width graph.height=height graph.top=0 graph.left=0 graph.image=System::Drawing::Bitmap.new( width, height) height.times{|y| width.times{|x| color=System::Drawing::Color.FromArgb( 255,ret[y,x,0], ret[y,x,1], ret[y,x,2]) graph.image.SetPixel(x, y, color) } } graph.Refresh form.controls.add(graph) form.ShowDialog()このスクリプトを流すと、まずMathKernel.exeのパス(場所)を尋ねるダイアログが現れ、次にMathematicaPlayer.exeのパスを尋ねるダイアログが現われます。そして、Mathematica Playerが起動した後に、下の画像のような「ルートヴィヒ・ヴァン・ベートーヴェンの三次元像」が作成され、Windows上にダイアログとして現れます。
…数式処理ソフトウェアで眺めるベートーベンも(そのデータがネットワーク上から取得できることも合わせて)面白いですが、ここまで色々できてしまうということが、とても楽しいものです。つまりは、結果よりも、過程を楽しんでいるような感じです。
ところで、Pythonのコードを読むのは初めてだったのですが、何だか知らない言語を読むというのは「違った視点」を感じるような気がして、新鮮なものですね。
2010-03-11[n年前へ]
■各種Rubyを切り替えるpikを使ってみる
いくつかの異なるバージョンのRubyをインストールし、自由に切り替えて使うことができる、しかもgemでのアップデートなども同時に行うことができるpikを使い始めました。使い始めた理由は、好きな時に好きな「Rubyのバージョン違い・IronRubyやJRubyといった異なるRuby」を使ってみたかったからです。
まず、gemでインストールします。つまり、最初にRubyが入っていることが前提です。そして、その時に入っていたRubyが「default」になります。
gem install pikすると、使い方の説明表示とともに、インストールが終わります。
さらに、pikの配置作業を行いましょう。適当な場所にインストールして(環境変数の)PATHに追加するか、最初からパスが通っている(PATHに入っている)ディレクトリにpikを配置します。ここでは、単純のために、"C:\Windows"にpikを配置してみます。
pik_install C:\Windows
次は、さまざまなRubyのインストールです。pikでは、インストールできるRubyが自動でわかります。そこで、このようなコマンドを打ちます。
pik ls -r -Vすると、
pik 0.2.6 --- IronRuby: (以下省略) JRuby: (以下省略) Ruby: (以下省略)といった風に、インストールできるRuby一覧が出てきます(後で書くように、手動でこれ以外のRubyもインストールできます)。
適当なRubyをインストールするには、たとえば、このようにします。
pik install rubyすると、自動でRubyの一番新しいバージョンの 1.9.1-p378: http://rubyforge.org/frs/download.php/69039/ruby-1.9.1-p378-i386-mingw32.7z がインストールされます。
pik install jruby
pik install ironrubyでも同じです。また、もしもRubyのバージョン指定でインストール作業を行いたいならば、指定方法は色々ありますが、たとえば、
pik install ruby -v 1.8.7という具合です。
また、自動ではリストアップされないものに関しては(今日現在でのIronRubyの最新版1.05c=0.9.4などは自動ではリストアップされません)、手動で、ローカルにインストールした上で、
pik add C:\Windows\pik\IronRuby-094\binとしてやれば、gemの管理下に入ります。
あとは、
pik listと打てば、
092: IronRuby 0.9.2.0 on .NET 094: IronRuby 0.9.4.0 on .NET 140: jruby 1.4.0 186: ruby 1.8.6 [i386-mswin32] * 187: ruby 1.8.7 191: ruby 1.9.1p378という風に、切り替えて使うことができるRuby一覧が出てきます。あとは、
pik switch 191とすれば、ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32]が使われるように切り替わります。別に191という指定でなくても、「191: ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32]」という文字列の中から他と区別できる文字列をswitchで指定してやれば良いようになっています。
基本的には、「パスを切り替える」という作業を行うものなので、この状態で
pik switch 94とIronRuby 0.9.4.0に切り替えて、
ruby -vと打っても、こう言われるだけです。
'ruby' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。この場合は、
ir.exe -vとするか、そもそも(Ironrubyの)ir.exeをruby.exeという名前に変えておく必要があります。
pikを使うと、Rubyを切り替えることができるのも便利ですが、各Rubyにgemを一括で行うことができるのも便利です。たとえば、
pik gem install win32-mmapとすれば、各Rubyに切り替えつつ、それぞれに対してgemを行ってくれます。ただし、Rubyを切り替えた場合には、そのRubyの機能内のことしかできなくなる、ということには注意が必要です。IronRubyに切り替えたときなどは、実装されていないメソッドによりpik自体も、手作業なしに完全に自動で終了する、といわけではなかったりします(といっても、pikを使った方がずっと便利です)。どうしても、困ったことが起きた瞬間には、
pik defaultとして、「default」のRubyに戻して、作業をしてみましょう。
2010-04-16[n年前へ]
■「IronRuby 1.0」リリース
「IronRuby 1.0」リリース開発開始から3年、初の安定版
マイクロソフトは12日、.NET Framework上で動作するRuby実装「IronRuby 1.0」をリリースした。
IronRuby 1.0は、Ruby 1.8.6とのコンパチビリティをターゲットとし、.NET 4.0版と.NET 2.0 SP1版が用意されている。.NET 4.0版では最新の.NET 4.0の機能をサポートしており、.NET 2.0 SP1版は、オープンソースの.NET実装「Mono」と互換性がある。
IronRuby 1.0はRuby 1.8.6と互換性がある。現在の計画によると、IronRuby 1.0が1.8.xをサポートする最後のバージョンとなり、1.1以降はRuby 1.9.xをターゲットにするようだ。
IronRuby 1.0とRubyにはどれほど互換性があるのだろうか? 最新のテスト実行結果がironruby.infoにある。この大きな疑問に対する回答は「イエス(互換性はある)」だ。例えば、IronRubyはversion 2.3.5までのRailsを動かせる。
2010-04-18[n年前へ]
■「IronRubyとSQlite3でRuby on Railsを動かしてみました」
「IronRubyとSQlite3でRuby on Railsを動かしてみました。」
それはともかく。「できるという。」ってなんだか無責任な書き方ですよね。ほんとにできるのかヨ。というわけで、実際に試してみました。また、“Ruby”の公式実装の安定版「Ruby」v1.8.6との互換性も高く、Webアプリケーションフレームワーク“Ruby on Rails”を利用することもできるという。
2010-05-04[n年前へ]
■IronRubyとJavaScriptでMathematicaフロントエンドを書いてみる(修正してみる)
以前、IronRubyでMathematicaのフロントエンドを作ってみました。以前作成したコード(JavaScript部分)にバグがあったこともあり、今日は少し手直しをしてみました(Mathematica Playerでも動作するコードになっていますが、Mathematicaのライセンス上、PlayerでないMathematicaに付属するKernelとともに使うことを前提にしています)。今日書いたコード・ファイル類は、ここに置いておきます(mathnode.rbの6行目には、あなたの環境のMathematicaKernel.exeパスを記述してください)。また、(ファイルに添付してあるリンク先から)Wolfram.NETLink.dll をダウンロードし、スクリプトと同じフォルダに入れておく必要があります。
今日修正した部分は、「処理する数式をエンコードするJavaScriptコード(encodeURIComponent関数) を書き忘れていたこと」「WEBページのカスタマイズをしやすいように、RubyコードとHTMLコードを分離したこと」「(前述対応およびスレッドが1つしかないことによるデッド・ロックを防止するように)Webrickのコードを書き変えたこと」になります。ちなみに、前回作成したコードだと、処理する数式をきちんとエンコードしていないため、演算子などの処理に誤りが生じ、たとえば、3+2を解かせると、(恐ろしいことに)6という答えが返ってきてしまいます。
また、今日作成したHTMLコード(index.html)の冒頭部分には、スタイルシート(css/hatena/hatena_ryukyu-green/hatena_ryukyu-green.css)読み込みの記述がありますが、これは、はてなの(GPLライセンスにもとづいている)スタイルシートを使うことができるようにしてあるためです。ですから、それらのスタイルシートをダウンロードしてない場合には、その部分をコメントアウトしておいて下さい。
このことを逆に言えば、(こんな風に)CSSとJavaScriptを使って自分の好きなようにカスタマイズできるMathematicaフロントエンドを作ることができる、ということになります。JavaScriptとCSS、そして、Mathematica(とRuby)を使い、自分好みのデザインや(外部サービスと連携させるような)各種機能を備えた数式処理環境を作成してみるのも、面白いかもしれません。