=========================================
RubyKaigi2016とは?
日本で開催されているRubyコミュニティ主催のオブジェクト指向プログラミング言語Rubyに関する年次イベントである。
by wikipedia
Rubiestが世界中から集まってくるイベントです。
今日はその2日目です。
その中で、私が聞いた講演をまとめてみました。
メモのままのところもあるので悪しからず。。
Fearlessly Refactoring Legacy Ruby by Justin Searls
本日の基調講演
以下は講演内容のまとめ(公式より)を、Google翻訳したものです。
最近まで、私たちは「レガシーRuby」についてあまり話をしませんでした。しかし、今日、非常に多くの企業がRubyの上でそのレガシーコードは避けられない依存しています。
コードはハード-理解しているとき、私たちは私たちの変更が静かに何かを破損する可能性が恐れています。この恐怖はさらに難しく、将来の変更を行う、コードの設計を改善するための勇気を侵食します。
私たちはRubyの柔軟性と実績のあるリファクタリング技術を組み合わせる場合は、徐々に私たちのデザインを改善しながら、私たちは安全に機能を追加することができます。
本講演では、恐れることなく、レガシーコードをリファクタリングするためのプロセスで参加者を装備するコード解析、テスト、およびオブジェクト指向設計に描画されます。
レガシーなコードを恐れずにリファクタリングしよう!
リファクタリングする理由は?
-> お金にならない。理由づけが難しい
-> どうしてもビジネス優先になる
-> しかもリファクタリングは時間がかかる。お金もかかる。
-> ビジネスには企画・開発・テストが含まれている。
-> リファクタリングをビジネスにもっていきたい。
-> gemで解決しよう!
Suture というgemを作った
テストコードにsutureをはさむ
-> Errorの中にnext action(次こうしたらいいよ)が出力される
-> 入出力テストが自動化
-> リファクタしながらテストをする
=> safelyに、simpleに!
Make refactor great for the first time
pure function
99 Bottles of OOP
TDD = Talk driven development
suture is ready to use!
[個人的な感想]
絵文字いっぱいでわかりやすく、英語も聞き取りやすかった。
ひこにゃんがでてきました。かわいい。
How to create bindings 2016 by Kouhei Sutou
ClearCodeの方
以下は講演内容のまとめ(公式より)を、Google翻訳したものです。
本講演では、CライブラリのRubyのバインディングを作成する方法について説明します。私は、 Rubyのバインディングの開発者を増やすことをお勧めします。あなたはRubyからCライブラリを使用して、および/またはRuby以上の例を使用することに興味がある場合は、この話がお手伝いします。
本講演では次のトピックについて説明します。
*メソッドのリストは、 CライブラリのRubyのバインディングを作成します。
*各メソッドの小さな例。
*長所と、各方法の短所。
Bindingを作る人をふやしたい!
Bindingとは
XMLなどのデータソースとアプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術
by wikipedia
-> 他の言語のいい機能を使える
Bindingの作り方
- Ext
- SWIG
- FFI
- GI <- おすすめ
自動生成されたバインディングがいかに強力かというお話。
GIのデモ
WebブラウザをRubyで作ろう!
-> コマンドだけでRubyからWebブラウザを作って実行
-> スクリーンショットもコマンドから取れる。範囲も選択できる
=> 2つのコマンドだけで実行できる
メンテナンスしやすい!
Extの紹介
Extension library
Cで書かれたRuby用のライブラリ
ライブラリの中でBingingを実装することが多い
Cで書く
- 手動生成:たくさん書かないといけない。
- 自動生成:書くことは少ないが、使いやすくするには頑張る必要がある
FFIの紹介
libffi
FFIを実装するためのライブラリ
一般的にはバインディングを実装するためのすべてのAPI
RubyだとRuby FFIがある(libffiを使ったライブラリ)
- 手動生成:Rubyでかけるようになる
- 自動生成:書くことは少ない。GIを読み込んだり、使うものが増える。だが、使いやすい
SWIGの紹介
SWIG <-> GI 自動生成タイミング
ビルド時 <-> 実行時
まとめ
今日は話せなかったけど
Bindingはwindowsでインストール大変..
パフォーマンスの問題
- Bindingは主にCとRubyをつなぐもの
- Cで実装した機能をRubyで使える
- つまりRubyが使いやすくなる!
=> みんなでBindingを作ろうよ
[個人的感想]
当たり前だけどCとRubyどちらもわかっていないとBindingできないなと思いました..
こっちの言語でできていたことをRubyでもできるようにするっていうことは素敵だと思いました。
How DSL works on Ruby by SHIBATA Hiroshi
Rubyコミッター hsbtさん
GMOペパボの人
以下は講演内容のまとめ(公式より)を、Google翻訳したものです。
ドメイン固有言語( DSL )は、プログラマーや企業との間の通信のための便利なツールです。プログラマへのRubyからの最大の存在の一つは、それらを簡単にDSLを開発できるようにすることです。 RubyはDSLを作るための様々な機能を持っています。
私は昨年、rakeを維持するために始めました。私は熊手で興味深い技術を発見し、 RSpecの例のような他の人気のDSLに異なるものを感じた、などの経路、およびトールタスクをrailsと私はRubyとDSLのコードのパターンを発見しました。
私はこれらのパターンを使用してrake12を改善しようとするつもりです。だから私はRubyとDSLのためのコードのこれらのパターンを説明し、rake12の将来について話します。
Ruby2.4に向けて
- .ruby-lang.org.のメンテナンス
- Ruby <-> bundle のメンテナンス
Rakeの紹介
元はmakeをrubyで使おう -> rakeになった
makeでできることを実現している
全部Rubyで書けるし、Rubyで書かれているよ
makeと同じように -j もできる(闇)
Rake::FileList
-> ファイルをどうにかするときに使えるよ
Rake::TestTask
-> testのファイルを実行する
-> (unittest minitest)
rdocにもあったけどもうない。testもどうしよう..悩みどころ
- いろいろな歴史的背景
Rakeの0.9 -> 10.0に急にversion上がった!
Jim Weirichという人が作っていたけど2014に亡くなった
今はhsbtさんともう一人の方で作ってる
rake のdownloadは1位!
DSLの話
domain specific language
RubyのDSLを作るパターン4つ
-
Modelでhas_many :fooみたいにしたい場合
-> 特異クラスのメソッドにする -
has_manyをいろんな場所で使いたい & 継承させたい
-> moduleでhas_manyを定義、継承させるmodelでextend -
module_evalを使う
-
instance_evalを使う
もっと具体的に見てみよう
rakeの中身のお話
Rake::Application
で何しているか。
rake
を読み込む -> load_file
-> top_level
=> rake
を実行
load_file
でDSLの仕組みが使われている
load_rakefile
で rakefile
をロードしている
実は
- rakefile
- Rakefile
- rakefile.rb
- Rakefile.rb
っていう名前でも実行できる
rubyって名前がついているファイルを読み込んで実行する
Rake::DSL
を extend
している
Rake::Task
と Rake::TaskManager
が Rake::Application
で頑張って動いてる
他のgemとrakeの関係
Capistrano
rakeである。DSLの拡張。Capistrano3から
Thor
rake全く関係ない Thor modelを継承して使えるようになる
bundler
DSLの中でinstance_evalしている
Rubyで作られたサービスでapple payが動いたら素敵だよね!
minneっていうサービスがあるよ(宣伝)
Rake10
jRubyはDir.chdirを呼ぶとshの動きが変わる
jRuby9系は中身が展開される。辛い。
Rake11
Todo後で消す系 -> 全部消した
一つ失敗。last_comment消したらrspec動かなくなった!!
初期からrspecはlast_comment使っていた
hoeをbundlerに書き換えた
Rake12のこれから
Ruby2.2以降のみにしようと思っている
rakeの仕組みを簡素化したい
-> rake-contribっていうのに引っ越す?
-> minirake(mruby用のrake)っぽくする?
-> 書き方をもっとシンプルに!
[個人的感想]
rakeを何気なく使っているけど、バージョンアップの中で色々なことが考えられてきたことがわかっておもしろかったです。
Rubyのversionはあげるべきだと思いました。。
Learn Programming Essence from Ruby patches by Mitsutaka Mimura
アジャイル事業部の方
パーフェクトRubyの作者の一人でもある
以下は講演内容のまとめ(公式より)を、Google翻訳したものです。
様々なパッチはRubyに送信されます。これらのパッチは、プログラミング上のさまざまなアイデアが含まれています。
このセッションでは、私はそのようなRubyや一部のライブラリの独自のアルゴリズムとデータ構造パッチとしてプログラミングを、基礎となる知識を議論したいと思います。
Programingの知識とは?
-> Ruby、Railsの言語、ライブラリ、フレームワークの使い方 など
では大学では?
-> アルゴリズム、データ構造、Computatilnal Complexity など
仕事で使う知識と学校で使う知識は違う!
-> では学校で学んだ知識は不要か?
-> 直接的には役に立たないが、役に立つこともある。
ではどのように勉強すれば良いか
-> 本を読む、本に書かれているコードを読む
-> 本の中のコードは、学習用に書かれているコード..
=> Rubyのpatchを読んでプログラミングを勉強しよう!
patchについて
なぜpatchなのか?
-> 基本的にコードベースが小さい。対象がわかりやすい
-> コード以外の情報も得られる
-> わかりやすいものを自分で選んで勉強できる
patchからどうやって理解する?
-> 本で学んだことを実践的にどう使うかがわかる
-> asakusa.rbでは実際にpatchを読んだりしている
Rubyのpatchって?
-> GCのアルゴリズム
-> 並列系の処理
難しい...
良さそうな参考著書
- Ruby Under a Microscope
- doc/extension.rdoc(in ruby source tree)
- このスライドがいいよ
patchを実際に読む
これを実際に読む
- まず周りを理解する st_tableとは?
- hashを理解する
- st_talbeの中でst_insertというメソッドがたたかれている
- st_insertの中でhashの中身を引き出している
- そのあとadd_direct -> new_entryで追加されている
-> どのようにRubyが動いてDBに保存されるかまでを追いかける
Rubyの実装の中身を見てみたり、どんな歴史的背景があるかなどを見る。
[個人的感想]
patchを紐解いて勉強してみよう、というお話。勉強の仕方を詳しくお話していただきました。
どのpatchを読んでみたらいいのか..難しそうだと思いました。
Web Server Concurrency Architecture by Kirk Haines
in English
Ruby1.8.6のメンター
以下は講演内容のまとめ(公式より)を、Google翻訳したものです。
Rubyは、可能な並行性アーキテクチャの色域をカバーする多くの異なるWebサーバのオプションを持っています。
私たちは、それらの同時実行オプションが何であるかを見ていきます、とそれぞれの理論的な費用と便益は、何ですか。
私たちはそれに差し込まれたこれらの異なる同時実行アーキテクチャのそれぞれを持っているし、負荷の下でその性能は、これらのアーキテクチャのそれぞれにどのように変化するかを調べることができます
参照RubyWebサーバの実装を見ていきます。
我々は、 RubyのWebサーバが同時実行アーキテクチャのどのカテゴリに分類される結果の概要、および表情でそれをすべてをラップします。
What is a Web Server?
HTTP requestsをする
Web Server Architecture
基本的なTCP Serverはsocketを使う
Simplest Ruby web server == webrick port 8080
ruby -run ^e httpd -- -p 8080
Simple Ruby web server
Scrawls
Q. Scrawlsとは?
A. SimpleなRuby Web Server
gemへのリンク
-
IO engines
-
HTTP parsing
-
Ruby2.3.1で動く
-
Ubuntu 16.04
-
シングルスレッド
scrawls --ioengine single
-
マルチプロセス simple blocking server
-> 速い、シンプル
-> プロセス数などもコマンドで指定できるからシンプル -
Event Driven Server について
Ruby のWEb server serviceは沢山ある。その中でいいものを紹介
- WEBrick
- Mongrel
- Thin
- Goliath
- Puma
- Passenger
- Unicorn
[個人的感想]
Scrawlsを使ってみたいと思いました。パフォーマンス的にはどうなんだろう。
Pwrake: Distributed Workflow Engine based on Rake by Masahiro TANAKA
筑波大学の方
以下は講演内容のまとめ(公式より)を、Google翻訳したものです。
Pwrake 10,000万(以上)コアを持つマルチノードクラスタを使用して、データ集約型の科学ワークフローの高性能並列実行を目指しています。
Pwrakeの設計では、私は、既存の強力なツールを利用しました。まず、 Pwrakeは熊手するための拡張機能として実装されています。
この講演では、rakeはそれが多くのタスクから成るワークフローのDAGのポータブル定義を可能にしていることを非常に強力であることを示しています。
第二、 Pwrake高性能並列ファイルI / OのためのGfarm分散ファイルシステムを利用するオプションを有します。
また、私はそのような局所性を意識したタスクスケジューリングなどPwrake上の他の研究について話します。
ワークフロー言語の話
他にはこういうのがある
- Markup言語(XML)
- Swift
- GXP Make
rakeはワークフロー言語である。
Pwrake Structure
複数のタスクを並列で実行する
Fiberを使った同期プロセッサー
ログなどの追加機能はこれから
ワークフローを分散実行する
-> タスクに必要な実行ファイルを並列実行する
-> 様々な方法から Gfarm File System
を採用
=> PwrakeによってGfarm File Systemをサポート
今回はGfarm使ってるけど別に他の方法でもできる
大学での研究内容。どのような研究かと、その結果
ひまわりとかにPwrakeが使われている
スパコンにも使われている技術
[個人的感想]
Pwrakeがどのようなもので、どこで使われているかというお話。スケールが大きかったです。
Modern Black Mages Fighting in the Real World by Satoshi "moris" Tagomori
以下は講演内容のまとめ(公式より)を、Google翻訳したものです。
大幅にプラグインAPIを更新したFluentd v0.14も、昔ながらのプラグインはそれらとユーザ環境での設定ファイルを既存の膨大な量をサポートするための互換性を提供するための層を有しています。
Fluentd
- log collector
- ロゴが変わった!
- version up しました!
Fluent v0.14
- Fluent::Pluginにプラグイン系を分けた。
- Output Plugin関係を特に整理した
Mixinについて
class B < A
include M
def foo
end
B.new.singleton_classっていうのものがある
ここにもメソッドを追加することができる
-> extend
: singleton_class
からincludeして引っ張り出してきている
Fluent v0.12の話
Fluent::Output
BuffedredOutput
ObjectBuffedredOutput
MyOutPut
-> いろんなOutputがあるが、それぞれ呼び出す経路や振る舞いが全然違う。
=> とってもわかりにくい。依存していてテストしにくい
=> 動的にいじることもできない。綺麗じゃない。複雑
v0.14ではどうやって解決したか?
Fluent::Plugin::Output
一つで解決!
-> それぞれ書き出すところ、データを読み出すところ、単純な物に整理。
=> 処理の流れがわかるようにした。一方通行。
=> メソッド名に応じた単純な機能にした。
でも問題点があった
v0.12に対応したプラグインは何の変更もなく動く必要がある..
-> 実現するためには..
v0.12のプラグインを呼び出すためのプラグインを作った
-> 今までは直接書いていた。
=> v0.12とv0.14どちらからも呼ばれるようにした。
=> extendで解決
prependっていう魔術
extendではなく、外部からメソッドを呼び出す
Test code
Test driverってのを持っている
順位の問題。 singleton_class
をさらにmoduleに書く
最初は図を描いてやってみて..でも動かないって色々試した
結局整理し直した
パフォーマンスの部分は大丈夫!extendらへんはパフォーマンスには影響しない
テストは結局ゴリゴリ個別でやるしかない
結局メンテナンス大変に..
色々やったけど..version upしてね
[個人的感想]
fluentdは中の人の色々な苦労によって出来上がっているのだとわかった
通訳の方、お疲れ様です!!
SciRuby Machine Learning Current Status and Future by Kenta Murata
最近 enumerable-statistics.gem
を作った
以下は講演内容のまとめ(公式より)を、Google翻訳したものです。
どのように我々はRubyを使用して物事を機械が学習していますか?
この講演では、そのようなPythonの上scipyのダウンロード・スタックなどの他の言語のスタックとそれを比較することによって、あなたのSciRubyの現在のステータスを表示します。
SciRubyと機械学習の話
Rubyで機械学習をしたい
-> どういう意味か?
=> Rubyでデータサイエンスの仕事をしたい!
今はRubyでできることが何もない..
Pythonなら全部できる
Rubyをデータサイエンスで使えるようにしたい
機械学習
データに基づいてビジネスをしたい
膨大なデータ(big data)は機会学習に頼ることになる
-> 人には不可能なことができる
-> 手でプログラミングができないことを解決する
例) 天気予想、人の感情の解析など
機械学習でできること
- Supervised learning
- Unsupervised learning
- Reinforcement learning
=> 今回はSupervised learningにフォーカス
機械学習で使えるgem
- liblinear
- rb-libsvm
- decisontree
-> これらのgemは便利だが、APIが全て違う。
-> 選択肢によってコードの内容が変わる。
実際に機械学習をする時
- たくさんのデータ
- データがない部分もたくさんある
Scikit-learn
Scipy stack: Pythonの機械学習用に提供されている
Scikit-learnを使おう!
xgboost
grid search
-> importするところが変わるぐらいで、あとはコードを変えずに実装できる
-> 複数のモデルのパラメータを処理できる
=> 共通の形式で比べることができる
SciRubyの未来
Scikit-learnをRubyで使えるようにする
方法
- Scikit-learnそのものをRubyで使えるようにする
- Scikit-learnみたいなものをRubyで作る
SciRubyJPっていうコミュニティもあるので参加してください!
[個人的感想]
Rubyで機械学習はできなくもない。できるようになったら素敵
Scikit-learnを使うと、アルゴリズムが全部同じインターフェースで使えるから分かりやすい!
2日目の感想
メタプログラミング 第2版を買ってMatzと写真を撮れた
デカ外人さんと写真を撮れた
お菓子が充実
いい天気だったのでお弁当を外で食べた