XML-RPCサーバーが腐っていた (16:49)
6/24にPEAR XML-RPCライブラリをアップデート(というかpear upgrade-all)したところ、それ以来1470.netのpingサーバーが腐っていた模様です。XML-RPC 1.3.0からXML-RPC 1.2.2に戻したところ、きちんと受信できるようになりました。PEARの中身まではまだ追いかけてないけど、
require_once 'XML/RPC/Server.php';
function weblogUpdates($msg) {
$value_maps = array(
0 => 'title',
1 => 'url',
2 => 'change_url',
3 => 'category'
);
$params = array();
foreach ($value_maps as $index => $key) {
$param = $msg->getParam($index);
if (!$param) {break;}
$params[$key] = $param->getval();
}
if (updateWebsiteLastModified($params)/* 情報更新 */) {
$error = FALSE;
$error_msg = 'success to recieve your ping!';
} else {
$error = TRUE;
$error_msg = 'fail to recieve your ping!';
}
$value = new XML_RPC_Value(
array(
'flerror' => new XML_RPC_Value($error, 'boolean'),
'message' => new XML_RPC_Value($error_msg)
),
'struct'
);
return new XML_RPC_Response($value);
}
$map = array('weblogUpdates.ping' => array('function' => 'weblogUpdates'));
$server =& new XML_RPC_Server($map);
みたいな感じの、ほとんどPEAR XML-RPCに依存した内容だから、こっちのコードの問題じゃないと思うんだけど。XML-RPC関連はテストがめんどいんだよなー。
MyApp? (11:58)
さっき1470.netのネットワーク帯域がバカみたいな数値になっているのを発見して調べてみたら、今朝の4時からMyAppとかいうUAで、blogmapのとある1ページを分間20回くらいずつGETし続けている人がいたよ。それだけで3.2Gバイトの転送量かよ。従量制の契約だったら怖いことになってたかも。
@homeのネットワークで何かのプログラムを動かしているあなた、多分それ、巡回ロジックか何かが腐ってますよ!
受信確認付きメールをMLに流すと (18:40)
受信確認自動応答に設定した人がたくさん釣れるんだなー。とセキュリティホールmemo MLを見ながら思った。これってメールアドレス収集に使えるんじゃないか。MLレベルでDisposition-Notification-Toフィールドは除去するように設定しておいた方がいいのか。
DB_sqlrelayのprepareで「?」が使えない (14:13)
SQL Relayを試してみようと、インストールして、PEAR DBの接続先をmysqlからsqlrelayに書き換えてみたところ、単純なqueryは動くんだけど、prepared sqlでエラーが出る。ググってみたら、「bind pear php module」なんてのを見つけた。なるほど、現在のDB_sqlrelayはplaceholderとして「?」は使えない(:1、:2という形式のみサポート)のね。そのうち「?」にも対応するみたいだけど、ひとまずどうしようかなー。
定数で指定したクラス名でnewできない (21:50)
define('DEFINED_CLASS_NAME', 'FooClass');
$foo = new DEFINED_CLASS_NAME;
とかしても、FooClassが生成されないんでおかしいなーと思ったら、上記の文脈ではDEFINED_CLASS_NAMEが定数なのかクラス名なのかが判断つかないんだね。というか、この文脈ではクラス名であるとして評価されるんだね。
で、PHPでは未定義の定数は、その定数名の文字列として評価されるから、DEFINED_CLASS_NAMEというクラスを探しにいって、見つからないから、未定義のクラスを生成しようとしたエラーが出る、と。
回避策としては、
define('DEFINED_CLASS_NAME', 'FooClass');
$className = DEFINED_CLASS_NAME;
$foo = new $className;
とかするのが無難かな。
絨毯爆撃再来 (13:25)
昨日の「Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)」なUAの絨毯爆撃機が今日も来ているんで、ひとまずIPアドレスでdeny。本日は222.149.250.10から来られているようです。リアルタイムのURLをたどっているわけじゃなさそうだな。かつてクロールしたときに集めたURLデータベースを使ってアクセスしているのか?
default_modifiersが実行される順序 (15:09)
default_modifiersで指定した修正子が実行される順序は、(直接テンプレートで指定した修正子よりも)後だといいなーと思っていたんだけど、
if (!empty($this->default_modifiers) && !preg_match('~(^|\|)smarty:nodefaults($|\|)~',$modifiers)) {
$_default_mod_string = implode('|',(array)$this->default_modifiers);
$modifiers = empty($modifiers) ? $_default_mod_string : $_default_mod_string . '|' . $modifiers;
}
あたり
を見る限りは最初に挿入されるみたいだなー。
ってことは、default_modifiersにescapeを設定して、自動でエスケープされるようにしておきつつも、ちょっとだけ加工(たとえば文字数切りつめとか)したい場合なんかには、「{$var|smarty:nodefaults|truncate|escape}」みたいなうざいことをしないといけないのか。default_modifiersは一番最後にかかるようにしておいた方が便利なシチュエーションが多い気がするんだけどなー。