Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
'D'evelopment and 'D'eployment with 'D'ocker at 'D'wango
ixixi
January 17, 2015
Technology
15
31k
'D'evelopment and 'D'eployment with 'D'ocker at 'D'wango
Development with Docker,
Deployment with Docker.
ixixi
January 17, 2015
Tweet
Share
More Decks by ixixi
See All by ixixi
niconico超コメント生成ハッカソンレギュレーション
ixixi
1
150
Other Decks in Technology
See All in Technology
ラブグラフ紹介資料 〜プロダクト解体新書〜 / Lovegraph Product Deck
lovegraph
0
160
Retca Cloud
bau
0
450
機械学習システムアーキテクチャ入門 #1
asei
3
1.2k
oakのミドルウェアを書くときの技のらしきもの
toranoana
0
100
ログ基盤をCloudWatchLogからNewRelic Logs + S3に変えたら 利便性も上がってコストも下がった話
onohiroshi1
0
210
Azure Arc Virtual MachineとAzure Arc Resource Bridge / VM provisioning through Azure portal on Azure Stack HCI (preview)
sashizaki
0
110
Target SDK Versionを上げない Notification runtime permission対応
napplecomputer
0
130
さいきんのRaspberry Pi。 / osc22do-rpi
akkiesoft
5
5k
The role of the data organization as a business progresses
line_developers
PRO
3
840
マネージャーからみたスクラムと自己管理化
shibe23
0
1k
ノーメンテナンス運用実現のためのノウハウ/ColoplTech-05-02
colopl
0
160
OpsJAWS Meetup21 システム運用アンチパターンのすすめ
yoshiiryo1
0
1.4k
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
39
13k
How to name files
jennybc
40
61k
Reflections from 52 weeks, 52 projects
jeffersonlam
337
17k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
181
15k
Designing for Performance
lara
597
63k
A designer walks into a library…
pauljervisheath
196
16k
Art, The Web, and Tiny UX
lynnandtonic
280
17k
GitHub's CSS Performance
jonrohan
1020
420k
How to Ace a Technical Interview
jacobian
265
21k
Making Projects Easy
brettharned
98
4.3k
Code Review Best Practice
trishagee
43
9.2k
Happy Clients
brianwarren
89
5.6k
Transcript
Development and Deployment with Docker at Dwango @ixixi
%8"/(0$P -UE :VSJ0EBHJSJ !JYJYJ 3FDPNNFOEBUJPOTZTUFNBSDIJUFDU
Development with Docker
/JDPOJDP "QQMJDBUJPO4FSWFS )551SFRVFTU 8FC 4FSWFS $BTTBOESB 3FDPNNFOE "1*4FSWFS Recommendation API
3FDPNNFOE 4FSWFS 0UIFS4FSWJDFT MPHT $BDIF4FSWFS MPHT w%PDLFSҎલ͔ΒՔಇ͍ͯ͠ΔϨίϝϯυ"1* wχίχίಈըͷʮؔ࿈ಈըʯͳͲΛฦ͢ɻ
Ϩίϝϯυͷ֬ೝͱςετ wϨίϝϯυͷγεςϜʹखΛՃ͑ͨ߹ʹɺϨίϝϯυ݁Ռ͕Ͳ͏ มԽ͢Δ͔ͷ֬ೝɺίʔυϨϏϡʔɾ6OJU5FTUͰอূͮ͠Β͍ɻ ! wQVMMSFRΛNBTUFSʹऔΓࠐΉຊ൪σϓϩΠͳͷͰɺ֬ೝແ͠Ͱͷ ೖͨ͘͠ͳ͍ɻ ! wͲ͏ʹ͔ͯ͠ɺखܰʹʮ࣮ࡍͷڥΛ֬ೝʯग़དྷΔΑ͏ʹ͍ͨ͠ɻ
Γ͍ͨ͜ͱ wQVMMSFRग़ͨ͠ΒɺϨίϝϯυʹؔΘΔ%PDLFSͷ ίϯςφҰἧ͍ lܥz ͕উखʹཱͭɻ wࣗͰڥΛ࡞ͬͯࢼ͞ͳͯ͘ɺ ʮ͜͜Ͱطʹಈ͍͍ͯΔΑʯͱ͍͏ঢ়ଶ͕࠷ߴɻ ! wϨίϝϯυ"1*Ͱɺ࣮ࡍʹԿ͕Ϩίϝϯυ͞ΕΔ͔ දࣔग़དྷΔ3FDPNNFOE7JFXFS
෦πʔϧ Ͱݟ͍ͨɻ طʹಈ͍͍ͯΔ
/JDPOJDP "QQMJDBUJPO4FSWFS )551SFRVFTU 8FC 4FSWFS $BTTBOESB 3FDPNNFOE "1*4FSWFS Containerize! 3FDPNNFOE
4FSWFS 0UIFS4FSWJDFT MPHT $BDIF4FSWFS MPHT 3FDPNNFOE 7JFXFS )551SFRVFTU
pull request builderͰҰ্ཱࣜͪ͛&௨ wKFOLJOTͷQVMMSFRVFTUCVJMEFSΛར༻ɻ wKPCDIBJOͰςετ͔Βίϯςφ࡞ɺίϝϯτॻ͖ࠐΈ·Ͱ࣮ߦɻ QVMMSFRVFTUCVJMEFS QVMMSFRVFTU ௨ৗͷςετ QVMMSFRVFTUΛөͨ͠ EPDLFSίϯςφ࡞
EPDLFSίϯςφͰ ܥΛҰࣜىಈ ଓઌϙʔτใΛ QVMMSFRίϝϯτʹॻࠐ ίϝϯτʹॻ͖ࠐΈ
ίϯςφੜ wQVMMSFRVFTUʹରԠͨ͠ίϯςφ໊ͷQSFpYΛ࡞Δɻ wྫ QVMMSFR൪߸͕Ͱ࣌ࠁ͕ͳΒ ɹɹQVMMSFR@SFDPNNFOE@BQJ@@U wಉҰQVMMSFRͰɺߋ৽͞ΕΔʹίϯςφੜ͍ͨ͠ͷͰɺ͕࣌ඞཁɻ wQVMMSFRऴྃ࣌ ޙड़ ʹ͜ͷQSFpYΛར༻ɻ
ίϯςφͰʮܥʯΛཱͯΔ wHJUQVMM͔ͯ͠ΒpHCVJME͢ΔSBLFUBTLΛ࣮ߦ wQVMMSFRʹରԠͨ͠CSBODIΛͬͯCVJME͕Δɻ wΞϓϦߋ৽෦ҎલΩϟογϡ͕ޮ͘ͷͰCVJMEߴ ! wੜͨ͠QSFpYΛՃͨ͠ίϯςφ໊ͰpHVQ͢ΔSBLFUBTL࣮ߦ ! wDBTTBOESBSFEJTͷαʔόɺμϛʔσʔλ͕ ೖͬͨίϯςφ্ཱ͕͕ͪΔɻ !
wQVMMSFRͷίϝϯτͰɺىಈͤ͞Δ֤ίϯςφͷ CSBODIΛ໌ࣔࢦఆ͢Δ͜ͱՄೳɻ ผͷSFQPTJUPSZͷQVMMSFRҰॹʹద༻͢Δඞཁ͕͋Δ߹ $BTTBOESB 3FDPNNFE "1*4FSWFS 3FDPNNFOE 4FSWFS $BDIF 4FSWFS 3FDPNNFOE 7JFXFS MJOL MJOL MJOL MJOL
PullReqίϝϯτͷॻ͖ࠐΈ w֤ίϯςφׂ͕ΓͯΒΕͨϙʔτΛऔಘɻ ! wଓใΛ()FͷQVMMSFRίϝϯτʹॻ͘ɻ
Garbage Collection (daily) wQVMMSFRVFTU͕DMPTF͞ΕͨΒίϯςφΛࢭΊΔআ͢Δɻ wKFOLJOTͰQVMMSFRVFTUͷDMPTFIPPL͢Δ͜ͱ͕͔ͬͨͨ͠Ίɺ࣍Ͱ($ɻ DSPO wEPDLFSͷίϯςφ໊ͷQSFpYΛQBSTFͯ͠ɺSFQPTJUPSZͱQVMMSFRVFTU൪߸Λऔಘɻ w֘QVMMSFRVFTU͕DMPTF͞Ε͍ͯΔ͔֬ೝ͠ɺด͍ͯͨ͡Βίϯςφఀࢭআɻ !
wίϯςφ໊ͷQSFpYͰͳ͘FUDESFEJTʹରԠΛอ࣋ͯ͠ྑ͔͕ͬͨɺߏͷγϯϓ ϧ͞Λॏࢹɻ
developmentฤ Ή͢ͼ wطଘͷϓϩμΫτΛ%PDLFSԽ͢Δͷਏ͍߹͕͋ͬͨɻ wڥߏஙΛDIFGͰߦ͏લఏͷϓϩμΫτΛޙ͔Β%PDLFSԽ͢Δͷେมʹײͨ͡ɻ ! wطଘ෦Λ%PDLFSԽ͢ΔΑΓɺ৽نͰ࡞ΔͷΛ%PDLFSԽલఏͰߏங͢Δํ͕ྑ͍ɻ w1VMM3FRVFTUͰʮͦͷͰ࣮ࡍʹ৮ΕΔڥ͕طʹಈ͍͍ͯΔʯͷ࠷ߴɻ
Deployment with Docker
Personalize API /JDPOJDP "QQMJDBUJPO4FSWFS )551SFRVFTU 8FC 4FSWFS $BDIF %BUBCBTF 3FWFSTF
1SPYZ 1FSTPOBMJ[F"1* • ύʔιφϥΠζʹར༻͢ΔAPI (golang࣮) • DockerલఏͰ৽نʹߏஙɻ
Containerize! • ύʔιφϥΠζAPI • ϩάసૹ&ू(fluentd) • CEPΤϯδϯ(Norikra) • ϩάอଘ (ES&InfluxDB)
• ՄࢹԽ (Kibana&Grafana) • ϦόʔεϓϩΩγ 1FSTPOBMJ[F"1* /JDPOJDP "QQMJDBUJPO4FSWFS )551SFRVFTU $POUBJOFSJ[F 8FC 4FSWFS $BDIF %BUBCBTF MPHTUPSF .FUSJDT7JTVBMJ[FS $&1 -PH$PMMFDUPS 3FWFSTF 1SPYZ
Dataflow DP 4FSWFS )551SFRVFTU $BDIF %BUBCBTF MPHTUPSF .FUSJDT7JTVBMJ[FS $&1 3FWFSTF
1SPYZ -PBE #BMBODFS -PH"HHSFHBUPS MPHpMF %PDLFS)PTU %PDLFS)PTU %PDLFS)PTU %PDLFS)PTU "1* -PH $PMMFDUPS w ֤IPTUͷϦόʔεϓϩΩγ OHJOY ܦ༝Ͱ"1*ʹϦΫΤετɻ w ϩάϑΝΠϧϗετଆϘϦϡʔϜΛϚϯτͯ͠ॻ͖ग़͠ɻ w qVFOUEίϯςφଆͰϩάσΟϨΫτϦΛϚϯτͯ͠ɺಡΈࠐΈɻ w ϩάूίϯςφͰϩάΛूΊͯɺ$&1 /PSJLSB Ͱूܭͭͭ͠ʹอଘˠՄࢹԽ
Docker Build Architecture MPDBM ()F +FOLJOT 3FHJTUSZ $PNNPO QVTITPVSDFT )PPL
w %PDLFS*NBHFϏϧυ w ίϯςφͰܥΛ্ཱͪ͛ͯ݁߹ςετ w υΩϡϝϯτͷੜ w %PDLFS3FHJTUSZʹΠϝʔδొ "1* qVFOUE /HJOY SFHJTUFS"1*DPOUBJOFS*NBHF VCVOUV CVJMEͷىͱͳΔJNBHFɺ1SJWBUF SFHJTUSZʹஔ͍͓͖ͯɺ%PDLFSIVC SFHJTUSZͷར༻͠ͳ͍ɻ
Deploy Manager WebUI • WebUIσϓϩΠπʔϧ • DockerԽҎલ͔Β͍ͬͯͨπʔϧ • Capistrano task
࣮ߦ • Ϣʔβೝূ • σϓϩΠϩάͷϦΞϧλΠϜදࣔ&อଘ • DockerσϓϩΠcapistrano taskԽͯ͠ར༻ σϓϩΠઌαʔόΛબͯ͠ɺϙνοͱ 1click͚ͩͰແఀࢭσϓϩΠɻ • σϓϩΠͷrollbackλεΫ༻ҙɻ
Docker Deployment Architecture %FQMPZ.BOBHFS 8FC6* 3FHJTUSZ ڞ௨ 3FHJTUSZ QSPEVDUJPOઃఆ "1*
qVFOUE /HJOY "1*TFSWFSDPOpH 0QFSBUF QVMM qVFOUE 3FWFSTF1SPYZ "1* QVMM "1*TFSWFSDPOpH %PDLFS)PTU 0UIFS4FSWJDFT %FQMPZ $BQJTUSBOPUBTL )551SFRVFTU NPVOU • Capistrano taskͰɺίϯςφͷ ΠϝʔδΛ֤ϗετ͕pullͯ͠σϓϩΠɻ ! • ࣮ߦόΠφϦͷίϯςφΠϝʔδ։ൃऀ શһ͕pullՄೳɻ ! • productionڥͰ͏configίϯςφɺ registry͝ͱ(ೝূ͕ҟͳΔ)ɻ
Deployment ~ step.1 1.APIίϯςφΠϝʔδͱɺઃఆΠϝʔδ ΛɺDockerHostଆͰpull͢Δ %PDLFS)PTU 3FHJTUSZ ڞ௨ 3FHJTUSZ ઃఆ
"1* qVFOUE /HJOY "1*W EPDLFSJNBHFT "1*TFSWFSDPOpH "1*TFSWFSDPOpH "1*TFSWFS DPOpH NPVOU NPVOU 3FWFSTF1SPYZ "1*W qVFOUEMBUFTU
Deployment ~ step.1 1.APIίϯςφΠϝʔδͱɺઃఆΠϝʔδ ΛɺDockerHostଆͰpull͢Δ %PDLFS)PTU 3FHJTUSZ ڞ௨ 3FHJTUSZ ઃఆ
"1* qVFOUE /HJOY EPDLFSQVMMBQJMBUFTU EPDLFSQVMMBQJ@DPOpHMBUFTU "1*W EPDLFSJNBHFT "1*W MBUFTU "1*TFSWFSDPOpH "1*TFSWFSDPOpH "1*TFSWFS DPOpH NPVOU NPVOU 3FWFSTF1SPYZ "1*W qVFOUEMBUFTU
Deployment ~ step.2 1.৽͍͠imageͷίϯςφΛىಈ 2.API͕ਖ਼͘͠ϦΫΤετΛฦͤΔ·Ͱͭ ɹ(࣮ࡍʹϨεϙϯεΛ֬ೝ) %PDLFS)PTU "1*W qVFOUEMBUFTU DPOpH
3FWFSTF1SPYZ
Deployment ~ step.2 1.৽͍͠imageͷίϯςφΛىಈ 2.API͕ਖ਼͘͠ϦΫΤετΛฦͤΔ·Ͱͭ ɹ(࣮ࡍʹϨεϙϯεΛ֬ೝ) %PDLFS)PTU "1*W "1*W qVFOUEMBUFTU
qVFOUEMBUFTU DPOpH DPOpH 3FWFSTF1SPYZ
Deployment ~ step.2 1.৽͍͠imageͷίϯςφΛىಈ 2.API͕ਖ਼͘͠ϦΫΤετΛฦͤΔ·Ͱͭ ɹ(࣮ࡍʹϨεϙϯεΛ֬ೝ) %PDLFS)PTU "1*W "1*W qVFOUEMBUFTU
qVFOUEMBUFTU DPOpH DPOpH IFBMUIDIFDL EVNNZSFRVFTU 3FWFSTF1SPYZ
Deployment ~ step.3 1.৽͍͠IPΛnginxͷconfʹॻ͖ࠐΉɻ 2.NginxΛgraceful restartͯ͠ɺແఀࢭͰίϯςφ ͷ͚ઌΛมߋ͢Δɻ Reverse Proxy(nginx)ͷDockerίϯςφͰ 1.$
kill -USR2 `cat /var/run/nginx.pid` 2.$ kill -WINCH `cat /var/run/nginx.pid.oldbin` 3.$ kill -QUIT `cat /var/run/nginx.pid.oldbin` ※࣮ࡍʹɺgracefull restart෦ γΣϧεΫϦϓτԽͯ͠ɺίϯςφʹಉࠝɻ %PDLFS)PTU "1*W "1*W qVFOUEMBUFTU qVFOUEMBUFTU 3FWFSTF1SPYZ DPOpH DPOpH OHJOYDPOG OHJOY QPSU
Deployment ~ step.3 1.৽͍͠IPΛnginxͷconfʹॻ͖ࠐΉɻ 2.NginxΛgraceful restartͯ͠ɺແఀࢭͰίϯςφ ͷ͚ઌΛมߋ͢Δɻ Reverse Proxy(nginx)ͷDockerίϯςφͰ 1.$
kill -USR2 `cat /var/run/nginx.pid` 2.$ kill -WINCH `cat /var/run/nginx.pid.oldbin` 3.$ kill -QUIT `cat /var/run/nginx.pid.oldbin` ※࣮ࡍʹɺgracefull restart෦ γΣϧεΫϦϓτԽͯ͠ɺίϯςφʹಉࠝɻ %PDLFS)PTU "1*W "1*W qVFOUEMBUFTU qVFOUEMBUFTU 3FWFSTF1SPYZ DPOpH DPOpH OHJOYDPOG MPDBUJPO\ QSPYZ@QBTTIUUQ ^ OHJOY QPSU
Deployment ~ step.3 1.৽͍͠IPΛnginxͷconfʹॻ͖ࠐΉɻ 2.NginxΛgraceful restartͯ͠ɺແఀࢭͰίϯςφ ͷ͚ઌΛมߋ͢Δɻ Reverse Proxy(nginx)ͷDockerίϯςφͰ 1.$
kill -USR2 `cat /var/run/nginx.pid` 2.$ kill -WINCH `cat /var/run/nginx.pid.oldbin` 3.$ kill -QUIT `cat /var/run/nginx.pid.oldbin` ※࣮ࡍʹɺgracefull restart෦ γΣϧεΫϦϓτԽͯ͠ɺίϯςφʹಉࠝɻ %PDLFS)PTU "1*W "1*W qVFOUEMBUFTU qVFOUEMBUFTU 3FWFSTF1SPYZ DPOpH DPOpH OHJOYDPOG MPDBUJPO\ QSPYZ@QBTTIUUQ ^ MPDBUJPO\ QSPYZ@QBTTIUUQ ^ OHJOY QPSU
Deployment ~ step.3 1.৽͍͠IPΛnginxͷconfʹॻ͖ࠐΉɻ 2.NginxΛgraceful restartͯ͠ɺແఀࢭͰίϯςφ ͷ͚ઌΛมߋ͢Δɻ Reverse Proxy(nginx)ͷDockerίϯςφͰ 1.$
kill -USR2 `cat /var/run/nginx.pid` 2.$ kill -WINCH `cat /var/run/nginx.pid.oldbin` 3.$ kill -QUIT `cat /var/run/nginx.pid.oldbin` ※࣮ࡍʹɺgracefull restart෦ γΣϧεΫϦϓτԽͯ͠ɺίϯςφʹಉࠝɻ %PDLFS)PTU "1*W "1*W qVFOUEMBUFTU qVFOUEMBUFTU 3FWFSTF1SPYZ DPOpH DPOpH OHJOYDPOG OHJOY QPSU
Deployment ~ step.3 1.৽͍͠IPΛnginxͷconfʹॻ͖ࠐΉɻ 2.NginxΛgraceful restartͯ͠ɺແఀࢭͰίϯςφ ͷ͚ઌΛมߋ͢Δɻ Reverse Proxy(nginx)ͷDockerίϯςφͰ 1.$
kill -USR2 `cat /var/run/nginx.pid` 2.$ kill -WINCH `cat /var/run/nginx.pid.oldbin` 3.$ kill -QUIT `cat /var/run/nginx.pid.oldbin` ※࣮ࡍʹɺgracefull restart෦ γΣϧεΫϦϓτԽͯ͠ɺίϯςφʹಉࠝɻ %PDLFS)PTU "1*W "1*W qVFOUEMBUFTU qVFOUEMBUFTU 3FWFSTF1SPYZ DPOpH DPOpH OHJOYDPOG OHJOY OHJOY QPSU
Deployment ~ step.3 1.৽͍͠IPΛnginxͷconfʹॻ͖ࠐΉɻ 2.NginxΛgraceful restartͯ͠ɺແఀࢭͰίϯςφ ͷ͚ઌΛมߋ͢Δɻ Reverse Proxy(nginx)ͷDockerίϯςφͰ 1.$
kill -USR2 `cat /var/run/nginx.pid` 2.$ kill -WINCH `cat /var/run/nginx.pid.oldbin` 3.$ kill -QUIT `cat /var/run/nginx.pid.oldbin` ※࣮ࡍʹɺgracefull restart෦ γΣϧεΫϦϓτԽͯ͠ɺίϯςφʹಉࠝɻ %PDLFS)PTU "1*W "1*W qVFOUEMBUFTU qVFOUEMBUFTU 3FWFSTF1SPYZ DPOpH DPOpH OHJOYDPOG OHJOY QPSU
Deployment ~ step.4 1.ݹ͍ίϯςφͷఀࢭ&আ 2.ݹ͍ίϯςφΠϝʔδͷআ ˞ߴʹrollbackग़དྷΔΑ͏ɺ࣮ࡍʹ ɹ5ੈલͷΠϝʔδΛআ %PDLFS)PTU "1*W
"1*W qVFOUEMBUFTU qVFOUEMBUFTU 3FWFSTF1SPYZ DPOpH DPOpH OHJOY "1*W EPDLFSJNBHFT "1*W MBUFTU "1*TFSWFSDPOpH
Deployment ~ step.4 1.ݹ͍ίϯςφͷఀࢭ&আ 2.ݹ͍ίϯςφΠϝʔδͷআ ˞ߴʹrollbackग़དྷΔΑ͏ɺ࣮ࡍʹ ɹ5ੈલͷΠϝʔδΛআ %PDLFS)PTU "1*W
qVFOUEMBUFTU 3FWFSTF1SPYZ DPOpH OHJOY "1*W EPDLFSJNBHFT "1*W MBUFTU "1*TFSWFSDPOpH
Deployment ~ step.4 1.ݹ͍ίϯςφͷఀࢭ&আ 2.ݹ͍ίϯςφΠϝʔδͷআ ˞ߴʹrollbackग़དྷΔΑ͏ɺ࣮ࡍʹ ɹ5ੈલͷΠϝʔδΛআ %PDLFS)PTU "1*W
qVFOUEMBUFTU 3FWFSTF1SPYZ DPOpH OHJOY EPDLFSJNBHFT "1*W MBUFTU "1*TFSWFSDPOpH
deploymentฤ Ή͢ͼ wμϯλΠϜແ͠ͷσϓϩΠՄೳ͕ͩɺݱঢ়ɺࣗલͰগ͠࡞Γ͜Ήඞཁ͕͋Δɻ wࣗલͷίϯςφସલϔϧενΣοΫɻ ! wϗετଆͷڥ͕ԚΕͳ͍ͷૉΒ͍͠ɻ ! wظӡ༻͢ΔલఏͳΒΰϛΛย͚ΔػߏΛ࣋ͱ͏ɻ wLTΛ͏ʹɺNBTUFSͷԽߴՄ༻ੑͳFUDEΫϥελͷߏஙɾӡ༻ɺ نͷׂʹ߹Θͳ͔ͬͨͷͰʮϦιʔεͷநԽʯ·Ͱ౿Έࠐ·ͳͳ͔ͬͨɻ
wαʔϏεԣஅͰར༻ՄೳͳେنσϓϩΠઌαʔόࢿݯͱͯ͠நԽ͢Δ߹ʹɺ LT͕ඞཁʹͳΔͱࢥ͏ɻنͱతʹԠͯ͡ΞʔΩςΫνϟઃܭ͠Α͏ɻ
υϫϯΰࠂ ͜ͷهࣄυϫϯΰۈ࣌ؒதʹॻ͔Εͨɻ ! υϫϯΰຊͷ (C++|Elrang|ݕࡧ|Ϩίϝϯυ|σʔλੳ|σʔλ࿈ܞ|FPGA|Πϯϑϥ|WEBΞϓϦ) ΤϯδχΞΛืू͍ͯ͠·͢ɻ ࠾༻ใ | גࣜձࣾυϫϯΰ