GemifyされたCSVを使う

RubyKaigi 2019 で kou さんと秒速さんが話されたプレゼンで得た今日から使える tips 紹介。

https://slide.rabbit-shocker.org/authors/kou/rubykaigi-2019/

Ruby にデフォルトでバンドルされている CSV ではなく、Gemify されて独立してリリースされている新しい CSV を使うことで、業務とエクセルとCSVという三位一体のシステムを少しずつ速くできる (かもしれない) 。

単純に Gemfile に gem 'csv' を指定して bundle install をする。

# Gemfile
gem 'csv'

これによって使っている Ruby のバージョンに縛られず新しい CSV gem を使えるようになる例。

% bin/rails r 'p CSV::VERSION'
"2.4.8"

% bundle install
(snip)
Installing csv 3.1.0

% bin/rails r 'p CSV::VERSION'
"3.1.0"

以下のようなメッセージの改善があったりするので、当然ながらアプリケーションの CI がとおるなどざっとは見ておきましょう。

github.com

kou さん、秒速さん、今日から使える改善と紹介ありがとうございました。

Active Record Oracle enhanced adapter 6.0.0.rc1 がリリースされた

Rails 6.0.0.rc1 にあわせて Active Record Oracle enhanced adapter 6.0.0.rc1 がリリースされた。yahonda さんリリースありがとうございます。

github.com

今回の Oracle への ORM としての目玉は Address ORA-01795: maximum number of expressions in a list is 1000 で、SQLIN 句に 1,000 件を超えるリストを指定した場合に発生する ORA-01795 を 1,000 件ごとの OR で繋ぐことでエラーを抑制する振る舞いになる。

これによりアプリケーション側で 1,000 件より多くを渡さないようにロジックを組んだり、それを想定したコードレビューをしたり、データ量が増えるとエラーになったりといったことが発生しなくなる。このあたりたびたびパッチ会などでも相談したりしていた。

yahonda さん、kamipo さん、対応ありがとうございました。

Ginza.rb 第70回

Ginza.rb 第70回 RubyKaigi 2019を肴に一杯呑もう!にバグ・オブ・ザ・イヤーとして参加した。会場はメドピアさん。

ginzarb.doorkeeper.jp

先週開催された RubyKaigi 2019 のふりかえりということで、Matz のキーノートと Ruby 3 への進捗のセッションで全体を俯瞰しつつ、気になるトピックについて掘り下げて話されていった。個人的に RubyKaigi 2019 で強く印象に残ったのは Ruby 2.7 で導入される Pattern Matching の話で、セッションで示された JSON パースへのパターンマッチといったユースケースが分かりやすくこれは便利だと思っていた中で、代入ではなく束縛という概念が入っている (という認識で良いだろうか?) といった自分が消化しきれていなかった視点をキャッチアップできたりして面白かった。

今回の Ginza.rb のふりかえりでは、Numbered block arguments など諸々についてお気持ちがあれば bugs.ruby-lang.org にフィードバックしようといった感じで本編閉会。楽しかったです。

RubyKaigi 2019のLightning Talksで話した

RubyKaigi 2019 の Lightning Talks で話した。

今回、コンテンツ、英訳のレビューにご協力頂いた方々への感謝という日記エントリということで、54枚の尺を5分で収めるにあたってトークで漏れていたパートへの補完は割愛。それも含めて今回の Lighitning ⚡️だったということで Lightning Talks の時間を賑やかにできてれば嬉しいです。

探偵小説風のショートストーリー展開を狙っていたため、ネタバレにならないよう公開を控えていた Lightning Talks に提出していたプロポーザルは以下です。

Title

The TracePoint Bomb!

Abstract

I will talk about the impact of patch to gems using TracePoint on the real world development of Ruby.

Details

I will talk about the beginning of the following issue and the subsequent incident. https://bugs.ruby-lang.org/issues/15400

In conclusion the patch I wrote below was the cause. https://github.com/bblimke/webmock/pull/751

Why did I write a patch using TracePoint? What was the factor behind the lack of ideas? What is the retrospective from there? I will speak.

Through this talk, listeners can learn about the dosage and administration of TracePoint. At the same time, listeners will recognize the possibilities of Ruby again.

Pitch

I made this bug with the following pull request. https://github.com/bblimke/webmock/pull/751

This is the beginning of this case.

ささださんはじめ Ruby コミッターのみなさんありがとうございました。

f:id:koic:20190422181950j:plain:w400

`rubocop` コマンドに `--init` オプションを用意した

rubocop コマンドに --init オプションを用意した。次のリリースとなる RuboCop 0.68 で有効になる予定。

github.com

使い方

% rubocop --init
Writing new .rubocop.yml to /private/tmp/example/.rubocop.yml

rubocop --init を実行すると、カレントディレクトリに以下のような .rubocop.yml ができる。

% cat .rubocop.yml
# The behavior of RuboCop can be controlled via the .rubocop.yml
# configuration file. It makes it possible to enable/disable
# certain cops (checks) and to alter their behavior if they accept
# any parameters. The file can be placed either in your home
# directory or in some project directory.
#
# RuboCop will start looking for the configuration file in the directory
# where the inspected file is and continue its way up to the root directory.
#
# See https://github.com/rubocop-hq/rubocop/blob/master/manual/configuration.md

すでに .rubocop.yml が存在している場合は以下のように失敗する。

% rubocop --init # A warning will occur when .rubocop.yml already exists
.rubocop.yml already exists at /private/tmp/example/.rubocop.yml

RuboCop JP に神速さんが開いてくれたイシューがアイデアの元になっている。

github.com

基本的な設定項目として何を示すかといった選別が悩ましいため、このイシューのすべての問題が解決するわけではないが手始めとしてコンフィグレーションのリンクを示すまででひとまず用意した。

不足していたテストコードは PR 直前に書き加えているものの、去年の7月には基本線を実装してコミットしていた (おそらくもっと前に作っていたが、一度手元のリポジトリを飛ばしてしまった時にそれは消えていると思う) 。元々はアイデアの多くを実現してから PR を開こうと思っていたところ、来月の銀座 Rails に向けたお蔵出し機能のひとつとなる。

RuboCop 本体から Performance Cops が外される

次の RuboCop バージョンとして予定されている 0.68 から Performance Cops が外されます。今後 Performance Cops を使う場合は Gemify された rubocop-performance gem を使うことになるため、RuboCop 0.67 から警告が出るようにしています。

github.com

これから 0.68 までの間を移行期間としているため RuboCop の Performance Cops を使う場合は、以下のような設定を加えてください。

Gemfile に rubocop-performance gem を追加して bundle install する。

gem 'rubocop-performance'

.rubocop.yml に require: rubocop-performance を追加する。例えば以下のように足すことになります。

 inherit_from: .rubocop_todo.yml
 require:
+  - rubocop-performance
   - rubocop-rspec

 AllCops:
   Exclude:
     - 'vendor/**/*'
     - 'spec/fixtures/**/*'
     - 'tmp/**/*'
   TargetRubyVersion: 2.6

rubocop-performance gem についての詳細は https://github.com/rubocop-hq/rubocop-performance を参照してください。

RuboCop 本体と rubocop-performance gem 両方に実装がある場合、rubocop-performance gem の実装が方が優先される動きになります。

Performance Cops が外されることについての移行スケジュールは以下です。

  • RuboCop 0.67 ... Gemfile (あるいは gemspec) に rubocop-performance への依存がない場合に警告を表示します
  • RuboCop 0.68 ... RuboCop Core から Performance Cops を削除します

RuboCop 本体の開発についても RuboCop Performance に依存する形になるので設定のサンプルとして一例まで。

github.com

Performance Cops を Gemify する意図については、以下スライド 67 ページあたりからまとめていますので興味のある方はどうぞ。

Rails/OSSパッチ会 (2019年2月)

Rails/OSSパッチ会 (2019年2月) だった。

個人的に今回のパッチ会については、うなすけメンバーがくれている PR について Rails コミッターに意見を伺うのが目的のひとつだった。

github.com

断言できるような回答はないものの、文字列の方が好ましい上で、シンボルについても Rails が許可しているので許可しておくといった流れで良いのではと後日コメントした。

それとは別として書いたパッチは以下。再現確認から PR を開くまで1時間くらいだった。

github.com

次回 Rails/OSS パッチ会は 2019年3月13日(水)です。