のんびりSEの議事録

プログラミング系のポストからアプリに関してのポストなどをしていきます。まれにアニメ・マンガなど

Tokyo Ruby Kaigi 2016

本日(2016/05/28)開催された東京Ruby会議2016に参加してきましたので、ブログに書きまとめました。

まずはステッカー等の紹介

f:id:tatsu_tora:20160529001612j:plain

全体を通しての雰囲気

Rubyを中心に実際に開発した成果物の紹介。そのどれもがレベルが高く、実際に便利そうだったり、初めて知った事も多く非常に勉強になりました。

以下ざっくりメモになります。

Streem

https://github.com/matz/streem

  • 言語デザイン
  • 言語実装

ポジション

  • 汎用言語目指さない(Rubyの発展の邪魔になりたくない)
  • 実験
  • 教材
  • 可能であればRubyと変える(デザインポリシー)
  • 妥協できない点の明確化
  • 関数型(的)プログラミング
  • イミュータブルデー
  • コンカレンシー

ストリーミングプログラミングモデル

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

mrbc > compile - Dynamic性は残してコンパイル - コンパイルしたバイトコードはどこでも動く - mruby VM

  • mrbgems
    • VM configuration
  • build_config.rb
conf.gem :github => 'iij/mruby-socket'
  • 最終的にOS無し環境でも動かしたい

Details

GC

  • GCなし
  • 一つ一つのプログラムを小さく
  • 終了したらメモリ初期化
  • 起動時間長いはコンカレンシー

Concurrency

  • VM複数のプログラムをディスパッチ
  • 並行実行

Boot

  • VM初期化
  • class作成
  • method登録

制約

  • クラス、メソッド不足
  • Fixnumだけ, Overfllow
  • Array線形リスト
  • メソッド線形リスト
  • メモリ静的確保

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パケット

  • TCP 1 RTT
  • TLS handshake 2 RTT
  • HTMLL 2RTT
  • Js, css 2RTT

Total 6RTT

  • TCP Fast Open
  • TLS 1.3
    • handshake 1RTT

最適化

  • 応答性
  • キャッシュ

server-push HTTP2 機能 ブラウザがキャッシュしてるデータはpushしたくない

cache-aware server push

  • fresh
    • 再利用していい
  • stale
    • サーバに問合せてから再利用するか判断

Etag

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]]
  • 階層構造を持ったデータの処理で有効
  • 赤黒木

    • 特定のパターンの時に気を回転させて深さを一定に保つ
  • Scala

    • 任意の抽象データ型とのマッチ
  • Scheme
    • and/or/not
    • 繰り返し
  • 正規表現

Image Recognition and Code that shouldn't exist

  • カードの写真から認識
  • 人工知能 + 画像認証

視覚的ハッシュ

  • ハミング距離の値で比べる

  • OpenCV

画像認識する8step

  1. グレースケール
  2. エッジ検出(Canny)
  3. 輪郭を見つける
  4. 一番大きな輪郭を認識
  5. 多角形を見つける
  6. 透視変換の行列 (多角形を長方形に変換する必要がある)
  7. イメージを変換する
  8. 境界座標を設定する

カメラのイメージと推測1~3から比較 -> 学習

IMF: Image Manipulation Framework

Rubyでも機械学習したい

  • SciRuby

画像処理ライブラリ

Tensorライブラリ

  • ruby-opencv(CvMat)
    • hornetseye(MultiArray)
  • NArray (Numo)
  • NMatrix

tf-waifu2x

Optcarrot: A pure-ruby NES emulator

  • GPU 80%

    • GPU 5.3MHz
    • CPU 1.8MHz
  • minirubyでも動く

  • JRuby 9k 一番早いしかし起動に15秒...

  • 関数呼び出し

  • インスタンス変数の呼びたし

自分自身読み込んで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のパフォーマンス改善にも触れていて、可読性を犠牲にして行うケースもあるかもしれないので、これはしっかり覚えておこうと思います。