1回休み

さすがに疲労がピークに達していたので、休暇をとって丸一日寝ていた。

RubyKaigi 2017 3日目

RuboCop の発表を聞いた後に久しぶりに t-wada と話したり、Bundler 2 の発表を聞いた後にそのあたりの話を話したりしていた。

以前 ぎんざRuby会議01 で発表したくらいに Bundler 2 は追っていた経緯があり、たびたび挙った Gemfile から gems.rb への変更が推奨されて行くといった話題について、Rails アプリケーションや自作 Gem の一部では既に gems.rb に変えているといった話をしたりしていた (リポジトリの Issue などで見ている計画として本格的な対応が必要になるのは Bundler 2 から Bundler 3 へのタイミングになるので、まだ少し先の話として先送りできなくはない) 。

実はずいぶん以前から Bundler の Gemfile は gems.rb でも動くようになっていて、今後はファイルを探索する優先順位が変わったりするものの gems.rb でも動く。

ただこれは単純にファイル名を変更すれば良いといったものではなく binstub には Gemfile の文字列パスを含んだコードが生成されるので、そのファイルへの変更が必要だったりする。そういった決め打ちがあるものはライブラリやミドルウェア含めて軒並み要対応だと思う。

% bundle binstub rubocop
% cat bin/rubocop
#!/usr/bin/env ruby
# frozen_string_literal: true
#
# This file was generated by Bundler.
#
# The application 'rubocop' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require "pathname"
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", # ★これ
  Pathname.new(__FILE__).realpath)

require "rubygems"
require "bundler/setup"

load Gem.bin_path("rubocop", "rubocop")

この変更についてのとあるコメントで、依存ライブラリを束ねる重要なファイルを *.rb といったただの 1 Ruby ファイルに見えるような名前に変えるのはどうかといった所感は面白かった。Rails 方面から何か動きがあるかもしれないし、今後どうなっていくかウォッチしてみて良いと思う。

デカ外人パークでは Ruby 2.5 について、バックトレースの出力順序が変わるのは結構大きな変更になるのではといったのを話していたりもした (でも今回の RubyKaigi で話題に挙っていなかったようなといった感じで) 。

% ruby -ve 'def a; b; end; def b; raise "hi"; end; a'
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin13]
-e:1:in `b': hi (RuntimeError)
        from -e:1:in `a'
        from -e:1:in `<main>'
% ruby -ve 'def a; b; end; def b; raise "hi"; end; a'
ruby 2.5.0dev (2017-09-18 trunk 59955) [x86_64-darwin13]
Traceback (most recent call last):
        2: from -e:1:in `<main>'
        1: from -e:1:in `a'
-e:1:in `b': hi (RuntimeError)

Ruby 2.5 といえば Ruby 2.5.0-preview1 のリリースは RubyKaigi 2017 会期中になかったので、もう少しだけ先になるのかなと思っている。

github.com

他には pycall の話を聞いたり、RuboCop のとある cop をどうするか問題を話したり、OSS Gate に関する話をしたりと、多くの話を聞いたり自分が Edge で見ている分のフィードバックを共有したりと、次回の RubyKaigi までにどういったコードを書いて行こうか考えるきっかけになる 3日間を過ごすことができた。

RubyKaigi 2017 2日目

RuboCop の Issue に znz さんが挙げていた内容が興味深かったので、対応した PR について pocke さんに相談したりしていた。

github.com

PR コメントに書いたとおり、当初は $LOADED_FEATURE の値を直接使っていたものを、その結果配列を直接使うようにした。これは pocke さんに相談して指摘してもらった古い Ruby では必要だった require 'thread' が消えてしまうといった可能性に対処したもの (レビュー中の PR でもあるため今後どうなるかは分からない) 。

% rbenv local 2.0.0-p648 && ruby -e 'p $LOADED_FEATURES.reject { |feature| %r|/| =~ feature }'
["enumerator.so"]
% rbenv local 2.1.10 && ruby -e 'p $LOADED_FEATURES.reject { |feature| %r|/| =~ feature }'
["enumerator.so", "thread.rb"]
% rbenv local 2.2.8 && ruby -e 'p $LOADED_FEATURES.reject { |feature| %r|/| =~ feature }'
["enumerator.so", "rational.so", "complex.so", "thread.rb"]
% rbenv local 2.3.5 && ruby -e 'p $LOADED_FEATURES.reject { |feature| %r|/| =~ feature }'
["enumerator.so", "thread.rb", "rational.so", "complex.so"]
% rbenv local 2.4.2 && ruby -e 'p $LOADED_FEATURES.reject { |feature| %r|/| =~ feature }'
["enumerator.so", "thread.rb", "rational.so", "complex.so"]
% rbenv local 2.5.0-dev && ruby -ve 'p $LOADED_FEATURES.reject { |feature| %r|/| =~ feature }'
ruby 2.5.0dev (2017-09-18 trunk 59955) [x86_64-darwin13]
["enumerator.so", "thread.rb", "rational.so", "complex.so"]

この $LOADED_FEATURES に上記の feature はどのようなタイミングで追加されるのかが分かっていないことが分かったので、ESM Drinkup の際に nobu さんに質問したところ Ruby の内部から依存されるようになったら増えることがあるとの話。たとえば rational /complex なんかはそれぞれのリテラルが用意されたこと関係して依存があるなどなるほどだった。

これに絡んで Rails に出していた PR があり 、y-yagi さんや yahonda さんとそのあたりから Rails 方面の話をしたり、amatsuda に fxn からのメンションの進捗を聞いてたりした (こちらは nobu さんにオーダー済みとのこと) 。

RubyKaigi 2017 1日目

カンファレンスに行く理由のひとつである、コミッターに直接相談ができる機会というあたりに焦点を絞って書く。

いつの日だったか rbenv install 2.5.0-devRuby のビルドエラーが起きるようになって、調べたところこのコミット以降ということは分かったが、他の人の環境では問題がなかったため手元の libtool のバージョン問題というあたりまでで近日開催の RubyKaigi まで持ち越していた。

% make
(snip)
rbconfig.rb unchanged
generating enc.mk
making srcs under enc
make[1]: Nothing to be done for `srcs'.
generating transdb.h
transdb.h unchanged
creating verconf.h
verconf.h updated
compiling loadpath.c
linking static-library libruby.2.5.0-static.a
error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: unknown option character `n' in: -no_warning_for_no_symbols
Usage: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool -static [-] file [...] [-filelist listfile[,dirname]] [-arch_only arch] [-sacLT]
Usage: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool -dynamic [-] file [...] [-filelist listfile[,dirname]] [-arch_only arch] [-o output] [-install_name name] [-compatibility_version #] [-current_version #] [-seg1addr 0x#] [-segs_read_only_addr 0x#] [-segs_read_write_addr 0x#] [-seg_addr_table <filename>] [-seg_addr_table_filename <file_system_path>] [-all_load] [-noall_load]
make: *** [libruby.2.5.0-static.a] Error 1

講演の合間の休憩時間になるタイミングで nobu さんに相談して、以下のようにパッチをあてて頂いていた。

github.com

手元の環境は OS X 10.9 という 4年くらい前のモデルで、libtool が以下のように 855 と結構古い。そのためいまどきのバージョンと比べてオプションが足りていないといったのが今回の問題だった。

% libtool -V
Apple Inc. version cctools-855

RuboCop’s core developers team の pocke さんには、NodePattern で 0か 1を表す表現はないものか相談していたりした。これはデフォルト引数のありなしでパターンを複数書かずに済めばと思ったのが背景。結果としては話として挙っていたが動きとして止まっているとのこと。

また度々、yahonda さんに Oracle enhanced adapter の相談をしたり話を聞いたりしていたりして、ふだん使っている Ruby とその周辺の Gem の開発者にいろいろと相談することができていろいろと悩みなど解消した。