前の月 / 次の月 / 最新

hiChangeLog / 2008-08

2008-08
SMTWTFS
12
3456789
10111213141516
17181920212223
24252627282930
31

2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12

2008-08-31 Sun

実体参照を通常の文字に変換する [python][正規表現]

HTMLなどでは

ü
などの実体参照でヘンテコめな文字を表現する場合がある。これを機械的に通常文字に変換したい。

そのものズバリの解説ページがあった。文字参照や実体参照を通常の文字に戻す [Python, Tips] - Programming Magic
以下で変換できているみたい。
import htmlentitydefs
g = lambda match: unichr(htmlentitydefs.name2codepoint[match.group(1)])
mystring = re.sub(u'&(.+?);', g, mystring)

2008-08-29 Fri

IPythonコンソール、つまりはreadlineでキーバインド変更(ctrl-Hをバックスペースにしたい) [python]

IPython色分け、補完などでインタラクティブコンソールを何かと便利にするもの。併せて使用したいのが(py)readlineなるパッケージで、これは大雑把にはctrl-f,b,a,e,d,kといったemacs系のキーバインドなどを使えるようにするもの。

Windows XP SP2で ipython-0.8.4-py2.5.eggpyreadline-1.5.dev_r2876-py2.5.eggをeasy_installで導入してみた。便利。個人的にはキーバインドが気に入った。生コマンドプロンプトの時よりもかなり入力の効率は上がるだろう。だが、ctrl-Hはバックスペースになっていなかった。以下はこれを実現した際のメモ。

上述の通り、キーバインドはreadlineが担う。C:\Python25\Lib\site-packages\pyreadline-1.5.dev_r2876-py2.5.egg\pyreadline\modes\emacs.py を見てみると、538行目の init_editing_mode メソッドにて

self._bind_key('Control-b', self.backward_char)
などの記述を大量に発見。ここがキーバインドのキモだろう。カスタマイズの際は何か別に設定ファイル等を作るべきかもしれないが、ここは安直に大元を改造する方針でゆく。
改造も安直に下記1行の追加で大丈夫と思ったが、うまくいかなかった。(文字は消えるがカーソルは進む。制御文字との対応がうまくいってないとか何とかか?)
self._bind_key('Control-h', self.backward_delete_char)
でも以下は期待通りの動作(ctrl-Xでバックスペース)を実現した。
self._bind_key('Control-x', self.backward_delete_char)
生コマンドプロンプトはctrl-Hを解釈してバックスペースにしてくれるが、これがpyreadline側のctrl-H設定と干渉を起こしておかしな事になっているのかもしれない。

そこで、違うreadlineパッケージを試してみた。UNC Python Toolsなるものにreadlineが含まれる。上記pyreadlineをアンインストールした後にこれの1.12をインストールしてみた。C:\Python25\Lib\site-packages\readline\PyReadline.py の 1003行目に emacs_editing_mode メソッドがあって、上記 init_editing_mode と同様な記述が羅列されている。ここで下記1行を加えたら、ctrl-Hがバックスペースになった!
self._bind_key('Control-h', self.backward_delete_char)


できなかった理由、できた理由は全く理解していないが、ともかくもこれで結構快適な環境になりそうだ。

('09 11/16 追記) はるかに洗練された解決方法を発見した。IPythonを使ってZope3デバッグ :: 幕の内 - CMS - コンテンツマネジメントシステム

2008-08-21 Thu

maildropでmh形式のメールを扱うためにrcvstoreが必要なのでnmhを導入した・その2 [メール]

[2008-01-05-2]と同様なnmhのsetupを他の環境で行った際のメモ。
まず make install でコケた。incコマンドをginstallする際のchmod -g mail -m 2755 で "ginstall: cannot change ownership" "Operation not permitted" と怒られた。自分しか使わないのでパーミッションの指定を無くして無理矢理installした。
次に上記メモで「で、~/.mh_profileに以下を設定した(抜粋。他に変更は施していない)。」とか書いてある。でも$HOMEにそんなもんできてないし、雛形っぽいのもどこにもない。もとの.mh_profileが何なのか一切触れていない自分の無能っぷりに立腹。
どうやらmh-installコマンドを打つと雛形を作成してくれる模様。打つと「どこのディレクトリに保存しますか」的なことを聞かれて、答えたら終わった。出来上がった.mh_profileを見てみると下記のようだった。

Path: Mail
これだけかい!しょうがないのでもう1行つけたして以下の.mh_profileを作成。
Path: Mail
Inbox: mhInbox
で下記のようにすると、Mail/mhInboxに数字だけファイルがちゃんとできた。
$ echo world | $HOME/usr/lib/rcvstore
本当にこんなんでいいのだろうか。

2008-08-20 Wed

maildropのインストール [メール]

単なる備忘録。
configure時pcreが無いとか言われたのでインストールした。

./configure --prefix=/home/myname/usr
make
make check
make install
これをconfigureにわからせるために以下の環境変数を設定(see. http://www.courier-mta.org/FAQ.html)
export LDFLAGS="-L/home/myname/usr/lib"
export CPPFLAGS="-I/home/myname/usr/include"
そして以下で終わり。たぶん問題なし
./configure --prefix=/home/myname/usr

2008-08-17 Sun

pywin32のMFCプログラミングでリソース(スクリプト/エディタ)を利活用する2 [PyWin32][Windowsプログラミング]

[2008-08-16]の続き。ちょっと実際に試してわかったことをメモする。

結論:ResEditを使う際、win32rcparser.pyを変更した方が良い。変更箇所はこのメモ後半に示す。

ResEditで配置する場合、いくつか「地雷」なコントロールがある。

(1) チェックボックス、ラジオボタン
チェックボックスやラジオボタンを配置したリソーススクリプトを使うと、pythonスクリプト実行時ダイアログ自体も表示されなかった。
ResEditでチェックボックス(ラジオボタンも同様)を配置すると以下のようなリソーススクリプトとなる。win32rcparser.pyはこれをちゃんと解釈してくれないようだ。

AUTOCHECKBOX    "Check1", IDC_CHECKBOX1, 10, 43, 40, 10
C:\Python25\Lib\site-packages\win32\test\win32rcparser\test.rc を見ると以下の記述は正しく解釈されているようだった。
CONTROL         "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,52,68,12
両者はリソーススクリプト的には等価だが、前者の記述はwin32rcparser.pyは想定してなかった、といったところか。

(2) コモンコントロールとピクチャコントロール
スピン、プログレスバーも同様、使用するとダイアログが表示されなかった。
ResEdit、上記test.rcによるリソーススクリプトの記述を順に示す。
CONTROL         "", IDC_SPIN1, UPDOWN_CLASS, UDS_ARROWKEYS, 10, 119, 9, 14
CONTROL         "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS,7,71,14,22
というわけで、ResEditのウィンドウクラスの表現(UPDOWN_CLASS)がwin32rcparserに解釈できなかった、という感じ。ピクチャコントロールも同様に躓いた模様。

凝ったUIは趣味ではないが、チェックボックスやスピンが自由に使えないとなると結構つらい。
これらをどう解決するか?
win32rcparser.pyに修正を施すのがあるべき対処。明快だし、多分比較的難しくない。
もうひとつの方法は、リソーススクリプト読み込み時に、win32rcparserが解釈できる形式に変換すること。ちょっと面倒だが、既存物を変更する必要が無いので、役割分担が明確で、変化にも柔軟に対応できるだろう。
ここでは安直に前者を選択した。場当たり的な対処を施したパッチが以下(前メモの、ヘッダ解釈にまつわる変更も含む)。これにより、プッシュボタン、チェックボックス、ラジオボタン、グループボックス、スタティックテキスト、ピクチャコントロール、スクロールバー、エディットボックス、リストボックス、コンボボックス、スピン、スライダー、プログレスバー、タブ、リストビュー、ツリービュー、IPアドレスコントロール、日付選択、カレンダー、を配置したダイアログボックスを無事に解釈し表示できた。イベントを割当ててどうのこうのはまだ行っていないが、多分問題ないだろう。
--- C:/Python25/Lib/site-packages/win32/lib/win32rcparser_orig.py	Thu Jul 29 00:25:22 2004
+++ C:/temp/e/f/win32rcparser.py	Sun Aug 17 14:25:20 2008
@@ -199,10 +199,12 @@
 
     def parseH(self, file):
         lex = shlex.shlex(file)
         lex.commenters = "//"
         token = " "
+        lex.whitespace += '()'
+        lex.wordchars += '-'
         while token is not None:
             token = lex.get_token()
             if token == "" or token is None:
                 token = None
             else:
@@ -456,10 +458,17 @@
             self.getCommaToken()
 
             if control.controlType == "CONTROL":
                 self.getToken()
                 control.subType = self.token[1:-1]
+
+                # ad hoc handling for ResEdit's common-controls by H.Itoh
+                # ex. 'UPDOWN_CLASS' => 'UPDOWN_CLASSA' => "msctls_updown32" (see commctrl l.731) etc.
+                try: control.subType = getattr(commctrl, self.token+'A')
+                except AttributeError: pass
+                if self.token=='WC_STATIC': control.subType = 'Static'
+
                 thisDefaultStyle = defaultControlStyle | \
                                    _addDefaults.get(control.subType, 0)
                 # Styles
                 self.getCommaToken()
                 self.getToken()
@@ -483,10 +492,21 @@
                 self.getToken()
                 control.style, control.styles = self.styles([], thisDefaultStyle)
             if self.token==",":
                 self.getToken()
                 control.styleEx, control.stylesEx = self.styles([], defaultControlStyleEx)
+
+            # ad hoc handling for ResEdit by H.Itoh
+            f = lambda s: control.controlType.endswith(s)
+            if f('CHECKBOX') | f('RADIOBUTTON'):
+                for s in ['BS_'+control.controlType, 'WS_TABSTOP']:
+                    control.styles.append(s)
+                    control.style |= getattr(win32con, s)
+                control.controlType = 'CONTROL'
+                control.subType = 'Button'
+                control.style |= defaultControlStyle
+
             #print control.toString()
             dlg.controls.append(control)
 
 def ParseStreams(rc_file, h_file):
     rcp = RCParser()

上記の修正は関係ないが、win32rcparser.pyは下記のように使う(下記はダイアログを表示させるだけ。イベントハンドラの記述については[2008-06-07-1]を参照)。my.rcが作成したリソーススクリプト。
from pywin.mfc import dialog
import win32rcparser

class Mydialog(dialog.Dialog):

    def __init__(self, ddef):
        dialog.Dialog.__init__(self, ddef)
        
    def OnInitDialog(self):
        return dialog.Dialog.OnInitDialog(self)

if __name__=='__main__':
    rc = win32rcparser.Parse('my.rc')
    ddef = rc.dialogs['IDD_DIALOG1']
    w = Mydialog(ddef)
    w.DoModal()

2008-08-16 Sat

pywin32のMFCプログラミングでリソース(スクリプト/エディタ)を利活用する [PyWin32][Windowsプログラミング]

[2008-06-09-2]で、pythonによるwindowsプログラミングにおいてリソース(スクリプト/エディタ)が使えそうである旨メモした。
その時はリソーススクリプトをパースする在野のpythonスクリプトを見つけ出したと思っていたが、実は手元のpywin32(-211)に同様のものが含まれていた。
本体は C:\Python25\Lib\site-packages\win32\lib\win32rcparser.py にあり、C:\Python25\Lib\site-packages\win32\Demos\win32rcparser_demo.py でその動作っぷりが確かめられる。これで、個人的には、pythonによるwindowsプログラミングの敷居がぐっと下がったのではと感じる。

ただこれをResEditで利用する場合、そのままでは動かない。以下を参照。

- ANSI版のResEditを使うべき。Unicode版はUTF16のリソーススクリプトを吐くが、win32rcparser.py はこれをうまく読んでくれなかった。本来はwin32rcparser.pyに修正を施すべきだが、これは面倒。作成後にリソーススクリプトをANSIに変換しても良いけれど、そんなことするくらいなら最初からANSI版を使うのが良い。
- ResEditの吐くヘッダ中の

#define IDC_STATIC (-1)
が、そのままでは通らない。これは、カッコと負号がちゃんとパースされていないため。この行を編集(消すなり、カッコ無しの正数にしたり)するのがひとつの対策。即ちアプリケーション本体の実行時に動的にこの行をフィルタしてwin32rcparserに渡す、など。もうひとつの対策は、win32rcparser.pyに修正を施すこと。場当たり的だが以下のような簡単に修正できるので、こちらの方が良さそう。
@@ -199,10 +199,12 @@
 
     def parseH(self, file):
         lex = shlex.shlex(file)
         lex.commenters = "//"
         token = " "
+        lex.whitespace += '()'
+        lex.wordchars += '-'
         while token is not None:
             token = lex.get_token()
             if token == "" or token is None:
                 token = None
             else:

これでpythonによるwindowsアプリの量産態勢に入れるだろうか。

Referrer (Inside): [2008-08-17-1]

2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2010-03-08 22:21