<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>大原部長自宅鯖実験場</title>
	<atom:link href="http://www.bucyou.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.bucyou.net</link>
	<description>ここは私の実験場です</description>
	<lastBuildDate>Sat, 10 Dec 2011 08:10:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Symfony Advent Calender 10日目を書きました</title>
		<link>http://www.bucyou.net/blog/801</link>
		<comments>http://www.bucyou.net/blog/801#comments</comments>
		<pubDate>Sat, 10 Dec 2011 07:49:29 +0000</pubDate>
		<dc:creator>ooharabucyou</dc:creator>
				<category><![CDATA[日常]]></category>

		<guid isPermaLink="false">http://www.bucyou.net/?p=801</guid>
		<description><![CDATA[テーマは Timezone 対応。 Doctrine2 は datetime型 のフィールドについて \DateTime で値が帰ってくるので だいぶ楽になっている感じです。 http://labs.bucyou.net/Sf-2011-10]]></description>
			<content:encoded><![CDATA[<p>テーマは Timezone 対応。<br />
Doctrine2 は datetime型 のフィールドについて \DateTime で値が帰ってくるので<br />
だいぶ楽になっている感じです。</p>
<p><a href="http://labs.bucyou.net/Sf-2011-10">http://labs.bucyou.net/Sf-2011-10</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bucyou.net/blog/801/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP5.4 Advent Calendar 3日目 を書きました</title>
		<link>http://www.bucyou.net/blog/797</link>
		<comments>http://www.bucyou.net/blog/797#comments</comments>
		<pubDate>Sat, 03 Dec 2011 06:48:16 +0000</pubDate>
		<dc:creator>ooharabucyou</dc:creator>
				<category><![CDATA[日常]]></category>

		<guid isPermaLink="false">http://www.bucyou.net/?p=797</guid>
		<description><![CDATA[タイトルのとおりであります。 http://labs.bucyou.net/php54-2011-3/ テーマは、基本的な関数の増減と、仕様変更です。 JsonSerializable は、リソースからJSONへの変換方法が統一されそうなので、 便利なんじゃないかなー。なんて考えました。]]></description>
			<content:encoded><![CDATA[<p>タイトルのとおりであります。</p>
<p><a href="http://labs.bucyou.net/php54-2011-3/" target="_blank">http://labs.bucyou.net/php54-2011-3/</a></p>
<p>テーマは、基本的な関数の増減と、仕様変更です。<br />
JsonSerializable は、リソースからJSONへの変換方法が統一されそうなので、<br />
便利なんじゃないかなー。なんて考えました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bucyou.net/blog/797/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>現実のレガシーコードと戦うためのMockの話 (PHP編) &#8211; その2 Mockeryの紹介</title>
		<link>http://www.bucyou.net/blog/787</link>
		<comments>http://www.bucyou.net/blog/787#comments</comments>
		<pubDate>Sat, 19 Nov 2011 15:57:15 +0000</pubDate>
		<dc:creator>ooharabucyou</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[TIPS]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[日常]]></category>

		<guid isPermaLink="false">http://www.bucyou.net/?p=787</guid>
		<description><![CDATA[mockery 前回のブログを書いたあとに、 @hidenorigoto 先生から指摘を受けてしまったので Mockeryを紹介してみるよ。 知らなかった自分が恥ずかしいが、PHP5.3以上に対応ということも助けて、かなり高機能だよ。 パフォーマンスとかはどうかはまだ体感していないですが。 static method のモック 本シリーズで紹介している通り、static method によるテスト阻害は なかな苦しいものです。 しかし、ロード済みでないという制約下のもとで、Mockery による static method のモックを作ることができます。 (やはり、クラスオートロード利用向けな予感がします。) 以下が例です。 SampleSingleton クラスが、仮にDBの接続系だったりすると、それを利用している Sample::sfoo() などのテストはやりにくくなってしまいます。 なんとかなるよ！ Mockery ならね。 なんという事でしょう。これだけで、OKです。 Prefixing the valid name of a class (which is NOT currently loaded) with &#8220;alias:&#8221; will generate an &#8220;alias mock&#8221;. Alias mocks create a class alias with [...]]]></description>
			<content:encoded><![CDATA[<h3>mockery</h3>
<p>前回のブログを書いたあとに、 <a href="http://twitter.com/#!/hidenorigoto/status/137191185411354625" target="_blank">@hidenorigoto 先生から指摘を受けてしまったので</a> <a href="https://github.com/padraic/mockery" target="_blank">Mockery</a>を紹介してみるよ。<br />
知らなかった自分が恥ずかしいが、PHP5.3以上に対応ということも助けて、かなり高機能だよ。</p>
<p>パフォーマンスとかはどうかはまだ体感していないですが。</p>
<h3>static method のモック</h3>
<p>本シリーズで紹介している通り、static method によるテスト阻害は<br />
なかな苦しいものです。</p>
<p>しかし、ロード済みでないという制約下のもとで、Mockery による<br />
static method のモックを作ることができます。<br />
(やはり、クラスオートロード利用向けな予感がします。)<br />
以下が例です。</p>
<p><script src="https://gist.github.com/1378928.js?file=lib/SampleSingleton.php"></script><br />
<script src="https://gist.github.com/1378928.js?file=lib/Sample.php"></script></p>
<p>SampleSingleton クラスが、仮にDBの接続系だったりすると、それを利用している<br />
Sample::sfoo() などのテストはやりにくくなってしまいます。</p>
<p>なんとかなるよ！ Mockery ならね。</p>
<p><script src="https://gist.github.com/1378928.js?file=test/SingletonMockTest.php"></script></p>
<p>なんという事でしょう。これだけで、OKです。</p>
<blockquote><p>Prefixing the valid name of a class (which is NOT currently loaded) with &#8220;alias:&#8221; will generate an &#8220;alias mock&#8221;. Alias mocks create a class alias with the given classname to stdClass and are generally used to enable the mocking of public static methods. Expectations set on the new mock object which refer to static methods will be used by all static calls to this class.</p></blockquote>
<p>(アホ超訳)</p>
<blockquote><p>&#8220;alias:&#8221; というのを接頭語として正しいクラス名 (まだロードされていない) を利用すると、エイリアスモックを作成します。エイリアスモックは stdClass に対象クラス名でクラスエイリアスを作成します。それは一般的に public static メソッドのモッキングに有効です。static method を参照する新しいモックオブジェクトにセットされた expectations は、そのクラスのすべての static call が呼ばれたときに使われます。
</p></blockquote>
<p>なるほどなるほど。</p>
<p>ちなみに、PHP5.3新関数 の <a href="http://php.net/manual/ja/function.class-alias.php" target="_blank">class_alias()</a> という関数を駆使しているかんじです。<br />
今回の例では、SampleSingleton をエイリアスとして、モックのクラスを読んでいます。<br />
で、これまた PHP5.3 の新機能である <a href="http://php.net/manual/ja/language.oop5.overloading.php" target="_blank">__callStatic</a> を使って何やらムフフやっている予感がします。</p>
<h3>パーシャルモック</h3>
<p>Mockery は、本当にリア充なので、 <a href="http://code.google.com/p/jmockit/" target="_blank">JMockit</a> でできるようなパーシャルモックもやってのけます。</p>
<p><script src="https://gist.github.com/1378928.js?file=test/PartialMockTest.php"></script></p>
<p>上の場合、Sample::bar() メソッドだけ、モックするよーという感じです。<br />
Sample::foo() は維持してくれます。</p>
<p>残念なことに、private method のモック実現は <a href="http://php.net/manual/ja/book.runkit.php" target="_blank">runkit</a> 使わないと難しいそうだけど。</p>
<p>まだまだ、ドキュメントを読み始めたばっかりなので、<br />
面白い使い方があったらまた紹介します。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bucyou.net/blog/787/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>現実のレガシーコードと戦うための Mock の話 (PHP編)</title>
		<link>http://www.bucyou.net/blog/765</link>
		<comments>http://www.bucyou.net/blog/765#comments</comments>
		<pubDate>Thu, 17 Nov 2011 14:57:49 +0000</pubDate>
		<dc:creator>ooharabucyou</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[日常]]></category>

		<guid isPermaLink="false">http://www.bucyou.net/?p=765</guid>
		<description><![CDATA[前回の Java編に引き続きまして 今回も、テスト対象コードを変えずに、頑張ってテストを書くにはどうしたらいいのかを考えてみます。 // もちろん、リファクタリングをするべきですが、リファクタリングの足掛かりとして // テストを先に書いておきたいという思いがあるのです。 PHPでも Mock というか、Test Double を楽しむための方法が幾つかありそうなのでまとめてみる。 オートロードが利用できるケース symfony1.x の、 sfContext (Singletonパターン) に関わるテストで利用されている手段です。クラスの定義してあるファイルを自動的にロードするための機能spl_autoload_register() で、登録した関数は、すでにクラスが定義済みであった場合は呼ばれません。 これを利用して、全く同名のモッククラスを定義したファイルを用意しておき、テスト時に require_once などで、そのファイルを呼び出してやるわけです。これで、対象とするクラスの動きとしてはモッククラスの動きになります。 非常でお気軽な方法ですが、モック対象が頻繁に変更するようなケースなどではオススメできないかもしれません。 すべてのメソッドを網羅している必要はなく、騙すだけで良いならばこの方法はいいかもしれません。 テキトーなので、autoload.php は PSR-0 などに全然沿っておりませんのでご了承ください。 test1.php に関しては、オートロードで lib/Sample.php がロードされることはなく、先に定義した Sample クラスが利用されていることがわかります。 runkit JMockit のように、メソッドの一部のみの挙動を変更したい！というニーズに答えるならば runkit になるかと思います。 php モジュールになってしまいますが、メソッドの内容を書き換えたり、定数を消したりとなかなか魔術を感じる便利なものです。 ただし、PHP5.3 では pecl からインストールができないので svn からソースコードを落とし、手動でコンパイルしてやる必要があります。 $ svn co https://svn.php.net/repository/pecl/runkit/trunk/ runkit $ cd runkit [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bucyou.net/blog/725">前回の Java編に引き続きまして</a><br />
今回も、テスト対象コードを変えずに、頑張ってテストを書くにはどうしたらいいのかを考えてみます。<br />
// もちろん、リファクタリングをするべきですが、リファクタリングの足掛かりとして<br />
// テストを先に書いておきたいという思いがあるのです。</p>
<p>PHPでも Mock というか、<a href="http://xunitpatterns.com/Test%20Double.html" target="_blank">Test Double</a> を楽しむための方法が幾つかありそうなのでまとめてみる。</p>
<h3>オートロードが利用できるケース</h3>
<p>symfony1.x の、 sfContext (Singletonパターン) に関わるテストで利用されている手段です。クラスの定義してあるファイルを自動的にロードするための機能<a href="http://php.net/manual/ja/function.spl-autoload-register.php" target="_blank">spl_autoload_register()</a> で、登録した関数は、すでにクラスが定義済みであった場合は呼ばれません。</p>
<p>これを利用して、全く同名のモッククラスを定義したファイルを用意しておき、テスト時に require_once などで、そのファイルを呼び出してやるわけです。これで、対象とするクラスの動きとしてはモッククラスの動きになります。</p>
<p>非常でお気軽な方法ですが、モック対象が頻繁に変更するようなケースなどではオススメできないかもしれません。<br />
すべてのメソッドを網羅している必要はなく、騙すだけで良いならばこの方法はいいかもしれません。</p>
<p><script type="text/javascript" src="https://gist.github.com/1369552.js?file=lib/Sample.php"></script><script type="text/javascript" src="https://gist.github.com/1369552.js?file=autoload.php"></script><br />
<script type="text/javascript" src="https://gist.github.com/1369552.js?file=test1.php"></script>テキトーなので、autoload.php は <a href="https://accounts.google.com/ServiceLogin?service=groups2&amp;passive=1209600&amp;continue=http://groups.google.com/group/php-standards/web/psr-0-final-proposal&amp;followup=http://groups.google.com/group/php-standards/web/psr-0-final-proposal&amp;authuser=0" target="_blank">PSR-0</a> などに全然沿っておりませんのでご了承ください。 test1.php に関しては、オートロードで lib/Sample.php がロードされることはなく、先に定義した Sample クラスが利用されていることがわかります。 </p>
<h3>runkit</h3>
<p>JMockit のように、メソッドの一部のみの挙動を変更したい！というニーズに答えるならば <a href="http://php.net/manual/ja/book.runkit.php" target="_blank">runkit</a> になるかと思います。 php モジュールになってしまいますが、メソッドの内容を書き換えたり、定数を消したりとなかなか魔術を感じる便利なものです。 ただし、PHP5.3 では pecl からインストールができないので svn からソースコードを落とし、手動でコンパイルしてやる必要があります。 </p>
<pre class="con"><code>$ svn co https://svn.php.net/repository/pecl/runkit/trunk/ runkit
$ cd runkit
$ phpize
$ ./configure
$ make
$ sudo make install </code></pre>
<p>以下は、クラスの定義を書き換えている様子です。<script type="text/javascript" src="https://gist.github.com/1369552.js?file=test2.php"></script></p>
<h3>runkit + PHPMockFunction</h3>
<p>runkit を利用して、かつ JMock のように使いやすくやろうじゃないか的なライブラリもあるのですが、<br />
どうやらメンテされてません。誰かクールなのを作りませんか? 言いだしっぺですかそうですか。</p>
<p><a href="http://code.google.com/p/php-mock-function/" target="_blank">PHPMockFunction</a></p>
<h3>PHPUnit の Mock</h3>
<p><a href="http://www.phpunit.de/manual/3.0/ja/mock-objects.html" target="_blank">PHPUnit の Mock</a> は、テスト可能なコードを書いていけば使い物になりますが、レガシーなコードのテストをまずは書いて進みたいという時には適さない様に思えます。 </p>
<p>ちなみに、Symfony2 のコンポーネントは、この機能を利用しているため、テストもコードも非常に洗練されているような気がします。</p>
<h3>【追記】次回予告</h3>
<p><a href=" http://twitter.com/#!/hidenorigoto/status/137191185411354625" target="_blank">@hidenorigoto 先生にツッコミを受けた</a>ので、続編を書きます。<a href="https://github.com/padraic/mockery" target="_blank">mockery</a> はどこまで出来るかわからないですけど、ドキュメント見た限り、なかなかクールでした！（ってか初めて知りました。)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bucyou.net/blog/765/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>現実のレガシーコードと戦うための Mock の話 (Java編)</title>
		<link>http://www.bucyou.net/blog/725</link>
		<comments>http://www.bucyou.net/blog/725#comments</comments>
		<pubDate>Sun, 30 Oct 2011 09:29:04 +0000</pubDate>
		<dc:creator>ooharabucyou</dc:creator>
				<category><![CDATA[TIPS]]></category>
		<category><![CDATA[技術]]></category>

		<guid isPermaLink="false">http://www.bucyou.net/?p=725</guid>
		<description><![CDATA[この物語はフィクションです。そういうことにしておいてください。 こんにちは。Java訓練中の川原です。 テストがない。 そんな現実のレガシーコードと戦う事になったとします。 テストがないコードというのは、テストを実行することを考えて作られていないので、いざテストを書こうとすると（僕の技量がまだまだなことも大きいが）怖気づいてしまい、結局またテストが書けないという悪循環に陥る可能性があります。 改修するタイミングなどに、思い切って改修する場所の周辺だけでもテストを作っておきたいものです。 勇気必要ですよね。ケント・ベック本の「まえがき」にもあるとおりです。 こんなケースに出会った 今回は、 Java のケースを想定してください。 Controller.execute() の改修を行うので 、命綱として Controller のテストを書いておきたいとします。 名前の通り、 Singleton は、 Singleton Pattern を実装したクラスです。 例えば、データベースの接続状態などを管理し、データを取得するような機能を持つとかそういうのを想定してください。 Util はクラスメソッドをもっています。やはり、こちらも外部コンテンツに接続した結果が帰ってくるようなものを想定してください。 おまけに、 Controller には、 fetchData() という、これまた何が帰ってくるかわからないようなメソッドがあったと想定します。 Singleton.foo() 、 Util.bar() そして、 Controller.fetchData() は、テストとしてはなかなか扱いづらいです。しかも、ものすごくたくさんの場所で使われているとして、他のクラスがまったくテストを書いていないとすればいきなり全力でゴリゴリとリファクタリングしまくるのも辛いわけです。 (時間ないなら尚更辛い！） そんな時に、Mock を書くことになるかと思いますが JMock では苦しい気がしました。なぜなら、JMock では Mock として利用されるインスタンスは、インターフェイス化されていないといけないからです。 また、 Util.bar() のようなクラスメソッドをモックする機能は JMock にはありません。 Java には、 Mockito という Mocking Framework [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>この物語はフィクションです。そういうことにしておいてください。</p></blockquote>
<p>こんにちは。Java訓練中の川原です。</p>
<p>テストがない。<br />
そんな現実のレガシーコードと戦う事になったとします。<br />
テストがないコードというのは、テストを実行することを考えて作られていないので、いざテストを書こうとすると（僕の技量がまだまだなことも大きいが）怖気づいてしまい、結局またテストが書けないという悪循環に陥る可能性があります。<br />
改修するタイミングなどに、思い切って改修する場所の周辺だけでもテストを作っておきたいものです。</p>
<p><strong>勇気</strong>必要ですよね。ケント・ベック本の「まえがき」にもあるとおりです。</p>
<p><img src="http://www.bucyou.net/wp-content/uploads/2011/10/w_hand_up_01_g_bk-300x181.jpg" alt="" title="w_hand_up_01_g_bk" width="300" height="181" class="alignnone size-medium wp-image-726" /></p>
<p><iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=ooharabucyou-22&#038;o=9&#038;p=8&#038;l=as4&#038;m=amazon&#038;f=ifr&#038;ref=ss_til&#038;asins=4894717115" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<h3>こんなケースに出会った</h3>
<p>今回は、 Java のケースを想定してください。</p>
<p><a href="http://www.bucyou.net/wp-content/uploads/2011/10/class.png"><img src="http://www.bucyou.net/wp-content/uploads/2011/10/class-300x202.png" alt="" title="class" width="300" height="202" class="alignnone size-medium wp-image-732" /></a><br />
<a href="http://www.bucyou.net/wp-content/uploads/2011/10/s2.png"><img src="http://www.bucyou.net/wp-content/uploads/2011/10/s2-300x187.png" alt="" title="s2" width="300" height="187" class="alignnone size-medium wp-image-735" /></a></p>
<p><strong>Controller</strong>.execute() の改修を行うので 、命綱として <strong>Controller</strong> のテストを書いておきたいとします。<br />
名前の通り、 <strong>Singleton</strong> は、 Singleton Pattern を実装したクラスです。 例えば、データベースの接続状態などを管理し、データを取得するような機能を持つとかそういうのを想定してください。<br />
<strong>Util</strong> はクラスメソッドをもっています。やはり、こちらも外部コンテンツに接続した結果が帰ってくるようなものを想定してください。<br />
おまけに、 <strong>Controller</strong> には、 fetchData() という、これまた何が帰ってくるかわからないようなメソッドがあったと想定します。</p>
<p>Singleton.foo() 、 Util.bar() そして、 Controller.fetchData() は、テストとしてはなかなか扱いづらいです。しかも、ものすごくたくさんの場所で使われているとして、他のクラスがまったくテストを書いていないとすればいきなり全力でゴリゴリとリファクタリングしまくるのも辛いわけです。<br />
(時間ないなら尚更辛い！）</p>
<p>そんな時に、Mock を書くことになるかと思いますが <a href="http://www.jmock.org/" target="_blank">JMock</a> では苦しい気がしました。なぜなら、JMock では Mock として利用されるインスタンスは、インターフェイス化されていないといけないからです。<br />
また、 <strong>Util</strong>.bar() のようなクラスメソッドをモックする機能は JMock にはありません。<br />
Java には、 <a href="http://code.google.com/p/mockito/" target="_blank">Mockito</a> という Mocking Framework もありますが、やはりクラスメソッドのモック化は厳しいような雰囲気でした。</p>
<p>というわけで、 現実と戦うためには <a href="http://code.google.com/p/jmockit/" target="_blank">JMockit</a> が最強っぽい予感です。</p>
<h3>たのしいモック</h3>
<pre class="brush: java; title: ; notranslate">
// Controller.java
package net.bucyou;

import org.apache.commons.lang3.RandomStringUtils;

public class Controller {
	public String execute() {
		return fetchData()
			+ Singleton.getInstance().foo()
			+ Util.bar();
	}

	public String fetchData() {
		return RandomStringUtils.randomAscii(2);
	}
}
</pre>
<pre class="brush: java; title: ; notranslate">
// Singleton.java
package net.bucyou;

import org.apache.commons.lang3.RandomStringUtils;

public class Singleton {
	private static Singleton singleton = null;

	private Singleton() {

	}

	public static Singleton getInstance() {
		if (null ==  Singleton.singleton) {
			Singleton.singleton = new Singleton();
		}

		return Singleton.singleton;
	}

	public String foo() {
		return RandomStringUtils.randomAscii(2);
	}
}
</pre>
<pre class="brush: java; title: ; notranslate">
// Util.java
package net.bucyou;

import org.apache.commons.lang3.RandomStringUtils;

public class Util {
	public static String bar() {
		return RandomStringUtils.randomAscii(2);
	}
}
</pre>
<p>さて、厄介なコードを用意しました。<br />
<em>RandomStringUtils.randomAscii(2);</em> に関しては、ランダムで2文字のAscii文字を返します。<br />
当然、 Controller.execute() した結果として、何が帰ってくるかはわかりません。</p>
<pre class="brush: java; title: ; notranslate">
// ControllerTest.java
package net.bucyou;

import static org.junit.Assert.*;
import static org.hamcrest.core.Is.is;
import org.junit.Test;

public class ControllerTest {

	@Test
	public void testExecute() {
		Controller controller = new Controller();

		assertThat(controller.execute(), is(&quot;AABBCC&quot;));
	}

}
</pre>
<p>とりあえず書いたテストです。当然失敗です。</p>
<p>さて、モックを作る準備として、 jmockit.jar をビルドパスに組み込みます。</p>
<p><a href="http://www.bucyou.net/wp-content/uploads/2011/10/buildpath.png"><img src="http://www.bucyou.net/wp-content/uploads/2011/10/buildpath-300x175.png" alt="" title="buildpath" width="300" height="175" class="alignnone size-medium wp-image-740" /></a></p>
<p><a href="http://jmockit.googlecode.com/svn/trunk/www/tutorial/RunningTests.html" target="_blank">ドキュメント</a>によると、 classpath の順序に注意らしいです。JUnit の前に持って行きましょう。</p>
<p>さらに、テスト実行時に -javaagent:jmockit.jar などと、 VM argument に追加してやる必要があるそうです。<br />
（ココらへんが、どういう理由で必要なのかはまだちゃんと理解してないです。）</p>
<p><a href="http://www.bucyou.net/wp-content/uploads/2011/10/exec.png"><img src="http://www.bucyou.net/wp-content/uploads/2011/10/exec-300x252.png" alt="" title="exec" width="300" height="252" class="alignnone size-medium wp-image-741" /></a></p>
<p>さぁ、モックを書こう！</p>
<pre class="brush: java; title: ; notranslate">
// ControllerTest.java
package net.bucyou;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import mockit.Expectations;
import mockit.Mocked;
import org.junit.Test;

public class ControllerTest {
	@Mocked
	final Util util = null;

	@Test
	public void testExecute() {
		final Controller controller = new Controller();

		// Expections は呼ばれる順番もチェックするぞ！
		new Expectations(controller) {
			Singleton singleton;
			{
				// controller.fetchData() のパーシャルモック
				// このメソッドだけ挙動変更とかができる。
				controller.fetchData();
				result = &quot;AA&quot;;

				// Singleton のモック
				Singleton.getInstance();
				result = singleton;
				singleton.foo();
				result = &quot;BB&quot;;

				// Util のモック
				Util.bar();
				result = &quot;CC&quot;;
			}
		};

		assertThat(controller.execute(), is(&quot;AABBCC&quot;));
	}
}
</pre>
<p>そして、実行。<br />
ハハハ。美しい Test 成功のグリーンが輝いておる。</p>
<p><a href="http://www.bucyou.net/wp-content/uploads/2011/10/green.png"><img src="http://www.bucyou.net/wp-content/uploads/2011/10/green-300x106.png" alt="" title="green" width="300" height="106" class="alignnone size-medium wp-image-742" /></a></p>
<h3>これでできた！</h3>
<p><img src="http://www.bucyou.net/wp-content/uploads/2011/10/jumpman_g_bl-286x300.jpg" alt="" title="jumpman_g_bl" width="286" height="300" class="alignnone size-medium wp-image-730" /></p>
<p>やったね！これで、テストを足掛かりに少しは前進することができるかなー。とか考えたわけです。<br />
あと、モックを作るのは楽しいです！<br />
JMockit は、カバレッジ計測を行ったりもできるらしいので、リア充な Mocking Framework だと思います。リア充乙。</p>
<p>ちなみに、これなんて読むんですか。<br />
ジェイモキットとか読んでるんですけど。 JMock + Mockito で、ジェイモヒートとかなんですかね?</p>
<h3>参考資料</h3>
<ul>
<li><a href="http://d.hatena.ne.jp/j5ik2o/20110205/1296922274" target="_blank">JMockitは理想的なモックフレームワーク &#8211; じゅんいち☆かとうの技術日誌</a></li>
<li><a href="http://markmail.org/message/octzrvojntc2qw4p" target="_blank">Re: mocking a Singleton? &#8211; net.java.dev.jmockit.users ML </a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bucyou.net/blog/725/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPMatsuri 2011 に参加してきた</title>
		<link>http://www.bucyou.net/blog/709</link>
		<comments>http://www.bucyou.net/blog/709#comments</comments>
		<pubDate>Thu, 20 Oct 2011 14:36:40 +0000</pubDate>
		<dc:creator>ooharabucyou</dc:creator>
				<category><![CDATA[日常]]></category>

		<guid isPermaLink="false">http://www.bucyou.net/?p=709</guid>
		<description><![CDATA[今年も PHPMatsuri に参加してきてしまいました。 去年は学生＋ハッカソン初参加ということで、こんなにも高いお金を払っていいものか…。 ということでビクビクしながら参加ボタンを押したのを覚えていますが、 今年は、昨年の慣れもあり全力で参加ボタンを押しました。 Fabien はイケメンだった 今年も、Symfony2 周りの情報を漁りに言った。 というのも、個人としてもお仕事としても Symfony2 は使ってみたいフレームワークだったからだ。 なんと、 Fabien が来たので幾つか質問してみた。 // 僕の英語ほとんど通じませんでしたorz 1. Symfony Framework 上で使える Twig タグ（等) のドキュメントはあるか？ ない。とのことだった。チケット作るか、作っておくれ。という解答といただく。 僕がこのリストを欲しいと思った経緯は、Twig として利用できるタグ一覧は、Twig Document で見ることができるが、Symfony Framework の Bridge が追加しているタグについては一覧で見ることができないなーと思ったことが発端にある。 今のところ、全手動でリストを作ったり、Bridge のコードを見て確認していた。これは、自動化されていないし非効率。 Twig タグ一覧用の Bundle をつくろうかなー。っと思ってた矢先、Fabien はものの数時間でやってのけた。 イケメンすぎるぜ…。 Fabien の仕事スピード こういう、質問して新たな方向性が生まれていくと、質問してすごく良かったって思いますね。 2. Sismo って version=0.99999 とかなっているけど、 1ってあるの。 なんか、version=1はありえんとか言ってたw 永遠のベータ版ですね。わかります。 でも、バージョン番号が銀河鉄道みたいな感じになっているのは面白い。 たぶん転職したとしても味わえない楽しさ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/zatsu/6260016899/sizes/l/in/photostream/"><img src="http://farm7.static.flickr.com/6051/6260016899_9f10852909.jpg" alt="phpmatsuri"></a></p>
<p>今年も PHPMatsuri に参加してきてしまいました。<br />
去年は学生＋ハッカソン初参加ということで、こんなにも高いお金を払っていいものか…。<br />
ということでビクビクしながら参加ボタンを押したのを覚えていますが、<br />
今年は、昨年の慣れもあり全力で参加ボタンを押しました。</p>
<h3>Fabien はイケメンだった</h3>
<p>今年も、Symfony2 周りの情報を漁りに言った。<br />
というのも、個人としてもお仕事としても Symfony2 は使ってみたいフレームワークだったからだ。<br />
なんと、 Fabien が来たので幾つか質問してみた。<br />
// 僕の英語ほとんど通じませんでしたorz</p>
<p>1. Symfony Framework 上で使える Twig タグ（等) のドキュメントはあるか？</p>
<p>ない。とのことだった。チケット作るか、作っておくれ。という解答といただく。<br />
僕がこのリストを欲しいと思った経緯は、Twig として利用できるタグ一覧は、<a href="http://twig.sensiolabs.org/" target="_blank">Twig Document</a>  で見ることができるが、Symfony Framework の Bridge が追加しているタグについては一覧で見ることができないなーと思ったことが発端にある。<br />
今のところ、全手動でリストを作ったり、Bridge のコードを見て確認していた。これは、自動化されていないし非効率。</p>
<p>Twig タグ一覧用の Bundle をつくろうかなー。っと思ってた矢先、Fabien はものの数時間でやってのけた。<br />
イケメンすぎるぜ…。</p>
<p><a href="http://togetter.com/li/203100" target="_blank">Fabien の仕事スピード</a></p>
<p>こういう、質問して新たな方向性が生まれていくと、質問してすごく良かったって思いますね。</p>
<p>2. <a href="http://sismo.sensiolabs.org/" target="_blank">Sismo</a> って version=0.99999 とかなっているけど、 1ってあるの。</p>
<p>なんか、version=1はありえんとか言ってたw<br />
永遠のベータ版ですね。わかります。<br />
でも、バージョン番号が銀河鉄道みたいな感じになっているのは面白い。</p>
<h3>たぶん転職したとしても味わえない楽しさ</h3>
<p>このイベントの醍醐味はなんといっても、ごった煮。ハッチポッチである。<br />
本当にいろんな働き方をしている人がいるし、それに触れることができる。<br />
そして、なんだかよくわからないけどトンデモなく楽しい。</p>
<p>今年は、こいつ↓とGarrett先生にだいぶ毒されていた可能性もあるけど。</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/KHy7DGLTt8g" frameborder="0" allowfullscreen></iframe></p>
<p><a href="http://voyagegroup.com/" target="_blank">VOYAGE GROUP</a> の中の人がやっていた、<br />
「今日もまた〇〇な環境で仕事をはじめるお　〜エンジニア理想の職場と私の職場〜」<br />
という、トークでは思わず良い環境だなーーー転職したいなーーとか多少なりとも思ったけど、<br />
たぶん、そういって転職しても絶対に味わえない楽しさが PHPMatsuri にはあると思う。</p>
<h3>発表など</h3>
<p>今年は、去年よりしっかりした成果物を出すことができた。</p>
<p>PHP Conference LT では Sismo の紹介に限ったが、今回は Hack してみようと思った。<br />
Sismo が Symfony Component を利用しているということで、Symfony利用でLT。<br />
次点ということでTシャツなどを頂いた！ありがとうございます。</p>
<p>今後は、svn対応とかもっと闇に満ちた Hack をしたいと思います。</p>
<div style="width:425px" id="__ss_9718127"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/ooharabucyou/phpmatsuri-9718127" title="Sismoをいじくる" target="_blank">Sismoをいじくる</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9718127" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/ooharabucyou" target="_blank">Shogo Kawahara</a> </div>
</p></div>
<p>あと、闇PHPMatsuriにも参加しました。<br />
ドラ忍者の登場には驚きました。</p>
<p><a href="http://yfrog.com/nxok2cj" target="_blank"><img src="http://desmond.yfrog.com/Himg861/scaled.php?tn=0&#038;server=861&#038;filename=ok2c.jpg&#038;xsize=640&#038;ysize=640" alt="ninja" /></a></p>
<p>PHPのマニュアルにある謎関数は、闇に満ちてます。</p>
<div style="width:425px" id="__ss_9717503"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/ooharabucyou/yami-php-9717503" title="PHPの普段使わない関数を使う" target="_blank">PHPの普段使わない関数を使う</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9717503" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/ooharabucyou" target="_blank">Shogo Kawahara</a> </div>
</p></div>
<h3>また来年</h3>
<p>というわけで、最終LTはなんと40人。<br />
参加者の大体半分が何らかの発表をしたことになります。<br />
なかなかこういうアグレッシブで大きくてごった煮なイベントはないんじゃないでしょうか。<br />
こんな大好きなイベントに、来年もあれば出たい。</p>
<p>そして、スタッフ・ゲストの皆さんと、特に僕の厄介な質問に答えてくれた Fabien と、全力でイベントを盛り上げていた参加者の皆さんに感謝したい。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bucyou.net/blog/709/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TDD BC Tokyo 1.6 に参加してきた振り返り #tddbc</title>
		<link>http://www.bucyou.net/blog/690</link>
		<comments>http://www.bucyou.net/blog/690#comments</comments>
		<pubDate>Mon, 01 Aug 2011 12:27:40 +0000</pubDate>
		<dc:creator>ooharabucyou</dc:creator>
				<category><![CDATA[日常]]></category>

		<guid isPermaLink="false">http://www.bucyou.net/?p=690</guid>
		<description><![CDATA[このブログが、ワークショップのレビュー場になりつつある大原部長です。 (ほんとうは、もっと翻訳とかオープンソースネタを晒したいんだお。 とかいうと、どうでもいいことはポストしてんじゃねーか。と言われそうなのでオフレコで） 昨日、 TDD BC Tokyo 1.6 が開催されました。 和田さんの素晴らしい講演や、Java初心者 (3ヶ月程度) で 挑んだペアプロなどなど 非常に熱いものでした。 とぎゃったーがあるので、全体的なまとめはこちらをどうぞ。 気づき 仮実装をやる意味: 仮実装完了時点でレッドならば、テストの方が間違っているかもしれない。テストをテストする必要。 テストもリファクタリングが必要 リファクタリングも一歩ずつ着実に 気づくことが大事。 テストのために機能が必要になったら実装することも必要。 TDDは「かもしれない運転」と考えた。だとしたら、TDDのない開発は暴走した自動車と一緒だ。 振り返り 毎回、このようなイベントでは全体でKPTを行っていますが、個人的にもKPTをやろうと思ったわけです。 最近は、自分自身のOJTでもKPTが十分ハナシのネタになるので、KPTはわかりやすく素晴らしいフレームワークだと思います。 Keep すばらしいイベントに参加できた。 ちゃんとブログ書いた。 t_wadaさんとお話できた。 普段Javaを触っている人たちとペアプロ・お話することができた。 Problem バージョン管理するべきだった。Gitを使いたかったが、Eclipse用の環境を当日揃えた上に、使い方がよく分からなかった。 道具の整備不足。Eclipseのショートカットとかその日に覚えたのが結構多い。 他の言語との触れ合いは少なかったかも。同じ言語でも、Groovy という興味深いものを目の前にしていたが、触れることは当日はできなかった。 Try Acts as Professional 社内でのTDD布教　→ まずはチーム内勉強会などで共有などなど。 Groovy 興味持った。やる。 Githubでソースコードの公開。(Subversionでは公開済) 本読もう。みんなで読もう]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bucyou.net/wp-content/uploads/2011/08/180px-Hartman.jpg"><img src="http://www.bucyou.net/wp-content/uploads/2011/08/180px-Hartman.jpg" alt="" title="180px-Hartman" width="180" height="152" class="alignnone size-full wp-image-694" /></a></p>
<p>このブログが、ワークショップのレビュー場になりつつある大原部長です。<br />
(ほんとうは、もっと翻訳とかオープンソースネタを晒したいんだお。<br />
とかいうと、どうでもいいことはポストしてんじゃねーか。と言われそうなのでオフレコで）</p>
<p>昨日、 <a href="http://www.zusaar.com/event/agZ6dXNhYXJyDQsSBUV2ZW50GPGlAww" target="_blank">TDD BC Tokyo 1.6</a>  が開催されました。<br />
和田さんの素晴らしい講演や、Java初心者 (3ヶ月程度) で 挑んだペアプロなどなど<br />
非常に熱いものでした。</p>
<p><a href="http://togetter.com/li/168958">とぎゃったーがあるので、全体的なまとめはこちらをどうぞ。</a></p>
<h3>気づき</h3>
<ul>
<li>仮実装をやる意味: 仮実装完了時点でレッドならば、テストの方が間違っているかもしれない。テストをテストする必要。</li>
<li>テストもリファクタリングが必要</li>
<li>リファクタリングも一歩ずつ着実に</li>
<li>気づくことが大事。</li>
<li>テストのために機能が必要になったら実装することも必要。</li>
<li>TDDは<strong>「かもしれない運転」</strong>と考えた。だとしたら、<strong>TDDのない開発は暴走した自動車</strong>と一緒だ。</li>
</ul>
<p><img src="http://www.bucyou.net/wp-content/uploads/2011/08/a0001_010695-300x198.jpg" alt="" title="a0001_010695" width="300" height="198" class="alignnone size-medium wp-image-703" /></p>
<h3>振り返り</h3>
<p>毎回、このようなイベントでは全体でKPTを行っていますが、個人的にもKPTをやろうと思ったわけです。<br />
最近は、自分自身のOJTでもKPTが十分ハナシのネタになるので、KPTはわかりやすく素晴らしいフレームワークだと思います。</p>
<h4>Keep</h4>
<ul>
<li>すばらしいイベントに参加できた。</li>
<li>ちゃんとブログ書いた。</li>
<li>t_wadaさんとお話できた。</li>
<li>普段Javaを触っている人たちとペアプロ・お話することができた。</li>
</ul>
<h4>Problem</h4>
<ul>
<li>バージョン管理するべきだった。Gitを使いたかったが、Eclipse用の環境を当日揃えた上に、使い方がよく分からなかった。</li>
<li>道具の整備不足。Eclipseのショートカットとかその日に覚えたのが結構多い。</li>
<li>他の言語との触れ合いは少なかったかも。同じ言語でも、Groovy という興味深いものを目の前にしていたが、触れることは当日はできなかった。</li>
</ul>
<h4>Try</h4>
<ul>
<li>Acts as Professional </li>
<li>社内でのTDD布教　→ まずはチーム内勉強会などで共有などなど。</li>
<li>Groovy 興味持った。やる。</li>
<li>Githubでソースコードの公開。(Subversionでは公開済)</li>
<li>本読もう。みんなで読もう</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bucyou.net/blog/690/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>タイムスクープハンターのアブソリュートタイムについて研究したら挫折した</title>
		<link>http://www.bucyou.net/blog/680</link>
		<comments>http://www.bucyou.net/blog/680#comments</comments>
		<pubDate>Fri, 17 Jun 2011 13:46:00 +0000</pubDate>
		<dc:creator>ooharabucyou</dc:creator>
				<category><![CDATA[日常]]></category>

		<guid isPermaLink="false">http://www.bucyou.net/?p=680</guid>
		<description><![CDATA[タイムスープハンターとは、NHKで放送されている歴史番組 (?) のことです。 未来のタイムスクープ社が、タイムワープ技術を使い、あらゆる時代にジャーナリストを派遣して 人々の営みを映像で記録していくという背景。 NHKは(おそらく)未来人との交流があるので、現代人の我々が其の映像を見ることができるわけです。 http://www.nhk.or.jp/timescoop/index.html で、取材が始まるときに、ジャーナリストの沢嶋雄一が必ず言う言葉が アブソリュートポジションNxxx Wxxx Exxx Sxxx｡ポジション確認。 アブソリュートタイムXxxxxxxxx年 xx時xx分xx秒｡西暦変換しますと xxxx年x月x日xx時xx分。無事タイムワープに成功しました。 という確認の文言。 アブソリュートタイムというのがとても気になったので、シーズン3から研究してみました。 が、挫折した。 これが問題の研究資料です。 なんと、このアブソリュートタイムというのは、我々が想定する時間の進み方とは全く異なることが判明しました。 注目すべきは「うわなり打ち」の回は、西暦だと1638年で、アブソリュートタイムがB0345728年なのに、 「髪結い」の回は、西暦だと1821年で、「うわなり打ち」の回よりアブソリュートタイムが大きくなると思いきや B0287394年となっています。 しかも、プレフィックスが &#8220;S&#8221; になっている時も…。 なんてこった。未来の技術はわからない。 いくつか仮説 時間はバラバラに存在してる そもそも10進数で読んではいけない 実はランダム 何をするために、この研究を始めたかというと、アブソリュートタイムを西暦に変換する プログラムをつくろうと思ったのですが、これではいかんですなー。 アブソリュートポジションも謎だ。]]></description>
			<content:encoded><![CDATA[<p>タイムスープハンターとは、NHKで放送されている歴史番組 (?) のことです。<br />
未来のタイムスクープ社が、タイムワープ技術を使い、あらゆる時代にジャーナリストを派遣して<br />
人々の営みを映像で記録していくという背景。<br />
NHKは(おそらく)未来人との交流があるので、現代人の我々が其の映像を見ることができるわけです。</p>
<p><a href="http://www.nhk.or.jp/timescoop/index.html" target="_blank">http://www.nhk.or.jp/timescoop/index.html</a></p>
<p>で、取材が始まるときに、ジャーナリストの沢嶋雄一が必ず言う言葉が</p>
<blockquote><p>アブソリュートポジションNxxx Wxxx Exxx Sxxx｡ポジション確認。<br />
アブソリュートタイムXxxxxxxxx年 xx時xx分xx秒｡西暦変換しますと xxxx年x月x日xx時xx分。無事タイムワープに成功しました。</p></blockquote>
<p>という確認の文言。<br />
アブソリュートタイムというのがとても気になったので、シーズン3から研究してみました。</p>
<p>が、挫折した。</p>
<p><a href="http://www.bucyou.net/wp-content/uploads/2011/06/time.png"><img src="http://www.bucyou.net/wp-content/uploads/2011/06/time-300x55.png" alt="" title="time" width="300" height="55" class="alignnone size-medium wp-image-681" /></a></p>
<p>これが問題の研究資料です。</p>
<p>なんと、このアブソリュートタイムというのは、我々が想定する時間の進み方とは全く異なることが判明しました。<br />
注目すべきは「うわなり打ち」の回は、西暦だと1638年で、アブソリュートタイムがB0345728年なのに、<br />
「髪結い」の回は、西暦だと1821年で、「うわなり打ち」の回よりアブソリュートタイムが大きくなると思いきや<br />
B0287394年となっています。<br />
しかも、プレフィックスが &#8220;S&#8221; になっている時も…。<br />
なんてこった。未来の技術はわからない。</p>
<p>いくつか仮説</p>
<ul>
<li>時間はバラバラに存在してる</li>
<li>そもそも10進数で読んではいけない</li>
<li>実はランダム</li>
</ul>
<p>何をするために、この研究を始めたかというと、アブソリュートタイムを西暦に変換する<br />
プログラムをつくろうと思ったのですが、これではいかんですなー。<br />
アブソリュートポジションも謎だ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bucyou.net/blog/680/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>第4回 Symfony2 勉強会 まとめ &amp; FormComponent の復習 + α</title>
		<link>http://www.bucyou.net/blog/664</link>
		<comments>http://www.bucyou.net/blog/664#comments</comments>
		<pubDate>Sun, 05 Jun 2011 06:20:15 +0000</pubDate>
		<dc:creator>ooharabucyou</dc:creator>
				<category><![CDATA[Symfony2]]></category>

		<guid isPermaLink="false">http://www.bucyou.net/?p=664</guid>
		<description><![CDATA[こんにちは。 先日 6月4日に、Symfony2勉強会が開催されました。 実は、 Symfony2 勉強会への参加はこれが初めてだったりします。 第2部から参加しました。 今、 Symfony2 で Bundle (いつかオープンソース) をつくっておるので、 「あーこうすりゃいいのか」っていうヒントが多く散りばめられていて良かったです。 あと、スタッフのTシャツがオサレですね。 講演のテーマは Symfony2 + Behat(Bundle)でテストファースト開発 @hidenorigoto Symfony2 のフォームについて @fivestr PHPマイクロフレームワーク Silex 入門 @brtriver Symfony2でより良いソフトウェアを作るために @iteman ということでした。個別にそれぞれ、感想を書くのもいいですが、 FormComponent を復習したかったので、手を動かしてみました。 以下が発表スライド http://www.slideshare.net/fivestar/symfony2-8203873 この発表の質問の中に、i18n まわりの事が出ていました。 僕も、大いに気になってしまったので、考えてみました。 Symfony2 の i18n は TranslationComponent という、FormComponent と ValidatorComponent と分かれているように、これまた別のコンポーネントで管理されています。 となると、何か特別な操作が必要なのでは、と疑うわけです。 結論から言うと、 Label や Error は、 メッセージさえ用意しておけば、 symfony1.x と同じように [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは。 先日 6月4日に、Symfony2勉強会が開催されました。</p>
<p>実は、 Symfony2 勉強会への参加はこれが初めてだったりします。<br />
第2部から参加しました。</p>
<p>今、 Symfony2 で Bundle (いつかオープンソース) をつくっておるので、<br />
「あーこうすりゃいいのか」っていうヒントが多く散りばめられていて良かったです。<br />
あと、スタッフのTシャツがオサレですね。</p>
<p>講演のテーマは</p>
<ul>
<li>Symfony2 + Behat(Bundle)でテストファースト開発 @hidenorigoto</li>
<li>Symfony2 のフォームについて @fivestr</li>
<li>PHPマイクロフレームワーク Silex 入門 @brtriver</li>
<li>Symfony2でより良いソフトウェアを作るために @iteman</li>
</ul>
<p>ということでした。個別にそれぞれ、感想を書くのもいいですが、<br />
FormComponent を復習したかったので、手を動かしてみました。</p>
<p>以下が発表スライド<br />
<a href="http://www.slideshare.net/fivestar/symfony2-8203873" target="_blank">http://www.slideshare.net/fivestar/symfony2-8203873</a></p>
<p>この発表の質問の中に、i18n まわりの事が出ていました。<br />
僕も、大いに気になってしまったので、考えてみました。</p>
<p>Symfony2 の i18n は TranslationComponent という、FormComponent と ValidatorComponent<br />
と分かれているように、これまた別のコンポーネントで管理されています。</p>
<p>となると、何か特別な操作が必要なのでは、と疑うわけです。</p>
<p>結論から言うと、 Label や Error は、 メッセージさえ用意しておけば、 symfony1.x と同じように<br />
勝手に翻訳してくれます。嬉しい＼(^o^)／</p>
<p>TranslationComponentの設定や、メッセージファイルの形式・置き方は、<br />
<a href="http://symfony.com/doc/2.0/book/translation.html" target="_blank">http://symfony.com/doc/2.0/book/translation.html</a><br />
の通りです。</p>
<p>symfony-standard に入っている、 DemoBundle で試してみます。</p>
<p>まず、fallbackを日本語にします。 (ロケールが明示されていないときの設定)</p>
<p><em>app/config/config_dev.yml</em></p>
<pre class="con"><code>framework:
    router:   { resource: "%kernel.root_dir%/config/routing_dev.yml" }
    profiler: { only_exceptions: false }
    translator: { fallback: ja } # ← 追加
</code></pre>
<p>以下のような <em>src/Acme/DemoBundle/Resources/translations/messages.ja.yml</em> を作ります。<br />
(YAMLじゃなくても、symfony1.x でも使われていた、XLIFF 形式も受け付けるよ！<br />
 しかし、ネストされたIDを用意できるのは Symfony2の新機能で、YAML (or PHP) 形式だけの強みのようです。<br />
 あと、個人的にYAMLが好き。)</p>
<p>Resources/translations/messages.ja.yml</p>
<pre class="con"><code>Email: Eメール
Message: メッセージ
</code></pre>
<p>http://example.com/app_dev.php/demo/contact にアクセス</p>
<p><a href="http://www.bucyou.net/wp-content/uploads/2011/06/hoge.png"><img src="http://www.bucyou.net/wp-content/uploads/2011/06/hoge-300x222.png" alt="" title="hoge" width="300" height="222" class="alignnone size-medium wp-image-665" /></a></p>
<p>見事、日本語になりました。これで、多言語対応への不安が１つ減りましたね。</p>
<p>仕組みもちょっと調べてみました。</p>
<p>Symfony2 では、 Twig をテンプレートエンジンとして利用している場合、 TwigBundle が  TranslationComponent<br />
への導線を用意しているようです。<br />
( PhpEngine の場合は、 FrameworkBundle が導線を用意しているようです。)</p>
<p><em>TwigBundle/Resources/views/Form/div_layout.html.twig</em> の一部</p>
<pre class="con"><code>{% block field_label %}
{% spaceless %}
    <label for="{{ id }}"{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>{{ label|trans }}</label>
{% endspaceless %}
{% endblock field_label %}
</code></pre>
<p>のように、しっかり trans filter を使っているのがわかります。</p>
<p>&#8212;</p>
<p>あと、Doctrine2 ORM のドキュメント翻訳やりたいと思ってます。<br />
6/30 に Doctrine 2.1 がリリースされる予定とのことなので、正座して待たずに、<br />
情報を掴んでいきたいところですね。</p>
<p>&#8212;</p>
<p>次回は懇親会とか行きたいお。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bucyou.net/blog/664/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Doctrine2.0は外部キーを主キーにできない気配でござる</title>
		<link>http://www.bucyou.net/blog/657</link>
		<comments>http://www.bucyou.net/blog/657#comments</comments>
		<pubDate>Tue, 24 May 2011 15:27:03 +0000</pubDate>
		<dc:creator>ooharabucyou</dc:creator>
				<category><![CDATA[日常]]></category>

		<guid isPermaLink="false">http://www.bucyou.net/?p=657</guid>
		<description><![CDATA[Symfony2 で遊んでいます。 で、Doctrine2.0 でモデルを定義するときに少し困ったことが。 以下のようなモデルを想定しました。 User (id, ..) Cart (user_id, &#8230;) id, user_id はそれぞれ主キーで、 user_id は 外部キーです。 User は Cart を 1つしか持てないという想定で、1対1の関係です。 アノーテーションを使ってモデルを定義すると、 User側 Cart側 とかなるかなー、っておもって doctrine:schema:create をやってみたんですが、Cart に主キーがないんだぜ と怒られてしまいました。 よくよく、ドキュメントを良く読むと衝撃的なあれが。 http://www.doctrine-project.org/docs/orm/2.0/en/tutorials/composite-primary-keys.html Doctrine 2 supports composite primary keys natively. Composite keys are a very powerful relational database concept and we took good care to make [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony2 で遊んでいます。</p>
<p>で、Doctrine2.0 でモデルを定義するときに少し困ったことが。</p>
<p>以下のようなモデルを想定しました。</p>
<p>User (id, ..)<br />
Cart (user_id, &#8230;)</p>
<p>id, user_id はそれぞれ主キーで、 user_id は 外部キーです。<br />
User は Cart を 1つしか持てないという想定で、1対1の関係です。</p>
<p>アノーテーションを使ってモデルを定義すると、</p>
<p>User側</p>
<pre class="brush: php; title: ; notranslate">
/**
 * @orm:Id
 * @orm:Column (type=&quot;integer&quot;)
 * @orm:GeneratedValue (strategy=&quot;AUTO&quot;)
 */
protected $id;
</pre>
<p>Cart側</p>
<pre class="brush: php; title: ; notranslate">
/**
 * @orm:Id
 * @orm:OneToOne (targetEntity=&quot;User&quot;)
 * @orm:JoinColumn (name=&quot;id&quot;, referencedColumnName=&quot;id&quot;)
 */
protected $user;
</pre>
<p>とかなるかなー、っておもって<br />
doctrine:schema:create をやってみたんですが、Cart に主キーがないんだぜ<br />
と怒られてしまいました。</p>
<p>よくよく、ドキュメントを良く読むと衝撃的なあれが。</p>
<p><a href=" http://www.doctrine-project.org/docs/orm/2.0/en/tutorials/composite-primary-keys.html" target="_blank">http://www.doctrine-project.org/docs/orm/2.0/en/tutorials/composite-primary-keys.html</a></p>
<blockquote><p>Doctrine 2 supports composite primary keys natively. Composite keys are a very powerful relational database concept and we took good care to make sure Doctrine 2 supports as many of the composite primary key use-cases. For Doctrine 2.0 composite keys of primitive data-types are supported, for Doctrine 2.1 even foreign keys as primary keys are supported.</p></blockquote>
<p>間違ってるかもしれない、ほんわか翻訳</p>
<blockquote><p>Doctrine2は最初から複合主キーに対応しています。複合主キーはとても強力なリレーショナルデータベースの概念であり、私たちは念を入れてさまざまなユースケースの複合主キーに対応したいと思います。Doctrine 2.0 ではプリミティブ型の複合主キーに対応され、2.1ではさらに外部キーを主キーとすることにも対応されています。</p></blockquote>
<p>うほー。ってことは Doctrine2.1 を乗せないと、上のようなモデルを定義することはできないてことかー?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bucyou.net/blog/657/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

