[ps]ByPropertyNameの便利な使い方

PowerShellのコマンドレットの引数にByPropertyNameが指定されているものがあります。これを使ったちょっと便利な使い方を牟田口さんが、まとめてくれました。使い方によっては非常に便利だと思います。 牟田口さん、丁寧にまとめて下さって有難うございます。

1

[DLR] DLR における抽象構文木の解析について

現在、IronPython 2.0アルファ2を使って抽象構文木(AST)がどのように作成されるかを調べています。具体的には、以下のようなサンプルコードを使って、VSを使ってデータを収集しています。def yo(yourname): text = “Hello, ” return text + yourname print yo(“TechEd Yokohama”) このスクリプトを名前を付けて保存して、IronPythonConsoleプロジェクトのコマンドライン引数に指定して、ASTのデータを集めているのが以下の図です。 このastという変数にIronPythonの抽象構文木のデータが格納されています。これを更に調べていくとDLRの抽象構文木へマップしている状態も調べることができます。DLRのASTのデータを調べているのが以下の図です。  CodeBlockというデータ型に抽象構文木のデータが格納されています。こうして調べたASTを図にする作業を行っています。このASTの詳細説明は、TechEd Yokohamaの終了後にでも解説したいと考えています。現時点では、ソースコードを使うことで上記のようにASTを調べる方法もあるということをお知らせしておきます。 PS:DLRをC#などから利用する方法も調べています。その過程で見つけたのは、IronPython 2.0A2で提供される実行モジュールは、キーペアによる署名を持っていたことです。なので、ソースコードからビルドしたモジュールを使って色々と調べています。

2

TechEd2007で「動的言語」の説明を行います

TechEd Yokohamaで「T3-301 .NETにおける動的言語への取り組み」を担当しています。参加者の方達からご要望が多かったようで「Aルーム」に決定したとの情報が公開されています。 現在、その準備を行っているわけですが、その内容をどうしようかと色々と考えている最中です。基本的な論点は、MD3で取り上げているのですが、資料の締め切り的にIronRubyの詳細まで取り組むことは難しいと思っています。そこで今回の中心になるものを何にしようかと考えていまして、言語依存のASTとDLRのASTの関係をお見せしてはどうかとも思ったりしています。ASTという話になるとインサイド的な内容になっていくので、レベル300(アドバンス)でどうなんだろう? と考えたりもしています。 IronPython2.0A2の内部的な動作として、以下のような動きをしています。 Pythonとしての抽象構文木(AST)を作成 実行時にこのASTをDLR用のASTへマップ DLR用のASTからCILを生成して実行  DLRがCILを作るときの方法論として「DynamicSite」が利用されています。DynamicSiteは関数やメソッドなどの呼び出しをキャッシュするメカニズムを備えています。このために繰り返し呼び出したりするときの実行速度を向上させる効果があります。どうもこのキャッシュメカニズムは、動的言語実装者の経験や色々な実験から導き出した方法論のようです。 またIronPython1.0から行われていた引数の数による関数やメソッド呼び出しのチューニングもDLRのソースコードに残っています。このように様々なチューニングメカニズムを採用することで、パフォーマンスの向上を狙っているようです。 PS.このBlogで動的言語関係を読まれている方には、ネタバレしそうなので困っているのが本音なのですが。また上記のような説明を行おうとすると、デモが地味になるので「Aルーム」だしなーと思ったりしています。まっ、Inside や Under Food的な内容を計画しているので、デモは地味になるのが当たり前と割り切っていたりもしますけど…


[MD3]動的言語とSilverLight1.1アルファの関係

DLRを利用する環境として、IronPythonとASP.NET Futures、そしてSilverLight1.1アルファがあることを既に説明しました。今回は、SilverLight1.1アルファとDLRの関係を考えてみたいと思います。4月のMIXで発表されたSilverLight1.1アルファを構成しているアセンブリは、以下のような構造になっています。 SilverLightはブラウザのプラグインとして動作します。そして「coreclr.dll」を起動します。coreclr.dllが、SilverLight用の共通言語ランタイム(CLR)となります。このCLRがWindows用とMacOS X用に用意されるのが、SilverLightの実行環境です。そしてプログラミング言語として、IronPython、Managed JScriptをサポートしています。このプログラミング言語がDLRに対応しているわけですが、SilverLightからDLRを利用する仲介役を果たしているのが、「Microsoft.Scripting.SilverLight.dll」アセンブリになります。このアセンブリを使って、「Microsoft.Scripting.dll」というDLRそのものを活用しています。 もう一度、図のアセンブリの構造を見てください。SilverLight用のCLRの上で基本となるクラスライブラリ(BCLとかFCLlと呼びます)を利用しているのがわかります。そしてCLRを利用しているということは、アセンブリをロードするのにセキュリティリスクを意識しないわけには行きません。何が言いたいかといえば、SilverLight用に提供されているmscorlib.dllは、通常のmscorlib.dllと異なるアセンブリ識別子を持つということです。このことは、Microsoft.Scripting.dllがキーペアによる署名を持っていることを表しており、IronPython 2.0A2で提供されるDLRはキーペアによる署名を持っていないということを表しています。 よってIronPython 2.0A2のリリースノートに記述されているように含まれているDLRをSilverLight1.1アルファで使用することができないということになるのです。このことを考えていくとDLRとSilverLightのバージョンアップの頻度がどうなるのかな? という疑問を持たざるを得ません。何故なら、以下のような違いがあるからです。 DLR自体は、ソースコードを公開するオープンソースに近いモデルで開発が進められていく。つまり、フィードバックなどによって素早いバグフィックスが行われていくことが予測できる。 SilverLightはセキュリティリスクに対応するためにキーペアによる署名を持つ。従って、緊急時のセキュリティ対応以外は、頻繁バグフィックスが行われないのではないかと考えられます。 もちろんDLRに何を取り込むかを決定するのは、Jim Hugunin氏が率いるDLRチームが決定しますから、定期的にSilverLightにもフィードバックが行くと考えれます。その証拠にIronPython 2.0A2のソースコードを見ると、あちらこちらに「#if !SILVERLIGHT」という記述を見つけることができます。これは明らかにIronPython用のDLRと同じソースコードでSilverLight用のDLRが開発されていることを示しています。このように提供されているソースコードには、色々な情報が含まれていますから、見て調べることによって気がついていない使い方を発見できるかもしれません。 PS:IronPythonの「clr.Use」の使い方は「ClrModule.cs」から見つけました。そして前回のメソッド呼び出しがデリゲートに委譲していることは「CallTargets.cs」から見つけています。


[other]Blogのコメント設定について

不適切なトラックバックスパムがアメブロから何度か送られてきました。このためコメントの受け付けは、以下のように設定を変更しました。 匿名コメントを許可 承認後にコメントを公開 承認するまでコメントが公開されませんので、お手数ですがご了承をお願いいたします。不適切なトラックバックスパムなどで被害に合われた方が居ないとも限りませんので。。。(本当は、こんな設定にしたくないんですけど) PS:その後もアメブロから繰り返しトラックバックスパムが送られてきますので、ご注意ください。中には、ワンクリック詐欺へのリンクを持っているものもありますので。このブログでは、アメブロは100%のスパムサイトと評価しています。アメブロからのトラックバックは、無条件に削除します。正しく使っている方もいらっしゃると思いますが、その方たちには済みません。


Python WorkshopのHands-onサンプル

Python Workshop the Edge 2007でIronPythonのHands-onを担当したのは前回の記事で説明しましたす。このHands-on用に公開したサンプルにファイルムーバーサンプルがあります。このサンプルを動作させると以下のようなWindows Formsが起動します。 このサンプルの特徴は以下のようなものです。 FileSystemWatcherクラスを使ってイベント監視 作成したファイルを移動する 移動した結果をリストボックスへ表示する 回答サンプルに「filemover2.py」があります。この回答サンプルの特徴は、以下のようなクラスを持つことです。 Appクラス:Windows.Forms.Formを継承したクラス Watcherクラス:FileSystemWatcherの制御を行うクラス FileSystemWatcherクラスの特徴は、ファイルシステムjに対する変更をイベントハンドラで監視することができることです。このためファイル作成イベント(Created)ハンドラのなかで、作成されたファイルを指定したフォルダへ移動しています。ここで1つの問題があります。それはフォームのリストボックスへ文字列を追加することです。C#やVBなどの.NET対応の言語をご存じの方であれば、フォームのメソッドをInvokeしなければいけないというのがピンと来ると思います。そうなんです、これを実現するにはデリゲートを使わないといけないのです。何故なら、以下の理由があるからです。 FileSystemWatcherのイベントハンドラは、スレッドプールから割り当てられるため、フォームのスレッドとは異なるスレッドに存在する。 フォームのコントロールを操作するには、デリゲートを使ってInvokeしなければならない(異なるスレッドからはコントロールを操作できない)。 これをIronPythonでどのように実現しようかと、少し悩みました。何故なら、IronPythonではデリゲートの型を定義できないからです(方法が無くはありませんが、少し面倒です)。少しだけ考えた結果、以下のような記述をしました。#Wacherクラス内のmovefileメソッドです def movefile(self, filename): ”’ ファイルの移動を行う ”’ # フォームのメソッドへInvoke(delegate) # 変数outは、フォームのインスタンスを持つ self.out.output(filename) #Appクラス内のoutputメソッドです def output(self, msg): ”’ ファイル移動メッセージの委譲処理 ”’ # Watcherクラスのイベントハンドラから呼ばれます self.lb1.Items.Add(msg + u”を移動しました”)   シンプルにAppクラス内のメソッドを呼び出しているだけです。C#などではAppクラス内でDelegateのインスタンスを作成して、Invokeしなければなりません。何故、このような記述で実現できたかたと言うと、IronPythonの実装ではメソッド呼び出しをデリゲートに委譲しているからです。IronPythonのソースコードを見て、このことを知っていたのでこのような記述を思いついたのです。 これは私がIronPythonを気に入っている理由の一つでもあります。同じようにデリゲートをPowerShellで呼び出そうとすると中々と込み入った細工をする必要があります(PowerShell標準でデリゲート呼び出しをサポートしていないためです)。 このような特徴がIronPythonにありますので、DLRでも同じような特徴を持つことが考えられます。まだまだDLRは仕様が固まっていませんが、IronPython2.0A2では問題なくfilemover.2pyを実行することができました。


[MD3] IronPython2.0アルファ2リリース

IronPython2.0ですがアルファ2がリリースされています。動的言語3で説明した「Microsoft.Scripting.Vestigal」は無くなったと説明されています。これ以外にも、IDynamicObjectが新しくなったとか、Dynamic Siteのサポートなどと言った情報がリリースノートに記述されています。 SilverLight1.1アルファは、IronPython2.0アルファベースのためアルファ2を用いて複数の動的言語を試すことはできませんが、DLRの実装の方向性を垣間見ることができると思います。 まだ詳細を見切れていませんので、それに関してはこれから確認していきたいと思います。

1

Python Workshop the Edge 2007

Python Workshop the Edge 2007が開催されています。このイベントでMicrosoft Corporation のMaheshさんがIronPythonと動的言語について講演されました。今頃は、成田エクスプレスの中でしょうが… 私の方はIronPythonのハンズオンを担当させていただきました。参加頂いた方へ、有難うございます。そしてごめんなさい。時間が50分ということと始まりが遅かったのと何度もプロジェクタの電源が落ちてしまいました。お話したように課題の参考回答をアップさせていただきます。 できればご自分で、一度スクラッチで記述してください。そして疑問がありましたら、お渡しした資料に書いてあるメールアドレスにご連絡くださいませ。1両日中に必ずご連絡させていただきます。 PS.書き忘れましたけど、IronPythonの名前の由来がわかりました。Maheshさんは、「料理の鉄人(英語名 The Battle of Iron Chef)」から名付けたと言っていました。意図としては、標準実装のcPythonへ挑む実装を目指すということのようです。 IPY Hands-on.zip

2

[MD3]動的言語のオブジェクト共有(4)

DLRを使って複数の言語間でオブジェクトを共有できると既に説明しました。今回は、実際にどのように確認するかを説明したいと思います。現時点では、共有オブジェクトを試すことのできる環境は、ASP.NET FuturesかSilverLight1.1アルファとなります。SilverLight1.1アルファで簡単に試せるのがDLRConsoleのサンプルです。このサンプルは、以下から入手できます。 SilverLight1.1アルファSDK Dynamic SilverLight Sample どちらでダウンロードしてもDLRConsoleのサンプルを入手することができます。このサンプルにキーボード対応を日本語にしたファイルを入れ替えて起動すると以下のようになります。 使用する言語を切り替える毎にコンソールのプロンプトが「py」と「js」で切り替わります。MD3でお見せした内容は以下のようなものです。 ・Pythonのクラスを定義するclass pc: def __init__(self): self.x = “IPY” #コンストラクタ def pm(self): return self.x #メソッド   次にJScriptに切り替えて、JScriptでクラスを定義します。 ・JScriptでクラスを定義するfunction jc() { this.x = “JScript”; } jc.prototype.jm = function () { return this.x; }   次にJScriptでPythonオブジェクトとJScriptのオブジェクトを作成します。 ・JScriptでオブジェクトを作成するjo = new jc(); // JScriptオブジェクトのインスタンスの作成 jpo = new pc(); // Pythonオブジェクトのインスタンスの作成   次にPythonに切り替えて、オブジェクトを作成します。 ・Pythonでオブジェクトを作成します。po…


[MD3]動的言語について3

 Dynamic Language Runtime(DLR)の設計目標において、共有オブジェクトという考え方があります。具体的には、以下の図のようなことを実現するためのものです。 異なる言語間でオブジェクトを共有しようとしますので、「obj.x」という記述から「obj」というオブジェクトインスタンスに対して以下の手順を踏むことを表わしています。 xというメンバーを持っていますか(ゲッター)。持っていればメンバーを返します。 返されたメンバーを使って呼び出します。 このオブジェクトに対して、DLRは メンバーに対するGet/Set/Deleteを提供します。もちろん言語による制約(たとえば、大文字・小文字を区別するとか)も考慮されます。このオブジェクトを実現するための型としてDynamicTypeが提供されます。つまり、DLR上で作成されるオブジェクトは、全てがDynamicTypeを使って実現されると言うことができます。 このDLRのソースコードを提供しているIronPython 2.0アルファ1の大まかな構造は、以下のようになっています。 この図にある「Microsoft.Scripting.Vestigal」とはIronPythonがDLRへ対応する過程で残ったもののようです(Vestigalの意味は、傷痕といったものです)。このため、最終リリースでは無くなるのではないかと推測されます。 現状のDLRの実装では、DynamicTypeはDynamicMixinを継承して作成されています。このDynamicMixinを見ていくと、大文字・小文字を区別するとかオペレータやコンバートメソッドなどが含まれているのが解かります。そしてオブジェクトやメソッドの名前などを保持するためにSymbolIDの辞書を持っていることにも気が付きます。つまり、オブジェクトへのメンバーがあるかどうかを問い合わせるのにSymbolID辞書を探しているということを表しているわけです。 ご興味があればソースコードを調べてみてください。なかなか興味深い発見があるかも知れません。

2