自分のための次世代CMS製作メモ

Jeans & Development 電子ブロック工房 三日坊主 フロントページ

Jeans CMSのコードを、PHP5.3以上で記述することについて [General]

2014年10月21日

Jeans CMS ver 1.0.0を公開した。このバージョンは、PHP5.2で使える、最後の正式バージョンになる可能性がある。ざっとコードを見わたした限り、PHP5.3に移行すると、次に述べるような点で、コードがすっきりするようだ。ただし、これらの優位性を鑑みてPHP5.3に移行する方がよいのか、PHP5.2での互換性を保っておいた方がよいのか、難しいところではある。

アイコン [General]

2010年3月16日

Jeans用のアイコンを、下記から取得。

Chimply
Ajax用のさまざまなbusyアイコンを作成することができる。

FAMFAMFAM - Mini Icon
このサイトのSILKアイコンはさらに充実しているが、ライセンスの関係で、使えない。

Jeans CMS 0.7.0 alphaを公開 [General]

2010年3月2日

Jeans CMS 0.7.0 alphaを公開しました。jeanscms.sourceforge.jpの方に色々と説明を書きましたので、興味ある方はそちらを参照していただけたらと思います。

http://jeanscms.sourceforge.jp/index.php?itemid=25

今後(実際には、数ヶ月前から)、情報発信はjeanscms.sourceforge.jpでさせていただきますので、そちらをご参照ください。

イベントの実装についての考察 [General]

2009年12月18日

本題に入る前に…。

sourceforge.jpにおいて、Jeans CMSがプロジェクトの一つとして承認されました。現在開発中のJeans CMSは、SVNレポジトリの閲覧ページで閲覧する事が出来ます。機能がある程度まとまれば、ダウンロードページにファイルを上げる予定です。

さて、Jeansにおいて、プラグイン用のイベントをどのように実装するかについて。Nucleusでは、$manager->notify()というメソッドを用い、プラグインに閲覧させる変数は値渡しで、プラグインに変更を許可する変数は参照渡しとする事により、必要なデータのやり取りをしている。これをもう少し、フレキシブルで簡潔で効率的なやり方に出来ないかと考えている。

一つ思いついたので、ここにメモしておく。それは、イベントを呼び出す側のメソッド内で、evalを行う方法。これだと、コードの実行は呼び出し側のメソッド内のスコープでおこなわれ、すべてが参照渡しのようになる。evalする文字列はcoreクラスから引き渡され、各プラグインはコード文字列をsql tableに登録する形になる。実行されるコードはスタッティクである。ダイナミックに何かを行いたい場合、evalするコードの中でプラグインのメソッドを呼び出せば良い。

evalの多用は、ともすればスピードの低下につながりかねない。が、今の場合だと、簡単なコードの実行の場合、プラグインクラスの呼び出しを行わずに済む場合もあり、むしろスピードアップにつながるかもしれないと考える。

テキストエリアで、リターン時に自動的にbrを入れる。 [General]

2009年11月28日

Nucleusでは各アイテムの表示のとき、改行コードに自動的に<br />が付加される。ブログ設定でこの機能を使うかどうかを設定できるようになっている。

ただこのやり方では、例えばテーブルを作成したい場合などに自動的に追加された<br />が邪魔になってしまう。

そこでJeansでは、アイテム編集画面でJavascriptを使って解決することを考えた。リターンキーを押したときに<br />が自動的に追加されるようにする。このあたりは、HTMLのことをよく知らないユーザーにはあまりフレンドリーではないが、そこは別途WYSIWYGを用意することで対処することにして、とりあえず自分自身が使いやすいと思うインターフェースにしてみる。

定数が速いか、スタティック変数が速いか [General]

2009年11月21日

現在、view::compile()メソッドは、次のように記述されている。

    static public function compile($source) {
        static $search=array(
            '/(\r\n|\r|\n)(?:\t)([^<%]|<[^%]||%[^>])/',
            '/(\r\n|\r|\n?)<%([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)*)%>/',
            '/(\r\n|\r|\n?)<%([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)*)\(([\s\S]*?)\)%>/');
        static $replace=array('self','compile_cb');
        // Actually, JIT is just a preg_replace_callback.
        $compiled=preg_replace_callback($search,$replace,$source);
        $code=create_function('$data','?>'.$compiled.'<?php return true;');
        if (!is_callable($code)) return error::compile_error($source,$compiled);
        return $code;
    }


ローカル変数$search,$replaceをスタティックに設定しているのは、同じ内容の変数を何回も定義しなおすのが遅いと思ったから。

でもこれ、本当なの?スタティック変数じゃなく定数を使ったら?…など疑問に思ったので、実験してみた。本来はPHPのソースコードをじっくり眺めて解決すればよいのだろうけれど、それも面倒なので、とにかく実験。

pageライブラリを作成 [General]

2009年11月14日

ページング用のリンクを作成するためのライブラリ、pageクラスを作成。

呼び出しは、こんな風に。

<%page.init%>
Page <%data(page,this)%> of <%data(page,pages)%>
<%if.data.ismorethan(1,page,pages)%><%page(paging.inc)%><%endif%>

テンプレートの記述は、こんな風に。

<%select(template)%>
<%case(head)%>
 [
<%case(body)%>
<%if.data.ismorethan(1,count)%>,<%endif%>
<%if.data.isempty(this)%>
<a href="<%data(link)%>">&nbsp;<%data(count)%>&nbsp;</a>
<%else%>
<b style="color:red;">&nbsp;<%data(count)%>&nbsp;</b>
<%endif%>
<%case(foot)%>
] 
<%endselect%>


管理画面を少し作成し、新しい記事の追加と記事の編集がもう少しでできそう。とりあえず、<%media(20091114-jeans0541.zip|バックアップ)%>(管理画面を見てみたいという方は、ログインID:admin、パスワード:adminでログインしてみてください)。

時刻管理 [General]

2009年11月13日

時刻管理は、次のように行う。

グローバル設定で、タイムゾーンを指定。(もし、ブログごとにタイムゾーンを切り替えたいのなら、その指定はプラグインで。)
date_default_timezone_set(_CONF_TIMEZONE);

データベース上では、すべてGMTで保存。
$sql_time=gmdate('Y-m-d H:i:s', time());

表示は、次のように。
$time=strtotime($data['time'].' GMT');
$text=strftime($format,$time);

ブラウザから受け取ったデータをデータベースに保存するときは、
$time=strtotime($_GET['time_text']);
$sql_time=gmdate('Y-m-d H:i:s', $time);

Jeans CMSについて [General]

2009年11月10日

だいぶ煮詰まってきた。少し考えをまとめておく。こういったことは、コードの簡潔化に必要のようだ。

Jeans CMSとは、つまり次のようなものであろう。

利用環境

 八方美人的なツールではない。かなり限られた環境での使用を目的とする。次のような条件に一致することが必要。

・Apache/PHP(>5.2)が使えること。
・SQLite (version 3)が、PDOで使えること。
・記事の編集ができるメンバーに最高権限を与えられること。
・文字コードはUTF8のみ

 DBは、SQLite固定とする。以前は、SQLite/MySQL/PgSQLのサポートを考えたが、クエリーの方言をラップするコードが複雑になるため、断念した。PHPのバージョンは今のところ5.2以上を考えているが、5.3以上にする可能性も有る。メンバーの権限の問題もコードの簡略化に大きく影響する。いまのところ、ログイン可能なメンバーは、コメントのみ書き込めるゲストと最高権限という、両極端な2つだけを考えている。

フレームワークとしてのJeans

 Housekeeping Jeansと名づけたフレームワークを考える。今のところ、次のコンポーネントがこれに相当する。

・次のPHPスクリプト:jeans.php, view.php, member.php, error.php, plugin.php
・次のDBテーブル:jeans_config, jeans_login

 役割は、次のとおり

・セキュリティー関連(XSS, SQL-injection, CSRFなどの対策)
・メンバーのログインの管理
・スキンのパース
・ライブラリの管理
・プラグインの管理

 現在、PHPスクリプトは合計で800行ほど。2000行以内を目安にしたい。これは、Nucleusのglobalfunctions.phpの行数に相当する。セキュリティーに大きく関係するこの部分は、なるだけ簡潔で、かつ、最小限の機能を提供するようにし、結果としてセキュリティー管理の簡便性・確実性が図れるようにしたい。

 グローバルに定義する関数は使用しない。変わりに、クラスのスタティックメソッドを多用する(クラスの命名方法に規約あり)。オブジェクトは、次の例外を除き、利用しない。

・PDOクラスのインスタンス
・plugin派生クラス(プラグイン)のインスタンス
・デストラクタが必要な場合

 PDOに関しては、オブジェクトはJeans内部でのみ利用され、フレームワーク外からのアクセスはスタティックメソッドを通じて行う。プラグインは現在のところ、Nucleusと同様に、インスタンスを作成する予定である。ただし、ベータバージョンでPHP5.3が採用になった場合、ここもスタティックで行く可能性もある。

 スキンは、派生させることが可能(例えば、defaultスキンの派生スキンを作成し、変更部分だけ記述するなど)。一見実装が難しそうに思えるこの機能は、実際にはコードの簡略化に大きく貢献しそうだ。

 ライブラリ、プラグインという2つの概念を考える。これらは互いに良く似ているが、ライブラリの方がより基本的な機能を提供し、プラグインの方がより高度な機能を提供することとする。

CMSとしてのJeans

 JeansをCMSとして捉えた場合、今のところ、次のものがここに含まれる。

・次のPHPスクリプト:admin.php
・次のスキン:admin
・次のDBテーブル:jeans_group, jeans_item, jeans_member

 Nucleusにおけるブログ・カテゴリー・アイテムという概念は簡略化され、グループ・アイテムの二本立てになった。グループは、OSのファイルシステムにおけるディレクトリのような存在で、入れ子にすることができる。グループ、アイテムの両方に、追加の情報を持たせることが可能で、これらの情報はjeans_configテーブルに記述することになるだろう。

 管理画面は、adminスキン及びadminライブラリの二つで構成される。管理画面を好みのものに変更したい場合、adminスキンの派生スキンを作成すれば、比較的簡単に行えるはず。

 メンバーの権限管理は、このレベルで行う(具体的には、adminライブラリで)。Housekeeping Jeansはどのような権限管理でも対応できるため、独自のadminライブラリを作成すれば、複雑な権限管理も可能なはずである。

ブログツールとしてのJeans

 Jeansをブログツールとして捉えた場合、今のところ、次のものがここに含まれる。

・次のPHPスクリプト:blog.php, item.php
・次のスキン:default

 ここは、まだまだ変更される部分。item.phpは、CMSとしての分類に入れることになる可能性が大。今のところ、$_GET['catid']などを利用しているので、ブログツールの分類に入れた。とにかく、CMSとしての姿と、ブログツールとしての姿に違いをつけることで、汎用的なCMSとして使えるようにしたい。

<%media(20091111-jeans0526.zip|現在のバージョン(0.5.26α)のバックアップはここ(LGPL2ライセンス)。)%>

文字コードの問題 [Security]

2009年11月3日

またまた、スクラッチから構築中。以前考えていた(そしてコードを挿入していた)さまざまな機能をとりあえず削除し、必要最低限のコードでどこまでできるかを考えている。かなりコードがすっきりしそう。例えば、新しい考え方では、コード中でのスキンとテンプレートの区別がまったく存在しない等(ただし、概念上の違いは存在)。

サポートする文字コードは、UTF-8のみにすることにした。これも、コードの簡潔化のため。その他、さまざまな規約を設けることで、簡潔なコードでの完成を目指す。今月は、Jeans月間かな?

で、表題の件。文字コードの問題は主に、XSS対策でのこと。2つ考え方があって、ひとつはJeansに入力される文字列をチェックする方法。もう一つは、出力するときにチェックする方法。
<<前の記事