2009-01-01 (木)
■ PukiWiki 用プラグイン geshi, ajaxtree, treeview 1.3 を公開
あけましておめでとうございます。今年もよろしくお願いします。
昨年に引き続き、お年玉代わりに、PukiWiki 関連の品の新バージョンを公開します。 以前のバージョンからの変更点は以下の通りです。
- geshi.inc.php プラグイン
- file オプションを追加
- GeSHi の GESHI_HEADER_PRE_TABLE モードに対応
- 不要な flock(), ignore_user_abort() を削除
- ajaxtree.inc.php プラグイン
- キャッシュのファイル名の形式を変更
- JavaScript のコードがグローバル名前空間を汚染しないように変更
- 不要な ignore_user_abort() を削除
- treeview.inc.php プラグイン
- JavaScript のコードがグローバル名前空間を汚染しないように変更
- 不要な ignore_user_abort() を削除
- get_existpages() の高速化パッチ
- get_existpages() が一度呼ばれたら static 変数にリストを保存しておくように変更
- キャッシュに保存する前に、ページ名のリストを ksort() でソートしておくように変更
- 不要な flock(), ignore_user_abort() を削除
- コードの整理
まだ他にも用意していたのですが、時間的に間に合わなかったので、それらはまた今月中にでもリリースします。
2009-01-05 (月)
2009-01-14 (水)
■ Whatever:hover の :focus 擬似クラスへの対応について
書くのを忘れていましたが、 Whatever:hover (通称 csshover.htc) のバージョン 3 がリリースされています。 変更点はこんな感じです。
- Ajax で読み込んだソースにも対応
- onmouseover, onmouseout の代わりに onmouseenter, onmouseleave を使用 (参考: onmouseout IE flickering problem)
- ソースコードの整理
ただし、バージョン 2.02 と比較すると、IE6 で :focus が機能しなくなっています。 ちなみに csshover2.htc の場合は、IE7 で :focus が機能しないので、
- csshover3.htc → IE6 で :focus が効かない
- csshover2.htc → IE7 で :focus が効かない
という悩ましいことになっています。
私は IE7 でも :focus が機能する csshover2.htc の改造版 を使っているので、 それをそのまま使い続けてもいいかなという感じなのですが、 もし真面目に対応しようとするのなら、
- IE7 以降では、csshover3.htc を使う
- IE6 以下では、csshover2.htc を使う
という動作にするのがいいかもしれません。 そのためには、例えば、
<head> ...... <!--[if IE]> <link rel="stylesheet" type="text/css" href="/css/ie.css" /> <![endif]--> <!--[if lte IE 6]> <link rel="stylesheet" type="text/css" href="/css/ie6.css" /> <![endif]--> </head>
のように場合分けしておいて、
- ie.css
body {
behavior: url(/js/csshover3.htc);
}
- ie6.css
body {
behavior: url(/js/csshover2.htc);
}
のようにすると、希望の動作にすることができます。
2009-01-15 (木)
■ jQuery 1.3 がリリース
2009/01/14 は、jQuery の3才の誕生日なんだそうです。 それに合わせて jQuery のバージョン 1.3 がリリースされました。
変更点の詳細については、他の人がいろいろ書いてくれると思うので、 他の人が書かなさそうなことを、上のリリースノートから1点だけ書いておきます。
早速というか、早々と Google の AJAX Libraries API から jQuery 1.3 が利用できるようになっています。 以下の URL を指定することで、jQuery を高速に読み込めます。
1、2週間の内に jQuery 1.3.1 をリリースする予定、とも書かれているので、 切り替えるのはそれからでも遅くない、という気がしますが、 まずは今まで使用していたプラグインやコードが動くかどうか試してみようと思います。
2009-01-20 (火)
■ Zend Framework 1.7.3 がリリース
アナウンスはまだありませんが、Zend Framework のバージョン 1.7.3 がリリースされました。 バージョン 1.7.2 からの変更点は、以下のページを見て下さい。
たいした変更は無いようですが、Zend_Mail がらみの変更でこんなのがありました。
文字化け対策として、エンコードの方法を設定できるようにしたみたいです。
2009-01-23 (金)
■ Zend Framework で出力文字エンコーディングを変更する
携帯に対応するために、HTTP 出力をシフト JIS に変換したいと思ったので、 Zend Framework ではどうやればいいのか調べてみました。 マニュアルにはほとんど説明が書かれていないのですが、 Zend_View には Zend_View_Filter という output filter の機能が実装されているので、これを利用します。
まず、実際の処理を行う Sjis.php というこんなファイルを作り、 Revulo/View/Filter のようなディレクトリに配置します。
<?php
class Revulo_View_Filter_Sjis
{
public function filter($value)
{
header('Content-Type: text/html; charset=Shift_JIS');
return mb_convert_encoding($value, 'SJIS-win', 'auto');
}
}
text/html でいいのかとか、SJIS-win でいいのかとか、auto でいいのかとか、いろいろツッコミどころはあると思いますが、 この辺は万能な設定はおそらく存在しないので、場合によって変更して下さい。
それで、あとはブートストラップの index.php で、
$view->addFilterPath('Revulo/View/Filter', 'Revulo_View_Filter');
のように設定しておいて、Shift_JIS で出力したい画面のアクションコントローラで、
$this->view->addFilter('Sjis');
のようにフィルタを登録すればよいです。
なお、こういう場合は、普通は mb_http_output() とmb_output_handler() を使うと思いますが、 Zend_View は内部ですでに ob_start() を使っているので、 ob_start() の入れ子みたいになってしまい、うまくいかないんじゃないかという気がします。
2009-01-24 (土)
■ Zend Framework 1.7.3 patch 1 がリリース
Zend Framework 1.7.3 からの変更点は、
- [#ZF-5344] _renderExtras doesn't check for JQuery.noConflict mode - Zend Framework Issue Tracker
- [#ZF-5396] ZendX_JQuery_View_Helper_JQuery_Container doesn't take NoConflictMode into account - Zend Framework Issue Tracker
この2つみたいです。実質、1箇所だけです。と思ったら、あれ? これもそうか?
念のため差分を取ってみましたが、Zend_* のライブラリの方には変更はありません。 ZendX_JQuery_* の方だけ修正されているようです。
2009-01-25 (日)
■ PukiWiki 用プラグイン title 1.0 を公開
title.inc.php は、PukiWiki Plus! の TITLE: タグの機能をプラグイン化して、 本家の PukiWiki でも使えるようにしたものです。
もう少し詳しく書くと、こんな機能があります。
- 各ページのタイトルを、ページ名とは独立に設定できます
- <title> タグと <h1> タグの部分のタイトルを、別々に設定できます
- PukiWiki の本体やスキンの書き換えは不要です
小物プラグインですが、なかなか有用だと思うので使ってやって下さい。
2009-01-29 (木)
■ PHP スクリプトは BOM 付き UTF-8 で書いてはいけない
ここのところ、ずっと悩んでいたバグがあったのですが、 ようやく原因が分かったので、その顛末を。
header() を使ってレスポンスヘッダを出力するコードを書いていたのですが、 Live HTTP headers なんかを使って見てみても、 なぜか指定したレスポンスヘッダが出力されていません。 よくある話として、header() の前になにかゴミを出力してしまっているのでは? と疑ったのですが、 チェックしてみてもその気配は無し。
原因が分からず、しばらく放置していたのですが、 ふとひらめいて、バイナリエディタを使ってスクリプトのファイルを見てみました。 あれ? なに、この先頭の EF BB BF って? いつのまにか BOM が付いているけど、もしかしてこれがまずいのか?
(…考え中…)
そうか! BOM 付き UTF-8 で書くと、header() が効かなくなるのか!
そうなんです。
(<EF> <BB> <BF>) <?php PHP のソースコード ?>
みたいになっちゃっているので、 まず最初に EF BB BF の3バイトを画面に出力することになり、 header() はまったく効かなくなってしまうのです。 BOM なしの UTF-8 で保存し直してみたところ、あっさり動きました。
他の言語なら、こういう変な現象は起きないのでしょうけれど、 PHP は HTML 内に埋め込むスクリプト言語、という側面があるので、これは仕方ないんでしょうね。
