路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

ctypesのお勉強 #3: IronPythonとCPythonの違いが表面化

2007-11-27 15:55:32 | プログラミング
重要なことを忘れてました。

CPythonとIronPythonとでは、デストラクタが実行されるタイミングが違うのでした。

CPythonでは、リファレンスカウントを利用している(さらにGCも使われているらしいけど、未確認)ので、循環する参照でも作らない限りは、del文でデストラクタを実行することが期待できます。

>>> class C(object):
 def __init__(self):
  print "init!"
 def __del__(self):
  print "del!"

>>> c = C()
init!
>>> del c
del!
>>> e = C()
init!
>>> f = e
>>> del e
>>> del f
del!
>>>

てなもんです。

が、IronPythonはリファレンスカウントを用いていないので、GCが起動される時点は神のみぞ知るです。

(クラスCの定義は同じ)

>>> c = C()
init!
>>> del c
>>>

という感じです。

ということで、IronPythonも想定した場合には、コンストラクタ・デストラクタに頼らずに、__enter__と__exit__を定義して、with文を使うことを考えた方が良いかも。

でもそれだと、CPython 2.5だけ考えれば、

with xなんたら:
 hoge()

と書けば済むところを、IronPython 1.1のことも考えると、

x.__enter__()
try:
 hoge()
finally:
 x.__exit__(None, None, None)

みたいに書くことに。何となく情けないなあ。

(2007/11/28 追記)
記事「Python Library Reference 26.5 contextlib -- Utilities for with-statement contexts.」
http://www.python.org/doc/2.5/lib/module-contextlib.html
では、

従来の、close()で後始末する方式のオブジェクトを、with文でうまく使う方法が述べられています。2.6でwithが正式なものになるまでの間はここに書いてあるやり方を使うのが、読みやすさの点でも良いかも。

ctypesのお勉強 #2: ctypesでC++

2007-11-26 19:00:13 | プログラミング
クラスを定義するC++のコードをctypesから使いたい。
でもctypesでさわれるのはC言語の構造体まで。どうしよう。

とりあえずうまくいったのは、2段階でやる方法、すなわち、

C++のコードをラップするCのコードを書いて、それをctypesでさらにラップする方法。

コンストラクタ、デストラクタ、メソッドをラップするコードを書いてDLLを作る。

extern "C" {
void *MyClass_ctor(void) /* returns new instance */{ ... }
const char *MyClass_hogeMessage(void *pThis) { ... }
void MyClass_dtor(void *pThis) { ... }


さらに、Pythonのコードでこれをラップする。

mydll = ctypes.CDLL("hoge.dll")

class HogeClass(object):
 def __init__(self):
  self.v = ctypes.c_void_p(mylib.MyClass_ctor())
 def hogeMessage(self):
  return ctypes.c_char_p(mylib.MyClass_hogeMessage(self.v)).value
 def __del__(self):
  mylib.MyClass_dtor(self.v)

使うときには、

i = HogeClass()
print i.hogeMessage()

みたいにする。

まあ手間だけど、C言語からC++のコードを利用するときと同じだと思えば、これで満足すべきかなあ。

ctypesのお勉強 #1

2007-11-26 15:33:13 | プログラミング
Python/C APIやSWIGやboost.pythonではなく、ctypesです。

なぜかというと、ctypesなら、Pythonで書かれたプログラムから、C言語で書いたモジュールを、CPythonとIronPythonとで移植性のある方法で利用することができそうだから。

(2008/02/12 追記 ここから)
記事「CPython用拡張モジュールをIronPythonから呼び出す」
http://journal.mycom.co.jp/articles/2008/02/08/ironpython_cext/index.html
によると、CPython Extensions for IronPythonというのを使えばOKになったんだそうです。
ですので、苦労してctypesを使わなくても、IronPythondでどんどんいけるらしい。
ただし、オブジェクトの解放のタイミングとかについては、まだテストしていないので不明です。
Python界は、まだまだこういうのが出てくるから面白いです。
(2008/02/12 追記 ここまで)

というわけで、ctypesの勉強を始めることにしました。

まずはウェブで情報を漁ります。

14.14 ctypes -- A foreign function library for Python.
http://docs.python.org/lib/module-ctypes.html

ctypes tutorial
http://python.net/crew/theller/ctypes/tutorial.html

pukiwiki ctypesモジュール(日本語)
http://newcamel.logos.ic.i.u-tokyo.ac.jp/~s1s5/pukiwiki/index.php?programming%2Fpython%2Fctypes

ymasuda.jp ctypes チュートリアル(日本語)
http://ymasuda.jp/python/ctypes/tutorial_jp.html
↑内容がちょっと古いみたい。このチュートリアルに出てくるc_stringはPython 2.5付属のctypesでは撤廃されて、c_char_pを使うことになっている。

ctypes チュートリアル(日本語)
http://www.python.jp/doc/contrib/ctypes/tutorial_jp.html
↑同上。

有坂 ( ありさか ) あいすの記録 Python で Win32 API の呼び出し方(日本語)
http://d.hatena.ne.jp/ISH-00/20070830/1188495354

mtamaki.com pythonからctypesで任意のDLLの関数を使う。(日本語)
http://www.mtamaki.com/trac/mtamaki/ticket/47

Programmer's Gate ctypesによるDLL内の関数の呼び出し(日本語)
http://morchin.sakura.ne.jp/effective_python/ctypes.html

ふにゃるん ctypes for IronPythonのWinAPI用パッチを作ったです(日本語)
http://d.hatena.ne.jp/Wacky/20061203/1165142621
↑ IronPython用のctypes.pyの情報


もーいーくつねーるーとIronPython on VS2008?

2007-11-22 19:42:47 | プログラミング
記事「Microsoftが開発ツール新版VS 2008を会員向けにリリース,無償版は誰でもダウンロード可能」
http://itpro.nikkeibp.co.jp/article/NEWS/20071122/287855/
によると、

Visual Studio 2008の正式版がリリース。12月の予定だったんじゃなかったっけ。早い。

そういえば、IronPythonってVS2008で使えるんだっけ、と思って調べてみたら、IronPythonのサイトに、それらしい内容が。

2.0A6のリリースノート
http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=7663によると、

VS2008のベータリリースを使ってVS2008に対応させる作業をしているそうな。楽しみ。

目には目を、クラウドにはAGPLを

2007-11-22 02:17:14 | Birds-Of-Feather
2つつなげると面白いニュース、のコーナー(?)です。

記事「開き直ったMicrosoft」
http://itpro.nikkeibp.co.jp/article/OPINION/20071121/287717/
より。

Microsoftはついにサーバービジネスをあきらめて、SaaSに全面的に移行することを表明したそうな。

そうすれば、GoogleみたいにGPLの攻撃も防げるしね!・・・と思ったら、そうは問屋がおろしません。

記事「ネットワークサービスでの利用でも配布義務付け FSF、GNU AGPLv3をリリース」
http://www.atmarkit.co.jp/news/200711/21/agpl.html
より。

GPLを修正して、「変更を加えたソフトウェアがネットワーク経由で提供される場合、ユーザーがそのソースコードをネットワークサーバから無償でコピーできるよう義務付け」たものを作ったんだそうです。

ちょっとタイミングよすぎ。あたかも、FSFがMSを狙ったかのよう。

すごいなあ。

iPhone, LeopardのCalculatorもAppleTalkの二の舞らしい

2007-11-20 11:01:49 | ガジェット
記事「Apple Tracking Users Activity」
http://news.softpedia.com/news/Apple-Tracking-Users-Activity-71287.shtml
によると、

どうもアドレス帳やクレジットカードの番号などが、こっそりとAppleに送られてしまうらしい。うーん。

ちょっとなあ。gmailも怖くて使えないくらいの私は、しばらくApple製品に触れなくなりそう。

(2007/11/22 追記)
続報です。
記事「『iPhone』がユーザー情報を Apple に送信か?」
http://japan.internet.com/allnet/20071122/12.html
によると、

どの程度の情報が出ているかについては、議論が続いていて、まだ結論は出ていないらしいです。


Googleにおいしいところを持っていかれそうで焦るSun

2007-11-15 16:36:56 | その他
記事「グーグル「Android」はJavaを分断化する--サンが懸念を表明」
http://japan.cnet.com/news/ent/story/0,2000056022,20361125,00.htm
より。
(ただし、元の記事
http://www.news.com/8301-13580_3-9817048-39.html
のほうがちょっと詳しい。)

SunはJava言語の処理系には値段をつけられないことを知ってるから、その周辺で稼ごうとしていたのに、Googleのケータイに持っていかれそうで焦っているようです。

いくらSunが「AndroidプロジェクトはJavaを互換性のない各種のバージョンに分断化する可能性がある」と主張したところで、

AndroidのSDKのチュートリアルをちらっとみた限りでは、J#みたいに言語機能を変更(コンパイラも変更する必要がある)するわけではないみたいですし。ライブラリを作って配るとかなら、Google以外もやってることだし。

さて、どうなるか。案外、JCPが割れたりして。

(2007/11/22 追記)
続報です。
記事「独自のJavaを使用するグーグル「Android」で広がる波紋」
http://japan.cnet.com/special/media/story/0,2000056936,20361032,00.htm

iPhoneとandroid, Docomo 2.0の発表の違い

2007-11-13 15:29:42 | ガジェット
面白いなあ。

記事「グーグル、携帯向けOS「Android」のアプリ開発コンテストに賞金11億円」
http://itpro.nikkeibp.co.jp/article/NEWS/20071113/287014/
によると、

Googleケータイは、実際にどんな形なのかも示さずに、いきなりSDKが発表されて「アプリ作ってくださーい」てなかんじ。

iPhoneは、いつも通り、ジョブス氏のステージで電撃発表。いきなり完成形を示して「スマートでしょ、欲しくなったでしょ」みたいな。

という軸で比較すると、Docomo 2.0はさしずめ、「大好きなあの人も使ってるよ」みたいな。

まあいいんですけど。

メタバースと聞いて

2007-11-13 14:54:45 | その他
記事「全体の8割近くが、「意味不明な用語は“メタバース”」」
http://japan.internet.com/research/20071112/1.html
より。

メタバースときいて、「え?apt-getのmultiverseよりでかいやつがあるの?」と思った私は少数派?


Time誌が選ぶとこうなるのか・・・

2007-11-02 19:43:44 | その他
2007年の発明大賞にiPhoneを選出したんだそうな。

えー。同意できないなー。「かっこよさげ」とか「よく売れた」とかなら分かるけど、「発明」かなあ。

ニコニコ動画の方が、よっぽど発明っぽいけど。

論評の最後で

「You'll have one in a few years. It'll be very cool.」

なんてのたまうくらいだったら、再来年かその次の年に、選出すればいいじゃんか。ねー。