Tokyo Ruby Kaigi 2016
本日(2016/05/28)開催された東京Ruby会議2016に参加してきましたので、ブログに書きまとめました。
まずはステッカー等の紹介
全体を通しての雰囲気
Rubyを中心に実際に開発した成果物の紹介。そのどれもがレベルが高く、実際に便利そうだったり、初めて知った事も多く非常に勉強になりました。
以下ざっくりメモになります。
Streem
https://github.com/matz/streem
- 言語デザイン
- 言語実装
ポジション
- 汎用言語目指さない(Rubyの発展の邪魔になりたくない)
- 実験
- 教材
- 可能であればRubyと変える(デザインポリシー)
- 妥協できない点の明確化
- 関数型(的)プログラミング
- イミュータブルデータ
- コンカレンシー
ストリーミングプログラミングモデル
- loopがない
- endがない
- ピタゴラスイッチプログラミング
task(readI/O)
- producer
- epoll
- read
- queue push
task(write I/O)
- consumer
- queue pop
- write
配列はproducerになる
["Hello World"] | stdout
ブロック{
が指定されると無名関数的な要素
スケジューラ コア数分
namespaseがmethodを定義する bar(foo) fooのnamesappceにbarがあれば
総称関数を導入したい
関数
- seq/repeat/rand/cycle 配列を与えるて指定回数実行
- zip/concat
- map/each
- flatmap/filter
- reduce/reduce_by_key/count/min/max
- time/now
- csv
- sum/average/stdev/variance/correl/sample
- sort/sort_by/median/median
emit
キーワード引数
mruby/c
- 軽量ruby
mrbc > compile - Dynamic性は残してコンパイル - コンパイルしたバイトコードはどこでも動く - mruby VM
- mrbgems
- VM configuration
- build_config.rb
conf.gem :github => 'iij/mruby-socket'
- 最終的にOS無し環境でも動かしたい
Details
GC
- GCなし
- 一つ一つのプログラムを小さく
- 終了したらメモリ初期化
- 起動時間長いはコンカレンシー
Concurrency
Boot
- VM初期化
- class作成
- method登録
制約
Rubyに型があると便利か
- TypeStruct
RubyでClassチェック
Issue
- データの塊だけを表すclassがほしかった
- いちいち実装するのがめんどくさい
- 結構長生きする
- まちがって使われると困る
- Keyword argumentがつかえるStruct
用途
JSONのclassチェック、Objectにするもの
Ruby3型
- 静的チェック
- RubyレベルではAnnotationを書かない
最速ウェブサーバの作り方
レスポンスが500mx遅くなるに連れて -> -1.2% 売り上げ下がる
ボトルネック
HTTP/1.1が遅い?
- 並走性が低い 同時に投げれるリクエスト = 1
- リソース間の優先順位を決めれない
- big request / reesponse header 300~500byte
HTTP/2
TCPでデータ転送するときの上限速後を考える 1RTTで送れるのは10パケット
Total 6RTT
最適化
- 応答性
- キャッシュ
server-push HTTP2 機能 ブラウザがキャッシュしてるデータはpushしたくない
cache-aware server push
- fresh
- 再利用していい
- stale
- サーバに問合せてから再利用するか判断
100番台 中間レスポンス Link: </styyle.css>; rel=preload
unicorn.socket直接各
アプリケーションへのRubyインタープリターの組み込み
- Ruby以外に組み込む
拡張ライブラリーとの違い
- Cメイン 組み込み
Rubyメイン 拡張ライブラリー
すでにあるアプリなら組み込み
初期化:GC関連
/* スタック地の底を設定 */ RUBY_INIT_STACK; /* シグナルハンドラーを保存 */ ruby_init(); /* Rubyがシグナルハンドラーを登録 */
シグナル関連
RUBY_INIT_STACK; /* シグナルハンドラーを保存 */ ruby_init(); /* Rubyがシグナルハンドラーを登録 */
{ /* エラーハンドリング */ rb_protect(); }
fork
fork()するとワーカープロセスがクラッシュ -> プロセス終了時
イベントループとシグナル
まとm
- 動的組み込み x
- 所有権を渡さない
- GCにわかせない
Re: Pattern Matching in Ruby
- パターンマッチとは 多重代入の強化版のようなもの
a, (b, c) = [1, [2, 3]]
Image Recognition and Code that shouldn't exist
- カードの写真から認識
- 人工知能 + 画像認証
視覚的ハッシュ
ハミング距離の値で比べる
画像認識する8step
- グレースケール
- エッジ検出(Canny)
- 輪郭を見つける
- 一番大きな輪郭を認識
- 多角形を見つける
- 透視変換の行列 (多角形を長方形に変換する必要がある)
- イメージを変換する
- 境界座標を設定する
カメラのイメージと推測1~3から比較 -> 学習
IMF: Image Manipulation Framework
Rubyでも機械学習したい
- SciRuby
画像処理ライブラリ
Tensorライブラリ
tf-waifu2x
Optcarrot: A pure-ruby NES emulator
自分自身読み込んでgsub eval - optcarrot
分散ワークフローエンジン『Digdag』の実装
- workflowautomation
あらゆる手作業の自動化
Airflow
- Server + WrbUI
- Python
- スケジューラ
Rundeck
- shellscript
- WEB UIで定義
- git管理難しい
Digdag
- yaml
- taksのネストが可能
- nashcorn > 組み込みJavaScript
- タスクを動的に追加出来る
条件分岐, loop
update skip locked
まとめ
個人的には機械学習やディープラーニングとなるとやっぱりPythonになりがちなんだけど、ビッグデータ関連のインフラ技術(Hadoop, Spark等)との連携をJRuby等利用して行い、なおかつ統計や科学技術関連Gemの充実で、いずれはRubyも選択肢に現れてくるかもしれないなと感じました。
あと、組み込みRubyやStreem等、新しい言語といった観点でちょっと久しぶりにCをゴニョって、自作言語とか作ってみたいな〜とまあ、まずはCの復習からなんだが...
もう一つ、NES(ファミコン) emuでRubyのパフォーマンス改善にも触れていて、可読性を犠牲にして行うケースもあるかもしれないので、これはしっかり覚えておこうと思います。