Speee DEVELOPER BLOG

Speee開発陣による技術情報発信ブログです。 メディア開発・運用、スマートフォンアプリ開発、Webマーケティング、アドテクなどで培った技術ノウハウを発信していきます!

RubyKaigi 2018 速報!!(2日目)

こんにちは。韻エンジニアになりたい@mncです。
RubyKaigi前夜祭で 「まつもとゆきひろ で踏める韻は?」と振られて頭が真っ白になってしまって落ち込んでいます。
落ち着いて考えたら「今日は 吐くほど無理しろ!!」で踏めました。
では、遅くなりましたが2日目の発表内容のレポートをさせていただきます!

Keynote - My way with Ruby

2日目のKeynoteは弊社Speee技術顧問でもあるクリアコードの須藤さん(@ktou)による、My way with Rubyというタイトルのスピーチでした。

内容は、@ktouさんのRubyistとしてのOSS活動によってRubyでできるようになったことの紹介と、OSS活動をするにあたって大事にしている考えについてです。

発表資料 slide.rabbit-shocker.org

@ktouさんは最近だとRubyでデータ分析をできるようにするRed Data Toolsというプロジェクトをされていますが、それ以外にも多数のRubyのライブラリメンテナやOSSプロダクトの開発をされています。

  • rabbit
  • REXML
  • RSS Parser
  • Ruby/GTK3
  • Ruby/GI
  • rcairo
  • rake-compiler
  • test-unit
  • RR
  • CSV
  • Red Arrow
  • Red Data Tools

これらは@ktouさんのOSS活動のごく一部ですが、これほど多くのOSSに関わるエネルギーの源には

  • 自分が欲しいものを作る
  • Rubyでできることを増やしたい

という2つのモチベーションがあったようです。

例えばrabbitだと「プログラマ向けにテキスト形式でプレゼン資料を作りたいし、その見栄えはGUIベースで行いたい」という思い(=自分が欲しいものを作る)と、
それをRubyでできるようにしたいという思いがあり、それを実現するためにはRubyでできることを増やしていく必要があります。
その結果以下のようなライブラリの開発を行ったそうです。

  • Ruby/GTK3: 複数プラットフォーム対応GUIツールキット
  • Ruby/Poppler: PDFのテキスト抽出
  • native-package-installer: gem install時にシステムパッケージをインストールしてくれるライブラリ

自分が欲しいものを作るだけじゃなく、Rubyでできることを増やしたいというRubyに対する熱い想いがあるからこそ、多くのRubyライブラリのメンテナやApache ArrowのPMCを担ってこられたのだと思いました。

作りたいものを作るだけじゃなく、そのエコシステムに対してどうやって還元していくかを考えていかなければと自戒し、僕のエンジニアとしてのスタンスを見直すきっかけになりそうなKeynoteでした。

Ruby Programming with Type Checking

SideCI CTOの@soutaroさんから、soutaro/steepというRubyに型チェックを導入するライブラリについて発表がありました。

発表の様子 f:id:manchose:20180602150019j:plain

※steep

github.com

最初にStripeの発表にあったsorbetとsteepを比較していました。

steep sorbet
local type interface local type interface
サポート型 generics, union type, any type generics, union type, any type
派生型 structural nominal
signatureの記載場所 別ファイル Rubyコード
型注釈 コメント Rubyコード
performance 遅い 速い

すでに実用できるのではないかという感覚がありましたが、まだいくつか問題はあるそうです。
例えば、hashパラメータをサポートしてないという問題があるそうですが、これはActionArgsを使ってなんとかすることができるそうです。
また、attr_readerなどの動的に定義されたメソッドは型チェックできないそうですが、これは以下のように@dynamicコメントを残すことで型チェックをスキップすることができるようです。

class Person
  # @dynamic name
  attr_reader :name
end

Type Profiler: An analysis to guess type signatures

2日目最後のセッションの1つはRubyコミッターであり、超絶技巧プログラマでおなじみの@mametterさんによる発表でした。

内容は大きく分けると以下の2つでした。

  1. 2.6から入るEndless Rangeの説明
  2. Ruby3で検討されている型の仕組みの説明と実現方法のアイデア

1. 2.6から入るEndless Rangeの説明

(1..)

Endless Rangeは上記記法で、終端のないRangeオブジェクトを定義できるようになりました。
これの嬉しいポイントが3つ紹介されていました。

(1) indexがn以降の要素の取得がスマートに書ける

ary=['a', 'b', 'c']

# 従来の方法1
ary[1..-1]

# 従来の方法2
ary.drop(1)

# Endless Range
ary[1..]

(2) index nからループがスマートに書ける

# 従来の方法1
i = 1 
loop{  i += 1 }

# 従来の方法2
(1..Float::INFINITY).each{ }

(1..).each{ }

(3) index nからイテレートがスマートにかける

# 従来の方法1
i = 1
ary.each{ i += 1 }

# 従来の方法2
ary.each.with_index(1){ }

ary.zip(1..){ }

2. Ruby3で検討されている型の仕組みの説明と実現方法のアイデア

「型はコードベースに書きたくない」という型の仕組みへの要求を考えると、現状soutaro/steepが一番近いそうです。

github.com

ここからもう少し考えを凝らしていくと

  1. Steepなどの型定義ファイル(.rbi)を手動ですべてつくるのは大変そう
  2. プログラムで生成される未来がありそう
  3. それを管理するためにTypeDBというアイデアはどうか

という流れで、TypeDBというコアコンセプトがうまれてきたそうです。

そして、TypeDBに格納する型情報をどうやって生成するかという問いへの答えが TypeProfiler ということでした。

TypeProfilerとは既存のRuby codeから型情報を抽出する方法です。
そのための方法とその実験結果を3つ紹介されていました。

2つの方法は静的解析にあたるものでした。
この場合、動的に定義されるメソッド(例えばActiveRecordなど)の型がわからないという欠点や、
同じメソッド名を持つ複数のクラスが存在すると型情報が意図通りにならないという問題があるそうです。

もう1つが実行時に解析する方法でした。
この方法だと動的に定義されるメソッド(例えばActiveRecordなど)の型が判別できるというメリットがあるものの、
テストを流す必要があり処理速度が遅くなるという欠点があるようでした。

Ruby3で大きく変わるという話がどんどん具体化されてきていて、これからが楽しみですね!

RubyData Workshop

RubyData Workshopでは弊社エンジニア@mrknがデータ分析用のRubyライブラリやpythonのデータ分析用ライブラリをRubyから利用できるpycallを用いたデータ分析のハンズオンを行いました。

また、Red Data Toolsプロジェクトの日々の活動内容の成果や活動ポリシーについてのプレゼンテーションを弊社エンジニア@hatappiが行いました。
詳しいレポートは以下のブログをご覧ください。

blog.hatappi.me

最後に

RubyKaigi 1日目、3日目の速報は@nyamadorim(中嶋)@selmertsx(森岡)が書きました。 こちらも合わせてご覧ください!

tech.speee.jp tech.speee.jp