Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Takashi Kokubun

August 05, 2017
Tweet

More Decks by Takashi Kokubun

Other Decks in Programming

Transcript

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

    ➤ ࠷ۙ࡞ͬͨ΋ͷ ➤ LLVMϕʔεͷRubyͷJITίϯύΠϥ LLRB ➤ TreasureDataॴଐ ➤ ෼ࢄDBͷεΩʔϚ΍δϣϒͷ؅ཧΛ΍ΔRailsΞϓϦͷ։ൃ ➤ ↑ΛҰॹʹ΍ͬͯ͘ΕΔਓΛੵۃ࠾༻த!!
  2. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ1: ܭଌΛ͍ͯ͠ͳ͍ ➤ ͳΜ͔N+1ΫΤϦ(?)ౕͬͯΛeager loading(?)͢Δͱ଎͘ͳΔ Β͍͠! ➤ ϧʔϓͷதͰhas_many association͕ࢀর͞ΕͯΔ͔ΒͱΓ͋

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

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

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

    ܭଌ͸ਆ! ϘτϧωοΫ͕Ҡ͔ͬͨΒ·ͨܭଌ͠Α͏! ➤ ϓϩϑΝΠϦϯάͯ͠΋ͳ͔ͳ͔ݪҼ͕Θ͔Βͳ͍…͍ͭͷ·ʹ ͔1೔ܦͬͯͨ… ➤ ͍ͭͷ·ʹ͔ଞͷਓ͕ɺܭଌΛ͠ͳͯ͘΋ࢥ͍ͭ͘Α͏ͳɺ໌͔ ʹޮՌ͕͋Γͦ͏ͳύονΛग़͍ͯͨ͠ͷͰ΍Δඞཁ͕ͳ͘ͳͬ ͨ…
  6. ύϑΥʔϚϯεվળ ࣦഊύλʔϯ6: ෆཁͳ࠷దԽΛ͍ͯ͠Δ ➤ ύϑΥʔϚϯεΛվળͨ͠Βαʔόʔ୅͕ݮΒͤͦ͏͔ͩΒ ଎͘͠Α͏! ➤ NewRelicͰMost Time ConsumingΛݟͯϘτϧωοΫʹͳͬ

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

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

    ➤ ϕϯνϚʔΫʹΑͬͯ͸଎͘ͳΔ͚Ͳɺ໨తͷΞϓϦͰ͸ͦ ΜͳޮՌͳ͔ͬͨ… ➤ ͔͠΋LLVM͸Πϯετʔϧͪ͠ΌͩΊͬͯݴΘΕ͔ͨΒͲͬ ͪʹ͠Ζ࢖͑ͳ͔ͬͨ… ※ຊؾͰͦ͏ࢥ͍ͬͯͨΘ͚Ͱ͸ͳ͘δϣʔΫ͚ͩͲɺྫͱͯ͠͸͋Γ͏Δౕ
  9. Ͱ͸Ͳ͏͢Ε͹ྑ͍͔ ➤ 1. ࠷ॳ͸ͱʹ͔͘ಋೖָ͕ͳ؂ࢹπʔϧ͚ͩΛ͍Εͯܭଌ͢Δ ➤ 2. Ͳ͏ॻ͘ͱ଎͍͔Λ஌͓͖ͬͯɺҰൃͰ଎͍ίʔυΛॻ͖ɺͦͷ؂ࢹπʔϧ ͰͪΌΜͱ֬ೝ͢Δ ➤ ෆ҆ʹͳͬͨ࣌͸͜·ΊʹϕϯνϚʔΫͰͲͪΒ͕଎͍͔ൺֱ͢Δ

    ➤ 3. ຊ౰ʹ௚͞ͳ͍ͱࠔΔ΄Ͳ஗͍໰୊͕ൃ֮ͨ࣌͠ʹݶΓɺͦΕΛஸೡʹ௚͢ ➤ ௚͢બ୒ࢶ͕ͦ΋ͦ΋গͳ͍࣌͸ɺαοͱશ෦ࢼͯ͠͠·͏ ➤ Ͳ͜Λ௚ͤ͹͍͍͔શ͘Θ͔Βͳ͍࣌ɺԿނ஗͍ͷ͔Λಛఆ͢Δͷ͸ຊ౰ʹ ೉͍͠ͷͰɺ༷ʑͳܭଌํ๏ͷಛੑΛਂ͘஌Γɺ໰୊ͷमਖ਼ʹඞཁͳ࠷௿ݶ ͔ͭద੾ͳܭଌखஈΛऔΔ ➤ ௚͢΂͖৔ॴ͕Θ͔ͬͨޙɺͲ͏௚ͤΔ͔͸օ͞Μ࣍ୈ͚ͩͲɺࣄલʹ ݪҼ͕Θ͔͍ͬͯΕ͹ख໭Γ͸࠷খݶʹͳΔ
  10. rblineprof ϝϦοτɾڧΈ ➤ Ruby͔CͰఆٛ͞Εͨϝιουͷݺͼग़͠Ͱಈ͍͍ͯΔϓ ϩάϥϜ͸͓͓ΉͶ͍͍ײ͡ʹܭଌͰ͖Δ ➤ ࡞ऀஊ: This profiler is

    great for improving performance of rails templates and controllers. ➤ ग़ྗ͕ms୯ҐͷͨΊ௚ײతͰɺݟΔͷָ͕ ➤ ͱͯ΋ॏཁɺܭଌ݁ՌΛݟΔͷ͕େมͩͱ͕࣌ؒແବʹ ➤ ISUCONͱ͔ʹ࢖͏ͷ͸Αͦ͞͏
  11. rblineprof < < ΋ ɺ - “ ” ΋ ɺ

    . e m p t y ? ΋ ϝ ι ο υ ݺ ͼ ग़ ͠Ͱ ͸ ͳ ͍ ( ޙ ड़ ) ͷ Ͱ ܭ ଌ ͞ Ε ͳ ͍ -“” ͕ϝιουݺͼग़͠Ͱ͸ͳ͘ͳΔͷ͸Ruby 2.5͔ΒͰ͕͢ɺ͝ཡͷ௨Γ(?)͜Ε͸Ruby 2.5ͷERBͷੜ੒ίʔυͰ͢ ͜ Ε ΋ . t o _ s ͩ ͚ ͕ ϝ ι ο υ ݺ ͼ ग़ ͠ ( # [ ] ͱ < < ͕ ҧ ͏ ) ͳ ͷ Ͱɺ ͜ ͷ ߦ ʹ ͔ ͔ Δ ࣌ ؒ ͕ 5 . 3 m s ͱ ͸ ݶ Β ͳ ͍
  12. stackprof stackprofͷ࢓૊Έ ➤ setitimer(2) ͰҰఆͷCPU࣌ؒ or ࣮͓͖࣌ؒʹSIGPROF ➤ sigaction(2) ͰγάφϧϋϯυϥΛηοτ͠ɺͦ͜Ͱ

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

    ελοΫશମͰͷׂ߹͚ͩͰͳ͋͘ΔϝιουͰߦ͝ͱʹ ͔͔͍ͬͯΔ࣌ؒͷׂ߹΋ग़ͤɺ·༷ͨʑͳํ๏Ͱͷ visualizationΛαϙʔτ͍ͯ͠Δ
  14. perf ➤ ϝϦοτ ➤ CͷϨϕϧͰαϯϓϦϯάϓϩϑΝΠϧ͕Ͱ͖Δ ➤ ͳͷͰɺrubyࣗମͷϓϩϑΝΠϦϯάʹ࢖͑Δ ➤ σϝϦοτ ➤

    ruby͕େମ1ͭͷؔ਺(vm_exec_core)ͰҰੜΛऴ͑ΔͷͰ ׂͱݟͮΒ͍ ➤ Linux͡Όͳ͍ͱ࢖͑ͳ͍
  15. `rails s`ͷϩά ➤ ϝϦοτ ➤ Կ΋͠ͳͯ͘΋ݟΕΔ ➤ ோΊͯΕ͹݁ߏ༷ࢠ͕Θ͔Δ (͔ͳΓ͓͢͢Ί) ➤

    ͜ΕීஈݟͯͨΒbullet.gemͱ͔͍Βͳ͘ͳ͍Ͱ͔͢ ➤ σϝϦοτ ➤ ΊͪΌͪ͘Όن໛͕େ͖͘ͳΔͱͪΐͬͱಡΉͷ͕େม
  16. ༨ܭͳ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 ͷ Π ϯελ ϯε Λ ࡞ Δ ͷ ͸ ॏ ͍ ͔ Β ؾ ʹ ͳ Δ
  17. ༨ܭͳ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 Π ϯε λ ϯε ͕ Ͳ Μ Ͳ Μ ࡞ Β Ε Δ
  18. ༨ܭͳ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 ೖ Ε ͨ )
  19. ༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ Rails 5ɺਓྨօฏ࿨ ߜ Γ ࠐ Έ ͷ ͨ

    Ί ͷ L E F T J O I N ʹ i n c l u d e s Λ ࢖ ͍ ग़ ͢ ഐ
  20. ༨ܭͳΦϒδΣΫτੜ੒ ͳ ΜͰ ν Σ ο Ϋ ͯ͠ Δ ͷ

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

    τ ੜ ੒ ͕ 1 ͭ ʹ ϝ ι ο υ ݺ ͼ ग़ ͠Ͱ ͸ ͳ ͘ ͳ ͬ ͨ ( ޙ ड़ ) fstringͱ͔frozen_string_literal ͸…هड़ྔͷׂʹॻ͍ͯܶతʹޮՌ͕ग़ͨ͜ͱ͕ͳ͍ ͷͰผʹࢦఠ͠ͳ͍ࣗ͠෼΋ॻ͔ͳ͍
  22. ϝιουݺग़ͷόΠύε ➤ YARVʹ͸opt໋ྩͱ͍͏ͷ͕͋Δ ➤ ҎԼ͸࠶ఆٛ͞Ε͍ͯͳ͚Ε͹ϝιουݺͼग़͠ʹͳΒͳ͍ ➤ “foo”.freeze, [a, b].max, [a,

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

    unless array.empty? ͡Όͳͯ͘ if array.any? ͬͯॻ͖͍ͨ ؾ࣋ͪࣗମ͸Θ͔Δɺ͕ɺඍົʹظ଴ͱҧ͏ڍಈͳͷ͕ؾʹͳ Δ ➤ …ͱ͍͏͍ͪΌ΋ΜΛ͚ͭΔͷʹɺempty?ͷํ͕଎͍ͷΛ࢖͑Δ (?) ➤ String#concat ΑΓ String#<< ͷํ͕଎͍ ➤ concatͷํ͕޷͖ͳਓ͸࢒೦Ͱͨ͠
  24. Ͱ΋ɺ(࢒೦ͳ͕Β)૯߹తʹݟͨΒ͜ͷ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 ͘ Β ͍
  25. ๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ ➤ Aࢯ: εΩʔϚౕͬͯผςʔϒϧʹͨ͠ํ͕͍͍Μ͡Όͳ͍ ➤ Bࢯ:

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

    શ͘ܭଌͯ͠ͳ͍͠ԿͰ஗͍ͷ͔Α͘Θ͔ΒΜ͚Ͳɺ ϖʔδωʔγϣϯͨ͠ΒΑͦ͞͏ ➤ Cࢯ: ͏ʔΜͰ΋ΫϥΠΞϯτଆͰιʔτ΋ݕࡧ΋ͯ͠Δ͔Β ϖʔδωʔγϣϯ͸೉͍͠͠ɺͦͷͨΊʹ΋৽͘͠ΧϥϜ͕ ཁΔ͚Ͳɺ͜ͷςʔϒϧALTER͢Δͷ೉͍͠Θ… ➤ ALTERͰࢭ·ͬͨ··1೥ޙ… Aࢯ, Bࢯ, Cࢯ, ୀ৬!!
  27. ࠷ େ ͷ Χ ϥϜ ͕ S E L E

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

    ࢉͯ͠Δ͔Βඞཁɺ͚ͩͲΧϥϜ͕ͳ͍ ➤ ๻: ALTER͕ཁΔͷ͔… ➤ ผͷνʔϜ: ͦͷςʔϒϧͷෛՙ͕Լ͕Δౕ͍͍࡞ͬͨͰ ➤ ๻: ϤογϟALTERͯ͠Ͱ͔͍ΧϥϜͷSELECTΛ΍ΊΔͧ
  29. ͦͷޙ ➤ ๻: NewRelicΛݟΔͱͳΜ͔jbuilderͷϨΠϠʔͰϘτϧωο ΫʹͳͬͯΔ…? ➤ ๻: stackprofͰݟΔͱɺΫΤϦ͸΋͏஗͘ͳ͍͚ͲɺͳΜ͔ ActionViewͷfind_templateͰ஗͘ͳͬͯΔͳ…Ͳ͏͢Δ͔… ➤

    Dࢯ: ͜ΕҎ߱͸ྲྀੴʹϖʔδωʔγϣϯ͔͠΍Δ͜ͱͳ͍͔ Βɺ೚ҙͷΧϥϜͰιʔτ͕Ͱ͖ͯݕࡧ΋Ͱ͖Δϖʔδωʔ γϣϯΛ͕Μ͹࣮ͬͯ૷͢ΔͰ ➤ ݁ߏ͕͔͔࣌ؒͬͯΔ࣮͠૷΋େ෼େ͖͍
  30. jbuilderͷ࣮૷ ➤ ͬͪ͜͸μϝͦ͏ c o l l e c t

    i o n ͷ ϧ ʔϓ ͷ ಺ ଆ Ͱ ී ௨ ʹ re n d e r ͯ͠ ͍ Δ