| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 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
HTMLなどでは
üなどの実体参照でヘンテコめな文字を表現する場合がある。これを機械的に通常文字に変換したい。
import htmlentitydefs g = lambda match: unichr(htmlentitydefs.name2codepoint[match.group(1)]) mystring = re.sub(u'&(.+?);', g, mystring)
IPythonは色分け、補完などでインタラクティブコンソールを何かと便利にするもの。併せて使用したいのが(py)readlineなるパッケージで、これは大雑把にはctrl-f,b,a,e,d,kといったemacs系のキーバインドなどを使えるようにするもの。
Windows XP SP2で ipython-0.8.4-py2.5.eggとpyreadline-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)
などの記述を大量に発見。ここがキーバインドのキモだろう。カスタマイズの際は何か別に設定ファイル等を作るべきかもしれないが、ここは安直に大元を改造する方針でゆく。
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設定と干渉を起こしておかしな事になっているのかもしれない。
self._bind_key('Control-h', self.backward_delete_char)
[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本当にこんなんでいいのだろうか。
単なる備忘録。
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-16]の続き。ちょっと実際に試してわかったことをメモする。
結論:ResEditを使う際、win32rcparser.pyを変更した方が良い。変更箇所はこのメモ後半に示す。
ResEditで配置する場合、いくつか「地雷」なコントロールがある。
(1) チェックボックス、ラジオボタン
チェックボックスやラジオボタンを配置したリソーススクリプトを使うと、pythonスクリプト実行時ダイアログ自体も表示されなかった。
ResEditでチェックボックス(ラジオボタンも同様)を配置すると以下のようなリソーススクリプトとなる。win32rcparser.pyはこれをちゃんと解釈してくれないようだ。
AUTOCHECKBOX "Check1", IDC_CHECKBOX1, 10, 43, 40, 10C:\Python25\Lib\site-packages\win32\test\win32rcparser\test.rc を見ると以下の記述は正しく解釈されているようだった。
CONTROL "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,52,68,12両者はリソーススクリプト的には等価だが、前者の記述はwin32rcparser.pyは想定してなかった、といったところか。
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に解釈できなかった、という感じ。ピクチャコントロールも同様に躓いた模様。
--- 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()
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-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:
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