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
事業活動を AI Ready にする攻めと守りのデータエンジニアリング / data-engineering-for-ai-ready-business
pei0804
7
2.7k
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
180
Datadog の学び方 - あるいは、オブザーバビリティを学ぶとは何か
mananyuki
1
560
AIに攻撃される前に、AIに攻撃させる
tsuchikazu
0
170
AI 時代の Azure エンジニアリング ~ 私たちは何を磨き、何を任せるのか ~
chack411
1
610
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
150
SREでアラート疲れを 解決しよう!
kairim0
1
230
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
360
Benchmarking Disaggregated Serving on vLLM + Dynamo with a Real Coding-Agent Workload
nttcom
0
120
会社説明資料
persolserverworks
0
9.7k
自分で立ててみるLLMサービス
y_sera15
0
160
AI時代に必要な脅威モデリング― 変化の速度に負けない理解とリスク判断
masakane55
5
1.3k
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
529
40k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
GitHub's CSS Performance
jonrohan
1033
470k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
620
From π to Pie charts
rasagy
1
400
Rails Girls Zürich Keynote
gr2m
96
14k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Product Roadmaps are Hard
iamctodd
55
13k
Amusing Abliteration
ianozsvald
1
340
How to Talk to Developers About Accessibility
jct
2
570
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
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)); } };
Α͏Θ͔ΒΜ͚Ͳ ͋ΜͨͷϜζ͍Θ ʮΈΜͳ͚ͷΘ͔Γ͍ͭ͢ͳ͍ͷ ʯ Ͱɺ͍͍ͷͰ͠ΐ͏͔
ࠓ͙͢ʹཱͨͳ͍ͱ ཧղ͞Εͳͯ͘ ະདྷͷͨΊʹ ਖ਼͠͞Λ؏͘͜ͱͦ͜ ༏Εͨநͷઃܭʹͱͬͯ େࣄͳ͜ͱͳͷͰ
ϦϑΝΫλ͕ཁΔ ͋ͱͰޮ͍ͯ͘Δ ࠓಈ͍ͯΔ͔Β͍͍͡ΌΜ ࠓ͙͢ʹཱͨͳ͍ͱ ཧղ͞Εͳͯ͘ ະདྷͷͨΊʹ ਖ਼͠͞Λ؏͘͜ͱͦ͜ ༏Εͨநͷઃܭʹͱͬͯ
େࣄͳ͜ͱͳͷͰ