ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

IronPythonの紹介ビデオ

MicrosoftRSSをチェックしていたら、 MSDN TV で IronPython の作者さん(だよね?)が IronPython のデモンストレーションをしていた。


感想な。

  • 作者さんって、すげぇ若いのな。
  • Pythonの所を、「ぱいふぉん」って呼んでいたなぁ。
  • IronPythonって、コマンドラインからは、 ipc で呼び出すんだね。
  • デモ中に、"import this"をやっていて、笑った。
  • .NET Frameworkの呼び出しって、"import System"ってな感じでロードできちゃんだ。すげぇ
  • コマンドラインから、簡単にウィンドウを呼び出しちゃうのよ。
    コードの改変も簡単にやってのけちゃう。
> from AvalonStartup import *
> ss = SpeechSynthesizer()
> ss.SpeakTextAsync("Hello from IronPython")
> 
> w = Window()
> w.Show()
> w.SizeToContent = SizeToContent.WidthAndHeight
> b = Button(Content="Click Me")
> w.Content = b
> b.FontSize = 100
# ここまでで、"Click Me"ってボタンのウィンドウが出来ちゃう

> def doit(*args): print args
> b.Click += doit
# ここまで行うと、"Click Me"ってボタンを押すと、doit 関数が呼ばれちゃう

> calc = LoadXaml('calc.xaml')
# これで、計算機なウィンドウが出現して、動いちゃう

> for b in buttons: print b
System.Windows.Controls.Button: 1
System.Windows.Controls.Button: 2
...
# 上の処理で、全ボタンが列挙されちゃう

> for b in buttons: b.Background = Brushes.Blue
# 上の処理で、全ボタンの背景色を青にしちゃう

> for b in buttons: b.LayoutTransform = RotateTransform(90)
# 上の処理で、ボタンの中の文字('1'とか'+'とか)を傾けちゃう

> def sayit(b, e): ss.SpeakTextAsync(b.Name)
> for b in buttons: b.Click += sayit
# 上の処理で、ボタンを押す都度に、ボタンの名前を喋ってくれる
  • VC# 2005の中から、IronPythonのコードを呼び出せる
using IronPython.Hosting;

...
public void RunScript(Object a, Object b)
{
    PythonEngine engine = new PythonEngine();
    engine.SetVariable("win", this);
    engine.Execute("win.SetImage('c:/images/itrun.jpg')");
}
# ここまでで、C#のコードからIronPythonのエンジンを呼び出して、しかも、C#のアプリケーションと連携処理している
  • 更に、外部スクリプトの呼び出しも簡単だし、連携処理も出来ている。
public void RunScript(Object a, Object b)
{
    PythonEngine engine = new PythonEngine();
    engine.SetVariable("win", this);
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.ShowDialog();
    
    engine.RunFile(ofd.FileName);
}

<simple.py>:
text = TextBlock(text='MSDN Rocks', FontSize=100,
                 Foreground = Brushes.White)
a = DoubleAnimation(0.0, Duration(TimeSpan.FromSeconds(3)))
a.RepeatBehavior = RepeatBehavior(3)
text.BeginAnimation(Shape.OpacityProperty, a)
Canvas.SetLeft(text, 50)
Canvas.SetTop(text, 15)

win.Content.Children[1].Children.Add(text)
# engine.RunFileで、外部スクリプトコード(simple.py)を呼び出せる。
# しかも、engine.SetVariable("win", this)で定義したウィンドウオブジェクトに対して、外部スクリプトからアクセス出来る。
# 上のコードを動かすと、画面に"MSDN Rocks"ってでかい文字を書き込む事ができる。
  • 外部スクリプトで発生したエラーをキャッチして、VC# 2005でデバッグできる。
    しかも、ブレークもかけられるし、変数ウオッチも可能。変更も可能。コールスタックも見られる。すげぇ。
  • 外部アセンブリのロードと呼び出しも簡単にやってた。
import sys
sys.LoadAssemblyFromFile("AgentServerObjects.dll")
from AgentServerObjects import *
a = AgentServerClass()
id, rest = a.Load("merlin.acs")
ch = a.GetChracter(id)

ch.SetSize(128,128)
ch.MoveTo(0, 0, 0)
ch.Show(0)
ch.MoveTo(600,100,2000)
ch.Play("Announce")
ch.MoveTo(300,150,1000)
ch.Play("Think")
ch.Play("Search")
ch.Play("Congratulate")
ch.Hide(0)

と、まぁ、ひたすら すげぇ。と感嘆していた。


個々で似たような事は、COM技術との組み合わせ(Win2k時代か)で実現可能なものなんだけど、シームレスにしかも、呼び出しが非常に簡単になっている点が素晴らしい。
だって、スクリプトエンジンの呼び出しが、単に"PythonEngine engine = new PythonEngine();"で済んじゃうんだよ!?
ActiveX(COM)時代のえらい面倒な手続きが一気に簡素化!
こりゃ、ぐれいと!以外の何者でもありませんがな。