PHPはじめた

仕事でPHPを使い始めたが慣れてないので非常に苦労している。特に変数名に$付け忘れたり、変数名をタイポしたり等が多い。eclipseとかIDE使えばもっとはマシになるんだろうけど。本当に初心者くさい間違いでイライラしつつも、大学でC言語を始めた時の感覚を思い出してちょっと懐かしいw。「うがー!『セグメンテーション違反です』って何よ!?」的な。ちょっと違うか。

作っているのは、研究室で行った調査研究のデータを開示するためのWebアプリ。PostgreSQLのデータベースに入った約3500人分のデータから

  • 集計(単純集計やクロス集計*1など)
  • グラフの作成

をしなくちゃいけないんだけど、そのためのグラフのモジュールをフルスクラッチなう。現時点での要求(教授による要求は増えるばかりorz)を簡単にまとめると

  • クロス集計表の結果に対応するグラフ
    • 集計の対象となる変量が選ばれていない状態のグラフ*2
      • 帯グラフ
      • 棒グラフ
    • 集計の対象となる変量が選ばれている状態のグラフ*3
      • 度数分布図
      • 箱図(パラメトリックな統計量を元に作図)
      • 箱ひげ図(ノンパラな統計量を元に作図)
      • 一次元の散布図
  • 2つの変量に関する相関図(二次元の散布図)
    • 回帰直線の図示(※)
    • グラフ上に回帰直線の方程式を表示(※)
    • グラフ上に相関係数を表示(※)
    • グラフ上に以下の信頼区間を図示(※)
      • 等確率楕円
      • 回帰直線の信頼域
    • Y縦の変量の中央値つないだ滑らかな曲線を図示(※)

みたいな感じ。Excelのピボットは行方向と列方向に変量を指定できるけど、それに加えてページ方向にも指定できるようにしろとのこと。各グラフはパラメータいじってカスタマイズできるように。(※)は表示/非表示の切り替え付き(各グラフのパラメータでフラグ的なものを持たせる?)で。教授からの要求は順調に増殖中で仕様が固まらない(´・ω・`)。グラフの種類も今後増える可能性大。回帰直線の傾き・切片、相関係数などは、その計算方法にいろいろバリエーションがある。相関図での中央値の滑らかな曲線は、例えば横軸に年齢を選んだ時に、Y軸の変量の大まかな年齢変化を可視化するためのもの。フリーで公開されている既存のグラフ用ライブラリ(JpGraphやPHPlotなど?)で、これらの要求を満たせるかと考えた時に、ダメっぽいなーとの結論から、gd使ってグラフのモジュールを自分で作ることに*4

んで、今直面している課題を挙げてみると...

課題1. グラフの描画に必要な情報を受け渡しする方法

PHP間で受け渡しすべき、グラフの描画に必要な情報には以下のようなものがある。

  • グラフの元になる数値
  • グラフの種別や様々なオプションの情報
  • 変量のメタ情報
    • 変量名等
    • 色やペンやブラシ等
    • カテゴリのメタ情報(変量がカテゴリカルデータの場合)

などなど(まだ流動的)。PHP間でデータをやり取りするには

  • POST
  • GET
  • SESSION

などがあるということは既に勉強したけど、それぞれ用途が分かれているのだろうから、まずそれらの勉強をすべきだろうな。あと、文字列としてではなく、PHPの変数が保持しているバイナリデータそのまま受け渡しできたら良いなーとか。

PHPで、あるクラスのインスタンスをバイナリのままPOSTで違うPHPに投げて、そのまま投げた先に遷移したいッ!したいッ!したいッ!

http://twitter.com/yagiey_tw/statuses/11676300259368960

門外漢の僕にとって、データのやり取りは謎が多すぎるな。もっと勉強が必要だ。

http://twitter.com/yagiey_tw/statuses/11698262083899392

PHPによるデータのシリアライズ/デシリアライズに関してもちょっと調べよう。

http://twitter.com/yagiey_tw/statuses/11698433609965568

みたいに、疑問などをだらだらツイートしてたら、次のような非常に有用な返信を頂いたり。ありがたやありがたやー。

@yagiey_tw serialize して POST して、受け取って unserialize できるかもしれないですが、相当まじめにサニタイズしないとやばいかも。あんまり手間が減らないかもしれないですね。

http://twitter.com/meso_oishi/statuses/11681758881783808

@yagiey_tw でも、なんとなく、session 使う場面なのでは? という気がしているのですよねぇ...。

http://twitter.com/meso_oishi/statuses/11690372140892160

@yagiey_tw JSON形式で渡せば、渡した先でオブジェクトにも連想配列にもなりますよ http://php.net/manual/ja/function.json-decode.php

http://twitter.com/mikage014/statuses/11703283198459904

ありがたく勉強のネタにさせて頂く。なんとなく最後のJSON形式が良いような気がしている(←いまここ)。
Webプログラミングはほとんど初めてなので、分からないことが分からない状態だ。1月7日の会議(かなんか)でデモしたいから、あと1ヶ月でプロトタイプ仕上げろと上司(教授で自称プログラマ)に言われている。

課題2. 描画処理の詳細について

極論してしまえばグラフは

  • 点(小さな円や四角形の塗りつぶしたもの)
  • 領域塗りつぶし
  • 文字

の組み合わせなので、グラフを描く上で当然ながら

  • 線を描く
  • 領域を塗りつぶす

などは頻繁に行うはずだ。その際に

  • ペンのスタイルの指定(線を描く時)
  • 塗りつぶしパターンの指定(領域の塗りつぶしの時)

ができるかどうか。この辺のことは僕はC#では慣れているけど、どこまで自由にできるのだろう。そして願わくばそれが簡単にできてほしい(超重要)。これらに関しては要調査だな。

ぼやきとか

納期的には特に問題ない(たぶんw)んだけど、僕一人だけで開発するのではなく、教授の学生さん(プログラミングは全くやったことがない2人)にもPHPを教えながら、開発に関わらせつつやれとか意味不明のことを言われていて本当に困っているところ。自分も分かってない上に、プログラミング未修の人を教育しながら開発させろとかどんな苦行なんすか。勘弁して下さいよ... (´・ω・`)
あと、PHPが本当に使いづらい。これは自分が慣れ親しんでないものに対する不平なので、慣れれば解決するのかもしれないけどな。上記の「グラフ描画に必要なデータ群」ってのはクラス作ってやってるんだけど、PHPオブジェクト指向が良くわからん。値には型があるけど変数には型がないというPHPで、interfaceをimplementsできたり、abstract classをextendsできたりする意義とか。ダックタイピングできるじゃんよ的な。そんなことをツイートしたら

@yagiey_tw PHPはテンプレート言語なので気にしないでください:-P

http://twitter.com/omasanori/statuses/11632582898753536

なる返信がw この返信の真意も良く理解できてないけど。テンプレートに関しては「デザイナとプログラマが仲良くやっていくための仕組み」とかは聞いたことがあるけど、実際使ったことないなぁ。
PHPを書く人が見ると、JavaC#のようなクラスベースのオブジェクト指向で凝り固まった感じのPHPらしくないコードになってしまっている可能性大だが、そんなの気にしない。

ってことで

仕事でプログラミングできるって幸せだなー。楽しいなー。PHPに限らずWebプログラミングに関係することも知っといた方が良いのは当然だと思うので、この機会に頑張ってみる。
プロの開発者になりたかったなぁ...。今でも間に合うかなぁ。

*1:Excelでいうところのピボットテーブル

*2:Excelのピボットで「値」を選んでない状態に対応するグラフ

*3:Excelのピボットで「値」を選んだ状態に対応するグラフ

*4:「gdを有効にしてくれ」と大学のメディア基盤センターに数ヶ月前から再三申し入れているのに、まだサーバでgdが動かない状態。今はローカルにXAMPPとPostgreSQLを入れて構築中。