Skip to content

Instantly share code, notes, and snippets.

@mshibuya
Created May 31, 2013 00:41
Show Gist options
  • Save mshibuya/5682308 to your computer and use it in GitHub Desktop.
Save mshibuya/5682308 to your computer and use it in GitHub Desktop.
5/30 Ruby会議メモ

Ruby会議 5/30

Rubyの歴史

  • 1995 Ruby 0.95 fj.sourcesで公開
  • 1996/12 Ruby 1.0
  • 1999 最初の書籍
  • 2000〜2002 書籍が色々出る
  • 2001 初の英文書籍 RubyConf
  • 2005 Railsが広まる

===

Matz keynote「Rubyのつくりかた」

  • 1973 プログラミングを始める BASIC シャープ製ポケコン
  • 1980 Pascalの本を読む 言語愛
  • 1982 Lispの本
  • 1983 OOP
  • 1984 Smalltalk
  • 1988 C Emacs
  • 1989 CLOS(Common Lisp Object System)
  • 1999 cmailを開発・メンテ(最初のフリーソフトウェア)
  • 1991 OOP C(クラスライブラリみたいなの)
  • 1993 Ruby
プログラミング言語とは
  • 思考の表現
  • より良い思考
  • 思考のガイド
  • 言語設計は思考設計
  • 言語設計は自由
  • 言語実装は楽しい
  • 言語実装はコンピュータ科学の総合芸術
    • データ構造
    • パフォーマンス
    • 最適化
  • 困難
    • 「まだ言語が要るのか?」
    • 「どうせ広まらない」
    • 「時間のムダ」
    • 「たしかにそうかも(自分自身のネガティブさ)」
  • 諦めかけた
  • 私は言語が好きだ
  • 言語設計を始めた
    • 雑多なアイディアに基づいて
      • 例:逆逆ポーランド記法 → 単なるポーランド記法だったw
      • 例:Classic(クラスっぽいC) → 黒歴史
      • 例:オブジェクト志向シェル → 構想倒れ
      • Ruby
        • 1993-1994 一人で開発
        • 障害:モチベーションの維持
          • 「Hello World」に半年
          • GCに2ヶ月 - 関係ないところで落ちるからデバッグが大変!
        • 1994/12 αリリース
        • 1995/12 0.95 リリース
        • Ruby=Lisp+Smalltalk+Perl+C
      • Ruby is-a Lisp
        • データモデル Mix-in S式なし
      • Ruby is-a Smalltalk
        • クラスライブラリ Method missing
      • Ruby is-a Perl
        • 文字列操作 正規表現 配列操作
      • Ruby is-a C
        • 演算子 UNIX文化
  • 開発の秘訣
    • 全く新しいものを追求しない
    • 1つずつ進歩する
    • 組み合わせる
    • よく知っている(or 好きな)ものを
    • 自分が使いたいものを作る
    • 作品を愛する
    • 長く続ける

#####新しいものを始める時に、みんな反対する 「うまく行くはずない」

#####心配するのをやめて、言語を作りましょう!

  • 関数型言語
  • ドメイン特化言語(DSL)
  • ミニ言語
  • トイ言語
  • 言語設計で良いプログラマに
    • 言語を基本抽象に
  • 言語はプログラミングの本質だから

Q&A

mruby?

頑張ってます!

Ruby 2.1?

出ます!

言語実装をはじめるには?

なにかオープンソースの小さめなものから見はじめるといいよ! Lispとか構文解析がちっちゃいのでいい。

Rubyは仕事の後とかに作ってたの?

窓際だった頃につくりました! あと、仕事中にRubyの開発をして通勤中に仕事の開発をしてました!

Ruby 2.1のRefinementsは?

頑張ります。Refinementsは死なない!

最近おもしろかった言語は?

  • Clojure
  • Erlang
  • Fortless

===

本番とと同じ環境を開発・ステージングで使う

@crigor EngineYard

production

AWS EC2, EBS EBS snapshot

staging

使うたびに作る。終わったら消しちゃえばその分しか料金がかからない

Chef

AMI
  • App
  • Web Server(Nginx)
  • App Server(Unicorn, PHP, FPM)
Chefレシピ
  • template(database.yml memcache.yml)
  • jsonファイルから差し込める

本番のebsボリュームのsnapshotを取って、それをステージングを作る際にattachする

development

VMを上げる。ローカルにはインストールしないので、複数バージョンを共存させたりしなくて済む。

  • VirtualBox
  • Vagrant
Vagrant

boxはAMIみたいなもの。vagrantにchefを走らせて全部用意する。

vagrantはホストマシンのdirectoryをマウントしてくれるので、ローカルにあるのと同じ感覚でエディタで編集できる。

Boxはどうするか
  • Officialのを使う
  • 誰かが作ったのを使う
  • 自分で作る

http://crigor.com/rubykaigi

Debian chefインストール済み・ほかはなし

まとめ

同じ環境を本番・ステージング・開発に使えるよ!

===

RubyMotionの内側

Laurent Sansonetti, Shizuo Fujita/HipByte

RubyMotionとは

  • iOS / OS X 開発に使えるツールチェイン
  • Rubyの方言(ない機能・追加した機能もある)
  • RubyランタイムとObjectiveCランタイムの融合
  • Rubyの静的コンパイラ(直接Intel/ARM機械語へ)
  • ラッパー/ライブラリエコシステムのプラットフォーム
  • 商業プロダクト
使われてるところ
  • たくさん
  • Basecamp iPhone app

好きなエディタで作れるよ!

  • Sublimt
  • TextMate
  • RubyMine IDE
CocoaPods

パッケージマネージャー

アプリケーション作成のフロー

  • 実演

どうやって動いてるの?

  • Objective-C runtime上に実装
    • RubyCocoaみたいなbridgeではない
  • RubyMotionのclass, methods, objectはそのままObjective-Cのclass, methods, object
    • Ruby<=>Objective-Cでデータの変換なく互いに呼び出し可能
  • RubyMotion VM
    • GVLがない(Global VM Lockか?)
  • GCD
    • Appleが提供する機能
    • CPUコア数に応じてスレッドが生成される
  • コンパイラ
    • Ruby -> AST -> LLVM IR -> Assembly -> Machine Code
    • マシンコードに変換 → フラームワークのリンク → ipaアーカイブの作成

### まとめ

  • Objective-C runtimeと結びついている
  • 静的コンパイル

===

Jrubyの未来

@tom_enebo @headius

  • 2.1には機能でRubyに追いつくよ
  • 性能
    • JVM自体が進歩してる
    • JRuby自体も進歩してる!

JRuby / JVM / OS

開発の流れ

  1. 正しく動く
  2. 最適化
  3. JVMに直す点を指摘
  4. 直るまでまつ
  5. 2へ

性能比較

すごく速い!red/black treeベンチマークでRuby2.0の1/20、Rubiniusの1/5

でもJVM開発は遅い…

次のメジャーリリース

  • 外部Java API変更
  • 内部の大変更
  • 新しいランタイム(IR)

2014年!多分…

最適化
  • 定数伝搬
  • IR 実行時オーバーヘッドを削減
  • 最適化後の中間コードをキャッシュして再利用
C API
  • 直接ポインタ
  • 実装が困難
  • FFI
    • MRI, JRuby, Rubiniusで動くようメンテされている
  • XNI
    • 実験的なC API代替実装
  • 並行実行ライブラリ
    • 実装間で互換性のある標準方法が必要
他のRuby実装との協力
  • 並行実行
  • 最適化
  • Security
  • 仕様
  • Communication

Q&A

エンコーディングのサポート
MRIからJRubyに移行を決める上での決定的なポイント
  • ロード時間が遅い
  • C extension対応が弱い

===

Ruby root

@hsbt / asakusa.rb, paperboy&co

ruby-lang.org

新米コミッタ業

root業

  • ruby-lang.orgのroot権限
    • いろんな人に権限付与
    • メーリングリストへのメンバー追加・削除
  • rubyist.netのroot権限
    • Rubyのバージョンを上げた(1.8.7 -> 2.0.0)

Radiant CMS → Jekyllへ!

結論

  • ruby-langのroot権限・Rubyのコミット権をもらいました
  • PullRequestしてね
  • Rubyを楽しもう!

===

効率的なRuby2.1に向けて

ささださん

スライド http://rvm.jp/t.pdf

  • Ruby 2.1スケジュール
  • 内部の新機能

Ruby2.0の新機能

  • キーワード引数
  • Refinements
  • Module#prepend

Ruby2.1の新機能

  • m17nの修正
  • Ruby 2.0で導入された機能の改良

メモリ管理の内部hook

  • オブジェクト割り当ての性能解析がしやすく

RGenGC

  • 世代別GC
  • ライトバリアで保護したもの・されていないものを扱う
  • C extへの互換性の問題が(多分)ない
今のGC
  • マーク&スイープ
  • C拡張に親切
世代別GC
  • 全部やったら無駄だよ
    • 若いObjectが早く死ぬから
    • 世代別にわけ、若いのにGCを先にやる
  • old/new
    • ライトバリア
      • oldがnewを参照することを検出
    • Remember Set
ライトバリア
  • 既存のC-extに挿入しなきゃいけない
  • 3rd partyのものには手が出せない。

そこで!

RGenGC(Restricted Generational GC)
Shady object
  • オブジェクトを2つに分ける

    • Shady: WB保護されない
    • Sunny: WBで保護された
  • 作成時に分ける

  • SunnyはShadyになりうる。逆はない

  • マーク時間が短くなる

  • スイープ時間は変わらず

  • WBのせいで実行時間が少し遅くなる

######利点

  • WBに保護されないオブジェクトが存在できる
  • 少しずつWB対応することでパフォーマンスを改善できる

######問題点

  • 死んでるのに生きてると誤判定されるオブジェクトが増える
  • WBを適切に挿入できていないとバグになる
  • スイープの時間は変わらない

######将来の改良点

  • Major GCの回数の調整
  • classをsunnyに
  • 「sunny」って用語は変

Ruby 2.1でやりたいこと

  • インラインメソッドキャッシュの改良
  • 同じ内容のStringを共有

===

Appraisal、便利だよ

@sikachu

なんで古いバージョンでテストするのか?

  • みんな使ってるgemをアップデートしないから
  • 最新バージョンで動く != 古いバージョンで動く
  • semver
    • 守らない人がいる
bundlerの前

uninstall and reinstall

まずい方法

  • 時間がかかる
  • 複数バージョンを同時にテストできない
  • 依存性の問題
rvm / beng
  • スペースの無駄
  • 開発に参加するのにruby managerが必要
  • bootstrap scriptみたいなのが必要
bundler

Gemfileを分ける

  • メンテが大変
  • 繰り返し依存性を指定しなきゃいけない

もっといい方法があるはず!

Appraisal

一つのファイルで複数バージョンの依存性を管理し、bundlerのための環境を自動でつくる

Demo

CIで使う

paperclipのTravisCIでも使ってる!

PR

http://learn.thoughtbot.com/

Promocode: RUBYKAIGI

===

RubyJS

@hasclass

  • Rubyにはメソッドがたくさんある
  • JSにはそんなには多くない

ライブラリでJSを拡張する

  • underscore.js
  • wrapper object
    • メソッドチェーン呼び出しでJS型に戻す
  • native classを拡張

RubyJS

Demo

どんな実装になっているの?

  • String
  • Array
  • Hash
  • Range
  • Time
  • Regexp
  • Fixnum
  • Float

注意点

  • JS型でしか動かないよ
  • 戻り値は全部RubyJS型だよ
  • blockの引数はJS型だよ
  • 名前と別名に注意

バリエーション

  • Base, helpers
  • メソッドの実装(RubyJS-Lite)
  • chain可能(RubyJS-Chaining)
  • RubySpecJS

R.god_mode()

JSネイティブ型をRubyJS型で置き換える!

まとめ

  • Fast
  • Small
  • 単一ライブラリ
  • 拡張可能
  • 魔法をつかってない

http://github.com/rubyjs/corelib

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