路傍のプログラマ

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

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を参照ください)ので、その辺はご注意ください。

メモ: VirtualBox 2.1.2, NDZ

2009-01-23 22:03:33 | その他
VirtualBox 2.1.2を試してみると、2.1.0のキーボード誤認識バグが取れてました。
良かった。

ついでに、NDZなるツールを見つけたのでメモ。
http://www.geocities.co.jp/SiliconValley/2994/tool/nhc.html

VirtualBoxの仮想ディスクファイル(.vdi)からファイルを取り出せます。
地味に便利。

たとえば、VirtualBoxのバージョンアップに失敗して起動できないイメージができたら、そこからファイルをサルベージするとかに使えそう。

作者のeueeさんに感謝。

(2009/01/26 追記)
NDZ、早速利用させてもらうことに。

ホストVista、ゲストUbuntu。Ubuntuのホームの下のあるディレクトリを抜き出して、新しい仮想Ubuntuマシンにコピーしました。

詳しい手順は長くなるので省略しますが、要は以下の通り。

(1) UbuntuのライブCDで起動して、HDDを見えるようにして、必要なディレクトリを固めたアーカイブ(backup.tgzみたいな)をsudoで作る(rootじゃないと書き込めない)。
(2) NDZでbackup.tgzをホストにコピーして、共有フォルダに置いておく。
(3) 新しい仮想マシンで、共有フォルダをマウントして、backup.tgzを展開する。

メモ: 「アプリケーション」を「アプリ」に

2009-01-21 15:33:54 | ubuntu linux
9.04の足音もひたひたと聞こえてきそうな昨今。

SH6とかでUbuntu 8.10を使っていると、メニューの「アプリケーション」というのが長すぎて邪魔に思えてきました。

というわけで、これを「アプリ」に変えてみたいと思います。

・・・いろいろやってみること3時間。何とか無事にやり遂げました。

●おおよその流れ

「アプリケーション」という文字列が含まれている設定ファイルを書き換えます。

設定ファイルの場所は
/usr/share/locale-langpack/ja/LC_MESSAGES/gnome-panel-2.0.mo
でした。この、.moなるファイルはバイナリファイルで、msgunfmt, msgfmtを使ってテキストファイルと相互変換できます。

設定ファイルを探すにはgrepを使いましたが、「アプリケーション」だとたくさん引っかかるので、メニューのバルーンヘルプの文字列「インストールしたアプリケーション・・・」というのを使いました。

●詳しい手順

基本的に、全て端末(ターミナル)からやります。

$ sudo apt-get install gettext
$ locate *.mo
$ cd /usr/share/locale-langpack/ja/LC_MESSAGES
$ grep インストールしたアプリケーション -r . *.mo
$ msgunfmt gnome-panel-2.0.mo > ~/temp.txt

geditで~/temp.txtを開いて、

msgid "Applications"
msgstr "アプリケーション"

とあるところを、

msgid "Applications"
msgstr "アプリ"

にして上書き保存。

$ cp gnome-panel-2.0.mo ~
$ sudo msgfmt -o gnome-panel-2.0.mo ~/temp.txt

いったんログアウト。ログイン。

終わり。

(2009/01/26 ディレクトリ名が間違っていたので修正。)

Qtってcuteというよりquantity

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

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

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

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

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

何故?

Windows 7調査中。

2009-01-12 13:50:37 | その他
Windows 7ベータをインストールしてみる実験は1勝1敗。

SH6には簡単にインストールできて、Vistaより軽いみたいでした。もちろんAeroもOKでした。

MacBook Proには、Boot Campでインストールしたのですが、どうも、パーティションテーブルが壊れたのか、OS Xまで起動しなくなりました。結局、ハードディスクをフォーマットしてOS Xを再インストールするはめに。

(2008/01/12 追記)
http://news.softpedia.com/news/Windows-7-on-a-Mac-Some-Say-it-Works-Some-Say-it-Doesn-039-t-101695.shtml
によると、

いろいろ問題が起きてるみたいですね。公式対応を待つのが得策?
(追記ここまで)

後気になるのは、Vaio Type Pだと、AeroがONにできないらしいこと。
http://www.engadget.com/2009/01/10/vaio-p-now-with-more-windows-7/
Type Pの極端な横長ディスプレイは、Windows 7のウィンドウ半分化機能を見越したデザインだと思ってたのですが・・・思い過ごし?

ソースコードを見栄えよく文章に入れたい

2009-01-08 17:15:11 | プログラミング
ワープロで作った文章や、プレゼンの中で、ソースコードをきれいに示したい。
さてどうしよう?

最低限、行番号がついて欲しい。できれば予約語や文字列のハイライトも。

いろいろやってみたのでメモ。

●解決策1 SyntaxHighlighterを使う。

HTMLにソースコードを埋め込んで、きれいに表示します。

あっちこっちに解説がころがってるので詳しい説明は省略しますが、一点だけ。
HTML文書のどこかで、「dp.SyntaxHighlighter.HighlightAll('code')」を呼んでおくこと。忘れると素のテキストになってしまう。

一番簡単なのは、bodyタグのロード時にやる方法。
<body onload="dp.SyntaxHighlighter.HighlightAll('code');">

実際にやってみたのですが、
・HTMLなので、<や>などを事前に修正しておく必要があります。
・Pythonのコードで試したところ、ややこしい文字列リテラルがうまくハイライトされませんでした。

フォントがきれいで感心したのですが、どうも「Consolas」を使ってるらしい。

●解決策2 Eclipseに表示させる。

画面のスナップショットを取って画像ファイルにする、というベタなやつ。

実際にやってみると、スペルミスの部分にアンダーラインを引いてくれてるのが、やたらとうるさい。

これは、Window → Preference → General → Editors → Text Editors → Annotations → Spelling Errors → Text asのチェックを外すことで、アンダーラインを消せばOK。

デフォルトではフォントはCoureir Newなのですが、これも、Window → Preference → General → Appearence -> Colors and Fonts → Structured Text Editorsで変更できます。