Jeans CMS 製作日記:
Deprecated: Function strftime() is deprecated in /home/u109394186/domains/rad51.net/public_html/jeans/jeans/libs/blog.php on line 333
2008年 03月の記事
コンパイルされたコードのテスト [General]
2008年3月24日
Jeans CMSが実際どれくらいの速さなのかを調べるために、xml-rss2.phpを手動でコンパイルしてみた。
コンパイルといっても簡単なもので、デバッグフラグを立てたときに/debug/ディレクトリに生成されるコードと、クラス定義のためのphpファイルのコードを一つのphpファイルにするだけである。
この『フルコンパイルされた』xml-rss2.phpの実行に要する時間を手元の環境(Win Vista)で測定すると、およそ19ミリ秒。一方で、Nucleus 3.31 SP1 でxml-rss2.phpを同じ環境で表示すると、およそ360ミリ秒。Jeans CMSのほうがおよそ20倍速いことが分かった。まずまずの結果。
ちなみに、xml-rss2.phpをコンパイルせずに表示させると、およそ39ミリ秒。やはり、コンパイルしたほうが速くなる。
<%media(20080325-xml-rss2-compiled.zip|コンパイルされたxml-rss2.phpはここからダウンロードできます。)%>
コンパイルといっても簡単なもので、デバッグフラグを立てたときに/debug/ディレクトリに生成されるコードと、クラス定義のためのphpファイルのコードを一つのphpファイルにするだけである。
この『フルコンパイルされた』xml-rss2.phpの実行に要する時間を手元の環境(Win Vista)で測定すると、およそ19ミリ秒。一方で、Nucleus 3.31 SP1 でxml-rss2.phpを同じ環境で表示すると、およそ360ミリ秒。Jeans CMSのほうがおよそ20倍速いことが分かった。まずまずの結果。
ちなみに、xml-rss2.phpをコンパイルせずに表示させると、およそ39ミリ秒。やはり、コンパイルしたほうが速くなる。
<%media(20080325-xml-rss2-compiled.zip|コンパイルされたxml-rss2.phpはここからダウンロードできます。)%>
ver 0.2.0 公開 [General]
2008年3月13日
コアがほぼ完成したので、バックアップを取る意味もかねて、公開。現在、ver 0.2.0。αのさらにαのような物だけれど、とりあえずRSSフィードを出力することを確認。
今後の開発ロードマップは次のとおり。
1)デフォルトスキンを問題なく表示できるように、スキン変数・テンプレート変数まわりのコードをチェック。
2)コメント周りのコードの実装。
3)プラグインインターフェースを整備。プラグインオプションとか、イベントとか。
4)管理画面用スキンの製作。および、管理アクション用のコードの実装。
うーん、長い道のりだ。
<%media(20080314-jeans 0.2.0.1.6.zip|ver 0.2.0はここからダウンロードできます。)%>
・αバージョンで、実用性はゼロです。
・セキュリティーチェックを行っていないので、ローカルの環境にのみインストールしてください。インストールは、ZIPファイルを解凍するだけです。
・登録してあるユーザのユーザ名は『admin』パスワードは『admin』です。logintest.php経由でアクセスすると、自動的にログインされます。
・RSSフィードは、xml-rss2.phpにアクセスすると表示できます。
・スキンは/skins/フォルダに、テンプレートはスキンフォルダ内のtemplate_xxx.incに保存されています。
・ここはこんな風にしたら良いとか、ご意見ありましたら、よろしくお願いします。
今後の開発ロードマップは次のとおり。
1)デフォルトスキンを問題なく表示できるように、スキン変数・テンプレート変数まわりのコードをチェック。
2)コメント周りのコードの実装。
3)プラグインインターフェースを整備。プラグインオプションとか、イベントとか。
4)管理画面用スキンの製作。および、管理アクション用のコードの実装。
うーん、長い道のりだ。
<%media(20080314-jeans 0.2.0.1.6.zip|ver 0.2.0はここからダウンロードできます。)%>
・αバージョンで、実用性はゼロです。
・セキュリティーチェックを行っていないので、ローカルの環境にのみインストールしてください。インストールは、ZIPファイルを解凍するだけです。
・登録してあるユーザのユーザ名は『admin』パスワードは『admin』です。logintest.php経由でアクセスすると、自動的にログインされます。
・RSSフィードは、xml-rss2.phpにアクセスすると表示できます。
・スキンは/skins/フォルダに、テンプレートはスキンフォルダ内のtemplate_xxx.incに保存されています。
・ここはこんな風にしたら良いとか、ご意見ありましたら、よろしくお願いします。
テンプレートをファイルとして保存 [General]
2008年3月11日
現在のところ、スキンデータはすべてskins/ディレクトリにファイルとして保存され、テンプレートデータはすべてjeans_templateテーブルとしてデータベースに保存されている。少し分かりにくい。
スキンとテンプレートをフルコンパイルした場合には、どちらもグローバル関数としてPHPファイルに記述する予定である。従って、コンパイルする前のスキンやテンプレートはどこに記述されていても良いし、それらを呼び出す際の速度の問題などもそれほど考える必要も無い。ならば、これらを記述する方法としては、分かりやすさと編集の容易さがポイントとなる。
スキンとテンプレートをフルコンパイルした場合には、どちらもグローバル関数としてPHPファイルに記述する予定である。従って、コンパイルする前のスキンやテンプレートはどこに記述されていても良いし、それらを呼び出す際の速度の問題などもそれほど考える必要も無い。ならば、これらを記述する方法としては、分かりやすさと編集の容易さがポイントとなる。
コードのクラスへの振り分けを少し整理 [General]
2008年3月5日
現在のJeansのアーキテクチャは次のとおり。

見てのとおり、少し複雑である。制御があちらこちらに飛んでしまっているように感じる。もう少し分かりやすくしたい。
まず、index.phpからの制御がcoreとskinに向いているが、これらはそれぞれ、Nucleusのglobalfunctions.phpのインクルードとselector()の実行に相当する。Jeansでは管理画面もスキンを通じてアクセスする予定なので、skinは実際にはほとんどの場合に使われることになる(例外は、アクションの呼び出し)。次にsqlクラスだが、これはcoreクラスの初期化の際に必ず呼び出される。
そこで、skinクラスとsqlクラスの機能をcoreに統合することにする。skinクラスのメソッドはcoreクラスにそのまま取り込み、sqlクラスはそのままの形でcore.phpファイル内に記述する。skinクラス相当分のコードのパースはアクションの呼び出し(actionクラスを利用)の際に少々無駄になるが、50行ほどの簡単なコードだから、パフォーマンスへの影響は少ない。
この変更を施すと、アーキテクチャは次のようになる。

これなら、分かりやすい。すべての制御がcoreから始まり、それをjitとactionの二つのクラスがサポートすることが一目瞭然。

見てのとおり、少し複雑である。制御があちらこちらに飛んでしまっているように感じる。もう少し分かりやすくしたい。
まず、index.phpからの制御がcoreとskinに向いているが、これらはそれぞれ、Nucleusのglobalfunctions.phpのインクルードとselector()の実行に相当する。Jeansでは管理画面もスキンを通じてアクセスする予定なので、skinは実際にはほとんどの場合に使われることになる(例外は、アクションの呼び出し)。次にsqlクラスだが、これはcoreクラスの初期化の際に必ず呼び出される。
そこで、skinクラスとsqlクラスの機能をcoreに統合することにする。skinクラスのメソッドはcoreクラスにそのまま取り込み、sqlクラスはそのままの形でcore.phpファイル内に記述する。skinクラス相当分のコードのパースはアクションの呼び出し(actionクラスを利用)の際に少々無駄になるが、50行ほどの簡単なコードだから、パフォーマンスへの影響は少ない。
この変更を施すと、アーキテクチャは次のようになる。

これなら、分かりやすい。すべての制御がcoreから始まり、それをjitとactionの二つのクラスがサポートすることが一目瞭然。
PDOへの移行はほぼ終了 [General]
2008年3月1日
アンケートの結果に従ってPDOを利用することにし、sqlクラスを全面的に書き換えた。次の例のように使うことになる。
これで、規約に沿ってコアやプラグインを書いている限り、SQLインジェクションはほぼ100%起こらない。
$res=sql::query('SELECT * FROM jeans_item WHERE icat=<%catid%>',array('catid'=>$catid)); while ($row=$res->fetch()) core::p($row['ititle']);もしくは
$res=sql::prepare('SELECT * FROM jeans_item WHERE icat= :catid'); $res->bindParam(':catid',$catid); $res->execute(); while ($row=$res->fetch()) core::p($row['ititle']);もしくは
$res=sql::prepare('SELECT * FROM jeans_item WHERE icat= :catid'); $res->execute(array(':catid'=>$catid)); while ($row=$res->fetch()) core::p($row['ititle']);
これで、規約に沿ってコアやプラグインを書いている限り、SQLインジェクションはほぼ100%起こらない。