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
PHP-FIGのHTTP処理標準の設計はなぜPSR-7/15/17になったのか
Search
Hisateru Tanaka
December 15, 2018
Technology
5.3k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHP-FIGのHTTP処理標準の設計はなぜPSR-7/15/17になったのか
PHPカンファレンス2018 発表資料です
Hisateru Tanaka
December 15, 2018
More Decks by Hisateru Tanaka
See All by Hisateru Tanaka
どうなる Remix 3
tanakahisateru
2
570
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
2
300
哲学史とモデリング
tanakahisateru
4
1.1k
オブジェクト指向宗教史
tanakahisateru
32
18k
ほげ言語にあってPHPにない機能
tanakahisateru
6
4.1k
君たちはどうプログラミングするか
tanakahisateru
16
3.3k
デバッグ用ロガーの注入どうする?
tanakahisateru
2
740
アンドキュメンテッド ちょうぜつソフトウェア 設計入門 「オブジェクト指向に定義はない」のか?
tanakahisateru
25
10k
ちょうぜつ改め21世紀ふつうのソフトウェア設計
tanakahisateru
14
8.8k
Other Decks in Technology
See All in Technology
「とりあえず動く」の先へ。 AI時代のチーム開発と内部設計/2026-slsdays
slsops
0
140
Incremental HTTP
kazuho
5
2k
IR Today: Theory, Practice, and Agents
dtunkelang
0
340
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
270
ai_cording_with_k8s_knowledge.pdf
mochizuki875
1
260
おそらく日本で唯一のDevRelインターン生として
husengs7
0
170
[2026 Oracle Technical Deep Dive] OCI AI Resilience -OCIのセキュリティ対策機能をきちんと使いこなす- (2026年9月17日開催)
oracle4engineer
PRO
0
120
インバスケット試験対策アプリを 作って見えたAIエージェント構築 ナレッジ2選
shichijoyuhi
1
120
Apache Iceberg が拓く AI 時代のオープンレイクハウス
tomtanaka
0
220
Futexes the good, the bad, the ugly
ennael
PRO
0
110
検証フェーズはAIの回答を判断するための学習機会
toru_kubota
2
490
今こそ知りたいAmplifyGen2
mkdev10
2
140
Featured
See All Featured
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
390
How to Talk to Developers About Accessibility
jct
2
560
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
760
Why Our Code Smells
bkeepers
PRO
340
58k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
BBQ
matthewcrist
89
10k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
490
The untapped power of vector embeddings
frankvandijk
2
1.9k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
320
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
350
Unsuck your backbone
ammeep
672
58k
Transcript
1)1'*(ͷ)551 ॲཧඪ४ͷઃܭ ͳͥ143 ʹͳͬͨͷ͔
ͨͳ͔ͻͯ͞Δ @tanakahisateru ॴ
IUUQTTQFBLFSEFDLDPNUBOBLBIJTBUFSVXFIBWFQTS ڈͷ࠙ձͰ͜Μͳ͜ͱͬͯ ͔ͬ͢Γ143ຊΤόϯδΣϦετͰ͢ ·͡Ͱ࠷ۙதͷਓʹόϨͨ
͝ҙ w ;FOE&YQSFTTJWFͷ͍ํΓ·ͤΜ w 143ͷ)551ϝοηʔδϯάͷઃܭΛ௨ͯ͡ w ઃܭͷΤοηϯεΛֶͼऔΔ͜ͱΛతͱ͠·͢
ΠϯλʔϑΣʔεͷఆٛͳΜܾͯΊͷͰ͠ΐ
ΠϯλʔϑΣʔεͷఆٛͳΜܾͯΊͷͰ͠ΐ Μͳͨ͜ͶʔΑ
ϲ݄ ͨͱ͑143ͷऩଋʹ͔͔ͬͨ࣌ؒ ʙ
w ϛϡʔλϒϧWTΠϛϡʔλϒϧ w ׳शΛ͍ٙຊ࣭Λݟग़͢ w ։์ดݪଇ͔Β҆ఆநՁݪଇ·Ͱ w நͷσβΠϯ ઃܭ ͕ͦ͜ຊ࣭
͜ͷ͍ظؒͰԿ͕ܾ·͔͔ͬͨΒʜ ʜͬͯ͠Α͏ͱͯͨ͠ΜͰ͚͢Ͳ
Ϊϟʔ
None
ཱͨͣͷڠௐੑͳ͍ϑϨʔϜϫʔΫج൫ͩͱ͔ʜ
ߦಈنൣŗŕʜ ͊ ͓·͕͍͎͑ʜ
ʮ͚ͯ͠;FOEͷΤΰͰͳ͍ʯ ࢲ͕Ҏલ͔Βओு͔ͨͬͨ͠ͷɺ143͔Β࢝·ͬͨઃܭ͕ ͱ͍͏͜ͱͰ͢ ͱ͍
/ZIPMN :JJBMQIB (V[[MF 4MJN ;FOE ͪΐͬͱͷ࠷࣮ 4MJN࣍͜Ε͏͔ͱ͔ݴͬͯΔ ࣍ੈ:JJͷ)551·ΘΓ 143Λ࣮͢ΔΑ͏ʹͳΔ ΄Β͜ͷτοϓ
্͕ΓΛΑ͘ݟΖ )551ϝοηʔδϯάͦ͜ ૬ޓӡ༻ੑͷతͳଘࡏ͡Όͳ͍͔ ʜͱɺͳ͍ͥ͑Δͷ͔
8): ͳͥඞཁͳͷ͔
͜ΕΛݟͯΈͳ͞ΜͲ͏ࢥΘΕ·͔͢ -BSBWFM4XPPMF͋ΔΑͱ͍͏ͷͱҙຯ͕ҧ͍·͢
&NJUUFS*OUFSGBDF 4BQJ&NJUUFS 4XPPMF&NJUUFS 3FRVFTU)BOEMFS*OUFSGBDF ϑϨʔϜϫʔΫ "QBDIF'1. 4XPPMF ૄ݁߹ͳΞʔΩςΫνϟ ͜͜Ͱ&NJUUFS͕ࠩ͠ସΘͬͯ ϑϨʔϜϫʔΫมΘΒͳ͍
։์ดݪଇ
&NJUUFS*OUFSGBDF 4BQJ&NJUUFS 4XPPMF&NJUUFS 3FRVFTU)BOEMFS*OUFSGBDF ϑϨʔϜϫʔΫ "QBDIF'1. 4XPPMF ֤ϑϨʔϜϫʔΫ͕ $BLF1)1YΛ࠶ൃ໌ ͢Δͷ͏ͨ͘͞Μͩ
ผͷઐ༻ϑϨʔϜϫʔΫ
ݴ͍͔ͨ͊ͳ͍͚Ͳ͜ΕΑ &TQSFTTP3FBDU1)1 4JMFY TZNGPOZIUUQGPVOEBUJPO ͳΜͰ͜ΜͳʹՄೳੑ͋ͬͨϓϩδΣΫτ͕ࢭ·ͬͯ͠·ͬͨΜͰ͠ΐ͏͔ͱ
ϑϨʔϜϫʔΫͱ ΤϛολͷϥούϥΠϒϥϦͰͳ͍ ʹରͯ͠࠷దͳ ղܾͷΈந ϋʔυίʔυ͞Εͨ
Ҋ݅ݻ༗ͳۀ্ͷ՝ ղܾͲͷͰෳࡶ͞Λ෧͡Δ͔ ͱղ๏ʹଟ༷ੑ͕͋Δ͔Βͦ͜ 1)1ͱ1)1'*(ͷҙຯ͕͋Δ ϑϨʔϜϫʔΫબࢶ͕ଟ͍1)1ͷଘࡏҙٛͪΌ͍·͔͢͜Ε
@(&5<>FDIP ϑϨʔϜϫʔΫ %# %* 7JFX .7$ શһ͕ಉ͡Χλνͨ͠ͷͰڝ૪ͯ͠ҙຯͳ͍ %# %* 7JFX
.7$ %# %* 7JFX .7$ %# %* 7JFX .7$ ŹůžŢઠŹůžŢŕŞ
3FRVFTU)BOEMFS*OUFSGBDF ϑϨʔϜϫʔΫ 3%# $BDIF -PH %PNBJO.PEFM )5.- "TZOD 6*69 %FTJHO1BUUFSO
.77. $234 "%0 $MFBO "SDIJUFDUVSF 5FTU $POpHVSBUJPO ࠓޙͷϑϨʔϜϫʔΫʹ ҙࣝͯ͠΄͍͠ྖҬ ͔͜͜ΒԼδΣωϦοΫͳͳΒ αʔυύʔςΟͰͥΜͥΜ͍͍Α %*$POUBJOFS 3PVUJOH )551.FTTBHJOH %%%%$*
&NJUUFS*OUFSGBDF 4BQJ&NJUUFS 4XPPMF&NJUUFS 3FRVFTU)BOEMFS*OUFSGBDF ϑϨʔϜϫʔΫ "QBDIF'1. 4XPPMF ૄ݁߹ͳΞʔΩςΫνϟ ϑϨʔϜϫʔΫ࡞Δͱ͖ ͔͜͜ΒԼ͍ͬͨΜΕͯ
ந্͍͛ͯ͜͏Α ͜͜ΈΜͳ͕ ࠶ར༻Ͱ͖ΔΑ͏ʹ ͚ͯߟ͑Α͏ͥ
)08 ඞཁੑͲͷΑ͏ʹຬͨ͞ΕΔ͔
143 ϝοηʔδͷσʔλϞσϧ 143 143 ϝοηʔδͷϋϯυϦϯά ϝοηʔδͷੜ 3FRVFTU*OUFSGBDF3FTQPOTF*OUFSGBDF 6SJ 4USFBN 6QMPBEFE'JMF
3FRVFTU)BOEMFS*OUFSGBDF .JEEMFXBSF*OUFSGBDF 3FTQPOTF'BDUPSZ*OUFSGBDF 4USFBN'BDUPSZ*OUFSGBDF
XJUI)FBEFS OBNF WBMVF HFU#PEZ 4USFBN*OUFSGBDF .FTTBHF*OUFSGBDF 3FRVFTU*OUFSGBDF 3FTQPOTF*OUFSGBDF 143
4USFBN*OUFSGBDF SFBE MFOHUI TUSJOH FYUFOET
XJUI)FBEFS ΠϛϡʔλϏϦςΟ ࣗΛมߋͤͣɺࣗͷϔομͱՃϔομΛ ࣋ͬͨ৽͍͠ΠϯελϯεΛฦ͢ 4USFBN*OUFSGBDF ԆಡΈग़͠ந ϝϞϦʹશ༰ΛཷΊࠐ·ͳ͍͍ͯ͘ 1)1ׂϝϞϦΑΓେ͖͍όΠτྻΛѻ͑Δ 143ͷϙΠϯτ
SFRVFTUTFU1BSBN bGPP` CBS ͠ϛϡʔλϒϧͩͬͨΒʜ
@(&5<bGPP`>CBS ͠ϛϡʔλϒϧͩͬͨΒʜ ಉҰͷϦΫΤετΠϯελϯεΛ͍ճ͢͜ͱ 1)1ͷ࣮ߦ࣌ʹεʔύʔάϩʔόϧͱಉ͡ҙຯ ͜ΜͳͷͰαʔυύʔςΟؒͷ૬ޓӡ༻ੑΛҡ࣋Ͱ͖Δ͔ෆ҆
ετϦʔϛϯάʹ͍ͭͯͪ͜ΒΛ͝ཡ͍ͩ͘͞ IUUQQTSOFUTBTF[BLJQIQDPOGVL IUUQTXXXTMJEFTIBSFOFUTBTF[BLJQIQIUUQ ཁɺඞͣετϦʔϛϯάΛఆ͠Ζͱ͢Δ͜ͱͰɺ ڊେ*0Ͱྫ֎ͳ͘ѻ͑ΔΑ͏ྀ͞Ε͍ͯ·͢ (V[[MFźŕŦŖ
IBOEMF 4FSWFS3FRVFTU*OUFSGBDFSFRVFTU 3FTQPOTF*OUFSGBDF 3FRVFTU)BOEMFS*OUFSGBDF 143 QSPDFTT 4FSWFS3FRVFTU*OUFSGBDFSFRVFTU
3FRVFTU)BOEMFS*OUFSGBDFIBOEMFS 3FTQPOTF*OUFSGBDF .JEEMFXBSF*OUFSGBDF ϛυϧΣΞͷ༷ͱࢥΘΕ ͕͚ͪͩͲɺΉ͠Ζ͍ͭ͜ͷ ൃݟͷํ͕ॏཁ
app.get('/', function (req, res) { res.send('Hello World!'); }); app.use(function (req,
res, next) { console.log('LOGGED'); next(); }); ·ͣͪ͜ΒΛ͝ཡ͍ͩ͘͞ 143ͷॳظҊ͜͏͍͏/PEFKTͷΑ͏ͳܗΛ͍ͯ͠·ͨ͠ɻ 4MJNͷ࣮ΛҰൠԽͨ͠ײ͡Ͱ͢ɻ ϦϦʔε͞Εͨܗͱ͍ͩͿҧ͍·͢ɻ
w ͳͥϦΫΤετϋϯυϥ͕ʮϦΫΤετΛड͚ͯϨεϙϯε Λฦ͢ʯͱ͍͏ૉͳܗΛ͍ͯ͠ͳ͍ͷ͔ w ڞ༗Πϯελϯεͷঢ়ଶ͕มԽͨ͠Γɺଈ࠲ʹετϦʔϜʹ ϓογϡͨ͠Γ͢Δͷɺ143લఏͰ͜Εʜ app.get('/', function (req, res)
{ res.send('Hello World!'); });
w OFYU ͕Կऀ͔ΛܕͰද͍ͤͯͳ͍ɻʮ@@JOWPLFΛ࣋ͭ ΦϒδΣΫτʯͳͲͱ͍͏ܕͳ͍ w DBMMBCMFͳ͚ͩͰҾͷܕͷ੍͕༩͑ΒΕͳ͍ app.use(function (req, res, next)
{ console.log('LOGGED'); next(); });
w ͔ͨ͠ʹɺଟ͘ͷϑϨʔϜϫʔΫ͕&YQSFTTͷϛυϧΣΞ ʹӨڹΛड͚ͨաڈ͋Δɻ1)1Ͱͦͷํ͕ଟͩͬͨ w Ͱɺ/PEFKTͷಈ࡞ಛੑʹରͯ͠ઃܭ͞ΕͨͷΛɺΦϒ δΣΫτࢦݴޠ1)1͕ࢀߟʹ͢Δͷ͓͔͍͠ w ʮΠϯϥΠϯؔͻͱͭͰ؆୯ʹͰ͖Δʯͷʮ؆୯ʯɺ νϡʔτϦΞϧͰ༗ޮͰɺݱͰ᠘ʹԽ͚Δ͍͕ϓϯ ϓϯ͢Δࢥ
w ߟ͑ͤIUUQTCMPHJSDNBYFMMDPNBMM BCPVUNJEEMFXBSFIUNM
QSPDFTT 4FSWFS3FRVFTU*OUFSGBDFSFRVFTU 3FRVFTU)BOEMFS*OUFSGBDFIBOEMFS 3FTQPOTF*OUFSGBDF .JEEMFXBSF*OUFSGBDF ͦͯ͜͠͏ͳͬͨ
app.use(function (req, res, next) { console.log('LOGGED'); next(); }); $middleware =
new class($logger) implements MiddlewareInterface { // ུ public function process( ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface { $this->logger->log(LogLevel::INFO, 'LOGGED'); return $handler->handle($request); } }; ೖྗϦΫΤετ ࣍ͷεςοϓͷϙΠϯλʔ ग़ྗϨεϙϯε
w IBOEMFSඞͣIBOEMF ϝιουΛ࣋ͭอূ͕͋Δ w IBOEMF ϝιουͷҾʹܕ੍͕͋Δ w IBOEMF ϝιου͕ϨεϙϯεΛฦ͢อূ͕͋Δ return
$handler->handle($request); IBOEMF 4FSWFS3FRVFTU*OUFSGBDFSFRVFTU 3FTQPOTF*OUFSGBDF 3FRVFTU)BOEMFS*OUFSGBDF ܕͷ͔ͪΒ
IBOEMF 4FSWFS3FRVFTU*OUFSGBDFSFRVFTU 3FTQPOTF*OUFSGBDF 3FRVFTU)BOEMFS*OUFSGBDF ͭ·Γ8FCΞϓϦέʔγϣϯ ൚Խ ʜ͋ɺͦ͏Ͷɺͯ͢ͷΞϓϦέʔγϣϯཁ͢Δʹ ϦΫΤετΛड͚ͯϨεϙϯεΛฦ͚ͩͩ͢ΑͶ ϦΫΤετΛड͚ͯ
ϨεϙϯεΛฦ͢ʜ
"QQ IBOEMF 1SPYZ QSPDFTT ϦΫΤετ Ϩεϙϯε 1SPYZ"QQؒͰɺಉҰͷϝοηʔδΠϯελϯεΛڞ༗͠ͳ͍͜ͱ͕ॏཁ ح͘͠143 ཧαʔόʔߏͱಉ͡ߏਤʹ ετϦʔϛϯά
ετϦʔϛϯά 3FRVFTU)BOEMFS*OUFSGBDF .JEEMFXBSF*OUFSGBDF $PQZXJUITUSFBNJOH $PQZXJUITUSFBNJOH
ݱঢ়ͷྲྀߦΓʹଥڠͤͣͪΌΜͱઃܭ͠Α͏ͱͨ͠Β ͳΜ͔ݱ࣮ͷࣸ૾ʹ͍ۙϞσϧ͕ग़͖ͯͨͧ ͪΐͬͱײಈͳΜͰ͚͢Ͳ ߟ͑ͯ͠ຊʹྑ͔ͬͨ
͋ͱͪΐͬͱΓͳ͍͜ͱ
DSFBUF3FTQPOTF DPEF ʜ 3FTQPOTF*OUFSGBDF 3FTQPOTF'BDUPSZ*OUFSGBDF 143 4USFBN'BDUPSZ*OUFSGBDF 3FRVFTU'BDUPSZ*OUFSGBDF ʜ
$handler = new class implements RequestHandlerInterface { public function handle(
ServerRequestInterface $request ): ResponseInterface { // ͳʹ͔Λॲཧ͢Δ return new } }; ͋Ε ͜͜Ͳ͏͢Μͩ
return (new \Zend\Diactoros\Response()) ->withHeader( ‘Content-Type', ‘application/json' ) ->withBody( new \Zend\Diactoros\Stream($data)
); ʜ͑ ͜ΕͩΊ ͩΊͰ͢
143 "QQ SEQBSUZ *NQMFNFOUBUJPO ͔ͤͬ͘ΠϯλʔϑΣʔεʹґଘͯ͠ ࣮ϥΠϒϥϦΑΓ"QQ͕ ந্ʹͳΕΔͷʹ ґଘ ࣮ ΠϯϑϥετϥΫνϟ
ΞϓϦέʔγϣϯ ۀքඪ४ͷந ࠷҆ఆ
143 "QQ SEQBSUZ *NQMFNFOUBUJPO ࢀরͨ͠Β҆ఆநՁݪଇͷҧ ඪ४ΠϯλʔϑΣʔεແ͠ ґଘ ࣮ ΠϯϑϥετϥΫνϟ ΞϓϦέʔγϣϯ
ۀքඪ४ͷந ࠷҆ఆ ґଘ
class MyAppHandler implements RequestHandlerInterface { private $responseFactory; private $streamFactory; public
function __construct( ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory ) { $this->responseFactory = $responseFactory; $this->streamFactory = $streamFactory; } public function handle( ServerRequestInterface $request ): ResponseInterface { // ུ return $this->responseFactory->createResponse() ->withHeader('Content-Type', 'application/json') ->withBody($this->streamFactory->createStream($data)); } };
public function __construct( ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory ) ίϯετϥΫλͷ͋ͨΓͰ ҙʹ%*
ґଘੑೖ ظͯ͠Δ͚ͩͰ͢ ͨͿΜબͨ͠143ͷ࣮ϥΠϒϥϦΛೖͯ͘͠ΕΔ
return $this->responseFactory->createResponse() ->withHeader( ‘Content-Type', ‘application/json' ) ->withBody( $this->streamFactory->createStream($data) ); ۩ΛOFXͤͣɺੜ
நϑΝΫτϦʹͤΔ Ͳͷ࣮ϥΠϒϥϦΛ͏ͷ͔Λ ͍͍ͬ͞ؾʹͤͣࣗͷίʔυ͕͢Δ
143 "QQ SEQBSUZ *NQMFNFOUBUJPO ,&&1 ґଘ ࣮ ΠϯϑϥετϥΫνϟ ΞϓϦέʔγϣϯ ۀքඪ४ͷந
࠷҆ఆ
·ͱΊ
class MyAppHandler implements RequestHandlerInterface { private $responseFactory; private $streamFactory;
public function __construct( ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory ) { $this->responseFactory = $responseFactory; $this->streamFactory = $streamFactory; } public function handle( ServerRequestInterface $request ): ResponseInterface { // ུ return $this->responseFactory->createResponse() ->withHeader('Content-Type', 'application/json') ->withBody($this->streamFactory->createStream($data)); } };
class MyAppHandler implements RequestHandlerInterface { private $responseFactory; private $streamFactory; public
function __construct( ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory ) { $this->responseFactory = $responseFactory; $this->streamFactory = $streamFactory; } public function handle( ServerRequestInterface $request ): ResponseInterface { // ུ return $this->responseFactory->createResponse() ->withHeader('Content-Type', 'application/json') ->withBody($this->streamFactory->createStream($data)); } };
class MyAppHandler implements RequestHandlerInterface { private $responseFactory; private $streamFactory; public
function __construct( ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory ) { $this->responseFactory = $responseFactory; $this->streamFactory = $streamFactory; } public function handle( ServerRequestInterface $request ): ResponseInterface { // ུ return $this->responseFactory->createResponse() ->withHeader('Content-Type', 'application/json') ->withBody($this->streamFactory->createStream($data)); } };
Α͏Θ͔ΒΜ͚Ͳ ͋ΜͨͷϜζ͍Θ ʮΈΜͳ͚ͷΘ͔Γ͍ͭ͢ͳ͍ͷ ʯ Ͱɺ͍͍ͷͰ͠ΐ͏͔
ࠓ͙͢ʹཱͨͳ͍ͱ ཧղ͞Εͳͯ͘ ະདྷͷͨΊʹ ਖ਼͠͞Λ؏͘͜ͱͦ͜ ༏Εͨநͷઃܭʹͱͬͯ େࣄͳ͜ͱͳͷͰ
ϦϑΝΫλ͕ཁΔ ͋ͱͰޮ͍ͯ͘Δ ࠓಈ͍ͯΔ͔Β͍͍͡ΌΜ ࠓ͙͢ʹཱͨͳ͍ͱ ཧղ͞Εͳͯ͘ ະདྷͷͨΊʹ ਖ਼͠͞Λ؏͘͜ͱͦ͜ ༏Εͨநͷઃܭʹͱͬͯ
େࣄͳ͜ͱͳͷͰ