Jeans CMS 製作日記:
Deprecated: Function strftime() is deprecated in /home/u109394186/domains/rad51.net/public_html/jeans/jeans/libs/blog.php on line 333
2008年 01月の記事

sqlite_popen(`:memory:`) [General]

2008年1月28日

『sqlite_popen(':memory:')』を使うと、メモリ上にテーブルを構築できるらしい。

<html><body><?php

$db=sqlite_popen(':memory:');
@sqlite_query($db,'CREATE TABLE test(id INTEGER NOT NULL PRIMARY KEY, test TEXT)');
for($i=0;$i<3;$i++) sqlite_query($db,"INSERT INTO test(test) VALUES('".md5(rand())."')");
echo count(sqlite_array_query($db,'SELECT * FROM test'));
//sqlite_close($db);

?></body></html>

ひょっとしたら、何かのキャッシュに使えるかも?忘れないように、ここにメモ。

ただし、レンタルサーバなどでのセキュリティー上の問題が発生する可能性あり。要チェック。

権限管理 [General]

2008年1月25日

スキン変数を実装していく段階で、ブログチームの管理部分に行き着いたのであるが、一からCMSを書くのであれば、さまざまな権限を別個に設定できるようにしたい。

今のところ、jeans_loginテーブルにstatusとフィールドを設けていて、ここで各メンバーのステータスを決定することにしている。どんなステータスがあるかは、

SELECT status FROM jeans_login GROUP BY status

で取得できるはず。現在のところは『admin』ステータスだけであるが、『blogadmin』『poweruser』など、さまざまなステータスをここに設定できる。いろいろ考えた結果、権限管理にはもう一つテーブルを作るだけでよさそう。

NucleusにあってJeansに無い機能 [General]

2008年1月24日

あるいは、動作が変更される機能。

適宜、更新。

あるアイテムと前後のものを同時に取得 その2 [General]

2008年1月19日

4つの方法を用い、スピードを比較した。ここで用いているデータは、およそ250個のアイテムがすでに挿入されている、Nucleus-SQLiteのnucleus_itemテーブルを用いた。

方法1:すべてのアイテムのid,title,timeを一旦メモリに取り込んでおいて、その後に処理。

方法2:方法1と同じだが、sqlite_array_query を使用。

方法3:先の記事で一番最後に述べた方法。

方法4:クエリーを3回実行。一回目であるアイテム、2回目で前を、3回目で後を取得。

結果(それぞれの方法にかかった秒数で表示)
Method1: 0.018667936325073
Method2: 0.015633106231689
Method3: 0.0060269832611084
Method4: 0.00052618980407715


結局は、もっとも単純だと思われる4の方法が一番早かった。SQLのクエリーを複雑に記述する『技』におぼれる弊害が現れているということか。

あるアイテムと前後のものを同時に取得 [General]

2008年1月16日

表題のためのクエリ:

SELECT  i.inumber as thisid, j.inumber as previd, k.inumber as nextid 
FROM nucleus_item as i,nucleus_item as j,nucleus_item as k 
WHERE i.inumber=10 AND j.itime<=i.itime AND i.itime<=k.itime 
AND NOT (i.inumber=j.inumber OR i.inumber=k.inumber) 
ORDER BY TIMEDIFF(j.itime,k.itime) DESC LIMIT 1
クエリー実行 0.0021 秒

ただし、最新の記事もしくは最古の記事でこれを行うと、失敗する。

骨格部分がほぼ完成 [General]

2008年1月13日

Jeans CMSの骨格ともいえるクラス郡のコードがほぼ完成。もっとも大事なクラスは、

coreクラス:Jeans初期化・htmlspecialchars互換のサニタイズルーチン・デストラクタ管理
sqlクラス:SQLite, MySQL, PostgreSQLのラッパークラス
jitクラス:スキン変数・テンプレート変数のコンパイル

の3つのクラスで、これに順ずるものは、

memberクラス:ログインを管理
actionクラス:アクションを管理
refreshクラス:スキン変数・テンプレート変数・アクションを処理するメソッドを、データベースに登録

の3つ。これら6つのクラスを、ハウスキーピング遺伝子(house keeping genes/house keeping jeans)と呼ぶことにする。

デストラクタの利用に関する規約 [Regulations]

2008年1月10日

デストラクタ処理ルーチンがほぼ完成。デストラクタは、次の規約に沿って利用するようにする。それぞれのクラスでオブジェクトのインスタンスが一つだけ必要な場合、$objという名でスタティックに作成する。

1)プラグイン

 基本的に、プラグインのデストラクタは、他のプラグインのオブジェクトに依存しないこと。もし依存する場合は、個々のデストラクタ内で適切に処理すること。ただし、ライブラリの各機能は使用可能。

2)ライブラリ(sqlクラス・coreクラスを除く)

 基本的に、ライブラリオブジェクトのデストラクタは、他のライブラリオブジェクトに依存しないこと。もし依存する場合は、個々のデストラクタ内で適切に処理すること。ただし、sqlクラス・coreクラスは利用可能。

3)sqlクラス

 coreクラス以外のライブラリのオブジェクトに依存しないこと。

4)coreクラス

 いかなるオブジェクトにも依存しないこと。

スキン変数&lt;%blog%&gt; [General]

2008年1月6日

スキン変数の<%blog%>は、最も重要な機能の一つ。今のところ次のように記述しているが、変更の余地は大いにあるのでメモしておく。

SQLテーブルの値を一気に読み込むべきか、個々にクエリーを発行するべきか。 [General]

2008年1月6日

jit.php のinit()で、次の命令によりskinvar, templatevarのテーブルが一気に読み込まれる。

self::unbuffered_query('SELECT subtype, name, method FROM jit_skinvar WHERE type=<%1%>',$type);
$data=array();
while($row=self::fetch_array()){
    $data[$row['subtype']][$row['name']]=$row['method'];
}


これに要する時間は、クエリーの発行に約150μ秒、フェッチには一件当たり約7μ秒である。jit.phpでは、コンパイルの際にすべてのskinvarデータが必要だから、上記のように一度に読み込むのが最も効率が良い。一方で、個々にSQLクエリーを発行したほうが効率が良い場合もある。例えば、一つのページを表示する際に、テーブル中の一つのデータしか必要でないときなど。このケースでは、quickQuery()メソッドで一つ一つ呼び出すのが良い。

では、その中間ではどのように処理すればよいか。例えば、メンバー情報などは一つの例である。多数のメンバーが居る際、一つの表示ページ中に記事の著者が一人の場合はquickQuery()の方が早い。他方で、複数の著者の記事を含むページを表示する際は、quickQuery()の方が早い場合と、一気に読み込むほうが早い場合とがある。