読者です 読者をやめる 読者になる 読者になる

Galapagos Engineering Blog

株式会社ガラパゴス エンジニアチームによるブログです。

RubyKaigi2016のまとめ

参加レポート RubyKaigi RubyKaigi2016

はじめに

こんにちは、@vanhuyzです。 ガラパゴスのサーバーサイドではRubyがメインですから、是非一度もRuby会議参加したいと思い、今年2016年度のRuby会議@京都に参りました。 初参加で緊張ではありますが、楽しかったです。

会場の様子 f:id:glpgsinc:20160908095943j:plain

会場の外見 f:id:glpgsinc:20160908124634j:plain

せっかく参加したので、聴いた内容をまとめていきたいと思います。

Rubyの未来について

基調講演 Ruby3の型について "Ruby3 Typing" by @Matz

Ruby3の目標は:Soft Typing、 Ruby3x3(3倍速く)とConcurrencyです。Soft Typingというのは現在RubyDuck Typingを継承し、型チェックを加えるというアイデアです。要はプログラミングを実行する前に、型推論して型チェックする仕組みです。また、型情報をデータベース化するという考えもありました。これで、動的型の柔軟性を保つことができ、静的型のようにコード自体がドキュメンテーションになるということです。まだふわふわではありますが、Ruby3楽しみですね!ちなみに、Ruby3いつ来るかというとMatz氏自身もまだわからなく、Tokyo Olympicsまで目標したいらしいです。

f:id:glpgsinc:20160912214447p:plain

Ruby2.4の変更点: Unifying Fixnum and Bignum into Integer by @tanaka_akr

Ruby 2.4からFixnumとBignumがIntegerに統一することになるという話です。現状整数のクラスは2つ存在し、Fixnumは通常の整数で、BignumはFixnumの範囲外の整数を扱うクラスです。Fixnumの範囲はRubyの実装(CRuby、JRubyなど)により異なるので、学習コスト・ドキュメンテーションコストが高かったです。これから、全部Integerに統一することで、学習が簡単になるでしょう。唯一の問題はincompatibility(不適合性)です。 例えば、object.is_a?(Fixnum) のようなコードは意図通り動かないかもしれません。

発表スライド:Unifying Fixnum and Bignum into Integer

Concurrency(並列処理)

f:id:glpgsinc:20160912171635p:plain

ConcurrencyはRubyの弱点(?)の一つなので、今年はconcurrencyについてたくさんのセッションがありました。

始めに、@ko1氏はguildモデルを提案しました。主にmutableなオブジェクトを管理する仕組みです。もちろんimmutableなオブジェクトはguildの間にシェアできます。Guild間の伝達(コピー・移動)はチャネル上に行います。Guildの詳細は公開スライドA proposal of new concurrency model for Ruby 3をご覧ください。

次に、@anildigital氏によりいろんな言語のconcurrencyモデルを比較しました。JavaClojure、 Node.js、Python、Elixir、Goなどです。Rubyにはconcurrent-rubyというgemがあります。発表はちょっと長くなりましたが、concurrencyについてよくまとめました。本当に貴重な資料なので一度目を通すと良いです。

最後に、言語のconcurrencyの話ではなく、@wyhaines氏によりWebサーバーのconcurrencyアーキテクチャにていて発表されました。現在、concurrencyモデルは4つあります: Blocking Single Threaded、 Event Driven、Multiprocess、 Multithreaded です。どれを採用すべきか用途によりますが、一般的にMultithreadedが一番良さそうだと思います。@wyhaines氏は今ScrawlsというシンブルなRuby Web Serverを開発しています。これを使うと、どのconcurrencyモデルも指定でします。 さらに、現在のRubyのWebサーバーをリストアップされました。WEBrick、Puma、Passenger、Unicorn以外にもたくさんのWebサーバーが存在していますね。

スライドはWeb Server Concurrencyに公開されました。

他のRuby言語関連の話

基調講演 Rubyリファクタリング "Fearlessly Refactoring Legacy Ruby" by @searls

Day2の基調講演で@searls氏がRubyリファクタリングについて発表しました。現代、レガシーコードは避けられないことが多いでしょう。リファクタリングはいつも難しい+大変な仕事です。リファクタリングがズムーズに行うために、@searls氏がsutureというgemを作りました。このgemで9ステップでリファクタするという話です。詳細は以下のスライドです。

感想ですが、テストの無いコードをリファクタするときsutureはとても良いと思います。sutureの良い点は短いコードでカバレッジ100%にできますが、リファクタ後全部の確認コードを捨ててしまうので再度使えないようです。もしいつかリファクタしたいならもう一度suture書かないといけないということになります。複数回sutureコード書くならテストコードを書いた方が長期的に良いと思います。sutureコードからテストコードに自動生成機能があれば超うれしいです。

RubyインタプリタErlangで作った話 "ErRuby - Ruby on Erlang" by @johnlinvc

目的はRubyからErlangに訳します。Rubyはかなり複雑な言語ですからパーサーは超難しいそうです。現在、ロカール/インスタンス変数、メソッド定義・呼び出し、クラスと継承、ブロックとyieldが実装完了です。Boolean、Integer、String、Arrayの一部のメソッドもできました。さらに、Futureオブジェクトという機能を実験中です。

ソースコードはこちらです https://github.com/johnlinvc/erruby

String表現の話 "A Tale of Two String Representations" by @nirvdrum

2つのstring表現があります: RStringとRopeです。RStringは多分普通のstringで、mutableで、フラットな表現のに対し、Ropeはimmutableで、木構造で表現します。Ropeの表現のメリットは使用メモリが減少し、メタプログラミングができ、thread-safeです。現状はJRuby+Truffle & Graalで問題なく機能しています。

Rubyで作ったものの紹介

Rubyでコンテナを作る "Welcome to haconiwa - the (m)Ruby on Container" by @udzura

発表者はコンテナ技術を深く理解するために、独自コンテナをつくりました。haconiwaと呼ばれています。haconiwaの最初はCRubyで実装しましたが、syscallsの限界がありまして、結局全部mRubyで書き直しました。mRubyはシステムプログラミングに最適だそうです。

haconiwaのソースコード https://github.com/haconiwa/haconiwa

Docker上のキュー管理システム "Scalable job queue system built with Docker" by @k0kubun

Dockerを導入して、Docker用job queue systemがほしいというきっかけでbarbequeを作りました。barbequeはAmazon SQSと連携し、auto scalingも対応されるという素晴らしいツールです。

Rubyゲームボーイエミュレータを作る話 "Writing A Gameboy Emulator in Ruby" by @0xColby

ゲームボーイはCPU、メモリ、Picture Processing Unit、スクリーン、カートリッジというコンポネントからなり、各コンポネンの実装を示しました。最終的に全部結合してloopの中で回す感じです。Rubyはこういう用途ができるとは思わなかったです。

ソースコードはこちらです https://github.com/colby-swandale/waterfoul

"Game Development + Ruby = Happiness" by @amirrajan

発表者はA Dark Roomというゲーム、#1 AppStoreになったことあるゲームの開発者です。このゲームはiOSですが全てRubyで開発したそうです。RubyMotionを使ったそうです。発表者によりC#JavaScriptObjective-Cなどでゲーム開発するのははすごく大変でした。Rubyは簡潔でとても良いです。

スライドはこちらです slides.com

Big Data + 機械学習

BigQueryの紹介 "Exploring Big Data with rubygems.org Download Data" by @thagomizer

何のgemがダウンロード数が一番高いやMinitestまたはRspecどちらの方人気が高いなどという質問でrubygems.orgのデータを使って、BigQuery上で解析するという話です。BigQueryはSQLで、速い、スケール可能、十分な機能を持つという特徴があります。RubyでBigQueryを使うにはgoogle-cloud gemを使えばよいです。データ解析結果より、rspecよりminitestの方が人気だそうです。

スライドはこちらになります http://www.thagomizer.com/files/ruby_kaigi_2016.pdf

Data Analysis in Ruby with daru

Rubyでデータ解析するため、daruというツールを作りました。daruは1Dベクトル・2Dベクトルのデータ構造を持っていて、データの基本的な計算(平均など)とグラフ化ができます。さらに、daruはiruby notebook(ipython/jupyterのようなインタラクティブシェル)と他のRuby機械学習ライブラリを連携できます。デモとしてiruby notebook上にロジスティック回帰というアルゴリズムを実行されました。

発表者はこのツールを作ったとき、RubyでCバインディングがかなり面倒だとわかっていて、現在rubexを開発しています。rubexはPythonのCythonのような位置付けでしょう。

スライドはこちらです。

Rubyでの機械学習 "SciRuby Machine Learning Current Status and Future" by @mrkn

現在の機械学習でよく使われる言語といえばPythonでしょう。Pythonのscikit-learnというライブラリは機械学習の基盤となり、とても使いやすく他のライブラリと互換性があるということです。 Pythonで実際の機械学習ワークフロー全部できる状態になっています。それに対してはRubyはまだできない状況です。これから、SciRubyの発展はどうすべきか2つの方針を述べました。

  • Rubyでscikit-learnそのものを使えるようにする
    • JuliaからPythonのものを使える事例があるから
  • ゼロからscikit-learnのようなものを作る
    • これは辛い仕事
    • Cython-like systemが必要
      • 上の発表のrubexを完成する
    • 数値配列計算ライブラリが必要
      • 現在いくつ存在します(NMatrix、Numo::NArray、NumBuffer)が、使うものにはならない

感想:私はWebアプリケーションを作るとき、Rubyがメインですが、最近機械学習・深層学習の実装が増えてきて、やはりPythonはベストチョイスです。ライブラリの充実さは半端ないです。ベクトル・配列計算はNumPyがとても便利です。さらに、TensorFlowという深層学習フレームワークAPIPythonです。PythonよりRubyの方が好きですが、やはりRubyの現状は難しいですね。SciRuby、頑張ってください!応援します!

さいごに

ガラパゴスでは、Rubyistはもちろん、他の言語も挑戦したい方を絶賛募集しています。皆様の応募をお待ちしています。

RECRUIT | 株式会社ガラパゴス iPhone/iPad/Androidのスマートフォンアプリ開発