OSS Gate東京ミートアップ2017-07-13

会場係兼任で今月も参加した。

oss-gate.doorkeeper.jp

当日の模様というか雰囲気は、たまたま三脚とカメラを持ち合わせていた yasulab さんがアップされた動画をどうぞ。

今回は継続して参加するメンバーが少しずつ増えてきて良いなと思う回だった。

did_you_mean 1.2.0-alpha を見た

Ruby 2.3 で標準添付になった did_you_mean について、Ruby 2.5.0 に向けたマイルストーンのひとつが実装されていたので見てみた。

github.com

以下のように rake タスクでタイプミスした場合にサジェストがされる機能が加えられている。

Before

% rails db:migrat
rails aborted!
Don't know how to build task 'db:migrat' (see --tasks)

(See full trace by running task with --trace)

After

% rails db:migrat
rails aborted!
Don't know how to build task 'db:migrat' (see --tasks)
Did you mean?  db:migrate
(See full trace by running task with --trace)

did_you_mean 側で prepend を使って Rake を拡張している実装はなるほどだった。

frozen string literalへのデバッグオプション

Rails 本体への frozen string literal への導入がはじまっているようなので、Rails アプリケーション側についても頃合いがやってきていると個人的に思っているこの頃。frozen string への破壊的操作があった際に起きる can't modify frozen String (RuntimeError) について、バックトレースだけでは frozen string を生成している場所を見つけづらいことがある。

そういったときに使えるのが --debug=frozen-string-literal オプション。

以下のような frozen_string_literal_true.rb というファイルがあるとする。

# frozen_string_literal: true

'foo' << 'bar'

オプションなしで実行した場合は以下のようなエラーメッセージとなる。

% ruby frozen_string_literal_true.rb
Traceback (most recent call last):
frozen_string_literal_true.rb:3:in `<main>': can't modify frozen String (RuntimeError)

--debug=frozen-string-literal オプションつきで実行した場合は、以下のように frozen string を生成した場所がデバッグ情報として付加される。

% RUBYOPT=--debug=frozen-string-literal ruby frozen_string_literal_true.rb
Traceback (most recent call last):
frozen_string_literal_true.rb:3:in `<main>': can't modify frozen String, created at frozen_string_literal_true.rb:3 (RuntimeError)

さすがにこの例だと、文字列を生成した場所と破壊的操作をした場所が同じなのでありがたみが伝わらないと思うが、それらが離れているときに効率よくデバッグをすることができる (実践的には RSpec などの実行コマンドに RUBYOPT=--debug=frozen-string-literal を付加して、frozen string の生成場所を調べることになる) 。

ちなみに Ruby 2.2 以下のサポートが必要なライブラリではなく、動作対象を Ruby 2.3 以上に絞ったものの場合は String#dup よりも String#+@ を使った方がパフォーマンスが良いと先日 RuboCop にマージされた Performance/UnfreezeString cop で知った。

github.com

そのあたりも含めて can't modify frozen String の発生元を開発効率よく探して、mutable な文字列に置き換えるなどしていくと良いと思う。

Active StorageとRails 5.2の展望について考える

This separate repository is a staging ground for eventual inclusion in rails/rails prior to the Rails 5.2 release.

Active Storage の Roadmap に書かれている上の引用をどう読むかだけれど、仮に Active Storage を rails/rails リポジトリに含んだうえで Rails 5.2 のリリース機能となると見たとき、Active Storage は Travis CI では Ruby 2.2 を動かしていないことと、Rails 5.2 がリリースされる頃には Ruby 2.2 が EOL もしくはそれに準じた位置づけになっているであろう予測から、Rails 5.2 は Ruby 2.3 以上が動作対象となるということがあり得るのではと考えていたりしていた。

追記 Rails 5.2 は Rails 5.0 / 5.1 同様に Ruby 2.2.2 以上がサポート対象となる。