本を読む

読書やコンピュータなどに関するメモ

CakePHPカンファレンス東京」にオンライン参加

 「CakePHP」のカンファレンス「CakePHPカンファレンス東京」が開かれた。CakePHPは、Ruby on Railsの影響を受けたPHPのWebアプリケーションフレームワーク。開発チームのプロジェクトマネージャをまじえて、けっこう踏み込んだ話がされていて、面白かった。

 Ustreamによるインターネット中継を一日聴いて、メモをとったので、以下に整理。間違いがあったらご指摘ください。

基調講演「国内でのCakePHPの利用状況について」(安藤祐介)

 まず、参加者に対して挙手によるアンケート。CakePHPを知っている人はもちろん100%(笑)、ほとんどの人がさわったことがあり、公開サービスで使ったことのある人もけっこう多かったらしい。

 改めてCakePHPの概要を紹介。「全てのレベルのPHPユーザーが使う高速開発フレームワーク」が特徴という。「高速開発」は、フレームワークを使った開発全体にいえること。フレームワークを使わない開発では、必要な処理をぜんぶ書くため、似たようなプログラムで同じ処理を何度も書く必要がある。また、プログラムの構造はプログラムによって異なる。一方、フレームワークを使った開発では、ルールにそった部品だけを作成するため、決まりきった処理を書かずにすむ。ほか、ほとんどのプログラムが同じ構造じとなるため、引き継ぎやチーム開発などで有利となる。つまり、生産性と保守性が向上する。

 ただし、フレームワークというと、初級者には難しい印象がある。CakePHPはフレームワークの中でもトップクラスの簡単さで、初心者でも使える。面倒なインストールや設定はほぼなしで、書くコードの量も少ない。サーバーやコマンドライン、ライブラリなどの前提知識が天弧盛りだと初心者は泣きたくなるが、CakePHPはそんなことはない。Ruby on Railsに似たMVC構成をとっているのもわかりやすい。その一方で、拡張しまくりたい上級者にも自由に使えるという、「全てのレベルのPHPユーザー」のためのフレームワークだと説明した。

 続いて、国内でのCakePHPの歩みについて解説した。黎明期は2005~2006年。p4lifeさんの「10分で作るCakePHPアプリ アプリケーション編」というスクリーンキャストが公開され、安藤さんを含め注目したPHPerが多くいた。そうしたPHPerによって、CakePHP.jpがオープン。CakePHP.jpではフォーラムが活発で、今でもおそらく日本でいちばん活発にCakePHPの話がされている。そうした中でCakePHPに関して書かれたブログが増え、CakePHPについて日本語で情報が読めるようになった。

 2007年は飛躍期。公開サイトで使われるようになった。「@ニフティトピックイット」というソーシャルニュースサイトが公開され、「CakePHPで作られている」という噂が聞こえてきたのでサポートに聞いてみたら本当だった。そんなことを聞かれてサポートも困ったと思うが(笑)。このころ、PHP勉強会でCakePHPネタをやったり、CakePHPに関する書籍がいろいろ出版されたりもした。

 2008年は発展期。CakePHP勉強会が始まり、このカンファレンスに至るまで、すごい勢いで参加者が増えている。世界を見ると、同じようにCakePHPのカンファレンスや勉強会が盛んになっている。「フェイス女学園」という、顔写真を投稿すると採点してくれるサービスが王様のブランチで紹介されたが、これもCakePHPで作られた。アシアルの調査した「いちばん使ってみたいPHPフレームワーク」でも1位をとり、去年から急激に伸びたようだ。

 ちなみに、PHPユーザー会の参加登録システムevents.php.gr.jpも、haltさんがえいやとCakePHPで作り直した。codereposにソースがあって、CakePHPなので手を入れやすいため、懇親会参加集計機能など便利な機能が追加されたりしている。CakePHPというと小規模サイト向けという印象があるが、このようにアクセスの集中するサイトでも使われている。Firefoxのアドオン配布サイトもCakePHPで作られており、信頼性が高くなってきた。

 最後に、CakePHPを始めるには。CakePHPは、あなたのPHP動作環境でもきっと動く、phpMyAdminと同じぐらい簡単と説明した。

 教材として、初心者限定のハンズオンをやったときの動画とスライドが公開されているので、入門にわかりやすい。また、公式マニュアルのbook.cakephp.orgは絶対にブックマークに入れましょうと紹介。日本語訳も整っていて、ブラウザ上から翻訳情報を投稿できるしくみで、コミットランキングもあり、協力して翻訳できるいいしくみ。中途半端に検索して古い情報を読むより、まず公式マニュアルを読んでからネットを探そうとアドバイスした。

 最後に、PHPを覚えたら、もう次はいきなりCakePHPを覚えるといいんじゃないかという言葉で締めた。

  • Q:簡単といえ、それでもひっかかりやすい場所があれば
    • A:ハンズオンのときの経験でいうと、Apacheのmod_rewriteが有効になっているかどうか。設定ファイルの場所が環境によって違う。
  • Q:stableの1.1を使うか、1.2を使うか、いつも迷う
    • A:きっと世界中で同じことを悩んでいるだろう。1.2は十分安定していると思う。events.php.gr.jpでも使っていて、負荷に耐えている。名前は言えないが企業のサイトでも1.2が使われている。迷ったら1.2。
  • Q:1.2対応の「CakePHPガイドブック」の出版予定は(笑)
    • A:著者の間でも対応したいとはいっているが、未定

Agileな開発現場での実践例(岸田健一郎 永和システムマネジメント)

 アジャイル開発で有名な会社で、CakePHPを使って中小企業向け業務パッケージを開発した話。そこでXPをどう適用したかを、テスト駆動開発に絞って、かなり実践的に解説した。

 使ったCakePHPは、多言語対応のため1.2。5月から10月末まで2名で開発した。CakePHP自体に手を入れたのは、モデル名の表示の日本語化だけ。

 さて、CakePHPはテスト駆動開発向きかというと、実は向いてない(笑)。基本的に戻り値が連想配列なので、空の実装でアサーションするとエラーになる。なので、ある程度実装してからテストを書く。

 テスト駆動開発をKPTでふりかえると、Keep(続けたいよかった点)は、CakePHPがβ、RC1、RC2、RC3と変化しても影響度がすぐわかること。テストコードがあればアップデートしても追える。また、テストがあればデグレはほとんどない。さらに、テストコードがあれば、ほかのメンバーが書いたコードの意味を把握しやすいため、PHPを知らないRailsエンジニアが2か月で立派なCakePHPプログラマになった。

 Problem(改善したい問題点)は、テストケースもれがあったこと。また、Controllerのテストは書きにくいのであまり書いていない。さらに、テストコードが長すぎて失敗ケースだけやりたいのに時間がかかるということがあった。

 Try(次回の課題)は、Problemを受けて、テストコードを分割しようということ。テストの実行に3分以上かかるなら分割したほうがいい。また、MVCどこになにを書くか人ごとに違うので、パターン化してテスト漏れを防ぐ。さらに、メソッド単位でテストできるようにもしたい。

 こうした経験を受けて、CakePHPでテスト駆動開発するための「虎の巻」が語られた。

level 0 DBは$testで設定する
テスト用のDBを分けたいとき。'prefix'にDB名をセットする。
level 1 関連は自分でセットする
やらなくてもいいけどJOINされない。
level 2 名前づけ重要
CategoryTestのようなクラス名が被りがちなので、名前の規則をつけて被らないようにする。
level 3 fixtureに注意
テーブルも自動で作ってくれるが、スキーマ情報をインポートするとテーブルが自動生成しない。オレオレCakeTestFixtureを作ってしのいでいる。
level 4 コンポーネントは自分でセット
コンポーネントのテストで、そのコンポーネントを使っているところはテストされない
level 5 独自FormHelperは初期化が複雑
出力されるHTMLタグをテストするときなど。CakePHPのTestでいろいろ初期化しているので、それのコードを参考にするとよい。
Level 6 計算結果はassertidenticalで
assertだと「===」なので型がチェックできない。
Level 7 Shellテストの決まり
1.2からの機能。Shellクラスがない場合があるので、自分で書く
level 8 Controllerにロジックを書かないこと
Authなど依存関係が多い。なるべくComponentを使う
level 9 Mockは積極的に使おう
SimpleTestの機能。テストごとに条件を設定するための前工程をだらだら書くのはムダ。ただし、RC3からComponentの初期化がstartControllerより後になったので注意。実は、テスト用のコントローラにパラメータでさしかえられる。

 最後に、「面倒がらずに一度書けば何度でも役に立つのがテストコード」「初期化に罠が多いので注意しよう。逆にテストケース自体は普通の書き方」「Cake本体のテストコードがお手本」とまとめて、「これで明日(日曜だけど)からみんなTestでHappyに」と締めた。

  • Q:テストを書くとそのぶん開発工数が増えるという声について
    • A:キャンペーンサイトなどの短い寿命のサイトなら必ずしも書かない場合も。自分たちがメンテするなら、バグ対応や再現が大変なので、テストを書く。ウォーターフォールで仕様がかっちり決まっているなら必要ないかもしれないが、Webのように仕様変更があるならテストを書こう
  • Q:テストケース作成にどれぐらい割りあてているか
    • A:1アクションを1時間で、そのうちテストコードの実装は半分ぐらい。結合テストでバグが見つかるぐらいなら、倍かけてもいいと思う
  • Q:倍がかかると、ボリュームがないと回収できないと思うが、線引きは
    • A:単体テストをしっかりやれば結合テストの時間は必ず削減できる。が、やはり周期の短いサイトでは厳しい。保守のコストも考える
    • (司会)OSSのフレームワークを使っていると、バージョンの変化があるので、テストがあるとフォローしやすい

午後のセッション前の小話

 挙手によるアンケートで、PHPを書くのに使っているエディタを質問。Eclipse、vim、Emacsが多いみたい。

Garrett J Woodworth氏 招待講演(Garrett J Woodworth:Cake Software Foundation)

 CakePHP開発チームのプロダクトマネージャによる講演。考えかたなどの抽象的な話をまじえつつ、わかりやすく説明していた。

 まずCakePHPの歴史を説明した。2005年の4月に、ポーランド人のマイケルさんがCakePHP 0.2を公開。このときはアイデアを形にしたという感じだった。同年の7月2日にはcakephp.orgが作られたが、7月6日にはマイケルがプロジェクトを離れた。Garretさんは9月5日に最初の投稿をして、10月4日にプロダクトマネージャになった。

 続いて、大学で哲学を専攻したという自分のバックグラウンドを語り、それを受けてCakePHPの思想を説明した。西洋の考えで「State of Nature」(自然の状態)という言葉がある。PHPのフレームワークができる前は、PHPもそうだった。それに対してフレームワークは社会のルール作りであり、CakePHPもカオス状態に秩序をもたらすという考えによるものだ。仕組みによって、より自由が得られ、問題に集中できるという考えだ。

 CakePHPのBest Principlesは、次のとおり。

intelligent defaults(理にかなったデフォルト)
書くコードの量が減る。必要なときだけ変更すればい。
simple readable code(短く読みやすいコード)
他の人がすぐにプロジェクトに参加できる。開発者すべてが短い時間に多くを達成できる。
limit the features(機能を制限する)
すべての機能をもりこむではなく、できるだけ多くの人が必要とする機能を。
make it work, make it will better
まず動くものを作り、あとから改善していく。
release early, release often
みんなからの反応が返ってくる。どんな使いかたがされているか、どんな問題があるかを早めにフィードバック。

 ここで、関数の設計の悪い例として、長い名前の関数に決まった引数を与える例をとりあげた。引数の種類ごとに関数が増えるし、機能が増えるとさらに関数が増える。そのかわりに、単純な名前の1つの関数に配列でオプションを与えるのがCakePHP流で、これなら柔軟だし、あとからオプションを追加できる。

 CakePHP開発チームは、みんなで話しあいをしてまとまっていくようにコーディングをしていく。ただ課題をのりこえるだけではなく、開発によってモチベーションを上げて経験と成長につなげていく。心がまえとしては、「be polite」(礼儀ただしく)、「design, test, review, document」(コードが取りいれられるまでの過程)、リファクタリングと最適化。

 CakePHPではチケットシステムを公開している。貢献度ごとに分けると、いちばん悪い例は、説明もろくになく、再現方法もなく、カテゴリもめちゃくちゃなチケット(笑)。それよりよいのは、説明あり、再現方法も書いてあるチケット。さらにがんばると、パッチもついている(笑)。もっといい努力は、テストケースがついていること。最高の努力は、テストケースとパッチの両方がついていること(笑)。

 さて、午前中に、1.1がいいのか1.2がいいのかという質問があった。1.1はstableで、フレームワークを使いはじめたばかりで問題にあいたくない場合や、波風をたて早く抜け出したいプロジェクト(笑)でおすすめ。リリース版は、earlyでoftenの考え方だが、プロダクションで使えるように、バグのチケットが出ているのにリリースすることはしない。

 リリース版以外では、trunk版は、挑戦的な開発者向けだが、それなりに安定しているもの。nightly build版は、その時点の開発版のスナップショット。branchは、開発のbleeding edgeで、バグがはいったり直したりしている現場だ。

 続いて、「Making Clean Code」の秘訣を語った。一番は、書く時間より長い時間を考えることに使うこと。また、話しあうことで、これまでに考えたこともなかったアイデアが出るかもしれない。そうして、コードを書く前に調査が済んで考えがまとまっている状態にする。「Think outside of box」、つまり、最善の答が、自分の慣れているパターン以外のところにある場合だってあるので、さまざまな可能性を考える。そして、チームには新しい機能をいれたがる人がいるかもしれないが、ちょっと待って細部まで考えることが大事だ。そうして考えたことや学んだ知識、ほかの人に伝えていくといい。

 ここで、「Bad cake」と「Good cake」を比較した。Bad cakeはControllerにコードがたくさん書かれているcake。テストが難しくなる。Good cakeはモデル部分がぶ厚くなって、フレキシブル。

 これからの予定は、1.2安定版がまもなくリリース。でもその前にRC4が出る。そのあと、1.3まではPHP4と5に対応する。機能も増やすので期待してほしい。

 2.0ではPHP5のみ対応にする。PHP5の機能を活用するためだ。3.0も将来的には出すだろうが、PHP自体もいろいろ変わるので、そのとき。

 book.cakephp.orgでは、日本のグループがNo.1なので、ほかの言語のグループの模範になってほしい。あと、bakery.cakephp.orgには、個人から投稿された技術記事がたくさんあるので、英語だけどぜひ参考にしてほしい。

 最後に、どのフレームワークがいいかという質問が世界中で飛びかっているということで、Zend FrameworkやSymfonyとCakePHPを比較してみせた。Garrettさんが使ったものさしは、バグトラッキングシステムでstable版に出されているバグチケットの数。ZendやSymfonyではstable版でもけっこうバグが残っているが、CakePHPではリリース前のRC3でも15バグ、これはバグがとれてからリリースするという方針によるものだと、CakePHPをアピールした。

  • Q:「limit the feature」(秩序)と「think outside of the box」(可能性)のかねあいを、CakePHPコアの開発でどう考えているか
    • A:利用者のフィードバックが重要。チームでは日々話しあっている。たとえばプラグインシステム。プラグインシステムで新しい機能を開発できるし、ほかのプロジェクトでも使える。これをもっと簡単にできないかと考えている。
  • Q:ControllerよりModelで書く、みたいなTipsをもうすこし
    • A:機能をどこに書くかを最初に決めておくのが大切。みんなが読みやすく、開発しやすい。1.2の機能として、同じコントーラでRSS、XML、JSONに対応できるようにしたので、コントローラを同じにしておくのが大事。1.2のAPIにいろいろ機能がつめこまれているので、それを理解するといいコードが書ける。
  • Q:日本語には単数形と複数形はないが
    • A:Naming Conventionは重要。国を越えて開発者が理解しあえるだろう。
  • Q:開発環境は
    • A:TextMate。
  • Q:(英語の質問を聞きとれず)
    • A:No。チケットが残っているのにリリースすることはない。βからRC1までに時間がかかったのは、バグをつぶしたから。
  • Q:機能拡張の要求に対して、判断基準は
    • A:まずチームで話しあって決める。機能がコンポーネントなどで実現できるならコアには入らないかもしれない。開発チームはみんな経験豊富なので、よい判断ができると信じている。

XoopsCubeなのにCakePHPを使う!(鶴岡直也 株式会社RYUS)

 「そろそろ眠くなったころかなと」とか「ビジネスの話」とか言いながら、軽妙な口調で濃いネタを話した。

 まず自己紹介。events.php.gr.jpやServices_Photozou、AuthKitten(ねこ認証)、Device_USB_MissileLauncher(USBミサイルランチャー操作)などを紹介して一部ビデオで紹介。で、EthnaからCakePHPに事実上乗りかえたと。

 前半ではXoopsCubeを紹介した。世の中のXoopsCubeで作られたサイトをいろいろ表示して、デザインがいろいろ変えられるところを見せた。XoopsCubeはモジュールで拡張できるCMSで、機能ごとにモジュールになっている。モジュールを一覧から選ぶだけで追加できて、PHPコードや設定が不要、ユーザーが業者なしでやれる(という夢を見れる)。

 ここで、カレンダーモジュールを例にXoopsCubeの内部構造を解説。基本は、index.phpからheader.phpとfooter.phpincludeして表示している。ここで実際にコードを画面に表示して、スーパーグローバル変数を参照しているとか、カオスとか、3,900行ぐらいあるとか解説した。

 ここから、モジュールとしてCakeアプリを載せるという話につなげた。前日に突貫で作った「CakeTwitter」をその場でインストール。が、ここでトラブル発生。コマンドラインのmysqlフロントエンドからdrop tableとかごにょごにょやってから、表示に成功した。

 ファイル構成を見ると、caketwitterフォルダの下がCakePHPでおなじみの構成になっている。Xoopsのindex.phpにしかけがしてあり、そこでCakePHPをレンダリングしている。ややこしいことしているのはindex.phpだけ。コードは、global xoopsUserだけXoopsで、あとはCakePHPのお作法。Xoops側のデータを使うために、XoopsのテーブルをCakePHPのモデルで使うには、useTableで直に指定。セッションがなやみどころで、Xoopsから呼ばれるのでCakePHPではセッションをスタートできないので切る。

 などなど、いろいろやっかいな点があるので、XoopsCube上でCakeを利用するためのモジュールの雛形として、「CubeCake」モジュールを作ったということが最後に発表された。CubeCakeをふつうにモジュールとしてインストールすると、CakePHPのデフォルト画面が表示される。あとはCakePHPとして開発する。その場で、「みなさんおなじみ、実務では使わないけど人に見せるときに使うコードです」ということで、var $scaffoldでデモしてみせていた。CubeCakeは、RYUS社のサイトに、社長にないしょで置いてあるとか(笑)。

  • Q:MTみたいにぼこぽこ作れる機能があるといい
    • A:そのとうりだが、時間が足りなかった。
  • Q:自分でもっと機能を持ったCMSを作ったほうがいいと思うことも
    • A:そんなふうに考えていた時期が私にもありました。が、やはりよくない。新しいものの学習コストがかかる。あるものを拡張して機能を追加するほうがよい。
  • Q(Garrett):外部とのやりとりをするコンポーネントを作ってそこでCakePHPとつなぐ設計は考えたことはあるか
    • A:今は考えていない。XoopsCubeには外部と通信する機能はあるので、そういうものと組みあわせると面白いかなとは思う。

LT:Tplcutterを用いた超高速ウェブサイト開発(MASA-P)

 ここからはライトニングトーク。一番手は、Viewを簡単に実装できるツール「Tplcutter」。

 デザイナーに制作依頼して、できたHTMLを元にViewを作る場合がよくある。このとき、デザイナーはhelperなどの部分を確認できない、いちどViewを作ったあとデザイナーに再変更してもらうのが難しい、更新すべきファイルが点在するためミスが入る、といった欠点がある。

 そこで、デザイナーからもらったファイルを丸ごとコピーするだけでいいように「Tplcuter」を作った。CakePHPでも使える。元のHTMlにコメントタグで指定を入れておき、所定のディレクトリにコピーしてコマンドを実行すると、Tplcutterがテンプレートとレイアウトに分割してくれる。ということで、実際にデモしてみせた。

LT:I love CakePHP(MODE A あおき)

 旅行会社のサイトをCakePHPで開発した話。メリットとして、Ajaxが簡単に書けた。いままでの旅行サイトでは旅行代金の計算のUIが使いづらいが、その場で確認できるようになった。

 開発にあたり、基幹系DBとしてマイクロソフトのSQLServerが動いていて、テーブル名やカラム名に日本語が使われていたが、動いてよかっった。

 最後に、1.1で開発したので1.2に移行したい、ということで、問題はどうやってクライアントからお金をもらうかだ(笑)ということでまとめた。

LT:CakePHPで連想検索(青木隆平)

 連想検索とは、「言葉相互の近接性を根拠とした連想結果を提供する検索エンジン」とのこと。利用法として、だれかの問いに新たな視点を投げかけるツールができるが、コンテンツホルダーが気軽に連想検索を利用できる機会はない。そこで、CakePHPで連想検索が気軽に使えるCMSを作るという「AssocPublisher」プロジェクトをやっていることを紹介した。現在開発中で、完成したらオープンソースで公開する予定。ブログで開発の顛末記を連載している。

LT:CakePHPerのためのBDDのすすめ(梶原大輔)

 BDD(Behavior Driven Development:ふるまい駆動開発)は、ふるまいにあわせて仕様を書く方法で、RubyのRSpecが有名。PHPでもPHPSpecがあって、ドキュメントも充実、インストールもPearで簡単だと紹介した。

 CakePHPはSimpleTestでユニットテストしているといいつつ、CakePHPでPHPSpecを使ってみせるところをデモしてみせた。今後、Webからできるようにするとか。

Garretに質問

 最後に司会者さんが、Garretさんに日本の開発者へのリクエストを質問。Garretは、今日の発表などいろいろ面白いので、日本語以外のCakePHPユーザーへも情報を発信していけるとうれしいと答えた。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/487-264b6fd6

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad