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

Forty Licks

発売当初、購入しようとして購入できなかったのだが、 初回盤で限定のオリジナルステッカーも付いた状態という、 程度の良い中古 CD を入手する事ができた。

Image: FortyLicks.jpg

The Rolling Stones は我々の世代にとっては、 やはり特別なアーティストの一人だと思う。

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 系のシェルスクリプトに慣れている場合は こちらの方が使いやすい場合もある。

  1. /Library/StartupItems に任意の名称 (ここではサービス名とする)でディレクトリを作成する。
  2. # mkdir /Library/StartupItems/サービス名
    
  3. 作成したディレクトリに任意の名称で起動スクリプトを作成する
    スクリプトファイルは サービス名 と同じ名称にする。
  4. # cat << EOF > /Library/StartupItems/サービス名/スクリプト名
    > #!/bin/sh
    > 
    > . /etc/rc.common
    > 
    > StartService ()
    > {
    >   # サービスを開始するためのコマンドを記述
    > }
    > 
    > StopService ()
    > {
    >   # サービスを終了するためのコマンドを記述
    > }
    > 
    > RestartService () { StartService; }
    > 
    > RunService "$1"
    > EOF
    
  5. 作成したスクリプトに実行権限を付与する
  6. # chod 755 /Library/StartupItems/サービス名/スクリプト名
    
  7. 作成したディレクトリに StartupParameters.plist という名称でサービスの説明を記述したファイルを作成する。
  8. # cat << EOF > /Library/StartupItems/サービス名/StartupParameters.plist
    > {
    >   Description     = "/<u/>サービスの説明/</u/>";
    >   Provides        = ("/<u/>提供するサービスの内容/</u/>");
    > }
    >EOF
    
  9. ファイルの所有権限を root に設定する。
    セキュリティ上の理由から、 ファイルの所有者が root 以外の場合は自動実行されない様だ。
  10. # 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

堂島ロール

一部では非常に有名な堂島ロール。

Image: IMG_2639.JPG

評判通りとても美味しかったです。

2009/09/22

手打ちうどん

ひょんな事情で本場讃岐の手打ちうどんキットを入手した。
手打ちうどんなんて考えただけで面倒くさそうなので暫く放置していたのだが、 折角の連休なので一念発起し打ってみた(若干誇張表現が含まれています)。

Image: IMG_0487.JPG

手打ちうどんの材料一式

Image: IMG_0495.JPG

塩水と小麦粉をこねます

Image: IMG_0497.JPG

生地を足で踏みます

Image: IMG_0504.JPG

寝かした生地を丸めます

Image: IMG_0507.JPG

いよいよ麺棒でのばします

Image: IMG_0516.JPG

生地を切って麺にします

Image: IMG_0523.JPG

麺ができました

Image: IMG_0530.JPG

麺のゆであがりです

Image: IMG_0535.JPG

おいしくいただきます

最初は面倒だなと思っていたのだが、 結構簡単に打つことができ、 しかも意外に(?)美味しいうどんができた。
生まれて初めて打ったうどんにしてはなかなか良く出来たなと、 誰も褒めてくれないので絵に描いた様な自画自賛をしてみる。


いや、本当に美味しかったですよ。

2009/09/15

おめでとうございます

9年連続200本安打おめでとうございます。
108年間もの長い間破られる事のなかったメジャーリーグの記録が、 日本人によって更新されるこの瞬間を共有できた事が嬉しい。
イチローについては既に語り尽くされ過ぎているので、 ここでとやかく言わなくても良いだろう。
ただただ「おめでとう!」と祝福したい。




しかし、そうは思わない連中もいるらしい。
ある意味、最もイチローらしいとも言える内野安打で 200本安打を達成した映像を見て、

「......セコイよ。ちゃんと打たなきゃ」
などとメディア上でぬかしたクソ野郎がいるらしい。
確かにどんな感想を抱こうと個人の自由ではあるが、 偉大な実績を成し遂げた相手に対して尊敬の念を持てないのか…
元々このクソ野郎は嫌いだったのだが、 今回の一件で存在そのものが道ばたで干からびている犬の糞以下だと 認識を新たにした次第である。

こんなクソ野郎と同じ空気を呼吸いしてると考えただけでおぞましい。 早くその薄汚い存在を消し去ってくれ。

2009/09/13

町田リス園

先日通りがかりに偶然見つけた町田リス園に行ってきた。

Image: img_2621.jpg

人からエサを貰うことに慣れているので、 ひまわりの種を掌にのせていると掌に乗ってきて食べている。
可愛いリスの姿に癒される。

2009/09/12

ATOK 定額制サービス

ATOK 2007 では Snow Leopard 上で動作する 64bit アプリケイションへの日本語入力に不具合があるので、 先日から開始された ATOK 定額制サービスを利用してみた。

Snow Leopard に正式対応しているだけあり、 64bit アプリケイションへの日本語入力は全く問題ない事は確認できた。
MS-DOS 時代の一太郎 4.3 + ATOK7 の時代から ATOK ユーザなのだが、 ATOK の新しい機能をほとんど利用していない事に気づく。
変換効率は相当向上していたりするのだろうが、 遥か昔からの癖で殆んど単語毎に変換しているので、 最近の便利機能の恩恵を殆んど受けていない。
正直な所、機能としては ATOK 7 相当であまり問題ない気がする。


Copyright © 2008-2020 Mitzyuki IMAIZUMI. All rights reserved.