こんにちは。本日も昨日に引き続き RubyKaigi に参加してきたので、レポートしたいと思います。

My way with Ruby (by Kouhei Sutou)

2日目のkeynoteです。テンションの低い「おはようございまーす」の声から始まりました。

  • 「私のRubyist活動」
  • RSS/Atom parser with validation
  • 宣伝:コード懇親会
    – Matzさんも参加します!
  • REXML
  • Rabbit
    – Rubiestのためのプレゼンテーションツール
    – RD(Ruby Document)サポート
    – Rabbit Slide Show
    – Rabbitはすごい
  • test-unit
  • テストフレームワーク
  • 逆順のバックトレース
  • Rurema(るりま)
  • Apache Arrow Ruby
  • Red Arrow
  • Red Data Tools
    – Wikipediaに対応

It’s Rubies All The Way Down (by Kirk Haines)

  • What is a “Stack”?
  • The Ruby Bits
  • IOWA?
  • IOWA!
  • Rails!
  • FCGI Bitterness
  • Mongrel
  • Briefly Book in IOWAland
  • More Ruby In My Stack!
  • Pure Ruby Stack
  • Asynchronous Logger
  • Still Running Today…
  • Front End Proxy/LB
    – Twitter, Facebook
  • Static Asset Caching
  • Webserver For Static Assets
    – $ ruby -run -e httpd – -p 8080 .
    – Puma + Rack vs NGINX
  • Database
  • Key/Value Store
    – Roma
  • Deployment
  • Other Stuff?
  • Boston Host/Logged SSH Bolwerk
  • Wrapping Up
  • Would You Want To?
  • Why Might This Be Crazy?
  • Thanks to Cookpad

Improve Ruby coding style rules and Lint (by Koichi ITO)

このセッションでは、Rubocop にまつわる様々なことについて話していました。

  • Rubocop 使ってないけど一番作ってる
  • 「皆さん、これ(Rails)知ってますか? 知ってますよね?」
  • Rubocop やってる
    – バグ修正などしている
  • esm 朝ごはんスポンサー
  • 2007年 何があった?
    – Dave Thomas 来日
  • Ruby のコードは多様性がある
  • Rubocop にも公式ドキュメントはある!
  • cop 作った 19個!(すごい!)

Part1

  • Style と Lint の違いについて
  • Ruby では多くのスタイルが存在
  • Rubocop のデフォルトは、「Ruby Style Guide」という本に沿って設定されている
  • Rubocop の Style は変えていい!
    – rubocop.yml を編集
  • Style は好みによって色々変わってくるもの
  • 一方 Lint は?
  • Style ほど設定多くない
  • 例)UnifiedInteger とか
  • ERB.new 警告が出る
  • 警告でも良いかもしれないが、-w の場合は警告がうもれる
  • 一方、Rubocop は対象のリポジトリを指定できるのでGood
  • Style は文化、好きにしていい。Lint は従っておいたほうが良さそうなものの集まり

Part2

  • 実装はAST
  • ruby-parse
  • Rails app 以外にも適用?
  • それ Style じゃね?
    – Style/Mixin#5261 としてマージ
  • cop を作ったら、GH/rails/rails リポジトリで走らせて、大丈夫かどうか調べておくのが良さそう

Part3

  • MiniTest
  • assert_not
  • Rubocop に Rails の人が来るようになった
  • Rubocop と Rails 役割違う
  • 「Rails / OSS パッチ会」 が開催されますのでぜひ参加してください

mruby can be more lightweight (by Yurie Yamane)

mruby でのメモリ使用量削減について、発表されました。

  • VSCode は OSS って言いつつ一部のコードが公開されてない
  • 実演
  • Today’s topic
    – 組み込み、mruby
    – メモリが潤沢じゃない環境
  • nucleo で mruby を動かしたい!
  • F411RE と F401RE がある
    – F401RE の方が有名で、情報も多い
    – でもメモリ量が少ない
  • Cの関数はROM上で良い、Rubyは動的に定義されることがあるため困る
  • 今回、mruby のRAM使用量を削減することに成功

RAM から ROM へ

  • ROM に持っていけるものは持っていこう!
    – 動的ではないメソッド
    – シンボルもROM
  • クラス内メソッドをハッシュではなく配列で定義
    – 実行時のメソッドの検索が遅くなる代わりに、メモリ使用量が少なくなる
    – 静的に定義されるメソッドは多くないだろうし多少は大丈夫そう
  • このあたりの話について詳しく知りたい方は「Rubyのしくみ」を読んでください
  • ハッシュはどうしても空バケツができてしまい、メモリの無駄
    → 配列にしよう!
  • Ruby のメソッドと C の関数を id で結びつけ
  • RAM を先に見に行く、定義されていなければ ROM を参照
  • しかし、お気付きのとおり、remove_method で メソッドを消せないという問題がある

Firmware programming with mruby/c (by Hitoshi HASUMI)

mruby/c とマイコンを用いた酒造での IoT について、解説されておりました。

  • このセッションは、主に初心者に聞いてほしい
  • それから、お酒の好きな人に聞いてほしい
  • mruby/c について
    – 今回は、単に「エムルビー シー」と発音することにします
  • マイコンでのtask・・・Linuxで言うところのスレッド
  • 旭日酒造(十旭日というブランド)
  • なぜラズパイではなくマイコンを使ったのか?
    – ブート速い(0.5秒くらい)
    – セキュリティイシューを狭める 良い
    – 低消費電力、発熱が少ない(重要)
    – 酒造は 35℃、湿度 70% なんてことも
    – ラズパイだと発熱が不安
    – 低コスト、マスプロしやすい
  • CYPRESS PSoC5LP を使用
  • 他のマイコンでも mruby/c は動かないことはないが、動くマイコンは(現時点では)あまり無い
  • 現状の mruby/c
    – インスタンス変数がない(最近できた?)
    – each がない
    – ステップ実行ができない
  • mrubyc-utils
  • 始まったばかりの mruby/c ですが、宜しくおねがいします。

RNode with code positions (by Yuichiro Kaneko)

2.5系から追加された話

  • 以下のようなものは、ソースコードの位置についての情報を使っている
    – Exception 発生場所
    – Warning の発生場所
  • 2.5系からは、行番号だけではなく、カラムの情報を持つ
  • Ruby はゼロベース
  • また、位置はバイト数で表している
  • 以下のようなものは、ソースコードの位置についての情報を使っている
    – Exception 発生場所
    – Warning の発生場所
  • 2.5系からは、行番号だけではなく、カラムの情報を持つ
  • Ruby はゼロベース
  • また、位置はバイト数で表している

ブランチカバレッジとは?

  • 分岐でどのブランチを実行したか
  • どれくらいカバーしているか
  • 3項演算子は1行だったりして分かりづらい
    – 1行に2個の3項演算子があるともっと分かりづらい

ASTについての話

  • ruby –dump=p
  • 抽象構文木
  • $1, $2, $3 で値を受け取れる
  • ruby –dump=i

ここから実装の話

  • 実装してみた
  • AST の各ノードに対して位置情報を持つ
  • parser_params
  • @1, @2, @3 で受け取れる
  • 「反対意見が無いなら入れちゃえば?」と言われた
    – (会場拍手)
  • Ruby-VM-AST
    – Conference Driven Development
  • というわけで、最近の Ruby は文字位置を持つようになりました
  • NoMethodError が行内のどこで起きたか分かるようになった

Type Profiler: An analysis to guess type signatures (by Yusuke Endoh)

Ruby 2.6 に向けた成果

endless range

  • (1...) とかけるようになった
    – ary[1..-1] って書いたり
    – ary.drop(1) って書いていたのを
    – ary[1..] と書けるように!
  • 他にも
    – 1.step{|i| ...} を (1..).each と書けたり
    – i=1; ary.each{...; i+1} を ary.zip(1..){|x,i| ...} と書けたり
  • beginless については実装はできたけど、入れるかどうかは matz がどう言うか次第?

Ruby3’s Type

  • 詳しく知りたい方は「型システム入門」をどうぞ
  • Ruby の既存の型解析って?
    – Steep
    – RDL
    – contracts
    – dry-types
    – Sorbet
  • 今日はRDLについて主に
  • Ruby は意味のない値を返すことがある
    – 型解析で void 型がほしい!
  • static type check で annotation は別ファイル、というのが Matz の希望らしい
  • TypeDB という方法
  • Type Profiler の紹介
    – Ruby では厳密な type inference は無理
    → Type Profiler という名前を付けた
  • ヒューリスティックに解析
  • 静的解析は速くて良い
  • しかし解析の限界がある
  • 動的解析は簡単になんでも解析できるが遅い

Ruby Committers vs the World (by CRuby Committers)

ピンクのシャツを着た Ruby コミッターが登壇し、Ruby の話題について対談を行いました。

Ruby 2.6.0 Preview 2 について

  • Ruby 2.6.0 Preview 2 がリリースされました
  • JIT が入っています!!
    – 「(Preview 1 よりも)Preview 2 の方がずっと速いんで試してください!!」
  • AST が入ったよ
    – parse.y でパースできる
    – 使ってね!
  • RubyGems3 が入った
  • Endress Range が入った
  • $SAFE が process global になった
    – 未来には消える方向で(笑)
  • Preview 3 では元々のバックトレースが出てくる機能入れたい

Q. リファインメント消しますか?

  • 消しません!!
  • でも、便利にするため、変わることはあるかも

autoload やめろよというチケットについて

  • 移行パス消せないね、という話になるのでは
  • autoload 遅い!
  • rails console とか遅い
  • irb irc で autoload 使ってる人~?
    – (ちらほら挙手)
    – 「あんまりいないね・・・じゃあ消して良いのでは?」
  • 「まつもとさん、1回rails使ってみたら良いんじゃないですか?(笑)」

yield_self

  • 名称の代替案ある人~?
    – 「thenってどうですか?」「全然よくないですね!(笑)」
  • まつもとさん「thenが良い」
    – みんな反対してた
    – そしたら、自分で入れた
  • (登壇者に対して)なぜ then が嫌なんですか?
    – キーワードと同じだし、promise で被る
  • 矢印ラムダのときも反対したよね
    – 何年かに一回こういうことが起こる
  • (座席に対して)then が良いと思う人~?
    – ちらほらいるじゃん!
    – 「矢印ラムダのときより(賛成している人が)多い気がする」
  • 「then が嫌な人は、今のうちに Matz を取り囲めばなんとかなるかもしれません」

method メソッド

  • 第一候補:map(&Math.:sqrt)each(&.:puts)
  • map(&Math\.sqrt) でも良いけど、今更バックスラッシュ使うのはちょっと
  • 下線を付けたり、太字にしたりと、会場では色々な案が出されました

Beginless Range について

  • SQL の DSL で使うと便利
    – where(id: (..10))
  • 実装はやってみたら出来た
  • 便利ではあるものの、each をどうするか
  • 良いユースケースがあれば教えてください
  • 「Rails 勢としては入れてほしい」

SO_ORIGINAL_DST

  • Linux には入っているのに glibc には入ってない
  • 入れてもいいけど、入れる必要もあまりないのでは

while else

  • while の後に else が書ける
  • break されると else 内のコードは実行されない
  • Python にはある
  • rescue を end が付くやつ全部付けていいことにする、みたいな話
  • どっちを入れるか
    – while に else が欲しい人は今のうちに!

2日目の感想

色々と知らないことがあったので勉強になりました。またカジュアルな雰囲気のセッションも多く、とても楽しむことができました。明日も頑張ります。