Share
Embed
15年目のiOSアプリをフルリニューアルする苦しみと次の15年のために今できること / The Struggles of Completely Renewing a 15-Year-Old iOS App and What We Can Do Now for the Next 15 Years
Yahoo!オークションアプリは15年間の運用開発を経て多くの技術負債を抱えていましたが、私達はその解消のためにフルスクラッチでリニューアルを行いました。
リニューアルは大変な苦労が伴いましたが、それ以上にやってよかったと感じることも多くありました。
長く続くサービスの運用で負債や品質に課題を持っている方に向けて、具体的な事例を紹介することで、刷新の検討や長期的なサービス開発について考える機会にします。
LINEヤフーTech (LY Corporation Tech) PRO
July 01, 2025
Transcript
39 slides
-
:BIPP+"1"/"VDUJPO"QQ3FOFXBM :BIPPΦʔΫγϣϯΞϓϦͷϦχϡʔΞϧ #BDLHSPVOEPGUIF3FOFXBM ϦχϡʔΞϧͷഎܠ 3FOFXBM1SPKFDU0WFSWJFX ϦχϡʔΞϧϓϩδΣΫτ
5FDIOPMPHZ#FIJOEUIF/FXJ04"QQ ৽ΞϓϦͷٕज़ 3FTVMUTPGUIF3FOFXBM1SPKFDU ϓϩδΣΫτΛऴ͑ͯ -PPLJOH"IFBEUPUIF/FYU:FBST ࣍ͷʹ͚ͯ "HFOEB ΞδΣϯμ -
#FGPSFUIF"QQ3FOFXBM ϦχϡʔΞϧલͷ։ൃঢ়گ "TBSFTVMUPGQSJPSJUJ[JOHGFBUVSFEFWFMPQNFOU UPHSPXUIFTFSWJDF XFFOEFE VQUBLJOHPOBHSFBUEFBMPGUFDIOJDBMEFCU αʔϏεͷͷͨΊʹػೳ։ൃΛ༏ઌͨ݁͠Ռɺେͳٕज़ෛ࠴Λ๊͑Δ͜ͱʹͳͬͨɻ 8FGPDVTFEPOGFBUVSFEFWFMPQNFOUUPESJWFTFSWJDFHSPXUI αʔϏεͷͷͨΊʹػೳ։ൃΛ༏ઌ͍ͯͨ͠ɻ 8FXFSFOPUBCMFUP
BMMPDBUFFOPVHIUJNFGPSSFGBDUPSJOH ϦϑΝΫλϦϯάͷ࡞ۀʹ͔͚Δ͕࣌ؒेʹͱΕͳ͔ͬͨɻ 5IFHSPXJOHUFDIOJDBMEFCUCFDBNFVONBOBHFBCMF NBLJOHSFGBDUPSJOHFWFONPSFEJGGJDVMU ٕज़ෛ࠴͕େʹͳΓɺฦࡁ͖͠Εͳ͘ͳͬͨɻ -
,FZ5FDIOJDBM%FCU ओͳٕज़ෛ࠴ ⎯ *ODPOTJTUFOU BSDIJUFDUVSF ΞʔΩςΫνϟͷࠞࡏ ⎯ (SPXJOH044.BJOUFOBODF$PTUT 044ӡ༻ίετͷ૿େ ⎯
-FHBDZ-BOHVBHF%FQFOEFODJFT ϨΨγʔݴޠͷଘࡏ -
*ODPOTJTUFOU "SDIJUFDUVSF ΞʔΩςΫνϟͷࠞࡏ 'PMMPXJOHBSDIJUFDUVSBMUSFOETPWFSUIFZFBSTMFEUPBOJODPOTJTUFOU BSDIJUFDUVSF XIJDIJODSFBTFEUIFNBJOUFOBODFCVSEFO ྲྀߦΓͷΞʔΩςΫνϟΛબͼଓ͚ͨ݁ՌɺෳͷΞʔΩςΫνϟ͕ࠞࡏͯ͠ෛ୲͕૿Ճͨ͠ɻ *ODPOTJTUFOUBSDIJUFDUVSFDBVTFE
⎯ )JHIFSPOCPBSEJOHDPTU ֶशίετͷ૿Ճ ⎯ -PXFSDPEFSFBEBCJMJUZ ՄಡੑͷԼ ⎯ .PSFJNQMFNFOUBUJPOFSSPST ࣮ϛεͷ૿Ճ .7$ .77. 3Y4XJGU .71 .77. 4XJGU6* -
4USPOHBQQEFQFOEFODZNFBOUXFIBEUPIBOEMF NBJOUFOBODFPVSTFMWFT ΞϓϦͷ࣮ͱਂ݁͘ͼ͍͍ͭͯΔͨΊɺಠࣗͰӡ༻ͤ͟ΔΛಘͳ͔ͬͨɻ VQUPEBUF 6ONBJOUBJOFEPSIBSEUPVQEBUF044NBEFDPOUJOVPVTJNQSPWFNFOUEJGGJDVMU ϝϯςφϯε͕͞Εͳ͍044มߋͷै͕͍͠044Λ͍ଓ͚ͨ݁Ռɺܧଓతͳվળ͕ࠔʹͳͬͨɻ (SPXJOH044.BJOUFOBODF$PTUT 044ӡ༻ίετͷ૿େ VONBJOUBJOFE
IBSEUPVQEBUF 044 0446TBHFJOUIF1SFWJPVT"QQ .JTTFEPVUPOOFXGFBUVSFTBOEQFSGPSNBODFJNQSPWFNFOUT EVFUPBWPJEBODFPGNBKPSVQEBUFT େ͖ͳมߋΛ͏ߋ৽Λආ͚ͨ݁Ռɺ৽ػೳύϑΥʔϚϯεվળͷԸܙΛड ͚ΒΕͳ͘ͳͬͨɻ -
-FHBDZ-BOHVBHF%FQFOEFODJFT ϨΨγʔݴޠͷଘࡏ 4XJGU 0CKFDUJWF$ 1SPHSBNNJOH-BOHVBHF%JTUSJCVUJPO JOUIF1SFWJPVT"QQ "CPVUPOFUIJSEPGUIFBQQXBTXSJUUFOJO0CKFDUJWF$ XIJDINBEF NBJOUFOBODFNPSFEJGGJDVMU ΞϓϦͷίʔυͷͷ͕0CKFDUJWF$Ͱॻ͔Ε͓ͯΓɺอकͷ͠͞ʹͭͳ͕͍ͬͯͨɻ
.PSFCVSEFOGPS4XJGUPOMZEFWFMPQFST 4XJGU͔͑͠ͳ͍։ൃऀʹͱͬͯෛ୲ʹͳͬͨɻ -
$BVTFE1SPCMFNT Ҿ͖ى͜͞Εͨ "DDVNVMBUFEUFDIOJDBMEFCUMFEUPNBOZBEEJUJPOBMQSPCMFNT ੵΈॏͳٕͬͨज़ෛ࠴ଟ͘ͷΛҾ͖ىͨ͜͠ɻ ⎯ *ODSFBTFE%FWFMPQNFOU%JGGJDVMUZ ։ൃқͷ্ঢ ⎯ 4MPXFS3FMFBTF$ZDMF ϦϦʔεසͷݮগ
⎯ %FDMJOJOH&OHJOFFS.PUJWBUJPO ΤϯδχΞͷϞνϕʔγϣϯԼ -
1SPKFDU5FBNT ։ൃମ੍ 5FBN .FNCFST 3FTQPOTJCJMJUJFT 1MBOOJOH %FUFSNJOJOHTQFDJGJDBUJPOT DSFBUJOHTQFDJGJDBUJPOEPDVNFOUT %FTJHO
$SFBUJOHBQQEFTJHO J04 J04BQQEFWFMPQNFOU "OESPJE "OESPJEBQQEFWFMPQNFOU #'' $SFBUJOHBMM"1*TVTFECZJ04BOE"OESPJEBQQT 'JWFTQFDJBMJ[FEUFBNTXPSLFEUPHFUIFSUPEFWFMPQJ04BOE"OESPJE BQQT ͭͷઐνʔϜ͕࿈ܞ͠ɺJ04ɾ"OESPJEͷ྆04ͷΞϓϦΛ։ൃͨ͠ɻ -
5JNFMJOF λΠϜϥΠϯ "QS 4FQ 0DU .BS "QS4FQ
1IBTF 1IBTF J043FMFBTF "OESPJE3FMFBTF 1IBTF 8FFYQFSJFODFEUISFFQIBTFTEVSJOHPVSNPOUIQSPKFDU ͷ։ൃظؒͭͷϑΣʔζʹ͔Εͨɻ -
'FBUVSF%FWFMPQNFOU"QQSPBDI ػೳ։ൃͷਐΊํ )PNF *UFN%FUBJM 4FBSDI .Z1BHF &YIJCJU "QSJM +VMZ "VHVTU
4FQUFNCFS 0DUPCFS /PWFNCFS $PODFOUSBUFEEFWFMPQNFOUQFSJPEGPSSFWJFX 3FWJFX%BUF "QS 4FQ 0DU .BS "QS4FQ 1IBTF 8FEFWFMPQFETFWFSBMGFBUVSFTTJNVMUBOFPVTMZBOEDPOEVDUFESFHVMBSSFWJFX DZDMFT ෳͷػೳΛฒߦ࣮ͯ͠͠ɺఆظతʹ֤ػೳͷϨϏϡʔΛͨ͠ɻ -
'FBUVSF%FWFMPQNFOU$ZDMF0VUDPNFT ػೳ։ൃαΠΫϧͷ݁Ռ Advantages Disadvantages %FWFMPQNFOUNPUJWBUJPOJODSFBTFEJOQSFQBSBUJPOGPS SFWJFXT ϨϏϡʔʹ͚ͯ։ൃͷϞνϕʔγϣϯ͕ߴ·ͬͨɻ %FWFMPQJOHGFBUVSFTXJUINPDLTXIJMFTQFDT"1*TXFSF
TUJMMJODPNQMFUFMFEUPTJHOJGJDBOUBNPVOUPG UFDIOJDBM EFCU ༷"1*ະͷ··ϞοΫΛͬͯػೳΛ࡞ͬͨͨΊɺଟ͘ͷෛ࠴ ͕ͬͨɻ 6ODMFBSQSPKFDUQSPHSFTTNBEFJUJNQPTTJCMFUPTFUUIF SFMFBTFTDIFEVMF ϓϩδΣΫτશମͷਐ͕ෆ໌ྎʹͳΓɺϦϦʔεεέδϡʔϧͷݟ ௨ཱ͕ͨ͠ͳ͘ͳͬͨɻ 8IJMFJUJODSFBTFEEFWFMPQNFOUNPUJWBUJPO JUBMTPBDDVNVMBUFEUFDIOJDBM EFCUBOENBEFUIFSFNBJOJOHXPSLFGGPSUVODMFBS ։ൃͷϞνϕʔγϣϯΛߴΊͨҰํͰɺٕज़ෛ࠴͕૿͑Γͷෆ໌ྎʹͳͬͨɻ -
%FWFMPQNFOU1BVTFGPS#VH#BTI όάग़͠ͷ࣮ࢪ 1MBOOFE "DUVBM 0DUPCFS /PWFNCFS %FDFNCFS +BOVBSZ 'FCSVBSZ .BSDI
"QSJM 5FTU %FWFMPQNFOU 1BVTF %FWFMPQNFOU #VH'JYFT #VHT %VFUPVODMFBSQSPKFDUQSPHSFTT XFQBVTFEEFWFMPQNFOUGPSBUFBNXJEF CVHCBTI UIFOQSPDFFEFEXJUIGJYJOHUIFJEFOUJGJFEJTTVFT ϓϩδΣΫτͷਐ͕ෆ໌ྎʹͳͬͨͨΊɺ։ൃΛࢭΊͯશϝϯόʔͰόάະ࣮ͷՕॴΛચ͍ग़͠ɺमਖ਼Λߦͬͨɻ "QS 4FQ 0DU .BS "QS4FQ 1IBTF #VH #BTI -
-PHHJOH*NQMFNFOUBUJPO /POGVODUJPOBM*NQMFNFOUBUJPO $PEF3FGBDUPSJOH 5FTU .BZ +VOF +VMZ "VHVTU 4FQUFNCFS "GUFSCVHGJYFT
XFDPOUJOVFEEFWFMPQNFOUBOEUFTUJOHUPSFGJOFUIFBQQGPS SFMFBTF όάमਖ਼ޙɺϦϦʔεʹ͚ͯ։ൃͱςετΛॏͶͯΞϓϦΛຏ͖ࠐΜͩɻ "QQ3FGJOFNFOU ΞϓϦͷຏ͖ࠐΈ 3FMFBTF "QS 4FQ 0DU .BS "QS4FQ 1IBTF -
5FDIOPMPHZ4FMFDUJPO ٕज़બఆ ,FZ*TTVFTPGUIFQSFWJPVTBQQ 4FMFDUFE5FDIOPMPHJFT *ODPOTJTUFOU"SDIJUFDUVSF ΞʔΩςΫνϟͷࠞࡏ 6OJGJFE"SDIJUFDUVSF ౷Ұ͞ΕͨΞʔΩςΫνϟ (SPXJOH044.BJOUFOBODF$PTUT 044ӡ༻ίετͷ૿େ
$BSFGVMMZ4FMFDUFE044 ݫબͨ͠044ͷ࠾༻ -FHBDZ-BOHVBHF%FQFOEFODJFT ϨΨγʔݴޠͷଘࡏ .PEFSO-BOHVBHF ࠷৽ͷݴޠ౷Ұ 8FBEPQUFEUFDIOPMPHJFTUIBUDPVMESFTPMWFUIFJTTVFTPGUIFQSFWJPVTBQQ چΞϓϦͷ՝ΛղফͰ͖Δٕज़Λ࠾༻ͨ͠ɻ -
6OJGJFE"SDIJUFDUVSF ౷Ұ͞ΕͨΞʔΩςΫνϟ 6OJGJFEBSDIJUFDUVSFFOBCMFEDPOGJEFOUEFWFMPQNFOUGPSBMM ΞʔΩςΫνϟͷ౷ҰʹΑͬͯɺ୭͕҆৺ͯ͠։ൃͰ͖ΔڥΛ࣮ݱͨ͠ɻ 8FBEPQUFEBTJNQMF.77.BSDIJUFDUVSFVTJOH4XJGU6* BDSPTTBMMTDSFFOT શը໘ʹ͓͍ͯɺ4XJGU6*Λͬͨγϯϓϧͳ.77.ΞʔΩςΫνϟΛ࠾༻ͨ͠ɻ ⎯ /FXNFNCFSTDBORVJDLMZDBUDIVQBOEPOCPBSETNPPUIMZ ৽نϝϯόʔͷΩϟονΞοϓ্͕
⎯ "OZNFNCFSTDBOJNQMFNFOUBMMTDSFFOTDPOGJEFOUMZ ୭͕໎͏͜ͱͳ͘Ͳͷը໘Ͱ࣮Մೳ -
1SFWJPVT"QQ /FX"QQ 6*69 /FUXPSL
"SDIJUFDUVSF 0UIFS $BSFGVMMZ4FMFDUFE044 ݫબͨ͠044ͷ࠾༻ 044$PVOUBOE$BUFHPSZ$IBOHFT 8FMJNJUFEPVS044BEPQUJPOUPMJCSBSJFTJOUIFOFXBQQ EFDSFBTJOHUIF OVNCFSPG6*69BOEOFUXPSLJOHMJCSBSJFTGSPNUIFQSFWJPVTBQQ ৽ΞϓϦͰ044ΛछྨͷΈΛ࠾༻ͨ͠ɻچΞϓϦʹൺɺ6*69ͱ௨৴ͷ044͕ݮগͨ͠ɻ 6*69 6TFE044POMZGPSIBSEUPJNQMFNFOUGFBUVSFT ࣗ࡞͕͍͠ػೳΛ࣋ͭ044ͷΈ࠾༻ /FUXPSL 6OJGJFENVMUJQMF044VTFEGPSUIFTBNFQVSQPTF ಉ͡༻్Ͱ࠾༻͞Ε͍ͯͨෳͷ044Λͭʹ౷Ұ -
.PEFSO-BOHVBHF ࠷৽ͷݴޠ౷Ұ -BOHVBHF%JTUSJCVUJPO$IBOHFT 1SFWJPVT"QQ 4XJGU 0CKFDUJWF$ /FX"QQ 4XJGU 6OMJLFUIFQSFWJPVTBQQUIBUVTFE0CKFDUJWF$ XFJNQMFNFOUFEUIFOFXBQQ
FOUJSFMZJO4XJGU چΞϓϦͰΘΕ͍ͯͨ0CKFDUJWF$Θͣɺͯ͢4XJGUͰ࣮ͨ͠ɻ -
"EEJUJPOBM#FOFGJUT ٕज़ෛ࠴ͷฦࡁҎ֎ͷԸܙ ⎯ 4UBOEBSEJ[FE%FTJHO(VJEFMJOFT ౷Ұ͞ΕͨσβΠϯఆٛͷಋೖ ⎯ &OIBODFE6OJU5FTUJOH$PWFSBHF Ϣχοτςετͷॆ࣮ ⎯ "EPQUJPOPG/FX5FDIOPMPHJFT
৽ٕज़ͷಋೖ 5IFSFOFXBMHBWFVTBHSFBUDIBODFUPNBLFPVSEFWFMPQNFOUFOWJSPONFOU CFUUFS ϦχϡʔΞϧΛػʹΑΓྑ͍։ൃڥΛ࣮ݱͨ͠ɻ -
Text(“Hello, world!”) .font(.displayLarge) .foregroundStyle(.primary) 4UBOEBSEJ[FE%FTJHO(VJEFMJOFT $PMPS ౷Ұ͞ΕͨσβΠϯఆٛͷಋೖ 1SJNBSZ 4FDPOEBSZ 5ZQPHSBQIZ
%JTQMBZ-BSHF QY %JTQMBZ4NBMM QY %JTQMBZ.FEJVN QY BOENPSF *OUFHSBUJOHUIFEFTJHOTZTUFNJOUPUIFDPEFFOBCMFEIJHIMZNBJOUBJOBCMFBOE FGGJDJFOU6*DPNQPOFOUT σβΠϯγεςϜΛίʔυʹΈࠐΉ͜ͱͰɺมߋʹڧ͘։ൃޮͷߴ͍6*ίϯϙʔωϯτΛ࣮ݱͨ͠ɻ BOENPSF %FTJHO4ZTUFN &BTJMZBEBQUBCMFUPEFTJHOTZTUFNDIBOHFT σβΠϯγεςϜͷมߋʹैͰ͖Δ࣮Λ࣮ݱ -
&OIBODFE6OJU5FTUJOH$PWFSBHF Ϣχοτςετͷॆ࣮ @Suite("Verify bid button display logic") struct shouldShowBidButton {
@Test("Should display bid button when user is not the seller") func shouldShowBidButton_for_notSeller() { vm.item.isSeller = false #expect(vm.shouldShowBidButton) } @Test("Should hide bid button when user is the seller") func shouldShowBidButton_for_seller() { vm.item.isSeller = true #expect(!vm.shouldShowBidButton) } } .BJOUBJOBCJMJUZJNQSPWFECZEPDVNFOUJOHTQFDJGJDBUJPOTJOUFTUDPEF ༷Λςετίʔυʹ໌ه͢Δ͜ͱͰอकੑ্͕ͨ͠ɻ Ϣʔβʔ͕ग़ऀͰͳ͍ͱ͖ೖࡳϘλϯΛදࣔ͢Δ Ϣʔβʔ͕ग़ऀͷͱ͖ೖࡳϘλϯΛදࣔ͠ͳ͍ -
"EPQUJPOPG/FX5FDIOPMPHJFT ৽ٕज़ͷಋೖ 8FDPVMEBEPQUOFXUFDIOPMPHJFTXJUIPVUNJHSBUJPO ϦχϡʔΞϧΛػʹɺҠߦ࡞ۀͳ͠Ͱ࠷৽ͷٕज़ΛಋೖͰ͖ͨɻ "CMFUPBEPQUOFXUFDIOPMPHJFTRVJDLMZBOEFBTJMZ ࣮ʹઐ೦Ͱ͖ɺ࣌ؒͰରԠΛऴ͑Δ͜ͱ͕Ͱ͖Δɻ ⎯ %PFTOPUSFRVJSFQSJPSJUJ[BUJPOUSBEFPGGTXJUIPOHPJOHGFBUVSFEFWFMPQNFOU ػೳ։ൃͱͷ༏ઌௐͳͲͷ࣮Ҏ֎ͷෛ୲͕ͳ͍ɻ ⎯
&MJNJOBUFTDPODFSOTBCPVUJNQBDUJOHFYJTUJOHSFMFBTFEGFBUVSFT ϦϦʔεࡁΈͷطଘػೳͷӨڹΛߟྀ͢Δඞཁ͕ͳ͍ɻ 6OMJLFNJHSBUJPO BEPQUJOHOFXUFDIOPMPHJFTEVSJOHBSFOFXBM ϦχϡʔΞϧ࣌ͷ৽ٕज़ಋೖҠߦ࡞ۀͱҟͳΓɺ -
$IBOHFTJO%FWFMPQNFOU.FUSJDT ։ൃʹ·ͭΘΔࣈͷมԽ 1SFWJPVT"QQ /FX"QQ -JOFTPG$PEF MJOFT MJOFT #VJME5JNF
NJOVUFT NJOVUFT "QQ4J[F .# .# $SBTI3BUF %FWFMPQNFOUFGGJDJFODZBOEBQQRVBMJUZTJHOJGJDBOUMZJNQSPWFE ։ൃޮΞϓϦͷ࣭͕େ্͖ͨ͘͠ɻ -
$IBOHFTJO%FWFMPQFS.PUJWBUJPO ։ൃऀͷϞνϕʔγϣϯͷมԽ ⎯ 5IFVTFPGNPEFSOUFDIOPMPHJFTNBEFEFWFMPQNFOUFGGJDJFOUBOEFOKPZBCMF ࠷৽ͷٕज़Λͬͯޮతʹ։ൃ͕Ͱ͖ΔͨΊɺ։ൃָ͕͘͠ͳͬͨɻ ⎯ 5IFNPOUIQSPKFDUFOIBODFEUFDIOJDBMTLJMMTBOECVJMUDPOGJEFODF ͷϓϩδΣΫτΛ௨ٕͯ͠ज़ྗ্͕͕Γࣗ৴͕͍ͭͨɻ ⎯ 8FEFWFMPQFEBTFOTFPGPXOFSTIJQBOEBUUBDINFOUUPUIFBQQXFDSFBUFE
ࣗୡͰ࡞ͬͨΞϓϦͱͯ͠ѪணΛ࣋ͯΔΑ͏ʹͳͬͨɻ ⎯ 8FHBJOFEJOJUJBUJWFUPQSPBDUJWFMZQSPQPTFOFXGFBUVSFT ΤϯδχΞ͔Β৽ػೳΛఏҊ͢ΔΑ͏ͳओମੑΛ࣋ͯΔΑ͏ʹͳͬͨɻ %FWFMPQFSNPUJWBUJPOJNQSPWFE MFBEJOHUPBNPSFQPTJUJWFBOEQSPBDUJWF BUUJUVEFUPXBSEEFWFMPQNFOU ։ൃऀͷϞνϕʔγϣϯ্͕͠ɺΑΓલ͖ͳ࢟Ͱ։ൃʹऔΓΉΑ͏ʹͳͬͨɻ -
1SF3FOFXBM "U-BVODI .POUIT .POUIT
"QQ4UPSF3BUJOH5SFOET 6TFS'FFECBDL Ϣʔβʔ͔ΒͷධՁ *NDPOGVTFECZUIFTVEEFODIBOHFJOUIFBQQ *NIBQQZXJUINZTIPQQJOH *UTWFSZVTFSGSJFOEMZ BOEDPOWFOJFOU *OJUJBMOFHBUJWFSFDFQUJPOHSBEVBMMZTIJGUFEUPQPTJUJWFGFFECBDL ϦχϡʔΞϧޙωΨςΟϒͳҙݟ͕ଟ͔͕ͬͨɺঃʑʹϙδςΟϒͳҙݟ͕૿͑ͨɻ -
-PPLJOH"IFBEUIF/FYU:FBST ⎯ $POUJOVPVTMZLFFQVQXJUIUIFMBUFTUUFDIOPMPHJFT ࠷৽ͷٕज़ΛΩϟονΞοϓ͠ଓ͚Δɻ ⎯ *NQMFNFOUGFBUVSFTJOIPVTFXIFOQPTTJCMF SBUIFSUIBOPWFSSFMZJOHPODPOWFOJFOU044 ศརͳ044ʹཔΓ͗ͣࣗ͢࡞Ͱ͖Δͷࣗ࡞͢Δɻ ⎯ $POUJOVFXSJUJOHTJNQMFBOEIJHIRVBMJUZDPEF
؆ܿͰ࣭ͷߴ͍ίʔυΛॻ͖ଓ͚Δɻ ⎯ $POUJOVPVTMZSFEVDFUFDIOJDBMEFCUUPFOTVSFBDPNGPSUBCMFEFWFMPQNFOUFYQFSJFODF ܧଓٕͯ͠ज़ෛ࠴ΛݮΒ͠ɺؾ࣋ͪΑ͘ίʔυΛॻ͚Δঢ়ଶΛอͭɻ ⎯ %PDVNFOUTQFDJGJDBUJPOTGPSGVUVSFSFGFSFODF ༷ΛυΩϡϝϯτͱͯ͢͠ɻ ࣍ͷʹ͚ͯ 4VDDFTTPWFSUIFOFYUZFBSTEFQFOETPOPVSDPOTJTUFOUEBJMZFGGPSUT ࠓޙؒͷɺʑܧଓͯ͠ྗͰ͖Δ͔Ͳ͏͔ʹ͔͔͍ͬͯΔɻ -
(SBUJUVEFUP&WFSZPOF8IP$POUSJCVUFEUP :BIPP+"1"/"VDUJPO 0WFSUIFQBTUZFBST XFIBWFCFFOBCMFUPDPOUJOVBMMZQSPWJEFWBMVBCMFTFSWJDFTUPPVSVTFSTEVFUP UIFFGGPSUTPGFWFSZPOFXIPDPOUSJCVUFE BOEUIFMPOHTUBOEJOHQSFTFODFPGUIFCFMPWFEQSFWJPVTBQQ 8FXJMMDPOUJOVFUPNPWFGPSXBSEXJUIEFFQBQQSFDJBUJPOGPSBMMPGZPV8FTJODFSFMZBTLGPSZPVS DPOUJOVFETVQQPSUBTXFFOUFSUIJTOFXTUBHF ͜Ε·Ͱͷؒɺࢲ͕ͨͪϢʔβʔͷօ༷ʹՁ͋ΔαʔϏεΛఏڙ͠ଓ͚Δ͜ͱ͕Ͱ͖ͨͷɺͻͱ͑ʹαʔϏεͷൃలʹߩݙ͞Εͨօ༷ͷྗͱɺ Ѫ͞Ε͖ͯͨچΞϓϦͷଘࡏ͕͔͋ͬͨΒͦ͜Ͱ͢ɻ
ײँͷؾ࣋ͪΛΕͣʹɺ͜Ε͔ΒาΜͰ·͍Γ·͢ɻࠓޙͱมΘΒ͵͝ѪސΛ৺ΑΓ͓ئ͍ਃ্͛͠·͢ɻ Thank you to everyone who has been part of this journey! αʔϏεͷൃలʹߩݙ͞Εͨօ༷ͷײँ -
:VLJ5BLFEB +VNQFJ,PXBTIJ 5IBOL:PV ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 5IFGBUFPGPVSXBUDI04 BOEUW04BQQ XBUDI04ΞϓϦͱUW04ΞϓϦͷ࿏ 3FMFBTF%BZ*ODJEFOU3FTQPOTF1MBO ϦϦʔε࣌ͷোରԠܭը "QQSPBDIFTUPNJHSBUJOHGSPNUIFQSFWJPVTBQQ
چΞϓϦ͔ΒͷϚΠάϨʔγϣϯͷ 4USVHHMFTXJUIUFYUCBTFEDPNNVOJDBUJPO ςΩετϕʔεͷίϛϡχέʔγϣϯͷ͠͞ 8FIBWFNPSFTUPSJFTUPTIBSF TPQMFBTFKPJOVTBU"TLUIF4QFBLFS ଞʹհ͍ͨ͠Τϐιʔυ͕ͨ͘͞Μ͋ΔͷͰɺͥͻ"TLUIF4QFBLFS͓ӽ͍ͩ͘͠͞ʂ