この間のMojaviバグ疑惑ですが、気になるのでもう少し調べてみました。

ForumのOld Supportに該当する投稿がありました。(去年の5月だからかなり前です。)

Mojavi Forum > ErrorLogger and Smarty

However, Mojavi’s controller automatically sets an instance of its own ErrorLogger class (opt/filters/ErrorLogger.class.php) as the error handler (thus overriding Smarty’s settings), which defaults to flagging E_NOTICE as a fatal error. So every time I set a {$tag} in my Smarty template that does not have a corresponding value set in my View, I get a FATAL error.

やっぱりSmarty使ったときE_NOTICEがFATALエラーってでて困ってます。

I would really like to see that change in the source Mojavi too, feti. Error handling is really weird right now.

Will you resist the plea of your people? Come on, be a good and just ruler here ;)

ところでMojaviって1人で作ってるんでしょうか?エラー直してくれってsetiという人を名指ししてるし、Mojavi Founderの肩書きも他に見当たらないです。しかし言い方が気に入らなかったのか、

The check against error_reporting() is used to decide when to log an error depending on whether or not it was supressed.

Without the check, or with improper checking an error that occurs from @function() would be reported, when you don’t want it to be. That’s why the checking exists. Otherwise it proceeds as normal.

問題無い的発言。

しかし、その後の発言で端的にまとめられてますがそのままでは困る点が。

  • Smartyで未定義の変数があるとFATALエラー
  • ロギングのとこでWARRNINGとERRORが逆
  • (上記のせいで)WARRNINGがでるとFATALエラーでスクリプトが終わる
  • ユーザーがerror_reporting設定しても無視される

最後のは別にいいかなと思いますがその他は露骨に困ります。

最終的には結局自己解決して終了してます。
SVNの2.0.1 DEV見ても変わってないので特に取り入れられて無い様子です。

もう2系はどうでもいいやって感じなんでしょうか。それとも「もうPHP4アンインストールしたよ」とかでしょうか。

ブランチとか厭なのでパッチを公開しつつ本家に「できれば・・・反映してもらえないかと・・・PLZ・・・」という地道な働きかけをして行きたいと思います。

ref: Mojavi + Smarty Undefined index地獄

おしゃれ手帖 8 (8)
おしゃれ手帖 8 (8)
posted with amazlet at 05.05.27
長尾 謙一郎
小学館 (2005/03/04)
売り上げランキング: 16,600
通常24時間以内に発送

どんどん面白くなってる!

自分が欲しかったものを公開するシリーズ

Mojavi + Smartyの入力・確認・完了。(DB登録のコードは省いてます)
Input、Confirm、CompleteということでICCという略語を強引に提唱させていただきます。

msicc-1.0.zip

デフォルトMojavi-2.0.0からの変更点

  • フォルダ構成をMojavi-3.0.0DEVっぽく
  • SmartyFilter
  • ErrorLoggerのバグを修正
  • LEVEL_ERRORの(たぶん)バグを修正

とりあえず現時点ではコレが正解ということにします!!!
「片腹痛い、おれの方がもっと正解かつ美しいICC書けるわ!」
という方はぜひMojavi + Smarty ICC腹痛係りkomagata@gmail.comまで。

もっといいのが来たらそっちを正解ということにしてパクります。

ref: Mojavi2.0 UML雛形 for JUDE

KANOU.JP: 井川りかこ6(最終回)

結局は有料サイトへの誘導だったわけですが、スパムとわかりつつも、結局、最後まで読んじゃったし、各所でも話題になっているので、マーケティング的には成功だったんじゃないかと思いました。ストーリー仕立てで商品へ誘導するこの方法を「りかこマーケティング」と名付けて、今後に生かしていこうと思います。

りかこマーケティング!!!

はた迷惑なマーケティングですが、購入(支払い)までのストーリーを完全に用意する姿勢は見習わなければ!

Pro PHP:: The Podcast – Giving voice to the Professional PHP Community

Welcome to the Pro PHP Podcast. Your number one source for conversations, interviews, debates and op-eds with PHP pioneers, project heads, and companies using PHP. From PHP 5 to PEAR. From Databases to Daemons. The First All PHP Podcast.

PHPネタPodcast!

聞いてみたけど全然分からなかったおれが来ましたよ。

OpenPSA – OpenPSA – Free Management Software for Consultancies

openpsa.jpg

OpenPSA is a Free, Web-based Management Software Package for Consultancies and Service organizations.

  • Projects – Project Management, Hour Reporting and Invoicing
  • Sales – Contact Database and Sales Project Tracking
  • Support – Help Desk and Issue Tracking
  • Calendar – Group Calendar and Resource Reservations
  • Documents – Document Management and Sharing

コンサルタント向け仕事管理ソフト。(コンサル用サイボウズ?)

Midgard Frameworkベース。このあいだのTownPortalといい、これといい、CMSのためのフレームワークを使った特定用途向けCMSは需要があるのかも!

ref: TownPortal

PEAR :: Package :: Services_Trackback :: 0.5.0

Changelog:

New API to check if a trackback is spam.
Implemented spam checks using Wordlist, Regex, DNSBL, SURBL.
Completed unit tests.
Refined overall API.

一度使ってみたいServices_Trackbackがアップデート。
主にトラックバックスパム対策関連の機能が入ったようです。ワードリスト、正規表現でのスパム対策はわかるとして、DNSBL、SURBLってなんだろう。

用語解説

「DNSBL」[専門][独自]

メールサーバにおいて、DNS(ドメインネームサーバ)レベルでのフィルタリングを行うブラックリストシステムのこと。DNS(ドメインネームサーバ)とはIPアドレスとドメイン名の対応付けを行うシステムの総称であるが、その対応付けの際にブラックリストを参照し、問題のあるサーバからの要求を受け付けないようにする、というものがDNSBLの根本的発想である。

なるほど、DNSのブラックリストと。

SURBL —Spam URI Realtime Blocklists

SURBL is an RBL designed to be used to block or tag spam based on URIs (usually their domain names) contained within the message body.

スパム送ってくる奴のブラックリストということですか。
国内のBlogは日本語が入ってるかどうかで大抵弾けちゃいますが、やっぱり本来はこういうやり方しかないんですね。
便利っぽい。使ってみたい。

ref: PEAR Services_Trackback

asahi.com: データベースを攻撃、外部から支配 カカクコムHP事件??社会

関係者によると、データベースは「ある範囲の情報を探す」「条件に合ったデータを取り出す」といったコンピューター言語「SQL」で操作する。今回の攻撃は「SQLインジェクション」と呼ばれる手法を応用。攻撃者が利用者のふりをしてデータを入力し、戻ってきたエラーメッセージなどを解析しながらシステムを把握して、データベースを支配下に置いていったとみられる。

開発者の人が生まれた時に親御さんが真っ先に教えていれば防げたわけですよ!

箸の持ち方教育のようにお子さんがこんなコーディングをしているところを見つけたら叱らなければいけません!

$result =& $db->query("SELECT * FROM UNK WHERE name = '".$_POST["name"]."'");

「コラー!!!」

logging.png

Mojaviの地味プログラム公開。(こないだMojaviのクラス図雛形作っておいたので簡単に図で説明できる。ツイてる!)

EmailAppender.class.php

MojaviのロギングはLoggerにどんなAppenderをaddAppenderするかでログをどこに出すのか決めます。
opt/loggingにはデフォルトでStdoutAppender(標準出力に追加する)とFileAppender(ファイルに追加する)がありますが、本運用する場合に必ず必要なのがEmailAppender(メールに追加する=メール飛ばす)かと思って作りました。
具体的にはEmailAppender.class.phpをopt/loggingにでも入れてからindex.phpでLoggerにaddAppenderします。

$logManager =& LogManager::getInstance();
$deflog =& LogManager::getLogger();
$layout =& new PatternLayout('%N %c::%F() %m %d{r} %f:%l%n');
require_once(LOGGING_DIR."FileAppender.class.php");
$fileAppender =& new FileAppender($layout, LOG_DIR.'mojavi_%d{Y_m_d}.log');
$deflog->addAppender("file", $fileAppender);
<strong>require_once(LOGGING_DIR."EmailAppender.class.php");
$emailAppender =& new EmailAppender($layout, "komagata@p0t.jp");
$deflog->addAppender("email", $emailAppender);</strong>

上記の例だとLoggerはデフォルトでStdoutAppenderを持っているのでFileAppenderとEmailAppenderを追加してることになります。設定した閾値(レベル)を超えるエラーが発生したときにログを標準出力とファイルとメールに書きます。

Reflection_Annotation in CVS Sebastian Bergmann

My Proposal for ””Reflection_Annotation”” has been accepted and I committed an initial development version to the PEAR CVS Repository.

ProposalにあったReflection_Annotationが6票で通りました。
CVSに上げ始めたらしいので気になっていたParser部分を見てみました。

class Reflection_Annotation_Parser {
    public static function parseAnnotations($docComment) {
        $annotations = array();

        $lines = explode("\n", $docComment);

        foreach ($lines as $line) {
            $nameStart = strpos($line, '@');

            if ($nameStart !== FALSE) {
                $nameEnd = strpos($line, '(', $nameStart);

                if ($nameEnd !== FALSE) {
                    $name = substr($line, $nameStart + 1, $nameEnd - $nameStart - 1);
                }

                $argumentsEnd = strpos($line, ')', $nameEnd);

                if ($argumentsEnd !== FALSE) {
                    $arguments = substr($line, $nameEnd + 1, $argumentsEnd - ($nameEnd + 1));

                    $annotations[$name] = $arguments;
                }
            }
        }

        return $annotations;
    }
}

なるほど、Parserと聞いただけで拒絶反応示してしまいたが、コメント部分をパースするだけならこんな感じなんですね。
Reflection_Annotationに親近感が沸きました。

ref: PHPにアノテーション