Slide 1

Slide 1 text

ʮٕज़తෛ࠴ʯʹ͍ͭͯ ࢲ͔Βݴ͑Δ͜ͱ ࢲ͔Βݴ͑ͳ͍͜ͱ #omotesandorb #41 2018/12/06

Slide 2

Slide 2 text

໔੹ ओ؍ೖͬͯΔεϥΠυͰ͢ɻ จ੹͸৬৔Ͱ͸ͳ͘ࢲ (੕໺ twitter.com/hoppiestar) ʹ͋Γ ·͢

Slide 3

Slide 3 text

͓୊͸ʮٕज़తෛ࠴ʯͩͬͨ ʮԶ͕͠Ό΂Γ͍ͨʂʂʯ

Slide 4

Slide 4 text

௚ۙͷݱ৔͔Β: ෛ࠴ͬΆ͍΍ͭͷฦ٫ • redshift΁ͷΠϯϙʔτ(ΊͬͪΌϝϞϦϦʔΫ͢Δ)Λ embulkʹஔ͖׵͑ • ෆ҆ఆͩͬͨWercker v1ͷCIΛ CircleCI v2ʹҠߦ • ☕ hubot2ඖɾruboty1ඖΛ ruboty1ඖʹ౷߹ͯ͠ coffeeͷίʔυΛফͨ͠☕ • rubocop todoΛ1500ߦ ->130ߦʹݮΒͨ͠ • 3೥ͿΓͷrails updateͨ͠ • αϙʔτ੾Εͷruby2.1 -> ruby2.3ʹΞοϓσʔτ • ✨঎඼classͷdefault_scopeΛ1ݸফͨ͠✨

Slide 5

Slide 5 text

( ŋ´Ŗŋʆ)Ͳ΍

Slide 6

Slide 6 text

ʮٕज़తෛ࠴ʯΩʔϫʔυ(ʹͳΓͦ͏ͳ΍ͭ) • εςʔΫϗϧμʔ΁ͷઆ໌Ͳ͏͢Δ͔ • Ϟνϕʔγϣϯ͕Ͳ͏ͱ͔ • εϓϦϯτʹͲ͏૊ΈࠐΉ͔ • ෛ࠴ͱ͔ܰʑʹ͍͏΂͖Ͱ͸ͳ͍ɺ੒௕ʹײँ͠Α͏ͱ͔ • ෛ࠴͸ੜଘऀόΠΞεͩͱ͔ • ෛ࠴ͱ͸Կ͔ͱ͔

Slide 7

Slide 7 text

ʮٕज़తෛ࠴ʯΩʔϫʔυ(ʹͳΓͦ͏ͳ΍ͭ) • εςʔΫϗϧμʔ΁ͷઆ໌Ͳ͏͢Δ͔ • Ϟνϕʔγϣϯ͕Ͳ͏ͱ͔ • εϓϦϯτʹͲ͏૊ΈࠐΉ͔ • ෛ࠴ͱ͔ܰʑʹ͍͏΂͖Ͱ͸ͳ͍ɺ੒௕ʹײँ͠Α͏ͱ͔ • ෛ࠴͸ੜଘऀόΠΞεͩͱ͔ • ෛ࠴ͱ͸Կ͔ͱ͔ ࿩͞ͳ͍!!!!

Slide 8

Slide 8 text

࿩͢͜ͱ • ࡶ༻ܥͷখखઌςΫχοΫε • simplecov • Rails.logger • rubocop • (Ϩϕϧ͕௿͔ͬͨΒεϚϯɻɻɻɻ)

Slide 9

Slide 9 text

ʮٕज़తෛ࠴ʯʹ͍ͭͯ ࢲ͔Βݴ͑Δ͜ͱ

Slide 10

Slide 10 text

໌೔ͷօ͞Μͷ͓͠͝ͱ • ʮ(࢓ࣄ, ࢓ࣄ…..)ʯ

Slide 11

Slide 11 text

• ʮ(࢓ࣄ, ࢓ࣄ…..)ʯ • ʮ͋ɺ͜Εෛ࠴ͩʯ ໌೔ͷօ͞Μͷ͓͠͝ͱ

Slide 12

Slide 12 text

• ʮ(࢓ࣄ, ࢓ࣄ…..)ʯ • ʮ͋ɺ͜Εෛ࠴ͩʯ • ʮͲ͏͠Α͏࣏ͦ͏͔ͳʯ ໌೔ͷօ͞Μͷ͓͠͝ͱ

Slide 13

Slide 13 text

• ʮ(࢓ࣄ, ࢓ࣄ…..)ʯ • ʮ͋ɺ͜Εෛ࠴ͩʯ • ʮͲ͏͠Α͏࣏ͦ͏͔ͳʯ ඞͣͿͪ౰ͨΔ ໌೔ͷօ͞Μͷ͓͠͝ͱ

Slide 14

Slide 14 text

(ෛ࠴ͬΆ͍΍ͭ)ݟ͚ͭͨΒͲ͏͢Δ͔

Slide 15

Slide 15 text

ʮՄೳͳΒͦͷ৔ͰԿ͔ΞΫγϣϯ͢Δʯ ͷ͕ྑ͍!!!! ͱ͍͏࿩Λ͠·͢

Slide 16

Slide 16 text

ෛ࠴ฦ٫ͷݱ৔ • ςετ଍͢ ☺☺☺☺☺ • ࢖ͬͯͳ͍ίʔυΛফ͢ ☺☺☺☺☺ • ίʔσΟϯάελΠϧΛ੔ཧ ☺☺☺ • ݹ͍ϥΠϒϥϦͷΞοϓσʔτ ☺ • ෳࡶԽ͍ͯ͠Δ෦෼ͷϦϑΝΫλϦϯά ίεύ౓ (ओ؍) = ☺

Slide 17

Slide 17 text

ෛ࠴ฦ٫ͷݱ৔ • ςετ଍͢ ☺☺☺☺☺ <- ͜Ε • ࢖ͬͯͳ͍ίʔυΛফ͢ ☺☺☺☺☺ • ίʔσΟϯάελΠϧΛ੔ཧ ☺☺☺ • ݹ͍ϥΠϒϥϦͷΞοϓσʔτ ☺ • ෳࡶԽ͍ͯ͠Δ෦෼ͷϦϑΝΫλϦϯά ίεύ౓ (ओ؍) = ☺

Slide 18

Slide 18 text

ʮςετ଍͢ʯ

Slide 19

Slide 19 text

• νʔϜͰʮॻ͍ͯ͑͑Μ΍Ͱʯͱ͍͏Ωϝ͚͓͚ͩͯ͠͹ ௚ͯ͠Okͦ͏(͍͍ͨͯେৎ෉ͦ͏) ʮ͋ɺ͜͜ςετ௨ͬͯͳͦ͞͏ʯ ʮςετ଍͢ʯνϟϯε

Slide 20

Slide 20 text

• νʔϜͰʮॻ͍ͯ͑͑Μ΍Ͱʯͱ͍͏Ωϝ͚͓͚ͩͯ͠͹ ௚ͯ͠Okͦ͏(͍͍ͨͯେৎ෉ͦ͏) • ςετ࣮ߦ࣌ؒ஗͘ͳΓͦ͏ • େৎ෉ɺݩʑे෼஗͍…. • ฒྻςετͰ͓ۚͰԥΖ͏…. ʮ͋ɺ͜͜ςετ௨ͬͯͳͦ͞͏ʯ ʮςετ଍͢ʯνϟϯε

Slide 21

Slide 21 text

ʮςετ଍͢ʯνϟϯε ʮ͋ɺ͜͜ςετ௨ͬͯͳͦ͞͏?ʯ • (ಡΜͰ΋ͪ͝Όͪ͝Όͯͯ͠Α͘Θ͔ΒΜ..)

Slide 22

Slide 22 text

ʮςετ଍͢ʯνϟϯε • (ಡΜͰ΋ͪ͝Όͪ͝Όͯͯ͠Α͘Θ͔ΒΜ..) • ͋Γ͕ͪ • -> ͝ଘ஌ simplecov gem ศར ʮ͋ɺ͜͜ςετ௨ͬͯͳͦ͞͏?ʯ

Slide 23

Slide 23 text

simplecovͷు͘Ϩϙʔτ

Slide 24

Slide 24 text

simplecov gemศར • rspecগ͠஗͘ͳΔͷͰɺݟ͍ͨͱ͖ʹ͚ͩͰ΍Δ • spec/rails_helper.rbྫ • ↑؀ڥม਺Ͱ੾Γସ͑ͯΔɻCIͰ͸ONɻ։ൃऀ͸೚ҙɻ •

Slide 25

Slide 25 text

simplecov gemศར • rspecগ͠஗͘ͳΔͷͰɺݟ͍ͨͱ͖ʹ͚ͩͰ΍Δ • spec/rails_helper.rbྫ • ↑؀ڥม਺Ͱ੾Γସ͑ͯΔɻCIͰ͸ONɻ։ൃऀ͸೚ҙɻ • ͔͠͠CircleCIͰฒྻςετ͢Δͱ͏·͘ಈ͔Μ -> codecov.io ศར

Slide 26

Slide 26 text

codecov.io ͷϨϙʔτ simplecovͱҰॹ

Slide 27

Slide 27 text

codecov.io ศར • CI্Ͱௐ΂ͨΧόϨοδΛ΋ͱʹϨϙʔτදࣔͯ͘͠ΕΔ • CircleCI্Ͱฒྻςετͯ͠΋ͪΌΜͱಈ͘ͷͰศར • ɹ •

Slide 28

Slide 28 text

codecov.io ศར • CI্Ͱௐ΂ͨΧόϨοδΛ΋ͱʹϨϙʔτදࣔͯ͘͠ΕΔ • CircleCI্Ͱฒྻςετͯ͠΋ͪΌΜͱಈ͘ͷͰศར • READMEͱ͔ʹషΕΔόοξ΋͋ΔΑ • spec/rails_helper.rbྫ • (ॏๅ͍ͯ͠Δɺͱ͍͏ΑΓ΋ɺͨ·ʔʔʔʹݟΔ͙Β͍)

Slide 29

Slide 29 text

ΧόϨοδ͸্͛ͱ͍ͨ΄͏͕ྑ͍(ܦݧஊ) • εϚʔϏʔͷAPI͸ෛ࠴ଟ͍͕ΧόϨοδ͸ߴ͘ɺrails update ࣌ɺॿ͔ͬͨ • 2೥લ࣌఺Ͱ80%ۙ͋ͬͨ͘ -> ࠓ90%୆ • ɹ •

Slide 30

Slide 30 text

ΧόϨοδ͸্͛ͱ͍ͨ΄͏͕ྑ͍(ܦݧஊ) • εϚʔϏʔͷAPI͸ෛ࠴ଟ͍͕ΧόϨοδ͸ߴ͘ɺrails update ࣌ɺॿ͔ͬͨ • 2೥લ࣌఺Ͱ80%ۙ͋ͬͨ͘ -> ࠓ90%୆ • ʮRails ΞοϓάϨʔυΨΠυʯʹ΋ͦ͏ॻ͍ͯ͋Δ •

Slide 31

Slide 31 text

ͱ͍͏Θ͚Ͱ • Q. ʮςετ଍͢ʯνϟϯε ʹग़͘Θͨ͠Β?? • A.

Slide 32

Slide 32 text

ͱ͍͏Θ͚Ͱ • Q. ʮςετ଍͢ʯνϟϯε ʹग़͘Θͨ͠Β?? • A. ͦͷ৔Ͱॻ͚͹͍͍ͱࢥ͏!! • (Ұ୴issueʹ͢Δ… ͱ͔ϝϯυΠͷͰɺՄೳͳΒ͙͢ॻ͘)

Slide 33

Slide 33 text

ෛ࠴ฦ٫ͷݱ৔ • ςετ଍͢ ☺☺☺☺☺ • ࢖ͬͯͳ͍ίʔυΛফ͢ ☺☺☺☺☺ <- ͭ͗͜Ε • ίʔσΟϯάελΠϧΛ੔ཧ ☺☺☺ • ݹ͍ϥΠϒϥϦͷΞοϓσʔτ ☺ • ෳࡶԽ͍ͯ͠Δ෦෼ͷϦϑΝΫλϦϯά ίεύ౓ (ओ؍) = ☺

Slide 34

Slide 34 text

ʮ࢖ͬͯͳ͍ίʔυফ͢ʯ

Slide 35

Slide 35 text

• νʔϜͰʮফͯ͑͑͠Μ΍Ͱʯͱ͍͏Ωϝ͚͓͚ͩͯ͠͹Ok ͦ͏(͍͍ͨͯେৎ෉ͦ͏) • …. • …. ʮ͋ɺ͜ͷϝιου(or Ϋϥε)࢖ͬͯͳͦ͞͏ʯ ʮ࢖ͬͯͳ͍ίʔυফ͢ʯνϟϯε

Slide 36

Slide 36 text

• νʔϜͰʮফͯ͑͑͠Μ΍Ͱʯͱ͍͏Ωϝ͚͓͚ͩͯ͠͹Ok ͦ͏(͍͍ͨͯେৎ෉ͦ͏) • ͳΜ͔յͨ͠Βා͍…. • େৎ෉ɺ౓ڳͰ৐Γ੾Ζ͏(?)…. ʮ͋ɺ͜ͷϝιου(or Ϋϥε)࢖ͬͯͳͦ͞͏ʯ ʮ࢖ͬͯͳ͍ίʔυফ͢ʯνϟϯε

Slide 37

Slide 37 text

࢖ͬͯͳ͍ίʔυΛফ͢ํ๏ ೉͍͠ॱ • ͍͖ͳΓফ͢ -> • Α͘ಡΜͰ͔Βফ͢ -> •

Slide 38

Slide 38 text

࢖ͬͯͳ͍ίʔυΛফ͢ํ๏ ೉͍͠ॱ • ͍͖ͳΓফ͢ -> • Α͘ಡΜͰ͔Βফ͢ -> • Α͘Θ͔ΒΜͷͰͱΓ͋͑ͣϩάΛೖΕΔ -> • ޙ೔ফ͢ • ݟͳ͔ͬͨ͜ͱʹ͢Δɾ๨ΕΔ -> ΘΓͱΑ͘ͳ͍

Slide 39

Slide 39 text

ʮ(ফͤͦ͏͚ͩͲ)Α͘Θ͔ΒΜͷͰͱΓ͋͑ͣϩάΛ ೖΕ·͢ʯ

Slide 40

Slide 40 text

ʮ(ফͤͦ͏͚ͩͲ)Α͘Θ͔ΒΜͷͰͱΓ͋͑ͣϩάΛ ೖΕ·͢ʯ ʮ࢖ͬͯͳ͍ϝιου͕ݺ͹Ε·ͨ͠ʯͱ͍͏(ҰݟͻͲ͍)ϩά

Slide 41

Slide 41 text

ʮ(ফͤͦ͏͚ͩͲ)Α͘Θ͔ΒΜͷͰͱΓ͋͑ͣϩάΛ ೖΕ·͢ʯ ʮ࢖ͬͯͳ͍ϝιου͕ݺ͹Ε·ͨ͠ʯͱ͍͏(ҰݟͻͲ͍)ϩά • ຊ౰ʹݺ͹Εͳ͚Ε͹ϩάʹग़ͳ͍͸ͣ!! ʮΑ͠ʯ

Slide 42

Slide 42 text

ʮ(ফͤͦ͏͚ͩͲ)Α͘Θ͔ΒΜͷͰͱΓ͋͑ͣϩάΛ ೖΕ·͢ʯ ʮ࢖ͬͯͳ͍ϝιου͕ݺ͹Ε·ͨ͠ʯͱ͍͏(ҰݟͻͲ͍)ϩά • ຊ౰ʹݺ͹Εͳ͚Ε͹ϩάʹग़ͳ͍͸ͣ!! • ʮsentry࢖͑͹..?ʯ • ·ͬͱ͏ͳҙݟ… ͔͠͠ຊ౰ʹݺ͹Εͯͨ৔߹ʹϜμ ʮΑ͠ʯ

Slide 43

Slide 43 text

ফ͢ॱ൪ʹ஫ҙ(ओʹDBपΓͷҰൠ࿦) • DBͷΧϥϜ࡟আͱcontroller/model/view࡟আ͸ஈ֊σϓϩΠͨ͠ ΄͏͕ྑ͍͜ͱ͕ଟ͍ɺΑΓ҆શʹσϓϩΠͰ͖ͳ͍͔͸(ҰԠ) ߟ͑ͨ΄͏͕ྑͦ͞͏ • ྫ • viewͷมߋͱALTER TABLE DROP COLUMN Λ͍ͬ΃Μʹ ΍Βͳ͍ɺͱ͔ɺɺ • ྫ͑͹Sidekiq΋ҰԠredisͳͷͰ஫ҙɻ҆қʹΫϥε໊Ϧ ωʔϜ͢Δͱഁ໓͢Δɺɺͱ͔ɺɺ

Slide 44

Slide 44 text

ͱ͍͏Θ͚Ͱ • Q. ʮ࢖ͬͯͳ͍ίʔυফ͢ʯνϟϯε ʹग़͘Θͨ͠Β?? • A. ͦͷ৔Ͱফͤ͹͍͍ͱࢥ͏!! • ফ͢ͷ͕༐ऀ • ා͚Ε͹ϩάΛग़͢

Slide 45

Slide 45 text

ෛ࠴ฦ٫ͷݱ৔ • ςετ଍͢ ☺☺☺☺☺ • ࢖ͬͯͳ͍ίʔυΛফ͢ ☺☺☺☺☺ • ίʔσΟϯάελΠϧΛ੔ཧ ☺☺☺ <- ͭ͗͜Ε • ݹ͍ϥΠϒϥϦͷΞοϓσʔτ ☺ • ෳࡶԽ͍ͯ͠Δ෦෼ͷϦϑΝΫλϦϯά ίεύ౓ (ओ؍) = ☺

Slide 46

Slide 46 text

ʮίʔσΟϯάελΠϧΛ੔ཧʯ

Slide 47

Slide 47 text

• νʔϜͰʮ௚ͯ͑͑͠Μ΍Ͱʯͱ͍͏Ωϝ͚͓͚ͩͯ͠͹Ok ͦ͏(͍͍ͨͯେৎ෉ͦ͏) • rubocopͱ͔ೖΕ͓ͯ͘ɾCIͰνΣοΫ͢Δ • ͳΜ͔յͨ͠Βා͍…. • େৎ෉ɺ౓ڳͰ৐Γ੾Ζ͏…. ʮ(ϨϏϡʔதʹ) ͳΜ͔ελΠϧʹҰ؏ੑ͕ͳ͍…ʯ ʮίʔσΟϯάελΠϧΛ੔ཧʯ͢Δνϟϯε

Slide 48

Slide 48 text

• Θ͔Βͳ͘͸ͳ͍ • rubyͳͷͰ • ͜Ε΋νʔϜͰ߹ҙͱͬͱ͚͹ྑͦ͞͏(࢖Θͳ͍ɺͱ͔) ʮrubocopͱ͔͍Ε͓ͯ͘ʯʹ͍ͭͯͷڋ൱൓Ԡ

Slide 49

Slide 49 text

• `—lint` Φϓγϣϯ • Lint Cop͚ͩνΣοΫ͢Δ΍ͭ • ࣮ߦ଎͍ɾׂͱόάݟ͔ͭΔ • ࠷ॳʹ `DisabledByDefault: true` ͱॻ͘ • σϑΥϧτશ෦ແޮʹ͢Δͱ͏Δ͘͞ͳ͍ ΏΔ͘rubocopΛ࢝ΊΔબ୒ࢶ

Slide 50

Slide 50 text

• εϚʔϏʔͷAPI͸ॳظʹ.rubocop.yml͋ͬͨͷͰͦΕʹै͏ • ͨͩ͠CIͰνΣοΫͯ͠ͳ͔ͬͨͷͰਏ͍ײ͡ʹ • CIͰνΣοΫ͢ΔΑ͏ʹͨ͠(͜ΕͰtodo૿͑ͳ͘ͳΔ) • ઃఆʹ͍ͭͯҟ࿦͕ग़ͨΒ౎౓ௐ੔͍ͯ͘͠ײ͡Ͱྑͦ͞͏ εϚʔϏʔͷAPIͷrubocop

Slide 51

Slide 51 text

• ݸਓతʹtodoݮΒ͢ͷ޷͖ͳͷͰΨοͱ΍͍ͬͯͬͨ • ࢥ͍ೖΕͷ͋Δྫ • (ৼΓฦͬͯΈͯ)ਖ਼௚ͦΜͳʹؤுΜͳͯ͘΋ྑ͔͔ͬͨ΋ • ͜͜Ͱ΋΍ͬͺΓΧόϨοδߴ͍ͱ҆৺ • ΍ͬͺΓϩά؂ࢹେࣄɻsentryೖΕͱ͘ͱ҆৺ εϚʔϏʔͷAPIͷrubocop(2)

Slide 52

Slide 52 text

ͱ͍͏Θ͚Ͱ • Q. ʮίʔσΟϯάελΠϧΛ੔ཧʯ͢Δνϟϯε ʹग़͘Θ͠ ͨΒ?? • A. ͦͷ৔Ͱ࣏ͤ͹͍͍ͱࢥ͏!! • େมͦ͏ͱࢥͬͨΒ • rubocopͰ Enabled:false͢Ε͹͍͍ͱࢥ͏

Slide 53

Slide 53 text

ෛ࠴ฦ٫ͷݱ৔ • ςετ଍͢ ☺☺☺☺☺ • ࢖ͬͯͳ͍ίʔυΛফ͢ ☺☺☺☺☺ • ίʔσΟϯάελΠϧΛ੔ཧ ☺☺☺ • ݹ͍ϥΠϒϥϦͷΞοϓσʔτ ☺ <- ͭ͗͜Ε • ෳࡶԽ͍ͯ͠Δ෦෼ͷϦϑΝΫλϦϯά ίεύ౓ (ओ؍) = ☺

Slide 54

Slide 54 text

ʮݹ͍ϥΠϒϥϦͷΞοϓσʔτʯ

Slide 55

Slide 55 text

• ͜Εʹ͍ͭͯ͸͋·Γݴ͏͜ͱ͕ͳ͍ • ʮ΍͍͔ͬͯ͘͠ͳ͍ʯ ݹ͍ϥΠϒϥϦͷΞοϓσʔτ

Slide 56

Slide 56 text

• ͜Ε௒൵͍͠΍ͭ • ͦΜͳʹܰ͘rails updateͰ͖ͳ͍(ݱ࣮) • ͚Ͳؾ͍ͮͨͷʹ௚͞ͳ͍ͷ͸΋͍ͬͨͳ͍ • issueʹॻ͘? ͍΍͍΍…. ʮ৽͍͠RailsͳΒ͜͏ॻ͚Δͷʹ!!! ʢٽ)ʯ ʮݹ͍ϥΠϒϥϦͷΞοϓσʔτʯ͢Δνϟϯε

Slide 57

Slide 57 text

ྫ: rails5.2͔ΒAR::Base.sanitize_sql_array͕publicʹঢ֨͢Δ όοΫϙʔτ

Slide 58

Slide 58 text

ྫ: rails5.2͔ΒAR::Base.sanitize_sql_array͕publicʹঢ֨͢Δ όοΫϙʔτ

Slide 59

Slide 59 text

ྫ: rails5.2͔ΒAR::Base.sanitize_sql_array͕publicʹঢ֨͢Δ όοΫϙʔτ • ͜ͷϞδϡʔϧΛincludeͯ͠࢖͏ • rails5.2ʹͳͬͨΒࡶʹraiseͯ͠rails͕ىಈͰ͖ͳ͍Α͏ʹ͢Δ

Slide 60

Slide 60 text

ͱ͍͏Θ͚Ͱ • Q. ʮ৽͍͠railsͳΒ͜͏ॻ͚Δͷʹʯνϟϯε ʹग़͘Θͨ͠ Β?? • A. ͦͷ৔ͰόοΫϙʔτͯ͠΋͍͍ͱࢥ͏!! • ͍ܰ΍ͭͳΒɺͨ·ʹόοΫϙʔτͰ͖Δ͜ͱ΋͋Δ • ΋ͪΖΜίϝϯτॻ͚ͩ͘Ͱ΋ • ʮTODO: rails5.2ʹ্͛ͨΒ͜͏௚͠·͢!ʯͱ͔

Slide 61

Slide 61 text

ͱ͍͏Θ͚Ͱ (ແཧ΍Γ·ͱΊ) • Q. νϟϯε ʹग़͘Θͨ͠Β?? • A. ͦͷ৔Ͱ௚ͤΕ͹௚͢ͱ͍͍ͱࢥ͏!!

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

εϥΠυ͸Ҏ্ • ࣗݾ঺հ • גࣜձࣾεϚʔϏʔ • ੕໺߶ࢤ(github.com/hoshinotsuyoshi) • ࢠҭͯੈ୅ɾঁੑ޲͚ͷECαΠτ࡞ͬͯΔ • rubyͱ͔Πϯϑϥͱ͔͕޷͖