IronPython を C# から使ってみる。

みむらです。

Python でさくさくっとコードを書いて実験するという人はいると思うのですが、
それを .net で応用してみようという感じの内容です。

今回は執筆時のバージョン IronPython 2.7.1 を用いて紹介します。

(本家 Python の Version 2.7.1 と多少の点は異なりますが、かなりの部分で互換性があります。)

 

1.環境準備

C# の開発環境として、今回は Visual Studio 2010 を使用します。

http://www.microsoft.com/japan/msdn/vstudio/express/
ない方は、こちらから express 版を入れておくと良いかと思います。

 

加えて、今回のメインである、IronPython を、
http://www.ironpython.net/
ここから、ダウンロードしてインストールします。

 

2.プロジェクト作成

Visual Studio を立ち上げて、プロジェクトを作成します。

image

image

Visual C# の 「コンソールアプリケーション」を作成。

 

3.参照に IronPython を追加する。

image

ソリューションエクスプローラの参照設定を右クリック –> 参照の追加

image

インストールディレクトリに移動して、

C:\Program Files\IronPython 2.7.1
or
C:\Program Files (x86)\IronPython 2.7.1

あたりにファイルがいると思います。

IronPython.dll と Microsoft.Scripting.dll を追加。

 

4.コードを書く

コードの先頭に

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

を追記。

最小のコードとしてはこんな所でしょうか:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

class Program
{
    static void Main(string[] args)
    {
        ScriptEngine engine = Python.CreateEngine();
        ScriptSource src = engine.CreateScriptSourceFromString("print \"Hello Python World\"");
        src.Execute();
    }
}

5.実行

image

 

ということで、ばっちり Python コードが C# 上から実行可能です。


応用例をいくつか。

ScriptScope を定義することによって、C# 上のクラスや、他のオブジェクトを触ることも可能となります。

using System;
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

public class hoge
{
    public void call()
    {
        System.Console.WriteLine("Hello C# World");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ScriptEngine engine = Python.CreateEngine();
        ScriptScope scope = engine.CreateScope();
        scope.SetVariable("hoge", new hoge());

        ScriptSource src = engine.CreateScriptSourceFromString(@"

print ""Hello Python World""
hoge.call()"
        
            );
        src.Execute(scope);
    }
}

実行結果:

image

 

上記のように、

CreateScope() メソッドで作成したスコープに対して、

SetVariable() メソッドを利用し、第1引数に名前、第2引数に実体を指定することにより、

Python 上から利用可能となります。

 

ただ一つ注意点としては、

クラスが public でないと正常に動作しないという点があります。

 

これは、個人的には Python のクラスが全て public なのが起因しているのかと予想しておりますが、

詳細はよく分かっていません。


別の例:

image

using System;
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

class Program
{
    static void Main(string[] args)
    {
        ScriptEngine engine = Python.CreateEngine();

        ScriptSource src = engine.CreateScriptSourceFromString("1+2+3");
        System.Console.WriteLine("RET : " + src.Execute());
    }
}

Execute メソッドの戻り値はそのまま実行結果になっていますので、

このように結果を C# 側に返すということも可能です。

 

また、

image

このように、GetVariable メソッドを利用して値を取得することも可能です。


 

IronPython の利用例としては、

プログラム上のマクロ機能の提供が一番大きいのではと考えております。

その他には、Python でライブラリが提供されている物に対して、IronPython を通して C# から利用するというパターン。

 

今回の IronPython と同様のコールの仕方を用いることで、

http://ironruby.net/

こちらの IronRuby を利用することも可能です。

執筆時点では Version 1.1.3 ですが、これは本家の Ruby の Version 1.9.2 と互換性があると明記されています。

 

.net では同じ .net 上で動作する言語同士を協調動作させることができますので、

こういうのもアイデアによっては非常に良い物になるのではないでしょうか。

 

最後に。私が某所でやってきた時のプレゼン資料を最後に貼り付けておきます。

はろーふらすこ、はろーしなとら。

どうもみむらです。

ウェブ系のフレームワークは実は難しいんでしょ! と疑っていたのですが、
実際使ってみたら拍子抜けするレベルに簡単だったのでそのメモ。

意気込みを返せ-! っていう感じではありますが、
それだけ入りやすくて、本当に作りたい部分に集中出来るってことで良いんだと思います。

1.Ruby + Sinatra で Hello World

gem で sinatra を入れる。

下記のコード書く。

require 'sinatra'

get '/' do
   'Hello world!'
end

 

2.Python + Flask で Hello World

easy_install で Flask を入れる。

下記のコード書く。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def func():
    return "Hello world!"

if __name__ == '__main__':
    app.run()

 

ということで、ひょえー。です。

Windows で へろく ってみる。

image

こんなこと言われましたが僕はめげません。
どうもみむらです。

Heroku  Cloud Application Platform

Heroku がなかなかおもしろい環境の予感がしたので、早速導入。

 

0. Heroku のアカウントを作る。

https://api.heroku.com/signup
Heroku Signup

ここから heroku のアカウントを作る。

 

1.Ruby 環境導入

RubyForge Ruby Installer for Windows ファイルリスト

ここから最新版の rubyinstaller を落としてきてインストール。

image

image

 

2. git インストール

Git – Fast Version Control System

Windows ロゴクリックして、最新版をとってきてインストール。

 

3.heroku 準備

Heroku  Dev Center  Getting Started with Heroku
ここを参照しながら。

3.1 heroku に必要なものをどっちゃりいれる。

image

gem install heroku rack bundler sinatra shotgun

3.2.SSH Key 作る。

image

Git Bash を立ち上げる。

image

$ ssh-keygen -t rsa -C "[e-mail アドレス]"
Generating public/private rsa key pair.
Enter file in which to save the key ( [環境によってここは変わる]  ): [何も打たずに Enter]
Created directory '...'
Enter passphrase (empty for no passphrase) : [パスワードを入れて Enter]
Enter same passphrase again: [同じパスワードをいれて Enter]

image

終わったらウィンドウを閉じる。

 

3.3. git 準備

image

git init
git add .
git commit -m "[コミットメッセージ (任意の文字列) ]"

image

heroku create

Enter your Heroku credentials.
Email : [heroku のログインに使用するメールアドレス]
Password : [heroku のログインに使用するパスワード]

4.おつかれさまでした


って、これだけで適当に完了。

一応サンプルコードを書いてみたり。

HerokuでSinatraを使ってHello worldする – アインシュタインの電話番号☎

ということで、ここを参考にしてみる。

とりあえず、私の環境だと動いたのでこんなところで。

第0回 セプキャン2011卒業生 LT大会 – aftercamp00

いわゆる、みむら企画。

とか言っておきながら、はい、私が最後に記事書きますよーと。
何事も、終わった後1ヶ月立ってから書くのが私!!

・・・すいません。書く暇ください。

 

というわけで、運営なのに最後ですよーと。同じ運営に脅迫掛けられてましたがなんのその。

運営3人居て、いとおちゃんだけ礼儀正しく到着して、liva さんが到着して、私は分からず警察のご厄介になりました。
警察っていい人なんですよ。うん。グラサン掛けてる白バイの人で、とっても優しくてイケメンだった。

 

そんなことはどうでもよく。

現時点において以下の皆さんが記事を書いてくださっているんですね、ありがたやー。

ito315 さん :  http://blog.ito315.com/archives/414
phi16 さん : http://d.hatena.ne.jp/phi16/20110924
liva さん : http://oasis-project.dyndns.org/blog/?p=489
atpons さん : http://blog.atpons.com/2011/10/2011-lt-in-tokyo-0-aftercamp.html
niku_uchi さん : http://d.hatena.ne.jp/niku_uchi/20111022/1319282831
loutusu さん : http://d.hatena.ne.jp/loutusu/20111014

みんな真面目だなー(ばか

概要 : http://after.spcamp.org/party/mimura_lt_2011/2011tokyo00

 

ということで、思い出しながらいくつか書き書き。

 

1.ろーたすさんによる、Python による ARP キャッシュポイゾニング

結構Python で遊べるなーと思いました。ただ一方で、ARP の仕組みはてきとうだなーと思ってみたり。

そういえば、遅れてきて、機材セッティングをしながら聞いたので、ちょっとろーたすさんには「みむらさん聞いてねぇな」とか思われたかもしれませんが、ばっちり聞いてますよ。

 

2.phi16_ さんによる、簡単自作再起下降パーサ

お、おもしろそうだなぁと最初思ったんですが、おいてかれました。
Slideshare とかに資料上がってないかなーと探したんですが、ありませんでした。

んー、もしこれ見てくれてたらアップしてほしいなぁー(願望

 

3.いとおちゃんによる、セプキャンに参加して自分が変わったこと。

さすがいとおちゃん、安定してるな-、安定した笑いを提供するなーと。
ただ、いとおちゃんもセプキャンで結構変わったんだなーという印象を受けました。

 

4.niku_uchi さんによる Gentoo 合宿に行ってきた

emerge に掛ける情熱を感じました。
パッケージを自分でさささっと書いて、ごにょごにょできてっていうのに、
拡張性を持った状態のまま、手軽さのバランスを保っていて、Gentoo っておもしろいなと思いました。

wasaofantasy が発生したあれでもありますからね。いいですね。

 

5.私。デスマーチのすすめ

若いうちからデスマーチをしましょうね。というお話。
ICT スクールと U-20 プログラミングコンテストのデスマーチをあげさせて頂きました。

若い人は挑戦しましょう。どんどん。

 

7.liva さんによる、 x86 エミュレータをデバッグしてみよう!

これも資料ほしいなぁ。・・・。うーん。

 

8.atpons さんによる、弟セキュリティ Developer Preview

これもおもしろかったです。・・・ゲソゲソ

 

9.wakatono せんせーによる、
危険なプレーンテキストメール/安全な HTML メール ~ Outlook Express で遊ぼう ~

右クリック禁止-! とか、懐かしいものがぽんぽん出てきて、
HTML メールおもしろそうと思いながらみてました。

 

10.私。CUDA.NET による眠るスパコン利用について。

後で資料確認したら、ちょっとミスが結構目立ったので非公開資料ということで。
ただ、CUDA はいろいろと考えてコードを書く必要があって、でも愛情を掛ければ掛けただけ高速化するので、
遊びのネタとしてもおもしろいと思いますよ。

 

11.atpons さんによる Apache Killer ちゃんかわいいよ///

うちのさーば Apache なんで、けっこうこわかったです。はい。

 

 

あとは懇親会。

BoF はなんかよーわからんことになってて、なんだかなーだったなど。
もう少しネタを考えないとまずいですね。ね。

 

最後にポインタ。

 

であであー。

セキュリティ&プログラミングキャンプ2011 に参加してきました。(テキスト版)

WP_000114

セキュリティ&プログラミングキャンプ2011
http://www.ipa.go.jp/jinzai/renkei/spcamp2011

行ってきましたよっと。

WP_000030 (2)
あやしーくーかん。

 

期待していた人はたぶん0%だと思うのですが、
今更ながら感想文を。

 

先行して、画像データとして公開していましたが、
さすがに、変な形で公開したままなのもあれなので、
テキスト状態で。

 

まず最初に、やったことの概要をば。

ソフトウェアセキュリティ組として参加して、マルウェア解析とか、
安全を確保するための仕組みとかそういうのを学びました。

そして、ハニーポットの解析してみたり、
Sutegoma2 の人からいろいろと話を伺ってみたり。

最終日にソフトウェアセキュリティ組として前に立って発表してみたり。
そんなところ。

 

今回のセプキャンで一番印象に残ったこととしては大きく4つ。

1.ソフトウェアセキュリティ組で、3つの島(グループ)で分かれて、同じマルウェアを解析して、
レポートを行ったこと。

2.将来のOS や セキュリティを守る側と破る側の一線を越えないようにというような話を伺えたこと。

3.最終日に発表して、とのさま(wakatono せんせー) から褒められたこと!
(「あやしい」「へんたい」は褒め言葉です)

4.同じ考えを持った仲間を見つけられたこと! [最重要]

です。

 


 

ソフトウェアセキュリティ組でのこと。
コンピュータの異常を検出するためにはどうすればいいですか! という質問に対して、
みなさんが「ファイルの読み書き」とか「プロセスの監視」とかそういうのを答える中、
我々の班は時代の最先端を走っておりますから、

「温度」
「HDDのカリカリ音」

と答えるわけですね、実に視点が先進的です。

そして我々は、実にやる気勢の塊でしたので、
みなさんが涼しくやっているのにもかかわらず、我々の所だけ猛暑

急遽扇風機をこちらに向けて、冷却を図ったりしましたが、いやーあついあついw

我々がどれだけやる気勢であったかを伺わせる温度の上昇の仕方でしたね。
セプキャンで講義受けながら大汗かきましたよ。

 


 

また、マルウェア解析をしていたとき。

ほもっきんちゃん ( @mayahu32 ) が偵察にくるわけですね-。
「みむらさーんどうですかー」みたいな感じで。

ウィンドウを最小化した上で、「見るだけね!」と言って、言葉通り「見させる」わけです。
実にアナログな攻防戦ですが、あれが楽しい。

脇の下に腕を入れて、フォークリフトで運ぶかのごとく、ほもっきんちゃんを排除しようとして、
「いやーみむらさん、それ、セクハラですよ-!」 とか言われてみたり。いいもんいいもん。

 

そしてもちろん、代わりにこちらも見に行くわけですね。

「みむらさんみないでくださいよー><」 とほもっきんちゃんに言われつつも、
「えっ、だって僕、アルファベットに興味があるの!」「キーボードのタイプの仕方も気になるの!」とあほなことを言って、
見続けるわけですね。大妨害。

 

ソフトウェアセキュリティ組では、解析後に発表をやるわけですね。
1つが顧客向け、1つが上司向けっていう感じで。

1つめは自分のところがいい感じでしたが、2つめはあきらかにほもっきんちゃんのところにもってかれました。
だってだって・・マニュアルアンパックとか、ねぇ、ねぇ。

でも、総合点でなんとかなって、表彰してもらいました。照れくさかったです。

 


 

3日目でしたか。
高度なセキュリティ技術を学んだけれど、それを元にこうしたらどうだろうと、どんどん学んでいくのはいいけれど、
あんまり変なこととか、やり過ぎると 犯罪者になるよ。というお話。

確かにこのあたりは重要ですよね。
ただ、学習という面以外でも、似たようなことは言える、とふと思えるのです。

たとえば、脆弱性を見つけた! となったときに、そりゃ宝探しで宝を発見したようなそんな感じになるんでしょうけれども、
それをどのようにするか。

たとえば、 「えっ、これ、・・・・・が・・・・・なんですけどー」 とか
「あ、・・・・・してるー」 とかTwitter でつぶやくのか。(つぶやいてしまうのか。)

Facebook とかで、公開範囲を設定して、「・・・・・という脆弱性を見つけたんですが、報告のためにはどうしたらいいでしょう」とか書き込んでみるとかね。

前者と後者は全く違うと思うのです。

同じ脆弱性について扱っているけれど、後者はその後粛々と報告を行うとか、
2次被害の危険性を押さえられますし、そもそも周りから見て「あ、こいつなら大丈夫だ」と。

前者はどうでしょう。喜び大爆発ですね。こういうのは限られた空間内でやらなければなりません。
それも、限られた空間内でも「・・・だってーくそだー」とかそういう言葉を使っちゃいけません。
あくまでもまじめに、かつ、楽しくやるぐらいが最大限なのです。
第三者から見たら、この後その人が報告するのか、攻撃するのかよくわからないですし、
第一、端から見ていて、怖いです。こいつ。

知り合いだったら、「落ち着け」って言いたくなりますし、
知らない人だったらその人から距離を置きますね。一応書き込みとかは追いつつ。

セキュリティ分野はいつどこに落とし穴があるかわからないですし、
最先端というところだけあって、普段の単純な事務作業とかそう言うのよりも何十倍も気をつけなければなりませんし、
何十倍も強い信頼を得るぐらいじゃないと、周りから怪しまれてしまうものです。

粛々と対応して、かつ、きちんとした情報をしかるべき場所に公開する。
こういう、当たり前に見えて最重要なステップを正確に踏める人じゃないと、こういう分野は触れない方がいいんじゃないんでしょうか。なんてふと思ったわけで。

Twitter には
・・・というソフトで脆弱性見つけたから、 IPA に報告しますとか。
・・・っていうやつ、・・・・ をやっている気がする・・とか。 そういう、専門の人の興味を惹きつつ、
周りからすると「お・・・こいつなんだかよくわからないけど、すげーな」と言う程度にするのがベストなのかななんて。

Facebook では、公開するなら、Twitter と同じようにするか、
公開範囲を限定した上で、・・・・ という脆弱性があって ・・ っていうのが ・・・・・ になっているんですよ。とか。
あくまでもまじめに粛々と、書くとか。

ま、あれですよね。

 


 

最終日。
ソフトウェアセキュリティ組として、ほもっきんちゃんと楽しいプレゼンに挑みました。

制作時間計:1時間弱。

練習無し。大暴走

おかげさまで、すごいプレゼンになってしまったといささか反省しているように見えて、
実は楽しかったので反省していませんごめんなさいごめんなさい10%ぐらい反省します。

とのさまから、「あやしい」とかなんとか、
最高の褒め言葉をさんざん頂いた記憶があります。

内容が内容ですから、データはここには公開しませんが、
とても楽しい内容でした。

IDA Pro ってのは、ばいなりあんのばいなりあんによるばいなりあんのための玩具 なんですね。

OllyDbg たんかわいいおー! EIP かわいいおー!!
EAX たんちゅぱちゅぱ

・・・はい。どうもすいません。こればっかりは今書いて、見直して、猛省しております。

 

なんていうか、ほもっきんちゃんはいい人であり、同時にいい娘です。
かわゆいです。はい。

やっぱりあの方とプレゼンとかすると楽しいんじゃないかと思いますね。
ソフトウェアに対する情熱もほぼ同じようなものでしたし。

いい人を見つけたもんです。


セプキャンではいろいろと、同志のような人をいっぱい見つけました。
実にいいことです。何人か挙げてみますと、

まず Liva さん。 ( http://oasis-project.dyndns.org/blog/ )

セキュアなOS組ですが、話してみるとほぼ考え方が私と一緒でびっくり。
GPGPU の話をこの前したときに、ちょっと専門的なところは説明加えた方がいいかなーと思ったのですが、
そんなことはないw むしろ向こうの方がよく知っていまして、私のほうが煙上がってました。

 

次に、ほもっきんちゃん ( http://d.hatena.ne.jp/mayahu32/ )

じつにかわゆい(ぉ) 同じソフトウェアセキュリティ組。
プレゼンやってて気分良かったし、解析の課題をやっているときも、
気軽に接することができて実に楽しかったです。

最後 CTF しているときは、別の班でしたが、そんなの関係なく互いに情報交換したりして、
終わった後に「どうだったどうだったー!」という話をするほど。いあーいい方です。
今度そっちに旅行に行ったら真っ先に会いたい方ですね!

彼みたいに気さくで話しやすい人っていいよね、ね!!!

 

そしてそして、はっとりせんせー ( http://eidwinds.com/ )
ICT スクールクラスタであり、愛すべきユンブルおじさん。
気さくでいい方です。ちょっかい出してくる人好きですよ!

 

あと、わかとのせんせー。
たぶん言うまでもなく、私の方がダメ人間まっしぐらなのでどうしましょう。

 

あと、ろーたすさん。
えーと、某L のひと。まじめでかわゆい。言動とか行動がかわゆい。ついつい弄りたくなる。
一方で、謎の技術を大量に蓄積しているようで、実に怖い。

・・・・・・・。

一緒の部屋で過ごさせてもらいました。
夜中に私が荒れ狂ってみたり、彼の睡眠妨害してしまったり、本当に申し訳ない感満点で、
今度会ったら土下座しようか本気で検討中。

http://d.hatena.ne.jp/loutusu/20110904
NHKのカメラに取材されてたときに、「なーにあいつ」みたいな顔でこっち見つめてきていたので、
肩つかんで、おりゃぁぁぁぁぁとカメラの前に投げてみたら、NHKで写ってましたね。すばらしい。

今度一緒に食事でも誘って、いろいろ教えてもらおうかと思ってるけれど、
なんか常に忙しそうなので、なんだかなーなんだかなー。いつでも呼んでくれたら飛んでいくのに。

 

まだまだ書ききれないほど、多くの皆さんを見つけて、
いろいろな話を聞けて。本当に皆さんありがとうございました。

 

来年もお呼ばれしたら突撃する気は満点ですが・・ね!

であであ。