[WIP]RubyKaigi2015に参加してきた(1日目編)

Rubykaigi2015 の1日目のレポートです。
TODOができたらWIPを外します。

RubyKaigi2015 に参加してきました。
私自身は2回目の参加です!
今年も参加してみて、やっぱりお祭り騒ぎな感じが良かった & 楽しかったです!
あと、昨年に比べてよちよち.rbの人たちをはじめとして、知り合いが多かったです。

1日目全体の感想

では、私が聞いたセッションについて軽く感想を書いていきます。

マネーフォワードさんの発表

Keynoteの前にマネーフォワードさんからの

Rubyコミッタ専任を設けるといった経営判断がスゴイなと感じました。
会社が本気でRubyに取り組む姿勢の意思表示になっていますよね。

Keynote

Rubyの父、matzの発表です。
印象に残った言葉、キーワードは、

  • 人が欲しいものなんて聞いてもわからない。将来必要になるものを作る
  • MINASWAN(Matz is nice. And so we are nice.)
  • Ruby 3×3

でした。

Ruby 2.3.0の機能

  • Hash#dig, Array#dig
  • << というリテラル

Did-you-mean

もしかして?機能
→名前を間違えるとsizと間違えたらもしかしてsizeですか?と聞いてくれる

Enumerable#grep_v

ある要素を検索して、マッチしてないものをArrayで返すメソッド
Enumerable#grep の逆です。
もともと、$ grep -vみたいなメソッドがほしいということでこれが作られた & こういう名前になったそうです。

fetch_values

values_atの、指定したkeyが存在しなかったら例外が出る

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
values = {
foo: 1,
bar: 2,
baz: 3,
qux: 4
}
values.values_at(:foo, :bar)
#=> [1, 2]
values.values_at(:foo, :bar, :invalid)
#=> [1, 2, nil]
values.fetch_values(:foo, :bar)
#=> [1, 2]
values.fetch_values(:foo, :bar, :invalid)
#=> KeyError: key not found: :invalid
values.fetch_values(:foo, :bar, :invalid) {|k| k }
#=> [1, 2, :invalid]

positive? negative?

数値の正負を true or false で返すメソッド

Hash#comparison

包含関係を表すことのできるメソッドです。
2.2.3まではHashに対して>=といった不等号の式は使えなかったのが、2.3.0からは使えるようになります。

1
2
3
4
5
6
{ x: 1, y: 2 } >= { x: 1 }
#=> true
{ x: 1, y: 2 } >= { x: 2 }
#=> false
{ x: 1 } >= { x: 1, y: 2 }
#=> false

Hash#to_proc

これまでは、ブロック付きメソッドに対して Proc オブジェクトに&をつけると呼び出しブロックの様に動作しました。
2.3.0からはHashオブジェクトに&をつけて渡すとkeyにvalueだとみなして返す関数となる。

1
2
3
4
5
6
hash = { a: 1, b: 2, c: 3 }
keys = %i[a c d]
hash.to_proc.call(:a)
#=>[1]
keys.map(&hash)
#=>[1, 3, nil]

Hash#dig, Array#dig

深いHashやArrayの値を一発で取得することができるメソッド

<< というリテラル

インデントの浅いところに合わせて整形してくれる

Frozen string literal

magic commentで # frozen_string_literal: true とするとすべての文字列リテラルがfrozeされたものになる。
リテラルがfrozenだとエラー吐き出しが早くなって、若干パフォーマンスが良くなるらしい。
恩恵に預かれるTipsとかが出てきたら使おうかなと思いました。

safe navigation operator

&. 通称ぼっちオペレーター
メソッドチェインで呼び出した際、途中でオブジェクトがnilでも例外が起きないというもの。

仮にUserというテーブルがあった場合、

1
2
u = User.find("Maz")
u && u.name && u.name.first

これの最後の行が

1
u&.name&.first

というようにかける。

Ruby3の話

  • 2020年までには出すとのこと
  • Ruby2.0.0より3倍早くするとのこと

TODO: 動画を載せる

Compiling Ruby scripts

Rubyのコンパイルの話
C言語レベルの私にはちょっと難しい話だったので、Youtubeの動画の紹介だけにしておきます。

TODO: 動画を載せる

Saving people from typos

@yuki24 さんの did_you_mean gem の紹介です。
タイポしたらもしかして?という機能です。

spell checker の方で、基本的には

  • mistyped words
    • 単語はわかるけど、意図してないのに間違えている
  • misspelt words
    • そもそも、単語がわからない

のふたつの定義がある。

その中で、 did_you_mean gem はmistypeが全く無かったときだけmisspelを探すようにしているそうです。

その後に後半はアルゴリズムの話でした(こちらは難しくてよくわからなかったです…)

TODO: 動画を載せる

Time flies like an arrow; Fruit flies like a banana: Parsers for Great Good

英語が早すぎて聞き取れなかったです…。Youtubeの動画の紹介だけにしておきます。
大体の内容は構文解析っぽい感じでした。間違ってるかもしれません。
ただわかったのは、日本語は単語の順番が変わるだけでふたつの意味を持ったりするので難しいですね。ということでした。

TODO: 動画を載せる

Fast Metaprogramming with Truffle

Metaprogramingの話。

英語が早かったのと、内容もあんまりわからなかったです…。
あとで見返してみて、思い出したら書きます。

High Performance Template Engine: Guide to optimize your Ruby code

Slimに負けない、Hamlを改造したFamlとかHamlitというテンプレートエンジンを作った話

TRICK 2015: The second Transcendental Ruby Imbroglio Contest for RubyKaigi

Rubyの変態コード競技大会みたいなもの
解説がないと全くわからないコードばかりだった。ホントにこれRubyなの?みたいな感じでした。
でも面白かったです。

コードはこちらにあります。