読者です 読者をやめる 読者になる 読者になる

おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Rails 5.x について発表した

昨日開催された、Increments ++ Tech TalkにてRails 5.xというタイトルの話をしました。

内容はWEB+DB PRESSの連載ではページ数の関係で載せられなかったRails 5.0のトピックと、Rails 5.1で入る(入りそう)な機能の話です。分量が多くなってしまい、いろいろ端折りながら喋りました。

スライド中でも触れていますが、発売中のWEB+DB PRESS Vol.93でRails 5のメジャーな変更について取り上げ済みですので、気になる方はぜひ一読ください。

WEB+DB PRESS Vol.93
WEB+DB PRESS Vol.93
posted with amazlet at 16.08.19
原田 騎郎 吉羽 龍太郎 松浦 隼人 須藤 涼介 生沼 一公 森下 雅章 前島 真一 鍛治 匠一 伊藤 直也 のざき ひろふみ うらがみ 高山 温 佐々木 健一 わかめ まさひろ ひげぽん 遠藤 雅伸 海野 弘成 はまちや2 竹原 藤田 正訓
技術評論社
売り上げランキング: 10,216

また、来週発売予定のvol.94ではRails 5で標準サーバになったPumaをテーマにしています。こちらも気になる方はどうぞ。

WEB+DB PRESS Vol.94
WEB+DB PRESS Vol.94
posted with amazlet at 16.08.19
藤原 俊一郎 朽木 拓 八木 俊広 吉田 太一郎 うらがみ のざき ひろふみ うさみ けんた 水嶋 淳貴 佐々木 健一 柴崎 優季 前島 真一 伊藤 直也 遠藤 雅伸 ひげぽん 海野 弘成 はまちや2 竹原
技術評論社
売り上げランキング: 650

LTなどではなくて、きちんと喋るのは久しぶりだった気がします。素晴らしい機会を提供していただきありがとうございました > Increments 社のみなさん

せっかくスライド作ったので、機会があれば再演しにいこうかなーとも思っています。うちの勉強会でも内容シェアして欲しい!という人いたらお声がけください(今忙しいのでタイミングなどうまく合えばですが…)。

WEB+DB PRESS でRubyの連載を始めます

今月の24日発売のVol 93から、WEB+DB PRESS で Ruby の連載をすることになりました。よろしくおねがいします。

初回の題材は、みんな大好き Ruby on Rails の最新バージョンである Rails 5 です。もうじき正式リリースとなる Rails 5 にどんな機能が追加されたか、気になる方はぜひ一読ください!

WEB+DB PRESS Vol.93
WEB+DB PRESS Vol.93
posted with amazlet at 16.06.19
原田 騎郎 吉羽 龍太郎 松浦 隼人 須藤 涼介 生沼 一公 森下 雅章 前島 真一 鍛治 匠一 伊藤 直也 のざき ひろふみ うらがみ 高山 温 佐々木 健一 わかめ まさひろ ひげぽん 遠藤 雅伸 海野 弘成 はまちや2 竹原 藤田 正訓
技術評論社
売り上げランキング: 807

ロシアンドールキャッシュでN+1を解決する

youtube に DHH がしゃべっている動画があったので観ました。

The Complete Guide to Rails Performance という、Railsのパフォーマンスを改良するノウハウが書かれた本のコンテンツ*1の一つらしく、DHH に Rails のパフォーマンスについてインタビューをしています。

英語の聞き取りに自信がないので間違っているかもしれませんが、DHH は動画中で「Russian Doll Caching で N+1 を解決できる」ようなことを言っています。

例えば投稿の一覧と著者情報を表示したいとき、次のように書くと、二回目以降、 post が変更されない限り、post.author のクエリは実行されません。

<% cache @posts do %>
  <% @posts.each do |post| %>
    <% cache post do %>
      <%= post.title %>
      <%= render post.author %>
    <% end %>
  <% end %>
<% end %>

キャッシュが十分効いている状態では includes メソッドなどで eager loading するよりも速そうですが、個人的にはなんか怖くて手を出しにくいなという印象です。

このような書き方をしている方、他にも居るようなら話聞いてみたいなー。

*1:買いましたが絶賛積読中です><

ginza.rb 第33回で Rails 5 の新機能について学んだ

3/15は ginza.rb の33回目のミートアップでした。

Ginza.rb 第33回 もうすぐやってくる!Rails 5を見ておこう - Ginza.rb | Doorkeeper

前回のミートアップ時に、きっと Rails 5.0 がリリースされているだろうと思い Rails 5.0 をテーマとして設定しましたが、見事に期待が外れましたね><

未完成のリリースノートを読みつつ、主にメジャーな機能について内容を確認していきました。ざっとメモ書きを載せます。何か間違っている点などありましたら教えていただけると嬉しいです!

Ruby on Rails 5.0 Release Notes — Ruby on Rails Guides

ActionCable

  • ご存知 websocket 用
  • pubsubサーバとして postgres と redis に対応している
  • Basecamp のチャットサーバとして使われているので、一応実績がある
    • しかしどれくらいのサーバ台数でどのくらいのクライアント数をさばいているのだろう。気になる
  • puma, unicorn, passenger などのサーバで使える
  • 内部で thread 使っているので、仮に unicorn を使っていても ActionCable を使うのであれば thread safe なコードが求められる

Rails API

Rails::API について発表した - おもしろwebサービス開発日記

Active Record Attributes API

Rails 5のActive Record attributes APIについて | 日々雑記

Test Runner

Rails 標準の test ツールが便利になりました

  • 結果に色がつく
  • ファイル、行を指定して実行、fail-fast や defer-output など、RSpec の便利機能の取り込み

Exclusive use of rails CLI over Rake

  • これまで rails で何か実行する時は、rails コマンドもしくは rake コマンドでしたが、rails に統一されました
  • rails db:migrate みたいな
  • 実態は rake コマンドを叩いているだけ
  • rake も引き続き使える

Sprockets 3

  • リリースノートには 3 って書いてあるけど多分 4
  • source map
    • development で assets 結合しないと、ファイル数が多い時に遅いけど、結合するとエラー時にどこがエラーなのかわかりにくいのを解消
    • 結合しても、エラー時にどこがエラーなのかわかる
  • es6 サポート
    • babel が依存関係に入った
  • manifest.js
    • これまで、最終的にコンパイルされるファイルは Rails の config で指定していたけれど、それを js 上で指定できるようになった
    • ちょっと疎になった

Turbolinks 5

Ruby 2.2.2+ required

読んで字のごとく。Ruby 2.2.2 以降に対応

Notable Change

時間が余ったので、細かい変更も見ていました。以下気になった変更点

  • bin/rails restart コマンドが追加された
    • 実態は tmp/restart.txt を更新しているだけ
    • puma 2 系は tmp/restart.txt に対応してなかった(はず)だけど、3.0 で対応された
  • bin/rails initializers コマンドが追加された
    • initializer を読み込む順番で表示してくれる
    • べんりでは
  • bin/rails dev:cache コマンドが追加された
    • development 環境で cache のオンオフができる
    • 実態は tmp/caching-dev.txt を作ったり消したりしてるだけ
    • caching-dev.txt の有無で cache の設定を上書きしている
  • bin/update スクリプトが追加された
    • bin/setup の update 版
    • セットアップと同様、アップデートもコマンド一発でできるようにするのが Rails Way ってことなのかな
  • http_cache_forever というのが controller 用のメソッドとして追加された
    • 読んで字のごとく
  • config.force_ssl にオプションが追加
    • 一回 force_ssl な設定が追加されてしまったブラウザを、リセットするのが楽になった
    • HSTS Preload 用の設定も入った

以上

まだまだ読めていない変更点があるので、次回は続きを読んでいく予定です。

iosアプリ開発時に実機とローカルサーバを通信させるための快適な設定方法について

iOS アプリ開発をしている時に、web上のサーバではなく、ローカルマシンのサーバと通信させたくなる状況はよくあるかと思います。僕はまず次のようなコードを書いて、さらにコンパイラ用のフラグに -D DEBUG と設定することで対応しました。

#if DEBUG
   let host = "http://localhost:3000/"
#else
   let host = "https://production.example.com/"
#endif

この Qiita の記事を参考にさせていただきました。

Swift での #ifdef DEBUG のやり方 - Qiita

これで大丈夫!…ではありません。ローカルサーバは http なので、ATS(App Transport Security) を許可する設定を追加しないと通信できません。

[iOS 9] iOS 9 で追加された App Transport Security の概要 | Developers.IO

単純に Info.plist に localhost:3000 を例外として許可する設定を追加して、しばらくは平穏に過ごせたのですが、実機で検証しようとした時に問題点に気づきました。そうです。実機からローカルマシンのサーバに接続する時には localhost ではダメなのでした。

それでは localhost をやめて、例えば willnet.local のような、mac に設定してある hostname を利用すればどうでしょうか。問題なく動きそうですね。ただ、これでは複数人数でiOS開発しようとした時に、各自のローカルマシンに立てたサーバと接続したくなるケースに対応できません。適宜ホスト名を書き換えてビルドし、コミットする時にはホスト名の変更を含めないように気をつける…そんな開発プロセスになりそうです。なるべくなら避けたいですね。

そこで次の二つのブログエントリを参考にしました。

上記のブログでやっていることを簡単にまとめると、Build Phases の Run Script 内に、Info.plist を書き換えるスクリプトを書きビルド時に実行することで、ビルドしたマシンの hostname を動的に Info.plist に設定しています。

これでURLを書き換えることなく快適に開発ができるようになりました。やりましたね。

しかしこれをiOSプロジェクトごとに毎回やるのは面倒ですね。Run Script を自動で追加できるライブラリのような仕組み*1があればそれを作りたいのですが、そのあたり詳しいかたいたら教えてください><

*1:そもそもそんなことできるんですかね…

Rails::API について発表した

FiNC さんの社内マイクロサービス勉強会と、表参道.rb にて、そろそろリリースされそうな Rails 5 におけるメジャーフィーチャの一つ Rails::API について話しました。

雑感

スライド読むと分かるように、Rails::API は API サーバを作る時の銀の弾丸でもなんでもなくて、条件に合致したときに使うとちょっとだけ速くなりますよ、軽くなりますよという機能なのでした。

Rails::API の機能面としてはそれだけなのだけど、Rails は Rack Middleware や ActionController::Base 内の Module が疎になっていて、着脱が簡単なんですよというのを示す良い例にもなっていると思います。使っていない Middleware や Module を外すことで、手軽にちょっぴり速く/軽くできるので、API サーバに限らず不要なものがある場合は外してみてしまっても良さそう。ただし本当にちょっぴりしか変わらないので、速度を劇的に改善する必要のある場合は別の言語を検討するのが良いのではないでしょうか。

他の言語との比較も時間あったらやりたい*1ですね。

*1:そういうの知りたい会社さんがお仕事依頼してくれたら嬉しいなあ

DroidKaigi2016に参加した

DroidKaigi 2016 に行ってきました。

おそらくブログには書いていなかったのですが、1年ほど前に RubyMotion で Android アプリを開発したことがあります*1。それ以来、あまり Android 開発トレンドのキャッチアップができていなかったので、ここらで遅れを取り戻そうとしたのでした。

個人的には、最近どのようなライブラリが使われているのか、RxJava、テストが気になっていたのでそれらの発表を中心に見て回りました。

Rx系については具体的に何が嬉しいのかよくわかっていなかったのですが、非同期処理をうまく扱えるイメージがついたので今後積極的に使っていきたいです。

テストに関しては Jenkins を使っているところが多いようで、Ruby 界隈とは異なる印象。おそらく(減ってきたとはいえ)機種依存での不具合を発見するために実機を通してテストをせざるをえないのが、一般の CI サービスを使う場合の壁になっているのかなと感じました。

全体通じて、スタッフの方々がとても頑張ってくれていて過ごしやすいKaigiでした。また来年も参加する予定です。

*1:RubyMotion ネタで去年の DroidKaigi に CFP を出したのですがあえなく落選しました><