銀座Rails#9に登壇した

銀座Rails#9@リンクアンドモチベーションに『RuboCop入門』というタイトルで登壇した。ginkouno さんオファーありがとうございました。

ginza-rails.connpass.com

当日の発表スライドは以下です。

なかなか話す機会として作っていなかった RuboCop の実装系ではなく使い方というコンセプトで練ってみた話です。発表時点では最新の安定版であった RuboCop 0.70.0 をベースにしています。発表の裏か直後あたりで RuboCop 0.71.0 がリリースされていますが、現時点で主要な変更は自分が携わっていることもありアウトラインとしてはブレはないと思います。

rubygems.org

質疑応答や懇親会でいくつか RuboCop へのフィードバックとしてもらった点は、今後いくらか調査を進めて形にできるものがあるかもしれませんし、そうならないかもしれなくても何かの折の判断軸の要素になりますので、参加していただいたのもそうですし何よりフィードバックありがとうございました。楽しかったです。

海外カンファレンスへの渡航での失敗談

再来週開催される名古屋Ruby会議04で『海外Rubyカンファレンスへの踏み出し方』というタイトルで話します。

regional.rubykaigi.org

ここでは、そのトークにまつわる裏話。今年のゴールデンウィークに開催された RailsConf 2019 に勤務先の支援で渡航した際の失敗談について大きめのを3つ記しておきます。

ホテルの予約で宿泊数を間違えた

Web からのホテルの予約時にチェックアウトの日の理解を間違えていて1泊足りていなかった。Web からの変更ができなかったので以下のような E メールをホテルに送信した。使われないことを祈りますがテンプレにしておきます。

Dear #{ホテル名}

My name is #{自分の名前} who has made a reservation and received confirmation.

  Booking reference: #{予約番号}

I'm so sorry to inform you. I mistook the check out schedule input, 
so is it possible to change the check out schedule of my reservation?
If so, please change from my current check out schedule of my reservation:

From:

  Check in: April 29, 2019
  Check out: May 4, 2019 (5 NIGHTS)

To:

  Check in: April 29, 2019
  Check out: May 5, 2019 (6 NIGHTS)

And could you notify me when changes have been made?

Thank you.

このあとホテルから返信のメールはなかったが、最終確認のメールでチェックアウト日が変更されていた。しかし Web は元のまま。不安だったのでメールを印刷して現地に持って行って、ホテルへのチェックインの際にチェックアウト日の確認をとって OK だった。

そもそも問題を作らない方が重要なので、時差など込みで予約時の日付の確認は気をつけましょう。

トランジットに失敗した

羽田からサンフランシスコ経由でミネアポリス着で向かっていたが、サンフランシスコでの US の入国審査の待ち行列で乗り換え時間の 1時間30分では足りず手に汗を握って荷物の預かりへ。そこで更にサンフランシスコ発のシカゴ経由でのミネアポリス着でトランジットが増えた便を用意されて振り替え (つまり間に合わなかった) 。当然現地の到着も遅れて 26 時間くらいかかったと思う。このとき秒速さんと一緒に行っていてふたりいれば安心だったところ、秒速さんはサンフランシスコで便の時間を遅らせたミネアポリス便になってソロプレイとなる。

得た教訓としては入国審査の待ち行列を考えてトランジットには3時間は用意しておいた方が良い。あと予算があれば直行便を選択するともっと良い。トランジットはハードモード。

それと、まだ明るい夕方につくはずが真っ暗な夜の到着だったということもあり、空港からホテルに向かうにあたって Lyft の使い方はあらかじめ覚えておいて良かった。使い方やアプリのインストールや設定はあらかじめしておくと良い。

預けた荷物の行き先を確認する

トランジットがある場合に、預けた荷物をトランジット先で自分で乗せ替えが必要かスタッフの方で乗せ替えを行なって直接届くのか確認をしておく。自分の場合は不安だったので、案内の人と預ける際の担当の人という複数の人に確認した。しかしそれでもバゲージロストは起きるときは起きるらしいので、貴重品を入れないとか一泊分の着替えは備えておくなどはしておくと良い。。。というテンプレでない実録話は名古屋Ruby会議04に登壇する秒速さんに壇上外で聞いてみるとリアルでしょう。

今後、海外カンファレンスに行く人へ他人の失敗から学ぶ一助になればと思う。

ちなみに再来月 (7月) に開催される RubyConf Taiwan 2019 は時差1時間で直行便があるので、海外カンファレンスに踏み出すのにとても良くておすすめです。

2019.rubyconf.tw

Active Record Oracle enhanced adapter 5.2.6 がリリースされた

Active Record Oracle enhanced adapter 5.2.6 がリリースされた。

変更点としては、RailsConf 2019 の帰りの飛行機で書き始めていた TCP keepalive について database.yml から設定可能にする機能追加となる。

github.com

database.yml に以下のように tcp_keepalive の値を false に指定することで TCP keepalive を無効にできる。

 development: &development
   adapter: oracle_enhanced
+  tcp_keepalive: false

また以下のように tcp_keepalive_time の値を指定することで TCP keepalive の時間を変更できる。

 development: &development
   adapter: oracle_enhanced
+  tcp_keepalive_time: 3000

それぞれの tcp_keepalive のデフォルト値は true で tcp_keepalive_time のデフォルト値は 600 (10分) としているため、Breaking change にならないように Oracle enhanced adapter 5.2 で導入された振る舞いは維持している。

今回 Oracle enahanced adapter 5.2 系へのバックポートなど含めて Rails/OSS パッチ会で yahonda さんに相談に乗って頂きました。いつもありがとうございます。

blog.agile.esm.co.jp

次回の Rails/OSS パッチ会は 6月6日 (木) です。

RuboCop 0.69がリリースされた

RuboCop 0.69がリリースされた。このバージョンから Ruby 2.2 以下をサポートから切っているので、サポート対象は Ruby 2.3 以上になる。

あわせて Ruby 2.2 以下のサポートを切った RuboCop Performance 1.3.0 もリリースしておいた。RuboCop RSpec も同様にサポート対象が Ruby 2.3 以上になる。

またオフトピックとなるが、公式ドキュメントとなる http://www.rubocop.org のデフォルト表示を開発版である "latest" から安定版である "stable" に変更した。これは多くの利用者は開発版ではなく安定版のドキュメントをまず読みたいであろうという pocke さんのアイデアが元になっていて、Read the Docs まわりの設定を変更したもの。流れで RuboCop の Read the Docs の管理者権限をもらっているので、何か気になる点が見つかったら RuboCop core か RuboCop JP などでお気軽にフィードバックしてください。

github.com

銀座 Rails#9 に登壇します

銀座Rails#9 @リンクアンドモチベーションに登壇します。

ginza-rails.connpass.com

RuboCop コミッターとしての観点を交えての、RuboCop 入門をテーマに話をします。

ユーザー向きのコンテンツをベースにしつつ、私が押さえている今後の RuboCop の動きや、私から見た他のコミッターや私自身が持つ思想など交えたイメージでこれからスライド作りなどする予定です。

よければ遊びに来てください。

RuboCop (>= 0.69) からRuby 2.2サポートを外した

おそらく次のリリースとなる RuboCop 0.69 のリリースで、Ruby 2.2 のサポートを外すことになった。

RuboCop の実装として safe navigation operator や squiggly heredoc など使うようにしているので、構文上も Ruby 2.2 は動かなくなる。

今回サポート対象をどうするかについては以下のイシューがベースになっていて、Ruby 2.3 は様子見をしたいので保留し Ruby 2.2 のみを外した。

github.com

加えて Ruby 2.3 に関する PR が最近来たりなどしてもいたので、しばらくサポートする見込み。

他に特筆しておく点としては Ruby 2.2 を外したことにより、以下の Cop に変更が入る。Ruby 2.2 以前をターゲットにしていた場合は Breaking change になる。

まず Layout/IndentHeredoc cop だが、Ruby 2.2 以下で Rails を有効にしている場合と Ruby 2.3 以上の場合で処理を分けていた auto_detection オプションは、今後必ず Ruby 2.3 以上ので廃止。これまで Ruby 2.3 以上の振る舞いとなっていた squiggly オプションを新たなデフォルトとした。言い換えると Active Support の String#strip_heredocRuby 2.3 以上の <<~ かの判定はなくなり、デフォルトとでは <<~ が選ばれることになる。

次にStyle/FrozenStringLiteralComment cop となるが、Ruby 2.3 以上のときのみに frozen string literal マジックコメントを有効としていた when_needed オプションは廃止して、これまで Ruby 2.3 以上の振る舞いとなっていた always オプションを新たなデフォルトとした。つまり frozen string literal マジックコメントがデフォルトで要求されるようになる。この関係で RuboCop 本体のテストコードの改修が骨だったのは裏話。

あとは流れで squiggly heredoc に関する JRuby の非互換を見つけて jruby/jruby の既存イシューにコメントしていたりした。

RuboCop Performance 1.2.0 をリリースした

RuboCop Performance 1.2.0 をリリースした。ミネアポリス時間で朝7時前だったので健康的。

RuboCop 0.68 での NodePattern への拡張にともなって、RuboCop Performance 1.1.0 までリグレッションになった以下のようなコードにおける偽陰性の修正を含んでいる。

def foo
  if /re/.match(foo, 1)
    do_something
  end
end

github.com

上記の偽陰性の修正と、それにともない RuboCop 0.68 以上を要求するようにした点が主な変更となる。

RuboCop Performance 1.2.0 とマイナーバージョンを上げた理由は、RuboCop 0.68 以上を要求するようにしたことから。これは RuboCop Performance 自体が RuboCop 0.68 で本格的に切り離されたものになることと、RuboCop 0.68 で追加された NodePattern に依存する実装になったことが理由。