Blogすずな株式会社の開発者が技術情報を発信します。2018-04-23MySQLクライアントに日本語が入力できない理由MySQLこんにちは。MySQLの対話クライアントに日本語(ASCII以外の文字)が入力できない場合、まずは文字コードの設定を確認しますが、文字コードの設定が正しくても日本語を入力できない場合があります。'';となってしまうような状態です。次のように対話インタフェースを利用しなければ日本語が利用できるため、文字コード設定以外の問題が考えられます。Readlineではなくlibeditになっていると、上記のような現象になります。libeditがマルチバイトに対応していないことが原因のようです。コンパイル時に選択できるようです。利用され、日本語入力できません。installしたところこのようになりました。なっているのだと思います。10:39MySQLクライアントに日本語が入力できない理由Tweetもっと読むコメントを書く2017-12-11テストコードを簡単に書くための方法(PHPUnit)PHPこんにちは。最近、改めてテストコードのあるプログラムは強い、と感じます。テストされている、変更による破壊を検知できる、というそのままの意味もありますし、テストが書ける程度にコードが整頓されている、つまり実装間違いが起きにくいコードであるという意味もあります。テストを悪く言う人はあまりいないと思いますが、テストを書けない理由はいろいろあります。その中でも「テストを書いている時間がない」について考えます。場合、テストコードを書いて実行するよりも、アプリケーションを動作させる方が早いかもしれません(本当はそうでもないと思っていますが一般的な感覚値)。テストコードにはそもそもメリットがありますので、ほんの少し余分に時間がかかるだけなら(例えば、5分、10分程度)、テストコードを書いて実行する価値を見出しやすくなります。テストを書いている時間がない、と思う場合、テストを書くと1時間、場合によっては数時間かかりそう、という見込みがあるのではないかと思います。PHPUnitで時間かけずにテストを書くための工夫を紹介しようと思います。PHPだけの空間を増やすPHPの世界から一歩外に出ると途端にテストコードを書くことが難しくなります。テストを書くのに時間がかかります。データベースを使うテストはfixtureの準備が必要だったり、ファイルシステムを使うテストはMockを使うかテスト用のファイルを準備したりする必要があります。PHPの世界だけのコードを実行するテストコードを書くのは非常に簡単です。メソッドを実行(テスト)できます。assertによるテストも重要ですが、実行できることも重要です。プログラマは作ったプログラムをまずは動かしてみたいからです。次にデータベースを使う場合を考えます。}}取得したIDでデータベースから取得して、その値を利用するような処理です。なると一気にテストコードを書くのが難しくなります。いう複雑そうなオブジェクトを把握してMockを組み立てる必要があるこのようにPHPの世界を一歩でも出るとテストコードを書く気が一気に萎えます。解決するには次のようなアプローチがあります。オブジェクトを受け取るようにする)。このクラスに別途定義して単純なMockを組み立ててテストできるようにするどちらも他所に押し付けているだけで根本的に解決していないように見えます。テストが簡単に書けるようになるのです。このメソッドではデータベースから値を取得している方が派手に見えますが、実際には文字列結合が意図した通りに動作しているかも重要なテスト事項です。押し付けられた側では結局データベースを使ったテストが必要になるのですが、できるだけ最後まで押し付けていくと、データベースを直接使う処理がまとまっていきます。そこだけ諦めてデータベースを使ったテストを書くことになるかも知れませんが、他の部分で苦労せずに済みます。PHPだけの空間を増やすことで、テストコードで実行しやすい場所が増え、コードカバレッジも上がります。メソッドの例がそうですが、入力(引数)に対して挙動が確定し、出力(return値)を検証すれば良いコードほど簡単なテストはありません。別の言い方をすると、インスタンス変数によって挙動が変わったり、戻り値以外で動作検証が必要だとテストを書く手間が増えます。プライベートなインスタンス変数はReflectionPropertyクラスなどを利用して操作できますが、テストコード内に準備のためのコードが多くなり見通しが悪くなります。1つのメソッドで複数のことをしないAを渡したらBを返す、のテストを書くのは簡単ですが、例えば、Aを渡したらAを元にループが始まり、ループの中で条件によって処理が異なるような場合、テストコードで網羅すべきパターンが増え複雑になります。}コードだけ見るとこれくらいは許してよという感じもしますが、テストコードを書く視点に立つと次のように見えます。ループするときとしないときがあるループ内に条件分岐があるループ内の条件分岐によって戻り値が変化する1つのメソッドで複合的なパターンを考えなければならないので次のようにメソッドを分けることで、それぞれのテストで考えることを減らすことができます。}一般的に、1つの複雑なメソッドのテストを書くよりも、2つの単純なメソッドのテストを書くほうが楽です。制御構造の中に制御構造、をできるだけ避けることでテストコードの複雑さはぐっと下がります。テストしたいところだけをテストする(Mockをうまく利用する)AクラスがBクラスを、BクラスがCクラスを利用しているような場合、Aクラスをテストしたいだけなのに、Cクラスが動くように準備しないとテストできない、という状況がよくあります。このような場合にはMockが最適です。PHPUnitでは動的にMockが生成できるので、不要なMockクラスを作成する必要はありません。次はFooクラスがUserクラスに依存している場合の例です。}}コード例が長くなるので単純化していますが、FooクラスのテストコードではUserのことを考えなくて済みます。useすら必要ありません。Userクラスが意図した動作をしない場合、このテストでは問題を検知できません。ユニットテストだからと割り切ってあまり気負いせずに書きやすくテストコードを書いた方が良いと思います。Mock化をデメリットとして書きましたが、フレームワーク/ライブラリのオブジェクトをMock化するにはそのクラスをよく把握する必要があり簡単とは言えません。今回のように自分がまさに開発しているコードであれば動作もよく把握しているのでMockの組み立てを簡単に行うことができます。簡単とは言え、Mockを使わずに済むならその方がより簡単です。APIを使うような常にMockが必要な場合にPHPUnitの動的なMockを常に組み立てていると手間が多いので、指定したレスポンスを返すMockクラスを作った方が良い場合もあります。終わりに思いのほか長くなってしまったので、他の方法はまた機会があれば書こうと思います。テストコードの簡単な書き方!ではなく、テストコードを簡単に書くためのアプリケーションコードの書き方ばかりになってしまいました(確信犯ですが)。テストコードのためにアプリケーションコードを変更するのは本質的ではない、という意見もあると思いますが、テストしやすいコードというのは、つまり呼び出し側にとって簡単に扱える優しいコードだと思いますので、結果問題ないと考えています。昔、コードカバレッジ100%を謳う発表をしたことがありますが、目標は高く、というだけで、コードカバレッジのみを目的にする必要はありません。実行したいところをPHPUnitから簡単に実行できる、というスタート地点の克服が大切に思います。10:42テストコードを簡単に書くための方法(PHPUnit)Tweetもっと読むコメントを書く2016-12-05ビデオ会議をハングアウトからappear.inにしたら快適になったappear.inこんにちは。ハングアウトを使っていました。ハングアウトでもどうしても困るほどではありませんでしたが、次の点で不満がありました。通信が安定しないGoogleアカウントについては持っていても利用しているブラウザがログインしていないとすぐ使えない、アカウントを持っていない人を招待できない、など致命的ではないものの不満に感じていました。そこで、検討した結果、appear.inとzoomの二つに絞り込みました。ハングアウトよりも随分快適でした。訪れるとルーム名を入力するだけでビデオ会議を開始できます。当時の解説がありますが、まさに不満だった2点が解決したのに加えて、快適になりました。通信が安定する音質/画質が良い接続速度が速い(ルームに入るまでの時間)通信はたまに切れることがありますし(appear.inが悪いのかその他の通信環境が悪いのかは不明)、信じられないほどの品質になったということではありませんが、基本的なところで抱えていた不満がなくなり、とても快適になりました。ルームのリンクを作成できて便利です。ハングアウトよりも良い体験になりました。16:28ビデオ会議をハングアウトからappear.inにしたら快適になったTweetもっと読むコメントを書く2016-10-20Swiftで自作structをArrayやDictionaryのように使えるようにしてみるSwift初めまして、Swiftがバージョンアップされる度に産まれたての子羊かのごとくガクブルしているKayです。容赦なくバージョンアップした後に泣いたり、感動したりと忙しい日々を送っております。実際にarrayを内包してるパターンが多いかとは思いますので少々手を抜きました(・・。必要メソッドはmakeIteratorだけなので、for...inで回すだけならこれで簡単に出来ます。3これまたDictionaryを内包してる前提の手抜きコードですが、Arrayの時とIteratorが違うだけですね。Dictionaryなので、順不同に出てきます。'String'IndexとElementが少々複雑になりましたが、これも実装的にはArrayとほぼ変わりません。nilこれがなければ始まりませんよね。