1
/
5

Ruby 2.5 特集!Meguro.rb クリスマス前スペシャル レポート

こんにちは。Wantedlyのエンジニアの永田 (@ngtknt) です。
2017年も年の瀬で、今年やりたかったことが全く収まっていないですが、まだまだ詰めていくつもりです。 💪

さて、本記事では12/19(火)に開催した第10回Meguro.rbをレポートしたいと思います。今回は Ruby 2.5 特集なので Ruby 2.5とMeguro.rbと目黒(広義)が気になっているRubyistの皆様にお読みいただければと思います。

Meguro.rb とは

Meguro.rb は地域Rubyコミュニティーで、目黒近辺で活動するRubyist向けのミートアップを開催しています。

今年3月に弊社の南(@south37777)と永田(僕)で地域Rubyコミュニティをやりたいという話をしていて、そのままその月に開催し、毎月コンスタントに開催してきました。また弊社の他に、ドリコムさん、Viibarさん、リブセンスさん、ラクスルさん、アカツキさん(開催順)にご協力・開場提供いただき、全回で延べ215名の方にご参加いただきました。いつもご協力ご参加ありがとうございます。

過去のイベントリスト
Twitter #megurorb
Slackに参加



今回のMeguro.rbは3つのスペシャル!

さて、今回のMeguro.rbは年末なのでスペシャルで行きたい!と思いまして、スペシャルを3つご用意しました。一つずつご紹介します。

スペシャル1 Wantedly特製 ハヤシライス

前回のアカツキさんのお手製カレーに引き続き(参考ブログ)、お手製ハヤシライスを提供いたしました!また、弊社Wantedlyでは週1で総務の方がまかないを作っていただき社員集まって美味しく頂いています。


スペシャル2 Meguro.rb特製 ステッカー

思い切って作りました、特製ステッカー。
Meguro.rbのロゴやグラフィックは、Meguro.rb開始当初に弊社デザイナーの菅谷(@maosugaya)にお願いしてシュッと作ってもらました。非常にクオリティーが高いものになったので、ステッカーにしたいなと思いつつ、なかなか実行には移せなかったのですが、今回スペシャルの勢いで作りました!

もし欲しい方で今日参加できなかった方、ぜひ次回第11回 (1月予定) にご参加ください。日時・場所は追ってconnpassでご案内しますのでよろしくおねがいします。



スペシャル3 LT大会優勝者にはプレゼントが…!

いつものLT大会では特に勝ち負けや景品などはありませんでしたが、クリスマスも直前ということでプレゼント要素を入れたいなと思い、投票形式にして、優勝者プレゼントもご用意しました。
気になる優勝者とプレゼントの内容は記事の最後で!😊

ここが良くなるRuby 2.5! LT大会!

さて、本題に入りましょう。
クリスマス前ということで Ruby 2.5 の新機能・変更点をテーマにLT大会を行いました。1~3分で発表者が気になる変更を発表しました。各発表を簡単に紹介していきたいと思います。(発表順)


do/end blocks work with ensure/rescue/else

発表者: @kawasy
関連Issue: Feature #12906

do/endブロックでrescueが使えるようになりました。いままでは、do/endブロックでrescusしたい場合はbegin/endでさらにネストして書く必要がありましたが、do/endブロックにrescue節をそのまま書けるようになりました。この変更を待っていた方が多いのではないでしょうか!僕もこれは嬉しいです。

また、会場にいるユーザの40%がこの変更に満足しているようでした。

Add HTTP 451 Status Code

発表者: @Altech_2015
関連Issue: https://github.com/ruby/ruby/pull/1167

WEBrick::HTTPStatus に 451 ステータスコードが追加されました。
また、451ステータスとは、検閲などの法的な理由にアクセスできないことを示すステータスコードで、2016年2月にRFCで定義されていましたが、このタイミングで追加されたようです。

HTTP 451 Unavailable For Legal Reasons is an error status code of the HTTP protocol to be displayed when the user requests a resource which cannot be served for legal reasons, such as a web page censored by a government.

https://en.wikipedia.org/wiki/HTTP_451より引用

ちなみに、この451という数字はレイ・ブラッドベリ著「華氏451度」にちなんでいるそうです!
ぜひ本と映画あわせてお楽しみください。

また、会場にいるユーザの0%がこの変更に満足しているようでした。日本ではあまり恩恵を受けられないようですね。

Ref: https://datatracker.ietf.org/doc/rfc7725/

Random.raw_seed renamed to become Random.urandom. It is now applicable to non-seeding purposes due to [Bug #9569]. and SecureRandom now prefers OS-provided sources than OpenSSL. [Bug #9569]

SecureRandom がopenSSLよりもOSの提供する乱数ソースを優先するようになりました。IssueではOpenSSLに依存せず、Kernelが提供している`/dev/urandom`を使ったほうがセキュリティ的に良いよねって話なのですが、man pageにはそのような意図で使ってほしくないと書かれていたらしく、色々議論が巻き起こった上、man の方が修正され、無事取り込まれたという流れのようです。Issueがすごい...!

発表者: @ne_sachirou
関連Issue: Bug #9569

class Array: alias .prepend to .unshift ?

発表者: @u_1f419
関連Issue: Feature #12746

ActiveSupportでおなじみのprependとappendがRubyのArrayにも入るようになるみたいです。
個人的にもunshiftよりprependのほうが直感的でいいなって思っています。嬉しい。

会場でも30%のユーザが嬉しさを感じていました。

Kernel#pp by default

発表者: @u_1f419
関連Issue: Feature #14123

require "pp" って書かなくても良くなりました。会場の反応的にはいまいちでした。
僕も普段いつもいるやつくらいの認識だったので、逆にデフォルトじゃなかったのかと思いました。

String#start_with?(regexp)

発表者: @umanoda
関連Issue: Feature #13712

start_withの引数に正規表現を受け取れるようになりました。これを実現するために一時的な正規表現を作る必要がなくなるのがメリットです。今までだと以下のように書く必要がありました。

/\A#{re}/.match(string)

今後は

string.start_with?(re)

と書くだけでOKです。

Kernel#yield_self

発表者: @meea_t
関連Issue: Feature #6721

yield_selfというメソッドが追加されました。これは、tapと似たような挙動をしますが、ブロックを評価した結果が返ってきます。なので、引数に受け取るようなものをチェーンして書くときに便利そうです。

Ruby 2.5 の yield_self - Qiita
Ruby 2.5 で Object#yield_self というメソッドが追加されます。 https://github.com/ruby/ruby/blob/v2_5_0_preview1/NEWS https://bugs.ruby-lang.org/issues/6721 定義は簡単で、受け取ったブロックの引数に自身を渡して、そのブロックを評価した結果を返します。 class Object def yield_self yield(self) e...
https://qiita.com/stomk/items/58dce3e5e294639ab1c9

また、メソッド名については「長い」という意見がIssue上でも会場でも話題になりました。
他の案としては、apply, transform, alter, mutate, map, morph, castなどがあったようです。
まだ間に合うかもしれない!

バックトレースの順番について

発表者: @ngtknt
関連Issue: Feature #8661

特定の条件でバックトレースを今までと逆順にしたいという提案があったようです。
これは、Railsなどある程度大きなライブラリを触っているとバックトレースが長大になり、最初のエラーメッセージまで遡る必要があって大変という主張のようです。
特定の条件とは「組み込み定数のSTDERRが変更されていない」かつ「標準入出力となっている端末デバイスに出力する」場合のみです。

いままで

  Main Error Message
stack frame 1
stack frame 2
stack frame 3
.....

Ruby 2.5

stack frame 3
stack frame 2
stack frame 1
 Main Error Message
..... 

個人的には気持ちはすごい分かるけど、条件によって順番が違うのはちょっと混乱しそうだなと思いました。

branch coverage

発表者: @thinca
関連Issue: Feature #13901

coverage.soはもともとRuby本体のカバレッジ計測を想定して作られたライブラリでしたが、SimpleCovを通して広く使われるようになりました。この変更では、ラインカバレッジのみに対応していましたが、ブランチカバレッジにも対応するようになりました。

Ruby 2.5におけるパフォーマンス改善

発表者: @south37
関連Issue: Feature #13587

Ruby 2.5でも高速化の変更がたくさん取り込まれています。その一部を紹介しました。
watosonさんがたくさんの変更を入れていることの紹介、ERBの77%高速化、mutexの高速化、trace instructionsの削除による広域の10%改善などを紹介していました。また、発表者自身が取り組んだString Interpolationの改善で72%高速化も取り上げていました。

早くなるのは良いことですね!

binding.irb show source around a line called binding.irb
on its start

発表者: @onk
関連Issue: Feature #14124

binding.irbはbinding.pryと同じことがirbでもできる機能ですが、pryのように開いたタイミングで周辺コードを表示する機能がなく、「自分はいまどこにいるんだろう」という気持ちになっていたのですが、同じようにソースコードが表示されるようになったという変更です。

test
$ ruby /tmp/test.rb
From: /tmp/test.rb @ line 2 :

    1: def test
 => 2:   binding.irb
    3: end
    4:
    5: test

irb(main):001:0>

こういうことです。

引数に &block を書いても速い!!!

発表者: @onk
関連Issue: Feature #14045

ブロックを受け取るメソッドシグニチャは大きく3パターンありますが、明示的に`&block`と書いて受け取るケースではほかと比べて遅いという問題がありました。その為、引数を受け取らずにyieldするのが一番実行速度的には良い書き方となっていました。この問題は以前から話題になっていたようですが、解決したようです。詳細はonkさんのまとめブログを読んでみましょう!

Ruby 2.5 は引数に &block を書いても速い!!! - onk.ninja
Meguro.rb#10 で「引数に &block を書いても速い!!!」という素晴らしい改善について話してきた。 b.r-l.o の issue で言うとこちら。 Feature #14045: Lazy Proc allocation for block parameters block をメソッドで使う場合、大きく分けてこの 3 パターンがあると思う。 # block を引数で受け取って、call で呼ぶ def block_call_with_block_arg(&block) block.cal
https://blog.onk.ninja/2017/12/19/ruby_2_5_medama

以上ですべてのLTでした。
最後に、みんなで一番良かったLTに投票してもらいLT優勝者を決めました。

その結果・・・

LT 優勝者は...!

onk さんでした!
やはり引数&blockの話が一番おもしろかったですね!RailsのJRuby分岐の話など小ネタも交えつつすぐに使える知識でした!

そして気になる優勝者へのプレゼントですが、、

鳥井雪さん翻訳の「ルビィのぼうけん コンピューターの国のルビィ」をサイン入りで、直接ご本人から手渡しいただきました!おめでとうございます!!

まとめ

  • do/end blockのrescueなど普段使える機能追加・変更が結構ある! (すぐに使える!)
  • Ruby 2.4での高速化に引き続き2.5でも早くなる!
  • まだ議論の余地があるものもありそう。意見があればコメントすればよいかも!
  • Ruby 2.5のリリースが楽しみですね!


次回も1月に開催予定ですので、目黒とRubyでピンときた方はぜひ参加しましょう!
追ってconnpassに公開されますのでぜひチェックしてみて下さい!

Wantedly, Inc.からお誘い
この話題に共感したら、メンバーと話してみませんか?
Wantedly, Inc.では一緒に働く仲間を募集しています
22 いいね!
22 いいね!

今週のランキング

永田 健人さんにいいねを伝えよう
永田 健人さんや会社があなたに興味を持つかも