少し古い記事

http://nosa.cocolog-nifty.com/sanonosa/2006/05/post_f04c.html

「どんなことでも10年継続すれば1人前」というような言葉がありますよね。まさにその通りで、10年も継続した人には付け焼き刃的に身につけた人にはない貫禄があります。一方、器用貧乏な人は関心が分散するので深みのある技術が身に付いていないと言えます。

誰よりも凄い技術を身につけたところで、それを評価できる人は自分自身しか居ない。
一つの技術は凄いけどもそれしか出来ない人って人間的に危険じゃないだろーか。


あと

器用貧乏な人にすごい人はいない

器用貧乏の言葉自体がすごい人になれないことを指しているのだから当然。


前は色々手を伸ばせてたのになーという器用になれない反省。

parse_ini_file_ex()

ちょっと正規表現使いすぎかも・・もう少し簡単にできるかもしれない。

function parse_ini_file_ex($file){
    if (!$lines = file($file, 1))
        return false;

    $res  = array();
    $curr = & $res;

    $sectionPattern  = '/^\[([^\]]+)\]/';
    // キーに記号を使いたい場合は[[:alnum:]]を[^=;]等に変更
    $linePattern     = '/^\s*([[alnum]]*)\s*=\s*(.*?)\s*$/';
    $valuePattern    = '/^"(.*?)"\s*(?:;.*)?$/';
    $commentPattern  = '/^([^;]*?)\s*;/';

    foreach ($lines as $line){
        $line = trim($line);
        if (strlen($line) === 0)
            continue;

        if (preg_match($sectionPattern, $line, $m)){
            // セクションの判断
            $res[$m[1]] = array();
            $curr = & $res[$m[1]];

        }elseif(preg_match($linePattern, $line, $m)){
            // キーと値の解析
            $key   = $m[1];
            $value = $m[2];
            if ($value{0} === '"'){
                if (preg_match($valuePattern, $value, $m))
                    $value = $m[1];
            }
            elseif(preg_match($commentPattern, $value, $m))
                $value = $m[1];

            $curr[$key] = $value;
        }
   }

    return $res;
}
$ cat temp.ini
[section]
key1 = var space
key2 = "value; 1" ; comment
key3 = "value 2 "
key4 = "value ;" value" ; comment
key5 = value1 value2 ; comment
key6 = "value ; comment

[section value]
key1 = 日本語 ; comment

$ php test.php
Array
(
    [section] => Array
        (
            [key1] => var space
            [key2] => value; 1
            [key3] => value 2
            [key4] => value ;" value
            [key5] => value1 value2
            [key6] => "value ; comment
        )

    [section value] => Array
        (
            [key1] => 日本語
        )

)

拡張(縮小?)parse_ini_file()関数

/**
 * parse_ini_file extension
 *
 * @param string $file
 * @return string[]|false
 * @access public
 */
function parse_ini_file_ex($file){
    if (!$lines = file($file, 1))
        return false;

    $res  = array();
    $curr = & $res;

    $sectionPattern = '/^\[([^\]]+)\]/';
    $linePattern   = '/^\s*([^=\s]*)\s*=\s*"?(.*?)"?\s*(?:;.*)?$/';

    foreach ($lines as $line){
        if (preg_match($sectionPattern, $line, $m)){
            // セクションの判断
            $res[$m[1]] = array();
            $curr = & $res[$m[1]];

        }elseif(preg_match($linePattern, $line, $m)){
            // キーと値をまとめて解析
            $curr[$m[1]] = $m[2];
        }
    }

    return $res;
}
  • trueや定数を判断しない(以前noの文字列が取れなくてハマったことがあったので・・
  • 英数字以外でもダブルクォーテーションで囲む必要は特にない(互換性のため、あっても構わない
  • key = "value1;value2" ; comment とすると ;value2" ; comment がコメントとしてスルーされる(値はvalue1


正規表現の部分を使いやすいように適当に変更するといいかも。
ぱっぱと書いたのでバグがあるかもしれないが・・それはその都度対応で。

グローバル関数

ネームスペース代わりのクラス、例えば

if (!LaizUtils::file_exists($path))
    return false;

みたいにやった方がいいのかな。


関数が増えてきたら標準関数拡張用クラスを作ってみようか。。

parse_ini_file()

単純な関数でも意外と知らないことが多いな・・。
parse_ini_file()はinclude_pathを見ないのね。


ということで http://d.hatena.ne.jp/hawkring/20050617/1119009631 を参考に include_path を考慮したparse_ini_file()を用意しようかな。
今となってはparse_ini_file()のような動作をするものは必須だ。
ついでに形式を拡張したい。

[section1]
key = value

[[subsection1]]
key = value

[[subsection1]]
key = value

みたいな・・何とか直感的に分かるように配列を二重にしたい。

Debianでのpearのインストール先

hawklab.jp
分かり易いなぁ。


Mapleをインストールしたらmapleコマンドが/usr/bin/にインストールされた。
なんでこんな場所にって思ったけど、パッケージで指定してあるんじゃなくてDebian特有なのね。。