スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

TDD Boot Camp in Tokyo懇親会に参加してきました。

7/9のTDD Boot Camp in Tokyo本編には参加できませんでしたが、懇親会に参加してきました。

ただ飲みに行っただけではなくブログで報告できるような成果を得られて実りある懇親会でした。

成果1:私の現場の話を聞いてもらったことがある@t_wadaさんに会社としてはまだまだレガシーな環境だけどチームとしてはローカル環境で開発してGitでバージョン管理が出来て、メンバーからペアプロ、TDDをやってみたいと意見があがってきたと少しずつだけど開発の現場が前進してきてることを報告できた。

成果2:以前、@ShiroKappaさんに「今の開発チームが自分以外は外注さんだからアジャイルの考え方だったり、Git使い方だったりを教えてもいずれいなくなるから会社としてのメリットがない」と話をした時に「外注の人が自社に帰った時に前の現場でyanchiって人がこういう事やってて、こういう成果があったよって考え方を広めてくれればそれはすごいことじゃない?」って話をしてくれて先日振り返りミーティングをやったときに外注のメンバーがKeepで「Gitが便利。自社でも使ってみたい」と言ってくれて@ShiroKappaさんが言ってくれたことを実感できたことを報告できた。

成果3:以前、Twitterで「そろそろ、cherry-pick使えるようにならないと辛い気がしてきた。近々@HIROCASTさんか@shishi4twさん捕まえてレクチャーしてもらおう。」って発言したら@HIROCASTさんに「このコマンドつかうってことはブランチ開発にそもそも問題がある気がする。あんまり使わないコマンドだと思う。」とリプライもらって「????(どういう事?)。」ってなってたので、その理由が聞けてすっきりした。
要は俺のブランチでの作業の粒度が大きいの問題でもっと細かい粒度でブランチ分ければそもそもcherry-pick使わなくっていいよねって事だった。
ついでに自動デプロイの「Capistrano」の話を聞けたので近々触ってみる。

第4回Symfony2勉強会に行ってきました。 #Symfony2study

「第4回Symfony2勉強会」に参加してきました。

会場は毎回会場を提供してくださっているZynga Japanさん。
今回は寝坊してしまい、色々忘れ物をしつつ会場に入ったときにはすでに勉強会が始まっていました。

第1部は@uechocoさんによるワークショップ形式によるSymfony2の基礎講座。
途中休憩を1時間挟んでのたっぷり2時間。
今回もワークショップ内でサンプルプログラムを仕上げられずに断念。
今回は基礎中の基礎的な内容だったから第1回から参加してる自分としては仕上げられなくてちょっとショック。

途中休憩中に@hidenorigotoさんを捕まえてまだ使う予定はないけど、いつか使うときのためにgithubの質問などしてた。

午後の@uechocoさんによる基礎講座が終わったたとはセミナー形式の講演4本。
1本目は@hidenorigotoさんによる「今日から始めるBDD」
TDD興味がある自分として同じように興味があるBDDの話だったので、Behat(Bundle)は試してみようと思うような内容でした。
なかなか必ずテストコードが存在するという状態で業務を進められないのですが、講演の中で@hidenorigotoさんも言ってたけどこれはホント訓練して慣れるしか無いのかなと思いました。
他の方も言っていたのですが「TDDは才能じゃなくてスキル」と言っていたので練習あるのみだなぁ。
一人じゃ訓練が続かないという方はこちらをどうぞ(すでに大幅に店員オーバーですが当日USTあるはず)。
TDD Boot Camp in Tokyo

2本目は@fivestrさんによる「Symfony2のフォームフレームワーク」
実は自分は1.4系はJobeetをやってその後、個人的にサンプルプログラムを作っただけで業務では使ったことが無いので他の人ほど1.4のsfFormの使いづらさを味わってないのですが、2.0のFormコンポーネントはどんなオブジェクトでもマッピング出来て、Model、Validateと分離されているとの事でした。
Formコンポーネント自体も独立したコンポーネントだということだったので、発表後に「Symfony2のFormコンポーネントのみ1.4またはフレームワーク使用してないプロダクトで使えるか?」質問してみました。
@fivestrさんの回答としては「可能」との事だったので近々試してブログなりでアウトプットしたいと思います。


3本目は@brtriverさんによる「PHPマイクロフレームワーク Silex 入門」
現在、職場で「そろそろうちもフレームワーク使ったほうがいいのかな?」と言う意見もあがって来てて、Symfony1.X系の経験者の自分としてはSymfonyに限らずCakePHPも過渡期の現時点で「いかに多くのメンバーにフレームワーク使って良かったね」と思ってもらうにはどのフレームワークを使うのがいいんだらうと日々悩んでるので為になる発表でした。
Symfony2が現在Bata3ということもあり、Symfony2のコンポーネントを使用しているSilexの現在の状況がどんな感じなのか気になったので、発表後に「Silexはプロダクトで使用可能ですか?」と質問してみました。
@brtriverさんの回答としては「全然使用可能だと思いますよ」との事だったのでこちらも近々試してブログなりでアウトプットしたいと思います。

4本目は@itemanさんによる「Symfony2でより良いソフトウェアを作るために」
@itemanさんの発表は言語やフレームワークにとらわれない内容で、考え方やソフトウェア開発の本質関する話でした。
@itemanさんの話に興味を持たれた方は@yusuke_arclamp(鈴木雄介)さんの話も聞いてみると面白いかも。
@yusuke_arclampさんの話も言語うんぬんやフレームワークうんぬんじゃなく、もっと本質的な話が聞けて面白いです。
(ただ、お二人の話しはとても為になるんですが、その内容をうまく人に伝えるほどきちんと理解出来てない自分がもどかしい。。。)

講演後はLTが3本。
1本目は@Kiskeさんによる「はじめてのSymfony2」
Symfony2のapp/consoleに関する内容。
app/consoleはSymfony1.X系でのtaskです。Symfony1.X系のかなり充実してたのでapp/consoleでどこまで自動生成等が出来るかは非常に興味深いです。(本家もまだapp/consoleのドキュメント無いですよね?俺が見てないだけ?)

2本目は@madapajaさんによる「Symfony2 で MongoDB と仲良くする方法」
Symfony2のODM(Object Document Mapper)、DoctrineMongoDBBundleに関する内容。
ORMと似たような感じで使えるので便利そうですが、Symfony2の本体のバージョンアップに追いついて無いらしくSymfony2 Bata3では動かないらしい。

3本目は@hnw さんによる「PHPUnitのMockObjectの紹介」
個人的に今後UnitTestは取り入れていこうと思ってるので存在は知っていたけど、まだ触ってなかったのでタメになりました。

その後、急遽@yuchimiriさんによる「モテるPHP女子力を磨くための4つの心得 「symfony1.4を使えない女をアピールせよ」
タイトルだけ送りつけられて作成したにしてはすごい完成度の高さだったのでびっくりした。
さすが、Symfony女子。そこのあなたもSymfony女子になれば即興でLTができるようなれる(かもね?)

ちなみに、本日のスライドは@kt001965さんがまとめてくれています。@kt001965さんありがとうございます。
http://ktoshihiro.blogspot.com/2011/06/symfony2-url.html

という内容でブログ書くのも飽きてきたぐらい濃い内容の勉強だったのですが、この後懇談会と恒例のSymfony Midnightに参加して本当に充実した(疲れた?)一日でした。

懇談会、Midnightでも濃い、タメになる話を沢山聞けたのですがもうキーボード打つの飽きたので取り敢えず次回もよろしくお願いします。

社内技術発表会でORMについて話しました

今回はスライド用意できなかったのでcodezineさんの記事の紹介を行い、ORMの話をしました。
以下、社内ブログに上げた記事

手抜きでゴメンなさい。
以下のcodezineの記事を見てください。
http://codezine.jp/article/detail/5858

記事の方ではPrimaryKeyからのデータ取得の例しか記載されてないのでPrimaryKey以外のSELECTの仕方を記載します。
(私がDoctrineとPropleしか経験が無いのでその2つのみですが)

・Dctrine

$q = Doctrine_Query::create()
->select('a.name')
->from('Account a')
->where('a.amount > 2000');

$accounts = $q->execute();



Prople

$c = new Criteria();

$criterion = $c->getNewCriterion(UserPeer::ID, 1);
$criterion->addOr($c->getNewCriterion(UserPeer::ACCOUNT, 'hoge'));
$c->add($criterion);
$c->add(UserPeer::ID, 10, Criteria::LESS_THAN);

$user = UserPeer::doSelect($c);



DoctrineとPropelを使ってみての感想ですが、Doctrineの方はORMを使いながらもメソッド名がSQLライクなので生成されるSQLがイメージしやすい、Propelの方は生成されるSQLはイメージしにくいがオブジェクト指向は理解しているがSQLは苦手という人には使いやすいと思います。


発表後に出た質問
・設定ファイル(xmlなど)を用意するのは手間じゃないか?
 たしかに設定ファイルが無いよりは一手間かかりますが、フレームワークによっては1つの設定ファイルからテーブル作成用のSQLとORMのコードを生成してくれる物もあるので、他のライブラリやフレームワークと一緒に利用することで手間を軽減できる場合もある

・グループなどのリレーショナルなどは出来るのか?
 設定ファイルにリレーショナルの情報をきちんと記述してあげればリレーショナル関係もクラスの情報として保持できます。

・パフォーマンス等の理由により使用できない場合が考えられるが、その場合ORMを使ったプロジェクトと使わないプロジェクトが存在してダブルスタンダードとなり両方勉強する必要がないか?
 個人的な見解としてORM等のライブラリを使わないで開発できる能力は最低限の必要なものだと思っています。
その上で0からも作れるけどもっと楽したいよねって時にORMなりフレームワークなり使えばいいかなと思います。


以下、技術発表に参加できなかった技術リーダーとのやり取り。
・技術リーダー

http://www.symfony-project.org/doctrine/1_2/ja/06-Working-With-Data
ここみると複雑なWHEREの追加がどうなってるのか気になるかな。
例えば (A or B) and (C or D)を実装すると
$q->where('A=?', 1)
->orWhere('B=?', 1)
->andWhere('C=?', 1)
->orWhere('D=?', 1)
でいいのかな・・・?
A or (B and C) or D
と解釈されそう?
このあたり知ってたら教えて欲しいです。
UNIONもないしある程度VIEWで実装済みであることを前提としてるのかな。

後は「データを削除する」のサンプルなんぞを見ても分かるけど

$user = Doctrine::getTable('User')->find(1);
$user->delete();

$deleted = Doctrine_Query::create()
->delete()
->from('User u')
->where('u.id = ?', 1)
->execute();
の2パターンあって、上はオブジェクト的だが無駄な処理有り、下はSQL的だが無駄な処理無し。
でもORM使うなら上がデフォなんだろうか?それとも下でガリガリ書くの?という疑問が浮かぶ。


・yanchi

・(A or B) and (C or D)の検索
Doctrineは実務では使ってないのでPropelほど詳しくないのですが質問の検索条件を投げるとしたら多分以下のようになります。
$table = Doctrine::getTable('User')->createQuery('User u');
$or1 = Doctrine_Query::create()
->Where(A)
->orWhere(B);
$or2 = Doctrine_Query::create()
->Where(C)
->orWhere(D);
$table->where($or1)->andWhere($or2 );
()でくくった優先度のQueryを個別に作り、それをand(又はor)で繋ぐ感じになります。

以下の方法でもいけるみたいですが
$q = Doctrine::getTable('User')->createQuery('User u')
->where(A or B)
->andWhere(C or D);

・削除処理
削除の処理については上のオブジェクトを取得してから削除が一般的です。
下の場合は複数(数千件とか)のデータを纏めて消すときに使用します。

こんな感じでいいですか?


・技術リーダー

回答ありがとです。
ちょっとさらっと雑談したけど毎回DELETEのたびに必ずSELECTを発生させるのはどうなのか、というのはありますかね。
コストは安くても明らかに無駄な処理なので。



Doctrineはがっつり触ってないので(A or B) and (C or D)の検索 の仕方間違ってたらご指摘ください。

今見なおしたら「UNIONもないしある程度VIEWで実装済みであることを前提としてるのかな」に答えてないなぁ。
まぁ、DoctrineでもPropelでも生SQL投げる方法あるし、そもそも個人的な見解だとそんな複雑なSQL投げないといけないならテーブル定義見直そうよって思うんだけど。。。

公開鍵によるSSH接続

<クライアント側の設定>

$ cd /root/test/.ssh
$ ssh-keygen -t dsa(パスフレ-ズ入力なしで)
$ scp -p id_dsa.pub root@[サーバのアドレス]:.ssh/
ログインパスワ-ドを入力して公開鍵をサ-バ側へコピ-



<サ-バ-側の設定>

$mkdir /root/.ssh
$ cd /root/.ssh
$ touch authorized_keys2
$ chmod 600 authorized_keys2
$ cat id_dsa.pub >>authorized_keys2
server$ rm id_dsa.pub

社内技術発表会でLimeについて話してきました。

Lime
View more presentations from yanchi.

社内の技術発表会でLimeについて話してきました。

朝から急いで用意したので中身はスカスカですが、これでちょっとでも
単体テストに興味を持ってもらえるとうれしいな。

発表後に「要はアサーションするんでしょ」って意見があったけど今そのアサーションすらしてない状況なのはわかってるのか?
検索フォーム
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
RSSリンクの表示
last.fm
twitter
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。