タイトル/名前 | 更新者 | 更新日 |
---|---|---|
日記/2009/03/01/jQueryのattrメソッドでonClickを設定しようとしたけどIE7で無理でした。 | msakamoto-sf | 2009-03-01 00:26:50 |
JavaScript/PageNavi(2) | msakamoto-sf | 2009-03-01 00:16:05 |
日記/2009/02/25/Pythonのクラスで__call__という特殊属性を使うとクロージャっぽくできそう | msakamoto-sf | 2009-02-25 08:02:54 |
日記/2009/02/22/WinXPのApache2.0へのPython2.5用mod_python.soのインストールが上手く行かない。 | msakamoto-sf | 2009-02-22 22:29:03 |
Python/インデントにタブ文字と空白は混ぜるな危険 | msakamoto-sf | 2009-02-22 21:10:10 |
Python/無視される空行について | msakamoto-sf | 2009-02-22 20:52:17 |
Python/行折り返しが自動認識されるタプル、リスト、辞書、関数コール | msakamoto-sf | 2009-02-22 20:31:17 |
Python/行を途中で折り返す(明示的な行継続) | msakamoto-sf | 2009-02-22 20:11:48 |
日記/2009/02/22/Tracでrestrict_ownerをtrueにした時の注意メモ | msakamoto-sf | 2009-02-22 16:00:43 |
日記/2009/02/22/TracWebAdminのzipをeasy_installで入れる時の注意メモ | msakamoto-sf | 2009-02-22 15:54:21 |
jQueryの1.2.6/1.3.2 で試したんですが、 JavaScript/PageNavi(2)を作っていた時に、<a>タグのonClickを動的に設定しようとして
$('#abc').attr('onclick', 'window.alert(123);');
とかしてみたんです。
Firefox2とOpera9では動いてくれたんですが、IE7で動きませんでした。jQueryのコードは追ってないので簡単な「できなかったよ」報告になってしまいますが、やっぱり素直に
$('#abc').click(function(event) { window.alert(123); });
としないと駄目ッスね。
そもそも何でそんな変なことしようとしたのかというと、onClick時にJsPrevNextPagerのclicknext()を呼びたいのですが、JsPrevNextPager()に渡すIDをどうやって指定しようかということで、ものは試しに 'onClick' 属性に文字列でJavaScriptを指定して、そこで動的にIDを埋め込もうとしたわけです。
イメージ的にはこんな感じにしようとしてました。
$('#' + this.id_next + ' a').attr('onClick', 'JsPrevNextPager(' + this.id + ').clicknext();');
Firefox/Operaで動いて「ヤッター」と喜んだのも束の間、IE7で玉砕し、動くコードに辿り着くまで実に5時間もかかってしまいました。スコープ絡みで色々つっかかりました。今時駄目すぎですが、とりあえず以上。
前回(JavaScript/PageNavi(1))の改良版です。前/次で辿っていき、端っこまで来た時にも(CSSでごまかしているとはいえ)リンクのままは気持ち悪い、ということでどうしようかと弄っているうちに、かなり書き換わってしまいました。
というわけで、「前へ」「次へ」のリンク状態/端っこの時の非リンク状態をオブジェクトのメンバに持たせるようにしちゃいました。リンクのクリックイベントについてはライブラリ側で動的に設定してしまいます。
インスタンス生成がnew無しで関数呼び出しのようにできる、というのもあって、呼び出す部分についてはクロージャのようにしか見えない。
>>> class Klass(object): ... def __init__(self, a): ... self.a = a ... def __call__(self, n): ... return n + self.a ... >>> >>> k = Klass(10) >>> k(20) 30
ところでこのコードを入力していたのは、対話形式で立ち上げていたPythonなのだけれど、途中で__call__の中身を間違えてしまい、そのままもう一度class宣言し直したら動いた。
・・・あれ?二重宣言でエラーじゃないの?
これも気になるナー。
http://www.modpython.org/
から、
mod_python-3.3.1.win32-py2.5-Apache2.0.exe
をDLしてきてインストールしてみた。Python2.5のディレクトリは正常に認識できて、mod_python.soもApache2のmodulesディレクトリに追加されていたので、
LoadModule python_module modules/mod_python.so
を追加して
apache -f conf\httpd_php4.conf -t
したら・・・
Syntax error on line 54 of C:/Program Files/Apache Group/Apache2/conf/httpd_common.conf: Cannot load C:/Program Files/Apache Group/Apache2/modules/mod_python.so into server: \x8ew\x92\xe8\x82\xb3\x82\xea\x82\xbd\x83v\x83\x8d\x83V\x81[\x83W\x83\x83\x82 \xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81B
で起動しない。
最後の16進数をPHPで戻してみたら「指定されたプロシージャが見つかりません。」とのこと。英語だと "The specified procedure could not be found." になるので、色々GoogleであたってみたけどHitが無い。
mod_python.so側のバージョンとPythonのランタイムDLLのバージョンが違っていたり、ランタイムDLLがPATHに無かったり、他のアプリが自前で入れたPythonXX.dllがPATH上で先にヒットするのが主たる要因らしいのだけれど。
Python25.dllもちゃんと C:\WINDOWS\System32 の中にあるし、Apacheのバージョンもあっている。
というか、Python25.dllをapache.exeと同じディレクトリに置いて、そのディレクトリにCDして設定ファイルのテストを行っている。Winの場合、DLLの検索パスは実行ファイルと同じディレクトリ内が最初になるので、これで問題ないはず。
・・・もしかしてPython2.6も一緒に入れているのが不味いのか?C:\WINDOWS\System32\Python26.dllがあるし・・・。
とりあえず今夜はここら辺にしておくけど、またやる気が出てきたらPython2.6をアンインストールして実験してみよう。
分かりやすくタブ文字を "(\t)", 空白をアンダースコア "_" で表記しますが、インデントで面白いことが出来ます。
if True: (\t)print 'abc' # TAB文字1つでインデント ________print 'def' # 空白8つでインデント
→
abc def
ちゃんと動きます。何となく、ブロックって同じ文字で同じインデントだと思ってましたので、これはちょっと面白い。
ちなみに、空白4つにしてしまうと駄目なんです。
if True: (\t)print 'abc' # TAB文字1つでインデント ____print 'def' # 空白4つでインデント
→
File "t_hoge.py", line 5 print 'def' ^ IndentationError: unindent does not match any outer indentation level
言語仕様リファレンスに「インデント」というそのものズバリのページがありまして、それを読むとどうやらTAB文字は空白に置換され、その文字数は最初の非空白文字までの空白が8の倍数になるように調整されるそうです。
http://www.python.jp/doc/release/ref/indentation.html :
まず、タブは (左から右の方向に) 1 つから 8 つのスペースで置き換えられ、
置き換え後の文字列の終わりの位置までの文字数が 8 の倍数になるように調整されます
(Unixで使われている規則と同じになるよう意図されています)。
次に、空白文字でない最初の文字までのスペースの総数から、その行のインデントを決定します。
そんなわけで、TAB文字と空白インデントを混在させることは可能です。可能です、が・・・TAB文字を4桁とか2桁表示にしているエディタでは、見た目滅茶苦茶になって可読性が非常に悪くなります。
混ぜることは出来ますが、基本、混ぜるな危険ということで。
ちなみにPythonにくっついてくるライブラリは4文字空白インデントになっています。特に規約で定める必要がなければ、それに合わせれば良いと思います。
Pythonリファレンスマニュアルの言語仕様で「空行」というページがあります。
http://www.python.jp/doc/release/ref/blank-lines.html :
スペース、タブ、フォームフィード、およびコメントのみを含む論理行は無視されます
(すなわち、NEWLINE トークンは生成されません)。
こんな感じです。分かりやすくする為、タブ文字を \t で丸括弧で示しています。空白のインデントはアンダースコア(_)で示しています。
for x in range(5): (\t)print x, #comment ________# comment ____ (\t)(\t)(\t)# comment (\t)print x,
→
0 0 1 1 2 2 3 3 4 4
結果はOKです。同じ実行ブロックとして2回ずつ同じ数値が表示されています。
面白いのは二回目表示のprintの直前で、これは空白もタブ文字も何もない、本当の空行です。これもちゃんと読み飛ばしてくれるんですね。
ちなみにフォームフィードは "\f" らしいですが、どうやってそんなの入力するんだよとか、そもそも初めて目にする制御文字で「次ページの先頭へ移動するようプリンタに指示するための制御文字」らしいのですが今時使わないんじゃないの?と、激しく謎ですが使わないので置いておきます。
丸括弧(parentheses), 角括弧(square bracket), 波括弧(curly brace)の中は、バックスラッシュを使わなくとも行を折り返すことが出来ます。
1. タプルを作る時の丸括弧
t = ( #aaa 'ABC', #bbb 'DEF' #ccc , 123 #ddd , 456, #eee ) #fff print repr(t)
→
('ABC', 'DEF', 123, 456)
2. リストを作る時の角括弧
l = [ #aaa 'abc', #bbb 'def', #ccc 123, #ddd 456, #eee ] #fff print repr(l)
→
['abc', 'def', 123, 456]
3. 辞書を作る時の波括弧
d = { #aaa 'abc' : [ #bbb 1, 2 #ccc , 3 #ddd ] #eee , 'def' #fff : #ggg 123 #hhh , #iii } #jjj print repr(d)
→
{'abc': [1, 2, 3], 'def': 123}
4. 関数を呼ぶ時の丸括弧
def hello(s1, s2, s3): print "Hello %s, %s, %s" % (s1, s2, s3) hello( #aaa 'Foo' #bbb , 'Bar', #ccc 'Buz' #ddd )
→
Hello Foo, Bar, Buz
かなり無茶な折り返しが可能です。実験の為、辞書のところなどぐちゃぐちゃな折り返しにしてみましたがちゃんと認識されました。
関数呼び出しの引数の部分を折り返せるのが心強いです。
バックスラッシュを行末に置くことで、長い行を折り返すことができます。
v = 1 + 2 + \ 3 + 4 + 5 \ + 6 + 7 \ + 8 + \ 9 + 10 print v
→
55
if文の条件式も折り返せます。
if (3 == (1 + 2)) and \ (4 == (2 * 2)) \ and \ (5 == (6 - 1)): print 'ok'
→
ok
面白いことに、折り返しの最中はインデントはぐちゃぐちゃでもOKみたいです。
for文の途中でも折り返せます。
s = "abc" for c \ in s: print c
→
a b c
バックスラッシュの後ろにコメントを付けることはできません。
>>> 1 + 2 + \ ... 3 + 4 + \ # comment File "<stdin>", line 2 3 + 4 + \ # comment ^ SyntaxError: unexpected character after line continuation character
#移行の行末がバックスラッシュの場合は、折り返し無効です。コメントの一部とみなされます。
>>> 1 + 2 #comment \ 3
また通常の文をバックスラッシュで分割することもできません。
>>> 1 + 2 \ + 3 + 4 File "<stdin>", line 1 1 + 2 \ + 3 + 4 ^ SyntaxError: unexpected character after line continuation character
とりあえず行儀良くバックスラッシュを使えば、長い文も折り返して読みやすく出来ます。
一行80桁改行制限もクリアできそうです。
詳しくは
見てね、なのだけれど。
TICKET_MODIFYを設定していない状態で一度ログインしてしまうと、その状態でセッション情報が載ってしまうらしく、trac-adminで後からTICKET_MODIFYしてもリストに出てこない。
trac-adminでTICKET_MODIFYをaddしたら、一旦「Settings」でユーザー名なりメールアドレスを適当な値で更新する。セッション情報が更新されるのかしらないが、これで担当者のリストに表示されるようになる。
今の現場で使っているTracが0.10なので、WebAdminプラグインを入れようと、
TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip
をDLして、
# easy_install TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip
しようとしたら
Processing TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip error: Couldn't find a setup script in TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip
で怒られた。
少しGoogleで検索したら
というので既に報告されている。
これはバグでもパッケージングのミスでもなくて、easy_installは拡張子が".zip"だと、eggではなくソースパッケージと認識してしまうらしい。
単純に拡張子の".zip"を削ればOKとのことで、
# mv TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip TracWebAdmin-0.1.2dev_r4240-py2.4.egg # easy_install TracWebAdmin-0.1.2dev_r4240-py2.4.egg
したら上手くいった。