テスト駆動開発の始め方


Test-Driven Development By Example (Kent Beck)
Kent Beck の Test-Driven Development By Example を Amazon で買う

約70ページにもわたって MONEY EXAMPLE という事例が書かれています。 あまりに多いので一気に読むのはちょっと辛いですが、テストドリブンを夢見てがんばって読んでいます。 今回は テストドリブンの序盤となる部分をyんでみました。

実装の前にテストをすべて書くのは無理

MONEY EXAMPLE のところを見ると、 Kent Beck ですら最初にすべてのコードを書かないということがわかります。 MONEY EXAMPLE で取り上げられている単純な金額の掛け算でも、コードが徐々に完成していくのにつれてテストコードも変わっていきます。 よく、最初にテストコードを書くなんて無理だからテスト駆動開発は無理だという人がいますが、テスト駆動とはそういうことではないんですね。

MONEY EXAMPLE では、 存在しないクラスを使ってテストを書き始めます。 Red どころか コンパイルすらできないテストを書くところから始めています。 必要なクラスを考えてクラスのテストから書き始めるのかと思いましたがそうではありませんでした。 最後の理想形をテストに書いていました。

テストドリブンの手順

ToDo の整理をしてからテストを始めます。 この ToDo List はコードが完成するまでついて回ります。 載っている事例では、 存在しない Dollar クラス を使ってテストを書くところから始めています。 そして テストを通してできるクラスのメソッドは(最初は)あくまでスタブです。

MONEY EXAMPLE は次のようにして進めていました。

  1. テストを書く。存在しないクラスも使ってよい。
  2. テストをコンパイルできるようにする。
  3. テストを Green にする。
  4. リファクタを行い、重複を取り除く。

テストを Green にする方法

  • 固定値を返すなどして、テストを通るようにする。 (実装コードとしては完成ではない)
  • 明らかにわかるコードを実装する。
  • 複数の側面からのテストを書く。 (Triangulation)

Triangulation というのは、 テストケースを追加することで固定値での返り値を返せないようにするように、複数のパターンのテストを書くことで実装コードを規定していく方法です。 たとえば 1 から n までの総和を求める関数があったとして、 Sum(1) == 1 だけだったら Sum の返り値は 固定の 1 でもいいですが、 Sum(5) == 15 だと実装せざるを得なくなります。 Kent Beck は本当にどのようにリファクタすればよいか迷うようなときに Triangulation を使うそうです。 どうすればいいのかわかっている場合は Triangulation のためのテストコードは書かれません。

MONEY EXAMPLE の中で出てきた Value Object というのも重要だと思うのでまとめておきます。

Value Object

一種のインスタンス変数で、コンストラクタで設定された値はそれ以降変わることがありません。 これにより、ポインタを通じた意図しない値の書き換えの発生を防ぎます。 別の言葉で書くなら 副作用対策です。

Value Object の持つメソッドの戻り値は必ず新しいオブジェクトにします。 下に例を書きました。 Numadd メソッドの戻り値は新しいインスタンスになっています。 これにより add の前後で Num のインスタンスは変更することがありません。 また、 primitive value ではないので、 別途 equal メソッドを実装しておかないとテストコードを書くときに困ることがあります。

Test-Driven Development By Example の JAVA のコードをまねて作ったのですが、 言語が ruby なので実践的には get_amount を書かずに attr_reader :amount と書きますね。

Test-Driven Development By Example (Kent Beck)
Kent Beck の Test-Driven Development By Example を Amazon で買う

Database available in FuelPHP


I wondered what database is available in FuelPHP, and look into FuelPHP code.

Environment

  • FuelPHP 1.8 (GitHub)

Available Database

The following DBMS is theoretically available in FuelPHP. It means that FuelPHP use driver for the following databases.

  • Cubrid
  • FreeTDS
  • Microsoft SQL Server
  • Sybase
  • Firebird
  • IBM DB2
  • IBM Informix Dynamic Server
  • MySQL
  • Oracle Call Interface
  • ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
  • PostgreSQL
  • SQLite 3, 2
  • SQL Azure
  • 4D

How to investigate

First, read manual. At the section Database Introduction, it says Can be mysql, mysqli or pdo. Namely, FuelPHP can handle mysql specific driver and PDO driver.

Then, read PDO section of PHP document. For above all DBMS, PDO is available.

Well, can FuelPHP handle PDO and connect to DB in real? Now, look at the FuelPHP core code, which handle database connection. There are 3 kind of connection.php, each of them handle mysql, mysqli, PDO connection. It’ll be clear PDO is available in FuelPHP.

Take your Attention when you use sqlite

You should be careful when you use sqlite. (FuelPHP version 1.7.2)

Primary Key

Migration doesn’t work when you add Primary Key like MySQL. In sqlite3, we can’t add name to Primary Key. 例えば MySQL なら Primary Key id (id) となるところが、 sqlite3 だと Primary Key (id) というようになります。

So, we should create plain SQL or change FuelPHP core code. It’s a choice not to use Primary Key, but I don’t recommend.

また通常は migration file を php oil を使って作成すると 自動で UNSIGNEDid が作成されて AUTO_INCREMENT が設定されますが、 sqlite ではこれが動きません。 sqlite では AUTO_INCREMENT ではなく AUTOINCREMENT になります。 いまのところ自動生成のスクリプトでは対応していませんので FuelPHP の core のコードを変更する必要があります。 そして自動生成される UNSIGNED は 削除しましょう。 sqlite では UNSIGNED BIT INT というのが使えますが、 使ったところで INTEGER と解釈されます。

Blank Charset

sqlite3 では charset の指定方法が他のデータベースとは異なります。 PRAGMA statement を使います。 (確か sqlite3 では標準文字コードが utf-8 だったと思います。)

If you don’t set charset in db config (config/db.php), php oil migrate occurs an error of SQL, CREATE TABLE, because SQL which contains DEFAULT CHARACTER SET utf8 at last is executed. To prevent that, set empty string to charset, charset => ''. すると、 DEFAULT から始まる文字コード指定部分がなくなり、 sqlite3 でも php oil migrate が動くようになります。

db.php は次のように書きます。

このようにすると、 環境ごとに別の DB が作成されます。 table_prefixphp oil r migration の時には不要ですが、 php oil r migration:down の時に必要になることがあります。

Take your Attention when you use PostgreSQL

Migration doesn’t work. It is because PostgreSQL SQL syntax is somehow different from MySQL one. I recommend you to use FuelPHP Plugin for PostgreSQL.


雑談の仕方 どうやったら雑談できるのか


どうやったら雑談できるのか。 雑談力を上げるセミナーに行ってきました。 数人での雑談を前提に、どのようにすれば雑談できるようになるのか、聞いてきたことをアウトプットします。

話のできない人の共通点

話ができない人には共通点があるそうです。

  • 他人(ひと)の話を聴いていない
  • 評価をやけに気にする
  • 沈黙が嫌い

どうしよう!? っていう戸惑いが出てくるんですね。 言い換えるならば、 自分がどうするのかということにフォーカスしています。 つまるところ “何を話せばいいのか” というのが最大の課題になっているのではないでしょうか。 私もそのひとりなのですが。

何を話せばいいのか

話すことが決まってしまえばあとは楽なんですが、話すことが決まらないからこそつらいんです。 そんな課題を解決するためには、考え方を変えましょう。

知りたいことを聴く

相手について「もっと知りたい」と思うことを聴きましょう。 自分が話さなくてもいいんです。 これで、話のスタートができますね。

トップ営業マンと言われる人たちに共通していえるのも、知りたいことを聴いているということです。 知りたいことを聴くと 他の人が知らないことも知ることができるようになり、 営業成績につながっていくそうです。

雑談の聴き方

さて、話のスタートはできるようになりましたが、どうやって聴けばいいんでしょうか。 聴き方 にもコツがあります。

  • 相手がどんなことを考えているか、想像しながら聴く。
  • 他人のいいところを見つけるつもりで聴く。

この中に「相手の言っていることを正確に聞き取る」なんてことは入っていません。 言葉や文字ではないんですね。 私は過去に営業部の課長から「言っていることをそのまま聴くんじゃなくて、相手の意図することは何かを考えて聴け」と言われたことがあります。

雑談をする上でまず大切なのは、「相手がどんなことを考えているか、想像しながら聴く」ことです。 相手と同じ視点に立つことで、相手の言っていることも理解しやすくなり、共感しやすくなるんですね。

また、いいところを見つける習慣をつけておけば、挨拶として使うこともできるようになるのでおすすめです。

相手の話に興味が持てない時は、自分にもメリットのある話だと思って聴くのがいいそうです。

行動で雑談を楽しくする

雑談を更に面白くする方法があります。 雑談といっても文字で書かれた文章とは違って、その場で表現されるわけですから、視覚的な要素も重要になってきます。 方法を2つ紹介します。

相手が見たい顔をする

相手が見たい顔ってどんな顔でしょう。 それは笑顔です。 あたりまえですけれど、今一度考えてみましょう。 挨拶するとき、話をするとき、相手が笑顔だったら話しやすくなりませんか? こちらが笑顔でいることで相手も話しやすくなり、円滑に話ができるようになります。

聴いていることをアピールする

相槌(あいづち)をする、頷く、(声を出して)笑う、アイコンタクトをする、そういったアクションを起こすことで相手の話を聞いていることをアピールできます。 自分の話を聞いてもらえていることがわかれば、相手も話しやすくなります。 雑談の中での沈黙を避けるためにもうまく使っていきたいですね。

これは講師から聞いた話ですが、過去にディズニーのキャストをしていた人のリアクションは “そこまでやる!?” と思うほどのオーバーリアクションだったそうです。 でもやりすぎってことはないそうです。 特にパーティーの席や合コンなどではそこまでやらないと埋もれてしまいますね。

こういったことは反応心理学として研究もされています。

以上、セミナーの内容をまとめてみました。


テスト駆動開発の基本とメリット


Test-Driven Development By Example (Kent Beck)
Kent Beck の Test-Driven Development By Example を Amazon で買う

同僚の勧めで Test-Driven Development By Example を読むことにしました。 書いたのはあの Kent Beck です。 日本語のものもあるのですが、そちらは絶版になっているので買うなら中古です。

この本では具体例が示されていて、どのようにテストができていき どのようにコードができていくのかがよくわかります。 まだ最初のほうしか読んでいませんが、他人(Kent Beck)のテストの書き方がわかるので、自分のやり方を見直すよい機会になります。

Test Driven の基本

Preface のところに Test Driven の基本ルールが書いてあります。

  • 自動テストに失敗するまで新しいコードを書かない。
  • 重複は排除する。

テストで失敗するまでコードを書いてはいけません。 これに関連して よくはまる落とし穴に、「テストコードのテストコードを書く必要はないのか」というのがあります。 これについて 同僚は次のような説明をしてくれました。

自動テストがないときはどうやってテストしていましたか? (PHPの場合) var_dump などでテストをしていたと思います。 テストコードのテストコードというのは、 その var_dump と 目視 のテストを書くってことと同じことなんですよ。 テストコードそのものの正しさは開発者が担保するようにして進めるんです。

わかったようなわからないような説明かもしれませんが、要するにそんなこと言っていたらきりがないからテストコードは開発者のチェックとコードの間に入れる保険なんだと思います。 またテストコードのバグについてはじゃんじゃん直していいそうです。

そして Kent Beck はコードの書き方について重要な方針を書いています。

自分の書いたコードのテストは自分で書こう

これ重要ですね。 この本をバイブルってことにしておけば、自分で書いたコードのテストは自分で書いてくれって言えますからね。 Red / Green / Refactor の順でやろうと思ったら自分で書くしかないんですけどね。

テスト駆動・自動テストのメリット

開発現場では往々にして「自動テストなんてやって意味あるのか」「時間がかかるだけじゃないのか」という議論が勃発します。 地位の高い人がそういうことを言い出すとどうしようもなくなったりします。 モチベーションにも繋がるところなので 自動テストのメリットを再確認しましょう。 本書では social implications として4つのことが書かれているのですが、それを仕事上のメリットとして書くと次のようになります。

汚いコードの密度が減り、品質保証は受け身の仕事じゃなくて能動的な仕事になる。
自分でコードを書くことが品質保証に繋がるので、問い合わせを受けてから手を動かすようなものではなくなります。
ドッキリするようなコードに遭遇することが減り、マネージャの見積もり精度が上がる。
開発者のみならずマネージャにとっても嬉しいことが起こります。
技術的な会話の議題が明確になり、同僚との協力作業の効率が高まる。
開発者の能力にもよると思いますが、書籍上ではそういうことが書かれています。
汚いコードの密度が減り、新機能の追加されたリリース可能なコードが毎日増えて顧客との関係が向上する。
毎日というのは言い過ぎかもしれませんが、バグを見落とすことが少なくなるので新規機能の追加に集中できるようになります。

特に2番目は重要ポイントですね、 テストドリブンとは関係なさそうな人にもメリットがもたらされるので。 どれも理想論に見えますが、テストドリブンの目指すところは上記のメリットです。

この本を読んで今以上にテストドリブンに力を入れていこうと思いました。 中にはテストを書かない人もいるのですが、具体的な進め方も書いてある本なので 他人への説明も楽にできると思っています。

Test-Driven Development By Example (Kent Beck)
Kent Beck の Test-Driven Development By Example を Amazon で買う

目薬に含まれる成分の効果


目薬にはいろんな種類があります。 どれを買えばいいのか全くわからない中、成分についていろいろと調べたことをまとめました。

第2類医薬品と第3類医薬品

第2類医薬品と第3類医薬品の目薬の違いはなんなのか。 マツモトキヨシの店頭で聞いてみたところ、 “血管収縮剤が入っているか入っていないか” だそうです。 それだけだから、特に違いはないといわれました。

サンテ メディカル 10 は 第2類医薬品 です。サンテ 40 ゴールド は 第3類医薬品 です。

入っているか入っていないか というより、 入れられるか入れられないかなんですけどね。

ところで血管収縮剤ってどんな効果があるんでしょうか。

血管収縮剤

次の成分が血管収縮剤として使われます。 点眼であれば結膜(白目部分)の充血の抑制、点鼻であれば鼻粘膜の膨張を縮小させ鼻づまりの改善、傷薬としての止血などに使われる物質です。

名称 備考
塩酸ナファゾリン ( mathrm{C}_{14} mathrm{H}_{14} mathrm{N}_{2} cdot mathrm{HCl} ) 。 多用すると逆効果。
塩酸テトラヒドロゾリン ( mathrm{C}_{13} mathrm{H}_{16} mathrm{N}_{2} cdot mathrm{HCl} ) 。 痔治療のための座薬などでは患部の血管を収縮して血流を抑え、有効成分を患部に長く留めるために用いることがある。
塩酸フェニレフリン ( mathrm{C}_{9} mathrm{H}_{13} mathrm{NO}_{2} cdot mathrm{HCl} ) 。 長期若しくは頻繁使用により、目は赤く、鼻が詰まったようになる恐れがあります。散瞳作用があります。

備考の内容はすべてを網羅しているわけではないので注意してください。

基本的に充血への対処として使われているようですが、充血は果たして薬を使ってまで止めるべきものなのでしょうか。 充血による悪影響はよくわかりませんが、体が(酸素が足りないなどの)必要を感じて充血しているはず。 それならば寧ろ薬で抑制するのはダメなんじゃないでしょうか。

よく調べると、 第2類医薬品と第3類医薬品の違いとして 防腐剤 もあることがわかりました。

防腐剤

目薬を長く使えるようにするために、目薬には防腐剤が入っています。 防腐剤は残った目薬をカビや細菌などから守る働きを持っています。

しかし一方で 防腐剤は角膜を傷つけてしまうことがあるといわれています。 角膜についての実験は 我々が目薬を使う環境とは著しく異なるから気にしなくてよいという話もありますが、 私には詳しいことはわかりません。

防腐剤には以下のものがあります。

  • 塩化ベンザルコニウム
  • クロロブタノール
  • ソルビン酸カリウム

第2類医薬品でも防腐剤を使っていないものがあります。

防腐剤の入っていない第2類医薬品
ティアーレ抗菌目薬 は 防腐剤フリー の目薬です。スマイル 40EX ゴールド には 防腐剤が入っていません。

ホウ酸も昔は防腐剤として使われていましたが、 外用剤では皮膚から吸収して毒性を示すため使用禁止になっています。 ただし目薬においては使用量が少ないからか 添加物として使われていることがあります、特に第3類医薬品の目薬では。

目薬に含まれるビタミン

目薬の中にはいろんなビタミンを含むものがありますが、どれがいいんでしょうか。 そもそもどんな効果があるんでしょうか。

ビタミンA, E, B6, B12 が役に立ちそうです。

目に役立つビタミン
種類 物質名 効果・備考
A パルミチン酸レチノール 角膜細胞を再生する。 目の潤いを保持する。
E トコフェロール 抗酸化、抗炎症、血行促進作用がある。 活性酸素に電子を渡して非活性にしてくれる。
B2 リボフラビン 粘膜・角膜の保護を助ける。 ラクトフラビンとも呼ばれる。 不足すると充血が起こりやすくなる。
B6 塩酸ピリドキシン 目の組織代謝を活性化する。
B12 シアノコバラミン 末梢神経を修復する。 毛様体筋のはたらきを活発にし、目の疲れを改善する。

ビタミンを含む食品を食べるのなら効果がありそうなんですが、目に直接ビタミンを入れて効果があるのかは疑問です。あくまで素人の考えですけど。

パソコンで疲れた眼に効くネオスチグミン

パソコンによる疲れ眼におすすめされるのがネオスチグミンの入った目薬です。 メチル硫酸ネオスチグミン、 ネオスチグミンメチル硫酸塩 などと表示されています。

ネオスチグミンは毛様体をほぐして 目のピント調節機能を回復させます。 眼がかすんだり 疲れてきたりするときは 毛様体も疲れているので ネオスチグミンでリフレッシュさせてあげるといいと思います。 パソコンの長期使用に伴う目の疲れは この毛様体の疲労によるものだと言われていますし。

ネオスチグミンの入った目薬 (一部)
第2類医薬品
アイストレッチ にもネオスチグミンが含まれています。スマイル40EX にもネオスチグミンが含まれています。
第3類医薬品
マイティア フレッシュ40 にも ネオスチグミン が含まれています。ロート クール40 にも ネオスチグミン が含まれています。

ドライアイ対策

ドライアイに効く成分はムチンと聞きます。 ムチンは糖とタンパク質が結合してできたもので、納豆に多く含まれています。 ネバネバした物質です。 ただ、ムチンが有効成分に含まれた目薬は 私の知るところ ありません。

ドライアイ対策の成分には次のようなものがあります。

物質名 効果
ヒアルロン酸 保水効果がある。 使いすぎると副作用が出ることがある。
ヒアルロン酸の多く含まれる目薬
ドライエイドにはヒアルロン酸が多く含まれています。 コンドロイチン も多く含まれています。alt=

清涼感

清涼感は下記の成分によって作りだされています。 外箱への表示義務はないらしいです。

冷たい感覚を刺激する効果があります。 感覚を刺激するためだけの成分で、冷たくはなりませんし、それ以上特別な効果はありません。

物質名 備考
カンフル シップ薬、しもやけ・虫刺され薬に使われている。
メントール リップクリームや咳止めなど、 軽い咽頭炎や口・喉の弱い炎症を短期間軽減する大衆薬に含まれている。

ところで 清涼感、好きですか? 私は嫌いです。 目を保護しようとしているのに、 なんで刺激を与える必要があるのやら。 おそらく、 洗剤の泡 や 歯磨き粉のミント味 のような 気分的な効果 を狙ったものだと思います。

その他の有効成分

上記のほかにも目薬にはいろんな物質が入っています。 カリウムとナトリウムは浸透圧を調整するのに使われます。 そのほか調べたものは以下の通りです。

物質名 効果
L-アスパラギン酸カリウム エネルギーの産生を高めて目の組織の呼吸を改善する。 組織代謝の改善に役立つ。
タウリン 眼組織の栄養物として組織を活性化する。 目の疲れや眼病回復促進に役立つ。
コンドロイチン 角膜の組成成分。 角膜の透明性維持や角膜損傷の修復作用がある。 水分を保持する機能によって、涙を角膜上に留めて角膜を外界の刺激から保護する。

成分と効果の関係

これまで調べた内容から 成分を表にしてみました。

効果 成分
角膜保護
  • ビタミンA
  • ビタミンB2
  • コンドロイチン
新陳代謝
  • ビタミンE
  • ビタミンB12
毛様体改善
  • ビタミンB6
  • ネオスチグミン
栄養補給
  • タウリン
  • L-アスパラギン酸カリウム
保水
  • ヒアルロン酸
充血解消
  • 塩化ベンサルコニウム
  • ソルビン酸カリウム

ここまででいろいろな成分を見てきました。 有効成分がたくさんある中で、 ほとんどの成分がどっさり入っている目薬を見つけました。 ライオンの スマイル 40 プレミアム です。 第2類医薬品ですが、防腐剤は使っていません。

清涼感を抑えたものがよければ、 成分の量は落ちますが スマイル 40EX ゴールド マイルド がいいと思います。 私も使いましたが、 結構いいです。 ネオスチグミンもしっかりと含まれています。

今回は 成分について調べるのがメインでしたが、 次はこの情報を元に 市販の目薬を分類していこうと思っています。


A Life Summary of an Gypsy