メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年2月9日土曜日

[mod_chxj][携帯] ドキュメントの更新

0.9.0系はGET時、POST時の絵文字変換も入れたので
その辺に関することをドキュメントに追記しなきゃ・・・。
あと文字コード非依存にしたことと、絵文字定義を大幅に変更したこと、端末定義に文字コード情報を入れたこともか。


これが結構面倒。



.

[Python][お勉強] Python入門(25) - スコープ

今日もPython。

今日はスコープに関して学ぶ。


前提
Pythonでは変数は全て「名前空間」に属する。


モジュールのトップレベル変数
グローバル変数という。モジュール内(同一ファイル)であればグローバル変数として扱えるが、
モジュールの外からだとモジュールの属性として扱える。

グローバル変数
他言語のグローバル変数とは意味が違う。1ファイル全体が有効範囲。


ローカル変数
関数内での変数はその関数が呼び出された時点で作成される。その関数内においてのみ扱える変数。

関数内で代入された時点でローカル変数が作成される。
グローバル変数と同じ名前であっても関数内で代入されたらその時点でローカル変数が作成される。
よって無条件でグローバル変数を更新できない。
グローバル変数を更新したい場合はglobalステートメントを使用する。

Pythonでの3種類の名前空間
Pythonでは基本的に3種類の名前空間が存在する。
1つは「ローカルスコープ」、2つめは「グローバルスコープ」、3つめは「ビルトインスコープ」。
「ローカルスコープ」は「ローカル変数」の名前空間。「グローバルスコープ」は「グローバル変数」の名前空間。「ビルトインスコープ」はPython内で保持している__builtin__モジュールが属する名前空間。


LEGBルール
変数が使用されている場合、まずローカル変数であるかどうかを調べ、次に外側のローカル変数であるかどうか調べ、次にグローバル変数であるかどうか調べ、最後にビルトイン変数であるかどうか調べる。
このルールのこと。
「L」はLocal。「E」はEnclosing function's scopeの「E」。「G」はGlobalの「G」。「B」はBuiltinの「B]。


ビルトインスコープ
最初からimportもせずに使えるものでPythonプログラム全てのスコープ。
何が存在するのかは以下のようにすれば確認できる。


>>> import __builtin__
>>> dir(__builtin__)
['ArithmeticError', 'AssertionError', 'AttributeError',
'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError',
'Exception', 'False', 'FloatingPointError', 'FutureWarning',
'IOError', 'ImportError', 'IndentationError', 'IndexError',
'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError',
'NameError', 'None', 'NotImplemented', 'NotImplementedError',
'OSError', 'OverflowError', 'OverflowWarning', 'PendingDeprecationWarning',
'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError',
'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError',
'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError',
'UnicodeTranslateError', 'UserWarning', 'ValueError', 'Warning',
'ZeroDivisionError', '__debug__', '__doc__', '__import__',
'__name__', 'abs', 'apply', 'basestring', 'bool', 'buffer',
'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile',
'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir',
'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter',
'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help',
'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass',
'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max',
'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'quit',
'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round',
'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum',
'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
>>>




globalステートメント
通常関数の中からグローバル変数の値を更新することはできない。がglobalステートメントを使用して宣言することでグローバル変数を更新することができる。


>>> X = 88
>>>
>>> def func():
... X = 99
...
>>> func()
>>> print X
88
>>>


このように通常は、func()内のXはローカル変数として扱われ、グローバル変数であるXとは別ものとして
扱われる。
globalステートメントを使うと、

>>> X = 88
>>>
>>> def func ():
... global X
... X = 99
...
>>> func()
>>> print X
99
>>>


のようにfunc()内の変数もグローバル変数として扱うことができる。
上記はfunc()内でグローバル変数を更新した例。


まとめ
代入した時点でスコープが決まる。スコープを例外的に扱いたい場合にはglobalステートメントを使用する。





おしまい。
.

[Apache][CodeReading] Apache2.2.8コードリーディング9日目

今日もせっせとページ作り。
かと思いきや、やっと動きがあるところ(関数とか)にたどり着いた。

今日見ていったところは、

  • apr_proc_mutex_unix_setup_lock()/Apache2.2.8
  • proc_mutex_fcntl_setup()/Apache2.2.8
  • proc_mutex_unlock_itスタティック変数(proc_mutex.c)/Apache2.2.8
  • proc_mutex_lock_itスタティック変数(proc_mutex.c)/Apache2.2.8
  • proc_mutex_sysv_setup()/Apache2.2.8
  • APR_HAS_SYSVSEM_SERIALIZE定数/Apache2.2.8
  • APR_SUCCESS定数/Apache2.2.8
  • initializedスタティック変数(start.c)/Apache2.2.8
  • APR_DECLAREマクロ/Apache2.2.8
  • AP_MONCONTROLマクロ/Apache2.2.8
  • APR_DECLARE_OPTIONAL_FNマクロ/Apache2.2.8
  • APR_OPTIONAL_FN_TYPEマクロ/Apache2.2.8
ら辺。

Apacheの初期化にいよいよ突入。
まずはロック構造体を初期化している模様。


apr_proc_mutex_unix_setup_lock()でロック用構造体を初期化しているのだが、



162 static void proc_mutex_sysv_setup(void)
163 {
164 proc_mutex_op_on.sem_num = 0;
165 proc_mutex_op_on.sem_op = -1;
166 proc_mutex_op_on.sem_flg = SEM_UNDO;
167 proc_mutex_op_off.sem_num = 0;
168 proc_mutex_op_off.sem_op = 1;
169 proc_mutex_op_off.sem_flg = SEM_UNDO;
170 }
とか、

434 static void proc_mutex_fcntl_setup(void)
435 {
436 proc_mutex_lock_it.l_whence = SEEK_SET; /* from current point */
437 proc_mutex_lock_it.l_start = 0; /* -"- */
438 proc_mutex_lock_it.l_len = 0; /* until end of file */
439 proc_mutex_lock_it.l_type = F_WRLCK; /* set exclusive/write lock */
440 proc_mutex_lock_it.l_pid = 0; /* pid not actually interesting */
441 proc_mutex_unlock_it.l_whence = SEEK_SET; /* from current point */
442 proc_mutex_unlock_it.l_start = 0; /* -"- */
443 proc_mutex_unlock_it.l_len = 0; /* until end of file */
444 proc_mutex_unlock_it.l_type = F_UNLCK; /* set exclusive/write lock */
445 proc_mutex_unlock_it.l_pid = 0; /* pid not actually interesting */
446 }

とかを見る限り、きっと初期化された構造体を利用してロックをかけたり解除したりするに違いない・・。
fcntl用で使用するflock構造体をロック時、ロック解除時に使用するであろう値で初期化していた。
またSys V IPCで使用するsembuf構造体もロック時、ロック解除時に使用するであろう値に初期化。



まだ、初期化しか読んでないからわからないけど。


.

[mod_chxj][携帯] 0.8.4リリース

0.8.4をリリース。

debパッケージをapache2.2対応に。
ChxjImageCacheLimitディレクティブでイメージキャッシュの最大許容量を設定できるようにした。
削除ロジックも少々修正。


.

2008年2月8日金曜日

[Python][お勉強] Python入門(24) - 関数

今日もPythonのお勉強。
今日は「関数」をやる。


defステートメント
Syntaxは、


def <name>(arg1,arg2,...argN):
<statement>

な感じ。
defステートメントはネストできるので上記statement部でdefステートメントを書くこともできる。
arg1からargNは、もし引数があれば引数名を書く。なければ何も書かない。


returnステートメント
関数の処理結果を呼び出し元に返すのに使用する。
defステートメント中にreturnステートメントを記述しない場合は、その関数はNoneオブジェクトを返す。
また、returnステートメントはどこにでも書ける。


def aaa():
return 10

とあった場合は、呼び出し元に10を返す。

引数
関数を呼び出す時点で引数が(もしあれば)「代入」される。

>>> def aaa(aa,bb):
... return aa * bb
...
>>> aaa(10,20)
200
>>>


ここで10という値は引数aaに代入される。
20という値は引数bbに代入される。

関数オブジェクト
defステートメントで定義された関数もオブジェクトの一種。
defステートメントが書かれると、関数オブジェクトが生成され、関数名でつけた名の変数に代入される。


関数の呼び出し
関数を呼ぶには、

<name>(arg1,arg2...argN)

と書いてやればよい。

例)

>>> def aaa(a,b):
... print "a=%d" % a
... print "b=%d" % b
... return a * b
...
>>> aaa(5,6) # 関数呼び出し
a=5
b=6
30


値は30を返す。


ローカル変数
関数の中で代入された変数は、ローカル変数となる。
つまりその関数の中でのみ有効な変数となる。

>>> xxx = 100
>>> def aaa():
... xxx = 20
... print xxx
...
>>> aaa()
20
>>> print xxx
100
>>>


上記ではxxxという変数がトップレベルで定義されているが、
defステートメントの中のxxxはdefステートメントの中でだけ有効であるので、
関数呼び出し後のprint xxxではxxxは100のままとなる。

xxxをローカル変数とせずにグローバル変数として扱いたい場合は、
globalステートメントを使用する。



おしまい。
.

[Apache][CodeReading] Apache2.2.8コードリーディング8日目

昨日の続きをやる。今日もせっせとページづくり。

作ったページは、

  • module構造体/Apache2.2.8
  • module_struct構造体/Apache2.2.8
  • command_rec構造体/Apache2.2.8
  • command_struct構造体/Apache2.2.8
  • cmd_how列挙型/Apache2.2.8
  • cmd_func共用体/Apache2.2.8
  • cmd_parms構造体/Apache2.2.8
  • cmd_parms_struct構造体
  • ap_directive_t構造体
  • ap_configfile_t構造体/Apache2.2.8
  • ap_method_list_t構造体/Apache2.2.8
  • apr_getopt_t構造体/Apache2.2.8
  • apr_getopt_err_fn_t/Apache2.2.8
な感じ。

ディレクティブをどう保持するか、なんかが書かれているところ。



.

2008年2月7日木曜日

[mod_chxj] テスト用にBBSを追加してみた

絵文字変換のテスト用にBBSを追加してみた。


しょぼいプログラムだけど案外面白い。




.

[Python][お勉強] Python入門(23) - ドキュメンテーション文字列

今日もPythonのお勉強。

ドキュメンテーション文字列をやろうと思う。


ドキュメンテーション文字列とは
プログラム実行時にPythonインタプリターが内容を記録し、特定のオブジェクトに関連付けられる文字列。
関連づけられたオブジェクトの__doc__属性の値になる。

何がうれしいか
恐らくPyDocというツールで該当ドキュメントを読み出すことができたりすることがうれしいのかもしれない。

ドキュメンテーション文字列の書き方
とりあえずaaa.pyというファイルを作成する。
aaa.pyの先頭には、


"""
hello,hello,hello
aaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbb
"""

なんていう文字列を書いておきます。
で、pythonからimportしてhelp関数を呼ぶ。

$ python
Python 2.4.4 (#2, Apr 5 2007, 20:11:18)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import aaa
>>> help(aaa)


Help on module aaa:

NAME
aaa

FILE
/work/python/aaa.py

DESCRIPTION
hello,hello,hello
aaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbb



help関数を呼ぶと、aaa.pyの先頭に適当に書いた文字列がマニュアルのようにきれいにフォーマットされて出力されます。


さらに、aaa.pyに次のような感じでいろいろと付け加えてみます。

def bbb(x):
"""
nanika no kansu desu.
hee. iikoto kiita.
"""
return x

class aaa_class:
"class no documento de su."
pass

print bbb(10)
print bbb.__doc__



でimportしてみる。

$ python
Python 2.4.4 (#2, Apr 5 2007, 20:11:18)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import aaa
10

nanika no kansu desu.
hee. iikoto kiita.

>>>


__doc__属性の値が出力されました。
で、

>>> aaa.__doc__
'\nhello,hello,hello\naaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbb\n'
>>> aaa.aaa_class.__doc__
'class no documento de su.'
>>>

と、それぞれの__doc__属性も取得できる。




ごちそうさまでした。
.

[Apache][CodeReading] Apache2.2.8コードリーディング7日目

昨日サボったので、今日は読む。

読むというか作る。

ap_conf_vector_tというものを見つけたんだけど、typedefは見つけたけど実装が見当たらない。

常に


ap_conf_vector_t *

という形で使うのかな?

ま、ソース読めばわかるか。

今日見た部分は、
  • server_rec構造体/Apache2.2.8
  • server_addr_rec構造体/Apache2.2.8
  • apr_array_header_t構造体/Apache2.2.8
  • ap_conf_vector_t構造体/Apache2.2.8
だけ。
ページは作った。



.

[Apache][CodeReading] Apache2.2.8コードリーディング6日目

眠気に負けてサボった。




.

2008年2月6日水曜日

[Debian] warning: underquoted definition of AM_PATH_LIBMCRYPT

うーむ。

unstableからupgradeしたせいかしら。。。

/usr/share/aclocal/libmcrypt.m4

の17行目の


AC_DEFUN(AM_PATH_LIBMCRYPT,



AC_DEFUN([AM_PATH_LIBMCRYPT],


と修正。


.

[mod_chxj] GETの絵文字変換(DoCoMo→DoCoMo)

サーバサイドがSJISの場合のGET時絵文字変換は完了。
テストもOK。


次は
サーバサイドがSJISでクライアントサイドもSJISで、EzWEBの場合と
サーバサイドがSJISでクライアントサイドもSJISで、SoftBankの場合
をやってみる。

POSTのときと同じでいいはずだからできるはず。

.

[Python][お勉強] Python入門(22) - zip関数

さて、さっさと今日のノルマを終えてしまおう。

今日はzip関数から見ていく。

zip関数とは
複数のシーケンスに並行して同時にアクセスするforループを作るのに便利な関数。
二つのシーケンスがあったとして、


>>> L1 = [1,2,3,4,5]
>>> L2 = [6,7,8,9,10]
>>>


これらの2つのシーケンスを同時に処理する。
とにかく実際にやってみる。

>>> L1
[1, 2, 3, 4, 5]
>>> L2
[6, 7, 8, 9, 10]
>>> zip(L1,L2)
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
>>>


このように2つのシーケンスから1つのシーケンスを作って返す。
結果のそれぞれの要素が2つのシーケンスの値のタプルにな。
最初の要素は、L1[0]とL2[0]のタプル、
次の要素は、L1[1]とL2[1]のタプル・・・
というふうになる。

これをforループで使うと2つシーケンスを同時に処理できる。

>>> for (x,y) in zip(L1,L2):
... print x, y, '--', x+y
...
1 6 -- 7
2 7 -- 9
3 8 -- 11
4 9 -- 13
5 10 -- 15


こんな感じ。

ちなみにzip関数は引数は2つでなければならないわけじゃない。

>>> L3 = [11,12,13,14,15]
>>> L4= [16,17,18,19,20]
>>> L3
[11, 12, 13, 14, 15]
>>> L4
[16, 17, 18, 19, 20]
>>> zip(L1,L2,L3,L4)
[(1, 6, 11, 16), (2, 7, 12, 17), (3, 8, 13, 18), (4, 9, 14, 19), (5, 10, 15, 20)]
>>>


な感じにもりもり引数に渡せる。

上記は全て同じ要素数のシーケンスをパラメータに渡しているが、
それぞれ違う要素数のシーケンスを渡すとどうなるか。

>>> L5=[1,2,3]
>>> L5
[1, 2, 3]
>>> zip(L1,L5)
[(1, 1), (2, 2), (3, 3)]
>>>


となる。L1の要素数は5個。L5の要素数は3個。結果は3個のタプルのリスト。
つまり、引数として渡されたシーケンスの中でもっとも少ない要素数に揃えられる。




おしまい。
.

[Apache][CodeReading] Apache2.2.8コードリーディング5日目

今日もせっせとページを作った・・・。

作ったページは

  • server_rec構造体
  • apr_os_proc_t
  • apr_os_thread_t
  • apr_hash_t構造体
  • apr_hashfunc_t
  • apr_hash_entry_t構造体
  • apr_hash_t構造体
  • apr_abortfunc_t
  • process_chain構造体
  • apr_kill_contitions_e列挙型
な感じ。

特に面白そうだったのはapr_hash_t。
早く動くところを読みたいものだ。



.

2008年2月5日火曜日

[mod_chxj][携帯] ChxjImageCacheLimitディレクティブ追加

キャッシュがだめだめな件で、ChxjImageCacheLimitディレクティブを追加した。

これでもりもり作られるのが防げるはず・・・。
間違えた。既にもりもり系は回避済み。
サイズを自由に変えられるようになったはず・・・。

削除ロジックも修正したいんだけど、ひとまず置いておく。

リリースは0.8.4に含める予定。

[Python][お勉強] Python入門(21) - range関数

forステートメントと一緒によく使うらしいrangeを見る。

range関数とは
整数の数値からなるリストを返す関数。
forステートメントと一緒に使うことが多い。

実際に使ってみる
パラメータが2つのパターン。


>>> range(1,10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1,20)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> range(-1, 1)
[-1, 0]
>>> range(-1, 2)
[-1, 0, 1]


最初の引数は数列の開始位置を指定する。
第二引数は数列の終了位置を指定する。
range関数の結果には終了位置は含まれない。


>>> range(10, 2)
[]


開始位置を終了位置よりも大きい値を指定すると空リストが返ってくる。
仮に[10,9.8.7.6.5.4.3]という数列がほしいとするならば、

>>> range(10, 2, -1)
[10, 9, 8, 7, 6, 5, 4, 3]


のように第三引数を-1で指定する。

第三引数は、「結果のリスト数列をいくつ刻みで並べるか」を指定する。
マイナス値を指定した場合は上記のように数値が徐々に小さくなる数列を作成できる。

とりあえず、いろいろとやってみる。

>>> range(5,10,1)
[5, 6, 7, 8, 9]
>>> range(5,10,2)
[5, 7, 9]
>>> range(5,10,3)
[5, 8]
>>> range(5,10,4)
[5, 9]
>>> range(5,10,5)
[5]
>>> range(5,10,-1)
[]


第三引数にマイナス値を指定する場合は第一引数と第二引数もてれこに指定しなければならない。

第一引数だけ指定すると

>>> range(1)
[0]
>>> range(2)
[0, 1]
>>> range(3)
[0, 1, 2]
>>>


のように、いくつまでの数列を作るか、という指定になる。

forと一緒に使う
forステートメントと一緒に使ってみる。

>>> for x in range(10):
... print x
...
0
1
2
3
4
5
6
7
8
9






おしまい。
.

[Python][お勉強] Python入門(20) - forステートメント

今回はforステートメントをやる。

他言語のforとはちょっと違う雰囲気。
一般にシーケンスの個々の要素に1つづつ順番にアクセスするときに使用する。

Syntax


for <target> in <object>:
<statements1>
else
<statements2>



な感じ。
elseステートメントはwhileステートメントと同様にforステートメントで「偽」
と評価されたときにのみ実行される。(break文でループを抜けた場合には実行されない)

targetは現在objectのどの要素にアクセスしているかを保持していて、カーソルのような
役割を果たす。


実際に使ってみる。

>>> for x in ["a","b","c","d"] :
... print x,
...
a b c d
>>> for x in [1,2,3,4] :
... print x
...
1
2
3
4




object部分はシーケンスならば何でも良いので、上記ではリストを使用した。
タプルでもいけるはず。

>>> for x in (1,2,3,4) :
... print x
...
1
2
3
4



要素がタプルのリストの場合。

>>> for (x, y) in [(1,2), (3,4)]:
... print x, y
...
1 2
3 4





おしまい。
.

[Apache][CodeReading] Apache2.2.8コードリーディング4日目

とりあえず3日坊主は避けられた。
次は6日坊主。

今日もコードリーディング。といってもまだ構造体とかのページを作っているだけ。。

PukiWikiと格闘がメインになっている気が。。

今日作ったページは、

  • apr_descriptor共用体
  • apr_socket_t構造体
  • apr_datatype_e列挙型
  • apr_pollfd_t構造体
  • apr_pollset_t構造体
だけ。


あわてずゆっくりこつこつと。
.

2008年2月4日月曜日

[Python][お勉強] Python入門(19) - whileステートメント

whileステートメントをやる。

Pythonで繰り返しを行うコードを書くには、whileステートメントかforステートメントを使う。

syntax
形式は以下のとおり。


while <test>
<statement1>
else:
<statement2>


else複合ステートメントは省略可能。
つまり、

while <test>
<statements1>

と書くこともできる。
whileステートメントは、<test>が真の間、<statements1>の実行を繰り返す。


elseについて
他のプログラミング言語ではwhile文にelseがついたものはなかなか無い。
このelse複合ステートメントは、

whileステートメントの条件が偽であった場合、elseステートメントが実行される。

という意味である。
elseステートメントがあることによって余計なフラグを保持する必要がなく、また、わかりやすくプログラムを書くことができるらしい。

無限ループの例
以下に無限ループの例を書く。

while 1:
print "a"

強制終了させるまで終わらない。


breakステートメント
直属のループを無条件で抜ける。
ただし、ループ終了後にelse複合ステートメントは実行されない。


continueステートメント
その直属のループの先頭部分に無条件で戻る。

passステートメント
何もしない。
文法上ステートメントが必要だが何もしない場合に使用する。

無限ループの例

while 1: pass








おしまい
.

[mod_chxj][携帯] キャッシュつくりっぱなしのバグ

今日はきっとすごい人にキャッシュつくりっぱなしのバグを見つけてもらった。
ちょっと不謹慎ですが、やっぱりうれしいものですね。

でその対応で半日かかった。
ぜんぜんだめですね・・・。

さて次はglibc/iconvを使うように対応しよう。
そうしないとlibiconvをいちいちダウンロードしなくちゃならない・・・。

あと、GET対応もか。


.

[その他] MyMinCityひさびさに見に行ったら・・・

見にいったら道路ができてた。

なんとなくうれしいものっすね。

indリンクを踏めるようになってたのもまたいい感じ。

http://atkonn.myminicity.com/
http://atkonn.myminicity.com/ind


.

[Apache][CodeReading] Apache2.2.8コードリーディング3日目

Apache2.2.8のコードを読み始めて3日目。

pukiwikiの操作に時間がかかっている気がとってもする。
ファイルや関数・マクロのページを作ることにとっても時間がかかる・・・。
まぁ、それはそのうちなれるとして、ひらメソッドをやった感想を。

ソースコードだけあってドキュメントが一切無いプロジェクトで詳細設計書をソースから興している気分。
なるほど。時間がかかりそうだけどしっかり読めそう。

さてそれは置いといて、さっそくhttpd-2.2.8/server/main.cから読み始めたんだけど、
今のところapr_pool_tとかapr_file_tとかapr_allocator_tとかを調べて眺めている段階。
処理自体を見てみないと意味もわからないしね。

で気になったところは
apr_pool_tの中に保持しているapr_allocator_t。
こいつの


88 /**
89 * Lists of free nodes. Slot 0 is used for oversized nodes,
90 * and the slots 1..MAX_INDEX-1 contain nodes of sizes
91 * (i+1) * BOUNDARY_SIZE. Example for BOUNDARY_INDEX == 12:
92 * slot 0: nodes larger than 81920
93 * slot 1: size 8192
94 * slot 2: size 12288
95 * ...
96 * slot 19: size 81920
97 */
98 apr_memnode_t *free[MAX_INDEX];

のところ。
なんとなくカーネルのバディシステムだかスラブアロケータだかを連想させる。
気のせいか。
いや、実にわくわくしませんか?

あと、apr_pool_tの

473 apr_pool_t **ref;

自分自身へのポインタのポインタらしいんだけど、どのように使われているか
非常に楽しみ。


3日目でした。

2008年2月3日日曜日

[Python][お勉強] Python入門(18) - 構文に関するルール

Python流の構文ルール。

  1. ステートメントは基本的に前から順に1つづつ実行される。
  2. ブロック・ステートメントの区切りは自動的に検知
  3. 複合ステートメントを作成するには「:」(コロン)を使用する。
  4. 空白行、スペース、コメントは通常は無視される。
  5. ドキュメンテーション文字列(コメント以外でコメント的なもの)はツールによって出力可能

1は他でも一緒のような・・・。
2は面白い。セミコロンとか、何か区切りを検知するものが必要であるほかの言語とは違う。
Pythonでもセミコロンを使えるが通常は使わない。セミコロンを使うと強制的にステートメントを終了させられる。

5はよくわからない。


2についてもう少し詳細に見ていく。
プロックの区切り
ブロックの区切りはインデントによって自動的に検知される。
インデントが同一のものだけが同じブロックと成りえる。

ステートメントの区切り
通常は1行1ステートメント。
1行1ステートメントを心がけるべき。
1行1ステートメントではない書き方は以下のとおり。

  • カッコで囲んだ場合
  • バックスラッシュを行末につけた場合
  • トリプルクォーテーションを使用した場合
  • セミコロンを使用してステートメントを強制終了させた場合
カッコで囲んだ場合の例

L = ["AAA",
"BBB",
"CCC"]

if (a == 1 and b == 2 and c == 3
and d == 4) :
print "ABC"



バックスラッシュを用いた場合

if a == 1 and b == 2 and c == 3 \
and d == 4 :
print "ABC"



セミコロンを使用した場合

print "a"; print "b"; print "c"




おしまい。




.

[Python][お勉強] Python入門(17) - ifステートメント

分岐。ifステートメントをやる。


ifステートメントとは
プログラムの処理の流れを決めるために使われるステートメント。
フロー制御。複合ステートメントの1つ。


Syntax


if <test1>:
<statements1>
elif <test2>:
<statements2>
else:
<statements3>


といった感じ。else if は「elif」と書く。
elif、elseのブロックは省略可能。
statement1、statements2、statements3はネストされたステートメントで1ステートメントでも複数ステートメントでも、書きたいだけ書ける。ただし、複数ステートメント記述する場合にはインデントを合わせる必要がある。

上記の動作を言葉で書くと、

もし、が真ならば、statements1を実行せよ。
そうではなく、もしが真ならばsatetments2を実行せよ。
さもなくば、statements3を実行せよ。

といった感じになるだろうか。

インデント
通常はタブ文字を使用するが、スペースでも可能。
インデントされ、ネストされたステートメントはまとめて「ブロック」という。

多分岐
switch文のような多分岐はPythonでは無い。よって、if-elif-else文の羅列によって実現する。
その他、ディクショナリを利用して実現する方法もある。



終わり。

[mod_chxj][携帯] libiconvを廃止する

今、libiconvを使用しているのだが、glibc/iconvを使用するようにしないととにかく不便。

ということで次のパッチレベル0.8.3で対応しよう。


.

[mod_chxj][携帯] --enable-img-conv-fでこける

うーむ。
こけた。

修正してコミット済み。

これからチェックするんだけど
とりあえずチェック対象は、

  • Debian-sarge【済】
  • Debian-Etch【済】
  • Fedora-8【済】
  • CentOS5.1【済】

ぐらいか。

一応インストールメモ。
CentOS5.1
1) どこからかmod_encodingのソースをダウンロード。
2) mod_encoding/libの下に行って
3) make; make install
4) mod_chxjをダウンロード
5) tar xvzf mod_chxj-xxxx.tar.gz
6) cd mod_chxj-xxxx
7) ./configure --with-apache-header=/usr/include/httpd
8) make
9) make install

Debian-sarge
apt-get install libiconv-hook1 libiconv-hook-dev
apt-get install libmagick6 libmagick6-dev
./configure --with-apache-header=/usr/include/apache2 --with-apxs=/usr/bin/apxs2
make
make install

Fedora8
mod_encodingをどっかからダウンロード
mod_encoding/libの下でconfigure&make&make install
yum install httpd-devel
yum install ImageMagick ImageMagick-devel
yum install sysconftool
./buildconf.sh
./configure --with-apache-header=/usr/include/httpd






.