RubyKaigi2015レポート
メリークリスマス!
技術開発部のおおはらです。
本日12月25日はクリスマスでもありますが、Ruby2.3のリリース日でもあります!
毎年クリスマスにRubyはバージョンアップリリースを続けており、
開発や利用が盛んであることはRubyエンジニアにとって喜ばしい限りです。
ちなみに私が開発を担当しているコレックはRuby on Railsを使用しています。
さて、先日開催されたRubyKaigi2015に参加してきましたので、そのレポートをお送りしたいと思います。
RubyKaigi2015
- 日付
- 2015-12-11..2015-12-13
- 場所
- ベルサール汐留(築地市場の近く)
- 講演一覧
- http://rubykaigi.org/2015/schedule
- 録画された講演を視聴できます
- 資料
1日目
Ruby3 challenges
- Yukihiro "Matz" Matsumotoさん(rubyの作者)の基調講演
- Rubyコミュニティのスローガン「MINASWAN」の紹介
- Ruby2.3.0の新機能の紹介
- did_you_mean gemがデフォルトでバンドルされる
- タイポした時に正しいと思われる変数名やメソッド名などを教えてくれる
- grep_vメソッド
- パターンにマッチしないものを集める(grep -v)
- digメソッド
- 深い階層の要素(例:array[0][1][2])をエラー無く取得
- indented here document
sql = <<~SQL
とするとインデントの浅いところに合わせて先頭を削除
- safe navigation operator(ぼっち演算子) &.
&.
が膝を抱えて座って、石を寂しそうにながめている人に見えることからぼっち演算子と命名。面白くて覚えやすい!user && user.account
がuser&.account
のように簡潔に書ける。 railsのtry!と同じ。
- Ruby3でStringがimmutableになることへの移行パス(マジックコメント)
- did_you_mean gemがデフォルトでバンドルされる
- Ruby3の進捗
- Ruby2.0と比較して3倍の速度向上を目標
- そのためにconcurrency(並行性)やJITコンパイラの導入を検討中
- http://togetter.com/li/911263
Compiling Ruby scripts
- 笹田耕一さん。Rubyコミッタ。Heroku社でのMatzチームの一員。
- 性能改善のためにRubyスクリプトの実行前コンパイルを検討中
- 作成したISeq(InstructionSequence)シリアライザ、デシリアライザの効果
- 高速起動
- メモリ削減
- コンパイル済みコードを別プロセスで共有できる
- Ruby2.3の
sample/iseq_load.rb
で試せる - 2015_RubyKaigi2015.pdf
Saving people from typos
- Yuki Nishijimaさん。Pivotal Labs社。kaminari gemのメンテナ
- Ruby2.3から同梱されるようになったdid_you_mean gemの仕組みの解説
- spell checkerとmonkey patchで構成
- spell checker
- dictionary, control mechanism, optimizationで構成
- dictionary
Symbol.all_symbols
などで辞書を作成、エラータイプで辞書を分類
- control mechanism
- ミスタイプをLevenshtein距離、ミススペルをJaro-Winkler距離+Prefix bonuxで評価
- monkey patch
- NameError#to_sをオーバーライドして出力
- 例外が発生した場所を特定するためにRuby2.3以前はC拡張を使っていたが、Ruby2.3から追加されたNameError#receiverが使えるようになった
- http://togetter.com/li/911325
Time flies like an arrow; Fruit flies like a banana: Parsers for Great Good
- Hsing-Hui Hsuさん。CareZone社のエンジニア
- Parserの話。
- キーワード
- 構文木,Lexer, Parser, Compiler, チョムスキー階層, 正則文法
- https://speakerdeck.com/elffers/time-flies-like-an-arrow-fruit-flies-like-a-banana-parsers-for-great-good-1
Fast Metaprogramming with Truffle
- Kevin Menardさん。Oracle社のエンジニア。
- JRubyとTruffleを使うとメタプログラミングによる実行効率が落ちない
- 例:method_missing の実行効率が落ちない
- http://togetter.com/li/911356
High Performance Template Engine: Guide to optimize your Ruby code
- Kohei Suzukiさん、Takashi Kokubunさん。両名ともクックパッド社。
- Suzukiさんはfamlテンプレートエンジンを作成
- benchmark-ips gemでベンチマークし、stackprof, rblineprof gemでプロファイリング、コード改善
- slimテンプレートエンジンと同じバックエンドのtempleを使用
- クックパッド社でfamlを本番投入している
- KokubunさんはHamlitテンプレートエンジンを作成
- stringを先につなげて高速化
- いらない機能・オプションを削って高速化
- Famlより高速だが互換性を一部捨てた
- Q.同じ会社の同じ部署にいるなら、統合して互換性を失わないモードをオプションで提供しないのはなぜか
- A. Hamlitは自分の勉強のために作りたかったから。作ったついでにベンチマークで勝ちたかった。
- https://speakerdeck.com/k0kubun/high-performance-template-engine
TRICK 2015: The second Transcendental Ruby Imbroglio Contest for RubyKaigi
- 第二回 超絶技巧 Ruby 意味不明コンテストの結果発表
- ビジュアル的にはこれがすごかった。下記のとおりに実行すると手品が見られます。
- http://www.slideshare.net/mametter/trick2015-results
2日目
Keynote
- KOSAKI Motohiroさん。Rubyコミッタ、Linuxカーネルコミッタ。
- Linuxデバッグツールの紹介
- Ftrace
- Linuxのイベントをトレース
- Perf tools(パフォーマンスツール群)
- perf top 実行中のプロセスの関数ごとのtop
- perf trace 全プロセスが呼んだシステムコールを記録
- System Tap
- デバッグスクリプト言語
- 言語仕様があまり良くない(loopがないなど)
- CとRubyでシステムコールが取れる
- Ftrace
- http://togetter.com/li/911612
The history of testing framework in Ruby
- Kouhei Sutouさん。クリアコード社の代表。
- /¥Atest.+unit¥z/iにマッチするtest unitの違いがわかるようになる話
- Ruby1.3
- testsupp
- Ruby1.4
- RubyUnit
- Ruby1.6
- Lapidary
- Test::Unit(RubyUnit + Lapidary)
- Ruby1.8
- Test::Unit
- rubyが標準でバンドル。require 'test/unit'することからtest/unitとも表現される
- メンテナが交代したが、test/unitが複雑でメンテできなくなった
- Test::Unit
- Ruby1.9
- Rubyはtest/unitをバンドルしなくなった
- test-unit gemとしてリリース(メンテナがSutouさん)
- minitest
- 作者はtest/unitのメンテナ)
- Ruby開発者がminitestのラッパーとして新しくtest/unitを作成してrubyにバンドル
- Rubyはtest/unitをバンドルしなくなった
- Ruby2.1
- minitest5で互換性のない変更が入った
- ruby自身のテストにはminitest4を使用
- ユーザには最新のminitestを提供
- Ruby2.2
- minitest5をバンドル
- 再びtest-unit gemをバンドル(for user)
- ruby自身のテストにはフォークしたminitest4とtest/unitを使う
- http://slide.rabbit-shocker.org/authors/kou/rubykaigi-2015/
Turbo Rails with Rust
- Yehuda Katzさん(Rustコミッタ)、Godfrey Chanさん(Railsコミッタ)。
- Rust(プログラミング言語)でnative extensionを作りRailsを高速化した話。
- https://speakerdeck.com/chancancode/turbo-rails-in-rust
The worst Ruby codes I've seen in my life
- Fernando Hamasaki de Amorimさん。Locaweb社のエンジニア。
- 今までに出会った酷いコードの紹介
- if文の構造が複雑
- 語順が違うメソッド
- 巨大なクラス
- インスタンスが新たに自分のインスタンスを作る(Inception Pattern)
- http://www.slideshare.net/Prodis/the-worst-ruby-codes-ive-seen-in-my-life-rubykaigi-2015
Ruby for one day game programming camp for beginners
- Ippei Obayashiさん。京大マイコンクラブのメンバー。東北大助教授。
- 京大マイコンクラブの新入生歓迎イベントとして1日ゲームプログラミングを開催
- プログラミング初心者である参加者の8割ほどが、動くゲームを完成
- 成功の原因を考察
- 参加者と同数のクラブのメンバーがマンツーマンで教えた
- 1日という締め切りがあること
- できることの見積がしやすい
- 型を教えない、グローバル変数で頑張る
- インストールを簡単にする工夫(ゲームのスターターキット)
- http://togetter.com/li/911699
Ruby meets Go
- Masaki Matsushitaさん。Rubyコミッタ。
- Go 1.5からのc-sharedビルドモード(cgo)
- Go関数をRubyで使う工夫
- 拡張ライブラリをGoとCで書く
- http://www.slideshare.net/td-nttcom/ruby-meets-go
Building CLI Apps for Everyone
- Terence Leeさん(Heroku社、Rubyコミッタ、bundler gem作者)、zzakさん(Rubyコミッタ)
- cliツールをmrubyで作ると環境に依存せずに実行できて便利という話
- デメリットはrubygemsを使えないこと(mrbgemsを使う)
- mruby-cliがオススメ
- https://speakerdeck.com/zzak/rubykaigi2015-building-cli-apps-for-everyone
making robot with mruby
- Yurie Yamaneさん。mrubyist。ET(Embedded Technology)ロボコンのスタッフ。
- TOPPERSというリアルタイムOSを搭載したロボット
- バランスをとるプログラムをmrubyで実装
- http://www.slideshare.net/yamanekko/rubykaigi2015-making-robotswithmruby
LT
Update Early, Update Often
Automating View Internationalization in Ruby on Rails
- Rails2から3に変わるときにデフォルトでhメソッド(html_escape)が実行されるのと同じように、I18nのtメソッドやlメソッドがデフォルトで実行されても良いのでは?という提案
A new testing framework Rgot
- Go言語のテストの書き方をRubyでもできる
- テスト思想に関して、Rubyはアサート指向、Goはエラーログ指向
- A New Testing Framework Rgot // Speaker Deck
Building an Unbreakable MRI-based Embedded Computer Appliance
- Raspberry Pi 2,Sinatraで作ったBee Exchangeという医療用マイクロサーバーの紹介
- 弊社エンジニアがRubyKaigiに登壇、新型Beeエクスチェンジを発表! | THE 3BEES POST
Do you trust that certificate?
- おすすめ書籍 『暗号技術入門 第3版 秘密の国のアリス』
- 接続先の証明書が新しいもの変わった時に、Webアプリで対応しないとエラーが起きた話
- ActiveMerchant内でモンキーパッチして対応
- Do you trust that certificate?
How I debugged debugger
- byebug抜けた後にアプリ遅い問題
- byebugをデバッグするためにgdbを使用
- How I debugged debugger #RubyKaigi 2015 // Speaker Deck
Padrino Travel Guide
- フルスタックWebアプリフレームワークであり、SinatraプラグインでもあるPadrinoの紹介
- dwangoの着メロやアニメロミックスで運用
- Padrino Travel Guide / Numb さん - ニコナレ
What I learned by implementing a Ruby VM in Erlang
- 並列化を持ち込むためにErlangでErRubyを作成中
- What I learned by implementing a Ruby VM in Erlang // Speaker Deck
Rubygemsで作るお手軽データ分析基盤 〜あるいは 私はどうやって他人の褌で相撲を取ったか〜
- gem選びの基準はシンプル、読みやすい、プルリクの送りやすさ
- プルリクを送る時に、自分たち固有の機能か、汎用な機能かを切り分けないとマージされにくい
Rationalを最適化してみた
- Ruby開発プロジェクト助成金で遅かったRational(有理数)を最適化した
- Rationalだけだと以前の3倍速くなった
- Rationalを最適化してみた / tadd さん - ニコナレ
The Mythical Creatures of Summer of Code
- Rails Girls Summer of Codeの紹介
3日目
Writing web application in Ruby
- youchanさん。ユビレジ社のエンジニア。
- フロントエンドをRubyで書くためのライブラリHyaliteを作った話
- RubyをJavaScriptに変換するOpalを内部で使用
- React.js風に書けるようにVirtual Domを実装
- http://rubykaigi.youchan.org/
- このスライドもHyaliteで作成(HTMLソースに注目)
- RubyKaigiのあとがき(Hyaliteの話です) - Qiita
Refinements - the Worst Feature You Ever Loved
- Paolo Perrottaさん。Metaprogramming Rubyの著者。
- Ruby2.1から正式に導入されたRefinementsの解説
- モンキーパッチは便利だが影響範囲が大きい。その範囲を制限するのがRefinements。
- あるmodule内で、拡張したいクラスをrefineの引数として定義し、usingキーワードを記述したレキシカルスコープでのみ有効となる
module A
refine String do
def shout
upcase + "!"
end
end
end
Class C
using A
"hello".shout # => "HELLO!"
end
end
C.class_eval do
"hello".shout # => NoMethodError
end
Discussion on Thread between version 1.8.6 and 2.2.3
- Mayumi EMORIさん。
- http://jishin.net/ では1センサーにつき1スレッドが通信。1プロセスあたり100スレッドで、100プロセスが動作(計10000スレッド)。
- メインスレッドが子スレッドのstatus(run,sleep)を監視したかったが、状態を返さないことがある
- 子スレッドでforループが重なるときや同時に例外が起きた時にstuckする
- Ruby1.8とRuby2.2.3でベンチマーク
- forループのベンチマークでは、2.2.3の方が実行回数は同じなのにCPU使用率が上がった
- 例外のベンチマークでは、2.2.3の方がメモリは減った
- スレッドをいっぱい立ててみた時のお話。10000スレッドでRubyはどうなるか? #rubykaigi #rubykaigiB - Togetterまとめ
Plugin-based software design with Ruby and RubyGems
- Sadayuki Furuhashiさん。トレジャーデータ社の設立者。Fluentdの作者。
- Fluentd
- ログの集約ツール
- RubyGems.orgのgemを使ったプラグインベースのアーキテクチャ
- Embulk
- CSVなどのデータ変換・投入ツール
- RubyGems.orgのgemとJRubyを使ったプラグインベースのアーキテクチャ
- 課題
- Ruby VMのバージョン衝突
- http://www.slideshare.net/frsyuki/pluginbased-software-design-with-ruby-and-rubygems
Request and Response
- Aaron Pattersonさん。Ruby,Rails,Rackのコミッタ。講演は日本語(すごい)
- Railsではリクエストをパースするために数十のrack middlewareを呼び出している
- 開発環境高速化のためにhttp2を使えるライブラリを書いてみた
- Rack3ではAPIが多分変わる
- http://togetter.com/li/912368
Actor, Thread and me
- Masatoshi SEKIさん。Rubyコミッタ。
- アクターモデルのおさらい
- 要素としては、アクター、メッセージ、エーテル(メッセージングシステム)
- アクターは他のアクターにメッセージを送る。自分の都合の良い時に自分宛てのメッセージを受け取る
- アクターが返事待ちになってシステムが止まることがある
- https://speakerdeck.com/m_seki/actor-thread-and-me-rubykaigi2015
Keynote
- Evan Phoenixさん。Ruby Centralの代表。Rubinius, Pumaの作者
- Ruby3をRuby2の3倍速くするためにはJITコンパイラが必要
- 動的言語のパフォーマンスについて調査
- Self - Wikipedia
- Strongtalk - Wikipedia, the free encyclopedia
- Smalltalkに静的型付け入れたもの
- V8(JavaScript engine)
- Ruby coreをLLVMを使ったコードに置き換えていこう
- http://togetter.com/li/912454
初めてRubyKaigiに参加したのですが、今年はRuby3リリースに向けてどのように高速化していくか、という話題が多かったです。
Rubyそのものの実装の話が多かったので、C言語未経験の自分にとっては少し難解な部分もありました。
Rubyのカンファレンスではありますが、Ruby以外の言語や設計、テスト手法などに触れることができ、幅広く勉強できたと思います。
来年は9月8日~10日に京都国際会館で開催されるようなので今から楽しみです!