Shoken Startup Blog

KitchHike Founder/CTO

Ginza.rb 第35回 Trailblazer入門に参加してきた #ginzarb

Ginza.rb 第35回 先駆者の知見拝見!Trailblazer - Ginza.rb | Doorkeeper に参加してきました。

Ginza.rbは本当に良いコミュニティ。参加すると、いつも現状で考えられる一番正しい解と最新の情報をもらっています。

Trailblazerについては、去年2015年の9月に勉強会に参加して以来。

Trailblazer勉強会に参加してきた #trbtky - Shoken Startup Blog

2回目ということで、理解はより深まったつもり。わかりやすい発表スライドのおかげです。

発表者: @y_yagi
スライド: http://y-yagi.github.io/introduction_to_trailblazer/

感想

発表後のディスカッションで@netwillnetさんが言っていた。「Trailblazerは学習コストが高い。その学習コストをPayするのは、規模の大きなプロジェクト。だが、大きなプロジェクトではいきなりTrailblazerを入れるのはリスクというジレンマがある。」

別の参加者が、Trailblazerとは別のFW、Hanamiについてだが「エンジニア8人のプロジェクトだが、入れたい。Payできると思う」と言っていた。8人クラスになると足並みをそろえるのが大変のようだ。

TrailblazerやHanamiなど、RailsMVCとは違う思想のFWの前提にあるのは、Rails辛い問題(詳細は@y_yagiさんのスライド)。fat controllerやfat modelへの回答の一つで、背景にはDDDがある。KitchHikeはエンジニア2人で作っている小規模なプロジェクトで、FWで縛らなくてもある程度の足並みはそろっている。だからといってDDDの知識やTrailblazerの思想が役に立たないかというと、そうではない。ベストプラクティスからの学びは多いし、何よりDDDという共通知識を前提に会話できるのが良い。DDDやTrailblazerは大規模プロジェクト用かもしれないが、小規模プロジェクトの良い指針となっているなと思いました。

明日からもコード書くぞー!

スライドの抜粋メモ

Trailblazerとは

  • 通常のMVCとは異なる層を提供する
    • Operation(サービスオブジェクト)、View Model(cells)、Form等
  • 各処理を適切な層に記載する事で、view / controller / modelがfatになるのを防ぐ
  • また、各層を疎結合にする事で各層毎でのテストをしやすくする

RAILS辛い問題

  • 気付くとfat controller
    • fat controllerを避けようとした結果、今度はmodelがfatになる
  • viewにビジネスロジックが記載されている
    • viewから直接DB参照してたり
  • ビジネスロジックをどこに書けば良いのかわからない

CONTROLLER

個人的にここが一番大事だと思う。controllerを見るうちの9割はリクエストを追う時なので、ビジネスロジックは視界に入らないで欲しい。fat controllerだと、こんなのを見たいわけじゃない!という箇所が多くてリクエストを追うのが辛い。

  • HTTPのエンドポイントとしての処理のみを書く
    • リダイレクトやviewのrenderなど
  • 当然ビジネスロジックは書かない

OPERATION (Railsに無い層)

  • ビジネスロジックを定義する(service object)
  • modelを保存する処理を定義するのはOperationだけ
  • validation / callback / authorizationもOperationに含まれる

VIEWS

  • パーツ毎にcell(view model)を使い、viewはシンプルな状態のままにしておくことが推奨されている

REPRESENTER

  • RubyオブジェクトをJSONXMLに変換する為の処理を定義する箇所

その他GEM

  • roar: Parse and render REST API documents using representers. 内部で representerを使っている
  • formular: f.selectなどを自分でカスタマイズできる。simple_formの類似。

FILE LAYOUT

Sample Project

https://github.com/apotonick/gemgem-trbrb

勉強会で仕入れた新しい情報メモ

過去のGinza.rbで@y_yagiさんが発表したHanamiのスライド

表参道.rb#5に参加してきた #omotesandorb

表参道.rb #5 - connpass @Sansanに参加してきた。今回はLT大会だった。最初の方のメモはとれなかったので、いくつか抜けている。

JSON-Schema

発表者: http://hokuma.net

APIの仕様と実装を近づけたい
バリデーションに使える
https://github.com/hokuma/json-schema-sample

OmniAuthのStrategy

発表者: @yimajo

Stargazerという、GithubやQiitaなどのサイトのスター数をまとめるサービスの開発で、OmniAuthを使った話

Ruby-StyleStatsの紹介

発表者: @_shiro16

RubyでStyleStatsをつくった - まっしろけっけ
スタイルシートの統計情報を出力する
http://www.stylestats.orgruby実装

index_shotgunを作った

発表者: @sue445

重複するindexを抽出するためのgem
スライド: http://sue445.github.io/omotesandorb-05/

タスクを呼び出し方がかっこ良い

rake index_shotgun:fire

すごいErlang楽しく学んだ

発表者: @kei_q

JSONサーバーのRails以外の選択肢

Erlangを選択したきっかけの一つ
時雨堂 BOT サーバー (すごいErlangをゆかいに学ぶ会)

Ruby frozen string literal

発表者: @koic

2.3.0で導入される マジックコメントでファイルごとに指定できる、もしくはコマンドラインオプションでも指定化

# -*- fronze-string-literal: true -*-

問題が無ければ3.0でデフォルトになる予定

Service WorkerとFacebookに遊ばれてました

発表者: @igrep

スライド: http://the.igreque.info/slides/2015-10-01-service-worker.html

FacebookAndroidChromeで通知のために使っている

Service Workerの役割

  • ブラウザ内のローカルプロキシ
  • ブラウザ版daemon的なやつ

他、発表のスライドにあった情報

Ginza.rb 第25回 RailsConf2015の資料をみんなで読もうに参加してきた

7/21にRubyの勉強会、Ginza.rbに行ってきました。ブログ書こう書こうとしていてずっと書いてなくて、ついに第26回Ginza.rbが明日になったので書きます。

やったこと

  • RailsConf2015の資料や動画を見た
  • Rails Weeklyで直近のコミット内容を追った
  • Rails5での新機能、主にAction Cableについて

RailsConf2015の資料や動画

公式サイトにアップされているDHH氏の基調講演や、各発表のスライドを流し読み。

Confreaks TV | railsconf2015

Slide decks from RailsConf 2015 | Eventifier

Rails Weekly

This week in Rails

RailsConfの資料を見終わると、話題はRails Weeklyに上がってくる直近の動きへ。実際にコミットしている方も主催者側として勉強会に参加されていて詳しい説明を聞くことができた。

ちなみにGinza.rbの主催者/参加者には、パーフェクト Ruby on Railsの共著者である@willnet氏と@joker1007氏がいる。さらに@a_matsuda氏もフラッと参加するなどハイレベル。Ginza.rbほんとすごい。

Rails5の新機能

3つ大きな変更が予定されている。

  1. Action Cable
  2. Rails API
  3. Turbolinks3

ここの勉強会がきっかけで、次の週に行った開発合宿でAction Cableを使うことになった。Ginza.rbほんとすごい。

rails/actioncable

rails/actioncable-examples

[Rails5]Action Cableのサンプルを読み解いてみる - Qiita

Turbolinks 3こそRailsの未来 - Qiita

Rails 5 の足音 - Misoca開発ブログ

(翻訳) Ruby 2.2 のシンボル GC | FIVETEESIXONE

次回の勉強会

次回(といっても明日だけど)は@kyannyさんがBackbone, Chaplin, Marionette そして React - Quipper における Single Page Application 開発の変遷 - YAPC::Asia Tokyo 2015をベースにJavaScriptフレームワークに関する発表をされる予定。

イベントページ Ginza.rb 第26回 シングルページアプリケーションのためのRailsとJavaScript フレームワーク - Ginza.rb | Doorkeeper

Doorkeeperからメール来てすぐに予約したつもりだったけど、キャンセル7人待ちだったorz。Ginza.rbほんとすごい。

よちよち.rb 第25回を見学して勉強会というコミュニティについて考えたこと

よちよち.rb 第25回に主催者のゆかおさんにお願いして見学させてもらいました。

よちよち.rb 第25回 - よちよち.rb(初心者限定 Ruby On Rails 4 とか勉強会) | Doorkeeper

僕は2年ほど前に丸の内MongoDB勉強会を始めました。(しばらく海外に行っていたので今は別の人が主催をしてくれています。)

勉強会という一つのコミュニティを始めるにあたって、意識したことが2つありました。

  1. 自分がいなくなっても継続するコミュニティを目指す
  2. 参加条件を用意して参加者のモチベーションを一定以上に保つ

よちよち.rbというミートアップに参加して感じたことは、上の2つとは全く逆のことでした。 まずは、この2つを意識するようになった経緯を書きたいと思います。

自分がいなくなっても継続するコミュニティを目指す

これは新卒で入社して間もない頃、日本の著名なDebianコミッターの方の講演を聞く機会があり、その中での質疑応答がもろに影響を受けています。 僕の質問「理想の(オープンソース)コミュニティとはどんなコミュニティですか?」に、「自分がいなくなっても継続していくコミュニティが理想なんじゃないかな。」と答えてもらいました。クラウドなんてほとんど知られてなかった当時ですが、DNSなどに代表されるWWWの分散型システムと重なり、とてもとても影響を受けました。

これについて丸の内MongoDB勉強会ではある程度達成できたと思っています。初回の勉強会から約2年。周りの方々の協力のおかげで、僕が海外に行った後でも丸の内MongoDB勉強会は継続的に開催されています。次回は7/17に開催予定です。 丸の内MongoDB勉強会 #18 - 丸の内MongoDB勉強会 | Doorkeeper

参加条件を用意して参加者のモチベーションを一定以上に保つ

こちらはDebian勉強会に影響を受けました。学生時代に初めて参加した勉強会です。とてもドキドキしながら、まだ渋谷にあったGoogleオフィスで開催された東京エリアDebian勉強会に行ったのを覚えています。 当時も今も、Debian勉強会は参加登録と同時に、事前課題を提出することを参加の条件としています。事前課題と言っても、勉強会に参加しようとする人なら時間を少々かければできるものです。当時の事前課題はたしか「自分の好きなオープンソースライセンスとその理由」だったと記憶しています。最新の事前課題を見ると、「本日の東京エリアDebian勉強会でDebianに関して何の作業をするかを宣言してください。」でした。 この事前課題によって、

  • 勉強会参加者の共通知識ができる
  • せっかく事前課題をやったのだから、という気持ちがドタキャンを抑止する
  • まったく事前学習無しのセミナーノリでの参加を抑止し、モチベーション高く参加する

という効果が期待されます。 当時も事前課題のおかげで、初参加の学生ながら会話に参加できたことを覚えています。

丸の内MongoDB勉強会では事前課題では無く、毎回ハンズオン勉強会という形式にして参加条件に「ノートPCにMongoDBをインストールしてくること」としました。こちらもある程度効果があったと思います。全員のノートPCにMongoDBがあることを前提に、レプリカセットやシャーディングなどを参加者同士で実践することができました。

でも、よちよち.rbでは違った

よちよち.rbに参加してまず感じたことは、主催者であるゆかおさんのあたたかさと、ゆかおさんを中心としたコミュニティの一体感。ゆかおさん主催だから参加している人も多いんじゃないかと思います。コミュニティを作る情熱とモチベーションがなければ、週1で勉強会を25回も続ける事はできません。ゆかおさんには感服です。この人じゃないとできない勉強会、これも理想の一つなんだなと考えが変わりました。

そしてもう一つのほう。よちよち.rbでは特に事前課題は無いようです。参加条件も初心者向けミートアップという意味での、「プログラミング歴2年以内程度を想定」というもののみ。にも関わらず、参加者みんなモチベーションが高い。セミナー気分で参加している人はゼロでした。 その理由の一つをWeb上のコメントで見つけました。「前回行けなかったけど、参加者コメントを見てモチベーションが上がった。がんばろう。」という趣旨の書き込みがありました。このいっしょに勉強して、いっしょに成長することが最大のモチベーションなんですね。ミートアップのREADME.mdに書いてありました。

この勉強会のいちばんの目的は、Railsを習得することではありません。目線の高さが同じ人といっしょにひとつの活動を根気よく続けることで自信をつけていくこと、これが最大の目標です。

講師と生徒、のような形式はとらないつもりです。みんなで転んで、みんなで進んでいきます。 効率よりも経過を重視します。2時間で1ページも進まなくても、その時間で考え実行したことが宝です。

参加/不参加はお気軽にどうぞ。無理のない範囲で、たのしく技術をみがいていきましょう。

yochiyochirb/meetups

他にも工夫がいっぱい

  • ミートアップの最初は一人一人自己紹介。1時間程度使っている。

  • 自己紹介は各自Gistを用意。

  • 自己紹介時に自己診断でRailsとGitの経験(ステータス)を共有。

  • Railsチュートリアルをみんなで進めるので継続参加を推奨している。

  • 参加者は名札をつける。前回参加者は持参する。

  • 参加するとシールがもらえるラジオ体操方式。

  • 4,5人のグループにわかれて、Railsチュートリアルを音読する。

  • グループで話題に上がった事をGithubのissueで管理。後ほど全体で共有。

よちよち.rbのみなさまに感謝

よちよち.rbに参加して、コミュニティへの考え方が大きく変わりました。ゆかおさんが中心となって、参加者全員で作っているミートアップなんだな、と感じました。最後にもう一度引用します。

講師と生徒、のような形式はとらないつもりです。

みんなで転んで、みんなで進んでいきます。

効率よりも経過を重視します。2時間で1ページも進まなくても、その時間で考え実行したことが宝です。

yochiyochirb/meetups

Rails + New RelicでRuby 2.0にバージョンアップするとエラー NoMethodError undefined method `empty?'

解決するまでに時間がかかったので、情報共有。

以下に当てはまる場合は一読を

  • Rails 3.2系
  • New Relicで監視している
  • Ruby 1.9.3から2.0へバージョンアップするとエラー
  • Production環境のみで、TOP画面アクセスした場合にNoMethodErrorが出る
NoMethodError (undefined method `empty?' for nil:NilClass):
  app/controllers/xxxx

解決策はNew Relic Gemのアップデート

New RelicのGemを3.6.x以上にアップデートする。 Gem名はnewrelic_rpm

なぜ解決に時間がかかるのか

理由1. Production環境かつ、New Relicで監視している環境でしか再現しない

原因がわかった後から考えると当然なのだが、原因不明だった時はなぜ本番環境のみで発生するのかわからなかった。Production環境で起動しているステージング環境を用意していたのだが、New Relicを入れてなかったので再現せず、現象の再現までに時間がかかった。

理由2. エラーログにNew Relicとわかる情報が出ない

RailsのログにはNoMethodErrorが出るがスタックトレースにNew Relicの文字が出ない。こんなログが出る。

[2013-12-28 09:12:54] [xxx.xxx.xxx.139] [nil] [xxxxxxxxx85be8a473f10507bd9acc01] Started GET "/" for 50.31.164.139 at 2013-12-28 09:12:54 +0000
[2013-12-28 09:12:54] [xxx.xxx.xxx.139] [nil] [xxxxxxxxx85be8a473f10507bd9acc01] Processing by TopController#index as */*
[2013-12-28 09:12:54] [xxx.xxx.xxx.139] [nil] [xxxxxxxxx85be8a473f10507bd9acc01] Completed 500 Internal Server Error in 280ms
[2013-12-28 09:12:54] [xxx.xxx.xxx.139] [nil] [xxxxxxxxx85be8a473f10507bd9acc01]
NoMethodError (undefined method `empty?' for nil:NilClass):
  app/controllers/concerns/mobile_view_selectable.rb:32:in `render_to_body_with_rename'
  app/controllers/application_controller.rb:36:in `set_timezone'

最初はset_timezoneを追っかけてた。 他の人のブログを読むと、スタックトレース部分のエラーログは環境によって変わる。

理由3. エラーログで検索しても情報が見つけにくい

Ruby 2.0にバージョンアップすると出るので、最初は”Rails Ruby 2.0 NomethodError”や”Rails Ruby 2.0 Error set_timezone”で検索していたが、他の多くの情報に埋もれて解決できる情報にはたどり着けなかった。結局、本番環境でデバッグして、ソースコードを追っていくとNew Relicのコード内でメソッドを呼び出し例外が発生していることが判明。

Rails Ruby 2.0 New Relic”で検索すると困っている人や解決した人がいっぱいいた。