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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Misaki Shioi(塩井美咲/しおい)
March 09, 2019
Programming
920
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
2.4k
Making TCPSocket.new "Happy"!
coe401_
1
9.3k
たのしいSocketのしくみ / Socket Under a Microscope
coe401_
10
3.2k
XPE2-bookclub Explained
coe401_
0
220
Some more adventure of Happy Eyeballs
coe401_
2
490
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
プロパティの順序で型推論が壊れる!? TypeScript6.0の修正からContext-Sensitivityの仕組みを追う
bicstone
2
1.3k
CSC307 Lecture 17
javiergs
PRO
0
310
Webフレームワークの ベンチマークについて
yusukebe
0
130
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
340
AutonomyとControlのあいだ:Graflowで記述するAIエージェント協調
myui
0
110
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
2.4k
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.7k
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
440
TypeSpec で繋ぐ複数プロダクトの型安全
maroon8021
1
380
Featured
See All Featured
It's Worth the Effort
3n
188
29k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Chasing Engaging Ingredients in Design
codingconduct
0
210
Automating Front-end Workflow
addyosmani
1370
210k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
360
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Unsuck your backbone
ammeep
672
58k
The World Runs on Bad Software
bkeepers
PRO
72
12k
My Coaching Mixtape
mlcsv
0
140
Embracing the Ebb and Flow
colly
88
5.1k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
160
Color Theory Basics | Prateek | Gurzu
gurzu
0
350
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 ɹ ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ---
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ