DLR を使った Excel プログラミング

Visual Studio 2010ベータ1のウォークスルーの中に Office プログラマビリティ があります。このウォークスルーの中で、1か所だけ 動的呼び出しになると記述されたところがあります。この個所を、このウォークスルーではNo PIA(埋め込みPIA)というシナリオを確認するために、最終的には、キャストします。なぜキャストするかといえば、埋め込みPIAでは必要な型情報のみを取り込むからだと説明されています。この内容は、さておきNo PIAにしないコードの抜粋を以下に引用します。 public class Account { public int ID { get; set; } public double Balance { get; set; } } using Excel = Microsoft.Office.Interop.Excel; class Program { static void Main(string[] args) { var checkAccounts = new List<Account> { new Account { ID = 345, Balance = 541.27…

8

MIX08 のIronRuby Hol を使用するときの注意点

dynamicsilverlightというサイトで、ソースコードとハンズオンラボの内容があるとご連絡しました。ここで公開されているFlickrを使ったラボを実行するには、必ず提供されているフォルダで「scrtipt\server.bat」を実行するようにしてください。というのは、Holとして公開されているDLRなどのバージョンが、「2.0.5.100」となっているからです。Silverlight 2.0 Beta1 SDKに含まれているDLRのバージョンは「2.0.5.0」なのです。このため2.0.5.100のDLRでは、2.0.5.0のManaged JScriptをロードすることができません。IronPython、JScript、IronRubyの3言語を試される場合は、Silverlight 2.0 Beta1 SDKに含まれるアセンブリを使用してください。IronRubyとIronPythonのみの場合であれば、2.0.5.100でも問題はありません。 詳細に調べたわけではありませんが、MIX08のハンズオンで試した結果、Flickrを使うサンプルでは、HTMLのボタンのイベントハンドラをRubyで定義しています。このイベントハンドラの登録が、Silverlight 2.0 Beta1 SDKのアセンブリでは失敗することを確認しています。これらの問題を修正したのが、2.0.5.100のようです。 またFlickrを使ったサンプルなどは、Silverlightにおけるクロスドメインの問題が発生します。これを避けるにはポリシーファイルを作成するか、Chiron.exeユーティリティを使用します。 相手側のサービスの設定によってはクロスドメインの問題が発生します。flickrの場合は、http://api.flickr.com/crossdomain.xmlというポリシーが設定されていますので正常に動作します。このハンズオンでは「script\server.bat」というバッチファイルが用意されており、「chiron.exe /b /r:libs」というコマンドを動かすようになっています。これはChironユーティリティが持つ、テスト用のhttpdを起動してからブラウザを起動するオプションです。このモードで起動すると、オンザフライでXAPパッケージ(アプリケーションマニフェストも)を生成します。このXAPパッケージは、インメモリで作成され、httpレスポンスとしてブラウザに返すようになっています。このときに注意しないといけないのが、物理的なファイルとしてXAPパッケージが存在する場合です。Chironが用意しているhttpdは、物理ファイルが存在すると、その物理ファイルを返すようになっているからです。また、Chironは「localhost:2060」を起動します。このプロセスを終了するには、ブラウザで「localhost:2060/bye!」と入力するか、コンソールでCTRL+Cを入力します。 SilverlightのドキュメントでLoadRootVisualメソッドの記述が以下のようになっていますがself.scene = Application.Current.LoadRootVisual(“app.xaml”)正しくは、以下のようになります。self.scene = Application.Current.LoadRootVisual(Canvas(), “app.xaml”) ドキュメントのLoadRootVisualメソッドの説明は正しくなっていますが、上記の例が間違っていますので、ご注意ください。もちろん使用される言語によって、Canvasクラスへの参照を追加していただく必要はあります(Pythonはimportなど、JScriptではImport、RubyではIncludeなど)。 追記:っき さんからの質問からFlickrサンプルのクロスドメイン問題は、私の記述が間違っていましたので訂正します。Silverlightのクロスドメインへのアクセスに関する設定は、サービスを提供する側での設定となります。つまり、Client – Serverとなっていた場合にServer側で設定する必要があります。この設定には、crossdomain.xmlというファイルかclientaccesspolicy.xmlというファイルをルート直下に配置します。そしてflickrの場合は、「allow-access-from domain=”*”」という設定がなされています。 追記:LoadRootVisualですが、http://silverlight.net/Quickstarts/ProgramDlr.aspxでは正しくなっているのを確認しています。このクイックスタートでは、UserControlのインスタンスを渡すようになっています。

6

DLR の COM バインダーに対する考察

DLRを使ったExcelプログラミングというエントリーで、興味深いご指摘をいただきました。それは、COMオブジェクトのリリースを誰が面倒を見てくれるのかというものです。この問題を考える上で意識しないといけないのが、オブジェクトのライフサイクルの管理という側面です。具体的には、以下のようなものです。 マネージ オブジェクトは、GCによって回収される。 COM オブジェクトは、COMサーバーが参照カウンタが0になった時点で消滅させる。 オブジェクトの生存の可否そのものが、異なる観点で管理されているのです。つまり、 マネージ オブジェクトは、マネージヒープ上で参照されないものがGCによって回収される。つまり、ルート オブジェクトから辿っていけないオブジェクトが、回収の対象になる。 COMは参照カウンタで管理していおり、マネージコードからはRCWが内部で参照カウンタに対する操作を行う。従って、RCWが回収されない限り参照カウンタがデクリメントされない。 ということです。COM参照をカウンタを適切なタイミングでデクリメントするには、Marshal.ReleaseComObjectメソッドを呼ぶ必要があります。(注)GCはCLRホスト内に存在しますので、アプリケーションがアンロードされれば解放されます。アンロード前にCOMサーバーを解放するために、Marchal.ReleaseComObjectを呼ぶかGC.Collectを呼び出す必要があるだけです。この考えをベースに.NET Framework 4.0で導入されるDLRについて考えていきます。C#言語では、dynamicというキーワードによってレイトバインディングが実現されます。dynamicというキーワードを付与した変数は、コンパイルされたILを見るとSystem.Object型がSystem.Runtime.CompilerServices.DynamicAttributeによって振る舞いを変えるようになっています。この振る舞いを変えるという言葉の意味は、以下のようなことを意味しています。 通常のメソッド呼び出し:IL上は、直接メソッドを呼び出す(MethodInfoを示すマネージポインタである)。 dynamic属性を持つオブジェクトのメソッド呼び出し:名前によってMethodInfoを取得してから、Invokeで呼び出す(この意味で、リフレクションを使ってMethodInfoを取得してからInvokeするのと同じです。厳密には、DLRのバインダーによってこれらの処理が行われます)。 つまりdynamicというキーワードは、リフレクションを使ってメソッドを呼び出す代わりにDLRが実行時にメソッド名の文字列からメソッドを呼び出してくれることになります。この時のパラメータの型に応じた呼び出しを最適化するために、CallSiteキャッシングという仕組みをDLRは用意しているのです。CallSiteキャッシングによって、同じパラメータを使ったメソッド呼び出しが高速化されるというメリットがあります。つまり実行時に文字列でメンバーを解決するが、繰り返し呼び出す場合の高速化メカニズムが用意されているのがDLRというレイトバインディングになります。今までのメソッド呼び出し比較した場合に、コンパイラが解決するか、実行時に解決するかという違いから速度的にdynamicの方が不利になるケースもあることでしょう。ですが、それは初回のメソッド呼び出し時のオーバーヘッドの違いで、2回目以降は同じとは言いませんが遜色ない程度に早くなると言えるでしょう。 これらの動的なメンバー呼び出しをCOMオブジェクトに適用するのが、DLRのCOMバインダーの役割になります。COMバインダーの設計思想は、VB6.0と同じようにCOMのAutomationインタフェースを使えるようにすることにあります。このため名前を使ってIDispatch::GetIDsOfNameメソッドでDispIDを取得してから、IDispatch::Invokeを呼び出すメカニズムを提供します。このことは、CLRにのCOMインタロップの仕組みとは異なっています。COMインタロップでは、インタロップ・アセンブリ(TLBから生成-tlbimp.exe-)を生成してアーリーバインディングを実現します。もちろん、自分でコードを記述するかVBコンパイラを使うことで、レイトバインディングを実現することもできました。これらのレイトバインディングが、コードを記述することなくCOMのAutomationインターフェース経由でCOMを扱えるようになるのが、DLRのCOMバインダーです。 ここまででdynamicキーワードでCOMを扱う時の特徴が理解できたのではないでしょうか。具体的には、以下のようなことです。 COMオブジェクトのインスタンスは、RCWでラップされている。参照カウンタは、RCWが管理している。 メンバー呼び出しは、COMバインダーがGetIDsOfName、Invokeを使って呼び出している。 そうするとCOMオブジェクトのインスタンスを早期に回収するには、プログラマがコードを記述する必要があるということです。この意味において、今までと何も変わらないということができます。異なるのは、メンバーを呼び出す内部の仕組みだけです。 但し、.NET Framework 4.0ベータ1では実装されていませんが、DLR-0.91のソースコードに含まれるMicrosoft.Scripting.ComRuntimeHelpers.IUnknownReleaseDelegate(Microsoft.Dynamicの中にあります)のコメントなど参照してみてください。この実装などが、DLRの最終形に入ってくればDLRのCOMバインダーでCOMオブジェクトのリリースまで管理してくれる可能性があります。まだ開発途中ですので、DLRの開発方向を調べたい場合はcodeplexのDLRを参照するようにしてください。 PS.DLRのCOMバインダーは、System.Dynamic.dllアセンブリに実装されています。

5

[IPY]台湾中国語版「IronPythonの世界」

今年の春に出版した「IronPythonの世界」の台湾中国語版が「博碩文化」社から翻訳出版されました。ISBN 9789862010587です。私には中国語を読むことができないのですが、見本誌が届く予定なので届いてから中身を見てみたいと思います。 追伸:IronPython 2.0A6がリリースされています。この中にToyScriptが含まれていますので、DLRを使って独自の言語実装を考える方には勉強になる例題だと思います。

5

[TechDays 2010] Visual Studio 2010 でプチパラダイムシフトへ

TechDays 2010 では、「CM-204 Visual Stduio 2010 でプチ・パラダイムシフトせよ!」というBOFがありました。このBOFを担当していた小島さんと原さんに本番の15分前にお願いして、参加させていただきました。小島さんの言われるパラダイムシフトを借りて、私なりに自分の考えをまとめたいと思います。 最初に手続型のパラダイムは、以下のように表現することができます。 手続型でプログラミングする時は、頭の中が手続(手順)で一杯になっています。これが、現在の主流であるオブジェクト指向では、以下のようになります。 頭の中はオブジェクトで占められて、少しだけ手続のことが残っています。オブジェクトの占める割合で、オブジェクト脳の完成度が決まるといわれるのかな?ここで、パラダイム論でオブジェクト指向を説明するとすれば、オブジェクト+手続という組み合わせた考え方ということになります。なぜなら、オブジェクト指向で実現するオブジェクトには、メソッドやプロパティがあります。メソッドなどの実装は、手続で行いますので手続を忘れたわけじゃないのです。 ここで唐突ですが、チューリングマシンを思い出してください。別の言葉でいえば、ノイマン型コンピュータです。これらの動作原理を単純に説明すれば、以下のようなものになります。 プログラムカウンタを使って命令を読み込む。 命令をデコードして実行。 プログラムカウンタをカウントして、1へ戻る。 単純化していますが、ノイマン型コンピュータは手続きを使ってプログラムを実行していることが理解できると思います。次にジョン・バッカスという人の話をします。ジョン・バッカスは著名な数学者であり論理学者で、FORTRANを設計した人物です。これ以外にもBNF記法などを考案した人です(BNFは、標準規格など様々なところで使われています)。彼は、その功績によりチューリング賞を受賞します。この受賞講演で「Can Programming be Liberated from the von Neumann Style?”(プログラミングはフォン・ノイマン的スタイルから解放されるか?)」という内容を話しています。内容はともかく、この講演がきっかけで様々な関数型プログラミングの研究が行われていったのです。つまり、ノイマン型プログラムではないというのが、関数型言語の源流だったと考えることもできます。 話を元に戻すとノイマン型コンピュータである限り、手続型から逃れることはできないということを私は言いたかっただけです。CPUがムーアの法則に従って高速化やメニーコア化したとしても、CPU自体がノイマン型ですから実行は手続に則って行われているということです。よって、処理速度の速いプログラムになるような最適化は、手続に従って行われていくということです。逆に非ノイマン型コンピュータは、一般的に使われているのかという疑問が出ると思います。もちろん存在はしますが、一般的になっていないということができると思います。ここで最近、話題に聞く関数型言語はどうなんでしょうか。HaskellやErlangなどの話題を良く聞くと思います。BOFの中で小島さんは、Haskellを使って、ソートなどのアルゴリズムを実装するプログラムを見せてくれました。Haskellと同等なプログラムをC#で記述した場合も見せてくれました。この時のプログラムの脳内模型がどのようになっているかと言えば、以下のようなものになります。 言い方が良いかどうか私にはわかりませんが、良く「本物のプログラマは関数型言語を使う」というような話を耳にします。手続型言語を使うよりも短く、簡潔に記述できるのが関数型言語だという話です。この手のプログラムを読むと、関数型パラダイムが理解できない自分には、なかなかプログラムの意図を理解できなかったりしますが…関数型プログラムの特徴は色々とありますが、代表的なものを以下に列挙します。 宣言型である。 ラムダ式を記述する。 不変(Immutable)。 パターンマッチ 遅延評価がある。 副作用がない。 小島さんが説明してくれたHaskellの例では、式(厳密にはラムダ式)を宣言していくだけプログラムが記述されるため、宣言した順序が実行される順序ではないということです。つまり.NETのLINQのように遅延実行が行われるということです。こうなると、ソースコードを読むときに遅延実行を考慮しなければ、実行順序がわからなくなるということです。このような言語に取り組むには、パラダイムシフト(考え方を変える)が必要になるのではないうかということです。 関数型言語を考えた時に、「副作用が無い」という特徴から並列実行に適しているのではないかと良く考えられています。このことを私は、「その通り」と考えていまして、宣言した関数が参照透過性(同じ引数を与えれば、同じ値が返るという性質)を持つのであれば、参照透過性を持つ単位で並列実行するタスクとして切り出すことが可能だと考えています。このことにプラスアルファで、「不変」という特徴を組み合わせると、共有メモリのロックの問題が解消されると考えています。これらの事から私が説明したいのは、参照透過性などを意識せずに獲得しやすい言語を使うことで並列化を考えやすくなるのではないかということです(並列化を意識した言語として、GoogleさんからGo言語が発表されています。このような新しい並列対応の言語が作成されることもあるでしょう)。また私は例としてお話させていただいたのが、JavaScriptは関数型言語だという話です。もっとも関数型としてよりも手続型としてJavaScriptを使われている方のほうが多いですが… 今度はオブジェクトというものを考えてみたいと思います。一般的にオブジェクトは、その状態をカプセル化して、振る舞いをメソッドなどで公開します。このオブジェクトを複数のタスクが同時にアクセスすることは易しいでしょうか。同期化プリミティブなどを使ってスレッドセーフティにしなければ、並列操作することは難しいと言えるでしょう。極論すれば、並列操作とオブジェクトは相性が悪いということができます。 次に関数型言語はオブジェクトも使用できますので、どうなるかと言えば、標準が不変なオブジェクトになります。どういうことかと言えば、オブジェクトの状態をインスタンスを作成してからは変更することができなくなります(厳密には、プロパティに対する代入ができないということです)。F#で.NETのオブジェクトを使用する場合に、この問題が発生します。このためF#では、.NETのオブジェクトを束縛する場合に書き換え可能(Mutable)と宣言して、この制約を回避します(この性質から非純粋関数型言語と呼ばれます)。では純粋関数型言語(不変しか取り扱えない)であるHaskellなどでは、どうしたら良いでしょうか。この時に行う方法が、関数が新しい状態を持ったオブジェクトを生成して値として返すという方法になります。このように言語が変われば、考え方を変えるとことで同じようなことを実現できるようになります。これには、パラダイムを変える必要があります。このようにBOFで説明して、参加者の方からメモリが大量に必要になりガベージコレクタが活躍しますよねという質問がありました。答えは「その通り」ということなのですが、JavaにしろCLRにしろGCを備えた実行環境が現実的に使用できているのが現在のコンピュータですよね。さらにメニーコア化し、ギガ単位のメモリを搭載している現在のPCでは、関数型言語も実用域に入っていると考えても良いのではないでしょうか。逆説的に大量のCPUコアやメモリリソースを使い切って高速化するというパラダイムがあっても良いように思います。 このBOFで簡単なF#のサンプルを私がお見せしました。このサンプルは、並列タスクの例として用意したものです。並列化したF#のクラスとC#のクラスで、F#が130行前後でC#の166行前後となっており、実現したいことに適したパラダイムを使うことでプログラム自体が簡潔になりますという話をさせていただきました(自分のセッションでは、時間が足りなくなってお見せできなかったデモなんですが)。 全ての場面で関数型プログラミングを使用する必要はなく、適材適所で言語を使い分けることで少ないコードで目的を達成できる可能性を持たせるために、Visual Stduio 2010 に関数型言語である Visual F#が入ったと考えることができるのではないでしょうか。もちろん関数型言語としてF#を使って、WindowsアプリやASP.NET Webアプリ、或いはSilverlightアプリまで作成していらっしゃる強者もいらっしゃいます。私自身は、そこまでの関数型脳になっていないので、並列化や大量の集合を扱った計算を行う場面で F# を使用するだけです。このためには、自分の関数脳をもっと鍛える必要があるのは言うまでもありません。 皆さんも、今迄と違うパラダイムを使ってみませんか。 PS.脳内モデルは、BOFで説明された小島さんに引用を快く承諾していただいて感謝しています。おもしろいモデルだと私は思っています。関数型パラダイムですが、GoogleさんのMap Reduceフレームワークが関数型のMap関数とReduce関数をC++で実装したというのは有名な話ですよね。Map Reduceフレームワークから私が学んだのは、関数型パラダイムから他の言語へ応用できる考え方が沢山あるということです。

5

[PS]WMIの取り扱いについて

暫く更新が滞っていました。私事で忙しかったせいですが、今回はPowerShellとWMIで気がついた点を記載します。 Windows Vistaを使ってPowerShellでインストールされたソフトウェアの一覧を表示しようとして、WMIのWin32_Productクラスを使ってみました。 PS (1) >Get-WmiObject Win32_Product Get-WmiObject : エラーです 発生場所 行:1 文字:14 + Get-WmiObject <<<< Win32_Product このようにエラーになってしまいました。一部のソフトウェアが表示される場合もありますが、必ず「Get-WmiObject : エラーです」となってしまいます。色々と調べていくと、Windows Vista のWMIのWin32_Productクラスのバグらしいということが判明しました。この情報はネットニュースのpowershellの中にありました。この内容を見ると既知のバグでVista SP1で修正される予定だと書かれています。じゃあ、他の方法を使わないとWindows Vistaでインストール済みのソフトウェアの一覧を取得できないことになります。で思いついたのが レジストリを列挙する。 Windows Installer APIを使用する。 という方法です。今回は、Windows Installer APIを使用してみたいと思います。 PS (2) >$wi = New-Object -ComObject WindowsInstaller.Installer PS (3) >$wi | Get-Member TypeName: System.__ComObject Name MemberType Definition —- ———- ———- CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(…

5

[PS] PowerShellの書籍がまもなく発売になります

Blogの更新も滞っていたのは、プライベートでも忙しかったためです。長期に渡ってプライベートの時間でPowerShellの書籍を執筆していました。この書籍もやっと最終局面に入ってきて、残すは最後のチェック作業のみになりました。私は気がつかなかったのですが、Amazonに予約販売で掲載されていました。 タイトル:プログラマブル PowerShell  ~プログラマのための活用バイブル~出版社:技術評論社ISBN:4774133329価格:2480円(税抜き)発売予定日:2008/1/9 サブタイトルが「プログラマのための」となっていますが、スクリプトを記述する人向けとするために可能な限り、文法を重視して記述しました。以下に目次を掲載します。Capter1. PowerShellとは1.1.  PowerShellの概要1.2.  PowerShellの導入1.3.  コマンド1.4.  その他の機能と特徴1.5.  インタープリタの機能1.6.  まとめChapter2. スクリプトの開発2.1.  PowerShellと.NET Frameworkの関係2.2.  PowerShell固有の癖2.3.  リテラルの定義2.4.  変数の定義2.5.  データ型2.6.  演算子(オペレータ)2.7.  フロー制御2.8.  関数2.9.  ファイル処理2.10. 例外処理2.11. デバッグ2.12. まとめChapter3. PowerShellの使い方3.1.  .NET オブジェクト3.2.  .NET流なファイル処理3.3.  正規表現3.4.  GUIアプリの開発3.5.  インターネットにアクセスする3.6.  Webサービス3.7.  XMLを使う3.8.  データベースプログラミング3.9.  COMやWMI3.10. まとめChapter4. PowerShellを活用するために4.1.  タイプシステム4.2.  コマンドレットを作る4.3.  他の言語から使用する4.3.1.  PowerShellとC#やVB         ・PowerShellからC#やVBを使用する         ・C#やVBからPowerShellを使用する4.3.2.  PowerShellとIronPython         ・PowerShellからIronPythonを使用する         ・IronPythonからPowerShellを使用する4.4.  スレッド4.5.  セキュリティ4.6.  まとめAppendix執筆時間が長かったため、PowerShell v2.0の最初のCTPも公開されてしまいました。このCTPでは、v1.0を置き換える形でインストールするためにv1.0とv2.0のサイドバイサイドの実行はできませんが、v1.0との互換性を重視しているためv1.0で作成したスクリプトのほとんどが実行できます。

4

Tech Days 2009 で使用した F#入門で使用したサンプル

Tech Days 2009のT3-310 F#入門で使用したサンプルコードを公開させていただきます。このサンプルには、以下のものが含まれています。 IntroFSharp:セッション資料に記載したコードを試すためのサンプルです。 FSharpFractal3D:セッションで使用していませんが、F#でWPFを使用するサンプルです。 FSharpRayTracer:セッションで使用していませんが、Parallel Extensionsを使用したマルチコアにおけるCPU負荷を確認するためのサンプルです。 ご利用はZIPアーカイブに含まれるReadme.txtに添ってお願いいたします。 To:セッションにご参加された方達へ 関数型言語を知っていらっしゃった方には、申し訳ございません。参加された方のほとんどが関数型言語を使っていないということで、説明させていただいた内容が基本的なものになってしまいました。この中で私が強調したのが、関数型言語における肝とは「式(Expression)」であるというものです。このためにF#のコンパイラは、「1.ToString()」と「(1).ToString()」が異なる意味に解釈すると説明しました。前者は、リテラルなので何のメソッドも持っていないとF#コンパイラが解釈した結果としてエラーになりました。後者は「(1)」という式をF#コンパイラが解釈した結果、Int32オブジェクトを式が返した結果としてToStringメソッドを呼び出すことができました。 それからカリー化に関して、式は入れ子になった関数として表現でき、結果として引数は左に収束し、式は右に収束するという説明をさせていただきました。このことを説明するために「let add1 a b = a + b」は、「let add2 a = fun b -> a + b」という例をお見せしました。この2つの関数をF#コンパイラは、「int -> int -> int」と表現します。この表現を正しく説明するとすると、int型の引数を取りint型を返す関数(int -> int)を戻し、戻した関数にint型の引数を渡すと、int型の戻り値を返すとなります。「->」が、F#におけるラムダ演算子になります。このため「add1 10」という関数呼び出しが、「val it : (int -> int) = <fun:clo@2>」という関数を戻したのです。また、引数が左に収束し、式は右に収束するという仕組みを理解すると、add2関数を「add2 10 2」と記述することが可能になります。これを正確に記述するとすれば、「(add2 10) 2」ということです。括弧内の式が関数を戻し、戻した関数に引数として2を与えているのです。このような特徴が、カリー化によってもたらされていることになります。 いげた太さんのコメントにもあるように、「1.ToString()」というのは、少し適切じゃないかも知れません。ここで説明したかったのは、()で囲むと式になっているという点です。そしてセッションでお話しましたが、式は必ず値を返す必要があるということです。数学で学んだ式とは、方程式や計算式になると思いますが、これらの式は必ず値(変数を含んでいても)を返しますよね。これが式の1つとして関数があると説明した理由です。従って、何も値を返さないということは、有り得ません。このために空の値として、unit(単一の値)というデータ型が用意されています。「()」という表現が、F#ではunit型になります。 T3-310.zip

4

IronRuby で Ruby on Rails を動かしてみました

昨年のRailsカンファレンスに続いて今年のRailsカンファレンスでは、「IronRuby on Rails」というセッションが行われました。このセッションでは、公開されたIronRuby 0.5.0とRuby on Rails 2.3.2を使って実際にRailsをIronRubyで動かしています。少し(大分かも)前から、IronRubyでRailsを動かすためのドキュメントが公開されています。このカンファレンスで何を紹介したかというサマリーが、Jimmyさんのブログで紹介されています。Railsを動かすドキュメントを使って、実際にRailsを動かしてみましたので、その手順を以下に記載していきます。 1.環境構築 IronRuby 0.5.0 Ruby 1.8系 (私は、OneClick Installer 1.8.6-27を使用しました) IronRuby 0.5.0をダウンロードしてC:\IronRuby-0.5.0フォルダへ展開し、OneClick Installerで使ってC:\RubyへRubyをインストールしました。 2.Rails 2.3.2 の導入 RubyGems のアップデート Ruby on Rails 2.3.2をRubyGemsを使ってインストール#コマンドプロンプトで作業 gem update –system gem install rails –v2.3.2 –include-dependencies  (注)RubyGemsを利用するために、Ruby 1.8系が必要になります。 3.環境変数の設定 PATH環境変数へ IronRubyのBinフォルダへのパスを追加します。 GEM_PATH環境変数へRubyGemsのパスを設定します。SET PATH=%PATH%;C:\IronRuby-0.5.0\bin SET GEM_PATH=C:\ruby\lib\ruby\gems\1.8   4.IronRubyの構成ファイルである「ir.exe.config」のLibralyPathsの値にRuby1.8のライブラリパスを設定します。<set language=”Ruby” value=”..\lib\IronRuby; c:\ruby\lib\ruby\site_ruby\1.8\; c:\ruby\lib\ruby\1.8\” option=”LibraryPaths” /> (注)valueの値は読みやすいように改行していますが、実際に設定する場合は改行を含めないで下さい。またir.exe.configは、IronRuby 0.5.0を展開した中のBinサブフォルダに存在します。 4.SQL…

4

現在のDLRにTreeCompilerは存在するのか

以前のDLRのASTのみを使うというエントリでTreeCompilerを使う方法を説明しました。最近のDLRでは、どうなったでしょうか。結論から云えば、IronPython 2.0 ベータ4ではTreeCompilerは無くなっています。その代わりに、以下のような方法を使うことでDLRのASTのみを使うことができます。using System; using System.Collections.Generic; using System.Text; using System.Linq.Expressions; using Microsoft.Scripting.Ast; namespace AstTest { class Program { delegate void MyFunc(); static void Main(string[] args) { LambdaBuilder lambdaBuilder = Utils.Lambda( typeof(void), “MyFunc”, Annotations.Empty); var helper = typeof(Console).GetMethod(“WriteLine”, new[] {typeof(string)}); // 1行の場合 //lambdaBuilder.Body = Expression.Call( // helper, Expression.Constant(“Hello, world”)); // 複数行の場合 lambdaBuilder.Body = Expression.Block( Expression.Call(helper, Expression.Constant(“Hello,…

4