ããã«ã¡ã¯ãæ°å2幎ç®ãšã³ãžãã¢ã®ããã§ãã ä»å¹Žã4æåã°ã7æã«ãããŠæ°åãšã³ãžãã¢ç ä¿®ã宿œããŸããã ä»å¹Žã¯ãæ°åç ä¿®ã®å®çŸ©ãå
容ãèãçŽããªãã¥ãŒã¢ã«ãããžã§ã¯ããè¡ããŸããã ä»åã¯ãã®ç ä¿®ãªãã¥ãŒã¢ã«ãããžã§ã¯ãã®è£åŽãPMãåªããèªåããã話ããããšæããŸãïŒ ç®æ¬¡ ç ä¿®ã®ç®çãåå®çŸ© ç®çãåºç€ç¥èã®çްåå æšå¹ŽãŸã§ã®ç ä¿®ãšçްååããç®çã®æ¯èŒ 倿Žç¹ã®çŽ¹ä» ãŸãšã ç ä¿®ã®ç®çãåå®çŸ© ç ä¿®å
容ããªãã¥ãŒã¢ã«ããã«ããããæåã«è¡ã£ãã®ãç ä¿®ã§ã®ç®çãåå®çŸ©ããããšã§ãã æšå¹ŽãŸã§ã¯ãæ°åãšã³ãžãã¢ã®å³æŠååããç®çã«ç ä¿®ãè¡ãããŠããŸããã ä»åããã峿Šååããšããç¹ã¯åŒãç¶ãç ä¿®ã®ç®çãšããŠèããŠããŸããã ãã ãæ°åãã©ã®ãããªç¶æ
ã«ãªã£ãŠããã°ã峿Šåããªã®ãããã¯ããšããŠããã®ã§ãã峿Šåãã®ç¶æ
ããããžã§ã¯ãã¡ã³ããŒã§è©±ãåããæ±ºãŸã£ãå
容ãç ä¿®ã®ç®çãšããŠåå®çŸ©ããŸããã åå®çŸ©ããç ä¿®ã®ç®çã¯äžèšã®2ã€ã«ãªããŸãã ãšã³ãžãã¢ãšããŠã®åºç€ç¥èãç²åŸã§ããŠããããš é
å±å
ããŒã ã«ãŠãéçºå·¥æ°3人æ¥çšåºŠã®æ¡ä»¶ã«å¯ŸããŠäžå®ãªããã£ã¬ã³ãžãã§ããç¶æ
ç ä¿®ã®ç®çã®ãã¡ãæ¡ä»¶ã«å¯Ÿããäžå®ã¯æè¡ã«å¯Ÿããäžå®ãšéããèŠçŽ ã倧ããããã ä»åã®ç ä¿®ãªãã¥ãŒã¢ã«ã§ã¯ããšã³ãžãã¢ãšããŠã®åºç€ç¥èãç²åŸããããšãã«æ³šå ããŠããããšã«æ±ºããŸããã ç®çãåºç€ç¥èã®çްåå ç¶ããŠè¡ã£ãã®ããäžèšã§å®ããç ä¿®ç®çã®çްååã§ãã ç ä¿®ã®ç®çãšããŠå®ããããšã³ãžãã¢ãšããŠã®åºç€ç¥èãã®ãŸãŸã§ã¯æœè±¡çã ã£ããããç ä¿®å
容ãèããããç²åºŠãŸã§ãåºç€ç¥èã®çްååããè¡ããŸããã 现ååã¯ã ãããŸã§ç¥ã£ãŠããã°æ¡ä»¶ã«åãçµãã ããšãã軞ã§ãåŒç€Ÿã§å©çšããŠããåèšèªããããã¯ããéå¶ããŠããäžã§å¿
èŠãªç¥èïŒã»ãã¥ãªãã£ãããã©ãŒãã³ã¹çïŒããããã§è¡ããŸããã 现ååã®äœæ¥ã¯ããããžã§ã¯ãã¡ã³ããŒã«å ããŠãåæè¡ã«ãããŠå°éçãªç¥èãæã£ãŠãããšã³ãžãã¢ã«ããã¢ãªã³ã°ãè¡ã£ããããªããç·åæŠã§é²ããŠãããŸããã 以äžã¯çްååãé²ããŠããæã®è¡šã®äžéšã§ãã åæè¡ã®åºç€ç¥èã现ååããããšã§ããããŸã§ãµãã£ãšããŠããç ä¿®ã®ãŽãŒã«ã€ã¡ãŒãžããã£ãšå
·äœçã«ãªããŸããã ãŸããå人çã«ã现ååãããã®ããã¹ãŠçè§£ã§ããŠãããïŒãšåœæã®èªåãæ¯ãè¿ãæ©äŒã«ããªããŸããã®ã§ãããžã§ã¯ãçã«ããå人çã«ããšãŠãéèŠãªæéã ã£ããšæããŸãã æšå¹ŽãŸã§ã®ç ä¿®ãšçްååããå
å®¹ã®æ¯èŒ 现ååäœæ¥ãçµããã®ã¡ãå
·äœçã«ç ä¿®å
容ãèããŠãããã§ãŒãºã«å
¥ã£ãŠãããŸããã ä»åã®ç ä¿®ãªãã¥ãŒã¢ã«ã¯ æšå¹ŽãŸã§ã®è¯ãç¹ãæ®ãã€ã€ãå€ããã»ããè¯ããããªéšåãéç¹çã«å€ããæ¹é ã§é²ããŠãããŸããã çç±ãšããŠã¯ãäžèšã®çްååäœæ¥ãããäžã§ããããããžãã¯æšå¹ŽãŸã§ã®ç ä¿®ã§ãã£ãããšæããŠããã£ãŠãããªããšããã·ãŒã³ãå€ãèŠãããã®ã§ãå
šãŠãå€ãããããè¯ããšããã¯æ®ãã€ã€å€ããã¹ããšãããå€ããã»ããè¯ã广ãæåŸ
ã§ãããšèããããã§ãã æšå¹ŽãŸã§ã®åãšã³ãžãã¢ç ä¿®ã®å
容ãšçްååããå
容ãäžã€äžã€ç
§ããåãããŠã ãå€ããæ¹ãè¯ããããªãšããããæšå¹ŽãŸã§ã®ç ä¿®ã§ãååã ãã©ãå€ããããã£ãšè¯ããªããããªãšããã ãæŽãåºãããããžã§ã¯ãã¡ã³ããŒã§ã©ã®ãããªç ä¿®å
容ã«ããã°ãããã話ãåã£ãŠãããŸããã 倿Žç¹ã®çŽ¹ä» ä»åã¯äžèšã®æ¯èŒã®ããšã倧ãã倿Žãããã®ã2ã€ç޹ä»ããããšæããŸãïŒ 1ã€ç®ã¯ ãªã³ã©ã€ã³ææã®å©çš ã§ãã ä»åãPHP(Laravel), Goèšèª, MySQLãšãã£ãåŒç€Ÿã§å©çšããŠããèšèªã®ç ä¿®ã§ãªã³ã©ã€ã³ææã® ãããã€ã³ã¹ããŒã« ãå©çšããŸããã ãããã€ã³ã¹ããŒã«ã¯æ°å€ãã®èšèªããµããŒãããŠãããåºæ¬çãªèšèªç¥èã«é¢ããã¬ãã¹ã³ã«å ããŠãwebãµãŒãã¹ãéçºã§ããã¬ãã¹ã³ãçšæãããŠããŸãã ãããã€ã³ã¹ããŒã«ãæ¡çšããçç±ãã åŒç€Ÿã§å©çšããŠããåèšèªã®ã¬ãã¹ã³ãäœç³»çã«çšæãããŠãã ããã§ãã å ããŠãåã¬ãã¹ã³ã®æåã« éçºç°å¢ã®ã»ããã¢ããã«ã€ããŠäžå¯§ã«èª¬æãããŠããç¹ ãæ¡çšããçç±ã«ãªããŸãã éçºç°å¢ã®ã»ããã¢ããã«ã€ããŠã¯ãæ¯å¹Žæéãåãããããšãå€ãç ä¿®æ
åœè
ããããèŠåŽããããšãã声ãäžãã£ãŠããã®ã§ãåŠç¿ã®è³ªãæ
ä¿ãã€ã€ãæ
åœè
ã®è² æ
ã軜æžããããšãã§ããã®ã¯å€§ããªã¡ãªããããããšèããŸããã 2ã€ç®ã®å€æŽç¹ã¯ ããŒã éçºã®ååã ã§ãã æšå¹ŽãŸã§ããŒã éçºç ä¿®åã«è¡ã£ãŠããWedding Parkãµã€ãã®æ¹åææ¡ãè¡ãç ä¿®ããªãããŸãããWedding Parkã¯15幎以äžéå¶ããŠããå€§èŠæš¡ãµã€ãã®ãããå°ããªå€æŽã§ã圱é¿ç¯å²ã倧ãããªããŸãã ãããããšãæéãæè¡ãªã©ã®åé¡ã§æ¹åææ¡ãå°èŠæš¡ã«ãªã£ãŠããŸãããšããã°ãã°ãããŸããã ããã§ãããŒã éçºç ä¿®ãååãããŠãåŠãã èšèªã®åºæ¬ãæå€§é掻çšããŠèªç±ã«éçºãè¡ãããšã§ãåŠã³ã®è³ªã®æå€§åãå³ããŸããã ããŒã éçºç ä¿®ã®å
šç€Ÿåãã®ãã¬ãŒã³äŒã§ã¯ãå
šç€Ÿããææåéããããã»ã©ã®ã¢ãŠãããããããŠãããŸããïŒ ããŒã éçºã§ã®åŠã³ã«ã€ã㊠æ°åãå·çããŠãããèšäº ãå
¬éããŠãŸãïŒ ãŸãšã ä»åã¯ãä»å¹Žã®ç ä¿®ãã©ã®ããã«äœã£ãã®ãã®éçšã®è©±ãããŸããã ç ä¿®ãªãã¥ãŒã¢ã«ãããžã§ã¯ãã®éçšã§äžçªè¯ãã£ããšæããŠããã®ã¯ã åºç€ç¥èã®çްåå ãã®éçšã§ãã 现ååããããšã§ä»å¹Žã®ç ä¿®ãèããäžã§æšå¹Žãšæ¯èŒããããããªã£ãã®ã¯ãã¡ããã§ããã 现ååããåºç€ç¥èã¯æ¥å¹Žä»¥éã®ç ä¿®ãå€ãããšãªã£ãæã«ã䜿ãã å®çŸ©ãã§ãããšæããŸããã è¥æãšã³ãžãã¢ãèªåã®æè¡ãèŠçŽã軞 ã«ããªã£ããšæããŸãã ãã ãæè¡ã¯ã©ãã©ã鲿©ããŠããã®ã§éœåºŠæŽæ°ããªãããåŒç€Ÿã«ããããåºç€ç¥èããå®çŸ©ãç¶ããããã°ãšæããŸãïŒ
ããã«ã¡ã¯ãæ°å1幎ç®ãšã³ãžãã¢ã®ririã§ãã ç§ã¯æ°åç ä¿®ã®äžç°ã§5æããçŽ3ã¶æéãååéçºã«åãçµã¿ãŸããã ä»åã¯ãäŒç»ã»ä»æ§ãã§ãŒãºã«çŠç¹ãåœãŠãŠããã£ãŠããã£ãããšã»èŠåŽããããšããŸãšããŸãããããããäŒç»ã»ä»æ§æžäœæã«ãã£ã¬ã³ãžããïŒãšããæ¹ã®åèã«ãªãã°å¹žãã§ãã ç®æ¬¡ æ°åååéçºã«ã€ã㊠äŒç»æžäœæ 仿§æžäœæ ããŸãïŒãµãŒãã¹å ãŸãšã æ°åååéçºã«ã€ã㊠ãŸããæ°åååéçºãšã¯äœãã«ã€ããŠèª¬æããŸãã å
¥ç€ŸããŠåºç€çãªç ä¿®ãåããåŸãæ°åã¯ãªãšã€ã¿ãŒããŒã ïŒãšã³ãžãã¢2人ããã¶ã€ããŒ1人ïŒã§ãçŽ2ã¶æéååéçºãè¡ããŸããããé¡ã¯ã Googleã¹ã©ã€ãã§ç®¡çããŠãã瀟å¡ã®ãããã£ãŒã«ïŒèªå·±ç޹ä»ïŒä»äºç޹ä»ïŒãã·ã¹ãã åãã ãšãããã®ã§ããã³ã³ã»ããã0ããç·Žãã4æ¥éã§äŒç»æžäœæã»æ±ºè£ã3æ¥éã§ä»æ§æžäœæã»æ±ºè£ãè¡ããŸããã äŒç»æžäœæ ã©ããªæ¹åæ§ã§ãäœãå®çŸããã®ãïŒããã¯æ¬åœã«ä»äºãšããŠããæçŸ©ãããã®ãïŒ ãšããç¹ããŸãšããæ±ºè£ããããããã«äŒç»æžãæžããŸãããå
·äœçã«ã¯ãäžãããããé¡ãããšã«ãèæ¯ã®æŽçãå®éã«äœãã·ã¹ãã ã®ã³ã³ã»ãããšå
šäœåãæ³å®å¹æãçã蟌ã¿ãŸããã ãã£ãŠããã£ãããš Â 1. ã¢ã³ã±ãŒãã宿œããçŸç¶ã®èª²é¡æãææ¡ãã 瀟å¡ã®æ¹ã
ã«äœ¿ãå¿å°ã»äœ¿ãé »åºŠãæããŠãã䟡å€ãªã©ãã¢ã³ã±ãŒãããããšã§ã çŸç¶ã®èª²é¡ãå
·äœçã«ææ¡ ããããšãã§ããŸããããŸããäŒç»æžãã¬ãŒã³ã®éã«ãã æç¢ºãªæ ¹æ ãæã£ãŠãããæçŸ©ãã瀺ã ããšãã§ããŸããã 2. ãã®ãµãŒãã¹ã䜿ãããå
ãã©ããªç¶æ
ã«ãªã£ãŠããã®ãïŒãŸã§æ³åãã ãä»ãã®èª²é¡ãããããã解決ããŸãïŒãã§çµãããã ã課é¡è§£æ±ºããããšã§çã¿åºããã䟡å€ãšã¯äœãïŒã ãŸã§èããŸããã ä»åã¯ãã·ã¹ãã åããããšã§å©äŸ¿æ§ãåäžãããã®äžã§ã瀟å¡ã誰ããšã®å
±éç¹ãèŠã€ãã«ããããšãä¿ããå¿ã®è·é¢ãçž®ããããšãã§ããããšãã䟡å€ã®åµé ãç®æããŸãããããããããã¯ãã®ã³ã³ã»ãããšããŠèœãšã蟌ãããšã§ãçŽåŸæã®ããäŒç»æžã«ãªããŸããã ïŒäŒç»æžã®äžéšâ»äžéšæ¹å€ããŠæ²èŒïŒ 3. äŒç»ææ¡æã«ã¯ç°¡åãªãããã¿ã€ããäœæããã€ã¡ãŒãžãå
·äœçã«äŒãã äŒç»æžã§ã¯ææ¡ããèæ¯ãã³ã³ã»ããã ãã§ãªããç°¡åãªãããã¿ã€ããäœæããçŸæç¹ã§èããŠããã·ã¹ãã ã®å
šäœåãäŒããŸããããã®çµæãæ©èœãå®çŸããäžã§èæ
®ãã¹ãç¹ãªã©çŸå®çãã€å
·äœçãªãã£ãŒãããã¯ããããããšãã§ããŸããã èŠåŽããããš 1. äºå®ãšä»®èª¬ã®åãåã çŸç¶ãæŽçããããã«ã¢ã³ã±ãŒãã宿œãããã®ã®ããã®çµæãããããäºå®ãšä»®èª¬ã®åãåããé£ããã£ãã§ãã äºå® ïŒæ°å€ã§ãããããšïŒæ°ã»å²åïŒ ä»®èª¬ ïŒäºå®ãããšã«ãæ¬åœã¯ã©ããã£ãŠæ¬²ããã®ãïŒãæšæž¬ããã㚠話ãåããé²ããäžã§èªèã®éãã«æ°ã¥ããå
茩ãã£ã¬ã¯ã¿ãŒã«è³ªåããããšã§è§£æ±ºã§ãããããèªèãæã£ãç¶æ
ã§è°è«ãé²ããããšãã§ããŸãããæ©ãã ã ãšããããå
茩ã«èããŠã¿ãïŒ ããªã¹ã¹ã¡ã§ãã 2. ä»ããã¢ãã®è¯ãããã©ãã·ã¹ãã äžã§æ®ããïŒ ãããã£ãŒã«ã¹ã©ã€ãã«é¢ããŠã¯ãå©äŸ¿æ§ã¯ã€ãã€ãã ãã©ã瀟å¡ãèªç±ã«ã¢ã¬ã³ãžã§ããããšããç¹åŸŽããããããã«ç€Ÿå¡ã®åæ§ã衚ããŠããŸããã äŒç»ã®æ±ºè£ã«ãããŠã¯ã å
¥å圢åŒã決ãŸã£ãŠããã·ã¹ãã äžã§ã¯ãæäœã®èªç±æ§ã»ç€Ÿå¡ã®åæ§ã倱ãããŠããŸãè² ã®åŽé¢ãèæ
®ããªããã°ãªããªãã ãšããç¹ããææããã ããŸããã äœã£ãŠçµããã§ã¯ãªãã䜿ã£ãŠããã£ãŠåããŠäŸ¡å€ãçãŸããŸããã·ã¹ãã ã«ããå¶çŽããã£ãŠã ããããªã®ã ã£ããèªç¶ãšèŠãããªããæ¥œãããªããã®ã ã培åºåæããŸããã æçµçã«ããããã£ãŒã«è¡šç€ºç»é¢ã«ã¹ã©ã€ãã·ã§ãŒåœ¢åŒã®ã³ãŒããŒãäœããã䜿ãããïŒä»ã®äººã®ãèŠããïŒããšãªããããªä»æããäœããŸããã ïŒäŒç»æžã®äžéšâ»äžéšæ¹å€ããŠæ²èŒïŒ 仿§æžäœæ äŒç»ã®æ±ºè£ãããã ããåŸã仿§æžäœæã«åããŠã·ã¹ãã ã®çްéšãæ€èšããŸããã ç ä¿®æéäžãæ°åã¯ãªãšã€ã¿ãŒå士äžçªå¯åºŠæ¿ãè°è«ããã®ã¯ä»æ§æžäœæã®ãšãã§ããã ãã£ãŠããã£ãããš 1. 仿§æžã§èª¬æããé
ç®ã«ã€ããŠããããããå
±éèªèãåããã ä»åã¯åæ
ããŠè³æäœæããããšã«ãªã£ããããæ€èšäºé
ã«æŒãããªãããã以äžã®é
ç®ãèšå®ããŠããŒã å
ã§èªèãåãããŸããã 衚瀺æ¡ä»¶ âŠãã®ç»é¢ã»å¯Ÿè±¡ã衚瀺ãããæ¡ä»¶ åŠçæ¡ä»¶ âŠèããããåŠçãšãã®æ¡ä»¶ å
¥åé
ç®/衚瀺é
ç® âŠå
¥åãã©ãŒã ã®é
ç®/衚瀺ãããé
ç®ã®åœ¢åŒãªã©ãå®çŸ© æŒäžã¢ã¯ã·ã§ã³ âŠãã¿ã³ãå
¥åæ¬ãªã©ã®ã¢ã¯ã·ã§ã³ãå®çŸ© ãã¹ãèŠ³ç¹ âŠã©ã®ãããªããšããã¹ããããïŒç»é¢åäœã§èšããŸããïŒ ãã®çµæãããã®ããŒãžã§ã¯ãã®é
ç®ã«è§ŠããŠããã®ã«ãä»ã®ããŒãžã§ã¯è§ŠããŠãªãããšãã£ãæŒããå°ãªãæžã¿ãŸããã 2. ææç®æã®å·®åããããããã衚瀺 ãã£ãŒãããã¯ãããšã«ä»æ§ãä¿®æ£ããéã¯ã倿Žåã»å€æŽåŸãæ¯èŒããããè³æã¥ãããå¿ãããŸããã仿§æžã®ããŒãžæ°ãå€ãã£ããããååã©ããªææãåããŠãã©ããªå€æŽãããã®ãïŒããããããããŸãšããŠããã£ãã§ãã èŠåŽããããš 1. èšå€§ãªæ€èšé
ç®ãçãæéã§ãŸãšãããããš ä»æ§ã決ããã«ããã£ãŠæ€èšãã¹ãé
ç®ãããããããã話ãåããªããè³æã«èœãšã蟌ãããšã倧å€ã§ãããåŸã®éçºãã§ãŒãºã§ã宿ããã®ã§ããã以äžã®é
ç®ã¯ç¹ã«ããã®æ®µéã§ååã«æ€èšããŠããã¹ãã ãšæããŸãã ç»é¢é·ç§»ãšURL æ°å€ïŒå¹Žãå
¥åæåæ°ïŒã®éŸå€ 衚瀺é ãè¡šç€ºä»¶æ° ã»ã³ã·ãã£ããªæ
å ±ãžã®é
æ
® å
¥åå€ã®ããªããŒã·ã§ã³ïŒã©ããªå€ã»æ¡ä»¶ã蚱容ããã®ãïŒ æ©èœã®åªå
é äœïŒå®è£
ã®åªå
床ãã³ã³ã»ããã«åºã¥ããŠæ±ºããïŒ ãŸããä»åã¯ä»æ§æžã®æŽæ°ãæ ã£ãŠããããšãåå ã§ãéçºäžã«ããŒã å
ã§åè°è«ãã…ãšããããšãããªãå€ããæéã®ãã¹ã§ããã仿§æžã¯åžžã«ææ°ã®ç¶æ
ã«ïŒãšããããšã¯ä»åŸãã£ããæèãããã§ãã 2. 仿§ã®äŒãæ¹ ããŒã å
ã®è°è«ã§å
±éèªèãåãããããšã«æ³šåããçµæãä»è
ã«äŒããéã«èŠç¹ã®åãæ¿ããã§ããŠããŸããã§ããã èšèã®ããããããã»å
šäœåã®ææ¡ã®ããããã»ç»é¢ã»æ©èœã説æããé çªã¯ãäŒããåã«æ¹ããŠç¢ºèªãã ãšè¯ãã§ãã现ãã仿§ãå¹çããäŒããæ±ºãŸã£ãæéå
ã§ååã«æ€èšããŠãããããã«ããäŒããéã®é
æ
®ã¯éåžžã«éèŠã ãšæããŸããã ããŸãïŒããŒãã³ã° å
茩æ¹ã®ã¢ããã€ã¹ã®ããšããµãŒãã¹ã®ããŒãã³ã°ã«ã¯ããªããã ãããŸãããæãã®ã»ãæéãè²»ãããŠããŸã£ãã®ã§ããããã®åæãã®ããã£ãããŒãã³ã°ã«ã§ããŸããã åæã®ãã¶ã€ããŒãã ã¯ã¯ã¯ã¯ããªãã䜿ã£ãŠããã ããšããèŠçŽ ããã©ã¹ããŠããŽã»ãµã€ããã¶ã€ã³ãäœã£ãŠãããããšããããã©ãã©ãæçãæ¹§ããç§èªèº«ã¯ã¯ã¯ã¯ããªããéçºã§ããŸããïŒ ïŒãµãŒãã¹ã®ããŽïŒ ãŸãšã æ°å1幎ç®ãšã³ãžãã¢ãåããŠäŒç»ã»ä»æ§æžãäœæããäžã§ãã£ãŠããã£ãã»èŠåŽãããã€ã³ãããŸãšããŠã¿ãŸããã äŒç»ã»ä»æ§æžã¯èšèšã»éçºã§è¿·ã£ãéã®æéãšãªãè³æ ã§ãéåžžã«éèŠãªãã®ã ãšå®æããŸããã劥åãããããŒã å
ã§ãã£ã€ãè°è«ããããšã§ããã®åŸã®éçºã§ã¯å
±éèªèãæã¡ã éœåºŠã³ã³ã»ããã«ç«ã¡è¿ããªããéçº ããããšãã§ããŸããã ãŸããã¯ãªãšã€ã¿ãŒãšããŠäŒç»æ®µéããèããéçºã«æãããšãã§ããçµéšã¯éåžžã«è²Žéã ã£ããšæããŠããŸãã çµå©ã®å¹žããžããŸã£ããã«é²ããããžã¿ã«ãã åŒç€Ÿã®äžæããžã§ã³ã§ãããã¢ããã°ãªä»çµã¿ãããžã¿ã«åãããã«ããããä»ããã¢ããåãå
¥ããŠããã圢ã«å€ããããšã®å€§å€ãã宿ããŸãããåçŽã§ã¯ãªããã ããããã®é¢çœããããã®ã ãšåŠã³ãŸããïŒ
ããã«ã¡ã¯ïŒãšã³ãžãã¢ã®ä¹
ä¿ã§ãã 2021/9 ãã AWS Lambda ã®åäœç°å¢ãšããŠãArm/Graviton2 ããã»ããµãéžæã§ããããã«ãªããŸããã AWS Graviton2 ããã»ããµãæèŒãã AWS Lambda 颿° â Arm ã§é¢æ°ãå®è¡ããæå€§ 34% åªããæéããã©ãŒãã³ã¹ãå®çŸ ãããŸã§ã¯ X86 ããã»ããµã ãã ã£ãã®ã§ãããArm/Graviton2 ãéžæããããšã§äœã³ã¹ãã§é«ããã©ãŒãã³ã¹ãå®çŸã§ããŸããåŒç€Ÿã§ãçŸåš X86 ã§åäœããŠãã Lambda ã Arm ã§ã®åäœãžçœ®ãæããé²ããŠããŸãã ä»å㯠Lambda ã Arm ããã»ããµã§åäœãããå Žåã® SAM ãã³ãã¬ãŒããã玹ä»ããŸãã SAMãã³ãã¬ãŒããæžãæã Arm ããã»ããµã§åäœå¯èœã«ãã SAM ãã³ãã¬ãŒãã® template.yml ãæ¬¡ã®ããã«æžãæã㊠Arm ããã»ããµã§åäœããããã«ããŸãã å
·äœçã«ã¯2ç¹ã倿ŽããŠããŸãã Architectures ã X86_64 ãã arm64 ãžå€æŽãã Lambda Insights ãæå¹ã«ããŠããå Žåã¯ãArm ã«å¯Ÿå¿ãããã®ãžå€æŽãã AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > sam-app Sample SAM Template for sam-app # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Tracing: Active Layers: # - !Sub "arn:aws:lambda:${AWS::Region}:580247275435:layer:LambdaInsightsExtension:25" - !Sub "arn:aws:lambda:${AWS::Region}:580247275435:layer:LambdaInsightsExtension-Arm64:2" Api: TracingEnabled: True Resources: HelloWorldFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs16.x Architectures: # - x86_64 - arm64 Events: HelloWorld: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /hello Method: get Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api HelloWorldApi: Description: "API Gateway endpoint URL for Prod stage for Hello World function" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" HelloWorldFunction: Description: "Hello World Lambda Function ARN" Value: !GetAtt HelloWorldFunction.Arn HelloWorldFunctionIamRole: Description: "Implicit IAM Role created for Hello World function" Value: !GetAtt HelloWorldFunctionRole.Arn å¿
èŠã«å¿ã㊠CI ãæžãæããŸãã Lambda 颿°å
ã§äœ¿ã£ãŠããã©ã€ãã©ãªãã¢ãŒããã¯ãã£ã«äŸåããªãå Žåã¯ãCI ã倿Žããå¿
èŠãªãåããŸãã äžæ¹ã§ãã¢ãŒããã¯ãã£ã«äŸåããã©ã€ãã©ãªã䜿ã£ãŠããå ŽåïŒããšãã°ãlibvips ã䜿ã node.js ã® sharp ãªã©ïŒã¯ã次ã®å¯Ÿå¿ãå¿
èŠã§ãã CI ã®å®è¡ç°å¢ã Arm ãžå€æŽãã ç°ãªãã¢ãŒããã¯ãã£ã§ããã«ãã§ããããã«ãã äžè¬çã«ã¯åè
ã®æ¹æ³ãéžã°ããŸãããå Žåã«ãã£ãŠã¯ CI 㯠X86 ã®ç°å¢ç°å¢ããçšæããŠããªãå Žåãããã§ãããã ä»åã¯ãã®ã±ãŒã¹ã«è©²åœãããããX86 ã® CI ã§ãã«ãã詊ããŸãã ç°ãªãã¢ãŒããã¯ãã£ïŒArmãX86ïŒã§ãã«ãã§ããããã«ãã X86 ã®ç°å¢ã§ Arm åãã®ãã«ããè¡ãã«ã¯ sam build --use-container ã䜿ã£ãŠãDockerã³ã³ããã§ãã«ãããæ¹æ³ãäžè¬çã§ããããããªãã --use-container ãªãã·ã§ã³ã䜿ããªãå ŽåããããŸãã äŸãã°ãã»ã«ããã¹ãã§åäœãããŠãã GitLab CI ãªã©ã®å Žåã§ããèšå®ã«ãã£ãŠã¯ãPipeline ã Docker ã³ã³ããäžã§å®è¡ããŠãããããŸãããã®å Žå Docker ã³ã³ããå
ã§ Docker build ããã«ã¯ dind (Docker in Docker)ãšãã°ããä»çµã¿ã䜿ããŸãã ãšããããä»åã®ç°å¢ã§ã¯ dind ã§ sam build --use-container ãåããããšãã§ããŸããã§ããã ãããã Arm çšã®ãã«ããå¿
èŠãªã®ã¯ãnpm ã® sharp ã§äœ¿ãããŠãã libvips ã Arm ã§ãã«ãããããã€ããªã«ããå¿
èŠãããããã§ããSAM ã䜿ããã« npm ã§ install ããå Žåãå
¬åŒã§ã¯ npm install --arch=arm64 --platform=linux sharp ã§ã€ã³ã¹ããŒã«ããããšç޹ä»ãããŠããŸãã Cross-platform ããã§ SAM ã䜿ã£ãå Žåã«å
éšã§å®è¡ãããŠãã npm install ã§ãããã®ãã©ã¡ãŒã¿ãæå®ããŠã¿ãŸããã å
·äœçã«ã¯ç°å¢å€æ°ãèšå®ããŠãã sam build ãå®è¡ããŸãã export npm_config_arch: "arm64" export npm_config_platform: "linux" sam build è£è¶³äºé
ãšããŠãç°å¢å€æ°ã« npm_config_xxx ãšèšå®ããå Žåã npm install --xxx ã®ãã©ã¡ãŒã¿ãšããŠæž¡ãããŸãã Environment Variables npm_config_arch, npm_config_target_arch, ãã㊠npm_config_* ç°å¢å€æ°ã«ã€ã㊠ãŸãšã ä»å㯠Lambda ã Arm ããã»ããµã§åäœãããå Žåã® SAM ãã³ãã¬ãŒããã玹ä»ããŸããã Arm ããã»ããµãå©çšããããšã§ã³ã¹ããæãã Lambda ã®å©çšãå¯èœã«ãªããŸãããã²ã掻çšãã ããã
ããã«ã¡ã¯ããšã³ãžãã¢ã®ä¹
ä¿ã§ãã åŒç€Ÿã§ã¯ 2022/4 ã«ãªãªãŒã¹ããã AWS Lambda ã®é¢æ° URLïŒAWS Lambda FunctionURLsïŒ ã䜿ã£ãŠ Lambda ã®éçºãé²ããŠããŸããååã®èšäºã§ã¯ãAWS SAM ã§é¢æ° URL ãæå¹ã«ããæ¹æ³ã玹ä»ããŸããã AWS SAM ã§ AWS Lambda ã® é¢æ° URL ãå©çšããŠã¿ãŸãã çŸåšã瀟å
ã§éçšäžã® AWS Lambda + Amazon API Gateway ã§æ§æããã WebAPI ã«ã€ããŠã颿° URL ã䜿ã£ãæ§æãžå€æŽãé²ããŠããŸãã ä»åã¯ãAPI Gateway ãš é¢æ° URLïŒFunctionURLsïŒã䜵çšããå Žåã® SAM ãã³ãã¬ãŒããäœæããŸããã®ã§ã玹ä»ããŸãã 颿° URL ãå©çšããå Žåããã€ããŒã圢åŒã¯ API Gateway Version 2 ãšãªãããæ§æã«ãã£ãŠã¯æ³šæãå¿
èŠã§ãã ã¯ã©ã€ã¢ã³ãã颿°ã® URL ãåŒã³åºããšãLambda ã¯ããŸããã®ãªã¯ãšã¹ããã€ãã³ããªããžã§ã¯ãã«ãããããŠããã颿°ã«åãæž¡ããŸã ãã®é¢æ°ã®å¿çã¯ãLambda ã颿° URL ãä»ããŠã¯ã©ã€ã¢ã³ãã«è¿ä¿¡ãã HTTP ã¬ã¹ãã³ã¹ã«ãããã³ã°ãããŸãã ãã®ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®ã€ãã³ã圢åŒã¯ãAmazon API Gateway ãã€ããŒã圢åŒããŒãžã§ã³ 2.0 ãšåãã¹ããŒãã«åŸããŸãã ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®ãã€ããŒã ãªããååå©çšãã SAM ã® hello-world ãã³ãã¬ãŒãã®å ŽåãAPI Gateway Version 1 ã®åœ¢åŒã«ãªã£ãŠããŸãã ããã API Gateway ãšé¢æ°URLã®ã©ã¡ããå©çšãããå Žåã¯ãAPI Gateway ã HTTP API ã«èšå®ãããšããã§ãããã以äžã«ãã³ãã¬ãŒãã®äŸã瀺ããŸãã å©çšã±ãŒã¹ãšããŠã¯ããéçºã®éã«ããŒã«ã«ç°å¢ã§ã¯ sam local start-api ã䜿ã£ãŠåäœç¢ºèªãããããªã©ãèããããŸãã AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > sam-app Sample SAM Template for sam-app # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Tracing: Active Api: TracingEnabled: True Resources: HelloWorldFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs16.x Architectures: - x86_64 Events: HelloWorld: Type: HttpApi # More info about API Event Source: https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi Properties: Path: /hello Method: GET FunctionUrlConfig: AuthType: NONE Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api HelloWorldApi: Description: "API Gateway endpoint URL for Prod stage for Hello World function" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" HelloWorldFunction: Description: "Hello World Lambda Function ARN" Value: !GetAtt HelloWorldFunction.Arn HelloWorldFunctionIamRole: Description: "Implicit IAM Role created for Hello World function" Value: !GetAtt HelloWorldFunctionRole.Arn HelloWorldFunctionUrl: Description: "Function URLs endpoint" Value: !GetAtt HelloWorldFunctionUrl.FunctionUrl ãŸãšã ä»åã¯ãLambda ã§ API Gateway ãš é¢æ° URLïŒFunctionURLsïŒã䜵çšããã±ãŒã¹ã® SAM ãã³ãã¬ãŒããã玹ä»ããŸããããã²ã掻çšããã ããã°ãšæããŸãã
ããã«ã¡ã¯ããã©ããŠãšãã£ã³ã°ã»åæ®ãã®ã¯ãã³ãæ
å ±ãµã€ããPhotorait (ãã©ãã¬ã€ã)ãã®ãšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒãããŠããæŠç°( @takedajs )ã§ãã åŒç€Ÿã§ã¯ããšã³ãžãã¢ã®ããããããšãæè¡åãã®åäžãç®çãšããæè¡æšé²å§å¡äŒãšããçµç¹ããšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒãšããã¯ãªãŒããäžå¿ãšãªã£ãŠéå¶ããŠããŸãã ä»åã¯æè¡æšé²å§å¡äŒãéå¶ããŠãã ãWP HACK DAYã ã®ç¬¬3åç®ãéå¬ããã®ã§ç޹ä»ããŸãïŒ ç®æ¬¡ WP HACK DAY ãšã¯ïŒ åœæ¥ã®æ§å åå è
ããã®ãã£ãŒããã㯠æåŸã« WP HACK DAY ãšã¯ïŒ WP HACK DAYã¯ããŠãšãã£ã³ã°ããŒã¯ãšã³ãžãã¢ããŒã ã®æè¡ååäžãšäžäœæéžæã®ããã®1dayããã«ãœã³ã§ãã 第1åç®ããŒã SlackãæŽ»çšããŠã瀟å
ã®èª°ãã®ä»äºã䟿å©ã«ããä»çµã¿ãã€ããïŒ ç¬¬2åç®ããŒã éçºã®èª²é¡è§£æ±ºãã¿ã¹ã¯ã®å¹çåãæè¡æ€èšŒãªã©ããããããã©åºæ¥ãŠããªãããš ä»å宿œãã第3åç®ã§ã¯ ãæ¥å課é¡ã解決ãããããã¯ãéçºã ãããŒãã«å®æœããŸããïŒ WP HACK DAY #3ã®ã«ãŒã« ã» åå è
ïŒãšã³ãžãã¢(ä»åã¯2éšçœ²ã®ãšã³ãžãã¢ãåå ) ã» 3人1ããŒã ã§1æ¥(çŽ7æé)ã§åãçµã¿ã倿¹ã«ææçºè¡šäŒ(ãã¢å®æœå¿
é )ã宿œ ã» äºåã«åœæ¥éçºãããã®ãæ€èšããå®è£
å¯èœãèª¿æ» ã» ãããã¿ã€ã以äžã®ãã®ãéçº ã» åå æ¹æ³ã¯ãªã³ã©ã€ã³&ãªãã©ã€ã³ã©ã¡ãã§ãå¯ åœæ¥ã®æ§å å
šäœã®ã¹ã±ãžã¥ãŒã« éäŒåŒ(9:30-9:40) åã
ããŒã æ¯ã«èæ¯ç»åãäœæããŠåå ããŠãããŸããïŒ ãããŒ1æ¥é 匵ã£ãŠãããŸããããŒïŒæã ããã¿ããªãã³ã·ã§ã³å°ãäœãïŒw ååã®éçº(9:40-12:00) ããŒã æ¯ã«åºãŸã£ãŠãããããšéçºäžïŒ ã©ã³ãã¿ã€ã (12:00-13:00) äžäººçšã®ãã¶ã人æ°åçšæããŸããïŒ æ³šæå
容ãå
šå¡ã«ãã¢ãªã³ã°ãããªããšãééããã«æ³šæã§ããã®ã§è¯ãã£ãã§ã ååŸã®éçºãçºè¡šè³æäœæ(13:00-17:00) ãªã³ã©ã€ã³åå ã¡ã³ããŒãããããŒã ã¯çµå§Zoomãã€ãªããŠå
šå¡ã§è©±ãåããªããéçºïŒ ã©ã®ããŒã ãéçºãšè³æäœæã§éäžã¢ãŒã ææçºè¡šäŒ(17:00-18:00) å
šç€Ÿåãã«ææçºè¡šäŒã®éå¬ãåç¥ãããšã³ãžãã¢ä»¥å€ã®æ¹ãèŠèŽè
ãšããŠåå ããŠé ããŸããïŒ éå¶ãæ³å®ããŠãã以äžã®ã¯ãªãªãã£ã®ãã®ãçºè¡šãããŠããŠãZoomã®ãã£ãããããããïŒããä»ããæ¬²ããïŒããªã©ããšãŠãçãäžãããŸãã çºè¡šããããããã¿ã€ã ã»åºç€Ÿç®¡ç衚 ïž Slack(ã¯ãŒã¯ãããŒ)ã§éçšæ¹å ã»ãã£ããããã圢åŒã®DocBaseããã¥ã¡ã³ãæ€çŽ¢ïŒSlack飿ºïŒ ã»ã·ã¹ãã åãåããã®æ°èŠããŒã«äœæ ã» ã³ãŒã·ãŒ ã®æŽ»æ§åSlack飿º ã»ã¢ããªã±ãŒã·ã§ã³æ¥œã
æ§ç¯ã§å¶åºŠéçšæ¹åæ€èšŒ æèŠªäŒ(18:00-18:30) æåŸã¯ããŒã é¢ä¿ãªãã¿ããªã§ã¯ã€ã¯ã€ïŒ ãšã³ãžãã¢çµç¹å
šäœã§ãã£ãã°ããã«ãããããªè©±ãããªããçãäžãããŸããïŒ ã¿ãªãã仿¥1æ¥ãç²ãããŸã§ãã åå è
ããã®ãã£ãŒããã㯠éå¬åŸãåå è
ã«å¿åã¢ã³ã±ãŒãã宿œããŸããïŒ å
šäœã®æºè¶³åºŠ(5ç¹æºç¹)å¹³åç¹ã¯4.6ç¹ãšé«ãç¹æ°ã§ããã 以äžãããã ãããã£ãŒãããã¯ã®äžäŸã§ãã è¯ãã£ãç¹ ãã®äººæ°ã®ãšã³ãžãã¢ãåºç€Ÿããæ©äŒã¯ããŸããªãã®ã§ãä¹
ãã¶ãã«ã¿ããªãšéãŸããŠå¬ããã£ãã 第1åç®ãšç¬¬2åç®ã¯å人éçºã ã£ãã®ã§ãä»åããŒã éçºã«ããããšã§ååããäŒè©±ãå¢ããŠããã«ãœã³æããã£ãã ã©ã³ããæèŠªäŒããããã¯ã€ã¯ã€ã¬ã€ã¬ã€ãç¥ãæããã£ãã æ¹åç¹ æ¥åæ¹åã«ç¹ããè¯ãçºè¡šã°ãããªã®ã§ãææçºè¡šäŒã®å Žã«ãšã³ãžãã¢ä»¥å€ã®æ¹ããã£ãšåå ããŠã»ããã£ãã è¯ãåãçµã¿ãªã®ã§ãå
šç€Ÿã€ãã³ãã«ããŠä»éšçœ²ã®ã¡ã³ããŒ(ãšã³ãžãã¢ä»¥å€)ã«ãåå ããŠãããäžç·ã«ããã®ãè¯ãããã ã¬ãã«ã®é«ãçºè¡šãå€ãã£ãã®ã§ãå€éšçºä¿¡åãé«ããããã«ãåããŒã ã§äŒç€Ÿããã¯ããã°ãžã®ã¢ãŠããããã¯å¿
é ã«ããŠãè¯ãã£ãã æåŸã« ãŠãšãã£ã³ã°ããŒã¯ãšã³ãžãã¢ããŒã ã®æè¡ååäžãšäžäœæéžæã®ããã®1dayããã«ãœã³(WP HACK DAY)ã®ç¬¬3åç®ã«ã€ããŠç޹ä»ããŸããã 3人1ããŒã ã«ããããšã§ä»ãšã³ãžãã¢ã®èãæ¹ãå®è£
æ¹æ³ãåŠã¹ãããã©ã³ããæèŠªäŒãéå¬ããããšã§ã¯ã€ã¯ã€ã¬ã€ã¬ã€ãšçãäžãããªããäžäœæã匷ããããšãã§ããïŒæ¥ã§ãããéå¶ã®æ³å®ããŠããææãåºããŠè¯ãã£ãã§ãã ãããããç¶ç¶ããŠéå¬äºå®ãªã®ã§ãä»åã®ãã£ãŒãããã¯ã掻ãããŠããè²»çšå¯Ÿå¹æã®é«ãã€ãã³ãã«ããŠãããŸãã
ããã«ã¡ã¯ãçµå©æèŒªã»å©çŽæèŒªã®ã¯ãã³ããµã€ããRingraphãã§ãšã³ãžãã¢ãããŠããããŒïŒ @__south__373 ïŒã§ãã仿¥ã¯æ°èŠäºæ¥éšçœ²ã®ãšã³ãžãã¢ããšã³ãžãã¢çµç¹ã®æªæ¥ã«ã€ããŠèããŠææ¡ããŠã¿ã話ãããããšæããŸãã ããžã§ã³ãå®çŸããããã«ãšã³ãžãã¢çµç¹ã«å¿
èŠãªæœçãèããã äºã®çºç«¯ã¯ä»å¹Žã®2æé ãè·çš®å¥ã®ããŒã ã§ãã¹ãã«ã¢ãããããããã®åãçµã¿ãèããŠã¿ãããšããæéããããŸãããããã§ç§ãã¡ãšã³ãžãã¢ããŒã ãæ±ºããã®ããã ããžã§ã³ãå®çŸããããã«ãšã³ãžãã¢çµç¹ã«å¿
èŠãªæœçãææ¡ãã ããšãããã®ã ç§ã®éšçœ²ã¯æ°èŠäºæ¥ãããã€ãéãŸã£ãŠãããæ®æ®µã¯æ
åœäºæ¥ã®éçšãéçºã«åãçµãã§ããŸããèªåã®äºæ¥ã«å¯ŸããŠã¯ããŒãããããèãããããäžæ¹ã§ãéšçœ²å
šäœã®ãšã³ãžãã¢çµç¹ãšããŠã©ãæé·ããŠãããããèããæ©äŒã¯ã»ãšãã©ãããŸããã§ãããåäºæ¥ã䌞ã³ãŠãããªãã§ããã«æé·ãå éããããã«ã¯ãäºæ¥ãè¶
ããŠãšã³ãžãã¢çµç¹ã®æªæ¥ãèªãã課é¡ã解決ããŠããå¿
èŠããããšæããŠãããããããšã³ãžãã¢ã¿ããªã®äžã§äžèŽããŠããã®ã§ãã£ãŠã¿ãããšã«ãªããŸããã ãã£ãšæè¡çãªãã£ã¬ã³ãžã«åãçµãã§ãããã ç§ãã¡ã¯ã21äžçŽã代衚ãããã©ãã«äŒç€Ÿãåµãããšããããžã§ã³ãæ²ããŠããŸãããã®äžã§ãç§ãã¡æ°èŠäºæ¥ã®ãšã³ãžãã¢ã¯ã ãµãŒãã¹æ + æè¡åãæã£ãŠãæ°ããä»å 䟡å€ãåµåºããããšãã§ããçµç¹ ããç®æããããšèããŸããã ããžã§ã³ãå®çŸããããã«ã¯ãçµç¹ãšããŠä»ãŸã§ä»¥äžã«ãã£ã¬ã³ãžãç¹°ãè¿ããŠããããšãå¿
èŠã§ãããæè¡åãé«ããªããã°äºæ¥ãšããŠããããããšãã·ã¹ãã ãããã¯ã«ãªãã§ããªããªã£ãŠããã®ã§ã¯ãªãããšãã屿©æããããŸãããŠãšãã£ã³ã°ããŒã¯ã®ãšã³ãžãã¢ã¯ã ã¯ãªãã© ããè¡åæéãšããŠããŸããããã®äžã§ãSKILLã«åœããéšåã¯ããŸã ãŸã 䌞ã³ä»£ããããã£ãšæè¡çãªãã£ã¬ã³ãžãããŠããå¿
èŠããããšæã£ãŠããŸãã ä»åããŠããã·ã¹ãã ãçŸç¶ç¶æã§ã¯ã©ãã©ãåãæ®ãããŠãããŸããããšã³ãžãã¢ãšããŠããžã§ã³å®çŸã«è²¢ç®ããããã«ãä»ããããŒã åãããŠãµãŒãã¹æã«å ããŠæè¡åãæã£ãŠãæ°ããä»å 䟡å€ãåµåºãããããã®ããã«ã¯ãæè¡çãªãã£ã¬ã³ãžãã§ããç°å¢ãæŽããå¿
èŠããããããæããŸããã æ©ããŠå®å®ãããªãªãŒã¹ãã§ããä»çµã¿ãã€ããããšã§æè¡çãªãã£ã¬ã³ãžãã§ãã ã§ã¯ãªãæè¡çãªãã£ã¬ã³ãžããã¥ããç¶æ³ã«ãªã£ãŠããã®ããçç±ã¯å€§ãã2ã€ãããšèããŸããã 1ã€ã¯åœ±é¿ç¯å²ãå¢ãç¶ããŠããããšã«äŒŽããã¹ãã³ã¹ãã®å¢å ã§ããUnitãã¹ããE2Eãã¹ãã§äžéšæ
ä¿ããŠããéšåã¯ãããã®ã®ãåºæ¬çã«ã¯åœ±é¿ç¯å²ãå
šãŠäººåã§ç¢ºèªããŠããç¶æ³ã§ãããµã€ãå
šäœã«åœ±é¿ãããéçºã«åãçµãã³ã¹ãããšãŠãé«ãããã¯ã«ãªã£ãŠããŸãã ããäžã€ã¯äºæ¥ãçŽè¿äŒžã°ãããã®éçºãåªå
ãããã¡ã§ãããšããããšãããã¹ãæœçãæ±ºãŸã£ãŠããäžã§ããã©ã¹ã®å·¥æ°ãããã£ãŠæãå ããããšãé£ããããšããããŸãã ä»ãŸã§ã¯æ¡ä»¶ãéçºããŠãªãªãŒã¹ããããšã«æ³šåããŠãããéçºã®ãµã€ã¯ã«ãèŠçŽããããªãªãŒã¹ã¹ããŒããŸã§æèãåã£ãŠããŸããã§ãããå
çšäžãããããªèª²é¡ã解決ããããã«ã¯ãå質ãšã¹ããŒãäž¡æ¹ãäžããããšã§ãæ©ããŠå®å®ãããªãªãŒã¹ãã§ããä»çµã¿ãã€ãããããããããšã§ææŠã§ããç°å¢ãæŽããããšãã§ãããšèããŠããŸãã Four Keysã远ãããã æ©ããŠå®å®ãããªãªãŒã¹ãã§ããä»çµã¿ãäœãã«ã¯ã©ããããè¯ãããèãããšããFour Keysãšããææšã«åºäŒããŸããã Four Keysãšã¯ DevOps Research and AssessmentïŒDORAïŒ ããŒã ã宿œãã 6 幎éã®ç ç©¶ãã確ç«ãããããœãããŠã§ã¢éçºããŒã ã®ããã©ãŒãã³ã¹ã瀺ã 4 ã€ã®ææšã§ãã ã»ãããã€é »åºŠ ã»å€æŽã®ãªãŒãã¿ã€ã ã»å€æŽé害ç ã»ãµãŒãã¹åŸ©å
æé å質ãšã¹ããŒãã®äž¡æ¹ãäžããããšèããæãã©ã¡ããã«æ³šåãããšã©ã¡ãããçãã«ãªã£ãŠããŸããã¡ã§ãããªã®ã§ããã®4ã€ã®ææšã远ãããšã§ã©ã¡ããæ¹åããããšãæèããªããé²ãããããšãããè¯ããªãšæã£ãŠããŸãã ãŸãã¯ããŒã ã®ããã©ãŒãã³ã¹ã枬ãå¯èŠåããããããŠããã«ããã¯ãšãªã£ãŠããç®æã«å¯ŸããŠã¢ãããŒããããããããç¹°ãè¿ãããšã§æè¡ææŠã§ããç°å¢ãäœã£ãŠãããŸãã ãããã« ãã®ææ¡ãç¡äºæ¿èªãããä»ã¯åææšã®çްããå®çŸ©ã決ããŠããŸãããããŠæ¥æããã¯å®éã«èšæž¬ãããŠããã®ã§ãå®é枬ã£ãŠã¿ãŠã©ãã ã£ãããã©ããªæœçããã£ããã¯ãŸãã®æ©äŒã«ãäŒãããããšæããŸãã ä»åäºæ¥ãè¶
ããŠãšã³ãžãã¢çµç¹ã®èª²é¡ããã£ã¹ã«ãã·ã§ã³ããããšã§ã課é¡ã®å
±éèªèãæã€ããšãã§ããããã«å¯Ÿããæ°ããã¢ãããŒããèããããšãã§ããŸãããFour Keysãèšæž¬ãæ¹åããããšãç®çã§ã¯ãªãã®ã§ãæè¡çãªãã£ã¬ã³ãžãããããããããšã§äºæ¥ã®æè¡åãäžããŠããããããŠããžã§ã³ãå®çŸãããããã¯ãã©ããã«åãçµãã§ãããããšæããŸãã
ããã«ã¡ã¯ã Photorait ãšã³ãžãã¢ã®ããšã€ã§ãã å
šç€Ÿãšã³ãžãã¢ãåå ããéçºå®äŸãã¯ãªãã©å®äŸãã®éå¶ãããŠããŸãã ãã¯ãªãã©ãã£ãŠãªã«ïŒã«ã€ããŠã¯ ãã¡ã ãã芧ãã ããã ååææ«ã®å®äŸã§ã¯æ¯ãè¿ãäŒã宿œããŠããããšã³ãžãã¢ã®é 匵ããæŽ»åéãçºè¡šããŸããã ãã®æŽ»åéã«ã€ã㊠ãããžã§ã¯ãæ¯ã®ãªãªãŒã¹æ° ãã«ãªã¯ãšã¹ãïŒä»¥äžãPRïŒã»ããŒãžãªã¯ãšã¹ãïŒä»¥äžãMRïŒæ°ãã³ã¡ã³ãæ° ãããã®æ°å€ãã°ã©ãåããå忝ãè¿ãæãšãæ¯èŒãã€ã€ãšã³ãžãã¢èªèº«ã®æŽ»åéãæ°å€åãããçºè¡šãèŠãŠ ã¿ããªã§ãã¡ããã¡ãçãäžããäŒãšãªããŸããã ä»åã¯ãã®ããPRã»MRæ°ãã³ã¡ã³ãæ°ããéèšããè©±ãæžããŸãã ã©ããªçºè¡šãããã éèšããããŒã¿ãã°ã©ãåãã以äžãçºè¡šããŸããã ææ¯ã®PRã»MRæ°ãã¡ã³ããŒæ¯ã®PRã»MRæ° ã¡ã³ããŒã®ã¬ãã¥ãŒã³ã¡ã³ãæ° ã¬ãã¥ãŒã«å¯Ÿããå¹³åã³ã¡ã³ãæ° éèšå¯Ÿè±¡ãšéèšå
容 ãŠãšãã£ã³ã°ããŒã¯ã§ã¯ãGitHubãšGitLabãæŽ»çšããŠããŸããäœæ
äºçš®é¡ããã®ãã¯ããã§ã¯èª¬æãçããŸãã GitHubãšGitLabåæ¹ãã以äžãéèšãããŸãã PRã»MRæ° ã¡ã³ããŒæ¯ã®PRã»MRæåºæ°ãåºããŸãã ãã®éèšã«ãããææ¯ããããžã§ã¯ãæ¯ã®ã³ãŒãã¬ãã¥ãŒäŸé Œæ°ãèŠããŠããŸãã PRã»MRã«å¯Ÿããéçºã¡ã³ããŒã®ã³ã¡ã³ãæ° å
è¿°ã®éãPRã»MRã«å¯Ÿããã³ã¡ã³ãæ°ãéèšããŸãã ã€ãŸããã³ãŒãã¬ãã¥ãŒã«å¯ŸããŠã©ããããã³ã¡ã³ããããããåºããŸãã PRã»MRãžã®ã¬ãã¥ãŒã¢ãµã€ã³æ° PRã»MRã«ã¢ãµã€ã³ãããæ°ãéèšããŸãã ã³ãŒãã¬ãã¥ãŒã«ã¢ãµã€ã³ãããæ°ãåºããŸãã APIãšã³ããã€ã³ã GitHub APIãGitLab APIã®ä»¥äžã®ãšã³ããã€ã³ããå©çšããŸãã ãšã³ããã€ã³ã GitHub GraphQLã䜿ããŸãã https://api.github.com/graphql https://docs.github.com/ja/graphql/reference/queries GitLab åŒç€Ÿã®GraphQL APIã®ããŒãžã§ã³éœåäžÂ REST APIãå©çšããŸãã https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-requests https://docs.gitlab.com/ee/api/discussions.html#merge-requests GitHubéèš Organizationã«çŽã¥ããªããžããªããPRäžèЧãPRäœæè
ãã¬ãã¥ãŒã¢ãµã€ã³ã¡ã³ããŒãã³ã¡ã³ãäžèЧãååŸããŸãã { organization(login: "Organizationå") { repositories(first: 100) { edges { node { name pullRequests(first: 10, after: null, orderBy: {field: CREATED_AT, direction: DESC}) { pageInfo { endCursor } edges { node { createdAt author { login } assignees(first: 10) { edges { node { login } } } comments(first: 100) { edges { node { author { login } body } } } } } } } } } } } GraphQLãªã®ã§ãŸãšããŠååŸã§ããã®ã䟿å©ã§ããéèšèªäœã¯ã¹ã¯ãªããåŽã«ä»»ããŸãã PRæ°ãã³ã¡ã³ãæ°ãå¶éããããŠãªã¯ãšã¹ãããŠããã®ã§ãè¯ããªã«ããŒãžããŒã·ã§ã³ãããŠçްãããªã¯ãšã¹ããããŸãã GitLabéèš ãã¡ãã¯REST APIãå©çšã ã£ãã®ã§ãã¹ã¯ãªããç¹ã亀ããŠèŒããŸããPHPã§ååŸã $date = '2022-04-01T00:00:00+09:00'; $url = "https://{GitLabãã¡ã€ã³}/api/v4/merge_requests?created_after=%s&per_page=100&scope=all&page=%s"; // æ¥ä»ã«å¶éããããŠååŸããã $mrUrl = sprintf($url, $date); $headers = [ "Authorization: Bearer {ããŒã¯ã³å€}", ]; page = 1; // apiãªã¯ãšã¹ããããäŸ while ($mrList = $this->request($mrUrl, $page)) { foreach ($mrList as $mrValue) { $authorName = $mrValue['author']['username']; // authorïŒMRäœæè
ïŒããšã®MRæ°ãã€ã³ã¯ãªã¡ã³ããããäŸ $this->incrementAuthor($authorName); if (!empty($mrValue['assignee'])) { $assigneeName = $mrValue['assignee']['username']; // assigneeïŒã¬ãã¥ãŒè
ïŒããšã®MRæ°ïŒã¬ãã¥ãŒäŸé Œæ°ïŒãã€ã³ã¯ãªã¡ã³ããããäŸ $this->incrementAssignee($assigneeName); } $mr = [ 'prjId' => $mrValue['project_id'], 'mrIid' => $mrValue['iid'], 'authorId' => $mrValue['author']['id'], ]; // ãã®éšåã¯ä»¥äžã§è§£èª¬ $this->sumComment($mr); } $page ++; } ã³ã¡ã³ãéšåã¯å¥ã§ååŸããªããã°ãªããããœãŒã¹äžã® $this->sumComment($mr) éšåã®ååŸã¯ä»¥äžã®ãããªåœ¢ã§ãã private function sumComment($mr) { $mrDiscussionUrl = "https://{GitLabãã¡ã€ã³}/api/v4/projects/%s/merge_requests/%s/discussions?per_page=100"; $path = sprintf($mrDiscussionUrl, $mr['prjId'], $mr['mrIid']); $page = 1; // apiãªã¯ãšã¹ããããäŸ while ($discussions = $this->requestPath($path, $page)) { foreach ($discussions as $comments) { foreach ($comments['notes'] as $note) { // ã·ã¹ãã ïŒCIã«ããæçš¿ãªã©ïŒã«ããå
容ãªãã¹ã«ãŒ if ($note['system']) { continue; } // æçš¿è
ãMRäœæè
ãªãã°ã¹ã«ãŒïŒã¬ãã¥ãŒäŸé Œè
ã«ããã³ã¡ã³ãã¯é€ããŸããïŒ if ($note['author']['id'] == $mr['authorId']) { continue; } $authorName = $note['author']['username']; // ã¬ãã¥ãŒã³ã¡ã³ããã人ããšã®ã³ã¡ã³ãæ°ãã€ã³ã¯ãªã¡ã³ããããäŸ $this->incrementCommenter($authorName); } } $page ++; } } GraphQLã䜿ã£ãGitHubéèšãäžèšã®ãããªã¹ã¯ãªããã§éèšãããŠããŸãã éèšãããã®ãçºè¡š æ°å€ã¯ç°¡åã«ã¹ãã¬ããã·ãŒãã«ãŸãšããŠã°ã©ãåããŸãããã°ã©ãã¯å
è¿°ã®éãã§ãã ãã®çºè¡šãããååããå¢ããããŒãªã©ã®å£°ãäžãã£ãããã¬ãã¥ãŒã«å¯ŸããŠæ²¢å±±ã³ã¡ã³ãããŠããã人ãPRæ°ãå€ã人ãªã©ã人ã«ãã£ãŠæ°å€ã®å·®ã倧ãããé¢çœãçºè¡šã«ãªããŸããã ãããŠå€ãå°ãªããåããã ãã§ãªãã ã¬ãã¥ãŒæã«æ²¢å±±ã³ã¡ã³ãããŠãããã¡ã³ããŒããé
ã
ãŸã§ã³ãŒããèŠãŠãããç¹ãåãããããã³ã¡ã³ãå
容ã ã£ããšãã声ãäžãã£ãã PRæ°ãå€ãã®ã¯ãã©ã®ç²åºŠã§ã³ãŒãã¬ãã¥ãŒãåºããŠããããããã«ããã³ãŒãã¬ãã¥ãŒã®ã¹ããŒãæããªãªãŒã¹æ°ãªã©ã®çžé¢é¢ä¿ãèŠããŠããã ä»åºŠPRãèŠããŠã¿ããããšè©±ãçºå±ããããšããããŸããã åçŽãªæ°å€ã®çºè¡šãããçç£æ§ãèããããã¬ãã¥ã¯ãŒã«æè¬ãäŒãããã£ããã«ããªã£ãããšçºèŠãå€ãçºè¡šã«ãªããŸããã ãšããããã§ä»ææ«ãæ¯ãè¿ãäŒã宿œããŸãã éèšçºè¡šã楜ãã¿ã§ãã
ãšã³ãžãã¢ã®ä¹
ä¿ã§ãã 2022/4 ã« AWS Lambda ã®é¢æ° URLïŒAWS Lambda FunctionURLsïŒ ããªãªãŒã¹ãããŸããããã®æ©èœã䜿ããšãLambda ã䜿ã£ã WebAPI ãäœæããéã«å¿
èŠã ã£ã Amazon API Gateway ãäžèŠã«ãªããŸãã ä»åã¯ãã®é¢æ° URL ã AWS SAMïŒAWS Serverless Application ModelïŒããå©çšããŠã¿ãŸããã äœæ¥ç°å¢ AWS SAM CLI ã¯æ¬¡ã®ããŒãžã§ã³ãå©çšããŠããŸãã % sam --version SAM CLI, version 1.51.0 ãããžã§ã¯ãã®äœæ sam init ã§ãããžã§ã¯ããäœæããŸãã ä»åã¯ããªãã¿ã® hello-world ãã³ãã¬ãŒããå©çšããŠããŸãã % sam init \ --runtime nodejs16.x \ --dependency-manager npm \ --app-template hello-world \ --tracing \ --name sam-app Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment) ãã®ãšãäœæããã SAM ã®ãã³ãã¬ãŒã template.yml ã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > sam-app Sample SAM Template for sam-app # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Tracing: Active Api: TracingEnabled: True Resources: HelloWorldFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs16.x Architectures: - x86_64 Events: HelloWorld: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /hello Method: get Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api HelloWorldApi: Description: "API Gateway endpoint URL for Prod stage for Hello World function" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" HelloWorldFunction: Description: "Hello World Lambda Function ARN" Value: !GetAtt HelloWorldFunction.Arn HelloWorldFunctionIamRole: Description: "Implicit IAM Role created for Hello World function" Value: !GetAtt HelloWorldFunctionRole.Arn 颿° URLïŒFunction URLsïŒãæå¹ã«ãã ããã§ã¯ã颿° URLã æå¹ã«ããŠã¿ãŸãã template.yml ã® Resources â HelloWorldFunction ã®ã»ã¯ã·ã§ã³ã« FunctionUrlConfig ã远å ããŸãã Resources: HelloWorldFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs16.x Architectures: - x86_64 Events: HelloWorld: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /hello Method: get FunctionUrlConfig: AuthType: NONE FunctionUrlConfig ã«ã€ããŠã¯ã ããã¥ã¡ã³ã ã«è©³çŽ°ãæžãããŠããŸãã ä»åã¯ç¹ã«èªèšŒãªãã§ã¢ã¯ã»ã¹ã§ããããã«ãããã®ã§ã AuthType: NONE ãèšå®ããŠããŸãã ãŸããäœæããã颿°URLã確èªã§ããããã«ãOutputsã®ã»ã¯ã·ã§ã³ã§ä»¥äžã®ããã« HelloWorldFunctionUrl ã远èšããŸãã Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api HelloWorldApi: Description: "API Gateway endpoint URL for Prod stage for Hello World function" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" HelloWorldFunction: Description: "Hello World Lambda Function ARN" Value: !GetAtt HelloWorldFunction.Arn HelloWorldFunctionIamRole: Description: "Implicit IAM Role created for Hello World function" Value: !GetAtt HelloWorldFunctionRole.Arn HelloWorldFunctionUrl: Description: "Function URLs endpoint" Value: !GetAtt HelloWorldFunctionUrl.FunctionUrl ãããã€ããŠåäœç¢ºèª ããã§ã¯ãããã€ããŠåäœã確èªããŠã¿ãŸãããã ãŸãã¯ãã«ãããŸãã % sam build ç¶ããŠãããã€ããŸãã % sam deploy \ --template-file template.yaml \ --stack-name sam-app \ --resolve-s3 \ --capabilities CAPABILITY_IAM ãããã€ãå®äºãããšãããã€ãããã¹ã¿ãã¯ã衚瀺ãããŸãã CloudFormation outputs from deployed stack ----------------------------------------------------------------------------------------------------------------------------------------------------------- Outputs ----------------------------------------------------------------------------------------------------------------------------------------------------------- Key HelloWorldFunctionIamRole Description Implicit IAM Role created for Hello World function Value arn:aws:iam::000000000000:role/sam-app-HelloWorldFunctionRole-114EYP0OM26CS Key HelloWorldApi Description API Gateway endpoint URL for Prod stage for Hello World function Value https://jlw92sp9w4.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/ Key HelloWorldFunctionUrl Description Function URLs endpoint Value https://rwu4uvcrsa5yxsecf3dliu2fpu0vmrty.lambda-url.ap-northeast-1.on.aws/ Key HelloWorldFunction Description Hello World Lambda Function ARN Value arn:aws:lambda:ap-northeast-1:000000000000:function:sam-app-HelloWorldFunction-Ynj767nxr0Xw ----------------------------------------------------------------------------------------------------------------------------------------------------------- Successfully created/updated stack - sam-app in ap-northeast-1 åäœç¢ºèª ããã§ã¯å®éã«åãããŠã¿ãŸãã API Gateway ã®ãšã³ããã€ã³ã hello-world ãã³ãã¬ãŒã ã«æåããå«ãŸããŠãã API Gateway ã®ãšã³ããã€ã³ãã«æ¥ç¶ããŠã¿ãŸãã % curl https://jlw92sp9w4.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/ {"message":"hello world"} 颿° URLïŒFunction URLsïŒã®ãšã³ããã€ã³ã 次ã«ãä»å远å ãã颿° URL ã®ãšã³ããã€ã³ãã«æ¥ç¶ããŠã¿ãŸãã % curl https://rwu4uvcrsa5yxsecf3dliu2fpu0vmrty.lambda-url.ap-northeast-1.on.aws/ {"message":"hello world"} API Gateway ã®ãšã³ããã€ã³ããšåæ§ã«åäœããŸããïŒ ä»åã® template.yml ã®æçµçµæ åèãŸã§ã«ãä»åå©çšãã SAM ãã³ãã¬ãŒã template.yml ã®æçµçµæã以äžã«èšèŒããŸãã AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > sam-app Sample SAM Template for sam-app # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Tracing: Active Api: TracingEnabled: True Resources: HelloWorldFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs16.x Architectures: - x86_64 Events: HelloWorld: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /hello Method: get FunctionUrlConfig: AuthType: NONE Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api HelloWorldApi: Description: "API Gateway endpoint URL for Prod stage for Hello World function" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" HelloWorldFunction: Description: "Hello World Lambda Function ARN" Value: !GetAtt HelloWorldFunction.Arn HelloWorldFunctionIamRole: Description: "Implicit IAM Role created for Hello World function" Value: !GetAtt HelloWorldFunctionRole.Arn HelloWorldFunctionUrl: Description: "Function URLs endpoint" Value: !GetAtt HelloWorldFunctionUrl.FunctionUrl ãŸãšã ä»å㯠AWS Lambda ã®é¢æ° URLïŒAWS Lambda Function URLsïŒã AWS SAM ããå©çšããæ¹æ³ã玹ä»ããŸããã çŸåšç€Ÿå
ã§é²è¡ããŠãããããžã§ã¯ãã§ã¯é¢æ° URL ãç©æ¥µçã«å©çšããŠããŸãã å
è¿°ã®éããåŸæ¥ã® API Gateway + Lambda ã§æ§æããã WebAPI ã®å ŽåãLambda 颿° URL ã䜿ã£ãæ§æãžå€æŽããããšã§ API Gateway ãäžèŠã«ãªããŸãã åŒç€Ÿã®å ŽåãLambda 颿° URL ãå©çšããããšã§æã« $30 ã»ã©ç¯çŽã§ããã±ãŒã¹ããããŸããã API Gateway ã§æäŸãããæ©èœãå¿
èŠãšããŠããªãå Žåã¯ã颿° URL ã®å©çšãæ€èšããŠã¿ãŠã¯ãããã§ããããã
ããã«ã¡ã¯ããšã³ãžãã¢ã®ã¿ãŒãïŒ @miiya387 ïŒã§ãã Reactã®ãã¬ãŒã ã¯ãŒã¯ãNext.jsããžã®å
¥éãšããŠãå
¬åŒãã¥ãŒããªã¢ã«ãäœåãã«åããŠãŸãšããŠãããŸãã ä»åã¯4ã€ç®ã® pre-rendering and Data Fetching ã§ãã ãã以åã®ç« ãç¥ãããæ¹ã¯ Reactã®ãã¬ãŒã ã¯ãŒã¯âNext.jsâãè§Šã£ãŠã¿ããã¢ããªæ°èŠäœæ / ããŒãžé·ç§» / ã¹ã¿ã€ã«èšå®ã ãã芧ãã ããã Create a Next.js App Navigate Between Pages Assets, Metadata, and CSS Pre-rendering and Data Fetching Dynamic Routes API Routes Deploying Your Next.js App ãã£ãŠã¿ã 4. Pre-rendering and Data Fetching pre-rendering Next.jsã§ã¯ããã©ã«ãã§ãã¹ãŠã®ããŒãžã«ãããŠpre-renderingãæå¹ã«ãªã£ãŠããŸãã pre-renderingã«ãããããŒãžã®HTMLãäºåã«çæããããã¯ã©ã€ã¢ã³ããµã€ãã§ãã¹ãŠã®JavaScriptãå®è¡ããã®ã«æ¯ã¹ãŠãããã©ãŒãã³ã¹ãSEOãè¯ããªããŸãã çæãããHTMLã¯ãã©ãŠã¶ã§æäœéã®JavaScriptãå®è¡ããã€ã³ã¿ã©ã¯ãã£ããªããŒãžã宿ãããŸãããã®ããã»ã¹ã hydration ãšåŒã³ãŸãã check That Pre-rendering Is Happening 以äžã®å·¥çšã§pre-renderingã確èªããŠãããŸãã ãã©ãŠã¶ã®JavaScriptãç¡å¹ã«ãã ãã®åŸNext.jsã§å®è£
ãããŠãã ãã¡ãã®ããŒãž ã«ã¢ã¯ã»ã¹ chromeã®JavaScriptãç¡å¹ã«ããŸãïŒæé 㯠ãã¡ã ïž ïž ïŒ ãã®åŸãå
¬åŒã§æå®ããã£ãããŒãž https://next-learn-starter.vercel.app/ ã«ã¢ã¯ã»ã¹ãããšãJavaScriptãªãã§ããŒãžã®ã¬ã³ããªã³ã°ãã§ããŠããããšã確èªã§ããŸããïŒ ããã¯ãNext.jsãããŒãžãéçãªHTMLãšããŠpre-renderingããŠãããããJavaScriptãªãã§ã®è¡šç€ºãå¯èœã«ãªããŸãã Next.jsãªãã§çŽç²ã«Reactã§å®è£
ããŠããããŒãžã§ã¯ããã¯ãªããŸããã ããã確èªããããã«ä»¥äžã®ã¹ãããã§Reactã®ããŒãžã§JavaScriptãç¡å¹ã«ããç¶æ
ã§ã¢ã¯ã»ã¹ãããšã©ããªãã®ã確èªããŠãããŸãã JavaScriptãæå¹ãªç¶æ
ã§ ãã¡ãã®ããŒãž ã«ã¢ã¯ã»ã¹ ãã®åŸãJavaScriptãç¡å¹ã«ããå床åãããŒãžã«ã¢ã¯ã»ã¹ ãŸãã¯æå®ã®ããŒãžã«JavaScriptãæå¹ãªç¶æ
ã§ã¢ã¯ã»ã¹ããŸãã Reactã®ã¢ã€ã³ã³ãããããããŠããããŒãžãèŠããŸããã ãã®åŸJavaScriptãç¡å¹ã«ãåã¢ã¯ã»ã¹ãããšä»¥äžã®ããã«JavaScriptãæå¹ã«ããŠãã ãããšè¡šç€ºãããããŒãžã®ã¬ã³ããªã³ã°ã¯ãããŸããã ããã§Next.jsãšéããReactã§ã¯ããŒãžã®pre-renderingããããŠããªãããšã確èªã§ããŸããã Summary: Pre-rendering vs No Pre-rendering 以äžã¯å
¬åŒã§ç޹ä»ãããŠããNext.js(pre-renderingãã)ãšPlain React(pre-renderingãªã)ã®æŠèŠã§ãã Next.jsã§ã¯ãååã®HTMLã®è¡šç€ºãããã«è¡ããããã®åŸ<Link>ãªã©ã®JavaScriptã®å®è¡ãå¿
èŠãªäžéšèŠçŽ ã®ã¿é
å»¶ããŠè¡ãããŸãã åºå±: https://nextjs.org/learn/basics/data-fetching/pre-rendering äžæ¹ã§Reactã§ã¯ãåå衚瀺ã®ãã®ã¯ãªãããã¹ãŠã®React ComponentãJavaScriptã®å®è¡ãåŸ
ã£ãŠãã衚瀺ãããŸãã æ®æ®µReactã§éçºããŠãããšãã¯ãåææç»ã«æéãããã£ãŠããŸãã®ã¯ããçšåºŠä»æ¹ãªããšæã£ãŠããŸããããNext.jsã¯åºæ¬çã«å
šããŒãžã§pre-renderingã«å¯Ÿå¿ããŠããã®ã§ãã®åé¡ã¯è§£æ±ºãããã§ããã Two Forms of Pre-rendering Next.jsã§ã¯ä»¥äžã®2çš®é¡ã®pre-renderingããããŸã Static Generation : ãã«ãæã«HTMLãäºåçæãããã®åŸã¯1床çæãããHTMLããªã¯ãšã¹ãããšã«åå©çšãããŸã Server-side Rendering : ãªã¯ãšã¹ãã®ãã³ã«HTMLãåçæãããŸã åºå±: https://nextjs.org/learn/basics/data-fetching/two-forms ãªããéçºã¢ãŒãã®ç°å¢ã§ã¯ãStatic Generationã§ãã£ãŠãããªã¯ãšã¹ãããšã«pre-renderingãããŸãã Per-page Basis Next.jsã§ã¯ããŒãžããšã«äœ¿çšããpre-renderedæ¹åŒãéžã¶ããšãã§ããSSGãšSSRã®ãã€ããªããæ§æãå¯èœã«ãªããŸãã ããŒãžã®ç¹åŸŽã«åãããŠéžæã§ããã®ã§ããšãŠã䟿å©ã§ããïŒå¬ããã§ãïŒ åºå±: https://nextjs.org/learn/basics/data-fetching/two-forms When to Use Static Generation v.s. Server-side Rendering Next.jsã§ã¯åºæ¬çã«SSGã䜿ãããšãæšå¥šããŠããŸãã äžåºŠããŒãžãçæããŠCDNã®å©çšãå¯èœã«ãªããããããã©ãŒãã³ã¹çã«æå©ã«ãªããŸãã äŸãã°ã次ã®ãããªããŒãžã«SSGã䜿ããŸãã ããŒã±ãã£ã³ã°ããŒãž ããã°æçš¿ ECãµã€ãã®ååäžèЧ ãã«ãããŒãž äžæ¹ã§ãããŒã¿ã®æŽæ°ãé »ç¹ã«è¡ãããããŒãžããªã¯ãšã¹ãããšã«è¡šç€ºããã³ã³ãã³ããåãæ¿ãããããŒãžã§ã¯SSRã䜿ãã®ãé©ããŠããŸãã SSGãšæ¯ã¹ããšããŒãžè¡šç€ºé床ã®ããã©ãŒãã³ã¹ã¯äžãããŸãããããŒãžãåžžã«ææ°ã®ç¶æ
ã«ããããšãã§ããŸãã ãŸãã¯ãpre-renderingãã¹ãããããŠã¯ã©ã€ã¢ã³ããµã€ãã§JavaScriptãå©çšããŠé »ç¹ã«æŽæ°ãããããŒã¿ã衚瀺ããããšãã§ããŸãã CMSããŒã«ã®ãããªå
¥åããã¹ãããªã¢ã«ã¿ã€ã ã§ãã¬ãã¥ãŒã«åæ ãããããŒãžãããŠãŒã¶ãŒã®å¿åæ§ã«åãããŠè¡šç€ºå
容ãåãæ¿ãããããŒãžã§ã¯pre-renderingãã¹ãããããæ¹ãé©ããŠãããã§ããã Static Generation with and without Data SSGã¯ããŒã¿ã®æç¡ã«é¢ãããå©çšå¯èœã§ãã ãããŸã§äœæããããŒãžã§ã¯ãå€éšããŒã¿ãååŸããå¿
èŠããªãã¢ããªãæ¬çªçšã«ãã«ãããããšãã«èªåçã«éçã«çæãããŸãã åºå±: https://nextjs.org/learn/basics/data-fetching/with-data ããããäžéšã®ããŒãžã§ã¯äºåã«ããŒã¿ãååŸããªããšãHTMLã®çæãã§ããªãå ŽåããããŸãã ãã«ãæã«ãç»åãã¡ã€ã«ãååŸãããå€éšAPIããã§ãããããããŒã¿ããŒã¹ã«ã¯ãšãªå®è¡ããããªã©ããã ãã®å ŽåãNext.jsã¯ãµããŒãããŠããã getStaticProps ã䜿ããšäºååŠçãå¯èœã«ãªããŸãã getStaticPropsã¯async颿°ã§ãæ¬çªãã«ãæã«å®è¡ããã颿°å
ã§ã¯å€éšããŒã¿ããã§ããããŠããŒãžã«æž¡ãããŸãã éçºã¢ãŒãã§ã¯åãªã¯ãšã¹ãã§å®è¡ãããŸãã export default function Home(props) { ... } export async function getStaticProps() { // Get external data from the file system, API, DB, etc. const data = ... // The value of the `props` key will be // passed to the `Home` component return { props: ... } } Blog Data ããã§ã¯å®éã«ããã°ããŒã¿ããã§ããããŠè¿œå ããŠãããŸãã ãããžã§ã¯ããããã« posts ãã£ã¬ã¯ããªãäœæããŸãã äœæããpostsé
äžã«ããã°ãã¡ã€ã«ïŒããŒã¯ããŠã³ïŒã远å ããå
容ã以äžã«ããŸãã --- title: 'Two Forms of Pre-rendering' date: '2020-01-01' --- Next.js has two forms of pre-rendering: **Static Generation** and **Server-side Rendering**. The difference is in **when** it generates the HTML for a page. - **Static Generation** is the pre-rendering method that generates the HTML at **build time**. The pre-rendered HTML is then _reused_ on each request. - **Server-side Rendering** is the pre-rendering method that generates the HTML on **each request**. Importantly, Next.js lets you **choose** which pre-rendering form to use for each page. You can create a "hybrid" Next.js app by using Static Generation for most pages and using Server-side Rendering for others. 次ã«ãåæ§ã«postsé
äžã«ssg-ssr.mdãã¡ã€ã«ã远å ããå
容ã以äžã«ããŸãã --- title: 'When to Use Static Generation v.s. Server-side Rendering' date: '2020-01-02' --- We recommend using **Static Generation** (with and without data) whenever possible because your page can be built once and served by CDN, which makes it much faster than having a server render the page on every request. You can use Static Generation for many types of pages, including: - Marketing pages - Blog posts - E-commerce product listings - Help and documentation You should ask yourself: "Can I pre-render this page **ahead** of a user's request?" If the answer is yes, then you should choose Static Generation. On the other hand, Static Generation is **not** a good idea if you cannot pre-render a page ahead of a user's request. Maybe your page shows frequently updated data, and the page content changes on every request. In that case, you can use **Server-Side Rendering**. It will be slower, but the pre-rendered page will always be up-to-date. Or you can skip pre-rendering and use client-side JavaScript to populate data. Implement getStaticProps ããŒã¯ããŠã³ãããŒã¹ããããã« gray-matter ãã€ã³ã¹ããŒã«ããŸã npm install gray-matter ãããžã§ã¯ããããã«libãã£ã¬ã¯ããªãäœæãã以äžã®posts.jsã远å ããŸãã import fs from 'fs' import path from 'path' import matter from 'gray-matter' const postsDirectory = path.join(process.cwd(), 'posts') export function getSortedPostsData() { // Get file names under /posts const fileNames = fs.readdirSync(postsDirectory) const allPostsData = fileNames.map(fileName => { // Remove ".md" from file name to get id const id = fileName.replace(/\.md$/, '') // Read markdown file as string const fullPath = path.join(postsDirectory, fileName) const fileContents = fs.readFileSync(fullPath, 'utf8') // Use gray-matter to parse the post metadata section const matterResult = matter(fileContents) // Combine the data with the id return { id, ...matterResult.data } }) // Sort posts by date return allPostsData.sort(({ date: a }, { date: b }) => { if (a < b) { return 1 } else if (a > b) { return -1 } else { return 0 } }) } pages/index.jsãæ¬¡ã®ããã«æŽæ°ããgetSortedPostsDataã䜿ã£ãŠããŒã¿ãã§ããããŸãã ãã§ããããããŒã¿ã䜿ãããã«Homeã³ã³ããŒãã³ããäžéšæžãæããŸãã import Layout, { siteTitle } from '../components/layout' import utilStyles from '../styles/utils.module.css' import { getSortedPostsData } from '../lib/posts' export async function getStaticProps() { const allPostsData = getSortedPostsData() return { props: { allPostsData } } } export default function Home({ allPostsData }) { return ( <Layout home> {/* Keep the existing code here */} {/* Add this <section> tag below the existing <section> tag */} <section className={`${utilStyles.headingMd} ${utilStyles.padding1px}`}> <h2 className={utilStyles.headingLg}>Blog</h2> <ul className={utilStyles.list}> {allPostsData.map(({ id, date, title }) => ( <li className={utilStyles.listItem} key={id}> {title} <br /> {id} <br /> {date} </li> ))} </ul> </section> </Layout> ) } æŽæ°åŸã http://localhost:3000/ ã«ã¢ã¯ã»ã¹ãããšãã§ããããããã°ããŒã¿ã䜿çšããŠpre-renderingã§ããŸããïŒ getStaticProps Details Fetch External API or Query Database ä»åã¯ãã¡ã€ã«ã·ã¹ãã ããããŒã¿ããã§ãããããã¿ãŒã³ã posts.js ã«å®è£
ããŸããããå€éšAPIããããŒã¿ããã§ããããããšããããŒã¿ããŒã¹ã«çŽæ¥ã¯ãšãªãå®è¡ããããšãã§ããŸãã å€éšAPIããããŒã¿ããã§ããããå Žå㯠posts.js ã以äžã®ããã«ããŸãã export async function getSortedPostsData() { // Instead of the file system, // fetch post data from an external API endpoint const res = await fetch('..') return res.json() } ã¯ãšãªãå®è¡ããå Žåã¯ä»¥äžã®ããã«ããŸãã import someDatabaseSDK from 'someDatabaseSDK' const databaseClient = someDatabaseSDK.createClient(...) export async function getSortedPostsData() { // Instead of the file system, // fetch post data from a database return databaseClient.query('SELECT posts...') } getStaticPropsã¯ãµãŒããŒãµã€ãã®ã¿ã§å®è¡ããããããJavaScriptã®ãã³ãã«å¯Ÿè±¡ã«å
¥ããŸããã ãã®ãããå®è¡ããã¯ãšãªãªã©ããã©ãŠã¶ã«éä¿¡ããããšãªãå®è¡ããããšãã§ããŸãã Development vs. Production å
ã«ãèšèŒããŸããããéçºã¢ãŒãã®å Žåã¯ãªã¯ãšã¹ãããšã«getStaticPropsãå®è¡ãããŸãã æ¬çªã§ã¯ããã«ãæã«ã®ã¿å®è¡ãããŸãã ã€ãŸããgetStaticPropsã§ã¯ããªã¯ãšã¹ãæ¯ã«ã¯ãšãªãã©ã¡ãŒã¿ãHTTPããããŒãæå®ããŠãããŒã¿ã®åçååŸã¯è¡ããŸããã Fetching Data at Request Time ãã«ãæã§ã¯ãªããªã¯ãšã¹ãæã«ããŒã¿ããã§ããããå¿
èŠãããå Žåã¯ã Server-side Renderingã䜿ããŸãã Server-side Renderingã®å Žåã¯ãgetStaticPropsã®ä»£ããã«getServerSidePropsã䜿ãå¿
èŠããããŸãã Using getServerSideProps ããã°ã®äŸã§ã¯äœ¿ããªãããå®è£
ã¯ããŸããããgetServerSidePropsã䜿ãããšã§ ãªã¯ãšã¹ãããšã®ããŒã¿ãã§ãããã§ããããã«ãªããŸãã export async function getServerSideProps(context) { return { props: { // props for your component } } } Client-side Rendering pre-renderingæã«äºåååŸããå¿
èŠã®ãªãããŒã¿ã¯ãJavaScriptã䜿ã£ãŠã¯ã©ã€ã¢ã³ããµã€ãã§ã¬ã³ããªã³ã°ããããšãã§ããŸãã å€éšããŒã¿ãå¿
èŠãšããªãããŒãžã®éšåãSSGã§ã¬ã³ããªã³ã° ããŒãžãèªã¿èŸŒãŸããããJavaScriptã䜿çšããŠã¯ã©ã€ã¢ã³ããµã€ãã§å€éšããŒã¿ããã§ããããæ®ãã®éšåã«ããŒã¿ãå
¥å åºå±: https://nextjs.org/learn/basics/data-fetching/request-time ã¯ã©ã€ã¢ã³ããµã€ãã§ããŒã¿ãã§ããããå Žåã¯ãReact Hooksã©ã€ãã©ãªã®SWRããããããããŠããŸãã ããŒãžè¡šç€ºãçµãã£ãåŸã«äžéšåºåã衚瀺ããå Žåãªã©ã«é©ããŠãããã§ããããã ããéäžã§è¡šç€ºé
ç®ãå¢ããããšã§ã®ã¬ã€ã¢ãŠãã·ããã«ããUXäœäžãSEOãžã®åœ±é¿ã¯æ³šæããªããšãªã®ã§æ€èšŒããŠã¿ãå¿
èŠããããŸããã ãŸãšã ä»åã¯Nex.jsã®å
¬åŒãã¥ãŒããªã¢ã«ãããšã«pre-renderingã«ã€ããŠè§ŠããŠã¿ãŸããã ããŒãžã®ç¹æ§ã«åãããŠSSG, SSRã䜿ããããã§ããããšã¯ãšãŠã䟿å©ã§ãããã SSGãåºæ¬ãšããŠã¯ã©ã€ã¢ã³ããµã€ãã§å¿
èŠãªåã ãåŸãã远å 衚瀺ããã®ãé
åçã§ããã ãããŸã§ã®ãœãŒã¹ã¯ github ã«äžããã®ã§èå³ã®ããæ¹ã¯ãã²äžç·ã«Next.jsãšä»²è¯ããªã£ãŠãããŸãããïŒ æ¬¡åã¯ãDynamic Routes, API Routesãããã£ãŠã¿ãŸãã
ããã«ã¡ã¯ããšã³ãžãã¢ã®ã¿ãŒãïŒ @miiya387 ïŒã§ãã ä»åã¯Reactã®ãã¬ãŒã ã¯ãŒã¯ã§ãããNext.jsããå
¬åŒãã¥ãŒããªã¢ã«ãããšã«è§Šã£ãŠã¿ãŸããã æ®æ®µã®éçºã§ã¯Reactã䜿çšããŠããã®ã§ãããæè¿ããã³ããšã³ãé¢é£ã®èšäºã§Next.jsãããç®ã«ããããã«ãªã£ãã®ã§ãåºæ¬çãªæ©èœããã¥ãŒããªã¢ã«ãéããŠè§Šã£ãŠã¿ãŠç¥ã£ãããšããŸãšããããšæããŸãã Next.jsãšã¯ïŒ Next.jsã¯ReactããŒã¹ã®ãã¬ãŒã ã¯ãŒã¯ã§ãã å
¬åŒã®å°å
¥éšåã«ãŠãReactã䜿ã£ãŠWebã¢ããªã±ãŒã·ã§ã³ãéçºããéã®èæ
®ç¹ãåãäžããäžã§ãNext.jsã¯ãããããã¹ãŠè§£æ±ºããŠããããšç޹ä»ãããŠããŸããã äž»ãªç¹åŸŽã¯ä»¥äžã®8ã€ã¿ããã§ãã詳现㯠ãã¡ã ïž ïž ã»An intuitive page-based routing system (with support for dynamic routes) ã»Pre-rendering, both static generation (SSG) and server-side rendering (SSR) are supported on a per-page basis ã»Automatic code splitting for faster page loads ã»Client-side routing with optimized prefetching ã»Built-in CSS and Sass support, and support for any CSS-in-JS library ã»Development environment with Fast Refresh support ã»API routes to build API endpoints with Serverless Functions ã»Fully extendable ç¹ã«2ã€ç®ã®SSG, SSRã®ç¹åŸŽãæ°ã«ãªã£ãŠããã®ã§ãã¥ãŒããªã¢ã«ã®äžã§è§Šãããããšå¬ããã§ãã ãã¥ãŒããªã¢ã«ã§ã¯ã·ã³ãã«ãªããã°ã¢ããªã®äœæãéããŠNext.jsã®åºæ¬ãåŠãã§ããã¹ã¿ã€ã«ã§ãã Create a Next.js App Navigate Between Pages Assets, Metadata, and CSS pre-rendering and Data Fetching Dynamic Routes API Routes Deploying Your Next.js App æ¬èšäºã§ã¯1~3ããŸãã¯ãã£ãŠã¿ãããšæããŸãã ãã£ãŠã¿ã 1. Create a Next.js App Setup æåã®ã¬ãã¹ã³ã§ã¯Nex.jsã®ã¢ããªã±ãŒã·ã§ã³äœæãšããŒãžã®è¡šç€ºãç·šéãŸã§ãè¡ããŸãã åæ Node.jsãã€ã³ã¹ããŒã«ãããŠããããšïŒããŒãžã§ã³ã¯10.13以äžïŒ ä»»æã®ãšãã£ã¿ãšã¿ãŒããã«ãçšæããŠããããš ç§ã¯ä»å Node.js 㯠v14.15.5 ã®ç°å¢ã§äœæ¥ããŸãã Create a Next.js app ä»»æã®ãã£ã¬ã¯ããªå
ã§ä»¥äžã³ãã³ãã§Next.jsã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã $ npx create-next-app nextjs-blog --use-npm --example "https://github.com/vercel/next-learn/tree/master/basics/learn-starter" Run the development server äœæãå®äºãããã nextjs-blog ã«ç§»åããŠãµãŒããŒãèµ·åããŸã $ cd nextjs-blog $ npm run dev > @ dev /Users/XXXXXX/Projects/tutorial_next_js/nextjs-blog > next dev ready - started server on 0.0.0.0:3000, url: http://localhost:3000 event - compiled client and server successfully in 1880 ms (110 modules) Attention: Next.js now collects completely anonymous telemetry regarding usage. This information is used to shape Next.js' roadmap and prioritize features. You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL: https://nextjs.org/telemetry Welcome to Next.js èµ·ååŸã« http://localhost:3000 ã«ã¢ã¯ã»ã¹ãããšã以äžã®ç»é¢ã®è¡šç€ºããããŸããïŒ ãµã¯ããšãããŸã§ãããã®ã¯ç°¡åã§å¬ããã§ããïŒ Editing the Page ãµãŒããŒãèµ·åãããŸãŸããŒãžã®ç·šéãããŠãããŸãã pages/index.js ã® Welcome ã Learn ã«æžãæããŠã¿ãŸãããã import Head from 'next/head' export default function Home() { return ( <div className="container"> <Head> <title>Create Next App</title> <link rel="icon" href="/favicon.ico" /> </Head> <main> <h1 className="title"> Lean to <a href="https://nextjs.org">Next.js!</a> </h1> ã»ã»ã» ãªããšç·šéããã ãã§ããŒãžã®æŽæ°ãªãã«ç·šéå
容ãããŒãžã«åæ ãããŸããïŒ ãããŒãïŒããã Fast Refresh ãšããç¹åŸŽã¿ããã§ãã åäœã®ãšã¯ã¹ããŒããã¡ã€ã«ã®æŽæ°ãªãç·šéã®ãã£ããã¡ã€ã«ã®ã¿ãimportãããŠãããã¡ã€ã«ãªãimportããŠãããã¡ã€ã«ãã»ããã§ã³ã³ãã€ã«ããŠåæç»ããŠãããã¿ããã§ãã æè¿èªåã®éçºç°å¢ã®jsã®ãã©ã³ã¹ãã€ã«ãé
ããŠå°ã
ã¹ãã¬ã¹ã»ã»ãšæã£ãŠããã®ã§ããã¯å¬ããç¹åŸŽã§ããïŒ ã»ãšãã©ã®å Žå1ç§ä»¥å
ã«åæ ãããããã§ããéçºãæããŸããïŒ 2. Navigate Between Pages 次ã®ã¬ãã¹ã³ã§ã¯ããŒãžã®è¿œå ãšãããŒãžéé·ç§»ãè¡ããŸãã Pages in Next.js pagesãã£ã¬ã¯ããªå
ã«æ°ãã posts ãã£ã¬ã¯ããªãäœæãã postsãã£ã¬ã¯ããªå
ã«ä»¥äžã® first-post.js ãã¡ã€ã«ãæ°èŠè¿œå ããŸãã export default function FirstPost() { return <h1>First Post</h1> } http://localhost:3000/posts/first-post ã«ã¢ã¯ã»ã¹ãããšä»¥äžã®ç»é¢ã衚瀺ãããæ°ããããŒãžãäœæã§ããããšã確èªã§ããŸãã ãããããŒãžããŒã¹ã®ã«ãŒãã£ã³ã°ã§ããpagesãã£ã¬ã¯ããªã®äžã«ãã¡ã€ã«ãé
眮ããã ãã§ãããŒãžãã¡ã€ã«ã®ãã¹ããã¢ããªã±ãŒã·ã§ã³äžã®ããŒãžã®URLã®ãã¹ã«å¯Ÿå¿ããŠãããããçŽæçãªå®è£
ãå¯èœãšãªã£ãŠããŸãã ã²ããŒïŒãããŒãïŒ Link Component ç¶ããŠãä»äœæããããŒãžãžã®ãªã³ã¯ãindex.jsã«è¿œå ããŠãããŸãã ããã§ã¯ Link ã³ã³ããŒãã³ãã䜿ãããšã§client-side navigationã«ããããŒãžéã®é·ç§»ãå®è£
ããŠã¿ãŸãã pages/index.jsã« Link ã³ã³ããŒãã³ãã®importã远å ããh1ã¿ã°ã®aã¿ã°ãlinkã¿ã°ã«çœ®ãæããŸãã import Head from 'next/head' import Link from 'next/link' export default function Home() { return ( <div className="container"> <Head> <title>Create Next App</title> <link rel="icon" href="/favicon.ico" /> </Head> <main> <h1 className="title"> Read{' '} <Link href="/posts/first-post"> <a>this page!</a> </Link> </h1> 次ã«ãpages/posts/first-post.js ãæ¬¡ã®ããã«å€æŽãã ãããããŒãžã«æ»ããªã³ã¯ãæ°ããèšçœ®ããŸãã import Link from 'next/link' export default function FirstPost() { return ( <> <h1>First Post</h1> <h2> <Link href="/"> <a>Back to home</a> </Link> </h2> </> ) } ããŒãžã確èªãããšã远å ããLinkã䜿ã£ãŠããŒãžéã®é·ç§»ãã§ããããã«ãªããŸããïŒ Client-Side Navigation Linkã³ã³ããŒãã³ãã«ããããŒãžéã® client-side navigation ã¯ãã¯ã©ã€ã¢ã³ãåŽã ãã§ããŒãžè¡šç€ºãšURLã倿Žãããããéåžžãããé«éãªããŒãžé·ç§»ãå¯èœãšãªããŸãã ã¯ã©ã€ã¢ã³ãåŽã ãã§é·ç§»ãè¡ãããŠããããšã確èªããããã«ãhtmlã®cssããããã£ã倿ŽããŠããŒãžé·ç§»ãããŠã¿ãŸãããã ããŒãžé·ç§»ããŠããèæ¯è²ã®é»è²ãç¶ç¶ããŠåæ ãããŠããããšã確èªã§ããŸããã ããã¯ãã©ãŠã¶ãããŒãžãããŒãããã«ã¯ã©ã€ã¢ã³ãåŽã®ã¿ã§ããŒãžé·ç§»ã§ããŠãããšããããšã«ãªããŸãã Code splitting and prefetching Next.jsã¯ã³ãŒãåå²ãèªåçã«è¡ããããåããŒãžã«å¿
èŠãªãã®ã ããããŒãããããã«ãªã£ãŠããŸãã ã€ãŸããããŒãžããŒãæã«ã¯ä»ã®ããŒãžã®ãœãŒã¹ã¯ããŒãããªããããè€æ°ããŒãžååšããå Žåã§ãé«éãªèªã¿èŸŒã¿ãå¯èœãšãªããŸãã ããã«ãæ¬çªãã«ãæã«ã¯ã³ã³ããŒãã³ãããã©ãŠã¶ã®ãã¥ãŒããŒãã«è¡šç€ºããã床㫠Linkã³ã³ããŒãã³ãã§ãªã³ã¯ãããããŒãžãããã¯ã°ã©ãŠã³ãã§èªåçã« prefetch ããŠãã ããããªã³ã¯ãã¯ãªãã¯ãããŸã§ã«ãªã³ã¯å
ã«ã³ãŒããèªã¿èŸŒãŸããŠããç¶æ
ã«ãªããé«éãªããŒãžé·ç§»ãã§ããããã«ãªããŸãã ã²ãããããïŒ 3. Assets, Metadata, and CSS 次ã®ã¬ãã¹ã³ã§ã¯ããŒãžã«CSSã¹ã¿ã€ã«ã远å ããŸãã Assets Download Your Profile Picture ãŸãã¯ãããã°ãããã«è¡šç€ºããèªèº«ã®ãããã£ãŒã«ç»åãããŠã³ããŒãããŸãã publicãã£ã¬ã¯ããªå
ã« images ãã£ã¬ã¯ããªãæ°èŠäœæããããŠã³ããŒããã profile.jpg ãæ ŒçŽããŸãã Unoptimized Image éåžžã®HTMLã§ã¯ä»¥äžã®ããã«ç»åã远å ããŸã <img src="/images/profile.jpg" alt="Your Name" data-mce-src="/images/profile.jpg"> ãããããã®å Žåãç»åã®æé©åãé
å»¶èªã¿èŸŒã¿ãªã©ã¯æåã§èšå®ããå¿
èŠããããŸãã Image Component and Image Optimization Next.jsã®å Žåãimgã¿ã°ãæ¡åŒµåã Image ã³ã³ããŒãã³ããçšæãããŠãããç»åã®æé©åãé
å»¶èªã¿èŸŒã¿ãªã©ãèªåã§è¡ãããšãã§ããŸããwebpã«ã察å¿ããŠãããšãã Using the Image Component Next.jsã¯ããã«ãæã«ã€ã¡ãŒãžãæé©åãã代ããã«ããŠãŒã¶ãŒã®èŠæ±ã«å¿ããŠãªã³ããã³ãã§ç»åãæé©åããŸãã ç»åã¯ããã©ã«ãã§é
å»¶èªã¿èŸŒã¿ãããããããã©ãŠã¶ã®ãã¥ãŒããŒãå€ã®ç»åã®åœ±é¿ã§ããŒãžé床ãäœäžããããšããªããåžžã«ã¬ã€ã¢ãŠãã·ãããåé¿ããããã«æç»ãããŸãã 詳ãã㯠ãã¡ã ïž ïž äŸ¿å©ãããŠæãã»ã»ã»ã»ã»ã»ã» import Image from 'next/image' const YourComponent = () => ( <Image src="/images/profile.jpg" // Route of the image file height={144} // Desired size with correct aspect ratio width={144} // Desired size with correct aspect ratio alt="Your Name" /> ) ãã®ã³ãŒãã¯åŸã»ã©äœ¿ããããã®ã§ãŸã ãã¡ã€ã«è¿œå ããå
ã«é²ã¿ãŸãã Metadata Head ã³ã³ããŒãã³ãã䜿ã£ãŠããŒãžã®ã¡ã¿ããŒã¿ã远å ããŸãã Adding Head to first-post.js import Link from 'next/link' import Head from 'next/head' export default function FirstPost() { return ( <> <Head> <title>First Post</title> </Head> <h1>First Post</h1> <h2> <Link href="/"> <a>Back to home</a> </Link> </h2> </> ) } http://localhost:3000/posts/first-post ã«ã¢ã¯ã»ã¹ãããšæå®ããéãããŒãžã¿ã€ãã«ã倿ŽãããŠããããšã確èªã§ããŸããã Third-Paty JavaScript éåžžã®HTMLã§ã¯ããµãŒãããŒãã£ã¹ã¯ãªããã®è¿œå ã¯æ¬¡ã®ããã«scriptã¿ã°ã䜿çšããŠè¡ããŸãã <Head> <title>First Post</title> <script src="https://connect.facebook.net/en_US/sdk.js" /> </Head> ãã®æ¹æ³ã§ã¹ã¯ãªãããå«ãããšãåãããŒãžã§ãã§ãããããä»ã®JavaScriptã³ãŒãã«å¯ŸããŠãã€ããŒããããããæç¢ºã«ããããŸããããèªã¿èŸŒã¿ã«ããããŒãžã®ã¬ã³ããªã³ã°ããããã¯ããŠããŠãããŒãžã³ã³ãã³ãã®èªã¿èŸŒã¿ãé
ããå¯èœæ§ããããŸãã Using the Script Component Next.jsã§ã¯ Script ã³ã³ããŒãã³ãã䜿ãããšã«ãã£ãŠãã¹ã¯ãªããã®èªã¿èŸŒã¿ãå®è¡ãæé©åããããšãã§ããŸãã詳ãã㯠ãã¡ã ïž ïž import Link from 'next/link' import Head from 'next/head' import Script from 'next/script' export default function FirstPost() { return ( <> <Head> <title>First Post</title> </Head> <Script src="https://connect.facebook.net/en_US/sdk.js" strategy="lazyOnload" onLoad={() => console.log(`script loaded correctly, window.FB has been populated`) } /> <h1>First Post</h1> <h2> <Link href="/"> <a>Back to home</a> </Link> </h2> </> ) } strategyã§lazyOnloadãæå®ããŠããŸããããã«ãããããŒãžè¡šç€ºé床ãåäžã§ããŸãã onLoadã§ã¯èªã¿èŸŒã¿å®äºåŸã®åŠçãæå®ã§ããŸããä»åã¯èªã¿èŸŒã¿ãå®äºããããšãã³ã³ãœãŒã«åºåããŸãã http://localhost:3000/posts/first-post ã«ã¢ã¯ã»ã¹ãããšã³ã³ãœãŒã«åºåãã§ããŠããããšã確èªã§ããŸããã ãŸããNetworkã§èªã¿èŸŒã¿é ã確èªãããšãããfirst-post.js ã®åŸã« sdk.js ãèªã¿èŸŒãŸããŠããããšã確èªã§ããŸããã CSS Styling pages/index.js ã«ã¯ãã§ã«ããã€ãã®ã¹ã¿ã€ã«æå®ããããŸãã styled-jsxãšããCSS-in-JSã©ã€ãã©ãªã䜿çšããŠãããReactã³ã³ããŒãã³ãå
ã§CSSãèšè¿°ã§ããããã«ãªããŸãã Next.jsã«ã¯styled-jsxã®ãµããŒããçµã¿èŸŒãŸããŠããŠãèªã¿èŸŒããã¡ã€ã«ã®æ¡åŒµåã .css ãã .sass ã«å€æŽããã°Sassã®èªã¿èŸŒã¿ãå¯èœã«ãªããŸãã Layout Component ããã§ã¯ããã¹ãŠã®ããŒãžã§å
±éã§äœ¿çšããã¬ã€ã¢ãŠããäœæããŠãããŸãã ãããžã§ã¯ããããã« components ãã£ã¬ã¯ããªãäœæãã layout.js ã远å ããŸãã export default function Layout({ children }) { return <div>{children}</div> } 次㫠first-post.js ã§äœæãã layout.js ãimportããäžçªå€åŽã«è¿œå ããŸãã import Link from 'next/link' import Head from 'next/head' import Script from 'next/script' import Layout from '../../components/layout'; export default function FirstPost() { return ( <Layout> <Head> <title>First Post</title> </Head> <Script src="https://connect.facebook.net/en_US/sdk.js" strategy="lazyOnload" onLoad={() => console.log(`script loaded correctly, window.FB has been populated`) } /> <h1>First Post</h1> <h2> <Link href="/"> <a>Back to home</a> </Link> </h2> </Layout> ) } Adding CSS å®éã« Layout ã³ã³ããŒãã³ãã«ã¹ã¿ã€ã«ã远å ããŠã¿ãŸãã components/layout.module.css ãäœæããLayoutã³ã³ããŒãã³ãã«è¿œå ããŸãã .container { max-width: 36rem; padding: 0 1rem; margin: 3rem auto 6rem; } http://localhost:3000/posts/first-post ã«ã¢ã¯ã»ã¹ãããšãã¹ã¿ã€ã«ãé©çšãããããšãããããŸãã ã¯ã©ã¹åã layout_container__fbLkO ã«ãªã£ãŠããã®ã¯ãcssã¢ãžã¥ãŒã«ã®æ©èœã§äžæã®ã¯ã©ã¹åãçæããŠããããã§ãã ããã§ã¯ã©ã¹åã®è¡çªãæ°ã«ããå¿
èŠããªããªããŸãã Global Styles ããã§ã¯ãã°ããŒãã«ã«é©çšã§ããCSSã¹ã¿ã€ã«ãäœæããŸãã cssã¢ãžã¥ãŒã«ã¯ããŒãžåäœã®ã¹ã¿ã€ã«æå®ã«åœ¹ç«ã¡ãŸããããã¹ãŠã®ããŒãžã«ã¹ã¿ã€ã«ãåæ ããããå Žåã¯ã以äžã®ããã«æå®ããŸãã ãŸãã¯ãã¹ãŠã®ã³ã³ããŒãã³ãã«å
±éããæäžäœã®ã³ã³ããŒãã³ãã pages/_app.js ãšããŠæ°èŠäœæããŸãã export default function App({ Component, pageProps }) { return <Component {...pageProps} /> } Restart the Development Server pages/_app.js ã远å ããå Žåã¯ãéçºãµãŒããŒãåèµ·åããå¿
èŠããããŸãã // Ctrl+c ã§èµ·åããŠãããµãŒããŒãäžåºŠåæ¢ããŸã $ npm run dev Adding Global CSS ãããžã§ã¯ããããã«stylesãã£ã¬ã¯ããªãäœæããglobal.cssãã¡ã€ã«ã远å ããŸãã html, body { padding: 0; margin: 0; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; line-height: 1.6; font-size: 18px; } * { box-sizing: border-box; } a { color: #0070f3; text-decoration: none; } a:hover { text-decoration: underline; } img { max-width: 100%; display: block; } http://localhost:3000/posts/first-post ã«ã¢ã¯ã»ã¹ãããšãã¹ã¿ã€ã«ãé©çšãããŠããããšãããããŸãã global.css 㯠pgaes/_app.js 以å€ã®ãã¡ã€ã«ã§ã®importã¯ã§ããªãã®ã§æ³šæããŸããããïŒ å
¬åŒ ïŒ Polishing Layout ãããŸã§äœæããŠããã¬ã€ã¢ãŠããã¡ã€ã«ãæ¹åããŠãããŸãã Update components/layout.modle.css layout.module.cssãæ¬¡ã®ããã«å€æŽããŸãã .container { max-width: 36rem; padding: 0 1rem; margin: 3rem auto 6rem; } .header { display: flex; flex-direction: column; align-items: center; } .backToHome { margin: 3rem 0 0; } Create styles/utils.module.css styles/utils.module.cssãæ¬¡ã®ããã«äœæããŸãã .heading2Xl { font-size: 2.5rem; line-height: 1.2; font-weight: 800; letter-spacing: -0.05rem; margin: 1rem 0; } .headingXl { font-size: 2rem; line-height: 1.3; font-weight: 800; letter-spacing: -0.05rem; margin: 1rem 0; } .headingLg { font-size: 1.5rem; line-height: 1.4; margin: 1rem 0; } .headingMd { font-size: 1.2rem; line-height: 1.5; } .borderCircle { border-radius: 9999px; } .colorInherit { color: inherit; } .padding1px { padding-top: 1px; } .list { list-style: none; padding: 0; margin: 0; } .listItem { margin: 0 0 1.25rem; } .lightText { color: #666; } Update components/layout.js layout.jsãæ¬¡ã®ããã«å€æŽããŸãã import Head from 'next/head' import Image from 'next/image' import styles from './layout.module.css' import utilStyles from '../styles/utils.module.css' import Link from 'next/link' const name = 'mi-ya' export const siteTitle = 'Next.js Sample Website' export default function Layout({ children, home }) { return ( <div className={styles.container}> <Head> <link rel="icon" href="/favicon.ico" /> <meta name="description" content="Learn how to build a personal website using Next.js" /> <meta property="og:image" content={`https://og-image.vercel.app/${encodeURI(siteTitle)}.png?theme=light&md=0&fontSize=75px&images=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Ffront%2Fassets%2Fdesign%2Fnextjs-black-logo.svg`} /> <meta name="og:title" content={siteTitle} /> <meta name="twitter:card" content="summary_large_image" /> </Head> <header className={styles.header}> {home ? ( <> <Image priority src="/images/profile.jpg" className={utilStyles.borderCircle} height={144} width={144} alt={name} /> <h1 className={utilStyles.heading2Xl}>{name}</h1> </> ) : ( <> <Link href="/"> <a> <Image priority src="/images/profile.jpg" className={utilStyles.borderCircle} height={108} width={108} alt={name} /> </a> </Link> <h2 className={utilStyles.headingLg}> <Link href="/"> <a className={utilStyles.colorInherit}>{name}</a> </Link> </h2> </> )} </header> <main>{children}</main> {!home && ( <div className={styles.backToHome}> <Link href="/"> <a>â Back to home</a> </Link> </div> )} </div> ) } Update pages/index.js index.jsãæ¬¡ã®ããã«å€æŽããŸãã import Head from 'next/head' import Layout, { siteTitle } from '../components/layout' import utilStyles from '../styles/utils.module.css' export default function Home() { return ( <Layout home> <Head> <title>{siteTitle}</title> </Head> <section className={utilStyles.headingMd}> <p>[Your Self Introduction]</p> <p> (This is a sample website - youâll be building a site like this on{' '} <a href="https://nextjs.org/learn">our Next.js tutorial</a>.) </p> </section> </Layout> ) } http://localhost:3000/ ãš http://localhost:3000/posts/first-post ã«ã¢ã¯ã»ã¹ãããšãããããã¹ã¿ã€ã«ã倿Žãããããšã確èªã§ããŸããã ãŸãšã ãã®èšäºã§ã¯Next.jsã®ãã¥ãŒããªã¢ã«ãååãã£ãŠã¿ããšãããŸã§ãèšèŒããŸããã ãã£ãšReactã䜿ã£ãŠããã®ã§èšè¿°æ¹æ³ãªã©åãã§çè§£ããããã£ãã§ãããNext.jsã¯æšæºãµããŒãããŠããæ©èœãå€ããšãŠã䟿å©ãšããå°è±¡ã§ãã ããå°ãè§Šã£ãŠã¿ãŠããReactãšã®éãããŸãšããŠããããšä»åŸã®ããã®ã€ã³ãããã«ãªããããªäºæãããŸãã ãããŸã§ã®ãœãŒã¹ã¯ github ã«äžããã®ã§èå³ã®ããæ¹ã¯ãã²äžç·ã«Next.jsãšä»²è¯ããªã£ãŠãããŸãããïŒ ãŸãåŸæ¥æ®ãã®ååããã£ãŠã¿ãŠèšäºã«ããããšæããŸãã
ããã«ã¡ã¯ïŒãŠãšãã£ã³ã°ããŒã¯ã®ãšã³ãžãã¢ã®ã»ããŒã§ãã ä»åã¯ã¢ãŠããããã®èŠææèãå
æããããã«è¡ã£ããAdvent Calendar in ãã¬ã³ã¿ã€ã³ 2022ãã«ã€ããŠã話ãããŠããã ããŸãã å
ã«ãŸãšããèšããšãã¢ãŠããããã®èŠææèãæ¹åãããããã«ä»ã®ã¡ã³ããŒã®ãã¬ããžãŸã§ã€ã³ãããã§ããæé«ã®ã€ãã³ããšãªããŸããã ç®æ¬¡ ããããAdvent Calendarãšã¯ Advent Calendar in ãã¬ã³ã¿ã€ã³ 2022 ã§ãã£ãããš ãã£ãŠã¿ãŠããã£ãç¹ ãã£ãçµæ ãŸãšã ããããAdvent Calendarãšã¯ Advent Calendarã¯ã¯ãªã¹ãã¹ãŸã§ã®æ¥æ°ãã«ãŠã³ãããŠã³ããããã«äœ¿ãããŠããã«ã¬ã³ããŒã§ãã 12æ1æ¥ããã¯ããŸãã25åãããçªããæ¯æ¥1ã€ãã€éããŠäžã«å
¥ã£ãŠããå°ããªãèåããã¬ãŒã³ããæ¥œãããã®ã§ã è¿å¹Žãã®ã«ã¬ã³ããŒã«ãªãããã€ã³ã¿ãŒãããäžã«ãããŠå®ããããããŒãã«åŸãåå è
ãæã¡åãã§èªèº«ã®ããã°ããµã€ãã«èšäºãæçš¿ããäŒç»ãå€ã宿œãããŠããŸãã ããã§ãä»åã¯ãã®Advent Calendarã«ç¿ã£ãŠ1ã¶æéã®æéãçšæãã¢ãŠããããã«èŠææèã®ããã¡ã³ããŒã§ã¢ãŠãããããæ¯æ¥åºãç¶ãããšããã€ãã³ããè¡ããŸããã â»è¡ã£ãææã1/17~2/14ãšã¯ãªã¹ãã¹ãšå
šãé¢ä¿ãªãã§ãããã¢ãŠããããããããšã«æ©ããé
ãããªããšãã粟ç¥ã§èµ°ããããŸãã Advent Calendar in ãã¬ã³ã¿ã€ã³ 2022 ã§ãã£ãããš ä»åã¯ä»¥äžã®ãããªå
容ã§è¡ããŸããã 宿œæéïŒ1/17~2/14 ã¡ã³ããŒïŒã¢ãŠããããã«èª²é¡ãæããŠãã5å ã¢ãŠããããå
容ïŒãã£ã¬ã¯ã¿ãŒãã¯ãªãšã€ã¿ãŒãåŠã¹ãããšå
šè¬ ã¢ãŠããããæ¹æ³ïŒ * 瀟å
ã®ãã¬ããžããŒã¹ïŒDocBaseïŒã«æçš¿ * æ¯é±ã¢ããã³ãã«ã¬ã³ããŒããŒã ã®ããŒãã£ã³ã°ã§èªã¿åãããè¡ã 1å¶æ¥æ¥ã«ã€ã1ã€ã®ã¢ãŠãããããåºãããã£ãã®ã§ãèªå以å€ã§4人ã®ã¡ã³ããŒãéããŠ1人é±1åæçš¿ããããšã«ããŸããã éåžžæ¥åã®äžã§ã¢ãŠããããã«èª²é¡ãæããŠãããšèšã£ãŠããã¡ã³ããŒã«çŽæ¥å£°ããããŠããŒã ãçµã¿ãŸããã æ
åœãµãŒãã¹ãå
¥ç€Ÿå¹Žæ¬¡ãè·çš®ããã©ãã©ãªã¡ã³ããŒãéãŸã£ãã®ã§ãèšäºå
容ãå人åè²ã§ãšãŠãè¯ãã£ãã§ãã ãŸããé±äžã§å
±æããŒãã£ã³ã°ãèšããããšã§ãäºãã®ã¢ãŠãããããã¹ã ãŒãºã«ã€ã³ãããããããšãã§ããŸããã âŒåå ã¡ã³ã㌠ã»ããŒïŒãŠãšãã£ã³ã°ããŒã¯æ
åœãšã³ãžãã¢ã»4幎ç®ïŒ SããïŒQAæ
åœãã£ã¬ã¯ã¿ãŒã»5幎ç®ïŒ TããïŒWebã€ãæ
åœãšã³ãžãã¢ã»2幎ç®ïŒ MIããïŒãªã³ã°ã©ãæ
åœãšã³ãžãã¢ã»1幎ç®ïŒ MAããïŒãŠãšãã£ã³ã°ããŒã¯æ
åœãã£ã¬ã¯ã¿ãŒã»1幎ç®ïŒ ãã£ãŠã¿ãŠããã£ãç¹ ããŒã ã§è¡ãããšã§ãããªããã°ãšããæ°æã¡ãèœçãã èªåãããã§ãããå人ã§ã¢ãŠãããããããããšæã£ãŠãäžã
è¡åã«ç§»ãããšãã§ããªããã®ããšæããŸãã çç±ãšããŠã¯ã¢ãŠããããã¯ã€ã³ããããããã®ã誰ãã«äŒããããã«æŽçããæéãšåŽåãå¿
èŠã ããã ãšæããŸãã éçºãé²ãããšã€ã³ãããã¯ã§ããŠãã¢ãŠããããã®å·¥æ°ç¢ºä¿ãã§ãããåŸåãã«ãªã£ãŠããŸããŸãã ããããä»åããŒã æŠã«ããããšã§ä»ã®äººããã£ãŠãããèªåããããªããã°ãšããè¯ã責任æãçãŸããŸããã ã¢ãŠãããããè©äŸ¡ããŠããããã¢ãããŒã·ã§ã³ãåäžãã å人ã§ã¢ãŠãããããè¡ãªã£ãŠããŠãè©äŸ¡ãèŠããªãããšãå€ã
ãããŸãã ãããªããšãã¢ãŠããããããã¢ãããŒã·ã§ã³ãäžãããã¢ãŠããããããããšããæ°æã¡ãæžã£ãŠãããŸãã ããã§ãä»åã¯ïŒé±éã«äžåºŠéãŸã£ãŠãæçš¿ããèšäºãèªã¿åãå ŽãèšããŸããã ãã®çµæããäºãã®èšäºå
容ãç¥ãããšã§ããã ãã§ãªããè€ãåãããšã§ã¢ãããŒã·ã§ã³åäžã«ãç¹ãããŸããã èªåã®äžã§çãŸããŠããã¢ãŠããããã®æ·å±
ã®é«ããäžãããã è¥æã«ããããã€ãŸãããã€ã³ããšããŠã¢ãŠããããã®è³ªã«åããããããŠçºä¿¡ãã§ããªããªã£ãŠããŸãããšããããŸãã ããã§ä»åã¯ïŒé±éãã«1ã€ãšããæéãèšããããšã§ã¢ãŠããããããç¿æ
£ãã€ããæèãããŸããã ãã®çµæãã¢ãŠããããã®å®¹éãæŽã¿ãã¢ãŠããããããããç°å¢ãçãŸããŸããã ãã£ãçµæ Advent Calendarãããåãšãã£ãåŸã§ã¢ãŠããããã®ã¹ãã«ã¯å€§ããæ¹åããããšãã§ããŸããã ãŸãèŠæãæããŠããã¡ã³ããŒå
šå¡ããã£ãŠããã£ãã»æ¬¡åãåå ããããšåçããŠããã£ãã®ã§ ãšãŠãè¯ãã€ãã³ãã«ã§ããã®ã§ã¯ãªãããšæããŸãã ãŸãšã åœåAdvent Calendar in ãã¬ã³ã¿ã€ã³ 2022ã¯ã¢ãŠããããã®èŠææèãããŒã ã§æ¹åã§ããã°ãšæãè¡ããŸãããã çµæãšããŠèŠææèæ¹åã ãã§ã¯ãªããä»ã®ã¡ã³ããŒã®ãã¬ããžãŸã§ã€ã³ãããã§ããæé«ã®ã€ãã³ãã«ãªã£ãããšæããŸãã ã¢ãŠããããã¯çžæã«é©åãªå
容ãäŒãããããèªåã®äžã§çè§£ãããå¿
èŠããããŸãã ãã®ãããã€ã³ãããããã ãã®ç¶æ
ããããã£ãããšããçè§£ã«ç¹ããã®ã§ã ãã®èšäºãèªãã§èå³ãæã£ãäººã¯æ¯é詊ããŠãã ããïŒ
ããã«ã¡ã¯ãçµå©æèŒªã»å©çŽæèŒªã®ã¯ãã³ããµã€ããRingraphãã§ãšã³ãžãã¢ãããŠããããŒïŒ @__south__373 ïŒã§ãã å
æ¥ãããããçŽäžå¹ŽãããŠåãçµãã§ããRingraphã·ã¹ãã ã®ããŒãããããäœæããã®ã§ãå
容ã®å®£èšãšå
±ã«ã©ããã£ãŠäœãäžããã®ã玹ä»ããããšæããŸãã Ringraphãæ²ããŠããåèšè æ¬é¡ã«å
¥ãåã«ãä»åã®ããŒãããããæ±ºãã倿ææã®äžã€ãšãªã£ããããŒã ãæ²ããŠããåèšèãã玹ä»ãããŠãã ããã Ringraphã§ã¯”æèŒªæ¢ãã®ã代åè©ãã«ãªã”ãšããæçŸ©ç®æšãæ²ããŠæ¥ã
ãµãŒãã¹éçšãããŠããŸãããããªãµã€ãã«è²ãŠãŠãããããéçºããŒã ã§ã¯åèšèãæ±ºããŠããŸãã ãµããã®äžæ©ç®ã«ã¯ã¯ã¯ã¯ã æèŒªæ¢ãã¯ããããçµå©ããããçµå©ã決ããã«ããã«ãæåã®äžæ©ç®ãèžã¿åºãã€ãã³ãã§ãããããªã€ãã³ããæãåºã«æ®ãçŽ æµãªãã®ãšãªããããæ¥œããããããããªããæèŒªãæ¢ãããããªãæäŒããããããšããæ³ãã蟌ããŠããŸãã ãªãããŒãããããäœãããšæã£ãã ããŠããããããæ¬é¡ã§ãã ãšã³ãžãã¢ã¯éåžžã®éçšéçºããããšå
±ã«æè¡çãªææŠãæ±ããããŸããæè¡çãªæ¹åãæ°ããåãçµã¿ã¯ç¹ã«æ¹éããã£ãããã§ã¯ãªãããšã³ãžãã¢èªèº«ããã®ãµã€ãã«å¿
èŠã ãšæãããšããã€ææŠããŠã¿ããããšããªã¹ãã¢ãããã3ã¶æããšã«åãçµããã®ã決ãããšããããæ¹ãããŠããŸããã ãã®éçšã§å幎ã»ã©é²ããŠãã£ãäžã§ãåŸã
ã«ããæãã倧ãããªã£ãŠãããŸãããäºæ¥ãšããŠã¯å¹Žéåäœã§èšç»ãç«ãŠãŠããã«å¯Ÿãéæã®ããã»ã¹ãèããŠããã®ã«ãæè¡ã®é¢ã«é¢ããŠã¯å°ãè¡ãåœããã°ã£ãããªæãããããªãšã ããã§äžåºŠã·ã¹ãã é¢ã§ã幎éã®ããŒãããããäœã£ãŠã¿ãããšããææ¡ãäºæ¥è²¬ä»»è
ã«ãããšããå¿«ãæ¿è«ŸããŠããããŸããã é²ãæ¹ 1. äœã«æ³šåãããæ±ºãã ãŸãã¯ããšããšãªã¹ãã¢ããããŠããããããããšãªã¹ãã®äžããããµã€ããšããŠãã£ãŠããã¹ãåªå
床ãé«ããã®ãããã¯ã¢ããããããšã«ããŸããã ãã¬ãŒã ã¯ãŒã¯ã®äžæ°ãæ°ããæè¡å°å
¥ãªã©è²ã
ãããŸããããæ®æ®µã®éçšã®äžã§ããµã€ãã®é床ããã³ãã³èª²é¡ã«äžãã£ãŠããããšãããµããã®äžæ©ç®ã«ã¯ã¯ã¯ã¯ãããå¶ããŠããããã«ãé床æ¹åã¯æ¬è
°ãå
¥ããå¿
èŠããããšæããããšããé床æ¹åã«æ³šåããããšããããšã¯ããã«æ±ºãŸããŸããã 2. ãŸãã¯çŸç¶ææ¡ æ¹åã®ç®æšã決ãããããNew Relicã§çŸç¶ææ¡ãè¡ããŸããã ãµã€ãã®è¡šç€ºã¯2-3ç§ãæãŸãããšããèšãããŸãããããã€ãã®ããŒãžã§ãã®ææšãè¶
ããŠããããšãããããŸããã æ¬¡ã«ããµãŒããŒãµã€ããšããã³ããšã³ãã«ããã£ãŠããæéãããããåºããã©ã®ãã§ãŒãºãã©ããããæ¹åããå¿
èŠãããã®ããæ°å€åããŸããã 3. ã©ãããã°éæã§ããããã¬ã¹ã æ°å€åããŠã¿ããšããããµãŒããŒãµã€ããçŽ50%ãããã³ããšã³ããçŽ28%åãå¿
èŠãããããã§ããã ããšããšãªã¹ãã¢ããããŠããæ¹åé
ç®ãLighthouseã®ææäºé
ãªã©ãåèã«ããµãŒããŒãµã€ããšããã³ããšã³ãã§ãããããªããšãããããæŽãåºããå·¥æ°ãåºããäžã§ã©ããªé çªã§çæããŠããããæ±ºããŸããã 4. é¢ä¿è
ãšå£æã¡ 2å²å
±æã倧äºã ãšããèšããŸãããã¯ãããŠãã£ãŠã¿ãããšã ã£ãã®ã§é »ç¹ã«äºæ¥è²¬ä»»è
ã«å
±æããããšãæèããæ¹åæ§ããºã¬ãŠããªãããšã確èªããªããé²ããŸããã ãã¬ã¹ãã®æ®µéã§ã¯ããšã³ãžãã¢ãããŒãžã£ãŒãäžç·ã«éçºãããŠããã¡ã³ããŒã«å
±æãããŠã¢ããã€ã¹ãããã ããŠããŸããããã®çµæãæçµçã«çŽäžå¹ŽéãããŠãããªããšãããããã§ããå·¥æ°ãã ãããšããæ®µéã§ã¹ã ãŒãºã«å
容æ¿è«Ÿãããã ãããšæã£ãŠããŸãã 5. èªããŒã ãå
šç€Ÿãšã³ãžãã¢ã«å
±æ æåŸã«ã決ããå
容ãå¶æ¥ãå«ããããŒã ã®ã¡ã³ããŒãšå
šç€Ÿãšã³ãžãã¢ã«åããŠå
±æããŸããã 宣èšããããšã§æåŸ
å€ãäžãã£ãŠå¿æŽããŠããã人ãå¢ãããããããªããšãã§ããããããªãããšãããµããŒããããã ãããè¯ãããšãããªããªãšæã£ãããã§ããããšã¯çŽç²ã«èªåãžãã¬ãã·ã£ãŒããããããã§ããããŸãã ãã£ãŠã¿ãŠ åã
ãããããããšæã£ãŠããé床æ¹åã ã£ãã®ã§ãããæ°ããéçºã«å·¥æ°ãå²ãããšãå€ããªããªãçæããã®ãé£ããé åã§ããã ä»åãäºæ¥ã¡ãªãããšã絡ããŠä»ã³ãããããŠããã¹ããšããèªèãæŠãåãããããããšã§ã泚åãããžã§ã¯ããšããŠåãçµãããšã決ãŸããŸããã æ¡çšããã ããããšãå¬ããåé¢ããããããã¹ã¿ãŒãã§ãããçŸæç¹ã§æ§æ³ããŠããæ¹åã ãã§ã¯ããããéæãé£ãããšæããŠããŸãããããžã§ã¯ããé²ããŠããäžã§ãå
容ããã©ãã·ã¥ã¢ããããªããéæãŸã§é 匵ã£ãŠãããããšæããŸãã ãããã« ãŠãšãã£ã³ã°ããŒã¯ã§ã¯ãäžç·ã«æè¡ã®ãŠãšãã£ã³ã°ããŒã¯ãåµã£ãŠããã ãã仲éïŒãšã³ãžãã¢ïŒãåéããŠããŸãã èå³ã®ããæ¹ã¯ãã²äžåºŠæ°è»œã«ã話ãã§ãããå¬ããã§ãïŒ ãã¯ãªãšã€ã¿ãŒãºå€§è§£åããšã³ãžãã¢ç·š https://www.wantedly.com/companies/weddingpark/post_articles/349428
ããã«ã¡ã¯ïŒåæ®ããªã©çµå©åçã®æ®åœ±ã¹ã¿ãžãªã»ãµãã³ãæ€çŽ¢ã§ããæ
å ±ãµã€ãã Photorait ãã®ã¡ã€ã³ãã¶ã€ããŒãããŠããŸããããããïŒ @PANbooooo ïŒã§ãã 2020幎ã®10æãã1幎éããã¢ãŠãããããæèããããšããããšãå¿ãããŠãå€éšãžã®çºä¿¡çãé²ããŠããŸãããä»åã¯ããã®1幎éã§ã®åŠã³ãåŸããã®ãªã©ã玹ä»ããããšæããŸãã ã¯ãªãšã€ã¿ãŒã®ã¢ãŠããããã®åèã«ãªãã°å¹žãã§ãã ã¢ãŠãããããæèããçç± ãªã¢ãŒãã¯ãŒã¯ãšããåãæ¹ã«ãªã£ãŠãããããŒã ã¡ã³ããŒãä»éšçœ²ã®æ¹ãä»ç€Ÿã®åæ¥è
ã®æ¹ã«èªåèªèº«ãèµ·ãããã¢ã¯ã·ã§ã³ãç¥ã£ãŠãããå Žãå°ãªããªã£ããšæããŸãããå®éã«ãããã¶ã€ããŒã£ãŠäœããã£ãŠããã®ïŒããšãã声ãèãããšãå€ããªããŸãããããã®ãŸãŸã§ã¯ãããªãïŒèªåèªèº«ãã©ãã©ãã¢ããŒã«ããªããšïŒããšèããç§ã¯ãèªå·±ã¢ããŒã«ã®ããã«ãã¢ãŠãããããããŠããããšã決ããŸããã ã¢ãŠããããã®ããã«åãçµãã ããš ãŸããã¢ãŠãããããå¿ãããŠãããã©ããªãµãã«ã¢ãŠãããããããŠããã®ãã䜿ãããŒã«ããã®é »åºŠãªã©ã®è©³çްã«ã€ããŠæ±ºããŠãããŸããã ãããŠãèªåã«3ã€ã®ã«ãŒã«ã課ããŸããã ㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠ã»Qã«1æ¬ãã¯ãªãšã€ã¿ãŒããã°ã«èšäºãæçš¿ãã ãçµæâ1幎ã§5æ¬æçš¿ ã»Qã«1åãLTäŒã«ç»å£è
ãšããŠåå ãã ãçµæâ1幎ã§6åç»å£ ã»æã«2æ¬ã瀟å
æ
å ±å
±æããŒã«ã«ãã¬ããžãæçš¿ãã ãçµæâ1幎ã§32æ¬æçš¿ ㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠㌠LTäŒã«ã€ããŠã¯ãæ¯é±æææ¥ã« connpass ã§å匷äŒãã€ãã³ããæ¢ããèªåèªèº«ãç»å£ã§ããããªã€ãã³ãããã£ãããç³ã蟌ã¿ãããããã«ããŸãããããã§ã¯ãå¢ããããšãŠã倧äºã ãšæããç»å£å
å®¹ãæ±ºãŸã£ãŠããªããŠãããšããããç³ã蟌ã¿ãã¿ã³ã ãã¯ãã®å Žã§æŒãããã«ããŠããŸããã ãããã£ãŠãç»å£ããªããšãããªãç°å¢ããèªãäœããèªåã§èªåã远ã蟌ãããšã§ãæ¯ãè¿ãã°ãã®1幎ã§6åã»ã©ç»å£ããããŠããã ããŸããã ã¢ãŠãããããæèããŠåŸãããš ã¢ãŠãããããæèããŠãããã£ã1幎ã§ãããåŸããã®ã¯ãšãŠãå€ãã£ãã§ãã ãã®äžã§ãç¹ã«æãã3ã€ã®ãåŸãããšãã玹ä»ããããšæããŸãã ïŒïŒç©äºãžã®çè§£ãããã«æ·±ããªã ç»å£è³æã®äœææãããã°ãžã®å·çæã«ããã©ãããŠããæãã®ãïŒããããªããã®äœæ¥ãããã®ãïŒããªã©ãèªåèªèº«ã®è¡åãæ³ãã«ã€ããŠçåãæããçããå°ããä»è
ãžããããããäŒããããã®ãæ
å ±ãã«å€æããŠããããšã§ãç©äºãžã®çè§£ãããã«æ·±ããªã£ãŠãããèŠéãåºããäºãã§ããŸããã ïŒïŒè²ã
ãªäººãããã£ãŒãããã¯ãããããããã«ãªã£ã LTäŒã§ã¯ãèªå·±æµã®ãã¶ã€ã³ã®å匷æ³ãããéçºã®ãŠã©è©±ããããŒã ã§ãããªã£ãã¯ãŒã¯ããªã©ãæ§ã
ãªå
容ã®ãã®ãåã€ãã³ãã§çºè¡šãããŠããã ããŸããããä»ã®åå è
ã®æ¹ããããã®ã¯ãŒã¯ããã£ãšãããããšé¢çœããã§ããããããããããããã£ãŠå€ããã®ããããã§ããããªã©ã®ãæ°ããªèŠç¹ã§ã®ãã£ãŒãããã¯ãé ãäºãããããããå匷ã«ãªããŸããã ïŒïŒåµã£ããã®ãç¥ã£ãŠãããæ©äŒãå¢ãã ããã¯å¿
ç¶çãªããšã§ãããèªåèªèº«ãéçºã«æºãã£ããµãŒãã¹ãªã©ã«ã€ããŠãå€éšãžã©ãã©ãã¢ãŠãããããããããšã§ãç¥ã£ãŠãããæ©äŒãå¢ããŸãããç¹ã«ãLTäŒãžã®åå ã¯ãã®å¹æã倧ããèŠãããLTäŒã§ç»å£ãããŠããã ããåŸã«Twitterã§ã€ãã³ãã®ããã·ã¥ã¿ã°ãæ€çŽ¢ãããšããPhotorait䜿ã£ãããšãããŸããããä»åºŠäœ¿ã£ãŠèŠããïŒããªã©ã®å¬ãããèšèãé ãäºãåºæ¥ããµãŒãã¹ã®å®£äŒã«ãç¹ãã£ããšæããŸãã ãããã« ä»åŸããã¢ãŠãããããæèããããšããããšã¯å¿ããã€ã€ãã¢ãŠããããã®åœ¢ãå€ããŠãããªããããŸãããã«æ°ãããã®ãåŸãããã°ãšæããŸãã ãŸãããã®1幎ã«åå ããLTäŒãªã©ã¯ä»ç€Ÿã®ã€ãã³ãã®ãã®ãã»ãšãã©ã§ãã£ããããèªåãã¡ã§LTäŒãéããã¢ãŠããããã®å Žãã©ãã©ããšäœã£ãŠãããã°ãšæããŸãã
ããã«ã¡ã¯ãSRE ãšã³ãžãã¢ã®ç¶¿åŒã§ãã ä»å㯠Amazon GuardDuty ãåãäžããããšæããŸãïŒ åŒç€Ÿã§ã GuardDuty ã¯å°å
¥ããŠããã®ã§ããåŠäœãã確èªãåå«ã«ãªããã¡ã§ããã ããã§ä»å以äžãèšäºã«ããããšæããŸãïŒ GuardDuty ã®æŠèŠ æ€ç¥çµæã Slack ã«éç¥ããæ¹æ³ åããããªæ©ã¿ãæ±ããŠããæ¹ã®åèã«ãªãã°å¹žãã§ãã å ã¿ã«å¯Ÿè±¡ã®æ¹ã¯ä»¥äžã®ãããªæ¹ã§ããããã GuardDuty ãæå¹ã«ããŠãããæ¯åãããŒãžã¡ã³ãã³ã³ãœãŒã«ãã確èªããŠãã or æŸçœ®ããŠããŸã£ãŠãã GuardDuty ããŸã 䜿çšããŠããªã Amazon GuardDuty ãšã¯ Amazon GuardDuty 㯠AWS ç°å¢ã AWS ã¢ã«ãŠã³ãã«å¯Ÿããäžæ£ãªåäœãæ»æãæ€ç¥ããŠãããè
åšæ€åºãµãŒãã¹ã§ãã ç¹åŸŽãç°¡åã«ãŸãšãããšä»¥äžã§ãã 以äžã®ãã°ãªã©ãååŸã»åæããŠæ»æãšæãããæäœãæ€ç¥ããŠããã AWS CloudTrail ã€ãã³ããã° Amazon VPC ãããŒãã° DNS ãã° ãã°ã®åæã«ã¯æ©æ¢°åŠç¿ãçšããŠãã äœ¿çšæ¹æ³ã¯ãããžã¡ã³ãã³ã³ãœãŒã«ãã GuardDuty ãéã æå¹å ããã ã æ©æ¢°åŠç¿ãçšããŠéåžžæãšã¯ç°ãªãæåããæ»æãè
åšãæ€ç¥ããŠããããªããŠçŽ æµãªãµãŒãã¹ã§ããã 詊ãã«ã©ããªæ
å ±ãæ€ç¥ããã®ããæ€èšŒçšã® AWS ã¢ã«ãŠã³ããäœæããŠç¢ºèªããŠã¿ãŸããã è²ã
æ€åºããŠãããã®ã§ããããã®äžäŸã以äžã§ãã Amazon S3 ãããã¯ãããªãã¯ã¢ã¯ã»ã¹ã®ç¡å¹å EC2 ãžã® ãã«ãŒããã©ãŒã¹ã¢ã¿ã㯠IAMUser ããã€ããšéã API ãçºè¡ãã S3 ã EC2 ãIAM ãªã©æ§ã
ãªãµãŒãã¹ã§æªããåããæ€ç¥ããŠãããé Œãã«ãªãããã§ãã æé ç¶ã㊠æé ã§ããã以äžã¯æ±äº¬ãªãŒãžã§ã³ã®æéã«ãªããŸãã AWS CloudTrail 管çã€ãã³ãåæ 4.72 USD/100äžã€ãã³ã AWS CloudTrail S3 ããŒã¿ã€ãã³ãåæ – æåã® 5 åã€ãã³ã/æ : 1.04 USD/100äžã€ãã³ã – 次㮠45 åã€ãã³ã/æ : 0.52 USD/100äžã€ãã³ã – 50 åãè¶
ããã€ãã³ã/æ : 0.26 USD/100äžã€ãã³ã VPC ãããŒãã°ãš DNS ãã°åæ – æåã® 500 GB/æ : 1.18 USD/GB – 次㮠2000 GB/æ : 0.59 USD/GB – 次㮠7,500 GB/æ : 0.29 USD/GB – 10,000 GB/æãè¶
ããå Žå : 0.17 USD/GB æéã¯ã€ãã³ãæ°ã䜿çšéã«ããã®ã§å°ããããã¥ããã§ãããã ãã¶å®ãéé¡ã«ãªã£ãŠãããŸãã GuardDuty ã®æ€ç¥çµæã Slack ã«éç¥ãã Slack éç¥ã«ã¯ä»¥äžã®ãµãŒãã¹ã䜿çšããŸãã GuardDuty CloudWatch Events SNS ChatbotïŒå¯Ÿè±¡ã® Slack ã¢ã«ãŠã³ããšé£æºæžã¿ã®æ³å®ïŒ IAM Role Slack SNSã»Chatbotã»IAM Role ã«é¢ããŠã¯ CloudFormation ã§äœæããŸãã ã€ã¡ãŒãžã¯ãã®ãããªåœ¢ã§ãã å°ãSNS ãããã¯ã® ãµãã¹ã¯ãªãã·ã§ã³ ã«ã¯ Chatbot ã ãã§ãªããã¡ãŒã«ãéä¿¡ããããã«èšå®ãå
¥ããŠãããŸãã ã§ã¯æ©éèšå®ãããŠãããŸãããã Slack ã®ãã£ã³ãã«ID ãš ã¯ãŒã¯ã¹ããŒã¹ID ãååŸãã ãŸã㯠Slack ã®ãã£ã³ãã«ãäœæããŸããæ¢åã®ãã£ã³ãã«ã«éç¥ãããå Žåã¯æ°èŠã®äœæã¯äžèŠã§ãã ãã£ã³ãã«åã¯ä»»æã§ãããç§ã¯ [# note-aws-guardduty] ã«ããŸããã æ¬¡ã« Slack ã® [Slackãã£ã³ãã«ID] ãšÂ [ã¯ãŒã¯ã¹ããŒã¹ID] ãååŸããŸããããã¯CloudFormation ã«ãŠ Chatbot ãäœæããå¿
èŠã«ãªããŸãã ç¢ºèªæ¹æ³ãšããŠã¯ä»¥äžã§ãã Slackãã£ã³ãã«ID Slack ã®ã¢ããªãèµ·å éç¥ããããã£ã³ãã«ã® [Copy link] ãã¯ãªã㯠貌ãä»ãçµæã® /archives/ ã®åŸã®æååããã£ã³ãã«ID https://XXXXXXX.slack.com/archives/YYYYYYYYYY   â ãã® Y ã®éšå ã¯ãŒã¯ã¹ããŒã¹ID AWS ãããžã¡ã³ãã³ã³ãœãŒã«ãã Chatbot ãéžæ [æ¥ç¶æžã¿ã¯ã©ã€ã¢ã³ã] ã® Slack ã¢ã«ãŠã³ããéžæ [ã¯ãŒã¯ã¹ããŒã¹ã®è©³çް] ã«èšèŒ CloudFormation ã«ãŠ SNSã»Chatbotã»IAM ããŒã«ãäœæã»èšå®ãã ç¶ã㊠SNS ãããã¯ã»Chatbotã»Chatbot ã«ä»äžãã IAM ããŒã«ã CloudFormation ã§äœæã»èšå®ããŸãã 以äžã CloudFormation ã® yaml ãã¡ã€ã«ã§ãã AWSTemplateFormatVersion: "2010-09-09" Description: GuardDuty to Slack # Slack ã®ã¯ãŒã¯ã¹ããŒã¹IDãšSlackãã£ã³ãã«IDãå
¥å # Slack ã®ã¯ãŒã¯ã¹ããŒã¹ã¯äºåã«äœæããŠãã Parameters: TargetWorkspaceId: Type: String Default: XXXXXXXXX # å
ã»ã©ååŸããã¯ãŒã¯ã¹ããŒã¹IDãèšèŒ TargetChannelId: Description: "note-aws-guardduty" Type: String AllowedValues: - "XXXXXXXXXXX" # å
ã»ã©ååŸãã Slackãã£ã³ãã«ID ãèšèŒ Resources: # GuardDutyçšã®SNSãããã¯ã®äœæ GuardDutyForChatbotTopic: Type: AWS::SNS::Topic Properties: TopicName: GuardDuty-for-Chatbot-topic Subscription: - Endpoint: XXX@XXXXXXXXXXXX # éç¥ãåãããã¡ãŒã«ã¢ãã¬ã¹ãèšèŒ Protocol: email # GuardDutyçšã®Chatbotã®äœæ ChatbotForGuardDuty: Type: AWS::Chatbot::SlackChannelConfiguration Properties: ConfigurationName: GuardDutyAlertChannel IamRoleArn: !GetAtt ChatbotIamRole.Arn LoggingLevel: INFO SlackChannelId: !Ref TargetChannelId SlackWorkspaceId: !Ref TargetWorkspaceId SnsTopicArns: - !Ref GuardDutyForChatbotTopic ChatbotIamRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: chatbot.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: chatbot-iam-policy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - cloudwatch:Describe* - cloudwatch:Get* - cloudwatch:List* Resource: - "*" CloudWatch Events ãèšå®ãã æåŸã« CloudWatch Events ãèšå®ããŠãGuardDuty ãš SNS ã飿ºããŸãã ãããžã¡ã³ãã³ã³ãœãŒã«ãã CloudWatch ãéžæãã[ã€ãã³ã] â [ã«ãŒã«] â [ã«ãŒã«ã®äœæ] ãã¯ãªãã¯ããŸãã ã«ãŒã«ã®äœæã§ã¯ä»¥äžã®é
ç®ãå
¥åããŠãããŸãã ã€ãã³ããœãŒã¹ : ã€ãã³ããã¿ãŒã³ ãµãŒãã¹ : GuardDuty ã€ãã³ãã¿ã€ã : GuardDuty Finding ã¿ãŒã²ãã : SNS ããã㯠ããã㯠: GuardDuty-for-Chatbot-topicïŒå
ã»ã©ã® CloudFormation ã§äœæïŒ ããã§å
šãŠã®èšå®ãå®äºããŸããã GuardDuty ã§ç°åžžãæ€ç¥ãããšä»¥äžã®ããã« Slack ãšã¡ãŒã«ãéç¥ãããŸãã æåŸã« ä»å㯠GuardDuty ã®æ€ç¥çµæã Slack ã«éç¥ããæ¹æ³ãèšèŒããŸããã GuardDuty ãå«ã Config ã CloudTrail ãªã©ã»ãã¥ãªãã£ç³»ã®ãµãŒãã¹ã¯å³æãã§ãã¯ãããã®ã§ãã§ããã°ãã£ããã«é£ã°ããããšããæããããã£ãŠã¿ãŸããããäžæããã£ãŠããã£ãã§ãã æ¬¡ã¯ä»ã®ã»ãã¥ãªãã£ç³»ã®ãµãŒãã¹ã§ã®ãã£ãã飿ºãšãterraform ã§ã®äœæãªã©ããã£ãŠãããããšæããŸãã
ããã«ã¡ã¯ããšã³ãžãã¢ã®ãªãã§ãã 仿¥ã¯æ®æ®µã®ãä»äºã«ã€ããŠã玹ä»ãããããšæããŸãã ãã®åã«ããŸãã¯ç°¡åã«èªå·±ç޹ä»ããããŠããã ããŸãã ç§ã¯2015å¹Žã«æ°åã§ãŠãšãã£ã³ã°ããŒã¯ã«å
¥ç€ŸãããŸãããå
¥ç€Ÿãã2020幎9æãŸã§ã¯ã çµå©æºåã¯ãã³ãæ
å ±ãµã€ã ã ãŠãšãã£ã³ã°ããŒã¯ ã ã®ãµãŒãã¹éçºã«æºããããã®åŸæ°èŠäºæ¥ã® ãã©ããŠãšãã£ã³ã°ã®æ±ºãæãèŠã€ããã¯ãã³ããµã€ã ã Photorait ã ã®éçºãæ
åœããŠãããŸãã å€§èŠæš¡ãªãµã€ãéçºã®ãããšã³ãžãã¢ã®äººæ°ãå€ãæ
åœé åããã£ããåãããŠãããŠãšãã£ã³ã°ããŒã¯ã®çµç¹ãšãç«ã¡äžãããã®æ¥ãæµ
ããšã³ãžãã¢æ°åã§æç¢ºãªæ
åœåããããŠããªããã©ãã¬ã€ãã®çµç¹ãçµéšããŸããã çµç¹èŠæš¡ã®éããµãŒãã¹éçºã«æºãã£ãçµéšãèžãŸããŠãä»åã¯äž»ã«æ°èŠäºæ¥ã§ãããã©ãã¬ã€ãã®ãµãŒãã¹éçºã®ã玹ä»ãããããŸãã ã©ããªãä»äºããŠãïŒ ãŸããäžçªã¡ã€ã³ã®æ¥åã§ããéçºã«ã€ããŠã玹ä»ããŸãã ç§ã¯ãäž»ã«ãã©ãã¬ã€ãã®èªç€Ÿåºåååã®æ°èŠéçºãæ
åœããŠããŸãã èªç€Ÿåºåãšã¯ããµã€ãå
ã«ãããŒçãé
ä¿¡ã§ããçŽåºåãæ²èŒå
容ããããªããã«èŠããããšãåºæ¥ããªãã·ã§ã³ååã®ããšãæããŸãã ç§ãæè¿éçºããååã¯ããã®ãªãã·ã§ã³ååã®ã²ãšã€ããã ãããã€ã©ã€ããã§ãã ãã©ãã¬ã€ãã§ã¯ããã©ãã¹ã¿ãžãªãæ€çŽ¢ããéã«ãšãªã¢çµã蟌ã¿ã ãã§ãªããæ§ã
ãªãã ããã§ãçµã蟌ãäºãå¯èœã§ãã ãã ããã®äŸãšããŠã¯ããæµ·ã§æ®åœ±åºæ¥ãããããã¿ããã£ãã©ã³ãããããªã©ã§ãã ä»åã®ååã¯ããã ããã§æ€çŽ¢ããéã«ããã®æ€çŽ¢æ¡ä»¶ã«æ²¿ã£ãæ
å ±ãå
šé¢ã«åºããå°çšããŒãžãžèªå°ãããŠãŒã¶ãŒã欲ããæ
å ±ãããã«å±ããããšãã§ããããšãã£ãå
容ã«ãªã£ãŠããŸããããšãã°ãã¹ã¿ãžãªã§æ®åœ±ãããããéžæãããšãæ€çŽ¢ç»é¢ããéžæããã¹ã¿ãžãªã®æ
å ±ããŒãžã¯ãã¹ã¿ãžãªã§æ®åœ±ãããåçããã¹ã¿ãžãªã§æ®åœ±ããã®ã«ãŽã£ãããªãã©ã³ãç¹éãããããŒãžãžé·ç§»ã§ããããšããããšã§ãã åãã ããããšã«ããã©ãã¹ã¿ãžãªããããããããããæ
å ±ãå
¥çš¿ã§ãã管çç»é¢ãéçºããããã衚瀺ãããæ€çŽ¢ç»é¢çãéçºããŸããã ãã®ãããªååãã€ããéçšã§ã¯ãããã°ã©ã ãæžãã ãã§ãªããã£ã¬ã¯ã¿ãŒãå¶æ¥ã¡ã³ããŒãšäžç·ã«ãèªç€Ÿåºåã®æ°èŠååãæ©èœã¢ããããŒãã®ã¢ã€ãã£ã¢åºãã«ãåå ããŸãã ãã®ã¢ã€ãã£ã¢åºãã«ãšã³ãžãã¢ãåå ããããšã§ãã絶察ã«ãã®ååã¯ãŠãŒã¶ãŒãã¯ã©ã€ã¢ã³ãã«åãã§ããããããšç¢ºä¿¡ãæãŠãååã¥ãããã§ããã®ã§ãéçºãã¢ãããŒã·ã§ã³é«ããããããæã£ãŠãæ©ãå±ãããããšããæ°æã¡ã§åãçµãããšãã§ããŸãã éçºä»¥å€ã§ã¯ãã©ããªããšããŠãïŒ éçºä»¥å€ã§ã¯ãç§ã¯çµç¹ã¥ããã®åãçµã¿ãããŠããããšãå€ãã§ãã ã©ããããããžã§ã³ã«çã£çŽãçªãé²ãã匷ãçµç¹ã«ãªãããïŒãããããæã£ãŠããžãã£ãã«åããç°å¢ãäœãã«ã¯ïŒã³ãã¥ãã±ãŒã·ã§ã³ãåæ»ã«ãšããé¢ä¿æ§ãç¯ãã«ã¯äœãå¿
èŠãïŒããããªããšãè°è«ããŠã¢ã¯ã·ã§ã³ããä»äºã奜ãã§ããã äŸãã°ã ã»éšçœ²ã®çµç¹èª²é¡ãã¡ã³ããŒãåœäºè
æèãæã£ãŠè§£æ±ºããããããããããŒãžã£ãŒããšããããã·ã§ã³ ã»ãã©ãã¬ã€ãã®æªæ¥ãã€ããã ã€ãPäŒè° ãã®éå¶ ãªã©ãéšçœ²ãããŒã ã®çµç¹ã¥ããã«ã¯ç©æ¥µçã«åå ããŠããŸãã ã©ããªãšãã«ãããããæããïŒ ãä»äºç޹ä»ã®äžã§ãå°ãã玹ä»ããŸãããããã¯ããŠãŒã¶ãŒãæ¥çã®æ¹ã
ã«åœ¹ã«ç«ãŠãç¬éãäžçªå¬ããããããããæããç¬éã§ãã å°æ°ã®ããŒã ã ãããããå¶æ¥ã¡ã³ããŒãšã¯é »ç¹ã«ã³ãã¥ãã±ãŒã·ã§ã³ããšãæ©äŒããããŸããã¯ã©ã€ã¢ã³ããã©ããªèª²é¡ãæ±ããŠããã®ããã©ããªæ©èœããã£ããå¬ãããããã®ãããªæ
å ±ãéäžæããŠãããããšãåºæ¥ãŸãããããªèª²é¡ã«ããšã³ãžãã¢ãšããŠååéçºã§æºãããæ©èœããªãªãŒã¹ããŠãçµæãåºãŠããããšãã«ã¯ããšãŠãå¬ããã§ãã ããšã¯ã身è¿ãªå人ãèªåã®æºãããµãŒãã¹ã䜿ã£ãŠãããŠããã®ãå¬ããã§ãããåŒå ŽïŒãŸãã¯ãã©ãã¹ã¿ãžãªïŒãæ¢ããŠããã ãã©ãããã©ãããªïŒããšããçžè«ã§éã£ãŠãããURLããŠãšãã£ã³ã°ããŒã¯ããã©ãã¬ã€ããšããããšããããããŸãããããã£ãŠãç§ã®äŒç€Ÿãšç¥ããªãå人ãèªç¶ãšäœ¿ã£ãŠãããŠãããšãããç¥ããšããã£ãŠãŠè¯ãã£ããªãšæããŸãã ä»åŸãã£ã¬ã³ãžãããããš ãµãŒãã¹éçºã®ããäžæµå·¥çšã«æºãã£ãŠãããããšæã£ãŠããŸãã ïŒå¹Žåããçµå©ãããã£ãšå¹žãã«ããããããšããçµå¶ç念ã«å
±æããŠãå
¥ç€Ÿã決ããŸããããããžã®æãã¯åžžã«åŒ·ãæã£ãŠããŸãã 䟡å€èŠ³ãæ¥ã
å€åãç¶ããç¶æ³ã®äžã§ããçµå©ããè±ãã§å¹žããªç¬éã§æº¢ãç¶ããããã«ã¯ãå€åãæããã«ä»å¿
èŠãšããããçµå©ãã®åœ¢ãæ¢ãç¶ããããšã倧åã ãšæããŸãããµãŒãã¹ã¥ãããéããŠã幞ããªçµå©ã远æ±ããããšã§ç€ŸäŒã«è²¢ç®ããŠããããã§ãã
ãŠãšãã£ã³ã°ããŒã¯ã®ã¡ãã£ã¢éå¶ããŒã ã§ãããŒãžã£ãŒãããŠããå°å±±ã§ãã ãã®èšäºã§ã¯ç§ã®çµéšãããŠãšãã£ã³ã°ããŒã¯ã®ãããŒãžã£ãŒã®ä»äºãããããã倧åã«ããŠããããšãäž»ã«åŠçã®æ¹ã«åããŠç޹ä»ããããšæããŸãïŒ ãããã£ãŒã« 2014å¹Žã«æ°åãšã³ãžãã¢2æçãšããŠãŠãšãã£ã³ã°ããŒã¯ã«å
¥ç€ŸãããµãŒããŒãµã€ããšã³ãžãã¢ãšããŠãWedding Parkãã®åºåååã®ã¢ããããŒããã«ããã«åãã®ã³ã³ãã³ãéçºãå§åйãµã€ãã®éå¶ãªã©å¹
åºãæ
åœããæ©äŒã«æµãŸããŸããïŒ çµç¹ã¥ãããã¡ã³ããŒã®æé·ãéããŠããŒã ã®æè¡åãé«ããäºæ¥ãæ¥çã«è²¢ç®ããããšèãå
¥ç€Ÿ3幎ç®ãããããŒãžã£ãŒã«åœ¹å²ãå€ãããçŽ5幎çµéããŸããã ã©ããªåœ¹å²ïŒ ãŠãšãã£ã³ã°ããŒã¯ã®ãšã³ãžãã¢ãããŒãžã£ãŒã®åœ¹å²ã¯ ããããã¯ããšäººã«åãåããçµç¹ææãæå€§åãããã ããšã ãšèããŠããŸãã ãšã³ãžãã¢ãããŒãžã£ãŒã®åœ¹å²ç¯å²ã¯äŒç€Ÿã«ãã£ãŠæ§ã
ã ãšæããŸããã ãŠãšãã£ã³ã°ããŒã¯ã§ã¯ããšã³ãžãã¢ãªã³ã°ããããã¯ãã®ãããžã¡ã³ããšåæã«çµç¹ã¥ããã«è²¢ç®ããããšãæ±ããããŸãã èªåãã¡ãã€ãããããã¯ããžã®æçãæãŠã人ãã人ãã奜ããªäººã«ã¯ãã£ãŠããã®åœ¹å²ã§ãïŒ éçºãããŒãžã£ãŒãšããŠã®åœ¹å² æŠç¥ã¥ãã äžé·æçãªæè¡æŠç¥ããããã¯ãã®ããŒãžã§ã³ã¢ãããä¿å®ãªã©ãæè¡ã«ãŸã€ããæ§ã
ãªæŠç¥ç«æ¡ãå®è¡ã®ãã¡ã·ãªããŒããè¡ããŸãã äŸãã°ã泚åæè¡ãå®ããšã³ãžãã¢ã¡ã³ããŒå
šå¡ã§æšé²ããæŠç¥ãç«ãŠãããšãããªã³ãã¬ãã¹ã§éçšããŠãããããã¯ãã®AWSç§»è¡ãªã©ãå®çŸããŸããã ãŸããã¿ããªã®èãæ¹ãäžèŽãããŠæè¡æšé²ãå éãããããã«è¡åæéã¥ãããªã©ã®åãçµã¿ãè¡ã£ãŠããŸãã ãŠãšãã£ã³ã°ããŒã¯ã®ã¯ãªãšã€ã¿ãŒã倧åã«ãããããšïœãŠãšãã£ã³ã°ããŒã¯ã®ãã³ããïœnote ããŒãã«ãããžã¡ã³ã ãšã³ãžãã¢ã®ã¿ããªãæå€§éã«èœåãçºæ®ã§ããç°å¢ãã€ããããã«1on1ã§ã³ã³ãã£ã·ã§ã³ã®ç¢ºèªããã£ãªã¢ããžã§ã³ã®ããåãããªã©ãè¡ããŸãã 匷ã¿ã䌞ã°ãããšãåºæ¬çãªèãæ¹ãšããŠã掻èºã®å Žãã¢ã¬ã³ãžãããææãããããããå
šç€Ÿã«äŒãã工倫ãèããŠå®è¡ããŸãã ãããžã§ã¯ããããžã¡ã³ã ãŠãšãã£ã³ã°ããŒã¯ã§ã¯å¹Žæ¬¡ã圹è·ã«é¢ä¿ãªã圹å²ã«é©ããã¡ã³ããŒããããžã§ã¯ããããžã¡ã³ããæ
åœããŠããŸããã ãšã³ãžãã¢ãããŒãžã£ãŒã¯æè¡å°å
¥ããªãã¬ã€ã¹ãªã©ã®ãããžã§ã¯ãã®æšé²åœ¹ãæ
ãããšãå€ããããŸãã ãšã³ãžãã¢ãšããŠã®å®è£
çµéšãåºã«ã¡ã³ããŒãšæé©ãªãã©ã³ãæ§ç¯ããªãããããžã§ã¯ããæåã«å°ããŸãã å
šç€ŸãããŒãžã£ãŒãšããŠã®åœ¹å² 掻æ§å ããžã§ã³ã«ããã£ãŠã¿ããªãã€ãã€ããšæŽ»èºã§ããç°å¢ãäœãããã«æ
åœããŒã 以å€ã®ããšã«ãç®ãé
ãçµç¹ã«ã«ãã£ãŒã®æµžéãå³ããŸãã ãŠãšãã£ã³ã°ããŒã¯ã§ã¯å
šç€ŸãéãŸãã€ãã³ããå€ããããŸããããã®å Žã®éå¶ãè¡ãããšããããŸãã ããŒããã¥ãŒã§çµç¹ã¥ãããããæèã倧åã§ãã æ¡çš æ°åã»äžéæ¡çšã«ãç©æ¥µçã«é¢ãããŸãã äŒç€Ÿå
šäœã§èªåãã¡ã®ä»²éã¯èªåãã¡ã§éãããšããæåãããã®ã§ããšã³ãžãã¢ã®ã¿ããªã«ãååãããŠããããªããæªæ¥ã®ãŠãšãã£ã³ã°ããŒã¯ãäžç·ã«åµã£ãŠããããã·ã§ã³ãšããŠåãå
¥ããŠããŸãã èªåãæ¡çšã«é¢ãã£ãã¡ã³ããŒãå
¥ç€ŸåŸæŽ»èºããŠããå§¿ãèŠãã®ããšãŠãå¬ããç¬éã§ãïŒ å€§åã«ããŠããããš ãšã³ãžãã¢ãªã³ã°ã§äºæ¥ææãæå€§åãããããã«ããã©ã€ãã«æ¥çã®çè§£ã瀟å
ã®ä»ã®è·çš®ã®æŽ»åãçè§£ããããšããšãŠã倧åã§ãã æ§ã
ãªæ¹é¢ã«é¢å¿ãæã£ãŠæè¡ã®æŽ»ããæ¹ãææ¡ã§ãã人æã«ãªããããšèããŠããŸãã ããã²ãšã€åŒ·ãæèããŠããã®ã¯ããããŒãžã£ãŒã¯ãããŸã§ã圹å²ã§ãããšããããšã ãããŒãžã£ãŒæ¥åã®æ§è³ªäžãã®ããšã®åªå
é æ±ºããè©äŸ¡ãªã©ãããã€ãã®æš©éãå§è²ãããŠããŸãã ããã¯ãã¡ã³ããŒãè¯ãä»äºãããããã®æå©ãããçç£æ§ãäžããä»çµã¿ãæŽããããã«äœ¿ãã¹ãã§ãããšããããšã絶察ã«å¿ããŠã¯ãããªããšèããŠããŸãã ããããã»ããããã ãããã¯ããéããŠãã©ã€ãã«æ¥çã«è²¢ç®ãã人ã
ã®å¹žããåµã£ãŠããéçºã®ä»äºã¯ãšãŠãå
宿ããããŸãã ã¡ã€ã³äºæ¥ã§ããçµå©æºåã¯ãã³ãæ
å ±ãµã€ããWedding Parkãã¯10幎以äžéå¶ããŠãããwebã¡ãã£ã¢ãšããŠã¯ããªãã®æŽå²ããããŸãã æŽå²ããå€§èŠæš¡ãµãŒãã¹ããšã³ãžãã¢ãªã³ã°ã§å®ããªããé²åãããŠããããšã DXãAIãããã°ããŒã¿æŽ»çšã®ãããªæ°èŠæ§ã®é«ãæè¡ã§æ¥çã«ã€ãããŒã·ã§ã³ãèµ·ãããŠããããšãã²ãšãã®åã§ã¯çµ¶å¯Ÿã«ãªãåŸãªãããšãããžã§ã³ã«å
±æãã仲éãšäžç·ã«ã«ã±ã¶ã³ã§å®çŸããŠãããããŒãžã£ãŒã®ä»äºã¯æ¯æ¥ãšãŠãåºæ¿çã§ãã ããããŒãžã£ãŒãšèããšæè¡ãšè·é¢ãã§ããã®ã§ã¯ïŒã ãšæãæ¹ãå€ããšæããŸããããããªããšã¯ãªããšèããŠããŸãã 確ãã«ãããŒãžã£ãŒã«æ±ããããä»äºã¯éçºä»¥å€ã«ãå€å²ã«ããããããèªãæãåããæéã¯ç©ççã«æžãããšã«ãªããŸãã ãããã§ãã·ã§ãã«ãªã¡ã³ããŒãšäžç·ã«æŠç¥ãèãå®è¡ããéçšã§å€ãã®æè¡çã€ã³ãããããããŸãã ç§èªèº«ãäžç·ã«ä»äºãããããã¯ãªãŒãïŒæè¡éžå®ãæè¡æšé²ãããŒã ã®æè¡åºäžããªã©ãè¡ã£ãŠããšã³ãžãã¢ïŒãšæè¡æŠç¥ãèããäžã§çºèŠãããç¥èãçµ¶ããã¢ããããŒããããŠããã£ãŠããŸãã ããæè¡ãèŠãŠãããããã§ãã·ã§ãã«ãšãããçµç¹ãèŠãŠãããããŒãžã£ãŒãäžæå²©ã§ä»äºãããããšã§ãæè¡æŽ»çšã®ã¢ã€ãã£ã¢ã åºããæ°ãã䟡å€ãçã¿ã ããã¯ãã§ãã ãããŒãžã£ãŒãšããŠã¯ãŸã ãŸã ä¿®è¡ãå¿
èŠãªèº«ã§ãããã¿ããªã§åç£ç¢ç£šããªããçµç¹ãå人ãæé·ãããŠãããããšæããŸãïŒïŒ
ã¯ãããŸããŠããšã³ãžãã¢ã®ããã§ãã 仿¥ã¯ãŠãšãã£ã³ã°ããŒã¯ãæäŸããŠããã¯ã©ã€ã¢ã³ãåãããŒã«ãéçºãããšã³ãžãã¢ã®ä»äºå
容ã玹ä»ããããšæããŸãã ãŸãåã®èªå·±ç޹ä»ããããŠããã ããŸãã åã¯2017å¹Žã«æ°åã§ãŠãšãã£ã³ã°ããŒã¯ã«å
¥ç€ŸããŸãããå
¥ç€ŸããŠããè±å«ã®ããã®çµå©åŒæºåã¬ããŒã ãããã¬ãã ããªã³ã©ã€ã³æ¥å®¢æ¯æŽããŒã« ããã§ã¢ã€ã onlineã ã®éçºã«æºããã2021幎2æããDXæšé²å®€ãžãžã§ã€ã³ãã AIããããŒã©ãŒ ã®éçºãéçºãªãŒããŒãšããŠæ
åœããŸããã 仿¥ã¯AIããããŒã©ãŒã®0â1éçºã§èªèº«ãåããŠéçºããŒã ãçœåŒããçµéšã«ã€ããŠç޹ä»ããŸãã®ã§ãããããããŒã éçºãå§ãã人ã®åèã«ãªãã°å¬ããã§ãã æ®æ®µã®æ¥åã«ã€ã㊠ãŸãã¯ããã«åãæå±ããŠããDXæšé²å®€ã«ã€ããŠè»œã玹ä»ãããŠããã ããŸããDXæšé²å®€ã¯ãŠãšãã£ã³ã°äŒæ¥ã®DXæ¯æŽåŒ·åãç®çã«2020幎ã«èšç«ãããéšçœ²ã«ãªã£ãŠããã2021幎7æã«AIããããŒã©ãŒãšãããµãŒãã¹ããªãªãŒã¹ããããŸããã DXæšé²å®€ã§ã®ãšã³ãžãã¢ã®æ¥åã¯AIããããŒã©ãŒã®éçšéçºãç£èŠãã¡ã€ã³ãªã®ã§ãããããã ãã§ã¯ãããŸããã ã€ã³ãã©ç°å¢ã®æè¡æ¹åãæè¡ãã£ããã¢ãããããMTGïŒæ¯é±ïŒ éšçœ²ã®ç®æšãå
šäœé²æã確èªããMTGïŒæ¯é±ïŒ éçºã®é²æç¢ºèªãéçºèª²é¡ã«ã€ããŠè°è«ããMTGïŒæ¯æ¥ïŒ DXæ¥çã«ã€ããŠã©ã³ãæéã䜿ã£ãŠãã£ããã¢ããããäŒïŒäžå®æïŒ è·ç𮿷·åã®æ°æ©èœææ¡å宿ïŒäžå®æïŒ ãªã©ãæè¡çãªææŠãDXæ¥çã®ãã£ããã¢ãããããŠãããã³ãã¥ãã±ãŒã·ã§ã³ã掻çºãªéšçœ²ã«ãªã£ãŠããŸãã âå
æ¥ã®åå®¿ã®æ§å éçšéçºã§ã¯AIããããŒã©ãŒãžã®æ©èœè¿œå ãè¡ã£ãããã䜿ãããããã¶ã€ã³ãžå€æŽããããªã©ãããŠããã®ã§ãããããã¯å®éã«ã¯ã©ã€ã¢ã³ãããããã ãã声ãããšã«ãªã£ãŠããéšåãããããããã¯ã©ã€ã¢ã³ãã«ããè¯ããã®ãå±ãããããšããæ³ãã§éçºã«èšãããšãã§ããŸãã 0â1éçºã§ããŒã ãçœåŒããããã«ãã£ãããš å
±éã®éçºã«ãŒã«ã®èšå® ããã§ã¯éçºãªãŒããŒãšããŠéçºãé²ããã«ããã£ãŠã©ããªå·¥å€«ããããã«ã€ããŠè©±ãããããšæããŸãã 工倫ããç¹1ã€ç®ã¯éçºã«ãŒã«ãåãã«æ±ºããããšã§ãã AIããããŒã©ãŒã®éçºããŒã ã¯åã®ä»ã«ããšã³ãžãã¢ãè€æ°ããŸããããŠãšãã£ã³ã°ããŒã¯ãµã€ãã®éçºã§ããã°ãã§ã«ããã³ãŒããåèã«ããããšãã§ããã®ã§ãããä»åã¯0â1éçºã ã£ãããåèã«ãããã®ããªãããŸããåãããéçºã¡ã³ããŒå
šå¡ãéçºæ¹éã«ã€ããŠåãèªèãããŠããããã§ã¯ãããŸããã§ããã ããã§éçºã«çæããåã«ãããŒã ã§å®è£
æ¹éã«ã€ããŠãã£ã¹ã«ãã·ã§ã³ããæéãäœãã«ãŒã«ã決ããŸãããããããããšã§å®è£
ã«çæããŠããã¡ã³ããŒããšã®å®è£
ãéãããšãã£ãããšããªãã¹ã ãŒãºãªéçºã«ã€ãªãã£ããšæããŸãããŸãããã®ãã¡ã€ã«ã倿Žãããå
±æãããã³ãŒãã¬ãã¥ãŒäŸé Œã¯ãã®åäœã§åºããªã©éçºã®é²ãæ¹ã«ã€ããŠã決ããããšãã§ããã®ã§ãèªèãããã¬ãã¥ã¢ãŒã®è² æ
ã倧ãããªã£ãããšããããšãèµ·ããã«é²ããããŸããã âéçºã«ãŒã«ã®äžéš å
šäœã®éçºã«é¢ããå®è£
ã¯åªå
床ãäžãèªåã§å¯Ÿå¿ 工倫ããç¹2ã€ç®ã¯éçºå
šäœã«åœ±é¿ããã¿ã¹ã¯ãç©æ¥µçã«å¯Ÿå¿ããããšã§ããAIããããŒã©ãŒã§ã¯Dockerã䜿ã£ãéçºãããŠãããããŒã¿ããŒã¹æ§ç¯ãããŒã¿ã®çæãLaravelã®æ©èœã䜿ã£ãŠç°¡åã«ã§ããããã«ããŠããŸããããããéçºèŠæš¡ã倧ããã£ããããéäžã§ããŒãã«æ§é ãDockerfileã®èšå®å€æŽãªã©äºå®å€ã®ã¿ã¹ã¯ãçºçããããšããããŸããããããã£ãã¿ã¹ã¯ã®åªå
床ãäžããéçºãªãŒããŒã®åã察å¿ããããšã§ãä»ã®ã¡ã³ããŒã®éçºã¹ã±ãžã¥ãŒã«ã«ãªãã¹ã圱é¿ãäžããã«ããµãŒãã¹å
šäœãã©ããã£ãç¶æ
ã«ãªã£ãŠããã®ããåžžã«ææ¡ããªããé²ããããšãã§ãããšæããŸãã ã¡ã³ããŒãšã®1on1ã宿œ 工倫ããç¹3ã€ç®ã¯ãšã³ãžãã¢ã¡ã³ããŒãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãå¢ããéçºãã©ããŒã培åºããããšã§ããéçºåœæã¯å
šå¡ãã«ãªã¢ãŒãã§ã®å€åã ã£ããããã¡ã³ããŒãä»äœãããŠããŠã©ããªç¶æ³ãªã®ãããªãã©ã€ã³ã§ä»äºããããšãã«æ¯ã¹ãŠèŠãã¥ããç¶æ
ã§ããããŸãä»ååããŠäžç·ã«ä»äºãããã¡ã³ããŒããããããã³ãã¥ãã±ãŒã·ã§ã³ãåãã«ããã®ã§ã¯ãªãããšããæžå¿µããããŸãããããã§æ¯æ¥å®æœããŠããããŒã å
šäœã®MTG以å€ã«ã1察1ã®MTGãæ¯æ¥èšå®ããã©ããªäºçްãªããšã§ãæ°ã«ãªãããšããªãããåžãäžããããã«ããŸããããããçµæçã«å®è£
ã®çžè«ãé²æç¢ºèªã ãã§ãªãããã£ããã§èããã©ããæ©ãã¬ãã«ã®è³ªåãæŸãããšãã§ããããªã©ãæ³å®ä»¥äžã«å¹æçã§ããã ããããã«ã€ã㊠ãããããæããã®ã¯ã¯ã©ã€ã¢ã³ãããã®å¬ãã声ããã£ãŒãããã¯ããŠããã£ããšãã§ããDXæšé²å®€ã¯å¶æ¥ãµã€ããšéçºãµã€ãã®è·é¢ããšãŠãè¿ãé±1å以äžMTGãããŠãããã¯ã©ã€ã¢ã³ãããã©ããã£ã声ãããã ãããå
±æããã ããŠããŸããAIããããŒã©ãŒãå¥çŽããŠãã ãã£ãçç±ãå®éã«åºã广ãèããšãäœã£ãŠããã£ããªãšæããŸãããããããã®å±ã¿ã«ããªããŸãã ãŸãæè¡çã«ããããåŠã³ãããããšãé
åã®1ã€ã ãšæããŸããåã¯ä»ãŸã§Dockerã䜿ã£ãéçºãæªçµéšã§ãAWSã®ç°å¢èšå®ãããæ©äŒããããŸããã§ãããã§ããAIããããŒã©ãŒã®éçºãéããŠãéçºç°å¢ã®æ§ç¯ãããããã«Dockerã®ãã£ããã¢ããããããAWSèšå®ã¯ã€ã³ãã©ãšã³ãžãã¢ãšé£æºãããŠæããŠããã ããããšããããã®ããšãåŠã¶ããšãã§ããä»ã§ã¯æ¹åã®ææ¡ãªã©ãè¡ã£ãŠããŸãã ä»åŸãã£ã¬ã³ãžãããããš ããè¯ããã®ãå±ããããã®æè¡ãšã¢ã€ãã¢ã®åŒãåºããå¢ããããã§ãã AIããããŒã©ãŒã¯éçšãã§ãŒãºã«å
¥ã£ãŠãããä»åŸã¯ãã£ãšäœ¿ããããããããã®æ©èœã远å ããããå©çšããŠãã ãã£ãã¯ã©ã€ã¢ã³ãããé ããæèŠãããšã«æ¹ä¿®ãããŠããäºå®ã§ãããããã£ãæ¹ä¿®ã®ãªãã§ããã©ã¹ã¢ã«ãã¡ã®äŸ¡å€ãåµé ãå°ãã§ãã¯ã©ã€ã¢ã³ãã®èª²é¡è§£æ±ºã«ç¹ããããšããDXæšé²å®€ã®ãšã³ãžãã¢ã®åœ¹ç®ã ãšæããŸãããã®ããã«ã¯æŠåšã«ãªãæè¡åããã£ãããšèº«ã«ä»ãããŠãšãã£ã³ã°æ¥çãšDXæ¥çã«åžžã«ã¢ã³ããã匵ã£ãŠåãçµã¿ããã§ãã
ããã«ã¡ã¯ïŒãŠãšãã£ã³ã°ããŒã¯æ°å1幎ç®ãšã³ãžãã¢ã®ããã§ãã ä»åã¯ãç ä¿®ã®é倧æãšããŠåãçµãã 瀟å
ã¢ããã°æœçã®ã·ã¹ãã åãéããŠåŠãã ããšã工倫ããããšãä»åŸã®èª²é¡ãšæããããšããŸãšããããšæããŸãã ãšã³ãžãã¢ãšããŠã®æè¡ãšãããããã¯ãããŒã ã®äžå¡ãšããŠéçºã«åãçµãã§ã®æãããŸãšããŠããã®ã§ãããããããŒã éçºãè¡ãå€ãã®æ¹ã«èŠãŠé ããå
容ã«ãªã£ãŠããããšæããŸãã ç®æ¬¡ åãçµãã æœçã«ã€ã㊠èŠåŽãããã€ã³ã æè¡ã®ãã ãããã€ã³ã è¯ãã£ããã€ã³ã æ¹åãã€ã³ã ã·ã¹ãã åãéããŠå€§ããæé·ã§ãããã€ã³ã åãçµãã æœçã«ã€ã㊠ãŸãã¯ä»åã·ã¹ãã åã«è³ã£ãèæ¯ãšãã®ç€Ÿå
æœçã«ã€ããŠã§ããä»åã·ã¹ãã åãã瀟å
æœçã¯ãã·ã£ããã«åº§åžããšãããã®ã§ããããã·ã£ããã«åº§åžããšã¯åºç€Ÿæã®ç€Ÿå
掻æ§åã®ããã«ææ¡ããããã®ã§ãæ¯æåºç€Ÿããã座ãåžãããåŒãã§æ±ºãããšããå
容ã§ãã å®éã«ãã·ã£ããã«åº§åžããå°å
¥ããŠããæ®æ®µã¯é¢ããããšã®å°ãªã瀟å¡ã®æ¹ãã¡ãšåžãè¿ããªãããšã§ã³ãã¥ãã±ãŒã·ã§ã³ã®æŽ»æ§åãèµ·ãã£ãäžæ¹ã§ããããçŽã§äœã£ãŠããããã管çãé£ããããšãã課é¡ãããããããã解決ãã¹ãç§éãã·ã¹ãã åã«åãçµã¿ãŸããã ã·ã¹ãã åã®ã¡ã³ããŒæ§æã¯ãã£ã¬ã¯ã¿ãŒã1人ããã¶ã€ããŒã2人ããšã³ãžãã¢ã1人ãšããæ®æ®µã®éçºã§ã¯çµéšããããšãããŸããªããã¶ã€ããŒ2äººæ§æãšãªã£ãŠããŸããã èŠåŽãããã€ã³ã ãã®1ïŒã¹ã±ãžã¥ãŒã«èª¿æŽ ãªãã¹ãã¡ã³ããŒã®ç©ºãæéãã§ããªãããã«ãéçºã¹ã±ãžã¥ãŒã«ãæ·ãã®ããšãŠãé£ããã£ãã§ãããšã³ãžãã¢1人ããã¶ã€ããŒ2人ãšããæ§æã ã£ãã®ã§ã圹å²åæ
ãšè² æ
ã®å
Œãåããèããã®ã«ãšãŠãé ã䜿ããŸãããæçµçã«ããã£ã¬ã¯ã¿ãŒãäžå¿ãšãªã£ãŠãã¯ãªãã£ã«ã«ãã¹ãå
ã«3ãã¿ãŒã³ã®ã¹ã±ãžã¥ãŒã«ãäœããŸãããããã®ã¿ã€ãã³ã°ã§ãããŸã§é²ãã§ãªãã£ããéããã¿ãŒã³ã®ã¹ã±ãžã¥ãŒã«ã«åãæ¿ããããšãã£ãããã«èšæ©å¿å€ã«å¯Ÿå¿ã§ããã¹ã±ãžã¥ãŒã«ã決ããããã®ã¯ã¹ã±ãžã¥ãŒã«éãã®ãªãªãŒã¹ãã§ãã倧ããªèŠå ã ãšæããŸãã ãã®2ïŒã¢ããªã±ãŒã·ã§ã³åŽã®ç°å¢èšå® æ®æ®µã®æ¹ä¿®æ¡ä»¶ã§ã¯ãªããªãè§Šãããšã®ã§ããªãããŒã¿ããŒã¹æ¥ç¶ã®èšå®ãSentryå°å
¥ã®èšå®ãã¡ãŒã«éä¿¡ã®èšå®ãªã©ç¥èãæµ
ãã£ãããå
茩ã«èŽããªãã1æ©é²ãã§ã¯ç«ã¡æ¢ãŸããšããã®ãéçºåºç€ã§ã¯ç¹°ãè¿ããŠããŸããã質åããã床ã«äžå¯§ã«æããŠãããå
茩ãããŠããããããã§ç¡äºèšå®ãããããšãã§ããã®ã§æ¬åœã«æè¬ããŠããŸãããŸããèªåã§èšå®ãè¡ãããšã§èšå®åšãã®ãã¡ã€ã«ã®çè§£ãæ·±ãŸã£ãã®ã¯èŠåŽããŠããã£ããã€ã³ãã§ããã æè¡ã®ãã ãããã€ã³ã ãã®1ïŒéåæåŠçãäžå䜿ããªãã£ãããš éåæåŠçã䜿ã£ãã»ããæ
å ±ã®ãªã¢ã«ã¿ã€ã æ§ãå®çŸã§ãããšããã¡ãªããã¯ãã£ãäžæ¹ã§ããã®å®è£
æ
åœãJavaScriptãåããŠè§Šããã¶ã€ããŒã«ä»»ããæ±ºæãããŠããã®ã§ããªãã¹ãJavaScriptã§ã®å®è£
è² æ
ã軜ãããææ®µãéžã³ãŸããããŸããã·ã¹ãã ãå©çšã§ããã®ã瀟å
ã«é
眮ããŠãã1å°ã®ã¿ãã¬ããã®ã¿ãšããããšã仿§ã§æ±ºãŸã£ãŠããã®ã§ãããŒã¿ã®å·®åãèµ·ãã«ããç¶æ³ã ã£ãã®ãéåæåŠçã䜿ããªãéžæãããçç±ã«ãªããŸãã éåæåŠçã䜿ããªãåã1床ã®ãªã¯ãšã¹ãã§ååŸããæ
å ±éãå¢ããã®ã§Laravelã§ããŒã¿ããŒã¹ããããŒã¿ãååŸããéã«Eager Loadingã䜿çšããããšããŒã¿ååŸã«æããè² æ
ãæå°éã«æããããã«ããã®ããã ããã®1ã€ã§ãã ãã®2ïŒããŒã¿ããŒã¹ã«ä¿åããããåŒãçµæã14æ¥ã§åé€ããããã«ããããš ããåŒãçµæã¯æ¯æ¥ããŒã¿ããŒã¹ã«ä¿åãããŠããããã«ãããããå¢ããã°å¢ããã»ã©ããŒã¿ååŸãžã®åœ±é¿ãåºãŠããŸãå¯èœæ§ããããŸããããããªããªãããã«ãããåŠçã«ãã£ãŠããåŒãçµæã宿çã«åé€ããå®è£
ãè¡ããŸããã ä¿åããæ¥æ°ã14æ¥ã«ããã®ã¯ã³ãããŠã€ã«ã¹ã®ææå€å¥ã«ãããæ¥æ°ã14æ¥ã§ãããããäžãäžç€Ÿå
ã§éœæ§åå¿ãåºãéã®æ¥è§Šã®ææšã«ã§ããããã«ãããã£ãã®ãçç±ã«ãªããŸããïŒãã¡ããå
茩ããã®ã¢ããã€ã¹ãã£ãŠã®ãã ããã§ãããæ¬åœã«ããããšãããããŸããïŒ è¯ãã£ããã€ã³ã ãã®1ïŒéçºã¿ã¹ã¯ãå®è£
ã€ã¡ãŒãžãã§ããç²åºŠãŸã§çްååããããš èªåãåŠçãé ã§ã€ã¡ãŒãžã§ããç²åºŠãŸã§èœãšã蟌ãã§ã¿ã¹ã¯ãæŽãåºããããšã§ãå®è£
åãã倧äœã®æµããã€ã¡ãŒãžããŠããããããšãã§ããŸããããŸããã¿ã¹ã¯ã®ç²åºŠãå°ãããªã£ãããšã§å·¥æ°ã®èŠç©ãããããããã£ãã®ãè¯ãã£ããã€ã³ãã§ãããå ããŠããã¶ã€ããŒã«ãé¡ãããJavaScriptåšããã¿ã¹ã¯ã现ååããŠããããšã§åããŠã§ããã£ããã¢ãããããããã£ããšèšã£ãŠããããã®ãå¬ããã£ãã§ãã ãã®2ïŒã³ãŒãã¬ãã¥ãŒã®äºåäŸé Œãããããã«ããããš ä»åã®éçºã§ã¯4人ã®å
茩æ¹ã«ã³ãŒãã¬ãã¥ãŒã®æ©äŒãããã ããŠãããããé©åãªã¿ã€ãã³ã°ã§æéãããããããã¹ã±ãžã¥ãŒã«é²è¡ã®ã«ã®ã§ããããŸããããã®ãããã³ãŒãã¬ãã¥ãŒäŸé Œæ¥ã®ç®éãç«ã£ããããã€ãŸã§ã«äŸé Œãã§ããã°åžææ¥ãŸã§ã«èŠãŠããããããå
茩æ¹ã«äºåã«ç¢ºèªããããšã§ãã¿ã¹ã¯ã®åªå
床ã調æŽããªããéçºãé²ããããšãã§ããŸããããããã¹ã±ãžã¥ãŒã«éãã«ãªãªãŒã¹ã§ãã1ã€ã®èŠå ã ãšæã£ãŠããŸãã èŠæ¹åãã€ã³ã ãã®1ïŒèšèšã¬ãã¥ãŒã®è³ªãæªãã£ã 0â1ã®éçºã§ãã£ãã«ãããããããèšèšã¬ãã¥ãŒã«æã£ãŠããéã«æç« ãšèšèã®ã¿ã§èª¬æããããšããŠããŸããããã®çµæãåŠçã®æµããéèŠãã€ã³ãã®èª¬æãããŸãã§ãããå
茩ã®çè§£åã«ããã¶ã«ã ã£ãç¶æ
ã®èšèšã¬ãã¥ãŒãããŠããŸããŸããããŸãããã®ãšãã¯èšèšã¬ãã¥ãŒã®æ¬è³ªãçè§£ããŠãããããå®è£
ããåã«éããªããã°ãããªãéãã®ããã«æã£ãŠããŠãå€ãªç·åŒµãããŠããŸããããã£ãšå®è£
ã«ãããäžå®ç¹ãäžæç¢ºãªç¹ã®çžè«ãæ¹åæ§ãééã£ãŠããªããã®ãã£ã¹ã«ãã·ã§ã³ãããå ŽãšããŠã®æèãæã£ãŠè¡ãã¹ãã ã£ããªãšä»ã§ã¯æã£ãŠããŸãããŸãã説æãããéããããŒãã£ãŒããã·ãŒã±ã³ã¹å³ãªã©ãçšããèŠèŠçãªèª¬æãããã¹ãã ã£ããªãšãä»ã§ã¯æã£ãŠããŸãã ãã®2ïŒã¿ã¹ã¯ã®åãæž¡ãæã®ããåãããã§ããŠããªãã£ã ãªãªãŒã¹åŸãã¹ãã®éã«1ã€hotfix察å¿ãããã®ã§ãããä¿®æ£ã®åå ããã¶ã€ããŒãäœæããŠãããã¢ãã¯ã¢ãããVIEWãã¡ã€ã«ã«åæ ããéã®å岿Œãã§ãããããã¯ãã¶ã€ããŒãšã®ããåããããã£ããåºæ¥ãŠããã°é²ããããšã§ãããããã¯ãšã³ãžãã¢ãšãã¶ã€ããŒéã ãã«ãšã©ãŸãããå®è£
æ¹æ³ãå€ãã£ããšãã«æ°ãã«ãã¹ãé
ç®ãšããŠè¿œå ããå¿
èŠããªããããã£ã¬ã¯ã¿ãŒãšããåãããæãããã ããããŒã ã§éçºãããŠãã以äžãå
šå¡ã§èªèãããåãããŠããå¿
èŠãããããšã身ã«ãã¿ãŠå®æããŸãããä»åã¯æåŸã®ãã¹ãã§æ°ãã€ããããè¯ãã£ããã®ã®ãããæ°ã¥ããŠããªãã£ãããšæããšãŸããšããŠããŸããããããã¯ä»åã®ãããªç€Ÿå
ã·ã¹ãã ã ãã§ã¯ãªããäžã®äžãã¹ãŠã®äººã«äœ¿ã£ãŠãããã¡ãã£ã¢ã«æºããã®ã§ããã®å€±æãèžã«ããŒã ã§ã®èªèåãããäžå¯§ã«è¡ã£ãŠããããšæããŸãã ã·ã¹ãã åãéããŠå€§ããæé·ã§ãããã€ã³ã æåŸã«ãä»åã®ã·ã¹ãã åãéããŠå€§ããæé·ã§ãããã€ã³ãã§ããããå ±é£çžããšãã¿ã¹ã¯ã®çްååãã ãšèªåã§ã¯æã£ãŠããŸãã ãå ±é£çžã ããã¯ãã£ãšãšã³ãžãã¢ä»¥å€ã®æ¹ã«ãéããããšã ãšæããŸãããé¢ãã人éã®ãå ±é£çžãã€ãŸãã鲿ãå€åãæå³ãåžžã«å
±æã§ããŠããã®ãããšããã®ã¯çµç¹ã§ä»äºãããŠããã«ããã£ãŠéèŠã§ãããä»äºã®ã¹ããŒãã«ã倧ããé¢ãã£ãŠãããšæã£ãŠããŸããå®éãä»åããŒã éã§é²æãå€åã®å ±é£çžãã§ããŠããªããã°ãèšæ©å¿å€ãªã¹ã±ãžã¥ãŒã«å€æŽãã§ããŠããªãã£ããšæããŸãããå
茩ãžã®ã³ãŒãã¬ãã¥ãŒäºåäŸé Œããªãã£ããã¹ã±ãžã¥ãŒã«éãã§ãªãªãŒã¹ãã§ããŠããªãã£ããšæã£ãŠããŸããåœããåã ããã©ç€ŸäŒäººãšããŠå¿
èŠäžå¯æ¬ ãªãã®å ±é£çžãã·ã¹ãã åããšãããŠåŠã³ã以åãããã§ããããã«ãªã£ãããšã¯å€§ããªæé·ã®1ã€ã§ããã ãã¿ã¹ã¯ã®çްååã å®ã¯ããã®ã·ã¹ãã åãããåã®ç ä¿®ã§éçºã¿ã¹ã¯ã®çްååãã§ããŠããããçŽåŸã®è¡ãçµæãåŸãããªããŠæããæããããèæ¯ããããŸããããã®èŠãæãããã£ãã®ã§ãä»åã¯çްãããããšèšãããããã现ããã¿ã¹ã¯ãåå²ãããæ¡ã®å®éçºããšãŠããããããã£ãã§ãããŸãã现ããã¿ã¹ã¯ã现ååããããšã§å®è£
ã€ã¡ãŒãžãã€ãã«ããéšåãããããããã®çžè«ãå
茩ã«äºãããŠãããšãã£ãããšã«ãã€ãªãã£ãã®ã§ãç ä¿®åã®èªåããããããšãŠã倧ããªæé·ã ãšæã£ãŠããŸããä»åŸã®å®æ¥åã«ãããŠã现ããã ããšèšãããããã现ååãè¡ã£ãŠäžå¯§ãªéçºãããŠãããããšæããŸãã æåŸã« ä»åã®ã·ã¹ãã åãç¡äºå®éã§ããã®ã¯äžç·ã«é²ããåæ3人ãšå«ãªé¡ã²ãšã€ããäœã§ãæããŠãããå
茩æ¹ãããŠãããããã ãšæ¹ããŠæããŠããŸããããŒã ã§1ã€ã®ãã®ã宿ãããåã³ã宿¥åã«å
¥ãåã«å®æã§ããã®ã¯èªåã«ãšã£ãŠããšãŠã倧ããªè²¡ç£ã«ãªããŸãããããããã¯ããŒã ãŠãšãã£ã³ã°ããŒã¯ãšããŠåã¡ãã£ã¢ã®çºå±ã«è²¢ç®ããå
šç€Ÿã§ãã®æåãå³ãããããã«æ¥ã
å°œåããŠãããããšæããŸããæ¬åœã«ããããšãããããŸããã â»ä»åã®ã·ã¹ãã åã«ãã£ããã«åãçµãã ãã¶ã€ããŒããŸãå¥ã®èŠç¹ã§ãã®ã·ã¹ãã åã«ã€ããŠã® èšäº ãèŒããŠããã®ã§ãèå³ãããæ¹ã¯ãã²ã芧ãã ããïŒ
ããã«ã¡ã¯ããŠãšãã£ã³ã°ããŒã¯ã«æ°åã§å
¥ç€Ÿããæ©3å¹Žã®ææ¥ãçµã£ããšã³ãžãã¢ã®ã»ããŒã§ãã ç§ã¯å
¥ç€ŸãããããŸã§ãçµå©æºåã¯ãã³ãæ
å ±ãµã€ãããŠãšãã£ã³ã°ããŒã¯ãã®éçšéçºããŒã ã®ãšã³ãžãã¢ãæ
åœããŠããŸãã ããŒã ã®ããã·ã§ã³ã¯ ã«ããã«ïŒä»¥äžãŠãŒã¶ãŒïŒãšçµå©åŒå ŽïŒä»¥äžåŒå ŽïŒã®ããã床ãé«ããããš ã§ããã®ããã«ããµã€ãã®SEOè©äŸ¡ãäžããããã®æœçã宿œãããããŠãŒã¶ãŒã«ãšã£ãŠäœ¿ãããããµãŒãã¹ã«ãªãããã«UI/UXãæ¹åããããšæ¥ã
ããŒã äžäžžãšãªã£ãŠãµã€ãéçšãè¡ã£ãŠããŸãã ä»åã¯ããŸããŸãªæœçã®äžã®äžã€ãããã¯ã¢ããããªãããããããæ¥åå
容ã«ã€ããŠç޹ä»ããããšæããŸãã ããã æ¡ä»¶éçºæ¥åã«ã€ã㊠éçºæ¥å以å€ããã£ãŠãŸã çµç¹è²¢ç®æœçããã£ãŠãŸã ãããã æ¡ä»¶éçºæ¥åã«ã€ã㊠ãŠãšãã£ã³ã°ããŒã¯ã§ã¯æ¯æ¥ã©ã®ããã«ããã°ã ãŠãŒã¶ãŒãšåŒå Žã®ããã床ãé«ãã ãæäŸã§ããããèããŠéçºã»éçšãè¡ã£ãŠãããŸãã ç§ãéçºã»éçšãè¡ãã®ã¯ããŠãŒã¶ãŒã掻çšãããµãŒãã¹ãµã€ããšãåŒå Žãèªç€Ÿã®é
åãäŒããæ
å ±ãç»åãªã©ãå
¥çš¿ã»ç®¡çãã管çç»é¢ã§ãã çŽè¿ã®æ¡ä»¶ãã²ãšã€æãããšãçµå©åŒå Žã®ãã©ã³ãæ€çŽ¢ããæ©èœããã³çµå©åŒå Žåã管çç»é¢ã®ããŒãžã§ã³ã¢ãããè¡ããŸããã æ°åã³ãããŠã€ã«ã¹ã®åœ±é¿ãªã©ã§çµå©åŒã®ããæ¹ãå€ãã£ãŠããŸãããä»ãŸã§ã¯çµå©åŒå Žãçµå©åŒã®ãã©ã³ãå
¥çš¿ããéã«ãã©ã³ã«çŽã¥ãã«ããŽãªãåäžã§ããèšå®ã§ããŸããã§ããããææµã«åãããããŒã¯ãŒããæ°ãã«è¿œå ã§ããããã«å€æŽããŸããã ïŒäŸãã°ããªã³ã©ã€ã³é
ä¿¡OKãããïŒéšå¶ã»ïŒéšå¶ããªã©æ°ããªããŒã¯ãŒããçšæããäžã€ã®ãã©ã³ã«è€æ°éžæã§ããããã«ããŸãããïŒ ãã®æ¡ä»¶ã§ã¯ãåŒå Žããããã®æ
å ±ãæ°ãã«å
¥çš¿ã§ããããã«ç®¡çç»é¢ã®æ©èœæ¹ä¿®ããã¶ã€ã³å€æŽããŠãŒã¶ãŒã掻çšããå
¬éç»é¢ãååŸAPIã®æ°èŠäœæãªã©ãŠãšãã£ã³ã°ããŒã¯ã®å¹
åºãããŒãžãããã°ã©ã ãè§Šãå¿
èŠããããŸãã 圱é¿ç¯å²ã®åºãæ¡ä»¶ã§ãããããã®æ©èœã®è¿œå ã«ãã£ãŠåŒå Žã¯äŒãããæ
å ±ãæ·±ãæäŸã§ãããŠãŒã¶ãŒã¯ãããç¥ãããšãã§ããããã«ãªããŸããã ãã®æ§ã«ãŠãŒã¶ãŒãšåŒå Žã®ããã床ãé«ããæ§ã
ãªæ¡ä»¶ãæ¥ã
éçºããŠãããŸãã éçºæ¥å以å€ããã£ãŠãŸã ã¡ã€ã³æ¥åã¯å
çšè¿°ã¹ããããªéçºãè¡ã£ãŠãããŸããããã£ã¬ã¯ã¿ãŒããäŸé Œãããæ¡ä»¶ããã æãåãããŠå®è£
ããã ãã¯ãããŸããã ãŠãšãã£ã³ã°ããŒã¯ã®ãšã³ãžãã¢ã¯å®è£
ã ãã§ãªãããŒã äžæå²©ãšãªã£ãŠæ¡ä»¶ã®äŒç»ãå®çŸæ¹æ³ãèããããšããããŸãã äŸãã°ãç§ã®ããŒã ã§ãã£ãŠããäžäŸãšããŠã¯ãã ããŒã å宿 ããšã ãµãããäŒè° ãã§ãã ãããŒã å宿ãã¯ãããŒã å
šå¡ã§ã¢ã€ãã¢ãææ¡ãããã£ã¹ã«ãã·ã§ã³ããããšã§æ¡ä»¶ãäœæããŠããããŒãã£ã³ã°ã®ããšã§ãã ãã®ããŒãã£ã³ã°ã«ã¯ãã£ã¬ã¯ã¿ãŒã»ãã¶ã€ããŒã»ãšã³ãžãã¢ãåå ããèªãæããŠãã課é¡ãªã©ãææ¡ã»å®è¡ããŠããŸãã å宿ã®é嬿¹æ³ã¯ãå
šå¡ã§éãŸã£ãŠè©±ãåãå Žåãå°äººæ°ã®ããŒã ã«åããŠè¡ãã±ãŒã¹ãªã©æ¯åæ§ã
ã§ãã ç§ã以åãææ¡ããæ¡ä»¶ã¯ãç»åã®æ¡åŒµåãæ¬¡äžä»£ã®åœ¢ã«å€æŽãããµã€ãããã©ãŒãã³ã¹ãåäžãããããšããã¯ãªãšã€ã¿ãŒç®ç·ã§ããŒãžã®é床æ¹åã®ææ¡ã§ãã ãã®æ¡ã¯ç¡äºæ¡çšãããæ¡ä»¶ãšããŠå®éã«åãåºããŸããã ãã®ããã«ãŠãšãã£ã³ã°ããŒã¯ã§ã¯è·çš®ã圹è·ã«åããããèªãæ¹åã»ææ¡ãã§ãããããªå ŽããããããããŸãã ãã®ããã éåžžæ¥åã®äžã§æãã課é¡ãã¢ã€ãã¢ãææ¡ããã¹ãã« ãæ±ããããŸãã ããµãããäŒè°ãã¯ã宿œã決å®ããäŒç»ã®åææ®µéã§ãã£ã¬ã¯ã¿ãŒã»ãã¶ã€ããŒã»ãšã³ãžãã¢ã®ããŒã ã§ããåãããè¡ãããŒãã£ã³ã°ã®ããšã§ããããã«ãã£ãŠãéçºãå§ãŸãåã«å®çŸå¯èœæ§ãé«ããããšãã§ããŸãã äŸãã°ãããã®å®è£
ã«ã¯ããæ¥ããã£ãŠããŸãããããã®äŒç»ã®ç®çãâŒâŒãªãâ¡â¡ã®å®è£
ããããããããªãããªã©äžæµå·¥çšã®æ®µéã§ã¯ãªãšã€ã¿ãŒåŽããææ¡ãããŠããŸãã ãŸããäºåã«ãã£ã¬ã¯ã¿ãŒãå®è£
é¢ã§äžå®ã«æããŠãããšãããªã©ãã¯ãªã¢ã«ãªãããããäºãã100%çè§£ããäžã§äŒç»ãé²ããããšãã§ããéäžã§æ¡ä»¶å
容ããºã¬ããšãã£ããªã¹ã¯ãæžããããšãã§ããŸãã ãã®æ§ã«ãšã³ãžãã¢åŽãããææ¡ããæ©äŒããããããããŸãã ãã®ããã ããŒã ã§äžç·ã«ãã®ã¥ãããããããšãã§ãã广ããã£ãéã¯å
šå¡ã§åã³ãåãã¡åãããš ãã§ããŸãã çµç¹è²¢ç®æœçããã£ãŠãŸã ãŸããéçºä»¥å€ã®çµç¹è²¢ç®ã«ãåãçµãã§ããŸããäŸãã°ãç§ãææ¡ã»å®æœããã®ã¯ãSQLè¬çŸ©ãã§ãã 宿œããèæ¯ãšããŠããŠãšãã£ã³ã°ããŒã¯ã§ã¯ããŒã¿ããŒã¹ã®æäœãããŒã¿æœåºãªã©ã¯å
šãŠãšã³ãžãã¢ã察å¿ããŠãããŸãã ãã®ããããã£ã¬ã¯ã¿ãŒãããŒã¿ããŒã¹æ§é ãç¥ãæ©äŒãå°ãªãããšã³ãžãã¢ãšãã£ã¬ã¯ã¿ãŒã®èãæ¹ã§ä¹é¢ãçãŸããŠããŸãããïŒãã£ã¬ã¯ã¿ãŒãç°¡åã«ã§ãããã ãšæã£ãããšããå®ã¯DBã§è€éãªåŠçãçºçããŠããŸããªã©ïŒ ããã§ããã£ã¬ã¯ã¿ãŒã«å¯ŸããŠããŒã¿ããŒã¹ãSQLã«ã€ããŠã®è¬çŸ©ãè¡ãããšã§ãšã³ãžãã¢ãšã®èªèã®ãºã¬ãå°ãã§ãæ¹åã§ããã°ãšæããSQLã®åºç€ãã瀟å
ã§ã®æŽ»ç𿹿³ãŸã§ã3ã¶æéæ¯é±1æéã®è¬çŸ©ãšæ¯é±30åã®è³ªçå¿çã¿ã€ã ãèšããŠéå¬ããŸããã çµæãšããŠåå ã¡ã³ããŒã®ããŒã¿ããŒã¹/SQLç¥èãåäžããå
çšè¿°ã¹ãããµãããäŒè°ãã§ããŒãã«æ§é ãããŒã¹ã«ãã話ãããã±ãŒã¹ããã£ã¬ã¯ã¿ãŒãSQLãäœæããã±ãŒã¹ãå¢ããŸããã ãã®æ§ã« èªãæãã瀟å
ã®åé¡ç¹ãªã©ã«é¢ããŠãæèŠãèšããå®è¡ããããš ãã§ããŸãã ãããã ãŠãšãã£ã³ã°ããŒã¯ã®ããŒã éçºã¯æ¡ä»¶ã®äŒç»ãå®çŸ©ãªã©äžæµå·¥çšãè¡ãããšãã§ããŸãã ããã·ã§ã³ã§ãããŠãŒã¶ãŒãšåŒå Žã®ããã床ãé«ããææ³ã«é¢ããŠã¯æç¢ºãªçãããªããããåžžã«ããŒã ãšçžè«ããæ©ã¿ãæªæŠèŠéããŠããŸãã ãããããã®å广ãåºããšãã¯ããŒã å
šå¡ã§åã³ãåãã¡åãããšãã§ããŸãã ãã®ããã ããŒã ã§ãã®ã¥ãããããŠãããšããäžäœæ ãæããããšãã§ããŸãã ãŸããç§ã®ããŒã ã¯ãµã€ãã®æ ¹å¹¹éšåãæ
ãæ¡ä»¶ããããããããããéçºããããšã¯è¯ããæªããèªåéã®åéã§ä»åŸã®äŒç€Ÿã®æé·ã決ãŸããŸãã ãã®è²¬ä»»ã¯å€§ããã§ããããã®å ææŠãç¶ããããšãã§ãããããã ããããŸãã æ°åã³ãããŠã€ã«ã¹ã®åœ±é¿ã§ã çµå©åŒã®ããæ¹ ããå€åããŠãããŸããã ä»ãŸã§éãã®ããæ¹ã§ã¯éçšããªããªã£ãä»ããŠãŒã¶ãŒãäžçªäœ¿ãããããšæãããããªãµãŒãã¹ã远æ±ããŠããå¿
èŠããããŸãã ãã®çããããŒã ã§èããäœæããŠããããšããŠãšãã£ã³ã°ããŒã¯ã®ãšã³ãžãã¢ãšããŠé¢çœãã ãšåŒ·ãæããŸãã
ããã«ã¡ã¯ïŒåæ®ããªã©çµå©åçã®æ®åœ±ã¹ã¿ãžãªã»ãµãã³ãæ€çŽ¢ã§ããæ
å ±ãµã€ãã Photorait ãã®ã¡ã€ã³ãã¶ã€ããŒãããŠããŸããå
ç°ïŒ @PANbooooo ïŒã§ãã Photoraitã§ã¯ãä»Qã«æ°åã®ãã¶ã€ããŒãããŒã ã«ãžã§ã€ã³ããŠãããŸããïŒ ããã«äŒŽããæ°åãã¶ã€ããŒã®è²æããŒãããããäœæããŸããã®ã§ãä»åã¯ãã®ããŒããããã®äœæéçšãããã°ã«ããããšæããŸãã è²æããŒããããã£ãŠãªã«ïŒ 人æè²æã®å€§ãŸããªèšç»ã®ããšã§ãã ä»åã¯ããæ°åãã¶ã€ããŒãç¬ãç«ã¡ãããŠãããžã§ã¯ããé²ããããããšãããŽãŒã«ãšããŠãããã€ãŸã§ã«ã©ããªã¹ãã«ã身ã«ã€ããŠæ¬²ããã®ããããããŠããã®ã¹ãã«ã身ã«ã€ããããã«ã¯äœãããã°è¯ãã®ããã®éšåãæãäžããããŒãããããäœæããŸããã äœææ¹æ³ ïŒïŒèº«ã«ã€ããŠæ¬²ããã¹ãã«ãããã¯ã¢ãããã ãŸãã¯ããã©ããªã¹ãã«ã身ã«ã€ããŠæ¬²ããã®ããã®ãŽãŒã«ã®éšåãæ±ºããŸããã ãŽãŒã«ã®èšå®ã«åèã«ããã®ãã以ååŒç€Ÿãéå¬ããã€ãã³ãã enjoy!ã€ã³ããŠã¹ #14 ãã¶ã€ããŒè©äŸ¡ãšè²æ ãã§ãã ãµã€ããŒãšãŒãžã§ã³ãã®äºäžãããã話ãããŠãã ãã£ããããã¶ã€ããŒãšããŠæé·ããããã«ãäœå¹Žç®ã«ã©ã®ã¹ãã«ãæã£ãŠãããæ¹ãè¯ãã®ããã®çºè¡šããããããããããã£ãã§ãã ãã®ã€ãã³ãã§è©±ãããŠããããšããnoteã«ãŸãšããããŠããããããã¡ããåèã«èº«ã«ã€ããŠæ¬²ããã¹ãã«ã決ããŠãããŸããã ïŒïŒäžèšã§ãããã¹ãã«ã«ç¹ããããã®ç°å¢ãäœã ãŽãŒã«ã決ãŸã£ãããæ¬¡ã¯ãŽãŒã«ã«èŸ¿ãçããŸã§ã®éçšã«ã€ããŠèããŸãã ãŸãã¯ããŽãŒã«ã®ç¶æ
ãããæ·±å ãããã䌞ã°ãããã¹ãã«ã身ã«ä»ãïŒã©ããªããšãã§ããç¶æ
ãªã®ããããèªç€ŸããŒã ã®ãã¶ã€ããŒã§èšããšã»ã»ã»ããšãèªåãã¡ã«èœãšã蟌ãã§èããŸããã ãã®ããã«èœãšã蟌ãããšã§ããããŽãŒã«ãåããããããªãããã§ããããã«ãªã£ãïŒããšèšãæåäœéšãæãããããªããšæããŸãã æ¬¡ã«ã䌞ã°ãããã¹ãã«ã身ã«ã€ãããã¹ãã«ãã¡ãããšåŸãããã«ã¯ã©ããªã¢ã¯ã·ã§ã³ãå¿
èŠãªã®ããäœãããã°è¯ãã®ããå¹ççäžã€ãã£ãããšã¹ãã«ã«ç¹ããã¯ãŒã¯ãåãçµã¿ãèããç°å¢ãçšæããŸãã ãâ¯â¯åããã¶ã€ããŒãã¹ãã«ã¢ããããªã©ãšæ€çŽ¢ãããšãä»ç€Ÿã®ãã¶ã€ã³ããŒã ãè¡ã£ãŠããåãçµã¿ãæžãããããã°ããè²ã
ãªãã¶ã€ããŒããã®ãã¬ããžãèŠã€ããããšãåºæ¥ããããããããåèã«ã¹ãã«ã¢ããã¯ãŒã¯ã®å
容ãç°å¢ã¥ããã«ã€ããŠèããŸããã ïŒïŒã¬ãã¥ãŒããããããã©ãã·ã¥ã¢ãããã ããçšåºŠãããŒãããããäœæã§ããããä»ã®ããŒã ã®ãã¶ã€ããŒããã«ããŽãŒã«ãšã¯ãŒã¯ã®å
容ãåã£ãŠããã®ããããã£ãšè¯ãã¯ãŒã¯ããããããªã©ã確èªããŠããããŸããã å®éã«ç¢ºèªããŠãããããšã§ããã®ã¹ãã«ãé«ããããªããã®æ¹æ³ãããããã ãããšããã£ãšå¹ççãªã¯ãŒã¯ã®å
容ãæããŠããã ããããããã®ã¯ãŒã¯ããããªããããªãšããã«æ³šæããæ¹ããããïŒããªã©ã®ãèªåã§ã¯æãã€ããªãæ°ããªèŠç¹ã§ã®ãæèŠãããããããã ããããŒããããã®ç²ŸåºŠãããäžãããŸããã äœæããäžã§æ°ãã€ããããš ããŒãããããäœæããŠãããšãããããåãå
¥ãããïŒãããããåãå
¥ãããïŒãããããªã¯ãŒã¯ããã£ãŠã»ããïŒãããã®åãçµã¿ãåã«ãªãïŒããšãè¶³ãç®ãããããšãå€ããªããŸãããéäžã§åŒãç®ãæèçã«ããããšã§ãã³ã³ãã³ããè©°ã蟌ã¿ããããã¢ã¯ã·ã§ã³ã«èµ·ãããããããŒãããããäœæããããšãã§ããŸããã ãããã« ããŒãããããäœãããšã§ãæ°åãã¶ã€ããŒã«å¯Ÿããã©ããªã£ãŠæ¬²ããã®ãããäœãã§ããŠæ¬²ããã®ãããäŒãããããªããŸããã ãŸãããã¶ã€ããŒã®ã¹ãã«ã®å¯èŠåã«ãç¹ããããã¶ã€ããŒã®è©äŸ¡ã«ãããæ°ããããŒã«çãªåœ¹å²ã«ããªããšæããŸããã ä»åŸããã€æ°åãã¶ã€ããŒããžã§ã€ã³ããŠã倧äžå€«ãªããã«ãåžžã«ãã©ãã·ã¥ã¢ããããŠããè¯ãããŒããããããä¿ã¡ãããšæããŸãã