カテゴリー
Computer Development

ユーザ定義エラーハンドラの拡張パッチ

最近のPHPはE_ERROR(未定義の関数呼び出しなどで発生)をユーザ定義エラーハンドラで処理できません。これはE_ERRORが発生した場合、必ずeixtを呼び出しスクリプトの実行を停止しないと誤作動する問題に対処した為です。

随分前(PHP 4.3がリリースされた頃)からこんな感じでパッチを書けばよいです、と紹介はしていたのですがWikiに書きました。よろしければご利用ください。ユーザ定義エラーハンドラに問題(E_ERRORが発生する等)が無ければE_ERRORでexitすれば問題は発生しないはずです。万が一、関数名をタイポしていてもエラーページを表示しwebmasterに通知する処理などをエラーハンドラに定義できるので有用です。

カテゴリー
Computer Development

php内部でのmmapの使い方

遅ればせながらPHP 5.0.5使っていて直しているだろう、と思い込んでいたバグが直っていない事に気が付きました。

PHP内部のphp_stream_passthru()関数はreadfile()やfpassthru()関数に利用されているのですがmmapの使い方がいい加減です。PHP 4.3.xのバグレポートでreadfile()で大きなファイルが読めない旨のバグレポートがあったので全てのブランチで直っている、と思っていたのが間違いでした。

mmapは名前通りファイルをメモリにマップする関数です。メモリマップすることにより典型的なファイルI/Oコードに必要なバッファへのコピー、その後の出力、というステップがメモリからの読み出しと同時に出力、とバッファコピーが減るメリットがあります。

メモリにマップするので色々制限があります。特に32bitシステムでは小さいファイルしか(と言っても2GBくらいのファイルなら取り扱えますが)取り扱えない、メモリ圧迫する(2GBのファイルをマップすると、2GB mallocが失敗するなど)の問題があります。さらに比較的大きなファイルを実際に読み出すとスワップの嵐になるシステムも… 当たり前といえば当たり前の制限です。

と前置きしたのでPHP 5.0.5でどうなっていたかと言うと「mmapをサポートするシステムの場合、ファイル全体をマップする」ようになっています。当然前述のような問題が発生します。そこで2MB以上のファイルはmmapできないようにしています…

PHPAPI char *_php_stream_mmap_range(php_stream *stream, size_t offset, size_t length, php_stream_mmap_operation_t mode, size_t *mapped_len TSRMLS_DC)
{
SNIP
/* For now, we impose an arbitrary 2MB limit to avoid
* runaway swapping when large files are passed thru. */
if (length > 2 * 1024 * 1024) {
return NULL;
}

別にこれ自体はそれほど悪い事(2MBなどと非常に小さい値にしている事は除いて)ではないのですがこのおかげでphp_stream_mmap_range()を利用する、恐らく、ほとんどの関数で2MB以上のファイルを正しく取り扱えなくなっているようです。

中途半端に使える物は使わない方が良いのでmmapを使わせないようにするには

– PHPのランタイムからはstreamのオプションでmmapを使わないよう全てのスクリプトで設定する(iniオプションが無い!)
– 次のパッチを当ててPHPをリビルドする

等として回避する必要があります。

diff -ur php-5.0.5.orig/main/streams/php_stream_mmap.h php-5.0.5/main/streams/php_stream_mmap.h
— php-5.0.5.orig/main/streams/php_stream_mmap.h 2004-02-20 17:22:12.000000000 +0900
+++ php-5.0.5/main/streams/php_stream_mmap.h 2005-10-23 10:23:56.492890384 +0900
@@ -62,7 +62,7 @@

/* Returns 1 if the stream in its current state can be memory mapped,
* 0 otherwise */
-#define php_stream_mmap_possible(stream) (!php_stream_is_filtered((stream)) && php_stream_mmap_supported((stream)))
+#define php_stream_mmap_possible(stream) 0

BEGIN_EXTERN_C()
PHPAPI char *_php_stream_mmap_range(php_stream *stream, size_t offset, size_t length, php_stream_mmap_operation_t mode, size_t *mapped_len TSRMLS_DC);

きちんと直すの事も簡単(チャンク単位でmap, unmapを繰り返す)なのですがとりあえず情報として…

# この問題、開発者が理解してないかも…

カテゴリー
Windows

アンチウィルスソフトには優先度制御が必須…

最近Windowsマシンとして使っているPCのHDDが壊れてHDD交換&再インストールしたのですがアンチウィルスソフト(Noton AntiVirus:以下NAV)プロセスの優先度を下げる為にインストールしていたAutoGearと言うプログラムはまだインストールしていませんでした。AutoGearはアンチウィルスソフトには必須かも知れませんね。

メールクライアントにはThunderbirdを利用しています。NAVがメールをスキャンしてくれるのは良いのですが一生懸命スキャンしすぎて他のプロセスが遅くなりすぎです。IMEさえまともに反応しなくなります。AutoGearをインストールしてccApp.exeの優先度を「低」に設定して一件落着です。しかし元々もう少しお手柔らかにスキャンするように設定しておいた方が良いような気がします。PentiumM 1.3GhzなのでそれほどCPUが遅い訳でもでも無いですが、スキャン時の遅さは耐え難い物があります。

カテゴリー
Computer

VMware Playerを使ってみる

やっとVMware Playerがダウンロードできました。
Windowsバイナリ、Linux RPM、Linux tarがダウンロードできるようになっていました。
マニュアルのページを見るとPDFマニュアルには日本語版もありましたがVMware Playerの日本語マニュアルはまだのようでした。

VMwareのWebサイトによると基本機能(Key Features)としては以下であるとしています。

* Run any virtual machine. Run virtual machines created by VMware Workstation, GSX Server or ESX Server. VMware Player also supports Microsoft virtual machines and Symantec LiveState Recovery disk formats.
* Revert to previous state. Revert virtual machines to a previous ‘clean’ state within seconds.
* Access host PC devices. Use host CD/DVD drives, network adapters, and plug-and-play USB devices.
* Copy and paste. Copy text and files between the virtual machine and the host PC.
* Drag and drop. Drag and drop files between a Windows host PC and a Windows virtual machine.
* Shared folders. Use shared folders to easily share files between virtual machine and the host PC.
* Multiple networking options. Virtual machines can share or obtain new IP addresses or be isolated from the network and host.
* 32- and 64-bit host and guest operating system support. Run a wide variety of virtual machines containing 32- and 64-bit operating systems simultaneously on the same physical PC. Compatible 64-bit guest operating systems include select Microsoft Windows, Red Hat, SUSE, and FreeBSD distributions.
* Adjustable memory. Tune virtual machine memory for optimal performance.
* Configurable shutdown. Power down or suspend the virtual machine when closing VMware Player.

普段はLinux版VMwareしか使っていないのですが、実はこのPlayerのアナウンスが出る前日にVMware for Windowsを追加購入しています。VMware PlayerをWindows XPホスト、Windows 2000ゲストで使ってみた感想は「VMware Playerで十分だった orz」です。VM再起動時に自動的に初期状態に戻るような事もありません。Snapshotは取れないようですがVMのファイルを保存しておけばsnapshot代わりになるのであまり困らないでしょう。

気を付けないとならないのはFDD、CDROMなどのデバイスです。VMware Playerの名前の通りVMの設定をメモリ以外は全く変更できないようです。当然ですがWindowsとLinuxではデバイスの取り扱いが異なるのでLinuxで作成した仮想マシンはWindows上でも動作するのですがデバイスの再作成が必要になります。(Linuxで作成したVMのFDD,CDROMを削除してWindows上でFDD,CDROMを追加するなど)今時FDDは必要も無いかもしれませんがCDROMが使えないと困ると思います。VMware Player用にVMを配る場合は、Windowユーザ用、Linuxユーザ用、2種類用意する方が良いと思います。デバイスが無いというエラーを表示させたくない場合は思い切りよく予めFDDとCDROMデバイスを削除しておいても良いと思います。

広く公開するにはメモリの大きさにも注意が必要かも知れません。試していないので何とも言えませんが1GBのメモリを割り当てているとメモリが少ないシステムでは困った事になるような気がします。「Adjustable memory. Tune virtual machine memory for optimal performance.」とあるので大丈夫なのかも知れません。一応 VMware Playerでも「Player->Troubleshoot->Change Memory Allocation…」からメモリサイズだけは変更できるようになっています。

VMwareToolsのインストーラはVMware Playerには付属していないように見えます。VMwareToolsをインストールしておいた方が良いと思いますが、Key FeaturesにはVMwareToolsがインストールされていないと利用できない機能が記述されているのでもしかしたらインストールする方法があるのかも知れませんね。どちらにしてもVMwareの機能を十分発揮するにはVMwareToolsのインストールは必須です。VMware Workstationでインストールしておくべきでしょう。

当り前と言えば当り前ですが画面サイズは自由に変更できます。少し驚いたのはVMware Playerウィンドウ右上あたりにあるVMwareアイコンをダブルクリックすると画面が最大化されWindowサイズも自動的に解像度に合わせて調整された事です。(1024×768->1400×1050) 最大化した画面でもVMware Playerのツールバーのような物が画面上に表示されていました。このツールバーは制御がホストOSにつながっています。ゲストOSのウィンドウを最大化してもツールバーの下にウィンドウが表示されて不便だなと一瞬思いましたが、このバーの左にある押しピンアイコンをクリックするとWindowsの「タスクバーを自動的に隠す」と同じ様な感じで隠れてくれるようになりました。この機能意外に便利です。このあたりの動作はVMware Workstationと動作が異なります。VMware Workstationでも似たような動作になると良いですね。

最後にWindowsホストではVMware WorkstationがインストールされているとVMware Playerはインストールできないようです。試す場合は予めVMware Workstationをアンインストールしておく必要があるようです。
# RPM版 LinuxはVMware Workstationとconflictするのかな?

カテゴリー
Computer

ついに出た! 無料のVMware Player

VMwareからの案内メールが届きました。「ついに出た! 無料のVMware Player」が率直な感想。早速使ってみよう、と思ったらサイトが混んでいて….

しかし無料で使えるのは良いのですがMSさんは困ったことに… しかしVMware Playerが出なくても遅かれ早かれ同様の問題が出てきますからね。

しかしこれは企業にとって革命的なインパクトを持っていますね。今までレガシーシステム(Win95用アプリなど)を維持するためにVMware Workstationを購入していた所は多いと思います。

まだサイトが混んでいてダウンロードさえ出来ないのですが仮にスナップショットを利用した半読み込み(次回起動時には全ての記録が消える)ような物であっても使い道はありますね。例えば、SandBoxとしてブラウジングするのはVMware Player上のOSのみにするとスパイウェアやウィルスに感染するリスクを低減することができます。

多少の制限があるかもしれませんがVMの実行だけなら約189ドルが無料になるのですからVMware Playerを使いますよね。VTテクノロジが一般化する前に「VMware一人勝ち」の構図を作ることがVMware Player投入の意図かな?

カテゴリー
Windows

TortoiseSVN – 気が利いていますね

Windowsでsubversionを利用されている方のほとんどはTortoiseSVNを利用されていると思います。私は今日初めて知ったのですがMS Word文書の差分をみると

word = WScript.CreateObject("Word.Application");
destination = word.Documents.Open(sNewDoc);
destination.Compare(sBaseDoc);

が実行されてあたかもMS Wordの履歴をとっていたかのように表示されました。
これでわざわざ差分を記録してなくても済みますね。WindowsでSubversionを使っていた方には常識(?)とは思いますが気が利いていますね。仕組みは単純な物ですが驚きました。

Linuxの利用者からライセンス料を徴収しようとしていた会社がどこを対象として訴えを起こすつもりだったか履歴機能からバレてしまった件は有名です。履歴機能を使わなくても良くなるのでセキュリティ面でも役に立ちますね。

カテゴリー
Computer Database

PostgreSQL 8.1は”本当”に速い

@ITのDatabase Watch 10月版に「PostgreSQL 8.1は”速い”とうもっぱらのうわさ」と記事があります。

「うわさ」ではなく「本当」に8.1は速いです。

ミッションクリティカルなシステムでpgpoolを使用している所も多いと思いますが、8.1+pgpoolの相性は良いようです。pgpool無しで直接PostgreSQL8.1にアクセスした場合、pgpoolでPostgreSQL 8.1 2台でロードバランスさせてベンチマークするとINSERT、UPDATE、SELECT全てのケースで処理効率が向上している事が分かります。特に
SELECTのみクエリは100%以上の効率化となるベンチマーク結果(私が計測したケースでは102%)となる場合もあります。
# つまり2台にした場合、2台分よりも速くなるケースがある。
# 負荷を分散させたため各サーバがより効率良くクエリを実行できた
# ため論理値以上である102%の速度向上が見られたと考えられます。

私は試していませんが片岡さんに聞いたところ8.1では同時接続数が増えてもスループットの低下が少ないという情報も聞きました。500接続くらいではあまり速度低下が発生しないそうです。

私も8.1はまだまだテスト中ですがPostgreSQLの性能でお困りの方は8.1をテストしてみてはいかがでしょうか?