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とフィールドを設けていて、ここで各メンバーのステータスを決定することにしている。どんなステータスがあるかは、
で取得できるはず。現在のところは『admin』ステータスだけであるが、『blogadmin』『poweruser』など、さまざまなステータスをここに設定できる。いろいろ考えた結果、権限管理にはもう一つテーブルを作るだけでよさそう。
今のところ、jeans_loginテーブルにstatusとフィールドを設けていて、ここで各メンバーのステータスを決定することにしている。どんなステータスがあるかは、
SELECT status FROM jeans_login GROUP BY status
で取得できるはず。現在のところは『admin』ステータスだけであるが、『blogadmin』『poweruser』など、さまざまなステータスをここに設定できる。いろいろ考えた結果、権限管理にはもう一つテーブルを作るだけでよさそう。
あるアイテムと前後のものを同時に取得 その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回目で後を取得。
結果(それぞれの方法にかかった秒数で表示)
結局は、もっとも単純だと思われる4の方法が一番早かった。SQLのクエリーを複雑に記述する『技』におぼれる弊害が現れているということか。
方法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)と呼ぶことにする。
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クラス
いかなるオブジェクトにも依存しないこと。
1)プラグイン
基本的に、プラグインのデストラクタは、他のプラグインのオブジェクトに依存しないこと。もし依存する場合は、個々のデストラクタ内で適切に処理すること。ただし、ライブラリの各機能は使用可能。
2)ライブラリ(sqlクラス・coreクラスを除く)
基本的に、ライブラリオブジェクトのデストラクタは、他のライブラリオブジェクトに依存しないこと。もし依存する場合は、個々のデストラクタ内で適切に処理すること。ただし、sqlクラス・coreクラスは利用可能。
3)sqlクラス
coreクラス以外のライブラリのオブジェクトに依存しないこと。
4)coreクラス
いかなるオブジェクトにも依存しないこと。
スキン変数<%blog%> [General]
2008年1月6日
スキン変数の<%blog%>は、最も重要な機能の一つ。今のところ次のように記述しているが、変更の余地は大いにあるのでメモしておく。
SQLテーブルの値を一気に読み込むべきか、個々にクエリーを発行するべきか。 [General]
2008年1月6日
jit.php のinit()で、次の命令によりskinvar, templatevarのテーブルが一気に読み込まれる。
これに要する時間は、クエリーの発行に約150μ秒、フェッチには一件当たり約7μ秒である。jit.phpでは、コンパイルの際にすべてのskinvarデータが必要だから、上記のように一度に読み込むのが最も効率が良い。一方で、個々にSQLクエリーを発行したほうが効率が良い場合もある。例えば、一つのページを表示する際に、テーブル中の一つのデータしか必要でないときなど。このケースでは、quickQuery()メソッドで一つ一つ呼び出すのが良い。
では、その中間ではどのように処理すればよいか。例えば、メンバー情報などは一つの例である。多数のメンバーが居る際、一つの表示ページ中に記事の著者が一人の場合はquickQuery()の方が早い。他方で、複数の著者の記事を含むページを表示する際は、quickQuery()の方が早い場合と、一気に読み込むほうが早い場合とがある。
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()の方が早い場合と、一気に読み込むほうが早い場合とがある。