Rails 5.0.1 の変更点で個人的に気になったところ雑まとめ
先日12/21に Rails 5.0.1 が出ましたね。 CHANGELOG をざっと読みながら、個人的に気になったところを雑にまとめます。 雑まとめなので間違ってるかもしれません。正確な情報はリンク先を見てください〜。
3行で
ActionCable
https://github.com/rails/rails/blob/v5.0.1/actioncable/CHANGELOG.md
- Buffer writes to websocket connections, to avoid blocking threads that could be doing more useful things.
- 遅いクライアントからのリクエストでブロックされてしまってDoS攻撃とかに脆弱性があったのを対応
- https://blog.phusion.nl/2016/12/21/actioncable-under-stress-protecting-your-application-against-slow-clients-using-passenger/
ActionPack
https://github.com/rails/rails/blob/v5.0.1/actionpack/CHANGELOG.md
- Add ActionController::Parameters#merge!, which behaves the same as Hash#merge!.
- Added ActionController::Parameters#deep_dup which actually creates a params copy, instead of refereing to old references in params.
- Add to_param to ActionController::Parameters deprecations.
- AC::Parameters がHash継承しなくなった影響でto_paramsが従来の期待通りに動かなくなった(AC::Parametersを返す)
to_h
してからto_param
使ってくれとのこと- https://github.com/rails/rails/pull/26328
- SSL: Changes redirect behavior for all non-GET and non-HEAD requests
- Deprecated omitting the route path. Specify the path with a String or a Symbol instead.
- 内部実装の都合でこうなったっぽい?
- https://github.com/rails/rails/pull/25693
- Added new ActionDispatch::DebugLocks middleware that can be used to diagnose deadlocks in the autoload interlock
- ロックを検出できるミドルウェアができた
- Pumaがデフォルトになったので必要性が増えたっぽい
- もしデッドロックっぽいのが発生したら、ミドルウェアスタックにこいつを追加して
/rails/locks
でスレッド情報が見れる - https://github.com/rails/rails/pull/25344
ActionView
https://github.com/rails/rails/blob/v5.0.1/actionview/CHANGELOG.md
- Render now accepts any keys for locals, including reserved words
- renderに予約語もlocalとして渡せるようになった。
local_assigns[:class]
のようにして参照する
- renderに予約語もlocalとして渡せるようになった。
- Changed partial rendering with a collection to allow collections which implement to_a.
- Collection Rendering として Enumerable ならなんでも渡せるようになった
ActiveJob
https://github.com/rails/rails/blob/v5.0.1/activejob/CHANGELOG.md
- Added instance variable @queue to JobWrapper.
- rescue-scheduler への対応だけど、もしかしたらsidekiqとかでも便利になる?
ActiveRecord
https://github.com/rails/rails/blob/v5.0.1/activerecord/CHANGELOG.md
- バグフィックスたくさん。特に複数スレッドでうまく動くようにしてるのが多い(クエリキャッシュとかコネクションプーリングとか)
- Introduce Model#reload_
to bring back the behavior of Article.category(true) where category is a singular association. article.reload_category
のようにして特定のhas_one関連だけリロードできるようになった- 今までhas_one関連については
article.category(true)
でリロードできてたけど、それがRails5でdeprecatedになっていた。article.reload.category
では完全な代替にはならない(未保存の他の関連インスタンスの変更が消えるとか)という背景があった - https://github.com/rails/rails/pull/27133
- Always store errors details information with symbols.
- autosaveでバリデーションエラーが発生したときに保存するためのkeyをSymbolにした
- いままではStringだったけどそれだとエラーを保存する他の処理でSymbolにしているのでずれてて扱いづらい
- 場合によっては breaking change になるかもだけどほとんどのケースは大丈夫かな
- https://github.com/rails/rails/pull/26552
- Avoid loading records from database when they are already loaded using the pluck method on a collection.
- 地味に嬉しい。reload考慮する必要ありそう?
- Doing count on relations that contain LEFT OUTER JOIN Arel node no longer force a DISTINCT. This solves issues when using count after a left_joins.
- むしろいままでDISTINCTだったのか
ActiveSupport
https://github.com/rails/rails/blob/v5.0.1/activesupport/CHANGELOG.md
- サマータイム系のバグフィックスが多い
- Fix
thread_mattr_accessor
subclass no longer overwrites parent.- 親と子で別々に属性持てるようになった
Railtile
https://github.com/rails/rails/blob/v5.0.1/railties/CHANGELOG.md
- バグフィックスだけ
docker diff が勉強に便利
たとえば
% docker run -it --name hoge ubuntu /bin/bash root@db1da9fc72e9:/# useradd hoge root@db1da9fc72e9:/# exit % docker diff hoge C /etc C /etc/group A /etc/group- C /etc/gshadow A /etc/gshadow- C /etc/passwd A /etc/passwd- C /etc/shadow A /etc/shadow- C /etc/subgid A /etc/subgid- C /etc/subuid A /etc/subuid- C /root A /root/.bash_history C /var C /var/log C /var/log/faillog C /var/log/lastlog % docker start -i hoge root@db1da9fc72e9:/# diff /etc/passwd{,-} ...
みたいな感じにコマンドがどういう変更を行うのかを追いやすい。
ちなみに先頭のアルファベットの意味は下記の通り。
- A - Add
- D - Delete
- C - Change
差分も表示してくれると嬉しいがそういうオプションはなさそう。
そういうときはdocker export
してtarballを吐いて、コンテナ間の差分を見れば良いのかな。
Dockerコンテナに対してAnsibleで雑にプロビジョニングする
Packer の ansible provisioner とか使っていると、変更差分の動作確認したくなってくる。 毎回 packer build するのは時間がかかり休憩が捗りすぎて進捗がでないという問題点があり、なんとかしたい。
しかしそのために環境作るのも面倒だ。そこで前回出力した docker image を元にコンテナ立ち上げてそこに ansible 走らせたらええやんと思いつく。 といってもsshd立てるのも面倒だし微妙らしいので方法を探していたら、どうやら Docker Connection Plugin というものが標準装備されているらしい。
$ docker-compose run --rm -u root web bash $ ansible-playbook -i web_run_1, -c docker ansible/web.yml
-i (--inventory)
のhostsはコンテナ名-c (--connection)
にdocker
を指定
Pakcer の ansible provisioner が用意する ansible とローカルの ansible のバージョンが違うことがあるのでそれだけ注意。
参考
vimprocのビルドで失敗するとき
vimのプラグインマネージャをdein.vimにして(*1)、 Ubuntu 14.04.4 のVMで:call dein#install()
したら下記のような感じで怒られた。
(*1)たぶんdein.vimにしたことは関係ない
vimproc's DLL: "/home/vagrant/.vim/bundle/repos/github.com/Shougo/vimproc.vim/lib/vimproc_linux64.so" is not found. Please read :help vimproc and make it.
vimprocがないとUnite.vimで/async
とか/git
とか使えなくて困るのでなんとかする。
エラーメッセージによると、makeしてsoを作れば良いらしい。
% .vim/bundle/repos/github.com/Shougo/vimproc.vim % make clang -W -O2 -Wall -Wno-unused -Wno-unused-parameter -std=gnu99 -pedantic -shared -fPIC -o lib/vimproc_linux64.so src/proc.c -lutil make[1]: clang: コマンドが見つかりませんでした make[1]: *** [lib/vimproc_linux64.so] エラー 127 make[1]: ディレクトリ `/home/vagrant/.vim/bundle/repos/github.com/Shougo/vimproc.vim' から出ます make: *** [all] エラー 2
ふむ。
% which clang clang not found % which gcc /usr/bin/gcc
gccならある。
% make CC=gcc % file lib/vimproc_linux64.so lib/vimproc_linux64.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=c624b2200f2f23cfff02e7c019707d36d0bff381, not stripped
OK。
(本当はclang入れたほうが良いんだろうけど面倒くさくて…)
ブログタイトルと説明を少し変えた
具体的にはこんな感じ:
- upinetree's tech blog + upinetree's memo
Qiitaに書き始めてからこのブログ全然書いてないのでもったいないなーと思い、ブログを書く敷居を少し下げてみました。
Qiitaにはちゃんと検証した技術ネタを書いて、こちらにはメモ的なものを残していければなと。
あと気が向いたら日常とか考えていることとか書くのも良いですね。気が向くかわからんけど。
Digitech RP360のファームウェア更新に失敗した時の直し方
http://www.digitechjapan.jp/products/RP360/rp360.html
これ(マルチエフェクター)の話です。 ちょっと焦ったのと、日本語の情報がなかったので書き残しておきます。
結論
RP360本体を再起動し、Windows10以外のマシンでアップデートする。
詳しく
先日、Windows10 PCに専用ライブラリアンアプリNexus を入れて起動したらファームウェアアップデートせよと言われたので、表示に従ってアップデートを試みました。 ところが更新に失敗。
RP360側のモニタは
RP 360 Upd V2.0.0.0 IN UPDATER: WAITING FOR HOST…
と表示したままで、再起動しても変化せず。
下記に類似の現象が何件か報告されている模様だったので読んでみることに。
- http://www.hunterharp.com/the-digitech-rp360-crashed-on-a-firmware-update-will-it-come-back/
- http://www.hunterharp.com/the-digitech-rp360-firmware-update-finally-took-after-6-tries/
すると、2番めの記事の一番後ろに「Windows10じゃ動かないよ。Vistaでアップデートしたら解決したよ」とのコメントが…。
僕はVista持ってなかったので、Mac (Yosemite)でもう一度アップデートを行うと、成功。 まあなんかWindows10大丈夫かとは思っていたけど、まさかソフトウェアが起動しないとかじゃなくて、ファームウェアがいかれるとは思ってなかった。 そしてあとから確認すると、こんな記載が…。
注意書きも読まずに最新バージョンのOSを常に使ってるとハマるよという教訓でした。 直ってよかった。
rails newのときのテンプレのアレ作った
rails newするたびに同じ設定するの面倒になったのでマイテンプレつくった。
https://github.com/upinetree/rails_template
まだ途中だけど、ちょっとずつ育てていこうかなと〜。
参考:
- Rails Application Templates — Ruby on Rails Guides
- オレオレRails Application Templateをつくって公開しました。 | CreativeStyle
- Rails 4.2 + Bootstrap の Application template 1コマンドでモダンRailsが! - 酒と泪とRubyとRailsと
- https://github.com/rails/rails/blob/4-2-stable/railties/lib/rails/generators/actions.rb
- http://www.rubydoc.info/github/wycats/thor/Thor/Actions