RubyKaigi2014 Day2

[RubyKaigi 2014](http://rubykaigi.org/2014/) の 2日目まとめ

# Coming soon...

- matz
- ruby2.2.0-preview1 が昨日出たよ / Herokuでも使えるよ

## The future is coming

- 過去Keynoteで様々な未来について語ってきた
- RubyConf 2001 (11月 9.11の後)
  - Ruby2.0について話した
  - Virtual Machine を作るよ! → 2007年のRuby1.9
  - UNIXの世界では Yet Anothor と名のつくものが生き残る法則ｗ
- RubyConf 2002
  - M17N → 2007 Ruby1.9
  - Native thread → 2007 Ruby1.9
  - Generational GC → 2013 Ruby2.1
- RubyConf 2003
  - Local variable scope → NaN
  - Multiple assignment → 2007 Ruby1.9
  - Method visibility → NaN
  - Keyword Argument → 2013 Ruby2.1
  - Method combination (prepend) → 2013 Ruby2.1
  - Selector namespace → 2013 Ruby2.1
  - Optional static type → NaN
- RubyConf 2004
  - NaN
- RubyConf 2005
  - Stabby lambda `->{}` → 2007 Ruby1.9
     - 発表時は大不評だったが入れてみたら評判良かった
  - Real multi-value → NaN
  - Traits → NaN
- RubyConf 2006
  - Bikeshed argument encouraged
  - No New idea
- RubyConf 2007
  - Ruby1.9 Release!
- RubyConf 2008
  - Philosophy
- RubyConf 2009
  - DSLのちから
- RubyKaigi 2009
  - Complex literal (2.1)
  - Rational literal (2.1)
  - True division (NaN)
  - Bitmap marking (2.0)
  - Symbol GC (2.2)
- RubyConf 2010
  - Mix (traits) (NaN)
  - Module#prepend (2.0)
  - Refinement (2.0)
  - mruby (2012)
- RubyConf 2011-2014
  - No new idea
- 22個のアイディアのうち 7個入らなかった
  - 法螺率は 32%
- OSS Community はサメのようなもの
  - 走り続けないと死んでしまう
  - 走り続けるために、新たなアイディア、新たな燃料が必要だ
- Ruby 3.0
  - Concurrency
  - JIT (LLVM?)
  - Static typing
     - 今日は static typing の話

## Ruby3.0 - Static typing

- 最近(2000年代)出てきた Scala, Go, .... は静的片付け
- Feature #9999 -- type annotationの提案
- PEP:3107 --> function annotation
- なんで入れたい？
  - Performance
     - 動的型付け言語でも早いものはある (JS V8, LuaJIT, ..)
  - Compile time check
     - 静的解析でバグの存在を検出できる
     - 安全なリファクタリングに繋がる
  - Cons. 柔軟性が低下する
     - Ruby得意のダックタイピングと相性が悪い
  - Documentation
     - 仮引数の変数名から推測する or コメントから探している
     - 信頼性の高いドキュメントになりえる
  - Optional
     - 一部分だけ型情報を付与することになるだろう
     - 型制約の無いメソッドに渡されると型情報が失われてしまう
     - JavaScriptに型を付けた→TypeScript
        - TypeScriptのことをJavaScriptと主張する人は居ない
     - Pで始まる言語にみたいに、バージョン間で別言語にしたくない
  - DRY
     - Code & Declaration
     - 型情報は、コード中から推測できる.. はず！
  - Soft-typing
     - 型推論
     - その後の処理などから、どのような型を必要としているか、を推論する
     - 型宣言不要
     - ここで言う "型" はクラスとかモジュールとかではない
     - メソッドの集合と、その戻り値が "型" として扱われる感じ?
  - soft-typing check するならサブセットになるのでは..
     - 変数で require する
     - define_method とか
     - 実行時にメソッド生えてしまうので..
  - コンパイラに型情報を教えるのではなく、コンパイラに型情報を推測させる/確認させる
     - 日経Linux 2014/10,11月号あたりで記事書いたよ

### subset

- two languages in one
  - Soft-typed language
  - Dynamic typed language
- subsetという概念を入れれば、非互換な新機能を導入しやすくなるかも?


# Archeology of Ruby: Removed Features (Ruby 考古学 機能編)

- http://rubykaigi.org/2014/presentation/S-KazuhiroNISHIYAMA
- Rubyから消えていった機能を振り返る

## Safe level

- `$SAFE=4`
- sandboxとしては不完全
- `$SAFE < 4` はセキュリティ面のsandboxではなく、バグ発見用のfailsafe機能として残される

## '.' remove from $LOAD_PATH

- 1.9.2 から消えた (ひっそりと)
- セキュリティ的理由で

## File.exists?

- Ruby本体のメソッド名はできるだけ三単現のsを付けない
- warning 出てたが、一旦出なくなった
- その後また warning 出るようになった
- まだ残ってるけど、そのうち消えるよ (たぶん
- `File.exist?` は一般的すぎるから、 `File.exists?` が正しい！という外国人からのツッコミがあったから残っているという噂も。だとすると消えないかもしれない。

## Symbol < String
- 開発版に入ってた。けどバグバグなのでやめた
- caseまわりでバグ発生

# <%= link_to "bundle", "update" %> - Make "bundle update" more fun to review

- http://rubykaigi.org/2014/presentation/S-KensukeNagae
- [発表資料](https://speakerdeck.com/kyanny/percent-equals-link-to-bundle-update-percent-make-bundle-update-more-fun-to-review)
- [Speaker としての #rubykaigi 2014 を終えて](http://blog.kyanny.me/entry/2014/09/22/132359)
- 昨年のRubyKaigiでもbundle updateの話をしてた人

## bundle update pull request

- 昨年のRubyKaigiでbundle updateによるGemfile.lockの差分をpull-req出す手法を紹介した
- Gemfile.lock の差分だけで、更新で良いかどうか、レビューできるか !!!
- → 今日の発表

## Compare Linker

- https://github.com/kyanny/compare_linker
- Pull Request の webhook payload を受け取って
- master と topic branch との Gemfile.lock の差分を見て、便利なリンクを生成してくれる
  - Pull Request にコメントを書いてくれる
- ... のを SaaS にした
  - http://tachikoma.io/ をローンチしたよ

# MRuby as Development Platform for Payments

- http://rubykaigi.org/2014/presentation/S-ThiagoScalone-DanielRodriguez
- CloudWalk
  - https://cloudwalk.io/
  - ポルトガル語は辛いよ :(
- POS端末
  - OS無し、POSIX無し、機器固有のAPI
     - バグだらけ
     - Windows専用ツールでビルドして... とかやってられん
- Why not Ruby?
  - JRuby ... 重い。起動待ちで 40sec
  - RubyMotion ... iOS, Android
     - MobileFirstなら良い... かも
     - 逆に Mobile に限定されちゃう (組み込みで動かん)
  - MRuby
     - 組み込みで動かせる。モバイルでも動かせそう。
     - MobiRuby, jamruby?
- webruby
  - webruby使って mrubyコンパイルしてPOSのテストしてる
     - マジ?
  - webrubyはLLVM? js?にコンパイルするんだっけか
  - mruby世界からjsのAPIを叩くためのブリッジクラスを用意した
  - `Mruby.js.window.socket()` とか見えたんだけど..
  - emscription ?
     - http://ja.wikipedia.org/wiki/Emscripten
  - mrubyでPOS書いてるよ...
     - そのPOSコードはwebのIDEでコンパイル&エミュレートできてる

# Open the door of embedded systems to IoT! mruby on LEGO Mindstorms EV3 ®

- http://rubykaigi.org/2014/presentation/S-TakehikoYOSHIDA
- YOSHIDA Takehiko
- いわゆる組み込み屋
- iOS, Android の下回り（ライブラリ整備）とか

## LEGO Mindstorms

- 4-5万 / RasPi * 15個くらい
- ET Robocon とかで使われてる
- 1998 1st: Mindstorms RCX
  - H8 16MHz, 32KB
- 2006 2nd: Mindstorms NXT
  - ARM7 48MHZ, 64KB
- 2013 3rd: Mindstorms EV3
  - ARM9 300MHZ, 16MB
  - 対象年齢10歳以上
  - 標準のプログラミング環境はGUI
  - iOS等のSDKも提供されている。 Remote Controlできる
- ソフトウェア構成
  - Liuxが載ってる
     - 起動に4-5秒。終了にも4-5秒。暴走するとケーブル引っこ抜くことにw
  - Linuxの上にVMが載ってる。そのバイトコードを生成すれば自由に動かせる
  - ev3dev: SDカードで起動できるようになった
     - github.com でコード公開されている
     - C/C++/Python/JS/Lua/Go/Ruby ... が標準で動く

## 初代RCXの光センサ

- アクティブ型光センサの構造
  - 普通? IN,OUT,Common の3本線が必要
- 初代RCXは2本線
  - どうしたか?
  - キャパシタを入れて、充放電を時分割で切替
    - 160us間隔
      - OSとか無し。ベアメタルで書いてる
    - たまに遅れる... が、完全に放電する前に戻ってくること、が制約となる
- mrubyで制御
  - ... 無理です

## 2nd, 3rd の光センサ

- 2nd: マイコンが２個載ってる
- 3rd: センサ側にマイコンがある
  - CPUも早くなってるので、mrubyでも制御できる


# Scalable deployments - How we deploy Rails app to 100+ hosts in a minute

- http://rubykaigi.org/2014/presentation/S-ShotaFukumori
- Cookpadでのデプロイ事情
  - 話さないこと
     - Rails, Cont. Delivery, Auto-Scale

## Deployment

- Model 1500+個
- 140servers
- 10times/day (deploy)
- RULE on Deploy (developerが自由にデプロイできる)
  - CIパスしたもの
  - 業務時間内にデプロイ
  - デプロイ後にエラーレートを見て、必要に応じてロールバックしてね
- CIパスしたら tag を打つ
  - staging には自動デプロイされる
  - Deploy Server にログインして cap2 を実行するスタイルを取っていた
  - ChatOps: hubot deploy ... で
- デプロイにどれだけ時間がかかっているか？
  - CIに10分
  - staging での確認 1-5分
  - デプロイ処理 10分
  - total: 15-20分かかってる
- capistrano 2
  - 歴史的経緯
  - 2595 lines のデプロイスクリプト
  - もう嫌だ
  - SSH & rsync が遅い問題
     - 稀にSSHが重くてFailする
     - たまにコケる。非常に大きな問題

## どう立ち向かうか

- Capistrano 3 に更新する?
  - 結局SSHだし、遅いんじゃね?
  - 台数増えると厳しくね?
- 新しいツール作ろう!
  - sorah/mamiya
  - serf オーケストレーション
  - S3 をファイル配信に使う
  - Capistranoと同様のディレクトリ構成
- serf
  - GOSSIP PROTOCOL
  - クラスタがでかくなると厳しくなるかも? だけど、SSHよりはマシだろう、という期待
  - serf コントロールのためのツールも作ったよ github:sorah/???

## mamiya

### 概念

- Master node
  - 人が叩く
  - HTTP API
  - serfにイベントを投げ込む
  - serf 経由で状態を確認する?
- Agent node
  - bundle install とか prepare task を実行する
- Deploy Script
  - build, prepare, release を記述する
- Package
  - tarball でストレージに置く
  - deploy script も package に含める
- Storage
  - Packageをストアする
  - 標準では S3 を使う
- Step
  - デプロイ手順を分割する単位
  - 複数回実行されても大丈夫なようにしている
  - Fetch
  - Prepare (bundle install)
  - Switch (reload, graceful)

### Mamiya's Deploy Flow

- CI builds package
- CI push package to storage
- -- Deloyment start --
- xx
- deploy! って言う前に、CI通ってしまったら自動でprepareまで実行してしまえば良いじゃないか
  - switch するだけだから、早いよね
- changes
  - before: 8.4minutes
  - after: 45seconds
    - 11.2x fater

# 仮想的にコンピュータリソースを分離可能なmrubyによるWebサーバのリソース制御アーキテクチャ

- Resource Control Architecture scripting with mruby for a Web Server Separating Computer Resources Virtually at Each HTTP Request
- http://rubykaigi.org/2014/presentation/S-MATSUMOTORyosuke
- なぜ mod_mruby を作る必要があったのか?
- mgem-list 登録数 No.1
  - iij と Internet Initiative Japan が混在してるので揃えましょうか :p

## 僕が欲しかったWebサーバのリソース制御

- 既存: 固定のしきい値を超えているか否かの単純制御
- 問題点
  - サーバ全体を守るため... といいつつ
  - 品質をあげるためのリソース制御が、サービス品質の低下を招いているケースがある
- 欲しい
  - 制御ルールをプログラマブルに記述したい
  - サーバ再起動無しに更新したい
  - オーバーヘッドにならないように
  - リクエスト単位でリソースをうまく使って欲しい

### mod_mruby

- Apache httpd の DSL制御エンジン
  - ngx_mruby も基本的なアーキテクチャは同様
- Apache の機能拡張に特化
  - mod_ruby, mod_perl などはWebコンテンツの開発も目的としている
  - mod_mruby は ↑ のようなことは目的としない
  - mod_lua も mod_mruby と似たアプローチを取っている
- mod_mruby のフックはいろいろなところに設定できる
  - 性能, 速度が要求される箇所はmrb_stateを使いまわす
  - 他の箇所はmrb_stateを都度生成する
  - リクエストの度にスクリプト読み込みを行う
     - ので、再起動しなくてok
  - パフォーマンスがもっと必要なら起動時にバイトコード変換しておく
     - こっちは振る舞いを変えるには再起動必要
- mod_mruby, ngx_mruby
  - なるべく同等のDSLとなるように
  - Apache Traffic server を対象にした ts_mruby もあったり
  - 異なる種類のサーバに対する拡張を、ほぼ同等のDSLで書けると、劇的に障壁を下げられる
  - rubyの延長でサーバの拡張書けそう　:D
- 応用例
  - mookjp/pool ... Dockerとの組み合わせ?
     - https://github.com/mookjp/pool

## cgroup

- mruby-cgroup 作った
- mruby拡張なので、mod_mruby以外のmrubyコードとも組み合わせできる

# ServerEngine: a framework for multiprocess servers in Ruby

- http://rubykaigi.org/2014/presentation/S-MasahiroNakagawa
- Masahiro Nakagawa
- @repeatedly

## Background + Intro

- このへんの界隈
  - System programs (Chef, Serverspec)
  - Network servers (Starling, Unicorn)
  - Log servers (Fluentd)
- Rubyでデーモンを書くうえでの課題
  - CPU使い倒す..
  - ロバストなエラーハンドリング
  - log rotation
  - signal handling
  - dynamic reconfiguration
- Solution: ServerEngine

## ServerEngine

- https://github.com/fluent/serverengine
- Unicorn みたいなのを簡単につくれるようになる
  - Server module と Worker module を定義するだけ
  - Worker の run が必須
- Supervisor - Server - Worker 構成
  - Supervisor: defaultでは無効。ユーザが触ることを想定してない
- Logging
  - Ruby標準のloggerはマルチプロセス環境でバグる...
     - Ruby2.1に入ったw
- Signal Handling
  - trapのハンドラ内で `Mutext#lock` 取れない問題
  - キューに積んでおいて別スレッドで処理することで回避
- sigdump
  - SIGQUIT of JavaVM for Ruby
  - そのときの各種状態をdumpしてくれる
  - `kill CONT #pid`
  - require するだけなので入れとくと良いかも
- Use-case1: Sneakers
- Use-case2: Fluentd v1

# LT

// 気になった語だけ書き残す..

## practical factory girl

- 退会ユーザみたいなのを作るとき
  - 継承, trait, 他の方法
  - 特別なユーザを作る(admin)
  - 課金してるユーザを作る
  - なるべくtraitを使いましょう
     - ユーザの状態って継承で表現すべきものじゃないよね？
- イベントデータのfactoryを作るのやめよう
  - factoryで暗黙的に関連を作るのはやめよう
  - 多対多のリレーションみたいなのとか
     - テストケースの中で関連付けを作るよね..?
- describe と context
  - describe の中で let, subject
  - context の中で before

## Native Libs and Gems on Heroku with Hammer

- HerokuでnokogiriみたいなNativeライブラリとどう付き合ってるか

## ofruby

- ruby openFramework
- github.com/ongaeshi/ofruby

## 大場さん

- Rubyの与えた自由をプログラマは否定してはいけない
- 初心者のために describe/context だけに絞る
  - 地獄への道ｗ
  - 多様性は善なので!
- 皆が知っているメソッドは皆が想像しているように動くべき

## mruby にコントリビュートするべき

- mrb_int を 64bitにするとあちこち落ちるので..
- CRubyに比べれば、まだまだブルーオーシャンなので、どんどんコントリビュートしましょう

## transpec

- rspec2からrspec3へのAPI非互換なアップグレード
- 静的解析＋実行時情報を使って変換してる
  - rspecで↑を出来た理由
     - 全てのコードを実行可能であった
     - (ほとんど外部環境に依存することなく) 実行可能であった
     - →アプリケーションコードだと、条件によっては通過しないパスが存在するが、specではそれはないはずなので。

# memo

- synvert やばい、という語がたくさん聞こえてきた
  - http://xinminlabs.github.io/synvert/ これか