English: Can we use asynchronous processing on Laravel? We can start to use asynchronous processing on PHP8 with Laravel Octane At: 2021/10/03 PHP Conference 2021
ΊΓʔ-BSBWFMͰඇಉظॲཧ͕ѻ͑Δʂʁ1)1͔ΒॳΊΔඇಉظॲཧʙ-BSBWFM0DUBOFʙ1)1ΧϯϑΝϨϯε1
View Slide
@2020 Torana, Inc. @2020 Torana, Inc.ΊΓʔϓϩμΫτ։ൃ෦ Ϛωʔδϟʔ݉ςοΫϦʔυ1)1Ͱ+7.Λ࣮ͨ͠ΓຊΛॻ͍ͯͨΓͯ͠·͢ɻೕ༮ࣇ͚ҭ؝۩ͷαϒεΫϦϓγϣϯαʔϏεΛఏڙ͢Δ5PSBOBͱ͍͏ձࣾʹ͍·͢!NNS2
@2020 Torana, Inc.<13>ձࣾʹ͍͓͔ͭͯ͛͞·Ͱฐࣾͷҭ؝۩αϒεΫϦϓγϣϯαʔϏεʮτΠαϒʂʯ͝ར༻͍͍͍ͨͩͯΔ͓٬༷ ਓͱͳΓ·ͨ͠ʂ ຊ1)1ΧϯϑΝϨϯεͰεϙϯαʔυΛ͓ͯ͠Γ·͢ɻ0250050007500100002015 2016 2018 2020 20213
@2020 Torana, Inc.͓͠ͳ͕͖-BSBWFM0DUBOFͱʁԿ͕Ͱ͖Δͷʁࠓ·ͰͱԿ͕ҧ͏ͷʁϓϩμΫγϣϯڥ·ͰͷಓͷΓ4
-BSBWFM0DUBOFͱʁ5
@2020 Torana, Inc.-BSBWFM0DUBOFͱʁ ߴੑೳͳΞϓϦέʔγϣϯɾαʔόʔΛఏڙ͢ΔͨΊͷ-BSBWFMͷͨΊͷϥΠϒϥϦͰ͢ɻ ΞϓϦέʔγϣϯɾαʔόʔͷछྨ3PBE3VOOFS·ͨ4XPPMFΛ બͯ͠༻͢Δ͜ͱ͕Ͱ͖·͢ɻ6
@2020 Torana, Inc.-BSBWFM0DUBOFͱʁ ͦͯ྆͠ऀɺϓϩμΫγϣϯϨσΟͰ͋Δͱᨳ͍ͬͯ·͢ɻ7
@2020 Torana, Inc.-BSBWFM0DUBOFͱʁ A0DUBOFDPODVSSFOUMZA ฒߦॲཧA0DUBOFUJDLA +BWB4DSJQUͷTFU*OUFSWBMͷΑ͏ͳͷ͕ఏڙ͞Ε͓ͯΓɺͳ͘༻Ͱ͖·͢ɻ ·ͨσʔλϕʔε,74Λܦ༝ͤͣʹɺϝϞϦ্ʹϦΫΤετؒͰͷσʔλΛڞ༗͢ΔͨΊͷA$BDIFTUPSF PDUBOFA༻ҙ͞Ε͓ͯΓɺωοτϫʔΫ*0Λߟྀ͢Δඞཁ͕ͳ͍ͨΊɺߴͳσʔλͷग़͠ೖΕ͕Մೳʹͳ͍ͬͯ·͢ɻ8
@2020 Torana, Inc.-BSBWFM0DUBOFͱʁ3PBE3VOOFSͱʁ (PΞϓϦέʔγϣϯɾαʔόʔͰߴʹ1)1ΛॲཧΛ͢ΔͨΊͷͷͰ͢ɻ ༧Ίىಈͯ͋͠Δ1)1ϫʔΧʔϦΫΤετ͕དྷͨ࣌ʹ31$Λ༻͍Δ͜ͱͰɺॲཧͨ݁͠ՌΛϨεϙϯεͱͯ͠ฦ͢ΈͰ͢ɻ ༧Ίϓϩηε͕ىಈ͍ͯ͠ΔͨΊʢ͍ΘΏΔϓϩηε͕ϓʔϧ͞Ε͍ͯΔঢ়ଶʣɺॳճىಈίετΛݮΒ͠ɺϦΫΤετΛߴʹࡹ͘͜ͱ͕Ͱ͖Δͷ͕ಛͰ͢ɻࢀর: https://roadrunner.dev/docs/intro-about9
@2020 Torana, Inc.-BSBWFM0DUBOFͱʁ3PBE3VOOFSͱʁ ಋೖࣗମ͞΄Ͳ͘͠ͳ͘ɺͦͯ͠1)1ͷ֦ுΛඞཁͱ͠ͳ͍ͨΊɺ੍ݶͷ͋ΔڥԼͰಋೖ͕༰қͰ͢ɻࢀর: https://roadrunner.dev/docs/intro-about10
@2020 Torana, Inc.-BSBWFM0DUBOFͱʁ4XPPMFͱʁ 1)1ͰฒߦॲཧɺฒྻॲཧͳͲΛఏڙ͢ΔͨΊͷ 1)1ͷ֦ுͷͭͰ͢ɻ 1)1͔Β'JCFS͕औΓೖΕΒΕ͍ͯ·͕͢'JCFSΑΓ ؆қతʹ༻Ͱ͖ΔϥΠϒϥϦͰ͢ɻ ༻్ͱͯ͠ΞϓϦέʔγϣϯɾαʔόʔʹཹ·Βͣɺ ؆୯ͳεΫϦϓτ͔Βॏ͍ͨόονॲཧͳͲʹ͍͍ͯ·͢ɻࢀর: https://www.swoole.co.uk/article/php-fibers-rfc-vs-swoole-cohttps://www.swoole.co.uk/11
@2020 Torana, Inc.-BSBWFM0DUBOFͱʁ4XPPMFͱʁ (PϥΠΫʹAHP GO Aͱॻ͘ͱɺ4XPPMF୯ମͰඇಉظʹॲཧ͕ՄೳͰ͢ɻ (Pʹ͋Δ8BJU(SPVQ$IBOOFMͳͲඋ͑ΒΕ͓ͯΓɺ-BSBWFM0DUBOF͚ͩͷ༻్ʹཹ·Βͳ͍΄Ͳͷ ϙςϯγϟϧ͕ߴ͍ϥΠϒϥϦͰ͢ɻࢀর: https://www.swoole.co.uk/article/php-fibers-rfc-vs-swoole-cohttps://www.swoole.co.uk/12
Կ͕Ͱ͖Δͷʁ13
@2020 Torana, Inc.-BSBWFM0DUBOFͰԿ͕Ͱ͖Δͷʁ ैདྷͷ/(*/91)1'1.ͷΈ߹Θͤ"[email protected]ͳͲͷΈ߹ΘͤͰͳ͘ɺߴੑೳΞϓϦέʔγϣϯɾαʔόʔΛ͏͜ͱͰɺࠓ·ͰҎ্ʹύϑΥʔϚϯεೳྗͷߴ͍αʔϏεΛ1)1Ͱఏڙ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΓ·͢ɻ ·ͨ3PBE3VOOFSͩͱ-BSBWFM0DUBOFػೳʹେ෯ͳ੍ݶ͕͋Γ·͕͢ɺΞϓϦέʔγϣϯɾαʔόʔͷछྨΛ4XPPMFͱ͢Δ͜ͱͰɺ ࣍ͷϖʔδͷΑ͏ͳԸܙΛڗडͰ͖·͢ɻ ্هͷΑ͏ͳཧ༝͋ΓɺຊτʔΫ-BSBWFM0DUBOFͱ4XPPMFΛத৺ʹ ৄղ͍͖ͯ͠·͢ɻ14
@2020 Torana, Inc.-BSBWFM0DUBOFͰԿ͕Ͱ͖Δͷʁ 4XPPMF͕ఏڙ͍ͯ͠Δαʔόʔ )551 ؚΉαʔόʔ 8FC4PDLFUαʔόʔ 5$16%1αʔόʔ .255αʔόʔ -BSBWFM0DUBOF4XPPMFͷҎԼͷػೳΛ༻͍ͯ͠·͢ )551 ؚΉαʔόʔ15
@2020 Torana, Inc.-BSBWFM0DUBOFͰԿ͕Ͱ͖Δͷʁ ͳ͓MBSBWFMTXPPMFͱ͍͏ϓϩδΣΫτͰ)551αʔόʔҎ֎ʹʜ 8FC4PDLFUαʔόʔ 4XPPMFͷλεΫϫʔΧʔΛ༻͍ͯΩϡʔαʔόʔͷ্࣮هΛ-BSBWFM্Ͱར༻Մೳʹ͍ͯ͠·͢ɻ16
@2020 Torana, Inc.-BSBWFM0DUBOFͰԿ͕Ͱ͖Δͷʁ 0DUBOFDPODVSSFOUMZ ฒߦॲཧΛѻ͏ͨΊͷػೳͰ͢ɻதࣗମ)551ϦΫΤετΛ λεΫαʔόʔͱݺΕΔͷͰॲཧΛͤ͞Δ࣮ʹͳ͍ͬͯ·͢ɻ ෦Ͱ4XPPMFͷDPSPVUJOF༻͞Ε͍ͯ·ͤΜɻ 0DUBOFUJDL Ұఆ࣌ؒޙʹίʔϧόοΫΛ࣮ߦ͢ΔͨΊͷΈΛఏڙ͍ͯ͠·͢ɻ+BWB4DSJQUͰ͍͏ͱ͜ΖͷTFU*OUFSWBMͱಈ࡞͕ࣅ͍ͯ·͢ɻ17
@2020 Torana, Inc.-BSBWFM0DUBOFͰԿ͕Ͱ͖Δͷʁ $BDIFTUPSF PDUBOF ΩϟογϡΛσʔλϕʔε,74Ͱͳ͘ϝϞϦ্ʹஔͨ͘ΊͷͷͰ͢ɻ࣮ࣗମ0DUBOFUBCMFͱେࠩͳ͘4XPPMFa5BCMFΛ༻͍࣮ͯ͞Ε͍ͯ·͢ɻ 0DUBOFUBCMF ϋΠύϑΥʔϚϯεʹϝϞϦ্ʹσʔλΛอ࣋ɾऔಘ͢ΔͨΊͷ ΈΛఏڙ͍ͯ͠·͢ɻ18
ࠓ·ͰͱԿ͕ҧ͏ͷʁ19
ैདྷ20
@2020 Torana, Inc. ϩʔυόϥϯαʔϦόʔεϓϩΩγͳͲΛతͱͯ͠/(*/9ͱͦͷόοΫʹ1)1'1.͕͋Δߏɻࠓ·ͰͱԿ͕ҧ͏ͷ͔ैདྷ21ϦΫΤετϨεϙϯεPHP-FPM ʹྲྀ͢ PHP ͰॲཧϨεϙϯε Ϩεϙϯε
@2020 Torana, Inc.ࠓ·ͰͱԿ͕ҧ͏ͷ͔ैདྷ22 "[email protected]ͷΑ͏ͳΑ͘ݟΒΕΔߏͰ͢ɻ "QBDIFͷखલʹϩʔυόϥϯαʔ͕ډͨΓ͠·͢ɻϦΫΤετ PHP ͰॲཧϨεϙϯεϨεϙϯε
-BSBWFM0DUBOF23
@2020 Torana, Inc.ࠓ·ͰͱԿ͕ҧ͏ͷ͔-BSBWFM0DUBOF24 1)1'1.Λ-BSBWFM0DUBOFʹஔ͖͑Δ͜ͱʹͳΓ·͢ɻ /(*/9ͰGBTUDHJͰͳ͘ϦόʔεϓϩΩγΛ͏͜ͱʹͳΓ·͢ɻϦΫΤετϨεϙϯεϦόʔεϓϩΩγϨεϙϯεPHP ͰॲཧϨεϙϯε
@2020 Torana, Inc.ࠓ·ͰͱԿ͕ҧ͏ͷ͔-BSBWFM0DUBOF25 "QBDIF͕-BSBWFM0DUBOFʹมΘΓ·͢ɻϦΫΤετ PHP ͰॲཧϨεϙϯεϨεϙϯε
ϓϩμΫγϣϯڥ·ͰͷಓͷΓ26
%*ͷରԠ27
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓ%*ͷରԠ -BSBWFM0DUBOFΛ༻͢Δࡍʹҙ͖͢ͷҰͭͱͯ͠ɺ%*ͷରԠ͕ڍ͛ΒΕ·͢ɻ ैདྷͰ͋Εɺଓͷͨͼʹ৽͘͠TJOHMFUPOͷొ͕࣮ߦ͞ΕΔͨΊɺߟྀ͢Δඞཁ͕͋Γ·ͤΜͰͨ͠ɻ ͔͠͠-BSBWFM0DUBOF1)1ࣗମ͕ΠϕϯτϧʔϓͷରͱͳΔͨΊɺຊདྷ1)1ऴྃ࣌ʹಈ࡞͢ΔΑ͏ͳΠϕϯτ͕ ى͜Γ·ͤΜɻ28
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓ%*ͷରԠ ͦͷͨΊϦΫΤετ#͕ϦΫΤετ"ͷมΛࢀরͯ͠͠·͏͜ͱ͕͋Γ͑·͢ɻ29γϯάϧτϯ XϦΫΤετ A Λ͍ͬͯΔ ΠϯελϯεϦΫΤετ AϦΫΤετ BγϯάϧτϯX ΛࢀরγϯάϧτϯX Λࢀর↑ಉ͡γϯάϧτϯΛࢀর↓↑ϦΫΤετ A ͷॲཧ͕ऴྃͯ͠γϯάϧτϯ X Γଓ͚ΔͨΊϦΫΤετ B ͕ϦΫΤετ A ͚ͷγϯάϧτϯ X Λࢀরͯ͠͠·͏
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓ%*ͷରԠ ͜ΕΛ͙ͨΊʹɺ-BSBWFM0DUBOFެ্ࣜͰɺγϯάϧτϯͱͯ͠ొ͠ͳ͍ͨΊɺΠϯελϯεΛৗʹղܾ͢Δํ๏ΛఏҊ͍ͯ͠·͢ɻ ฐࣾͦͦଞϦΫΤετͱڞ௨͍͍ͯ͠ͷҎ֎ɺαʔϏείϯςφΛ΄΅͍ͬͯͳ͍ͷͰɺΘͳ͍Α͏ʹ͢Δͱ͍͏ελϯεͰͳ͍͔ͱࢥ͍·͢ɻ30
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓ%*ͷରԠ31ࢀর: https://laravel.com/docs/8.x/octane ެ্ࣜͰҎԼͷΑ͏ʹॻ͖͢͜ͱΛਪ͍ͯ͠·͢ɻ
Χʔωϧύϥϝʔλͷௐ32
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓΧʔωϧύϥϝʔλͷௐ 1)1͕ΠϕϯτϧʔϓͦͷͷͰ͋ΔͨΊɺ։͘ϑΝΠϧ͕ ඞવͱଟ͘ͳΔͨΊɺVMJNJUTZTDUMͷมߋ͕ඞਢʹͳΓ·͢ɻ IUUQTXJLJTXPPMFDPNPUIFSTZTDUM33
4XPPMFͷઃఆνϡʔχϯά34
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓ4XPPMFͷઃఆνϡʔχϯά 4XPPMFͷઃఆνϡʔχϯά"QBDIF/(*/9Ͱ͖ͯͨ͠Α͏ͳνϡʔχϯά͕ඞཁʹͳΓ·͢ɻ ྫ͑ͭͷϓϩηε͋ͨΓͰ༻Ͱ͖Δίϧʔνϯͷ্ݶͰ͋ͬͨΓɺϦΫΤετͷѹॖ H[JQDPNQSFTTJPOͳͲઃఆ͕ՄೳͰ͢ɻ ಛʹʮԿճϦΫΤετ͕ߦΘΕͨΒϫʔΧʔΛ࠶ىಈ͢Δ͔ʯͱ͍͏ઃఆʢ[email protected]ʣɺϑΝΠϧͷΦʔϓϯϝϞϦ༻ʹӨڹ͢ΔͨΊඞਢͰ͢ɻ35
ϝϞϦϦʔΫରࡦ36
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓϝϞϦϦʔΫରࡦ 1)1͕ৗʹىಈ͍ͯ͠ΔͨΊɺ੩తϑΟʔϧυʹΛ૿͍ͯ͘͠Α͏ͳίʔυ͕͋Δ߹ɺϝϞϦϦʔΫ͕ى͜Γ͑·͢ɻ ྫ͑ҎԼͷΑ͏ͳίʔυͰ͢ɻ37
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓϝϞϦϦʔΫରࡦ ͜ͷΑ͏ͳ߹ANFNPSZ-FBL7BMVFTA͕ແݶʹ૿͍͖͑ͯ·͢ɻ ͦͷͨΊɺͲ͔͜ͷλΠϛϯάͰANFNPSZ-FBL7BMVFTAΛۭʹͯɺղ์͢ΔΑ͏ͳॲཧ͕ඞཁʹͳΓ·͢ɻ ͪΖΜ͜͏͍͏༻్Ҏ֎Ͱى͜ΓಘΔͷͰɺଞݴޠಉ༷ɺৗʹม͕ϝϞϦ͔Βղ์͞ΕΔ͔Ͳ͏͔Λࢥྀ͢Δඞཁ͕͋Γ·͢ɻΕΔͳVOTFUɻ38
ͦͷଞ39
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓͦͷଞ ࣮-BSBWFM0DUBOFͰ[email protected] ˞ͱͳ͍ͬͯΔͨΊ4XPPMFඋ͚͑ͷDPSPVUJOFΛ͏͜ͱ͕Ͱ͖·ͤΜɻ ΘΓʹ0DUBOFDPODVSSFOUMZ͕༻ҙ͞Ε͍ͯ·͢ɻ [email protected]Λ༗ޮʹ͢Δͱɺσʔλϕʔε,74ͳͲͷίωΫγϣϯϦιʔε͕յΕͨΓηογϣϯ͕ଞϦΫΤετͱೖΕସΘΔͳͲ͕ى͜Γ·͢ɻ40ࢀর: https://github.com/laravel/octane/blob/64a1c3c2ac191581dd73b486463e707f56984e6b/src/Commands/StartSwooleCommand.php#L124
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓͦͷଞ YEFCVHຊମ͕ೖΕΒΕͳ͍ ΘΓʹTEFCVHͱ͍͏ͷ͕͋Δ͕BSDIJWFEʹͳ͍ͬͯΔɻͪͳΈʹ1)1ͩͬͨΒಈ͕͘Ҏ্ಈ͔ͳ͍ɻ TXPPMFZBTEͱ͍͏ͷΛೖΕΔඞཁ͕͋Δ ΊͪΌͪ͘Ό͘ͳΔ41
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓͦͷଞ /FXSFMJD"1.͕ೖΕΒΕͳ͍ ೖΕΒΕͳ͍ͱ͍͏ΑΓ4XPPMFͰ΄͔ͬͨ͠ύϑΥʔϚϯε͕ಘΒΕͳ͘ͳΔ %BUBEPH"1.ͳͲಉ༷ɻཁطଘͷؔΛϑοΫ͢ΔΑ͏ͳαʔυύʔςΟͷಋೖ͕͍͠ɻͦͷͨΊɺ ฐࣾ%BUBEPH"HFOUͷΈΛ༻͍ͯ͠·͢ɻ42
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓͦͷଞ /FXSFMJD"1.͕ೖΕΒΕͳ͍ ೦ͳ͕Βฐࣾݹయతͳํ๏ͰɺϘτϧωοΫʹͳ͍ͬͯΔՕॴΛվम͢ΔελΠϧʹͳ͍ͬͯ·͢ɻ TNJDSPUJNF USVFͱ[email protected] NJDSPUJNF USVFTͰғ͏ͭͰ͢ɻ43
@2020 Torana, Inc.ϓϩμΫγϣϯڥ·ͰͷಓͷΓͦͷଞ 4XPPMFWܥͱWܥͰେ෯ͳࠩҟ͕͋Δ WܥͩͱD63-Λ͏ϥΠϒϥϦʢBXTTEL (V[[MFͳͲʣ͕͏·͘ಈ࡞͠·ͤΜɻ ٯʹWͰ1)1Ҏ߱ʢ1)1ؚΉʣͩͱಈ࡞͠·ͤΜɻ1)1ͩͱಈ࡞Λ͢Δͱ͍ͬͨෆ۩߹͕͋Γ·͢ɻ ฐࣾͰ1)1 4XPPMFWܥΛ༻͍ͯ͠·͢ɻ ઌमਖ਼͞Εͯɺ1)1 4XPPMFWܥΛ༻͢ΔΑ͏ʹ͠·ͨ͠ɻ ʢࠓظதʹ1)1Ҡߦ༧ఆʣ44
࣮ࡍʹϓϩμΫγϣϯͰӡ༻ͯ͠Έͯ45
@2020 Torana, Inc.࣮ࡍʹϓϩμΫγϣϯͰӡ༻ͯ͠Έͯ ฐࣾ-BSBWFM0DUBOFͰͳ͘MBSBWFMTXPPMFΛ༻͍ͯ͠·͢ɻʢ։ൃॳɺ-BSBWFM0DUBOFੈʹଘࡏ͍ͯ͠ͳ͔ͬͨͨΊʣ ฐࣾͰMBSBWFMTXPPMFͰίϧʔνϯΛ͑ΔΑ͏ʹɺ.Z42-3FEJTͳͲͷυϥΠόʔΛࣗ࡞͍ͯ͠·͢46 ৄ͘͠IUUQTTQFBLFSEFDLDPNNFNPSZTXPPMFUPMBSBWFMTXPPMFXPZPOHJUBIBJQBIVPNBOTVBQVSJLFTJZPOHPV[IV
@2020 Torana, Inc.࣮ࡍʹϓϩμΫγϣϯͰӡ༻ͯ͠Έͯ ϓϩμΫγϣϯϩʔϯν·Ͱʹ༷ʑͳ͕͋ͬͨ [email protected]Λ༗ޮʹͨͨ͠ΊɺଞͷϢʔβʔͷηογϣϯʹมΘΔʢηϧϑηογϣϯϋΠδϟοΫʣ 5PPNBOZPQFOfiMFT ଘࡏ͍ͯ͠ΔͷʹϑΝΠϧ͕։͚ͳ͍ͷͰA$MBTT999OPUGPVOEA͕ग़Δ47
@2020 Torana, Inc.࣮ࡍʹϓϩμΫγϣϯͰӡ༻ͯ͠Έͯ ϓϩμΫγϣϯϩʔϯν·Ͱʹ༷ʑͳ͕͋ͬͨ ϦΫΤετϘσΟΛૹͬͨͣͳͷʹɺۭʹͳΔ߹ͱͳΒͳ͍߹͕͋ΓɺௐࠪΛ͢ΔͱଞͷϦΫΤετͷϦΫΤετϘσΟΛࢀর͍ͯͨ͠48
@2020 Torana, Inc.࣮ࡍʹϓϩμΫγϣϯͰӡ༻ͯ͠Έͯ ϓϩμΫγϣϯϩʔϯν·Ͱʹ༷ʑͳ͕͋ͬͨ D63-ͰσʔλΛऔಘ͍ͯ͠ΔͱɺଞͷϦΫΤετͰͦͷӨڹΛϞϩʹड͚ͯD63-͕ऴΘΔ·Ͱػঢ়ଶʹͳΔ ฐࣾͰ3FEJTϩάΠϯηογϣϯͱ௨ৗͷΩϟογϡͰECΛ͍ͯ͠Δ͕ɺଞͷϦΫΤετͷECׂΓৼΓͷมΛࢀরͯ͠͠·͏ෆ۩߹͕͋Γɺຊ൪ڥͰͬͪ͝Όʹͳͬͯ͠·ͬͨ49
@2020 Torana, Inc.࣮ࡍʹϓϩμΫγϣϯͰӡ༻ͯ͠Έͯ ݱࡏϩʔϯνޙϲ݄ܦա ฐࣾࣾγεςϜͰ݄ͨΓສϦΫΤετΛड͚͓ͯΓɺͦͷ͏ͪؒճ΄Ͳͷॻ͖ࠐΈ͕ൃੜ͍ͯ͠·͕͢ɺΞϓϦέʔγϣϯఀࢭͳͲτϥϒϧͳ͘ΦϖϨʔγϣϯ͕ճ͍ͬͯ·͢ɻ ͭ·ΓɺϓϩμΫγϣϯͰͳ͑͘Δͱ͍͏͜ͱͰ͢ɻ50
5)"/,:06'03:063-*45&/*/(51
8&"3&)*3*/(52