Hatena::ブログ(Diary)

130単位

2013-10-15

Rails3.0 -> Rails3.2 アップグレード

今さら需要があるかわからない3.2へのアップグレード情報です。半年前にはほぼ準備完了していたんですが、諸事情あった末にようやく調整ができたので、先日アップグレードしました。ちなみにRails4リリース後のセキュリティメンテナンス対象は3.2系のみであるため、3.1系以前を運用されている方はできるだけアップグレードしたほうがいいと思います。

Gitのlogを見ながら書き起こしているため、エラーか非推奨警告かは曖昧な上に、もしかしたらバージョンアップ関係ない点もあるかもしれませんがご了承ください。

Gemfile

#gem 'rails', '~> 3.0'
gem 'rails', '~> 3.2'
#gem 'mysql2', '< 0.3'
gem 'mysql2'
gem 'devise-encryptable'
#gem 'jpmobile', '< 2.0'
gem 'jpmobile'
#gem 'spork', '> 0.9.0.rc'
#gem 'guard', '~> 0.8.8'
  • 古いバージョン指定を除外(コメントアウト分が3.0用)
  • DeviseでRestful Authentication互換のEncryptorを利用しているのでDevise Encyptable追加

Rails

rake rails:update
  • config以下が3.2のデフォルトで上書きされる
  • git diff で3.0の内容と比較しながら設定
config.assets.enabled = false
  • asset pipeline をオフにして3.0時代のasset管理を継続
has_many_association#clear
# has_many :posts
has_many :posts, :dependent => :delete_all
  • 3.0は @user.posts.clear = @user.posts.delete_all だった
  • 3.2は :dependent を指定しないと 関連idを NULL で UPDATE する
    • 関連idがNULL不可の場合、:dependent を :delete_all (または :destroy) にする
Rails.cache with specific instances
config.eager_load_paths += %W[#{config.root}/lib]
config.after_initialize do
  require_dependency 'my_class' unless defined? MyClass
end
MimeType
  • config/initializers/mime_types.rb でPDF追加してたけど不要になった

Gems

Devise
<%#= confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>
<%= confirmation_url(@resource, :confirmation_token => @token) %>
#User.__send__(:generate_token, 'encrypted_password').slice(0, 8)
Devise.friendly_token.slice(0, 8)
  • ランダム文字列生成
RSpec(Guard)
#guard 'rspec', :version => 2, :cli => '--fail-fast --drb' do
guard 'rspec', :cli => '--fail-fast --drb' do
  • :version 指定不要
Capybara
  • git mv spec/requests spec/features
  • Capybara2系の仕様により、Capybara::DSL を使うspecをfeaturesへ移動
#select @datetime.month.to_s, :from => 'created_at_2i'
select "#{@datetime.month}", :from => 'created_at_2i'
#select @datetime.hour.to_s, :from => 'created_at_4i'
select '%02d' % @datetime.hour, :from => 'created_at_4i'
  • optionのテキスト検出が厳格になった
#click_button 'resource_submit'
click_button '登録する'
  • FormBuilder で submit の id が付かなくなった
Fabrication
  • resource!{ ... } -> resource{ ... }
  • sequence はブロック化して遅延評価
  • :from => Resource -> :class_name => :resource

感想

そもそもアップグレードが遅れたのは、非エンジニアがpublic以下を編集することが多いアプリで、asset pipeline対応ができなかったのが原因でした。ただ対応しないという判断で割り切ってしまえば、2系から3系よりは、対象項目が少なかった印象です。またテストを書いていたため、(テスト自体の修正もあったものの)比較的安心して進めることができました。Model.pluckが使えるようになったのが地味にうれしいですね。


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

関連記事

2013-09-03

Rails ポリモーフィック関連の関連名の命名

Railsポリモーフィック関連という機能があります。

class Picture < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true
end

class Employee < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

class Product < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

ざっくりいうと、複数の親Modelに属するような子Modelの関連を抽象化してまとめる機能です。詳しくはRails Guidesや以下のリンク先を参照ください。

関連名

ここで注目したいのが、Modelを関連づける関連名です。Rails Guidesの例にある "imageable"。聞き慣れないですが、どうなんでしょう。確かにimageは動詞でもあるため文法的には間違ってなさそうです。が、実際に扱おうとすると違和感が生じてきます。

親Modelから子Modelを参照する際は通常の関連と同様に扱えます。

pictures = employee.pictures

逆に子Modelから呼び出そうとすると、以下のようになります。

employee = picture.imageable

imageable というメソッドで employee が返るのはちょっとわかりにくい気がします。

命名具体例

調べていて、関連名の付けかたには2種類あるように見受けられました。(見出しは造語です)

able接尾辞
子Model関連名親Model
Comment :commentable Article/Photo
Address :addressable Person/Company
AttachmentImage :attachable Blog/Entry
抽象名詞
子Model関連名親Model
Item :parent User/Machine
Comment :resource Diary/Book/Shop
Paste :item Snippet/Picture
Employee :work_place Office/Factory

抽象名詞のほうで"parent"や"resource"は抽象度が高く、(開発者間で納得できれば)汎用的に使えそうです。英語の意味的には"object"も使いたいところですが、object_idが予約されているため使えません。

命名比較

able接尾辞
  • able接尾辞なModuleをincludeする感じ
  • 関連名が動詞+ableなので悩まなくて済む
  • 子Modelから親Modelの呼び出しがわかりにくい
  • Rails Guideで例示されているということは推奨なのかもしれない
  • 海外のBlog記事ではable接尾辞の採用が目立つ
抽象名詞
  • 抽象名詞なClass継承する感じ(STIのような命名)
  • 適切な関連名が見つかるかどうかは対象Modelと語彙力に依存
    • ここで割と具体的な名詞を使うと他のModelに使える名詞がひとつ減る(細かいけど)
  • 子Modelから親Modelの呼び出しがまだわかりやすい
  • 日本人エンジニアは抽象名詞を採用している例が見受けられる

まとめ

特に結論はありません。初めて使ってみた印象などを書いてみました。どちらを選択するかは好みの問題だと思います。ちなみに、自分のケースでは抽象名詞を採用しました。やはり子Modelからの参照時に名詞であったほうが違和感が少ないように思えたからです。たとえ返るObjectがメソッド名と異なったとしても、ですね。(ただし命名には苦労しました…)

ご意見などあれば遠慮なくいただけるとありがたいです!


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

4797363827
Rails3レシピブック 190の技

2013-07-06

フィリピンでMinaの開発者と会いました

Mina

約1年前にデプロイツールCapistranoの対抗として登場したMina。自分も少しだけ使ったことがありました。ただ最近は開発がアクティブでなかったため、Capistranoでいいじゃんとツイートしたこともありました。そんなMina、フィリピン発なんですね。

で、自分が今フィリピンにきていて、Minaを現地エンジニアとの話のきっかけにしたりも何度かしました。そして開発者の GitHub followers が500超なのを見るに、Nadareiというチームはおそらくフィリピンで一番いけてるエンジニア集団なのではないかと勝手に想像してました。そんないけてる開発者と、あわよくば会えたりしたらいいなあと思っていました。

Manila.js meetup

Mina開発者が発起人でもあるManila.jsというコミュニティ。月イチでミートアップを開いていて*1、たまたま当日の開始1時間前に気づくことになったんですね。

Manila.js JavaScript meetup 016

チケットはSOLD OUTだったんですが、インターンの縁を利用して参加可能か確認して、勢いで参加してみました。バスとジプニーを計4台乗り継いでなんとか辿り着いたときには既にイベント終了間際でした。発起人 @rstacruz がJSクイズを出してノベルティをプレゼントしてました(jQueryの最新バージョンは?とかEmber.jsの開発者は?とか)。

f:id:deeeki:20130705045610j:image

Recorded videos

Talking w/ authors

イベント終了後、これまたありがたいことにインターン先エンジニアに仲介してもらって、@rstacruz 、そしてチームメンバーでMinaメイン開発者である @mikong と話すことができました。

  • 忙しかっただけで開発意欲はあって、つい最近Issue処理を再開したこと
    • "please be patient" といわれた
  • submodule対応のpull reqを送ったことがあること
  • 本番環境で使っているか?と聞かれて、いや趣味でだと答えたこと*2
  • チームでは基本的にRailsアプリを開発していること
    • でも最近はアプリの8割くらいJSを扱ってたりすること
  • どうやってインターン先を見つけたのかということ

衝撃だったのは、"マイナ"だと思っていた読み方が実際は"ミーナ"だったことでした。

それにしても、先にプロダクトの利用、PRがあったのちに、こうしてリアルに海外のエンジニアと会って話せるというのは感慨深いものですね。もっとこういう体験をしてみたいと強く思いました。できればプロダクト提供側としても、というのと、技術的な深い話もできるよう英語力を上げていきたいですね。

JSConf.asia

今年の11/28-29にマニラで開催予定だそうです。興味のある方は行ってみるといいんではないでしょうか!(スピーカーも募集しているみたいです)

関連記事

*1:今月で4回目

*2:実際は既にCapistranoに置き換えたのだけど

2013-06-28

フィリピンでエンジニアインターンしました

f:id:deeeki:20130628153722j:image

経緯

  • 1年前の留学時、IT企業の面接を体験してみたかったができなかった
  • そもそもお試しで英語で短期間働く体験ができたら理想的と考えた
    • 今回は2ヶ月の滞在に決め、後半の1ヶ月間を目標にした
  • 現地イベントでLTしたことでできそうな手応えを得た
    • 英語はそこそこでも、特に母国アドバンテージもあるRubyならいけるのではと

会社探し

  • 留学先のバギオではRubyを扱う会社は全く見つからなかった
  • マニラで探すことにした
    • あとから気づいたけどバギオという地域自体がマニラの何分の一かの狭さだった
  • 一般的な求人サイトで引っかかるRuby求人は派遣ばかりだった
  • 現地Rubyコミュニティで求人の投稿が少し見受けられた
    • 加えてGoogle検索して直接サイトが引っかかった数社をピックアップ
  • スキル/経験/希望(1ヶ月のみ/無給でOK)にGitHubリンクをつけてメール作成
    • 使いまわして各社にメール送信
  • 当然お断りもあったがほとんど返信してくれた

面談

  • 一番最初に興味ありの返事をくれた会社とSkype面談
    • それで速攻決まった
  • 質問は以下のようなことを聞かれた気がする
    • 開発経験年数(Rails経験年数)
    • なぜRuby/Railsを使っているか(日本製だから以外でw)
    • テストは書いているか(JavaScriptも)
    • 今はどのように仕事しているのか
  • でも口約束のみで、いちおう契約書類ほしいと伝えてもスルーだった
    • ので正直不安なままマニラに向かった
  • 開始3日前に再度Skypeで確認して、無事働くことになった

やったこと

  • Ruby2/Rails4/MongoDBによる社内ツール開発
    • 日本語のアプリ名にしたいといわれて自分が提案したのになった
  • GitHubプライベートリポジトリでのプルリク運用
    • 自分:CTOが7:3くらいの二人開発
  • PivotalTrackerでストーリー管理/Skypeで情報共有
  • 毎日午前中に全体スタンドアップミーティングで進捗確認
  • Spring/Turnip/Figaro/Cancanを初めて使ってみた
    • Spring with guard-rspec はかなり快適なTDD環境
    • Turnipは結局GherkinというCucumberの文法が必要なので慣れるまで大変
    • Cancanは機能豊富な割にはスクラッチの権限管理と作業量変わらない気がする

f:id:deeeki:20130628124704j:image

感想

開発面
  • 割とゆるく自由にやらせてもらえた
    • 多少別の仕事などもしてフルにやれてないが、コミット量と早さは評価してもらえた
  • インテグレーションテストは後回しにする傾向があるかもしれない
    • ControllerSpecを割と厚く書いてた
  • CTOはいわゆる風のプログラマーで、新しもの好きな印象
    • おかげで残されたバグもそこそこ踏んだ
    • push通知するSkypebotを途中で導入してた
    • プルリクでは要所要所でレビューしてもらった
  • 中間テーブルの命名について議論してみたりもした
  • 可能であればもうあと1-2人くらいとソーシャルにコーディングしたかった
    • 他のプロジェクトのリポジトリも見たいと相談したが、機密的に難しいようだった
その他
  • 英語力アップはそこまで期待できない
    • なぜならフィリピン人同士はほぼタガログ語で話すから
    • 中には英語に自信がない人もいるようだった(それでも日本人よりはできるけど)
    • そしてエンジニアだとそもそも黙々コーディングしてる時間のほうが長い
  • 自分とは英語で話してくれるので、そこをうまく活かせるかどうか
    • どの環境でもいえるが、話好き/積極性がものを言う(※持論)
      • 自分は真逆なので、実際にあまり伸びてないと思う
  • 会社は20人くらいの規模
    • 平均年齢は25歳くらい
    • CTOと他数人はシンガポールのRedDotRubyConfに参加してた
    • 学生インターンがRails TutorialでCapybara学んでてすごいと思った
    • 日本アニメだったり楽器だったりハードウェアに造詣が深い人もいた
    • 何人かは定時後夜中までオンラインゲームしてたりした
  • ランチは毎回誘ってもらい、ほぼDRYにいろいろな店を楽しめた
  • 夕食もたまにデリバリー頼んだり、臨時の出店的なところで食べたりした
  • たまたま会社が会場だった月1のRubyコミュニティミートアップに参加した
    • "Eat first!" といって先にピザを食べた
    • 日本のコミュニティやRailsアプリなどについてLTした
      • プロジェクタがなくて普通のモニタでのLTに面食らった
    • Ruby2.0やRails4使ってる人はまだ少なかった
    • 適当に2-3人話したり告知したりして解散、残りたい人は残るみたいな流れ
  • エアコンが20度で効きすぎて寒かった

f:id:deeeki:20130628153808j:image

まとめ

仕事の質に関しては、やはり日本(人)のほうが高いかなという印象でした。そして、英語がそこそこでも2-3年ほどのエンジニア経験があれば、開発メインであれば十分に通用するのを実感しました。

また、英語漬けになれる環境を求めるのであれば、完全な英語圏の国で働くのがよさそうです。ただ逆にフィリピンでも英語公用語の会社が増えれば、お互いに機会が広がりますし、語学学校の先という部分でビジネス的にも可能性があるのではないかと思ったりしました。

で、当初は1ヶ月の予定でしたが、ある程度慣れてしまったのと他の環境も経験してみたいという思いから、残り1週間は別の会社でインターンさせてもらいます。

とはいえ大変お世話になったので、今後も何かしらでお役に立てればと思います!

関連記事

2013-04-01

Railsの学びかたについてLTしました #mtsmhack

久々にRails×初心者向けというテーマを設けて、ついでに発表してみました。

初心者向けブログ記事とかも多数あったりしますし、なるべく独自性のある内容を心がけてみたつもりです。

  • 自分の経験談
  • 初心者向けの話
  • Railsで仕事したい人向けの話
  • +αとしてテストと英語についての話

と4つのセクションで話してみましたが、対象の幅が広いため伝わりづらい部分もあるかもしれません…。あと思った以上に長く喋ってたみたいでそこも反省ですね><

補足とか

Railsおすすめ書籍
勉強会
初心者向けRSpec tips
  • before/itの説明は無しでもいい
    • コードで読めばわかると思うのでテンポよくテストこなすためには無しでもいいかなと
  • letは使わずbeforeで前提処理を統一
    • letは実行効率はいいのでしょうけど、呼ばれないと発生しないことで嵌る可能性もあるためbeforeがいいかなと
  • itで複数のexpectationを書いてもいい
    • 特にインテグレーションテストでは検証対象が増えがちで、まとめて書いてもいいかなと
フィリピン英語留学とか
  • 経験やツテがあったりするので興味ある方は気軽に聞いてください!
質問:なぜRailsなのか

当時触っていたPHP(CakePHP)に限界(書きづらさ)を感じていて、たまたまRailsの仕事があって、新しいことをやってみたいとも思っていて、担当させてもらいました。またCakePHPが参考にしたRails、いわば本家なわけでCakeよりは書きやすいだろうというのと、仕事以前に趣味で素振りしていた感触も良かったこと、国産の言語であること、自信のある語り口で楽しそうに話されていたまつもとさんの講演の印象が強かったこと*1、そういったさまざまな要素も絡んで、時間を費やしてでもやる価値はあると判断しました。

質問:個人のアプリで評判が良かったものは

自分に関していえば、実はRailsアプリで公開しているものはまだありません(作成途中で未完成なものはありますが)。仕事でRailsを触っていたのでそれで精一杯だったというか、満たされていたというのも関係してるかもしれません*2

関連して思うこと

Ruby/Railsで仕事したいけどできない駆け出しエンジニアRuby/Rails技術者がほしいけど見つからない会社、の両方の苦労を聞いたりしていて、なんとかそこの溝を埋められたらいいなあとぼんやり考えていたりします。やはり即戦力かどうか、が線引きになるんでしょうけど、自分のように仕事でなかったらそのレベルは身に付かないという人も多いと思うんですよね。なので余裕のある会社さんは懐広く受け入れてみてほしいですし、エンジニアの方々もある程度はリスク覚悟でチャレンジしてみてほしいなと思います。あ、Ruby/Railsの仕事自体も増えるといいですね!


【追記】質問されたこと書き加えました(2013-04-01 22:20)


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

4797363827
Rails3レシピブック 190の技

関連記事

*1http://d.hatena.ne.jp/deeeki/20090214/matzseminar

*2Rails覚えたての頃に、慣れていることを理由にCakePHPで人気のスライドを集めるサイトをつくってたくさんはてブいただけたことはありました