2012年09月

サムライ・エピソードが出版されました

ブログ記事にするのがちょっと遅れてしまいましたが、サムライ・エピソードが 2012年9月14日、達人出版会さんより発売されました。

日本のアジャイル・サムライ総勢26名で集まって、アジャイル・ソフトウェア開発の成功と失敗の経験談を収録した1冊となっています。

私は

第12章 メーカー系のSIer企業でアジャイルやってみて上手くいったこといかなかったこと

を執筆させて頂きました。

この章では、私が現在の職場に配属されてから、1年間ほどアジャイル開発プロセスで奮闘したエピソードを、ちょっと誇張を交えながら ^ ^; 記載しています。

どのようにしてこの書籍が立ち上がったのか興味のある方は、とりまとめをしてくださった@HIROCASTERさんのブログを見ると良いですかね。

購入はこちらから可能です。値段も800円(さらに9月末までは500円の特別価格!)とお安いですし、ぜひお買い上げください!

サムライ・エピソード
26人のサムライ達
達人出版会
発行日: 2012-09-14
対応フォーマット: EPUB, PDF

アジャイルサムライ−達人開発者への道−
Jonathan Rasmusson
オーム社
売り上げランキング: 4473

札幌RubyKaigi2012に行けなかったのでビデオをみた

札幌RubyKaigi2012に行けませんでしたが、ビデオを見てみたのでメモ。

技評さんの写真付きのスペシャルレポートはこちら http://gihyo.jp/news/report/01/sapporo-rubykaigi2012

料理を支える技術 2012 @hotchpotch

http://www.ustream.tv/recorded/25395951

cookpadの大規模railsサービスをどうやってバージョンアップしたのか

まずやったこと

  • 最初はローカルでバージョンアップ。rspec 流して地道にあげる。
  • 自動HTMLエスケープ対応. Rails 2.x => 3.x になって erb の中のHTMLタグ<>が自動エスケープされるようになった

word-diff

  • ケースもたくさんあるので、rspec 流すと HTML が出力されるように改造
  • word-diff 機能をつかって必要なところだけチェック
  • git diff --word-diff-regex='HTMLエスケープの文字列だけチェック'

パフォーマンス

  • ab / JMeter でベンチマークとったらパフォーマンス落ちてた. 200% ほど
  • プロファイリングとったがよくわらない。
  • 毎回ネックとなる場所が変わる => GC?
  • passenger -> unicorn に変更した。パフォーマンス変わらんかった。
  • ただし Unicorn::OobGC という仕組みがある
  • request が来ている間は GC 止めて、request 終わった直後に走らせる。unicorn に取り込んでもらった。
  • これで改善
  • 詳しくは WEB+DB Rails高速化みてね

最終確認。spec で発見できない問題をどう解決するか

  • 問題をどう認識するか
  • em-proxy リクエストを複製して、本番サーバと rails3 サーバ(readonly)両方にリクエストをなげて試してみた

最終の最終確認

  • 一部ユーザに実際にリリースする
  • Cookie: r3balance=xxx. xxxが特定値のユーザをRails3.0に流す。
  • SessionStore シリアライズ形式の違い(2.x から 3.x に切り替えた瞬間のみ起こる)。MySQLへのおかしな master へのクエリ。JavaScript エラー

切り替え方法

  • Rails2.xと同じ台数のRails3.xサーバ用意(AWS)
  • リバプロの向き先を切り替えただけ

2012年変わった事

  • Sara Framework を導入. @tikeda
  • Twitter Bootstrap みたいなものの cookpad 版
  • cookpad デザインの抽象化
  • CSS(SaaS)の実装力

Android App

  • Native から HTML5 へ移行
  • Android アプリ開発のスキルがいらない
  • Native の機能を使う場合、JS からブリッジ
  • ザッカーバーグが HTML5 失敗と言っているが、そこまでリアルタイム性がいらないので大丈夫

fluentd

  • Rails アプリケーションサーバでログ集約
  • Softare Design にも書いているのでみてみてください

GitHub Enterprise

  • コードレビューがはかどる

Distributed CI

  • どうやって分散 rspec を安定させるか
  • AWS EC2 を利用した自動縮退
  • 9/16 @muraken の発表みてね

その他

  • AWD
  • Chanko
  • kuroko
  • IMon

メモまとめ

  • em-proxy でリクエストコピーしてテストするとか、
  • Cookieの値が特定のユーザのみバージョンアップしたサーバに流して1部ユーザのみで試すとか、勉強になった!
  • あと、unicorn は GC のタイミングを操れるからいいね

分散rspec @muraken

rake stats

  • Model 800 LOC
  • Integration spec 17381 LOC
  • Chanko spec 13030 LOC
  • 遅い!

Chanko

検証サイクルの短縮

  • デプロイできるまでの待ち時間を短くしたい
  • テストを早く流せないとすぐデプロイできない

計算

  • 1日40回デプロイしようと思ったら、1ビルド何分で終われば大丈夫?
  • ビルドが必ず成功するとする。労働8時間 => 1ビルド6分

そのためには

  • master に push したものは、必ずビルドが成功してくれないとダメ。
  • 開発者向けテスト環境でもフルテストが必要。多数の開発者が同時多発。
  • そして高速に

分散 rspec

  • Remote Spec 開発した
  • それを使って分散CI

Remote Spec

  • 1. rsync で application code をサーバに動機
  • 2. MySQL などを準備
  • 3. remote spec を実行

仕組み

  • spec ファイル毎に実行時間を記録して、それを元にグループ分け
  • ssh で入ってグループで実行
  • spec の結果をパイプで集計

比較

  • single spec. 待てなかったのではかってない
  • paralell_tests を使って 8-core で。1時間以上
  • remote spec で 5 workers, 6-core で。15分

課題

  • 実行時間を調整して分散したつもりなのに、160sec のサーバー、460sec のサーバーなんかがあった
  • 実行時のサーバーの condition しだいなんじゃないだろうか?
  • 事前分配じゃ無理がある

Dynamic distribution

  • Producer-Consumer Pattern 使え
  • Queue にいれて、worker が1つずつ task をとっていく
  • 遅い worker はより少ない task を実行することになる。
  • task == spec file のパス

Dynamic distribution 実装した

  • dRuby と Rinda::TupleSpace を使用
  • worker 側で spec file のパスを取る毎に rspec 実行すると、プロセスロードがかかって遅い。
  • まだできてない

どうやろうとしているか

  • rspec のコードを読んだ。RSpec::Core::World オブジェクトを clear すればできそう
  • 帰ったら実験してみます

メモまとめ

  • 勉強になった!
  • Dynamic でない分散rspecなら自分たちでもなんとかできそう!
  • Dynamic なほうはちょっとまってみよう。MQサーバたてたりも必要になるのかな。

Rubyの世界の継続的デリバリ by @hsbt

  • Q. 途中からやるにはどうすれば?
  • A. 最低限のトップページ、ログインぐらいのテストを作る。で、仕組みを作る。それから少しずつ追加していく。

DCI(Data, Context and Interaction) and the application builds our mental models by @kakutani

http://www.ustream.tv/recorded/25448633

MVCの問題

  • MVCをやっていると、Model が太りすぎる
  • どう整理したら良いか?の1つの案がDCI

DCI

Rails MVC

  • どう組み込む?
  • Model を DCI に分ける
  • Controller からユースケース毎に Context を作って
  • Contextから Data を Role 毎に呼び出す
  • @ITを書いてみた

感想

  • ちょっとよくわかんなかんなかったので(特に Interaction)、後で勉強する

Ruby; Exported @miyagawa

http://www.ustream.tv/recorded/25418815

One Size Does Not Fit All @matz

http://www.ustream.tv/recorded/25417206

クックパッドの作り方 by @ihara2525

クックパッドの組織づくりについて

http://www.ustream.tv/recorded/25395485

PHPカンファレンス2012に行ってきた

ぺちぱーではないのですが、php4 → php5 移行時代に使っていた事があるというだけの理由で、PHPカンファレンスに行ってきたのでメモを晒します。

当日のタイムテーブルはこちら http://phpcon.php.gr.jp/w/2012/timetable/

技評さんの写真も付いている素晴らしいレポートはこちら http://gihyo.jp/news/report/01/phpcon2012/0001

@unsoluble_sugar さんのありがたい講演資料まとめはこちら http://unsolublesugar.com/20120916/082851/

いまだからできるふつうの話 GREE 上村さん

長く続く大規模サービス基盤、の作り方にフォーカスして話す

そもそも大規模とは

  • データ的に50億レコードあるとか
  • トランザクション的に100万トランザクション/secとか

ポイント

  • 最初から大きくあることがわかっているテーブルは、あらかじめ分割して別々のサーバに置く => あとから分割するのは難しい
  • 購入履歴 => 日付毎のテーブル
  • 所持カードのリスト => ユーザIDでmodとって100分割

よくやる解決法

  • スレーブ増やす
  • スケールアップ(メモリ増やす、Fusion-io使う)
  • クエリチューニング(covering index, index full scan)

実際のチューニング(1)

  • 月に数回 slow query が発生してレプリケーション遅延が発生していた
  • DBのサイズは10GB強
  • MyISAM -> InnoDB
  • メモリ 16GB -> 24GB
  • slaveを6台 -> 3台に縮小
  • 課題:サービスを止めずに alter しないといけない

オンサービスでのDBきりかえ

  • 現行 master の slave として、新セットの master/slave をつける
  • レプリケーションできる形で alter しておく
  • slave を新セットの slave におきかえる
  • master の切り替えのために、auto_increment をあげる。# id 指定で insert しておく
  • あげておかないと2重 master からのレプリケーションで slave で衝突する

結果

  • 新セットへの切り替えのみですべての問題が解決
  • クエリのチューニング計画は空振り orz

実際のチューニング(2)

  • バッチの処理が遅くなって来ている
  • レプリケーション遅延が頻発
  • 4000/sec のupdate 文が飛んでいた
  • in 句で50件ずつまとめて更新するようにした
  • 簡単な対応だけど効果がすごく大きかった
  • 大昔のコードにこういうのがあって、いきなり火を噴くことがある

<継続>

  • よりよいシステムを作る => 完璧なシステムを作る? => 間違い
  • 完璧=その時点での完璧。環境は変化する。

GREE7年間のアーキテクチャ変遷

2005

  • Ethna 利用
  • Action(Controller), View, Manager(Model)
  • DBI master/slaveを選択

2006

  • serviceを追加
  • DAO: データ変換、分割DB対応、SQL動的生成

2007

  • serviceがservice層に。釣りスタサービス
  • Generic DAO 多様な分割DB対応、SQL動的生成廃止、チューニングが必要だから

2011 激動

  • Aoi カスケード(社内フレームワーク)
  • Service と Manager 併用という状況の打破。
  • Cascade(Generic DAOの拡張) より厳密な型変換。
  • KVS ドライバ(同じインターフェースで mamcache, flare にアクセス。flare とは gree内製の KVS
  • Service -> Processor (1つの機能) -> Module (Managerに相当)
  • => DataAccessor (DAO) => Cascade
  • => Legacy Module => (Manager, Service) Adapterパターンでレガシー関数をModuleインターフェースに変えている

Ethna

  • 2005年から変わらずに存在する
  • 機能自体には目新しいものはない。認証。ルーティング。バリデーション。
  • すごく良くはないけど、とくに困らない。

DOA -> SOA

  • 2005年 DOA Data Oriented Architecture
  • 2007年 SOA Serivce Oriented Architecture
  • サービスの種類が増え、データの扱い方という単位でサービスを表現できなくなった
  • manager -> service -> Aoi/cascade に段階的に移行したから、できた。
  • 段階的(少しずつ)なので、失敗したら戻せる

安定運用

  • 監視と障害対応
  • 監視。定期的にGangliaのグラフを確認。深夜のアラートは担当者の電話が鳴る
  • pull request のレビューを重要度に合わせてエスカレーション
  • デプロイのサイクルを短く。個別は毎日

お知らせ

  • github.com/gree
  • Cascade, LWF オープンソース化

まとめ

GREEの変遷はわかった。

安全なPHPアプリ開発の鉄則 徳丸ひろし

鉄則1:php の脆弱性

  • 脆弱性報告を読もう
  • is_a メソッドに文字列を渡すと何故か autoload が呼ばれるという脆弱性

鉄則2:ajaxの脆弱性

  • ブラウザ側でエスケープ vs phpコードでエスケープ。どっちでもいいけどやろうね
  • JSON解釈をevalでやる、と怪しい。jQueryに任せるのが楽
  • X-Content-Type-Options: nosniff を入れないとIE9だと json.php/a.html がHTMLと解釈される脆弱性。IE7だとダメ。
  • IE6, 7 用には <> をユニコードエンコードして、エスケープしてあげること

JSONハイジャック

  • JSONを罠サイトからscript要素で読み出す
  • 利用者のブラウザからは、正規のcookieが送信されるので、認証済みの状態でJSONが取得できる
  • Firefox11.0だと問題なし。Android標準ブラウザでは動いてしまう。Android4.0.3では動かない。

鉄則3:競合条件(排他制御)の脆弱性対処をしよう

  • ドリランド。カード増殖
  • トレードの時に、A さんが B, C さんにトレード。select して insert (相手) して delete (自分)。これで2個に insert できていた。
  • 鳥ランドwwwでデモ

排他制御が必要

  • transaction + 行ロック (SELECT FOR UPDATE)

まとめ

徳丸本読んで勉強してね

xdebug @anatoo アシアル

xdebugの使い方ではなくて、裏側の仕組みを説明。Monacaとか作ってました。 

xdebugを調べてみたら、phpの裏側の仕組みと連携していて、へー、と思ったので紹介

xdebugとは?

  • デバッグや開発を支援してくれる
  • コードカバレッジ取得
  • 関数とレース
  • リモートでバッグ
  • プロファイル

コードカバレッジ機能

  • 実際に実行した行を調べる。テストの網羅率を調べるのに使う。
  • xdebug_start_code_coverage(); をファイル頭で呼ぶ。#めんどいね
  • PHPはどのようにコードを解釈して実行される?
  • 字句解析
  • 構文解析 (bison)
  • コンパイル(Zend Engine)
  • 実行

コンパイル zend_op_array 構造体を作る

  • zend_op 構造体
  • ZendEngine への命令を表現
    • ZEND_NOP_ZEND_ADD
    • ZEND_SUB
    • などなど

実行 (zend_execute関数)

  • zend_op 構造体を解釈し実行
  • xdebug.c 588行目あたりの初期化コードでなにかオーバーライドしている
  • ZendEngine の振る舞いを拡張ライブラリから変更できるAPI zend_set_user_opcode_handler
  • 実行時の行を保持するようにオーバーライドしている

関数トレース機能

  • zend_execute 関数をすげ変えてフックを追加
  • zend_execute は関数ポインタ。拡張ライブラリも書き換え可能。
  • xdebug_old_execute = zend_execute;
  • zend_execute = xdebug_execute;

リモートデバッグ機能

  • ブレークポイント、ステップ実行。MacGDB と PHP で通信。
  • DBGPプロトコルで通信
  • DBGPデバッガ(MacGDB)がソケットをlisten. デバッガ(php + xdebug) が接続
  • xdebugが止まっている間は命令待ち。DBGPデバッガがデバッガに命令
  • statement_handler. すべての構文の実行ごとに呼び出されるフック。xdebugはここでブレーク
  • xdebug_dbgp_breakpoint ブレークポイントの実装

まとめ

  • PHPの中にはフックできるところがたくさん
  • 「へー」と思ってもらえたらうれしい

感想

  • 「へー」と思いました!面白かった

Git x Pull Request ~ チーム開発最終奥義 @sotarok

Crocos という会社をたちあげました。http://blog.livedoor.jp/kensuu/archives/54119909.html

Git 移行について考える

  • git に移行するkとは、svn に対応するコマンドを覚えることではない
  • git を最大活用できる開発フロー、業務フローに変えていくこと

git の活用とは

  • ローカルコミット
  • 気軽にブランチを切る
  • これを生かしたブランチ戦略!

git のブランチ戦略

  • A Successful Git Branching Model ベストプラクティスのひとつ
  • Crocos ではこれをカスタマイズしたものを使っている

A Successful Git Branching Model の説明

  • master 常に、最新の安定したソースコードが手に入るブランチ。リリースブランチ
  • develop masterから分岐した日々の開発を行うブランチ
  • release リリース前の確認を行う必要があれば修正する。本番リリース前のテスト、確認作業。developはdevelopで使えるようにdevelopからブランチ切っておく。日々のプロセスと、リリースプロセスを平行にできるようにするため。
  • feature 機能追加はdevelopブランチから分岐して開発。その機能はまだリリースに追加しない、となった場合はdevelopにマージしない
  • hotfix developの完成を待たずに緊急修正。masterからhotfixブランチを切る。必要になったときに考えれば思いつくのでいいや。

ツール

  • git-flow Successful Branch に準拠したものを簡単にできます。
  • git-daily Crocosの運用ルールに則って作ったもの

git-daily

  • pearでインストールできます
  • いちいちタグつけない
  • いちいちバージョン番号つけない。Webでバージョンなんていちいちみないよね、という理論。

pull request の話

他の人の責任範囲に対して、変更が必要な場合

  1. 依頼タイプ。コミュニケーション不足で違う物が作られたり
  2. コピーして独自改造タイプ
  3. 勝手に変更タイプ(勝手にcommit)
  4. !pull requestタイプ

pull request タイプ

  • パッチを書いて、取り込んでもらうことを依頼

ブランチ戦略に pull request を組み込む

  • feature ブランチを develop に入れる際に、pull request を送る
  • pull request 毎にレビューする
  • 変更の context が明確なため、レビューが超効果的

pull request のよいところ

  • パッチのやりとりが可視化され、オープンで記録が残る
  • リファクタの機械が与えられる

システム

  • GitHub 落ちてるとリリースできなくなっちゃうよね
  • GitHub Enterprise
  • GitLab クローンだけど、バグある。。。

クロコスでの事例

  • feture ブランチから、pull request
  • 多段 feature ブランチ
  • 大きな feature ブランチの場合は、レビューのしやすい粒度で、さらに切ってレビュー

効果

  • 自分の担当以外の部分の実装・仕様の把握ができるようになる
  • お互いに、だれがどういうコードを書くのかをわかるようになる

うまくいくコツ

  • できるだけ細かくリリース
  • 小さめのチームに分割する # どういう意味かわからなかった。小さくしたら担当(チーム)以外の実装がわからなくなるとおもうけど

感想

  • 自分たちのチームのやり方とあまり変わらなかった
  • ので、違う所として git-daily にもう少しふみこんでほしかったなぁ

PHP 5.5 新機能 Generator 初心者入門

目的:generator ってなんだかすごそうだ、と思ってもらう

generatorとは

  • 関数の一時中断、再開ができる = セーブ機能
  • generator 関数
  • generator オブジェクト = セーブデータ
  • yield 分 = セーブポイント

yield を使った関数を generator 関数と呼ぶ

function gfunc() {
  $i = 0;
  yield $i; // 1回目呼び出しでの return
  $i++;
  yeild $i; // 2回目呼び出しでの return
  $i++;
  yeild $i; // 3回目呼び出しでの return
}

generator関数は使い方が違う。

$g = gfunc(); // generatorオブジェクトが作られる。
foreach ($g as $x) { イテレータとして使ってはじめて実行される
}

generator でなにがうれしいの?

  • 汎用性の高いループ処理を generator 関数にして、ex) each_line
  • 汎用性の低いループ内処理だけ、別ループで書く foreach (each_line($filename) as $line)

もっと generator

  • generator 関数の引数を generator オブジェクトにして、generator を重ねる、なんてこともできる.

途中退室><

フレームワークアップデート

各フレームワークの有識者による最新情報のショートプレゼンセッションです。

  • CakePHP2
  • Symfony
  • FuelPHP
  • Yii Framework
  • BEAR.Sunday

8分でわかる最近のCakePHP @shin1x1

今のCakePHPは?

  • CakePHP2.2.2
  • PHP5.2.8以上
  • フレームワークをリファクタリング
  • lazy loading によるパフォーマンス改善
  • PHPUnit

いまどきのコントローラ

  • ファイル名とコントローラクラス名が同じに

CakePHP2.2の新機能

  • ビューブロック、継承
  • Event System (Dispatcher Filters) オブサーバパターン
  • Hash
  • ModelValidator

次のCakePHP

  • 2.2.3 が10月予定
  • CakePHP3 も発表済み

CakePHP3

  • PHP5.4以上
  • Modelが連想配列ではなく、オブジェクトを返す

まとめ

  • これから使うから CakePHP2.2.2
  • オフィシャルのオンラインドキュメント cakephp cookbook が大変便利です
  • CakePHP2実践入門 2012/09/29発売!

Symfony 株式界社エイチーム

Symfony リリース状況

  • 2.1 が最新

2.0 から 2.1 への変更

FuelPHP

発音

  • まさかの2大派閥
  • フューエル
  • ふえる(日本)

イメージ

  • Symfony は野球, クラシック
  • CakePHP はサッカー, ジャズ
  • FulePHP は散歩, アニソン
  • アニソン好きが1人で使う手軽なフレームワーク

  • ユーザが急増
  • 最も注目されている次世代フレームワーク

特徴

  • 規約より設定
  • ゆるい制約
  • コアを改造することも容易
  • オレオレ化もオK

課題

  • PostgreSQL非標準

業務での実績

  • 小規模開発only

転職市場

  • Symphony: 7件
  • CakePHP: 6件
  • FuelPHP: 0件

Yii @crifff

  • CodeIgniter から yii にいこうか fuel にいこうかという時代もあったが、
  • fuel にダブルスコアでまけている
  • 中国、ロシアで流行っている気がする
  • 他のフレームワークから良い所どりした洗練されたフレームワーク

yii 2.0

  • PHP5.3.8
  • composer によるパッケージ管理
  • リリースは未定

BEAR.Sunday

特徴

  • API Driven Framework
  • Web API を内部でも使う

Hypertext-Driven API

  • Hypertext じゃないと REST とはなのっていけない
  • Hypertext-Driven? = 情報がつながっている
  • OPTIONS メソッドで、どのメソッドとどのパラメータが使えるのかが分かる
  • HAL http://stateless.co/hal_specification.html
A Ruby and Fluentd committer working at DeNA. 記事本文および記事中のコード片は引用および特記あるものを除いてすべて修正BSDライセンスとします。 #ruby #fluentd #growthforecast #haikanko #yohoushi #specinfra #serverspec #focuslight
はてぶ人気エントリー