年末の大掃除

今年も残すところあと1時間になってしまいました。
今年は、子供が生まれた大きな年でしたが、技術面ではLPIC Level1の資格を取得するにとどまってしまいました。来年こそは資格取得のための勉強をしっかりとして、試験対策の知識だけでなく、今後も生かせる知識を身につけたいと思います。
ところで、今日ガラス掃除をしようとしていて、ネットで見つけた「クルー 網戸とガラスワイパー」という商品を早速買ってきました。
この商品は2004年に発売されているにもかかわらずロングセラーらしく、プロの人が持っているようなワイパーとまではいかないですが、それなりに本格的なワイパーに洗剤がしみこませてあるシートがガラス用と網戸用で2枚ずつ入っています。
早速使ってみると、シートが真っ黒になりました。この前雑巾で拭いていたのですが、しっかりととれていなかったみたいで、ビックリしました。あとは、ワイパーで拭くのでガラスがきれいになります。
取り換え用シートは別売りで売っていて、それぞれガラス用網戸用で1枚当たり約30円です。1年に何回も掃除するわけではないと思うので、一つずつ持っておいても損はないと思いました。

logrotate

ログを出力するプログラムはたくさんあるが、1ファイルに書き出し続けると不要な過去のログを保持し続けて容量不足になってしまったりすることがある。
logrotateを使えば、出力側のプログラムを変更することなく、きめられたタイミングで現在のファイルをリネームしたうえで、新しいログファイルを作成してくれる。
Fedora Coreであれば、
/etc/logrotate.d/ の下にファイルを作成して、
/var/www/XXX/logs/*log {
daily
missingok
}
とすれば、cakePHPで出力されるdebug_logとerror_logを1日単位でローテートしてくれる。
create (パーミッション) (ユーザー名) (グループ名)のオプションを付ければ、空のファイルを作成してくれるし、apacheプロセスのようにログ出力プログラムがログファイルが無くなってしまうとそれ以降ログを書き出さないような仕組みなのであれば、postrotateオプションをつかってプロセスを再起動させることもできる。
詳しいオプションは@ITが参考になる。

ITサービスマネージャー試験結果

受験番号 SM325-2744 の方は, 不合格 です
午前Ⅰ得点 ***.**点 (免除)
午前Ⅱ得点 72.00点
午後Ⅰ得点 62点
午後Ⅱ評価ランク B (合格水準まであと一歩である)
60%がボーダーラインなので、午後Ⅰはすれすれで何とか通ったが、午後IIの論文でBがついてしまった。午後IIはまぁまぁ自信があったんだけれども…
春も2連敗、秋も敗戦
もうそろそろ本腰を入れて勉強をしないと通らない試験ばかりになったような気がする。。。
合格率12.5%、合格者平均年齢36.6歳らしい。

Segmentation faultが発生するとHTTPレスポンスが返らない

Linux+Apache2 + PHPの環境において、特定のページだけがブラウザでアクセスしても「ページが表示できません」となってしまう。
VirtualHostディレクティブで設定しているaccess_logをtail -f で監視していても対象のページだけリクエストがログに残らない。ページが表示されるときには正しくログに残っているので、書き出し先が間違っているわけでもない。
次にVirtualHostディレクティブで設定しているerror_logを見てみたが考えられるエラーは記録されていない。
その次にWiresharkでTCP通信を監視してみた。すると
(正常系)
クライアント –(SYN)–> サーバー
クライアント <--(SYN+ACK)-- サーバー クライアント --(ACK)--> サーバー
クライアント –(ACK)–> サーバー HTTPリクエスト
クライアント <--(ACK)--> サーバー HTTPレスポンス
と続くはずが
(異常系)
クライアント –(SYN)–> サーバー
クライアント <--(SYN+ACK)-- サーバー クライアント --(ACK)--> サーバー
クライアント –(ACK)–> サーバー HTTPリクエスト
クライアント <--(ACK)-- サーバー クライアント <--(ACK+FIN)-- サーバー クライアント --(ACK)--> サーバー
クライアント –(ACK+FIN)–> サーバー
で通信が終了してしまっている。
つまりHTTPレスポンスが返っていないのだ。
(このときはなぜにFINを返してしまうのだーと正直思った)
Linuxでもtcpdumpを使って解析したが、同じパケットがやり取りされており、通信経路上の問題点ではないことがわかった。
そうなるとTCPレイヤーが上位アプリケーション層にパケットを渡さなかったか、アプリケーション層が受け取ったパケットに対する応答をTCPレイヤーに返せないかのどちらかである。
/var/log/messageにはなにも記録されていなかったので、前者は考えにくく、またこの現象はPHPプログラムを入れ替えた機能から発生していることをみると、プログラムが怪しそうだったので、前のプログラムに入れ替えるとやはり問題が改善していた。
プログラムで問題のあると思われるところを修正した結果、正しくページが表示できるようになった。
これでめでたしめでたしだったが、ステータスコードが返せない理由がよくわからなかったので、ログをいろいろ調べてみた。
すると、httpd.confで設定しているerror_logをみると
[notice] child pid 21450 exit signal Segmentation fault (11)
という記録があった。
今回勉強になったのは次の3点
・Segmentation faultなどの致命的な問題が起動プログラム上で発生した場合、ApacheはログをVirtualHostディレクティブで指定したErrorLogのパスに書き出してくれない。(子プロセスが落っこちるから仕方ない?)
・また、Apacheの子プロセスが落っこちた場合にHTTPレスポンスを返せない。
・access_logを記録するのはHTTPレスポンスを返したあとなので、リクエストを受け取れたとしてもaccess_logには記録が残らない。
初めて遭遇した不可思議なこのトラブルには解決に2時間くらい要してしまった。。。

Tracを0.11にバージョンアップしてみた

Tracのバージョンを0.10から0.11.5へバージョンアップしてみました。
日本語化されたものはインタアクトさんからダウンロードできます。
バージョンアップする手順は、UPGRADEに書いてありましたが、少しハマリました。。。
setuptoolsがなかったために、python setup.py installとしても「ImportError: No module named setuptools」と怒られます。
wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
で幸せになれます。
あとは次の手順の通り
sudo python setup.py install
sudo trac-admin (プロジェクトのパス) upgrade
sudo trac-admin (プロジェクトのパス) wiki upgrade
バージョンアップしたことにより、管理コンソールが追加され、今までマイルストーンの登録とか、優先度とか、チケット分類などの変更や権限設定をコマンドラインでしなければならなかった部分が管理コンソールでできるようになりました。(これは大きい!)
ただ、TRAC_ADMIN権限を付与する部分は、今まで通りコマンドラインでやる必要があります。(anonymousでログインして設定してから、Basic認証を設定するならば不要かもしれませんが・・・)