2009-05-06 (水)
■ PukiWiki 用プラグイン favicon 1.4 を公開
favicon.inc.php は、 指定した URL の favicon を表示するプラグインです。 外部リンクの部分に、リンク先のページの favicon を表示することができるようになります。
バージョン 1.3 からの変更点:
- レスポンスヘッダで送信する Content-Type を厳密に
- 暫定的に、BMP 形式の favicon は表示しないように修正
- 定数名を PLUGIN_FAVICON_PROXY_URL から PLUGIN_FAVICON_API_URL に変更
- ライセンスを MIT ライセンスに変更
今回のバージョンアップは、以下の件に関するセキュリティ fix を含んでいます。
要するに、BMP 形式の画像を IE で表示するのは危険ということなのですが、 今までのバージョンの favicon.inc.php は、この件で踏み台のように使われる危険性があったので、その対策を行いました。 旧バージョンのプラグインを利用している方は、なるべく早めにバージョンアップすることをお勧めします。
2009-05-10 (日)
■ IE8 に対応した SIE 0.46 がリリース
SIE は Internet Explorer で SVG を表示可能にする JavaScript ライブラリです。
バージョン 0.45 からの変更点は以下の通りです。 他にもいろいろと修正がされているようなのですが、細かい部分はよく分からないので要点だけまとめておきます。
- IE8 の標準モードでも描画がされるように対応
- radialGradient の描画の修正
正直言って、私は IE8 に対応するのは無理だろうと思っていたのですが、 作者の dhrname さんがやり遂げてくれました。 この努力には、本当に敬意を表します。
ただし、IE8 の標準モードでは、VML の描画が遅いなどいろいろ制限があるようなので、 なるべくなら、SIE を使うページでは互換モードになるようにして使う方が良いと思います。
2009-05-12 (火)
■ Ubuntu 8.04 (Hardy Heron) のハイバネートが正常に行われるようにする
もしかしたら、最新の Ubuntu 9.04 では直っているのかもしれませんが、 Ubuntu 8.04 のデフォルトの設定では、ハイバネートに失敗することがあります。 それをどう修正するか、という話です。
まずは検索してみると、以下のページが見つかりました。
どうも、/sys/power/image_size の値がデフォルトでは 500 MB に設定されているので、 ウィンドウをたくさん開いたりした状態でハイバネートすると、 メモリの内容が一部破棄されてしまう、ということのようです。
解決策としては、 /sys/power/image_size の値をもっと大きくするか、ゼロに設定すれば良いようですが、 上記のページの説明通りにやると、おそらくうまくいかないと思います。
のスレッドの一番最後の方に、次のように書かれていました。
Just a note for Hardy users. If you were using the 01-image_size.sh script and use the "Hibernate" button from GNOME (System>Quit...>Hibernate), you will have to put the script at another location.
It should now be in /etc/pm/sleep.d/01-image_size.sh instead of /etc/acpi/suspend.d/01-image_size.sh (or it could be at both places). Apparently when suspending with GNOME, that uses the pm-utils packages which expects custom scripts at that location.
つまり、サスペンドやハイバネート用のスクリプトの置き場所は、
- CUI 用
- /etc/acpi/suspend.d
- GNOME 用 (pm-utils 用)
- /usr/lib/pm-utils/sleep.d
- /etc/pm/sleep.d
のように分かれているようです。 念のため、/etc/acpi/suspend.d にだけスクリプトを置いて、 GUI のハイバネートボタンを押してみましたが、それだと設定が有効になりませんでした。 ということで、結局、作業としては次のようにしました。
まず、sudo vi /etc/pm/sleep.d/01imagesize のようなコマンドを実行して、 次のようなスクリプトを作成します。
#!/bin/sh echo 0 > /sys/power/image_size
その後、以下のコマンドを実行し、スクリプトに実行権限を与えておきます。
$ chmod 755 /etc/pm/sleep.d/01imagesize
まだ十分にテストしたわけではありませんが、少し試してみた感じでは、 この修正により、ハイバネートが正常に動作するようになったようです。 少なくとも、以前よりは安心してハイバネートボタンを押せるようになりました。
2009-05-16 (土)
■ VirtualBox をサスペンド&ハイバネートに対応させる
Ubuntu に VirtualBox をインストールして使っているのですが、 ホスト側でハイバネートすると、ゲストの仮想マシンがフリーズしてしまいます。 使い勝手が悪くて仕方がないので、これをなんとかしてみます。
考え方としては、ハイバネートの処理中に、 仮想マシンが自動的に savestate されるようにしてやれば良いはずです。 そういうキーワードで検索してみると、こういうページが見つかりました。
ここにあるシェルスクリプトを使えば良さそうです。 しかし、実際に試してみると、VirtualBox 2.2 では動作しないなど、いろいろと不満な点があったため、 私の方でスクリプトを若干いじってみました。
- VirtualBox 2.2 以降でも動くように修正
- サスペンドとハイバネートを区別するように修正
- 複数のユーザーが VirtualBox を起動していた場合におそらく対応
修正したシェルスクリプトを、以下に載せておきます。 このスクリプトを /etc/pm/sleep.d/90virtualbox に保存し、実行属性を与えてやれば、 ハイバネート時に仮想マシンが自動停止されるようになります。 Ubuntu 8.04 で動作確認しましたが、他のディストリビューションでも同じように使えると思います。
#!/bin/bash
suspend_vms()
{
for USER in $(ps h -C VirtualBox -o user | uniq); do
for VM in $(sudo -u $USER VBoxManage list runningvms | grep -o "[0-9a-f-]\{36\}"); do
sudo -u $USER VBoxManage controlvm $VM savestate
done
done
}
case "$1" in
# hibernate|suspend)
hibernate)
suspend_vms
;;
*)
;;
esac
exit $?
なお、このスクリプトでは、ハイバネートの時だけ仮想マシンを停止するようにしてあります。 サスペンドの時にもそうさせたい場合には、 hibernate|suspend) という行のコメントを外し、hibernate) という行をコメントアウトして下さい。
2009-05-24 (日)
■ Zend_Loader_Autoloader クラスの正しい使い方
まずは結論を。 Zend_Loader_Autoloader クラスを用いる際には、 registerNamespace() メソッドは使わず、 setFallbackAutoloader(true) に設定しておくべきです。
Zend Framework 1.8 では、Zend_Loader_Autoloader というクラスが新設され、 従来の Zend_Loader::registerAutoload() メソッドは、 Zend Framework 2.0 以降では廃止される予定となりました。
ところが、Zend_Loader_Autoloader クラスを用いるようコードを書き換えてみると、 困ったことに、PEAR のライブラリや Revulo_View_Phtmlc のような独自クラスをオートロードしてくれません。 この問題の解決策として、マニュアルには2つの方法が示されています。
- $autoloader->setFallbackAutoloader(true); に設定する
- $autoloader->registerNamespace('Revulo_'); のように、必要なだけネームスペース (prefix) を追加する
setFallbackAutoloader() メソッド
fallback というネーミングがあまり良くないと思うのですが、これは 「Zend_Loader::loadClass() をデフォルトのオートローダとして用いるかどうか?」 という設定をするメソッドです。
Zend_Loader::loadClass() は、Zend Framework や PEAR 形式のクラス名に対応しています。 そのため、setFallbackAutoloader(true) に設定すれば、 PEAR や openpear のクラスは全て自動的に読み込んでくれます。 つまり、以前の Zend_Loader::registerAutoload() と同じ動作をしてくれるようになります。
registerNamespace() メソッド
デフォルトの設定では、 オートロードされるのは Zend_ か ZendX_ という prefix を持つクラスに限定されていますが、 registerNamespace() メソッドを使うことで、この prefix を追加することができます。
ところが、Zend_Loader_Autoloader のコード (特に getClassAutoloaders() メソッドの辺り) を読んでみると、 実は、registerNamespace() でネームスペースを追加すればするほど動作は遅くなることが分かります。 つまり、登録するネームスペースの数はなるべく少なくしておく方が良いです。
この考えを突き詰めていくと、 そもそも setFallbackAutoloader(true) に設定すれば、 Zend_ と ZendX_ というネームスペースの登録は必要なかったりします。 以上のことから、Zend_Loader_Autoloader クラスを用いる際には、
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->unregisterNamespace(array('Zend_', 'ZendX_'))
->setFallbackAutoloader(true);
という使い方をするのが、最も効率がよいと思います。
実際には、unregisterNamespace() メソッドは無理に使わなくても良いと思いますし、 ベンチマークを取っても差はほとんど出ないと思いますが、 registerNamespace() メソッドを使うくらいなら、 setFallbackAutoloader(true) に設定する方がよい、ということです。
・・・・と、書いていて分からなくなったのですが、 そもそも registerNamespace() メソッドの存在意義ってあるんでしょうか? Zend_Loader_Autoloader クラスを、
- setFallbackAutoloader(true) をデフォルトの設定にする
- $_namespaces などというプロパティはなくしてしまう
のように仕様変更して、
- 通常は、デフォルトのオートローダ (Zend_Loader::loadClass()) に処理を任せる
- Zend Framework や PEAR とは異なる命名規則のクラスも扱いたい場合は、pushAutoloader() でそれ用のコールバック関数を追加する
という動作にしてくれた方が、シンプルかつ高速になると思うのですが。
