2009/10/16
php からのディスクアクセス
php だという時点で既にアレなんだが…php からディレクトリにある全ファイルの一覧を取得する処理のパフォーマンスを exec()、popen()、opendir() を利用した処理で比較してみる。
方法は単純にテスト用のディレクトリに 500 ファイルを用意して、 それぞれの関数を使用してファイル名一覧を取得する処理を 10 回実行した場合の処理速度を計測する。
exec("ls -1") | 0.774762 |
popen("ls -1") | 0.865914 |
opendir() | 0.136642 |
外部 shell を実行しないので opendir() が早いだろうとは予想していたが、
これほど差が出るとは思わなかった。
パフォーマンスを優先する場合は勿論だが、
余計なプロセスを生成しないので opendir() が地球に優しい様だ。
1<? 2 3 $func = array("byexec", "bypopen", "byopendir"); 4 5 for($i=0; $i<3; $i++){ 6 $dist = array(); 7 $start[$i] = gett(); 8 for($j=0; $j<100; $j++) 9 $dist[$j] = $func[$i]("/tmp/test"); 10 $end[$i] = gett(); 11 12 printf("%-10s:%f\n", $func[$i], $end[$i] - $start[$i]); 13 } 14 15 function byexec($dir) 16 { 17 18 exec("ls -1 $dir", $output); 19 20 return($output); 21 22 } 23 24 function bypopen($dir) 25 { 26 27 if(($fp = popen("ls -1 $dir", "r"))){ 28 while($buf = fgets($fp)) 29 $output[] = trim($buf); 30 pclose($fp); 31 32 } 33 34 return($output); 35 36 } 37 38 function byopendir($dir) 39 { 40 41 if($dir = dir($dir)){ 42 while($file = $dir->read()) 43 $outout[] = trim($file); 44 $dir->close(); 45 } 46 47 } 48 49 function gett() 50 { 51 52 $t = gettimeofday(); 53 return((float)($t['sec'] + $t['usec'] / 1000000.0)); 54 55 } 56 57?>
ついでにシェルの glob なパターン指定を利用して 指定した文字列にマッチするファイル名の一覧取得を行う場合のテストもしてみた。
20090219000 から 20090219499 までの500個のファイルの中から、 200902192?? にマッチするファイル名の一覧取得で時間を計測してみる。
exec("ls -1 200902192??") | 0.883770 |
popen("ls -1 200902192??") | 0.902392 |
opendir()→preg_match("/200902192../") | 0.188792 |
glob("/200902192../") | 0.203928 |
exec()、popen() が遅いのは相変わらずだが、
preg_match()の呼出しが意外に早かったのが驚き。
正規表現のマッチ処理って基本的に相当時間がかかる筈なんだが…
glob() はファイルシステムに自分でアクセスしてる様なので早い。
複雑なパターン指定が必要ならpreg_match()の方が柔軟だが、
シェルに渡せる程度のパターン指定なら glob() を利用するのが
可読性やメンテナンス性と性能が両立できて良いのかも?
2009/10/15
2009/10/14
Instant Mode の Firefox
Instant Mode で起動される Firefox は何故か無意味に機能制限されおり、
非常に使い勝手が悪いのでフル機能の Firefox に入れ換える。
作業は linux 用の firefox-3.0.8 バイナリを取得して展開し、
アーカイブ中に含まれる firefox/firefox スクリプト中の
"moz_libdir" の定義を "/usr/lib/firefox-3.0.8"
から "/usr/local/lib/firefox-3.0.8"
に変更するだけである。
ここではデュアルブートの ubuntu linux を起動して作業しているので、
Windows パーティションは "/media/Windows" にマウントされているが、
例えば Windows 上から参照できる "C:\InstantON\browser" ファイルを
稼働中の Linux 環境にコピーして作業する等、
それ以外の環境で作業する事も勿論可能である。
なお、デバイス名称やディレクトリ名は環境により異なる可能性があり、
マウントポイントはあらかじめ準備する必要があるので、
適宜自分の環境に合わせてコマンドを実行する必要がある。
デバイス名称やディレクトリ名、マウントポイントなどの言葉の意味が
判らない場合は実行しない方が良いと思う。
# mount -o loop /media/Windows/InstantON/browser /opt/browser # wget -q -O - "http://download.mozilla.org/?product=firefox-3.0.8&os=linux&lang=en-US" | tar -C /opt/browser -jxf - # cat << EOF | ex -s /opt/browser/firefox/firefox > /^moz_libdir=/ s!=.*!=/usr/local/lib/firefox-3.0.8! > w! > EOF # umount /opt/browser
これで Instant Mode を起動するとフル機能の Firefox が利用可能となり、 普段利用している様々なアドオンなどが動作する。
2009/09/29
起動時に任意のコマンドを実行する
Mac OS X 10.5 以降で起動時に任意のコマンドを自動で実行したい場合、
本来であれば launchd (8) を使用した制御が必要なので
/System/Library/LanchDaemons/ 以下に
plist ファイルを準備する必要がある。
しかし、/Library/StartupItems に
コマンド起動用のスクリプトファイルを設置する事により
任意のコマンドを起動できるので、
unix 系のシェルスクリプトに慣れている場合は
こちらの方が使いやすい場合もある。
- /Library/StartupItems に任意の名称 (ここではサービス名とする)でディレクトリを作成する。
-
作成したディレクトリに任意の名称で起動スクリプトを作成する
スクリプトファイルは サービス名 と同じ名称にする。 -
作成したスクリプトに実行権限を付与する
- 作成したディレクトリに StartupParameters.plist という名称でサービスの説明を記述したファイルを作成する。
-
ファイルの所有権限を root に設定する。
セキュリティ上の理由から、 ファイルの所有者が root 以外の場合は自動実行されない様だ。
# mkdir /Library/StartupItems/サービス名
# cat << EOF > /Library/StartupItems/サービス名/スクリプト名 > #!/bin/sh > > . /etc/rc.common > > StartService () > { > # サービスを開始するためのコマンドを記述 > } > > StopService () > { > # サービスを終了するためのコマンドを記述 > } > > RestartService () { StartService; } > > RunService "$1" > EOF
# chod 755 /Library/StartupItems/サービス名/スクリプト名
# cat << EOF > /Library/StartupItems/サービス名/StartupParameters.plist > { > Description = "/<u/>サービスの説明/</u/>"; > Provides = ("/<u/>提供するサービスの内容/</u/>"); > } >EOF
# chown -R root:wheel /Library/StartupItems/サービス名</i>
再起動するとサービスが自動で実行される。
2009/09/25
iLeopard alpha 3
Snow Leopard にしてから利用できなかった iLeopard の Snow Leopard 対応 alpha 版が リリースされている。
iLeopard は元々 Leopard が持っているシンプルで綺麗な見た目を
ほんの少しだけ(でも実際は結構色々な箇所を)変更して
より一層落ち着いた雰囲気にしてくれるテーマで、
Leopard の頃から愛用していた。
Snow Leopard に対応していないのが残念だったのだが、
ついに Snow Leopard 対応の iLeopard が (alpha 版とはいえ) リリースされた。
早速インストールすると Leopard 版とほとんど変わらない見た目で、
何故システム標準のテーマにならないのか不思議な程完成されたテーマである。
iTunes など一部のアプリケイションは独自のリソースを保持しているので 現在の alpha 3 では対応していない様だが、 正式版のリリース時には iTunes なども含まれているのだろうか。
2009/09/23
2009/09/22
2009/09/15
おめでとうございます
9年連続200本安打おめでとうございます。
108年間もの長い間破られる事のなかったメジャーリーグの記録が、
日本人によって更新されるこの瞬間を共有できた事が嬉しい。
イチローについては既に語り尽くされ過ぎているので、
ここでとやかく言わなくても良いだろう。
ただただ「おめでとう!」と祝福したい。
しかし、そうは思わない連中もいるらしい。
ある意味、最もイチローらしいとも言える内野安打で
200本安打を達成した映像を見て、
「......セコイよ。ちゃんと打たなきゃ」などとメディア上でぬかしたクソ野郎がいるらしい。
確かにどんな感想を抱こうと個人の自由ではあるが、 偉大な実績を成し遂げた相手に対して尊敬の念を持てないのか…
元々このクソ野郎は嫌いだったのだが、 今回の一件で存在そのものが道ばたで干からびている犬の糞以下だと 認識を新たにした次第である。
こんなクソ野郎と同じ空気を呼吸いしてると考えただけでおぞましい。
早くその薄汚い存在を消し去ってくれ。
2009/09/13
2009/09/12
ATOK 定額制サービス
ATOK 2007 では Snow Leopard 上で動作する 64bit アプリケイションへの日本語入力に不具合があるので、 先日から開始された ATOK 定額制サービスを利用してみた。
Snow Leopard に正式対応しているだけあり、
64bit アプリケイションへの日本語入力は全く問題ない事は確認できた。
MS-DOS 時代の一太郎 4.3 + ATOK7 の時代から ATOK ユーザなのだが、
ATOK の新しい機能をほとんど利用していない事に気づく。
変換効率は相当向上していたりするのだろうが、
遥か昔からの癖で殆んど単語毎に変換しているので、
最近の便利機能の恩恵を殆んど受けていない。
正直な所、機能としては ATOK 7 相当であまり問題ない気がする。