RubyKaigi 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 と名のつくものが生き残る法則w
- 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
- Stabby lambda
- 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月号あたりで記事書いたよ
- Performance
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
- 発表資料
- Speaker としての #rubykaigi 2014 を終えて
- 昨年の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専用ツールでビルドして... とかやってられん
- OS無し、POSIX無し、機器固有のAPI
- 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 ?
- mrubyでPOS書いてるよ...
- そのPOSコードはwebのIDEでコンパイル&エミュレートできてる
- webruby使って mrubyコンパイルしてPOSのテストしてる
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 ... が標準で動く
- Liuxが載ってる
初代RCXの光センサ
- アクティブ型光センサの構造
- 普通? IN,OUT,Common の3本線が必要
- 初代RCXは2本線
- どうしたか?
- キャパシタを入れて、充放電を時分割で切替
- 160us間隔
- OSとか無し。ベアメタルで書いてる
- たまに遅れる... が、完全に放電する前に戻ってくること、が制約となる
- 160us間隔
- mrubyで制御
- ... 無理です
2nd, 3rd の光センサ
- 2nd: マイコンが2個載ってる
- 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との組み合わせ?
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
- Ruby標準のloggerはマルチプロセス環境でバグる...
- Signal Handling
- trapのハンドラ内で
Mutext#lock
取れない問題 - キューに積んでおいて別スレッドで処理することで回避
- trapのハンドラ内で
- 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 だけに絞る
- 地獄への道w
- 多様性は善なので!
- 皆が知っているメソッドは皆が想像しているように動くべき
mruby にコントリビュートするべき
- mrb_int を 64bitにするとあちこち落ちるので..
- CRubyに比べれば、まだまだブルーオーシャンなので、どんどんコントリビュートしましょう
transpec
- rspec2からrspec3へのAPI非互換なアップグレード
- 静的解析+実行時情報を使って変換してる
- rspecで↑を出来た理由
- 全てのコードを実行可能であった
- (ほとんど外部環境に依存することなく) 実行可能であった
- →アプリケーションコードだと、条件によっては通過しないパスが存在するが、specではそれはないはずなので。
- rspecで↑を出来た理由
memo
- synvert やばい、という語がたくさん聞こえてきた