RubyKaigi 2016 の 2 日目に参加したので、そのメモです。
予習
途中で知ったのですが、RubyKaigi2016の予習(Day 2)というのがあるようです。
Door Open
- 早めに着いたのでメインホールでのんびりしていた。
- 開始前の待ち時間に少しの間「Surgical Refactors」というのが出ていたのは発表者のプロジェクターのテストっぽい感じだった。
Fearlessly Refactoring Legacy Ruby
- Fearlessly Refactoring Legacy Ruby - RubyKaigi 2016
- 自己紹介
- 発音が難しいので日本語でジュースさん
- スクリーンサイズ: 16x9, 4x3, Ruby3x3 なので 3x3
- early success と later success
- レガシーコードのリファクタリングの話
- refactor と legacy code という言葉の定義の確認
- Business Priority と Cost/Risk の2軸で New Features, Bug Fixes, Testing, Refactoring を分類
- Refactoring is hard to sell
- Refactors are scary
- 1. Refactoring Patterns
- リファクタリング Ruby Edition
- 2. Characterization Testing
- 3. A/B Testing / Experiments
- Development, Testing, Staging, Production 全てをいい感じにするツールがないので作った
- Talk-Driven Development
- https://github.com/testdouble/suture
- 9 Features : Plan, Cut, Record, Validate, Refactor, Verify, Compare, Fallback, Delete
- Bug Fix の例
- pure function は簡単だが状態を持つものは難しい
- データベース (sqlite3) に記録するの話
- Guilded Rose Kata
- データベースに保存した値と verify
- Coverage
- Refactoring
- 同じ挙動をする新しいメソッドを定義
- verify
- 間違った record を削除
- Custom Comparators
- Random seed の話
- configuration
- Development と Testing は良い感じにできた。
- Staging や Production を良い感じにするには?
- Compare:
call_both
- Fallback : Make change safe for users
-
fallback_on_error
: 新しい方でエラーが起きたら古い方を使う - Delete : Record のところで記録したデータと Suture 関連の追加したコードを削除
- ひこにゃん
- 質疑応答の前に CM
スポンサーセッション PIXTA
Fearlessly Refactoring Legacy Ruby の質疑応答
- 質問1 : 聞き取れず
- 使っている、使ってみてくださいみたいな回答
- 質問2,3 : 聞き取れず
- CI でも動いているとかなんとか
- 質問は日本語でも OK
- 質問4 : 新機能を追加するときには使えるか?
- 挙動が変わっていないのを確認するのに使えるとかいろいろ言っていたが聞き取れず
- 質問5 : develop yourself?
- 聞き取れず
- 質問6 (Martin 先生) : 聞き取れず
- 聞き取れず
- 質問7 : 聞き取れず
- 聞き取れず
- 日本語で質問8 : リファクタリングで発生したテストコードは残すべきか?
- 聞き取れず
- 質問9 : 聞き取れず
- グローバル変数とか副作用とかの話
全体的にセッションの英語は聞き取りやすかったのですが、メモを取りながらだと難しかったです。 質疑応答になるとスライドによる補助情報もないのでさらに厳しかったです。
Intermission
- 落し物案内
How to create bindings 2016
- How to create bindings 2016 - RubyKaigi 2016
- https://slide.rabbit-shocker.org/authors/kou/rubykaigi-2016/
- Rabbit 2.2.0
- Ruby をもっといろんな場面で使えるようにするため、バインディング開発者になりませんか
- 会場アンケート
- バインディング作ったことがある 20人ぐらい
- 今もメンテナンスしている 10人ぐらい
- バインディングを知らない 60人ぐらい
- 作ろうと思ったことがない 多い
- 最初に自動生成のデモ
- gi: GObject-Introspection
-
WebKit::WebView
で http://rubykaigi.org/2016 を表示してスクリーンショット (get_snapshot
) をとって別 window に表示していた。 - 拡張ライブラリの話
- libffi の話
- 自動生成がオススメ
- SWIG と GI の比較
- SWIG はビルド時に自動生成
- GI は実行時に自動生成
- SWIG の .i は各言語でメンテナンスが必要
- GI は共通のアノテーションをメンテナンス
- OSS Gate などの紹介
- 質疑応答
- 質問1: オブジェクトを渡す話
- スクリーンショットの例だと rcairo とかが良い感じに変換してくれる
- GI のアノテーションで指定している(?)
- 質問2: Mac で動くか
- Mac でも動く
- 質問3 (大林さん): GUI は登場人物が増えてトラブルシューティングが大変ではないか?
- 私ぐらいになれば大丈夫
- 質問4 (大林さん): SWIG は昔使ったことがあるが .i は共通ではないのか?
- 単純なケースだと共通でいけるが、結局現実的なものを作るときは各言語になる
- 質問5 (後藤さん?): 標準添付の fiddle と dl2 を使っていないのはなぜか?
- 使いにくいから
- 機能が足りない
- 質問6: GI は動的にバインディングが作られるということは大きいライブラリは読み込みに時間が掛かる?
- 実演
- (運営から割り込み: B が遅延しているので 10 分余裕ができた)
- パフォーマンスについて
- 質問7 (自分):
hello_message
が返す文字列のメモリ管理は? -
const char*
を返している、つまりメモリ管理はHello
側の債務 - 質問8 (ささださん): (メモを書いていたので聞いてなかった)
- ドキュメントを書けば動くようになっている
How DSL works on Ruby
- How DSL works on Ruby - RubyKaigi 2016
- http://www.slideshare.net/hsbt/how-dsl-works-on-ruby
- 大人気で椅子に座れなかったので通路に座って聞いていました。
- 自己紹介
- Rake : Make in Ruby
-
-j
オプションはあるが大多数のタスクは実行時間が変わらないだろう -
FileList
でファイルグロブやexclude
を扱える -
Rake::TestTask
でテスト実行用のタスクが簡単に作れる -
rdoc
用のタスクが昔はrake
の方に入っていたが今はrdoc
の方に入っている -
Minitest
,Test::Unit
用のRake::TestTask
だけ歴史的経緯でrake
に残っている -
Rake
は 0.9 から 10.0 に一気に上がった - SemVer
- rake は現在は https://github.com/ruby/rake が upstream
- rails が依存している gem がよく使われている gem だがその中でも少し使われている数が多い
- DSL の話
- いろいろな DSL の Pattern 紹介
- DSL の前提知識終わり、今までの知識で DSL が作れるはず
- 具体的な DSL の実装を見ていく
Rake.application.run
-
rakefile
,Rakefile
,Rakefile.rb
,rakefile.rb
に対応している - bundler が 2 で
Gemfile
の代わりにgemfile
がデフォルトになるという話があるらしい? rake -P
-
lib/rake/dsl_definition.rb
のRake::DSL
は短いのでみてみると良い -
Rake::Task
とRake::TaskManager
-
Capistrano::Application
はRake::Application
を継承しているので capistrano 3 以降は rake の拡張 -
Thor
を継承したクラスで DSL が使える -
Bundler::CLI
がThor
を継承したクラス - CM: minne
- Apple Pay 対応予定
- 関わってないけどラップ?
- Long live the Rake
- JRuby の互換性問題
-
Dir.chdir
するとsh
の挙動が変わるとか - Rake 11
- deprecated メッセージを出さずに
TaskManager#last_comment
を消したら問題が起きたので戻した話 -
hoe
gem から bundler のタスクを使うように書き換えた -
verbose
,deps
は時間がないので省略 - Rake 12
- コア数をとる処理に
sysctl
を使っているのをやめてEtc.nprocessors
(Ruby 2.2 以降依存) を使うようにしたい - コード減らしたい
-
class Object
汚染を減らしたい - 質疑応答
- 質問: DSL を触っているとどのクラスなのかどのインスタンスなのか悩むとか, 何か tips はないかいう話
- 僕も知りたい
- Ruby DSL book (と言っていたように聞こえたが Ruby DSL Handbook かも) をオススメ
- 既存の DSL を実装した gem を読む
Lunch Break
- 今日は http://agile.esm.co.jp がスポンサーの弁当でした。
- プログラミングElixirは一応持ってきていましたが、サイン会は列が長かったので諦めました。
Learn Programming Essence from Ruby patches
- Learn Programming Essence from Ruby patches - RubyKaigi 2016
- http://bit.ly/esm-ruby-kaigi-bento
- プログラミングの知識とは何か?
- 大学で学んだような知識と日々の仕事で必要な知識は異なる
- どうやって学ぶか
- 本を読むなど
- Ruby のパッチを読んでみる
- なぜパッチなのか?
- 短い、redmine の issue などに説明がある、description などをみて自分が理解できるパッチを選べる
- 本で書かれているような知識と結びつく
- Asakusa.rb Meetup での経験から
- パフォーマンス改善などのパッチは難しい
- オススメの情報源
- Ruby Under a Microscope, Rubyのしくみ
- Ruby 本体の doc/extension.rdoc
- (冒頭のファイル名が間違っているという指摘があったので、すぐに修正された。)
- yotii23’s slide : Walking around the ruby forest more deeply
- Hash tables with open addressing を読む
-
st_table
の説明 - 新しい実装の説明
- 質疑応答
- 質問1: 他のことをしていたので聞き取れず
- 質問2 (joker1007 さん): 勉強になりそうなパッチを探す方法は?
- 直感で
- 面白そうだと思える変更かなど
- 質問3: 他に見ているプロジェクトは?
- rails, github で watch しているものなど
Ruby Reference Manual 2016 Autumn
- Ruby Reference Manual 2016 Autumn - RubyKaigi 2016
- 自己紹介
- るりま != るびま
- るりま = Ruby Reference Manual
- るびま = Rubyist Magazine
- どちらも「日本 Ruby の会」のサポートを受けている
- 2006-08-27: プロジェクト開始 (青木さん)
- 2009-01-31: Ruby 1.9.1 リリース
- 2010-08-18: Ruby 1.9.2 リリース
- 2011-09-01: 最低限のマニュアルが揃ったのでメンテナンスフェーズ開始
- 2011-10-31: Ruby 1.9.3 リリース
- 2013-02-24: Ruby 2.0.0 リリース
- 2013-05-30: 前回の発表
- 2013-06-02: 青木さんのドメインの svn サーバーから GitHub に移動
- 2013-12-25: Ruby 2.1.0 リリース
- 2014-12-25: Ruby 2.2.0 リリース
- 2015-12-25: Ruby 2.3.0 リリース
- 最新の状態にほぼ追従
- できてない部分はできていないままだが、更新できている部分は更新についていけているはず
- RubyKaigi 2013 から
- docs.ruby-lang.org でホスティング
- IIJ 提供、管理者は @hsbt さん
- Ruby の更新への追従は手作業
- NEWS に載らないような変更には弱い
- 例えば rbconfig/sizeof の追加
- RDoc との関係
- RDoc とは、Ruby 本体のコメントに埋め込まれているドキュメント
- 相互に同期したいができていない
- RDoc へのリンクはできている
- 最近の変更
- Web 検索で古いドキュメントがでてくる対策として
link rel="canonical"
をつけるようになった - NEWS ファイルを翻訳したものが入った
-
open_search_description.xml
がおかしくなっていたのでを修正した - Contributors
- rurema/bitclust GitHub のアイコンがひっぱれたのは 18 名、コミットは 20 名
- rurema/doctree はもっと多い (具体的な数はメモし損ねた)
- のべ 100 名以上が協力してくれている
- Ruby 2.4.0
- Unify Fixnum and Bignum to Integer
- bundled gem が増えた
- rake, rubygems などのすでにドキュメントが書かれていて日本語のまとまった情報が少ないものは残したい
- tk が外れるとドキュメントなしが大幅に減る
- 開発ツール (bitclust) の話
- CHM 生成が壊れている
- Windows 自体が CHM を捨てる流れなので捨てたい
- 修正の pull request がきているのでその人に任せたい
- 単一ファイルはあった方が良いので EPUB や PDF の生成を考えている
- 自動化について
- 更新の自動通知
- パッケージのリリースの自動化
- CI の仕組みの改善
- ドキュメントの生成が成功することぐらいしか確認していないので、 heroku にアップロードして見た目の確認ができるとかできるといいかも
- RDoc との関連
- 相互同期したい
- i18n モジュールというのが追加されたようなので何か使えるかも
- Contribute!
- 使ってください! https://docs.ruby-lang.org/ja/
- 使っていて気づいたことがあったら issue を立ててください
- twitter やブログで愚痴られても気づけない
- 気づいたもので直せそうであれば pull request にしてもらえると merge を押すだけで良いので助かります
- typo の修正などからお気軽にどうぞ
- 修正のベースがあるだけでも嬉しいです
- 記法がわからなければ issue で報告してくれるだけでも良いです
- BitClust の開発について
- EPUB, PDF 生成については EPUB を直接生成しようとしていたのを捨てて、Re:VIEW を経由すると良いのではないかという話を昨晩の懇親会で得たのでそうする予定
- SEO (Search Engine Optimization)
- 一緒に Ruby のドキュメントを良くしていきましょう
- 質疑応答
- 質問1 (Rails Guide のやすかわさん): Dash の docset もあると喜ばれる
- サードパーティで作ってくれている人はいる
- Rails Guide では EPUB, PDF, docset をバンドルしたものを達人出版会 などで売っている (Web は無料でも売れている) (後で確認してみましたが、売っているものに docset が入っているかどうかは確認できず)
- 質問2: 以前質問された時に日本語しかドキュメントしかないものがあった。
- まず英語にそろえたいが、具体的には何も動いていない。
- 質問3: pull request などで修正してもらって反映されるのはどのくらいたってから?
- https://docs.ruby-lang.org/ja/ に反映されるのは一日一回
- 告知: OSS 開発支援サービス, エンジニア募集中
- 2016-09-11(日) 13:00-17:00 第74回 Ruby関西 勉強会
Afternoon Break
- 終わった後、しばらく okkez さんのところに話にくる人の話を一緒に聞いていた。
- Dash 版の作者も現れて、 Re:VIEW が docset も生成できるという勘違いを受けていたという話があった。
- (念のため後で Re:VIEW を確認してみたけど docset はなかった)
Pwrake: Distributed Workflow Engine based on Rake
- Pwrake: Distributed Workflow Engine based on Rake - RubyKaigi 2016
- 立ち話が長引いて自己紹介の部分は聞けなかった
- https://github.com/ruby-numo/narray
- https://github.com/masa16/pwrake
- Background: 科学ワークフロー
- ワークフロー定義言語
- DAX (Pegasus ワークフローシステム)
- Swift (Apple の言語とは別物)
- GXP Make
- 他のことをしていたので聞いていなかった
- Rake はワークフロー記述言語として強力
- 結局るりま関連の作業をしていてほとんど聞いていなかった。
るりま関連作業
- 世の中のNEWS翻訳家のみなさまが今英語で残ってるとこやってくれないかなー。 というツイートをみて NEWS 関連をみたりしていた。
Modern Black Mages Fighting in the Real World
- Modern Black Mages Fighting in the Real World - RubyKaigi 2016
- 混んでいてまた通路に座っていた。
- https://rubygems.org/gems/msgpack-inspect という gem をリリースしたばっかり
- Fluentd とは?
- Fluentd v0.14
- ロゴが変わった
- 線で構成されていて白飛びして目立たないことがあるので変わった
- クラス階層を整理した
-
extend
はsingleton_class.include
と同じ - Fluentd v0.12 の
emit
とかformat_stream
とかの呼び出し関係の説明 - Fluentd v0.12 の出力の
pop
とかwrite
とかの説明 - サードパーティのプラグインのメソッドを直接コアが呼び出していたので、ちょっと処理を挟みたいということがやりにくい
- 呼び出し方が複雑でコールスタックが複雑
- Fluentd v0.14
Fluent::Plugin::Output
で整理した - 呼び出しが行ったり来たりしなくなった
- プラグインが実装するメソッドを分離した
- メソッドが余計なことをしないようになった
- コールスタックがシンプルで一本線になった
- 既存の v0.12 のプラグインは?
- 可能な限り何の変更もなく動く必要がある
- 互換レイヤーが二階建てになっている理由
- トップレベルでの名前衝突をできるだけ避けたい
- Compat Layer: プラグインが定義しているメソッドに応じて処理を変える
-
format
を呼ぶだけが一番簡単な例 -
format_stream
が定義されているとそっちを呼ばないといけない -
super
対応も必要 - 初期のサンプルコードが良くない実装だった。サンプルコードには気をつけましょう
-
emit
が定義されているとさらにそれを呼ばないといけない - さらにこっちも
super
対応も必要 -
emit
は値を返さないで@buffer.emit
を呼ぶので、その対応が必要 -
chunk.extend
をするためにプラグインをextend
する - 似たような互換レイヤーがそれぞれの Output プラグインの親にある
- プラグインのライフサイクル
- v0.12 プラグインでは
super
は呼ばなくても良かったので、呼んでいないプラグインもある -
super
を呼ばせる黒魔術としてModule#prepend
CallSuperMixin
- まず
super
を呼ぶ、super
が呼ばれていなかったら親を辿って最初に定義されているクラスのメソッドにself
をbind
しなおして呼び出す - その先は
super
がちゃんと呼ばれるのでめでたし - テストの問題
- テストの中で
singleton_class
にメソッド定義しているとprepend
が負けて上書きできない - 何よりも強い何かが必要
-
singleton_class
にprepend
して解決 - fluentd のプラグインが古いとこういう黒魔術が使われるので、バージョンアップ推奨
- ユーザーに不利益を被らせないために我々は何でもやるべきだ
- 質疑応答
- 質問1: あの複雑な呼び出し関係はどうやってできたのか?
- 図はかいた
- ブギーボードにかいた
- 質問2: 後方互換性の話
- 以前に互換性を壊してあげようという構想があったが、その後、プラグインが増えて全書き換えは無理ということになった
- 言語のコミュニティを超えてユーザーが増えた
- 特に運用監視の人たちには互換性が重要だった
- 質問3 (Yugui さん?): 逆方向の互換性は?
- 機能が増えたので不可能です
- v0.12 向けのリリースをしてから v0.14 向けリリースをしてください
- 質問4: パフォーマンスの問題
- 読み込み時や 1 分に 1 回呼ばれるような部分でしかメタプログラミングはしていないので、継承の階層が増えるだけでパフォーマンスには影響はないはず
- 質問5: メモを取っていたので聞き取れず
super
が呼ばれていなかったら、の話でやっていた黒魔術の bind
しなおして呼び出すというのは、たぶん以下のような感じです。
class C1
def foo
p :C1
end
end
class C2 < C1
def foo
# super が呼ばれていない
end
end
C1.instance_method(:foo).bind(C2.new).call
Rails 関連で class
が上書きされているオブジェクトで本当のクラスを知りたかった時に rails console
で Kernel.instance_method(:class).bind(obj).call
のようなことをしたことがあったぐらいだったので、実運用のコードでこういうことが行われることがあるというのに驚きました。
SciRuby Machine Learning Current Status and Future
- SciRuby Machine Learning Current Status and Future - RubyKaigi 2016
- https://speakerdeck.com/mrkn/sciruby-machine-learning-current-status-and-future
- enumerable-statistics gem
- 機械学習とその前後のワークフロー
- Ruby はほぼ何もできない
- Python はできるので、みんな Python を使う
- その状況を変えたい
- 一番重要なこと: SciRuby の開発を手伝ってください、http://sciruby-slack.herokuapp.com/
- なぜ機械学習を使うのか?
- 機械学習でできること
- 機械学習で扱う問題
- 教師あり学習: 分類、回帰
- 教師なし学習: グループ分け、分布推定、次元削減
- Reinforcement learning
- 3 種類全部 Ruby でできるようになると嬉しいが、今回の話は教師あり学習について
- liblinear-ruby gem (C++ で書かれたライブラリのラッパー)
- rb-libsvm gem (libsvm のラッパー)
- decisiontree gem (decision tree = 決定木)
- 名前の紹介だけ: ai4r gem, classifier-reborn gem, data_mining gem, etc.
- 既存の gem はデータの渡し方も API も異なる
- 実世界のデータ
- Scikit-learn
- 共通の形式で訓練データを用意できる
- interface も互換性がある
- Scikit-learn は機械学習の理想的なフレームワークだと思う
- 機械学習の SciRuby の未来
- scikit-learn そのものを使う : julia 言語では PyCall.jl, ScikitLearn.jl
- 同様に pycall gem, scikit-learn gem を作れば良い
- scikit-learn のようなものを実装する : とても大変
- 数値配列 :
NMatrix
,Numo::NArray
,NumBuffer
-
NMatrix
: 遅い、インストールが難しい -
Numo::NArray
: 疎行列に対応していない、新しすぎるので対応しているライブラリが少ない -
NumBuffer
: 発表者が開発者、手伝い募集 -
NMatrix
とNumo::NArray
の互換性問題 - SciRuby JP
- 成果物: Tutorials, Installation, Survey, Visualization, Other Languages
- SciRuby は英語推奨だが日本語OK
- 機械学習に限らず contribution 募集
- http://sciruby-slack.herokuapp.com/
- 質疑応答
- 質問1: 良い点を宣伝した方が良いのではないか
- scikit-learn がベストだと思っている
- 質問2: テストの話
- scikit-learn でどうやっているかは知らない
- 質問3: pycall or SciRuby, 着地点は?
- まずは pycall で 2,3 年でみんな Python から julia に乗り換えているだろうと予想しているので、そうなったら Ruby から julia を呼び出すようにするのが良いのではないか
- 質問4 (マーティンさん): Ruby の強み (メタプログラミングとか) を活かせないか?
- 考えたことがなかった
- 質問5: 今 Ruby が向いていない、ライブラリが足りないからというのがあったが、言語自体は?
- Ruby 言語自体が向いていないということはない
- julia は数値ベクトルなどを言語がサポートしているので、数値計算をやりやすい、LLVM に丸投げでパフォーマンスも良い
よく知らない分野なので、聞いていても良くわからない話もあり、あまりメモも取れなかった。
Drinkup at RubyKaigi 2016 by Misoca Inc.
Drinkup は Agileware の方も申し込みは間に合っていたのですが、後からの Misoca の方が会場が近くて良さそうだと思って、Misoca の方に申し込んで、キャンセル待ちの出ていた Agileware の方はキャンセルして、Misoca の方に参加しました。
Misoca の Drinkup では https://twitter.com/toyoshi/status/774227373944254465 の写真のように doorkeeper のアカウントから取得したアイコンのステッカーを用意してくれていました。 便利そうなのでシールとしては貼らずに今後もイベントに参加した時の名札に入れるのが良さそうかも、と思いました。
今回はいろんな人といろんな話ができました。
Unbundle tk が気になっていたので hsbt さんにきいたところ、もともとリリースマネージャーの naruse さんとしては Ruby/Tk は外すだけで bundled gem にする予定はなかったのに、nobu さんが gems/bundled_gems
に追加してしまっていたのを、改めて削除したという流れだったそうです。
Gem化issue のタイトルの方が印象が強かったので勘違いしていたのですが、もともとは Unbundle ext/tk というタイトルの issue だったので、そういう意図だったようです。
記録として残しておきたいと思った話としては、以上のようなことがありました。
他には
- SlideShare は LinkedIn になって SlideShare だけのアカウントの作成ができなくなっているらしい
- SpeakerDeck は過去に問い合わせた時に API 対応の予定はないという話だったらしい
- 通訳の関係で事前に資料を渡す必要があったので slide.rabbit-shocker.org にあげて PDF をダウンロードしてもらったらしい
とかいう話もしていました。
最後は謎のジャンプ一本締めでした。
Togetter まとめ
資料も反響もすべてチェック! 京都で3倍広くなった #RubyKaigi 2016 まとめまとめ - Togetterまとめ というのができていたので個別のまとめへのリンクは省略しました。
まとめ
今日は AC アダプターを忘れていて貸してもらったり (ありがとうございました)、日本語のセッションにいたのに他の作業をしていてあまり聞けていなかったりしたこともありましたが、 bindings や黒魔術の話のようにある程度は知っているけど実際にはほぼ使ったことない話や、 ある程度関わっている るりま (Ruby Reference Manual) の話がしっかり聞けたのが良かったです。
また、作業中は話をちゃんと聞けなかったという問題はあったものの、いくつか pull request を出したり issue を書いたりできたのも良かったです。