虚無庵

徒然なるままに

Fukuoka.rb #122 に _ko1 がやってきた

fukuokarb.connpass.com

GMO ペパボさんに行ってきました。

_ko1
Fukuoka.rb に笹田さんがやってきた

Ruby コアコミッターの笹田耕一さんがいらっしゃいまして、Ruby 3x3 や今後の Ruby について話していただきました。笹田さんの Fukuoka.rb の参加は #2 依頼だそうです(nagachika 調べ)。

今日やったこと

  • RubyKaigi のあれこれ
  • 笹田さんの話を聞いてワイワイしたり

笹田さんの話を聞いてワイワイしていた

会議室で円卓を囲む感じかと思っていたら、まさかのスライドを用意されていました。
議事録をとるつもりでいたのですが、すっかり忘れて話を聞き入ってしまいました。
覚えている限りの話を何となく書きます。

Ruby の今後について

Ruby 3 には 3 つの目標がある

  • JIT
  • Concurrent/Parallel execution
  • Static checking

Ruby 3 に入れたいな」と思って議論していること

  • キーワード引数
  • パターンマッチ
  • 思い出せないm(_ _)m


Ruby 3 でやらないと決めたこと

  • 思い出せないm(_ _)mFrozen String
  • autoload の削除

その他ワイワイしたこと

  • bootstrap

  • 思い出せないm(_ _)m

エンジニア募集中

  • Ruby の開発をしてくれる人は常に募集中(まずはパッチを送るでも議論に参加するでも何でも良し)
  • Cookpad(笹田さん現職)もエンジニア募集中
JIT

speakerdeck.com

RubyConf 2018 のプレゼン資料をもとに解説してもらった。

speakerdeck.com

昨年の RubyKaigi で話されたことからの進展としては

  • Ruby 2.6.0 に載った
  • Ruby 2.5.0 と比較して 1.8 倍速くなった

というもの。何を以って速くなったかというとこの資料では数値演算処理が速くなったことをしてしている。ベンチマークには optcarrot を使っていたり使っていなかったり。

Concurrent/Parallel execution

おなじみ Guild。

www.slideshare.net
昨年の RubyKaigi のやつ。

http://www.atdot.net/~ko1/activities/2018_rubyconf2018.pdf
昨年の RubyConf のやつ。

俺が理解している Guild は、

Process
 └ Guild
   └ Thread
     └ Fiber

という感じ。ただ、今日の話では Guild の立ち位置が上記のものではない案があったりする模様*1
Thread プログラミングを少しでも触ったことがある人なら Thread プログラミングの難しさは知っていると思う。ユーザースレッドではなくネイティブスレッドを使っている場合、気軽にスレッド間転送をやるわけにはいかずかなり悩まれているようだった。

Static checking

型推論と呼んでいたものは、今は静的解析と呼ぶようになった。

Sorbet / Steep について。Steep は昨年の RubyKaigi で松本宗太郎さんが話されていた。

speakerdeck.com

昨年の RubyKaigi では単なるライブラリの紹介程度にしか思っていなかったが、今日の話で大分誤解していたことが分かった。
Ruby に型を実装する予定はない」と Matz が言っていたが、型がないことによる自由度の引き換えに人為的なミスを誘発する機会が増える。
それを防ぐために静的解析がある。ただし、Sorbet や Steep は静的解析のために型のテンプレートのようなもの*2を先に用意しておく必要がある。しかし、そのテンプレートのようなものを Ruby 内部に組み込むことはやりたくない*3

そこで mametter さんが考案した Type Profile というアプローチがある。

www.slideshare.net

昨年の mametter さんのセッションを聞いてもよく理解できていなかったが、今日の話で何となく雰囲気は掴めた。
ただもう一度話を聞きたいところ。というか mametter さんに解説してもらいたいところ。

キーワード引数

最近の Ruby 界隈で一番ホットだと個人的に思っているもの。

```
def foo(*args, ex: false) {
}
```
というメソッドがあった場合、

  1. foo(1, 2, 3)
  2. foo(k: 42)

と実行するとそれぞれどうなるか?後者がエラーになるのが問題視されている。
この問題は 10 年くらい議論されているが、いい解決案が出てこないらしい。
個人的にはオーバーロードを実装して欲しいが、それをやるには型が必要なのでダメだな。

眠いのでここまで

現在 2019-02-09 03:51
おやすみなさい

次回

fukuokarb.connpass.com

次回の Fukuoka.rb は通常通り水曜日開催です。2/13(水)グルーヴノーツさんで開催予定です。

追記

2019/02/09 18:43 思い出したことを追記。
2019/02/14 12:28 思い出したことを追記。

*1:もしかしたら今年の RubyKaigi で話す?

*2:あまり理解できていないのでこのような表現になっている

*3:ただし、全てを捨てることはせず、「外部ファイルから読み込む」という形で残るかもしれない