CSVで書き出す関数fputcsv

2009/10/31 | PHPの基本

CSVファイルを取り扱うのに便利な関数にfgetcsv、fputcsvがある。CSV吐き出し機能が欲しかったので、fputcsvの仕様を検証してみることにした。マニュアルではこんな具合に書かれている。

int fputcsv ( resource $handle , array $fields [, string $delimiter [, string $enclosure ]] )

マニュアルによると$delimiterは1文字でなくてはいけないらしい。だから$delimiterに2文字以上の文字列(例えば「<>」)を指定するのはNGらしい。同様にタブを「\t」と指定するのもダメらしい。この場合はchr関数を使ってchr(9)と記述しなくてはいけないらしい。1バイトってことかな。$enclosureも同様。

この関数で便利だなと思ったのは、配列内の値にエスケープすべき文字列(「,」と「”」)が含まれているとき、うまく取り計らってくれることだ。それらの文字列が入っていると、自動的に「”」で囲み、「”」の場合はエスケープまでしてくれる。これはとても便利。でも、不便なのは、エスケープすべき文字が入っていない場合は囲み文字で囲んでくれないということ。個人的には数値以外は全て囲んで欲しいのだが、そういう意見は少ないのだろうか。

でもまぁ便利。使ってみることにする。

グラフ描画ももはやAPIでOK

数年前まではPHPでグラフを描画させようと思うと相応の苦労が必要だった。自前で美しいグラフを描かせるのにはかなりのステップ数のプログラムを書かなくてはいけない。必然的に先駆者のお知恵拝借でライブラリをさがすことになる。その次に日本語化。日本語フォントファイルをIPAあたりからダウンロードしてきて試行錯誤してみたり・・・。

最近、グラフを描かせる必要性に迫られてウェブで検索していると、もはやRESTで呼び出すだけでグラフを描画してくれるサービスがあることに驚いた。

Google Chart API

RESTで呼ぶだけだから、プログラムの必要性もない。パラメータは引数で渡すだけ。しかも日本語も通る。2年ほど前から公開が始まっていたっぽい。グラフの種類も10種類くらいあるし、QRコードの作成までOK(これでQRコードのプログラムさえ必要なくなる)。見栄えも相応に美しいし文句のつけようもない。

こうしてみていると、かつて「ウェブ上で実現するのが難しく相応の技量が必要だったこと」ということが、誰でも間単にできてしまうようになってきた。敷居を下げるという意味では大変有意義なことではあるが、当然試行錯誤することがなくなるわけで、それだけプログラムの技量を磨く機会を失いつつあるということに少し危機感を感じる。

15年も前だとウェブプログラミングが一般的でなかったし、フレームワークもなかったし、わかりやすい書籍もほとんどなかった。何でも一から書かないといけなかった。今から思えば試行錯誤の連続だった。状況は急転している。今でも生まれつき優秀なプログラマはたくさんいるだろうけど、そういう人はいつの時代に生まれてもやっぱり優秀なんだろう。でも自分のような普通のプログラマは、相応に学習する機会に恵まれないと(嫌でもやらざるを得ない状況に追い込まれないと)、そこそこのプログラマにたどり着けないような気がしてならない。まさしく両極化だ。

いいライブラリに出会えたけど、考え事も増えそうだ。

Smartyでpreg_matchエラー

Smartyを使っていてこんなエラーが出た。

PHP Warning: preg_match() [<a href=’function.preg-match’>function.preg-match</a>]: Compilation failed: repeated subpattern is too long at offset 18454 in /library/smarty/Smarty_Compiler.class.php on line 454

たしか以前もこんなエラーに出くわしたことがある。確か、そのときは「PHPのバージョンが古いとpcre関連でバグがある」というような理解で終わったと記憶していた。そのときの解決策までは思い出せないが、エラーメッセージを見る限りでは正規表現のパターンの長すぎが原因のようだ。

しかし困ったのは、このエラーがSmarty内部で発生しているということ。ライブラリの中身なんて修正したくない(だって他のところでは動作しているのだから)。よくよく調べたらこのエラー、Smartyのバージョンを落とすことによって回避できるらしい。きっとバージョンが新しくなり、正規表現で記述していたパターンが長くなってエラーが出たのだろう。

エラーが出たバージョンは2.6.21だった。調べた結果によると、2.6.20と2.6.21がちょうど天と地の境目のようだ。早速2.6.20をダウンロードしてみたら見事解決した。よかった。ていうか、レンタルサーバ会社のPHPのバージョンが低いせいだよね、きっと。

ドコモでGoogle Static Mapsが時々表示されない

2009/10/21 | ケータイ

表題のとおり、ドコモで携帯サイトに埋め込んだGoogle Static Mapsが時々表示されないという、個人的にはとても深刻な事態に陥っていた(ついさっきまで)。その原因が、今やっとわかった。他にも同じことで悩んでいる人がいるかもしれないので、メモしておく。

ウェブで調べると「アクセス数の制限にひっかかってエラー画像が表示される」というのが多数を占めていた。今回のドコモでの検証の場合はエラー画像ではなく、リンク切れなどの際に表示される[x]が表示されてしまっていた。そして不思議なことに再読み込みを繰り返しているといつしか読み込めるようになり、一度読み込めるとその後は大丈夫になる、というなんとも奇妙な現象だ。

原因を知りたくて、ドコモで数十回アクセスしてみた。IPの制限かも、と思い、エラー時と正常時のIPアドレスなんかも記録してみた。しかしいったんエラーが出ていたにもかかわらず、別の地図を呼び出した際は正常表示される、といったことがわかった。つまりイレギュラー。エラーが出た場合に、直接画像にアクセスしてみたりもした。そうすると文字化けテキストが列挙された(何らかのエラーなんだと推測できる)。

そして調べてわかったこと。必要なパラメータが指定されていなかった。そのパラメータは「sensor」。マニュアルを熟読すると、このパラメータはGPS等のセンサーを使用していて位置出ししたときはtrueを値とし、センサーを使用しなかった場合はfalseを値として持たせる、しかも必須、と書かれている。おそらくGoogleにとって、物理的には何の確証も必要性もないデータではあるが、とにかく必須ということらしい。

今まではsensorの意味がわからなかったので(マニュアルをしっかり読んでいなかっただけなんですけど)、必要性も感じず使っていなかった。でもって、エラー頻発のところにこのパラメータを付け加えてみたところ、うそのようにちゃんと表示されるようになった!。秀樹感激!(古い)。たったこれだけのことに数ヶ月悩んでいたのかと思うと少し悲しいけど、ようやくすっきりした。

ちなみにドコモで表示された文字化けメッセージ(画像を直接ブラウザで呼び出す)では、最初に「臼NG」とかいてあった。「多分NGなんだろう」という意味だと思っていたけれど違った。最初の部分が文字化けしていて、(1byte)PNGらしい。つまりPNGのエラー画像が返されていたのだけれど、ドコモの端末ではPNGが読めなかったので、リンク切れのような形で表示されていたのだった(そんなに古い機種じゃないんだけど)。

教訓:マニュアルはちゃんと読みましょう。

携帯でCSS

2009/10/19 | ケータイ

最近は携帯でもCSSが使うことができる。もちろん前から使える機種は増えているわけだが、最近はほとんどの機種が使えるっぽい。うちでは基本的に3キャリアを常備しているが、どれも問題なく表示できているようだ。

しかし、いざ自分でコーディングしてそれぞれの端末で見てみると、なぜかドコモだけNG。なにをどうやってもだめ。文字サイズの変更をしてみたのだが、何を指定しても変化してくれない。なぜ?。

人から聞いたのだが、ヘッダが必要とのことだった。headタグではなくて、httpヘッダが必要・・・。ほんとにそんな面倒なんだろうか。とりあえず調べるのが面倒。ということで教えてもらったヘッダをつけてみた。

header(‘Content-Type: application/xhtml+xml’);

おぉぉ、CSSが反映された!。

と、ここまできてからウェブで検索してみた。ke-tai.orgさんに情報があった。

  1. iモード用のXML宣言、DOCTYPEを付ける
  2. CSSは外部ファイルにしない、ヘッダ部にも書かない
  3. 拡張子を「.xhtml」にする ※別の方法もあり

まじっすか。いろいろうるさいみたい。でもこの3つを守ればCSSが反映されるんだったら、HTMLだけで問題なかったわけか。勉強になりました。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net