読者です 読者をやめる 読者になる 読者になる

vs波ダッシュ

いわゆる『波ダッシュ問題』につまづいてムキー!ってなっているブンです。わりと前から戦ってるけど、いまだ良策と言えるものが浮かばない。困ったモンだ。

Windowsで編集した後に化ける

サーバー上にあるファイルの中身確認したら正常じゃないですか。

編集したくてローカルにダウンロードしてくるじゃないですか。

エディタ使って編集するじゃないですか。

サーバーにアップロードするじゃないですか。

はい化けた!!!

文字化けしているのはWebブラウザでの表示(IEとEdge)、そして編集したファイルの中身…

Webブラウザで表示する際の文字化け対策

とりあえず実体参照~で指定してしまえば、IEでもEdgeでも「~」が正常に表示されることを確認。

波ダッシュ(通常、「から」で変換して出てくるやつ)だと化けやすいということなので、気持ち悪いけど全角チルダのほうで統一してみようとちまちまやって、みて、いる。

けど問題がある。

ファイルの中身が化けているということは、Webブラウザに出力する処理以外の部分も化けちゃってるわけでして!

ファイルの中身が化けるのはどうしたらいい?

これについての良策が見えない。どうしろと?どうしろと!?

ようするにコメント部分やCSV出力処理で使用している箇所なんかもバケバケしているわけですヨ。でもこれを実体参照にしてもしょうがないわけですヨ。

サーバーからダウンロードした直後は問題ないことを確認した。つまり編集作業に使っているVisual Studio Codeがなんか余計なことやっとんのだな…NetBeansでも同じことが起こっていた。IDEの共通なの?共通の挙動なの???

サクラエディタで文字化けしている箇所の検索も波ダッシュへの置換もできて、それをFTPソフトでアップロードしたら正常でしたん。

なのでとりあえずは波ダッシュだけサクラエディタで直して…と非常に回りくどい方法をとることにした。

なんかいい解決方法ないモンかなあ!(できればIDEは使い続けたい…いろいろ便利…)

Visual Studio CodeからFTPアップロード

いちいちFTPソフトで階層移動しながらファイルをアップロードするの、めんどくさい!(切実)

Netbeansではファイル保存時に自動アップロードとか設定してた。自動アップロード、便利。Visual Studio Codeでもやりたい。やれる?(検索ポチポチ)

拡張機能あったーーーーーー!!!(ガッツポーズ)

ありがとう、ありがとう製作者の方…

ftp-syncの使い方

普通にVisual Studio Codeの拡張機能からインストール。適用したら、今度はコマンドラインを Ctrl+Shift+P で起動。

Ftp-sync: Init

このコマンドを実行すると、ftp-syncの設定ファイルディレクトリが作成され、設定用ファイルが自動的に開かれる。

あとは必要な項目を必要なだけ書き換えてしまえば準備おしまい!

設定内容が間違ってさえいなければすぐ使える。

ファイルの保存時に自動アップロードする設定の項目(uploadOnSave)もあるから、これを true にしてサクサク自動アップロードにしてもいいし、ファイル一覧からファイル名右クリックしてもアップロード実行可能だから false にしててもいい気がするネ!

階層移動しなくていいの、めっちゃ楽!

まったく関係ないことだけど

今回、画像も貼り付けてみようと思ったけど「未対応のファイル形式です」って弾かれたん。なんでやねん…

vs文字コード

ブンのローカル環境や実際に動かすWebサーバー上では問題ない。でも別の人のローカル環境だと文字コードの関係でテストコードでエラーが発生する

と、いう問題にぶち当たって脳が死にそうだった数日前…文字コードなんてキライ…

なんとか解決にこぎつけたので、メモメモ。

原因になっていたのはmbstring関数

まあ、あるあるだよネ?

ていうか文字コードが文字化けして問題が起こるのってだいたいこれ絡みじゃなかろうか?違う?違ったゴメン。

ブンはmb_convert_kana()を利用して、全角スペースを半角スペースに変換する処理を入れていました。それからtrim()で余分なスペースをカットしようというのです。

さらにそうした後、特定の1文字だけの入力であった場合はエラー!

と、したかったのですが、これが上手く引っかからない。引っかからずスルーして「エラーはないよ」って結果を返してしまう。

ぼんやり、「文字化けしたせいで別の文字判定受けてるんだろうなー」ということは理解。相談に乗ってくれた人がハッシュ値というものを出力して確認してくれて、やっぱり変に変換されてベツモノになってしまっている、ということが確定しました。

ハッシュ値…とは…(ま、また別途勉強しときマス…)

mbstringにはデフォルトの文字コード設定がある

知らんかった(ドーン

mbstring.internal_encoding

これネ、この設定。これ自体は知ってるし、内部文字エンコーディングという言葉も知っていた。でもそれが意味するところを分かっていなかった。これが敗因か…!

内部文字エンコーディングって、単純にmbstring関数で文字コードの指定がない場合(デフォルト)に使用する文字エンコーディング設定らしい。

ブンのローカルphp.iniはEUC-JP。で、別の誰かさんは…UTF-8とか多分その辺だったのでは。(確認はしてないけど)

だからようするに、mbstring関数で処理したくて渡した文字列の文字エンコーディングを関数の引数で指定してなかった場合、内部文字エンコーディングの設定値で文字列が処理されるのだ、ということ、のようだ。

へえ、へえ…それで実行する環境によって化けたり化けなかったりするわけだな!

ということで修正

PHP公式マニュアルをチェック。

string mb_convert_kana ( string $str [, string $option = “KV” [, string $encoding = mb_internal_encoding() ]] )

最初の$strつまり処理したい文字列以外は省略可能。で、ブンは…

mb_convert_kana($str, 's')

という形で記述していたわけです。(’s'は全角スペースを半角に変換する指示オプション)

これを、

mb_convert_kana($str, 's', 'EUC-JP')

こうじゃ!

はい、これで環境に左右されずに(自分のローカルphp.iniをUTF-8に書き換えたったヨ)エラー判定が正常に行われました…めでたしめでたし…

ちなみに、指定文字エンコーディングは、ブンが扱っているプログラム群のファイルが基本EUC-JPだからこうしているだけで、UTF-8のファイルだったならUTF-8でいんでないかな?

WindowsでPHPUnitを使う

ネットワーク上にアップロードして動作テストももちろん必要ですけども、ユニットテストはローカル環境(ていうかDBに繋がらない環境)でやってエラーが起きないようにすること…という方針。らしい。

その根拠はブンにはよく分からないんだけども。でもまあ、あっちこっち依存しまくりの現状はやっぱりよくないんだというのは、なんとなーく分かる。

今までずっとサーバーにアップロードしてテストばっかしてきたブンも、とうとうローカルでPHPを実行できる環境を構築する時がきてしまったのだ…

構築する環境の条件は以下の通り。

PHPPHPUnitは実際に動かすWebサーバーのバージョンになるだけ合わせようとしているため、現在リリースされているものより若干(?)古めです。

ローカル開発でどんなツールを使う?

まず考えるべきはこれだよネ。なにを使うかによって用意するものって変わるからネ。

  1. Netbeans
  2. Xampp
  3. Visual Studio Code

ブンが候補として考えたのはこの3つ。

Xamppは他2つとはアプリケーションとしての種別が違うんだけど、『PHPUnitを動かせる環境』ということで調べていたら引っかかってきたのでした。これ使うんならなにか別にエディタを考えたほうがいいかな、くらいに思っていた。大丈夫、初期はLinux上でemacsとかviとか使ってたからどうにかなるなる。

Netbeans

バージョン管理システムが開発フローに導入された当初、まずそのシステムがよく分からなくて、新しいコマンドを覚えられる気もしなくて、その辺カバーしてくれそうなNetbeansを頼ったのです。最初はsvn、その後gitに移行したのだけど、大きなストレスなく移行できたのはとても有難かった…

もう1年以上これを使って開発続けていたので、このまま続行できれば一番だった、ん、だけど、ネ?

PHPUnitが使えることは突き止めたものの、どうしても動かない!「実行したテストはありません」って出る!設定はできてるのに!

どうもアプリケーション側のバグっぽかったんで、バージョンアップしたら直る、かも、しれない。

でもNetbeansのバージョンアップって、新しいバージョンを別に入れて設定し直すってやり方らしく…「それならいっそ別のツールを視野に入れてみようか」ということで、次へ!

Xampp

名前だけはよく聞いていたモノ。WindowsPHPやる場合の定番仮想環境、というのかな?

有名なものみたいだしせっかくだから入れて触ってみた。

ん、んー…んん…

すまない、Linuxコマンドに慣れ切ったブンにはcmdコマンドであれもこれも操作するのは、ちょっと、だいぶ、めんどかった!

ハイ次!!

Visual Studio Code

Netbeansの代わりにとオススメされたもの。

Netbeansより軽いというのは魅力的。ただ、Netbeansと違いWindowsにgitをインストールする必要がある。「gitがインストール済みであることが前提」っ て書かれた解説ページ多くて「???」となった、頭の弱いブン。

別途『Windowsにgitをインストールする方法』を調べて、とりあえず以下を入れてみた。

TortoiseGit使ったのは、最初のcloneだけでした…後はGitインストールしたらついてきたGit Bashでなんとかなったヨ。これLinuxライクでコマンド打てるから助かる~!

最近gitコマンドを打つ機会も増えたから、簡単なのは覚え始めたのです…cloneも分かったのでTortoiseGitもうなくてもいいかな…今度アンインストールしとこう。

そしてVisual Studio Codeをインストール

cloneしてきたプログラムのディレクトリを読み込んで、開いて、文字コード設定いじって(ファイルはEUC-JPなので)、試しに内容を変更してみたりして。

おお、おお…悪くない、というか結構イイ感じ!?

ちょっとこれで進めてみようー、ということで、Visual Studio CodeでPHPUnitが実行できるようにするヨ!

PHPUnitのインストール

まあこれは実はNetbeansでアレコレやってる時に済ませてしまっていたのだけど。

今回は流れだけで詳細は省き!メモメモ!

  1. PHP公式からWindows用の5.6パッケージをダウンロード
  2. 適当な場所に↑を解凍(ブンはC:\phpにした。迷子にならない、大事)
  3. システムの環境変数PATHに設置場所へのパスを設定
  4. PHPUnit公式から4.8をダウンロード
  5. 適当な場所に設置(これもC:\phpunitにした)
  6. 公式マニュアルを元にphpunit.cmdを作成
  7. phpunit.cmd --versionコマンドプロンプトから叩いたらバージョン情報が表示され、た!

これでPHPUnitの準備はオッケー…?

PHPUnitVisual Studio Codeで使う

拡張機能があった。いいネ、分かりやすい!

PHPUnitという拡張機能をインストールして有効化、そしたら設定をオーバーライド。

"phpunit.execPath": PHPUnitプログラムのパス

必須なのはこれだけかな?

実行時の設定ファイル指定とかあるなら、

"phpunit.args": [ "--configuration", "設定ファイルのパス" ]

とか書くといいみたいだヨ。

ブンはサーバー側で使っているphpunit.xml.distをそのまま持ってきて指定した。

Visual Studio Codeはテストを実行するためのメニューとか分かりやすいボタンとかない。でもテストファイルのクラスやメソッドにフォーカス合わせてコマンドパレットというところにphpunitと打つと、そのクラスまたはメソッド限定でテストが実行されるらしい。しゅげー!

あ、動きました、ちゃんと動いた。想定外なエラーは吐きまくってたけど。

エラーの原因は?(オマケ)

ここから先はブンのところの環境に依存しまくった話である。

includeファイルが全文ぺろっと表示される!

これに一番時間を使ったわけだけど、もうどうしても分からなくてひとにすがってみたら、

「それショートコードが許可されてないからですよ、php.iniいじってみてください」

「!!!」(ブンの馬鹿っぷりが露呈した瞬間)

ま、マジかー、マジだったー…

ショートコードってphp.iniで許可設定とかされてるものなんですネ…これまでiniいじる機会ほとんどなかったから知らなかったヨ…

一部のincludeファイルが読み込めない!

これはすごく単純な話。

gitで管理されていないファイルが指定されていた。

テスト対象プログラムで読み込んでるPHPのライブラリとか、テストプログラムで読み込んでるサーバー側でcomposer実行してインストールしたものとか…空ファイル作って対処。

mb_convert_kana()が存在しない!

これは!ブンにも分かったヨ!

php.iniでmbstring絡みの設定を変更したらいけるんでしょ!?(いけた)

DB接続するグローバルファンクションがある!

あー…あーーーーーー…

ダミー定義するしかないよネ? でもクラス定義がなくてちょっと前に教えてもらったモックオブジェクト手法が使えないので、どうしようかと他の人に相談しました。

結局、問題のファンクションの前にfunction_exists()による存在チェックを入れて(むしろなかったことが問題)、先にテスト関連のプログラムでダミーファンクション定義してしまうことと相成りました。

日本語が化けてテストがエラーになる!

mbstring系の関数使ってた部分でネ、引っ掛かりましたよネ…

一応解決はできた。けど文字コード面倒くさいよく分からないもう嫌だ…

詳細はまた別途メモしておこう…

頭パンクしそうなので

どうも、ブンです。ほぼPHPでしか開発してない文系プログラマです。

最近なんだか色々ありまして、どばっとたくさんのことを覚えようとして、できなくてイラつく日々です。なにやってるかって、

  • gitコマンドとか
  • Markdown記法とか
  • テストコードとか
  • PHPUnitとか
  • ローカルでPHPUnit動かすとか…

gitはちょっと前からNetbeans利用してなんとかやってたんですけど。今回こいつがPHPUnit動かせなかったので(動いてると思うんだけど「実行したテストはありません」とか言いよった)、Visual Studio Codeに移行しようかなともそもそやっているところ…

とりあえずVSCでPHPUnitを動かすところまでやりました、エラー吐きまくってるけど!

もともと、自分が主に担当しているのはもう10年以上前に組まれたプログラムのメンテで、画面と処理が分離しておらず、あっちこっち依存しまくりなんですよ、ネ…

そんななので、「テストコード???なにそれどう書くの???」状態からテストコードを書き始めてみたものの、ローカル環境で動かせばDBに接続しに行こうとしてエラー…そのエラーの原因がどこのコードなのか探すのにも一苦労、っていうか私はローカルで動作環境したことなかったからまずその環境を整備しなければならなかったのだった。

まだ終わってない。(だってエラー出まくってる)

やだー投げ出したいー

しかし本音がどうあれやらねばならないものはやらねばなのですヨ。

とはいえ、あれもこれも過ぎて自分でもなにがなにやら状態。ブンのキャパそんなに大きくない。せめて得た情報を少しでも整理するために、こういう覚え書き、やってみたらいいかなあ。わりとそういう軽い気持ちです。

すぐ面倒になるかもしれない。自分、そういうとこある。でも、「やろう」と思えばすぐに動けるこの時代、ならばとりあえず動いてみりゃあいいじゃないのネ。

明日はVSCでの開発・テスト環境を整えられると、いい、ナ…