PHPであるが、「ソースコードパクってきていじって使う」程度しかしたことがない。
しかし、Flexをクライアントにした際のサーバーサイドにPHPを使わざるを得ない状態なので使っていたのだが・・・。

リリース環境は Windows OS で SQL Server を使える業者のホスティングサービスを利用することになった。
で、テスト環境から移したらいろいろとトラブルが・・・。

まず、PHPの問題ではないが、SQL Server Management Studio を使ってサーバーのDBに接続するのだが、契約先の仕事場からやると全くつながらない。その会社のファイヤーウォールで接続を許可していないためだ。やむなくこれは自宅から。

さて、本題のPHPでのハマリどころ。ホスティングサービスの契約ではサーバーのPHP.iniを触ったりはできないし、ドライバをインストールしたりもできない。というか、そもそもそんなところにアクセスできないのだ。
で、開発環境は好き放題いじっていたので、その設定関係で・・。

[SQL Server にアクセスできない]
なんか反応ないな、と思っていたら SQL Server Native Client がインストールされていないのか、ドライバがない、というエラーが出ていた。開発環境はPHP 5.4.3に対し、本番環境は 5.2.xである。
何か手はないか調べたが、odbc_から始まる命令ではなく、mssql_から始まる命令が使えるそうだ。PHP 5.3 以降では WindowsのPHPからは外されたらしい・・。
こいつに書き換えて、なんとかアクセスはできるようになった。

[SQL Server の文字が化ける]
SQL Server 更新前と取得後に mb_convert_encoding命令でエンコードをしていた。が、全然ダメ。いろいろなサイトを見ていると
 ・mssql_の関数はShiftJISでしか返さない
 ・接続時にエンコードを指定すると直るらしい。が、mssql_の関数にそんなパラメータはない
 ・漢字の値の前にNをつける( hoge = N'ほげ' って感じ)でいける
など・・。一時的に「exeを叩いて、そちらからさせるか」と検討し、実際に作り始めたものの、Delphiではちょっぴり挫折。CoCreateion?がどうたらってのが・・。
しかし、解決の糸口は意外なところにあった。mb_convert_encoding のパラメータにmb_http_output() という引数を使っていたのだが、「決まり文句のおまじない」だと思っていた。しかし、気になって調べると「そこの環境で指定されているものを使う」そうだ。
phpinfo()で確認すると、開発環境は UTF-8に対し、本番環境は pass となっていた。よってmb_http_output() を 'UTF-8' に書き換えてやったらうまくいった。

[サーバーからの返却文字列が欠ける]
サーバーからの返却文字はJSON形式を使っている。FlexでJSONの解釈はラクだからだ。JSONはPHP内ではなくSQL Server のビューで編集してPHPからスルーパス。しかし、この文字が途中で欠ける。調べると255文字くらいまでは返っていた。
phpでそんな設定はないらしく途方に暮れそうになったが、vharcharだと255で切れるらしいとのこと。これも開発環境では問題なかったのでPHPのバージョンによるのだろう。
SQL Server のビューで、JSONにしている部分をcastしてTEXTにすれば解決した。
TEXT型はいずれSQL Serverでサポートされなくなるものらしい。で、nvarchar(max)はどうか、というと、これだとだめらしい。ntextもだめ。TEXTでやるしかなさそうだ・・。



知っていれば瞬殺なんだろうけれど、2つめの解決までに10時間ほど、最後の一つは結構早く解決したのだが、トラブルにしてやられた感じだ。勉強にはなったが、結構疲れた・・・。


「Webでのアンケートサイトを作りたいんだけど」と仕事場で相談を受けた。全国にある特定の法人にIDを渡して、それでログインしてもらって回答してもらうもの。昨年、同様のアンケートを行った結果を表示し、変更がないかも確認しながら入れたいらしい。
少し前に社内のシステム部署に依頼したところ
 ・データを取ってきて入れ込むなんて無理。
 ・ブラウザは限定(これは運用して初めて発覚したとか)。
と、余計な手間(つまりは人件費)が結構かかってしまったとか。

外部のサービスも検討したそうで、それならそれでやってもらえればいいやと思っていた。が、なんか思惑と違うらしく、とりあえずサンプル作成をしてみることにした。

じゃ、Flex使ってみよかな、と思い、着手した。趣味でテスト的/実験的に作っていたことはあったが、今回は納期もある、初の仕事上のものだ。
まあ、ひっかかることひっかかること!大きくはFlex SDK のバージョン(大きくは 3 と 4)の違いによる記述の違いなのだが、予備知識がないとかなり手こずる。
例えば
・mx系のコンポーネントとspark系のコンポーネントがあることを知らなかったことの混乱。
・MXML関連の記述の仕方が謎。
・画面遷移ってどうするの?
・サーバー側のswfを入れ替えても、ブラウザで[Ctrl]+[F5]を押しただけではswfモジュールは再読み込みされないみたい。
などなど・・。

とりあえず、ログインボタンでサーバーのCGIを呼び出し、認証OKなら画面遷移するところまではできた。

ただ、
・ID認証でリターンコードだけ返しても、どうせ組織名等も取るんだから併せて返したい。
という欲が出てきた。
CGIとやりとりする中で、データクラスなんかは使えないだろうから、サーバーへのリクエストも、サーバーからの戻りも、JSONを使おうかと検討している。


このままでは正月がなくなりそうな・・。




------
VBAでシステムを作る際の考慮点 その7


今回の壁はこれ。
 ・OSやExcelのバージョンが変わったら思い通りに動かなくなった。

これは、悲しいかな、特効薬的なものはないようだ。合わせるしかないと言わざるを得ない。多い事象は
 ・シートに貼っていたオブジェクトがずれる。
 ・シート上のオブジェクト内の文字のレイアウトが崩れる。
 ・参照しているライブラリがない。
など。昔は
 ・処理の挙動が変わってしまった
ということもあった。Excel 5 から Excel 95 へと変わった時だが、文字列関係の関数 LenB, LeftB, RightB などの関数の結果が違ってきたことがあった。最近はそういう困ったことはないようだが・・。

しいて言えば、対策は「ワークシートにオブジェクトを貼らないようにする」くらいか。リボンやツールバー(2003以前)を使うのもいいのかもしれない。

最近では、VBAを動かくための環境設定が必要だったり・・。自身で配布するものは電子署名をつけた方がよいのかな?と考えているところでもある。