はじめに
こんにちは、@vanhuyzです。 ガラパゴスのサーバーサイドではRubyがメインですから、是非一度もRuby会議参加したいと思い、今年2016年度のRuby会議@京都に参りました。 初参加で緊張ではありますが、楽しかったです。
会場の様子
会場の外見
せっかく参加したので、聴いた内容をまとめていきたいと思います。
Rubyの未来について
基調講演 Ruby3の型について “Ruby3 Typing” by @Matz
Ruby3の目標は:Soft Typing、 Ruby3x3(3倍速く)とConcurrencyです。Soft Typingというのは現在RubyのDuck Typingを継承し、型チェックを加えるというアイデアです。要はプログラミングを実行する前に、型推論して型チェックする仕組みです。また、型情報をデータベース化するという考えもありました。これで、動的型の柔軟性を保つことができ、静的型のようにコード自体がドキュメンテーションになるということです。まだふわふわではありますが、Ruby3楽しみですね!ちなみに、Ruby3いつ来るかというとMatz氏自身もまだわからなく、Tokyo Olympicsまで目標したいらしいです。
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(並列処理)
ConcurrencyはRubyの弱点(?)の一つなので、今年はconcurrencyについてたくさんのセッションがありました。
始めに、@ko1氏はguildモデルを提案しました。主にmutableなオブジェクトを管理する仕組みです。もちろんimmutableなオブジェクトはguildの間にシェアできます。Guild間の伝達(コピー・移動)はチャネル上に行います。Guildの詳細は公開スライドA proposal of new concurrency model for Ruby 3をご覧ください。
次に、@anildigital氏によりいろんな言語のconcurrencyモデルを比較しました。Java、 Clojure、 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#、 JavaScript、 Objective-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という深層学習フレームワークのAPIもPythonです。PythonよりRubyの方が好きですが、やはりRubyの現状は難しいですね。SciRuby、頑張ってください!応援します!