10/15・16[大阪]TDDやBDDも学べるよ!PHP Matsuriに参加しよう! #phpmatsuri


重要なことなので、最初に書いておきます。



この記事を読んでいる間にチケットが売り切れるといけないので、

今すぐPHP Matsuriのチケットを購入しましょう!




さて、今年もPHP Matsuriの季節がやってきました。
PHP Matsuriって何?という方もいらっしゃるかもしれませんが、一言で説明すると「PHPerが集まる祭」です。
昨年開催された PHP Matsuri の模様は、こちらの記事(昨年のレポート記事リンク)をお読みください。

イベントは面白そうだけど、東京へ行くのが・・・」といつも悔しい思いをしていた方々に朗報です。
なんと今年は、大阪で開催されます。
私は岐阜県に住んでいますが、東京へ行くのと比べると、大阪へ行く交通費はだいたい半額になります。
私と同じような方、今すぐチケットを購入しましょう!







えっ、まだチケットを購入していない?
次の項目にあてはまる方は、参加した方がいいですよ?


Symfony2については、リードデベロッパーであるfabien氏が来日し、Symfony2の特徴についての話を直接聞くことができます。
また、講演以外の時間にも、直接質問をぶつけてみたり、コードを書いている彼を遠くから見守ったりすることもできるでしょう。
特に私のようにfabienファンを自称するような方は、参加せずにはいられないはずです。
こんな機会、めったにありませんよ!
(講演以外に、実際にSymfony2で簡単なアプリケーションを作るワークショップもあります)


そしてテスト駆動開発についても、MakeGoodStagehand_TestRunner等を開発している久保さん(@iteman)の話を直接聞くことができます。入門向けのハンズオンもありますが、実際に遭遇している問題などについて、久保さんを始め他の参加者と意見交換する機会にもなります。
フレームワークについては既に知っているけど、テスト駆動開発はこれからという方、TDDBCに参加する機会がなくてウズウズしている方も、是非ご参加ください。PHPUnitの基本的な使い方やテストコードの書き方といった入門から、Behatを使ったBDD(振舞駆動開発・ATDD)やモックオブジェクト等、一歩踏み込んだ使い方なども体験していただける予定です。

※Behatは、Ruby on RailsでいうCucumberのPHP版です。



それから、最近ではSymfonyCakePHPLithiumZend Framework、CodeIgniter等のフレームワーク本体のリポジトリは、すべてGitHubで管理されるようになってきています。公式なセッション内容には含まれていませんが、こういったオープンソースの活動に何か少しでも参加してみたいという方も、是非このイベントに参加されることをオススメします。

  • 翻訳を手伝いたいけど、GitやGitHubの使い方が分からない → インストールからお手伝いします
  • 翻訳作業の流れなどを知りたい → お教えします
  • フレームワーク本体の品質改善に協力してみたい → フレームワーク本体のテストの実行方法、テストの記述方法などお教えします
  • フレームワーク本体にテストコードを追加したい → Pull Requestの仕方などお教えします

Git/GitHub の使い方が不安な方も、是非この機会にマスターしに来てください。
フレームワークの開発者の目の前で、フィードバックを送る、何か貢献する、貢献したい意思を表明すると、すごく喜ばれますよ!



この記事で私が紹介したPHP Matsuriの見所は、ホンの一部にすぎません。
他の方の紹介ブログも読み、そして、少しでも気になった方は是非イベントにご参加ください!!


明日のブログ記事は、@sizuhiko さんです。
明日の記事を読む前に、チケットを買うのをお忘れなく!


おまけ:

次の本にピンと来た方、是非いろいろ情報交換したいです(ので PHP Matsuriへ来て下さいw)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

ドメイン駆動 (Programmer’s SELECTION)

ドメイン駆動 (Programmer’s SELECTION)

Real-World Solutions for Developing High-Quality PHP Frameworks and Applications

Real-World Solutions for Developing High-Quality PHP Frameworks and Applications

そのうち調べるメモ

  • 1. Symfony2 standardディストリビューション(確認時はPR11)をダウンロード
  • 2. /app_dev.php/demo/ にアクセス→正常表示
  • 3. src/Acme/DemoBundle/Controller/DefaultController.phpのindexAction()のreturnの前に以下の1行を追加
        $this->container->get('request')->attributes->set('_test', array($this, 'test'));
  • 4. /app_dev.php/demo/ にアクセス→エラー

http://gyazo.com/0d8b67a66073240e2407853ca33467d5.png


Requestのattributesに、callable形式の配列(第1引数はオブジェクト)をセットしたのが原因でどこかでおかしくなって例外が発生するっぽい。


(追記)Symfony2側の原因まで調べきれていないが、関連してMonologでログのcloseで警告が出る点はpull requestを送ってみた https://github.com/Seldaek/monolog/pull/13

Symfony2でESIを動作させる手順

自分でも毎回分からなくなるのでメモ・・・。

Actionでは、レスポンスにsetSharedMaxAge()とsetPublic()をセット

<?php
        $response = $this->render('HelloBundle:Hello:index.html.twig', array('rand'=>rand()));
        $response->setSharedMaxAge('10');
        $response->setPublic();
        return $response;

テンプレートでは、standaloneをtrueに

    {% render "HelloBundle:Hello:news" with {}, {'standalone': true} %}

config.ymlでESIを有効に

app.config:
    esi:
        enabled: true

routing.ymlでESI用の_internalルーティングを有効に

_internal:
    resource: @FrameworkBundle/Resources/config/routing/internal.xml
    prefix:   /_internal

ハマるポイントとしては、アクションでレスポンスをsetPublic()しないといけないところでしょうか。これがないとサーバー側でのページキャッシュが有効になりません。

git bisectでメソッドが削除されたコミットを探す

git bisectを使うと、コミット履歴から「何らかのテスト」が初めて失敗するコミットを探し出すことができます。

ちょうど、「Doctrine2 MongoDB ODMのDocumentManagerからcreateQuery()メソッドが無くなっている」という発言を見かけたので、これを例にやってみます。

まず、リポジトリをcloneしてきて準備

$ git clone git://github.com/doctrine/mongodb-odm.git
$ cd mongodb-odm

bisectを開始します。最新のコミットではメソッドが無くなっているので「bad」、どこか適当な古いコミットで目的のメソッドがあるものを「good」に指定します。最初のbadとgoodを指定すると、gitがその中間のコミットを取ってきてくれます。

$ git bisect start
$ git bisect bad
$ git bisect good 246e2ae9	
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[078d158aaa5cd421f7bc726a16d457e8f77de28f] updated MongoDB\ODM\Query(Builder) to match MongoDB\Query(Builder)

このコミットで目的のメソッドが削除されているかどうかをテストし、あれば「good」、なければ「bad」を指定します。すると、gitがさらに自動的に次のコミットを取得してきて、最終的に最初にbadになるコミットがみつかります。
この手順は自動化でき、git bisect run にテストスクリプトを指定できます。今回は特定のファイルの特定のメソッドがあるかどうかなので、次のようにしました。

$ git bisect run grep 'function createQuery(' lib/Doctrine/ODM/MongoDB/DocumentManager.php
running grep function createQuery( lib/Doctrine/ODM/MongoDB/DocumentManager.php
Bisecting: 24 revisions left to test after this (roughly 5 steps)
[9a7c804ea0080bad4998aba79135a951b6912ed9] Adding doc blocks.
running grep function createQuery( lib/Doctrine/ODM/MongoDB/DocumentManager.php
Bisecting: 11 revisions left to test after this (roughly 4 steps)
[0fd37ae16f40373948e4a1f374d1f1e83a358b7b] Fix so initial version comes from default value of property.
running grep function createQuery( lib/Doctrine/ODM/MongoDB/DocumentManager.php
Bisecting: 5 revisions left to test after this (roughly 3 steps)
[4645babd9ab1cb4ee2473f662744dc60a3582243] Implemented id generator strategies and got rid of the old custom id stuff. Also implemented uuid and increment id generator.
running grep function createQuery( lib/Doctrine/ODM/MongoDB/DocumentManager.php
    public function createQuery($queryString, $parameters = array())
Bisecting: 2 revisions left to test after this (roughly 2 steps)
[daedacfbfddca96c3d75d19acdf50b9e1ca1be56] Refactoring API to match ORM and implementing optimistic and pessimistic locking
running grep function createQuery( lib/Doctrine/ODM/MongoDB/DocumentManager.php
    public function createQuery($queryString, $parameters = array())
Bisecting: 0 revisions left to test after this (roughly 1 step)
[182f14e1e5ebe66a5d0885b25d44c36f04f4bda1] Fixing argument to match orm.
running grep function createQuery( lib/Doctrine/ODM/MongoDB/DocumentManager.php
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[134b7ae418d33697fcb6a6dc73a34a8ec4d32904] Ripping out DQL and fixing a few things in QueryBuilder
running grep function createQuery( lib/Doctrine/ODM/MongoDB/DocumentManager.php
134b7ae418d33697fcb6a6dc73a34a8ec4d32904 is the first bad commit
commit 134b7ae418d33697fcb6a6dc73a34a8ec4d32904
Author: Jonathan H. Wage <jonwage@gmail.com>
Date:   Sat Nov 27 22:43:33 2010 -0600

    Ripping out DQL and fixing a few things in QueryBuilder

:040000 040000 16b89b55af621da2ae44a6b99d70a592ef54c42c bcf0f8dd448e4df6c2428f3d2bb2c8636ad3e72f M      lib
:040000 040000 f447e4e4db267d6fe65520d75d848f4a02074fb3 fcb0035153200ade88bb9cc88f31a666089ca108 M      tests
bisect run success

初めてbadになったコミット=メソッドが削除されたコミットが見つかりました!


参考: git-bisect(1)


もっと上手いor簡単なやり方など、教えてください!

git submodule update --init --recursive

各サブモジュールの中にさらにサブモジュールがある場合に、それらも再帰的にinit/updateするのをこのコマンドで一発で可能っぽいというのを先ほど知ったのでメモ。

最近symfonyの翻訳の協力者が増えてきています

日本Symfonyユーザー会で、公式サイトで毎週公開される「A week of symfony」というブログ記事の翻訳を毎週毎週やっています。この翻訳を手伝っていただける方が最近増えてきました。

私以外で担当していただいた方々

このa week of symfony以外にも、symfonyの公式ドキュメントや、Doctrineのドキュメントの翻訳なんかもあります。それぞれかなりの量がありますので、みなさんもどんどん手伝って頂けると助かりますし、何より、翻訳をすることで自分の勉強にもなります(すごく!)


それから、日本Symfonyユーザー会のドキュメントも、symfonyの公式ドキュメントも、さらにはSymfonyやDoctrine本体のソースコードも、それぞれGitHubで管理されています。これらのプロジェクトに参加するには、GitとGitHubの使い方をある程度覚えないといけません。ですがこの点も、Symfonyユーザー会のリポジトリを使って(ある意味)練習できます。(間違ったりしていても、日本人=私が訂正したり教えたりできますw)
そういった点でも、ドキュメント翻訳に参加してスキルを伸ばすきっかけにしてもらえればと思っています。


Symfony関連の翻訳に参加したい!、本家へプルリクエストを送りたいけど、やり方が分からない!という方は、是非お気軽にご連絡ください!!!

Symfony2ドキュメントのビルド用にconfigurationblock拡張を組み込む

Symfony2のオンラインドキュメントはSphinxを使っています。
Sphinxは高機能なドキュメントシステムで、コードのハイライト機能などはデフォルトのままでとても優秀です。

1つ、Symfony2のドキュメントで独自に拡張機能を使っている部分があり、それがタイトルにも書いた「configuration-block」というやつです。

これはfabienさんがSymfony2のドキュメント用に作った物で、つい最近公開されました。

configuration-blockエクステンションを組み込むには?

まだ正しい方法は私には分かっていませんが、以下の手順で有効にできました。

  1. ドキュメントのプロジェクトのconf.pyがあるディレクトリに、上記リポジトリのconfigurationblock.pyを保存する
  2. conf.py中の以下の行のコメントを解除(これで、conf.pyと同一ディレクトリのモジュールを読み込むようになる)
    1. sys.path.insert(0, os.path.abspath('.'))
  3. conf.pyのextensionsに「configurationblock」を追加