引越し引越しいいつつ地味にNucleusに手入れ。
○まずコメントスパム対策。
コメントスパムの投稿自体はキャプチャの機能により阻止できていたのですが、レスポンス200を返すため一向に減らず、うざくなってきたようなのでPOSTされた情報のみログとして保存し傾向と対策を練る。
その結果、コメント本文「body」に「http://」、キャプチャ文字「var_col」に「 (半角スペース)」を含んでいた場合406エラーを返すようにフロントコントローラであるindex.phpを編集しました。
○アイテムリンクURLの統一
Nucleusのテンプレート変数<%itemlink%>は、デフォルトで<%blogurl%>?itemid=<%itemid%>という動作をしていて、もし、パラメータでblogid、catidが存在した場合、それを追加するという動作をしています。
その為、カテゴリを選択した場合固定リンクが<%blogurl%>?itemid=<%itemid%>&cid=<%categoryid%>に代わるなど同じアイテムに対して複数のURLが存在することになります。
また、RSSでは直で<%blogurl%>index.php?itemid=<%itemid%>というまた別のURLを設定してありました。
はてブで同じアイテムが複数あるのはそういうわけです。。。
というわけで、はてブ登録件数が一番多いアドレスを元に、<%itemlink%>を利用している部分を<%blogurl%>?itemid=<%itemid%>&cid=<%categoryid%>に変更しました。
本当ならPATH_INFO使ったFuncyURLに対応したいとこですが、いまいち気に食わない仕様なのと、修正コストが大きいのでやめときました。
上記の場合はテンプレート編集のみの10分程度で終了。
修正したのはテンプレートのみなので、プラグインが生成する固定URLが違うのは問題として認識しています。
これ、Nucleusプラグインの仕様が影響してるんですよね。
プラグインが自由につくれるということで、ほんとに自由につくってしまったのが問題。
・プラグイン内でアイテムリンクURL生成する場合は、itemlinkを生成する関数を利用する。
・テンプレートでアイテムリンクURL生成する場合は、<%itemlink%>を利用する。
上記の規約があった上で、
・itemlinkは機能、またはプラグインでアドホックしてフォーマットを指定できるようにする。
上記の仕様であれば楽だったんですが、とても今更感。
Googleインデックスやはてブの登録されたURLどうしようかってのも問題。
Googleに関してはかってに再インデックスされるの待つか、GETで変なアドレスにきたら、「HTTP/1.1 301 Moved Permanently」を返すってことでいいけど、はてブは勝手に変更されることないだろうし、特に作業しないまま放置。
SubversionではCVSと同じようにキーワードを設定するとコミット時に置換してくれる機能があります。
キーワード設定しておくと、コミット、アップデートで以下のようになります。
<?php
$Rev$
$Author$
?>
<?php
$Rev 1 $
$Author cockok $
?>
既存で設定されているものは直接修正せずそのままコミットします。
<?php
$Rev 2 $
$Author yotsuba $
?>
<?php
$Rev 3 $
$Author cockok $
?>
CVSでは標準で利用可能でしたが、Subversionでは設定が必要です。
以下のコマンドでは、filename.phpの$Id$と$Date$と$Author$が置換されるようになります。
$ svn propset svn:keywords "Id Date Author" filename.php
http://subversion.bluegate.org/doc/ch07s02.html#svn.advanced.props.special.keywords
各ファイルごとに設定するのは大変なので、設定ファイルを修正します。
以下の設定では、*.phpの$Id$と$Date$と$Author$が置換されるようになります。
[miscellany]
enable-auto-props = yes
[auto-props]
*.php = svn:keywords=Id Date Author
http://subversion.bluegate.org/doc/ch07s02.html#svn.advanced.props.auto
■masuidrive的プロジェクトの方針
■PHP4のサポート終了は2008/8/8
Zend Framework1.0も出たしね
>5.2系のみメンテナンスされています
RHEL5でやっと5.0になったけどね
■ヱヴァンゲリヲン新劇場版予告編
■2007年参院選:唯一神「又吉イエス」が秋葉原で演説
腹を切って死ぬべきであるというのは比喩で切腹もんだぜこりゃあってことらしいですy
■トランスコスモス、「Second Life」の現状を説明
>参入企業が増えると効果はなくなる
トラコスwが早くお金かけないとダメだよーwwwとw
正直セカンドライフ参入という広告効果はそれなりにあるとは思うが、それが良い方向への効果だとは到底思えない
■Second Life日本語版、ようやく公開
■取材拒否TBSが何故か J-CASTニュースに取材
■あのアーツの松田社長は枕の斡旋もしていたらしい件
■ソフトの優先度を自動変更して高速化するフリーソフト「オートギア」
Windowsでnice設定
PHP_SELFにはPATH_INFOも含まれるのでSCRIPT_NAMEを利用しましょう。
またPHP_SELFをエスケープせずそのまま出力している場合XSS脆弱が存在します。
PHP_SELFはそのまま出力できない
ServerName example.jp
DocumentRoot直下に以下の内容のindex.phpを置いた際の出力です。
<?php
var_dump($_SERVER['PHP_SELF']);
var_dump($_SERVER['SCRIPT_NAME']);
?>
xdebugを利用しているのでvar_dumpの出力が標準とは異なっています。
http://example.jp/index.php
string '/index.php' (length=10)
string '/index.php' (length=10)
http://example.jp/index.php/
string '/index.php/' (length=11)
string '/index.php' (length=10)
http://example.jp/index.php/a/b
string '/index.php/a/b' (length=14)
string '/index.php' (length=10)
http://example.jp/index.php/a/%e3%83%86%e3%82%b9%e3%83%88
string '/index.php/a/テスト' (length=22)
string '/index.php' (length=10)
http://example.jp/index.php/a/%20b/c
エラー
http://example.jp/index.php/a/b%20/c
string '/index.php/a/b /c' (length=17)
string '/index.php/a/b ' (length=15)
んんん?
これまずくない?
http://example.jp/index.php/a/b%20c/
string '/index.php/a/b c/' (length=17)
string '/index.php' (length=10)
牛肉が豚肉だったり、肉まんがダンボールだったり、偽装問題が深刻化しております
そんな中某のトピック
「うどんにきしめんが混入 偽装問題に 香川」
ふいた
■ニコニコ市場(仮)スタート!
最初読み違えて、ECSへのリクエストが1日数千万回以上のリクエストかと思った
■知っていますか?脆弱性 (ぜいじゃくせい)-アニメで見るウェブサイトの脅威と仕組み-
Zend Frameworkをいざ利用してみようと思ったが、ググってみてもインストール方法は見つかれど、チュートリアルが見つからない。
日本語化されたプログラマ向けリファレンスガイドが存在するも、第1章でインストールの仕方が解説されているが、第2章はZend_Aclといきなりコンポーネントの解説だ。
どこかにないものかと探してみたところ、目的のものを発見。
Zend_Controller クイックスタート
第7章Zend_Controllerにて発見することができた。
なぜ、第1章3節以降にクイックスタートとして掲載しないのか疑問。
Zend Frameworkが単にウェブフレームワークではないということなのかな?
残念ながら、大半の人が求めているのはそれだと思うのだが。
MySQLでストアドプロシージャが使えるといまさら知ったのでさわりだけ。
たぶんその2はない。
phpMyAdminで叩いていてみたけど他のとこでエラーでるというかそもそも対応していない。
えくすぽーとに関しては2.9.0から対応してるみたいだけど。
とりあえず直接叩いてみた。
mysql> CREATE DATABASE sample;
Query OK, 1 row affected (0.17 sec)
mysql> CREATE TABLE sample(
-> id INT(11) NOT NULL auto_increment PRIMARY KEY,
-> name VARCHAR(32) NOT NULL,
-> age INT(11) NOT NULL
-> );
Query OK, 0 rows affected (0.94 sec)
mysql> INSERT INTO sample(name, age) VALUE('yotsuba', 14);
Query OK, 1 row affected (0.09 sec)
mysql> SELECT * FROM sample;
+----+---------+-----+
| id | name | age |
+----+---------+-----+
| 1 | yotsuba | 14 |
+----+---------+-----+
1 row in set (0.04 sec)
mysql> DELIMITER |
mysql> CREATE PROCEDURE sample1()
-> BEGIN
-> SELECT name, age FROM sample;
-> END
-> |
Query OK, 0 rows affected (0.51 sec)
mysql> DELIMITER ;
mysql> CALL sample1;
+---------+-----+
| name | age |
+---------+-----+
| yotsuba | 14 |
+---------+-----+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
んで、PHPから。
mysql利用してみるとエラーでて、エラーコードみると利用は不可能そうだったので、mysqliから。
PDOからでも大丈夫らしい。
<?php
if (!$mysqli = mysqli_connect('localhost', 'user', 'passwd', 'sample')) {
echo 'connection failed';
exit;
}
if (!$res = $mysqli->query('call sample1')) {
print $mysqli->errno();
print $mysqli->error();
exit;
}
while ($row = mysqli_fetch_assoc($res)) {
var_dump($row);
}
?>