くまきち

山と旅と家族が大事。
でも激しい物欲が理性と財布のタガを飛ばす
最近は自転車も乗ってる

PHPで呼び出し元の関数名を取得する

2009-05-26 20:01:09 | SEまわり
呼び出し元の関数名を取得する方法。

何階層か上のクラスに log() メソッドを実装して、そこでいろいろメッセージをログファイルに出力するようにした。

子クラスにて log() をコールした際、そのクラス名は get_class() で取得できる。

欲を言うとメソッド名も欲しいので、__FUNCTION__ を出力するようにした。



が、こうすると常に関数名は "log()" になってしまって、出力する意味がない。

なんとか、log() を呼び出している場所がどこの関数/メソッドなのかを知る必要がある。


調べたところ、debug_backtrace() 関数が使えることが分かった。

この関数から戻ってくるデータ量が非常に大きいのが気になるが、とりあえず、

$bt = debug_backtrace();
$function = $bt[1]['function'];

とすれば、ひとつ前の関数名を取り出せた。


CakePHP: Model::save()メソッドのオーバーロード

2009-05-25 20:41:53 | SEまわり
 PHPでは「オーバーロード」と言うらしいので…

 Model::save() メソッドをカスタマイズしたくて、AppModel中で次のように記述した。

function save($data=null, $validate=true, $fieldList=array()) {
$this->log("Saved");
parent::save($data, $validate, $fieldList);
}


 これで、ログを出力してから、保存処理、と進んでくれると思っていたところ、実行結果は、「ヌルの許されないフィールドにヌルデータを保存しようとしました」というエラーだった。

 実行された INSERT 文を見ると、確かに created, modifiedの二つに now() を入れるだけの INSERT 文になっていた。

 モデルの関係は、

Model ← AppModel ← SampleModel


 となっており、SampleModel 中で save() を呼び出しているが、もちろんデータは渡している。

 試しに、AppModel 中の save()メソッド(上の改造をしたとこ)中で、pr($data) としてみたところ、データは入っていた。

 が、parent::save として Model::save() が呼び出されたところではヌルになっている



 はて…


 結果は。


 parent::save() は正しくコールされていた。

 ただ、AppModel::save() が戻り値をちゃんと返してなかったため、コントローラが失敗と判断してエラーメッセージを表示していただけで、実際はデータが保存されていた。

 下のように変更することで、期待通りの動作をした。

function save($data=null, $validate=true, $fieldList=array()) {
$this->log("Saved");
return parent::save($data, $validate, $fieldList);
}


 ミス自体は簡単だが、少し時間を食った。


CakePHP: ログフォーマットのカスタマイズ

2009-05-25 17:20:15 | SEまわり
CakePHP のログ出力の内容をカスタマイズしたいと思った。

log() メソッドは Object クラスに実装されている。

このクラス定義は app ディレクトリの下にではなく、大元の cake/libs の下にあるため、app の下に 独自の object.php を置いても効果がなかった。

仕方ないので、app の下にあるもので一番上位である AppController と AppModel の中で、log() を上書きしてしまうことにする。

今回は、log() の引数メッセージの後ろに、log() を読んだ場所を示すクラス名とメソッド名に加え、クライアントの IP アドレスをくっつけるようにカスタマイズした。

以下のブロックを、app_model.php, app_controller.php の中に記述する。

function log($msg, $type=LOG_ERROR) {
 $class = get_class($this);
 $method = __FUNCTION__;
 $ipaddr = $_SERVER['REMOTE_ADDR'];
 $msg = $msg." in $class::$method Client:$ipaddr";
 parent::log($msg, $type);
}


これで、呼び出し側はこれまでと変わらず、以下のように呼び出せば、上記情報が追加された形でログに記録される。

$this->log("Error");


防弾ホスティング

2009-05-24 17:36:21 | SEまわり
スパム・ビジネスに利用される「防弾ホスティング」と「防弾ドメイン」 : セキュリティ・マネジメント - Computerworld.jp


 記事の本文はいいんだが、どうも「防弾」という言葉がしっくりこなかった。
 スパム送信側から見ればこれらのホスティングサービスは隠れ蓑になるから、と言う意味かな。

 記事の原文は分からなかったが、上記ページの中段にある画像ファイル(サイトの説明画面)を見ると、Bullet Proof と書いてあるので、そのまま訳すと確かに「防弾」か。


 目線がなあ… スパム受信者側からの言葉で書いてくれるほうがすっきりするなあ。

腰痛

2009-05-23 20:58:09 | 雑記
腰痛が出た。

しかも東京に出張に行った日の夜に。

症状は何年前かと同じで、腰の関節ではなく、どちらかというと腰回りの筋や筋肉の周辺。
となると、姿勢の問題で筋肉に緊張がたまって起こった腰痛と言うことになる。

経験的に、おとなしく寝ていても回復しないが、運動は無理。かなり痛い。


これは整形外科の緩い治療では治らない。
子供の頃から何度かお世話になった接骨院へ行った。

そこで電気治療やら、按摩をしてもらうと、とたんに背中全体が軽くなる。

が、残念ながら今日はおじいさん先生じゃなくて、若先生だったので、少し良くなった程度だった。
おじいさん先生は柔道のえらいさんで、按摩は激しくてうめき声が出るが、その分終わってから体が軽くなる感じが格段に大きいのだ。 反対に、若先生はちょいと優しいので、効果も緩やかと言うこと。

それでも少し良くなったことに変わりはない。
なんとか月曜日の仕事には間に合いそうだ。

良かった。



イーバンクまた値上げ

2009-05-22 09:16:03 | 雑記
ATM手数料の改定について イーバンク銀行


 口座作った頃は、出金は有料でも入金は無料だった。普通の銀行と同じだった。

 それがいつの頃からか有料になって、回数制限が付くようになって、今度は値上げ。

 途中から面倒になって、残高は1000円未満なんだけど、これを近所の郵便局ATM(セブンイレブンは遠いところにしかない)で引き出そうとすれば、262円引かれるから、すごく損した気になりそうで下ろしてない。

 楽天とくっつくとこうなるのか。。。別に楽天を毛嫌いしてるわけではないが。



 楽天というと、以前も書いたとおり、ETCカードの年会費有料化が始まる。

 いろいろ苦しいのだろうが、続けて値上がりすると目に付く。

WEBマーケティング研究会

2009-05-19 01:00:13 | 雑記
WEBマーケティング研究会

というのをみかけた。


 何とも言えないページ。

 微妙に誤り(いや、表現が悪いだけかもしれない)があり、それがまた何とも言えないレベル。

 表面的には問題がなく、根本的に問題があるんだけど、ぱっと見た感じではだいたいあってるという感じ。


 企業が提供してるサービスなのか、これ。ふーん。