goo blog サービス終了のお知らせ 

路傍のプログラマ

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

xml.dom.minidomの勉強

2009-12-22 13:29:31 | プログラミング
緩い解析でいいので、minidomで手を抜くことを考えます。

とりあえず、xmlファイルを読んでタグ名(要素名)と属性名を印字するプログラムを習作。

-----------------------------
import xml.dom.minidom as minidom

def dom_walk(node, enter_func, exit_func, recurse_predicate):
  def dwi(node):
    enter_func(node)
    for childNode in filter(recurse_predicate, node.childNodes):
      dwi(childNode)
    exit_func(node)
  dwi(node)

if __name__ == '__main__':
  import sys
  if len(sys.argv) == 1:
    print "usage walkxml <somexmlfile.xml>"
    sys.exit(0)
  
  xmlFileName = sys.argv[1]
  dom = minidom.parse(xmlFileName)
  
  def enter_func(node):
    if node.attributes:
      print "<%s %s>" % (node.nodeName, " ".join(node.attributes.keys()))
    else:
      print "<%s>" % node.nodeName
  
  def exit_func(node):
    print "</%s>" % node.nodeName
  
  def recurse_predicate(node):
    return node.nodeName != "#text"
  
  dom_walk(dom, enter_func, exit_func, recurse_predicate)
-----------------------------

memo: サーバーガベージコレクション

2009-12-17 22:01:08 | プログラミング
IronPythonはGILフリーのマルチスレッドなので、スレッド(≠プロセス)をいっぱい使って高速化!
・・・のはずが、CPUの使用率がどうしても30%を超えません。

それもそのはず、(CPUはXeon x 2なので)16個もネイティブスレッドが使えるはずなのに、なぜか8つしか使ってくれない。

どうも、CPUが複数乗っているマシンでは、デフォルトの.Net Frameworkのガベージコレクションはあまり効率的ではないそーで。「サーバーガベージコレクションを使え」とのこと。

つまりは、アプリケーション構成ファイル(ipy64.exe.config)に、
 <runtime>
  <gcServer enabled="true" />
 </runtime>
と書き足せばよい、ということらしい。

早速やってみたところ、おー、平均96%までいきました。

これで帰れるー。

追記。

でもなぜ.Net Frameworkが勝手にONにしてくれないんでしょうか?CPUの数の検出なんか簡単だろうに。

謎。

Unladen Swallow、VS2008でビルドできてしまう

2009-12-17 19:34:24 | プログラミング
Googleグループ(という掲示板?)の"can not build on windows!"というスレッド。

http://groups.google.com/group/unladen-swallow/browse_thread/thread/fc48bc32392d799f

11月17日のポストに書いてある手順を順にやっていけば、VS 2008でコンパイルできました。

ちょっと触ってみたんですが、これがまあそこそこ動きます。驚き。

来年1月には2009Q4もリリースされるそうなので、これはぜひ追っかけよう。

IronPython trunkを試す

2009-12-16 19:50:56 | プログラミング
先日2.6 finalがリリースされたIronPythonですが、

今日changelogをみると「メタクラスを使ってないとき云々」と気になる記述が。

というわけで、最新のソースからipy.exeをビルドして試してみることにします。

やり方を以下にメモ。

---------------------------

(1) VS 2008をインストールしておく。
(2) IronPythonのソースコードをダウンロードして展開。
(3) コマンドプロンプトを開き、.slnがあるディレクトリにcd。

readme.htmlを読むと、ビルドするには、コマンドラインから、

c:¥Windows¥Microsoft.NET¥Framework¥v3.5¥MSBuild.exe IronPython.sln

とせよ、とあります。これでデバッグ版のipy.exeが作られます。

(4) 今回はリリース版を試したいので、以下のコマンドラインで。

c:¥Windows¥Microsoft.NET¥Framework¥v3.5¥MSBuild.exe /p:Configuration=Relaase

これでリリース版のipy.exeが作られます(とはいえ、デバッグ版とどこが違うのかは未検証です)。

ただし、このままだとバイナリの配布物にはついてくるPythonの標準モジュールがないので、ほぼ使えません。そこで、

(5) バイナリで配布されているIronPythonの/Libディレクトリを、先ほどビルドしたipy.exeがあるディレクトリの/Libに上書きします。

このとき、すでにある.pyファイルを上書きしないように注意してください。

---------------------------

試してみると、メタクラス云々のところを書き換えてやると(2.6 finalと比べて)パフォーマンスがちょっとだけあがりました。

やきもきさせるなー。年末なのに。

ビジーも寝るのも禁止

2009-12-14 23:25:10 | プログラミング
ビジーウェイトは論外ですけれど。

下手にウェイト(sleep()関数)を入れるのも危うい。

テスト環境ではチューニングできた思っても、CPUのパフォーマンスが全然違うところで実行したときどうなるのかよくわからない。

特にマルチコアで実行されたりすると恐ろしい。

ということで、来年リリース予定のコードから、sleep()を探し出して撲滅しました。

・・・2日もかかりましたけれども。

でもまあ、CPUの使用率が限りなく100%に近づいて、テストの実行時間も3%くらい改善して、よかったよかった。

JDK7はどこまで行くのやら

2009-11-28 00:38:30 | プログラミング
本当なんでしょうか。

Joe Wrightさんのブログの「New language features in Java 7
by Joe Wright」
http://code.joejag.com/2009/new-language-features-in-java-7/

によると、Java 7には言語にいろいろ変更があるらしいのですが、よくわかりません。

List<String> list = new ArrayList<String>();
list.add("item");・
String item = list.get(0);

の代わりに、

List<String> list = ["item"];
String item = list[0];

とかけるようになるということなのですが、

ちらっと、
「These collections are immutable.」
ともあります。

["item"]で生成されるのはArrayListだとすると、どうやってimmutableであることを保証するんだろう?

ArrayListじゃなくて、immutableなコレクションを新たに作ったのなら、何でList<String>型の変数に代入できるんだろう?Listのaddメソッドを呼び出したらコンパイルエラーになるんだろうか?それとも動的に例外が投げられるんだろうか?

list[0]でlist.get(0)の意味になるんだったら、演算子をオーバーロードできるわけで、これってJavaがこれまで懸命に忌避してきたことでは?

・・・などと疑問符がいくつも浮かぶのでした。

Windows API Code Pack v 1.0インストール顛末

2009-11-02 13:29:15 | プログラミング
Windows 7のジャンプリストやらDirect 2Dやらを試したいので、

Windows API Code Pack v 1.0なるものをインストールしてみます。

環境はWindows 7 Ultimate 64bit + Visual Studio 2008です。


記事「Windows 7の新機能を利用できるライブラリ「Windows API Code Pack」v1.0が公開」
http://www.forest.impress.co.jp/docs/news/20090811_308454.html
に従って、

(1)
・DirectX SDK - (March 2009)
・Microsoft Windows 7 SDK
をダウンロード、インストールします。

(2)
次に、
・Windows API Code Pack for Microsoft .NET Framework
をダウンロード、展開します。

(3)
展開したディレクトリ(¥WindowsAPICodePack)にある
WindowsAPICodePack.sln
をVisaul studio 2008で開いて、[ビルド]-[バッチビルド]-[ビルド]。

→ 問題なく終了。
これでジャンプリストのサンプルを試せる(はず)。

(4)
¥WindowsAPICodePack¥DirectXにある
DirectX.sln
をVS 2008で開いて、[ビルド]-[バッチビルド]-[ビルド]。
とすると、ヘッダファイルが足りないといわれて、中断。

SDKのリリースノートを見てみると「SDK Configuration」なるそれっぽい文字が見つかったので、
「スタート > すべてのプログラムAll Programs > Microsoft Windows SDK v7.0 > Visual Studio Registration > Windows SDK Configuration Tool」
で、「v7.0A」を選んでから、

もう一度VS 2008を起動してビルドしてみると、

→ 32bitのバイナリはうまく生成されましたが、64bitのバイナリはエラーが出て生成されませんでした。
たぶんこれでDirect 2Dは試せるはず。

とりあえずこれで実験しようと思います。

Open{Primitive}CL

2009-10-29 15:44:12 | プログラミング
OpenCLの説明聞きに行ったら、恐ろしくプリミティブ。

プリミティブなのに抽象化(というか最大公約数化というか)されているので、頭がくらくら。

CUDAやらDirectXやらを直接たたいた方がわかりやすそう。