Slide 1

Slide 1 text

ୀ۶ͳ͜ͱ͸ 3VCZʹ͓Ͷ͕͍͠Α͏ 2020.12.27. Tama.rb #25 ೥๨ΕLTձ @makicamel

Slide 2

Slide 2 text

w!NBLJDBNFM઒ݪສق wɹ w3VCZͱϏʔϧɹɹͱ͓ञ͕޷͖ ࣗݾ঺հ

Slide 3

Slide 3 text

͓खݩͷRails ΞϓϦʹ BQQMJDBUJPO@DPOUSPMMFSSC ͍ͭ͋͘Γ·͔͢ʁ ಥવͰ͕͢ ܧঝͱϝλϓϩάϥϛϯάຬࡌͳΞϓϦέʔγϣϯίʔυͰ΋ΞΫγϣϯͱϑΟϧλʹ೰·ͳ͍ͨΊͷ(FNΛ࡞ͬͨ࿩ IUUQTTQFBLFSEFDLDPNNBLJDBNFMMFUTFOKPZDSFBUJOHHFNT

Slide 4

Slide 4 text

˞೥݄೔࣌఺ "/%1"% # => 325 $ find . -name application_controller.rb | wc -l

Slide 5

Slide 5 text

˞೥݄೔ݱࡏ "/%1"% $ fd application_controller.rb | wc -l # => 49 # => 325 ˞೥݄೔࣌఺ $ find . -name application_controller.rb | wc -l 85%ݮʂ ͍͢͝Ͷ

Slide 6

Slide 6 text

ॳख •ͻͱͭͻͱͭखͰஔ͖׵͑Δ •σΟϨΫτϦຖʹ౗͍͚ͯ͠͹͍͍͸ͣ •ࠓ·Ͱͷ׳ྫ΋कΒΕͯແடংʹͳΒͳ͍ •2 PullRequests Ͱ໿ 40 ϑΝΠϧ࡟আ •࣌ؒͱࠜؾͱूதྗͷඞཁͳ࡞ۀ

Slide 7

Slide 7 text

खΛಈ͔ͯ͠ؾͮ͘ •εΫϦϓτͰ͍͚ΔͷͰ͸ʁ

Slide 8

Slide 8 text

ཌ݄༵೔

Slide 9

Slide 9 text

ཌ݄༵೔ ࢒໿ 240 ϑΝΠϧ͸দా͞Μ͕౗ͯ͘͠Ε·ͨ͠

Slide 10

Slide 10 text

εΫϦϓτͰ΍Δͱ ͳʹ͕͏Ε͍͠ͷ͔

Slide 11

Slide 11 text

εΫϦϓτͰ΍Δͱ •࡞ۀϛε͕ͳ͍ •ਓؒ͸ؒҧ͑Δ •ϓϩάϥϜ͸໊લ͕ࣅ͍ͯΔϞδϡʔϧ͕͋ͬͯ΋ؒҧ͑ͳ͍ •ϛεʹ஫ҙΛ෷Θͳͯ͘Α͍ͷͰϨϏϡʔෛ୲͕ݮΔ

Slide 12

Slide 12 text

εΫϦϓτͰ΍Δͱ •࠶ݱੑ͕ߴ͍ •ߟྀ࿙Ε͕͋ͬͯ΋ԿճͰ΋΍Γ௚͠Մೳ •ख࡞ۀͰಉ͡࡞ۀɾݕূΛ܁Γฦ͞ͳͯ͘Α͍

Slide 13

Slide 13 text

εΫϦϓτͰ΍Δͱ •࠶ར༻ੑ͕ߴ͍ •৚݅Λม͑ͯΑΓ෯޿͍໰୊ʹద༻Ͱ͖Δ •ૣ͍ •80 ϑΝΠϧͷ࡟আ͕਺ඵ •ίϛοτͷ࡞੒΋Ͱ͖Δ

Slide 14

Slide 14 text

εΫϦϓτͰ΍Δͱ •࣮֬ •ʮ֬ೝͷ Rails.application.eager_load! ๨Εͨʂʯͱ͔ͳ͍ •ʮrubocop -a ๨Εͨʂʯͱ͔ͳ͍

Slide 15

Slide 15 text

εΫϦϓτͰ΍Δͱ •ؾ͍͍࣋ͪ •Ruby ͷΑ͞ •୯७࡞ۀ͸ͭ·Βͳ͍ɾ͖͋Δɾूதྗɾࠜؾ͕ඞཁ •࢓ࣄͷ߹ؒʹؾ߹͍Ͱ΍͍ͬͯΔͷͰΤλΔ •ؾ͍͍࣋ͪͱΤλΒͳ͍ʂ

Slide 16

Slide 16 text

εΫϦϓτͰ΍Δͱ •໰୊ͷ੾Γ෼͚ํ͕ҟͳΔ •ख࡞ۀ࣌ɿʮਓ͕ؒཧղ͢Δҙຯͷ୯Ґʯ •Θ͕ͨ͠࡞ۀͨ͠ͷ͸໊લۭؒ୯Ґ •εΫϦϓτ࣌ɿʮઃఆͨ͠৚݅୯Ґʯ •দా͞Μ͕࠷ॳʹઃఆͨ͠৚݅͸ʮ͔ΒͬΆͳίϯτϩʔϥʯ •ҙຯ͝ͱʹద༻΋Ͱ͖Δ͕ʮશ෦౗͢ʯͱ͍͏࡞ઓͰ΍ͬͨํָ͕

Slide 17

Slide 17 text

΍ͬͯΈΑ͏

Slide 18

Slide 18 text

DBTF •ActiveSupport::Concern ͷ included ϒϩοΫͷ࢖༻ΛݮΒ͍ͨ͠

Slide 19

Slide 19 text

DBTF •ActiveSupport::Concern ͷ included ϒϩοΫͷ࢖༻ΛݮΒ͍ͨ͠ module EnergeticGreeting extend ActiveSupport::Concern included do def hi p '٩(ˊᗜˋ*)و' end end end class GreetingA include EnergeticGreeting end GreetingA.new.hi # => "٩(ˊᗜˋ*)و" •include ͞Εͨ࣌ʹ ϒϩοΫ಺ͷίʔυ͕࣮ߦ͞ΕΔ

Slide 20

Slide 20 text

•Ϟδϡʔϧ͕ include ͞ΕΔ౓ʹ࣮ߦ͞ΕΔ •ϞδϡʔϧͷΠϯελϯεม਺ʹϒϩοΫΛ࣋ͪଓ͚Δ •ਅͷϝιουఆٛʹؾΛ഑Δඞཁ͕͋Δ •ϦϑΝΫλϦϯάʹ༨ܭͳίετ͕͔͔Δ includedϒϩοΫ ͨ·ʹ࢖͏ʹ͸ ΂ΜΓͩΑ

Slide 21

Slide 21 text

module DepressedGreeting def hi p 'ʢ◞‸◟ʣ' end end class GreetingB include DepressedGreeting end GreetingB.new.hi # => “ʢ◞‸◟ʣ” includedϒϩοΫ •Πϯελϯεϝιου͸ Module#includeͰੜ΍ͤΔ

Slide 22

Slide 22 text

module EnergeticGreeting extend ActiveSupport::Concern included do def hi p '٩(ˊᗜˋ*)و' end end end class GreetingA def hi p 'hi' end include EnergeticGreeting end GreetingA.new.hi # => "٩(ˊᗜˋ*)و" module DepressedGreeting def hi p 'ʢ◞‸◟ʣ' end end class GreetingB def hi p 'hi' end include DepressedGreeting end GreetingB.new.hi # => "hi" ʮਅͷϝιουఆٛʯ

Slide 23

Slide 23 text

module EnergeticGreeting extend ActiveSupport::Concern included do def hi p '٩(ˊᗜˋ*)و' end end end class GreetingA def hi p 'hi' end include EnergeticGreeting end GreetingA.new.hi # => "٩(ˊᗜˋ*)و" ʮਅͷϝιουఆٛʯ module EnergeticGreeting extend ActiveSupport::Concern included do def hi p '٩(ˊᗜˋ*)و' end end end class GreetingA2 include EnergeticGreeting def hi p 'hi' end end GreetingA2.new.hi # => "hi"

Slide 24

Slide 24 text

•Module#include •Ϋϥεͷܧঝؔ܎ͷؒʹϞδϡʔϧ͕ૠೖ͞ΕΔ •ͨͩͷΦʔϓϯΫϥεͳͷͰݺͼग़͠ݩ͕༏ઌ •ActiveSupport::Concern •ࠇຐज़Λར༻ •هड़͕ޙͷํ͕༏ઌ Ή͔͍ͣ͠Ͷ͐ ʮਅͷϝιουఆٛʯ

Slide 25

Slide 25 text

module EnergeticGreeting extend ActiveSupport::Concern included do def hi p '٩(ˊᗜˋ*)و' end end end class GreetingA def hi p 'hi' end include EnergeticGreeting end GreetingA.new.hi # => "٩(ˊᗜˋ*)و" ʮਅͷϝιουఆٛʯ module EnergeticGreeting extend ActiveSupport::Concern included do def hi p '٩(ˊᗜˋ*)و' end end end class GreetingA2 include EnergeticGreeting def hi p 'hi' end end GreetingA2.new.hi # => "hi"

Slide 26

Slide 26 text

•Ϟδϡʔϧ͕ include ͞ΕΔ౓ʹ࣮ߦ͞ΕΔ •ϞδϡʔϧͷΠϯελϯεม਺ʹϒϩοΫΛ࣋ͪଓ͚Δ •ਅͷϝιουఆٛʹؾΛ഑Δඞཁ͕͋Δ •ϦϑΝΫλϦϯάʹ༨ܭͳίετ͕͔͔Δ includedϒϩοΫ ࡟আΛࢼΈͨ PullRequest ΋͕͋ͬͨ ਅͷϝιουఆٛ໰୊͕ݪҼͰClose

Slide 27

Slide 27 text

Ϟδϡʔϧ಺ͷϝιου͕࠶ఆٛ͞Ε͍ͯͳ͚Ε͹ included ϒϩοΫΛ֎͍͍ͯ͠ͱݴ͑ΔͷͰ͸

Slide 28

Slide 28 text

εΫϦϓτσϏϡʔ

Slide 29

Slide 29 text

•খ࢝͘͞Ίͨ •͜ͷ࣌ͷର৅ϑΝΠϧ͸11ϑΝΠϧ •ϨϏϡʔ͕༰қ •εΫϦϓτ΋ description ʹష͓ͬͯ͘ •ϨϏϡʔͷҰॿʹͳΔ͔΋ •ϑΟʔυόοΫ͕͋ͬͯษڧʹͳͬͨΓ͢Δ εΫϦϓτσϏϡʔ

Slide 30

Slide 30 text

•`ʢόοΫΫΥʔτʣ •ίϚϯυͱ࣮ͯ͠ߦ͞Εɺͦͷඪ४ग़ྗ͕จࣈྻͱͯ͠༩͑ΒΕΔ •͜ͷதͷจࣈྻ͸μϒϧΫΥʔτͱಉ༷ͷղऍͱࣜల։͕ߦΘΕΔ ΂ΜΓͳಓ۩ͨͪ Ϧςϥϧ 3VCZϦϑΝϨϯεϚχϡΞϧ  IUUQTEPDTSVCZMBOHPSHKBEPDTQFDqJUFSBMIUNMDPNNBOE files = `git grep -l "included" -- 'app/controllers'` `git commit -m 'Inline #{namespace}::#{module_name}'`

Slide 31

Slide 31 text

•git grep •git ؅ཧԼͷϑΝΠϧΛ grep •ਖ਼نදݱͱ͔σΟϨΫτϦࢦఆ(include/exclude)ͱ͔ ͍ΖΜͳΦϓγϣϯ͕͋ͬͯ΂ΜΓ ΂ΜΓͳಓ۩ͨͪ files = `git grep -l "included" -- 'app/controllers'`

Slide 32

Slide 32 text

•File.read •ϑΝΠϧಡΈࠐΈ •ϑΝΠϧύε͕Θ͔Ε͹ಡΈࠐΜͰจࣈྻͱͯ͠ॲཧͰ͖Δ ΂ΜΓͳಓ۩ͨͪ src = File.read File.expand_path(filename) *0SFBE 3VCZϦϑΝϨϯεϚχϡΞϧ  IUUQTEPDTSVCZMBOHPSHKBNFUIPE*0JSFBEIUNM

Slide 33

Slide 33 text

•String#scan •Ϩγʔόʹର͠ਖ਼نදݱΛ܁Γฦ͠Ϛον͠ɺ෦෼จࣈྻͷ഑ྻΛฦ͢ •Ϛονάϧʔϓ΋΂ΜΓͦ͏ ΂ΜΓͳಓ۩ͨͪ 4USJOHTDBO 3VCZϦϑΝϨϯεϚχϡΞϧ  IUUQTEPDTSVCZMBOHPSHKBNFUIPE4USJOHJTDBOIUNM methods = src.scan(/def (.*)$/).flatten

Slide 34

Slide 34 text

•sed •จࣈྻΛஔ׵ͨ͠Γ࡟আͨ͠ΓςΩετॲཧͷͰ͖ΔίϚϯυ •ϫϯϥΠφʔͰಛʹ΂ΜΓ ΂ΜΓͳಓ۩ͨͪ TFEίϚϯυcίϚϯυͷ࢖͍ํ -JOVY cIZESPDVMͷϝϞ IUUQTIZESPDVMHJUIVCJPXJLJDPNNBOETTFEIUNM `sed -i '' '#{line}d' #{filename}`

Slide 35

Slide 35 text

DBTF •1Օॴ͔Β͔͠ݺ͹Ε͍ͯͳ͍ϞδϡʔϧΛ࡟আͯ͠ΠϯϥΠϯʹ͍ͨ͠

Slide 36

Slide 36 text

DBTF •1Օॴ͔Β͔͠ݺ͹Ε͍ͯͳ͍ϞδϡʔϧΛ࡟আͯ͠ΠϯϥΠϯʹ͍ͨ͠ •FatίϯτϩʔϥରࡦʢͨͿΜʣͰϝιουΛϞδϡʔϧʹ੾Γग़͍ͯ͠Δ •ίʔυ͕௥͍ͮΒ͍ •ϦϑΝΫλϦϯά࣌ʹϞδϡʔϧશ෦֬ೝ͢Δඞཁ͕͋ͬͯίετ

Slide 37

Slide 37 text

DBTF

Slide 38

Slide 38 text

•String#remove! •จࣈྻ΍ਖ਼نදݱΛड͚औΓɺϚονͨ͠จࣈྻΛ܁Γฦ͠࡟আ͢Δ •ࡶʹ࢖͑Δॻ͖৺஍͕ͱͯ΋͖͢ ΂ΜΓͳಓ۩ͨͪ SFNPWF 4USJOH "1*EPDL IUUQTBQJEPDLDPNSBJMTW4USJOHSFNPWF target_src.remove!( /module .*#{module_name}$/, /^\s*extend ActiveSupport::Concern/, /^\s*included do/ )

Slide 39

Slide 39 text

•String#sub! •จࣈྻ΍ਖ਼نදݱΛड͚औΓɺϚονͨ͠࠷ॳͷจࣈྻΛஔ׵͢Δ •ϑΝΠϧ A ͷ಺༰ΛϑΝΠϧ B ʹ࣋ͬͯ͘Δ࣌ʹ΂ΜΓ ΂ΜΓͳಓ۩ͨͪ 4USJOHTVC 3VCZϦϑΝϨϯεϚχϡΞϧ  IUUQTEPDTSVCZMBOHPSHKBNFUIPE4USJOHJTVCIUNM src.sub!(/^\s*include #{module_name}$/, target_src)

Slide 40

Slide 40 text

•String#[] •ୈҰҾ਺ʹਖ਼نදݱɺୈೋҾ਺ʹintegerΛऔͬͯ ୈೋҾ਺൪໨ͷׅހʹϚον͢Δ࠷ॳͷ෦෼จࣈྻΛฦ͢ ΂ΜΓͳಓ۩ͨͪ 4USJOH<> 3VCZϦϑΝϨϯεϚχϡΞϧ  IUUQTEPDTSVCZMBOHPSHKBNFUIPE4USJOHJCEIUNM namespace = src[/class (.*?)Controller/, 1]

Slide 41

Slide 41 text

DBTF •RailsͷϞσϧͷΠϯελϯεϝιουͷ͏ͪ ಛఆͷจࣈྻΛؚΉϞσϧͱϝιουΛྻڍ͍ͨ͠

Slide 42

Slide 42 text

DBTF

Slide 43

Slide 43 text

•rails runner •Rails ͷจ຺Ͱ Ruby ίʔυΛ࣮ߦͰ͖Δ •Rails ʹฉ͘ͱ͍Ζ͍Ζڭ͑ͯ͘ΕΔ ΂ΜΓͳಓ۩ͨͪ 3BJMTͷίϚϯυϥΠϯπʔϧ3BJMTΨΠυ IUUQTSBJMTHVJEFTKQDPNNBOE@MJOFIUNMSBJMTSVOOFS rails runner script.rb

Slide 44

Slide 44 text

•Object#methods, Module#instance_methods •Ϩγʔό͕͍࣋ͬͯΔϝιου / ΠϯελϯεϝιουΛҰ๬͢Δ ΂ΜΓͳಓ۩ͨͪ 0CKFDUNFUIPET 3VCZϦϑΝϨϯεϚχϡΞϧ  IUUQTEPDTSVCZMBOHPSHKBNFUIPE0CKFDUJNFUIPETIUNM .PEVMFJOTUBODF@NFUIPET 3VCZϦϑΝϨϯεϚχϡΞϧ  IUUQTEPDTSVCZMBOHPSHKBNFUIPE.PEVMFJJOTUBODF@NFUIPETIUNM klass.instance_methods.select { |method| method.to_s.start_with? ‘awesome' }

Slide 45

Slide 45 text

•Method#source_location •ϝιου͕ ruby Ͱఆٛ͞Ε͍ͯΔ৔߹ίʔυͷϑΝΠϧ໊ͱߦ൪߸Λฦ͢ •ϝιου͕ C Ͱఆٛ͞Ε͍ͯΔ৔߹ nil Λฦ͢ •e.g. ϓϩμΫγϣϯίʔυͰఆٛ͞Εͨಛఆͷ໊લͷϝιουΛநग़͢Δ ΂ΜΓͳಓ۩ͨͪ .FUIPETPVSDF@MPDBUJPO 3VCZϦϑΝϨϯεϚχϡΞϧ  IUUQTEPDTSVCZMBOHPSHKBNFUIPE.FUIPEJTPVSDF@MPDBUJPOIUNM if klass.instance_method(:awesome).source_location.first.include? "my_app"

Slide 46

Slide 46 text

•Method#source •ruby Ͱॻ͔ΕͨϝιουͷίʔυΛऔಘ͢Δ •display ΛݺͿͱਓؒʹ༏͘͠ग़ྗ͢Δ ΂ΜΓͳಓ۩ͨͪ NFUIPE@TPVSDFNFUIPE@TPVSDFSCBUWuCBOJTUFSNFUIPE@TPVSDF IUUQTHJUIVCDPNCBOJTUFSNFUIPE@TPVSDFCMPCWMJCNFUIPE@TPVSDFSC-- if klass.instance_method(method).source =~ /\bhi\b/

Slide 47

Slide 47 text

·ͱΊ •εΫϦϓτ͸΂ΜΓ •.rb ϑΝΠϧ΋ͨͩͷจࣈྻ •Ruby ΍ Rails ͸͍ΖΜͳ͜ͱΛ஌͍ͬͯΔ •;ͩΜ࢖͍ͬͯΔϝιου΋ݟํΛม͑Δͱੈք͕޿͕Δ

Slide 48

Slide 48 text

·ͱΊ ୀ۶ͳ͜ͱ͸ Ruby ʹ͓ئ͍ͯ͠ ͓΋͠Ζ͍͜ͱΛ΍Ζ͏

Slide 49

Slide 49 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠