RubyKaigi2016 2日目

=========================================

## RubyKaigi2016とは？
```
日本で開催されているRubyコミュニティ主催のオブジェクト指向プログラミング言語Rubyに関する年次イベントである。 
```
by wikipedia

Rubiestが世界中から集まってくるイベントです。
今日はその2日目です。
その中で、私が聞いた講演をまとめてみました。
メモのままのところもあるので悪しからず。。

### Fearlessly Refactoring Legacy Ruby by Justin Searls

本日の基調講演

以下は[講演内容のまとめ(公式より)](http://rubykaigi.org/2016/presentations/searls.html)を、Google翻訳したものです。

```
最近まで、私たちは「レガシーRuby」についてあまり話をしませんでした。しかし、今日、非常に多くの企業がRubyの上でそのレガシーコードは避けられない依存しています。
コードはハード-理解しているとき、私たちは私たちの変更が静かに何かを破損する可能性が恐れています。この恐怖はさらに難しく、将来の変更を行う、コードの設計を改善するための勇気を侵食します。
私たちはRubyの柔軟性と実績のあるリファクタリング技術を組み合わせる場合は、徐々に私たちのデザインを改善しながら、私たちは安全に機能を追加することができます。
本講演では、恐れることなく、レガシーコードをリファクタリングするためのプロセスで参加者を装備するコード解析、テスト、およびオブジェクト指向設計に描画されます。
```

#### レガシーなコードを恐れずにリファクタリングしよう！

リファクタリングする理由は？
-> お金にならない。理由づけが難しい
-> どうしてもビジネス優先になる
-> しかもリファクタリングは時間がかかる。お金もかかる。

-> ビジネスには企画・開発・テストが含まれている。
-> リファクタリングをビジネスにもっていきたい。
-> gemで解決しよう！

#### *Suture* というgemを作った
[suture](https://github.com/testdouble/suture)

sutureの9つの要素
![Slack for iOS Upload-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/85603/27af87ff-f510-b158-61e4-3c1ae02a9640.jpeg "Slack for iOS Upload-1.jpg")

テストコードに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の方

[スライドへのリンク](http://slide.rabbit-shocker.org/authors/kou/rubykaigi-2016/)

以下は[講演内容のまとめ(公式より)](http://rubykaigi.org/2016/presentations/ktou.html)を、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ペパボの人

以下は[講演内容のまとめ(公式より)](http://rubykaigi.org/2016/presentations/hsbt.html)を、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の作者の一人でもある

[スライドへのリンク](https://speakerdeck.com/takkanm/learn-programming-essence-from-ruby-patches)

以下は[講演内容のまとめ(公式より)](http://rubykaigi.org/2016/presentations/takkanm.html)を、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)
* [このスライドがいいよ](https://speakerdeck.com/yotii23/walking-around-the-ruby-forest-more-deeply)

#### patchを実際に読む

[これ](https://bugs.ruby-lang.org/issues/12142)を実際に読む

* まず周りを理解する 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のメンター

以下は[講演内容のまとめ(公式より)](http://rubykaigi.org/2016/presentations/wyhaines.html)を、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へのリンク](https://github.com/wyhaines/scrawls)

* 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

[スライドへのリンク](https://speakerdeck.com/masa16tanaka/pwrake-distributed-workflow-engine-based-on-rake)

筑波大学の方

以下は[講演内容のまとめ(公式より)](http://rubykaigi.org/2016/presentations/masa16tanaka.html)を、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

以下は[講演内容のまとめ(公式より)](http://rubykaigi.org/2016/presentations/tagomoris.html)を、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` を作った

以下は[講演内容のまとめ(公式より)](http://rubykaigi.org/2016/presentations/mrkn.html)を、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で使えるようにする

方法
1. Scikit-learnそのものをRubyで使えるようにする
2. Scikit-learnみたいなものをRubyで作る

SciRubyJPっていうコミュニティもあるので参加してください！

[個人的感想]

```
Rubyで機械学習はできなくもない。できるようになったら素敵
Scikit-learnを使うと、アルゴリズムが全部同じインターフェースで使えるから分かりやすい！
```

--------------------------------------------------------------------

### 2日目の感想

```
メタプログラミング 第2版を買ってMatzと写真を撮れた
デカ外人さんと写真を撮れた
お菓子が充実
いい天気だったのでお弁当を外で食べた
```