Skip to content

Instantly share code, notes, and snippets.

@mshibuya
Created September 22, 2014 04:34
Show Gist options
  • Save mshibuya/ebdc3346d1d3cd8c1e4b to your computer and use it in GitHub Desktop.
Save mshibuya/ebdc3346d1d3cd8c1e4b to your computer and use it in GitHub Desktop.
RubyKaigi2014 初日

RubyKaigi 2014 9/18

CRuby Committers who's who in 2014

近永さん

  • subversionアカウント数 84
  • うち去年のRuby会議以降コミットがあった数 54
  • うち今回のSpeaker 15
  • 以下発表順に

nagachika 近永さん

  • 2.1 branch maintaner
  • RubyPrize 2013

ko1 笹田さん

  • Heroku
  • Ruby's VM
  • RGenGC
  • Incremental GC (will be available in 2.2)

nari 中村さん

  • Mr. GC
  • Lazy sweep/Bitmap Marking
  • Symbol GC (NEW)
  • Rails 5はRuby 2.2以降が前提になる?

matz まつもとさん

  • The Creator of Ruby

kazu 西山さん

  • Mr. 'fix typo'
  • 発表:Ruby考古学

hsbt 柴田さん

  • GMOペパボ
  • admin of ruby-lang.org servers
  • 発表:Rubyへのcontributeの方法について

sorah 福森さん

  • CookPad
  • 発表:CookPadでの大規模サーバへの高速デプロイ

kouji 高尾さん

  • Readline extension maintaner
  • Ruby Programming Shounendan(NEW)

ktsj 辻本さん

  • VM Bug Hunter
  • Pattern Matching
  • Power Asset(NEW)

tenderlove Aaron Patterson

  • RedHat
  • psych/dl/fiddle
  • Rails Committer
  • Author of Nokogiri
  • 発表:Speeding up Rails 4.2

keiji 石塚さん

  • Rubyの名付け親
  • irb author & maintaner
  • 発表:Reish

seki 関さん

  • dRuby/rinda/erb author & maintainer
  • 発表:非同期プログラミング

zzak

  • Documentation maintaner
  • rubygems, rake, rdoc contributor
  • 発表:tending the ruby ecosystem

kou 須藤さん

  • ClearCode
  • rexml/rss/xmlrpc maintainer
  • Droonga(NEW)

tmm1 Aman Gupta

  • GitHub
  • Memory Optimization
  • Inspection/Profiler/Debugger
  • Hash#[] Optimization(NEW)
  • ObjectSpace.dump_all(NEW)

Keynote: Building the Ruby interpreter -- What is easy and what is difficult?

笹田さん

2014年

  • 結婚して1年
  • YARV, Rubyの会, るびまから10年

やったこと

  • YARV
    • Stack based virtual machine
  • Native Thread strategy
  • Fiber
    • 同期的マルチスレッド
  • method cache
  • Flonum
  • RgenCC
    • 世代別GC
    • Incremental GC(for 2.2)
  • Research Projects
    • 高速化とか並列化とか
  • Community activities
    • 日本Rubyの会
    • るびま
    • RubyKaigi
    • Ruby Association

何が簡単で、何が難しいか

  • 品質
    • Reliability / Availability
    • High Performance
    • Low machine resources
    • Good compatibility
    • Extensibility
  • トレードオフ
    • トレードオフを知ること
    • トレードオフをどこに置くか決めること
    • トレードオフに打ち勝つこと

Rubyの性能について

逐次実行

  • 簡単
    • VMの導入
    • JITコンパイルの導入
  • 難しい
    • テストもRubyで書かれているので、通すだけでも大変!
    • 生産性・信頼性・互換性を保つこと
      • 同じようなコードをたくさん書く必要が出たり
        • コード生成で解決
    • 大幅な最適化でパフォーマンスを保つこと
      • Rubyが持つ動的な仕組みに対応できなかったり
        • 脱最適化
    • Cのコードとの親和性
      • コアライブラリをRubyで書くとか
      • Cのコードにアノテーション
      • CのコードとRubyコードを混ぜる

並列実行

  • 簡単
    • 並列スレッドを単純に提供すること
  • 難しい
    • プログラミングしやすいようにすること
      • スレッドは難しい
        • すべての状態を共有しているから、同期が必要
          • 一個でも欠けるとバグになる
        • 非決定的な挙動
          • 再現しにくい
      • 解決策
        • プログラマを教育?→無理
        • よいプログラミングモデル
          • forkしてIPC
          • Multiple Virtual Machine
          • Smaller isolated Ruby
          • オーナースレッドの導入
        • デバッガ
          • スレッド間の競合の検出
          • 決定論的挙動になるようOSスケジューラを変える
      • パフォーマンスと柔軟性のトレードオフ
        • 似た例: free()対GC
    • 直列実行時のパフォーマンスをよくする
    • コードの品質・信頼性・互換性

GC性能

  • 簡単
    • GCのアルゴリズムは簡単
  • 難しい
    • GC以外のInterpreter全体を見直す必要がある
      • 互換性
      • ライトバリア
        • 新たなアルゴリズムを考案して解決
    • 品質
      • バグがあると最悪
      • 非決定性
        • デバッグ機能をつける
          • GC.stress
          • アサーション

計測

  • 簡単
    • ベンチマークするのは簡単
  • 難しい
    • 定期的に測る環境づくり
      • いろんなマシンで測ったり
    • 何を測るか決める
      • micro
      • Rails application - discourse

開発コミュニティ

  • 簡単
    • コミッタになる
  • 難しい
    • 続けていくこと
      • トレードオフに打ち勝つこと
    • モチベーションを保つこと
    • Rubyソースコード完全解説
    • Ruby Under a Microscope

まとめ

  • まだまだやることはたくさんある
  • Ruby開発者に加わってね!

質問

今手伝ってほしいことは?

↑で言ったこと全部やりたいので、手伝って欲しい。特に並列処理

今までで一番難しかったことは?

世代別GCを導入できたことと、YARVでProcを作ったこと

並列処理が得意な言語を使うのではなく、Rubyでできるようにしたい価値とは?

自分で作ったほうが楽しいから!

Controller Testing: "You're doing it wrong"

Jonathan Mukai-Heidt

  • Groundwork

コントローラのテスト

  • TDDによって独立性の高いコードを書くのを助ける
  • リグレッションを捕まえる
  • アンチパターン
    • なんでもスタブする
    • なんでもインテグレーションテストする
      • コードの独立性を担保できない
    • テストを書かない

コントローラは

  • 一つの大きいアクション
  • 小さな詳細たちからなる
  • Railsのコントローラは宣言的に
    • imperative / declarative
  • ロジックを入れない!

Rubyは手続き的だけど、宣言的なコードをcontrollerに書く

手続き的に書いちゃだめ

  • コントローラのロジックは薄くするのではなく、完全に無くすべき
  • コントローラにあるもの
    • 認証
    • 権限
    • リソースの有無
    • レスポンス

テストはよりよいコードを書くことを助けるもの

  • コントローラが宣言的なら、

  • テストも宣言的!

    it { should assign(:some_resource) }

  • 認証みたいな共通部分のテストにはshared_exampleを活用

テストはチェックリストみたいに!

コントローラは薄く、モデルを厚く

  • 6つ中5つのプロジェクトは、fat controllerに苦しんでる
  • ActiveModel
    • ビジネスロジックをいれるために役立てよう!
    • モデルは手軽
    • 「モデルを作るには小さすぎる」ってことはない
  • 要件は常に変わる
    • 全部controllerに入れてったら、fat controllerに
  • 動詞ではなく、名詞について考える!

まとめ

  • 宣言的なコントローラ・宣言的なコントローラテストをすることで
    • テストが簡単になる
    • よい設計を助ける
    • コントローラを単純に保つ

質問

モデルとの結びつき方はどうテストする?

インテグレーションでテストしていい?

GitHubでの継続的デリバリ

@rsanheim

継続的デリバリとは

いつでもデプロイ可能なソフトウェア

  • いつでも顧客に価値を届けられる
  • 短いリリースサイクル

なぜやるのか?

  • 変化に追いつくため
  • 痛みを伴う
  • リリースは楽しい

リリースサイクルの短縮

  • 従来のリリースサイクルは長い
  • 継続的デリバリでもっと短いサイクルを繰り返せる

どうやって?

  • 自動化
    • 継続的デリバリに不可欠
  • テスト
    • 正しさを検証する
    • test/app LOC ratio 1.06
  • pull req
    • 早く開いて、アイディアについて話し合う
  • 機能フラグ
    • 特定の機能をオン・オフする
    • 長く走るブランチは扱いにくい
      • なので早くマージして、フラグで出し分け
    • 例: GitHubのRails3への更新
      • ブランチを切っていたが、うまくいかなかった
      • Rails2/3両方でひとまず動くようにしてから、Rails3で正しく動くように
    • テストを通っても確信できないことがある
  • チャットで運用
    • Hu-Bot
    • だれでもdeployできる!
    • 何か問題があったらすぐrollback
  • デプロイ後
    • HAYSTACK
      • 例外とかをチェック
    • Performance Dashboard
    • Twitterでなにか言ってないか確認
    • 障害報告のメールボックスも確認

今日から始めよう!

  • More money
  • More fun

What's wront with your app

Keiko Oda(@keiko713)

Heroku Japan teamの紹介

my app is down

  • Herokuの問題のときもあるけど、
  • たいていappが間違ったことをやってる

Heroku H12 request timeout error

  • 30秒

原因トップ3

  • リクエストが遅い
    • コードの問題?
    • 外部サービス?
    • データベースの問題?
    • Dynoをクリアしてリクエストキューを空にする必要がある
  • トラフィックの急増
    • Dynoを増やす
      • データベースもスケールアップする必要がある
    • 負荷テストをしておいた方がいいよ
  • メモリ不足
    • 512MB
    • Ruby 2.1からメモリ使用量が増えた
    • unicornのプロセス数は適切?
    • メモリリークかも?

今すぐすべきこと

  • ログ
    • 1500行しか記録できないので、どこかにとっとくべき
    • Heroku Loggin add-on
  • 監視
    • New Relic
    • Pingdom
    • Heroku Expensive Queries
    • dashboard.heroku.com
  • 正しいサーバを選ぶ
    • unicorn
    • puma
  • タイムアウトを正しく
    • Unicorn timeout: <= 15s
    • rake-timeout: <= 10s
    • 500ms以下でレスポンスを返せるようチューニングする

Egison Pattern Matching in Ruby

江木さん

概要

  • 柔軟なパターンマッチングができるプログラミング言語「Egison」の持つパターンマッチを、Rubyでも使えるようにした
  • 無限集合にも対応

パターンマッチングとは?

  • データの分解
  • 条件分岐

RubyでのEgison Pattern Matching

  • データの分解
  • 条件分岐
  • データごとにパターンマッチの仕方をカスタマイズ
    • Element Patterns(*なし)
    • Collection Patterns(*あり)
  • 非線形パターン
    • Value Patterns(__)
    • 前に捕まえた値を制約条件にできる
  • バックトラック

Egison gem

https://github.com/egison/egison-ruby

今後

Egison

  • 2010年から
  • 純粋関数型
  • Haskellで実装
  • パターンマッチ
    • より拡張可能
    • パターンをlexical scopeありでモジュール化できる
  • ちょっとづつ知られるようになってきた

プログラム言語についてのmind map

  • 数学的抽象化
    • 関数のモジュール化
    • 型システム
    • パターンマッチング
  • コンピュータの抽象化
    • メモリ最適化
    • 分散コンピューティング
  • 人間の理解しやすさ
    • わかりやすい構文

Egisonの用途

  • 日頃のプログラミング
  • クエリ言語
  • AI

最後に

  • CodeIQで記事書きます!

質問

速さ的には?

大丈夫じゃない?

デバッグ大変じゃない?

悩んだこととかない!ループで書くより簡潔なので、バグはなくなるはず

Ocamlでは全条件が網羅されたか判定してくれるけどそれはどう思う?

とくに。。対応予定もない。

直感的に、っていうけど実際どのくらい読みやすいの?

東大の友達は3時間見たらわかった。。Lispと同じじゃね?

Inside RubyMotion for Android

Laurent Sansonetti(@lrz)

RubyMotion

  • RubyでiOSアプリが作れる
  • bridgeではない
    • iOS上のRuby実装
  • interpreterではない
    • evalはできないよ
    • コンパイル時に最適化

最近のニュース

  • iOS対応
  • arm64近日対応
  • iPhone6
  • Apple Watch

Android

  • スマートフォンで圧倒的なシェア
  • タブレットものびつつある
  • Rubyで書きたい

RubyMotion Android

  • 昨日public betaに
  • Rake Tasks
  • Emulator
  • Device上で動かす方が速いのでおすすめ
  • お気に入りのエディタを使える

DEMO

どうやって動いてるのか?

  • ランタイム
    • Rubyの新たな実装
    • Javaと統合されたobject model
    • オブジェクト管理はAndroid Garbage Collectorを使う
      • local/globalな参照
  • コンパイラ
    • JNI用機械語の静的生成
    • クラスのためのDEXバイトコードの作成
    • DWARF metadata
      • symbolicateやbacktrace用
  • REPL
    • interactive console
    • リモートでのJITコンパイル
    • iOSにも入れたい

まとめ

  • RubyMotionでiOSとAndroidのアプリが作れる
  • 好きなエディタで
  • Rubyを使って!
  • プラットフォーム間でコードを共有

"Gem of this Week" - building culture and making gem

三浦さん

  • 技術的負債を減らす
    • 共通化

コンポーネント化

エンジニアのみんなが共通化を考えて、gemを作っていけば開発速度を向上できる

  • privateなgemサーバ
    • geminabox
    • 社内からのみのアクセス
  • 共通のコード
    • UAをparse
    • In-App purchase
    • 死活監視
      • komachi_heartbeat

アナウンスする

  • コミュニケーションツール上で
  • 開発者ミーティング
  • pull request

文化をつくる

カジュアルにgemが作れるよう

  • 「今週のgem」

    • 毎週アナウンス
  • 障壁

    • rubygems.orgに公開するのははずかしい?
      • private gemを推進
      • アップロードの手間
        • drecom_gemでbundle gemなどをラップ - 英語
    • 忙しい
      • 余力があるうちに共通化
    • スキルが必要
      • 新卒の人に共通化してもらったり
  • 多くのメンバーからgemが生まれた

他の要素

  • GitLab
    • 他のプロジェクトを見られる
  • 社内ツール作成サークル
    • 締め切り駆動開発
    • gemicom
      • gemnasiumにインスパイア
      • gem追従ランキング
  • 社内に限らないものは、rubygems.orgに公開していきたい
    • capistrano-drecom-deploy
    • rails_security_patch_cve_*
    • drecomssh
    • ordered_find

まとめ

  • プライベートなgemサーバ
  • 「今週のgem」
  • 文化として根付かせる
    • リポジトリを自由に作れる
    • 継続して更新していった
    • みんな幸せになりたかった
  • 幸せになった!

質問

複数gemを1リポジトリに入れる?

gem1つで1個のリポジトリをつくってる

gemとしてリリースすることは重要?

Gemfileが綺麗になるし、リリースすると気持ちいいので。

Ruby Committers vs the World

コミッター陣の紹介・twitter上で集められた質疑など

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment