「第2回 symfony1.4勉強会」に参加してきました
4/28 「第2回 symfony1.4勉強会」に参加してきました。
内容としては、
・挨拶
・参加者による自己紹介
・MVCモデルの説明
・サンプルアプリを使ってsymfony1.4の説明
・質疑応答
・交流会
MVCモデルの説明については個人的に10年近くMVCモデルで開発してるのでメリットは大体理解してるし、理解してるから10年近くもなるべくMVCでの開発を心がけている。
MVCの説明として
・楽
・多少悩む
と説明がありました。
講師の方のまとめとして「悩まなければ楽」と締めましたが、確かに2週目、3週目の方は楽でしょうね。
でも俺みたいに導入から関わる人は結局悩んで試行錯誤しながらの導入となるから悩まずにやるんなら既に知ってる人を探す必要がありますね。
その後、symfony1.4に関しての説明。
遅いと言われてるけど実際は十分な速度って話を聞けたのは現場を説得する材料になるから良かった。
例として不動産関係のサイトでテストデータ2万件の検索をしてたけど普通に動いてた。
併せて、symfonyを使うメリットを説明。
・実装以外の不安を解決
これはクロスサイトスクリプティングとかDBアクセスとかsymfonyがやってくれるから気にしなくて済むよねってこと
・誰が見てもどこに何があるかだいたい分かる。
symfonyはディレクトリ構造が決まってるから一度覚えれば他の人のプログラムもどこで何やってるかだいたい分かる。(cakeも多分同じだとは思うけど講師の人はcakeはカオス化しそうだと感じたらしい)
・多人数で同時に開発するのに向いてる
他にzendやcakeもあるけどsymfonyが一番向いてると感じたらしい。
そして、サンプルプログラム見ながら実際の実装方法を説明。
まぁ、内容はJobeetやれば被ってる部分はあるかも。
でもやっぱりフォームクラスは使いにくいって話は出てた。
勉強会の全体の雰囲気としてみんなで情報交換してみんなで勉強していきましょうって内容だったから俺個人ももっとsymfony1.4触って情報出せるようにしないと。
内容としては、
・挨拶
・参加者による自己紹介
・MVCモデルの説明
・サンプルアプリを使ってsymfony1.4の説明
・質疑応答
・交流会
MVCモデルの説明については個人的に10年近くMVCモデルで開発してるのでメリットは大体理解してるし、理解してるから10年近くもなるべくMVCでの開発を心がけている。
MVCの説明として
・楽
・多少悩む
と説明がありました。
講師の方のまとめとして「悩まなければ楽」と締めましたが、確かに2週目、3週目の方は楽でしょうね。
でも俺みたいに導入から関わる人は結局悩んで試行錯誤しながらの導入となるから悩まずにやるんなら既に知ってる人を探す必要がありますね。
その後、symfony1.4に関しての説明。
遅いと言われてるけど実際は十分な速度って話を聞けたのは現場を説得する材料になるから良かった。
例として不動産関係のサイトでテストデータ2万件の検索をしてたけど普通に動いてた。
併せて、symfonyを使うメリットを説明。
・実装以外の不安を解決
これはクロスサイトスクリプティングとかDBアクセスとかsymfonyがやってくれるから気にしなくて済むよねってこと
・誰が見てもどこに何があるかだいたい分かる。
symfonyはディレクトリ構造が決まってるから一度覚えれば他の人のプログラムもどこで何やってるかだいたい分かる。(cakeも多分同じだとは思うけど講師の人はcakeはカオス化しそうだと感じたらしい)
・多人数で同時に開発するのに向いてる
他にzendやcakeもあるけどsymfonyが一番向いてると感じたらしい。
そして、サンプルプログラム見ながら実際の実装方法を説明。
まぁ、内容はJobeetやれば被ってる部分はあるかも。
でもやっぱりフォームクラスは使いにくいって話は出てた。
勉強会の全体の雰囲気としてみんなで情報交換してみんなで勉強していきましょうって内容だったから俺個人ももっとsymfony1.4触って情報出せるようにしないと。
スポンサーサイト
symfony1.4 jobeet 10日目
今回はフォームクラスの説明
フォームフレームワークは以下の3つの部分で構成されます。
今後調査としてはバリデーション・ウィジェットをどこまでカスタマイズ出来るかを調べる。
これは実際に何かアプリケーション作ってみないと分からないのでチュートリアル終了後に適当なアプリ作ってみて色々タメ所定です。
チュートリアルを進める上で一点躓いた部分が管理メニューの表示。
特にチュートリアルに記述がなくて悩みましたが以下のURLで無事表示されました。
http://localhost:8080/frontend_dev.php/job/job_expired
フォームクラスに関しては上記でも書いたようにバリデーション・ウィジェットのカスタマイズや入力内容の確認画面の追加の仕方などまだ調査が必要なので別途詳細は調べる予定です
フォームフレームワークは以下の3つの部分で構成されます。
- バリデーション: バリデーションサブフレームワークは入力(整数、文字列、Eメールアドレス・・・) をバリデートするクラス群を提供します。
- ウィジェット: ウィジェットサブフレームワークは HTML フィールド(入力、テキストエリア、選択・・・) を出力するクラス群を提供します。
- フォーム: フォームクラス群はウィジェットとバリデーターで構成されるフォームを表し、フォームを管理しやすくするメソッドを提供します。それぞれのフォームフィールドに、個別のバリデーターとウィジェットが設定されます。
今後調査としてはバリデーション・ウィジェットをどこまでカスタマイズ出来るかを調べる。
これは実際に何かアプリケーション作ってみないと分からないのでチュートリアル終了後に適当なアプリ作ってみて色々タメ所定です。
チュートリアルを進める上で一点躓いた部分が管理メニューの表示。
特にチュートリアルに記述がなくて悩みましたが以下のURLで無事表示されました。
http://localhost:8080/frontend_dev.php/job/job_expired
フォームクラスに関しては上記でも書いたようにバリデーション・ウィジェットのカスタマイズや入力内容の確認画面の追加の仕方などまだ調査が必要なので別途詳細は調べる予定です
virtualboxインストール
何を思ったか夜中にふとvirtualboxでlinuxの仮想環境を入れてみたくなり、作業しました。
仮想環境はずっと興味があったが延ばし延ばしになってたのでいい機会だったかも。
とりあえずいつものように参考になるサイトの検索。
すると以下のサイトが見つかったのでこのサイトの手順にそって作業開始。
http://linux.owlnet.jp/virtualbox01.html
virtualboxのバージョンが違ったので設定画面などは違ったがほぼインストーラの指示に従い、設定もほぼデフォルトのままインストール完了。
linuxはサイトにあるようにUbuntuを選択、前職場のネットワークチームの人にはcentOSが使い易いと言われたのでそのうち入れ替えるかも。
Ubuntuもイメージファイルをダウンロードしてきて、ほぼデフォルトのままインストール完了。
イメージファイルのインストールで残り1時間とか出てたのでトリック2を見ながら待ってたらあっという間だった。
とりあえず無事インストール出来たので使い慣れてるCUI(CLI)から軽く触ってみた。
とりあえずユーザはインストール時に作成したユーザでログインしたのでroot権限が無い。
デスクトップ(GUI)からrootのパスワード変更しようとしたけど上手くいかず困ったのでgoogle先生に聞いてみたら以下のサイト発見。
http://80286.blog62.fc2.com/blog-entry-17.html
今後の課題としては
仮想環境はずっと興味があったが延ばし延ばしになってたのでいい機会だったかも。
とりあえずいつものように参考になるサイトの検索。
すると以下のサイトが見つかったのでこのサイトの手順にそって作業開始。
http://linux.owlnet.jp/virtualbox01.html
virtualboxのバージョンが違ったので設定画面などは違ったがほぼインストーラの指示に従い、設定もほぼデフォルトのままインストール完了。
linuxはサイトにあるようにUbuntuを選択、前職場のネットワークチームの人にはcentOSが使い易いと言われたのでそのうち入れ替えるかも。
Ubuntuもイメージファイルをダウンロードしてきて、ほぼデフォルトのままインストール完了。
イメージファイルのインストールで残り1時間とか出てたのでトリック2を見ながら待ってたらあっという間だった。
とりあえず無事インストール出来たので使い慣れてるCUI(CLI)から軽く触ってみた。
とりあえずユーザはインストール時に作成したユーザでログインしたのでroot権限が無い。
デスクトップ(GUI)からrootのパスワード変更しようとしたけど上手くいかず困ったのでgoogle先生に聞いてみたら以下のサイト発見。
http://80286.blog62.fc2.com/blog-entry-17.html
上記、コマンドで無事rootで作業出来るようになりました。suコマンドでrootになる場合にはrootのパスワードを作成する必要がある。
パスワードの作成は以下の方法で可能
[コマンド]
$ sudo su -
# passwd
今後の課題としては
- デスクトップが立ち上がらないようにする(いつもコマンドラインだったから使い方が分からない)
- SSHインストール
- LAMP環境の構築
- UbuntuからSentOSに変更
【Ruby】とべとべ自習室【Rails】に行ってきました。
2010/4/10 Ruby on Rails の勉強会に行ってきました。
内容としてモクモクとRuby on Railsの自習。
最後にLTが1件にありました。
実は俺個人としては前日の夜中からRoRとの闘いが始まっていました。
ノートPCにRoRの環境が入ってなかったので流石に勉強会でインストールから始めたらコード書く時間なくなるぞと思い、前準備として環境のインストールを始めました。
これが俺とRoRの長き闘いになろうとは思いもせず。。。
とりあえずインストール開始。
書籍は一応3年ぐらい前に購入した者が1冊あるのですが前回やったとき既にバージョンの関係で本の通りやっても動かなかったのでその本は使用せずネットで調べながらインストール。
まず、見つけたサイトは以下の手順で説明されてました。
なんでWindowsでしかもadminで作業してるのにそんなんで怒られないといけないんだと思ってフォルダ見てみると「読み取り専用」にチェック付いてる。んじゃ、読専外せばいいじゃんってことで読専が外れない。
で、色々格闘してたらRubyインストール時に「RubyGems Package Manager」としてGem入ってた。
ちょっとグチャグチャになってきたので一度アンインストールして再度挑戦。
んで、上記サイトを使うのはやめて別のサイトを使用。
そこでは以下の手順でインストールの説明がされてました。
んじゃ、ついでなんでApacheとの連携もしとこうと言う事で作業開始。
しかし、ここでまたハマってしまった。
Apacheがmod_ruby.soを上手く読み込めない。
色々試して見たが環境周りはあまり強くないのでよく分からない。
サンプルのApacheが2.0で俺のApacheが2.2だからそれも関係あるのかな?と思いながらもこの時点で4:00とかだったからApacheとの連携は諦めて寝る。
そして、勉強会当日。
やっぱり昨日の中途半端な状態(Apacheとの連携)は気持ち悪いの3年前勉強した時に使用したInstantRails使用しようと思ったがsvnしか見つからないのでめんどくさくてやめました。
ただ、InstantRails探す前にRubyまたアンインストールしちゃったので再度前日の夜中にやったインストール作業開始。
結局インストール作業で1~2時間ほど無駄にしてしまった。
その後、サンプルとして書かれてあるmemoアプリの作成を開始。
しかし、またまた問題がサイトで説明されているymlの内容と俺の環境のymlの内容が違いすぎる。
(俺もこの業界長いのでサンプルはあくまでサンプルなのは理解してるけどkeyが全く違ったりで混乱)
で、他に参考に出来そうなサイトが無いか探してたらスライドと共に説明されているサイトを見つけたのでそのサイトを参考にtodoアプリの作成を開始。
四苦八苦しながらもどうにかscaffoldで作成されたtodoアプリの動作確認が取れた。
この段階で結構いい時間になってて、@kwappaさんからビール買出しに行きますよ。って話が出たから持ってくるの忘れたライター買うついでに荷物持ちに名乗り出て買出しに出発。
その後、@ayuminさんのLTが始まり時間オーバーしてしまうほど熱く語られてました。
そして、2次会に移動。
2次会で@ayuminさんのオフシェアの話やアジャイルに対する考え方を聞かせてもらって勉強会に参加すると毎回のことだが俺もそろそろきちんと考えないとだめだなぁと感じました。
今回は言語的にほぼ初心者のRoRの勉強会に参加しましたが結構中途半端で終わったので時間見てきちんと終わらせるか次回勉強会できちんと終わらせようと思います。
scalaの勉強会とかにも参加したいなぁ。
内容としてモクモクとRuby on Railsの自習。
最後にLTが1件にありました。
実は俺個人としては前日の夜中からRoRとの闘いが始まっていました。
ノートPCにRoRの環境が入ってなかったので流石に勉強会でインストールから始めたらコード書く時間なくなるぞと思い、前準備として環境のインストールを始めました。
これが俺とRoRの長き闘いになろうとは思いもせず。。。
とりあえずインストール開始。
書籍は一応3年ぐらい前に購入した者が1冊あるのですが前回やったとき既にバージョンの関係で本の通りやっても動かなかったのでその本は使用せずネットで調べながらインストール。
まず、見つけたサイトは以下の手順で説明されてました。
- Rubyのインストール
- Gemの最新版をインストール
- Ruby on Rails のインストール
なんでWindowsでしかもadminで作業してるのにそんなんで怒られないといけないんだと思ってフォルダ見てみると「読み取り専用」にチェック付いてる。んじゃ、読専外せばいいじゃんってことで読専が外れない。
で、色々格闘してたらRubyインストール時に「RubyGems Package Manager」としてGem入ってた。
ちょっとグチャグチャになってきたので一度アンインストールして再度挑戦。
んで、上記サイトを使うのはやめて別のサイトを使用。
そこでは以下の手順でインストールの説明がされてました。
- Ruby,RubyGemsのインストール
- Railsのインストール
- gettextのインストール(日本語化に使用)
- gtk-win32-develのインストール(gettextに必要)
んじゃ、ついでなんでApacheとの連携もしとこうと言う事で作業開始。
しかし、ここでまたハマってしまった。
Apacheがmod_ruby.soを上手く読み込めない。
色々試して見たが環境周りはあまり強くないのでよく分からない。
サンプルのApacheが2.0で俺のApacheが2.2だからそれも関係あるのかな?と思いながらもこの時点で4:00とかだったからApacheとの連携は諦めて寝る。
そして、勉強会当日。
やっぱり昨日の中途半端な状態(Apacheとの連携)は気持ち悪いの3年前勉強した時に使用したInstantRails使用しようと思ったがsvnしか見つからないのでめんどくさくてやめました。
ただ、InstantRails探す前にRubyまたアンインストールしちゃったので再度前日の夜中にやったインストール作業開始。
結局インストール作業で1~2時間ほど無駄にしてしまった。
その後、サンプルとして書かれてあるmemoアプリの作成を開始。
しかし、またまた問題がサイトで説明されているymlの内容と俺の環境のymlの内容が違いすぎる。
(俺もこの業界長いのでサンプルはあくまでサンプルなのは理解してるけどkeyが全く違ったりで混乱)
で、他に参考に出来そうなサイトが無いか探してたらスライドと共に説明されているサイトを見つけたのでそのサイトを参考にtodoアプリの作成を開始。
四苦八苦しながらもどうにかscaffoldで作成されたtodoアプリの動作確認が取れた。
この段階で結構いい時間になってて、@kwappaさんからビール買出しに行きますよ。って話が出たから持ってくるの忘れたライター買うついでに荷物持ちに名乗り出て買出しに出発。
その後、@ayuminさんのLTが始まり時間オーバーしてしまうほど熱く語られてました。
そして、2次会に移動。
2次会で@ayuminさんのオフシェアの話やアジャイルに対する考え方を聞かせてもらって勉強会に参加すると毎回のことだが俺もそろそろきちんと考えないとだめだなぁと感じました。
今回は言語的にほぼ初心者のRoRの勉強会に参加しましたが結構中途半端で終わったので時間見てきちんと終わらせるか次回勉強会できちんと終わらせようと思います。
scalaの勉強会とかにも参加したいなぁ。
symfony1.4 jobeet 9日目
今回は機能テストの説明。
イメージとしてはseleniumをコマンドラインから実行してる感じかな。
Webシステムのテストってこのリクエスト投げるとこんなレスポンスが返るよね。の繰り返しだからなんとか自動化したくてseleniumとかも調べたけどsymfonyの機能テストはまさに俺が求めてたもの。
1.0でも一度使ったんだけどその時はスケジュールがきつくなって途中でやめてしまった。
まずは、機能テストを実現するためのsfBrowserの説明とメッソドの説明。
この辺はチュートリアル読んでもらって要はsfBrowserでブラウザの動きをシミュレート出来ますよって話。
次に実際にテストを行うためのsfTestFunctionalクラスの説明。
limeでisとかでテストしてたのをリクエストが正しいかだとsfTestFunctionalのisParameterでチェックしたりする。
sfTestFunctionalが持ってるメソッドはチュートリアル見てください。
実際にテストケースを追記していくクラスはモジュール作成時にモジュール名ActionTest.phpというファイルでスケルトンコードが作成されます。
試しにカテゴリモジュールのテストを行います。
4件のテストケースが実行され、2件がエラーになりました。
これは自動で作成されるテストコードが以下のテストを行ってるためです。
category/indexの表示テスト
1.モジュールがcategoryである。
2.アクションがindexである。
3.ステータスコードが200である。
4symfonyのデフォルトページではない。
今回、categoryにindexアクションが存在しないので2,3のテストがエラーとなります。
機能テストを行う際にはデータベースに接続する必要があります。
job/indexを表示するとjobデータが○件表示される。とかは実際テーブルからデータ持ってこないとテストできないですよね。
そのためのテストデータを読み込むための前準備のやり方が書かれています。
具体的には先程のsfTestFunctionalクラスを継承した独自の機能テストクラスを作成します。
その後、sfTestFunctionalを使用していた部分を独自の機能テストクラス(JobeetTestFunctional)をインスタンス化してテストを行います。
テスト内容としてResponseに対してcheckElementメソッドを使用して表示内容の確認も行えます。
ただ、ここで問題が。。。
jobモジュールのテストjobActionsTestを実行したところ独自の機能テストクラス(JobeetTestFunctional)がnot Foundになってします。
要はクラスが見えてないだけだからrequire_onceしてやれば普通に動きます。
さんざんtwitterで愚痴を言った後にチュートリアルよく見るとJobeetTestFunctionalのコードが以下のようになってました。
昨日からずっとtestフォルダの下で作業していたのでよく見ずtestフォルダの下にJobeetTestFunctionalを作ってしまいそりゃ見えないよって感じになってました。
(symfonyはlibやapp/libなどlibフォルダの下にクラスを配置すると自動的にロードされます。)
で、無事サンプルのテストケースが動いたのでこの後2日目に書かれていた要件にそったテストケースを追加していく。
途中テストコードのリファクタリングの仕方などがあり、無事実装完了。
今回はチュートリアル通りコードを書いてるので特に問題無いのですが実際使用する際はResponseの情報がないとなんでエラーなのか分からない時があると思います。
そんな時は以下のコード使用することでResponseの内容を表示出来ます。
1つのテストクラスが1つのテストスイートって感じですね。
毎回毎回、テストケース全部通すのはめんどくさいので"--only-failed"という便利なオプションも用意されています。
これは前回通らなかったテストのみ強制実行するオプションです。
試しにcategoryActionsでエラーが発生するように修正してテストを実行します。
その後、テストが通るように再度修正し、"--only-failed"オプションを付けて実行するとエラーだったテストケースのみが実行されます。
その状態で再度テストを実行すると全テストケースが実行されます。
(イマイチ説明が下手だな)
とにかく、"--only-failed"は便利!!
イメージとしてはseleniumをコマンドラインから実行してる感じかな。
Webシステムのテストってこのリクエスト投げるとこんなレスポンスが返るよね。の繰り返しだからなんとか自動化したくてseleniumとかも調べたけどsymfonyの機能テストはまさに俺が求めてたもの。
1.0でも一度使ったんだけどその時はスケジュールがきつくなって途中でやめてしまった。
まずは、機能テストを実現するためのsfBrowserの説明とメッソドの説明。
この辺はチュートリアル読んでもらって要はsfBrowserでブラウザの動きをシミュレート出来ますよって話。
次に実際にテストを行うためのsfTestFunctionalクラスの説明。
limeでisとかでテストしてたのをリクエストが正しいかだとsfTestFunctionalのisParameterでチェックしたりする。
sfTestFunctionalが持ってるメソッドはチュートリアル見てください。
実際にテストケースを追記していくクラスはモジュール作成時にモジュール名ActionTest.phpというファイルでスケルトンコードが作成されます。
試しにカテゴリモジュールのテストを行います。
4件のテストケースが実行され、2件がエラーになりました。
これは自動で作成されるテストコードが以下のテストを行ってるためです。
category/indexの表示テスト
1.モジュールがcategoryである。
2.アクションがindexである。
3.ステータスコードが200である。
4symfonyのデフォルトページではない。
今回、categoryにindexアクションが存在しないので2,3のテストがエラーとなります。
機能テストを行う際にはデータベースに接続する必要があります。
job/indexを表示するとjobデータが○件表示される。とかは実際テーブルからデータ持ってこないとテストできないですよね。
そのためのテストデータを読み込むための前準備のやり方が書かれています。
具体的には先程のsfTestFunctionalクラスを継承した独自の機能テストクラスを作成します。
その後、sfTestFunctionalを使用していた部分を独自の機能テストクラス(JobeetTestFunctional)をインスタンス化してテストを行います。
テスト内容としてResponseに対してcheckElementメソッドを使用して表示内容の確認も行えます。
ただ、ここで問題が。。。
jobモジュールのテストjobActionsTestを実行したところ独自の機能テストクラス(JobeetTestFunctional)がnot Foundになってします。
要はクラスが見えてないだけだからrequire_onceしてやれば普通に動きます。
さんざんtwitterで愚痴を言った後にチュートリアルよく見るとJobeetTestFunctionalのコードが以下のようになってました。
// lib/test/JobeetTestFunctional.class.php1行目のコメントをよく見るとlibフォルダの下に置くようになっていました。
class JobeetTestFunctional extends sfTestFunctional
{
public function loadData()
{
Doctrine_Core::loadData(sfConfig::get('sf_test_dir').'/fixtures');
return $this;
}
}
昨日からずっとtestフォルダの下で作業していたのでよく見ずtestフォルダの下にJobeetTestFunctionalを作ってしまいそりゃ見えないよって感じになってました。
(symfonyはlibやapp/libなどlibフォルダの下にクラスを配置すると自動的にロードされます。)
で、無事サンプルのテストケースが動いたのでこの後2日目に書かれていた要件にそったテストケースを追加していく。
途中テストコードのリファクタリングの仕方などがあり、無事実装完了。
今回はチュートリアル通りコードを書いてるので特に問題無いのですが実際使用する際はResponseの情報がないとなんでエラーなのか分からない時があると思います。
そんな時は以下のコード使用することでResponseの内容を表示出来ます。
$browser->with('response')->debug();チュートリアルのそってjobモジュールとcategoryモジュールのテスト作成したのですが、以下のコマンドでまとめてテストすることが可能です。
$ php symfony test:functional frontendさらに前回作成したユニットテストもまとめてテストするには以下のコマンドで可能です。
1つのテストクラスが1つのテストスイートって感じですね。
$ php symfony test:all
毎回毎回、テストケース全部通すのはめんどくさいので"--only-failed"という便利なオプションも用意されています。
これは前回通らなかったテストのみ強制実行するオプションです。
試しにcategoryActionsでエラーが発生するように修正してテストを実行します。
その後、テストが通るように再度修正し、"--only-failed"オプションを付けて実行するとエラーだったテストケースのみが実行されます。
その状態で再度テストを実行すると全テストケースが実行されます。
(イマイチ説明が下手だな)
とにかく、"--only-failed"は便利!!
symfony1.4 jobeet 8日目
今回はユニットテストの説明。
1.0でもユニットテストやろうとしたけど挫折して、1.4ではユニットテストも使い易くなってるって記事を読んだ記憶があるのでかなり期待。
後、個人的な課題として開発工程にテスト駆動を取り入れたいので今回と次回機能テストは俺の中で結構重要な意味を持ってます。
まずはlimeテストフレームワークとテストに使用するメソッドの説明。
で、実際サンプルに基づいてJobeetクラスのテスト。
環境がWindowsでCygwinも入っていないのでグリーンにはなりません。(気が向いたらCygwin入れるかも)
その後に実際に以前作ったslugifyメソッドをテスト。
既に存在するメソッドに対してこう動くよねって視点のテストなので問題なく全部通りました。
その後、テストケースにコメントを追加して何のテストを行ったか表示するように修正。
1.0でもそうだったけど試しに日本語入れると当然化けました。
symfonyのソースファイルは基本UTF-8なのに対してコマンドプロンプトはShift-JISなので当然の結果。
そこで以前調べたコマンドプロンプトでUTF-8を表示する方法を実行して無事日本語も表示出来た。
コラム的な感じでカバレッジを調べる方法も書かれてたので試しに実行したらXDebugが入ってないので当然のようにカバレッジの計測は出来ませんでした。
なので、XDebugのインストール。
インストール方法が書かれてるサイトを参考にしてdllのダウンロードとphp.iniファイルの設定をしたけどXDebugが反映されない。
参考にしたサイトでは設定値の追加で"zend_extension_ts"という項目名になっていたのを"zend_extension"に変更したら無事反映されました。
このことをtwitterでつぶやいたら@hidenorigotoさんが以下のサイトを教えてくれました。(感謝)
http://www.php-seed.net/blog/archives/95
そこを見ると
1.zend_extensionに
2.もしデバッグビルドが有効なら、_debugを付けて、
3.もし、スレッドセーフが有効なら、_tsを付ける。
ということらしい。
真面目にtsをtestの略で参考にしたサイトはtest的にこの項目追加してますよって事なんだと思ってた^^;
その後、slugifyは機能が足りてないとの事なので新しい機能の実装。ここで本来のTDDにそってコードの修正を行う。
1.まずテストケースを追加してテストを実行し、レッドを表示(テストを失敗させる)。
2.コードの修正。
3.再度テストを実行してグリーンを表示(修正が正しいことを確認)。
その後、slugifyにはまだバグがあるのでバグを確認できるテストケースを追加して上記の流れ(レッド->修正->グリーン)で再度修正。
iconv(翻字(言語学において特定の言語を記した文字表記を別の文字による表記に移すこと))についてのコラムも記載されているのでついでだからそれもやってみた。
だが、ここで問題が。。。
コラムでは"Développeur Web"のテスト結果は"developpeur-web"となっているがテストが通らない。
で、調べてみるを"Développeur Web"にiconvを実行すると"D'eveloppeur Web"となってるため"'"が"-"に置き換えられてテストを失敗している。
しょうがないので"Développeur Web"のテストの期待値を"d-eveloppeur-web"にしてテストを通した。
さらにこの後、Doctrine モデルクラスのユニットテストの説明
まずはテストに使用するDBの作成とテスト用DBに接続するための設定の追加。
設定の追加は以下のコマンドの実行で完了するのでラクチン。
後は、SQL発行するコードを書いて、上記のユニットテストとほぼ同じ流れでテストを実行。
DB取得してのテストこれでいいが今回saveメソッドをオーバーライドしてるのでそれのテストも行う。
しかし、saveメソッドテストちょっとややこしくインサートするために値のセットが必要なので値をセットするためのメソッドを追加。
その後、ユニットテスト実行して、無事終了。
試しにJobeetJobクラスのカバレッジ測ってみたら100%じゃなかったので、勉強のつもりでカバレッジが100%になるようにテストケースを修正してみた。
100%じゃない理由は__toString・getPositionSlug・getLocationSlugがテストされて無いため、これらのメソッドのテストケースを追加して無事カバレッジも100%になりました。
1.0でもユニットテストやろうとしたけど挫折して、1.4ではユニットテストも使い易くなってるって記事を読んだ記憶があるのでかなり期待。
後、個人的な課題として開発工程にテスト駆動を取り入れたいので今回と次回機能テストは俺の中で結構重要な意味を持ってます。
まずはlimeテストフレームワークとテストに使用するメソッドの説明。
で、実際サンプルに基づいてJobeetクラスのテスト。
環境がWindowsでCygwinも入っていないのでグリーンにはなりません。(気が向いたらCygwin入れるかも)
その後に実際に以前作ったslugifyメソッドをテスト。
既に存在するメソッドに対してこう動くよねって視点のテストなので問題なく全部通りました。
その後、テストケースにコメントを追加して何のテストを行ったか表示するように修正。
1.0でもそうだったけど試しに日本語入れると当然化けました。
symfonyのソースファイルは基本UTF-8なのに対してコマンドプロンプトはShift-JISなので当然の結果。
そこで以前調べたコマンドプロンプトでUTF-8を表示する方法を実行して無事日本語も表示出来た。
コラム的な感じでカバレッジを調べる方法も書かれてたので試しに実行したらXDebugが入ってないので当然のようにカバレッジの計測は出来ませんでした。
なので、XDebugのインストール。
インストール方法が書かれてるサイトを参考にしてdllのダウンロードとphp.iniファイルの設定をしたけどXDebugが反映されない。
参考にしたサイトでは設定値の追加で"zend_extension_ts"という項目名になっていたのを"zend_extension"に変更したら無事反映されました。
このことをtwitterでつぶやいたら@hidenorigotoさんが以下のサイトを教えてくれました。(感謝)
http://www.php-seed.net/blog/archives/95
そこを見ると
1.zend_extensionに
2.もしデバッグビルドが有効なら、_debugを付けて、
3.もし、スレッドセーフが有効なら、_tsを付ける。
ということらしい。
真面目にtsをtestの略で参考にしたサイトはtest的にこの項目追加してますよって事なんだと思ってた^^;
その後、slugifyは機能が足りてないとの事なので新しい機能の実装。ここで本来のTDDにそってコードの修正を行う。
1.まずテストケースを追加してテストを実行し、レッドを表示(テストを失敗させる)。
2.コードの修正。
3.再度テストを実行してグリーンを表示(修正が正しいことを確認)。
その後、slugifyにはまだバグがあるのでバグを確認できるテストケースを追加して上記の流れ(レッド->修正->グリーン)で再度修正。
iconv(翻字(言語学において特定の言語を記した文字表記を別の文字による表記に移すこと))についてのコラムも記載されているのでついでだからそれもやってみた。
だが、ここで問題が。。。
コラムでは"Développeur Web"のテスト結果は"developpeur-web"となっているがテストが通らない。
で、調べてみるを"Développeur Web"にiconvを実行すると"D'eveloppeur Web"となってるため"'"が"-"に置き換えられてテストを失敗している。
しょうがないので"Développeur Web"のテストの期待値を"d-eveloppeur-web"にしてテストを通した。
さらにこの後、Doctrine モデルクラスのユニットテストの説明
まずはテストに使用するDBの作成とテスト用DBに接続するための設定の追加。
設定の追加は以下のコマンドの実行で完了するのでラクチン。
php symfony configure:database --name=doctrine --class=sfDoctrineDatabase --env=test "mysql:host=localhost;dbname=jobeet_test" root mYsEcretDoctrine モデルクラスのテストにはDBに接続する必要があるのでセットアップ用のクラスを追加。
後は、SQL発行するコードを書いて、上記のユニットテストとほぼ同じ流れでテストを実行。
DB取得してのテストこれでいいが今回saveメソッドをオーバーライドしてるのでそれのテストも行う。
しかし、saveメソッドテストちょっとややこしくインサートするために値のセットが必要なので値をセットするためのメソッドを追加。
その後、ユニットテスト実行して、無事終了。
試しにJobeetJobクラスのカバレッジ測ってみたら100%じゃなかったので、勉強のつもりでカバレッジが100%になるようにテストケースを修正してみた。
100%じゃない理由は__toString・getPositionSlug・getLocationSlugがテストされて無いため、これらのメソッドのテストケースを追加して無事カバレッジも100%になりました。
DEVLOVE CHANGE THE FUTURE 「僕らの開発がアジャイルであるために」に参加しました
やっとblogを始めた本来の目的を果たせる。
これで俺もようやくきちんと勉強会を完了させることが出来るようになった。
今回の内容は下記お二方によるXP祭り関西2010での講演の再演でした。
○倉貫義人さん http://kuranuki.sonicgarden.jp/
「XPの10年を振り返る」
○木下史彦さん http://fkino.net/
「アジャイルアンチパターン ~私がアジャイルの1周目で学んだこととXPの次の10年~」
講演の内容をメモが苦手な俺が頑張ってメモったのですが、内容は下記スライドを参照してください。
「XPの10年を振り返る」
http://forza.cocolog-nifty.com/blog/2010/02/xp2010xp10-9e57.html
「アジャイルアンチパターン ~私がアジャイルの1周目で学んだこととXPの次の10年~」
http://fkino.net/20100206.html
今回の参加で俺が聞きたかったこと知りたかったことは"受託開発でもアジャイルな開発が出来るのか"。
これは自分が受託案件メインで開発してるのと事前に倉貫さんの「XPの10年を振り返る」のスライドを見てて、失敗した事例が受託開発だった為。
倉貫さんの話を聞いてると"受託開発でのアジャイルは難しいのかな"という気持ちになってきた。
その後、木下さんが受託開発だけどアジャイルで行っているという話をされました。
その中でアジャイルアンチパターンとしていくつか紹介があり、印象深いものでは
・受け入れられないスコープ調整
・進みすぎる問題
がありました。
上記、2つなんかは受託開発では特に問題になることかもしれない。
答えが見つからない中偶然帰りの電車で倉貫さんと一緒になったので話を聞いてもらった。
その中でtwitterにもツィートされてたけどこんな話になった。
今テスト駆動開発を導入しようと試行錯誤してるけどテストコードめんどくさそうとか躊躇する理由はたくさん出てきてなかなか導入に踏み切れないけど実際導入してみないと何がめんどくさいのか分からないし、どうすればめんどくささが解消されるかも分からないからとりあえずやってみることが大事なんだなと思う。
う~ん。うまくまとまらないので現時点でのアジャイルに対する俺の意見を綴ってみる。
まず、誰もがそうだと思うけど目的はいい製品を作る、開発者が活き活きと仕事をすることなんだよね。
アジャイルを導入することが目的ではなく、アジャイルは上記を満たすための手段でしか無いんだよね。
上記を満たせるならウォーターフォールでもいいんだと思う。
後、アジャイル(XP)にはいくつかプラクティスがあるけど全部導入する必要も無いよね。
チームに合わないプラクティスは省けばいいし、一度に全部導入できないなら部分的に導入すればいいし。
実際俺は一気に導入できないから徐々に導入していって現時点ではコーディング標準、バージョン管理、コードの共同所有、10分ビルドだけ導入してる。(してた?最近職場変わったから新しい職場でまた0から導入するけど)
で、今はテスト駆動開発を導入しようと試行錯誤してる。
省くプラクティスも単純にやらないんじゃなくて実際やってみて問題を明確にして省くって判断をしたい。そのためにはどんどん導入してたくさん失敗してアジャイルを理解する必要があるな。
まだまだ勉強不足なんでもっともっとアジャイルは勉強したいな。
グダグダな文章ですみません。
過去幾度となく聞かされた言葉。勉強会はblogを書くまでが勉強会
これで俺もようやくきちんと勉強会を完了させることが出来るようになった。
今回の内容は下記お二方によるXP祭り関西2010での講演の再演でした。
○倉貫義人さん http://kuranuki.sonicgarden.jp/
「XPの10年を振り返る」
○木下史彦さん http://fkino.net/
「アジャイルアンチパターン ~私がアジャイルの1周目で学んだこととXPの次の10年~」
講演の内容をメモが苦手な俺が頑張ってメモったのですが、内容は下記スライドを参照してください。
「XPの10年を振り返る」
http://forza.cocolog-nifty.com/blog/2010/02/xp2010xp10-9e57.html
「アジャイルアンチパターン ~私がアジャイルの1周目で学んだこととXPの次の10年~」
http://fkino.net/20100206.html
今回の参加で俺が聞きたかったこと知りたかったことは"受託開発でもアジャイルな開発が出来るのか"。
これは自分が受託案件メインで開発してるのと事前に倉貫さんの「XPの10年を振り返る」のスライドを見てて、失敗した事例が受託開発だった為。
倉貫さんの話を聞いてると"受託開発でのアジャイルは難しいのかな"という気持ちになってきた。
その後、木下さんが受託開発だけどアジャイルで行っているという話をされました。
その中でアジャイルアンチパターンとしていくつか紹介があり、印象深いものでは
・受け入れられないスコープ調整
・進みすぎる問題
がありました。
上記、2つなんかは受託開発では特に問題になることかもしれない。
答えが見つからない中偶然帰りの電車で倉貫さんと一緒になったので話を聞いてもらった。
その中でtwitterにもツィートされてたけどこんな話になった。
確かにそうなんだよな。受託だから難しいですよね、ではなく、やってみてから難しかったと言えば良い。初めてやることで、最初からうまくいくわけない。情報が多過ぎて頭でっかちになってる。契約が、とか言う前にやってみないと。完璧に用意された状況まで始めないなんて、それこそAgileではないよ。 #devlove
今テスト駆動開発を導入しようと試行錯誤してるけどテストコードめんどくさそうとか躊躇する理由はたくさん出てきてなかなか導入に踏み切れないけど実際導入してみないと何がめんどくさいのか分からないし、どうすればめんどくささが解消されるかも分からないからとりあえずやってみることが大事なんだなと思う。
う~ん。うまくまとまらないので現時点でのアジャイルに対する俺の意見を綴ってみる。
まず、誰もがそうだと思うけど目的はいい製品を作る、開発者が活き活きと仕事をすることなんだよね。
アジャイルを導入することが目的ではなく、アジャイルは上記を満たすための手段でしか無いんだよね。
上記を満たせるならウォーターフォールでもいいんだと思う。
後、アジャイル(XP)にはいくつかプラクティスがあるけど全部導入する必要も無いよね。
チームに合わないプラクティスは省けばいいし、一度に全部導入できないなら部分的に導入すればいいし。
実際俺は一気に導入できないから徐々に導入していって現時点ではコーディング標準、バージョン管理、コードの共同所有、10分ビルドだけ導入してる。(してた?最近職場変わったから新しい職場でまた0から導入するけど)
で、今はテスト駆動開発を導入しようと試行錯誤してる。
省くプラクティスも単純にやらないんじゃなくて実際やってみて問題を明確にして省くって判断をしたい。そのためにはどんどん導入してたくさん失敗してアジャイルを理解する必要があるな。
まだまだ勉強不足なんでもっともっとアジャイルは勉強したいな。
グダグダな文章ですみません。
symfony1.4 jobeet 7日目
今回はカテゴリー周りの実装
まずはルーティングの設定。
その後、カテゴリモデルにデータ取得コード追記していくけど、重複したコード出てくるのでそのリファクタリング方法。
Peerでも似たような事はやってたんだけどDoctrineの方がスマートに実装出来る感じ。
まだモジュールが無いからコマンドからモジュール作成。
今回はgenerate:moduleを使って空のモジュール作成、実案件では doctrine:generate-moduleをそのまま使える案件は少ないだろうからgenerate:moduleで空のモジュール作って実装していった方が逆に早い気がする。実際1.0時はそうしてた。
この後、schema.ymlにSluggableという項目を追加。
これは5日目にJobeetクラスに実装したslugifyの機能を実現してくれるみたい。便利だけどこれって実案件でどれほど要望あるんだろう。
以下、slugifyの内容。
この後、モデルクラスに重複コードが出てきたようにtemplateにも重複したコードが現れ始めたのでtemplateのリファクタリング。
template のリファクタリングはパーシャルという機能を使用。これは1.0でお世話になったから特に問題無い。
最後にWebシステムではほぼ必須だけど0から作ると結構めんどくさいページングの実装。
propelと同様にdoctrineでもページャー機能を実装してるようなのでその使い方。
ページャーの生成の仕方が多少違うけど使い方はそんなに変わらないから特に問題なく使えそう。
結果数をgetNbResultsじゃなくてcount()で取れるのは地味に便利。
1.0の頃はaddSelectColumn使うとリザルトセットで取らないといけなくなりページャー使えなくなったけどDoctrineではどうなるかは後で調べないと。
後、1.0ではGroupByしてページャー使うと結果数がおかしくなったけどそれは大丈夫なんだろうか?
とりあえず細かいところは別途調べないといけないな。
まずはルーティングの設定。
その後、カテゴリモデルにデータ取得コード追記していくけど、重複したコード出てくるのでそのリファクタリング方法。
Peerでも似たような事はやってたんだけどDoctrineの方がスマートに実装出来る感じ。
まだモジュールが無いからコマンドからモジュール作成。
今回はgenerate:moduleを使って空のモジュール作成、実案件では doctrine:generate-moduleをそのまま使える案件は少ないだろうからgenerate:moduleで空のモジュール作って実装していった方が逆に早い気がする。実際1.0時はそうしてた。
この後、schema.ymlにSluggableという項目を追加。
これは5日目にJobeetクラスに実装したslugifyの機能を実現してくれるみたい。便利だけどこれって実案件でどれほど要望あるんだろう。
以下、slugifyの内容。
static public function slugify($text){
$text = preg_replace('/\W+/','-',$text);
$text = strtolower(trim($text,'-'));
return $text;
}
この後、モデルクラスに重複コードが出てきたようにtemplateにも重複したコードが現れ始めたのでtemplateのリファクタリング。
template のリファクタリングはパーシャルという機能を使用。これは1.0でお世話になったから特に問題無い。
最後にWebシステムではほぼ必須だけど0から作ると結構めんどくさいページングの実装。
propelと同様にdoctrineでもページャー機能を実装してるようなのでその使い方。
ページャーの生成の仕方が多少違うけど使い方はそんなに変わらないから特に問題なく使えそう。
結果数をgetNbResultsじゃなくてcount()で取れるのは地味に便利。
1.0の頃はaddSelectColumn使うとリザルトセットで取らないといけなくなりページャー使えなくなったけどDoctrineではどうなるかは後で調べないと。
後、1.0ではGroupByしてページャー使うと結果数がおかしくなったけどそれは大丈夫なんだろうか?
とりあえず細かいところは別途調べないといけないな。
symfony1.4 jobeet 6日目
今回はモデルの詳細
symfony1.0からsymfony1.4に移る際に大きく変更になった部分の一つがデフォルトのORマッパーがPropelからDoctrineに変わった事。
個人的なイメージとしてPropelはSQLよく分からない人向け、DoctrineはSQL詳しい人向けのモデルだと思う。
PropelはSQLよく分からなくても必要な情報セットすれば使える、Doctrineはオブジェクト生成時に発行しようとしてるSQLがイメージしやすい。ただ、Doctrineはある程度オブジェクト指向を理解出来ないと使うの難しいそう。
6日目はまず一覧を取得してたコードをDoctrine_Queryへの変更の仕方の説明。
Doctrine_Queryについては後でAPIなど見て何が出来るのは調べる。
で、SQLのログに関しての説明もあったけど出力される内容がプリペアドステートメントの?のままの内容が出力されるのでWhere条件が多いSQLを実際データベースに流しこんで確認する時はそのまま流せないのがめんどくさそう。
saveメソッドの上書きは1.0でもよくやってた内容なので特に問題ない。
その後にカスタムコンフィギューレーションの説明があったけどこれも1.0でやってたから大丈夫。
1.0使い始めたばかりの時は"app_"を付け忘れて結構悩んでたけど今はもう付け忘れることも殆どない。
その後にリファクタリングの説明。Actionの中で記述しているSQL発行のコードをTableクラスに移動。
1.0だとPeerクラスに書いていた内容。
ここで一つ困ったことが。。。
Peerの時はSQL発行のメソッドはPeerクラス内にstaticメソッドとして定義してActionから呼び出してたのにDoctrineだとstaticが付かずTableクラスをインスタンス化してから呼び出すようになる。
で、どこでインスタンス作るんだろうと思った。ActionからはDoctrine_Coreを経由して呼び出すことになるらしい。
上記に書いたように1.0の時はActionからstaticなメソッド呼んでたからeclipceでコード補完出来るという理由で長くても処理の内容が分かるメソッド名にしてたけどこれだとあんまり長いメソッド名にしたくないなぁ。
あえて言うけどこの作りは使いにくい。もうちょっと改善して欲しいなぁ
この後、クエリーのマージの説明。
この後に有効期限が切れた情報をルーティングで404にハンドリングする方法の説明があった。
retrieveActiveJobは省略します。
この他に6日目の内容としては動的なフィクスチャ(テストデータ)の説明もあったけどこれも1.0多少触ってるので省略。
今後単体テスト勉強する際に詳しく書くかも。
symfony1.0からsymfony1.4に移る際に大きく変更になった部分の一つがデフォルトのORマッパーがPropelからDoctrineに変わった事。
個人的なイメージとしてPropelはSQLよく分からない人向け、DoctrineはSQL詳しい人向けのモデルだと思う。
PropelはSQLよく分からなくても必要な情報セットすれば使える、Doctrineはオブジェクト生成時に発行しようとしてるSQLがイメージしやすい。ただ、Doctrineはある程度オブジェクト指向を理解出来ないと使うの難しいそう。
6日目はまず一覧を取得してたコードをDoctrine_Queryへの変更の仕方の説明。
Doctrine_Queryについては後でAPIなど見て何が出来るのは調べる。
で、SQLのログに関しての説明もあったけど出力される内容がプリペアドステートメントの?のままの内容が出力されるのでWhere条件が多いSQLを実際データベースに流しこんで確認する時はそのまま流せないのがめんどくさそう。
saveメソッドの上書きは1.0でもよくやってた内容なので特に問題ない。
その後にカスタムコンフィギューレーションの説明があったけどこれも1.0でやってたから大丈夫。
1.0使い始めたばかりの時は"app_"を付け忘れて結構悩んでたけど今はもう付け忘れることも殆どない。
その後にリファクタリングの説明。Actionの中で記述しているSQL発行のコードをTableクラスに移動。
1.0だとPeerクラスに書いていた内容。
ここで一つ困ったことが。。。
Peerの時はSQL発行のメソッドはPeerクラス内にstaticメソッドとして定義してActionから呼び出してたのにDoctrineだとstaticが付かずTableクラスをインスタンス化してから呼び出すようになる。
で、どこでインスタンス作るんだろうと思った。ActionからはDoctrine_Coreを経由して呼び出すことになるらしい。
$this->categories = Doctrine_Core::getTable('JobeetCategory')->getWithJobs();これだとeclipceの補完機能やメソッドへのジャンプが出来ないからメンドクサイんだけどなぁ。
上記に書いたように1.0の時はActionからstaticなメソッド呼んでたからeclipceでコード補完出来るという理由で長くても処理の内容が分かるメソッド名にしてたけどこれだとあんまり長いメソッド名にしたくないなぁ。
あえて言うけどこの作りは使いにくい。もうちょっと改善して欲しいなぁ
この後、クエリーのマージの説明。
// lib/model/doctrine/JobeetCategory.class.phpこの使い方はかなり便利。1.0で似たような事やってた時はかなり冗長的なコードになってた(俺の書き方が悪かっただけ。。)
public function getActiveJobs() {
$q = Doctrine_Query::create()
->from('JobeetJob j')
->where('j.category_id = ?', $this->getId());
return Doctrine_Core::getTable('JobeetJob')->getActiveJobs($q);
}
// lib/model/doctrine/JobeetJobTable.class.php
public function getActiveJobs(Doctrine_Query $q = null) {
if (is_null($q)) {
$q = Doctrine_Query::create()
->from('JobeetJob j');
}
$q->andWhere('j.expires_at > ?', date('Y-m-d H:i:s', time()))
->addOrderBy('j.expires_at DESC'); return $q->execute();
}
この後に有効期限が切れた情報をルーティングで404にハンドリングする方法の説明があった。
# apps/frontend/config/routing.yml昨日作成したrouting.ymlにmethod_for_queryを追加して呼び出したいメソッドを指定。
job_show_user:
url: /job/:company_slug/:location_slug/:id/:position_slug
class: sfDoctrineRoute
options:
model: JobeetJob
type: object
method_for_query: retrieveActiveJob
param: { module: job, action: show }
requirements:
id: \d+
sf_method: [GET]
retrieveActiveJobは省略します。
この他に6日目の内容としては動的なフィクスチャ(テストデータ)の説明もあったけどこれも1.0多少触ってるので省略。
今後単体テスト勉強する際に詳しく書くかも。
symfony1.4 jobeet 5日目
今日はルーティングの説明
この辺も基本的な事は1.0やってるのでデフォルト生成されるrouting.ymlの中身は特に問題ない。
1.4ではルーティングにモデルを関連出来るようになったのがすごい便利。
1.0でも以下のような設定は出来たけど値はテンプレートの方できちんと設定してあげる必要があった。
これが1.4だとルーティングにモデルを関連付けられるから以下のように簡単に書ける。
routing.ymlの方は複雑になってるように見えるけどcompany_slugとかのxxxx_slugは実際はJobeetJobモデルが持ってるメソッド(getCompanySlug()等)でそれを勝手にコールしてくれてる。
後、ルーティングにモデルが関連付いてるから1.0ではアクションの中でモデルを生成(取得)するコード書いてたけどその必要が無くなった。404Unlessもルーティングの方できちんとハンドリングしてくれる。
classにsfDoctrineRouteCollectionを指定するとlist,new,create,edit,update,delete,showのルーティングを勝手に生成してくれるから全部のアクションに対して1つずつ設定する必要はない。確認画面(conf)をどう設定するかは課題。
1.0やってたときは個人的にnew,createとedit,updateまとめて処理してたからそれが今回もできるからフォームクラスを勉強してからだな。
後、個人的にapp:routesタスクがめちゃめちゃ便利。1.0時はルーティングがうまくいかなくてキャシュの下のルーティングファイル調べたりしてたけどapp:routesでルーティングの詳細な情報が出るからもうその必要がなさそう。
この辺も基本的な事は1.0やってるのでデフォルト生成されるrouting.ymlの中身は特に問題ない。
1.4ではルーティングにモデルを関連出来るようになったのがすごい便利。
1.0でも以下のような設定は出来たけど値はテンプレートの方できちんと設定してあげる必要があった。
# apps/frontend/config/routing.yml
job_show_user:
url: /job/:company/:location/:id/:position
param: { module: job, action: show }
#template
url_for('job/show?company='.$job->getCompany().'&location='.$job->getLocation().'&id='.$job->getId().'&position='.$job->getPosition())
これが1.4だとルーティングにモデルを関連付けられるから以下のように簡単に書ける。
# apps/frontend/config/routing.yml
job_show_user:
url: /job/:company_slug/:location_slug/:id/:position_slug
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: show }
requirements:
id: \d+
sf_method: [get]
#template
url_for('job_show_user', $job)
routing.ymlの方は複雑になってるように見えるけどcompany_slugとかのxxxx_slugは実際はJobeetJobモデルが持ってるメソッド(getCompanySlug()等)でそれを勝手にコールしてくれてる。
後、ルーティングにモデルが関連付いてるから1.0ではアクションの中でモデルを生成(取得)するコード書いてたけどその必要が無くなった。404Unlessもルーティングの方できちんとハンドリングしてくれる。
classにsfDoctrineRouteCollectionを指定するとlist,new,create,edit,update,delete,showのルーティングを勝手に生成してくれるから全部のアクションに対して1つずつ設定する必要はない。確認画面(conf)をどう設定するかは課題。
1.0やってたときは個人的にnew,createとedit,updateまとめて処理してたからそれが今回もできるからフォームクラスを勉強してからだな。
後、個人的にapp:routesタスクがめちゃめちゃ便利。1.0時はルーティングがうまくいかなくてキャシュの下のルーティングファイル調べたりしてたけどapp:routesでルーティングの詳細な情報が出るからもうその必要がなさそう。
symfony1.4 jobeet 4日目
今回はController と View の説明。
MVCに関してはここ数年ずっと触ってきてるアーキテクトなんで今更特に学ぶことも無い。
Layout、Templateも1.0で触ってるから特に問題無い。
今回も深く触れてないけどDoctrineは初めて使うから
createQueryの引数の'a'の意味とかfindの引数がなんでarrayなのかがまだ分かってない。
slot は1.0の時、あまり使わなかったから使い方のサンプルがあったのは良かった。
sfAction、sfRequest、sfResponse が持ってるメソッドも調べないといけないけど後回し。
MVCに関してはここ数年ずっと触ってきてるアーキテクトなんで今更特に学ぶことも無い。
Layout、Templateも1.0で触ってるから特に問題無い。
今回も深く触れてないけどDoctrineは初めて使うから
とかDoctrine::getTable('JobeetJob')
->createQuery('a')
->execute();
の使い方は後で調べないといけないなぁ。Doctrine::getTable('JobeetJob')
->find(array($request->getParameter('id')));
createQueryの引数の'a'の意味とかfindの引数がなんでarrayなのかがまだ分かってない。
slot は1.0の時、あまり使わなかったから使い方のサンプルがあったのは良かった。
sfAction、sfRequest、sfResponse が持ってるメソッドも調べないといけないけど後回し。
横道坊主 25th ANNIVERSARY TOUR「Dragon High~1989-1994 Numbers PLUS!”外伝”」ファイナル
横道坊主 25th ANNIVERSARY TOUR「Dragon High~1989-1994 Numbers PLUS!”外伝”」ファイナル行ってきました。
実は寝不足と金欠でギリギリまで行こうかどうか迷ってたけどホント行って良かった。
twitterでもつぶやいたけど俺自身今月中旬から新たなスタートを切る事になったからこの節目の時期に横道坊主の曲を生で聴けたのはホントに力になった。
今回のツアーはベーシストの橋本潤さんが病気療養中で初代ベーシストの林田正樹さんがサポートとして参加した外伝的なツアーだったからセットリストがどうなるか楽しみだったけど頭の三曲でいきなりやられた。
俺は感情を表に出すのが苦手だから普段ライブでも中盤辺りから徐々に気持ちが盛り上がってくるんだけど今回は初っ端から拳を突き上げてた。
ファイナル終わったから曲名出してもいいのかな?(ネタバレの礼儀とかイマイチよくわかってない^^;)
義人さんのMCからの「野良犬」の流れは同じように長崎の田舎から出てきて東京という街で日々戦っている自分にとっては反則的な流れだったぁ。
義人さんは最近東京も故郷のように感じてきたって言ってたけど俺にとっては東京はまだまだアウェーな感じです。俺にも東京を第二の故郷と言えるようになる日が来るんだろうか?
横道坊主のライブは今のメンバーになってからしか参戦したことなかったから林田さんのベースはなんかうまく言えないけど「CDで聴いた曲だっ」って感じでホント新鮮だった。
長年ライブに参戦してる人には懐かしい感じだったんだろうなぁ。
「UNDERGROUND」とか「I WANT…」とかかなりぐっときた。
でも今回のライブで一番良かったのは潤さんの元気な姿を見れたことだなぁ。
潤さんの元気な姿見たら俺も負けてられないって思えた。
4/1で26周年を迎えたバンドだけど横道坊主にとっては26周年も通過点のハズ、この先30年、40年と気持ちのこもったロックンロールを聴かせ続けて欲しい。
(わがままをいうとUK聴きたかったなぁ)
実は寝不足と金欠でギリギリまで行こうかどうか迷ってたけどホント行って良かった。
twitterでもつぶやいたけど俺自身今月中旬から新たなスタートを切る事になったからこの節目の時期に横道坊主の曲を生で聴けたのはホントに力になった。
今回のツアーはベーシストの橋本潤さんが病気療養中で初代ベーシストの林田正樹さんがサポートとして参加した外伝的なツアーだったからセットリストがどうなるか楽しみだったけど頭の三曲でいきなりやられた。
俺は感情を表に出すのが苦手だから普段ライブでも中盤辺りから徐々に気持ちが盛り上がってくるんだけど今回は初っ端から拳を突き上げてた。
ファイナル終わったから曲名出してもいいのかな?(ネタバレの礼儀とかイマイチよくわかってない^^;)
義人さんのMCからの「野良犬」の流れは同じように長崎の田舎から出てきて東京という街で日々戦っている自分にとっては反則的な流れだったぁ。
義人さんは最近東京も故郷のように感じてきたって言ってたけど俺にとっては東京はまだまだアウェーな感じです。俺にも東京を第二の故郷と言えるようになる日が来るんだろうか?
横道坊主のライブは今のメンバーになってからしか参戦したことなかったから林田さんのベースはなんかうまく言えないけど「CDで聴いた曲だっ」って感じでホント新鮮だった。
長年ライブに参戦してる人には懐かしい感じだったんだろうなぁ。
「UNDERGROUND」とか「I WANT…」とかかなりぐっときた。
でも今回のライブで一番良かったのは潤さんの元気な姿を見れたことだなぁ。
潤さんの元気な姿見たら俺も負けてられないって思えた。
4/1で26周年を迎えたバンドだけど横道坊主にとっては26周年も通過点のハズ、この先30年、40年と気持ちのこもったロックンロールを聴かせ続けて欲しい。
(わがままをいうとUK聴きたかったなぁ)
symfony1.4 jobeet 2日目、3日目
引き続き、jobeet2日目、3日目
2日目はこれから作ろうとしているシステムの要件確認だけなのでとりあえず読んで終わり。
3日目はデータベースのスキーマの設定といくつかのコマンドの確認。
schema.ymlはactAsとかrelationsは後できちんと調べないといけないなぁ。
コマンドも1.0とかなり違うから引数と併せて何が出来るかきちんと調べないと。
とりあえず、schema.ymlを編集するのでeclipseにYAML Editorを入れたけど結局構文エラー出して悩んでしまった。
フィクスチャファイルは1.0でもあったけど使いこなせてなかったから今後はきちんと使いこなしたい。
注意書きにもあったけどPropelの時はプレフィックスを番号にしないといけなかったからそれが面倒でいまいち使えなかったけどDoctrineではこのような必要はないとの事なのでちょっと期待。
軽くgenerate-moduleで出来上がったソース見たけどやっぱり1.0とはかなり違うな。
今後出てくるだろうけどprocessFormの使い方とかきちんと把握しないと。
でも、この段階で必須チェック、日付の整合性のバリデートが既に動いてるのにはちょっと感動。
2日目はこれから作ろうとしているシステムの要件確認だけなのでとりあえず読んで終わり。
3日目はデータベースのスキーマの設定といくつかのコマンドの確認。
schema.ymlはactAsとかrelationsは後できちんと調べないといけないなぁ。
コマンドも1.0とかなり違うから引数と併せて何が出来るかきちんと調べないと。
とりあえず、schema.ymlを編集するのでeclipseにYAML Editorを入れたけど結局構文エラー出して悩んでしまった。
フィクスチャファイルは1.0でもあったけど使いこなせてなかったから今後はきちんと使いこなしたい。
注意書きにもあったけどPropelの時はプレフィックスを番号にしないといけなかったからそれが面倒でいまいち使えなかったけどDoctrineではこのような必要はないとの事なのでちょっと期待。
軽くgenerate-moduleで出来上がったソース見たけどやっぱり1.0とはかなり違うな。
今後出てくるだろうけどprocessFormの使い方とかきちんと把握しないと。
でも、この段階で必須チェック、日付の整合性のバリデートが既に動いてるのにはちょっと感動。
symfony1.4 jobeet 1日目
symfony1.4 チュートリアルjobeet開始しました。
jobeetには関係ないけどPCに入ってるeclipseが古かったので
eclipse galileo for phpをインストール
で、チュートリアル1日目アクセスしてみた昨日インストールしたsymfonyとは
ディレクトリ構成が結構違うからとりあえず1日目の頭から進めてみる。
jobeetには関係ないけどPCに入ってるeclipseが古かったので
eclipse galileo for phpをインストール
で、チュートリアル1日目アクセスしてみた昨日インストールしたsymfonyとは
ディレクトリ構成が結構違うからとりあえず1日目の頭から進めてみる。
- phpのコンフィギュレーションチェック
開発用のphp.iniをリネームしただけだったからPOD、mbstring絡みで
warningが出たのでphp.ini修正
上記のwarningはとりあえず無視。[[WARNING]] The posix_isatty() is available: FAILED
*** Install and enable the php_posix extension (used to colorized the CLI output) *** [[WARNING]] A PHP accelerator is installed: FAILED
*** Install a PHP accelerator like APC (highly recommended) *** - symfony1.4インストール
昨日もインストールしたけどインストールディレクトリの指定とか
Subversion インストールが推奨されたりとかしてたので再インストール。
ついでにTortoiseSVN もインストール - プロジェクトの作成、アプリケーションの作成、Apacheの設定
この辺は1.0でやってるので特に問題なく終了。
コマンドが変わってるのでそれは徐々に覚える - Subversion の設定
1.0でもそうだったけどSubversion で管理することは良いことですってあるのでSubversion の設定。
1.0時は会社でやってたから既にあったSubversion サーバに適当にリポジトリ切ってやってたけど自分で立てるのはメンドイ。
そう思ってググッてみたらフリーでsvnのリポジトリ作成出来るサイト見つけたからそれを使ってみる。
Unfuddle
Subversion のコマンド色々書かれてるけどTortoiseSVN で設定してSubversion も完了
Apache,MySQL,PHP,symfony1.4インストール
個人用ノートPCにApache,MySQL,PHP,symfony1.4入れてみた。
1.Apacheインストール
いつものようにApache最新版のインストーラをダウンロードしてきて
ほぼデフォルトのままインストール。
バージョン2.2.15
2.PHPインストール
毎回、インストーラ使うとモジュールがうまく入らないので
バイナリ落としてきて解凍したファイルを使用して、
Apacheのコンフィグファイルを変更。
confファイルを外出しに出来るの初めて知った。
バージョン5.3.2
3.MySQLインストール
Apache同様、いつものようにインストーラをダウンロードしてきて
ほぼデフォルトのままインストール。
そのままだとGUIで操作出来ないからGUIツール入れようとしたら
間違ってworkbench GUI入れてしまった。
MySQL Administratorで検索して無事インストール出来た。
バージョン5.1.45
4.PEARインストール
symfonyをpearでインストールするためにPEARのインストール。
win版のgo-pear.batにバグがあるの忘れててそのまま実行したら
エラーが出た。
ググって修正したんだけど間違って全角スペース入力してたのに気付かず
悩んだ。毎回PHPのインストールは何か引っかかってるな。
5.symfonyインストール
無事、pearインストール出来たのでpearコマンドで
すんなりインストール完了。
明日以降symfony1.4のチュートリアル進めてみます。
1.Apacheインストール
いつものようにApache最新版のインストーラをダウンロードしてきて
ほぼデフォルトのままインストール。
バージョン2.2.15
2.PHPインストール
毎回、インストーラ使うとモジュールがうまく入らないので
バイナリ落としてきて解凍したファイルを使用して、
Apacheのコンフィグファイルを変更。
confファイルを外出しに出来るの初めて知った。
バージョン5.3.2
3.MySQLインストール
Apache同様、いつものようにインストーラをダウンロードしてきて
ほぼデフォルトのままインストール。
そのままだとGUIで操作出来ないからGUIツール入れようとしたら
間違ってworkbench GUI入れてしまった。
MySQL Administratorで検索して無事インストール出来た。
バージョン5.1.45
4.PEARインストール
symfonyをpearでインストールするためにPEARのインストール。
win版のgo-pear.batにバグがあるの忘れててそのまま実行したら
エラーが出た。
ググって修正したんだけど間違って全角スペース入力してたのに気付かず
悩んだ。毎回PHPのインストールは何か引っかかってるな。
5.symfonyインストール
無事、pearインストール出来たのでpearコマンドで
すんなりインストール完了。
明日以降symfony1.4のチュートリアル進めてみます。
心機一転ブログ始めました
3月31日付で退職し、今日から次の職場に行く15日までsymfonyの勉強blogとか
書こうと思ってたのにまだ(現在4/1 0:04)会社にいる。
このまま朝までいたらもう一日余計に働かされそう。
書こうと思ってたのにまだ(現在4/1 0:04)会社にいる。
このまま朝までいたらもう一日余計に働かされそう。