Skip to content

Instantly share code, notes, and snippets.

@mshibuya
Created September 22, 2014 04:35
Show Gist options
  • Save mshibuya/a6b42c4081c7c29099fb to your computer and use it in GitHub Desktop.
Save mshibuya/a6b42c4081c7c29099fb to your computer and use it in GitHub Desktop.
RubyKaigi2014 二日目

RubyKaigi 2014 9/19

Keynote: Coming Soon...

Matz

未来がくる

  • 過去に未来について語った
    • RubyConf 2001
      • Virtual Machine(1.9 2007)
    • RubyConf 2002
      • M17N (1.9 2007)
      • Native thread (1.9 2007)
      • 世代別GC (2.1 2013)
    • RubyConf 2003
      • ローカル変数のスコープルール (--)
      • 多重代入 (1.9 2007)
      • ローカルメソッドの可視性 (--)
      • キーワード変数 (2.1 2013)
      • method combination (2.1 2013)
      • selector namespace (2.1 2013)
    • RubyConf 2004
      • (--)
    • RubyConf 2005
      • Stabby lambda(->) (1.9 2007)
      • 多値返却 (--)
      • Trait (--)
    • RubyConf 2006
      • Bikeshed argument encouraged
      • 新しいアイディアはなかった
    • RubyConf 2007
      • 1.9について
    • RubyConf 2008
      • Rubyの哲学
    • RubyConf 2009
      • SymbolGCなど
    • RubyConf 2010
      • Mix(traits)
      • Module#prepend (2.0 2013)
      • Refinement (2.0 2013)
      • mruby (2012)
    • RubyConf 2011-2014
      • 新しいアイディアはなかった
  • 22のうち7つは入らなかった
  • OSSは泳ぎ続けないと死んでしまう
    • そろそろ燃料投下すべき!

Ruby 3.0について考える

Concurrency

JIT(LLVM?)

静的型付け

  • 20世紀のスクリプト言語は、型がなかった
  • 最近の言語は型がある
    • Scala, Go, TypeScript...
  • Rubyにも欲しいじゃん
  • 型アノテーション
  • なぜ静的型付け?
    • パフォーマンス
      • 型付けはパフォーマンスに必須か?→そうではなさそう
    • コンパイル時チェック
      • 静的解析
      • リファクタリング
      • テストの網羅性がすくなくていい、とはいかない
      • 柔軟性が減る
        • Duck typing
    • ドキュメンテーション
      • コメントよりもずっと明確で信頼性が高い
      • 実装の中身を調べなくとも何を渡すべきかわかる
  • なんで今型がないの?
    • Duck typing
      • 静的型付けに反する
    • Optionalにしかならない
      • 型チェックがごく一部しか行われなくなる
      • 型チェックありvs型チェックなし
      • そこまで違うなら、本当にRubyと言えるの?
    • DRY
      • 型宣言しなきゃいけないのは重複だよね
  • Soft-typing
    • 型推論
    • 宣言不要
    • duck typingをもとにしている
    • 型は、メソッドの集合で表現される
      • 引数・戻り値
    • クラスで指定されることもある
    • コンパイル時チェックが可能
    • 行儀がいいプログラムなら、だいたいいい線いくのでは?
    • 問題
      • require
      • define_method
      • method_missing
      • Documentation
        • 推測して、提示
    • 日経Linux 2014/9, 10月号に載ってる

Subset

  • 限定された領域でプラスアルファを提供
  • 限定部分から外れたら今まで通りに動く
  • 互換性が保てる!

まとめ

Ruby 3.0で新しいことを入れて、未来に備えよう!

質問

型付け以外にも問題箇所の指摘に使える?

使えると思う

以前にあった型付けが入らなかったことについては?

フルセットの概念がなかった。そもそも難しかった。

サブセットが小さくなり過ぎたら困る。if文とか、define_methodとか

ifは広く取ることでなんとかなるでしょう。define_methodは検討してみる

サブセットといえばpypyが連想されるけど、コンパイラとして実装もできる?

pythonよりはもっとひろいターゲットを想定してる?

Extreme Makeover: Rubygems Edition

André Arko (@indirect)

Rubygems

  • 去年のbundler DDoS
    • rubygemsが負荷に耐えられなかった
  • rubygemsの脆弱性
    • rubygems.orgを再構築した
  • Travisのネットワーク問題
    • DNS問題
  • SSL失敗
    • 根本からrubygems.orgを再構築
  • Bundler Source CVE
    • 複数のソースに同じ名前のgemがあると、どっちが入るかわからない
    • Bundler 1.7にはバグがあった
      • 1.7.2をリリース

今、どう動いてるか

  • 今までは逐次聞いていた
  • gemspecのリストをダウンロード
  • 改善案
    • 単純なテキスト形式のインデックス
      • evalしなくていいように
    • クライアント側でキャッシュ
    • CDNに置きやすくなる
    • ローカルでミラーリングしやすく
  • 新形式のインデックス
    • /versions
      • すべてダウンロードしなくていいよう、追記していく?
    • /deps/gemname

現状

  • インデックスの設計
  • bundler側に実装
  • rubygems側に実装(未)

まとめ

  • bundler開発に参加してね!

Deep Down Fixtures

@_cha1tanya

RubyConf India

2015春くらい?

fixture

  • なんで

    • 否定する前に知っとくべきでしょ
    • 標準でついてるし
    • 出来る事が何かしっておくべき
  • fixtureって変

  • fixtureって

    • YAMLファイル(CSV)
  • どう作るか

    • 考える必要がある
    • 創造的
    • Keyの付け方
      • :admin_user
      • :driver
      • :monitor
      • :emergency_contact_for_john
    • idはつけるな
      • ARにつけさせるべき
    • DHHに聞け!
      • 全部のシナリオをカバーしようとするな
      • DHHの発言はtwitterで検索しちゃえ
  • fixtureの読み込み

    • YAMLファイルを読んで
    • Hashに変換し
    • 既存のデータを全部削除
    • テストスイート開始前に読み込まれる
    • INSERT時にARインスタンスを生成しない
      • callback/validationが効かない
  • fixrureへのアクセス

    • データベースから
    • 動的に
    • 自動インスタンス化
      • use_instantiated_fixtures
      • 遅い
      • メモリを食う
  • 動的に、って

  • Association

  • トリック

    • デフォルト値があるカラムにNULLを入れるには
      • 値をnilにセット
      • キーだけ書く
    • ERBを使って動的に
      • <%= Time.now %>
    • Timestamps
    • DRY
      • Label Interpolation
      • $LABEL
      • now(Postgres)
      • YAML defaults
  • 発展

    • 順序つきfixture
      • OMAP YAML
    • テーブル名とモデル名が一致しない
      • set_fixure_class
    • test_with_transaction(Rails 4.2)

まとめ

  • fixtureは役に立つので、つかうべき!

質問

なにかfixtureに欲しい機能はある?

(聞き取れず)

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

Compare Linkerを作った

レビューを楽しくしたい

自動で差分のURLをコメントしてくれる仕組み

  • pullreqからwebhookを受け取る
  • Compare Linkerを起動
    • Gemfile.lockの中身を取得・parse
    • バージョンが変わったgem名をあつめる
  • URLを作成
    • gemのバージョン間の差分
  • コメントをつける

問題点

  • Railsの更新に弱い。。
  • force pushに対応できてない

まとめ

  • そこそこの出来
  • 学んだこと
    • ideaよりも、やり遂げることの方が難しい
    • idea < action < improvement

Gemfileはどう管理してる?バージョン指定をつけないでbundle updateするか、つけるか

rails以外はバージョン指定しないで、bundle updateしてる。

rubygemsのHomepageじゃなくSource Codeを使ったほうがいいのでは?

両方みて、githubが含まれるほうを使ってる。

MRuby as Development Platform for Payments

Thiago Scalone (@scalone) CloudWalk Daniel Rodoriguez (@sadasant)

組み込みシステムとは?

  • 目的に合わせて作られたコンピュータ・システム
  • 考える事たくさん
    • バグ修正をどう配るか、とか
    • windows上でexeにコンパイル
    • Web上のIDEでコンパイル
  • mobileへ
  • 開発者にやさしく
    • Rubyを使おう
      • できなかった
    • Ruboto
      • JRuby core-teamがいない
      • 起動に40秒
      • コミュニティがない
    • RubyMotion
      • mobileのみ
    • mruby!

構成

  • da_funk
    • いろんなプラットフォームで同じ動きが必要
  • CloudWalk MRuby Framework
    • webで公開してる
  • emscripten
  • POSXML→MRubyへ

実際のコード

  • 非同期に
  • emscriptenで生成したコードは、たまにメモリリークする
  • RubyのクラスをEmscriptenのAPIでオーバーライド

デモ

今後のチャレンジ

  • Verifone, Ingenico
  • 継続的デリバリ
  • NFC

最後に

来年のmrubyカンファレンスに来てね!

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

吉田さん(@chihayafuru)

LEGO mindstormとは

  • 教育ツール
  • おもちゃ
  • STEM教育
    • Science, Technology, Engineering, Mathematics
  • 値段
    • なかなか高い。
    • Rasberry Pi 14~5台分!
  • 3世代の比較
  • ヴィジュアルプログラミング環境
  • リモートコントロール
    • iOS, Android
  • 標準ファームウェアアーキテクチャ
  • ev3dev
    • full Debian 7
    • microSDからブート可能

mrubyを使える?

  • mrubyとは
    • 組み込みRuby
  • 組み込みで使えるの?
    • deadline守れる?
    • GCが他の割り込みを邪魔しない?
  • 初代では信号線が2本
    • inとoutを切り替えて使う
  • 3代目で信号線が増えた
  • mrubyの向かないもの
    • ハードの能力をめいいっぱい活用したい時
  • 向くもの
    • マイコンと強調して、あたらしいものをマッシュアップ

デモ

質問

Rasbery Piのbaremetalみたいな使い方って可能?

できる。大変だけど

初代の160usではこなせて、Rubyは遅いからこなせないということ?

その通り。

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

@sora_h

CookPadでのデプロイについて

  • 巨大Railsアプリ
  • サーバ140台
  • 10回/日
  • CIが通ったビルドのみ
  • 業務時間内のみ
  • staging環境で確認後、手動でdeploy
  • Deploy server
  • チャットでdeploy
  • かかる時間
    • CIに10分
    • 目視確認に1~5分
    • デプロイに10分

問題点

  • 時間がかかる(20分)
  • capistrano2
  • SSHが重い
    • たまにこける!

改善する

  • capistrano3に上げる?
    • SSHに依然として頼ることになるので遅い
  • deployのための新しいツールを作る!
  • github/sorah/mamiya
    • Serfを使ってる
      • hashicorp/serf
      • orchestration tool
      • gossip protocol
      • sorah/villein
    • S3をファイル配布に使う
    • capistranoとディレクトリ互換

mamiyaの動き

  • 構成
    • Master node
      • HTTP APIを受け、Serfを使って命令を送る
    • Agent node
      • Masterから命令を受け実行
    • Deploy script
    • Package
      • tarball
      • デプロイしたいファイルを全部つめておく
    • Storage
      • Packageの置き場所
    • Step
      • deployの手順
      • 何回実行しても安全
      • Fetch
      • Prepare
      • Switch
  • 流れ
    • CIがパッケージをビルド
    • パッケージをStorageにpush
    • Masterにprepareリクエストを送信
    • Agentがpackageを取得・prepare
  • 結果
    • SSHに依存しなくなった
    • Stepは個別に実行して問題ない
    • deploy前にprepareする?
    • 8.4分→45秒に!

DEMO

今後のプラン

  • ドキュメント
  • クラスタ追加時に自動deploy
  • Web UI
  • エラー処理をよりよく

Write ruby code to change ruby code

Richard Huang(@flyerhzm)

問題

  • RSpec2→3みたいな、単純な文法の変更を何度も繰り返したくない
  • 開発者は
    • 良くしていくのがすき
    • なんどもおなじことはしたくない

自動化

  • cane
  • reek
  • rails_best_practices
  • チェックしてくれるだけで、代わりにやってくれるものってなかった
  • IDE
    • リネーム(class/method/変数名)
    • メソッドの抽出
    • カスタマイズできない
  • テキストベースでやってきた
    • sed
    • Rubyコードで
    • 正確じゃない
      • 文字列の中も置換しちゃったり
    • 複雑なケースに対応できない
  • ASTベースでやりたい
    • Abstract Syntax Tree
    • ずっと正確
    • ripper
      • 1.9から標準
    • ParseTree
    • ruby_parser
    • parser
    • 正確だけど読みにくい!
      • transpec

Synvert

7 years of Ruby & Rails with the same web site

zep & kevin

iKnow!

  • Cerego
  • 英語のラーニングプラットフォーム
  • Super SRS(Space Repitition Software)
  • 歴史
    • 2007 iknow.co.jp
    • 2009 smart.fm
    • 2011 ikonw.jp
    • 2013 cerego.com
  • memory bank
  • mobile apps

学んだ3つのこと

コードの共有はつらい

  • 共通のコアにWeb/API2つのアプリ
    • git submodules
      • bundlerが使えない
      • エディタとかで扱いにくい
      • デプロイやJenkinsビルドが複雑に
    • rails engine
    • gem
  • Fork
    • 失敗
      • 同期を失う
      • Rails更新がつらい
      • システム要件がそれぞれ変わってしまう
    • 成功
      • 新しいサービスの立ち上げが速い
      • よく知られたコードベース
      • 独自の変更が許される
  • その他の同期の方法
    • cherry-pick
    • Gems
    • Engines

独自の解決は努力がいる

  • 独自のコードをたくさん作った
    • gem管理
    • アセット管理
    • アクセス管理
    • ...
  • 新しい人が来るたびに、「なんで〜を使ってないの?」になる
  • パッチだらけ
    • Railsの更新が大変に
    • verndor/patchesに入れて管理
  • カスタマイズすべき時
    • Railsにないコンセプト
    • パフォーマンスが求められる、具体的なコアのコード
    • ドメイン独自のコード
  • 止める時
    • いろいろ問題が起きた時
    • 作者がいなくなった時
  • 標準の道具を使おう
  • 独自のコードはオープンソースにしよう
    • rackミドルウェアでレコードをキャッシュするのとか
      • キャッシュが消えてなくて苦労した

人々も変わる

  • 60人の開発者がいた
  • 1400以上のmigration
  • 人が去ると
    • 知識が失われる
      • workaround
      • データ構造
      • 死んだコード
    • テストの意味がなくなる
      • テストヘルパーが忘れられる
      • テストは意図ではなく値をチェック
    • 良い設計のコードも悪くなる
      • 意図はメンテされない
      • hackがたまってく
  • 何ができるか
    • 死んだコードを除く
    • 全部を最新にする
      • RubyとかRailsとか
    • 新たな開発者を助ける
      • 全部セットアップされた新しいコンピュータを渡す

質問

どうやって死んだコードを除く?

コードを取り除いて、テストが通るか確認する?

どうやって技術的負債を返すことを説得してる?

次のプロジェクトに入る前に、説得してる。大きな変更だとメリットを強調したり

Power Assert in Ruby

辻本さん

コンセプト

  • unit/spec
    • unit系を対象
  • assertionメソッドの使い分け
    • asset_include / assert
    • 失敗時のメッセージが違う
    • 覚えるのが大変
  • そこでpower assert
    • assert{ 3.times.to_a.include?(3) }
    • Groovyにもある
    • power_assert(CRuby 2.0以上)
    • test-unit-power_assert
    • test-unit 3
    • minitest-power_assert
    • pry-power_assert
      • テストに限らず、デバッグ時にも役に立つ
    • 今後標準で入る

実装

  • 挑戦
    • 値をどう得るか
      • TRACEPOINT
    • 値の位置をどう知るか
  • TRACEPOINT
    • Ruby 2.0で導入
    • 新たなイベント
      • return_value -raised_exception
    • Exception#cause
      • tracepointで実現可能
    • 必要以上に取れてしまう
      • スタックの深さを見て、フィルタする
    • ==の値が取れない
      • 先にpower_assertを読むとうまくいく
      • なんでか
        • tracepointのイベントが起動してない
        • RubyVM::InstructionSequence.disasmでバイトコードを見ると
          • OPT_EQ
          • Cレベルで比較されちゃって、tracepointのイベントを起動しないから
      • 対策
        • 最適化を無効に
        • specialized_instruction: false
  • Ripper
    • 位置を取得するため利用
    • 多重代入でなんとか
      • 初期ではpattern matchしてた
  • どんな書き方までできる?
    • 1行しか出せない
    • 変数の再代入とか無理
    • 分岐を扱えない

まとめ

  • PowerAssert, つかってね
  • TracePoint、使うと楽しいよ

質問

パフォーマンスはどう?

単純なテストで測ってみたら10倍くらい遅くなった。。Ripperで時間がかかってる

最初にrequireしなきゃいけないのは嫌。最適化を落としたければ、メソッドを再定義するとかできそうな

試してみましょう

苦労してる部分はRubyのコアで対応してもいいよね

ありがとうございます。

遅くなったやつを早くしたり、局所的に有効にしたりできる?

あまり速度は考えてなかったので、いくつかやれることはあるはず。bindingをつくるところとか。

Lightning Talks

実践的Factory Girl

高橋さん(@kenchan)

  • モチベーション
    • テストデータを作るのは簡単だけど、継続的にメンテするのは大変
  • traitでモジュール化
    • なるべくtrait
  • イベントデータのファクトリは作らない
    • アソシエーションが大事だから
  • 見直していく
    • BDD-style
      • describeでlet
      • contextでbefore

ネイティブライブラリとgem

Rei Kagetsuki

  • プラットフォームごとにやり方
  • HerokuではHammer
  • Build
  • Vendorize
  • Engage!

ofruby

  • iPhoneで動くRuby開発環境
  • 実行/編集/デバッグをiPhone上で可能に
  • 内部構成
    • 実行はmruby
    • openFrameworks for iOS
  • なんで作った?
    • iPhoneは偉大だけど、家庭用PCが減ってる
    • 子どもたちがプログラムに触れられない!
  • デモ
  • ongaeshi/ofruby

Keep Freedom of Ruby

大場さん

  • 自由が好き
  • Rubyは自由
  • チームだったり、ずっとやってたりすると一貫性を保つ必要が出てくる
  • 自由 vs 一貫性
  • 自由を手放すことには慎重であるべき
  • チームの意見が分かれたりする
  • 一貫性にこだわりすぎると、チャレンジを損なう

Rubyist Magazine10周年

  • 大事なこと
    • るびまに記事書いてね
  • 0048号、本日リリース
  • 変わったこと
  • これからもるびまをよろしく!

mrubyのエッジケースを試す

  • 64bit整数対応
    • mrb_get_args
  • 問題を見つけるのは簡単!
  • だから今やるべき
  • Rails勉強会東京の発起人でした

確率的存在とプログラミング

  • アイディアとかひらめきとかってなんなのか?
    • うまくいったりいかなかったり
    • 利益もまちまち
  • 確率的存在
  • アイディアの価値とは期待値では?
  • アイディアの価値は低い?
  • 期待値には加法性
    • たくさんあればいいのでは?
    • 試行がいる
  • コーディングという試行錯誤が必要
  • 加法性ってあやしい
    • 条件付き期待値
    • 似たアイディアは片方がうまくいかないと価値が減ってしまう
  • 確率的独立に近い、多くのアイディアが必要
  • 多種多様なコードを書かなければならない
  • アイディアの価値が…とか言ってる人にこういう話をしてけむにまく!

R/W splitting

  • モデルごとにDBを切り替えることはできる
  • 読み込みと書き込みを標準では分けられない
  • octopus
  • acts_as_readonlyable
  • github.com/eagletmt/switch_point
    • modelとdbの間にproxy
    • Railsの実装に依存しない

バージョン1について

@tagomoris

  • バージョン1以上のgemをリリースした?
  • semver
  • v0って本番に耐えないってこと
    • 本当にそう?
  • v1をリリースしよう
  • バージョニングは開発者とユーザのコミュニケーション

RSpec3への移行をどうスムーズにしたか

中山さん

  • RSpec 2.99
  • transpec
    • AST
    • 実行時情報
  • 15分くらいで終わる
  • なぜ可能だった?
    • specが実行可能だったから
    • テスト可能
    • 多くのユーザがいたから
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment