Slide 1

Slide 1 text

͓͍͠Έ͖͞!DPF@ .BS "QQMBVE)FS88$5PLZP3BJMT(JSMT5PLZP 4FFNZl"$)*&7&.&/5z

Slide 2

Slide 2 text

ࣗݾ঺հ ͓͍͠Έ͖͞!DPF@ ɾ8FCϓϩάϥϚྺ൒೥ͷ։ൃॳ৺ऀ ɾגࣜձࣾΩϟλϧʹͯ ɹࢠڙ޲͚ӳޠֶश؅ཧγεςϜ$BUBMMPHͷ ɹ։ൃΛ୲౰ ɾઌ݄։࠵ͷ3BJMT(JSMT5PLZPʹ ɹίʔνͱͯ͠ࢀՃͤͯ͞௖͖·ͨ͠

Slide 3

Slide 3 text

ࠓճͷςʔϚʜ 8PNBO8IP$PEF5PLZPͱ3BJMT(JSMTͰҰॹʹΠϕϯτΛ։࠵͍ͨ͠· ͢ʂ8PNBO8IP$PEFͰ͸"QQMBVE)FSͱ͍͏ɺʮ৽ٕ͘͠ज़৬ʹब ͍ͨʯʮঢਐͨ͠ʯʮΧϯϑΝϨϯεͰొஃͨ͠ʯʮ৽͍͠ϓϩάϥϛ ϯάݴޠΛֶशͨ͠ʯ౳ɺୡ੒ͨ͜͠ͱΛڞ༗ͯ͠শ͑߹͏Π ϕϯτΛߦ͍ͬͯ·͢ɻࠓճ͸8PNBO8IP$PEFɺ3BJMT(JSMTͷͦΕ ͧΕ͔Βܭਓͷঁੑ͕ొஃ͠·͢ɻ ࢀর"QQMBVE)FS&WFOUGFBUVSJOHXJUI3BJMT(JSMT5PLZP

Slide 4

Slide 4 text

ࠓճͷςʔϚʜ ୡ੒

Slide 5

Slide 5 text

8FCϓϩάϥϚྺ൒೥ ·ͩԿ΋ ୡ੒͍ͯ͠ͳ͍ؾ͕͢Δʜ

Slide 6

Slide 6 text

Θ͕ͨ͠ୡ੒͍ͨ͜͠ͱ ٕज़-5

Slide 7

Slide 7 text

ͳͥʁ ʮܦݧ͸ઙ͘ͱ΋ɺ ɹɹҰਓͷϓϩάϥϚͱͯ͠ ɹɹٕज़ͷ͓࿩͕͍ͨ͠ʯ

Slide 8

Slide 8 text

ͱ͍͏͜ͱͰࠓ͔Β "QQMBVE)FSͰٕज़-5Λ͢Δ ʜΛୡ੒͍ͨ͠ͱࢥ͍·͢

Slide 9

Slide 9 text

3VCZPO3BJMTͷ ιʔείʔυΛಡΜͰΈΔ ͓࿩ ͲΜͳ͓࿩ʁ

Slide 10

Slide 10 text

3VCZPO3BJMT 3VCZPO3BJMTʢϧϏʔΦϯϨΠϧζʣ͸ɺΦʔϓϯιʔεͷ8FCΞϓ ϦέʔγϣϯϑϨʔϜϫʔΫͰ͋Δɻ3P3·ͨ͸୯ʹ3BJMTͱݺ͹Ε Δɻͦͷ໊ʹ΋ࣔ͞Ε͍ͯΔΑ͏ʹ3VCZͰॻ͔Ε͍ͯΔɻ·ͨ.PEFM 7JFX$POUSPMMFSʢ.7$ʣΞʔΩςΫνϟʹج͍ͮͯߏங͞Ε͍ͯΔɻ ࢀরϑϦʔඦՊࣄయʰ΢ΟΩϖσΟΞʢ8JLJQFEJBʣʱ

Slide 11

Slide 11 text

3VCZPO3BJMT Ҿ༻ɿ%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF .7$

Slide 12

Slide 12 text

ͳͥʁ ᶃ3BJMTΞϓϦͰ։ൃ͍ͯ͠Δͱɺ ɹ಺෦࣮૷Λ஌Γ͍ͨॠ͕ؒ͋Δ ɹۤखҙࣝΛແ͓͖͍ͯͨ͘͠ ᶄ3VCZͱ3BJMTେ޷͖ ɹ޷͖ͳ΋ͷͷ͜ͱ͸΋ͬͱ஌Γ͍ͨ

Slide 13

Slide 13 text

ͲͷΑ͏ʹʁ 5XJUUFS͔Βը૾Λ͓आΓ͠·ͨ͠ Ͳ͏΍ͬͯ 3BJMTͷιʔείʔυΛ ಡΊ͹ྑ͍Ͱ͠ΐ͏͔ʁ ࠷৽ͷ3BJMTΑΓ΋ 3BJMͷίʔυΛಡΉͷ͕ ͓͢͢ΊͰ͢ 3BJMTίϛολʔͷদా໌͞Μʹ࣭໰ͯ͠Έ·ͨ͠

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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 ίϯύΫτʂʂ

Slide 16

Slide 16 text

ͩΕ͕ʁ Θͨ͠ͷϨϕϧײ ɹ ᶃϓϩάϥϛϯάྺ೥ϲ݄ ɹ ᶄීஈͷۀ຿Ͱ͸3BJMTΞϓϦͷ ɹ؆୯ͳػೳ௥Ճ΍վमΛ୲౰ ɹྫʣ"1*Λ࡞ͬͨΓ ɹɹɹ'PSN0CKFDUΛಋೖͨ͠Γ ɹ ᶅʮΦϒδΣΫτࢦ޲ઃܭ࣮ફΨΠυʯ ɹͬ͘͟Γׂ͘Β͍ͷཧղ

Slide 17

Slide 17 text

͋Β͔͡Ί΍͓͍ͬͯͨ͜ͱ ᶃ؆୯ͳHFNΛࣗ࡞ͯ͠ΈΔ ɹ‎HFNͷߏ଄ɺ࡞ΓํΛͬ͘͟Γ௫Ή ɹ ᶄখ͞ΊͷHFNͷιʔείʔυΛಡΜͰΈΔ ɹ‎ίʔυϦʔσΟϯάͷྲྀΕɺงғؾΛ௫Ή ɹ ᶅʮϝλϓϩάϥϛϯά3VCZʯΛͬ͘͟ΓಡΉ ɹ‎Ϋϥεͷߏ଄ಈతσΟεύονͱ͸FUD ɹɹϝλϓϩάϥϛϯάͰ ɹɹͲΜͳ͜ͱ͕Ͱ͖Δͷ͔ΛֶͿ ɹɹʢཧղ͕௥͍͍͍ͭͯ·ͤΜʜʣ

Slide 18

Slide 18 text

ૣ଎΍ͬͯΈ·ͨ͠

Slide 19

Slide 19 text

ࠓճ͸ͪ͜ΒΛௐ΂·͢ 3BJMTΞϓϦͷ 8FCϖʔδ΁ΞΫηεͨ͠ͱ͖ʹ ը໘͕දࣔ͞ΕΔ࢓૊Έ

Slide 20

Slide 20 text

3VCZPO3BJMT Ҿ༻ɿ%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF ͜ͷลΓ͕ొ৔͠·͢ ‑

Slide 21

Slide 21 text

3VCZPO3BJMT Ҿ༻ɿ%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF ͜ͷลΓ͕ొ৔͠·͢ ‑

Slide 22

Slide 22 text

஫ҙ⚠ ᶃͨ͘͞Μ༻ҙ͞Ε͍ͯΔํ๏ͷ͏ͪͷҰͭͱ ɹೝ͍͚ࣝͯͨͩ͠Δͱ޾͍Ͱ͢ɻ ᶄ͔ͳΓ؆ུԽ͍ͯ͠·͢ɻ ᶅݱࡏͷ3BJMTͰ͸࢖༻͞Ε͍ͯͳ͍ ɹٕज़ͷ͓࿩ؚ͕·Ε·͢ɻ ᶆ͝ࢦఠɾΞυόΠεେ׻ܴͰ͢ʂʂ

Slide 23

Slide 23 text

͸͡Ίʹ ᶃ3BJMTͷιʔείʔυΛ(JU)VC͔ΒDMPOF ᶄDESBJMT ᶅλάΛWʹ੾Γସ͑Δ ɹHJUDIFDLPVUSFGTUBHTW ᶆૣ଎ಡΜͰΈΔ

Slide 24

Slide 24 text

ը໘Λඳը‎7JFX 'SPN%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF

Slide 25

Slide 25 text

WJFXΛදࣔ‎SFOEFSϝιουʁ

Slide 26

Slide 26 text

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ͱ͍͏໊લ͕͍͍ͭͯΔϑΝΠϧΛݟͯΈΔ

Slide 27

Slide 27 text

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ϝιου

Slide 28

Slide 28 text

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Λݺͼग़͍ͯ͠Δ ‑

Slide 29

Slide 29 text

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Λݺͼग़͍ͯ͠Δ ‑

Slide 30

Slide 30 text

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Λݺͼग़͍ͯ͠Δ ‑

Slide 31

Slide 31 text

SFOEFS@UFNQMBUFϝιουҎ߱ BDUJPOQBDLMJCBDUJPO@WJFXCBTFSC module ActionView # … class Base # … def render_template(…) # Ҿ਺Ͱ༩͑ΒΕͨ৚݅ʹΑͬͯ෼ذ͍ͯ͠Δ # ࠷ऴతʹcompile_and_render_templateͱ͍͏ϝιουΛݺͼग़͍ͯ͠Δ end end ɹ ɹ ɹ ‏ઌ΄Ͳͱಉ͡ϑΝΠϧ ‏SFOEFS@UFNQMBUFϝιου

Slide 32

Slide 32 text

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ϝιου

Slide 33

Slide 33 text

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ϝιου

Slide 34

Slide 34 text

࠷ॳͷ SFOEFSϝιου͸ Ͳ͔͜Βݺ͹Ε͍ͯΔʁ

Slide 35

Slide 35 text

SFOEFSϝιου͸Ͳ͔͜Βݺ͹Ε͍ͯΔʁ ɾಉ͡"DUJPO7JFX#BTFΫϥεͷதͰ͸ ɹݺͼग़͞Ε͍ͯͳ͔ͬͨ ɾ͜Ε͸ΠϯελϯεϝιουͳͷͰɺ ɹͲ͔͜Ͱ"DUJPO7JFX#BTFΫϥεͷΠϯελϯεʹରͯ͠ ɹݺͼग़͞Ε͍ͯΔ͸ͣ ɹ ‎ͱ͍͏͜ͱ͸ɺ ɹͲ͔͜Ͱ"DUJPO7JFX#BTFΫϥεͷ ɹΠϯελϯε͕ ɹੜ੒͞Ε͍ͯΔ͸ͣ

Slide 36

Slide 36 text

'SPN%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF Կ͔Λൃݟ

Slide 37

Slide 37 text

Կ͔Λൃݟ 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ͱ͍͏ϑΝΠϧͷத

Slide 38

Slide 38 text

Կ͔Λൃݟ 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ͱ͍͏ϑΝΠϧͷத

Slide 39

Slide 39 text

Կ͔Λൃݟ 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ϝιου͸ ɹͲ͔͜Βݺ͹Ε͍ͯΔʁ ‏

Slide 40

Slide 40 text

TFMGDMBTTWJFX@DMBTTϝιου͸Ͳ͔͜Βݺ͹Ε͍ͯΔʁ BDUJPOQBDLMJCBDUJPO@DPOUSPMMFSCBTFSC module ActionController # … class Base # … private def initialize_template_class(response) # … response.template = self.class.view_class.new(…) # … end # … end end ɹ ɹ ɹ ɹ ɹ ɹ ɹ ‏ઌ΄Ͳͱಉ͡ϑΝΠϧ

Slide 41

Slide 41 text

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ϝιουΛݺͼग़ͤΔΑ͏ʹͳΔ ‏ઌ΄Ͳͱಉ͡ϑΝΠϧ

Slide 42

Slide 42 text

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ϝιουΛݺͿ

Slide 43

Slide 43 text

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ϝιου͸Ͳ͔͜Βʢུʣ ‏

Slide 44

Slide 44 text

ϝιουΛḪΔཱྀ ɾ"DUJPO$POUSPMMFS#BTFJOJUJBMJ[F@UFNQMBUF@DMBTT ‎"DUJPO$POUSPMMFS#BTFΫϥεͷQSPDFTTͱ͍͏ ɹɹϝιου͔Βݺͼग़͞Ε͍ͯΔ ‑ /05'06/%⛔ ɾ%JTQBUDI4FSWMFUTFSWJDF ‑

Slide 45

Slide 45 text

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ΫϥεʹؔΘΔૢ࡞͕͋Δ͸ͣ

Slide 46

Slide 46 text

SFDPHOJ[FϝιουͷதΛݟʹߦ͖·͢ 'SPN%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF

Slide 47

Slide 47 text

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͕ఆٛ͞Ε͍ͯΔϑΝΠϧ

Slide 48

Slide 48 text

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[F͸SFDPHOJ[FͷΤΠϦΞε SFDPHOJ[FϝιουͷதΛݟʹߦ͖·͢ ‏SPVUJOH͕ఆٛ͞Ε͍ͯΔϑΝΠϧ

Slide 49

Slide 49 text

ͭ·Γ͜͏ SBJMUJFTMJCEJTQBUDIFSSC class Dispatcher class << self def dispatch(…) # … ActionController::Routing::Routes.recognize!(request) .process(request, response) .out(output) #… end end end ɹ ɹ ɹ ɹ ɹ ɹ ‏QSPDFTTϝιου͕ݟ͔ͭͬͨϑΝΠϧ

Slide 50

Slide 50 text

ͭ·Γ͜͏ 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ϝιου͕ݟ͔ͭͬͨϑΝΠϧ

Slide 51

Slide 51 text

ͭ·Γ͜͏ 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[F‎63-ͱ$POUSPMMFSΛੜ੒ ᶄQSPDFTT‎ΞΫγϣϯ ͲΜͳૢ࡞Λߦ͏͔ ͷੜ੒ͱݺͼग़͠ ‏QSPDFTTϝιου͕ݟ͔ͭͬͨϑΝΠϧ

Slide 52

Slide 52 text

ͭ·Γ͜͏ 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[F‎63-ͱ$POUSPMMFSΛੜ੒ ᶄQSPDFTT‎ΞΫγϣϯ ͲΜͳૢ࡞Λߦ͏͔ ͷੜ੒ͱݺͼग़͠ ‏QSPDFTTϝιου͕ݟ͔ͭͬͨϑΝΠϧ ‎EJTQBUDIϝιου͸Ͳ͔͜Βݺ͹Ε͍ͯΔʁ ‏

Slide 53

Slide 53 text

ϝιουΛḪΔཱྀɺ;ͨͨͼ ɾ%JTQBUDIFSEJTQBUDI ‎%JTQBUDI4FSWMFUΫϥε SBJMUJFTMJCXFCSJDL@TFSWFSSC ͷ ɹɹIBOEMF@EJTQBUDIͱ͍͏Πϯελϯεϝιου /05'06/%⛔ ‑ ɾ%JTQBUDI4FSWMFUIBOEMF@EJTQBUDI ‎ಉ͡%JTQBUDI4FSWMFUΫϥεͷ ɹɹTFSWJDFͱ͍͏Πϯελϯεϝιου ‑ ɾ%JTQBUDI4FSWMFUTFSWJDF ‑

Slide 54

Slide 54 text

TFSWJDFϝιου͸Ͳ͔͜Βݺ͹Ε͍ͯΔʁ Ϋϥε໊ %JTQBUDI4FSWMFU ͰHSFQͯ͠Έ·ͨ͠ ‐͋΍͍͠Կ͔Λൃݟ $ grep -r ‘DispatchServlet’ ./* ※rails σΟϨΫτϦ௚Լ … ./railties/lib/webrick_server.rb: server.mount(‘/’, DispatchServlet, option) ※վߦ͍ͯ͠·͢ %JTQBUDI4FSWMFUΫϥε͕ݺ͹Ε͍ͯΔ SBJMUJFTMJCXFCSJDL@TFSWFSSCΛݟʹ͍͖·͢

Slide 55

Slide 55 text

SBJMUJFTMJCXFCSJDL@TFSWFSSC 'SPN%*7&*/50$0%&%*7& IUUQTEJWFSEJWFJOUPDPEFKQXFC@UFYUTEJWF

Slide 56

Slide 56 text

8SJDL͕ొ৔ SBJMUJFTMJCXFCSJDL@TFSWFSSC class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet # … def self.dispatch(…) # … server = WEBrick::HTTPServer.new(…) server.mount(‘/’, DispatchServlet, options) # … end end end ɹ ɹ ɹ %JTQBUDI4FSWMFUΫϥε ʜ8SJDL)5514FSWMFU"CTUSBDU4FSWMFUΛܧঝͨ͠Ϋϥε

Slide 57

Slide 57 text

8SJDL͕ొ৔ SBJMUJFTMJCXFCSJDL@TFSWFSSC class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet # … def self.dispatch(…) # … server = WEBrick::HTTPServer.new(…) server.mount(‘/’, DispatchServlet, options) # … end end end ɹ ɹ ɹ ‐8SJDLͱ͸ʁ)551αʔόʔϑϨʔϜϫʔΫ ɹ֎෦ϥΠϒϥϦ͔ΒαʔόʔͷػೳΛܧঝ͍ͯ͠Δ ‑8SJDLΠϯελϯεΛੜ੒ %JTQBUDI4FSWMFUΫϥε ʜ8SJDL)5514FSWMFU"CTUSBDU4FSWMFUΛܧঝͨ͠Ϋϥε

Slide 58

Slide 58 text

8SJDL͕ొ৔ SBJMUJFTMJCXFCSJDL@TFSWFSSC class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet # … def self.dispatch(…) # … server = WEBrick::HTTPServer.new(…) server.mount(‘/’, DispatchServlet, options) # … end end end ɹ ɹ ɹ ‐8SJDLͱ͸ʁ)551αʔόʔϑϨʔϜϫʔΫ ɹ֎෦ϥΠϒϥϦ͔ΒαʔόʔͷػೳΛܧঝ͍ͯ͠Δ ‑8SJDLΠϯελϯεΛੜ੒ ‏8SJDLΠϯελϯε͕ ɹNPVOUϝιουΛݺͼग़͠ %JTQBUDI4FSWMFUΫϥε ʜ8SJDL)5514FSWMFU"CTUSBDU4FSWMFUΛܧঝͨ͠Ϋϥε

Slide 59

Slide 59 text

8SJDL͕ొ৔ SBJMUJFTMJCXFCSJDL@TFSWFSSC class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet # … def self.dispatch(…) # … server = WEBrick::HTTPServer.new(…) server.mount(‘/’, DispatchServlet, options) # … end end end ɹ ɹ ɹ ‐8SJDLͱ͸ʁ)551αʔόʔϑϨʔϜϫʔΫ ɹ֎෦ϥΠϒϥϦ͔ΒαʔόʔͷػೳΛܧঝ͍ͯ͠Δ ‑8SJDLΠϯελϯεΛੜ੒ ‏8SJDLΠϯελϯε͕ ɹNPVOUϝιουΛݺͼग़͠ %JTQBUDI4FSWMFUΫϥε ʜ8SJDL)5514FSWMFU"CTUSBDU4FSWMFUΛܧঝͨ͠Ϋϥε ‎NPVOUϝιουʁʁʁ

Slide 60

Slide 60 text

8SJDLͷ࢖͍ํΛ֬ೝͯ͠ΈΔʜ Ҿ༻ɿ3VCZϦϑΝϨϯεϚχϡΞϧ IUUQTEPDTSVCZMBOHPSHKBMBUFTUMJCSBSZXFCSJDLIUNM

Slide 61

Slide 61 text

8SJDLͷ࢖͍ํΛ֬ೝͯ͠ΈΔʜ Ҿ༻ɿ3VCZϦϑΝϨϯεϚχϡΞϧ IUUQTEPDTSVCZMBOHPSHKBMBUFTUMJCSBSZXFCSJDLIUNM ίʔυྫɿ ղઆɿ

Slide 62

Slide 62 text

8SJDLͷ࢖͍ํΛ֬ೝͯ͠ΈΔʜ Ҿ༻ɿ3VCZϦϑΝϨϯεϚχϡΞϧ IUUQTEPDTSVCZMBOHPSHKBMBUFTUMJCSBSZXFCSJDLIUNM ίʔυྫɿ ղઆɿ ‑ઌ΄Ͳͷίʔυͱ΄΅ಉ͡ ᶃ63-ͱ8SJDLΛܧঝͨ͠Ϋϥε͕ඥ෇͚ΒΕΔ ᶄ63-ʹΞΫηε͕͋Δͨͼɺαʔόʔͷ৘ใΛݩʹΫϥεͷΠϯελϯεΛੜ੒ ᶅΠϯελϯε͕TFSWJDFϝιουΛݺͿ ᶆΠϯελϯε͕αʔόʔͷ৘ใΛݩʹॲཧΛ࣮ߦ

Slide 63

Slide 63 text

8SJDLͷ࢖͍ํΛ֬ೝͯ͠ΈΔʜ ໰୊ͷՕॴɿ ᶅΠϯελϯε͕TFSWJDFϝιουΛݺͿ

Slide 64

Slide 64 text

ͭ·Γʜ ᶃ8SJDLαʔόʔ͕ ɹ%JTQBUDI4FSWMFUΫϥεͱඥ෇͚ΒΕΔ ᶄ63-ʹରͯ͠ΞΫηε͕ൃੜ͢Δͱɺ ɹ%JTQBUDI4FSWMFUΫϥεͷΠϯελϯε͕ ɹੜ੒͞ΕΔ ᶅᶄͷΠϯελϯε͕ ɹ%JTQBUDI4FSWMFUΫϥεͰఆٛ͞Ε͍ͯΔ ɹTFSWJDFϝιουΛݺͿ ɹ‎͜ͷޙͷҰ࿈ͷྲྀΕʹͭͳ͕Δ

Slide 65

Slide 65 text

࠷ޙͷٙ໰ SBJMUJFTMJCXFCSJDL@TFSWFSSC class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet # … def self.dispatch(…) # … server = Webrick::HTTPServer.new(…) server.mount(‘/’, DispatchServlet, options) # … end end end ɹ ɹ ɹ ɹ ɹ ɹ ɹ ‏ઌ΄ͲͷϑΝΠϧ EJTQBUDIϝιου͸ Ͳ͔͜Βݺ͹ΕΔʁ ‏

Slide 66

Slide 66 text

࠷ޙͷٙ໰ 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ͷίϚϯυ͕ఆٛ͞Ε͍ͯΔσΟϨΫτϦͷத

Slide 67

Slide 67 text

࠷ޙͷٙ໰ 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ͷίϚϯυ͕ఆٛ͞Ε͍ͯΔσΟϨΫτϦͷத

Slide 68

Slide 68 text

࠷ޙͷٙ໰ 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ͷίϚϯυ͕ఆٛ͞Ε͍ͯΔσΟϨΫτϦͷத ‑ݟ֮͑ͷ͋Δهड़

Slide 69

Slide 69 text

࠷ޙͷٙ໰ 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 ‑ݟ֮͑ͷ͋Δهड़

Slide 70

Slide 70 text

࠷ޙͷٙ໰ 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͕ࣗಈతʹ࣮ߦ͞ΕΔ ‑ݟ֮͑ͷ͋Δهड़

Slide 71

Slide 71 text

࠷ޙͷٙ໰ 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͕ࣗಈతʹ࣮ߦ͞ΕΔ ‑ݟ֮͑ͷ͋Δهड़

Slide 72

Slide 72 text

͓ർΕ༷Ͱͨ͠

Slide 73

Slide 73 text

ײ૝ ೉͍͠

Slide 74

Slide 74 text

ײ૝ Ͱ΋ ָ͍͠

Slide 75

Slide 75 text

ࠓճͷ੒Ռ ᶃίʔυϦʔσΟϯάͷྲྀΕΛ௫Μͩ ɹɾ֬ೝ͍ͨ͠ಈ࡞͔ΒϝιουΛ্Լʹḷ͍ͬͯ͘ ɹɾҰߦҰߦஸೡʹಡΉͷͰ͸ͳ͘ɺ ɹɹ·ͣ͸ͬ͘͟ΓͱશମͷྲྀΕΛ௫Ή ɹɾϝλϓϩάϥϛϯά΁ͷ଄ܮ͕૬౰ٻΊΒΕΔ ɹ ᶄιʔείʔυΛಡΉ͜ͱ΁ͷ఍߅ײ͕ݮͬͨɹɹ ɹ ᶅ3BJMTͷଚ͕͞Θ͔ͬͨ

Slide 76

Slide 76 text

ࠓޙͷ՝୊ ᶃࠓճಡΊͳ͔ͬͨϞσϧपΓͷॲཧΛಡΉ ɹ ᶄ΋ͬͱܰྔͳϑϨʔϜϫʔΫͷ ɹιʔείʔυΛࣸܦͯ͠ΈΔ ɹʢ8FCΞϓϦέʔγϣϯΛ ɹɹ࣮ݱ͢Δ࢓૊ΈΛཧղ͢Δʣ ɹ ᶅʮϝλϓϩάϥϛϯά3VCZʯΛ͔ͬ͠Γ΍Δ

Slide 77

Slide 77 text

ͱ͍͏͜ͱͰ "QQMBVE)FSͰٕज़-5Λ͢Δ ୡ੒Ͱ͖·ͨ͠

Slide 78

Slide 78 text

օ͞Μͷୡ੒ͨ͜͠ͱ΋ ͥͻฉ͔͍ͤͯͩ͘͞,

Slide 79

Slide 79 text

4QFDJBM5IBOLT ࠓճͷൃදͷ͖͔͚ͬͱखॿ͚Λͩͬͨ͘͞ํʑ ɹ ɹɹদా໌͞Μ ɹɹେ૔խ࢙͞Μ ɹɹͶ͜͞Μ "TBLVTBSC ɹɹ5BNBSC ɹ ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ---

Slide 80

Slide 80 text

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