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
310
哲学史とモデリング
tanakahisateru
4
1.1k
オブジェクト指向宗教史
tanakahisateru
32
18k
ほげ言語にあってPHPにない機能
tanakahisateru
6
4.1k
君たちはどうプログラミングするか
tanakahisateru
16
3.4k
デバッグ用ロガーの注入どうする?
tanakahisateru
2
740
アンドキュメンテッド ちょうぜつソフトウェア 設計入門 「オブジェクト指向に定義はない」のか?
tanakahisateru
25
10k
ちょうぜつ改め21世紀ふつうのソフトウェア設計
tanakahisateru
14
8.8k
Other Decks in Technology
See All in Technology
ソフトウェア ファクトリー - 再現性のあるソフトウェアの工場づくり / Software factory
iktakahiro
2
880
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
1
1.8k
「Docker Desktop不要の時代」は 来たのか?
ueponx
0
610
Getting Started with Google Antigravity
glaforge
0
240
LocalStack を使ったサーバーレスアプリケーション開発 / Serverless Development with LocalStack
kakakakakku
1
420
AI時代のAPI開発を加速する品質ガードレール / API Quality Guardrails in the AI Era
yokawasa
0
190
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
360
遠藤な_めぐろLT #38 「社内のAI活用推進」@麻布台_20261009
endonanana
0
120
AI時代のPRレビューにどう向き合うか?
kairim0
1
220
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
480
今さら理解するウェブフォントver.2026
takanorip
3
690
会社説明資料
persolserverworks
0
9.7k
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Making the Leap to Tech Lead
cromwellryan
135
10k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
300
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Amusing Abliteration
ianozsvald
1
340
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
700
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)); } };
Α͏Θ͔ΒΜ͚Ͳ ͋ΜͨͷϜζ͍Θ ʮΈΜͳ͚ͷΘ͔Γ͍ͭ͢ͳ͍ͷ ʯ Ͱɺ͍͍ͷͰ͠ΐ͏͔
ࠓ͙͢ʹཱͨͳ͍ͱ ཧղ͞Εͳͯ͘ ະདྷͷͨΊʹ ਖ਼͠͞Λ؏͘͜ͱͦ͜ ༏Εͨநͷઃܭʹͱͬͯ େࣄͳ͜ͱͳͷͰ
ϦϑΝΫλ͕ཁΔ ͋ͱͰޮ͍ͯ͘Δ ࠓಈ͍ͯΔ͔Β͍͍͡ΌΜ ࠓ͙͢ʹཱͨͳ͍ͱ ཧղ͞Εͳͯ͘ ະདྷͷͨΊʹ ਖ਼͠͞Λ؏͘͜ͱͦ͜ ༏Εͨநͷઃܭʹͱͬͯ
େࣄͳ͜ͱͳͷͰ