Slide 1

Slide 1 text

Rails ߴ଎Խઓུ 2016.7.14 Roppongi.rb #1 Toshimaru Roppongi.rb #1 1

Slide 2

Slide 2 text

self.introduction • name: Toshimaru • Github: tohimaru • Twitter: @toshimaru_e • ! Roppongi.rb Organizer Roppongi.rb #1 2

Slide 3

Slide 3 text

Rails (Ruby) ஗͍ΑͶ Roppongi.rb #1 3

Slide 4

Slide 4 text

Go ࢖͓͏ Roppongi.rb #1 4

Slide 5

Slide 5 text

׬ Roppongi.rb #1 5

Slide 6

Slide 6 text

Ͱ΋Rails ࢖͍͍ͨΑͶ Roppongi.rb #1 6

Slide 7

Slide 7 text

begin Roppongi.rb #1 7

Slide 8

Slide 8 text

جຊฤ Roppongi.rb #1 8

Slide 9

Slide 9 text

Ruby Version Up Roppongi.rb #1 9

Slide 10

Slide 10 text

Ruby Version History • 2013.2: Ruby 2.0 • 2013.12: Ruby 2.1 • 2014.12: Ruby 2.2 • 2015.12: Ruby 2.3 • 20xx: Ruby 3.0 Roppongi.rb #1 10

Slide 11

Slide 11 text

Roppongi.rb #1 11

Slide 12

Slide 12 text

Ruby 3 x 3 Roppongi.rb #1 12

Slide 13

Slide 13 text

ͱ͋ΔRailsΞϓϦͷ৔߹ Roppongi.rb #1 13

Slide 14

Slide 14 text

Roppongi.rb #1 14

Slide 15

Slide 15 text

Ruby 2.0 => 2.1 Ruby Version Up ͚ͩͰ Ϩεϙϯε଎౓͕໿2ഒ޲্ Roppongi.rb #1 15

Slide 16

Slide 16 text

Ruby Version Up ΞϓϦέʔγϣϯίʔυมߋθϩͰ΋1 Rubyόʔδϣϯ্͛Δ͜ͱͰ଎౓վળ 1 ͨͩ͠RubyόʔδϣϯࠩҟʹΑΔඇޓ׵ੑΛղফ͢ΔͨΊͷมߋ͸ඞཁ Roppongi.rb #1 16

Slide 17

Slide 17 text

What about Rails? Roppongi.rb #1 17

Slide 18

Slide 18 text

Roppongi.rb #1 18

Slide 19

Slide 19 text

Roppongi.rb #1 19

Slide 20

Slide 20 text

Roppongi.rb #1 20

Slide 21

Slide 21 text

ࣃΛ৯͍͠͹ͬͯ Rails/RubyΛ όʔδϣϯΞοϓ! Roppongi.rb #1 21

Slide 22

Slide 22 text

What about Rails? Rails ஗͘ͳͬͯ΋ Ruby ͸଎͘ͳ͍ͬͯΔ ͜ΕͰτϯτϯͩΖ, Φʔέʔ❓ Roppongi.rb #1 22

Slide 23

Slide 23 text

ϘτϧωοΫΛ௵͢ Roppongi.rb #1 23

Slide 24

Slide 24 text

ਪଌ͢Δͳ ܭଌͤΑɹ Roppongi.rb #1 24

Slide 25

Slide 25 text

Find bottleneck • NewRelic • rack-mini-profiler • rack-lineprof Roppongi.rb #1 25

Slide 26

Slide 26 text

ActiveRecord Optimization ! ໰୊ൃݟܕ • bullet: Kill N+1 issue! • activerecord-cause: Logs where ActiveRecord actually loads record Roppongi.rb #1 26

Slide 27

Slide 27 text

ActiveRecord Optimization ! DBεΩʔϚ࠷దԽܕ • flag_shih_tzu: Bit fields for ActiveRecord • counter-cache: cacheing count query result • counter_culture: Better counter-cache Roppongi.rb #1 27

Slide 28

Slide 28 text

ActiveRecord Optimization ⚡ ΫΤϦޮ཰Խܕ • activerecord-precount: Yet another counter_cache alternative. • activerecord-import: bulk inserting data Roppongi.rb #1 28

Slide 29

Slide 29 text

ΫΤϦΛҙࣝͯ͠ ActiveRecord ࢖͍͜ͳͦ͏ by ࿝֐ Roppongi.rb #1 29

Slide 30

Slide 30 text

Less rendering partials Roppongi.rb #1 30

Slide 31

Slide 31 text

N+1 partial rendering <%# views/items/index %> <% @items.each do |item| %> <%= render item %> <% end %> <%# views/items/_item %> <%= item.name %> <%= link_to 'Show', item %> <%= link_to 'Edit', edit_item_path(item) %> <%= link_to 'Destroy', item, method: :delete %> Roppongi.rb #1 31

Slide 32

Slide 32 text

Log with N+1 rendering Processing by ItemsController#index as HTML Rendering items/index.html.erb within layouts/application Item Load (0.3ms) SELECT "items".* FROM "items" Rendered items/_item.html.erb (0.5ms) Rendered items/_item.html.erb (0.3ms) ...snip... Rendered items/_item.html.erb (0.5ms) Rendered items/_item.html.erb (0.3ms) Rendered items/index.html.erb within layouts/application (57.7ms) Completed 200 OK in 80ms (Views: 77.1ms | ActiveRecord: 0.3ms) Roppongi.rb #1 32

Slide 33

Slide 33 text

Collection rendering <%# views/items/index %> <%= render @items %> <%# views/items/_item %> <%= item.name %> <%= link_to 'Show', item %> <%= link_to 'Edit', edit_item_path(item) %> <%= link_to 'Destroy', item, method: :delete %> Roppongi.rb #1 33

Slide 34

Slide 34 text

Log without N+1 rendering Processing by ItemsController#index as HTML Rendering items/index.html.erb within layouts/application Item Load (0.4ms) SELECT "items".* FROM "items" Rendered collection of items/_item.html.erb [29 times] (6.9ms) Rendered items/index.html.erb within layouts/application (10.3ms) Completed 200 OK in 29ms (Views: 26.4ms | ActiveRecord: 0.4ms) Roppongi.rb #1 34

Slide 35

Slide 35 text

[جຊฤ] ·ͱΊ • Ruby Version Up • ϘτϧωοΫ೺Ѳ => ௵͢ • gemΛ༗ޮ׆༻ͯ͠ActiveRecord/ΫΤϦ࠷ద Խ • ύʔγϟϧϨϯμϦϯάΛݮΒ͢ Roppongi.rb #1 35

Slide 36

Slide 36 text

தڃฤ Roppongi.rb #1 36

Slide 37

Slide 37 text

Rails caching Roppongi.rb #1 37

Slide 38

Slide 38 text

3 types of cacheing2 1. Fragment Cache: View fragment caching. 2. Action Cache: Controller's action caching (removed in Rails4). 3. Page Cache: Static page caching (removed in Rails4). 2 Caching with Rails: An overview — Ruby on Rails Guides Roppongi.rb #1 38

Slide 39

Slide 39 text

1. Fragment Cache Roppongi.rb #1 39

Slide 40

Slide 40 text

1. Fragment Cache • άϩʔόϧφϏɾαΠυόʔͳͲͷଟ͘ݺ͹Ε Δڞ௨ίϯςϯπʹ༗ޮ • ॏ͍ॲཧ͕૸ΔϏϡʔͷҰ෦෼Ͱ͋Ε͹͋Δ΄ Ͳߴ଎Խ͕ظ଴Ͱ͖Δ • Advanced Usage: Russian Doll Caching Roppongi.rb #1 40

Slide 41

Slide 41 text

2. Action Cache Roppongi.rb #1 41

Slide 42

Slide 42 text

2. Action Cache • Rails4Ͱ࡟আ͞ΕͯgemԽ: actionpack- action_caching • ViewͷखલͷControllerͷActionࣗମͷॲཧ͕ ॏ͍৔߹ʹ༗ޮ • cache_path ͰΩϟογϡΩʔΛΧελϚΠζ Մೳ Roppongi.rb #1 42

Slide 43

Slide 43 text

3. Page Cache • Rails4Ͱ࡟আ͞ΕͯgemԽ: actionpack- page_caching • Ωϟογϡର৅ͱͳΔControllerͷActionͷੜ ੒͢ΔHTMLΛ·Δͬͱ੩తϑΝΠϧʹు͖ग़ ͢ • ͦͷ੩తϑΝΠϧΛNGINXͳͲͷWeb Server/ Reverse ProxyͰϋϯυϦϯά Roppongi.rb #1 43

Slide 44

Slide 44 text

[தڃฤ] ·ͱΊ • FragmentCache Λ࢖ͬͯϏϡʔͷϨϯμϦϯ άΛߴ଎Խ • Controller ࣗମͷॲཧ͕ॏ͍ͳΒ ActionCache/PageCacheΛݕ౼ Roppongi.rb #1 44

Slide 45

Slide 45 text

⚠ ஫ҙ • Ωϟογϡͯ͠΋ࠜͬ͜ͷ໰୊͸ফ͑ͳ͍ • ΩϟογϡͷϥΠϑαΠΫϧ؅ཧ • ༻๏༻ྔΛकͬͯਖ਼͓͘͠࢖͍͍ͩ͘͞ Roppongi.rb #1 45

Slide 46

Slide 46 text

্ڃฤ Roppongi.rb #1 46

Slide 47

Slide 47 text

੩తϑΝΠϧ഑৴ Roppongi.rb #1 47

Slide 48

Slide 48 text

NGINX Roppongi.rb #1 48

Slide 49

Slide 49 text

CDN Roppongi.rb #1 49

Slide 50

Slide 50 text

͋Ε Railsͷ࿩͡Όͳ͘Ͷʁ Roppongi.rb #1 50

Slide 51

Slide 51 text

Rails Web ߴ଎Խઓུ Roppongi.rb #1 51

Slide 52

Slide 52 text

Roppongi.rb #1 52

Slide 53

Slide 53 text

Roppongi.rb #1 53

Slide 54

Slide 54 text

ϨΠςϯγʹෛ͚ͳ͍ϓϩτίϧ HTTP/2 Roppongi.rb #1 54

Slide 55

Slide 55 text

Before HTTP/2 Roppongi.rb #1 55

Slide 56

Slide 56 text

After HTTP/2 Roppongi.rb #1 56

Slide 57

Slide 57 text

HTTP/2 • ϦΫΤετଟॏԽ • HTTP vs HTTPS — Test them both yourself Roppongi.rb #1 57

Slide 58

Slide 58 text

Question ͋ͳͨ͸౒ྗͯ͠Ծʹαʔ όʔϨεϙϯελΠϜΛ1ms ʹͨ͠ͱ͠·͠ΐ͏ɻ े෼ʹ଎͘ͳͬͨͱݴ͑·͢ ͔ʁ Roppongi.rb #1 58

Slide 59

Slide 59 text

Answer ! No Roppongi.rb #1 59

Slide 60

Slide 60 text

Ϣʔβʔͷମײ଎౓ ! Server-side response ➕ Client-side Speed Roppongi.rb #1 60

Slide 61

Slide 61 text

Rails5 on Heroku Ͱ HelloWorld App ͷ৔߹4 4 PageSpeed Insights Λ࢖ͬͯܭଌ Roppongi.rb #1 61

Slide 62

Slide 62 text

80఺ҎԼ... ! Roppongi.rb #1 62

Slide 63

Slide 63 text

⚡ AMP • Webߴ଎ԽͷϕετϓϥΫςΟεΛ٧ΊࠐΜͩ ࢓༷/੍ݶ • Why AMP is fast — Medium • Google AMP Cache: GoogleͰΩϟογϡͯ͠ ίϯςϯπ഑৴Λݞ୅ΘΓ • => Google AMP CDN Roppongi.rb #1 63

Slide 64

Slide 64 text

[্ڃฤ] ·ͱΊ • CDN Ͱίϯςϯπ഑৴Λ࠷దԽ • HTTP/2 ͰϨΠςϯγʹෛ͚ͳ͍ • AMPʹΑΔWebϖʔδͷߴ଎Խ Roppongi.rb #1 64

Slide 65

Slide 65 text

end Roppongi.rb #1 65

Slide 66

Slide 66 text

ࢀߟࢿྉ • High Performance Rails (long edition) // Speaker Deck • RailsύϑΥʔϚϯεجຊͷΩ // Speaker Deck • 3x Rails // Speaker Deck • ΢ΣϒΛ଎͘͢ΔͨΊʹDeNA͕΍͍ͬͯΔ͜ ͱ - HTTP/2ͱɺ͞Βʹͦͷઌ Roppongi.rb #1 66

Slide 67

Slide 67 text

ࢀߟࢿྉ • Rails Upgrade Casual Talks // Speaker Deck • σβΠφʔ΍σΟϨΫλʔ΋஌͓͖͍ͬͯͨɺ ϖʔδදࣔ଎౓ͷߴ଎Խͷجຊ – Rriver • ep22 AMP | mozaic.fm Roppongi.rb #1 67