今月の24日発売のVol 93から、WEB+DB PRESS で Ruby の連載をすることになりました。よろしくおねがいします。
初回の題材は、みんな大好き Ruby on Rails の最新バージョンである Rails 5 です。もうじき正式リリースとなる Rails 5 にどんな機能が追加されたか、気になる方はぜひ一読ください!
技術評論社
売り上げランキング: 807
今月の24日発売のVol 93から、WEB+DB PRESS で Ruby の連載をすることになりました。よろしくおねがいします。
初回の題材は、みんな大好き Ruby on Rails の最新バージョンである Rails 5 です。もうじき正式リリースとなる Rails 5 にどんな機能が追加されたか、気になる方はぜひ一読ください!
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:買いましたが絶賛積読中です><
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
Rails::API について発表した - おもしろwebサービス開発日記
Rails 5のActive Record attributes APIについて | 日々雑記
Rails 標準の test ツールが便利になりました
rails db:migrate
みたいな読んで字のごとく。Ruby 2.2.2 以降に対応
時間が余ったので、細かい変更も見ていました。以下気になった変更点
bin/rails restart
コマンドが追加された
bin/rails initializers
コマンドが追加された
bin/rails dev:cache
コマンドが追加された
tmp/caching-dev.txt
を作ったり消したりしてるだけbin/update
スクリプトが追加された
bin/setup
の update 版まだまだ読めていない変更点があるので、次回は続きを読んでいく予定です。
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:そもそもそんなことできるんですかね…
FiNC さんの社内マイクロサービス勉強会と、表参道.rb にて、そろそろリリースされそうな Rails 5 におけるメジャーフィーチャの一つ Rails::API について話しました。
スライド読むと分かるように、Rails::API は API サーバを作る時の銀の弾丸でもなんでもなくて、条件に合致したときに使うとちょっとだけ速くなりますよ、軽くなりますよという機能なのでした。
Rails::API の機能面としてはそれだけなのだけど、Rails は Rack Middleware や ActionController::Base 内の Module が疎になっていて、着脱が簡単なんですよというのを示す良い例にもなっていると思います。使っていない Middleware や Module を外すことで、手軽にちょっぴり速く/軽くできるので、API サーバに限らず不要なものがある場合は外してみてしまっても良さそう。ただし本当にちょっぴりしか変わらないので、速度を劇的に改善する必要のある場合は別の言語を検討するのが良いのではないでしょうか。
他の言語との比較も時間あったらやりたい*1ですね。
*1:そういうの知りたい会社さんがお仕事依頼してくれたら嬉しいなあ
DroidKaigi 2016 に行ってきました。
おそらくブログには書いていなかったのですが、1年ほど前に RubyMotion で Android アプリを開発したことがあります*1。それ以来、あまり Android 開発トレンドのキャッチアップができていなかったので、ここらで遅れを取り戻そうとしたのでした。
個人的には、最近どのようなライブラリが使われているのか、RxJava、テストが気になっていたのでそれらの発表を中心に見て回りました。
Rx系については具体的に何が嬉しいのかよくわかっていなかったのですが、非同期処理をうまく扱えるイメージがついたので今後積極的に使っていきたいです。
テストに関しては Jenkins を使っているところが多いようで、Ruby 界隈とは異なる印象。おそらく(減ってきたとはいえ)機種依存での不具合を発見するために実機を通してテストをせざるをえないのが、一般の CI サービスを使う場合の壁になっているのかなと感じました。
全体通じて、スタッフの方々がとても頑張ってくれていて過ごしやすいKaigiでした。また来年も参加する予定です。
*1:RubyMotion ネタで去年の DroidKaigi に CFP を出したのですがあえなく落選しました><
昨日は ginza.rb 31回目のミートアップでした。
Ginza.rb 第31回 ユーザの権限管理どうしてます? - Ginza.rb | Doorkeeper
@kyuden_ さんに、現状の二大認可 gem である cancancan や pundit、それらの問題点を解決するために作った banken について発表してもらいました。
個人的には pundit のリソースベースでの権限管理は悪くないと思っています。ただスライドで書かれているような、Admin::UsersControlller と UsersController で処理を分けたい時などのエッジケースで回避策を模索しなきゃいけないのはだるいですね。banken だと、コントローラベースなのでコード記述量は増えてしまうのですがその分ハマりどころが減るので、そのトレードオフを考慮しつつ案件によって使い分けるのがいいのかなという気持ちです。