ããã«ã¡ã¯ãmedibaã®ãšã³ãžãã¢ã«ã«ãã¹ã§ãïŒ æãæå·(crypto)ã«åŒ·ãé¢å¿ããã£ãã«ãããããããæå·é貚ã«ã¯ããŸãèå³ãæãŠãŸãããBitcoinã¯å§ãŸã£ãããã«å°ãæ¡æããŠããŸãããã倧ããéã¯çšŒãããŠã©ã¬ããã®ãã°ã€ã³æ¹æ³ãèŠããŠããŸããã å°ãçæŽ»åŽé¢ã®å
šãŠãèšè£
åãããçµæžã«ç§»è¡ããããšã«å¯ŸããçŸä»£ã®è奮ã«ã¯å
±æã§ããŸããã å³å¯ã«èšãã°ãæè¡çãªã¬ãã«ã ãšãç§ã¯ãŸã ä¿¡è
ã«ãªããŠããŸããã ããã§ãçŸåšweb3ã«ã€ããŠæ³šç®ãã¹ãç¹ããµãŸããäžã§ãããã€ãã®ç¹ã培åºçã«å匷ããŠãèŠéããŠããããšãããã確èªããããšã«ããŸããã Web 1.0ãš2.0ã«ã€ããŠã®æèŠ web3ã¯ããææ§ãªçšèªã§ãããweb3ã®éå¿ãå³å¯ã«è©äŸ¡ããããšã¯å°é£ã§ãããäžè¬çãªçè«ã§ã¯ã以äžã«ãªããŸãã web1:忣å web2:ãã¹ãŠããã©ãããã©ãŒã ã«éäžå web3:ãã¹ãŠãåã³åæ£å web3ã¯web2ã®è±ãããæäŸãã€ã€ã忣åãããŠããŸãã ãŸãã¯ãéäžåãã©ãããã©ãŒã ãäœæ
ç»å Žããçç±ãããçšåºŠæç¢ºã«ããã»ããããã§ããããç§ã®èãã§ã¯ã説æã¯éåžžã«ç°¡åã§ã! 誰ãèªåã®ãµãŒããŒã管çããããªãããæ±ºããŠããŸãã web1ã®åæã¯ããããäžã®å
šãŠã®äººãã³ã³ãã³ãã®çºè¡è
ã§ãããšåæã«æ¶è²»è
ã§ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã®çºè¡è
ãšæ¶è²»è
ã§ããããšããããšã§ããã çããå人ãµãŒããŒã®äžã«å人ãŠã§ãããŒãžããã¹ãããå人ã®ã¡ã¢ãã®ããã®å人ã®ã¡ãŒã«ãµãŒããŒãçšæããå人ã®ã¹ããŒã¿ã¹ã¡ãã»ãŒãžçšã®å人ã®ãã£ã³ã¬ãŒãµãŒããŒãããããã«ããŸãã ãããã匷調ããŠãããããããšã¯ãªãã ãããšæããŸãããäžè¬ãŠãŒã¶ãŒããããæãã§ããããšã§ã¯ãªãã§ããããäžè¬ãŠãŒã¶ãŒã¯èªåã®ãµãŒããŒã管çããããªãããããã¯ãªã¿ã¯ã§ãããããªãããšã§ãããœãããŠã§ã¢ãéçºããŠããçµç¹ã§ãããçŸæç¹ã§ã¯ãµãŒããŒã管çããããªãã§ããç§ãã¡ããã®äžçã«ã€ããŠåŠãã ããšã1ã€æãããšããããããã¯äººéããµãŒããŒã管çããããªããšããããšã§ãã ã ããã代ããã«ãã®ãµãŒãã¹ãæäŸããŠãããäŒç€Ÿã¯æåããŸããããããŠããããã®ãããã¯ãŒã¯ã®äžã®å¯èœã§ããããšãæ¡åŒµããŠæ°ããæ©èœãã€ãã¬ãŒã·ã§ã³(â»ïŒ)ããäŒç€Ÿã¯ããã«æåããŸããã ãããã³ã«ã¯ãã©ãããã©ãŒã ãããã¯ããã«ãã£ãããšç§»åããŸã 30幎以äžçµã£ãŠããé»åã¡ãŒã«ã¯ãŸã æå·åãããŠããŸãããäžæ¹ãWhatsAppã¯1å¹Žã§æå·åãããŠããªãç¶æ
ããå®å
šãªe2eeã«ç§»è¡ããŸããã æªã ã«IRCãä»ããŠãããªã確å®ã«å
±æããããšãæšæºåããããšããŠããŸãããäžæ¹ãSlackã§ã¯ããŠãŒã¶ãŒã®è¡šæ
ã«åºã¥ããŠã«ã¹ã¿ã ã®ãªã¢ã¯ã·ã§ã³çµµæåãäœæã§ããŸãã ããã¯è³é調éã®åé¡ã§ã¯ãªããäœããå®å
šã«åæ£åãããŠãããšã倿Žãéåžžã«é£ãããªããæã®æµãã®äžã§åãæ®ããããŸãŸã«ãªãããšããããããŸããããã¯ãã¯ãããžãŒã®åé¡ã§ããããšã³ã·ã¹ãã ã®åããéåžžã«éããŠåžžã«äžŠèµ°ããŠããªããã°çœ®ããŠããããŸããèšå€§ãªæ°ã®äººã
ã®ã°ã«ãŒããç·šæããŠæ©ãç§»åã§ããããã«ããæ¹æ³ãèŠã€ããããšãéåžžã«éèŠã§ãããããã¢ãžã£ã€ã«ã®ãããªæ¹æ³è«ã®å®çŸ©ãšæ¹åã«çŠç¹ãåœãŠãäžŠè¡æ¥çå
šäœãååšããã®ã§ãããã ãã¯ãããžãŒèªäœãåããããåæ»ãå©é·ãããšãªããšå€§åé¡ã§ããæåã®ç¢ºå®ãªç§èš£ã¯ãæéã«è¿œãããŠãã90幎代ã®ãããã³ã«ãæ¡çšãããããéäžåããŠãè¿
éã«å埩ããããšã ãšèããããŸãã ããããweb3ã®æå³ã¯éããšããã«ããã®ã§ããã®ããšã確èªããŠã¿ãŸããããæè¡ã®æããã€ããã§å°æ¥ãã©ããªãããããããçè§£ããããã«ããã€ãã®dAppãå©çšããŠNFTãäœæããããšã«ããŸãããïŒä»åŸèªåã§äœæãããã¿ãããšæããŸãã…ïŒ åæ£åã¢ããªã±ãŒã·ã§ã³(dApp)ã䜿ã£ãŠã¿ãŸãã web3ãæãåãããã« AutonomousArt ãšããdAppã䜿ã£ãŠã¿ãŸãããããã«ãããNFTã«èŠèŠçãªè²¢ç®ããããšã§ã誰ã§ãNFTã®ããŒã¯ã³ãçºè¡ã§ããŸããèŠèŠçãªè²¢ç®ãããããã®ã³ã¹ãã¯æéã®çµéãšãšãã«å¢å ããè²¢ç®è
ããã³ãã®ããã«æ¯æãè³éã¯ä»¥åã®ãã¹ãŠã®è²¢ç®è
ã«åé
ãããŸãïŒãã®è²¡åæ§é ã¯ãã©ãããåã«äŒŒããã®ã«ãªããŸãïŒã ãããŠãåè³ç£ã远跡ããéèããªããã£ãã®ããã«ãåè³ç£ã远跡ããNFTããªããã£ããäœæãçºèŠã亀æãããŠããã FirstDerivative ãšããdAppã䜿ã£ãŠã¿ãŸããã ã©ã¡ããdAppã®ä»çµã¿ãæããããŠãããŸãããæ£çŽã«ãããšãã¢ããªèªäœã«ã€ããŠç¹ã«ã忣ããããŠãããã®ã¯ãããŸããã§ãããã¢ããªã¯éåžžã®Reactã®ãŠã§ããµã€ã… ãã®ã忣æ§ããšã¯ãã¹ããŒããšãã®ã¹ããŒããæŽæ°ããããã®ããžãã¯/æš©éãååšããå Žæã«ãªããŸãããã®å Žæã¯ãéäžåãããŒã¿ããŒã¹ã§ã¯ãªãããããã¯ãã§ãŒã³ã®äžã§ãã ç§ããã€ããããããšæã£ãŠããã®ã¯ãã¯ã©ã€ã¢ã³ã/ãµãŒããŒã®ã€ã³ã¿ãŒãã§ã€ã¹ãžã®æ³šæã®æ¬ åŠã§ãã誰ãããããã¯ãã§ãŒã³ã«ã€ããŠè©±ããšãã«ã¯ãä¿¡é Œã®åæ£ãæå°è
ã®ãªãç·æããããŠä»çµã¿ãã©ã®ããã«åããŠãããã«ã€ããŠè©±ããŸãããå€ãã®å Žåæçµçã«ã¯ã©ã€ã¢ã³ããã§ããªãããšã¯äœã§ããããããããã«ãªã£ãŠããããã«æããŸãã ã©ããªãããã¯ãŒã¯å³ã«ãèŒã£ãŠãããã®ã¯ãµãŒããŒã°ããã§ãä¿¡é Œã¢ãã«ããµãŒããŒéã®ãã®ã§ããããã¹ãŠã¯ãµãŒããŒã«é¢ãããã®ã§ãããããã¯ãã§ãŒã³ã¯ãã¢ã®ãããã¯ãŒã¯ãšããŠèšèšãããŠããŸãããã¢ãã€ã«ããã€ã¹ãŸãã¯ãã©ãŠã¶ããã¢ã«ãªããããã«ã¯èšèšãããŠããŸããã ããšãã°ãã¢ãã€ã«ã§ãPCã§ããAutonomousArtãFirstDerivativeã®ãããªdAppã¯ãã¹ããŒãã®å€æŽãŸãã¯ã¬ã³ããªã³ã°ããããäœããã®æ¹æ³ã§ãããã¯ãã§ãŒã³ãšããåãããå¿
èŠããããŸãããã ãããããã¯ãã§ãŒã³ã¯ã¢ãã€ã«ããã€ã¹ïŒãããã¯ïŒ°ïŒ£ãã©ãŠã¶ãŒïŒäžã§åäœã§ããªããããã¯ã©ã€ã¢ã³ãåŽãããããè¡ãããšã¯å®éã«ã¯äžå¯èœã§ãããããããã£ãŠãå¯äžã®ä»£æ¿ææ®µã¯ã©ããã®ãµãŒããŒäžã§ãªã¢ãŒãã§å®è¡ãããŠããããŒããä»ããŠãããã¯ãã§ãŒã³ãšå¯Ÿè©±ããããšã§ãã ãã£ã±ããµãŒããŒã ïŒã§ãããã§ã«æžããããã«ã人ã¯ãµãŒããŒã管çããããããŸãããå¶ç¶ã«ãããµãŒãã¹ãšããŠetheriumããŒããžã®APIã¢ã¯ã»ã¹ã販売ããäŒæ¥ãåºçŸããåæãæ¡åŒµAPIãããã³å±¥æŽãã©ã³ã¶ã¯ã·ã§ã³ãžã®ã¢ã¯ã»ã¹ãæäŸããŠããŸãããªããèããããšãããŸããã…çŸæç¹ã§ãã»ãšãã©ãã¹ãŠã®dAppã¯ããããã¯ãã§ãŒã³ãšå¯Ÿè©±ããããã«2ã€ã®äŒç€Ÿã䜿ã£ãŠããŸããInfuraãŸãã¯Alchemyãå®éãMetaMaskã®ãããªãŠã©ã¬ãããdAppã«æ¥ç¶ããdAppããŠã©ã¬ãããä»ããŠãããã¯ãã§ãŒã³ãšå¯Ÿè©±ããå Žåã§ããMetaMaskã¯InfuraãåŒã³åºããŠããã ãã§ãã ãããã®ã¯ã©ã€ã¢ã³ãAPIã¯ããããã¯ãã§ãŒã³ã®ç¶æ
ãå¿çã®ä¿¡é Œæ§ãæ¿èªããããšããŠããŸãããçµæã¯çœ²åãããããŠããŸãããAutonomousArtã®ãããªã¢ããªã¯ãããã®ã¹ããŒãã³ã³ãã©ã¯ãã§ã®ãã®ãã¥ãŒæ©èœã®åºåã¯äœã§ããããšèšããŠãAlchemyãŸãã¯Infuraã¯ããããã¯åºåã ãããšããJSON BLOBã§å¿çããã¢ããªããããã¬ã³ããªã³ã°ããŸãã ããã¯é©ãã§ãããä¿¡çšäžèŠ(â»2)ã®åæ£åã³ã³ã»ã³ãµã¹ã¡ã«ããºã (â»3)ã®æ§ç¯ã«ã¯å€å€§ãªåŽåããšãã«ã®ãŒãæéãè²»ããããŠããã®ã«ãããã«ã¢ã¯ã»ã¹ãããã»ãšãã©ã®ã¯ã©ã€ã¢ã³ãã¯ãæ€èšŒãªãã«ããã®2ã€ã®ãµãŒãã¹ããã®åºåãåã«ä¿¡é ŒããŠããŸãããŸãããã©ã€ãã·ãŒã®é¢ãããæåã§ã¯ãªãã§ãããããã¹ãŠã®writeãã©ãã£ãã¯ã¯ããã¡ãããããã¯ãã§ãŒã³äžã§ãã§ã«å
¬éãããŠããŸããããã®2ã€ã®ãµãŒãã¹ã¯ã»ãŒãã¹ãŠã®dAppã®ãŠãŒã¶ãŒããã®èªã¿åãèŠæ±ãå¯èŠåããããšãå¯èœãšãªã£ãŠããŸãã NFTãäœã ãããããããå°ãäžè¬çãªïŒ®ïŒŠïŒŽãäœæããŠã¿ãããšæããŸãããã»ãšãã©ã®äººã¯ãNFTã«ã€ããŠèãããšãã«ç»åãããžã¿ã«ã¢ãŒãã«ã€ããŠèããŸãããæ®æ®µã¯NFTããã®ããŒã¿ããã§ãŒã³äžã«ä¿åããŠããããã§ã¯ãããŸãããã»ãšãã©ã®ç»åã®NFTã®å Žåãããã¯éåžžã«è²»çšã®ããããã®ã§ããç»åã®ããŒã¿ããã§ãŒã³ã«ä¿åãã代ããã«ãããŒã¿ãæãURLã«ãªã£ãŠããŸãããã®æšæºã«ã€ããŠç§ãé©ããã®ã¯ãURLã«ããããŒã¿ã«ããã·ã¥ã³ãããã¡ã³ãããªãããšã§ããæ°åãã«ãæ°çŸãã«ããŸãã¯æ°çŸäžãã«ã§è²©å£²ãããŠãã人æ°ã®ããåžå Žã®NFTãèŠããšããã®URLã¯ãApacheãå®è¡ããŠããVPSãæããŠããããšãããããããã§ãããã®ãã·ã³ã«ã¢ã¯ã»ã¹ã§ãã人ãå°æ¥ãã®ãã¡ã€ã³åã賌å
¥ãã人ããŸãã¯ãã®ãã·ã³ã䟵害ãã人ã¯ãNFTã®ç»åãã¿ã€ãã«ã説æãªã©ããã€ã§ã奜ããªããã«å€æŽã§ããŸãïŒãã®ããŒã¯ã³ããææãããŠããªãã«ããããããïŒãNFT仿§ã«ã¯ãç»åããããã§ããã¹ãããããæ£ããããã©ãã確èªãããŠããããã®ã¯äœããããŸããã ã€ã³ã¿ãŒããããåçŸãã web1ãweb2ã«ãªã£ãçç±ãèãããšãweb3ã®å¥åŠãªãšããã¯ãethereumã®ãããªæè¡ãweb1ã§æ¢ã«æããã«ãªã£ãŠããã¯ãå€ãçœ ã§æ§ç¯ãããŠããããšã§ãããããã®æè¡ã䜿çšå¯èœã«ããããã«ããã©ãããã©ãŒã ãäžå¿ã«çµ±åãããŠããŸãããŸãåãããšãèµ·ãã£ãŠããŸããããªãã®ä»£ããã«ãµãŒããŒãéå¶ããåºçŸããæ°ããæ©èœãã€ãã¬ãŒã·ã§ã³ãããµãŒãã¹ãããã¯InfuraãOpenSeaãCoinbaseãEtherscanããªã©ã§ãã åæ§ã«ãweb3ãããã³ã«ã®é²åã¯é
ãã§ãã äŸãã°ã FirstãDerivativeã¯åè³ç£ã®äŸ¡å€ã®ããŒã»ã³ããŒãžãšããŠãã³ãã®äŸ¡æ Œãèšå®ããããšãã§ããããã©ããã®ããŒã¿ã¯ãã§ãŒã³äžã«ãããŸãããOpenSeaãæäŸããAPIå
ã«ãããŸããå€ãã®äººãã¯ãªãšã€ã¿ãŒã«å©çãããããæ¹æ³ã§NFTã®ç¹èš±æš©äœ¿çšæã«æåŸ
ããŠããŸãããäœ¿çšæã¯ERC-721ã§æå®ãããŠãããã倿Žããã«ã¯é
ãããŸãããã®ãããOpenSeaã«ã¯ãweb2ã¹ããŒã¹ã«ãã®äœ¿çšæãæ§æããç¬èªã®æ¹æ³ããããŸããéäžåãã©ãããã©ãŒã ã§ã®è¿
éãªå埩ã¯ããã§ã«åæ£ãããã³ã«ãäžåããå¶åŸ¡ããã©ãããã©ãŒã ã«çµ±åããŠããŸãããã®æ¹æ³ã ãšæå·é貚ãŠã©ã¬ããã§ã®NFTã®ãã¥ãŒãOpenSeaã®NFTã®ãã¥ãŒã«ãªã£ãŠãããšããŠãé©ãã¯ãªãã§ããããOpenSeaã¯ãæšæºã倿Žããããšãäžå¯èœ/å°é£ã§ãå¯èœãªç¯å²ãè¶
ããŠãã©ãããã©ãŒã ãå埩ããããšã«å¿ããããã眮ãæãå¯èœãªçŽç²ãªããã¥ãŒãã§ã¯ãªãããšã«é©ãããšã§ã¯ãããŸããã ããã¯ã¡ãŒã«ã®ç¶æ³ãšéåžžã«äŒŒãŠãããšæããŸããèªåã®ã¡ãŒã«ãµãŒããŒãéçšããããšã¯ã§ããŸããããã©ã€ãã·ãŒãæ€é²ãžã®æµæããŸãã¯å¶åŸ¡ã«é¢ããŠã¯ãç§ãéåä¿¡ãããã¹ãŠã®ã¡ãŒã«ã®è£ã«GMailããããããçµå±æå³ããããŸããã忣åãšã³ã·ã¹ãã ãå©äŸ¿æ§ã®ããã«ãã©ãããã©ãŒã ãäžå¿ã«éäžãããšãäž¡æ¹ã®äžçã®æªãéšåã ããæœåºãã圢ã«ãªã£ãŠããŸããŸããéäžç®¡çãããŠããŸãããæéå
ã«æ··ä¹±ããã»ã©ååã«åæ£ãããŠããŸããèªåã®NFTããŒã±ãããã¬ã€ã¹ãæ§ç¯ããããšã¯ã§ããŸãããOpenSeaããŠãŒã¶ãŒã䜿çšãããŠã©ã¬ããå
ã®ãã¹ãŠã®NFTïŒããã³ãšã³ã·ã¹ãã å
ã®ä»ã®ãã¹ãŠã®ã¢ããªïŒã®ãã¥ãŒã仲ä»ããããç¹å¥ãªå¶åŸ¡ã¯äœãæäŸã§ããŸããã åµé æ§ã¯ååã§ã¯ãªããããããŸãã web3ã詊ãã«å°ããã£ãŠã¿ãã ãã§ããããã®å°ããªè©Šãã®èŠç¹ããèŠãŠã¿ããšããªãããã»ã©å€ãã®äººãã¡ãweb3ãšã³ã·ã¹ãã ããšãŠããããã ãšæãã®ããç°¡åã«ããããŸããéäžåããããã©ãããã©ãŒã ããé¢ããŠãããè»éã«ãªã£ãŠããããšããã¯ãããžãŒãšã®é¢ä¿ãæ ¹æ¬çã«å€ãããšã¯æããŸãããããã©ã€ãã·ãŒã®ãšããããã§ã«ã€ã³ã¿ãŒãããã®æ°Žæºãäžåã£ãŠãããšæããŸãããç§ã®ãããªéçºè
ãããã§äœããæ§ç¯ããããšã«è奮ããŠããçç±ãããããŸããå°ãªããšãæ°ãããã®ã§ãããåæã®ã€ã³ã¿ãŒãããæä»£ãæãåºãããåµé æ§/æ¢çŽ¢åºæ¥ããããªã¹ããŒã¹ã«ãªã£ãŠããããã§ããç®èãªããšã«ããã®åµé æ§ã®äžéšã¯ãããããweb3ãéåžžã«äžæ Œå¥œã«ããå¶çŽããçããŠããŸããä»ç®ã«ããŠããåµé æ§ã𿢿±ãååããªçµæãããããããšãé¡ã£ãŠããŸãããéå»ã®ã€ã³ã¿ãŒããããšåãåž°çµãé²ãããã«ååãã©ããã¯ããããŸããã ãã¯ãããžãŒãšã®é¢ä¿ãæ¹åãããã®ãªããæå³çã«ãããªããã°ãªããªããšæãã®ã¯ïŒ ã€ã³ãã©ã¹ãã©ã¯ãã£ã忣ãããã«ä¿¡é Œã忣ã§ããã·ã¹ãã ãèšèšããããšã§ãçãèªåã®ãµãŒããŒã管çããªããšããåæãåãå
¥ããå¿
èŠããããŸãã ãœãããŠã§ã¢æ§ç¯ã®è² æ
ã軜æžããããåªããã¹ãã§ãã ããããæ£çŽãããšGameStopãšLoopRingãäœãããšããŠããããŒã±ãããã¬ã€ã¹ã«ã¯å°ãæåŸ
ããããŸãïŒïŒ ç§ããã¯ä»¥äžã§ããæåŸãŸã§èªãã§ããã ãããããšãããããŸããã åè â»1 https://it-trend.jp/development_tools/article/32-0022 â»2 https://komugi.jp/?p=859 â»3 https://support.okcoin.jp/hc/ja/articles/4403552067865
ããã«ã¡ã¯ãããŒã¿ã¢ããªã¹ãã®å·Šæµ·ã§ãã æè¿ã¢ãµã€ã³ããããããžã§ã¯ãã«ãŠã¢ããª/Webã®Google Analytics 4(以äžGA4)ã§ã®èšæž¬ãæ€èšããŠããŸããããç§èªèº«ã¢ããªãGA4ãç¥èŠããªãã£ããããSwiftUIã§ãã€ãã£ãã¢ããªãäœæããã°æ€èšŒãè¡ãããšã«ããŸããã â»ãªããApple Developer Programãå¥çŽããŠããªãããiOS Simulatorã䜿çšããŠããŸãã å®è¡ç°å¢ Xcodeã®VersionïŒ13.2.1 (13C100) iOS Simulatorã®ååïŒiPhone 13 iOSã®versionïŒiOS 15.2 æçµçã«ã§ããã㮠以äžã®éãããã¹ãã¢ããªãäœæãGA4ã®DebugViewã§screen_viewã€ãã³ããã«ã¹ã¿ã ã€ãã³ããæå³ããã¿ã€ãã³ã°ã§é£ãã§ãããæ€èšŒå¯èœã«ãªããŸããã äœæ¥æé 以äžã®äœæ¥æé ã®éãã«é²ããŠãããŸãã SwiftUIã§ãã€ãã£ãã¢ããªã®äœæãè¡ã ãã€ãã£ãã¢ããªãžFirebase SDKã远å ãã GA4ã®DebugViewã§ãã°ãæ€èšŒãã ããã§ã¯ããã€ãã£ãã¢ããªäœæã®æµããFirebase SDKã®è¿œå ãGA4ãçšãããã°æ€èšŒã«ã€ããŠèª¬æããŠãããŸãã 1.SwiftUIã§ãã€ãã£ãã¢ããªã®äœæãè¡ã ç»é¢é·ç§»ã®ã€ã¡ãŒãž ãŸãã¯ãXcodeã§Firebase SDK远å ã«å¿
èŠãªã¢ããªã®äœæãè¡ããŸãã ããã§ã¯ã3ã€ã®ç»é¢ãäœæããŸããç»é¢é·ç§»ã¯æ·»ä»ç»åã®ãããªã€ã¡ãŒãžã§ãã ContentView SubView MyWebView ContentViewã®äœæ ContentViewããäœæããŸããContentViewã§ã¯ãSubViewãMyWebViewããããã«é·ç§»ãããªã³ã¯ãäœæããButtonãç»é¢å³äžéšã«é
眮ããŸããå ããŠãã€ãã³ãéä¿¡åŠçã远å ããŸãã ç»é¢é·ç§»ã¯ä»¥äžã®éã NavigationLink ãçšããŸãã destination ã«ã¯é·ç§»å
ã®Viewåãã Text() ã«ã¯ãªã³ã¯ã«è¡šç€ºããæååãèšè¿°ããŸãã NavigationLink(destination: SubView()) { Text("Go SubView") } NavigationLink(destination: MySecondWebView(urlString: "https://test-c1632.web.app/")) { Text("Go WebView") } screen_viewã€ãã³ãã¯ã€ã³ã¹ã¿ã³ã¹ã¡ãœãã onAppear ã§ContentViewãæç»ãããã¿ã€ãã³ã°ã§éä¿¡ããŸãã ã€ãã³ããã©ã¡ãŒã¿ãŒãšããŠã screen_name ãš screen_class ãå®çŸ©ããŠãããŸãã åæ§ã®åŠçãSubViewãMyWebViewã§ãèšè¿°ããŠãããŸãã .onAppear() { Analytics.logEvent(AnalyticsEventScreenView, parameters: [AnalyticsParameterScreenName: "\(ContentView.self)", AnalyticsParameterScreenClass: "\(ContentView.self)"] ) } 次ã«ãç»é¢å³äžéšã®Buttonãã¿ããããéã«éä¿¡ããã«ã¹ã¿ã ã€ãã³ã button_tap ã远å ããŸããã€ãã³ããã©ã¡ãŒã¿ãšã㊠button_name ãå®çŸ©ããŸããä»åéä¿¡ããã€ãã³ãéä¿¡åŠçã®èšè¿°ã¯ä»¥äžã§ãã Button(action: { let button_name = "hoge" Analytics.logEvent("button_tap", parameters: ["button_name" : button_name as NSObject,] ) } SubViewã®äœæ ContentViewã®é·ç§»å
ã§ããSubViewã®äœæãè¡ããŸããããã§ã¯ãããŒã®é·ç§»å
ãèšå®ããŠãããŸããã MyWebViewã®äœæ ContentViewã®é·ç§»å
ã§ããMyWebViewç»é¢ã®äœæãè¡ããŸããMyWebViewç»é¢ã¯ç§ãäœæããWebãµã€ãã衚瀺ããŸãã Webãµã€ãã¯Firebase Hostingã§å
¬éããŠããŸãã ããã§ã¢ããªã®äœæã¯çµäºã§ãã以äžã®éããåé¡ãªããã«ãããããšãã§ããŸããã 2.ã¢ããªãžFirebase SDKã远å ãã ã¢ããªã«æ¥ç¶ããFirebase ãããžã§ã¯ããæ°èŠäœæãã äœæããã¢ããªã«Firebase SDKã远å ããŸãããŸãã¯ã Firebase ã³ã³ãœãŒã« ã§ã¢ããªã«æ¥ç¶ããããã® Firebase ãããžã§ã¯ããæ°èŠäœæããŸãã äœæããã¢ããªãFirebaseã«ç»é²ãã ãããžã§ã¯ãæŠèŠ > iOS+ ã¢ã€ã³ã³ > èšå®ã¯ãŒã¯ãããŒã«é²ã¿ãŸãããããšãApple ãã³ãã«IDã®å
¥åãæ±ããããŸãã ããã²ãŒã¿ãŒãšãªã¢ã®äžã®ãããžã§ã¯ãå > TARGETS ã®ãããžã§ã¯ãå > General ã¿ãã§Apple ãã³ãã«IDã確èªã§ããŸãã èšå®ãã¡ã€ã«ã®ããŠã³ããŒã ããŠã³ããŒããã GoogleService-Info.plist ãã¡ã€ã«ãXcode ãããžã§ã¯ãã®ã«ãŒãã«ç§»åãããã¹ãŠã®ã¿ãŒã²ããã«è¿œå ããŸãã Firebase SDKã远å ãã Firebase SDKã¯ããã€ãã€ã³ã¹ããŒã«æ¹æ³ããããŸãããä»åã¯CocoaPodsãå©çšããŸãã Podfileãäœæãã ãããžã§ã¯ããã£ã¬ã¯ããªã®ã«ãŒãããæ¬¡ã®ã³ãã³ãã§ãPodfileãäœæããŸãã pod init Podfileã«FirebaseAnalyticsã远å ãã ã¢ããªã§äœ¿çšãã'Firebase/Analytics'ãPodfileã«è¿œèšããŸãã # Add the Firebase pod for Google Analytics pod 'Firebase/Analytics' # For Analytics without IDFA collection capability, use this pod instead# pod âFirebase/AnalyticsWithoutAdIdSupportâ # Add the pods for any other Firebase products you want to use in your app# For example, to use Firebase Authentication and Cloud Firestore # pod 'Firebase/Auth' # pod 'Firebase/Firestore' Podãã€ã³ã¹ããŒã«ãã pod install ãå®è¡ããŸãããã ããM1 Macã ãšäžæãã€ã³ã¹ããŒã«ã§ããªãããšãããããã§ãã ç§ã®ç°å¢äžã§ã¯ã¿ãŒããã«ã®ã¢ãŒããã¯ãã£ã«äŸåããŠããã®ã§ä»¥äžã®ããŒãžãåèã«ãã¿ãŒããã« > å³ã¯ãªãã¯ã§ãæ
å ±ãèŠãã > ãRosettaã䜿çšããŠéãã ã«äºåã«ãã§ãã¯ãå
¥ããŸããããããããšã§ãåé¡ãªãPodãã€ã³ã¹ããŒã«ã§ããŸããã ãåèãM1 Macã§pod installãå®è¡ãã pod install Podã€ã³ã¹ããŒã«ãå®äºãããšã .xcworkspace ãã¡ã€ã«ãäœæãããŸãã以é㯠.xcworkspace ãã¡ã€ã«ããXcodeãããžã§ã¯ããéããŸãã åæåã³ãŒãã远å ãã ã¢ããªèµ·åæã« Firebase ãæ¥ç¶ããã«ã¯ãXcodeãããžã§ã¯ãã®@mainã¢ããªãã¥ãŒã·ã§ã³ã®æå®ã®å Žæã«æå®ã®ã³ãŒãã远å ããŸãã import SwiftUI import Firebase //è¿œèš @main struct testApp: App { var body: some Scene { WindowGroup { ContentView() } } init() { FirebaseApp.configure() //è¿œèš } } ããã§ãFirebase SDKã®è¿œå ã¯å®äºã§ãã 3.GA4ã®DebugViewã§ãã°æ€èšŒãè¡ã æåŸã«ãGA4ã§ãã°æ€èšŒãè¡ããŸããæ©éãã°æ€èšŒãšãããããšããã§ãããäºåã«ããã€ãèšå®ãè¡ãå¿
èŠããããŸãã Debug Modeãæå¹ã«ãã Xcodeãéããã¡ãã¥ãŒã㌠> Product > Scheme > Edit Scheme > Run > Argumentsã®Arguments Passed On Launchã«FIRDebugEnabledã远å ããããšã§ãDebug Modeãæå¹ã«ããŸãã Firebaseã®èªåãã°ååŸããªãã«ããŠæåãã°ååŸãèšå®ãã ä»åSwiftUIãšã®çžæ§ãããããŸããããèªåãã°ååŸã§ã¯ç»é¢é·ç§»ã§screen_viewã€ãã³ããé£ãã ãé£ã°ãªãã£ããããŠããã®ã§ãæåã§ãã°ååŸãããå®è£
ã«ããŠããŸãã Info.plist ãã¡ã€ã«ã«ä»¥äžã远å ããããšã§èªåãã°åéããªãã«ããŸãã KeyïŒFirebaseAutomaticScreenReportingEnabled ValueïŒNO(Boolean) ãããã¯æã«Xcodeã®Report Navigatorã§ä»¥äžã®ãããªãã°ã確èªã§ããã°ãèªåãã°åéããªãã«ãªã£ãŠããŸãã Analytics screen reporting is disabled. UIViewController transitions will not be logged. ãã°æ€èšŒ Debug Viewã§screen_viewã€ãã³ããbuttun_tapã€ãã³ããèšæž¬ãããŠããã®ãåãããŸããåé¡ãªããã°ãé£ãã§ããŸããæ€èšŒå®äºã§ãã BigQuery飿º BigQueryã«é£æºããŠãšã¯ã¹ããŒããããŠãããã°ã確èªããŸãããæ·»ä»ç»åã®ã«ã¹ã¿ã ã€ãã³ãbutton_tapã®ãã°ã¯å®è£
ããéããbutton_name ã«èšå®ããå€ hoge ãæ ŒçŽãããŠããŸãã ãããã« ä»åç¡äºã«ã¢ããªã宿ãããŠãã°æ€èšŒãè¡ãããšãã§ããŸãããç§èªèº«ããã°ã©ãã³ã°æªçµéšã ã£ããããåãçµãåã¯åãããªãããšã ããã§ãããå
·äœçã«ã¯ãããã°ã©ãã³ã°ã®åºç€ããªãããšã©ãŒã®è§£æ±ºæ¹æ³ãåãããŸããã§ãããä»ã«ãã¿ãŒããã«ãGitHubã§äœãã§ããã®ãããç¥ããŸããã§ããã ããããUdemyã§åŠç¿ããããåãããªãããšãäžã€äžã€æ€çŽ¢ãšã³ãžã³ã§èª¿ã¹ãããšã§åé¡è§£æ±ºããããšãã§ããŸãããã¢ããªå¶äœã®å Žé¢ã¯ãšã©ãŒã®é£ç¶ã§ãããããšã©ãŒã解決ããç¬éãæã楜ããã£ãã§ãã ãããŠãäœãåãçµãã«ããŠããããã°ã§ããããšèªä¿¡ãã€ãããã«ãªããŸããããããããããŸããŸãªããšã«ãã£ã³ã¬ã³ãžããŠãããŸãã ã©ãªããã®åèã«ãªãã°å¹žãã§ãã
ã¯ãããŸããŠãmediba FEãšã³ãžãã¢ã®æ¥ã§ãã æè¿ç«ãã³ãé¿ãäžæã«ãªã£ãŠããã®ã§ãç«ãå°ãããŠããŸãã React NativeåèŠ ãããã§èª¿ã¹ãŠã¿ãŠã第äžå°è±¡ã¯ã坿ããã£ããã§ãã ãã®ä»ã«æããå°è±¡ã¯äžèšã§ãã facebookã®cross-platformãã¬ãŒã ã¯ãŒã¯ã§ã1åæžãããAndroidãiOSãWebå
šéšåãã ããã React NativeïŒä»¥äžRNïŒãšããååä»ããªã®ã§ãReactéçºè
ã«ãšã£ãŠã䜿ããããã ãã ãšããæµ
ãèªèã§ãããŒã ã¡ã³ããŒãšäžç·ã«RNã®ãããžã§ã¯ããæžããŠã¿ãŸããã React Nativeæ¯ãè¿ã ããçšåºŠã³ãŒããæžããŠã¿ããšã以äžã®äºã«æ°ãä»ããŸããã ããŒãžã§ã³ã¢ãããæ©ã æè¿ã®ãªãªãŒã¹ãèŠããš1幎é3åã®ã¡ã€ã³ããŒãžã§ã³ããããªãªãŒã¹ãããŠãRNã®ããŒãžã§ã³ç®¡çã課é¡ã«ãªããããç¹ã«ãã£ããã¢ããã«ã¯ãäºææ§ã®åé¡ãç®ã®åã« debugã®é£ãã Webéçºãšæ¯ã¹ããšãRNã§ããã¿ãçã£èµ€ãªç»é¢ã®ãšã©ãŒç»é¢ããããããã®ã¡ãã»ãŒãžã ãã§ãããã³ãããã€ãã£ããã®ãšã©ãŒã®å€æã¯é£ãã èŠçŽ ã®é«ããã¹ã¯ãªãŒã³ã®é«ããè¶
ãããã¹ã¯ããŒã«ã§ããªã Webã ãšçãŸãã€ãã§ã¹ã¯ããŒã«ã§ãããã©ãRNã®å Žåäžçªå€åŽã«ã¹ã¯ããŒã«å¯èœã®ãšã¬ã¡ã³ãã§wrapããŠãããªããš iOSãšAndroidã«ãããŠã®éã ããçšåºŠRNããã®éããåããŠãããŠãŸãããããããã®ç°å¢ã«äŸåããåŠçãããïŒå€éšlibã§æžãå ŽåãïŒ ãªã¹ãã®éžæ RNã®ãªã¹ããå
ã
listViewãšflatListäºã€ããã£ãŠãlistviewã¯æ§èœçãªåé¡ã§æŸæ£ãããŠãflatListãæšå¥šãããŠãŸãïŒå®éã«ã«ãŒã»ã«ãäœã£ãéã«å°ã£ãŠãïŒ ã€ãŸããRNã¯äŸåå¿ã®åŒ·ãåã§ããã å°è±¡çãã€ã³ã RNãè§Šã£ãŠã¿ãŠãäžçªè峿·±ããšãããšãããšãnative codeã§æžããSDKãæ±ããéšåã§ããããããã Native Module Bridging ãšãããã®ã§ãã åè¿°ã®éãããçšåºŠRNãiOSãšAndroidã®éããåããŠãããŠãŸãããããããã®OSã«äŸåããAPIã¯JSã§ã®æ±ãã¯äžå¯ãªãã®ãããããããã¯ããé«ãããã©ãŒãã³ã¹çããã«ãã¹ã¬ããçã«äœãããå Žåãnative moduleãä»ããŠãããå®çŸã§ããŸãã å®éæãåãããŠã å
¬åŒããã¥ã¡ã³ããã¿ãªãããèªåãªãã«ç°¡åãªãhello-worldããäœã£ãŠã¿ãŸãããïŒåŠæ ¡ã§JavaãåŠãã§ãã®ã§ãå人çã«èŠªå㪠Android ãéžãã ^^ïŒ ã¹ãããïŒ ç°å¢èšå® ãªããšãªãåãnative codeæžã RNãä»ããŠãnative moduleãšããŠãJSåŽã«ã«æ«é²(expose)ãã JSåŽã§åŒã³åºã ç°å¢èšå® å
¬åŒããã¥ã¡ã³ã ã«æ²¿ã£ãŠç°å¢èšå®ã§ããŸããJavaScript(以äžJS)ãTypeScript(以äžTS)äž¡æ¹äœããŸããã èªåã¯TSã®ãã³ãã¬ãŒããäœããŸãã(TSæé«) ãªããšãªãåãnative codeæžã ç°å¢èšå®çµãããŸããããäžèšã®androidã®ãã©ã«ãã§äœæ¥ãããŠãããŸãïŒèªåã¯Javaã®æ§æããŸãèªä¿¡ãªããããAndroid Studioã§androidãã©ã«ããŒãéããŠã³ãŒããæžããŠããwïŒ android/app/src/main/java/com/awesomeproject ã®é
äžã§ HelloModule.java ãšããæ°èŠJavaãã¡ã€ã«ãäœããŸãã ãã¡ã€ã«ã®äžèº«ã¯ãããªæãïŒ public class HelloModule extends ReactContextBaseJavaModule {   private static ReactApplicationContext reactContext;   HelloModule(ReactApplicationContext context) {     super(context);     reactContext = context;   }   public static void setTimeout(Runnable runnable, int delay){     new Thread(() -> {       try {         Thread.sleep(delay);         runnable.run();       }       catch (Exception e){         System.err.println(e);       }     }).start();   }   @ReactMethod   public void sayHelloToPopUp(String name) {     Toast.makeText(reactContext,"Hello World,"+name,Toast.LENGTH_LONG).show();   }   @ReactMethod   public void sayHelloAfterThreeSecond(String name, Promise promise) {     setTimeout(()->promise.resolve("Hello after 3 seconds,"+name),3000);   }   @NonNull   @Override   public String getName() {     return "HelloModule";ã//ãã®åœåã§NativeModulesã«è¿œå   } }; ãšãããã詊ãã«ãäžèšäºã€ã®é¢æ°ãäœã£ãŠã¿ãŸããã Androidã®Toastã䜿ã£ãŠåºåã§ãã sayHelloToPopUp Promiseãè¿ã sayHelloAfterThreeSecond App(JSåŽ)ã«æ«é²(expose)ãã initåŸã«èªåçæããã android/app/src/main/java/com/awesometsproject/MainApplication.java ã®äžèº«ãèŠãŠã¿ããš protected List getPackages() {      @SuppressWarnings("UnnecessaryLocalVariable")      List packages = new PackageList(this).getPackages();      // Packages that cannot be autolinked yet can be added manually here, for example: â» Â Â Â Â // packages.add(new MyReactNativePackage()); âãã®è¡ãè§£æŸ Â Â Â Â Â return packages;     } æ¢ã«çšæããŠãããPackageåã§packageãäœããŸããäžèšã®ãã¡ã€ã«ãšåããã©ã«ããŒé
äžã§ MyReactNativePackage.java ã®ãã¡ã€ã«ãäœæããnativePackageäœããNativeModuleã«å
çšäœæããHelloModuleã远å ããã°å®æã§ãã public class MyReactNativePackage implements ReactPackage {   @NonNull   @Override   public List createViewManagers(@NonNull ReactApplicationContext reactContext) {     return Collections.emptyList();   }   @NonNull   @Override   public List createNativeModules(       @NonNull ReactApplicationContext reactContext) {     List modules = new ArrayList<>();     modules.add(new HelloModule(reactContext));     return modules;   } } JSåŽã§åŒã³åºã æåŸã®äžæ©ã¯ãApp.tsxã§äœ¿ãããšã§ããã  import { NativeModules } from 'react-native';  ãŸãNativeModulesãimport,ããããå
çšäœã£ã sayHelloToPopUp ãš sayHelloAfterThreeSecond ãåŒã³åºããŸãïŒ Â const { HelloModule } = NativeModules  const sayHello = React.useCallback((words)=>{   HelloModule.sayHelloToPopUp(words)  },[])  const sayHelloThreeSecondsLater = React.useCallback(()=>{   HelloModule.sayHelloAfterThreeSecond('lalalalala').then((res)=>sayHello(res))  },[]) ... <button title="{"> æåŸãrootã§yarn androidããã°ãèµ·åãåŸ
ã¡ãã·ãã¥ã¬ãŒã¿ãŒãç«ã¡äžãã£ãŠã¢ããªã€ã³ã¹ããŒã«å®äºãã¢ããªã§pressãã¿ã³ãããã 3ç§åŸã«æ·»ä»ç»åã®ããŒã¹ããåºãŠããŸã ææ³ RNã®ãããªã¯ãã¹ãã©ãããã©ãŒã ã®ãã¬ãŒã ã宣äŒããããã«ããäžåæžãããã©ã®ãã©ãããã©ãŒã ã§ãåããããšããçæ³ããããã å®éã«ãããžã§ã¯ããäœãã«åœãã£ãŠããã€ãã£ãã¢ããªãããã³ããå
šéšçè§£ããäžäººã§ã®iOS,AndroidãšWebå
šãŠã®ã³ãŒããæžããããšã¯ããããªãã ãããRNãæ¶ãæ©ã«ããã€ãã£ãããŒã ãšããã³ãããŒã ã飿ºããæ¬æ°ãªããã°ïŒB.I.GïŒããã³ãããŒã ãçã¿åºããã§ã¯ãªãã§ããããã ããšããã®éããçæ³ãªãè
ã«æåãªãã^^
ããã«ã¡ã¯ãEng6G ããã¯ãšã³ããšã³ãžãã¢ã®åå±( @hrktcy )ã§ãããããã瀟äŒäºº2幎ç®ãšããããšã§ææ¥ã®æµãããšãŠãæ©ãæããŸãã ã¯ããã« çŸåšéçºäžã®ãããã¯ãã§ãAPI ãªã¯ãšã¹ããã©ã¡ãŒã¿ã«å«ãŸããã客æ§ã®å人æ
å ±ãããŒã¿ããŒã¹ã«æå·åããŠæ ŒçŽããããã«AWS Key Management Service(KMS) ãå°å
¥ããããšã«ãªããŸãããå°å
¥ããã«ããããKMS ã§ã®æå·åã®ãªã¯ãšã¹ãããã©ãŒãã³ã¹ããéçºäžã®ã·ã¹ãã ã«å®ããSLA ã«èãããæ§èœããæ€èšŒããå¿
èŠããããŸãããæ¬èšäºã§ã¯ãã®çµæãå
±æããããšæããŸãã æ€èšŒé
ç® åºåãããã®ã¯ä»¥äžã®3ã€ã§ãã å¹³åæå·ååŠçæé(ms) åæå·ååŠçæéãæé ã«ãœãŒãããéã®90ããŒã»ã³ã¿ã€ã«å€(ms) æå€§æå·ååŠçæé(ms) ç°å¢ ããŒã«ã«ç°å¢ã§Golang ã§æ€èšŒçšã®ãµã³ãã«ã³ãŒããæžããŸãããããŠã¯ãã¹ãã©ãããã©ãŒã ãã«ãã«ãã£ãŠçæããããã€ããªãã¡ã€ã«ãS3 ã«PUT ããEC2ããå®è¡ããŸãã èšèª Golang SDK aws-sdk-go-v2 å®è¡å Žæ EC2(t2.micro/x86) æå·åããæååãäœæãã颿°ãå®çŸ©ãã ãŸããæ€èšŒçšã®æåå[0-9a-zA-Z](32æå)ãçæãã颿°ãå®çŸ©ããŸããçæã«ã¯ math/rand ããã±ãŒãžãçšããŠã©ã³ãã ãªæååãçæããããã«ããŸããçææ°ã¯ã³ãã³ãã©ã€ã³åŒæ°ããæå®ã§ããããã«ããŠãããŸãã package main import ( "math/rand" ) func randomStr(n int) string { letters := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" lettersLen := len(letters) dst := make([]uint8, n) for i := 0; i < n; i++ { l := rand.Intn(lettersLen - 1) dst[i] = letters[l] } return string(dst) } æå·ååŠçãè¡ã颿°ãå®çŸ©ãã æå·ååŠçãè¡ãexec 颿°ãå®çŸ©ããŸãããã®é¢æ°ãgoroutine ã§äžŠè¡åŠçããããã«ããŸããsync.waitGroup ã®Done() ãdefer ããããšã§ãåŠçã®æåŸã«å®äºãç¥ãããããã«ããŠãããŸãã var wg sync.WaitGroup var keyID = "*******" // ãã¹ã¿ãŒããŒã®KeyID var client *kms.Client // data çµææ ŒçŽçšæ§é äœ type data struct { Encrypted []byte ProcessTime time.Duration } func exec(plain string, results *[]data) { defer wg.Done() // èšæž¬éå§ start := time.Now() // keyIDãšæå·åããæååã代å
¥ input := &kms.EncryptInput{ KeyId: &keyID, Plaintext: []byte(plain), } // æå·åãªã¯ãšã¹ã output, err := client.Encrypt(context.TODO(), input) if err != nil { fmt.Printf("Got error encrypting data:%v\n", err) return } // æå·åæååãšåŠçæéãdataåã®å€æ°ã«ä»£å
¥ãã result := data{ Encrypted: output.CiphertextBlob, ProcessTime: time.Since(start), } *results = append(*results, result) } main 颿°ãå®è£
ãã åè¿°ã®é¢æ°ãçšããŠmain 颿°ãå®è£
ããŸããmain 颿°ã§ã¯randomStr 颿°ã§çæããæååãæ ŒçŽããé
åãçšæããKMS ã¯ã©ã€ã¢ã³ããçæããŠããæå·ååŠçãgoroutine ã§äžŠè¡åŠçãããŸãããªããfor ã«ãŒãã®äžã§time.Sleep() ãããããšã§TPS ã調æŽã§ããããã«èšå®ããã«ãŒãåŠçãçµäºãããæ€èšŒé
ç®ãèšç®ããŠåºåããããã«ããŸãã package main import ( "context" "flag" "fmt" "log" "math/rand" "sort" "sync" "time" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/kms" ) // data çµææ ŒçŽçšæ§é äœ type data struct { Plain string Encrypted []byte ProcessTime time.Duration } var wg sync.WaitGroup var keyID = "*******" // KeyID var client *kms.Client var num = flag.Int("num", 100, "æå·åå®è¡åæ°") var interval = flag.Int("interval", 1, "-interval ") // randomStr ã©ã³ãã æååãçæãã颿° func randomStr(n int) string { letters := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" lettersLen := len(letters) dst := make([]uint8, n) for i := 0; i < n; i++ { l := rand.Intn(lettersLen - 1) dst[i] = letters[l] } return string(dst) } // exec 䞊ååŠçãã颿° func exec(plain string, results *[]data) { defer wg.Done() // èšæž¬éå§ start := time.Now() // keyIDãšæå·åããæååã代å
¥ input := &kms.EncryptInput{ KeyId: &keyID, Plaintext: []byte(plain), } // æå·åãªã¯ãšã¹ã output, err := client.Encrypt(context.TODO(), input) if err != nil { fmt.Printf("Got error encrypting data:%v\n", err) return } // æå·åæååãšåŠçæéãdataåã®å€æ°ã«ä»£å
¥ãã result := data{ Encrypted: output.CiphertextBlob, ProcessTime: time.Since(start), } *results = append(*results, result) } func main() { flag.Parse() // æ€èšŒçšæååæºå maxStrLen := 32 plainList := make([]string, *num) for i := range plainList { plainList[i] = randomStr(maxStrLen) } // KMSã®ã¯ã©ã€ã¢ã³ããäœæ loadOptions := []func(*config.LoadOptions) error{config.WithRegion("ap-northeast-1")} sdkCfg, err := config.LoadDefaultConfig(context.TODO(), loadOptions...) if err != nil { panic("configuration error, " + err.Error()) } client = kms.NewFromConfig(sdkCfg) // æå·ååŠçå®è¡ results := make([]data, 0) for _, v := range plainList { wg.Add(1) go exec(v, &results) time.Sleep(time.Millisecond * time.Duration(*interval)) } // çµäºãåŸ
〠wg.Wait() // çµæå€å® success := len(results) if success < 1 { log.Fatal("empty success result") } // ãããããæé ã§ãœãŒãããŠãã sort.Slice(results, func(i, j int) bool { return results[i].ProcessTime < results[j].ProcessTime }) // å¹³åæå·ååŠçæéãèšç® total := int64(0) for _, v := range results { total = total + v.ProcessTime.Milliseconds() } fmt.Printf("avg:%dms\n", total/int64(success)) // 90ããŒã»ã³ã¿ã€ã«å€ãèšç® percentile := int(float64(success)*0.9 - 1) fmt.Printf("Percentile:%dms\n", results[percentile].ProcessTime.Milliseconds()) // æå€§æå·ååŠçæéãèšç® fmt.Printf("max:%dms\n", results[success-1].ProcessTime.Milliseconds()) } æ€èšŒçµæ 500(req/sec)ã§400åã®æååæå·åãè¡ã£ãå Žå avg(ms) 90 percentile(ms) max(ms) 9 9 68 500(req/sec)ã§1000åã®æååæå·åãè¡ã£ãå Žå avg(ms) 90 percentile(ms) max(ms) 7 8 61 æå·ååŠçãå¢ãããå Žåã§ãåæå·ååŠçæéã«å€§ããªå·®ã¯çãŸããŸããã§ãããããããæå€§æå·ååŠçæéã¯90ããŒã»ã³ã¿ã€ã«å€ããã倧å¹
ã«æéãããã£ãŠããããšãããããŸããããã®å€ã¯ååæå·ååŠçæéã®å€ã§ããã®ã§ã2åç®ä»¥éã¯KMS ã¯ã©ã€ã¢ã³ãã䜿ãåããŠãããååã¯KMS ã¯ã©ã€ã¢ã³ããèªã¿èŸŒãã§ããåæéãããã£ãŠããã®ã§ã¯ãªãããšããæšæž¬ãããŸããã æå·ååŠçæ¯ã«KMSã¯ã©ã€ã¢ã³ããèªã¿èŸŒãã§ã¿ããã©ãã main 颿°å
ã§è¡ã£ãŠããKMS ã¯ã©ã€ã¢ã³ãäœæåŠçãexec 颿°å
ã«ç§»åããæå·åãªã¯ãšã¹ãã®éœåºŠã¯ã©ã€ã¢ã³ããäœæããããã«å€æŽããŠãªã¯ãšã¹ãããã©ãŒãã³ã¹ãæ€èšŒããŠã¿ãŸãã åæ§ã®æ¡ä»¶ã§æ€èšŒã詊ã¿ããšããã以äžã®IMDSã®èªèšŒãšã©ãŒãçããŠããŸãæå·åãè¡ããŸããã§ããã Got error encrypting data:operation error KMS: Encrypt, failed to sign request: failed to retrieve credentials: no EC2 IMDS role found, operation error ec2imds: GetMetadata, http response error StatusCode: 429,request to EC2 IMDS failed [åè]:429 Too Many Requests ããã§ãæå·ååŠçæ°ãæžãããŠåŠçé床ãèšæž¬ããŠã¿ãŸãã 500(req/sec)ã§10åã®æååæå·åãè¡ã£ãå Žå avg(ms) 90 percentile(ms) max(ms) 52 65 73 500(req/sec)ã§100åã®æååæå·åãè¡ã£ãå Žå avg(ms) 90 percentile(ms) max(ms) 749 2113 2158 åŠçæ°ãå¢ãããšå¿çæéãé·ããªãããšãåãããŸãããTPS ãäžããŠã¿ããã©ããªãã§ããããã 100(req/sec)ã§100åã®æååæå·åãè¡ã£ãå Žå avg(ms) 90 percentile(ms) max(ms) 28 39 54 TPS ãäžãããšååŠçæéãã ãã¶èœã¡çããŸããã ãŸãšã KMS ã¯ã©ã€ã¢ã³ãã䜿ãåããã¿ãŒã³ã§ã¯ååæå·ååŠçæéã«å°ãæéãããããã®ã®ãæå·ååŠçæ°ãå€ããŠãååŠçæéã«å€§ããªå·®ã¯çãŸããŸããã§ãããäžæ¹ãéœåºŠKMS ã¯ã©ã€ã¢ã³ããèªã¿èŸŒãŸãããã¿ãŒã³ã§ã¯ãå¿çæéãé·ããªã+倧éã®æå·ååŠçãè¡ãå Žåã¯TPS ãäžããå¿
èŠãããããã§ãã
åãã« ããã«ã¡ã¯ããšã³ãžãã¢ã®éåŽã§ããæè¿ã¯çŸå Žã§ãããã¯ãã®éçºãè¡ãã€ã€ã å
ŒåãšããŠCTOæºåå®€ã«æå±ãããã¯ãªãŒããšããããŒã«ãæã¡ãè€æ°ã®ãããã¯ãã«ãŸããããã¯ãããžãŒã»ã³ã¿ãŒã®èª²é¡ã æè¡çãªç¹ã軞ã«ããªãã解決ã«åããŠåãçµãã§ããŸãã â»åèèšäºïŒ 2020幎床ãšã³ãžãã¢çµç¹ã«ã€ã㊠| mediba Creator à Engineer Blog æ¬èšäºã§ã¯ãããã¯ãªãŒãã®åãçµã¿ãšããŠ21å¹ŽåºŠäžæã«æ€èšãåãçµã¿å§ãã ãæ°èŠéçºæã®æè¡éžå®ã®æéã ã«ã€ã㊠ãã®å
容ãšèæ¯ããäŒããŠããŠãããŸãã ç¹ã«ä»åŸãšã³ãžãã¢ãšããŠåŒç€Ÿã«å
¥ç€Ÿãæ€èšé ããæ¹ã«åããŠã ã©ã®ããã«æè¡ãšçµç¹ã«ã€ããŠèããŠãããããäŒããŠåºæ¥ãã°ãšæããŸãã ãããŸã§ã®æè¡éžå®æ¹é ãããŸã§ã¯ãæ°èŠéçºæã«ã¯åãããã¯ãæ¯ã«å©çšããæè¡ïŒããŒã«ã»ãœãããŠã§ã¢)ãéžå®ããŠæ¥ãŸããã åãããã¯ãæ¯ã«å©çšããæè¡ïŒããŒã«ã»ãœãããŠã§ã¢)ãéžå®ããããšã§ã ãããã¯ãããã®ããŒã ã«ãã£ãéçºãããæ°ãããã®ãç©æ¥µçã«åãå
¥ããããšãç®æããŠããŸããã ãã®æ¹éã§æ°å¹Žãã¡ãŸãããããã®ç¹ã¯éæã§ããŠããŸããã ãã ããã®äžã§ç¹ã«éçšä¿å®ã«ãããŠäžæããããªãç¹ã»æªã¿ãçãŸããŠããŸããã ä»åãæ°èŠéçºæã®æè¡éžå®ãã®æéã«ãŠãéšåçã«å©çšããæè¡(ããŒã«ã»ãœãããŠã§ã¢ïŒã®æéãèšããããšã«ãã£ãŠ è€æ°ã®ãããã¯ãã«ãããŠã暪æçã«éçšä¿å®ãããå¹ççã«å質é«ãè¡ãããšãç®æãããã®ã«ãªããŸãã æ°èŠéçºæã«ãããæè¡éžå®ã®æé ä»ååãæ±ºãããæ°èŠéçºæã®æè¡éžå®ãã®æéã«ã€ããŠã ãã®ãŸãŸå
¬éã¯åºæ¥ãŸããã®ã§ã3ç¹ã«ãã€ã³ããçµã£ãŠèª¬æããŸãã â æé1. 以äžã®é åã«ãããŠãåºæ¬ãšãªãããŒã«ã»ãœãããŠã§ã¢ãæéãå®çŸ©ãã ãããªãã¯ã¯ã©ãŠã ã³ã³ãã¥ãŒãã£ã³ã° ããã¯ãšã³ãã¢ããªã±ãŒã·ã§ã³éçºã®ããã°ã©ãã³ã°èšèª ããŒã¿ããŒã¹ CI/CDç°å¢ ããã§ã¯å
šãŠèšèŒããŸãããã äŸãã°ããããªãã¯ã¯ã©ãŠããã«ãããŠã¯ãAWSããå©çšããããšåºæ¬ãšããããšãã£ãå
容ã§ãã ãŸããããã«æããé å以å€ã®ãã®ã§æ€èšäžã®ãã®ããããŸãã äŸãã°ããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãã«ã€ããŠã§ããã 瀟å
ã§éçºéçšå®çžŸããããŸããæ
åœããããŒã ãäžã€ã«ãªã£ãŠããããšããããæ€èšããŠããæ®µéã«ãªããŸãã é åãããŒã«ã»ãœãããŠã§ã¢ã®éžå®ã«åœãã£ãŠã¯ã ãããã¯ãã«ãšã£ãŠã³ã¢ãšãªãæè¡é åããã©ã€ããµã€ã¯ã«ã¯ã©ã®ããããèŠèŸŒãã§ããããªã©éã¿ã æ¢åã·ã¹ãã ã§ã®æ¡çšäºäŸã»æ¢åã¡ã³ããŒã®ã¹ãã«ã»ãããéèŠèŠãéžå®ãè¡ããŸããã â æé2.ãæé1ãã«èšèŒãããŠããªãå Žåã¯ãã»ã³ã¿ãŒå
ã§è©±ãåãæ±ºå®ãã ä»åŸæ°èŠéçºæã®èŠæ±èŠä»¶ã«ãã£ãŠã¯ããæé1ãã§å®çŸ©ãããã®ã§ã¯å®çŸåºæ¥ãªãå¯èœæ§ããã¡ãããããŸãã ãã®å Žåã¯ãæ°èŠéçºã®æ
åœããŒã ã ãã§ã¯ãªããä»ã®éçºããŒã ãå«ãã»ã³ã¿ãŒå
ã§è©±ãåã£ãŠæ±ºå®ããŠãããŸãããã®äžã§ãå°å
¥äºåŸã®ãã£ãŒãããã¯ãè¡ãåè©äŸ¡ããŸãã â æé3.ãæé1ãã®å
容ã¯1幎çšåºŠã®ã¹ãã³ã§èŠçŽããè¡ã ãæé1ãã®å
容ããé·ã幎æãçµããšç¶ç¶çãªã¡ã³ããã³ã¹ã«åé¡ãåºããã ããè¯ã代æ¿ã®ããŒã«ã»ãœãããŠã§ã¢ãåºãŠããå ŽåããããŸãã ãããã£ãã¡ãªããã»ãã¡ãªãããè©äŸ¡ããã«æè¡ã硬çŽåãããããšã¯æãã§ã¯ããªãããã 宿çã«å
容ãè©äŸ¡ã»èŠçŽããŠãããŸãããããšããããšã§ãã ãããæéã軞ã«ã ãæšªæçãªæ€èšâ詊è¡âè©äŸ¡ãã®ãµã€ã¯ã«ãç®æãããšã骚åã«ããããŸãã medibaã«ãããéçºã®ç¹åŸŽ ããã§ã¯ãmedibaã«ãããéçºã®ç¹åŸŽãåãäžãã ãæ°èŠéçºæã®æè¡éžå®ãã®èæ¯ã説æããŸãã 倧ããªç¹åŸŽãšããŠã äžã€ã®ãããã¯ã(ã·ã¹ãã ïŒã®æ°èŠéçºããéçšïŒã°ããŒã¹ãã§ãŒãºïŒã»ä¿å®ãŸã§ã 瀟å
ã§äžæ°é貫ã§å¯Ÿå¿ããããšãæãããŸãã ãŸãããæ°èŠéçºãããéçšããå°éã«ããããŒã ã¯ãªãã ãããŸã§ãããã¯ãæ¯ã§ã®ããŒã ã§æ
åœããã®ãç¹åŸŽçã§ãã 瀟å
ã§æ±ããããã¯ãïŒãµãŒãã¹ïŒæ°ã¯æ°åã»ã©ããã å¿
ç¶çã«ããŒã çµæã®æ©äŒãå€ããªããŸãã äžèšã®å³ã䜿ã£ãŠèª¬æããŸãã äŸãšããŠããããã¯ãAãšBã®æç³»åã§ãæ°èŠéçºããéçšããä¿å®ãã®ãã§ãŒãºãš ãã®æç¹ã§å¿
èŠãšããããšã³ãžãã¢ãå³ç€ºããŠã¿ãŸããã ãããã¯ãBã®éçšãã§ãŒãºéå§æã«ã€ããŠèããŠã¿ãŸãã ç°¡åã®ããã«ãããã¯ãAã®éçšã¡ã³ããŒãããããã¯ãBã®éçšãæ
ãããšã«ãªãå Žåã ãããã¯ãAãšBã®æ¡çšæè¡ã倧ããç°ãªãå Žåã ãã®æè¡çãªç¿åŸããªã³ããŒãã£ã³ã°ãªã©ã«å€§ããæéãåãããŠããŸãã æ¬æ¥éçšïŒã°ããŒã¹ãã§ãŒãºïŒã«æåŸ
ããããããªç©æ¥µçãªéçºãã·ã¹ãã ã®å®å®æ§ãé«ããåãçµã¿ãéæã§ããªãã ãããã¯ããããããŒã çµæãé£ãããšãã£ã課é¡ãçºçããŠããŸããã ãã®ãããªèæ¯ããäžè¿°ã®ãæ°èŠéçºæã®æè¡éžå®ãã®æéãäœæããŸããã æåŸã« ããžã§ã³ïŒãè¯ããã®ããå±ãç¶ãã ãã¯ãããžãŒã»ã³ã¿ãŒã®ããžã§ã³ãšããŠãããè¯ããã®ããå±ãç¶ãããããããŸãã æ¥ã
çŸå Žã§ã®æ¥åãè¡ã£ãŠãããšã çæçãªçŽæãèªããŒã ã®ã¡ã³ããŒã«ããæèãéäžããããšãå€ããèŠç¹ãçããªããã¡ã§ãã æã«ã¯ããèšã£ãããžã§ã³ã«ç«ã¡è¿ããé·æçã«çµç¹å
šäœãæ¥çå
šäœã«ãç®ãåãã€ã€ ãè¯ããã®ããå±ãç¶ããããã«ãèªåãã¡ã䜿ãæè¡ãããè¯ãå€åãããŠããããšã¯ã çµç¹ãšããŠãå人ãšããŠãæŽãªãæé·ã«ç¹ãããšä¿¡ããŠããŸãã ããžã§ã³ã®å®çŸã®ããã«ã å°éã«äžæ©ãã€äžç·ã«åãçµãã§é ãããšã³ãžãã¢ã®æ¹ã®å¿åãmedibaã§ã¯ãåŸ
ã¡ããŠãããŸãã
mediba Advent Calendar 2021 ã® 18 æ¥ç®ã®èšäºã§ãã ããã«ã¡ã¯ããšã³ãžãã¢ã®äžçïŒ @yn2011 ïŒã§ããæè¿ã¯ Switch ã®æå§«ã§çŽæ»ã®éçŒã«ã€ããŠåŠãã§ããŸãã åãã« ãããã¯ããæ°èŠã«éçºããéã«ãã©ã㪠Lint ããŒã«ãå°å
¥ããã©ã®ãããªèšå®ã§å©çšãããã¯æ©ãããšãå€ãã§ããæçµçã«ã¯ããŒã ã¡ã³ããŒãšè°è«ãããŠæ±ºããŠããå¿
èŠããããŸããã瀟å
å€ã®ä»ã®ãããã¯ãã§ã©ã®ããã«ããŠãããåèäºäŸã欲ããå ŽåããããŸããæ¥åã§éçºãããããã¯ãã®ã³ãŒãããŒã¹ã¯ç€Ÿå€ã«å
¬éãããããšã¯å°ãªããããä»ç€Ÿã§ã©ã®ãã㪠Lint ããŒã«ãå°å
¥ããŠããã®ããç¥ãæ©äŒã¯å°ãªãã§ãã ãããã£ãèæ¯ãããçŽè¿ã®ãããã¯ãéçºã«ãã㊠â ã©ã㪠Lint ããŒã«ãå°å
¥ããŠããããâ¡ ç¹ã«å·¥å€«ããŠããèšå®ã¯äœãã ãšãã Lint ã«ãã©ãŒã«ã¹ããå
å®¹ãæžãããã©ãã ãããšèããä»åã®èšäºã®ããŒããšããŸããã æšå¹ŽããåŒãç¶ããmediba ã®ãããã¯ãã§ã¯ Next.js ã®æ¡çšãå¢ããŠããŸãããã®äžã®ãšãã Next.js æ¡çšãããã¯ããäŸãšããŠä»åã玹ä»ããŸãã tsc TypeScript ã§ããNext.js 9 以éã¯ãTypeScript é¢é£ã®æ©èœã¯ãã«ãã€ã³ãããŠã㊠yarn build æã«åæ€æ»ãè¡ããŸããã忀æ»ã ããä»»æã®ã¿ã€ãã³ã°ã§è¡ãå Žåã¯ã tsc -p . --noEmit ã®ãããªã³ãã³ããå®è¡ããŸããLint ããŒã«ã§ã¯ãããŸãããã忀æ»ã®ããã«ã ã䜿çšããŠããã®ã§äžå¿èšèŒããŸããã ESLint ESLint ã§ããNext.js 11 以éã¯ãESLint é¢é£ã®èšå®ããã«ãã€ã³ããããã«ãªãã next lint ã§å®è¡ãšèšå®ãã§ããŸãã Next.js åãã®ã³ã³ãã£ã°ãšããŠã eslint-config-next ããããŸãã以äžã®ã«ãŒã«ã¯ãªãã«ããŠããŸãã "@next/next/no-img-element": "off", "@next/next/no-html-link-for-pages": "off", "@next/next/next-script-for-ga": "off", "@next/next/no-sync-scripts": "off", Next.js ã®æ©èœã掻çšããããã®ã«ãŒã«ããªããªãã«ããŠãããçåã«æããããããããŸããã®ã§çç±ã説æããŸãã no-img-element ã¯ãNext.js ãæäŸãã next/image ã䜿çšããã«ãimg èŠçŽ ã䜿çšããŠããå Žåã«èŠåãè¡ãã«ãŒã«ã§ãããããã¯ãã§ã¯ãSSR ã§ã¯ãªããSSG ã䜿çšããŠã㊠next/image ã¯æªäœ¿çšãªã®ã§ãªãã«ããŠããŸãã no-html-link-for-pages ã¯ãNext.js ãæäŸãã next/link ã䜿çšããã« anchor èŠçŽ ã®ã¿ã䜿ã£ãŠãªã³ã¯ãå®è£
ããŠããå Žåã«èŠåãè¡ãã«ãŒã«ã§ããnext/link ã䜿çšããããšã§ãCSR ã§ããŒãžé·ç§»ãå®çŸããããšãå¯èœã«ãªããŸãããmediba ã§å©çšããŠãã Google Analytics åãã®å®è£
ã§ã¯ããŒãžé·ç§»æã®éèšã«æžå¿µãããããšãåãã£ãŠããŸãããããã£ãçç±ããæå³çã« next/link ã䜿çšããªãããã«ããŠãããããã«ãŒã«ããªãã«ããŠããŸãã next-script-for-ga ãš no-sync-scripts ã¯ã next/script ã®ä»æ§ããã¡ããšèª¿æ»ã§ããŠããªãã£ãã®ã§æ«å®çã« script èŠçŽ ã䜿çšããŠããŸãããä»åŸå¯Ÿå¿ãããããããŸããã Stylelint Stylelint ã§ãããããã¯ãã§ã¯ãstyled-components ã®ãã㪠JS in CSS ã§ã¯ãªãã .scss ãã¡ã€ã«ã«å®çŸ©ãã CSS ã CSS Modules ããå©çšããŠããããããããã£ã®äžŠã³é ã® auto fix çãStylelint ã®æ©èœãå
šãп޻çšããããšãã§ããŠããŸãã ããããã£ã®äžŠã³é å®çŸ©ã¯ã stylelint-config-recess-order ã䜿çšããŠããŸããå®çŸ©ãããŠããããããã£ã®æ°ãšã¡ã³ããã³ã¹ã®é »åºŠã®é¢ã§ãä»ã®ã©ã€ãã©ãªãèªèº«ã§äœæãããããè¯ãããã ã£ãããéžå®ããŸããã ãŸãã Prettier ã䜿çšããŠããã®ã§ stylelint-config-prettier ã§ç«¶åãé²ãã§ããŸãã markuplint markuplint ã§ããHTML Living Standard ã®ä»æ§ã«æºæ ãã HTML ã«ãªã£ãŠããããæ€èšŒã§ããŸããReact (JSX) ã«ã察å¿ããŠããŸãã ã«ãŒã«ãç¬èªã«è¿œå ããŠããŸãã { "nodeRules": [ { "selector": "meta[property]", "rules": { "invalid-attr": { "option": { "attrs": { "property": { "type": "String" }, "content": { "type": "String" } } } } } } ] } meta èŠçŽ ã®å±æ§ã«ã€ããŠã§ããSNS ã§ããŒãžãå
±æãããéã®æåãå®çŸ©ããããããã®ãã㪠meta èŠçŽ ãå®è£
ããããšãå€ããšæããŸãã <meta content="ããŒãžã¿ã€ãã«"> ãã®å®è£
㯠markuplint ã 2 ã€èŠåãåºããŸãããŸããHTML Living Standard ã® meta èŠçŽ ã®ä»æ§ã«ã¯ãproperty 屿§ãå®çŸ©ãããŠããªãããèŠåãåºããŸãã ãŸããname 屿§ãå®çŸ©ãããŠããªãå Žåã«ãcontent 屿§ã䜿çšããããšãã§ããªãããããã¡ãã«ã€ããŠãèŠåãåºããŸãã ã§ã¯äžäœãã®å±æ§ã¯äœãªãã ããšãã話ã«ãªããŸãããproperty 屿§ã«ã€ããŠã¯ RDFa ã§å®çŸ©ãããŠããã OGP ã«åŸã£ãŠãã® meta èŠçŽ ã SNS åŽãè§£éããŸãããããã£ãŠããã§ã¯äŸå€ãšããŠåãæ±ãããã«ã«ãŒã«ã倿ŽããŠããŸãã ãªããReact ç¬èªã®å±æ§ïŒ key ã dangerouslySetInnerHTML ) 㯠@markuplint/react-spec ã«å«ãŸããŠããããç¬èªã«ã«ãŒã«ã远å ããå¿
èŠã¯ãããŸããã䟿å©ã§ãã ãŸãšã çŽè¿ã® Next.js æ¡çšãããã¯ããäŸã«ã䜿çšããŠãã Lint ããŒã«ãšããã®èšå®ã«ã€ããŠã玹ä»ããŸããããããã® Lint ããŒã«ã¯å
šãŠ GitHub Actions ã§ commit push ãããªã¬ãŒã«ããŠå®è¡ããŠããŸãã®ã§ãã«ãŒã«ã«éåããŠããã³ãŒããã³ããããããšããã«æ°ã¥ãããšãã§ããLint ããŒã«éçšã®åœ¢éªžåãé²ãããšãã§ããŠããŸãã Lint ããŒã«ã®å°å
¥ã«ãã£ãŠãã³ãŒãããŒã¹ãã¯ãªãŒã³ã«ä¿ã€ããšã¯ãã¡ããã§ãããæšæºä»æ§ããã¹ããã©ã¯ãã£ã¹ãç¥ãè¯ããã£ããã«ããªã£ãŠããŸãã Lint ããŒã«å°å
¥æã®åèã«ãªãã°å¹žãã§ããæåŸãŸã§ãèªã¿é ãããããšãããããŸããã
ã¯ãããŸããŠãmediba æ°å2å¹Žç® ããŒã¿ã¢ããªã¹ãã®å·Šæµ·ã§ãã mediba Adventã«ã¬ã³ã㌠10æ¥ç®ãšããããšã§ãç§ããã¯GTMã䜿çšããŠèªç€Ÿãµã€ãã«Microsoft Clarity(ããŒããããããŒã«)ãèšå®ãããè©±ãæžããŠãããŸãã Microsoft Clarityã§ã§ããããš Clarityãšã¯ãMicrosoft瀟ãã2020幎10æã«ãªãªãŒã¹ãããç¡æã®ããŒããããããŒã«ã§ãã Clarityã§ã§ããããšã¯ãäž»ã«ä»¥äžã®3ã€ã§ãã ãµã€ã蚪åè
æ°ãé¢è±è
æ°ãä»»æã®ããŒãžã«ãããã¹ã¯ããŒã«ãããå²åãªã©åºæ¬æ°å€ãææ¡ã§ãã 1ãŠãŒã¶ãŒã«ãã©ãŒã«ã¹ããŠããµã€ãäžã§ã©ããªè¡åãããã®ãã»ãã·ã§ã³ã¬ã³ãŒãã£ã³ã°(é²ç»)ã§ãã ã©ããã¯ãªãã¯ããŠãã©ããŸã§ã¹ã¯ããŒã«ããã®ãããŒããããã§èŠèŠçã«å¯èŠåã§ãã å°å
¥ç·š èšå®æé GTMã䜿çšããå Žåã¯ã以äžã®é ã«èšå®ããŠãããŸãã Microsoft Clarity ã¢ã«ãŠã³ããäœæãã GTMã䜿çšããClarity tracking codeãé
ä¿¡ãã GTMã®ãã¬ãã¥ãŒã§ãèšå®ããã¿ã°ãé
ä¿¡ãããŠããã確èªåŸãå
¬éãã Clarityã®ç®¡çç»é¢ã§ãæ£ããæ°å€ãèšæž¬ãããŠããã確èªãã Microsoft Clarityã®ã¢ã«ãŠã³ããäœæãã Microsoft Clarity ã«ã¢ã¯ã»ã¹ããèµ€æ ç®æãã¯ãªãã¯ããŠã¢ã«ãŠã³ããäœæããŸãããã®åŸãå¿
èŠäºé
ãèšå
¥ããŸãã GTMã䜿çšããClarity tracking codeãé
ä¿¡ãã Clarity管çç»é¢ > Settings > SetupããClarity tracking codeãã³ããŒããGTMã®ã¿ã°èšå®ç»é¢ã®HTMLã«è²Œãä»ããŸãã GTMåŽã§ãã¿ã°ã®äœæãšããªã¬ãŒã®èšå®ãè¡ããŸãã ã¿ã°ã®äœæã¯ãGTM 管çç»é¢ > ã¿ã° > æ°èŠ ããäœæãããŸããã¿ã°ãšããªã¬ãŒã®èšå®ã¯ä»¥äžã®éãã§ãã ã¿ã°ã®çš®é¡ïŒã«ã¹ã¿ã HTML ããªã¬ãŒã®èšå®ïŒAll Pages 以äžã§ãã¿ã°ã®äœæãšããªã¬ãŒã®èšå®ã¯å®äºã§ãã GTMã®ãã¬ãã¥ãŒã§ãäœæããã¿ã°ãåé¡ãªãé
ä¿¡ãããŠããã確èªãã GTMã®ãã¬ãã¥ãŒç»é¢ã®Tags Firedã«Microsoft Clarityã¿ã°ã確èªã§ããŸãããåé¡ãªããã¿ã°ãçºç«ãããŠããããã§ããå
¬éãã¿ã³ãã¯ãªãã¯ããŸãã GTMã®èšå®ã¯ä»¥äžã«ãªããŸãã Clarityã®ç®¡çç»é¢ã§ãæ£ããæ°å€ãèšæž¬ãããŠããã確èªãã æåŸã«ãClarityã®ç®¡çç»é¢ã§ãåé¡ãªãæ°å€ãèšæž¬ãããŠããã確èªããŸããã¿ã°å
¬éãã2æéã»ã©ã§ãClarityã®ããã·ã¥ããŒãç»é¢ã«æ°å€ãåæ ãããŸããã ããŒããããã®ããŒã¿ãåæ ãããæŽ»çšã§ããããã«ãªã£ãŠããŸãã GTMçµç±ã§ãèªç€Ÿãµã€ãã«Clarityã®èšå®ãå®äºããŸããã Session Recordingsã«ã€ã㊠以äžã®éããSession RecordingsãæŽ»çšã§ããããã«ãªã£ãŠããŸãããŠãŒã¶ãŒã®ã«ãŒãœã«ã®åããé®®æã«é²èЧã§ããŸãã æŽ»çšæ¹æ³ã®æ€èš Clarityã¯ã©ããã£ãå Žé¢ã§æŽ»çšããããšãã§ããã®ããæ€èšããŸãããããã§ã¯ãä»®èšãšããŠãä»»æã®ããŒãžã®æ¬¡ã®ããŒãžãžã®é·ç§»çãæžå°åŸåã§ãããšããŸãããããããšã以äžã®ãããªèª²é¡çºèŠããæææ±ºå®ãŸã§ã®æµãããèããããŸãã 課é¡çºèŠ ãŸãã¯ã課é¡ãèšå®ããŸããããã§ã¯ãä»®ã®èª²é¡ãšããŠããä»»æã®ããŒãžã®æ¬¡ã®ããŒãžãžã®é·ç§»çãæžå°åŸåã§ããããšããŸãã çŸç¶ææ¡ã»èŠå èª¿æ» GAã®å®éããŒã¿ã䜿çšãã課é¡ã®èŠå ãçªãæ¢ããããšããŸããããããå®éããŒã¿ã ãã§ã¯ãç¹ã«èŠå ãåãããŸããã æ¬¡ã«ãClarityã䜿çšããŠãä»»æã®ããŒãžã§äœãèµ·ãã£ãŠããã®ãã»ãã·ã§ã³ã¬ã³ãŒãã£ã³ã°ãšããŒããããã§èŠå ã調æ»ããŸããäŸãã°é掻æ§ç®æãã¯ãªãã¯ãããŠãããããªå Žåã«ã¯ã誀ã¯ãªãã¯ã§é¢è±ããŠããããšèšãããããããŸããã æ¹ç æ¹çãšããŠä»¥äžã®æ¡ãæµ®ãã¶ã®ã§ã¯ãªãã§ããããã ã¯ãªãã¯ã§ããªãç®æãã¯ãªãã¯ã§ããããã«æŽ»æ§ããã 以äžã®ããã«ãGAã®å®éããŒã¿ã§ã¯æ®æ®µçºèŠã§ããªããããªãŠãŒã¶ãŒã®è¡åã§ãClarityã䜿çšããã°ãç°¡åã«ææ¡ããããšãã§ããã§ãããããã®çµæãæææ±ºå®ã«ã€ãªãããšèããŠããŸãã ãããã« GTMã䜿çšããããšã§ããšã³ãžãã¢ã«äŸé ŒãããšããClarityãèšå®ã§ããã®ã¯äŸ¿å©ããšæããŸãã Clarityã¯ç¡æã§ãã€å®è£
ã«æéãããããŸããããããŠãããŒãããããã»ãã·ã§ã³ã¬ã³ãŒãã£ã³ã°æ©èœãªã©å€æ§ãªæ©èœãé
åçã§ãããã²ãèªèº«ã®ãµã€ãã«Clarityãå°å
¥ããŠã¿ãŠã¯ãããã§ããããã ã©ãªããã®ãåèã«ãªãã°ã幞ãã§ãã
ããã«ã¡ã¯ããšã³ãžãã¢ã®äžçïŒ @yn2011 ïŒã§ããåèçã¯æé«ã§ãã ä»å㯠NewRelic ãã©ãŠã¶ã¢ãã¿ãªã³ã° ã䜿çšã㊠JavaScript ã®ãšã©ãŒåéãè¡ãããšããéã«ãNewRelic ã®ãœãŒã¹ãããã¢ããããŒãæ©èœã®ä»æ§ã§è²ã
ãšããã£ãŠããŸã£ããšããã話ãããŸãã ãœãŒã¹ãããã¢ããããŒã API ã«ã€ã㊠NewRelic ãã©ãŠã¶ã¢ãã¿ãªã³ã°ã§ã¯ããœãŒã¹ããããšãããã¡ã€ã«ãå©çšããŠçºçãã JavaScript ãšã©ãŒã®ã¹ã¿ãã¯ãã¬ãŒã¹ãååŸããããšãã§ããŸãã ãœãŒã¹ãããã¯ã以äžã®ãããªå
容ã®ãã¡ã€ã«ã§ãã { "version": 3, "file": "static/chunks/254-be419541614271942b8c.js", "mappings": "gFAAoEA,... } NewRelic ãã©ãŠã¶ã¢ãã¿ãªã³ã°ã«ã¯ãœãŒã¹ãããã®ããŒãžã§ã³ç®¡çæ©èœãããããœãŒã¹ãããã«ãŠããŒã¯ãªèå¥åãã¢ããããŒãæã«ä»äžããããšãã§ããŸããæäŸãããŠãããœãŒã¹ãããã®ã¢ããããŒã API ãå©çšããŠã¢ããããŒãæã«èå¥åã®ä»äžãã§ããŸãã publishSourcemap({ sourcemapPath: './dist/bundle.js.map', javascriptUrl: 'https://example.com/assets/bundle.js', ... releaseName: 'OPTIONAL RELEASE NAME', // 远å releaseId: 'OPTIONAL RELEASE ID', // 远å }, function (err) { console.log(err || 'Source map upload done')}) releaseName ãš releaseId ãæå®ã§ããããšã«éåæãæã£ãæ¹ããããããããŸãããããã¯æ¬¡é
ã®äŒç·ã§ãã ãããªãã€ã³ã releaseId ãš releaseName ã¯äž¡æ¹å¿
é æ©éäŒç·ãååããŸããNewRelic ãã©ãŠã¶ã¢ãã¿ãªã³ã°ã§ããŒãžã§ã³ç®¡çãè¡ãå Žåã¯ã releaseName ãš releaseId ã®äž¡æ¹ãå¿
é ã«ãªããŸãã ããã¥ã¡ã³ãã«èšèŒã¯ãªãããã«èªèããŠããŸããã @newrelic/publish-sourcemap ã®å®è£
ã確èªãããšããã£ããæ¡ä»¶åŒã«å«ãŸããŠããŸããã if (releaseName && releaseId) { console.log('Using release name:', releaseName, 'and release id:', releaseId) request = request.field('releaseName', releaseName) request = request.field('releaseId', releaseId) } ã³ãããããã·ã¥ã掻çšããå Žåãªã©ãã©ã¡ãã 1 ã€ã®é
ç®ãå©çšã§ããã°ååãªããšãå€ããšæããŸãããªããã®ãããªä»æ§ã«ãªã£ãŠããã®ãã¯åãããŸããã§ããã ã³ã³ããªã¯ããšã©ãŒ ãœãŒã¹ãããã®ããŒãžã§ã³ç®¡çãè¡ããªãå Žåã¯ã releaseName ãš releaseId ãæå®ããå¿
èŠã¯ãããŸããããããã1 床ãããã®é
ç®ã空ã§ã¢ããããŒãããŠããŸããšã次ã«ã¢ããããŒãããéã« releaseId ãš releaseName ãæå®ããŠã¢ããããŒãããŠãã³ã³ããªã¯ããšã©ãŒãšããã¬ã¹ãã³ã¹ãè¿ããã¢ããããŒãã倱æããŸãã ã³ã³ããªã¯ããšã©ãŒã¯ãNewRelic ã«åäžã®ãœãŒã¹ããããã¢ããããŒãããå Žåã«çºçãã仿§ãšãªã£ãŠããŸãã releaseName ãš releaseId ãç°ãªãå Žåã¯å¥ã®ãœãŒã¹ããããšããŠè§£éãããããã¢ããããŒããå¯èœã§ãã ããŒãžã§ã³ç®¡çãè¡ãå Žåã¯ã1床ã releaseName ãš releaseId ã空ã®ãœãŒã¹ããããåé€ããå床ã¢ããããŒãããå¿
èŠããããŸãã ãã©ãŠã¶åŽã§ addRelease ãåŒã³åºãå¿
èŠããã ãœãŒã¹ãããã®ããŒãžã§ã³ç®¡çãè¡ãå Žåããã©ãŠã¶åŽã§ browser agent API ããæ¬¡ã®ã¡ãœãããåŒã³åºãå¿
èŠããããŸãã newrelic.addRelease(string $release_name, string $release_id) ãã®ã¡ãœãããåŒã³åºããªããšãçºçãã JavaScript ãšã©ãŒãæ£ããããŒãžã§ã³ã®ãœãŒã¹ãããã«ãããã³ã°ããããšãã§ããŸãããã¡ãœãããåŒã³åºããã« JavaScript ãšã©ãŒãçºçãããå ŽåãNewRelic ã®ç»é¢äžã§ã¯ releaseName ãš releaseId ã¯ç©ºã«ãªããŸãã addRelease ã®åŒã³åºãã®å®è£
ãšããŠã¯ãã¹ããããã®æ«å°Ÿãžã®è¿œå ãå¯èœã§ãã NewRelic ãã©ãŠã¶ã¢ãã¿ãªã³ã°ãå©çšããå Žåã¯ãNew Relic ããæäŸãããã¹ããããããã©ãŠã¶ã§å®è¡ããå¿
èŠããããŸãããã®ã¹ããããã®å®è¡åŸã«ãbrowser agent API ãå©çšå¯èœã«ãªãããã以äžã®ããã«æ«å°Ÿã«åŒã³åºãã远å ããŸãã // çç¥... applicationID:"${config.applicationID}",sa:1}; newrelic.addRelease("foo", "bar"); // 远å addRelease ã®åŒã³åºãã¯ãé¡äŒŒãµãŒãã¹ã§ãã Sentry ã§ã¯äžèŠã§ãã£ããããæ€èšŒæã«æ°ã¥ããããã£ãŠããŸããŸããã ãŸãšã NewRelic ãã©ãŠã¶ã¢ãã¿ãªã³ã°ã®ãœãŒã¹ãããã«é¢ããããããã€ã³ãã 3 ã€æžããŸããã æçµçã«ããããã¯ãã§ã¯ãœãŒã¹ãããããŒãžã§ã³ç®¡çæ©èœã®å°å
¥ã¯èŠéããŸããããä»åŸå¿
èŠã«å¿ããŠå¯Ÿå¿ãæ€èšããäºå®ã§ãã æåŸãŸã§ãèªã¿é ãããããšãããããŸããã
ã¯ããã« ããã«ã¡ã¯ãSRE Unitã®å浊( @kitta0108 )ã§ãã åœããã°ã¯ãå·ç掻åãã¢ãã§ãã£ããã©ãããšããæ°ãã詊ã¿ãããŠãããŸããŠã ãã¯ãããžãŒã»ã³ã¿ãŒ6G Managerã®äžå°ãã( @primunu )ã SRE Unitã®æ¿è°·ãã( @mary_tuba )ã ãããŠå浊ã®3人ã§ãéãããŠãããŸãã ããŠãçããã¯ã¢ããªã±ãŒã·ã§ã³ã®å®è¡åºç€ãšããŠã®ã³ã³ããã€ã¡ãŒãžãéžå®ãããšããã©ã®ãããªé¢å¿è»žãæã£ãŠæãã§ãŸããïŒ ä»åã¯Distrolessã€ã¡ãŒãžã«ã€ããŠãäœã®å¬ãã¿ãããã®ããã©ã®ãããªåªäœæ§ãããã®ããªã©ãæ·±æãã£ãŠãããããšæããŸãã çããã®åŒãåºãã®äžã€ãšããŠãç¥èŠã«å ããŠããã ãããããªããšããã£ããªããšãŠãå¬ããæããŸãïŒ å¯Ÿè±¡è
ã€ã¡ãŒãžãéžå®ãã人 = DockerFileãæžã人 ã€ã¡ãŒãžã®è匱æ§å¯Ÿå¿ã匷ããã人 ã³ã³ãããµã€ãºã®è»œéåãè¿œãæ±ããã人 æŠèŠ Distrolessãšã¯ãGoogleãå
¬éããŠããã¢ããªã±ãŒã·ã§ã³ãšãã®ã©ã³ã¿ã€ã äŸåã®ã¿ãå«ãŸããDebian10(buster)ã«åºã¥ããŠäœæãããã³ã³ããã€ã¡ãŒãžã§ãã https://github.com/GoogleContainerTools/distroless å¿
èŠãªäŸåã®ã¿ãå«ãŸãããšã¯ïŒ Distrolessã«ã¯ã¢ããªã±ãŒã·ã§ã³ã®å®è¡ã«å¿
èŠãªäŸåããå«ãŸããŠããŸããã ãªã®ã§ãShellã¯ããããaptãcdãšãã£ãæ©èœãæããŠããŸããã ã ãããããè¯ããããã§è¯ãã®ã§ãã以äžãã芧ãã ããã ãã®å³ã¯AWSã®ECRã«ãããã以äžã®ãã¬ãŒã³ã€ã¡ãŒãžãããã·ã¥ããçµæã«ãªããŸãã ïŒGoã®ã¢ããªã±ãŒã·ã§ã³ãåãããšããåæã§ã€ã¡ãŒãžãéžãã§ãŸããïŒ alpine:3.13 golang:1.16.5-buster gcr.io/distroless/static-debian10 ã©ãã§ããããããã®æç¹ã§å¬ãã¿ãã€ã³ãã2ã€èŠããŠããŸãããïŒ å¬ãã¿ãã€ã³ããã®1 軜éã§ãããšããããš Debianã®318MBãšããã®ã¯çœ®ããŠãããŠw Alpineã®2.81MBãšæ¯èŒããŠãDistrolessã®0.66MBã¯ãã¡ããã¡ã軜ãã§ãã ã³ã³ãããæ±ãäžã§ã¯ãã€ã³ãã©ã®æ¯ãèããšããŠãã¹ã±ãŒãªã³ã°æ§èœã坿¬æ§ã®åäžãæåŸ
ãããã§ãããããã®è»œéãã€ã³ãã¯å¬ããã§ãããã å¬ãã¿ãã€ã³ããã®2 ã»ãã¥ã¢ã§ãããšããããš å®ã¯ãã£ãããšECRã«Image Scanningæ©èœãONã«ããŠãããŸããã ããã§ãDistrolessã€ã¡ãŒãžã¯å ã
ã®Noneã®æåã…ïŒ ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããäžã§äœåãªäŸåãå«ãŸããªããšããããšã¯ãããã ãè匱æ§ãé²åããå¯èœæ§ãäœããªãããšã«ãç¹ãããŸãã ã³ã³ããã€ã¡ãŒãžã®ã¬ã€ã€ãŒã§ãããæããããã®ã¯å¬ãããã€ã³ãã§ãããã ã€ã¡ãŒãžã®ããŒãžã§ã³äžãäœæ¥ã®é »åºŠãå°ãªããªãããã§ãã ãŸãšã ä»åã¯ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã®ã€ã¡ãŒãžãšããŠDistrolessã玹ä»ããŠã¿ãŸããããããã§ããã§ããããã å©çšããŠããèšèªãDistrolessã«å¯Ÿå¿ããŠããã®ã§ããã°ãç©æ¥µçã«å©çšãæ€èšããŠããããšå人çã«ã¯æããŸãã ãã ããDistrolessãå©çšããã€ã¡ãŒãžã®äœæã«ã¯Shellãå«ãŸããŠããªããšããç¹ã§ã¡ãã£ãšããã³ããå¿
èŠã«ãªããŸãã æéããã£ãããã€ã¡ãŒãžã®äœææ¹æ³ãªã©ãå
·äœçã«ãããã®ãæžããŠã¿ããã㪅ïŒïŒ
ã¯ãããŸããŠã2021幎床æ°åã®æšæã§ãã ããã³ããšã³ããšã³ãžãã¢ãšã㊠ãã¯ãããžãŒã»ã³ã¿ãŒ5G ã«æå±ããŠããŸãã ä»åã¯ãNuxt.js ãªãã³ã« TypeScript ãå©çšããŠãç°¡åãªæœéžããŒã«ãäœæããŠã¿ãå
容ã«ã€ããŠã玹ä»ããŸãã Nuxt.js ãš TypeScript Nuxt.js ã¯ãVue.js ããŒã¹ã® JavaScript ã®ãã¬ãŒã ã¯ãŒã¯ã§ããWebããŒãžæ§ç¯ã«æçšãª UI 以å€ã®æ©èœïŒ Ajax ããµãŒããŒãµã€ãã¬ã³ããªã³ã°ãªã©ïŒããŸãšããŠå©çšã§ããç°å¢ãæäŸããŠãããŸãã Nuxt.js å
¬åŒãµã€ã TypeScript ã¯ãçç¥å¯èœãªéçåä»ããšã¯ã©ã¹ããŒã¹ãªããžã§ã¯ãæåãå ãã JavaScript ã®ã¹ãŒããŒã»ããïŒäžäœäºæïŒã§ããäžèšã§èšããšãåå®çŸ©ã§ãã JavaScript ãã TypeScript å
¬åŒãµã€ã ãªãæœéžããŒã«ãäœã£ãã®ã äž»ãªçç±ã¯ã以äžã®2ç¹ã§ãã ç§ã®æå±ããããŒã ã§æ±ã£ãŠãã Nuxt.js ããã³ Typescript ã®æŠèŠãæŽããã ããŒã å
ã§MTGã®ãã¡ã·ãªããŒã¿ãåã£ãŠããŸã課é¡ã解決ãããã å®æç© ãã£ããã§ããã宿ããç©ããã¡ãã ã©ã³ãã ã«ãŠãŒã¶ãŒãæœéžã§ããã·ã³ãã«ãªããŒã«ã§ãã ãã¶ã€ã³ã¯è¿å¹Žæµè¡ã£ããã¥ãŒã¢ãŒãã£ãºã ãåãå
¥ããŠã¿ãŸããã å°ãªãé
è²ã§ãå¹åžã«ãã£ãŠå¥¥è¡ããã§ããã®ã§ãã·ã³ãã«ãªããŒã«ã§ãèŠæ ããè¯ããªããŸãã 䜿ã£ãæè¡ Nuxt.js 2.15.7 TypeScript 4.2.4 Vue.js 2.6.14 Vuex 3.6.2 firebase 8.7.1 tailwindcss 2.2.4 sass 1.35.1 ç°å¢ M1 Mac VSCode yarn æ©èœ ä»åã®æœéžããŒã«ã®æ©èœã¯ä»¥äžãšããã§ãã ãŠãŒã¶ãŒãç»é²ã»åé€ãã ãŠãŒã¶ãŒæ
å ±ãDBã§ä¿æãã ç»é²ãããŠãŒã¶ãŒããã©ã³ãã ã«æœéžãã å®äºãã人ã»äŒã¿ã®äººã«ãã§ãã¯ããæœéžå¯Ÿè±¡ããå€ã æœéžçµäºåŸãéžã°ãã人ã¯èªåã§å®äºãã§ãã¯ããã å
šå¡ãã§ãã¯ãããäžæ¬ãªã»ããã§ãã äœææé å
šäœçãªæµãã¯ä»¥äžã®ãšããã§ãã ç°å¢æ§ç¯ åæ©èœäœæ Vuexå°å
¥ firebaseå°å
¥ 1. ç°å¢æ§ç¯ create-nuxt-appãå©çšããŠç°å¢ãæ§ç¯ããŸããã create-nuxt-app å
¬åŒãµã€ã ãš Nuxt.js å
¥éã®èšäº ãåèã«ããŸããã 2. åæ©èœäœæ åè¿°ããåçš®æ©èœãå®è£
ããŠãããŸãã æ¬ åžè
ã®å¯Ÿå¿ å®äºãã人ã ãã§ãªããäŒã¿ã®äººãªã©æœéžå¯Ÿè±¡ããé€å€ãããå Žåãæ³å®ããŠãå®äºãã§ãã¯ãšã¯å¥ã«é€å€ããããŠãŒã¶ãŒãæå®ã§ãããããã©ã°ãæãããŠããŸãã ã³ã³ããŒãã³ãã«ã€ã㊠å人çã«èŠåŽããã®ã¯ã³ã³ããŒãã³ãåšãã§ãã ãŸããã©ã®ãããã®åäœã§åºåãã°è¯ãã®ãããããªãŸããã§ããã ããã§ä»å㯠Atomic Design ãåèã«åãåºããŸããã ãŸããä»ã®ç®æã§ã䜿ããããã«æ±çšçã«äœãããšã§ãã ã¯ãªãã¯ãªã©ã®ã€ãã³ãã¯å
šãŠèŠªãžæž¡ããã¹ã¿ã€ã«ã衚瀺ã®å€æŽã¯èŠªããå€ãæž¡ãããã«ããããšã§ãatomsåäœã®ã³ã³ããŒãã³ããã©ãã§ã䜿ããããå¿ãããŸããã äŸãã°ãã¿ã³ã³ã³ããŒãã³ãã¯ãäºãããã€ãã®ã¹ã¿ã€ã«ãå®çŸ©ããŠããã芪ã³ã³ããŒãã³ãã§äœ¿ããšãã«äžèšã®ããã« props ã§å¿
èŠãªã¹ã¿ã€ã«ãæž¡ããšãšãã«ã$emit ã§ã¯ãªãã¯ã€ãã³ããèŠªã«æž¡ããŠããŸãã //Button.vue <div> <button :class="[ colorStyle[buttonColor], sizeStyle[buttonSize], fontStyle[buttonFont], ]" @click="$emit('button-click')" > <slot></slot> </button> </div> //Input.vue <Button button-color="gray" button-size="short" button-font="small"> ADD </Button> ãããŠã³ã³ããŒãã³ãéã®ããŒã¿ã®åãæž¡ãã§ãã äŸãã°ãŠãŒã¶ãŒæ
å ±ã¯ãåãã emit ã§èŠªã³ã³ããŒãã³ãã«å€ãåŒãæž¡ããããã«å¥ã®åã³ã³ããŒãã³ãã« props ã§æž¡ããŠè¡šç€ºããŠããŸãã ä»åã¯ã·ã³ãã«ãªããŒã«ãªã®ã§ã³ã³ããŒãã³ããå°ãªãã§ãããããããåãæž¡ããéãªã£ãŠãããšã³ãŒããç
©éã«ãªãã¡ã³ããã³ã¹ããã¥ãããªããŸããããã§ãVuex ãå°å
¥ãç¶æ
管çãããããšã«ããŸããã 3. Vuex å°å
¥ Vuex ã®ã¹ãã¢ã§ãŠãŒã¶ãŒæ
å ±ã®ç¶æ
ã管çããŸãã ä»åã¯DBã䜿ãäºå®ãªã®ã§ãactions ã§DBã«æ¥ç¶ããåŸãå€ã state ã«åæ ãããŠããŸãã Nuxt.js 㯠store ãã£ã¬ã¯ããªã«ãã¡ã€ã«ãäœæããã ãã§ã¹ãã¢ãæå¹åããŠãããã®ã§äŸ¿å©ã§ãããä»åã¯ç®¡çããã®ããŠãŒã¶ãŒæ
å ±ã ããªã®ã§ãindex.ts ãäœãã users.ts ãçŽäžã«äœããŸããã Vuex ã¹ãã¢ã§ããŒã¿ãäžå
管çã§ããã®ã§ãæ¬åœã«ãããããããªããŸãããã³ã³ããŒãã³ããè¶
ããŠå
±æãããæ
å ±ã管çããã«ã¯ããšãŠã匷åãªããŒã«ã ãšæããŸãã äžæ¹ã§ãVuex ã䜿çšããéã«ã¯ã泚æç¹ããããŸãã äŸãã°ãå°ããã¬ãã«ã®ã³ã³ããŒãã³ããã㯠Vuex ã䜿çšããªãæ¹ãè¯ãã§ãããã ã³ã³ããŒãã³ãã®äœ¿ãåããé£ãããªãã®ãšãïŒç»é¢ã®äžã§è€æ°ã®ç®æãã Vuex ã®ã¹ãã¢ãžã®åç
§ãšå€æŽãå
¥ãçµãã å ŽåãåŠçã远ãã«ãããªãããã§ãã åèïŒ Vuexã¯ãªãã¹ãé¿ãã ããã Vuexã§äœãããããäœãããªãã Vuex ãå©çšããéã¯ã Atom ã Molecule ã¬ãã«ã®ã³ã³ããŒãã³ãã®äžã§ã¯äœ¿ããªã ã state ãçŽæ¥åç
§ããªã ããªã©ã®ã«ãŒã«ãèšããŠéçšããããšæããŸãã 4. firebase å°å
¥ DBãšãããã€ã¯ firebase ãå©çšããŸãã firebase ã¯ä»¥åã«ã䜿ã£ãããšããããŸãããããã¯ã firestore ã䜿ãã°é¢åãªæéããããã«DBãå®è£
ã§ããŸãããäžæ³ã ãããã€ã firebase ã® Hosting ã䜿ã£ãŠè¡ããŸããã ããã«ãä»åã¯ç€Ÿå
åãããŒã«ãªã®ã§ããããã€ã«ãããå€éšããã®ã¢ã¯ã»ã¹ãå¶éããããã Authentication ã䜿çšããŠãã°ã€ã³èªèšŒã远å ããŸãã管çè
ã¢ã«ãŠã³ããšããŠãŠãŒã¶ãŒãäžäººã ãç»é²ããç°¡åãªPWãæãŠã°èª°ã§ã䜿ããããã«ããŸããã ãã°ã€ã³ããŠããªãç¶æ
ã§ã¯èªèšŒåŸã®ããŒãžãžé£ã¹ãªãããã«ããããã匷å¶çã«indexãžãªãã€ã¬ã¯ãããmiddlewareã远å ããŠããŸãã const auth = firebase.auth() const middleware: Middleware = ({ route, redirect }) => { auth.onAuthStateChanged((user) => { if (!user && route.name !== 'index') redirect('/') }) } ãŸããAuthentication ã®èªèšŒç¶æ
ã¯ãããã©ã«ãã§ã¯ãŠãŒã¶ãŒããã©ãŠã¶ãéããåŸã§ãæ°žç¶çã«ç¶æãããããã«ãªã£ãŠããŸãã ä»åã¯ç®¡çè
ã¢ã«ãŠã³ãäžã€ã ãã®äœ¿çšã«ãªãããããã°ã¢ãŠãããã«ãŠã£ã³ããŠãéããŠããŸããšãä»ã®äººãã¢ã¯ã»ã¹ããæã§ãåã®ã»ãã·ã§ã³ãç¶ãããšã«ãªããŸãã ããã§ã firebase.auth().setPersistence ã¡ãœããã§æ°žç¶æ§ã¿ã€ãã SESSION ã«å€æŽããããšã§ããŠã£ã³ããŠãã¿ããéãããã³ã«ãã°ã€ã³ç¶æ
ãã¯ãªã¢ãããããã«ããŸããã ã¡ãªã¿ã«ãNuxt.js ã«ã¯ nuxt/firebase ãšããã¢ãžã¥ãŒã«ããããŸããfirebase ãããç°¡åã«å©çšã§ããã®ã§ãèå³ãããã°ã芧ãã ããã è©°ãŸã£ããšãã sass ã®å°å
¥ sass ã®å°å
¥ã§æ²ŒããŸãããã©ããã node ã®ããŒãžã§ã³16 ã〠M1ããã ã ãš node-sass ãåããªãããã§ãïŒ2021/09 å·çæç¹ïŒãnode ã®ããŒãžã§ã³ãäžããããšã§è§£æ±ºããŸããã åå®çŸ© Vuex ã§ã®åå®çŸ©ãprops ã§ã®åå®çŸ©ãfirebase ã§æ±ãæ¥æã®åå®çŸ©âŠ åæšè«ãå¹ãããæ°ã¥ãã°anyã«ãªã£ãŠããåã«èŠãããããŸããã ç¹ã« Vuex ã¯ãã¹ãã¢ãžã¢ã¯ã»ã¹ããããã®äŸ¿å©ãªåããªããä»å䜿çšãã this.$store 㯠Nuxt.js ã§åæå®ãããŠããŸããã èªåã®åã䜿ããã nuxt-typed-vuex ãå©çšããããšã§æ¹åãããããªãããã§ãã ãŸãã TypeScript ãš Vuex ã®çžæ§ã¯è¯ããªããã³ã³ããŒãã³ããã store ãåŒã³åºãããšãã«åå®å
šãå®ãããªããã€ã³ããªã»ã³ã¹ãå¹ããªããšãã£ãåé¡ããããŸãã æ¬¡ã« TypeScript ã§ Vuex ãæ±ãéã¯ãNuxt.js å
¬åŒã§æšå¥šãããŠãã vuex-module-decorators ã䜿çšããããšæããŸãã æ¯ãè¿ã ããŠããããŸã§é·ã
ãšæžããŠããŸããããä»åã®ã¢ãŠãããããéã㊠Nuxt.js ãš TypeScript ã®æŠèŠã¯å€§äœæŽããããªããšããæãã§ãã çµè«ãNuxt.js 䟿å©ïŒ æ¥æ¬èªããã¥ã¡ã³ããå
å®ããŠããŠã»ãŒèª°ã§ãç°¡åã«å§ããããšãã§ãã ã«ãŒãã£ã³ã°ãèªåã§äœæããå¿
èŠããªã SSRãªã©ã¢ãŒããéžã¹ããŠæè»ãªãµã€ãèšèšãã§ãã âŠãªã©ãNuxt.js ã䜿ãããšã§çŽæçã«DOMã®å
容ãæäœã§ããããç°¡åã«æœéžããŒã«ãäœãããšãã§ããŸããã ãŸããTypeScript ã«ã€ããŠããåå®çŸ©ã®ãããã§ãã³ã³ããŒãã³ãéã®ããŒã¿ã®åãæž¡ãã§ãã©ãããåã倿ã§ããã³ãŒããèŠããããªããŸãã ããã«ãåè£å®ã®ãããã§ã³ãŒããæžãæéãççž®ã§ããããšã©ãŒãã§ãã¯ãæ©æ¢°ã«ä»»ããããšãã§ããããªã©å€ãã®ã¡ãªããããããŸããã äžæ¹ã§ãVuexãšã®é£æºã¯å
¬åŒã§æšå¥šãããŠããããã±ãŒãžã䜿ããªã©ãæ¹åã®äœå°ããããŸãã æåŸã« 以äžãNuxt.js ãå©çšããŠæœéžããŒã«ãäœæããŠã¿ãå
容ã®ç޹ä»ã§ããã æåŸãŸã§èªãã§ããã ããããããšãããããŸããã ã©ãªããã®åèã«ãªãã°å¹žãã§ãã
ããã«ã¡ã¯ããšã³ãžãã¢ã®äžçïŒ @yn2011 ïŒã§ãã8 æããåèçæ°ã«ãªããŸãã å
æ¥ãæ°ããŒã çºè¶³ã«ããããããŒã ãã«ãã£ã³ã°ã®ã¯ãŒã¯ã·ã§ãããšããŠæåãªã€ã³ã»ãã·ã§ã³ãããã®äœæã«ãã£ã¬ã³ãžããŸããããã®éã«æ¹ããŠã€ã³ã»ãã·ã§ã³ãããã«ã€ããŠå匷ãçŽããã®ã§ããã å®éã«ããŒã ãã©ããã£ãçµç·¯ã§ãã©ã®ããã«ã€ã³ã»ãã·ã§ã³ããããäœæããã ããšããå
·äœçãªäºäŸã®å
¬éãå°ãªããªãšæããŸããã ããã§ä»åã¯ãç§éã â ãªãã€ã³ã»ãã·ã§ã³ããããäœæããâ¡ ã©ã®ããã«ã¯ãŒã¯ã·ã§ãããé²ããã®ãã⢠ãããŠäœãåŸãããã®ã ã«ã€ããŠæžããããšæããŸãã ãªãã€ã³ã»ãã·ã§ã³ããããäœæããã æ°ããŒã çºè¶³ æ°ãããã¯ãã®éçºã決ãŸããããžãã¹ããŒã ãå
è¡ããŠäŒç»ãšèŠæ±ã®æŽãåºããè¡ã£ãŠããŸãããããçšåºŠã®æŽçãå®äºããããããã¶ã€ããŒãšãšã³ãžãã¢ãåæµããæ¬æ Œçã«éçºãå§ããŠãããããšããçµç·¯ã§æ°ããããŒã ã圢æãããŸããã ãããã£ãŠãããã§èšããããŒã ããšã¯ãç¹å®ã®è·çš®ã®ã¿ã§æ§æãããããŒã ã§ã¯ãªããããžãã¹ã®ã¡ã³ããŒããã¶ã€ããŒçãããã¯ãéçºã«å¿
èŠãªå
šãŠã®è·çš®ãå«ãããŒã ã§ãã ã¡ãªã¿ã«ããšã³ãžãã¢å士ãããžãã¹ã®ã¡ã³ããŒå士ã¯ãããŸã§ãåãããŒã ã§ä»äºãããŠããŸãããããšã³ãžãã¢ãšããžãã¹ã®ã¡ã³ããŒå士ã¯ã»ãŒäžç·ã«ä»äºãããããšããããŸããã§ããã äœã課é¡ã ã£ãã ãã¶ã€ããŒãšãšã³ãžãã¢ã¯éäžããããžãã¹ããŒã ã«åæµãããããªã®ã§ãããããéçºãããããã¯ãã®ç®çããããžã§ã¯ããšããŠäœãéèŠèŠããŠããã®ãçããã£ããçè§£ã§ããŠããŸããã§ããããããã£ãŠã ãããã¯ãã®èŠæ±äºé
ãæžãããããã¥ã¡ã³ããèªãã§ãããããé©åãªã®ãããªãå¿
èŠãªã®ããšããéšåã®çè§£ãçŽåŸåºŠãäœã ç¶æ
ã§ããã ãŸãããããã¯ãã®éçºãå§ããããã«ã¯ãèŠæ±ãèŠä»¶ã«èœãšã蟌ãã äžã§ååã«ãªãªãŒã¹ãããç¯å²(MVP) ãæ±ºããå¿
èŠããããŸããã ã©ãããã ãã® 2 ã€ã®èª²é¡ã«ã€ããŠãããŒã ã¡ã³ããŒãšçžè«ããã€ã³ã»ãã·ã§ã³ããããäœæããããšãšããŠãŒã¶ãŒã¹ããŒãªãŒãããã³ã°ãè¡ãããšã§èª²é¡ã解決ããããšã«ãªããŸãããïŒãªãããã®èšäºã§ã¯ã€ã³ã»ãã·ã§ã³ãããã«ã€ããŠã®ã¿åãæ±ããŸãïŒ ããããããããšããã®ã¯ç°¡åã§ãããå®éã«ç§ãã€ã³ã»ãã·ã§ã³ãããäœæã®ã¯ãŒã¯ã·ã§ãããäŒç»ããã«ããããããã€ãã®èª²é¡ã«çŽé¢ããããšãšãªããŸããããšãŠãçŸå Žææº¢ãããã®ã§ãã äŸãã°æéã®é¢ã§ã¯ä»¥äžã®èª²é¡ããããŸããã åå ããŠæ¬²ããé¢ä¿è
㯠15 人以äžã§ãå
šå¡ãåå å¯èœãªæ¥çšã®èª¿æŽãé£ãã æ¢ã«å€ãã®äºå®ãçµãŸããŠããŠã1 æé以äžã®æéã®ç¢ºä¿ãé£ãã ãããã¯ãã®ãªãªãŒã¹æ¥ã¯å€§ãŸãã«æ±ºãŸã£ãŠããããšãããã§ããã ãæ©ãå®äºãããªããã°ãããªã ãããã®å¶çŽãããã€ã³ã»ãã·ã§ã³ããã㯠10 åã®é
ç®ã§æ§æãããŠããŸãããéèŠã ãšæãããã€ãã®é
ç®ãéžæãããã以å€ã®é
ç®ã¯æ€èšå¯Ÿè±¡ããå€ããŸããããããŠãã¯ãŒã¯ã·ã§ãã㯠1 å 1 æéã§ãè€æ°åã«åå²ããããšãšããŠãäœãšãå
šå¡åå ã®ã¯ãŒã¯ã·ã§ãã宿œã®èŠéããç«ãŠãããšãã§ããŸãããã¡ãªã¿ã«ãåå å¯èœãªã¡ã³ããŒã ãã§å®æœããŠåŸã§çµæãå
±æããããšãã£ãããæ¹ã¯ããæ¥µåå
šå¡åå ã«æããŸãããã€ã³ã»ãã·ã§ã³ãããã¯çµæãšåããããæ§ç¯éçšã®è°è«ã倧äºã ãšèããŠããããã§ãã ãŸããå
容ã®é¢ã§ã¯ä»¥äžã®èª²é¡ããããŸããã ã€ã³ã»ãã·ã§ã³ãããã®ã¯ãŒã¯ã·ã§ãããå®éã«ãã¡ã·ãªããŒãããçµéšã®ããã¡ã³ããŒãããªã ããããã€ã³ã»ãã·ã§ã³ããããç¥ããªãã¡ã³ããŒãå€ã ãããã«ã€ããŠã¯ãç§ãæžç±ã Web ããæ
å ±ãåŸã€ã€åµæå·¥å€«ããŠå®æœããŠããããšã«ãªããŸããã ã©ã®ããã«ã€ã³ã»ãã·ã§ã³ããããäœæããã æ€èšã®çµæãã¯ãŒã¯ã·ã§ããã®ã¢ãžã§ã³ãã¯ä»¥äžã«ãªããŸãããããªãå³éžããæäœéå¿
èŠã ãšæã 3 ã€ã®é
ç®ã®ã¿ãéžã³ãŸããã èªå·±çŽ¹ä» ã€ã³ã»ãã·ã§ã³ãããã®èª¬æ æã
ã¯ãªãããã«ããã®ã ãšã¬ããŒã¿ãŒããã ãã¬ãŒããªãã¹ã©ã€ã㌠åå²ããŠã¯ãŒã¯ã·ã§ãããè¡ãããšã«ããŠããã®ã§ãååã¯ãæã
ã¯ãªãããã«ããã®ãããŸã§ã§ã次åã«æ®ãã®ã¢ãžã§ã³ããæ¶åããŸããã ã§ã¯ãããããã©ã®ããã«é²ããŠãã£ãã®ããåœæ¥ã®æ§åãšåãããŠãäŒãããŠãããŸããïŒãèªå·±ç޹ä»ãããã€ã³ã»ãã·ã§ã³ãããã®èª¬æãã«ã€ããŠã¯äžè¬çãªãã®ãªã®ã§çç¥ããŸãïŒ ãªããä»ç®ã䜿ãããããšãšãåååšå®
å€åã®ãã Miro ã䜿çšããŠãªã³ã©ã€ã³ã§å®æœããŸããã æã
ã¯ãªãããã«ããã®ã ãæã
ã¯ãªãããã«ããã®ããã¯ããããžã§ã¯ãã®ç®çã«ã€ããŠèªèãåãããããã®ã¯ãŒã¯ã·ã§ããã§ãã æåã«å人ã¯ãŒã¯ã®æéãåã£ãŠã1 人ãã€èªåã®èããä»ç®ã«æžããŠããããŸããããã®åŸã«å
±æã®æéãåãããã¡ã·ãªããŒã¿ãŒãè£è¶³ã質åãšã䌌ãŠããæèŠã®ã°ã«ãŒãã³ã°ãããŠãããŸããã ãã¡ããå®éã®ã¯ãŒã¯ã·ã§ããã®çµæã§ãã ã°ã«ãŒãã³ã°ã¯é£ããã§ããã倧ããã¯å®æ§çãªãã®ãšå®éçãªãã®ã§ 2 ã€ã«åããŸãããäžã®å³ã§ã¯ 3 ã€ã«åãããŠããŸããã宿§ã®ãã®ãæŽã« 2 ã€ã«åå²ããŠããŸãã äŸãã°ã宿§çãªç®çã¯ããŠãŒã¶ã«ããšãã䟡å€ãæäŸãããçã§ãå®éçãªç®çã¯ãå©çšç x % åäžãçã§ãã åºæ¬çã«ã©ã®æèŠãééã£ãŠãããšããããšã¯ãªãã®ã§ãããã©ãããŠã宿§çãªãã®ã»ã©éæã§ãããã©ããã倿ãã«ããè§£éã«ããã¬ããããŸããå®éçã§ã éæã§ããªããã°ãããžã§ã¯ããè§£æ£ã«ãªããã®ã¯ã©ãã ãšåãçŽãããšã§ãæç¢ºãªç®çãæ¢ããŠãããŸãããããã¯åæãšãªã£ãŠããã€ã³ãããã®å·®ãããã®ã§ãããžãã¹ããŒã ã®æ¹ã
ã«ãªãŒãããŠæ±ºããŠé ããŸããããã ããä»åã¯ãã®æç¹ã§ã¯å
·äœçãªæ°å€ãŸã§ã¯çã蟌ããŸããã§ãããã²ãšãŸãã¯ãããžã§ã¯ããåãã£ãŠããæ¹åã®èªèãåãããããšã倧äºãªã®ã§ãèšæž¬å¯èœãªææšã§ãããªãã°è¯ãã®ããªãšæããŸãã ãšã¬ããŒã¿ãŒããã ãšã¬ããŒã¿ãŒãããã¯ãäºåã«çšæããããã³ãã¬ãŒããåããããšã§ããããã¯ãã®éªšæ Œãæããã«ããã¯ãŒã¯ã·ã§ããã§ãã ã¡ãªã¿ã«ãéåžž ãšã¬ããŒã¿ãŒããã㯠1 ãããã¯ãã«å¯ŸããŠäœæããŸãããä»åã¯é¢é£ãããããã¯ããè€æ°ååšããŠããã®ã§åãæéã«è€æ°ã®ãšã¬ããŒã¿ãŒããããäœæããŸãããè€æ°ãããã¯ããåæã«éçºããå¿
èŠããã£ãã®ã§ãïŒçŸå®ã¯æç§æžéãã«ã¯ãããªããšããããšã宿ã§ããŸãïŒ ãšã¬ããŒã¿ãŒãããã®é²ãæ¹ãšããŠã¯ããã³ãã¬ãŒãã®é
ç®ã 1 ã€ãã€åããŠããæ¹æ³ãåããŸããã1 ã€ã®é
ç®æ¯ã«ãå人ã¯ãŒã¯ â å
±æ â ã°ã«ãŒãã³ã° â æçµçãªçããšããæé ãèžã¿ãŸãããïŒåãã¯ãäžæ°ã«å
šãŠã®é
ç®ãåããŠããã 1 人ãã€å
±æããŠããã£ãã®ã§ãããä»ç®ã®æŽçããã«ããã®ãšãæåã®é
ç®ã®èªèãåã£ãŠããªããšåŸåã®å
容ãç°ãªã£ãŠããã®ã§ããæ¹ãå€ããŸããïŒ ãã¡ããå®éã®ã¯ãŒã¯ã·ã§ããã®çµæã§ããå³ã®ä»ç®ãå人ã¯ãŒã¯ã§æžããŠé ãããã®ã§ãå·Šã®èµ€ãä»ç®ãæŽçããçµæã§ãã ãšã¬ããŒã¿ãŒãããã§æèŠãåãããããã£ãã®ã¯ããŠãŒã¶ã¯èª°ãªã®ãããšãå·®å¥åèŠçŽ ã¯äœãªã®ããã§ãããå®çŸ©ãé£ãããããªã®ãã çµéšäžãã®éšåãææ§ãªãŸãŸãããã¯ãã®éçºãé²è¡ããããšãå€ãã®ã§æåã«ç¢ºèªã§ãã ã®ã¯ãã®ã¯ãŒã¯ã·ã§ããã®å©ç¹ã ãšæããŸããã ãã¬ãŒããªãã¹ã©ã€ã㌠ãã¬ãŒããªãã¹ã©ã€ããŒã¯ãããžã§ã¯ãïŒãããã¯ãïŒã§äœã倧åã«ãããã®åªå
é äœã決ããã¯ãŒã¯ã·ã§ããã§ãã ä»åã¯ãããã¯ããšããããã¯ååã®ãªãªãŒã¹ãŸã§ã«æéãåºåã£ããããžã§ã¯ããšããŠã®åªå
é äœãšããŠæ€èšããŸããã ãã£ããæ©ã¿ãŸããããé²ãæ¹ã¯ä»¥äžã«ããŸãããïŒä»ç®ããããã·ãŒã«ãšããŠå©çšããã€ã¡ãŒãžã§ãïŒ å人ã§ã¯ãªãè·çš®ããšã«è²åãããä»ç®ãå©çšããïŒãšã³ãžãã¢ãªãé»è²çïŒ å人æ¯ã«èªåã®è·çš®ã«è©²åœããä»ç®ãå©çšããŠã1 çªåªå
é äœãé«ããšæããã®ã«æç¥š 次㫠1 çªåªå
é äœãäœããšæããã®ã«æç¥š æç¥šçµæãå
ã«ãããžã§ã¯ããšããŠã®åæã圢æãã ãã¡ããå®éã®ã¯ãŒã¯ã·ã§ããã®çµæã§ããä»åã¯éœåã«ããäºç®ã¯æ€èšããå€ããŸããïŒäºç®ã®å¢æžãå®è³ªçã«äžå¯ïŒ ã¹ã©ã€ããŒã®åé
ç®ã¯ãã¹ã³ãŒããæéãå質çã®èšèã䜿ãããŸãããå¿
èŠã«å¿ããŠèšãæããè¡ãããšã«ãã£ãŠåå è
ã®èªèéœéœ¬ãé²ãã§ããŸãã åå¥ã®èŠçŽ ã®è©äŸ¡å€ã 2 ãªã®ã 3 ãªã®ããšãã£ãéšåã¯ããŸãè°è«ãããéèŠãªãã®ã«ã€ããŠãã£ãããšèªèãåãããŸãããåªå
é äœãäžéã®ãã®ã«ã€ããŠã¯ãæ£çŽããŸããããžã§ã¯ãã®é²è¡äžã«æèãããããšã¯å°ãªããšæã£ãããã§ãããŸããå人æ¯ã§ã¯ãªããè·ç𮿝ã«ããã®ã¯åå 人æ°ãå€ãããã§ããè·ç𮿝ã®åŸåã倧ãŸãã«ææ¡ããæ¹ãå¹çè¯ãè°è«ã§ãããšèããŸããã ãã¬ãŒããªãã¹ã©ã€ããŒã«ãã£ãŠã ãªãªãŒã¹ã®ææ¥ã«å¯Ÿããã¹ããŒã¯ãã«ããŒã®æž©åºŠæçããããžã§ã¯ãã®å¶çŽã«ã€ããŠå
šå¡ã®èªèãæããããšãã§ãã ã®ã¯å©ç¹ã ãšæããŸããããŸãããããžã§ã¯ãäžç€ã§ã®æ©èœè¿œå ãæ¹é倿Žã«å¯ŸããŠããã¬ãŒããªãã¹ã©ã€ããŒã®åªå
é äœã«åŸã£ãŠæææ±ºå®ãè°è«ãè¡ããç¹ãé
åçã§ãã ã€ã³ã»ãã·ã§ã³ãããããã£ãŠã¿ãŠã©ãã ã£ãã ã€ã³ã»ãã·ã§ã³ãããã®ã¯ãŒã¯ã·ã§ããã®çµäºåŸã«ãåå è
ã®æ¹ã
ããææ³ãé ããŸããã ã€ã³ã»ãã·ã§ã³ãããã®äœæãã©ããã£ããã®ãç¥ãããšãã§ãã ã¯ãŒã¯ã·ã§ãã圢åŒã§è°è«ãã§ããããšã«ãã£ãŠããããã¯ãã«ã€ããŠçè§£ãæ·±ãŸã£ããèªèéœéœ¬ãããããšã«æ°ã¥ãã ãšãã£ãããžãã£ããªææ³ãé ããŸãããã€ã³ã»ãã·ã§ã³ãããã«ãã£ãŠã åœåã®èª²é¡ã§ãã£ãããããžã§ã¯ãã®ç®çãäœãéèŠèŠããŠããã®ãã®çè§£äžè¶³ããè£ãããšã«è²¢ç®ã§ãããšèšãããã§ã ã ãŸãããããã¯ãã«ã€ããŠããšã¬ããŒã¿ãŒãããã«ãã£ãŠè€æ°èгç¹ããè°è«ããããšã§ã以åããçè§£ãæ·±ãŸããŸããã ãã³ãã¬ãŒããæ±ºãŸã£ãŠããããšã«ãã£ãŠãèŠ³ç¹æŒããå°ãªãã®ãšã質åãã«ããããšãå
šãŠè°é¡ã«ä¹ããããšãã§ãã ã®ãè¯ãã£ãã§ããæ¬¡ã®å·¥çšã§ãããŠãŒã¶ãŒã¹ããŒãªãŒãããã³ã°ãè¡ãããã®æäœéã®å
±éèªèã®åœ¢æã«ã圹ç«ã¡ãŸããã äžæ¹ã§ çºèšã«åãããã ããŒã«ã®äœ¿ãæ¹ã«ã¯å°ãæžæã£ã æçµçãªãŸãšããããå°ããã£ãããããã ãšãã£ãæèŠãé ããŸããã çºèšã®åãã«ã€ããŠã¯ãç§ã®ãã¡ã·ãªããŒã·ã§ã³èœåãè¶³ããŠããªãã®ãšãã¯ãŒã¯ã·ã§ããã®æéã«ããšããæãããããšãã§ããªãã£ãããšãäžå ã ãšæããŸããæéã«è¿œãããŠããŠãé²è¡ãåªå
ããããŠããŸããã ãã¡ã·ãªããŒã·ã§ã³ã®éã«ã¯ã ã€ã³ã»ãã·ã§ã³ãããã宿ãããããšã ããç®çã§ã¯ãªããå
šå¡ã§ãã©ãããªè°è«ãããããšã»å
±éã®èªèãäœãããšãæèããããšãå€§äº ãšããåŠã³ããããŸããã ãŸããæåã« Miro ã®äœ¿ãæ¹ã«æ
£ããæéããæåŸã«ã€ã³ã»ãã·ã§ã³ãããå
šäœãæ¯ãè¿ãæéãèæ
®ããã¢ãžã§ã³ããäœæãããšããè¯ããã®ã«ãªãããã§ãã ãŸãšã æ°ããŒã ã®çºè¶³ã«ããããã€ã³ã»ãã·ã§ã³ãããã®äœæãè¡ãã«è³ã£ãçµç·¯ãšãã¯ãŒã¯ã·ã§ããã®å®æœæ¹æ³ããã®çµæåŸãããææãç¥èŠã«ã€ããŠæžããŸããã æ°ãããããžã§ã¯ããå§ããéãæ¢åã®ãããžã§ã¯ãã®æ¹åæ§ãææ§ã«ãªã£ãŠããŸã£ãŠãããšæããããŠããæ¹ã¯ãã€ã³ã»ãã·ã§ã³ãããã®äœæã«ææŠããŠã¿ããšäœããã®æãããã«ãªããããããŸããã æåŸãŸã§ãèªã¿é ãããããšãããããŸããã
ã¯ããã« ã¯ãããŸããŠã2021幎4ææ°åå
¥ç€Ÿã®åå±( @hrktcy )ã§ããããã¯ãšã³ããšã³ãžãã¢ãšããŠ6æã«ãã¯ãããžãŒã»ã³ã¿ãŒ Eng6G ã«æå±ããŸããã èæ¯ Eng6G ã§ã¯ ã¹ããã¬ãã£ã¬ã³ãž ãšåŒã°ãããµãŒãã¹ãããµãŒãã¬ã¹ãªã·ã¹ãã ãæ§ç¯ããŠéçºã»ä¿å®ã»éçšããŠããŸãããŸãããã¯ãšã³ãã«ã¯ Go ãæ¡çšããŠãããæ¯èŒçã¢ãã³ãªæè¡ã¹ã¿ãã¯ã«ãããããã¯ãéçºãè¡ãããŠããŸãã [åè]mediba ã«å
¥ç€Ÿãããã¢ãžã£ã€ã«å¿åã®ããŒã ã§æé«ã ã£ãä»¶ãã¢ãã¯ãŒã¯ç¡åã§ãã¬ã¯ãŒã¯ãè¶
è¶ããŸãã Go ã¯åºæ¬çã«æé»çå倿ãèªããããªããããéçºé¢é£ã®ã¿ã¹ã¯ãå
šãŠã¢ãã§è¡ãåŒããŒã ã«ãããŠãããã²ãŒã¿ãŒãã¬ãã¥ãŒãããããšããã¡ãªããããããŸãããŸãã¢ãã³ãªæè¡ãæ±ãããšã§ããšã³ãžãã¢ãšããŠã®åžå ŽäŸ¡å€ãé«ãŸããšèããŠããŸãã ããã§ Go æªçµéšã®ç§ãããã¯ãšã³ããšã³ãžãã¢ãšããŠãžã§ã€ã³ããã«ããããåŠç¿ãšã¢ãŠãããããå
ŒããŠãæ¬çš¿ã§ã¯Â Go ã§ã¹ã¯ã¬ã€ãã³ã°ãã mediba+  ã®èšäºã Slack ã«æçš¿ããããããäœã£ã話 ãåå¿é²ãšããŠæ®ããããšæããŸãã éçºç°å¢ M1 Mac Docker 20.10.7 Golang 1.14 Terraform 1.0.1 AWS provider 3.49.0 äºåæºå Slack API ããŒã¯ã³ãçæããŠãã Slack ã«æçš¿ãã App ãäœæããäºã API ããŒã¯ã³ãååŸããŠãããŸãã  Slack API  ãžã¢ã¯ã»ã¹ ã Create an app ããã¯ãªã㯠ã Create New App ããã¯ãªã㯠ã åå ããšã ã¯ãŒã¯ã¹ããŒã¹ ããæå®ãã ã¢ããªãäœæããåŸã«è¡šç€ºãããããŒãžã§ã Permissions ããã¯ãªã㯠ã Scopes ãã®é
ç®ã§Â chat:write 暩éãèšå® ã Install App to Workspace ããã¯ãªãã¯ã API ããŒã¯ã³ãååŸãã ãããã®ä»æ§ãåºãã Go ã§ã¹ã¯ã¬ã€ãã³ã°ãã mediba+ ã®èšäºã Slack ã«æçš¿ããã«ãããããŸãã¯ãããã®ä»æ§ãåºããããšã«ããŸããã ã¹ã¯ã¬ã€ãã³ã°æ¹æ³ ã¹ã¯ã¬ã€ãã³ã°ç³»ã®ããã±ãŒãž( goquery  , etc. )ãçšããããšãã§ããŸãããä»å㯠mediba+ ã® RSS ãã£ãŒããããŒã¹ããããšã§ã¹ã¯ã¬ã€ãã³ã°ãè¡ããŸããåœããåã§ããã¹ã¯ã¬ã€ãã³ã°å
ã®æ
å ±ãæŽæ°ããã床ã«ãã£ãŒãã®å
容ã¯å€æŽãããŸãããããå®è¡æç¹ã®æ¥æãšãã¹ã¯ã¬ã€ãã³ã°å
ã®èšäºæ¥æãåç
§ããå¿
èŠããããŸããããã§ä»åã¯ããããå®è¡æç¹ã®æ¥æã«æŽæ°ãããèšäºã®ã¿ã Slack ã«æçš¿ããããã«ããŸãã åäžèšäºãéè€ããŠæçš¿ããªã ããããå®è¡ãããã³ã«åäžèšäºãæçš¿ãããã®ã¯é¿ãããã§ããããã«ã€ããŠã¯ããŒãã«ã«ã¹ã¯ã¬ã€ãã³ã°ããèšäºæ
å ±ãæ ŒçŽããŠããã Slack ã«æçš¿ããæç« ãçæããåæ®µéã§ãèšäºãæçš¿ããããã®ãªã®ããå€å®ããå¿
èŠããããŸãã ãããã®éçšæ¹æ³ ãããããã°ã©ã ãä»»æã®æ¥æã«å®è¡ããããããªç°å¢ãæŽãããã§ããããã«ã€ããŠã¯ ECS Fargate + CloudWatch Events ã§ä»»æã®æ¥æã«ããããå®è¡ããããããªç°å¢ãæ§ç¯ããããšã§è§£æ±ºããŸããæ¬çš¿ã§ã¯ä»¥äžã®ã·ã¹ãã ãæ§ç¯ããŸãããæ¬ã·ã¹ãã 㯠Terraform ã«ãã£ãŠäžå
管çããŠããŸãã ãœãŒã¹ã³ãŒã 1. DB ãžæ¥ç¶ãã Go ã® OR ããããŒãšããŠæäŸãããŠãã gorm  ãçšããŠã env ãã¡ã€ã«ã«èšèŒãã DB ã®æ
å ±ããæ¥ç¶ãè¡ããŸãã DBTYPE := "mysql" USER := os.Getenv("USER") // ãŠãŒã¶å PASS := os.Getenv("PASS") // ãã¹ã¯ãŒã ENDPOINT := os.Getenv("ENDPOINT") //ãšã³ããã€ã³ã DBNAME := os.Getenv("DBNAME") //ããŒã¿ããŒã¹å CONNECT := USER+":"+PASS+"@tcp("+ENDPOINT+":3306)/"+DBNAME+"?charset=utf8&parseTime=True&loc=Local" db, err := gorm.Open(DBTYPE, CONNECT) if err != nil { fmt.Println("DBæ¥ç¶å€±æ") panic(err) } fmt.Println("DBæ¥ç¶æå") ä»åæ¥ç¶å
ã®ããŒãã«æ
å ±ã¯äžå³ã®éãã§ãã èšäºã¿ã€ãã«(title)ãš URL (link)ãæçš¿æžã¿å€å®(status)ã®3ã€ã®ã«ã©ã ãå®çŸ©ããŠãããŸãã 2. mediba+ ã®èšäºãã¹ã¯ã¬ã€ãã³ã°ãã RSS ãã£ãŒããããããå®è¡æã®æ¥æã«æçš¿ãããèšäºãã¹ã¯ã¬ã€ãã³ã°ãããŒãã«ãž insert ããŸãããã£ãŒãã®ååŸã«ã¯Â gofeed  ãçšããŸãã # mediba+ãã¹ã¯ã¬ã€ãã³ã°ãã fp := gofeed.NewParser() feed, _ := fp.ParseURL("https://koho.mediba.jp/feed/") 倿° feed ã«ã¯ããŒã¹ããããã£ãŒããæ ŒçŽãããŠããã feed.Items ã§æçš¿èšäºå
šãŠãååŸããããšãã§ããŸããä»åã¯ãããå®è¡æç¹ã®æ¥æã«æŽæ°ãããèšäºã®ã¿ãååŸããããã«ãèŠçŽ 1ã€1ã€ã for æã§åããåèšäºã®æçš¿æ¥æãšãããå®è¡æã®æ¥æãæ¯èŒããŸãã æ¯èŒããã«ããããããŒã¹ããã PubDate(UTC) 㯠string åãªã®ã§ time åãšæ¯èŒããããšãã§ãããã¹ã¯ã¬ã€ãã³ã°å
ã«ãã£ãŠã¯ãã©ãŒããããéãå¯èœæ§ãããããåãããŠãããå¿
èŠããããŸãããŸã PubDate ã JST ã«ããå¿
èŠããããŸãã ãã¡ãã«ã€ããŠã¯ RFC1123Z ãã©ãŒãããã§çµ±äžããŸããããŸã PubDate ã time.Parse ã§å€æããŸããããã«ããã RFC1123Z ã®ãã©ãŒãããã«å€æããã¿ã€ã ãŸãŒã³ã JST ã«ããããšã§ãæçš¿æ¥æãšãããå®è¡æã®æ¥æãæ¯èŒããŸããå
¬åŒãã©ãŒããã㯠ãã¡ã ããåç
§ã§ããŸãã // RSSæ§é äœ type Article struct { link string published string } // RSSã®PubDateãæååâæ¥æã®åã«å€æããããRFC1123Zã®Formatã«å€æããã¿ã€ã ãŸãŒã³ãJSTã«ãã for _, item := range feed.Items { m := make(map[string]Article) if item == nil { break } var timeParse = time.Time{} timeParse, _ = time.Parse(time.RFC1123Z, item.Published) pubDateJST := timeParse.In(time.FixedZone("Asia/Tokyo", 9*60*60)).Format(time.RFC1123Z) // 以äžInsertåŠç ... } æçš¿æ¥æãšãããå®è¡æã®æ¥æãåãæãæ§é äœ m ã«èšäºã®æ
å ±ãæ ŒçŽãã gorm ãçšããŠããŒãã«ã« insert ããã° OK ã§ãããã®ãšãã status ã«ã©ã ã«ã¯ããã©ã«ãå€ãšã㊠false ãå
¥ããŠãããŸãã 3. Slack ã«æçš¿ãã Slack ã«æçš¿ããåŠçã¯ä»¥äžã®éãã§ãã // envãã¡ã€ã«ã«èšèŒããAPIããŒã¯ã³ããã¯ã©ã€ã¢ã³ããçæãã tkn := os.Getenv("TOKEN") c := slack.New(tkn) _, _, err := c.PostMessage("#ãã£ã³ãã«å", slack.MsgOptionText( " ããã¹ã " , true)) if err != nil { panic(err) } else { fmt.Println("æçš¿å®äº") } ããŒãã«ã«æ ŒçŽãããŠãããæçš¿æ¥æããããå®è¡æã®æ¥æãšåãäžã€ status ã false ã®èšäºã®ã¿ã€ãã«ãšãªã³ã¯ãååŸãã slack.MsgOptionText ã®ç¬¬äžåŒæ°ã«ä»£å
¥ããŸããèšäº1ã€1ã€ã飿ãããš Slack ã®éç¥ãå€ããªãç
©ãããæããã®ã§ã string é
åã®äžã«ååŸããèšäºãšã¿ã€ãã«ã append ããŠããã strings ããã±ãŒãžã® strings.Join ãçšããŠãåèŠçŽ ãçµåããŠããæçš¿åŠçãè¡ãããã«ããŸããã æçš¿åŠçãå®äºããã gorm ãçšã㊠status ã«ã©ã ã®å€ã true ã« update ããããšã§ãããããå®è¡ãçŽããŠãåãèšäºãå床 Slack ã«æçš¿ããªãããã«ããŸãããŸãå
šãŠã®ã¯ãšãªæäœã¯ãã©ã³ã¶ã¯ã·ã§ã³å
ã§è¡ãããã«ããè¿ã£ãŠãã err ã nil ãã©ãããèŠãŠããŒã«ããã¯ãã³ãããã倿ããããã«ããŸãã å®è¡çµæ ç¡äºããããåäœããããšã確èªã§ããŸããã ãããã®å®è¡æéã¯å€§äœ1ç§ã§ããã ã€ãŸã¥ãããšãã Dockerfile ã®èšèš ãããããã°ã©ã ã§ã¯Â Go Modules  ãšããå€éšããã±ãŒãžç®¡çã·ã¹ãã ãçšããŠããŸã( Go Modules ã䜿çšããå Žåã Go ã®ããŒãžã§ã³ã¯1.11以äžã§ããå¿
èŠããããŸã)ãã Docker ã€ã¡ãŒãžããã«ãããéã«æ¯å Go Modules ã®ããŠã³ããŒããèµ°ãããããããã®å®è¡æéãé·ããªã£ãŠããŸããšããåé¡ããããŸããããŸã M1 mac ã§ãã«ããã Go ã€ã¡ãŒãžã ECR ã« Push ãããšãèªåçã« Go ã€ã¡ãŒãžã linux/arm çã«ãªã£ãŠããŸãããã§ãã(èšäºå·çæç¹)ããã¡ãã«ã€ããŠã¯ã Docker Buildx  㧠linux/amd64 ã§ãã«ãã ECR ã« Push ããããšã§å¯Ÿå¿ã§ããŸããããå®è¡æéåé¡ã¯è§£æ±ºããŠããŸããã ããã§Â Multistage Build Â ãæ¡çšããããšã«ããŸãããéçºç°å¢çšã®ã€ã¡ãŒãžã®äžã§ãã«ããè¡ããçæãããã·ã³ã°ã«ãã€ããªãæ¬çªç°å¢çšã® Alpine ã€ã¡ãŒãžã«ç§»ãããšã§ã倧å¹
ãªã¡ã¢ãªåæžãã§ããã ãã§ãªãå®è¡æéãççž®ããããšãå¯èœã§ãã FROM amd64/golang:1.15-alpine AS builder WORKDIR /go/src/tsuchiya COPY . /go/src/tsuchiya ENV GO111MODULE=on RUN CGO_ENABLED=0 GOOS=linux go build -o api main.go FROM alpine:latest WORKDIR /root/ COPY --from=builder /go/src/tsuchiya/api . CMD ["./api"] ã³ã³ãœãŒã«ãã ECR ã®ãã©ã€ããŒããªããžããªãèŠããŠã¿ãŸãã ã€ã¡ãŒãžãµã€ãºã確èªãããš100 MB 以äžåæžãããŠããããšãåãããŸããã ãããã« ã¹ã¯ã¬ã€ãã³ã°ãã mediba+ ã®ææ°èšäºã Slack ã«æçš¿ããããããäœããŸãããéçåä»ãèšèªã«èŠææèãæã£ãŠããç§ã§ããã Go ã¯æ§æãã·ã³ãã«ãªããããšãŠã楜ããå®è£
ãŸã§åãçµãããšãã§ããŸããã ãªããåç¥ã ãšã¯æããŸãããã¹ã¯ã¬ã€ãã³ã°ã¯çžæå
ã®ãµãŒãã«ã¢ã¯ã»ã¹ããããçæéã§å€§éã®ã¢ã¯ã»ã¹ãè¡ãã®ã¯ NG ã§ããè¿·æãããããªãããååé
æ
®ãããŸãããã æåŸã«ã mediba ã§ã¯äžç·ã«ã¢ãã¥ãããã§ãããšã³ãžãã¢ãåéããŠããŸãã å°ãã§ããèå³ããããŸããã ãã¡ã ããã©ããã
ããã«ã¡ã¯ããã¯ãããžãŒã»ã³ã¿ãŒ6Gã§ManagerãããŠããäžå°( @primunu )ã§ãã ã¡ã³ããŒãšã®éè«ã§ããŸã«è©±é¡ã«ãªããšã³ãžãã¢ã®ãã£ãªã¢ãã¹ã ã©ã®ãã£ãªã¢ãéžæãããã¯ãã¡ããåã
ãæ±ºå®ããŸãããæšä»ã®ãœãããŠã§ã¢ãšã³ãžãã¢ã®ãã£ãªã¢ãã¹ã¯å€æ§ãã€ãçµç¹ã«ãã£ãŠè¥å¹²åœ¹å²ãç°ãªãäºãããã®ã§ãç®æãæ¹åãããããè¿·åã«ãªãäºããããšçžè«ãåããŸããã ããã§äžåºŠç«ã¡æ»ããmedibaã§ã¯ã©ããªãã£ãªã¢ãã¹ãããã®ãïŒãŸããã©ã®ãããªåœ¹å²ãªã®ãïŒãæŽçãå«ãå³è§£ããŠã¿ãŸããã ãã£ãªã¢ãã¹ã®æŠèŠ åœ¹å²ãå³è§£ããæã23ã®ãã£ãªã¢ããããŸããã ãã®äžã§ãã€ã¡ãŒãžãä»ãã«ããããŸãã¯ä»ç€Ÿãšè¥å¹²é åã«ä¹é¢ããããã£ãªã¢ãéç¹çã«èª¬æããŠãããŸãã â» ãããŒãžã£ãŒ/PjMã¯ãã¡ããåç
§äžãã SRE äž»ãªæ¥åã¯AWSå
šäœç®¡çããã€ã³ãã©ç®¡çãæ§ç¯ãSLO/SLA/SLIã®å®çŸ©ãã»ãã¥ãªãã£ãããžã§ãã管çããã€ã«ã®æŽãåºãããã©ããã³ã°çãäž»ãªæ¥åã«ãªããŸãããªããIaCãã¢ãŒããã¯ãã£èšèšã¯ãªãŒãããã¯ãšã³ããšã³ãžãã¢ãããã¯ãªãŒãã宿œããäºãå€ãã§ãã ã€ã³ãã©çµç¹ããååãSREã«å€ãã£ãèæ¯ãããã®ã§ãSREãšããè·èœã®ã³ãããã¡ã³ãé åããŸã äžæç¢ºãšãã課é¡ããããçµç¹ã®çŽåŸåºŠãé«ããçºã«ãå®çŸ©ããããšèããŠããŸãã â» SRE奮éèš ã«ä»åŸèšèŒããŠãããŸãã ãªãŒããšã³ãžãã¢(ã»ãã¥ãªãã£ãšã³ãžãã¢å«) è±å¯ãªç¥èã»çµéšããæé©ãªã¢ãŒããã¯ãã£ãéžå®ããæè¡éžå®ãè¡ããªããPoCãåããæè¡ã§çœåŒããŠããã£ãªã¢ã«ãªããŸããåŸè¿°ããããã¯ãªãŒããšäŒŒãæ¯ãèãããŸãã 倧ããªéãã¯åœ±é¿ç¯å² ã«ãªããŸãããªãŒããšã³ãžãã¢ã®åœ±é¿ç¯å²ã¯ããŒã ã«ãªããŸãããããã¯ãªãŒãã¯çµç¹å
šè¬ã«åã³ãŸãã ãããŸã§èšè¿°ãããšãšã³ãžãã¢ãªã³ã°ããããªããšæãããã¡ã§ãããã¹ããŒã¯ãã«ããŒãšã®äŒè©±ãè¡ããåã¡ã³ããŒãžã®æç€ºãè¡ãã®ã§ã ãã ã³ãŒããæžããã£ãªã¢ ã§ã¯ãããŸããã ããã¯ãªãŒãäºåè»ã®ãã£ãªã¢ãªã®ã§ããã¯ãªãŒããšé£æºãããããã¯ãã®æè¡çæææ±ºå®ãè¡ããŸãã ã·ã¹ãã ãã£ã¬ã¯ã¿ãŒ medibaã§ã¯å®å
šèªç€Ÿéçºã®äŒç€Ÿã§ã¯ãªãããããã¯ãã«ãã£ãŠã¯åèšéçºããããŸãã çŸæç¹ã ãšåèšéçºãããã¯ãã®ã¿ã®ãã£ãªã¢ ã«ãªããããã§ã¹ããŒã¯ãã«ããŒãšæè¡ãã¬ããžã掻ãããªãããã£ã¬ã¯ã·ã§ã³ãè¡ããŸãããã£ã¬ã¯ã¿ãŒãšããäºãããææ¡ããèŠä»¶å®çŸ©ã¯ãã¡ããã®äºããã¡ã·ãªããŒã¿ãè¡ããŸããã¹ããŒã¯ãã«ããŒãååäŒç€Ÿã»å€éšäŒç€Ÿãšæè¡çãªäŒè©±ãã§ããæææ±ºå®ãã§ãå¿
èŠãããã®ã§ãããšã³ãžãã¢ã®äžçŽè·ã«ãªããšæããŠããŸãã ãããžã§ã¯ããªãŒã㌠ãããã¯ãã«ãã£ãŠPjMãšè²¬åã被ãäºããããŸãããéçºããŒã ãªã³ãªãŒã®ããŒã ãã8äººæªæºã®å°èŠæš¡ããŒã ã®ãªãŒããŒãmedibaã§èšããããžã§ã¯ããªãŒããŒã«ãªããŸãã ãµãŒãã³ããªãŒããŒã§ã¯ãªãåã«åºãŠåŒã£åŒµã£ãŠãããªãŒã㌠ãšãªããŸãã ã¹ããŒã¯ãã«ããŒãšã®äŒè©±ã¯ãã¡ããã®äºãã¹ã±ãžã¥ãŒã«ç®¡çããããŒã ãã«ãã£ã³ã°ãè¡ããŸããããŒã ã«ãã£ãŠã¯ã¹ã¯ã©ã ãã¹ã¿ãŒããããžã§ã¯ããªãŒããŒãå
Œä»»ããäºãå€ããšæããŠããŸããããŒãã¹ãã«ãšãœããã¹ãã«ã®äž¡é¢ãæ±ããããã®ã§ããããŒãžã£ãŒãç®æãæ¹ãéããã£ãªã¢ã«ãªããŸãããã¬ãããã©ã³ã¹ã§ããæèŠå€ãšããŠãã¬ãŒã€ãŒ7ããããŒãžã£ãŒ3ã§ã(åäººã®ææ³ã§ã)ã ãããªãããžã§ã¯ããªãŒããŒã§ããã ãããŒãžã£ãŒãšã®å€§ããªéãã¯ããŒãã«ãããŒãžã£ãŒãšçµç¹ãžã®ã³ãããã¡ã³ãã®æç¡ ã«ãªããŸããããŒã ãžã®ã³ãããã¡ã³ãã¯åœç¶ã§ãããçµç¹ãžã®å¹²æžã¯äœããããŒãã«ãããŒãžã¡ã³ãã¯çŽå±ãããŒãžã£ãŒã®è²¬åã«ãªããŸãã å質管çãªãŒã㌠å質管çã¯ã¹ãããã§å
¥ãäºãå€ããååäŒç€Ÿãšé£æºããäºãå€ãã§ããããã§è©Šéšé
ç®äœæãã¹ã±ãžã¥ãŒã«ç¢ºèªãSLAçã«åé¡ãªãã宿œã確èªãããšå¹³è¡ããååäŒç€Ÿãšã®é£æºãå¥çŽãçµ±çãè¡ãã®ãå質管çãªãŒããŒã«ãªããŸããå質管çã®ç¥è以å€ã«ãä»ç€Ÿã巻蟌ã¿çµç¹ããªããã°ããªãã®ã§ã ã¡ã³ããŒããŸãšãçµç¹ããã¹ãã« ãæ±ããããŸããE2Eãã¹ãã®ã·ããªãªãèšè¿°ãããå質管çã«ãããPDCAãåãæãŸã§ã¯ä»å
¥ã§ããŠãããä»åŸã®èª²é¡ãšãªã£ãŠããŸãã ãªããå質管çãšãã¹ã¿ãŒã®å€§ããªéãã¯èŠä»¶ãã詊éšé
ç®äœæãã§ããã®æç¡ã§ãã ããã¯ãªãŒã ããã¯ãªãŒããšã¯å®çµã«èšããšããªãŒããšã³ãžãã¢ã®äžäœè·ã«ãªãããªãŒããšã³ãžãã¢ã®ç®æã§ãè§ŠããŸãããã圱é¿ç¯å²ãçµç¹å
šè¬ãšãªããŸããå³å¯ã«ããã宿œããçã¯ãªããPjMã宿œããããPoCãåããããšæè¡çãªæææ±ºå®ãäž»å°ãæšé²ããŸããã³ãŒãã®å質管çã¯ãã¡ããã®äºãããŒã å
šäœã®çç£æ§ãã¢ãŒããã¯ãã£ã»èšèšãè¡ãã®ã§åºããšæ·±ãã®äž¡é¢ãæ±ããããŸãã ãªãã medibaã®ããã¯ãªãŒãã¯ãããŒãžã£ãŒã§ã¯ãªã ãæé·æ¯æŽçã¯è¡ãã¡ã³ã¿ãªã³ã°ã¯é©å®è¡ããã®ã®ã³ãããé åã§ã¯ãªãããããŸã§ãæè¡ã§ãªãŒãããããã¯ãã®æåã«å¯äžãããã£ãªã¢ã«ãªããŸãã UnitãããŒãžã£ãŒããããŒãžã£ãŒãã·ãã¢ãããŒãžã£ãŒãäœãéãã®ïŒ 现ããéãã¯ãããã®ã®ã 倧ããªéãã¯ç®¡èœããããŒã ã®çš®å¥ãšã³ãããé åãæ¯ç ã«ãªããŸãã UnitãããŒãžã£ãŒã¯ãããã¯ã暪æããŒã ããããŒãžã£ãŒãšã·ãã¢ãããŒãžã£ãŒã¯ãããã¯ãã«åŒ·ãé¢ãããããŒãžã£ãŒã«ãªããŸãããããŒãžã£ãŒãšã·ãã¢ãããŒãžã£ãŒã®åœ¹å²ã¯å€§ããå€ãããŸãããã ã·ãã¢ãããŒãžã£ãŒã®æ¹ãçµç¹ãžã®ã³ãããã¡ã³ã ãæ±ãããŸãã PO(ãããã¯ããªãŒããŒ)ããPM(ãããã¯ããããŒãžã£ãŒ)ã®ãã£ãªã¢ãã¹ã¯ïŒ Bizè·ããã®PO/PMã®ãã£ãªã¢ãã¹ã¯ãããã®ã®ãPOã®æ¥åç¯å²ã«ãšã³ãžãã¢ã«éŠŽæã¿ãèãPL管çãå«ãŸããŠããã®ãèµ·å ããŠãããããã ãšã³ãžãã¢ãšããŠã®PO/PMã®ãã£ãªã¢ãæããŠããŸãã ã ã翻蚳ããããã¯ããããžã¡ã³ããã©ã€ã¢ã³ã°ã« ã«ããããã«ããããã¯ãã¯éçºè
ããŠãŒã¶ãŒãããžãã¹ã® 3 ã€ã§æ§æãããŠããããšã³ãžãã¢èŠç¹ã¯å¿
èŠäžå¯æ¬ ã ãšèªèããŠããŸãã ãšã³ãžãã¢ãªã³ã°ãããŒã¿åæããšã³ãžãã¢ãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãšèšã£ãé åãã«ããŒã§ããã®ã¯ãšã³ãžãã¢åºèº«ã®PO/PMã®åŒ·ã¿ã ãšæããŠããã ãããã¯ãã®æææ±ºå®ãçŽ æ©ã倿ã§ãã ãšæããŠããŸãã å
è¿°ã®éããŸã ãšã³ãžãã¢ã®ãã£ãªã¢ãšããŠæããŠããªãã®ãã®ãçŸå Žã§ã¯ãããŒãžã£ãŒããããã¯ãªãŒããäžå¿ãšãªããšã³ãžãã¢é åãã«ããŒããŠããŸãããã«ãã¿ã¹ã¯ã«ãªã£ãŠããŸãã®ã§ããã£ãªã¢ãã¹ã«ãªãäºãçµç¹èª²é¡ãšæããPO/PMã®ã³ãããé åãæç¢ºã«ãããã£ãªã¢ãã¹ãšããŠæããããšèããŠããŸãã ãŸãšã åŠäœã ã£ãã§ãããããè€éã«èŠãããã£ãªã¢ãã¹ã§ãããç®æãæ¹åã®ååŒãã§ããã°ãæ¥ã
ã®è¡åãå€ãããç®æšãåŒããŠã¯çµç¹ãžã®ã³ãããã¡ã³ããé«ããªããšèããŠããŸãã ãããæ°ã«ãã£ãªã¢ãã©ã³ãåèããŠã¿ãã®ã¯åŠäœã§ãããããå°ãã§ãæå©ãã«ãªãã°å¹žãã§ã
ã¯ããã« ããã«ã¡ã¯ãSRE Unitã®å浊ã§ãã ç§éãSRE掻åãæšé²ããŠããäžã§ãè¡ãè©°ãŸã£ãç¹ãéã«ããŸããã£ãæ¹æ³ãªã©ã®ç¥èŠãå
±æããŠããããšæããçãåããŸããã “ã¢ããªã±ãŒã·ã§ã³"ã®ã·ã¹ãã ãšã¯éãã"人"ã®ã·ã¹ãã ãæ¹åã»ä»å
¥ããŠããããã«ã¯ã é¢ä¿åè
ãžããããã®èª¬æãç¥èŠãå
±æããŠãããªããšãããªãã®ã¯åœç¶ã®ããšã éèŠãªãã€ã³ãã岿ããŠããŸããšãèŠãã¬èª€è§£ãçãã§ããŸããç©äºãããŸãæšé²ã§ããªããšããèªäœã«é¥ããŸãã ä»åã¯ãæã
ã®äœéšè«ãšããŠãšã©ãŒããžã§ãããšãããã®ããã¬ãã£ãã«èª€è§£ãããŠããŸã£ãéçšãšããã®è»éä¿®æ£ã«å¿
èŠã ã£ã説æããŸãšããŠã¿ãŸããã ãšã©ãŒããžã§ããã£ãŠäœã ãŸãã¯ãšã©ãŒããžã§ãããã®ãã®ã«ã€ããŠã足䞊ã¿ãæããŠãããŸãããã Googleã§æ€çŽ¢ãããããšä»¥äžã®ãããªèª¬æãåºãŠããŸãã ãšã©ãŒããžã§ããïŒError BudgetsïŒãšã¯ãšã©ãŒã«å¯Ÿããäºç®ã§ãããSLOã«åºã¥ãç®åºãããæå€±å¯èœãªä¿¡é Œæ§ã§ããã ãµãŒãã¹ã®èšæž¬ããã皌åæéãSLOãè¶
ããŠãããæèšããã°ãšã©ãŒããžã§ããããŸã æ®ã£ãŠããç¶æ
ã§ããã°ãããŒã ã¯æ°ãããªãªãŒã¹ãããã·ã¥ïŒãããã€ïŒã§ããã äŸãã°ãæ£åžžãªçšŒåæéãšããåãå£ã®SLIãèšå®ãããã®SLOã99.9%ãšå®çŸ©ãããšããŸãããã ããããå Žåãæ®ãã®0.1%ããšã©ãŒããžã§ããã«ãªããŸãã 100% - SLOïŒ99.9%ïŒ = 0.1% 1ã¶æã30æ¥éãšããå Žåãæ®ãã®0.1%ã¯43.2åã§ãã 1ã¶æ(43,200åïŒ/1000 = 43.2å ãã®å Žåãä»®ã«ããŠã³ã¿ã€ã ã1ã¶æã®ãã¡ã«43.2åæªæºã§ããã°æ°èŠéçºãç¶è¡ãã 43.2åãè¶
éããèªäœã«é¥ã£ãŠããå Žåã¯ãæ°èŠéçºãäžæãããã®å€ãå埩ãããŸã§ã®éã¯ããŠã³ã¿ã€ã ã®æéãæžããæŽ»åãè¡ãã ãã®ããã«äœ¿ãããã®ããšã©ãŒããžã§ããã§ãã çãŸãã誀解 ãšã©ãŒããžã§ããèªäœã¯DevãšOpsã®èª²é¡ãçµ¶åŠãªãã©ã³ã¹ã§è§£æ±ºããè¯ãææ³ãªã®ã§ããã ãããè¯ããã®ãšèªèããããã«ã¯ãããã€ãã®åæç¥èãå¿
èŠã§ããã å ããŠãäœã解決ããŠãããã®ãªã®ãã課é¡ãæããå¿
èŠããããŸãã åæç¥èãšèª²é¡ãããã®çžäºçè§£ããªããŸãŸå°å
¥ãææ¡ããŠãã ããã¡ã¯äºç®åã£ãŠåããŠãããããã¯ããªã®ã§ããªããªãæè»ã«èµåãããšã¯é£ããã ãçŽæããããããæ°èŠéçºäžæã¯å°ãã ããã¡ã¯çµç¹åœ¢æ
ãšããŠå€§ããããã»ã»ã»SREã£ãŠã¹ã¿ãŒãã¢ãããããã¯ãªãŒãã®ãããªäŒæ¥ã§å°å
¥ãããã€ã§ããïŒã …ãªã©ã®åå¿ãè¿ã£ãŠãããã§ãã äžèšã®åå¿ã¯ãèŠæ¹ã«ããã°è³æ¥µçã£åœã§ã ããããéçºãããã¯ããšããŠãéçºãžã®æè³ãä¿¡é Œæ§ã«åãããæ°èŠéçºã«åããããšãã£ãæææ±ºå®ã¯ããããã¯ãã®åœéãå·Šå³ããéèŠãªèŠçŽ ã§ãããã ãããªéèŠãªèŠçŽ ã®äžã€ããšã©ãŒããžã§ãããªããã®ã«èãé ããŠè¯ããã®ã§ããããã ããèãããšããªããªãå¿ççã«ãããŒãã«ãé«ããã§ãã ãšããããšã§ããšã©ãŒããžã§ãããçè§£ããããã®ç¥èŠããããŠäœã解決ãããŠå¬ããã®ããšãããã€ã³ãããµããŒã£ãŠãããããšæããŸãã æé»ã®ãšã©ãŒããžã§ãã ãšããã§ãã·ã¹ãã éçºã«é¢ããã®ããèªè
ã®æ¹ã«ã¯è³ªåãªã®ã§ããã ãããªããæ
åœããŠããã·ã¹ãã ã®ãšã©ãŒããžã§ããã¯æé©åãããŠããŸããïŒã ã» ã» ã» ãããããšã©ãŒããžã§ããå°å
¥ããŠããŒãã ãšèšãããŠããŸããããªã®ã§ããã å®ã¯ãããšãèšãåããªãã±ãŒã¹ãå€ãã®ã§ã¯ãªãããšæã£ãŠããŸãã äŸãã°ã ã·ã¹ãã ã«èŽåœçãªæ¬ é¥ãèŠã€ãããäºå®ããŠããéçºãäžæã ååŸ©äœæ¥ã«æ³šåããã ãšããç¶æ³ã¯ã€ã¡ãŒãžã§ããªãã§ããããã ãã®å Žåã¯ããšã©ãŒããžã§ããã倧å¹
ã«è¶
éããŠãããšããããšãã é¢ä¿è
å
šå¡ã®å
±éèªèãšãªã£ãæã«èµ·ããç¶æ
ã§ãã ã»ã»ã»ãµããããèãããšãã©ããããšã©ãŒããžã§ãããšãããã®ã¯ã æé»çã«ã¯ååšããŠãããã®ã®ããã§ãã æé»ã®ãšã©ãŒããžã§ãããåŒãèµ·ãããã® ãšã©ãŒããžã§ãããæé»çã§ãããã®ã®å Žåãèšãæããã°ã â人âããããã®æèŠå€ã«äŸåããŠããããšã«ãªããŸãã Aããã¯0.1%ã®æèŠãããããŸããããBããã¯0.01%ã®æèŠãããããŸããã ãããã¯ããšããŠã®æææ±ºå®ãè¡ãéããã®æèŠã®ä¹é¢ãåããææ®µã¯ã³ãã¥ãã±ãŒã·ã§ã³ã«ãªãããšãšæããŸããã ãã®æèŠå€ã¯å圹å²ã«ã圱é¿ãããããšãå€ãã ãããŠãæ£è§£ãååšããªããšãããå®ã«åä»ãªãšããã§æãããŸãããŠãããããã¯ããå€ãããããã§ãã ãããªããæ
åœããŠããã·ã¹ãã ã®ãšã©ãŒããžã§ããã¯æé©åãããŠããŸããïŒãããŠãã®æèŠã¯é¢ä¿è
åäœã§å
±éããŠãããã®ã§ããïŒã ãããããããããªãã®ããŒã ã¯ãã®æé»ã®ãšã©ãŒããžã§ããã®ã³ãã¥ãã±ãŒã·ã§ã³ã«å€å€§ãªå·¥æ°ãšåŽåã匷ããããŠããããããŸããã ãã®è³ªåã«Yesãšçãããããäžã€ãã³ãã¥ãã±ãŒã·ã§ã³ã宿
ã«èª²é¡ãæããŠããã®ã§ããã°ã ãããã¯ããšããŠæéãæ±ºããããšã«äžåºŠæ³šåãããšã©ãŒããžã§ããã®éçšãããŠã¿ãã®ãè¯ãéžæè¢ãããããŸãããã æ©èœæ§ãšä¿¡é Œæ§ããŠãŒã¶ãŒã¯ã©ã£ã¡ã欲ããïŒ äžã€ããšã©ãŒããžã§ããã®å¬ãã¿ãã€ã³ããèŠãããšããã§ããã 以äžã«ã極端ã§ããToDo管çã¢ããªã±ãŒã·ã§ã³ã®äŸãäºã€ãããŠã¿ãŸãã ã±ãŒã¹A ãŠãŒã¶ãŒãããè©äŸ¡ã®é«ãæ©èœæ§ã®ããã¢ããªã±ãŒã·ã§ã³ã ãã 3æ¥ã«1æ¥ãããã®ããŒã¹ã§å©çšãã§ããªããªãã ã±ãŒã¹B 24æé365æ¥æ£åžžã«çšŒåããããToDoã®ç»é²ãšåé€ã®æ©èœãããªã äžèšãã©ã¡ããã®ã¢ããªã±ãŒã·ã§ã³ã䜿ããããšæããŸããïŒ ã»ã»ã»ã©ã¡ãã䜿ããããªããšæã£ãããšã§ãããã å®éã«åžå Žã«åºããŠããŠãŒã¶ãŒããéžãã§ããããããšã¯ç¡ãããã§ãã ã€ãŸããããžãã¹ãšããŠãããã¯ããæåããã«ã¯ã æ°æ©èœã®éçºãšä¿¡é Œæ§ã®åäžãäž¡æ¹ã®ã¿ã¹ã¯ããã©ã³ã¹ãããããªã£ãŠãããªããã°ãªããªããã§ãã ããããããã§äºã€ç«ã¡å¡ããéå£ããããŸãã æ°æ©èœéçºãè¡ããšãã°ãçºçããå¯èœæ§ããããããä¿¡é Œæ§ãäœäžããã SLOã«9ãå ããã«ã¯ããã®åã®9ãå®è£
ããã®ã«ããã£ãã³ã¹ãã®10åãããã99%ãã99.9ïŒ
ã«ããããã«ã¯99%ã«ããããã«ããã£ãã³ã¹ãã®10åãããã99.99%ã«ããããã«ã¯ãããã®ããã«10åã®ã³ã¹ããããããšèšãããŠããŸãã ã©ãããæ°æ©èœéçºãšä¿¡é Œæ§ã®åäžã¯ããäºãã«ãã¬ãŒããªãã®é¢ä¿æ§ã«ããããã§ãã <åè> https://cloud.google.com/architecture/defining-SLOs?hl=ja#why_slos é«ãããSLOãåŒãèµ·ãããã® äŸãã°ãæé»çã«SLO99.99999…%ã®ããã«é«ãæ°Žæºã®SLOãèšå®ããŠããŸãã ãšã©ãŒããžã§ããããšãŠãå°ãªãç¶æ³äžã«ãã£ããšããŸãããã ãã®å Žåãä¿¡é Œæ§ã®æ
ä¿ã«å¯ŸããŠå¿
èŠãªã³ã¹ããããªãé«ãæ°Žæºã§å¿
èŠãšããã çµæçã«æ°èŠéçºãžã®çæãå°é£ãšããèªäœã«é¥ãããã§ãã ãã ãããããªç¶æ³äžã ã£ããšããŠãããããã¯ããšããŠæ°æ©èœéçºããŒããšããããšã¯èãã¥ããã§ãããã ä¿¡é Œæ§ãæ
ä¿ã§ããŠããªãç¶æ
ãªã®ã«æ°æ©èœãéçºããªãã¡ããããªããšãã倧å€ãªç¶æ³ã«ãªããããããŸããã æãåœããç¯ãããããã§ããã°ããŸãã¯ä»ã®ã·ã¹ãã ãã©ãã»ã©ã®æ°Žæºã§ä¿¡é Œæ§ãããã®ãã SLIãå®çŸ©ããèšæž¬ãããšããããå§ãããšè¯ãã§ãããã SLOããããŠããŸããšæ°èŠéçºã«æè³ã§ããã ãã®ã³ã¹ãã倱ãããŠããŸããšããåæã®ããšã å®çŸå¯èœæ§ãé«ãå€ãå®çŸ©ã§ãããšãå°ãã¥ã€æ°èŠéçºã«ãæè³ã§ããããã«ãªããããããŸããããããã§ãä»ã®çŸç¶ã§ä¿¡é Œæ§ãæ
ä¿ã§ããŠããªããšèããã®ã§ããã°ãå®éçãªææšã«ãã£ãŠãçŸåšè¡ã£ãŠããä¿¡é Œæ§åäžã®æœçã广ãããã®ããªãã®ãã倿ããããšãã§ããã§ãããã ãŸãšã ãã¬ãã£ããªè§£éããããã¡ãªãšã©ãŒããžã§ããã«é¢ããŠã ä»åã¯èª²é¡ã®èæ¯ã解決ã¢ãããŒãã説æãããŠããã ããŸãããã誀解ã¯è§£ããŸããã§ããããã ãšã©ãŒããžã§ãããå®çŸ©ããã®ã¯è¯ãããããšãã æ¹ããŠèªåã®æ
åœããŠãããããã¯ãã«ã¯ãç·æ¥çã«ã¯å¿
èŠãªãããããªã©ã諞ã
èããŠããããå¬ããã§ãã ãããã« medibaã§ã¯ãçŸåšãåãããã¯ãã®äŸ¡å€ãåäžãã¹ãã æ¥ã
SRE掻åãç©æ¥µçã«è¡ã£ãŠãããŸãã æ¬¡åã¯ããšã©ãŒããžã§ãããããæå¹ãªãã®ã«ããããã«ãä¿¡é Œæ§ãäžãããšäœãå¬ããã®ããäžãã£ãŠããŸããšã©ããªããšãèµ·ããããã®ããšããç¹ãæ·±å ãããã广ã®é«ãSLIå®çŸ©ã«ã€ããŠã®ãã¬ããžãå
±æãããããšèããŠãŸãããæ¥œãã¿ã«ã»ã»ã»ïŒ
ã¯ããã« ããã«ã¡ã¯ãããã³ããšã³ããšã³ãžãã¢ã®äžç ( @yn2011 ) ã§ãã au WebããŒã¿ã« ç¡æã²ãŒã ã§ã¯æ§ã
ãªããã³ããšã³ãã®ããã©ãŒãã³ã¹æé©åã«åãçµãã§ããŸããä»åã¯ãæ¢ã«å®æœããæé©åã®äžãã 察å¿ã³ã¹ããå°ããã广ãåãããããã£ããã® ãäžå¿ã«ã察å¿äºäŸã®ã玹ä»ãããŸãã ãªãã au WebããŒã¿ã« ç¡æã²ãŒã 㯠Jamstack æ§æãšãªã£ãŠãããNext.js (SSG) ãš ãããã¬ã¹CMS ãå©çšããŠãããŸããè©³çŽ°ãªæè¡ã¹ã¿ãã¯ã«ã€ããŠã¯ ãããã¬ã¹ CMS éçšã«ããããããã€ãšç°å¢å·®åã«ã€ã㊠ã«èšèŒããããŸãã®ã§ããã²ãã¡ããã芧ãã ããã Lighthouse ã«ããæž¬å®çµæ ããã©ãŒãã³ã¹ã®æé©åãè¡ãåã®ç¶æ
ã§ãLighthouse ã®æž¬å®çµæã¯ä»¥äžã®ããã«ãªã£ãŠããŸããã ææš ææšã®æå³ çµæ First Contentful Paint ããã¹ããŸãã¯ç»åãåããŠãã€ã³ãããããŸã§ã«ããã£ãæé 2.3 ç§ Speed Index ããŒãžã®ã³ã³ãã³ããåã蟌ãŸããŠè¡šç€ºãããéã 3.7 ç§ Largest Contentful Paint æã倧ããªããã¹ããŸãã¯ç»åãæç»ããããŸã§ã«ããã£ãæé 9.1 ç§ Time to Interactive ããŒãžãå®å
šã«æäœå¯èœã«ãªãã®ã«èŠããæé 8.9 ç§ Total Blocking Time ã¿ã¹ã¯ã®åŠçæéã 50 ããªç§ãäžåã£ãå Žåã®ãã³ã³ãã³ãã®ååæç»ããæäœå¯èœã«ãªããŸã§ã®åèšæé 1,720 ããªç§ Cumulative Layout Shift ãã¥ãŒããŒãå
ã®èŠèŠèŠçŽ ãã©ã®ãããç§»åããŠããã 0 枬å®çµæãèŠããšãLargest Contentful PaintãTotal Blocking Time ã¯ç¹ã«æ¹åã®äœå°ãããããã§ãããä»åã¯ããã®æž¬å®çµæãå
ã«ãå®è£
ã³ã¹ããå°ããã»æ¢åã®æ©èœã«å¯Ÿãã圱é¿ãå°ãããšå€æãã以äžã® 3 ã€ã®æé©åã«ã€ããŠã玹ä»ããŸãã ããã¯ã¢ãããããŒã® preload au WebããŒã¿ã« ç¡æã²ãŒã ã®ãããããŒãžã¯ä»¥äžã®ããã«ãªã£ãŠãããç»é¢ã®å€§éšåãã²ãŒã ã¿ã€ãã«ã®ãããŒïŒããã¯ã¢ãããããŒïŒãå ããŠããŸãã ãããããŒãžã«ã¢ã¯ã»ã¹ããéã«ãããã¯ã¢ãããããŒã®ç»åãåªå
çã«èªã¿èŸŒãããšã§ Largest Contentful Paint ã®æ°å€ãæ¹åããŠãŒã¶ãäœéšããç»é¢è¡šç€ºãŸã§ã®é床ãé«ããããšãã§ããŸãã å®è£
ãšããŠã¯ã以äžã®ãããªèŠçŽ ã HTML ã«è¿œå ããã ãã§å®çŸå¯èœã§ãã <link rel="preload" href="https://url-to-image" as="image" /> å€éšãã¡ã€ã³ã«å¯Ÿãããªã¯ãšã¹ãã® preconnect au WebããŒã¿ã« ç¡æã²ãŒã ã§ã¯ãåºåã®è¡šç€ºãããŒã¿åæã®ããã«å€éšãã¡ã€ã³ã«å¯ŸããŠãªã¯ãšã¹ããè¡ããŸãã ãªã¯ãšã¹ãå
ã®å€éšãã¡ã€ã³ãäºãåãã£ãŠããå Žåã«ã¯ãäºåã« DNS LookupãInitial ConnectionãSSL ãæžãŸããŠããããšã§ãªã¯ãšã¹ããèŠæ±ãããŠããã¬ã¹ãã³ã¹ãåŸããŸã§ã®æéãççž®ããããšãã§ããŸãã å®è£
ãšããŠã¯ã以äžã®ãããªèŠçŽ ã远å ããã ãã§å®çŸå¯èœã§ãã <link rel="preconnect" href="//other.domain.com" /> Chrome DevTools ã® Network ã¿ããå©çšããŠç¢ºèªãããšãpreconnect æå®åã¯ä»¥äžã§ãã£ãã®ã«å¯Ÿã preconnect æå®åŸã«ç¢ºèªãããšãåãã§ãŒãºã«äœ¿çšãããæéãçããªããŸããã ãªããpreconnect ã®ä»ã«ãdns-prefetch ã屿§å€ãšããŠæå®ããæ¹æ³ããããŸããäž¡è
ã®ç¹åŸŽãæ¯èŒãããšãpreconnect ã®æ¹ãå€ãã®åŠçãäºåã«è¡ãããšãã§ããåé¢ããã©ãŠã¶ã®ãµããŒãç¯å²ã¯ dns-prefetch ããã¯çãã§ãã dns-prefetch preconncet ãã©ãŠã¶ãµããŒã â â³ DNS Lookup â â Initial ConnectionãSSL â â 以äžã®ããã«ãã©ãŒã«ããã¯ãšããŠäž¡æ¹ãæå®ããããšãå¯èœãªããã§ããã WebKit ã§ã¯åäœããªããšããå ±å ããããŸããã <link rel="dns-prefetch preconnect" href="//other.domain.com" /> preconnect ã¯ããããŸã§ããã©ãŒãã³ã¹æ¹åã®ããã® nice to have ãªå¯Ÿå¿ã§ããäžéšãã©ãŠã¶ã察å¿ããŠããªããŠãåäœèªäœã«åœ±é¿ã¯ãªããã preconncet ã®ã¿ãå©çšãã倿ãããŸããã Google ãªããã£ãã€ãºã®ã¹ã¯ãªãããåžžã«èªã¿èŸŒãŸãªã au WebããŒã¿ã« ç¡æã²ãŒã ã§ã¯ãA/B ãã¹ãã宿œããããã«ãGoogle ãªããã£ãã€ãºãå©çšããŠããŸãããã®ãããGoogle ãªããã£ãã€ãºã®ã¹ã¯ãªãããå¿
ãèªã¿èŸŒãã§ããŸããã <script src="https://www.googleoptimize.com/optimize.js?id=OPT_CONTAINER_ID" /> ããããA/B ãã¹ãã¯åžžã«å®æœããŠããããã§ã¯ãªããã A/B ãã¹ãã宿œããŠããªãæéã«ã€ããŠã¯äžèŠãªãªãœãŒã¹ã®èªã¿èŸŒã¿ãšã¹ã¯ãªããã®å®è¡ãçºçããŠããŸã£ãŠããŸããã au WebããŒã¿ã« ç¡æã²ãŒã ã¯ãNext.js ã® SSG ãå©çšããŠããã®ã§ã A/B ãã¹ãã宿œããŠããªããã°ãã«ãæã« Google ãªããã£ãã€ãºã®ã¹ã¯ãªããã¿ã°ãå«ããªãããã«å€æŽããŸããã A/B ãã¹ãã宿œããŠãããã®å€å®ã¯ãå©çšããŠãããããã¬ã¹CMS ã«ç¹å®ã®ã¬ã³ãŒããååšãããã©ããã§è¡ã£ãŠããŸãã å®è£
ãšããŠã¯ä»¥äžã®ããã«ã _app.tsx ã® getInitialProps ã§ å€å®ãè¡ã Props ã«ãã©ã°ã远å ããŸããã static async getInitialProps() { ... return { pageProps: {}, isOptimizeRunning: !!config.experiments && config.experiments.length > 0 } } ãã® isOptimizeRunning ãå©çšããã¬ã³ããŒæã«ã¹ã¯ãªããã¿ã°ãå«ãããã©ãããæ±ºå®ããŸãã {isOptimizeRunning && ( <script src="https://www.googleoptimize.com/optimize.js?id=%24%7BOPT_CONTAINER_ID" /> )} æ¹åã®çµæ 以äžã®æé©åãè¡ããLighthouse ãåå®è¡ãããšæž¬å®çµæã¯ä»¥äžã«ãªããŸããã ææš å åŸ æ¹åç(%) First Contentful Paint 2.3 ç§ 1.3 ç§ 43.48 Speed Index 3.7 ç§ 3.0 ç§ 18.92 Largest Contentful Paint 9.1 ç§ 6.2 ç§ 31.87 Time to Interactive 8.9 ç§ 8.6 ç§ 3.37 Total Blocking Time 1,720 ããªç§ 1,550 ããªç§ 9.88 Cumulative Layout Shift 0 0 0.00 ç»é¢æç»ã«é¢ããææšïŒFirst Contentful PaintãSpeed IndexãLargest Contentful PaintïŒãäžå¿ã«å€§ããæ°å€ãæ¹åããŸãããããŒã¿ã«ã®ã¹ã³ã¢èªäœã 38 â 44 ãšäžæããŸããã ãããã« au WebããŒã¿ã« ç¡æã²ãŒã ã§å®æœããããã³ããšã³ãããã©ãŒãã³ã¹ã®æé©åã«ã€ããŠã玹ä»ããŸããã å人çã«ã¯ãããã©ãŒãã³ã¹ã®æé©åãšãããšé£ãããã調æ»ãå®è£
ã«å€ãã®æéãå¿
èŠã«ãªãããããšãã£ãå
å
¥èгããããŸããããæå€ãšç°¡åã«å®è£
ã§ããŠææã«ç¹ãããããã®ããããã ãªããšããåŠã³ããããŸããã ä»åã玹ä»ãããã®ã¯ã å®éã«åãçµãã ããã©ãŒãã³ã¹ã®æé©åã®äžã®äžéšã§ãããå®éã«ã¯ãã£ãšå®è£
ã®å€æŽã倧ãããæ¢åæ©èœãžã®åœ±é¿ãèæ
®ããªãã°ãªããªããã®ãå€ããããŸããã ãããã«ã€ããŠã¯ããŸãå¥ã®æ©äŒã«ãäŒãã§ããã°ãšæããŸãã æåŸãŸã§ãèªã¿é ãããããšãããããŸããã
SrManager ã®å°Ÿéã§ãã 2021/03/17ïŒæ°ŽïŒã«KDDIã°ã«ãŒã6瀟ååã§ããã¯ã«ã³ãã¡ã¬ã³ã¹ãéå¬ããŸããã ä»åãã³ãã¥ããã£ã®ç«ã¡äžãããéå¶ãŸã§æºãããŸããã®ã§ãéæãšä»åŸã«ã€ããŠè§ŠããããšæããŸãã ïŒãã®ã¢ã€ãã£ãã㯠ã³ããã瀟 ã®æ¹ããã¶ã€ã³ããŠãã ãããŸãããïŒ KGDC is äœ KGDCã¯ã K DDI G roup D eveloper C ommunityãã®ç¥ã§ãã âKDDI ã°ã«ãŒãäŒæ¥å瀟㮠Developer ãéããããšã³ãžãã¢ã楜ããããã€ãã³ããæäŸããã³ãã¥ããã£â ãã³ã³ã»ããã«ç«ã¡äžãããŸããã connpass ã°ã«ãŒãããŒãž connpass ã€ãã³ãããŒãžïŒçŸåšã¯çµäºããŠãããŸãïŒ åŒç€Ÿ ãç¥ãã åŒç€Ÿãã㯠VPoE æ°äºïŒããã«ãã£ã¹ã«ãã·ã§ã³ CTOæºå宀宀é·è£äœ æœæ ¹ïŒã»ãã·ã§ã³ ã«ã«ãã¹(ããã³ããšã³ããšã³ãžãã¢)ïŒ LT ã«ãç»å£ããŠããã ããŸããã ãªãããããšã«ãªã£ãã®ãïŒ æãã€ã ã§ãã å人çã«ç¹ããã®ãã£ã ã³ããã瀟㮠CTO ãš Supership 瀟㮠CTO ã«ãäžç·ã«ã€ãã³ããã£ããæ¥œããããããªãã§ãããïŒããšéã«ã声æããããŠããã£ãã®ããã£ããã§ãã KDDIã°ã«ãŒããå®ã¯å€åœ©ãªãã§ãã ãããªäºãå€ãã®æ¹ã«äŒããã°è¯ããªãšæã£ãŠäŒãŠãŸããã ã©ããã£ãŠé²ããŠãã£ãã®ãïŒ æé æé軞ã§èšããš 2020幎12æåé ã§ãã åŒç€Ÿç€Ÿé·ã®æ±å¹¡ã«ãååãé ãã å
±å¬äŒæ¥ ã«ã声æãããŸããã å
±å¬äŒæ¥ã¯åŒç€Ÿå«ãå
š 6 瀟ãå¿«ãå
±å¬ã«ã€ããŠè³åãé ããŸããã éå¶æºå å瀟éå¶ã«ãååããã ããæ¹ãã¢ãµã€ã³é ããå®è¡ã«ç§»ã£ãã®ã幎æããã 2021幎01æåé ã§ãããïŒéå¶ã¡ã³ããŒã¯ç·å¢20人çšïŒ ç§èªèº«ããŒãã€ãã§ã³ãã¥ããã£ãç«ã¡äžããçµéšãç¡ããå瀟ç¥èŠã®ããæ¹ãšçžè«ããªããTODOãããŒãããããç«ãŠãŠãããŸããã ãã£ãããšä»¥äžã®åæ
ã§å瀟å²ãæ¯ããé²ããŠè¡ããŸããã é
ä¿¡ããŒã ãªã³ã©ã€ã³é
ä¿¡ã«ãããããŒã«ãã³ãã¥ãã±ãŒã·ã§ã³ã«æææ±ºå®ãæã€ããŒã ã³ã³ãã³ãããŒã ã³ã³ãã³ããã¿ã€ã ããŒãã«ã«æææ±ºå®ãæã€ããŒã ããã¢ãŒã·ã§ã³ããŒã æ¡æ£/éå®¢æ¹æ³ã«æææ±ºå®ãæã€ããŒã åžäŒããŒã åœæ¥ã®åžäŒé²è¡ãªã© ãŸãã鱿¬¡ã§éãŸãåããŒã ã®TODOã鲿/課é¡ãªã©ãåžãäžããŠé²è¡ããŠãããŸããã 䞻㫠scrapbox äžã§ãã°ãæ®ããªãããå°çšã® Slack workspace äžã§é£æºãåããªããé²ããŠããã¹ã¿ã€ã«ãåããŸããã åœæ¥ã«è³ããŸã§ãé嬿¥ã®å€æŽãç·æ¥äºæ
宣èšã®å»¶é·ãªã©ã倧ããªäºå®å€æŽããããªãããéå¶ã¡ã³ããŒã®çæ§ãèšæ©å¿å€ã«å¯Ÿå¿ããŠãããŸããã éå¬åæ¥ã®ãæ°æã¡ Slack æçš¿ã§ãã ïŒå
±ååžäŒã® KDDI Web Communications èããã®ãªããšäžæãäºããå§å·»ã§ãããïŒ åœæ¥ connpass äžã§ã®åå ç³ã蟌ã¿ïŒ 233 å åœæ¥ Zoom åå ãåžžæ 100 人以äžã®ã€ãã³ãèŠæš¡ãšãªããŸããã åœæ¥åžäŒé²è¡ããªããèããŠããŠãéåžžã«ãã©ãšãã£ã«å¯ãã ã©ã€ã³ãããã ã£ããšå®æããŸããã KDDIã°ã«ãŒããå®ã¯å€åœ©ãªãã§ãã å
šç»å£è
ãæéè¶
éããäºãªãé²è¡åºæ¥ãã®ã¯ãç»å£è
ã®çæ§ããããã£ãïŒèªåœåïŒãšããã®ããããŸãããè£ã§ã¿ã€ã ããŒããããŠããã åŒç€Ÿ äžå°/äºæå¥³ ã®ãã现ãããã®ãé°ãšããã®ããããŸãã å
šéã§ã¯ãããŸããããåœæ¥ã»ãã·ã§ã³/LTè³æã¯ ãã¡ã ã«äžãã£ãŠãããŸãã ãããã« å·çæç¹ã次åéå¬ã«åããŠæ€èšãé²ããŠãããŸãã æ¬¡å㯠#1 ãšããŠããã£ãšå€§ã
çã«æã¡åºããªããéå¬ããŠãããã°ãšèããŠãããŸãã KDDIã°ã«ãŒãã§ååããªããããã£ãšã°ã«ãŒãå
šäœãçãäžããŠè¡ããã°ãšæã£ãŠãããŸãã ãŸããå¿«ãå
±å¬ã«è³åããŠãã ãããéå¶ã«æºãã£ãŠãã ãã£ãã°ã«ãŒãäŒæ¥ã®çæ§ã«ã¯åã埡瀌ç³ãäžããŸãã å
±å¬äŒæ¥ïŒæ¬ç§°ç¥ïŒ iret https://www.iret.co.jp/ au ã³ããŒã¹ïŒã©ã€ã https://www.au-cl.co.jp/ KDDI Web Communications https://www.kddi-webcommunications.co.jp/ ã³ããã https://connehito.com/ Supership https://supership.jp/ KDDIã°ã«ãŒããå®ã¯å€åœ©ãªãã§ãã ãã®äžã§ã ãŠãŒã¶ãŒäžå¿ãª âãã®ã¥ããCompanyâ ãç®æã mediba ã§äžç·ã«ãã®ã¥ããããŠãããã¡ã³ããŒãéæåéããŠãããŸãã
ããã«ã¡ã¯ãäžå°ãšç³ããŸãã ç§ã®ããŒã«ã¯ãšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒ(以äžãEM)ãªã®ã§ãããEMãšèšã£ãŠãçµç¹ã«ãã£ãŠã³ãããããé åãæ¯ãèãçãéããšæããŸããããã§medibaã«ãããEMãšããŠã®æ¥åå
容ããŸãšããã©ã®é åã«ã³ãããããŠããã®ããæŽçããããšæããŸãã â»ä»EMãšããæ¹ãåæããŠããããã§ã¯ãªãã®ã§ãããŸã§ç§ãEMãšããŠå®æœããŠããç¯å²ã®è§£èª¬ã«ãªããŸããäºããäºæ¿äžããã äž»ãªæ¥å medibaã«ãããEMã¯ããŒãã«ãããŒãžã¡ã³ãã軞ã«ããŠãããããã¯ãã«1人ã®EMãé
眮ãããŒã ãéå¶ããŠããŸããäž»ãªæ¥åãšããŠããŒãã«ãããŒãžã¡ã³ããçµç¹éå¶ããããã¯ãéçºã®3é åã«ãããäºãã§ããŸãã ããŒãã«ãããŒãžã¡ã³ã ã¡ã³ããŒïŒããïŒã«åãåããæé·ãè²æã«ã³ãããããããšã§ãçµç¹ã®ææãæå€§åããäºãç®æããŸãããã ãæé·ãè²æã¯ãããŸã§å人ã«äŸåããŠãããšèããŠããã®ã§äž»ã«å ŽãæŽããããäœãäºãæèãæ¯æŽããäºãéç¹ã«çœ®ããŠããŸãã 1on1ã®å®æœ æ¯é±30åã¡ã³ããŒãšè©±ããŠããŸãã話ãå
容ã¯ã¡ã³ããŒã«ãã£ãŠãã©ãã©ã§éè«ããè¶£å³ãæ¥åã®ãå°ãããšãç®æšçã«ã€ããŠã話ããŸãããªã¢ãŒãã¯ãŒã¯äžå¿ã®æ¥åãªã®ã§ã¡ã³ã¿ã«ãã§ãã¯ãå
ŒããŠå®æœããŠããŸãã åã¡ã³ããŒã®æé·æ¯æŽã®åµé ã³ã³ããªã¯ãã®è§£æ¶ãå ŽãæŽåãããã©ãŒãã³ã¹ãåºããç°å¢ãæäŸããããå¿ããæ¯æŽããŸããç§ã®èããçæ³ã®EMåã¯éšæŽ»åã«ããããããŒãžã£ãŒãªã®ã§ãéåãããã©ãŒãã³ã¹ã«åœ±é¿ãããç®æã¯1on1ãéãæ
å ±åéãè¡ã察å¿ããŸãã çµç¹éå¶ ããã«ãããŒãžã£ãŒã®äž»ãªæ¥åãè©°ãŸã£ãŠããé åã§ããmedibaã®EMãäŸå€ã§ã¯ãããŸããã詳现ã¯å²æããŸãããè©äŸ¡ã¯è¯ããšããã«ãã©ãŒã«ã¹ã䟡å€ãé«ããŠããäºãæèããŠããŸãã è©äŸ¡ æ¡çšé¢æ¥ çµç¹KPIã®ã³ããã åºå ±æŽ»å ãããã¯ãéçº æžç±ããã£ãŒã«çµç¹ã«ããâå©èšããã»ã¹âãåãå
¥ããã©ããŒããŠããŸãã å©èšããã»ã¹ãšã¯ ååãšããŠãçµç¹å
ã®ã ãããã©ããªæ±ºå®ãäžããŠãããŸããªãã ãã ããã®åã«ãã¹ãŠã®é¢ä¿è
ãšãã®åé¡ã®å°éå®¶ã«å©èšãæ±ããªããã°ãªããªãã æ±ºå®ãäžãããšãã人ã«ã¯ãäžã€äžã€ã®å©èšããã¹ãŠåãå
¥ãã矩åã¯ãªã â»æžç±"ãã£ãŒã«çµç¹ â ãããžã¡ã³ãã®åžžèãèŠã次äžä»£åçµç¹ã®åºçŸ"ããæç² ãããã¯ããã¡ã³ããŒã®ããã«ããã¯ã®è§£æ¶ éçºããã»ã¹ãããããã¯ãã®èª²é¡è§£æ±ºã¯å©èšããã»ã¹äž»äœã§é²ãããã®ã®ããããã¯ãå
šäœã®ããã«ããã¯ããä»è·èœãããŒãžã£ãŒãšã®èª¿æŽãã¡ã³ããŒéã®ãã©ãã«è§£æ¶çã¯å
šäœã俯ç°ããŠèŠãŠããEMã察å¿ããŸãããã®ããã«ããã¯ã®è§£æ¶ã¯ãEMã®å€å²ã«æž¡ãæ¥åã®äžã§1çªåªå
床ãé«ãæ¥åãšããŠããŸãã æææ±ºå®ãå¿
èŠãªMTGãžã®åå æœçåºãããªãªãŒã¹çã
ã®MTGã¯ããŸãåå ããªããã®ã®æææ±ºå®ãå¿
èŠãªMTGã«ã¯ç©æ¥µçã«åå ããŠããŸããããã¹ãã§å¯Ÿå¿ããããäŒè©±ããæ¹ãææãäŒãããããšèããŠããŸãã é害æã®åããŸãšã EMãææ®ãåã圱é¿ç¯å²çã調æ»å ±åããŸããä»ãããŒãžã£ãŒãšã®é£æºãå¿
èŠãªã®ãšæçµçã«EMãå ±åããã®ã§ç©æ¥µçã«å¯Ÿå¿ããŸãã ãããžã§ã¯ããããŒãžã£ãŒæ¥å ã¡ã³ããŒã宿œããäºããããŸããä»ãããŒãžã£ãŒãä»éšçœ²ãšã®é£æºãå¿
èŠãªå ŽåEMã察å¿ããŸãã æè¡éžå® çµç¹ãšããŠã®æè¡éžå®ã®èгç¹ãšããŠå£²äž/å©çãä»åŸã®å±æãæé·ã®ãã©ã³ã¹ãæèãäºæ¥å
容ã§ã©ãã«BETãããã倿ããŠããŸãã売äž/å©çéèŠãªãåŸæãªã¹ã¿ãã¯ãä»åŸã®å±æãéèŠãããªãæ¢åã¹ã¿ãã¯ã«ãšããããæé©ãªã¹ã¿ãã¯ãéžå®ãšãã£ãå
·åã§ãã ãŸãšã medibaã®äž»ãªEMæ¥ããŸãšããŠèŠãŸãããåŠäœã§ããããïŒç§èªèº«ã¯ã³ãŒããæžãæ¥åã«ã¯æºãããŠããªãã®ã§ããŒãã¹ãã«ãæ¢ãŸã£ãŠãããã®ã®ã1on1çã§èŠåº§ãããã£ãŠããã¡ã³ããŒããä»äºã楜ãããšèšã£ãŠãããã¡ã³ããŒãæ¥åã®å¹
ãåºã掻èºã§ããé åãåºããã¡ã³ããŒçã®æé·ãè¿ãã§å®æã§ããã®ã¯éåžžã«æ°æã¡ãããEMã®ãããããæããŸãã ä»åã¯çµç¹éå¶ããŒãã®è©³çްã¯å²æããŠããŸããæ©äŒãããã°èšèªåããããšæããŸãã æåŸã«ãªããŸãããçŸåšmedibaã§ã¯ EMãåé ãããŠããŸãã å°ãã§ãèå³ãæã£ãŠé ãããå¿åããŠãããããšå¹žãã§ãã äœè« EMãã©ã€ã¢ã³ã°ã« ãšã¯EMã®åœ¹å²ãã°ã©ãã£ãã¯ã¢ãã«åãããã®ã§ãã以äžã®å³ã¯EMãã©ã€ã¢ã³ã°ã«ã«äž»ãªäœæ¥é åã«è²ãã€ãå¯èŠåãããã®ã«ãªããŸããmedibaã§ã¯Technology - Teamé åãäž»è»žã«æŽ»åããŠããäºãããå
šé åãç¶²çŸ
ãã圢ãšãªã£ãŠããŸãããã¡ããåèã«ããŠé ãããšå¹žãã§ã
ã¯ããã« medibaã®éåŽã§ãã ããã¯ãšã³ããšã³ãžãã¢ãšããŠããã¯ãšã³ãã¢ããªã±ãŒã·ã§ã³ãã€ã³ãã©ã¹ãã©ã¯ãã£ãŒã®éçšãè¡ã£ãŠããŸãã ãŸãïŒå
Œåã§ãã¯ãããžãŒã»ã³ã¿ãŒã«ãŠTechLeadããŒã ã«ãæå±ããŠããŸãã æšå¹Žããau WebããŒã¿ã«ã®éçšããŒã ã«æ
åœãšãªããŸããã au WebããŒã¿ã«ã®éçšããŒã ã¯ãè€æ°ã®ã·ã¹ãã ãéçšããŠããŸãã 倧åã®ã·ã¹ãã ãåæéçºããæ°å¹Žçµéãã€ã³ãã©ã¹ãã©ã¯ãã£ãŒ(AWSãªãœãŒã¹)ãæåã§å€æŽãããããªæ¥åãšãªã£ãŠãããåŸè¿°ãããããªèª²é¡ãå€ãèŠåããããŸããã æ¬èšäºã§ã¯ããã®æ¹åã®ããã«è¡ã£ã æ¢åã·ã¹ãã ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãŒã®ã³ãŒãå - Infrastructure as Code(IaC)ãé²ããããã»ã¹ã玹ä»ããã ãšæããŸãã ã€ã³ãã©ã¹ãã©ã¯ãã£ãŒãæåã§å€æŽããå Žåã®èª²é¡ æå±ããããŒã ã§ã¯ãããŸã§ä»¥äžã®ãããªæ¥åã®æµãã«ãªã£ãŠããã€ã³ãã©ã¹ãã©ã¯ãã£ãŒ(AWSãªãœãŒã¹)ãæåã§å€æŽããŠããŸããã â»åŒç€Ÿã§ã¯ããã¯ãšã³ããšã³ãžãã¢ãšã€ã³ãã©ãšã³ãžãã¢ã«ããŒã«ãåãããŠããŸãã 倿Žå
容ãããã¯ãšã³ããšã³ãžãã¢ãäœæããã€ã³ãã©ãšã³ãžãã¢ã«å€æŽäŸé Œãè¡ã ãã®å€æŽå
容ãå
ã«ã€ã³ãã©ãšã³ãžãã¢ãAWSãããŒãžã¡ã³ãã³ã³ãœãŒã«ãä»ããŠå€æŽäœæ¥ãè¡ã ãã®ãããªæ¥åã®å€§ããªèª²é¡ãšããŠä»¥äžã®ãããªç¹ãæãã£ãŠããŸããã AWSãªãœãŒã¹ã®ç®¡çãã€ã³ãã©ãšã³ãžãã¢ã«å±äººçã«ãšãªã ããã¯ãšã³ããšã³ãžãã¢ããã®å€æŽäŸé Œãå€ãéã«ã¯ã倿Žäœæ¥ã«ãªãŒãã¿ã€ã ãçºçãã 倿Žå±¥æŽãæ®ãããçµç¹å€æŽã«æè»ã«å¯Ÿå¿ã§ããªã ãããã£ã課é¡ã®è§£æ±ºã®ããã ãŸãæ¢åã·ã¹ãã ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãŒã®ã³ãŒãå - Infrastructure as Code(IaC) ãæ€èšããŸããã ããã¯ãšã³ããšã³ãžãã¢ãã³ãŒããä»ããŠãAWSãªãœãŒã¹ã®å€æŽç®¡çãè¡ã£ãŠè²°ãããã§ãã ã©ã®ããã«æ¢åã·ã¹ãã ãªãœãŒã¹ãã€ã³ãã©ã³ãŒãåããã åŒç€Ÿã§ã¯æ°èŠéçºæã«Infrastructure as Code(IaC)ããŒã«ãšããŠTerraformãå©çšããããšãå€ããããTerraformå©çšãåæã«ããŸããã æ¢åã®ãªãœãŒã¹ãTerraformã®ã³ãŒãåããã«ã¯ã terraform import ã³ãã³ãã䜿ãããšã«ãªããŸãã ãããããã®ã³ãã³ãã¯AWSã®ãªãœãŒã¹ã1ç¹ãã€æå®ããå¿
èŠããããŸãã åè: https://www.terraform.io/docs/cli/import/index.html ä»åã®å¯Ÿè±¡ã·ã¹ãã ã®ãªãœãŒã¹æ°ã¯ æ°100 ããããã®æ¹æ³ã§ã³ãŒãåããã®ã¯çŸå®çã§ã¯ãããŸããã§ããã ããã§ä»åã¯TerraformerãšããããŒã«ã䜿ããæ¢åã·ã¹ãã ã®Teraformã³ãŒãã®çæãè¡ããŸããã 以äžã§ã¯ããã®å®æœæé ãèšèŒããŸãã åè: https://github.com/GoogleCloudPlatform/terraformer Terraformerã¯ãæ¢åã®ã·ã¹ãã ããTerraformã³ãŒããšãã®stateãã¡ã€ã«(tfstate)ãçæããCLIããŒã«ã§ãã Terrformerã«ããæ¢åã·ã¹ãã ã®ã³ãŒãåã®å®æœ ä»åã®ã·ã¹ãã ã¯ä»¥äžã®ãããªåæãšããŠèšèŒããŠãããŸãã ã·ã¹ãã ã®ç°å¢ã¯ãéçºç°å¢(devç°å¢)ãšåçšç°å¢(prdç°å¢)ã«åãããŠãã åç°å¢ããšã«ãAWSã¢ã«ãŠã³ããïŒã€ãã€ãã æ±äº¬ãªãŒãžã§ã³ãå©çšããŠãã ããŒã«ã«PCãšããŠãmacOSã䜿ã 1. ã³ãŒãå察象ã®ã·ã¹ãã ã®ç¢ºèª Terraformerã® README.md ã«AWSã«å¯Ÿå¿ããŠãããµãŒãã¹ãèšèŒãããŠããŸããããããã察象ã·ã¹ãã ã®ãã¡ã³ãŒãåããããµãŒãã¹ã«ã€ããŠãªãŒãžã§ã³ããšã«ãªã¹ãåããŠãããŸãã (äŸ: æ±äº¬ãªãŒãžã§ã³ã«ãŠacm,alb,ec2_instanceãªã©) ãŸããAWSã®ã°ããŒãã«ãµãŒãã¹ã«ã€ããŠãåæ§ã«ãªã¹ãåããŠãããŸãã (äŸ: iam,route53,wafãªã©) 2. Terrformerã³ãã³ãå®è¡ããã³ãŒããçæãã 以äžã®ããŒã«ãããŒã«ã«PCã«ã€ã³ã¹ããŒã«ããŸã tfenv Terraformã®ããŒãžã§ã³ã管çããããŒã« https://github.com/tfutils/tfenv å©çšããããŒãžã§ã³: 2.0.0 Terraformer æ¢åã·ã¹ãã ããTerraformã®ã³ãŒããšstateãã¡ã€ã«ãçæããããŒã« * https://github.com/GoogleCloudPlatform/terraformer å©çšããããŒãžã§ã³: 0.8.11 次ã«é©åœãªãã£ã¬ã¯ããªãäœæãã以äžã®ãã¡ã€ã«ãäœæããŸãã init.tf .terraform-version ãã¡ã€ã«ã«ã¯ä»¥äžã®ããã«èšèŒããŸãã $ echo 'provider "aws" {}' > init.tf $ echo '0.11.14' > .terraform-version 次㫠terraformer import ã³ãã³ãã§ã³ãŒãã®çæãè¡ããŸãã ãã®ã³ãã³ãã®ãã©ã°ã¯ããã€ããããŸãããä»åã¯ã·ã¹ãã ã«åãããŠä»¥äžã®ããã«ããŸããã ãã©ã° regions ã¯ãçæå¯Ÿè±¡ã®ãµãŒãã¹ã®ãªãŒãžã§ã³ãæå®ããã ä»åã¯æ±äº¬ãªãŒãžã§ã³ãšã°ããŒãã«ãµãŒãã¹ã«ããããåããŠæå®ããã ãã©ã° resources ã«ã¯ãã1. ã³ãŒãå察象ã®ã·ã¹ãã ã®ç¢ºèªãã§ç¢ºèªãããµãŒãã¹ããªãŒãžã§ã³ããšã«èšèŒããã ãã©ã° path-pattern ã¯ãçæããã³ãŒãã®é
眮ãã£ã¬ã¯ããªãæå®ããã â»tfenvã«ãŠ 0.11.14 ãšããŠããçç± Terraformerã®AWSãããã€ããŒã®çæããã³ãŒãã 0.11(HCL1)ç³»ã®ãã®ã«ãªãããã§ãã README.md  ãªã©ãèŠããš_0.13 察å¿ãªã©ã®èšè¿°ããããŸããããã³ãŒãã確èªãããå®éã«ã³ãã³ããå®è¡ããŸããããçŸåšã®ãšãã 0.11ç³» ã§ããçæåºæ¥ãªãããã§ããã #å¯Ÿè±¡ãæ±äº¬ãªãŒãžã§ã³ã«ãããµãŒãã¹ $ terraformer import aws \ --resources=acm,alb,ec2_instance,eip,elasticache,igw,nat,nacl,rds,route_table,s3,sg,sns,sqs,subnet,waf_regional,vpc,vpc_peering \ --path-pattern aws-service/dev/ap-northeast-1 \ --regions=ap-northeast-1 #察象ãã°ããŒãã«ãµãŒãã¹ $ terraformer import aws \ --resources=cloudfront,route53,waf,iam \ --path-pattern aws-service/dev/global/ \ --regions=global ãã®ã³ãã³ããå®è¡ãããšã以äžã®ããã«tfãã¡ã€ã«ãštfstateãã¡ã€ã«ãçæãããŸãã â»ã¹ã¯ãªãŒã³ã·ã§ããã§ã¯ããã©ã«ããéããŠããŸãã_globalãã£ã¬ã¯ããªã®é
äžã«ãtfãã¡ã€ã«ãštfstateãã¡ã€ã«ãäœæãããŠããŸãã 3. ã³ãŒãã®ä¿®æ£ãšapply çæããã³ãŒããããŒã éçºã§äœ¿ããããã«ã³ãŒãã®ä¿®æ£ãããã€ãè¡ããŸããã以äžã«ä»å宿œããããšãç°¡åã«ãªã¹ãããŸãã ãããã¯éçºããŒã ã®ç¶æ³ã察象ã·ã¹ãã ã«ãã£ãŠç°ãªããããåèãŸã§ã«çããŠãã ããã Teraformã®ããŒãžã§ã³ã¢ãã åè¿°ããããã«ãçæããã³ãŒã㯠0.11 ã®ãã®ãšããŠäœæãããŠããŸã éçšããããŒãžã§ã³ã«åãããŠãTerraformã® terraform 0.12upgrade ã³ãã³ãçã䜿ããã³ãŒãä¿®æ£ãè¡ããŸã åè: https://www.terraform.io/upgrade-guides/0-12.html 管çäžèŠãªAWSãªãœãŒã¹ãTeraform管çå€ãšãã äŸãã°ãdefaultã®vpcãªã©ã¯éçšäžç®¡çãäžèŠãªã®ã§ããã®æç¹ã§ç®¡çå€ãšããŠãããŸã tfstateãããŒã«ã«ããS3ã«ç§»å æåŸã«çæã»ä¿®æ£ããã³ãŒããå
ã«å®éã®ç°å¢ã« terraform apply ãå®è¡ããŸãã äžèŠå·®åãåºãªãããã«æãããŸãããä»åå®è¡ããå Žåããã€ãå·®åãåºãŸããã äžäŸãšããŠãRoute53ããããŸããproviderã«ãŠ comment ã®defaultå€ã Managed by Terraform ãšãªã£ãŠããããããã以å€ã®æååãå®ãªãœãŒã¹ã«èšå®ãããŠããã°ãå·®åãšãªããŸãã åè: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_zone#argument-reference ãã®ãããªå·®åã¯1ç¹ãã€ç¢ºèªããªãããã³ãŒãã®ä¿®æ£(å·®åã ignore_changes ã«èšå®ãã)ãŸã㯠apply ãè¡ãã æçµçã«ã³ãŒããšã®å·®åãç¡ãããŸãã ããŒã éçºãå§ãã ãããŸã§ã§æ¢åã·ã¹ãã ãã³ãŒã管çäžã«çœ®ãããšãåºæ¥ãŸããã ä»åã¯ããã«ããã¯ãšã³ããšã³ãžãã¢ã察象㫠Terraformã®äœ¿ãæ¹ãAWSãªãœãŒã¹ãã®ãã®ã«ã€ããŠå匷äŒãªã©ãè¡ããIaCã§ã®éçºã«å¿
èŠãªç¥èãçè§£ããŠè²°ããŸããã ãã®äžã§ç°¡åãªå€æŽäœæ¥ãåãåºããªãããInfrastructure as Code(IaC)ã§ã®éçºã«æ
£ããŠè²°ã£ãŠããŸãã æåŸã« åŒç€Ÿã®ãããªã·ã¹ãã ã®å®å®æ§ãšå€æŽå®¹ææ§ãé«ãã¬ãã«ã§äž¡ç«ããªããã°ãããªãçµç¹ã§ã¯ãInfrastructure as Code(IaC)ã¯éåžžã«å€§åãªããã»ã¹ã ãšèããŠããŸãã ä»åã®åãçµã¿ã¯æ¹åã®ç¬¬äžæ©ã§ããã ç¶ç¶çã«ä»åã®ããã»ã¹ãç¶æã»æ¹åãã€ã€ãçµç¹çã«ãã¹ãã«ã®åäžãé«ããŠãããããã«ãä»åŸãåãçµã¿ãç¶ããŠãããããšèããŠããŸãã medibaã§ã¯ãã·ã¹ãã ãæ·±ãçè§£ãé¢ããçµç¹ã®çè§£ãéã¿ãªããããããããµãŒãã¹éçšããšãã«æ€èšããŠããã ãããããªãšã³ãžãã¢ã®ãå¿åããåŸ
ã¡ããŠããŸãã 以äžã«ãªããŸãã
ããã«ã¡ã¯ãæŠç°ïŒ @tkdn ïŒã§ãã çŽåŸåºŠã®é«ããããã¯ãéçºãšã¯äœã ã£ãã®ã åç·š ã§ã¯ããããã¯ãéçºã«éããŠçŽæ¥çãªé¢äžãã§ããŠããªãåå ã¯ãèªåã®äžã®ç¡ç¥ã»ç¡é¢å¿ã«ãã£ããšãããšããã§çµããŸããã åŸç·šã§ã¯ãããã¯ããããžã¡ã³ããæèããªãããã©ããã£ãŠãã®ãäœãããšããŠãããã«ã€ããŠæžããŠãããŸããåç·šããã¯å®è·µçã«ãªã£ãŠããã¯ãã§ããåãçµã¿ã®ãåèã«ãããŠãã ããã ãããã¯ããããžã¡ã³ããæèãã æšå¹Ž 11 æã«ããªã®è¯ã倧ããªãªãªãŒã¹ããã£ããã 12 æãã 3 ã€ãããã¯ããæ±ããããŒã ã¯äºæã«åãããç§ã¯ au Web ããŒã¿ã«ç¡æã²ãŒã ãšãããããã¯ãã®æ
åœãšãªããŸããïŒ ãããã¬ã¹ CMS ã«ããéçšã«ã€ããŠãã®ããã°ã§ãè§Šãããããã¯ãã§ã ïŒã ãŸãåãæãã£ãããšã¯ãããã¯ããªãŒããŒïŒä»¥é POïŒã«åŒµãä»ããæ¥åãå¥ããããšãšããããã¯ããããžã¡ã³ãã®çè§£ã§ããã PO ã¯ã¹ããŒã¯ãã«ããŒããã¯æéãè¿«ãããéçºããã¯ã§ãããåããããšèšãããäºæ¥éšå
šäœã§ã¯æ°åãè¶³ããªããšèšããããããã ããªããŸã ãããããŒãã£ã³ã°ã調æŽãå€ããèå¿ãªãããã¯ãã®ããšããããã¯ããæäŸãããŠãŒã¶ãŒäŸ¡å€ãåçãã©ã³ã¹ã«ã€ããŠæ·±ãèããæéã®äœè£ãããŸããªãããã§ããã åæã«ãããã¯ããããžã¡ã³ãã«ã€ããŠçè§£ãæ·±ããããšã§ãPO ã®è² æ
ãæžããã ãã§ãªãããããã¯ãããŒã ãæ£ãããã®ã¥ããã«æã£ãŠããå¿
èŠããããšèããã®ã§ããåç·šã§ãäžéšåŒçšããããã« ãããã¯ããããžã¡ã³ã ã¯éåžžã«åŒ·åãªæžç±ãšãªãããããŸã§ã®æŽ»åãæ¯ããŠããŸãã PO ããããã¯ããããŒãžã£ãŒã«å§ä»»ããããšãªããçŸå Žã§æ£ãããšæã£ãããšã¯ãã¹ãŠçŸå Žã§åãçµãããšèããã®ã§ãã é¢å¿ãæã€ããã®æ ¹å¹¹ãå®çŸ©ãã ãããã¯ãããŒã ãæœçã®åªå
åºŠãæææ±ºå®ã®å Žé¢ã§ç«ã¡æ»ãããã®æéãå®çŸ©ãã PRDïŒãããã¯ãèŠæ±å®çŸ©æžïŒãããŸãã¯çæããŸãããããã¯å€ªãæéããªããã°å¿
ãæãããç«ã¡æ»ãå Žæããªããã°é¢æ£ãããšèããããã§ãã ãããã¯ãã®ç®æš ãããã¯ãç«ã¡äžããã®èæ¯ ã¿ãŒã²ãããŠãŒã¶ãŒããã«ãœã ãªãäœã£ãŠããã®ã äœãäœã£ãŠããã®ã ã©ããã£ãæ©èœãæäŸããŠããã®ã … åèã«ãããªãœãŒã¹ã¯ããã€ããããŸããã Tably åå·ããã®è³æ ã«ããé
ç®ãäžçªåèã«ããŠããŸãã 幞ãã«ã 2020 幎ååã« UX éšéã®ã¡ã³ããŒãäžå¿ã«ãããã¯ããªãã©ã³ãã£ã³ã°ã®ããã®ã¯ãŒã¯ïŒã¹ã¯ãªãŒã³ã·ã§ããäžéšã® MiroïŒãè¡ã£ãŠãããããžãã¹æäŸæ¹éãNPS 調æ»çµæãªã©ãèžãŸãããŠãŒã¶ãŒã®æ ¹æ¬çèŠæ±ã®å®çŸ©ããã«ãœããã¿ãŒã²ããã»ã°ã¡ã³ããªã©å€ãã®èå¯ããã§ã«è¡ã£ãŠããŸããã æè¡çãããããšããããããããªå
容ã«è§ŠããªããŠã¯ãããªãå Žé¢ããããŸããããããå®çŸ©ããªããšçŽåŸæãåŸãããèªä¿¡ããªãã£ãããæ¯ãé£ããã°ããŸãããçŸç¶ããªãéçºããŠããã®ããã«ç«ã¡æ»ãåç¹ã«ã¯ãªã£ãŠããããªãšæããŠããŸãã æé©ãªãããã¯ãã®ã«ã¿ãèŠã€ãã éçºã«éããŠã¯ã¢ããããäžå¿ãšããçµç¹åŠç¿ãããŒã¹ã«ããŠãããã»ãšãã©æ¯ãåžãããã«å®è·µããŠããŸããããããšãããã¯ããããžã¡ã³ããšãªããšäœããæãä»ããã°è¯ããããããªãç¶æ
ã§ããçŸç¶ååã«åããŠããããšèšããããšæªãããšããã§ããããããã¯ãã®ã«ã¿ãããŸãåãã工倫ãä»ãå®è·µäžãšãã£ããšããã§ãïŒä»¥äžã®ç»åã¯æžç±ããããã¯ããããžã¡ã³ãããã®ãã®ã§ãïŒã 1 ã§ã¯äŒæ¥æŽ»åã®æŠç¥çæå³ãå®çŸããããããããã¯ããæ±ã課é¡ãžãã¬ã€ã¯ããŠã³ãããå¿
èŠããããŸããåçãšãããã¯ããã€ãªããæ¥ç¹ãšãªãã®ã§æ¬æ¥ã¯ PdM ãšåŒ·ãæã€ã¹ãæ¥ç¹ã§ããããŸãå®è·µã§ããŠããªããšããã§ãã 2 ã§ã¯ 1 ã«ãããå
±éç®æšéæã®ããã®çŸç¶ææ¡ã§ãã3 ã¯ãã®å
±éç®æšã«å¯Ÿãããªãã·ã§ã³ç®æšïŒç®æšéæã®ããã®ãšããã¯ãšèšããã§ãããïŒãç«ãŠå®è¡ã«ç§»ããŠãããŸãã4 ã§çµæãæ¯ãè¿ãç¶ç¶ãæé©åãããå¥ã®ãœãªã¥ãŒã·ã§ã³ãèããããªã©å®çžŸããŒã¹ã§ã«ã¿ãç¹°ãè¿ãããšã«ãªããŸãã ãããã«ã¿å®è·µã®åã«ã ãœãªã¥ãŒã·ã§ã³å
è¡ã«ããæœçããããããã«ããŠããŸããå
·äœçã«ã¯å
±éç®æšã«çŽä»ããªãã»çŸç¶åæã®ãªãæ©èœè¿œå ãããŒã«å°å
¥ã®æ€å»ã§ãã ãããã¯ããç®æãç®æšãæèãããšããã¯ãåããæ°å€ããŒã¹ã®è©Šç®ãããããã§ãªãªãŒã¹åŸã®å¹ææ€èšŒãç¹°ãè¿ããŠããŸãã 幞éã«ã KR ãšããæ°å€ããããã¯ãã®éæåºŠãšæåãæž¬ãããã«æé©ãªã¡ããªã¯ã¹ã§ãã£ããããåºæ¬çã«ã¯ãã®æ°å€ã远ãç¶ããããšã«ãªããŸããããããŸã§ PO ãã¢ããªã¹ãã«ä»»ããŠãããšããã«ãé¢å¿ãå¯ããæ§æ³ãšå®è¡ãåé¢ããªã圢ã§ãªãæã
ã¯æãåãããŠãããã®çŽåŸãåŸãããšããŠããŸãã ãã ããããŒã«ã䜿ããããšãã° JIRA ãããã¯ãããŒã ã¯ã¹ã¯ã©ã ãå®è·µããŠããŠãããã¯ãŒã¯ãããŒã®å¯èŠåãæ¥ã
ã®ã€ãã³ãã§ JIRA ãå©çšããŠããŸããããJIRA ã«ãããšããã¯ã¯ãã€ã®éã«ãç·©ãã«ããŽãªãã©ããªã³ã°ãšãã£ãäœ¿ãæ¹ã§æ¬æ¥ã®æå³ã倱ã£ãŠããŸããã ã«ã¿ã§ãè§Šããããã«å
±éç®æšã®ããã®ãªãã·ã§ã³ã¯ãã¹ãŠãšããã¯ãããã¹ãã§ããããããäœãéæããã®ãææåããŠããå¿
èŠããããŸããJIRA ã®ãšããã¯ãæ©èœãããã¹ãäœ¿ãæ¹ãæ¹ããŸããã ãšããã¯ã«ã¯ãã³ãã¬ãŒããçšæããªããããæšé²ãããæèšãã ãšããã¯ã¯ããŒããããã§å¯èŠåããªãã¡ã€ã³ã¡ã³ãããããããŠãã ïŒãšããã¯ãè²åãããè²æ°ãåºãŠãªãã®ã¯ãååŒãã ããïŒ ãããã¯ããäžã«æŸã€ã®ã¯éçºè
ã§ãã ããã¯ããžã·ã§ã³ããŒã¯ãšãšãããããå¯èœæ§ãå€åã«ããããã§ãããæçµçã«ãããã¯ããåãããªãªãŒã¹ããŠããã®ã¯ãŸããããšãªãéçºè
ã§ãã ãããã¯ããããžã¡ã³ããã©ã€ã¢ã³ã°ã« ã«ããããããã¯ãã»ãœãããŠã§ã¢ãèµ·ç¹ãšããæ ¹æºçèŠçŽ ãšããŠéçºè
ããŠãŒã¶ãŒãããžãã¹ïŒåçïŒã® 3 ç¹ã§æ§æãããŠããããšãããããåãããŸãã ã³ãŒããã¢ããããŒããã人ãã¡ãããå¯äžå³å¯ã«æ¬ ãããšã®ã§ããªãããŒã èŠå¡ã ãéçºè
ã¯äŒç€Ÿã®ãã¹ãŠã®è²¬åãæ
ãããšãã§ããïŒåžžã«å¹æçã«ãšã¯è¡ããªããïŒã ã©ããŸã§ã®è²¬åã远ããã»ãããã¯ããããžã¡ã³ãã«ããããããªæ¥åãŸã§æã䌞ã°ããã¯éçºè
ããããã§ãããä»å
¥ããŠãã£ãã»ããå§åçã«çŽåŸæãé«ãã¯ãã§ãããã³ãããã§ããæ·±ããéãã¯ãã ãšä»ã¯æããŸãã 課é¡ã¯ãªãã®ã 暡玢ããªãããªã®ã§ãŸã ã€ãã¿ãããŠããªãéšåã課é¡ããããããããŸãã 誰ãšäœãã©ããŸã§ããã¹ããã¯æŽçããããŠããªãã®ã§ãéçºè
ãèžã¿èŸŒãã§ããã埮åŠãªã©ã€ã³ã§åãçµãã§ããŸããåç·šã«ããããšããç§ãã¡ã¯è·èœã®ãããéãŸã£ãŠã²ãšã€ã®äºæ¥ãããã¯ãããã¯ããæ¯ããŠããããšã«ãªãããã§ãããå¥ã®è·èœã®ããã«ä»»ããã¹ãããšã«ãŸã§æã䌞ã°ããŠããªããã¯æ°ãé£ã£ãŠããŸãã倿ã誀ããšæ°æã¡ã®è¯ãããŒã ã¯ãŒã¯ãæãããŸããã ãŸãéçºè
ã®æ
åœããã¿ã¹ã¯ããããããéçºãã ãã§ã¯ãªããããŒãã£ã³ã°ã®ã¢ãžã§ã³ãäœæããã¡ã·ãªããŒããæœç广ã®ãã£ãããã詊ç®ãè¡ãããã«ãªã£ãåé¢ãéçºã¿ã¹ã¯ãèããªããããŠããããšãæžå¿µã®ã²ãšã€ã§ããç§èªèº«ãã³ãŒããæžããªãã¹ããªã³ãã 2 å以äžç¶ããããã¡ãã£ãšæ°ãè§Šããã§ãããã å
æ¥çºè¡šãããŠãã ãããã¯ããããžã¡ã³ãã¯ã©ã€ããªã¢ ã§ãããèªåãã¡ã§ã¯ãã§ãã¯é
ç®ããŸã£ããåããããæ
ã®é ãã«æç¶ãšããŠãããšããã§ãã ãŸãšã åç·šãšã¯éã£ãŠåŸç·šã¯åãçµã¿ãéå€ã«åæããŠãããããªåœ¢ã«ãªããŸããã 12 æããåãçµãã§çµæã©ããªã£ãŠããã®ãã«ã€ããŠè§ŠããŠããŸããã§ãããããããã¯ãã®ææãšããŠã® KR ãšããŠããæ°å€ç®æšã¯åŸã
ã«å¢å åŸåã«ãããå§ããåããã¯ãŸããŸãã®çŽåŸåºŠãåŸãããŠããããããªãããªãšãã£ããšããã§ãã ãããŸã§å®è·µããŠããã¢ããããšãã£ãçµç¹åŠç¿ã®äžã§åŸãããæåäœéšã¯ééããªãå¹ããŠããŠãéèŠãªã®ã¯ç©ã¿éããããããŒã ã§ã®åŠç¿ã®åã¿ã§ãããããŒã ã§ã®åŠç¿ãããäžç¢ºå®æ§ãæžãããŠãã ã®ã ãšãããããŠå®æãããããŠããŸãã åç·šåŸç·šãšå°ãæè¡ããé¢ããããšãæžããŸãããçŽåŸãããããã¯ãéçºãèãããéçºè
ã«ãšã£ãŠãå°ãã§ã圹ã«ç«ãŠãããã°å¹žãã§ããåŸç¶ã®ãã¹ãã¯ãã£ã€ãæè¡çãªæçš¿ãæåŸ
ããŠä»æ¥ã¯ãããŸã§ãšããŸãããã æåŸãŸã§èªãã§ããã ãããããšãããããŸãã
ããã«ã¡ã¯ãæŠç°ïŒ @tkdn ïŒã§ãã仿¥ã¯ãçŽåŸåºŠã®é«ããããã¯ãéçºãšã¯äœã ã£ãã®ãããšãããé¡ã§éçºããŒã ãçŸå Žã§ã©ãå€ããããšããŠããããšãã話ãããŸãã ç°¡æœã«ç³ãäžããã°ãæè¡çãªåãçµã¿ãæšé²ãããã®ã®çŽæ¥äºæ¥ç®æšã«ã³ãããã§ããŠããªãã£ãéçºããŒã ãããããã¯ããããŒãžã£ãŒã»ãããã¯ããªãŒããŒã®åœ¹å²ãéšåçã«å¥ãããŠç®æšãšãªã KR ã«å¯ŸããŠã³ãããã§ããéçºããŒã ãžãšå€ããããšããŠãã話ã«ãªããŸãã ãçŽåŸåºŠã®é«ããããã¯ãéçºããšããèšèèªäœããªãäž»èªã倧ããã人ããããã®äž»èгã§ãšããæ¹ãå€ããããã§ãã®ã§ããããŸã§ æã
ã®éçºããŒã ã«ãšã£ãŠ ããšããå ã¯ã€ããããŠãã ããã ãŸãç§å人ãæå±ããéçºããŒã ã«ãããçŸæç¹ã®åãçµã¿ã«è³ããŸã§ã®å€é·ã§ãã®ã§ãmediba å
šãããã¯ãããŒã ã«è©²åœããªãç¹ã¯ããããããæãããŠãããŸãã å
容ãèšããŠããŠããŸã£ãããåç·šãšåŸç·šã«åããŠããŸãããã®åç·šã«ã€ããŠã¯ã ãã¶èŠ³å¿µçãªéšåãå€ãå®è·µãç¥ããããšãã人ã¯åŸç·šã ãèªãŸããã®ããå§ãããŸãã åç·šã¯çµç¹å€é·ãšçµç¹åœ¢æ
ã«å¯Ÿããäžè¬çãªè§£éã«äžŠè¡ããåæ¥ã»æšæºåã«ã€ããŠèããä»ãã課é¡ãžã®åãçµã¿ã«ã€ããŠã話ããŸãããã®ããšã«å人ãåæã«æ±ããããŒã ã®èª²é¡æã«ã€ããŠè§ŠããŠãããŸãã åŸç·šã¯åç·šã§æãããšãªã£ãéçºããŒã ã®èª²é¡ã解決ããã¹ããä»ããŒã ã¯ã©ãåãçµã¿ã©ããã£ãå€åãèµ·ããŠããããå
·äœçãªäºäŸã«ã€ããŠè©±ããŸãã ãã®ã¥ããåè§£é åŒç€Ÿ VPoE æ°äºã®èšäº ã«ããããšãããçµç¹æ§é ã¯ããæ°å¹Žã§å€§ããå€ãããŸããã2018 å¹Žäžæã«æ©èœå¥çµç¹ãšããŠã®éçºæ¬éšã¯ãªããªã瞊å²ãã®äºæ¥éšå¶çµç¹ãžå€æŽãããããšã2020 幎ã«ããžãã¹ããã¯ãããžãŒãã¯ãªãšã€ãã£ãéšéã¬ã€ã€ãšãªã暪䞲ã®çµç¹äœãã§ããŠãããããããªã¯ã¹åçµç¹ã«å€åããŠããŸãã ãã¯ãããžãŒéšéã§ã¯ã å®æã®æŽ»åå ±åäŒãéå¬ãããïŒãªã³ã©ã€ã³ã»ãâ¯â¯ã³åâ¯é¢šãªã³ã¡ã³ãä»ãã§ïŒ ã æ°å¹Žç ã£ãŠããå匷äŒãåéãããïŒã¯ãœã²ãŒã倧éã«äœã£ãŠåè©ããïŒ ããªã©ãããªã¯ã¹åãšãªã£ãéçºæšªçµç¹ã®æŽ»åã®äžéšã¯ãã®ããã°ã§ããäŒããããšããã§ãã å
æ¥ã® Agile Tech EXPO ã§ã®å ±åã«ããã ã·ãã¢ãããŒãžã£ãŒæ£®å¯Šã®ã»ãã·ã§ã³ã§ãåãçµã¿ã®äžéšãå£éèŠããã®ã§ãã²åŸ¡èЧãã ããã çµç¹äœã®å€é·ãäžãšã³ãžãã¢ããã®éæ ããæ°å¹Žæãã€ãã§çµç¹ãå€ãã£ãŠããããã§ã¯ãããŸããïŒç§ã®ç¥ãéãã«ãããŠã¯ïŒãå€é·ã®äžã§ããããã®çµç¹äœã§æ±ããããããšããã®å€é·ããã£ããæ¯ãè¿ã£ãŠã¿ãŸãã çµç¹äœçš®å¥/ç¹åŸŽ 忥ã®ã¹ã¿ã€ã« ã¢ãŠãããã æšæºå察象 æ©èœå¥çµç¹ çŽåç çµ±åç ã¹ã«ãŒãããã³ã³ãããŒã«ïŒããã»ã¹ïŒ äºæ¥éšå¶çµç¹ 䞊åç å ç®ç ã¢ãŠããããã³ã³ãããŒã« æ©èœå¥çµç¹ äºæ¥éšå¶çµç¹ æè¡åºç€ãåºãŸã£ããæ©èœå¥çµç¹ æ©èœå¥çµç¹ã§ã¯åäœæ¥å·¥çšãçŽåã§ãã§ã€ã³ããŠãããããžãã¹ãäŒç»ããã£ã¬ã¯ã·ã§ã³ããã¶ã€ã³ãããŠéçºããå質管çãšãã£ãå·¥çšã®åå²ãè¡ãããŸããçŽå忥ã«ããåå·¥çšã®ã¢ãŠãããããæ¬¡å·¥çšã®ã€ã³ããããšãªããåå·¥çšã«äŸåããã³ã³ããã¹ããæã€ããªã¬ãŒçååãå€ããªãã§ããããå
šå·¥çšã®ã¢ãŠãããããæçµçãªææãšããŠçµ±åãããçµç¹ã®çµå¶ææãšãªãã®ãç¹åŸŽã§ãã æ©èœå¥çµç¹ãæãç®çã¯äºæž¬ãããç®æšãã¯ãªã¢ããããã§ãã äœããã®ãã¯ã£ããããŠããå Žåã«æå¹ã§ãæçµçãªææçµ±åã®ããã«ãæ©èœå¥çµç¹ã§ãã£ãéçºæ¬éšã§ãäºæž¬å¯èœãªç®æšèšå®ãæã€ããšã«ãªããŸãã ããšãã°äºæ¥ã¹ããŒã ã®åœ¢æãšãã®ã·ã¹ãã åãç®çã§ãã£ãå Žåãäºæž¬ããããŽãŒã«ã¯ã·ã¹ãã ã®ãªãªãŒã¹ã«ãªãã§ãããããªãªãŒã¹åŸäžå®ã®çµæžå¹æãçã¿åºãããã«å®å®ããã·ã¹ãã ãæäŸããããšãããã®çµç¹äœã®ç®æšã«ãªããããããŸããã çŽåããå·¥çšã®æçµçãªã¢ãŠããããã§ããã·ã¹ãã ãªãªãŒã¹ãå®å®ããéçšãç®æšãšããŠãéçºçµç¹ã¯ãã®ãäœãããã®ããã»ã¹ãããã¥ã¢ã«ããããŠã€ã³ãã©ãæŽåãæšæºåããŠããŸãããå
·äœçã«èšãã°å
šç€ŸéããŠã®ã€ã³ãã© AWS 移管ãããããå©çšããã«ããã£ãŠã®ç¥èŠéçŽãããã¥ã¢ã«åãæè¡çãã©ã¯ãã£ã¹ã®äŒæãªã©ãæšæºåã«ãããã§ãããããããã¯äœæ¥å·¥çšã®ããã»ã¹ã³ã³ãããŒã«ã§ãããæšæºåã®å¯Ÿè±¡ã¯ã¹ã«ãŒãããã«ãªããŸãã åœæã® CTO ãäžå¿ã«ãæ©èœå¥çµç¹ã®äžã§æè¡çèºé²ãæå圢æãªã©ã«ååæè³ã§ãããããã§ãAWS ãã¯ãããšããã¯ã©ãŠããåœç¶ã®ããã«å©çšã§ããŠãããšããçŸç¶ããããŸãã äœãç©ã®ãŽãŒã«ãæãã¹ãäœæ¥ç®æšãæç¢ºãã€äºæž¬å¯èœã§ããäžæ¹ã§ãæ©èœè¿œå ããªãªãŒã¹ã ããåæãšããŠãããããäœã£ãããšã®äŸ¡å€æäŸãäºæ¥æé·ã«ã€ããŠèãã芳ç¹ãã©ãããŠãæããŠããŸããŸãããã®ãäœãããšèªäœã»äœãæ°ãéæç®æšã«ãããšããããšã¯ããããã¯ããããžã¡ã³ãã§ãããã«ããã©ããããšããŠèšåãããŠããŸããïŒæ©èœå¥çµç¹ã ããé »åºããããã§ã¯ãããŸãããäºæ¥éšå¶ã§ãã»ã ããããçããåé¡ã§ã¯ãããŸãïŒã æžç±ïŒ O'Reilly Japan - ãããã¯ããããžã¡ã³ã åèïŒ KPIãçããã«ããã©ããïœAkiïœnote æé·ã®ããã®äºæ¥éšå¶çµç¹ äºæž¬å¯èœãªç®æšã§ã¯ãªãå€åããåžå ŽãããŒãºããããã¿ãŠããŠãŒã¶ãŒäœéšã»äŸ¡å€æäŸãšããžãã¹äŸ¡å€ã®ãã©ã³ã¹ã«éç¹ã眮ããmediba 㯠CXO ãäžå¿ãšããŠãŠãŒã¶ãŒäœéšã«ãã©ãŒã«ã¹ããŠãããšåæã«äºæ¥éšå¶çµç¹ãžãšçµç¹äœãå€ããŠãããŸãã æ©èœå¥çµç¹ãšéãç°ãªãè·èœãã²ãšã€ã®ããŒã ã圢æãããã®äºæ¥éšããšã®è€æ°ã®ãããã¯ãããŒã ã¯äžŠåã§éçºããããã¯ããæé·ãããŸãã äºæ¥éšå¶çµç¹ã¯è€æ°ããŒã ããããã䞊è¡ããŠã¢ãŠããããããããããå ç®ãããã®ãçµå¶ææãšãªããŸããåå²ãããçµå¶è³æºã®åç®ãæçµç®çã§ãã®ã§ãæ°å€ç®æšã®ãããªã¢ãŠããããã³ã³ãããŒã«ã«ããæšæºåãç¹åŸŽã§ãããã»ã¹ãã³ã³ãããŒã«ããªãïŒã§ããªãïŒã®ãæ©èœå¥çµç¹ãšã®éãã§ãã äºæ¥éšå¶çµç¹ã®ç®çã»çãã¯çµ¶ãéãªãå€åããå€çç°å¢ã®äžç¢ºå®æ§ãžç«ã¡åãããããäºæ¥ã»ãããã¯ãããŒã ã¯ãã®ãäœãæ¹æ³ãå§ããããã®ã ãšçè§£ããŠããŸãã ããããã®äºæ¥ã«ãããŠãäžç¢ºå®æ§ãé«ãäŸå€ãšãªãäºè±¡ãçºçããããã±ãŒã¹ã§ã¯ãå°éæ§ããã£ãããŒã ã§ã®çµç¹åŠç¿ã«ãã£ãŠåŸãããæèèœåã»å¿çšåã»å€æåã«ä»»ããŠå¯Ÿå¿ãé²ããã»ããå¹ççã§ããäºæ¥ãããžãã¹ã¹ããŒã ã«åã圢ã§ã¯ãŒã¯ãããŒã¯æŽåãããæ±ããããã·ã¹ãã ãããããã®äºæ¥ã«ãã£ãåœ¢ã§æçããŠããããšã«ãªãã§ãããã äºæ¥éšå¶çµç¹ãããŸãããã±ãŒã¹ã§ã¯ãäºæ¥ããšçµç¹å
ã§ã®åžå Žçç«¶äºã«ããå¥å
šãªç«¶äºæèãéžæãããäºæ¥ã»ãããã¯ãããŒã ã®éææããšã³ã²ãŒãžã¡ã³ããé«ããã ãã§ãªãçµç¹ãšåäººã®æé·ãæãããã§ã¯ãããŸãã æžç± ããåŒçšããŸãããæžãã°æžãã»ã©ççŸãªçµç¹äœã§ããã “åããŒã ã䞊ååãç«¶äºãçãããšã§çµç¹å
éšã®åç£ç¢ç£šãæãããšãã§ãã” “ã¢ãŠããããã»ã³ã³ãããŒã«ã¯ããã»ã¹ã»ã³ã³ãããŒã«ãããäžç¢ºå®æ§ã«å¯ŸããŠé 奔 “管çããåŽã«è² æ
ãããããªã” 課é¡ã«å¯ŸããçŸç¶ã®ãããªã¯ã¹çµç¹ ãããã©ã®çµç¹ãäžå®ã®èª²é¡ãæ±ããããã« mediba ã®éçºçµç¹ãäŸå€ã§ã¯ãããŸããã§ããã äºæ¥éšå¶ã«ãããæè¡æéãèšèšã¬ãã¥ãŒãOps ãå«ãã ã·ã¹ãã ä¿å®ã®ããæ¹ãªã©ãæ©èœå¥çµç¹ã®äžã§æšæºåãããŠããã»ãããããšããŠããããšã¯ãããã¯ãéçºããŒã ã«éããŠããããã«ãªããŸããããããããµã€ãåãšãããã€ã§ãã ãµã€ãåãæªãããã§ã¯ãããŸãããæ©èœå¥çµç¹ãæ·ããæ§æ¥ã®æšæºåãããããã»ã¹ã«ãããã¯ãããã£ã¬ã³ãžã§ããªãã£ãé åãžåãçµãããäºæ¥ãšã®ãã©ã³ã¹ãèãäœå°ã掻ãããŠæ°ããæè¡èŠçŽ ãåºããŠãããããªã©ã®ã¡ãªããããããŸãã ãã ããã®äžæ¹ã§ãã»ãã®äºæ¥éšã®éçºã«ã¯ç¡é¢å¿ãšãã£ãç¶æ³ããªããšã¯éããŸãããããããŒãžã£ãŒããããã°ã¬ããã³ã¹ã®å¹åç¯å²ãå°ãããã芳å¯ã§ããããšãæ£æŒ«ã«ãªãã§ãããã ãããã£ã課é¡è§£æ±ºã«ãããªã¯ã¹åçµç¹ãæ±ããããã®ã¯åœç¶ã§ããã®äžç°ãšããŠå段ã§ç³ãäžããåãçµã¿ããããšããããã§ãããŸã å§ãŸã£ãã°ããã®çµç¹äœã§ãã®ã§ãã¯ãããžãŒéšéã§ã¯èª²é¡ãžã®åãçµã¿ãäžå±€åŒ·åããŠããã§ãããã äžãšã³ãžãã¢ã®èª²é¡æ äºæ¥éšå¶ã«ãªã£ãŠããããŒã ãæã€ç®æšã«å¯ŸããŠãã€ã¬ã¯ããªã³ããããã§ããªãïŒãšæã蟌ãã§ããïŒãšããã®ãèªåã®å€§ããªèª²é¡ãšãªã£ãŠããŸããã æ©èœå¥çµç¹ã§ããã°éçºçµç¹èªèº«ãæ²ããç®æšãæèããªããåäººã®æè¡çãªåãçµã¿ãæ¥ã
ã®æŽ»åã®ããŒããæè¯ããããããšæããŠããŸãããã äºæ¥éšå¶ãšãªããšèªåãã§ããããšã¯äœãªãã ãšç«ã¡æ¢ãŸãããã«ãªã£ãã®ã§ãã ããæããŠããéçºè
ã¯ç§ã ãã§ã¯ãªãã£ãã¯ãã§ãã ãããã¯ãããŒã ã®éçºè
ãšããŠåãçµããããšãèŠæ©ããªããããŸããŸãªå®è·µãããŠããŸããã ã¢ãããã°ã©ãã³ã°ã®å®è·µã«ããå±äººåãæé€ãã ãªãªãŒã¹ã®åæ°ãå¢ãããŠããïŒããã®ããã»ã¹ãæ§ç¯ããïŒ éçšã³ã¹ããäžããããã« X ãå°å
¥ãããY ãããªãã¬ã€ã¹ãã ããã©ãŒãã³ã¹ãèšæž¬ãã¡ããªã¯ã¹ããç°åžžå€ãæ€ç¥ãã ããŒã ã§åæããã¬ãªããã®ã¥ããã«åãçµã 以äžã¯ããããåãçµã¿ãšããŠããžãã£ãã«èŠããŸãããã äºæ¥éšå¶ãšãã£ãçµç¹è»žã«ãããŠã¯åãã«è¶³ããªãæ¹åæ¥åã®ããã«æããŠããŸãããšãå€ããªã£ãŠããã®ã§ãã ãã¡ããå®éã«ã¯åãã«è¶³ããªãæ¹åæ¥åã§ã¯ãã£ããŠãããŸãããæè¡çµç¹ã匷ãããããã«ã¯å¿
èŠãªåãçµã¿ã§ãã â» äžèšã®ãããªæè¡çãªåãçµã¿ãè©äŸ¡ãã¹ããã¯ãããžãŒéšéã§ã¯ã©ããã£ãè©äŸ¡ãé©åããšãã£ãè°è«ãå®è©äŸ¡ã詊éšçã«é²ãã§ãããçµç¹çãªèª²é¡è§£æ±ºã«åãçµãã§ããæäžã§ãã éçºè
ã®äžã«ããäžç¢ºå®æ§ ããè¯ããããã¯ãããŒã ã®çµæãšãã£ãéšåã«ãããŠã¯çŸãããŒãžã£ãŒãšååããªããè¯ãã¡ã³ããŒã«æµãŸãããŒã èªèº«ãæé·ããŠãããã®ã®ãããŠãããã¯ãã«å¯ŸããŠã©ãããšèšããããšèªä¿¡ããŸã£ãããããŸããã ããŒã ã®ããŒã¿ã¢ããªã¹ãã«ã¯ãããã¯ãã远ãã¹ãæ°å€ãå¯èŠåããŠããã£ãŠããŸããããäŒžã³æ©ãæ°åããã€ãªãŒã€ãã³ãã§èŠãŠã¯ç¡åæãæ¥ã
æããäºæ¥ã«å¯ŸããŠã³ãããã§ãããã©ããã®æå¿ãã®ãªãç¶æ
ããã°ããç¶ããŸãããè¥å¹²ããã«éº»çºããããŠããããšã屿©æã® 1 ã€ã§ãã ãããªããšäººéã¯ã©ãããŠãç°å¢ãå€éšã«èŠå ãèŠåºãããšããŠãåžå ŽããŠãŒã¶ãŒããããã¯ãã®ç¹æ§ã«äžç¢ºå®æ§ãæ¢ããŠããŸããŸãã ããããäžç¢ºå®æ§ã¯åžå Žãå€çç°å¢ã®å€ãããããã ãã§ã¯ãªãã人éã®æšæž¬ããèœåãäœãããšã圱é¿ããŸãããããšåæã«èœåã®äœãã®æ ¹æ¬ã«ã¯ãç¡ç¥ã»ç¡é¢å¿ãããã®ã§ã¯ãªãã§ããããã ãããã¯ãã«ã€ããŠã®çè§£äžè¶³ããã³ãããã§ããé åãèªåèªèº«ãçãããŠããå¯èœæ§ã«ã€ããŠèããå¿
èŠãããã§ãããã åç·šã¯ãããŸã§ã§ãã éçºè
ãšããŠãããã¯ããžãã€ã¬ã¯ãã«é¢äžã§ããªããšããã®ã¯ãèªãã®èœåã®äœããšé¢å¿ã®ç¡ãã«ããèµ·å ããã®ã§ã¯ãšæãã«ããããä»ã©ããã£ãŠãããã¯ãéçºã«åãçµãã§ãããã»çŽåŸãããããã«ã©ãããŠããããšãã£ãããšã åŸç·š ã§æžããŠãããŸãã