1 rails for ruby 1.9 moriq rails 勉強会 @ 関西. 2 もくじ ruby 1.8 vs 1.9 rails for ruby 1.9...

45
1 Rails for Ruby 1.9 moriq Rails 勉勉勉 @ 勉西

Upload: edgar-webster

Post on 18-Jan-2016

234 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

1

Rails for Ruby 1.9

moriqRails 勉強会 @ 関西

Page 2: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

2

もくじ

•Ruby 1.8 vs 1.9•Rails for Ruby 1.9•Install Ruby 1.9•Benchmark

Page 3: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

3

Release schedule

•Ruby 1.8.6 – 2007/03•Rails 1.2.3•Ruby 1.9.1 – 2007/12–この時点で Railsも動くと嬉しい

Page 4: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

4

Ruby 1.8 vs 1.9

Page 5: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

5

Quiz #1 String

p "A"[0]

p ?A

Page 6: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

6

Quiz #1 String

p "A"[0] 65 "A"

p ?A 65 "A"

Page 7: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

7

Quiz #1 String

p "A".ord65

p 65.chr "A"

Page 8: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

8

Quiz #1 String

•String は bytecode の配列•String は文字の配列

Page 9: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

9

Quiz #2 Array

x=[0,1];x[0,1]=nil;p x

y=[0,1].zip([2,3]);p y

Page 10: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

10

Quiz #2 Array

x=[0,1];x[0,1]=nil;p x

[1]

[nil,1]

Page 11: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

11

Quiz #2 Array

Array#[]=nil•要素を削除•値として nil を設定

ENV['…'] = nilENV.delete('…')

Page 12: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

12

Quiz #2 Array

y=[0,1].zip([2,3]);p y

[[0,2],[1,3]]#<Enumerable::Enumerator:>

•Stream を効率的に扱う

Page 13: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

13

Quiz #3 when

x=1p case x when 1: "A" when 2: "B" end

Page 14: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

14

Quiz #3 when

"A"

syntax error, unexpected ':', expecting keyword_then or ',' or ';' or '\n'when 1: "A"

^

syntax error, unexpected keyword_when, expecting $endwhen 2: "B"

^

Page 15: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

15

Quiz #3 when

•コロン ':' は貴重な資源– Symbol :foo–Module Foo::Bar– Hash {x:1,y:2}– Keyword arguments (Ruby2.0?) x:,

y: = {x:1,y:2}

Page 16: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

16

Quiz #3 when

x=1p case x when 1; "A" when 2; "B" end

Page 17: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

17

Quiz #4 send

class C def one() 1 end private :oneendp C.new.send(:one)

Page 18: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

18

Quiz #4 send

1

in `<main>': private method `one' called for #<C:0xc285a8>

(NoMethodError)

Page 19: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

19

Quiz #4 send

class C def one() 1 end private :oneendp C.new.funcall(:one)p C.new.__send!(:one)

Page 20: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

20

Quiz #4 send

send funcallpublic Y Yprotected N Nprivate N Y

Page 21: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

21

Ruby 1.8 vs 1.9

•文法 : ほぼ同じ•メソッド : 非互換あり

Page 22: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

22

Rails for Ruby 1.9

Page 23: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

23

Rails for Ruby 1.9

•Ruby 1.9 対応 Rails を作る– Ruby trunk (v1.9.0)– Rails 1-2 branch (v1.2.*)

•ActiveSupport•ActionPack•ActiveRecord

Page 24: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

24

Dependency

•Rails が依存する外部ライブラリ– DB binding, Web server– Rake, RubyGems– cgi.rb

•Rails だけの対応では済まない

Page 25: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

25

Unstable…

•Ruby 1.9はまだ不安定– [BUG]との戦い

•Railsは安定性が最重要–ゆっくり移行

Page 26: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

26

Test First!

•テストも 1.9 対応は必要•Ruby の変更に弱い

2007-03-15:AS: 8F 6EAP: 1F 0E AR: 7F 0E (base_test only)

Page 27: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

27

Optimizing

•新仕様を使って効率改善– Class variable– *_methods– BasicObject

Page 28: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

28

Resources

Project site:http://collaboa.moriq.com/

SVN repos:http://dev.moriq.com/svn/

local/rails/

Page 29: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

29

Install Ruby 1.9

Page 30: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

30

Install Ruby 1.9

•1.8 環境と共存させる– configure options–注意 : #!, `ruby`

•RubyGems のしくみ– $GEM_HOME– 1.9 で動作 [ruby-dev:30582]

Page 31: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

31

configure options

--enable-shared--prefix=~/c--program-suffix=-1.8.6

/home/moriq/c/bin/ruby-1.8.6

Page 32: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

32

shebang #!

~/c/bin/gem:#!/usr/bin/env ruby

~/c/bin/rake:#!/home/moriq/c/bin/ruby-1.8.6

Page 33: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

33

call ruby

rake/Rakefile:

`ruby -Ilib ./bin/rake

--version`

Page 34: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

34

Install Ruby 1.9

•1.8 環境と共存させる– configure options–注意 : #!, `ruby`

•RubyGems のしくみ– $GEM_HOME– 1.9 で動作 [ruby-dev:30582]

Page 35: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

35

$GEM_HOME

/usr/lib/ruby/gems/1.8/…

export GEM_HOME=~/c/home/moriq/c/

cache/

doc/

gems/

specifications/

Page 36: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

36

Gemの構造tar xvf cache/sources-0.0.1.gemdata.tar.gz-> lib/sources.rb

metadata.gz-> metadata (YAML)

•Zlib::GzipReader– 1.9 で動作 [ruby-dev:30582]

Page 37: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

37

Benchmark

Page 38: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

38

Benchmark

•benchmark.rb–注意 : GC, IO

•profiler– set_trace_func– Ruby trunk では動かない

Page 39: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

39

Rails Bench

•gems vs vendor–あまり影響しない

•ActiveSupport– require すると遅くなる–なぜ?

Page 40: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

40

ActiveRecord Benchsqlite3-ruby select (n=1000):•1.8.6: 2147 req/sec•1.9.0: 2320 req/sec

with ActiveRecord:•1.8.6: 1100 req/sec•1.9.0: 804 req/sec

Page 41: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

41

ActionPack Bench

dispatch (n=100):

•1.8.6: 108 req/sec•1.9.0: 126 req/sec

with AR (2 records):

•1.8.6: 85.2 req/sec•1.9.0: 96.2 req/sec

Page 42: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

42

Bottleneck?

•ActiveSupport あやしい•require 'active_record' の有

無を条件に計測

•GC が効いている

Page 43: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

43

sqlite3-ruby benchmark

0.2

0.3

0.4

0.5

0.6

0.7

10 100 1000 10000

Runs

Avg. runtime (msec)

bm3as-190

bm3as-186

bm3-190

bm3-186

Page 44: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

44

まとめ

•Rails for Ruby 1.9 はそこそこ動作します

•Ruby 1.9 を使ってみよう

Page 45: 1 Rails for Ruby 1.9 moriq Rails 勉強会 @ 関西. 2 もくじ Ruby 1.8 vs 1.9 Rails for Ruby 1.9 Install Ruby 1.9 Benchmark

45

おわり