LoginSignup
2
1

More than 5 years have passed since last update.

RubyKaigi2014 Day2

Posted at

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
  • 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 考古学 機能編)

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

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 にした

MRuby as Development Platform for Payments

  • http://rubykaigi.org/2014/presentation/S-ThiagoScalone-DanielRodriguez
  • CloudWalk
  • 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 ?
    • mrubyでPOS書いてるよ...
      • そのPOSコードはwebのIDEでコンパイル&エミュレートできてる

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

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: マイコンが2個載ってる
  • 3rd: センサ側にマイコンがある
    • CPUも早くなってるので、mrubyでも制御できる

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

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
  • 応用例

cgroup

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

ServerEngine: a framework for multiprocess servers in Ruby

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 だけに絞る
    • 地獄への道w
    • 多様性は善なので!
  • 皆が知っているメソッドは皆が想像しているように動くべき

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

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

transpec

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

memo

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1