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

路傍のプログラマ

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

えー、アサーション使わないの!

2009-04-23 14:47:02 | プログラミング
記事「Javaで使われていない機能トップ10」
http://journal.mycom.co.jp/news/2009/04/22/018/index.html
より。

堂々の第1位は、アサーション。

アサーションを使えない開発者が、Javaの例外を使いこなせるとは思わないんだけどなあ。

本番のコードでは取り除くルールです、というのなら理解するけど。

PyPy 1.1ベータで遊ぶ(予定)

2009-04-21 20:52:07 | プログラミング
某掲示板に、PyPyの1.1.0betaがリリースされた、という書き込みが。

早速ダウンロードしてみました。

最初、Windowsにインストールしてみようかと思ったのですが、方法が良く分からなかったので、Ubuntuで。

で、
http://codespeak.net/pypy/dist/pypy/doc/getting-started-python.html
にあるとおり、

cd pypy/translator/goal
python translate.py --opt=3 targetpypystandalone.py

とおまじないを唱えると、コンソールになにやらドットやら+やらでプログレスバーらしきものが表示されます。

しばらく見ていると、いつの間にかマンデルブロート集合が描かれてました。わー、すごい。

・・・って何でやねん。インストールと同時にベンチマークもするようになってる?

(2009/04/22 追記)
インストールの途中で、PDB(だったと思う)が起動した段階で止まってしまいました。

が、その直前に「pypy-cを生成した」というメッセージが出ていたので、まあコンパイル自体はできたんだろうと思って、おそるおそるpypy-cを実行してみると、動きました。

インストラクションにあるとおり、pystoneをしてみます。

>>>> pystone.main()
Pystone(1.1) time for 50000 passes = 1.47
This machine benchmarks at 34013.6 pystones/second

素のPythonインタプリタでもやってみます。

>>> pystone.main()
Pystone(1.1) time for 50000 passes = 0.86
This machine benchmarks at 58139.5 pystones/second

あらら。遅くなってる?

(2009/04/23 追記)
PyPy Status Blog
http://morepypy.blogspot.com/
によると、

「プロトタイプはうまく動いていて、CPythonの20倍から30倍のスピードアップ」とのことなので、もう少しワクテカして待つことにします。

PyDevの新バージョン 1.4.5

2009-04-17 11:36:18 | プログラミング
PyDevのサイト
http://pydev.sourceforge.net/

で、いつの間にかPyDev 1.4.5がリリースされてました。

リリースノートを見ると、Python 3対応をはじめとして、かなり手が入ってる感じです。

個人的には、「__init__.pyがあるディレクトリのみパッケージとして表示する」という変更が気に入りました。

IronPython 2.6?

2009-04-01 21:31:40 | プログラミング
いつの間にか、IronPythonの2.6αが出てました。

こないだまで2.0って言ってたのに何故?と思ったのですが、どうもPython 2.6相当のものを作ろうとしているようです。

早速ダウンロードしてみたのですが、まあまあ、αということで。

とはいえ、IronPythonのwinformsを使って対話的にGUIを組み立てていけるの(対話シェルからコードを書き足すと、その場でウィンドウの中身が変わったり、ボタンが増えたりする)には期待してます。

これがWxPythonとかだと、保存、実行、保存、実行、という、まるでJavaのような開発スタイルを強いられるので。

いやほんと。ことwinformsに関しては、IronPythonはCPythonよりPythonicです。

Windows UpdateでVistaがいつの間にか7に・・・

2009-03-09 20:01:20 | プログラミング
・・・なっても驚きません。正直。

記事「Windows 7 Embracing Vista Rejects」
http://news.softpedia.com/news/Windows-7-Embracing-Vista-Rejects-106305.shtml
によると、

Vistaでは蹴られるXPのソフトを7では動くようにする、のだそうです。

それだけなら、ふーん、がんばるねえ、くらいの感想なのですが、この記事の次のくだり、

「マイクロソフトは7で救出されるアプリは可能な限りVistaでも動くようにすると約束した。」
"The company is also promising that, as possible, broken apps salvaged for Windows 7 will also be made to work for Windows Vista. "

を読むと、もう、何というか。

MSは本気でVistaを抹殺しようとしてるんじゃないでしょうか。

(追記)
記事「Visual Basic 6.0がWindows 7でサポートされる予定」
http://www.infoq.com/jp/news/2009/03/vb6_on_win7
でも、同様の論調。

7とVista(およびサーバー版)の両方でVB6をサポートする、といってます。

Boost 1.38。恐ろしい子。相変わらず。

2009-03-03 18:36:33 | プログラミング
k.inabaさんのサイト「Let's Boost」
http://www.kmonos.net/alang/boost/
が更新されていました。

# いつもお世話になってます。感謝。

1.38の変更点をちらっと読んでみると、

Proto → APLみたい。行列の計算で、値が必要になってからまとめてばばーんと計算する。・・・しかしよくこんなものが出てくるなあ。

Flyweight → JavaやPythonのintern(いろんなクラスで)。・・・まあ使えるところがあれば。

ScopeExit → まんまtry~finally。ただし、マクロを使っているっぽいので(入れ子にできるか?とか不安)しばらく様子見。

Swap →
単純なラッパですが、swapにまつわる2つの流儀を気にせず使うことができるようになります。

ちなみに、

流儀1。自前で定義したクラスのstd::swapのテンプレート特殊化バージョンを定義する。
std名前空間を汚すことになる(規格では許容されている)ので「やるな」という人も。

流儀2。自前で定義したクラスのswap関数を、std名前空間の外に定義する。
この関数は当然ながら、std::swap()と書いても呼び出せないので、

using namespace std;
swap(.....);

と呼び出す。もしstdの外でswap()が定義されていればそれが呼び出される。
定義されていなければ、std::swapが使われる。

流儀2は流儀1で定義されたswapも呼び出せるという意味で汎用的なのですが、using namespace std;をいちいち書くのは面倒。
で、これをラップしたものがboost::swapとして提供された、と。

flattening list in Python

2009-01-30 20:16:26 | プログラミング
入れ子になったリストを平らにならす、という問題。
必要になったのでやってみます。

この問題、どうもかなり古典的な問題らしく、いろんな人が解いてます。

私が必要としたのは、とにかく深い入れ子を処理できること。

具体的な方針としては、
・スタックを使わない。スタックの制限はsys.setrecursionlimit()で緩和できるけど、インタプリタのグローバルな状態に影響を与えるのはあんまりうれしくない。
・2乗のアルゴリズムを使わない。リストの中程に要素を挿入したりとか、pop(0)とか、そういったたぐいの操作を行わない。

参考にしたのは、
http://markmail.org/message/tbz3s6a3wj42cfxs
とか
http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html
です。

できたコードは、これ(もしコピーして使われる方がいらっしゃるのなら、全角スペースを半角スペースになおしてください)。

def flatten(l, ltypes=(list, tuple)):
  ltype = type(l)
  r = []
  stk = [iter(l)]
  while stk:
    curIter = stk[-1]
    for item in curIter:
      if isinstance(item, ltypes):
        stk.append(iter(item))
        break # for item
      r.append(item)
    else:
      stk.pop()
  return ltype(r)

深く入れ子になったリストを使ってベンチマークしましたが、調子いいですよ。

numpy

2009-01-29 19:19:15 | プログラミング
多次元空間のベクトルの距離を求める必要が出てきたので、

(難解だったらすいません、要は、浮動小数のタプルだかリストだかが2つ与えられたときに、その要素それぞれについて引き算して2乗したものを合計する、というやつです)

餅は餅屋、数学は数学ライブラリ、ということで、numpyを試してみました。
(numpyは2.6には未対応とのことで、今回はPython 2.5を使ってます)

2つのベクトルをa, bとすると、

普通にPythonで書くと、aやbはタプルかリストかになって、距離の計算は

d2 = sum(pow(x - y, 2) for x, y in zip(a, b))

となります(厳密には距離の2乗ですが)。

numpyを使えば、aやbはnumpy.arrayになって、numpy.array同士の演算などが定義されているので、距離の計算は、

d2 = numpy.power(a - b, 2).sum()

でできます。(ひょっとするともっと速いやり方があるかもしれませんけれども)。

実測してみると、ベクトルの要素数が小さいときは普通のPythonの方が速いのですが、ベクトルの要素数が20を超えるあたりで逆転します
(Psycoつけてもほぼ同様の結果でした)。

結論。

numpyは役に立ちそうです。パフォーマンスも上がるし、ソースコードもすっきりするし。使えるところにはどんどん使っていこうと思います。

ライセンスはBSDかMITっぽい(詳細はnumpy-1.2.1.tar.gzのLICENSE.txtを参照ください)ので、その辺はご注意ください。

Qtってcuteというよりquantity

2009-01-16 17:21:19 | プログラミング
いくつかのニュースサイトで、TrolltechのQtがLGPLになる、という話が。

早速試すことに。(今、VC++2008SP1にQt4.4.3をコンパイルしてもらってます。)

でも、ドキュメントを読み始めると、正直、ちょっと引きました。

なぜって、Qtって、GUIライブラリとばかり思っていたのですが、コンテナやら何やらを全部自前でそろえているらしい。

さらには、Boostばりのマクロforeach()やら、独自のi18nのための関数tr()まで。

何故?