#RubyKaigi 2018 1日目に参加しました。

f:id:Watson:20180531151341j:plain

発表を聞きながらメモした内容を貼っておきます。

Keynote

  • ことわざの話
  • ことわざ=先人の知恵

名は体を表す -> 名前重要

名前を付けてアイディアを交換する。名前付けは非常に重要。

1. 振る舞いに対して

  • クラス、メソッド、変数などの概念
  • 名前付けが難しいのは、概念を十分に理解しきれていないから
  • 良い名前付けは使い勝手につながる → 良いソフトウェアにつながる
  • 悪い例:yield_self
    • もう少しましな名前に変更します → then
  • version あげるコミット以外で、意味のあるコミットしたのは 5年ぶりくらい

2. プロジェクトに対して

  • 良い名前はコミュニティーの旗印や求心力になる
  • Ruby という名前じゃなかったら、いまのようではなかっただろう
  • Ruby という名前付けは良かった (1993年)
  • Google 登場前だったので、今なら Google アビリティの高いものに
    • Go
    • Swift
  • 単語を組み合わせる
    • Ruby on Rails
    • TensorFlow
  • スペルをいじる
    • jupyter
  • 変な単語にする
    • Hanami
    • Nokogiri
    • Kaminari

時は金なり

Splatoon Movies Comics Programming ....

  • 開発時間

    • Ruby は時間を有効活用することを助けてくれる
    • 便利なメソッドがたくさんある
    • たくさんのライブラリ
    • コミュニティーが成長したので、疑問を助けてくれる人がみつかる
    • 簡潔さ
      • シンプルな文法
      • 乱用可能な文法
        • rspec
        • TRICK
      • 型宣言がない
        • フレキシブルに書くことができる
      • 簡潔さは力なり
        • メタプログラミング
          • DSL
      • ツールを使って複雑さに対応したい
        • Rubocop (デフォルトのルールは好きじゃないけど)
        • 静的に型を解析
  • 実行時間

    • Ruby が遅い原因
      • 1.8 以前はインタプリター
      • → 1.9 で YARV が入ったように改善されている
      • → 2.6 で MJIT が入る
    • 並列性
      • guild

塞翁が馬

  • 1995-2004
    • Ruby って何?ほとんどの人が知らない
  • 2005-2012
    • Ruby すごい〜。
  • 2013-2018

    • 安定期。「Ruby は死んだ」って言われる
    • Ruby は毎年のように死んでいる・・・
  • 互換性は非常に重要

    • 1.8と1.9での非互換性で何年もコミュニティーが分断した
  • 改善は続け前進する

  • 松田さんのスゴイところ

    • コミュニティーが各自やっていることを発表する場を作っている

質問:型についてどう思うか

Ruby に型宣言が入ること決してない 入るなら、型アノテーション。 2040年の未来とかは、コンパイラが全て型チェックしてくれると信じており、型アノテーションがあると古めかしくなるかも。なので、型アノテーションも入らなそう。

Reducing Ruby Memory Usage

トークの内容

  1. Feature Cache
  2. Direct ISec marking

Feature Cache

メモリ使用量の見つけ方

  1. あまりよくなく、難しい方法 → コードを読む
  2. Malloc Stack Trasing

Ruby のヒープは2つに分けられる

  1. GC
  2. システムの領域

Malloc Stack Logging

  • macOS のみでつかえるツール
$ MallocStackLoggingNoCompact=1 rails server
$ malloc_history [PID] -allEvents > log

Malloc した量はわかる

malloc はどこから呼ばれているか? → コードを読む

共有文字列の最適化の手法の話

LOADDED_FEATURE

  • 同じファイルを require しまくると、Array search が行われて遅いので Ruby はキャッシュしている

共有文字列を使ってmallocを減らしたい

  • パッチを書いた
  • Ruby 2.5にくらべて 40 % くらい、文字列の確保を削減できた
  • Rails アプリの起動時間が4%くらい減った

すでに同じようなパッチを5年前に書いてた人がいた!!

  • 事前に調べるのが重要とのこと

Direct ISec marking

Ruby → AST → Linked List → Byte code と変換されて動いている

Byte code にするときに Ruby オブジェクトが複製されている

  • コピーしないと文字列の破壊的変更した時にスタック中のオブジェクトの内容が壊れるため

literal_string_frezee: true のときには、必要ない

35%の Arrayオブジェクトの生成が削減できた

Hijacking Ruby Syntax in Ruby

Asakusa.rbの方々

Binding

  • binding するたびに object_id がことなる
  • binding を抜けると Binding#local_variable_set でセットした変数が消えたりするが、変数が用意されていれば書き換えに成功する

TracePoint

  • TracePoint は一行実行するごとにイベントを発生させられる
  • binding が扱える
    • 一行実行するごとに binding を取ってきて変数を書き換えるようなことができる

Refinements

  • 安全なモンキーパッチ

Ruby のフックを使いまくっている

  • included
  • extended
  • method_added
  • ...

作るのは楽しそうだがデバッグが超絶大変そうw

RubyGems 3 & 4

Rails ガールズのスポンサー支援により3名来ているそう

RubyGems 2.7

メンテナンスポリシー RubyGems にセキュリティバグがあったら 2.7 を直し、2.6 と 2.5 にバックポートしている。 それ以外で 2.5 と 2.6 のリリースはない

Ruby 1.8 と bundler の統合をサポートしているため CI の matrix がすごいことになってる

  • respond_to? を使いまくってバージョンチェックがすごいツラそう
  • gem update --system すると、bundler の統合機能がうごき、bundler が強制的に入る

Security

  • Security チームがあった
  • RubyGems 2.7.6 が突然リリースされた。
  • 関係者間でいいかんじに調整をしたいそう

Ruby 2.6 には RubyGems 3.0、Ruby 2.7 には RubyGems 4 をバンドルしたい

https://git.ruby-lang.org をCanonicalにしたいそう

RubyGems 3

Removed to support for < Ruby 2.2

Gem::Deprecate

  • ライブラリ開発者向け。

gem-codesearch

  • すべての gem を検索できる
  • 消しても大丈夫なメソッドか検索して調べてる

akr/all-ruby

  • 全てのRubyが入った Docker で、どのバージョンでメソッドが追加されたか調べるのに便利

ubygems.rb を削除

Ruby 2.2+ サポートにすることで Refinements やら便利な機能が使えるようになる。 不要なコードを削除しまくっている。カバレッジが2%あがった。 Dependencyリゾルバーが Bundler と異なっているのでバージョンを上げたいそう。

Default gem の話を WEB+DB に書いたので読むと良さそう

RubyGems 4

  • --user-install をデフォルトにしたい
  • Rubygems 4 で全てが ~/.gem にインストールされるようになる
  • rbenv が壊れるので、rbenv を直していきたいそう