Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ApplaudHerJp.pdf
Search
Misaki Shioi(塩井美咲/しおい)
March 09, 2019
Programming
930
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ApplaudHerJp.pdf
Misaki Shioi(塩井美咲/しおい)
March 09, 2019
More Decks by Misaki Shioi(塩井美咲/しおい)
See All by Misaki Shioi(塩井美咲/しおい)
The Less-Told Story of Socket Timeouts
coe401_
3
3.1k
Making TCPSocket.new "Happy"!
coe401_
1
9.5k
たのしいSocketのしくみ / Socket Under a Microscope
coe401_
10
3.2k
XPE2-bookclub Explained
coe401_
0
220
Some more adventure of Happy Eyeballs
coe401_
2
500
Introduction of Happy Eyeballs Version 2 (RFC8305) to the Socket library
coe401_
1
560
An adventure of Happy Eyeballs
coe401_
3
13k
Implementing "++" operator, stepping into parse.y
coe401_
4
14k
たのしいRubyの構文解析ツアー
coe401_
7
4.8k
Other Decks in Programming
See All in Programming
えっ!!コードを読まずに開発を!?
hananouchi
0
200
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
210
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
160
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
370
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
200
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
140
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
Performance Engineering for Everyone
elenatanasoiu
0
270
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
120
1B+ /day規模のログを管理する技術
broadleaf
0
140
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
440
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
1
690
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5.1k
Leo the Paperboy
mayatellez
8
1.9k
RailsConf 2023
tenderlove
30
1.5k
It's Worth the Effort
3n
188
29k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
650
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Rails Girls Zürich Keynote
gr2m
96
14k
Navigating Team Friction
lara
192
16k
How to Ace a Technical Interview
jacobian
281
24k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
370
Practical Orchestrator
shlominoach
191
11k
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 ɹ ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ---
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ