Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ApplaudHerJp.pdf
Search
Misaki Shioi(塩井美咲/しおい)
March 09, 2019
Programming
940
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(塩井美咲/しおい)
時うどん〜Socket.getifaddrsで学ぶネットワーク編 / Tokiudon: The Socket.getifaddrs Edition
coe401_
4
300
The Less-Told Story of Socket Timeouts
coe401_
3
3.9k
Making TCPSocket.new "Happy"!
coe401_
1
10k
たのしいSocketのしくみ / Socket Under a Microscope
coe401_
10
3.3k
XPE2-bookclub Explained
coe401_
0
390
Some more adventure of Happy Eyeballs
coe401_
2
530
Introduction of Happy Eyeballs Version 2 (RFC8305) to the Socket library
coe401_
1
590
An adventure of Happy Eyeballs
coe401_
3
14k
Implementing "++" operator, stepping into parse.y
coe401_
4
15k
Other Decks in Programming
See All in Programming
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.1k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
480
ジョジョの世界をXRで再現する
mofurune
0
140
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
7.8k
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
320
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2k
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
140
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.9k
Kubernetes祭り #2 OP/ED
bells17
0
100
SREの越境 / SRE Collaboration
y0hgi
2
300
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.4k
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
300
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Making Projects Easy
brettharned
120
6.8k
How to make the Groovebox
asonas
2
2.5k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
[SF Ruby Conf 2025] Rails X
palkan
3
1.4k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
390
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
66k
Evolving SEO for Evolving Search Engines
ryanjones
0
310
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 ɹ ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ---
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ