先日からGeeklog.jpの掲示板のこのスレッドで問題になっていた、XHTMLで" />"が消える問題だが、原因は拙作のRSSAggregatorだった Orz...
phpblock_rssaggregator()の先頭で
if (!defined('XHTML')) {
define('XHTML', '');
}
のように定義している。問題は、この関数をlib-custom.php内で読み込むため、テーマのfunctions.phpの設定や$_CONF['doctype']よりも優先されてしまう、ということだ。RSSAggregatorを使用しているサイトはどんなテーマでもXHTMLではなくHTMLになってしまう。
これはあまりにもまずいので、対応したバージョン1.3.2を公開した。といっても、上述の3行を削除しただけ。お騒がせして申し訳ないm(_ _)m。
教訓: lib-custom.php内で読み込む関数では、トップレベルで(= カスタム関数の外で)XHTML定数を定義してはならない。
2010年 4月24日追記: 「トップレベルで(= カスタム関数の外で)」の部分を加筆しました。
タグ:カスタム関数
昨日公開したバージョン0.3.0では、キャッシュの制御がうまくいっておらず、「1時間あたり150回まで」というAPIの呼び出し制限を超えてしまっていた。このバグは修正できたと思う。
もう一つのバグは、記事を投稿したときに自動的にTwitterにも投稿する機能で、bit.lyでURL短縮を指定しているにもかかわらず、URLの一部が欠けたり、URLが丸ごと消えてしまうというもの。bit.lyにログインして調べてみると、APIの呼び出しには成功している。
この2つのバグの修正が確認できれば、バージョン0.3.1として公開するつもり。
現在のGeeklogで検索対象になるのは、記事と検索APIを実装しているプラグインのみ。つまり、公開領域/docs/にあるhtmlドキュメントは検索されていない。ドキュメントの翻訳にかかわった者としてはもったいないの一言に尽きる。そこで、検索APIを調べてみると、カスタム検索関数を追加できるよう設計されていることがわかった。APIのシグネチャを調べて実装したのが、こちらのカスタム検索関数。対象のhtmlファイルを力ずくで検索するのであまり格好いい方法ではないが、ないよりはましと思う。
GeeklogがHTMLのレンダリングに使用しているのはPHPLIBのTemplateクラスで、Dirkさんが何かのカンファレンスでその制作者に出会ったときに「まだそんなもの使っているの? Smartyを使えよ。」と言われたほどの代物。軽量だが、変数置換などの最低限の機能しかないため、条件分岐やループ構造を単体では実現できず、PHPコードでレンダリングしなければならない。
開発時期が古いためか、コードを読んでも「なぜそんな実装?」と突っ込みたくなる箇所が多い。
このような状況で、JoeさんさんがCaching Template Library(CTL)を開発・公開した。オリジナルのTemplateクラスに、1. 条件分岐やループ構造を追加 2. デフォルトの変数を定義 3. テンプレートをPHPコードにコンパイル・キャッシュして、実行速度アップを狙った優れものである。MediaGallery-1.6.xはこのCTLがないとインストールすることすらできない。
上記1., 2.はありがたいが、モジュール版PHPが多い日本のホスティングサービスでは、パーミッションの関係で3.でつまずくことが多い。それと、これは私見だが、Geeklogのように各テンプレートファイルのサイズが小さい場合には、コンパイル・キャッシュの恩恵をあまり受けられないように思う。
そこで、CTLからキャッシュ機能を抜き、代わりにdengenさんが提唱しているTemplateクラスの高速化(file()をfile_get_contents()で、preg_replace()をstr_replace()に置き換えるなど。)と木下さんが実装したOverRide機能(該当テンプレートファイルがない場合、デフォルトのテーマに自動的にフォールバックする機能)を追加したKZ_Templateクラスを開発した。ダウンロードはこちらから。まだ、開発段階なので、いろいろバグが残っていると思われるが、Geeklogのコアファイルを改変しなくても使えるので、それなりの価値はあると思う。
最近、JavaScriptを勉強している。食わず嫌いだったが、きちんとした本(O'REILLY®の「JavaScript(第5版)」や"JavaScript: the Good Parts"など)を読むと、結構面白い。何か実用的なものを作ってみたくなり、表題のStyle Viewerを試作中。マウスを動かすと、ツールチップと共に当サイトの右上ブロックにスタイル情報の一部が表示される。まだ、Firefoxでしか検証していないので、他のブラウザではうまく表示されない可能性大。しばらく放置して、需要があるようなら、プラグイン化することも検討するかも。
(2009年 2月13日追記)JavaScriptを修正して、IE7、Opera9、Google Chromeでも正常に動作するようにした。
Geeklog.jpの掲示板のこのスレッドから始まったmore_article_linksカスタム関数だが、実装している最中に考えたことを参考までに記す。
続きを読む (29 ワード)
少し時間ができたので、Geeklog-1.5.x用のPrecheck(インストール前診断)を試作してみた。db-config.phpの位置をビジュアルに探す機能とデータベースの接続をリアルタイムでチェックする機能付き。JavaScript(というか、DOM)の挙動の違いに戸惑った。Firefoxではエラーコンソール(+ Firebug)が克明にエラー原因教えてくれるので楽勝だが、IE7ではDeveloper Toolbarを入れていてもあまり役に立たない。ベースになるAjaxのライブラリは最低限の機能を備えた軽量のものをということで、SitePointのcore.jsを使用した。興味のある方は、こちらからダウンロードしてほしい。
PS. なお、使用後は必ず、admin/installディレクトリごと削除すること。放置しておくと、サーバのファイルツリーがある程度見えてしまう危険性がある。
ユーザの方から「RSS_Aggregatorでフィードのdescriptionを表示できないか?」というお問い合せがあった。何せ1年半ほど前に作ったスクリプトなので、覚えていない。アーカイブを引っ張り出してみると、わずかなコードの追加で実現できそうなことが分かったので、さっさと仕上げてアップロードした。ユーザの方からのフィードバック、リクエスト(あまり過大なものは困るが(^^;))こそがフリーソフトウェア作者を動かす力なのだと思う。
前々回と同じ環境で(config.class.phpのキャッシュ機能あり)、CTL(Caching Template Library)あり・なしで違いを測定してみた。時間の単位はms(ミリ秒)。結果は以下の通り。
| CTLなし | CTLあり | |||
|---|---|---|---|---|
| 平均実行時間(ms) | 平均比率(%) | 項目 | 平均実行時間(ms) | 平均比率(%) |
| 9.8 | 9.6 | index.php自体の読み込み | 16.2 | 13.6 |
| 30.4 | 29.8 | lib-common.phpインクルード | 30.2 | 25.4 |
| 28.4 | 27.8 | COM_siteFooter() | 34.4 | 29.0 |
| 20.2 | 19.8 | COM_siteHeader() | 21.6 | 18.2 |
| 7.8 | 7.7 | STORY_renderArticle() | 10.2 | 8.6 |
| 2.8 | 2.7 | lib-story.phpインクルード | 3.0 | 2.5 |
| 102.0 | 全体 | 118.8 | ||
意外な感じがするが、自分が使用している環境ではCTLの恩恵を感じられず、むしろほんのわずかだがスピードダウンする。CTLとは違う方法で、テンプレートライブラリをハックする方法を考えてみようか。
前回と同じ環境(config.class.phpのキャッシュなし)で、public_html/index.phpにアクセスしたときに、lib-common.phpインクルードにかかる時間の内訳(5回の平均値)。時間の単位はms(ミリ秒)。0.2ms以下のものは適当に省いている。
| 項目 | 実行時間 | 比率 |
|---|---|---|
| lib-common.php自体の読み込み | 19.4 | 49.0% |
| config->initConfig() | 9.4 | 23.7% |
| config->load_baseconfig() | 3.1 | 7.9% |
| lib-syndication.phpインクルード | 1.5 | 3.8% |
| staticpages::functions.incインクルード | 1.3 | 3.3% |
| links:functions.incインクルード | 0.8 | 2.1% |
| lib-plugins.phpインクルード | 0.7 | 1.7% |
| japanaese_utf-8.phpインクルード | 0.6 | 1.4% |
| polls::functions.incインクルード | 0.5 | 1.2% |
| smapx::functions.incインクルード | 0.4 | 1.1% |
| calendar::functions.incインクルード | 0.3 | 0.9% |
| SEC_getUserGroups() | 0.2 | 0.6% |
| 合計 | 39.6 |
意外な感じがするのは、プラグインのfunctions.incをインクルードする時間が長いこと。同梱されている標準の5つのプラグインだけでも3.3ms(全体の8.7%)かかっている。
ついでに、public_html/index.php自体も計測してみた。
続きを読む (25 ワード)






