Railsアプリケーションのパフォーマンス改善手法 / #ginzarb

Railsアプリケーションのパフォーマンス改善手法 / #ginzarb

ぎんざRuby会議01
https://ginzarb.github.io/kaigi01/

08d5432a5bc31e6d9edec87b94cb1db1?s=128

Takashi Kokubun

August 05, 2017
Tweet

Transcript

  1. Rails ΞϓϦέʔγϣϯͷύϑΥʔϚϯεվળख๏ @k0kubun / ͗Μ͟Rubyձٞ 01

  2. ࣗݾ঺հ ➤ GitHub, Twitter: @k0kubun ➤ ৽ถRubyίϛολʔ ➤ Ruby 2.5ͰERBΛੈք࠷଎ͷerb࣮૷ʹͨͧ͠

    ➤ ࠷ۙ࡞ͬͨ΋ͷ ➤ LLVMϕʔεͷRubyͷJITίϯύΠϥ LLRB ➤ TreasureDataॴଐ ➤ ෼ࢄDBͷεΩʔϚ΍δϣϒͷ؅ཧΛ΍ΔRailsΞϓϦͷ։ൃ ➤ ↑ΛҰॹʹ΍ͬͯ͘ΕΔਓΛੵۃ࠾༻த!!
  3. None
  4. ࠓ೔࿩͢͜ͱ ➤͍ͭͲͷΑ͏ʹܭଌΛ͢΂͖͔ ➤֤छܭଌํ๏ͱͦͷڧΈɺݶք ➤ϨϏϡʔͰݟͨඇޮ཰ͳίʔυ ➤࠷ۙͷ࣮ࡍͷߴ଎Խࣄྫ

  5. ͍ͭͲͷΑ͏ʹ ܭଌΛ͢΂͖͔

  6. ͜Μͳܦݧ͸͋Γ·ͤΜ͔

  7. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ1: ܭଌΛ͍ͯ͠ͳ͍ ➤ ͳΜ͔N+1ΫΤϦ(?)ౕͬͯΛeager loading(?)͢Δͱ଎͘ͳΔ Β͍͠!

  8. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ1: ܭଌΛ͍ͯ͠ͳ͍ ➤ ͳΜ͔N+1ΫΤϦ(?)ౕͬͯΛeager loading(?)͢Δͱ଎͘ͳΔ Β͍͠! ➤ ϧʔϓͷதͰhas_many association͕ࢀর͞ΕͯΔ͔ΒͱΓ͋

    ͑ͣincludesͨ͠!
  9. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ1: ܭଌΛ͍ͯ͠ͳ͍ ➤ ͳΜ͔N+1ΫΤϦ(?)ౕͬͯΛeager loading(?)͢Δͱ଎͘ͳΔ Β͍͠! ➤ ϧʔϓͷதͰhas_many association͕ࢀর͞ΕͯΔ͔ΒͱΓ͋

    ͑ͣincludesͨ͠! ➤ ಛʹܭଌͯ͠ͳ͍͚ͲͳΜ͔଎͘ͳΔΒ͍͔͠ΒσϓϩΠ͠ ·͢!
  10. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ1: ܭଌΛ͍ͯ͠ͳ͍ ➤ ͳΜ͔N+1ΫΤϦ(?)ౕͬͯΛeager loading(?)͢Δͱ଎͘ͳΔ Β͍͠! ➤ ϧʔϓͷதͰhas_many association͕ࢀর͞ΕͯΔ͔ΒͱΓ͋

    ͑ͣincludesͨ͠! ➤ ಛʹܭଌͯ͠ͳ͍͚ͲͳΜ͔଎͘ͳΔΒ͍͔͠ΒσϓϩΠ͠ ·͢! ➤ σϓϩΠޙNewRelicΛݟͯΈͨΒ஗͘ͳͬͯͨ… ※2014೥͘Β͍ͷ๻ͷ࿩ɻhas_manyͩͱಉ࣌ʹϝϞϦΛ͔ͳΓফඅ͢Δ͜ͱʹͳΓɺྫ͑͹εϫοϓͨ͠Γ͢Δͱ஗͘ͳΔ
  11. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ2: ܭଌ࣌ͷߟྀ࿙Ε ➤ ͜ͷAPIɺԿͰ஗͍ͷ͔Α͘Θ͔Βͳ͍͚Ͳɺϖʔδωʔγϣ ϯΛͯ͠ͳ͍ͷ͸໰୊͋Γͦ͏!

  12. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ2: ܭଌ࣌ͷߟྀ࿙Ε ➤ ͜ͷAPIɺԿͰ஗͍ͷ͔Α͘Θ͔Βͳ͍͚Ͳɺϖʔδωʔγϣ ϯΛͯ͠ͳ͍ͷ͸໰୊͋Γͦ͏! ➤ LIMIT OFFSETΑΓɺORDER BYͯ͠ಛఆͷ஋ͰϑΟϧλʔ͠

    ͯϨίʔυΛऔͬͯ͘Δํ͕଎͍Β͍͠! ͪΐͬͱΫΤϦ౤͛ ͯΈͨΒ͔֬ʹ଎͔ͬͨ!
  13. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ2: ܭଌ࣌ͷߟྀ࿙Ε ➤ ͜ͷAPIɺԿͰ஗͍ͷ͔Α͘Θ͔Βͳ͍͚Ͳɺϖʔδωʔγϣ ϯΛͯ͠ͳ͍ͷ͸໰୊͋Γͦ͏! ➤ LIMIT OFFSETΑΓɺORDER BYͯ͠ಛఆͷ஋ͰϑΟϧλʔ͠

    ͯϨίʔυΛऔͬͯ͘Δํ͕଎͍Β͍͠! ͪΐͬͱΫΤϦ౤͛ ͯΈͨΒ͔֬ʹ଎͔ͬͨ! ➤ ιʔτʹ࢖ΘΕΔΩʔ͕ͨ͘͞Μ͋ͬͯ؆୯ʹ͸ΫΤϦΛ࡞ Εͳ͍ͷͰɺ͕Μ͹ͬͯͦΕ͕Ͱ͖ΔϥΠϒϥϦΛ࡞ͬͨ!
  14. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ2: ܭଌ࣌ͷߟྀ࿙Ε ➤ ͜ͷAPIɺԿͰ஗͍ͷ͔Α͘Θ͔Βͳ͍͚Ͳɺϖʔδωʔγϣ ϯΛͯ͠ͳ͍ͷ͸໰୊͋Γͦ͏! ➤ LIMIT OFFSETΑΓɺORDER BYͯ͠ಛఆͷ஋ͰϑΟϧλʔͯ͠

    ϨίʔυΛऔͬͯ͘Δํ͕଎͍Β͍͠! ͪΐͬͱΫΤϦ౤͛ͯ ΈͨΒ͔֬ʹ଎͔ͬͨ! ➤ ιʔτʹ࢖ΘΕΔΩʔ͕ͨ͘͞Μ͋ͬͯ؆୯ʹ͸ΫΤϦΛ࡞Ε ͳ͍ͷͰɺ͕Μ͹ͬͯͦΕ͕Ͱ͖ΔϥΠϒϥϦΛ࡞ͬͨ! ➤ ޙ͔Βܭଌ͠௚ͨ͠Βશવҧ͏݁ՌͰɺLIMIT OFFSETͰ΋଎͘ ͳΔ͠΋͏গ͠γϯϓϧʹ࣮૷Ͱ͖ͨ… ※͜Ε͸๻ࣗ਎͕΍ͬͨΘ͚͡Όͳ͍͚Ͳɺݟ͍ͯͨ
  15. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏!

  16. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏! ➤ ൒೔͔͚ͯܭଌͯ͠मਖ਼ˠ଎͘ͳͬͨ!

  17. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏! ➤ ൒೔͔͚ͯܭଌͯ͠मਖ਼ˠ଎͘ͳͬͨ! ➤ લճͷܭଌ݁ՌΛݟͯ·ͨमਖ਼ˠ଎͘ͳͬͨ!

  18. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏! ➤ ൒೔͔͚ͯܭଌͯ͠मਖ਼ˠ଎͘ͳͬͨ! ➤ લճͷܭଌ݁ՌΛݟͯ·ͨमਖ਼ˠ଎͘ͳͬͨ! ➤

    ܭଌ͸ਆ! ϘτϧωοΫ͕Ҡ͔ͬͨΒ·ͨܭଌ͠Α͏!
  19. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏! ➤ ൒೔͔͚ͯܭଌͯ͠मਖ਼ˠ଎͘ͳͬͨ! ➤ લճͷܭଌ݁ՌΛݟͯ·ͨमਖ਼ˠ଎͘ͳͬͨ! ➤

    ܭଌ͸ਆ! ϘτϧωοΫ͕Ҡ͔ͬͨΒ·ͨܭଌ͠Α͏! ➤ ϓϩϑΝΠϦϯάͯ͠΋ͳ͔ͳ͔ݪҼ͕Θ͔Βͳ͍…͍ͭͷ ·ʹ͔1೔ܦͬͯͨ…
  20. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏! ➤ ൒೔͔͚ͯܭଌͯ͠मਖ਼ˠ଎͘ͳͬͨ! ➤ લճͷܭଌ݁ՌΛݟͯ·ͨमਖ਼ˠ଎͘ͳͬͨ! ➤

    ܭଌ͸ਆ! ϘτϧωοΫ͕Ҡ͔ͬͨΒ·ͨܭଌ͠Α͏! ➤ ϓϩϑΝΠϦϯάͯ͠΋ͳ͔ͳ͔ݪҼ͕Θ͔Βͳ͍…͍ͭͷ·ʹ ͔1೔ܦͬͯͨ… ➤ ͍ͭͷ·ʹ͔ଞͷਓ͕ɺܭଌΛ͠ͳͯ͘΋ࢥ͍ͭ͘Α͏ͳɺ໌͔ ʹޮՌ͕͋Γͦ͏ͳύονΛग़͍ͯͨ͠ͷͰ΍Δඞཁ͕ͳ͘ͳͬ ͨ…
  21. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ4: ϛεϦʔσΟϯάͳܭଌ݁Ռ ➤ NewRelicΛݟͯͨΒɺϘτϧωοΫ͕jbuilderͩͬͨ!

  22. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ4: ϛεϦʔσΟϯάͳܭଌ݁Ռ ➤ NewRelicΛݟͯͨΒɺϘτϧωοΫ͕jbuilderͩͬͨ! ➤ ߴ଎ͳJSONͷςϯϓϨʔτΤϯδϯ࡞Δͧ!!!

  23. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ4: ϛεϦʔσΟϯάͳܭଌ݁Ռ ➤ NewRelicΛݟͯͨΒɺϘτϧωοΫ͕jbuilderͩͬͨ! ➤ ߴ଎ͳJSONͷςϯϓϨʔτΤϯδϯ࡞Δͧ!!! ➤ Ͱ΋stackprofͰݟͯΈͨΒશવҧ͏ͱ͜ΖͰ࣌ؒ࢖ͬͯͨ…

  24. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ5: ܭଌΛ͕ͨ͠௚͠Α͏͕ͳ͍ ➤ ͳΜ͔ύϑΥʔϚϯεվળΛ͢ΔͳΒstackprofౕͬͯͰܭଌ Λͨ͠ํ͕͍͍Β͍͠!

  25. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ5: ܭଌΛ͕ͨ͠௚͠Α͏͕ͳ͍ ➤ ͳΜ͔ύϑΥʔϚϯεվળΛ͢ΔͳΒstackprofౕͬͯͰܭଌ Λͨ͠ํ͕͍͍Β͍͠! ➤ ͱΓ͋͑ͣܭଌͯ͠Έͨ!

  26. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ5: ܭଌΛ͕ͨ͠௚͠Α͏͕ͳ͍ ➤ ͳΜ͔ύϑΥʔϚϯεվળΛ͢ΔͳΒstackprofౕͬͯͰܭଌ Λͨ͠ํ͕͍͍Β͍͠! ➤ ͱΓ͋͑ͣܭଌͯ͠Έͨ! ➤ Կ͔஗͍ͱ͜Ζ͕Rails಺෦ʹूதͯͯ͠ɺRailsΑ͘Θ͔Βͳ

    ͍͔Β௚ͤͳ͍… ※௚ͯ͘͠Ε
  27. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ6: ෆཁͳ࠷దԽΛ͍ͯ͠Δ ➤ ύϑΥʔϚϯεΛվળͨ͠Βαʔόʔ୅͕ݮΒͤͦ͏͔ͩΒ ଎͘͠Α͏!

  28. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ6: ෆཁͳ࠷దԽΛ͍ͯ͠Δ ➤ ύϑΥʔϚϯεΛվળͨ͠Βαʔόʔ୅͕ݮΒͤͦ͏͔ͩΒ ଎͘͠Α͏! ➤ NewRelicͰMost Time ConsumingΛݟͯϘτϧωοΫʹͳͬ

    ͍ͯΔΤϯυϙΠϯτΛݟ͚͔ͭͨΒ͕Μ͹ͬͯݪҼΛௐ΂ ͨ! ஗͍ݪҼ΋Θ͔ͬͨ!
  29. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ6: ෆཁͳ࠷దԽΛ͍ͯ͠Δ ➤ ύϑΥʔϚϯεΛվળͨ͠Βαʔόʔ୅͕ݮΒͤͦ͏͔ͩΒ ଎͘͠Α͏! ➤ NewRelicͰMost Time ConsumingΛݟͯϘτϧωοΫʹͳͬ

    ͍ͯΔΤϯυϙΠϯτΛݟ͚͔ͭͨΒ͕Μ͹ͬͯݪҼΛௐ΂ ͨ! ஗͍ݪҼ΋Θ͔ͬͨ! ➤ શମͰ͸ϘτϧωοΫʹͳͬͯͳ͍APIʹ͍͢͝஗ౕ͍͕͋ͬ ͯɺ࣮ࡍʹ͸ͦͬͪͷํ͕༏ઌ౓͕ߴ͔ͬͨ…
  30. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ6: ෆཁͳ࠷దԽΛ͍ͯ͠Δ ➤ ύϑΥʔϚϯεΛվળͨ͠Βαʔόʔ୅͕ݮΒͤͦ͏͔ͩΒ ଎͘͠Α͏! ➤ NewRelicͰMost Time ConsumingΛݟͯϘτϧωοΫʹͳͬ

    ͍ͯΔΤϯυϙΠϯτΛݟ͚͔ͭͨΒ͕Μ͹ͬͯݪҼΛௐ΂ ͨ! ஗͍ݪҼ΋Θ͔ͬͨ! ➤ શମͰ͸ϘτϧωοΫʹͳͬͯͳ͍APIʹ͍͢͝஗ౕ͍͕͋ͬ ͯɺ࣮ࡍʹ͸ͦͬͪͷํ͕༏ઌ౓͕ߴ͔ͬͨ… ➤ ͦΜͳ͜ͱΛ΍͍ͬͯͨΒ͓٬༷͕཭Εͯ͠·͍શମͷརӹ ͸ݮͬͯ͠·ͬͨ… ※ͱ͍͏Α͏ͳ͜ͱΛ૝ఆͯ͠ߦಈ͍ͯ͠ΔͷͰձࣾ͸όϦόϦ੒௕͍ͯ͠·͢
  31. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ7: ॳ৺ऀ͕งғؾͰ΍͍ͬͯΔ ➤ Α͘Θ͔Βͳ͍͚ͲͳΜ͔଎͍ͨ͘͠!

  32. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ7: ॳ৺ऀ͕งғؾͰ΍͍ͬͯΔ ➤ Α͘Θ͔Βͳ͍͚ͲͳΜ͔଎͍ͨ͘͠! ➤ ͳΜ͔LLVM(?)ͰJIT(?)ౕͬͯͰΠϯϥΠϯԽ(?)Λ΍Δͱ଎͘ ͳΔ(?)ͬͯҒ͍ਓ͕͍ͬͯͨ!

  33. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ7: ॳ৺ऀ͕งғؾͰ΍͍ͬͯΔ ➤ Α͘Θ͔Βͳ͍͚ͲͳΜ͔଎͍ͨ͘͠! ➤ ͳΜ͔LLVM(?)ͰJIT(?)ౕͬͯͰΠϯϥΠϯԽ(?)Λ΍Δͱ଎͘ ͳΔ(?)ͬͯҒ͍ਓ͕͍ͬͯͨ! ➤ งғؾͰLLVMΛ΍ͬͯ3ϱ݄͔͚࣮ͯ૷ͨ͠!

  34. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ7: ॳ৺ऀ͕งғؾͰ΍͍ͬͯΔ ➤ Α͘Θ͔Βͳ͍͚ͲͳΜ͔଎͍ͨ͘͠! ➤ ͳΜ͔LLVM(?)ͰJIT(?)ౕͬͯͰΠϯϥΠϯԽ(?)Λ΍Δͱ଎͘ ͳΔ(?)ͬͯҒ͍ਓ͕͍ͬͯͨ! ➤ งғؾͰLLVMΛ΍ͬͯ3ϱ݄͔͚࣮ͯ૷ͨ͠!

    ➤ ϕϯνϚʔΫʹΑͬͯ͸଎͘ͳΔ͚Ͳɺ໨తͷΞϓϦͰ͸ͦ ΜͳޮՌͳ͔ͬͨ…
  35. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ7: ॳ৺ऀ͕งғؾͰ΍͍ͬͯΔ ➤ Α͘Θ͔Βͳ͍͚ͲͳΜ͔଎͍ͨ͘͠! ➤ ͳΜ͔LLVM(?)ͰJIT(?)ౕͬͯͰΠϯϥΠϯԽ(?)Λ΍Δͱ଎͘ ͳΔ(?)ͬͯҒ͍ਓ͕͍ͬͯͨ! ➤ งғؾͰLLVMΛ΍ͬͯ3ϱ݄͔͚࣮ͯ૷ͨ͠!

    ➤ ϕϯνϚʔΫʹΑͬͯ͸଎͘ͳΔ͚Ͳɺ໨తͷΞϓϦͰ͸ͦ ΜͳޮՌͳ͔ͬͨ… ➤ ͔͠΋LLVM͸Πϯετʔϧͪ͠ΌͩΊͬͯݴΘΕ͔ͨΒͲͬ ͪʹ͠Ζ࢖͑ͳ͔ͬͨ… ※ຊؾͰͦ͏ࢥ͍ͬͯͨΘ͚Ͱ͸ͳ͘δϣʔΫ͚ͩͲɺྫͱͯ͠͸͋Γ͏Δౕ
  36. Ͳ͏͢Ε͹͜ͷΑ͏ͳ ࣦഊΛ͠ͳͯ͘͢Ή͔?

  37. ύϑΥʔϚϯεվળʹࣦഊ͢ΔݪҼ ➤ ܭଌ݁Ռͷଥ౰ੑͷݕূ͕؁͘ɺޡͬͨܭଌΛͯ͠͠·͏ ➤ ݱ࣮͸ෳࡶͳͷͰɺਖ਼͘͠ܭଌ͢Δ͜ͱ͸ͦ΋ͦ΋ͱͯ΋೉ ͍͠ ➤ ೉͍͠ͷͰɺܭଌ͠ͳͯ͘͢ΉͳΒͦΕʹӽͨ͜͠ͱ͸ͳ͍ ➤ ෆཁͳ΋ͷΛܭଌ͠ɺ༨ܭͳ͜ͱʹ࣌ؒΛ࢖ͬͯ͠·͏

    ➤ ࢓ࣄͰ΍͍ͬͯΕ͹ɺ࣌ؒΛ͔͚Δͱ͓ۚ΋͔͔Δ (झຯ͸ ޚࣗ༝ʹ) ➤ ԿͰ΋ܭଌ͢Ε͹͍͍Θ͚Ͱ͸ͳ͘ɺ༨ܭͳܭଌ͸΍Δ΂͖ Ͱͳ͍
  38. Ͱ͸Ͳ͏͢Ε͹ྑ͍͔ ➤ 1. ࠷ॳ͸ͱʹ͔͘ಋೖָ͕ͳ؂ࢹπʔϧ͚ͩΛ͍Εͯܭଌ͢Δ ➤ 2. Ͳ͏ॻ͘ͱ଎͍͔Λ஌͓͖ͬͯɺҰൃͰ଎͍ίʔυΛॻ͖ɺͦͷ؂ࢹπʔϧ ͰͪΌΜͱ֬ೝ͢Δ ➤ ෆ҆ʹͳͬͨ࣌͸͜·ΊʹϕϯνϚʔΫͰͲͪΒ͕଎͍͔ൺֱ͢Δ

    ➤ 3. ຊ౰ʹ௚͞ͳ͍ͱࠔΔ΄Ͳ஗͍໰୊͕ൃ֮ͨ࣌͠ʹݶΓɺͦΕΛஸೡʹ௚͢ ➤ ௚͢બ୒ࢶ͕ͦ΋ͦ΋গͳ͍࣌͸ɺαοͱશ෦ࢼͯ͠͠·͏ ➤ Ͳ͜Λ௚ͤ͹͍͍͔શ͘Θ͔Βͳ͍࣌ɺԿނ஗͍ͷ͔Λಛఆ͢Δͷ͸ຊ౰ʹ ೉͍͠ͷͰɺ༷ʑͳܭଌํ๏ͷಛੑΛਂ͘஌Γɺ໰୊ͷमਖ਼ʹඞཁͳ࠷௿ݶ ͔ͭద੾ͳܭଌखஈΛऔΔ ➤ ௚͢΂͖৔ॴ͕Θ͔ͬͨޙɺͲ͏௚ͤΔ͔͸օ͞Μ࣍ୈ͚ͩͲɺࣄલʹ ݪҼ͕Θ͔͍ͬͯΕ͹ख໭Γ͸࠷খݶʹͳΔ
  39. ͜ͷൃදͰಘΒΕΔ͜ͱ ➤ Ͳ͏͢ΔͱָʹܭଌͰ͖Δͷ͔ ➤ RailsΞϓϦͰҰൃͰ଎͍ίʔυΛॻͨ͘Ίͷ஌ݟ ➤ ޙʹ௚͢બ୒ࢶΛߜΔ͜ͱʹ΋ܨ͕Δ ➤ ͦΕͧΕͷܭଌํ๏ͷਖ਼͍͠ཧղɺ࢖͏΂͖Ͱͳ͍έʔε

  40. ֤छܭଌํ๏ͱ ͦͷڧΈɺݶք

  41. ϓϩϑΝΠϥ

  42. rblineprof ➤ @tmm1 ੡ɺRubyKaigi 2014 KeynoteͰൃද͞Εͨ ➤ ߦ͝ͱʹͲͷ͘Β͍ͷ͕͔͔͍࣌ؒͬͯΔ͔ग़Δ ৭͕͍ͭͯΔͷ͸rack-lineprofͷػೳͰɺ͜Ε͸ͦΕΛrackͷ֎͔Β΋࢖͑ΔΑ͏ʹͨ͠lineprof.gemͷग़ྗ

  43. rblineprof rblineprofͷ࢓૊Έ ➤ Ruby͕1ߦධՁ͢Δ͝ͱʹ࣌ؒΛه࿥ͯ͠…͍ΔΘ͚Ͱ͸ ͳ͍ ➤ RubyͰ࣮૷͞Εͨϝιουͷݺͼग़͠ɾreturnɺCͰ࣮૷ ͞Εͨϝιουͷݺͼग़͠ɾreturn ͷΠϕϯτΛϑοΫ ➤

    ͋Δϝιουͷݺͼग़͠ʹͲͷ͘Β͍͕͔͔͔࣌ؒͬͨ Θ͔ΔͷͰɺͦΕΛݺͼग़͠ଆʹද͍ࣔͯ͠Δ
  44. rblineprof ϝϦοτɾڧΈ ➤ Ruby͔CͰఆٛ͞Εͨϝιουͷݺͼग़͠Ͱಈ͍͍ͯΔϓ ϩάϥϜ͸͓͓ΉͶ͍͍ײ͡ʹܭଌͰ͖Δ ➤ ࡞ऀஊ: This profiler is

    great for improving performance of rails templates and controllers. ➤ ग़ྗ͕ms୯ҐͷͨΊ௚ײతͰɺݟΔͷָ͕ ➤ ͱͯ΋ॏཁɺܭଌ݁ՌΛݟΔͷ͕େมͩͱ͕࣌ؒແବʹ ➤ ISUCONͱ͔ʹ࢖͏ͷ͸Αͦ͞͏
  45. rblineprof σϝϦοτɾݶք ➤ શͯͷϝιουݺͼग़͕͠ϑοΫ͞ΕΔͷͰɺίʔϧε λοΫͷਂ͍ͱ͜Ζͩͱܭଌର৅ʹେ͖ͳΦʔόʔϔου ͕͔͔ΔͷͰɺຊདྷΑΓ஗͍݁ՌʹͳΔ ➤ ݁ՌΛ৴༻Ͱ͖ͳ͍ͷͰɺܭଌํ๏ͱͯ͠ے͕ྑ͘ͳ͍ ➤ ϝιουݺͼग़͠Ͱ͸ͳ͍෼͸ܭଌ͞Εͳ͍

    ➤ YARV͕ opt_* ܥͷ໋ྩͰEXEC_EVENT_HOOKΛݺ͹ͳ ͍ͨΊ ➤ ๻͔͠ࠔΒͳ͍ͱࢥ͏͚ͲɺςϯϓϨʔτΤϯδϯͷܭ ଌʹ࢖͏ʹ͸ඍົʹͳΔ
  46. rblineprof < < ΋ ɺ - “ ” ΋ ɺ

    . e m p t y ? ΋ ϝ ι ο υ ݺ ͼ ग़ ͠Ͱ ͸ ͳ ͍ ( ޙ ड़ ) ͷ Ͱ ܭ ଌ ͞ Ε ͳ ͍ -“” ͕ϝιουݺͼग़͠Ͱ͸ͳ͘ͳΔͷ͸Ruby 2.5͔ΒͰ͕͢ɺ͝ཡͷ௨Γ(?)͜Ε͸Ruby 2.5ͷERBͷੜ੒ίʔυͰ͢ ͜ Ε ΋ . t o _ s ͩ ͚ ͕ ϝ ι ο υ ݺ ͼ ग़ ͠ ( # [ ] ͱ < < ͕ ҧ ͏ ) ͳ ͷ Ͱɺ ͜ ͷ ߦ ʹ ͔ ͔ Δ ࣌ ؒ ͕ 5 . 3 m s ͱ ͸ ݶ Β ͳ ͍
  47. stackprof ➤ ͜Ε΋@tmm1 ੡ɺRubyKaigi 2014 KeynoteͰൃද͞Εͨ ➤ rblineprofͷޙܧతѻ͍(?)ͷαϯϓϦϯάϓϩϑΝΠϥ

  48. stackprof stackprofͷ࢓૊Έ ➤ setitimer(2) ͰҰఆͷCPU࣌ؒ or ࣮͓͖࣌ؒʹSIGPROF ➤ sigaction(2) ͰγάφϧϋϯυϥΛηοτ͠ɺͦ͜Ͱ

    rb_postponed_job_register_one ΛݺͼαϯϓϦϯάΛ༧໿ ➤ Ruby 2.1Ͱ௥Ճ͞Εͨ͜ͷAPI͸ɺVMͷঢ়ଶʹҰ؏ੑͷ͋Δ λΠϛϯάͰ౉͞Εͨؔ਺ϙΠϯλ(͜͜Ͱ͸αϯϓϦϯά) Λݺͼग़͢ LLRBͰ͜ͷ࣮૷ΛؙύΫϦͨ͠ͷͰνϣοτϫΧϧ
  49. stackprof ϝϦοτɾڧΈ ➤ αϯϓϦϯάͳͷͰɺΦʔόʔϔου͕গͳ͍ ➤ rblineprofʹൺ΂ɺΑΓݱ࣮ʹଈͨ͠ܭଌ݁ՌʹͳΔ ➤ αϯϓϦϯάͷස౓Λࣗ෼ͰίϯτϩʔϧͰ͖ɺεέʔϧ ͢Δ ➤

    ελοΫશମͰͷׂ߹͚ͩͰͳ͋͘ΔϝιουͰߦ͝ͱʹ ͔͔͍ͬͯΔ࣌ؒͷׂ߹΋ग़ͤɺ·༷ͨʑͳํ๏Ͱͷ visualizationΛαϙʔτ͍ͯ͠Δ
  50. stackprof σϝϦοτɾݶք ➤ αϯϓϦϯάͷύϥϝʔλΛࣗ෼ͰνϡʔχϯάΛ͠ͳ͍ ͱ͍͚ͳ͍ͷͰɺܭଌʹख͕͔͔ؒΔ ➤ αϯϓϦϯά͞ΕΔλΠϛϯά΋౰વϥϯμϜͳͷͰɺͦ ͏͍͏ҙຯͰ͸1ճͷܭଌͷ৴པੑ͸௿͍ ➤ αϯϓϦϯάͷ౎߹ɺܭଌ݁Ռ͕࣌ؒͰ͸ͳׂ͘߹ʹͳΔ

    ͷͰɺrblineprofʹൺ΂ͯग़ྗ͕एׯ௚ײతͰ͸ͳ͘ͳΔ ➤ CͰ࣮૷͞Εͨ(iseq͕ͳ͍)ϝιου͸શ͘ߟྀ͞Εͳ͍
  51. NewRelic NewRelicͷ࢓૊Έ ➤ gem͝ͱʹIntegration͕༻ҙ͞Ε͍ͯͯɺܭଌ͢΂͖ϝ ιου͝ͱʹϞϯΩʔύονͯ͠ϑοΫ ➤ NewRelic༻ͷεϨου͕1෼͓͖ʹϝτϦΫεΛૹ৴

  52. NewRelic NewRelicͷ࢓૊Έ

  53. NewRelic ϝϦοτɾڧΈ ➤ ඞཁͳͱ͜Ζ͚ͩܭଌͷϑοΫ͕ೖΔͷͰɺܭଌʹΑΔ Φʔόʔϔου͕খ͞Ί ➤ ਓ͕ؒ஌Γ͍ͨϝτϦΫε͚͕ͩऔΒΕΔͷͰɺ݁ՌΛݟ Δͷָ͕ ➤ ಋೖ΋ָ͍͢͝

  54. NewRelic σϝϦοτɾݶք ➤ αϯϓϦϯάϓϩϑΝΠϥʹൺ΂ͨΒී௨͸஗͘ͳΔ ➤ ৄ͘͠ݟͨ͘ͳΔͱ͕͔͔ۚΔ ➤ ଞͷgemͱͷ݁߹͕ڧΊͳͷͰɺNewRelic͕ϝϯςΛαϘ Δͱಈ͔ͳ͘ͳΔ

  55. perf ➤ ϝϦοτ ➤ CͷϨϕϧͰαϯϓϦϯάϓϩϑΝΠϧ͕Ͱ͖Δ ➤ ͳͷͰɺrubyࣗମͷϓϩϑΝΠϦϯάʹ࢖͑Δ ➤ σϝϦοτ ➤

    ruby͕େମ1ͭͷؔ਺(vm_exec_core)ͰҰੜΛऴ͑ΔͷͰ ׂͱݟͮΒ͍ ➤ Linux͡Όͳ͍ͱ࢖͑ͳ͍
  56. ϕϯνϚʔΧʔ

  57. ඪ४ϥΠϒϥϦ benchmark ➤ ϝϦοτ ➤ ඪ४Ͱ࢖͑ΔͷͰɺΠϯετʔϧෆཁ ➤ σϝϦοτ ➤ ਫ਼౓͕ѱ͍

  58. ඪ४ϥΠϒϥϦ benchmark ➤ ਫ਼౓ɺRuby 2.5Ͱ্͛·ͨ͠

  59. ඪ४ϥΠϒϥϦ benchmark ➤ ਫ਼౓ɺRuby 2.5Ͱ্͛·ͨ͠ Լ ͕ 0 Ͱ ຒ

    · ͬͯ ͳ ͍ asakusa.rbͰॻ͍ͨ
  60. benchmark-ips ➤ ϝϦοτ ➤ Έ΍͍͢ɺcompare! ͷग़ྗ͕௚ײత

  61. ͦͷଞ

  62. `rails s`ͷϩά ➤ ϝϦοτ ➤ Կ΋͠ͳͯ͘΋ݟΕΔ ➤ ோΊͯΕ͹݁ߏ༷ࢠ͕Θ͔Δ (͔ͳΓ͓͢͢Ί) ➤

    ͜ΕීஈݟͯͨΒbullet.gemͱ͔͍Βͳ͘ͳ͍Ͱ͔͢ ➤ σϝϦοτ ➤ ΊͪΌͪ͘Όن໛͕େ͖͘ͳΔͱͪΐͬͱಡΉͷ͕େม
  63. ܭଌ͍ͨ͠ՕॴΛফͯ͠ΈΔ ➤ ϝϦοτ ➤ Φʔόʔϔουͳ͠ɺܭଌͷ΄΅ཧ૝ܗ ➤ σϝϦοτ ➤ एׯख͕͔͔ؒΔ

  64. ઐ༻ʹίʔυΛॻ͘ ➤ ϝϦοτ ➤ ಛघͳཁ݅ͷܭଌΛ͢Δͱ͖ʹඞཁ ➤ ྫ͑͹Sprocketsͷassets:precompileͰͲͷ֦ுࢠ͕Ͳͷ ͘Β͍࣌ؒΛ࢖͍ͬͯΔ͔Λௐ΂ΔͨΊʹɺίʔυΛॻ͘ ඞཁ͕͋ͬͨ ➤

    σϝϦοτ ➤ ܹ͘͠໘౗͍͘͞
  65. ָʹਖ਼͘͠ܭଌ͢Δํ๏ ·ͱΊ ➤ RailsͷϩάΛݟΔͷ͕Ұ൪ָͳͷͰݟΔ΂͖ ➤ ࣍ʹNewRelicΛ͍ΕͯோΊΔͷ͕අ༻ରޮՌ͕ߴ͍ ➤ Ͳ͏ͯ͠΋ஸೡͳܭଌ͕ඞཁͳ͚࣌ͩstackprofΛ࢖͏ɺඞཁ ͳΒίʔυ΋ॻ͘

  66. ϨϏϡʔͰݟͨ ඇޮ཰ͳίʔυ

  67. ஫ҙ: ී௨͸ຊ౰ʹࠣࡉͳ࠷దԽΑΓ΋ͬͱଞʹ΍Δ͜ͱ͕͋Δ ͕ɺཪଆͰԿ͕ى͖͍ͯΔ͔ҙ͓ࣝͯ͘͠ʹӽͨ͜͠ͱ͸ͳ͍ ͱ͍͏͘Β͍ͷؾ࣋ͪͰฉ͍͍ͯͩ͘͞ ͜Ε͕໰୊ʹͳΔ͜ͱ͋Μ·Γͳ͍ͱࢥ͏͚Ͳɺ ؾʹͳͬͪΌ͏ΜͩΑͶɺϨϕϧͷࡶஊ

  68. ༨ܭͳActiveRecord::Base Πϯελϯεͷੜ੒

  69. ༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ·ͩڐͤΔౕ

  70. ༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ·ͩڐͤΔౕ ͜͏Ͱ ͢ Ͷ S E L E

    C T * ͢ Δ ཧ ༝ ͕ ͳ ͍ ɺ e x i s t s ? ͷ ํ ͕ ҙ ਤ ͕ ఻ Θ Γ ΍ ͢ ͍ ͱ ʹ ͔ ͘ A c t i v e R e c o rd : : B a s e ͷ Π ϯελ ϯε Λ ࡞ Δ ͷ ͸ ॏ ͍ ͔ Β ؾ ʹ ͳ Δ
  71. ༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ݸਓతʹશ͘؃աͰ͖ͳౕ͍ (ͳ͓ Rails 4.x ࣌୅ͷ࿩) ߜ Γ ࠐ

    Έ ͷ ͨ Ί ͷ L E F T J O I N ʹ i n c l u d e s Λ ࢖ ͍ ग़ ͢ ഐ
  72. ༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ݸਓతʹશ͘؃աͰ͖ͳౕ͍ (ͳ͓ Rails 4.x ࣌୅ͷ࿩) ໭ ͤ ߜ

    Γ ࠐ Έ ͷ ͨ Ί ͷ L E F T J O I N ʹ i n c l u d e s Λ ࢖ ͍ ग़ ͢ ഐ ͓͍ͪ͡ΌΜڈ೥ͷTokyuRubyձٞͰ΋ಉ͡࿩ͨ͠Ͱ͠ΐ (ຊ౰ʹؾʹ͍Βͳ͍ͷͰ2ճൃද͠·ͨ͠) E a g e r l o a d i n g ͷ ͨ Ί ͷ ϝ ι ο υ Λ ޡ ͬ ͨ ༻ ్ ʹ ࢖ ͏ ͷ ͸ ΍ Ί · ͠ ΐ ͏ ࢖ Θ Ε ͳ ͍ A c t i v e R e c o rd : : B a s e Π ϯε λ ϯε ͕ Ͳ Μ Ͳ Μ ࡞ Β Ε Δ
  73. ༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ͜ͷίʔυΛϨϏϡʔͯͨ࣌͠୅ɺ#left_outer_joins (چ #outer_joins) ͕ೖͬͯཉͯ͘͠࢓ํ͕ͳ͔ͬͨ Ϩ Ϗϡ ʔ ͯ͠

    ͨ Β Α ͘Θ ͔ Β Μ ͜ ͱ ΍ ͬͯ Δ ਓ ͍ ͨ … ͳ ΜͰ ͜ Ε ೖ ͬͯ ͳ ͍ ͷ …
  74. ༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ͜ͷίʔυΛϨϏϡʔͯͨ࣌͠୅ɺ#left_outer_joins (چ #outer_joins) ͕ೖͬͯཉͯ͘͠࢓ํ͕ͳ͔ͬͨ Ϩ Ϗϡ ʔ ͯ͠

    ͨ Β Α ͘Θ ͔ Β Μ ͜ ͱ ΍ ͬͯ Δ ਓ ͍ ͨ … ͳ ΜͰ ͜ Ε ೖ ͬͯ ͳ ͍ ͷ … ͑ͬ # o u t e r _ j o i n s → # l e f t _ o u t e r _ j o i n s ʹ Ϧ ω ʔϜ ? ௕ ͢ ͗ ͯ ࢖ Θ ͳ ͘ ͳ ͍ ? ( ͜ Ε ͕ ೖ ͬ ͨ ௚ ޙ ʹ # l e f t _ j o i n s ͷ a l i a s ೖ Ε ͨ )
  75. ༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ Rails 5ɺਓྨօฏ࿨ ߜ Γ ࠐ Έ ͷ ͨ

    Ί ͷ L E F T J O I N ʹ i n c l u d e s Λ ࢖ ͍ ग़ ͢ ഐ
  76. ͦͷଞͷ༨ܭͳ ΦϒδΣΫτੜ੒

  77. ༨ܭͳΦϒδΣΫτੜ੒ ➤ ͜ΕͲ͏ࢥ͍·͔͢

  78. ༨ܭͳΦϒδΣΫτੜ੒ ͳ ΜͰ ν Σ ο Ϋ ͯ͠ Δ ͷ

    ͜ Ε ܭ 3 ͭ Φ ϒδΣ Ϋ τ Λ ੜ ੒ ͯ͠ Δ ϝ ι ο υ ݺ ͼ ग़ ͠ ( ޙ ड़ ) ͩ ➤ String͸ͳΜ͔͍͍Μ͚ͩͲɺArray͕ຖճੜ੒͞ΕΔͷ͸ݸ ਓతʹؾʹͳͬͯ͠·͏
  79. ༨ܭͳΦϒδΣΫτੜ੒ ➤ ͜͏͍͏ϨϏϡʔΛͨ͠

  80. ༨ܭͳΦϒδΣΫτੜ੒ ➤ ͜͏͍͏ϨϏϡʔΛͨ͠ ͜ ͜ ͷ Φ ϒ δΣ Ϋ

    τ ੜ ੒ ͕ 1 ͭ ʹ ϝ ι ο υ ݺ ͼ ग़ ͠Ͱ ͸ ͳ ͘ ͳ ͬ ͨ ( ޙ ड़ ) fstringͱ͔frozen_string_literal ͸…هड़ྔͷׂʹॻ͍ͯܶతʹޮՌ͕ग़ͨ͜ͱ͕ͳ͍ ͷͰผʹࢦఠ͠ͳ͍ࣗ͠෼΋ॻ͔ͳ͍
  81. ඇഁյతૢ࡞ ➤ ͜͏͍͏ίʔυΛ๻͕ॻ͍ͨ

  82. ඇഁյతૢ࡞ ➤ ϨϏϡʔͰ͜͏௚ͨ͠ ඇഁյతϝιου͸࢓্༷ݩͷΦϒδΣΫτΛ͍͡Εͳ͍ͷͰɺ ৽ͨʹΦϒδΣΫτΛ࡞Δඞཁ͕͋Δ͕ɺ͜ͷ৔߹͸౰વ༨ܭ ͳϝϞϦΛ࢖͏ͷͰ஗͍

  83. ᩵୔ͳจࣈྻૢ࡞ ➤ ͜ΕͲ͏ࢥ͍·͔͢

  84. ᩵୔ͳจࣈྻૢ࡞ ➤ ๻ͳΒ͜͏ॻ͖·͢ +͸ຖճ৽͍͠StringΛ࡞ͬͯ͠·͏ จࣈྻ݁߹͸String InterpolationΛ࢖͏ͷ͕େମ଎͍ɺத਎͕จࣈྻ ͳΒ to_sͷݺͼग़͕͠εΩοϓ͞ΕΔ

  85. ᩵୔ͳจࣈྻૢ࡞ ➤ String Interpolation͕஗͍έʔε΋͋Δ?

  86. ᩵୔ͳจࣈྻૢ࡞ ➤ ͦͷέʔεͰ଎͘ͳΔɺΊͰ͍ͨ

  87. όΠύεՄೳͳ ϝιουݺͼग़͠

  88. ϝιουݺग़ͷόΠύε ➤ YARVʹ͸opt໋ྩͱ͍͏ͷ͕͋Δ ➤ ҎԼ͸࠶ఆٛ͞Ε͍ͯͳ͚Ε͹ϝιουݺͼग़͠ʹͳΒͳ͍ ➤ “foo”.freeze, [a, b].max, [a,

    b].min ➤ +, -, *, /, %, !=, <, >, <=, >=, << ➤ [], []=, size, empty?, succ, !, =~ ➤ ৄࡉ͸insns.defͱvminsnhelper.cΛݟ·͠ΐ͏
  89. ϝιουݺग़ͷόΠύε ➤ any? empty?໰୊ ➤ any? ͸Arrayͷཁૉ͕1ͭͰ΋͋Δ͔Λ൑ఆ͢ΔͨΊͷϝιουͰ ͸ͳ͍ ➤ ͚Ͳ

    unless array.empty? ͡Όͳͯ͘ if array.any? ͬͯॻ͖͍ͨ ؾ࣋ͪࣗମ͸Θ͔Δɺ͕ɺඍົʹظ଴ͱҧ͏ڍಈͳͷ͕ؾʹͳ Δ ➤ …ͱ͍͏͍ͪΌ΋ΜΛ͚ͭΔͷʹɺempty?ͷํ͕଎͍ͷΛ࢖͑Δ (?) ➤ String#concat ΑΓ String#<< ͷํ͕଎͍ ➤ concatͷํ͕޷͖ͳਓ͸࢒೦Ͱͨ͠
  90. ྫ֎ॲཧ

  91. ྫ֎ॲཧ ➤ ੍ޚϑϩʔͷߏஙͷͨΊʹྫ֎Λ࢖͍ͬͯΔͷΛݟΔͱɺಡ Έʹ͍͘ͳ͋ͱࢥ͏͜ͱ͕͋Δ ➤ ͦ͏͍͏࣌ʹɺྫ֎͸஗͍ͱ͍͏͍ͪΌ΋ΜΛ͚͍ͭͯΔ(!?)

  92. ྫ֎ॲཧ http://magazine.rubyist.net/?0033-YarvManiacs

  93. ྫ֎ॲཧ

  94. ࠷ۙͷ࣮ࡍͷ ߴ଎Խࣄྫ

  95. N+1 COUNTΫΤϦ

  96. ͜Ε͸ݩʑ͋ͬͨίʔυɻ๻͸2Օॴ௚͠·ͨ͠

  97. ͱΓ͋͑ͣeager loading͕ൈ͚ͯͨͷͰ͚ͭ·͢ ࣮ࡍͷίʔυͰͷӨڹ 5,651ms → 3,822ms ଟ ෼ d e

    l e g a t e ʹ ΑΔ ݟ མ ͠
  98. ࣍͸Ͳ͏͢Δ͔? (ALTER͸͋Μ·Γ΍Γͨ͘ͳ͍લఏ)

  99. ͜͏͢Δͱɺcomment͕ͳ͍postͷnum_comments = 0͕ຒΊΒΕΔ ࣮ࡍͷίʔυͰͷӨڹ 3,822ms → 2,358ms (ݩͷ5,651msͷ2.4x)

  100. Ͱɺ·͋ɺ͜ͷύϑΥʔϚϯεվળ͸͓͍ͱ͍ͯ

  101. ͜ͷN+1 COUNTΫΤϦͷ௚͠ํɺͲ͏ࢥ͍·͔͢ ͱΓ͋͑ͣcounter_cacheͷ͜ͱ͸๨Ε͍ͯͩ͘͞

  102. ๻͸݁ߏΠΠͳɺͱࢥ͍·ͨ͠ (๻ͷमਖ਼͡Όͳͯ͘ɺݩͷίʔυͷํ޲ੑ͕)

  103. ͜Ε͸ɺ3೥͘Β͍લͷRailsॳ৺ऀͷ๻͕ߟ͑ͨ௚͠ํ ݟͨ໨͸େ෼ΤϨΨϯτ ͜ͷgem͸Qiitaͱ͔KibelaͰଟ෼࢖ΘΕ͍ͯͯɺ͋ͱւ֎൛ CookpadͰ΋࢖ΘΕ͍ͯΔͷΛݟͨ

  104. Ͱ΋ɺ(࢒೦ͳ͕Β)૯߹తʹݟͨΒ͜ͷgem࢖Θͳ͍ํ͕ଟ෼อकָͰ͢ ͜ ͍ ͭ ͕ A c t i v

    e R e c o rd ͷ ಺ ෦ A P I ʹ ৮ ͬͯ ͍ Δ ( ৮ Β ͟ Δ Λ ͑ ͳ ͍ ) ͷ Ͱ յ Ε Δ ɺ ͠ ͔ ΋ ௚ ͢ͷ ͕ ݁ ߏ େ ม Π ϯ λ ʔ φϧ ͳ A P I Λ ৮ ͬͯ ͍ Δ ͷ ͸ ͤ ͍ ͥ ͍ a re l _ t a b l e ͘ Β ͍
  105. ΧοίΠΠίʔυΛॻͨ͘Ίʹ΍ΜͪΌΛ͢Δͷ͸Α͘ͳ͍ (·͋ɺ๻΋γϯϓϧʹॻ͖͍ͨͷͰ୭͔ຊମʹ͍Εͯ͘Εͯ΋͍͍Ͱ͢)

  106. ڊେϖΠϩʔυAPI

  107. ͦͦ͜͜Ͱ͔͍ΧϥϜ͕͋Δςʔϒϧ ➤ ݁ߏେ͖͍σʔλ͕ೖͬͯΔΧϥϜ͕2ͭ͋Δςʔϒϧ͕͋Δ

  108. ͦͦ͜͜Ͱ͔͍ΧϥϜ͕͋Δςʔϒϧ ➤ ݁ߏେ͖͍σʔλ͕ೖͬͯΔΧϥϜ͕2ͭ͋Δςʔϒϧ͕͋Δ Ͱ ͔ ͍

  109. ͜͏͍͏API͕͋ͬͨ

  110. ͝ཡͷ௨Γɺϖʔδωʔγϣϯ͕ͳ͍

  111. ๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ

  112. ๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ ➤ Aࢯ: εΩʔϚౕͬͯผςʔϒϧʹͨ͠ํ͕͍͍Μ͡Όͳ͍

  113. ๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ ➤ Aࢯ: εΩʔϚౕͬͯผςʔϒϧʹͨ͠ํ͕͍͍Μ͡Όͳ͍ ➤ Bࢯ:

    શ͘ܭଌͯ͠ͳ͍͠ԿͰ஗͍ͷ͔Α͘Θ͔ΒΜ͚Ͳɺ ϖʔδωʔγϣϯͨ͠ΒΑͦ͞͏
  114. ๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ ➤ Aࢯ: εΩʔϚౕͬͯผςʔϒϧʹͨ͠ํ͕͍͍Μ͡Όͳ͍ ➤ Bࢯ:

    શ͘ܭଌͯ͠ͳ͍͠ԿͰ஗͍ͷ͔Α͘Θ͔ΒΜ͚Ͳɺ ϖʔδωʔγϣϯͨ͠ΒΑͦ͞͏ ➤ Cࢯ: ͏ʔΜͰ΋ΫϥΠΞϯτଆͰιʔτ΋ݕࡧ΋ͯ͠Δ͔Β ϖʔδωʔγϣϯ͸೉͍͠͠ɺͦͷͨΊʹ΋৽͘͠ΧϥϜ͕ ཁΔ͚Ͳɺ͜ͷςʔϒϧALTER͢Δͷ೉͍͠Θ…
  115. ๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ ➤ Aࢯ: εΩʔϚౕͬͯผςʔϒϧʹͨ͠ํ͕͍͍Μ͡Όͳ͍ ➤ Bࢯ:

    શ͘ܭଌͯ͠ͳ͍͠ԿͰ஗͍ͷ͔Α͘Θ͔ΒΜ͚Ͳɺ ϖʔδωʔγϣϯͨ͠ΒΑͦ͞͏ ➤ Cࢯ: ͏ʔΜͰ΋ΫϥΠΞϯτଆͰιʔτ΋ݕࡧ΋ͯ͠Δ͔Β ϖʔδωʔγϣϯ͸೉͍͠͠ɺͦͷͨΊʹ΋৽͘͠ΧϥϜ͕ ཁΔ͚Ͳɺ͜ͷςʔϒϧALTER͢Δͷ೉͍͠Θ… ➤ ALTERͰࢭ·ͬͨ··1೥ޙ… Aࢯ, Bࢯ, Cࢯ, ୀ৬!!
  116. ๻͕ೖ͖͔ͬͯͯΒ ➤ ๻: stackprofͰܭଌͨ͠ΒΫΤϦͱ JSON.parse ͕൒ʑͰɺ ΫΤϦ΋Ͱ͔͍ΧϥϜͷSELECTΛ΍ΊΔͱ଎͘ͳΔͬΆ͍

  117. ๻͕ೖ͖͔ͬͯͯΒ ➤ ๻: stackprofͰܭଌͨ͠ΒΫΤϦͱ JSON.parse ͕൒ʑͰɺ ΫΤϦ΋Ͱ͔͍ΧϥϜͷSELECTΛ΍ΊΔͱ଎͘ͳΔͬΆ͍ ➤ ๻: ͜ͷͰౕ͔͍ͦ΋ͦ΋࢖ͬͯͳ͘ͳ͍?

  118. ͜ͷίʔυΛྑ͘ݟΔͱɺ༨ܭͳSELECT, JSON.parse͕͋Δ p re v i e w ࢖ ͬͯ

    ͳ ͍ ΍ Δ ඞ ཁ ͳ ͍
  119. ࠷ େ ͷ Χ ϥϜ ͕ S E L E

    C T ͞ Ε ͳ ͘ ͳ Γ ɺ Ϋ Τ Ϧ ͕ ߴ ଎ Խ ࢖ Θ Εͯ ͍ ͳ ͍ ͷ ʹ ॏ ͍ J S O N . p a r s e ͕ ૸ Β ͳ ͘ ͳ ͬ ͨ ෆཁͳSELECT, JSON.parseͷআڈ ϨεϙϯελΠϜ: 7෼ˠ31ඵ ͪΌΜͱܭଌΛ͢Δͱɺগ ͳ͍࿑ྗͰܶతͳޮՌ͕ಘ ΒΕΔ͜ͱ΋͋Δ
  120. ࣍ͷ๻ͷมߋ ➤ ๻: ΋͏ҰݸͰ͔͍ΧϥϜͷschema_json͸ฦͯ͠Δ͚Ͳɺ͜ ΕΫϥΠΞϯτͰදࣔͯ͠ͳ͘ͳ͍…? ϖʔδωʔγϣϯ͠ͳ ͯ͘΋͜Ε࡟Ε͹଎͘ͳΔͬΆ͍

  121. ࣍ͷ๻ͷมߋ ➤ ๻: ΋͏ҰݸͰ͔͍ΧϥϜͷschema_json͸ฦͯ͠Δ͚Ͳɺ͜ ΕΫϥΠΞϯτͰදࣔͯ͠ͳ͘ͳ͍…? ϖʔδωʔγϣϯ͠ͳ ͯ͘΋͜Ε࡟Ε͹଎͘ͳΔͬΆ͍ ➤ ্࢘: schema_json͔ΒΫϥΠΞϯτଆͰclumns_countΛܭ

    ࢉͯ͠Δ͔Βඞཁɺ͚ͩͲΧϥϜ͕ͳ͍ ➤ ๻: ALTER͕ཁΔͷ͔…
  122. ࣍ͷ๻ͷมߋ ➤ ๻: ΋͏ҰݸͰ͔͍ΧϥϜͷschema_json͸ฦͯ͠Δ͚Ͳɺ͜ ΕΫϥΠΞϯτͰදࣔͯ͠ͳ͘ͳ͍…? ϖʔδωʔγϣϯ͠ͳ ͯ͘΋͜Ε࡟Ε͹଎͘ͳΔͬΆ͍ ➤ ্࢘: schema_json͔ΒΫϥΠΞϯτଆͰclumns_countΛܭ

    ࢉͯ͠Δ͔Βඞཁɺ͚ͩͲΧϥϜ͕ͳ͍ ➤ ๻: ALTER͕ཁΔͷ͔… ➤ ผͷνʔϜ: ͦͷςʔϒϧͷෛՙ͕Լ͕Δౕ͍͍࡞ͬͨͰ ➤ ๻: ϤογϟALTERͯ͠Ͱ͔͍ΧϥϜͷSELECTΛ΍ΊΔͧ
  123. ·ͣ͜ͷALTER͕ඞཁͩͬͨ ௥ Ճ

  124. ࣍ʹ৽͍͠ϓϩύςΟΛ௥Ճ

  125. S E L E C T Λ ֎ ͤΔ Α

    ͏ ʹ ͠ ͨ
  126. ෆཁͳSELECT, JSON.parseͷআڈ (2) ϨεϙϯελΠϜ: 31ඵˠ17ඵ ϖʔδωʔγϣϯΛ͍ΕΔͱAPIଆ΋ΫϥΠΞϯτଆ΋݁ߏ࣮૷͕େม ʹͳΔ͕ɺͦΕʹൺ΂ΔͱͲͪΒͷมߋ΋࠷খݶͰࡁΜͩ

  127. ͦͷޙ ➤ ๻: NewRelicΛݟΔͱͳΜ͔jbuilderͷϨΠϠʔͰϘτϧωο ΫʹͳͬͯΔ…? ➤ ๻: stackprofͰݟΔͱɺΫΤϦ͸΋͏஗͘ͳ͍͚ͲɺͳΜ͔ ActionViewͷfind_templateͰ஗͘ͳͬͯΔͳ…Ͳ͏͢Δ͔…

  128. ͦͷޙ ➤ ๻: NewRelicΛݟΔͱͳΜ͔jbuilderͷϨΠϠʔͰϘτϧωο ΫʹͳͬͯΔ…? ➤ ๻: stackprofͰݟΔͱɺΫΤϦ͸΋͏஗͘ͳ͍͚ͲɺͳΜ͔ ActionViewͷfind_templateͰ஗͘ͳͬͯΔͳ…Ͳ͏͢Δ͔… ➤

    Dࢯ: ͜ΕҎ߱͸ྲྀੴʹϖʔδωʔγϣϯ͔͠΍Δ͜ͱͳ͍͔ Βɺ೚ҙͷΧϥϜͰιʔτ͕Ͱ͖ͯݕࡧ΋Ͱ͖Δϖʔδωʔ γϣϯΛ͕Μ͹࣮ͬͯ૷͢ΔͰ ➤ ݁ߏ͕͔͔࣌ؒͬͯΔ࣮͠૷΋େ෼େ͖͍
  129. ͦͷޙɺ͋Δ೔ͷ͜ͱ

  130. amatsuda/jb ➤ ΋ͱ΋ͱ஌ͬͯͨ΋ͷͷ࢖ͬͨ͜ͱ͸ͳ͔͕ͬͨɺTokyuͰ໊ લΛݟͨͷͰ·ͨREADMEΛಡΜͰ͍ͨ

  131. amatsuda/jb ➤ ΋ͱ΋ͱ஌ͬͯͨ΋ͷͷ࢖ͬͨ͜ͱ͸ͳ͔͕ͬͨɺTokyuͰ໊ લΛݟͨͷͰ·ͨREADMEΛಡΜͰ͍ͨ find_template only once beforehand!?

  132. render collection: ͷ࣮૷ ➤ ͔ͨ͠ʹͦ͏ͳͬͯΔ ϧ ʔϓ ϧ ʔϓ ͷ

    ֎ Ͱ f i n d _ t e m p l a t e
  133. jbuilderͷ࣮૷ ➤ ͬͪ͜͸μϝͦ͏ c o l l e c t

    i o n ͷ ϧ ʔϓ ͷ ಺ ଆ Ͱ ී ௨ ʹ re n d e r ͯ͠ ͍ Δ
  134. ͳͷͰɺjbuilder→jbʹͯ͠Έͨ ➤ ҙ֎ͱ͏·͍͔͘ͳ͔ͬͨ ➤ ͦ΋ͦ΋਺͕ଟ͗ͯ͢ɺfind_templateҎ֎ͷΦʔόʔϔου΋ ແࢹͰ͖ͳͦ͞͏ɺ·ͨ͸jbͷϞϯΩʔύονͷӨڹ͔ ➤ jbͷํ͕ΦϒδΣΫτΛ࡞ͬͯ͠·͏? (ະௐࠪ) ϨεϙϯελΠϜ:

    17ඵˠ40ඵ ܭଌͯ͠Έͳ͍ͱԿ͕ى͖Δ͔Θ͔Βͳ͍ɺ͋Δ͍͸ɺϓϩϑΝΠϦϯ ά݁ՌΛਖ਼͘͠ಡΉͷ͸೉͍͠
  135. jbͷ··ɺpartialΛͦͷ৔ʹల։ͨ͠Β଎͘ͳͬͨ ➤ find_templateҎ֎ʹ΋ActionViewͷpartial renderingʹ͸ Φʔόʔϔου͕͋Δ ϨεϙϯελΠϜ: 40ඵˠ9ඵ ͔͠͠partial͸ڞ༗͍ͨ͠ͷͰɺ΍ͬͺΓϖʔδωʔγϣϯ͢Δ͔͠ͳ ͍ɺͱ͍͏ؾ࣋ͪʹͳΓͭͭ͋Δ

  136. ·ͱΊ ➤ ਖ਼͘͠ܭଌ͢Δͷ͸೉͍͠͠໘౗͍͘͞ ➤ ύϑΥʔϚϯεվળ͸΍Βͳ͍͍ͯ͘ͳΒ΍Δͳ ➤ VMͷؾ࣋ͪΛߟ͑ͯ࠷ॳ͔Β଎͍ίʔυΛॻ͜͏ ➤ ܭଌ͢ΔͳΒՄೳͳݶΓָͳํ๏Λબ΅͏ ➤

    ࢖͍ͬͯΔܭଌπʔϧͷ࢓૊ΈΛ஌Ζ͏