Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
ApplaudHerJp.pdf
Misaki Shioi(塩井美咲/しおい)
March 09, 2019
Programming
2
400
ApplaudHerJp.pdf
Misaki Shioi(塩井美咲/しおい)
March 09, 2019
Tweet
Share
More Decks by Misaki Shioi(塩井美咲/しおい)
See All by Misaki Shioi(塩井美咲/しおい)
coe401_
1
76
coe401_
6
1.4k
coe401_
5
3.6k
coe401_
14
7k
coe401_
8
460
Other Decks in Programming
See All in Programming
sullis
0
120
line_developers_tw2
0
810
akatsukinewgrad
0
220
line_developers_tw
0
540
akatsukinewgrad
0
210
yokaze
0
430
aratayokoyama
0
230
fuga0618
1
150
ufoo68
1
180
taoshotaro
1
370
standfm
1
280
steipete
PRO
2
170
Featured
See All Featured
trallard
13
650
jonrohan
1021
380k
samanthasiow
56
6.3k
holman
448
130k
ddemaree
274
31k
imathis
478
150k
carmenhchung
26
1.3k
gr2m
83
11k
pauljervisheath
196
15k
jlugia
216
16k
kneath
294
39k
smashingmag
283
47k
Transcript
͓͍͠Έ͖͞!DPF@ .BS "QQMBVE)FS88$5PLZP 3BJMT(JSMT5PLZP 4FFNZl"$)*&7&.&/5z
ࣗݾհ ͓͍͠Έ͖͞!DPF@ ɾ8FCϓϩάϥϚྺͷ։ൃॳ৺ऀ ɾגࣜձࣾΩϟλϧʹͯ ɹࢠڙ͚ӳޠֶशཧγεςϜ$BUBMMPHͷ ɹ։ൃΛ୲ ɾઌ݄։࠵ͷ3BJMT(JSMT5PLZPʹ ɹίʔνͱͯ͠ࢀՃ͖ͤͯ͞·ͨ͠
ࠓճͷςʔϚʜ 8PNBO8IP$PEF5PLZPͱ3BJMT(JSMTͰҰॹʹΠϕϯτΛ։࠵͍ͨ͠· ͢ʂ8PNBO8IP$PEFͰ"QQMBVE)FSͱ͍͏ɺʮ৽ٕ͘͠ज़৬ʹब ͍ͨʯʮঢਐͨ͠ʯʮΧϯϑΝϨϯεͰొஃͨ͠ʯʮ৽͍͠ϓϩάϥϛ ϯάݴޠΛֶशͨ͠ʯɺୡͨ͜͠ͱΛڞ༗ͯ͠শ͑߹͏Π ϕϯτΛߦ͍ͬͯ·͢ɻࠓճ8PNBO8IP$PEFɺ3BJMT(JSMTͷͦΕ ͧΕ͔Βܭਓͷঁੑ͕ొஃ͠·͢ɻ ࢀর"QQMBVE)FS&WFOUGFBUVSJOHXJUI3BJMT(JSMT5PLZP
ࠓճͷςʔϚʜ ୡ
8FCϓϩάϥϚྺ ·ͩԿ ୡ͍ͯ͠ͳ͍ؾ͕͢Δʜ
Θ͕ͨ͠ୡ͍ͨ͜͠ͱ ٕज़-5
ͳͥʁ ʮܦݧઙ͘ͱɺ ɹɹҰਓͷϓϩάϥϚͱͯ͠ ɹɹٕज़ͷ͓͕͍ͨ͠ʯ
ͱ͍͏͜ͱͰࠓ͔Β "QQMBVE)FSͰٕज़-5Λ͢Δ ʜΛୡ͍ͨ͠ͱࢥ͍·͢
3VCZPO3BJMTͷ ιʔείʔυΛಡΜͰΈΔ ͓ ͲΜͳ͓ʁ
3VCZPO3BJMT 3VCZPO3BJMTʢϧϏʔΦϯϨΠϧζʣɺΦʔϓϯιʔεͷ8FCΞϓ ϦέʔγϣϯϑϨʔϜϫʔΫͰ͋Δɻ3P3·ͨ୯ʹ3BJMTͱݺΕ Δɻͦͷ໊ʹࣔ͞Ε͍ͯΔΑ͏ʹ3VCZͰॻ͔Ε͍ͯΔɻ·ͨ.PEFM 7JFX$POUSPMMFSʢ.7$ʣΞʔΩςΫνϟʹج͍ͮͯߏங͞Ε͍ͯΔɻ ࢀরϑϦʔඦՊࣄయʰΟΩϖσΟΞʢ8JLJQFEJBʣʱ
3VCZPO3BJMT Ҿ༻ɿ%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF .7$
ͳͥʁ ᶃ3BJMTΞϓϦͰ։ൃ͍ͯ͠Δͱɺ ɹ෦࣮ΛΓ͍ͨॠ͕ؒ͋Δ ɹۤखҙࣝΛແ͓͖͍ͯͨ͘͠ ᶄ3VCZͱ3BJMTେ͖ ɹ͖ͳͷͷ͜ͱͬͱΓ͍ͨ
ͲͷΑ͏ʹʁ 5XJUUFS͔Βը૾Λ͓आΓ͠·ͨ͠ Ͳ͏ͬͯ 3BJMTͷιʔείʔυΛ ಡΊྑ͍Ͱ͠ΐ͏͔ʁ ࠷৽ͷ3BJMTΑΓ 3BJMͷίʔυΛಡΉͷ͕ ͓͢͢ΊͰ͢ 3BJMTίϛολʔͷদా໌͞Μʹ࣭ͯ͠Έ·ͨ͠
3BJMTͱ 3BJMTEJSFDUPSJFT pMFT MT BDUJPONBJMFS BDUJWFSFDPSE QVTIHFNTSC BDUJPOQBDL
BDUJWFTVQQPSU SBJMUJFT BDUJPOXFCTFSWJDF DMFBOMPHTTI SFMFBTFSC 3BJMTEJSFDUPSJFT pMFT ࠷৽ίϛοτ ˞ͦͷ··Ͱಈ͖·ͤΜ MT #SFXpMF 3&"%.&NE BDUJWFKPC QBDLBHFKTPO $0%&@0'@$0/%6$5NE3&-&"4*/(@3"*-4NE BDUJWFNPEFM SBJMTHFNTQFD $0/53*#65*/(NE 3BLFpMF BDUJWFSFDPSE SBJMUJFT (FNpMF BDUJPODBCMF BDUJWFTUPSBHF UBTLT (FNpMFMPDL BDUJPONBJMFS BDUJWFTVQQPSU UPPMT .*5-*$&/4& BDUJPOQBDL DJ WFSTJPOSC 3"*-4@7&34*0/ BDUJPOWJFX HVJEFT
3BJMTͱ 3BJMTEJSFDUPSJFT pMFT MT BDUJPONBJMFS BDUJWFSFDPSE QVTIHFNTSC BDUJPOQBDL
BDUJWFTVQQPSU SBJMUJFT BDUJPOXFCTFSWJDF DMFBOMPHTTI SFMFBTFSC 3BJMTEJSFDUPSJFT pMFT ࠷৽ίϛοτ ˞ͦͷ··Ͱಈ͖·ͤΜ MT #SFXpMF 3&"%.&NE BDUJWFKPC QBDLBHFKTPO $0%&@0'@$0/%6$5NE3&-&"4*/(@3"*-4NE BDUJWFNPEFM SBJMTHFNTQFD $0/53*#65*/(NE 3BLFpMF BDUJWFSFDPSE SBJMUJFT (FNpMF BDUJPODBCMF BDUJWFTUPSBHF UBTLT (FNpMFMPDL BDUJPONBJMFS BDUJWFTVQQPSU UPPMT .*5-*$&/4& BDUJPOQBDL DJ WFSTJPOSC 3"*-4@7&34*0/ BDUJPOWJFX HVJEFT ίϯύΫτʂʂ
ͩΕ͕ʁ Θͨ͠ͷϨϕϧײ ɹ ᶃϓϩάϥϛϯάྺϲ݄ ɹ ᶄීஈͷۀͰ3BJMTΞϓϦͷ ɹ؆୯ͳػೳՃվमΛ୲ ɹྫʣ"1*Λ࡞ͬͨΓ ɹɹɹ'PSN0CKFDUΛಋೖͨ͠Γ ɹ
ᶅʮΦϒδΣΫτࢦઃܭ࣮ફΨΠυʯ ɹͬ͘͟Γׂ͘Β͍ͷཧղ
͋Β͔͡Ί͓͍ͬͯͨ͜ͱ ᶃ؆୯ͳHFNΛࣗ࡞ͯ͠ΈΔ ɹHFNͷߏɺ࡞ΓํΛͬ͘͟Γ௫Ή ɹ ᶄখ͞ΊͷHFNͷιʔείʔυΛಡΜͰΈΔ ɹίʔυϦʔσΟϯάͷྲྀΕɺงғؾΛ௫Ή ɹ ᶅʮϝλϓϩάϥϛϯά3VCZʯΛͬ͘͟ΓಡΉ ɹΫϥεͷߏಈతσΟεύονͱFUD ɹɹϝλϓϩάϥϛϯάͰ
ɹɹͲΜͳ͜ͱ͕Ͱ͖Δͷ͔ΛֶͿ ɹɹʢཧղ͕͍͍͍ͭͯ·ͤΜʜʣ
ૣͬͯΈ·ͨ͠
ࠓճͪ͜ΒΛௐ·͢ 3BJMTΞϓϦͷ 8FCϖʔδΞΫηεͨ͠ͱ͖ʹ ը໘͕දࣔ͞ΕΔΈ
3VCZPO3BJMT Ҿ༻ɿ%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF ͜ͷลΓ͕ొ͠·͢ ‑
3VCZPO3BJMT Ҿ༻ɿ%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF ͜ͷลΓ͕ొ͠·͢ ‑
ҙ⚠ ᶃͨ͘͞Μ༻ҙ͞Ε͍ͯΔํ๏ͷ͏ͪͷҰͭͱ ɹೝ͍͚ࣝͯͨͩ͠Δͱ͍Ͱ͢ɻ ᶄ͔ͳΓ؆ུԽ͍ͯ͠·͢ɻ ᶅݱࡏͷ3BJMTͰ༻͞Ε͍ͯͳ͍ ɹٕज़ͷؚ͓͕·Ε·͢ɻ ᶆ͝ࢦఠɾΞυόΠεେܴͰ͢ʂʂ
͡Ίʹ ᶃ3BJMTͷιʔείʔυΛ(JU)VC͔ΒDMPOF ᶄDESBJMT ᶅλάΛWʹΓସ͑Δ ɹHJUDIFDLPVUSFGTUBHTW ᶆૣಡΜͰΈΔ
ը໘Λඳը7JFX 'SPN%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF
WJFXΛදࣔSFOEFSϝιουʁ
WJFXΛදࣔSFOEFSϝιουʁ BDUJPOQBDLMJCBDUJPO@WJFXCBTFSC module ActionView # … class Base # …
def render(options = {}, old_local_assigns = {}) if options.is_a?(String) render_file(options, true, old_local_assigns) elsif options.is_a?(Hash) # optionsͷkeyʹԠͯ͡ذ # ذઌ render_file render_partial_collection render_partial render_template ɹɹɹͷ͍ͣΕ͔ͷϝιουΛݺͼग़͍ͯ͠Δ end end end end WJFXͱ͍͏໊લ͕͍͍ͭͯΔϑΝΠϧΛݟͯΈΔ
WJFXΛදࣔSFOEFSϝιουʁ BDUJPOQBDLMJCBDUJPO@WJFXCBTFSC module ActionView # … class Base # …
def render(options = {}, old_local_assigns = {}) if options.is_a?(String) render_file(options, true, old_local_assigns) elsif options.is_a?(Hash) # optionsͷkeyʹԠͯ͡ذ # ذઌ render_file render_partial_collection render_partial render_template ɹɹɹͷ͍ͣΕ͔ͷϝιουΛݺͼग़͍ͯ͠Δ end end end end WJFXͱ͍͏໊લ͕͍͍ͭͯΔϑΝΠϧΛݟͯΈΔ SFOEFSϝιου
WJFXΛදࣔSFOEFSϝιουʁ BDUJPOQBDLMJCBDUJPO@WJFXCBTFSC module ActionView # … class Base # …
def render(options = {}, old_local_assigns = {}) if options.is_a?(String) render_file(options, true, old_local_assigns) elsif options.is_a?(Hash) # optionsͷkeyʹԠͯ͡ذ # ذઌ render_file render_partial_collection render_partial render_template ɹɹɹͷ͍ͣΕ͔ͷϝιουΛݺͼग़͍ͯ͠Δ end end end end WJFXͱ͍͏໊લ͕͍͍ͭͯΔϑΝΠϧΛݟͯΈΔ SFOEFSϝιου ‐ ࠷ऴతʹSFOEFS@UFNQMBUFΛݺͼग़͍ͯ͠Δ ‑
WJFXΛදࣔSFOEFSϝιουʁ BDUJPOQBDLMJCBDUJPO@WJFXCBTFSC module ActionView # … class Base # …
def render(options = {}, old_local_assigns = {}) if options.is_a?(String) render_file(options, true, old_local_assigns) elsif options.is_a?(Hash) # optionsͷkeyʹԠͯ͡ذ # ذઌ render_file render_partial_collection render_partial render_template ɹɹɹͷ͍ͣΕ͔ͷϝιουΛݺͼग़͍ͯ͠Δ end end end end ͪΐͬͱಛघͳͷͰআ֎ WJFXͱ͍͏໊લ͕͍͍ͭͯΔϑΝΠϧΛݟͯΈΔ SFOEFSϝιου ‐ ࠷ऴతʹSFOEFS@UFNQMBUFΛݺͼग़͍ͯ͠Δ ‑
WJFXΛදࣔSFOEFSϝιουʁ BDUJPOQBDLMJCBDUJPO@WJFXCBTFSC module ActionView # … class Base # …
def render(options = {}, old_local_assigns = {}) if options.is_a?(String) render_file(options, true, old_local_assigns) elsif options.is_a?(Hash) # optionsͷkeyʹԠͯ͡ذ # ذઌ render_file render_partial_collection render_partial render_template ɹɹɹͷ͍ͣΕ͔ͷϝιουΛݺͼग़͍ͯ͠Δ end end end end ͪΐͬͱಛघͳͷͰআ֎ ͜ͷϝιουͷதʁ WJFXͱ͍͏໊લ͕͍͍ͭͯΔϑΝΠϧΛݟͯΈΔ SFOEFSϝιου ‐ ࠷ऴతʹSFOEFS@UFNQMBUFΛݺͼग़͍ͯ͠Δ ‑
SFOEFS@UFNQMBUFϝιουҎ߱ BDUJPOQBDLMJCBDUJPO@WJFXCBTFSC module ActionView # … class Base # …
def render_template(…) # ҾͰ༩͑ΒΕͨ݅ʹΑͬͯذ͍ͯ͠Δ # ࠷ऴతʹcompile_and_render_templateͱ͍͏ϝιουΛݺͼग़͍ͯ͠Δ end end ɹ ɹ ɹ ઌ΄Ͳͱಉ͡ϑΝΠϧ SFOEFS@UFNQMBUFϝιου
SFOEFS@UFNQMBUFϝιουҎ߱ BDUJPOQBDLMJCBDUJPO@WJFXCBTFSC module ActionView # … class Base # …
def render_template(…) # ҾͰ༩͑ΒΕͨ݅ʹΑͬͯذ͍ͯ͠Δ # ࠷ऴతʹcompile_and_render_templateͱ͍͏ϝιουΛݺͼग़͍ͯ͠Δ end end ɹ ɹ ɹ ɹ def compile_and_render_template(…) # viewʹදࣔ͢ΔͨΊͷςϯϓϨʔτΛ࡞ end # viewͷϑΝΠϧύεͱදࣔ͢ΔςϯϓϨʔτΛࢦఆ ઌ΄Ͳͱಉ͡ϑΝΠϧ SFOEFS@UFNQMBUFϝιου
SFOEFS@UFNQMBUFϝιουҎ߱ BDUJPOQBDLMJCBDUJPO@WJFXCBTFSC module ActionView # … class Base # …
def render_template(…) # ҾͰ༩͑ΒΕͨ݅ʹΑͬͯذ͍ͯ͠Δ # ࠷ऴతʹcompile_and_render_templateͱ͍͏ϝιουΛݺͼग़͍ͯ͠Δ end end ɹ ɹ ɹ ɹ def compile_and_render_template(…) # viewʹදࣔ͢ΔͨΊͷςϯϓϨʔτΛ࡞ end # viewͷϑΝΠϧύεͱදࣔ͢ΔςϯϓϨʔτΛࢦఆ SFOEFS͕ݺΕΔ SFOEFS@UFNQMBUF͕ݺΕΔ DPNQJMF@BOE@SFOEFS@UFNQMBUF͕ݺΕΔ ը໘ඳը͕ྃʂ ઌ΄Ͳͱಉ͡ϑΝΠϧ SFOEFS@UFNQMBUFϝιου
࠷ॳͷ SFOEFSϝιου Ͳ͔͜ΒݺΕ͍ͯΔʁ
SFOEFSϝιουͲ͔͜ΒݺΕ͍ͯΔʁ ɾಉ͡"DUJPO7JFX#BTFΫϥεͷதͰ ɹݺͼग़͞Ε͍ͯͳ͔ͬͨ ɾ͜ΕΠϯελϯεϝιουͳͷͰɺ ɹͲ͔͜Ͱ"DUJPO7JFX#BTFΫϥεͷΠϯελϯεʹରͯ͠ ɹݺͼग़͞Ε͍ͯΔͣ ɹ ͱ͍͏͜ͱɺ ɹͲ͔͜Ͱ"DUJPO7JFX#BTFΫϥεͷ ɹΠϯελϯε͕
ɹੜ͞Ε͍ͯΔͣ
'SPN%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF Կ͔Λൃݟ
Կ͔Λൃݟ BDUJPOQBDLMJCBDUJPO@DPOUSPMMFSCBTFSC module ActionController # … class Base # …
private def self.view_class unless @view_class @view_class = Class.new(ActionView::Base) @view_class.send(:include, master_helper_module) end @view_class end # … end end ɹ ɹ ɹ ɹ ɹɹ BDUJPO@DPOUSPMMFSͱ͍͏ϑΝΠϧͷத
Կ͔Λൃݟ BDUJPOQBDLMJCBDUJPO@DPOUSPMMFSCBTFSC module ActionController # … class Base # …
private def self.view_class unless @view_class @view_class = Class.new(ActionView::Base) @view_class.send(:include, master_helper_module) end @view_class end # … end end ɹ ɹ ɹ ɹ ɹ ɹ"DUJPO7JFX#BTFΫϥεΛܧঝ͢Δ ແ໊ΫϥεΛੜ BDUJPO@DPOUSPMMFSͱ͍͏ϑΝΠϧͷத
Կ͔Λൃݟ BDUJPOQBDLMJCBDUJPO@DPOUSPMMFSCBTFSC module ActionController # … class Base # …
private def self.view_class unless @view_class @view_class = Class.new(ActionView::Base) @view_class.send(:include, master_helper_module) end @view_class end # … end end ɹ ɹ ɹ ɹ ɹ ɹ"DUJPO7JFX#BTFΫϥεΛܧঝ͢Δ ແ໊ΫϥεΛੜ BDUJPO@DPOUSPMMFSͱ͍͏ϑΝΠϧͷத TFMGWJFX@DMBTTϝιου ɹͲ͔͜ΒݺΕ͍ͯΔʁ
TFMGDMBTTWJFX@DMBTTϝιουͲ͔͜ΒݺΕ͍ͯΔʁ BDUJPOQBDLMJCBDUJPO@DPOUSPMMFSCBTFSC module ActionController # … class Base # …
private def initialize_template_class(response) # … response.template = self.class.view_class.new(…) # … end # … end end ɹ ɹ ɹ ɹ ɹ ɹ ɹ ઌ΄Ͳͱಉ͡ϑΝΠϧ
TFMGDMBTTWJFX@DMBTTϝιουͲ͔͜ΒݺΕ͍ͯΔʁ BDUJPOQBDLMJCBDUJPO@DPOUSPMMFSCBTFSC module ActionController # … class Base # …
private def initialize_template_class(response) # … response.template = self.class.view_class.new(…) # … end # … end end ɹ ɹ ɹ ɹ ɹ ɹ ɹ ˞͜͜Ͱ"DUJPO7JFX#BTFΫϥεΛܧঝ͢Δແ໊ΫϥεͷΠϯελϯεΛੜ "DUJPO7JFX#BTFSFOEFSϝιουΛݺͼग़ͤΔΑ͏ʹͳΔ ઌ΄Ͳͱಉ͡ϑΝΠϧ
TFMGDMBTTWJFX@DMBTTϝιουͲ͔͜ΒݺΕ͍ͯΔʁ BDUJPOQBDLMJCBDUJPO@DPOUSPMMFSCBTFSC module ActionController # … class Base # …
private def initialize_template_class(response) # … response.template = self.class.view_class.new(…) # … end # … end end ɹ ɹ ɹ ɹ ɹ ɹ ɹ ˞͜͜Ͱ"DUJPO7JFX#BTFΫϥεΛܧঝ͢Δແ໊ΫϥεͷΠϯελϯεΛੜ "DUJPO7JFX#BTFSFOEFSϝιουΛݺͼग़ͤΔΑ͏ʹͳΔ ઌ΄Ͳͱಉ͡ϑΝΠϧ ͜ͷޙͷॲཧͷྲྀΕʜ ɹᶃಉ͡"DUJPO$POUSPMMFS#BTFΫϥεͷதʹ ɹɹSFOEFS ಉ໊ ͱ͍͏ϝιου͕ఆٛ͞Ε͍ͯΔ ɹᶄSFOEFSϝιουͷதͰɺ ɹɹ"DUJPO7JFX#BTFSFOEFSϝιουΛݺͿ
TFMGDMBTTWJFX@DMBTTϝιουͲ͔͜ΒݺΕ͍ͯΔʁ BDUJPOQBDLMJCBDUJPO@DPOUSPMMFSCBTFSC module ActionController # … class Base # …
private def initialize_template_class(response) # … response.template = self.class.view_class.new(…) # … end # … end end ɹ ɹ ɹ ɹ ɹ ɹ ɹ ˞͜͜Ͱ"DUJPO7JFX#BTFΫϥεΛܧঝ͢Δແ໊ΫϥεͷΠϯελϯεΛੜ "DUJPO7JFX#BTFSFOEFSϝιουΛݺͼग़ͤΔΑ͏ʹͳΔ ઌ΄Ͳͱಉ͡ϑΝΠϧ ͜ͷޙͷॲཧͷྲྀΕʜ ɹᶃಉ͡"DUJPO$POUSPMMFS#BTFΫϥεͷதʹ ɹɹSFOEFS ಉ໊ ͱ͍͏ϝιου͕ఆٛ͞Ε͍ͯΔ ɹᶄSFOEFSϝιουͷதͰɺ ɹɹ"DUJPO7JFX#BTFSFOEFSϝιουΛݺͿ JOJUJBMJ[F@UFNQMBUF@DMBTTϝιουͲ͔͜Βʢུʣ
ϝιουΛḪΔཱྀ ɾ"DUJPO$POUSPMMFS#BTFJOJUJBMJ[F@UFNQMBUF@DMBTT "DUJPO$POUSPMMFS#BTFΫϥεͷQSPDFTTͱ͍͏ ɹɹϝιου͔Βݺͼग़͞Ε͍ͯΔ ‑ /05'06/%⛔ ɾ%JTQBUDI4FSWMFUTFSWJDF ‑
QSPDFTTϝιουͲ͔͜ΒݺΕ͍ͯΔʁ ϝιου໊ QSPDFTT ͰHSFQͯ͠Έ·ͨ͠ $ grep -r ‘process(request, response)’ ./*
※rails σΟϨΫτϦԼ … ./railties/lib/dispatcher.rb: ActionController::Routing::Routes.recognize!(request) .process(request, response) .out(output) … ※վߦ͍ͯ͠·͢ ‐͍͋͠Կ͔Λൃݟ QSPDFTT͕ݺͼग़͞Ε͍ͯΔલͷSFDPHOJ[FϝιουͷதͰ "DUJPO$POUSPMMFS#BTFΫϥεʹؔΘΔૢ࡞͕͋Δͣ
SFDPHOJ[FϝιουͷதΛݟʹߦ͖·͢ 'SPN%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF
BDUJPOQBDLMJCBDUJPO@DPOUSPMMFSSPVUJOHSC module ActionController module Routing class RouteSet # … def
recognize(request) string_path = request.path # … path = string_path.split ‘/’ # … hash = recognize_path(path) # … controller = hash[‘controller’] # … controller.new end alias :recognize! :recognize end end ɹ ɹ SFDPHOJ[FϝιουͷதΛݟʹߦ͖·͢ SPVUJOH͕ఆٛ͞Ε͍ͯΔϑΝΠϧ
BDUJPOQBDLMJCBDUJPO@DPOUSPMMFSSPVUJOHSC module ActionController module Routing class RouteSet # … def
recognize(request) string_path = request.path # … path = string_path.split ‘/’ # … hash = recognize_path(path) # … controller = hash[‘controller’] # … controller.new end alias :recognize! :recognize end end ɹ ɹ $POUSPMMFSΒ͖͠ͷ͕ΠϯελϯεԽ͞Ε͍ͯΔʂ SFDPHOJ[FSFDPHOJ[FͷΤΠϦΞε SFDPHOJ[FϝιουͷதΛݟʹߦ͖·͢ SPVUJOH͕ఆٛ͞Ε͍ͯΔϑΝΠϧ
ͭ·Γ͜͏ SBJMUJFTMJCEJTQBUDIFSSC class Dispatcher class << self def dispatch(…) #
… ActionController::Routing::Routes.recognize!(request) .process(request, response) .out(output) #… end end end ɹ ɹ ɹ ɹ ɹ ɹ QSPDFTTϝιου͕ݟ͔ͭͬͨϑΝΠϧ
ͭ·Γ͜͏ SBJMUJFTMJCEJTQBUDIFSSC class Dispatcher class << self def dispatch(…) #
… ActionController::Routing::Routes.recognize!(request) .process(request, response) .out(output) #… end end end ɹ ɹ ɹ ɹ ɹ ɹ ‐"DUJPO$POUSPMMFS#BTFͷΠϯελϯεੜ ‐"DUJPO$POUSPMMFS#BTFQSPDFTTϝιου࣮ߦ ‐ͦͷଞͷॲཧ QSPDFTTϝιου͕ݟ͔ͭͬͨϑΝΠϧ
ͭ·Γ͜͏ SBJMUJFTMJCEJTQBUDIFSSC class Dispatcher class << self def dispatch(…) #
… ActionController::Routing::Routes.recognize!(request) .process(request, response) .out(output) #… end end end ɹ ɹ ɹ ɹ ɹ ɹ ‐"DUJPO$POUSPMMFS#BTFͷΠϯελϯεੜ ‐"DUJPO$POUSPMMFS#BTFQSPDFTTϝιου࣮ߦ ‐ͦͷଞͷॲཧ ͜͜Ͱ͍ͬͯΔ͜ͱʜ ᶃSFDPHOJ[F63-ͱ$POUSPMMFSΛੜ ᶄQSPDFTTΞΫγϣϯ ͲΜͳૢ࡞Λߦ͏͔ ͷੜͱݺͼग़͠ QSPDFTTϝιου͕ݟ͔ͭͬͨϑΝΠϧ
ͭ·Γ͜͏ SBJMUJFTMJCEJTQBUDIFSSC class Dispatcher class << self def dispatch(…) #
… ActionController::Routing::Routes.recognize!(request) .process(request, response) .out(output) #… end end end ɹ ɹ ɹ ɹ ɹ ɹ ‐"DUJPO$POUSPMMFS#BTFͷΠϯελϯεੜ ‐"DUJPO$POUSPMMFS#BTFQSPDFTTϝιου࣮ߦ ‐ͦͷଞͷॲཧ ͜͜Ͱ͍ͬͯΔ͜ͱʜ ᶃSFDPHOJ[F63-ͱ$POUSPMMFSΛੜ ᶄQSPDFTTΞΫγϣϯ ͲΜͳૢ࡞Λߦ͏͔ ͷੜͱݺͼग़͠ QSPDFTTϝιου͕ݟ͔ͭͬͨϑΝΠϧ EJTQBUDIϝιουͲ͔͜ΒݺΕ͍ͯΔʁ
ϝιουΛḪΔཱྀɺ;ͨͨͼ ɾ%JTQBUDIFSEJTQBUDI %JTQBUDI4FSWMFUΫϥε SBJMUJFTMJCXFCSJDL@TFSWFSSC ͷ ɹɹIBOEMF@EJTQBUDIͱ͍͏Πϯελϯεϝιου /05'06/%⛔ ‑ ɾ%JTQBUDI4FSWMFUIBOEMF@EJTQBUDI ಉ͡%JTQBUDI4FSWMFUΫϥεͷ
ɹɹTFSWJDFͱ͍͏Πϯελϯεϝιου ‑ ɾ%JTQBUDI4FSWMFUTFSWJDF ‑
TFSWJDFϝιουͲ͔͜ΒݺΕ͍ͯΔʁ Ϋϥε໊ %JTQBUDI4FSWMFU ͰHSFQͯ͠Έ·ͨ͠ ‐͍͋͠Կ͔Λൃݟ $ grep -r ‘DispatchServlet’ ./*
※rails σΟϨΫτϦԼ … ./railties/lib/webrick_server.rb: server.mount(‘/’, DispatchServlet, option) ※վߦ͍ͯ͠·͢ %JTQBUDI4FSWMFUΫϥε͕ݺΕ͍ͯΔ SBJMUJFTMJCXFCSJDL@TFSWFSSCΛݟʹ͍͖·͢
SBJMUJFTMJCXFCSJDL@TFSWFSSC 'SPN%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF
8&#SJDL͕ొ SBJMUJFTMJCXFCSJDL@TFSWFSSC class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet # … def self.dispatch(…)
# … server = WEBrick::HTTPServer.new(…) server.mount(‘/’, DispatchServlet, options) # … end end end ɹ ɹ ɹ %JTQBUDI4FSWMFUΫϥε ʜ8&#SJDL)5514FSWMFU"CTUSBDU4FSWMFUΛܧঝͨ͠Ϋϥε
8&#SJDL͕ొ SBJMUJFTMJCXFCSJDL@TFSWFSSC class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet # … def self.dispatch(…)
# … server = WEBrick::HTTPServer.new(…) server.mount(‘/’, DispatchServlet, options) # … end end end ɹ ɹ ɹ ‐8&#SJDLͱʁ)551αʔόʔϑϨʔϜϫʔΫ ɹ֎෦ϥΠϒϥϦ͔ΒαʔόʔͷػೳΛܧঝ͍ͯ͠Δ ‑8&#SJDLΠϯελϯεΛੜ %JTQBUDI4FSWMFUΫϥε ʜ8&#SJDL)5514FSWMFU"CTUSBDU4FSWMFUΛܧঝͨ͠Ϋϥε
8&#SJDL͕ొ SBJMUJFTMJCXFCSJDL@TFSWFSSC class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet # … def self.dispatch(…)
# … server = WEBrick::HTTPServer.new(…) server.mount(‘/’, DispatchServlet, options) # … end end end ɹ ɹ ɹ ‐8&#SJDLͱʁ)551αʔόʔϑϨʔϜϫʔΫ ɹ֎෦ϥΠϒϥϦ͔ΒαʔόʔͷػೳΛܧঝ͍ͯ͠Δ ‑8&#SJDLΠϯελϯεΛੜ 8&#SJDLΠϯελϯε͕ ɹNPVOUϝιουΛݺͼग़͠ %JTQBUDI4FSWMFUΫϥε ʜ8&#SJDL)5514FSWMFU"CTUSBDU4FSWMFUΛܧঝͨ͠Ϋϥε
8&#SJDL͕ొ SBJMUJFTMJCXFCSJDL@TFSWFSSC class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet # … def self.dispatch(…)
# … server = WEBrick::HTTPServer.new(…) server.mount(‘/’, DispatchServlet, options) # … end end end ɹ ɹ ɹ ‐8&#SJDLͱʁ)551αʔόʔϑϨʔϜϫʔΫ ɹ֎෦ϥΠϒϥϦ͔ΒαʔόʔͷػೳΛܧঝ͍ͯ͠Δ ‑8&#SJDLΠϯελϯεΛੜ 8&#SJDLΠϯελϯε͕ ɹNPVOUϝιουΛݺͼग़͠ %JTQBUDI4FSWMFUΫϥε ʜ8&#SJDL)5514FSWMFU"CTUSBDU4FSWMFUΛܧঝͨ͠Ϋϥε NPVOUϝιουʁʁʁ
8&#SJDLͷ͍ํΛ֬ೝͯ͠ΈΔʜ Ҿ༻ɿ3VCZϦϑΝϨϯεϚχϡΞϧ IUUQTEPDTSVCZMBOHPSHKBMBUFTUMJCSBSZXFCSJDLIUNM
8&#SJDLͷ͍ํΛ֬ೝͯ͠ΈΔʜ Ҿ༻ɿ3VCZϦϑΝϨϯεϚχϡΞϧ IUUQTEPDTSVCZMBOHPSHKBMBUFTUMJCSBSZXFCSJDLIUNM ίʔυྫɿ ղઆɿ
8&#SJDLͷ͍ํΛ֬ೝͯ͠ΈΔʜ Ҿ༻ɿ3VCZϦϑΝϨϯεϚχϡΞϧ IUUQTEPDTSVCZMBOHPSHKBMBUFTUMJCSBSZXFCSJDLIUNM ίʔυྫɿ ղઆɿ ‑ઌ΄Ͳͷίʔυͱ΄΅ಉ͡ ᶃ63-ͱ8&#SJDLΛܧঝͨ͠Ϋϥε͕ඥ͚ΒΕΔ ᶄ63-ʹΞΫηε͕͋ΔͨͼɺαʔόʔͷใΛݩʹΫϥεͷΠϯελϯεΛੜ ᶅΠϯελϯε͕TFSWJDFϝιουΛݺͿ ᶆΠϯελϯε͕αʔόʔͷใΛݩʹॲཧΛ࣮ߦ
8&#SJDLͷ͍ํΛ֬ೝͯ͠ΈΔʜ ͷՕॴɿ ᶅΠϯελϯε͕TFSWJDFϝιουΛݺͿ
ͭ·Γʜ ᶃ8&#SJDLαʔόʔ͕ ɹ%JTQBUDI4FSWMFUΫϥεͱඥ͚ΒΕΔ ᶄ63-ʹରͯ͠ΞΫηε͕ൃੜ͢Δͱɺ ɹ%JTQBUDI4FSWMFUΫϥεͷΠϯελϯε͕ ɹੜ͞ΕΔ ᶅᶄͷΠϯελϯε͕ ɹ%JTQBUDI4FSWMFUΫϥεͰఆٛ͞Ε͍ͯΔ
ɹTFSWJDFϝιουΛݺͿ ɹ͜ͷޙͷҰ࿈ͷྲྀΕʹͭͳ͕Δ
࠷ޙͷٙ SBJMUJFTMJCXFCSJDL@TFSWFSSC class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet # … def self.dispatch(…)
# … server = Webrick::HTTPServer.new(…) server.mount(‘/’, DispatchServlet, options) # … end end end ɹ ɹ ɹ ɹ ɹ ɹ ɹ ઌ΄ͲͷϑΝΠϧ EJTQBUDIϝιου Ͳ͔͜ΒݺΕΔʁ
࠷ޙͷٙ SBJMUJFTMJCDPNNBOETXFCSJDLSC SFRVJSFbXFCSJDL` # … OPTIONS = { :port =>
3000, :ip => “0.0.0.0", # … } # … puts “=> Rails Apprication started on http://#{OPTIONS[:ip]}:#{OPTIONS[:PORT]}” puts “=> Ctrl-C to Shutdown server; call with —help for options” if OPTIONS[:server_type] == WEBrick::SimpleServer DispatchServlet.dispatch(OPTIONS) ɹ ɹ ɹ ɹ ɹ ɹ ɹ 3BJMTͷίϚϯυ͕ఆٛ͞Ε͍ͯΔσΟϨΫτϦͷத
࠷ޙͷٙ SBJMUJFTMJCDPNNBOETXFCSJDLSC SFRVJSFbXFCSJDL` # … OPTIONS = { :port =>
3000, :ip => “0.0.0.0", # … } # … puts “=> Rails Apprication started on http://#{OPTIONS[:ip]}:#{OPTIONS[:PORT]}” puts “=> Ctrl-C to Shutdown server; call with —help for options” if OPTIONS[:server_type] == WEBrick::SimpleServer DispatchServlet.dispatch(OPTIONS) ɹ ɹ ɹ ɹ ɹ ɹ ɹ 3BJMTͷίϚϯυ͕ఆٛ͞Ε͍ͯΔσΟϨΫτϦͷத
࠷ޙͷٙ SBJMUJFTMJCDPNNBOETXFCSJDLSC SFRVJSFbXFCSJDL` # … OPTIONS = { :port =>
3000, :ip => “0.0.0.0", # … } # … puts “=> Rails Apprication started on http://#{OPTIONS[:ip]}:#{OPTIONS[:PORT]}” puts “=> Ctrl-C to Shutdown server; call with —help for options” if OPTIONS[:server_type] == WEBrick::SimpleServer DispatchServlet.dispatch(OPTIONS) ɹ ɹ ɹ ɹ ɹ ɹ ɹ 3BJMTͷίϚϯυ͕ఆٛ͞Ε͍ͯΔσΟϨΫτϦͷத ‑ݟ֮͑ͷ͋Δهड़
࠷ޙͷٙ SBJMUJFTMJCDPNNBOETXFCSJDLSC SFRVJSFbXFCSJDL` # … OPTIONS = { :port =>
3000, :ip => “0.0.0.0", # … } # … puts “=> Rails Apprication started on http://#{OPTIONS[:ip]}:#{OPTIONS[:PORT]}” puts “=> Ctrl-C to Shutdown server; call with —help for options” if OPTIONS[:server_type] == WEBrick::SimpleServer DispatchServlet.dispatch(OPTIONS) ɹ ɹ ɹ ɹ ɹ ɹ ɹ 3BJMTͷίϚϯυ͕ఆٛ͞Ε͍ͯΔσΟϨΫτϦͷத ΞϓϦέʔγϣϯαʔόʔΛىಈ͢Δ SBJMTTFSWFS ‑ݟ֮͑ͷ͋Δهड़
࠷ޙͷٙ SBJMUJFTMJCDPNNBOETXFCSJDLSC SFRVJSFbXFCSJDL` # … OPTIONS = { :port =>
3000, :ip => “0.0.0.0", # … } # … puts “=> Rails Apprication started on http://#{OPTIONS[:ip]}:#{OPTIONS[:PORT]}” puts “=> Ctrl-C to Shutdown server; call with —help for options” if OPTIONS[:server_type] == WEBrick::SimpleServer DispatchServlet.dispatch(OPTIONS) ɹ ɹ ɹ ɹ ɹ ɹ ɹ 3BJMTͷίϚϯυ͕ఆٛ͞Ε͍ͯΔσΟϨΫτϦͷத ΞϓϦέʔγϣϯαʔόʔΛىಈ͢Δ SBJMTTFSWFS %JTQBUDI4FSWMFUEJTQBUDI͕ࣗಈతʹ࣮ߦ͞ΕΔ ‑ݟ֮͑ͷ͋Δهड़
࠷ޙͷٙ SBJMUJFTMJCDPNNBOETXFCSJDLSC SFRVJSFbXFCSJDL` # … OPTIONS = { :port =>
3000, :ip => “0.0.0.0", # … } # … puts “=> Rails Apprication started on http://#{OPTIONS[:ip]}:#{OPTIONS[:PORT]}” puts “=> Ctrl-C to Shutdown server; call with —help for options” if OPTIONS[:server_type] == WEBrick::SimpleServer DispatchServlet.dispatch(OPTIONS) ɹ ɹ ɹ ɹ ɹ ɹ ɹ 63-ʹΞΫηε͕ൃੜ͢Δͨͼʹ ɹը໘͕ඳը͞ΕΔ 3BJMTͷίϚϯυ͕ఆٛ͞Ε͍ͯΔσΟϨΫτϦͷத ΞϓϦέʔγϣϯαʔόʔΛىಈ͢Δ SBJMTTFSWFS %JTQBUDI4FSWMFUEJTQBUDI͕ࣗಈతʹ࣮ߦ͞ΕΔ ‑ݟ֮͑ͷ͋Δهड़
͓ർΕ༷Ͱͨ͠
ײ ͍͠
ײ Ͱ ָ͍͠
ࠓճͷՌ ᶃίʔυϦʔσΟϯάͷྲྀΕΛ௫Μͩ ɹɾ֬ೝ͍ͨ͠ಈ࡞͔ΒϝιουΛ্Լʹḷ͍ͬͯ͘ ɹɾҰߦҰߦஸೡʹಡΉͷͰͳ͘ɺ ɹɹ·ͣͬ͘͟ΓͱશମͷྲྀΕΛ௫Ή ɹɾϝλϓϩάϥϛϯάͷܮ͕૬ٻΊΒΕΔ ɹ ᶄιʔείʔυΛಡΉ͜ͱͷ߅ײ͕ݮͬͨɹɹ ɹ ᶅ3BJMTͷଚ͕͞Θ͔ͬͨ
ࠓޙͷ՝ ᶃࠓճಡΊͳ͔ͬͨϞσϧपΓͷॲཧΛಡΉ ɹ ᶄͬͱܰྔͳϑϨʔϜϫʔΫͷ ɹιʔείʔυΛࣸܦͯ͠ΈΔ ɹʢ8FCΞϓϦέʔγϣϯΛ ɹɹ࣮ݱ͢ΔΈΛཧղ͢Δʣ ɹ ᶅʮϝλϓϩάϥϛϯά3VCZʯΛ͔ͬ͠ΓΔ
ͱ͍͏͜ͱͰ "QQMBVE)FSͰٕज़-5Λ͢Δ ୡͰ͖·ͨ͠
օ͞Μͷୡͨ͜͠ͱ ͥͻฉ͔͍ͤͯͩ͘͞,
4QFDJBM5IBOLT ࠓճͷൃදͷ͖͔͚ͬͱखॿ͚Λͩͬͨ͘͞ํʑ ɹ ɹɹদా໌͞Μ ɹɹେխ࢙͞Μ ɹɹͶ͜͞Μ "TBLVTBSC ɹɹ5BNBSC ɹ ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ---
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ