Spring が便利

Rails アプリの開発で便利な gem である Spring を紹介。

spring は Rails のプレローダーアプリであり、sporkzeus, commands と同様のものである。

っと、 README を訳した感じになってしまったが、そのまんま。

対象バージョン

古いシステムだと動かない…。

Spring をインストール

$ gem install spring

これだけ。 spork は いろいろ設定が面倒、 zeus は結構プロセスが 壊れたりするので今はこれに落ち着いている。

Gemfile に書かずに直接インストールすることが推奨される。

使用方法

おそらく、よく使うのは rspec, cucumber を走らせる場合である。 guard で自動だよってのはアレだが、 Sublime Text 等でエディタ上から動かすとかには便利。

Rspec
$ spring rspec spec/models/hoge_spec.rb

頭に spring がつく以外は通常通りの実行で構わない。最初はロードしていないので時間がかかるが、次回からはロード状態なので高速に動く。

cucumber
$ spring cucumber features/hoge.feature

などと。もちろん、ファイル指定しなければオールテストが実施される。

その他、 rake, generate, console, server などはひと通り使える。

注意事項

ブランチ移動した場合は spring を止めて再起動するすること。

$ spring stop

spring の状態は

$ spring status

で確認できる。

あと、 spec_helper.rb に spork の設定を記述してある場合は必ず消しておくこと。 フィクスチャに factory_girl を使用している場合は

config.before(:all) do
  FactoryGirl.reload
end

を追加しておこう。おそらく、Spork.each_run のブロックに書かれているブツ。

Github の pull request で jenkins のビルドを走らせる

はてなブログに移転してみたので記事を。

Github 上でソース管理をしていて、 pull request でレビュー・マージを しているケースは業務上でも最近多くなってきていると思われる。

pull request を投げた時点で jenkins でビルドをすれば事前にわかるので マージ後に発覚して失敗するコミットをマージせずに済む。

それを実現できるのが Github pull request builder plugin である。

https://wiki.jenkins-ci.org/display/JENKINS/Github+pull+request+builder+plugin

導入方法は上記URLを見ていただければわかると思う。 これを設定しているジョブが pull request 、追加コミット等のタイミングで 走るようになる。

ただ、ジョブは1つなので分散してテストを実施しないと時間がかかる場合は使いにくい。 分散すれば10分のところを1時間かかる場合もあるからだ。 そこで、さらにプラグインを導入して複数のジョブを子どもに走らせて全て Succes の場合に Success とするように設定する。

それが Multijob Plugin である。

https://wiki.jenkins-ci.org/display/JENKINS/Multijob+Plugin

これで複数の job をぶら下げて一気にテストすることが可能になる。 難点は、親 job だけで1台使用するので2つの job を並列で走らせる場合は 3台のスレーブが必要になる。親と同じマシンで動かす設定もできるが、その場合は 同時ビルド数を増やす必要がある。そのため、同時ビルドができないプロジェクト ではそのマシンは pull request 専用にする必要がある。

java_ja.DDD に行ってきた

テーマがDDDについてということで迷わず参加登録。
書籍は持っていて半分以上読んだつもりだがイマイチ業務には活かしきれていない…。
そこでこれに参加して何かを得られればと思った。

java_ja は勉強会じゃないよー!」

初めての java_ja だったが、明らかに雰囲気が他の勉強会とは違った。

java_ja は怖いって書かないでね!」

怖くないです。発表中にもいろいろ質問があったりツッコミが入ったり
笑いがあったりと、みんなで盛り上がっている感があってとても楽しかった。

内容も濃いもので、業務に活かせるヒントがたくさんあった。

DDDの前に必要な知識がある

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション


実装パターン

実装パターン


アナリシスパターン―再利用可能なオブジェクトモデル (Object Technology Series)

アナリシスパターン―再利用可能なオブジェクトモデル (Object Technology Series)

  • 作者: マーチンファウラー,Martin Fowler,堀内一,友野晶夫,児玉公信,大脇文雄
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2002/04
  • メディア: 単行本
  • 購入: 7人 クリック: 89回
  • この商品を含むブログ (67件) を見る

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)


実践UML 第3版 オブジェクト指向分析設計と反復型開発入門

実践UML 第3版 オブジェクト指向分析設計と反復型開発入門

  • 作者: クレーグ・ラーマン,依田智夫,今野睦,依田光江
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2007/11/12
  • メディア: 単行本(ソフトカバー)
  • 購入: 8人 クリック: 179回
  • この商品を含むブログ (28件) を見る

いきなりDDD本を読んで全てがわかるわけではない。
いろいろなことを踏まえてDDDを実践していくこと。
ということでここらの書籍が紹介された。(他にもあったはず…)
下3つはまだ読んでいないので少しずつ読んでいこうと思う。

ざっくりDDD入門


和智さんの発表
http://www.slideshare.net/digitalsoul0124/ddd-17678116

和智さんはDDDを翻訳された方でDDDの入り口をわかりやすく説明されていました。
質問コーナーが熱くてドメインエキスパートって誰?いるの?などドメインエキスパートに関することが白熱していました。

リッチなドメインモデル名前探しの旅


増田さんの発表
http://www.slideshare.net/masuda220/ddd-forname

「プログラミングは名前探し」

名前が重要。クラス名・変数名・メソッド名などなど…。
私もいつも名前を考えるのが苦手で苦労している。
そのためには、語彙を増やさないといけない。語彙を増やすには

  • その分野のガイドブックや類似サービスのヘルプ画面など言葉の宝庫をどんどん漁る
  • 聴く・尋ねる

すぐに実践しよう!今やっている業務では特に英語が多いのでやらんとイカン。RSpecのcontextなどを拙い英語で書いていて辛くなってきたので日本語を使い始めたけどやっぱり英語は避けてはいけないな。もう一度がんばろうというきっかけになった。

その他、LTも豪華で、加藤さんのいろいろな裏話や和田さんのSQLアンチパターンとDDDについてが聞けていいカンフル剤になった。加藤さんのは続きはWebで!ができないアレな話で盛り上がり、和田さんのは Rails でのネタが結構あったのでなるほど頷くところが多かった。
時間が押していたのでまきで発表になり、じっくり聴けなかったのが残念だった。

こういうの初めて書くから雑すぎるけど、ブログ書くまでが java_ja ということでお許し下さい。もっといろいろと書くクセを付けないといけませんね…。

最後に、 GREE さんありがとう!酒とピザと会場をありがとう!

java_ja.jojo らしい。第3部の途中までしか読めていないけど参加できるのかしら…?

【追記】
和智さんのスライドのリンクを追加した

Railsでの危ないコーディング

既存のRailsアプリを改修するにあたって目の当たりにした光景を幾つか紹介する。
よくあることなのかどうかは定かではない。

ActiveRecordのモデルでafter_initializeを使用して値を更新する


after_initialize は初期化後に呼ばれるメソッドであるが、そこで値を更新(変換)をしているケースがあった。主に編集画面で表示される値と格納される値が違う場合に使用されていた。格納されている値を生で参照できなくなってしまって不都合が起きたり、一覧で取得したい際も呼ばれるので無意味なロジックが走る場合がある。

私はこの場合、 after_initialize は極力使用しないで、明示的に変換ロジックを呼んでいる。また、永続化されていない属性に対しては使用してもいいと思う。

同じアクションで get と post で場合分け


hoge_controller#setting で取得(get)と更新(post)を両方受け入れていた。

def setting
  request.get? ? show_setting : update_setting
end

素直にアクションを別にすべき。URI設計をしていなかったのだと思われる。

valiadtion で値を書き換える


validate メソッドを定義し、値が正常であればDBに格納するために変換を行う。最終的にvalid?がfalseになる状況であれば値を再度戻すなどかなりしんどいことをしていた。
このケースだと、複数のモデルに対して一度バリデーションだけ実行し、全て問題なければsaveを実行するということができない。1回目のバリデーションで値が変更されているのでsave時のバリデーションでエラーになるはずだからだ。

そもそも、バリデーションは検証のみなので値の変更はすべきではない。

リクエストパラメータ(params)を書き換える


view側で使用するためにparams[:hoge]の情報がそのまま使えないのならインスタンス変数で格納すべき。

helperにインスタンス変数

def convert_hoge(hoge_id)
  foo = @fuga.fuga
  foo + hoge_id
end

確かに、helper内でもコントローラで設定したインスタンス変数は使用できるが、外部状態に依存するのは気持ち悪い。ヘルパーメソッドはインプットが同じならアウトプットは同じであるべき。テストを書いていれば、こういう実装にはならないはず。


こういう状態になっている場合は大抵テストもあまり書かれていないのがほとんどなのでにっちもさっちもいかない状況になっている。末期症状に近い状況だった。
こうならないためにも、テストをしっかり書き、コードレビューを綿密に行うように心がけている。

さくっと2012年振り返り

今年もあと少しで終わり。
今年は人生2回目の転職をしたのが大きなトピック。

前職では明確な目標・計画が見えず、このままではいかんと思い、
エンジニアチームの意識を変えようとちょっとだけ行動しましたが
かなり上の意識は営業寄りでエンジニアはただの労働力としか見ていなかった。
そういう組織は自分には合わなかったため、ちょっとしたきっかけにより現職に転職。

前職の全てが嫌であったかとういうとそうでもない。一人ひとりはいい人が多かったし、
いろいろな現場に行けてたくさんのことが吸収できた。Rubyを始めたのもたまたま
Java行った現場でいきなりRubyをやってくれと言われたことから始まった。

たくさんの方々とも知り合えた。前職のつながりはあまりなく、プロジェクトでの
つながりが大変多かった。アジャイル、ドメイン駆動、CI、テスト駆動、ペアプロ
などなどいろいろ経験できて今の自分がいる。

2013年は更に変われるよう、レベルアップできるようにがんばろう。

個人目標は

  • Androidアプリ、iOSアプリをある程度作れるようになる。
  • 本をたくさん読む。
  • 英語をたくさん読んで書く。
  • 情報を発信する。

仕事での目標は

  • チーム力の底上げ
  • ペアプロを広める
  • 社内勉強会を主催する
  • 期待以上の成果を上げる

来年もよろしくお願いします。

selenium-webdriver のインストール

Selenium を使用してちょっとしたブラウザ操作をするために、 selenium-webdriver をインストールしようとした。

http://rubygems.org/gems/selenium-webdriver

ここにある通りのコマンドを実行

$ gem install selenium-webdriver
ERROR:  Could not find a valid gem 'selenium-webdriver' (>= 0) in any repository
ERROR:  Possible alternatives: selenium-webdriver

あれ…。そんな gem は見つからないって…。

$ gem install "selenium-webdriver"
Fetching: multi_json-1.3.6.gem (100%)
Fetching: rubyzip-0.9.9.gem (100%)
Fetching: ffi-1.1.5.gem (100%)
Building native extensions.  This could take a while...
Fetching: childprocess-0.3.5.gem (100%)
Fetching: addressable-2.3.2.gem (100%)
Fetching: libwebsocket-0.1.5.gem (100%)
Fetching: selenium-webdriver-2.25.0.gem (100%)
Successfully installed multi_json-1.3.6
Successfully installed rubyzip-0.9.9
Successfully installed ffi-1.1.5
Successfully installed childprocess-0.3.5
Successfully installed addressable-2.3.2
Successfully installed libwebsocket-0.1.5
Successfully installed selenium-webdriver-2.25.0
7 gems installed

クォーテーションを付けることで解決しました。

日本語入力でタブを使えるようにする

とてもいいエディタで満足しているが、日本語入力にちょっと弱い。
google 日本語入力を使用しているが、予測変換候補をタブで選ぼうとするとタブが入力されてしまう。
ctrl + n や矢印キーでもちろんできるが、どうも癖がついている。
そこで、デフォルトのキーバインドでタブに割り当てられている一部をコメント化して解決した。

  // { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
  // { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},
  // 	"context":
  // 	[
  // 		{ "key": "setting.tab_completion", "operator": "equal", "operand": true }
  // 	]
  // },

これの弊害は snippet をタブで入力できなくなるということだ。
Show Completions(ctrl + space) で入力する。

どっちを取るか…。