カテゴリー: Computer

なか見!検索 – Amazonでも中身が見れる

使用許諾は随分前だったのですがやっとAmazonの本文参照サービスがスタートしたようです。「はじめてのPHP言語プログラミング入門」も中身が見えるようになりました。

本に表記されているページ数で言うと20ページまで見ることができました。個人的にはもっと見えるようになっている方が良いと思います。

「はじめてのPHP言語プログラミング入門」はプログラミング初心者には不評、プログラミング経験者には好評、と評価がはっきり分かれる本なのでネットでもう少し読めた方が読者満足度が増して良いと思うのですが…

MySQL 4.1, 5.0の文字化け回避

日本人には必要なオプションがmysqldのオプションに追加されたようです。4.1.15、5.0.15以降なら使えるそうです。

A new command line argument was added to mysqld to ignore client character set information sent during handshake, and use server side settings instead, to reproduce 4.0 behaviour (Bug #9948):

mysqld –skip-character-set-client-handshake

ちょっと乱暴ですがPostgreSQLなら「initdbのオプションに–no-localeを付ける」にあたいするくらい重要かも知れません。

PHPで記述されたnanoftpd

PHPで記述されたWebサーバ、nanowebが公開されたのは随分前で確かsoket関数に地雷が沢山埋まっている頃だったと思います。地雷にもめげずよく作ったものだ、と関心した事を覚えています。

PHPで記述されたFTPサーバ(nanoftpd)公開されていたんですね。PHPは使えるけどFTPは使えないサーバに便利かも知れないですね。

MySQL5リリース

#ちょっと遅いのですが自分用のメモとして。

10/24にMySQL5が正式リリースされました。

新しい機能として

  • ストアドプロシージャ
  • トリガ
  • カーソル
  • スキーマ
  • XAトランザクション

サポートされています。

FEDERATED Tablesと呼ばれる他のMySQLサーバのテーブルとリンクする機能も追加されたようですがこれはPostgreSQLのdblinkと同類の機能ですね。

dblink/
ここには2つの関数が提供されています。1つ(dblink())はリモートデータベースに 対して実行したいSQLのクエリーの結果をポインタを受け取るものです。引数を2つ (接続するデータベースを標準のlibpq形式で記述したものと実行したいSQL文)渡すだけで リモートデータベースから結果を受け取ることができます。もう1つはdblink()の結果から 各フィールドの結果を文字列で返すものです。構文や使用例は、このディレクトリにある README.dblinkを参照してください。

http://www.sraoss.co.jp/PostgreSQL/7.2/contrib.html

PHPのlintモード

エラーハンドラでE_ERRORを処理できるようにして関数名などのタイポに対応できても、タイポによる構文エラーに対処できなければ意味が無いよね?と言う事でlintモードの紹介です。

随分前のPHPからlint(構文をチェックするモード)はあったのですがあまり使われていない(?)ような気がします。実際、かなり長い間壊れていた事もあります。最近のPHPのlintモードは壊れていないので-lオプションを使ってチェックすれば思わぬ構文エラーによるスクリプトの停止も免れます。

いくらエラーハンドラでエラーをwebmasterに通知していても構文エラーには無力です。特にアプリの新規作成時や大量の変更がある場合にはlintモードを使う方が良いでしょう。詳しくはWikiに書きました。

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

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

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

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を繰り返す)なのですがとりあえず情報として…

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

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するのかな?

ついに出た! 無料のVMware Player

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

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

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

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

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

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をテストしてみてはいかがでしょうか?

coLinuxのパーティションを大きくする

備考:かなり古いブログですが公開し忘れしていた分です。

coMomongaのパーティションは3GBで小さく手狭になってきたのでパーティションを大きくしようと思い調べてみました。

coLinuxのパーティションサイズを変更するにはTopoResizeが利用できるようです。このツールを使ってディスクイメージも作成できるようです。折角TopoResizeがあるので試してみる事にしよう、と思ったらリンク先にないですね。

他にも既に作成済みのディスクイメージをダウンロードしてしまうと言うお手軽な方法もあるようです。

空のイメージ http://gniarf.nerim.net/colinux/blank/
スワップ   http://gniarf.nerim.net/colinux/swap/
ext3     http://gniarf.nerim.net/colinux/fs/

追加するだけならこれらのファイルを使用するのが一番簡単と思います。

Linuxを持っている方なら

dd if=/dev/zero of=colinux.img bs=1024 count=1G
mkfs.ext3 colinux.img

等としてもイメージが作成できそうです。odで最初の方のダンプしてかるーく最初方だけ見ただけなので実際には試していませんが。特別なデータは書いてなさそうだったので多分大丈夫でしょう。TopoResizeの様にext2/ext3パーティションの拡張等もLinuxにイメージを持ってきて普通にリサイズすれば出来そうです。

TopoResizeがあれば試してみたかったのですが仕方が無いのでLinux上で拡張してみる事にしました。

参考
http://wiki.colinux.org/cgi-bin/ColinuxImageTools

Bフレッツで繋がらないサイトが…

先日、linux kernel 2.4で構築していたfirewallをkernel 2.6にアップグレードするとmicrosoft.comやitmedia.co.jpにhttpでアクセスできない。

直ぐにMTUの問題点かな、と思い「linux mtu」でググってみると一発でした。

iptables -I FORWARD -p tcp –tcp-flags SYN,RST SYN -j TCPMSS –clamp-mss-to-pmtu

で解決。

microsoft.com、itmedia.co.jpはICMPのMTU Path DiscoveryパケットなどをフィルタしているのでMTUを見付けるパケットが通らない->接続できない、となります。上記のオプションを付けると問題を回避できます。
# しかし前の環境では問題なかった事が気になりますが今更深追いする
# 必要もないので気にしない事にしました。
# ちなみにネットワーク接続はBフレッツ+OCN+固定IPの環境です。

さて、WindowsUpdateを実行しないと。

追記:
やっぱり気になったので前の設定を見てみるとpppoe.confに

CLAMPMSS=1412

を入れていましたね。今の設定では/etc/ppp/pppoe.confでは無く、/etc/sysconfig/network-script/ifcfg-ppp0を使用しているのですが設定をコピーする際にもれていたようです。

悪しき判例 – ソフトウェア特許

松下とジャストシステムがコンテクストヘルプ特許で争っていたことは周知の事実です。判決がでてからしばらく経っていますがこの判決、どうしても納得できない。

ジャストシステムは裁判には勝ちました。裁判所はそれは既に同様のアイデアが先に発表されていたため特許は有効ではないとしました。しかし、特許自体の有効性は認めています。つまり何らかの同様の発表がなければ特許が認められていた事になります。ワンクリック特許と同様、誰でも思いつくようなアイデアは特許にするべきではないと思います。

この程度で特許だ、差し止めだ、とかいちいち騒いでいたら特許制度の本来の目的を損なうことは明らかだと思います。

「ソフトウェア特許にNO!」