トップ «前の日記(2009-07-08) 最新 次の日記(2009-07-12)» 編集

十日日記


2009-07-11

Link PHPとExcelとUNIXシェルと

ある企業が以前オープンソースとして提供していたWebグループウェアがある。その利用者から、ワークフロー機能のコメント欄で半角コンマを使うと、その文字以降が表示されなくなる、という知らせを受けた。

まずはテーブル設計を確認する。ワークフロー1件に対して1レコードになっていて、A→B→Cと流れるワークフローがあるとすると、1フィールドの中に「{"コメントA","コメントB","コメントC"}」と記録されるようになっている。半角コンマが区切り文字。……先が予想できる展開だ。

次にPHPで書かれたソースを見る。データベースからコメントの塊を取得したあとの処理は、次のようになっていた。

   $cm = ereg_replace("[{}]", "", $cm);
   $j = 0;
   $tok_cm = strtok($cm, ",");

   while ($tok_cm)
   {
       $arr_comment[$j] = ereg_replace("\"", "", $tok_cm);
       $tok_cm = strtok(",");
       $j++;
   }

やっていることは、文字列を分解して配列に入れることだ。分解するときに半角コンマで見境なしに分割するのが問題の原因である。私はPHP経験が浅いので、strtok()を使った例を初めて見た。このソースを書いた人はCの経験者なのだろう。

PHPは配列関数が多く、典型的な作業はすでに定義されている。上のコード片は次の2行で置き換えた。これで、コメント中に半角コンマを使っても支障がなくなる。

   $cm = substr($cm, 2, strlen($cm) - 4);
   $arr_comment = explode("\",\"", $cm);

ところで、この処理は実質的にはCSVファイルの行を配列にすることと変わらない。PHPにはCSVファイルを配列に読み込む関数fgetcsv()がある。引数に文字列をとって同じことをする関数があるかもしれないと思って調べてみたら、案の定あった(ただしPHP 5.3.0以降で有効)。

PHPは便利そうな機能をどんどん関数にする。先週も、mb_strwidth()を知って感心した。マニュアルには「文字列strの幅を返します」とあるが、これでは使いどころがわからない。この関数が効いてくるのは、PHPのソースはUTF-8で書いているが、データベースなど外部環境がそれ以外の文字コード(ShiftJISとかEBCDICとか)で格納される場合だ。外部環境の制約によって文字列が○バイト以内と決まっているときに、単純にstrlen()は使えない。UTF-8では半角カタカナも3バイトになってしまうため、外部環境が想定するバイト数と計算が異なるからだ。実際この関数は、ひょっとしてあるかな、くらいの気持ちで検索をかけて見つけたものだ。なければ自分で用意するわけだが、出来合いのものがあるところがPHPらしい。

こんなふうに、PHPは関数がフラットなレベルで、しかも脈絡なく増大していく。このさまを見て、私はExcelを想起した。Excelもまた、競合製品からの機能取り込みや独自の機能拡張を通じて、わりと脈絡なく関数が存在している。たとえばINDEX()とMATCH()との構文糖であるVLOOKUP()やHLOOKUP()は、Lotus 1-2-3から取り込んだものだ。また、条件付き合計値を出すSUMIF()の引数はSUMIF(条件,範囲)だが、条件が複数とれるSUMIFS()になるとSUMIFS(範囲,条件)と順序が変わる。Excelの人気とPHPの人気とには、相通じるものがあるのかもしれない。

もうひとつ思った点は、この脈絡のなさはUNIXのシェルに通じるということだ。UNIXのCLIのコマンド体系は体系と呼ぶのが憚られるような代物だが、これが味なのだろう。私自身はそれを所与として受け入れてきたので、これまで特に考えずに利用してきた。しかし、IBM OS/400の整然とした体系を目の当たりにして、その合理性に感嘆した。Windows PowerShellの動詞-名詞というコマンドレット命名規則も、この延長線上にあるのだろう。

Tags: Linux
本日のツッコミ(全6件) [ツッコミを入れる]
Link Louis Vuitton Purses How Much (2015-04-09 21:11)

hi and thanks for the actual blog post ive lately been searching regarding this specific advice on-line for sum hours these days as a result thanks

Link Buy Louis Vuitton Online India (2015-04-10 04:10)

Thank you for another excellent article. The place else may anyone get that kind of information in such an ideal approach of writing? I've a presentation next week, and I am at the search for such information.

Link Louis Vuitton Store Opening Press Release (2015-04-10 14:58)

What’s Going down i’m new to this, I stumbled upon this I've discovered It positively valuable and it has aided me out loads. I’m hoping to give a contribution & assist different users like its aided me. Excellent job.

Link Louis Vuitton Speedy 30 Care Instructions (2015-04-10 22:21)

I gotta favorite this site it seems handy quite helpful

Link Louis Vuitton Yelp (2015-04-11 05:56)

Its pretty interesting that the mainstream media has changed the way it looks at this recently dont you think? What used to neve be brought up or discussed has changed. Overall though Im looking for a change.

Link Oakley Store At Mall Of America (2015-04-14 05:22)

I dugg some of you post as I thought they were really beneficial invaluable

[]


プロフィール

渡辺 慎太郎(na@10days.org)

分野別表示

Admin | Client | Dev | Excel | Linux | PC | PDA | Web | iPad | web | 家電 | 文具 | | 英語 | 言語 | | 音楽

月別表示

1999|07|
2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|

最近の記事

雨量情報 dictionary.com Yahoo google Yahoo! 路線情報 東京アメッシュ l-mura l-aka l-momo 目次 r-mura r-aka r-daidai r-kiiro asahi.com nogulabo r-sora r-midori r-midori r-momo