ãã®èšäºã¯ Safie Engineers' Blog! Advent Calendar  14æ¥ç®ã®èšäºã§ã ã¯ããã« ã¯ãããŸããŠïŒãšã³ãžãã¢ãªã³ã°ãªãã£ã¹ã®å±±åŽéº»è¡£åïŒ @ymzaki_m4 ïŒãšç³ããŸãã ã»ãŒãã£ãŒã«ã¯2025幎3æã«å
¥ç€Ÿããéçºæ¬éšã®çµç¹éçºå
šè¬ã«æºãã£ãŠããŸãã ïŒãšã³ãžãã¢ãªã³ã°ãªãã£ã¹ã®ãä»äºã«ã€ããŠã¯ãæšå¹Žã®èšäºãè¯ããã°ã芧ãã ããïŒïŒ engineers.safie.link ä»åã¯ãç§ããããŸã§åãçµãã ãçµç¹ã®æšªé£æºåŒ·åã ã«é¢ããæœçã«ã€ããŠã玹ä»ããŸãã çµç¹ã®æ¡å€§ã«ãã£ãŠçãå§ãã課é¡ãšããã®è§£æ¶ã«åããæåã®äžæ©ãçµç¹ãããžã¡ã³ãã§åããããªæ©ã¿ãæ±ããæ¹ã®ãäœãã¡ãã£ãšãããã£ããã«ãªãã°å¹žãã§ãã ã¯ãã㫠匷åãªçµç¹ã®å®çŸãžïŒèª²é¡ãæ¢ã æ¬è³ªçãªèª²é¡ãç¹å®ïŒæµ®ã圫ãã«ãªã£ã2ã€ã®å£ ãæšªã®ã€ãªããããçãïŒGL暪æããŒãã£ã³ã°ã®å®è¡ãšèšèš çµç¹å€é©ã®ç¬¬äžæ©ãšã次ã®ç®æš ããã㫠匷åãªçµç¹ã®å®çŸãžïŒèª²é¡ãæ¢ã éçºæ¬éšã®ä»å¹ŽåºŠïŒFY25ïŒã®ç®æšã®1ã€ãšããŠã ã匷åãªçµç¹ãã®å®çŸ ãæ²ããããŠããŸããã ã»ãŒãã£ãŒã®ãããªãäºæ¥æé·ãä¿é²ããããã«ã¯ãå°æ¥ã®æé·ãå®çŸãããä»èŸŒã¿ãçµç¹äœå¶ã®æŽåãé²ããå¿
èŠããããŸããã ãã®ããã«ã¯ãçŸç¶ã®æé·éåºŠã«æºè¶³ãããçµç¹æåã®éžæãåäººã®æé·æ¯æŽãæ
å ±é£æºåŒ·åãªã©ãå€é¢çãªæé·ã匷åã«æšãé²ããããšãéèŠãšãªããŸãã ããããç¶æ³äžã§å
¥ç€Ÿããç§ãã¯ããã«åãçµãã ããšã¯ãéçºæ¬éšã®éšå®€é·ãã°ã«ãŒããªãŒããŒïŒGLïŒãšã®1on1ã§ã çµç¹ã®çŸç¶ãå€è§çã«ææ¡ ããããšã§ããã çŽ3é±éãããŠèš25åã®éšå®€é·ãGLã«å¯ŸããŠãã¢ãªã³ã°ã宿œããŸããã çŸåšã®çµç¹ã®åãçµã¿ã課é¡ãªã©ã«ã€ããŠãæ¡çšããªã³ããŒãã£ã³ã°ãè²æãè©äŸ¡ãæåéžæãéçºããã»ã¹ãªã©ã®å¹
åºãåãå£ã§ã䌺ãããŸããã æ¥åã®åéãçž«ã£ãŠå¿«ãå¿ããŠãã ãããã¿ãªãããæ±ããŠããæ³ããçµç¹ã®çŸç¶ãææ¡ããããšãã§ããŸãããïŒããããšãããããŸããïŒïŒ æ¬è³ªçãªèª²é¡ãç¹å®ïŒæµ®ã圫ãã«ãªã£ã2ã€ã®å£ ãã¢ãªã³ã°å
容㯠æ§é åã»æœè±¡å ããéçºæ¬éšå
šäœã®æ¬è³ªçãªèª²é¡ãç¹å®ããŸããã ãããã®èª²é¡ãåºã«ã解決ã®ããã®éçãèããçŽè¿ã§å®æœãã¹ãå
·äœçãªæœçãçå®ããŸããã ãŸããçµç¹ãšããŠèª²é¡æã倧ãããã®ã以äžã®4ã€ã®ããŒãã«åé¡ããŸããã çµç¹éå¶ã®åºç€åŒ·å 人æè²æã»æé·ã®ä»çµã¿å æ¥åå¹çãšçç£æ§åäž çµç¹æåãšåž°å±æèã®éžæ ããã«ãçæã»äžé·æã«åé¡ãã課é¡ã®é¢é£æ§ãšæœçã®åªå
é äœãæ¢ã£ãŠãããŸããã ãã®çµæãçŽè¿ã§åãçµãã¹ã課é¡ã以äžã®2ã€ã§ãããšç¹å®ããã«è³ããŸããã çµç¹ã®æç¢ºãªæ¹åæ§ã»ããžã§ã³ãäžè¶³ããŠãã 圹å²ãæš©éãäžæç¢ºã§ã暪ã®ã€ãªãããèã ãããã®2ã€ã®èª²é¡ã解決ããŠããã«ãããããŸãã¯ãæ¢åã®ãªãœãŒã¹ã掻çšããŠããã«å®æœå¯èœã§ãçŽæ¥çã«å¹æãèŠèŸŒãããã®ãã«åãçµã¿ãçå®ã«ææãžãšã€ãªããŠãããŸããäžæ¹ã§ããæ ¹æ¬çè§£æ±ºã«æéãèŠããæ°ããªä»çµã¿ãæåã®éžæãå¿
èŠãªãã®ãã«ã€ããŠã¯ããã¯ãã£ã¹ãã£ã³ã°ã§èšç»ãçå®ãããã®äž¡èŒªã§èª²é¡è§£æ±ºãæšé²ããŸãã ããã§ããŸãçæããã®ã ãGLã®æšªé£æºåŒ·åã ã§ããã GLãšããçµç¹ã®äžæ žãæ
ãååšãç©æ¥µçã«é£æºããããšã§ãçµç¹ã®äžäœæãéžæããã°ã«ãŒããè¶
ããŠææãä»å 䟡å€ãåµåºãç¶ããããçµç¹ãç®æããããšèããŸããã ãŸããGLã®åæ°ä»¥äžããå
±é課é¡ãšããŠæããããã®ããGL圹å²ãšæš©éã®å®çŸ©ã®ææ§ããããéšéã»ããŒã éã®æ
å ±å
±æãšé£æºã®åŒ±ããã§ãããããããçµç¹ã®æ¹åæ§ã®äžæç¢ºããæšªã®ã€ãªããã®åžèãã«ã€ãªãã£ãŠãããšãèããããŸããã ãã®çæçãªåºç€åŒ·åããé·æçãªæé·ã®ããã®ãåå°ããåºããäžã§å¿
èŠã ã£ãã®ã§ãã éçºæ¬éšFY25äžæããã¯ãªãïŒ2025幎7æéå¬ïŒã§ã®èª¬æè³æããïŒäžéšæ¹å€ïŒ ãæšªã®ã€ãªããããçãïŒGL暪æããŒãã£ã³ã°ã®å®è¡ãšèšèš ãGLã®æšªé£æºåŒ·åããé²ããããã«ã ãGL暪æããŒãã£ã³ã°ã ã®å®æéå¬ãäŒç»ããŸããã ãã®äŒè°ã¯ãçµç¹ã®äžæ žãæ
ãGLããèªèº«ã®ããŒã ãè¶
ããŠçµç¹å
šäœãçè§£ããçžäºã«ååããªãããããè¯ãçµç¹ãå
±ã«åµã£ãŠããããã®ã äž»äœçãªå Ž ããšå®çŸ©ããGLã®äžã§æå¿ãåã£ãŠå§ããããšãšããŸããã äŒç»ã®æ€èšã«ããã£ãŠç¹ã«æèããç¹ã¯ä»¥äžã®4ç¹ã§ãã äžæ¹çãªæ
å ±æäŸã§ã¯ãªããåæ¹åã®å¯Ÿè©±ãã¯ãŒã¯ãäžå¿ãšããèšèšã«ãã æ¯æã®éçºæ¬éšäŒã§å®æœå
容ãå
šäœå
±æããããšã§ã掻åã®éææ§ãé«ãã ååã§ããŒããæç¢ºã«å®ããææ¥ããã®æŽ»åã«ã€ãªããã¢ãŠãããããæèãã ã¢ãŠããããã宿œåŸã¢ã³ã±ãŒããèžãŸããäŒè°èªäœã®æ¹åãç¹°ãè¿ã ãŸããç®æãç¶æ
ãšãã®ããã®ã¹ããããæèããªãããæ®µéçãªããŒãããããèšå®ããŸããã äŒè°ã¯8æããéå§ããæ1å以äžã®é »åºŠã§ç¶ç¶çã«éå¬ããŸããã ã¯ããã¯ãçžäºçè§£ãšå®å¿ã§ããå Žã®éžæããããŒãã«ãåå è
å士ã®äº€æµãéèŠããŸãããåãéããããšã«ãå®è·µãšæ¹åã®ãµã€ã¯ã«ããéèŠããå
·äœçãªçŸå Žã®èª²é¡è§£æ±ºã®ããã®è°è«ãããããžã¡ã³ãã¹ãã«åäžãæèããåŠç¿ãåãå
¥ããçµç¹ãžã®è²¢ç®ãèŠéã«å
¥ããŠãããŸããã 11ææ«ãŸã§ã§å
š6åéå¬ããŸããããåœåããGLã®ã¿ãªãããææ¬²çã«åå ããŠãã ãããäŒè°ãžã®æºè¶³åºŠãé«ãç¶æ
ãç¶æã§ããŠããŸããïŒããããšãããããŸãïŒïŒïŒ ãŸããèŠæãèžãŸããŠäŒè°ã®éå¶ãã³ã³ãã³ãã調æŽããããšã§ããããžã¡ã³ãã¹ãã«åäžãªã©ãžã®è²¢ç®åºŠãé«ããããŠããããšãã¢ã³ã±ãŒãçµæãéããŠæããããšãã§ããŸããã çµç¹å€é©ã®ç¬¬äžæ©ãšã次ã®ç®æš ãGL暪æããŒãã£ã³ã°ãã¯ãGLå士ã éšéãããŒã ãè¶
ããŠèª²é¡ãå
±æãæ¯ãåã ããã®ã暪ã®ã€ãªãããã匷åãã ã©ã€ã³ãããžã¡ã³ãèœåã®åäž ãšããææãåºå§ããŠãããšæããŠããŸãã ä»åŸã¯ããã«ãé·ææœçãšã㊠ãçµç¹ããžã§ã³ã®çå®ãšèšèªåã ãé²ããããšèããŠããŸãã ãå®è¡åãšåµé åãå
Œãåããäºæ¥æé·ã«å¿
èŠãªå€åã«è¿
éã«å¯Ÿå¿ã§ããçµç¹ããç®æãããã®æ³ããèšèªåããŠç€Ÿå
å€ã«ç€ºãããšã§ãæ³ãã«å
±æããã¡ã³ããŒãéãŸããç°æäžäœããªåŒ·ãçµç¹ãšãªãããããªãäºæ¥æé·ã«è²¢ç®ã§ããããã«åãçµãã§ãããŸãïŒ ãŸãããããŸã§ã®åãçµã¿ãéããŠãã»ãŒãã£ãŒã¯ èªãèãã倿ããè¡åããããšã§ãèªåŸçã«äŸ¡å€ãåµé ãã ã¡ã³ããŒã®ã¹ã¿ã³ã¹ã倧åã«ããŠããããšåŒ·ãæããããšãã§ããŸããã ãããããçµç¹èª²é¡ã«çæ¯ã«åãåããæ¹åããã»ã¹ãç¶ç¶çã«æšé²ããŠãããŸãã ãããã« æ¬èšäºã§ã¯ãç§ãåãçµãã çµç¹å€é©ã®ç¬¬äžæ©ã«ã€ããŠã玹ä»ããŸããã ãŸã éåã°ã§ããããããšãæ°å€ãããã®ã§ããã€ãå¥ã®æ©äŒã«ã玹ä»ã§ããã°ãšæããŸãã ã€ãã§ã«å®£äŒã§ãïŒã»ãŒãã£ãŒã§ã¯ äžç·ã«åã仲éãåéäž ã§ãïŒ å°ãã§ããèå³ãæã£ãŠããã ãããããã²ä»¥äžã®æ¡çšãµã€ããèŠããŠã¿ãŠãã ããã safie.co.jp æåŸãŸã§èªãã§ããã ããããããšãããããŸããã
ãã®èšäºã¯ ã»ãŒãã£ãŒæ ªåŒäŒç€Ÿ Advent Calendar 2025 ã®13æ¥ç®ã®èšäºã§ãïŒð ã¯ããã« ããã«ã¡ã¯ïŒ ã»ãŒãã£ãŒæ ªåŒäŒç€Ÿ åºå¹¹ã·ã¹ãã éçºéš æŠç¥ã°ã«ãŒãã®äœã
æšã§ãã çŽïŒå¹Žåãã»ãŒãã£ãŒã®äžéæ¡çšã®éžèãåããããšããŠããç§ã¯éæ¹ã«æ®ããŠããŸããã»ã»ã» ãªããªã ãã»ãŒãã£ãŒã®åºå¹¹ã·ã¹ãã éçºéšãšã¯ãªã«ãã ã«ã€ããŠã®æ
å ±ããåéèŠé
以å€ã«ã»ãŒèŠã€ããããªãã£ãããã§ãã éå»ã®ç§ãšåãããã«ãåºå¹¹ã·ã¹ãã éçºéšã«èå³ã¯ãããã©ãæ
å ±ãå
šç¶èŠåœãããªããªã»ã»ããšãå°ãã®ã¿ãªãããžãã»ãŒãã£ãŒã®åºå¹¹ã·ã¹ãã éçºéšã«ã€ããŠã玹ä»ããããšæããŸãïŒ ã¯ããã« ã»ãŒãã£ãŒã«ããããåºå¹¹ã·ã¹ãã ã åºå¹¹ã·ã¹ãã éçºéšã«ã€ã㊠åºå¹¹ã·ã¹ãã éçºéšã£ãŠã©ããªé°å²æ°ïŒ ãããã« ã»ãŒãã£ãŒã«ããããåºå¹¹ã·ã¹ãã ã ã¿ãªããã¯ãåºå¹¹ã·ã¹ãã ããšèããŠã©ããªã·ã¹ãã ãæãæµ®ãã¹ãã§ããããïŒ ã»ãŒãã£ãŒã«ãããŠãåºå¹¹ã·ã¹ãã 㯠ãäŒæ¥æŽ»åã«å¿
èŠäžå¯æ¬ ãªæå°éã®æ¥åãåãæ±ãã·ã¹ãã ã ãšå®çŸ©ãããŠããŸãã ãšèšãããŠããã¡ãã£ãšã€ã¡ãŒãžãããã«ããã§ãããã ã»ãŒãã£ãŒã¯ãã¯ã©ãŠãé²ç»ãµãŒãã¹ãšããSaaSããžãã¹ãå±éãã€ã€ãã«ã¡ã©ããã€ã¹ãªã©ã®ãã¢ãïŒããŒããŠã§ã¢ïŒããåãæ±ã£ãŠããç¹ãç¹åŸŽã§ãã ãã®ãããäŒæ¥æŽ»åã«å¿
èŠäžå¯æ¬ ãªæå°éã®æ¥åããšããŠã以äžã®ãããªé åãå®çŸ©ããŠããŸãã ãã¢ããã管çããé åïŒSCMããµãŒãã¹/補åä¿èšŒç®¡ç ããµãã¹ã¯ãªãã·ã§ã³ãã管çããé åïŒå¥çŽç®¡ç ãã¢ããããµãã¹ã¯ãããè«æ±ã管çããé åïŒè«æ±ç®¡ç å¶æ¥æŽ»åãæ¯ããé åïŒSFA/CRM äŒæ¥æŽ»åã®æ ¹å¹¹ãæ¯ããé åïŒäŒèšç®¡çãçµç¹ç®¡çãããŒã¿åæ/æŽ»çš ã§ã¯ããããã®é åã«ã€ããŠãããããã©ã®ãããªã·ã¹ãã ãå©çšããŠããã®ã§ããããïŒ å©çšã·ã¹ãã ãé åããšã«ã°ã«ãŒãã³ã°ãããšä»¥äžã®ãããªåœ¢ãšãªããŸãã ãã®ããã«æ§ã
ãªã·ã¹ãã ãçµã¿åãããªãããæ¥ã
ã®æ¥åãã²ããŠã¯é¡§å®¢ã®ã»ãŒãã£ãŒå©çšãæ¯ããŠããã®ããã»ãŒãã£ãŒã«ããããåºå¹¹ã·ã¹ãã ãã§ãã åºå¹¹ã·ã¹ãã ã«ã€ããŠã¯éå»ã®ããã¯ããã°ã§ã玹ä»ããŠããŸãã®ã§ãèå³ãæãããæ¹ã¯ãã²ãã¡ããã芧ãã ããã ãã¢ããÃããµãã¹ã¯ãæ¥åã·ã¹ãã 玹ä»ïŒ åºå¹¹ã·ã¹ãã éçºéšã«ã€ã㊠ãããŸã§ã玹ä»ããŠããåºå¹¹ã·ã¹ãã ã®ãã¡ãCRMã·ã¹ãã 矀ãå¥çŽã»è«æ±ã»äŒèšç®¡çã·ã¹ãã 矀ã管çããŠããã®ããåºå¹¹ã·ã¹ãã éçºéšãã§ãã ïŒæ³šïŒããŒã¿åæåºç€ã¯ããŒã¿ããªãã³æšé²å®€ãæ
åœããŠããããã¡ããéå»èšäºã§ç޹ä»ãããŠããŸãã What is ããŒã¿åæåºç€ ïŒ åºå¹¹ã·ã¹ãã éçºéšã®Mission㯠ãæç¶å¯èœã§æè»ãªåºå¹¹ã·ã¹ãã ãæäŸããäŒæ¥ã®æé·ãšçµå¶å¹çåãæ¯ããã ã§ãããã»ãŒãã£ãŒã®ãããªãæé·ãæ¯ããããã®åºç€ã¥ããã«åãçµãã§ããŸãã åºå¹¹ã·ã¹ãã éçºéšã¯ä»¥äžã®3ã°ã«ãŒãã§æ§æãããŠããŸãã éçºç¬¬ïŒã°ã«ãŒã éçºç¬¬ïŒã°ã«ãŒã æŠç¥ã°ã«ãŒã ããããã®ã°ã«ãŒãã®åœ¹å²ã¯ä»¥äžã®éãã§ãã éçºç¬¬ïŒã°ã«ãŒã äž»ã«Salesforceã«é¢ããéçºã»ä¿å®ãæ
åœããŠããŸãã ã»ãŒãã£ãŒã§ã¯Salesforceãå¹
åºãé åã§æŽ»çšããŠãããå¶æ¥ããã«ã¹ã¿ããŒãµããŒããŸã§ãæ§ã
ãªéšçœ²ã®æ¥åãæ¯ãã倧åãªåºç€ãšãªã£ãŠããŸãã éçºç¬¬ïŒã°ã«ãŒãã§ã¯ã瀟å
ã®èŠæãå
ã«éçºã»ãªãªãŒã¹ãè¡ã£ãŠããã»ããçŸåšã¯SCMæ¥åã®æ¹åãç®çãšãããå±±æ¡ãããžã§ã¯ããïŒè£œåã»åšåº«ç®¡çã·ã¹ãã ã®åŒ·åïŒã«å
補ã§åãçµãã§ããã瀟å
ãŠãŒã¶ãŒã§ããCSæ¬éšã®ã¡ã³ããŒãšå¯ã«é£æºããªããéçºãé²ããŠããŸãã ãŠãŒã¶ãŒéšéãšäžäœãšãªã£ãŠã®ãããžã§ã¯ãéå¶ã¯ãã»ãŒãã£ãŒã®åºå¹¹ã·ã¹ãã éçºã«ããã倧ããªééå³ã®ã²ãšã€ã§ãã éçºç¬¬ïŒã°ã«ãŒã äž»ã«ECãµã€ããZuoraãè«æ±æžç®¡çããã«é¢ããéçºã»ä¿å®ãæ
åœããŠããŸãã å¥çŽç®¡çã»è«æ±ç®¡çãšãã顧客圱é¿ã倧ããã·ã¹ãã ãæ
åœããŠãããæ¥ã
ã®ããŒã¿ã®æŽåæ§ç¢ºèªãææ¬¡æ±ºæžã®ç¢ºèªãšãã£ãéèŠãªæ¥åãå€ãæ
åœããŠããŸãã ãããã åäŒç€Ÿã®æ¥åã·ã¹ãã éçºãECãµã€ãã®ä¿å®ãªã©ãå¹
åºãé åã®ãããžã§ã¯ããæ
åœããéçºç¬¬ïŒã°ã«ãŒãã§ããã2026幎ããã¯äŒèšé åãžã®SAPå°å
¥ãè¡ããæ¬
ãããžã§ã¯ãããæ¬æ Œã¹ã¿ãŒãããã»ãŒãã£ãŒã®æé·ãæ¯ããããã®å€§ããªãããžã§ã¯ããä»åŸæ°å¹Žç¶ãèŠèŸŒã¿ã§ãã æŠç¥ã°ã«ãŒã äž»ã«åºå¹¹ã·ã¹ãã å
šäœã®æŠç¥äŒç»ããéçºãããžã§ã¯ãã«ããããããžã§ã¯ããããŒãžã£ãŒïŒPMïŒãšããŠã®åœ¹å²ãæ
åœããŠããŸãã åè¿°ã®å±±æ¡ãããžã§ã¯ãã»æ¬
ãããžã§ã¯ãã®PMããåäŒç€Ÿã®æ¥åã·ã¹ãã æ§ç¯ãããžã§ã¯ãã®PMã代çåºåãèªç€Ÿéçºã·ã¹ãã ã®ãããã¯ããããŒãžã£ãŒïŒPdMïŒãšãã£ã圢ã§ãåã¡ã³ããŒãããããã®ãããžã§ã¯ãã®æšé²åœ¹ãæ
ã£ãŠãããéšé暪æçãªèª²é¡ã®è§£æ±ºããªãŒãããŠããŸãã åºå¹¹ã·ã¹ãã éçºéšã£ãŠã©ããªé°å²æ°ïŒ ç§ãå
¥ç€ŸåŸããã«æããã®ã¯ããèœã¡çãããã ãããªäººãå€ããé°å²æ°ã§ããã äžæ¹ã§ãã·ã¹ãã ã«é¢ããè°è«ã§ã¯ããããã®ããã¯ã°ã©ãŠã³ããåºã«æ§ã
ãªæèŠãé£ã³äº€ããããããåºå¹¹ã·ã¹ãã æ§ç¯ã«åããç±ãæããæ¥ã
æããŠããŸãã ãŸããè²å
äžã®ã¡ã³ããŒãå€ããè£éåŽåå¶ãããããŠæè»ã«åè²ãŠãšäž¡ç«ããŠããã¡ã³ããŒãå€ãã§ãã ãããžã§ã¯ãåäœã§ã®æŽ»åãå€ãåºå¹¹ã·ã¹ãã éçºéšã§ãããéé±ã§éå¬ãããŠãããåºå¹¹ã·ã¹ãã éçºéšäŒãã§ã¯ãå
šå¡ãäžèšè©±ãããã§ãã¯ã€ã³ããåé ã«èšããããŠããããåäŸã®æã®å€äŒã¿ã®æãåºããèåŸã®å€¢ãçãæ¹ãã䟿å©ãªããªãŒãœããããªã©å€å²ã«ãããããŒããå
ã«ãäºãã®äººãšãªããç¥ãè¯ãæ©äŒãšãªã£ãŠããŸãã ãã«ããªã³ã°éšã«åå ããŠããã¡ã³ããŒã®å ±åãããåãããšã®ãã«ã²ã®é£Œè²ãšããœãŒããè²äŒæãã®ããã¡ã³ããŒãšèµ€ã¡ããã®ç»å Žãªã©ããç°æäžäœãã®ã»ãŒãã£ãŒãããããããããªãžã£ã³ã«ã®ãšããœãŒããé£ã³åºãç¬ããçµ¶ããªãæéã§ãç§ãæ¯åãšãŠã楜ãã¿ã«ããŠããŸãã ãããã« åºå¹¹ã·ã¹ãã éçºéšã«ã€ããŠã®ã玹ä»ã¯ãããã§ããã§ããããïŒ ãã®èšäºãèªãã çããã®åºå¹¹ã·ã¹ãã éçºéšãžã®è§£å床ãå°ãã§ãäžãã£ãŠãããããããã§ãã ã»ãŒãã£ãŒã®ãããªãæé·ãæ¯ãããããåºå¹¹ã·ã¹ãã ã¯ä»ãŸãã«é²åã®æãè¿ããŠããŸãã»ã»ã»ïŒ ãããªãæé·ãèŠæ®ãã ä»ã®ã»ãŒãã£ãŒãã ãããããå³ããããã€ãããã¯ãªåºå¹¹ã·ã¹ãã åæ§ç¯ ã«ãããªããäžç·ã«åãçµãã§ã¿ãŸãããïŒ åºå¹¹ã·ã¹ãã éçºéšã§ã¯ãäžç·ã«åããŠããã ãã仲éãçµ¶è³åéäžã§ãïŒ èå³ãæã£ãŠããã ããæ¹ã¯ããã²æ¡çšãµã€ããã芧ãã ããã safie.co.jp
ãã®èšäºã¯ Safie Engineers' Blog! Advent Calendar 12æ¥ç®ã®èšäºã§ãã ã¯ããã« ãã®ãã¹ãã³ãŒãããŸã å
šéšãæãã§æžããŠããŸããïŒ ä»ã¯ã©ããªçæAIã䜿ã£ãŠããã®ãïŒ ãªããå
šèªåãã§ã¯ãªãã®ãïŒ å®è·µïŒClaude Codeã䜿ã£ããã¹ãåèªåå4ã¹ããã ãã®ã¯ãŒã¯ãããŒãããããããæé以äžã®ã䟡å€ã ãããã«ïŒAIãšã®åæ¥ãåœããåã«ãªãæªæ¥ãž ã¯ããã« ããã«ã¡ã¯ïŒã»ãŒãã£ãŒæ ªåŒäŒç€Ÿã§ãµãŒããŒãµã€ããšã³ãžãã¢ãããŠããåäž( @Bobtaroh )ã§ããæ°å2幎ç®ãšãªããç§ãå«ãåæã®ãšã³ãžãã¢ãã¡ããããããã®é
å±å
ã§äžçæžåœã«æ¥åãããªããŠããŸãã æ¬èšäºã§ã¯ãåããæ°å2幎ç®ã§ããããã³ããšã³ãéçºãæ
åœããŠããæ±æ¢ããã«ã€ã³ã¿ãã¥ãŒãè¡ããéçºçŸå Žã§è©±é¡ã®ãClaude CodeããæŽ»çšãã ãã¹ãåèªååã®ã¯ãŒã¯ãã㌠ã«ã€ããŠç޹ä»ããŸãã ãAIã«å
šéšä»»ãããã®ã§ã¯ãªãããããŠãåèªååããéžã¶ãã®çç±ãšãå
·äœçãªå®è·µææ³ã«ã€ããŠæ·±æãããŸããã ãã®ãã¹ãã³ãŒãããŸã å
šéšãæãã§æžããŠããŸããïŒ ãã¹ãã³ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã®å質æ
ä¿ã«äžå¯æ¬ ã§ããããã®å®è£
ã¯æãšããŠãšã³ãžãã¢ã®è² æ
ã«ãªãããšããããŸããã»ãŒãã£ãŒã®ããã³ãéçºããŒã ã§ã¯ãç¹ã«ä»¥äžã®èª²é¡ããããŸããã å€§èŠæš¡ãªãã¶ã€ã³ã·ã¹ãã ç§»è¡ããã£ãŠããŠãå·¥æ°èŠç©ããäžããã¹ããåŸåãã«ããŠãã ãã¹ããå®è£
ããç®æå€ãã£ã é
å±ãããŠããéçºããã³ã³ããŒãã³ãã40~50ã»ã©ããã1ã³ã³ããŒãã³ãããã1000è¡ã»ã©ã®ãã¹ããå¿
èŠã ã£ã ãã¹ãã®äžã«ã¯ãäœæ¥ã«è¿ãåçŽãªå®è£
ãå€ãååšãããšã³ãžãã¢ã®ã¢ãããŒã·ã§ã³ãããŸãäžããã¥ããåŽé¢ãå°ã
ãã£ã ãããã®èª²é¡ãæ±ããŠããæã«ãäžéã§ã¯Coding Agentãæ³šç®ãéãå§ããåŒç€Ÿã§ã瀟å
ããŒã«ãšããŠGeminiãClaude Codeã®å©çšç°å¢ãæŽåãããŸããããããæ©ã«ãä»åã®ãã¹ãã®åèªååã¯ãŒã¯ãããŒãçµãããšã«è³ã£ããšã®ããšã§ããã ä»ã¯ã©ããªçæAIã䜿ã£ãŠããã®ãïŒ æšä»ãClaude Code以å€ã®ããŸããŸãªçæAIãç»å ŽããŠããŸããã以äžã®4ã€ã®çæAIã«é¢ããŠãã©ã®ããã«äœ¿ãåããŠããã®ããæ±æ¢ããã«èããŠã¿ãŸããã Gemini çžæ£çãªååš Geminiåäœã§ã¿ã¹ã¯ããé¡ãããããšã¯ãªãã調ã¹ãããã®ããŒã«ãšããŠäœ¿ãããšãå€ã äŒè°äžã«åºãŠããåãããªãããšã«ã€ããŠãèãããšããããã Claude Code éšäžã«è¿ãååš ä»¥äžã®ä»äºãæããŠãã ãã¹ãã®å®è£
æ°èŠéçºã®éåœ¢äœæ è€éãªå®è£
ã®è§£èª¬äŸé Œ Github Copilot 以å䜿ã£ãŠããããä»ã¯å®å
šã«äœ¿çšããŠããªã Bedrock Chat Geminiãå°å
¥ãããåãŸã§ã¯äž»æµã ã£ãããä»ã¯äœ¿çšããŠããªã 2025幎12æçŸåšã§ã¯ãäž»ã«GeminiãšClaude Codeã䜿çšããŠãããšã®ããšã§ããã ãªããå
šèªåãã§ã¯ãªãã®ãïŒ çŸåšã®ãã¹ãåèªååã«è³ããŸã§ã«ã¯æ§ã
ãªè©Šè¡é¯èª€ããããŸããã åŒç€Ÿã§Claude Codeãå©çšå¯èœã«ãªãåãŸã§ã¯ãGithub Copilot Agentã䜿ã£ãŠãOne-shotã®ããã³ããã§ãã¹ããçæãããææ³ã詊ã¿ãŸããããããããããžã§ã¯ãåºæã®ã«ãŒã«ãå®ãããªãã£ãããæå³ããªãã³ãŒããçæãããããšãçµæãšããŠåºåã®6ã7å²ã人éãæžãçŽãããšã«ãªã£ãŠããŸããã Claude Codeãå©çšå¯èœã«ãªã£ãåœåã§ã¯ãåçãªå€åã¯ãããŸããã§ãããGithub Copilotã§Sonnet 4ã¢ãã«ã䜿çšããããšãã§ããŠãããããGithub Copilotã§å¹ã£ãä»çµã¿ããã®ãŸãŸæµçšããŠãããšã®ããšã§ããhooksãmemoryã®åæ£åã®å©çšã詊ã¿ãŸãããã管çãé£ãããããŒã éçºã«ãªããªãåããªããšããããšãããããŸããã çŸåšã§ã¯ãSubagentsãçšããŠãèšèšãå®è£
ãã¹ã¿ã€ã«ã¬ãã¥ãŒãšçµ±åã®4ã€ã«å·¥çšãåããããšã§ãåèªååãŸã§é²ããããšãã§ãããšã®ããšã§ãã å®è·µïŒClaude Codeã䜿ã£ããã¹ãåèªåå4ã¹ããã Claude Codeã䜿ã£ãåèªååã®è©³çŽ°èª¬æãããŸãã ãã®åèªååã§ã¯ã䞻㫠Subagents ã®æ©èœã䜿ã£ãŠããŸããSubagentsãšã¯ãã¡ã€ã³ã®äŒè©±ã«å·Šå³ãããã«ç¹å®ã®ã³ã³ããã¹ããä¿æããé©åãªæš©éã®ãã®ãšãç¹å®ã®é åã«ç¹åããŠç²ŸåºŠãåäžãããããšãã§ããåå©çšå¯èœãªãšãŒãžã§ã³ãã®ããšã§ããå
¬åŒãµã€ã( https://code.claude.com/docs/ja/sub-agents )ã§ã¯ã以äžã®4ã€ã®å©ç¹ãæããããŠããŸãã ã³ã³ããã¹ãã®ä¿æ ç¹åããå°éç¥è åå©çšæ§ æè»ãªæš©é ãã®æ©èœãšClaude Codeã®ãã¡ã€ã«ä»æ§ã«åŸã£ãŠã以äžã®ãã¡ã€ã«æ§æã§å®çŸããŠããŸãã .claude âââ agents # Agentã®å®çŸ©ãè©°ãŸã£ããã£ã¬ã¯ã㪠â âââ consolidate-text-fixes.md â âââ generate-test-spec.md â âââ implement-test.md â âââ investigate-test-pattern.md â âââ review-test-first.md â âââ review-test-second.md â âââ review-test-third.md â âââ search-translation-key.md âââ commands # ã¯ãŒã¯ãããŒ(ã³ãã³ã)ãå®è¡ãããå®çŸ©ãè©°ãŸã£ããã£ã¬ã¯ã㪠âââ test-workflow.md commandsãã£ã¬ã¯ããªã§å®çŸ©ããã¯ãŒã¯ãããŒ(test-worklow.md)ã§ã¯ã以äžã®ãããªæ§æã«ãªã£ãŠããŸãã ðœå®éã®test-workflow.mdã®äžèº«ãèŠãã(ãããã¯ãªãã¯ïŒ) --- name: test-workflow description: ãã¹ãèšèšã»å®è£
ã»ã¬ãã¥ãŒã®äžé£ã®ã¯ãŒã¯ãã㌠--- # ãã¹ãå®è£
ã¯ãŒã¯ãããŒç®¡çãšãŒãžã§ã³ã ãã®ãšãŒãžã§ã³ãã¯ããã¹ãã®èšèšããå®è£
ãã¬ãã¥ãŒãŸã§ã®äžé£ã®ã¯ãŒã¯ãããŒã管çããŸãã**åãã§ãŒãºã§é©åãªãµããšãŒãžã§ã³ããåŒã³åºã**ãé«å質ãªãã¹ãã³ãŒããäœæããŸãã ## ã¯ãŒã¯ãããŒæŠèŠ 1. **ãã¹ãèšèš** â 2. **ãã¹ãå®è£
** â 3A. **䞊åãã¹ãã¬ãã¥ãŒ** â 3B. **çµ±åä¿®æ£ã»æçµèª¿æŽ** â 4. **æçµç¢ºèª** ãã¹ãèšèšåŸã«ãŠãŒã¶ãŒã¬ãã¥ãŒãæ±ãããŠãŒã¶ãŒã®ä¿®æ£åŸæ¿èªãåŸãŠãããã¹ãå®è£
以éã®ãã§ãŒãºã«é²ã¿ãŸãã ## å®è¡æé ### Phase 1: ãã¹ãèšèš ð **䜿çšãšãŒãžã§ã³ã**: `generate-test-spec` 1. 察象ãã¡ã€ã«ãåæ 2. ãã¹ãèšèšæžãäœæïŒ`<fileName>ãã¹ãèšèšæž.md`ïŒ 3. **ãŠãŒã¶ãŒã«èšèšæžã®ã¬ãã¥ãŒã»ä¿®æ£ãäŸé Œ** 4. æ¿èªãåŸããæ¬¡ãã§ãŒãºãž ### Phase 2: ãã¹ãå®è£
ð» **䜿çšãšãŒãžã§ã³ã**: `implement-test` 1. ãã¹ãèšèšæžãåºã«ãã¹ãã³ãŒããå®è£
2. ãã¹ããå®è¡ããŠã«ãã¬ããžç¢ºèª 3. ãšã©ãŒãããå Žåã¯ä¿®æ£ïŒæå€§3å詊è¡ïŒ ### Phase 3A: 䞊åãã¹ãã¬ãã¥ãŒ ð 3ã€ã®ãã¹ãã¬ãã¥ãŒãšãŒãžã§ã³ãã**䞊åå®è¡**ããŠããã®çµæãçµåããåé¡ã®åæãšæ¹åæ¹éã1ã€äœæããŸãïŒ #### Review 1: åºæ¬ä¿®æ£åæ **䜿çšãšãŒãžã§ã³ã**: `review-test-first` - åçimportãgetStateãéåæåŠçãªã©ã®åºæ¬çãªåé¡ãåæ - æ¹åæ¹éãšå
·äœçãªä¿®æ£å
å®¹ãææ¡ - **ãã¡ã€ã«ä¿®æ£ããã¹ãå®è¡ã¯è¡ããªã** #### Review 2: DOMã»ãããã£ãŒã»èšå®åæ **䜿çšãšãŒãžã§ã³ã**: `review-test-second` - detectChangesãtranslate颿°ãMockStoreValueãªã©ã®åé¡ãåæ - æ¹åæ¹éãšå
·äœçãªä¿®æ£å
å®¹ãææ¡ - **ãã¡ã€ã«ä¿®æ£ããã¹ãå®è¡ã¯è¡ããªã** #### Review 3: spyOnã»é
åã»è¿œå ã«ãŒã«åæ **䜿çšãšãŒãžã§ã³ã**: `review-test-third` - å°çšãããã£ãŒãspyOné
眮ãDOMèŠçŽ ååŸãªã©ã®åé¡ãåæ - æ¹åæ¹éãšå
·äœçãªä¿®æ£å
å®¹ãææ¡ - **ãã¡ã€ã«ä¿®æ£ããã¹ãå®è¡ã¯è¡ããªã** #### ã¬ãã¥ãŒçµæãã¡ã€ã«çæ - ã¬ãã¥ãŒçµæãã¡ã€ã«å: `<fileName>ã¬ãã¥ãŒçµæ.md` - 管çã®ããã¬ãã¥ãŒå¯Ÿè±¡ãã¡ã€ã«ãšåãã£ã¬ã¯ããªã«çæ - å å·¥ã¯è¡ããåã¬ãã¥ãŒãšãŒãžã§ã³ãããè¿åŽãããçµæãçµåãã ### Phase 3B: çµ±åä¿®æ£ã»æçµèª¿æŽ ð ïž **䜿çšãšãŒãžã§ã³ã**: `consolidate-test-fixes` - **åãã§ãŒãºã§äœæããã¬ãã¥ãŒçµæãã¡ã€ã«ãæž¡ããŸã** 1. **å®éã®ä¿®æ£å®è¡**: çµ±åãããä¿®æ£èšç»ã«åŸã£ãŠãã¡ã€ã«ãä¿®æ£ 2. **ãã¹ãå®è¡**: ä¿®æ£åŸã®ãã¹ããå®è¡ããŠåäœç¢ºèª 3. **æçµèª¿æŽ**: ãšã©ãŒãããã°åå åæããŠåä¿®æ£ 4. **æçµç¢ºèª**: ããäžåºŠäžŠåãã¹ãã¬ãã¥ãŒãè¡ããä¿®æ£ãå®äºããŠãããã確èªãã 5. **ã¬ãã¥ãŒãã¡ã€ã«ã®åé€**: äžèŠã«ãªã£ãã¬ãã¥ãŒãã¡ã€ã«ãåé€ãã ### Phase 4: å®è£
æçµç¢ºèª â
ïž å®è£
å
容ãèšèšæžããä¹é¢ããå
容ã«ãªã£ãŠããªãããç¢ºèª ## 泚æäºé
### åãã§ãŒãºå
±é - ãšã©ãŒãåé¡ãçºçããå Žåã¯è©³çްããŠãŒã¶ãŒã«å ±å ### ãã¹ãå®è¡ã³ãã³ã ```bash npm run test <project> --specs=<testFile> --agent # e.g. npm run test viewer --specs=hoge.component --agent ``` YOU MUST: **ãã¹ãå®è¡æã¯å¿
ã`npm run test <project> --specs=<testFile> --agent`ã䜿çšããä»ã®ã³ãã³ãå®è¡ã詊ã¿ãªãããšãç¹ã«`--agent`ãªãã·ã§ã³ã远å ããªããšãã¹ããçµäºããŸãã** - `<project>`: ãããžã§ã¯ãåïŒ`viewer`, `myportal`, `core`, `sdk`ã®ããããïŒ - `<testFile>`: `.spec.ts`ãé€ããã¹ããã¡ã€ã«ãã¹ãäŸïŒ`example.component` ### åè³ªåºæº - ã«ãã¬ããž: 95%ä»¥äž - ãã¹ãŠã®ãã¹ãã±ãŒã¹ãæåããããš - ã³ãŒãã¹ã¿ã€ã«ããããžã§ã¯ãã®èŠçŽã«æºæ ããŠããããš ## ãã©ãã«ã·ã¥ãŒãã£ã³ã° ### ãã¹ãã倱æããå Žå 1. ãšã©ãŒã¡ãã»ãŒãžãç¢ºèª 2. consolidate-test-fixesãšãŒãžã§ã³ãã§åä¿®æ£ãè©Šè¡ 3. 3å詊è¡ããŠã解決ããªãå Žåã¯`investigate-test-pattern`ãšãŒãžã§ã³ãã䜿çšããŠåæ§ã®å®è£
ããªãã調æ»ããŠããåä¿®æ£ ### ã¬ãã¥ãŒã§åé¡ãèŠã€ãããªãå Žå 1. 該åœããã¬ãã¥ãŒãšãŒãžã§ã³ãïŒreview-test-\*ïŒãåå®è¡ 2. ç¹å®ã®åé¡ã«çŠç¹ãåœãŠãŠã¬ãã¥ãŒãæç€º 3. æ°ããªã¬ãã¥ãŒçµæã§consolidate-test-fixesãåå®è¡ å
šäœã®æµããšããŠã¯ã以äžã®4ã¹ãããã§ãã ãã¹ãèšèš ãŸã generate-test-spec ãšãŒãžã§ã³ãã察象ã³ãŒããåæãããã¹ãèšèšæžãäœæããŸããããã§éèŠãªã®ã ã人éã®æ¿èªã ãå¿
é ã«ããŠããç¹ã§ããèšèšæžããããžã§ã¯ãã®æå³ãšåèŽããŠãããããšã³ãžãã¢ã確èªããä¿®æ£ãçµãŠOKãåºãŠåããŠå®è£
ãã§ãŒãºãžé²ãããã«ããŠããŸãã ãã¹ãå®è£
æ¿èªãããèšèšæžãå
ã«ã implement-test ãšãŒãžã§ã³ããã³ãŒãã£ã³ã°ãè¡ããŸããããã§ã¯ãã¹ãã®å®è¡ãšã«ãã¬ããžç¢ºèªãŸã§ãèªåŸçã«è¡ãããšã©ãŒãåºãã°èªå·±ä¿®æ£ããããã«æç€ºããŠããŸãã ããã§å·¥å€«ããç¹ã¯ãå®è£
å
容ã«çŽæ¥é¢ä¿ããªãåŒç€Ÿç¹æã®ã«ãŒã«ïŒåœåèŠåãã¹ã¿ã€ã«ïŒã¯ãããŠãã®å·¥çšã§ã¯æç€ºããªãããšã§ããã«ãŒã«ã峿 Œã«å®ãããããšãããšãèå¿ãªåŠçã«é¢ããããžãã¯ã®ç²ŸåºŠãèœã¡ãŠããŸãåŸåããã£ãçµéšããã£ãããã§ããããã«ãã£ãŠããŸãã¯çŽç²ãªåŠçã®ã¿ã«éäžãããããšã§ãæ¬æ¥ã®ã³ãŒãã£ã³ã°ã¹ãã«ãååã«çºæ®ããŠãããã Claude Codeãèªä¿¡ãæã£ãŠ å®è£
ããŠããããããã«ãªã£ããšã®ããšã§ãã 䞊åããªãã«ã¬ãã¥ãŒ å®è£
ãããã³ãŒãã«å¯Ÿãã3ã€ã®ç°ãªãå°éå®¶ãšãŒãžã§ã³ãã 䞊åã§ ã¬ãã¥ãŒãè¡ããŸãã Reviewer A: åºæ¬çãªæ§æãéåæåŠçã®ãã§ã㯠Reviewer B: DOMæäœããããã£ãŒã®æ£ç¢ºæ§ãã§ã㯠Reviewer C: SpyOnãã¢ãã¯å®çŸ©ãªã©ãé«åºŠãªã«ãŒã«ã®ãã§ã㯠ãã®éçšã§ã¯ã2çªç®ã®ã¹ãããã®åºåçµæãããšã«ãåŠçå
容ã«ã¯é¢ä¿ãªãåŒç€Ÿç¹æã®ã«ãŒã«ã«æ²¿ã£ãŠãããã®ç¢ºèªã®ã¬ãã¥ãŒãè¡ããææ¡ã®ã¿ãè¡ããŸããã³ãŒãç·šéã¯è¡ããŸããã ããã«ãã£ãŠã以äžã®3ã€ã®ã¡ãªããããã£ããšã®ããšã§ãã è€æ°ã®é
ç®ãAgentã«æãããšã现ããèŠèœãšããå€ããªãåŸåã«ãã£ãããSubagentsã§åããããšã§ãç¹å®ã®èгç¹ã«çµãããšãã§ãã粟床ãäžãã£ã 䞊åå®è¡ããããšã§ãå®è¡é床ãåäžãã åŠçå
容ã®ã¬ãã¥ãŒã¯èæ
®ããã«ãã¹ã¿ã€ã«ã¬ãã¥ãŒã«éå®ãããããšã§ããã®éçšã§åŒç€Ÿç¹æã®ã«ãŒã«ã衚çŸãå
¥ã蟌ãããšãã§ãã çµ±åä¿®æ£ã»æçµèª¿æŽ 3å¹ã®ã¬ãã¥ã¢ãŒããäžãã£ãŠããææäºé
ã consolidate-test-fixes ãšãŒãžã§ã³ããéçŽããå®éã®ã³ãŒãä¿®æ£ã«é©çšããŸããæåŸã«æ¹ããŠãã¹ããåããèšèšæžãšã®ä¹é¢ããªããã確èªããŠå®äºãšãªããŸãã ãã®ã¯ãŒã¯ãããŒãããããããæé以äžã®ã䟡å€ã ãã®ãåèªååããå°å
¥ããçµæããã¹ãå®è£
ã«ãããæéã¯ äœæã§çŽ20%ççž® ãããŸãããæ°åã ãèŠããšåçãªå€åã§ã¯ãªãããã«èŠãããããããŸãããããããæ±æ¢ããã¯ãæéç瞮以äžã®äŸ¡å€ãããããšèªããŸãã 䞊è¡åŠçã«ããçç£æ§åäž AIãã³ãŒããæžããŠããéã人éã¯Slackã®è¿ä¿¡ãBacklogã®æŽçããããã¯ä»ã®è€éãªå®è£
ã®èå¯ãªã©ãå¥ã®ã¿ã¹ã¯ãããªããããã«ãªããŸããã0ãã1ã®é¢åãªèšè¿°ãAIãè©ä»£ããããŠãããããšã§ãè³ã®ã¡ã¢ãªãä»ã®æ¥åã«å²ããããã«ãªã£ãããã§ãã å質ã®åäž AIãšã®å¯Ÿè©±ã®äžã§ãããã®ãšããžã±ãŒã¹ã¯èæ
®ããŸãããïŒããšéã«ææãããããšããããäžäººã§æžãããããã¹ãã®ç¶²çŸ
æ§ãäžãã£ããšãããŸãã ãããã«ïŒAIãšã®åæ¥ãåœããåã«ãªãæªæ¥ãž ä»åã¯ãæ°å2幎ç®ãå®è·µãããçæAIãçšãããã¹ãåèªååã¯ãŒã¯ãããŒã«ã€ããŠç޹ä»ããŸãããä»å玹ä»ããã¯ãŒã¯ãããŒãå°å
¥ããããšã§ã2025幎6æã2025幎12æãŸã§ã«å®äºãããšããç®æšã ã£ãäºå®ãã2ã¶ææ©ãçµããããšãã§ãããšã®ããšã§ãã ä»åŸã¯ããã®ããŠããŠãããŒã å
šäœããéçºéšçœ²å
šäœã«åºãã€ã€ããããªã粟床ã®åäžã«åãçµãã§ãããããšã®ããšã§ãã ãŸããçæAIããã¹ãèªåå以å€ã®ããšã§äœ¿ã£ãŠããããåéã¯ããããèããŠã¿ãŸããã ãå匷ã«äœ¿ããããªãšæã£ãŠããŸãïŒ10æã«åºå€ããŠã10æã12æã¯ãšãŒãžã§ã³ãã«ä»»ããŠããéã«ãåªé
ã«ã³ãŒããŒã飲ã¿ãªããææ°æè¡ã®ãã£ããã¢ããã«è²»ãããããªãšæã£ãŠãŸãããããŠããã£ãšäœ¿ããšãŒãžã§ã³ããå¢ãããŠã10ã20å¹ã®Agentã«å¯ŸããŠæç€ºãåºããŠãæã£ãŠã¿ãããªãšããéæããããŸããã æåŸã«ãããããAIã䜿ãããªããããšèããŠããåŸèŒ©ãåŠçãšã³ãžãã¢ãžã®ã¢ããã€ã¹ãããããŸããã ã䜿ãããªãæ¹ãããçæAIã«èãããè¯ããšæããŸãïŒç¬ããã€ãã³ãŒãã£ã³ã°ãæµè¡ã£ãŠããŸããããã¯ããèªãåã¯åŒãç¶ãå¿
èŠã«ãªã£ãŠããã®ã§ã¯ãªãããšæã£ãŠããŸãã倧åãªã®ã¯ãAIã«äœ¿ãããã®ã§ã¯ãªãã䜿ãããªãåŽã«ãªãããšãAIãåºããŠããææç©ã«å¯ŸããŠãèªåã®é ã§èããçãã責任ãæã€ããšã³ãžãã¢ãšããŠã®ãæèåãããããããã®æä»£ããéèŠã«ãªããšæããŸããã AIã¯ãããŸã§ããŒã«ã§ãããæåŸã«å質ãä¿èšŒããã®ã¯ãšã³ãžãã¢èªèº«ã§ãããã®åœããåã®ååãå¿ããã«ãAIããè³¢ãéšäžãã®ãããªç«ã¡äœçœ®ã§æŽ»çšããååããŠããã¹ã¿ã€ã«ããããããããã®éçºã®ã¹ã¿ã³ããŒãã«ãªã£ãŠããã®ãããããŸããã ããŸæ¹ããŠãAIãšã®åãåãæ¹ãæèçã«èããããšãæãéèŠã ãšæ°ä»ããããŸããã 以äžãæ°å2幎ç®ãå®è·µãããã¹ãåèªååã«é¢ããã玹ä»ã§ããã
ãã®èšäºã¯Â Safie Engineers' Blog! Advent Calendar 2025 11æ¥ç®ã®èšäºã§ãã ã¯ããã« ä»å¹Žãæ®ããšããããšããããšãªããŸããããAIéçºéšã®ç°äžã§ãã çŸåšã¯ãè€æ°ã®ã«ã¡ã©æ åãçµ±åããŠè§£æããã·ã¹ãã ã®R&DïŒç ç©¶éçºïŒã«åãçµãã§ããŸãã ç»åèªèAIã®åéã§ã¯Pythonãäž»æµã§ããã ãPythonã§ããžãã¯ãæžããããåŠçãé
ãããŠãªã¢ã«ã¿ã€ã æ§ã確ä¿ã§ããªãã ãšããå£ã«ã¶ã€ãã£ãããšã¯ãããŸãããïŒ ä»åã¯ã6å°ã®ã«ã¡ã©ã䜿ã£ã ãªã¢ã«ã¿ã€ã ãã«ãã«ã¡ã©ãã©ããã³ã° ãå®è£
ããéçšã§ãŸãã«ãã®åé¡ã«çŽé¢ããäžéšã®åŠçã Rust ã«çœ®ãæããããšã§åçãªé«éåãå®çŸãã話ã玹ä»ããŸãã ãRustã¯é£ãããããšæã£ãŠããæ¹ã§ããPythonãšé£æºãããã ããªãæå€ãšããŒãã«ã¯é«ããããŸããããã²æåŸãŸã§ãä»ãåããã ããã ã¯ããã« ãªã¢ã«ã¿ã€ã ãã«ãã«ã¡ã©ãã©ããã³ã°ãšã¯ ã·ã¹ãã æ§æãšæè¡ã¹ã¿ã㯠1. æšè«éšïŒæ åã®ãã³ãŒãã»AIæšè«ïŒ 2. çµ±åéšïŒãã©ããã³ã°ã»IDçµ±åïŒ Pythonã§ã®éçãšRustãžã®è»¢æ ãªãRustãéžãã ã PyO3ãšmaturinã䜿ã£ãå®è£
ãã㌠åæããŒã« 1. ãããžã§ã¯ãã®ã»ããã¢ãã 2. Rustã³ãŒãã®å®è£
(src/lib.rs) 3. Pythonããã®åŒã³åºã (main.py) 4. ãã«ããšå®è¡ å°å
¥çµæïŒ10å以äžã®é«éåãå®çŸ ãŸãšã ãªã¢ã«ã¿ã€ã ãã«ãã«ã¡ã©ãã©ããã³ã°ãšã¯ ãªã¢ã«ã¿ã€ã ãã«ãã«ã¡ã©ãã©ããã³ã°ïŒãªã³ã©ã€ã³ãã«ãã«ã¡ã©ãã©ããã³ã°ïŒãšã¯ãRTSPãªã©ã§æ¥ç¶ããè€æ°ã®ã«ã¡ã©ããçŸåšã®æ åãååŸãããªã¢ã«ã¿ã€ã ã«ä»¥äžã®åŠçãè¡ãæè¡ã§ãã æ€åº : ã«ã¡ã©ããšã«è¢«åäœã®é åïŒããŠã³ãã£ã³ã°ããã¯ã¹ïŒãæ€åº 远跡 : ã«ã¡ã©å
ã§è¢«åäœã远跡ããã«ã¡ã©å
ã®IDãå²ãåœãŠ ç¹åŸŽæœåº : 被åäœã®èŠãç®ã®ç¹åŸŽéïŒReIDç¹åŸŽéãªã©ïŒãæœåº çµ±å : å
šã«ã¡ã©ã®æ
å ±ãçµ±åãããšãªã¢å
šäœã§ã被åäœãã©ãã«ãããããäžæã«ç¹å® ãããã ãæ¬¡ã®ãã¬ãŒã ã®æ åãæ¥ãåã ã«å®äºãããå¿
èŠããããŸãã ä»åç®æããã¹ããã¯ã¯ã ããããã¯ãŒã¯ã«ã¡ã©6å°ãå20FPSã ã§ããã€ãŸããå
šã«ã¡ã©ã®åŠçã 50ããªç§ïŒ1000ms / 20fpsïŒä»¥å
ã«å®äºãããªããã°ãé
å»¶ãçºçããŠããŸããŸãã ã·ã¹ãã æ§æãšæè¡ã¹ã¿ã㯠ã·ã¹ãã ã®å€§ãŸããªæ§æå³ã¯ä»¥äžã®éãã§ãã åŠçã¯å€§ãããæšè«éšããšãçµ±åéšãã«åãããŠããŸãã 1. æšè«éšïŒæ åã®ãã³ãŒãã»AIæšè«ïŒ GPUãªãœãŒã¹ãæå€§éã«æŽ»ãããããNVIDIAã®æè¡ãæ¡çšããŠããŸãã DeepStream SDK GStreamerããŒã¹ã®ãã«ãã¡ãã£ã¢ãã¬ãŒã ã¯ãŒã¯ãåç»ã®ãã³ãŒããDNNæšè«ããã€ãã©ã€ã³åŠçã§é«éã«å®è¡å¯èœã§ãã DeepStream Python Apps DeepStreamãPythonããå¶åŸ¡ããããã®ãã€ã³ãã£ã³ã°ã§ãã ãåºå
žãNVIDIA-AI-IOT, deepstream_python_apps, GitHub https://github.com/NVIDIA-AI-IOT/deepstream_python_apps ïŒ2025幎11æ23æ¥ã¢ã¯ã»ã¹ïŒ 2. çµ±åéšïŒãã©ããã³ã°ã»IDçµ±åïŒ æšè«çµæãåãåããããžãã¯ããŒã¹ã§è¢«åäœã®åäžæ§å€å®ãè¡ããŸãã Python : å
šäœã®å¶åŸ¡ã»ã°ã«ãŒã³ãŒã Rust : èšç®ã³ã¹ãã®é«ããããã³ã°åŠçãæ
åœ PyO3 & maturin : PythonãšRustãç¹ãããã®ããŒã«çŸ€ ãåºå
žãPyO3 Project, PyO3 User Guide, WebããŒãž https://pyo3.rs/main/index.html ïŒ2025幎12æ10æ¥ã¢ã¯ã»ã¹ïŒ ãåºå
žãPyO3 Project, maturin, GitHub https://github.com/PyO3/maturin ïŒ2025幎12æ10æ¥ã¢ã¯ã»ã¹ïŒ Pythonã§ã®éçãšRustãžã®è»¢æ æšè«éšã«é¢ããŠã¯ãDeepStreamã®æ©æµã«ããPythonãã€ã³ãã£ã³ã°çµç±ã§ãååé«éã§ããã åé¡ãçºçããã®ã¯ãåŸæ®µã®ãçµ±åéšãã§ãã è€æ°ã®ã«ã¡ã©ããæ€åºããã被åäœã®äœçœ®ãç¹åŸŽéãç·åœããã§æ¯èŒããåäžè¢«åäœå€å®ãè¡ãåŠçïŒãããã³ã°åŠçïŒã«ãããŠãPythonã®åŠçé床ãããã«ããã¯ã«ãªããŸããã ã«ã¡ã©ãå¢ãã被åäœãå¢ããã°å¢ããã»ã©èšç®éã¯ææ°é¢æ°çã«å¢å ããŸãã çŽç²ãªPythonå®è£
ã§ãã¹ããããšããã被åäœãå€ãã·ãŒã³ã§ã¯åŠçã« æ°çŸããªç§ ããã£ãŠããŸããŸãããç®æšã®50ããªç§ã倧å¹
ã«è¶
ããŠãããæ åã¯ã«ã¯ã€ããåŠçèœã¡ã¯é¿ããããªãç¶æ
ã§ãã ãªãRustãéžãã ã NumPyãªã©ã䜿ã£ããã¯ãã«åãæ€èšããŸããããæ¡ä»¶åå²ãå«ãè€éãªããžãã¯ã ã£ããããã³ã³ãã€ã«èšèªãžã®çœ®ãæããæ€èšããŸãããããã§çœçŸœã®ç¢ãç«ã£ãã®ã Rust ã§ãã C++䞊ã¿ã®é«éæ§ : ã¡ã¢ãªå®å
šæ§ãæ
ä¿ããªããçéã§åãã PyO3ã®ãšã³ã·ã¹ãã : Pythonãšã®é£æºãéåžžã«å®¹æã§ãæ¢åã®Pythonã³ãŒãã®äžéšã ããRust颿°ã«çœ®ãæãããéšåçãªå°å
¥ããããããã ãå
šäœãæžãçŽãã®ã¯ç¡çã ããéãã«ãŒãåŠçã ãRustã«ä»»ãããããšããæŠç¥ã§ãã PyO3ãšmaturinã䜿ã£ãå®è£
ãã㌠ããããã¯ãå®éã«ä»åæ¡çšããéçºãããŒã玹ä»ããŸãã ããã±ãŒãžç®¡çã«ã¯ãæè¿è©±é¡ã®é«éãªããŒã« uv ã䜿çšããŸããã åæããŒã« uv : Pythonã®ããã±ãŒãžç®¡çã»ãããžã§ã¯ã管çããŒã« Rust : ã³ã³ãã€ã©èšèªïŒcargoãªã©ãå«ãŸããŸãïŒ 1. ãããžã§ã¯ãã®ã»ããã¢ãã maturin ã䜿ãã°ãRustã®ãããžã§ã¯ãäœæããPythonããã±ãŒãžãšããŠã®ãã«ããŸã§äžæ°é貫ã§è¡ããŸãã # äœæ¥ãã£ã¬ã¯ããªãžç§»å cd ${WORK_DIR} # maturinã®ã€ã³ã¹ããŒã«ïŒuv toolã䜿çšïŒ uv tool install maturin # PyO3ãã€ã³ãã£ã³ã°ãå«ãæ°èŠãããžã§ã¯ãäœæ # --mixed ãªãã·ã§ã³ã§PythonãšRustã®ãã€ããªããæ§æãäœæ uvx maturin new -b pyo3 --mixed study_maturin cd study_maturin # ä»®æ³ç°å¢ã®äœæïŒPython 3.12æå®ïŒ uv venv -p 3 . 12 2. Rustã³ãŒãã®å®è£
(src/lib.rs) ããã©ã«ãã§çæãããã³ãŒãã§ãã use pyo3 :: prelude :: * ; /// 2ã€ã®æ°å€ãè¶³ããŠæååãšããŠè¿ã颿° #[pyfunction] fn sum_as_string (a: usize , b: usize ) -> PyResult < String > { Ok ((a + b). to_string ()) } /// Pythonã¢ãžã¥ãŒã«ãšããŠã®å®çŸ© #[pymodule] fn study_maturin (m: & Bound < '_ , PyModule > ) -> PyResult < () > { // PythonããåŒã¹ã颿°ãšããŠç»é² m. add_function ( wrap_pyfunction! (sum_as_string, m) ? ) ? ; Ok (()) } 3. Pythonããã®åŒã³åºã (main.py) ãã«ããããRustã®é¢æ°ã¯ãéåžžã®Pythonã¢ãžã¥ãŒã«ãšåãããã«importããŠäœ¿çšã§ããŸãã import study_maturin def main (): a = 2 b = 3 # Rustã§å®è£
ããã颿°ãåŒã³åºã result = study_maturin.sum_as_string(a, b) print (f "The sum of {a} and {b} is: {result}" ) if __name__ == "__main__" : main() 4. ãã«ããšå®è¡ éçºã¢ãŒãïŒ maturin develop ïŒã§ãã«ããããšãçŸåšã®ä»®æ³ç°å¢ã«ããã±ãŒãžãã€ã³ã¹ããŒã«ãããŸããæ¬çªæ§èœãåºããã --release ãä»ããŠããŸãã # ãã£ãã·ã¥ã¯ãªã¢ïŒå¿µã®ããïŒ uv cache clean # ãªãªãŒã¹ãã«ãã§ã€ã³ã¹ããŒã« uvx maturin develop --release # Pythonã¹ã¯ãªããå®è¡ uv run main.py å®è¡çµæ: The sum of 2 and 3 is: 5 ãã®ããã«ãéåžžã«å°ãªãæé ã§Rustã®é¢æ°ãPythonããåŒã³åºãããšãã§ããŸããã ä»åã¯åçŽãªè¶³ãç®ã§ãããå®éã®æ¥åã§ã¯ããã«ããã«ãã«ã¡ã©ã®IDçµ±åããžãã¯ããå®è£
ããŸããã RuståŽã§æ§é äœãå®çŸ©ããŠPythonã®ã¯ã©ã¹ãšããŠæ±ã£ãããåãã³ãïŒ.pyiãã¡ã€ã«ïŒãçæããŠVSCodeã§ã®è£å®ãå¹ããããããããšãå¯èœã§ãã å°å
¥çµæïŒ10å以äžã®é«éåãå®çŸ çµ±åéšã®ããã«ããã¯ãšãªã£ãŠããè§£æããžãã¯ãRustã«çœ®ãæããçµæãããã©ãŒãã³ã¹ã¯åçã«æ¹åããŸããã Before (Python) : 1ãã¬ãŒã ããã 300msè¶
ïŒããŒã¯æïŒ After (Rust) : 1ãã¬ãŒã ããã 30ms以å
çŽ10å以äžã®é«éå ãéæããç®æšãšããŠããã6å°ã»20FPSïŒ50ms以å
ïŒãã®åŠçæéãäœè£ãæã£ãŠã¯ãªã¢ããããšãã§ããŸãããããã«ããããªã¢ã«ã¿ã€ã ã§æ»ãããªãã©ããã³ã°ãå®çŸã§ããŠããŸãã ãŸãšã ãPythonã¯é
ãããšè«Šããåã«ãããã«ããã¯éšåã ããRustã«ãªãããŒãããã¢ãããŒãã¯éåžžã«æå¹ã§ããã ç¹ã« PyO3 ãš maturin ïŒãã㊠uv ïŒã®ãšã³ã·ã¹ãã ã®ãããã§ãPythonãšã³ãžãã¢ã«ãšã£ãŠãRustå°å
¥ã®æ·å±
ã¯ããªãäœããªã£ãŠãããšæããŸãã ä»åã¯ããžãã¯ã®äžéšã®ã¿ã®çœ®ãæãã§ããããä»åŸã¯Rustã§åŠçããé åãåºããã·ã¹ãã å
šäœã®å
ç¢æ§ãšããã©ãŒãã³ã¹åäžã«ææŠããŠãããããšæããŸãã
ãã®èšäºã¯ Safie Engineers' Blog! Advent Calendar 10æ¥ç®ã®èšäºã§ã ããã«ã¡ã¯ïŒSafieïŒã»ãŒãã£ãŒïŒã§ã¢ãã€ã«ã¢ããªã®éçºãããŠããæ²³å( @rui_qma )ã§ãã ð ã¯ããã«ïŒãªãComposeã§ãã©ãã°ïŒãããããå¿
èŠãªã®ã åŸæ¥ã®Viewã·ã¹ãã ãšã®å£ AndroidããŒã ã§ã¯Android ViewããŒã¹ã®UIãã Jetpack Compose ããŒã¹ã®UIãžã®ç§»è¡ãé²ããŠããŸãã åŒç€Ÿã®ãããã¯ãã Safie Viewer ïŒã»ãŒãã£ãŒ ãã¥ãŒã¢ãŒïŒãã®ã«ã¡ã©äžèЧç»é¢ã«ã¯ãã«ã¡ã©ã®é çªããã©ãã°ïŒããããïŒD&DïŒã«ãã£ãŠäžŠã³æ¿ããæ©èœããããŸãã åŸæ¥ã®Android Viewã§ã¯ã RecyclerView ã« ItemTouchHelper ãçµã¿åãããããšã§ãD&Dã«ããäžŠã³æ¿ããå
¬åŒAPIãšããŠç°¡åã«å®çŸã§ããŠããŸããã ããããJetpack Composeã§ã¯ã2025幎11æçŸåšã LazyVerticalGrid ïŒãŸã㯠LazyColumn ïŒå
ã§åæ§ã®D&DäžŠã³æ¿ãæ©èœããå
¬åŒAPIã ãã§ãå®çŸããããã®å°çšã®ã³ã³ããŒãã³ãã¯ãŸã æäŸãããŠããŸããã( composeBom : 2025.11.01ã§ç¢ºèª) æ¬èšäºã§ã¯ããã®ãComposeã§ãã©ãã°ïŒããããã«ããäžŠã³æ¿ããå¯èœãªã°ãªãããããå
¬åŒAPIæªæäŸã®äžã§ã©ã®ããã«äœã蟌ããããã®èšèšãšå®è£
ææ³ã«ã€ããŠè§£èª¬ããŸãã ð ã¯ããã«ïŒãªãComposeã§ãã©ãã°ïŒãããããå¿
èŠãªã®ã åŸæ¥ã®Viewã·ã¹ãã ãšã®å£ âš å®çŸãããæ©èœã®èŠä»¶å®çŸ© ðŠÂ Step0: åå°ãšãªãComposableãçšæ ðStep1: èŠçŽ ã®é·æŒãæ€åºãšè§ŠèŠãã£ãŒããã㯠å®è£
ã®ãã€ã³ã âïžStep2: èŠçŽ ããã©ãã°ããŠç§»åãã å®è£
ã®ãã€ã³ã ðStep3: ãã©ãã°ã«ããèŠçŽ ã®å
¥ãæ¿ãåŠç å®è£
ã®ãã€ã³ã ð«Step4: å
¥ãæ¿ããéã®ã¢ãã¡ãŒã·ã§ã³ãå®è£
å®è£
ã®ãã€ã³ã â¬ïžStep5: ãªã¹ãã®äžäžç«¯å°éæã®èªåã¹ã¯ããŒã« å®è£
ã®ãã€ã³ã ð ãŸãšããšä»åŸã®å±æ ðå°æ¥çãªèŠéã ð» å®è£
ã³ãŒã âš å®çŸãããæ©èœã®èŠä»¶å®çŸ© ä»åã®èšäºã§å®è£
ãç®æãD&DäžŠã³æ¿ãã°ãªããã®èŠä»¶ã¯ä»¥äžã®5ç¹ã§ãã èŠçŽ ã é·æŒã ããã¿ã€ãã³ã°ã§D&Då¯èœç¶æ
ã«ãã è§ŠèŠãã£ãŒããã㯠ãå®è¡ããã ãã©ãã°ã«æ²¿ã£ãŠèŠçŽ ãç§»åãããã é çªã®å
¥ãæ¿ãããçºçããå Žåã ã¢ãã¡ãŒã·ã§ã³ ã§èŠèŠçã«è¡šçŸããã ãã©ãã°äœçœ®ããªã¹ãã®äžäžç«¯ã«éããå Žåã ãªã¹ãèªäœãèªåã§ã¹ã¯ããŒã« ããã ãã©ãã°çµäºæã«èŠçŽ ãå®äœçœ®ã«æ»ãã ãããã®æ©èœããåå°ãšãªãComposableããæ®µéçã«å®è£
ããŠãããŸãã ðŠÂ Step0: åå°ãšãªãComposableãçšæ ä»åã®èšèšæ¹éãšããŠLazyVerticalGridãã©ããããComposableãäœæã(DraggableGridãšåœå)ããã®Composableã®äžã§ç¶æ
ã®ç®¡çåã³D&Dæ©èœã®æ¡åŒµãé²ããŠãããŸãã @Composable fun DraggableGrid( list: List < String >, modifier: Modifier = Modifier, itemContent: @Composable (item: Camera, modifier: Modifier) -> Unit , ) { val lazyGridState = rememberLazyGridState() LazyVerticalGrid( modifier = modifier, columns = GridCells.Fixed( 3 ), state = lazyGridState, horizontalArrangement = Arrangement.spacedBy( 12 .dp), verticalArrangement = Arrangement.spacedBy( 12 .dp), ) { items(list) { id, modifier -> itemContent(id, modifier) } } } ðStep1: èŠçŽ ã®é·æŒãæ€åºãšè§ŠèŠãã£ãŒããã㯠èŠçŽ ã®é·æŒããæ€ç¥ããåŠçãå®è£
ããŸãã å®è£
ã®ãã€ã³ã ãã©ãã°å¯Ÿè±¡ã®ComposeèŠçŽ ã« Modifier.pointerInput ã远å pointerInputå
ã§ãžã§ã¹ãã£ãŒæ€åºé¢æ° detectDragGesturesAfterLongPress ã§é·æŒããæ€åº onDragStart ã«é·æŒãæã®åŠçã onDrag ã«ãã©ãã°äžã®åŠçãå®è£
ãã è§ŠèŠãã£ãŒãããã¯ã¯ performHapticFeedback ãåŒã³åºãããšã§åäœããããã以äžã®ããã«å®è£
ããããšã«ãã£ãŠãŠãŒã¶ãŒã«é·æŒãç¶æ
ã§ããããšãç¥ãããããšãã§ããŸãã Developers ... val haptic = LocalHapticFeedback.current LazyVerticalGrid( modifier = modifier.pointerInput( Unit ) { detectDragGesturesAfterLongPress( onDragStart = { offset -> // ãã©ãã°éå§æã«è¡ãããåŠçãããã«å®è£
ãã haptic.performHapticFeedback(HapticFeedbackType.LongPress) // è§ŠèŠãã£ãŒããã㯠}, onDrag = { change, dragAmount -> // ãã©ãã°äžã«è¡ãããåŠçãããã«å®è£
ãã change.consume() // ãã©ãã°ã€ãã³ãã®æ¶è²» }, onDragEnd = { // ãã©ãã°çµäºæã«è¡ãããåŠçãããã«å®è£
ãã }, onDragCancel = { // ãã©ãã°ããã£ã³ã»ã«ãããæã«è¡ãããåŠçãããã«å®è£
ãã } ) }, ... âïžStep2: èŠçŽ ããã©ãã°ããŠç§»åãã Step1ã§èšè¿°ããdetectDragGesturesAfterLongPressã®ã³ãŒã«ããã¯ã«ãã©ãã°ã«é¢ããåŠçãå®è£
ããŠãããŸãã å®è£
ã®ãã€ã³ã onDragStartã§ãã©ãã°å¯Ÿè±¡ã®ã€ã³ããã¯ã¹ãååŸ onDragã§ãã©ãã°éãå ç®ããŠä¿æ ãã©ãã°å¯Ÿè±¡èŠçŽ ã«å¯Ÿã㊠Modifier.offset ã§ãã©ãã°éãæå®ããŠç§»å onDragEnd, onDragCancelã§ãã©ãã°éãåæå ïŒä»åã¯ç°¡åã«å®è£
ããããã«Composableå
ã§ã€ã³ããã¯ã¹ããªãã»ããçã®ç¶æ
ã管çããŠããŸãããStateã¯ã©ã¹ã®äœæãªã©Viewãšã¯åé¢ããŠç®¡çããããšããªã¹ã¹ã¡ããŸãïŒ val density = LocalDensity.current var draggingIndex by remember { mutableIntStateOf( 0 ) } var dragOffset by remember { mutableStateOf(Offset.Zero) } LazyVerticalGrid( modifier = modifier.pointerInput( Unit ) { detectDragGesturesAfterLongPress( onDragStart = { offset -> // ãã©ãã°éå§äœçœ®ã®ã€ã³ããã¯ã¹ãååŸ draggingIndex = lazyGridState.layoutInfo.visibleItemsInfo.find { info -> val rect = Rect(info.offset.toOffset(), info.size.toSize()) rect.contains(offset) }?.index ?: - 1 haptic.performHapticFeedback(HapticFeedbackType.LongPress) // è§ŠèŠãã£ãŒããã㯠}, onDrag = { change, dragAmount -> dragOffset + = dragAmount change.consume() // ãã©ãã°ã€ãã³ãã®æ¶è²» }, onDragEnd = { dragOffset = Offset.Zero }, onDragCancel = { dragOffset = Offset.Zero } ) }, ... ) { itemsIndexed( items = list, key = { index, item -> item }, ) { index: Int , item: String -> val dragging = draggingIndex == index val modifier = if (dragging) { Modifier .offset( x = with(density) { dragOffset.x.toDp() }, y = with(density) { dragOffset.y.toDp() }, ) .zIndex( 1f ) // ãã©ãã°äžã®ã¢ã€ãã ãåé¢ã«è¡šç€º } else { Modifier } itemContent(item, modifier) } } ðStep3: ãã©ãã°ã«ããèŠçŽ ã®å
¥ãæ¿ãåŠç ãã©ãã°äžã¢ã€ãã ã® äžå¿äœçœ® ãä»èŠçŽ ã®é åã«å
¥ã£ãã¿ã€ãã³ã°ã§ããªã¹ãã®é çªãå
¥ãæ¿ããåŠçãå®è¡ããŸãã å®è£
ã®ãã€ã³ã èŠçŽ å
¥ãæ¿ãã³ãŒã«ããã¯(ex: onListChange)ãå®çŸ©ããäžŠã³æ¿ãã®åŠçãå®è£
ãã ãã©ãã°äžã¢ã€ãã ã®äžå¿äœçœ®ãç®åºãã äžå¿äœçœ®ãä»èŠçŽ ã®é åå
ã«ååšããå ŽåãèŠçŽ å
¥ãæ¿ãã³ãŒã«ããã¯ãå®è¡ãã å®éã®å
¥ãæ¿ãããžãã¯ã¯è€éã«ãªããããããã§ã¯è©³çްã岿ããŸããããªã¹ã倿Žã芪ã«å§ããã³ãŒã«ããã¯èšèšãéèŠã§ãã詳现ãªå®è£
㯠ã³ãã© ãåç
§ãã ããã ð«Step4: å
¥ãæ¿ããéã®ã¢ãã¡ãŒã·ã§ã³ãå®è£
èŠçŽ ãå
¥ãæ¿ãã£ãããšããŠãŒã¶ãŒã«ããããããäŒãããããã¢ãã¡ãŒã·ã§ã³ã远å ããŸãã ãã®Stepã«é¢ããŠã¯æšæºã§æäŸãããŠããæ©èœãå©çšããããšã§ãæè»œã«å®è£
ããããšãã§ããŸãã å®è£
ã®ãã€ã³ã ã¢ã€ãã ã«ããŒãèšå®ãã å
¥ãæ¿ããããåŽã®èŠçŽ ã« Modifier.animateItem() ãèšå®ãã itemsIndexed( items = list, key = { index, item -> item }, // ComposeåŽã§ã¢ã€ãã ãç¹å®ããããã®ã㌠) { index: Int , item: String -> val dragging = draggableGridState.draggingIndex == index val offset = draggableGridState.dragOffset val modifier = if (dragging) { Modifier .offset( x = with(density) { offset.x.toDp() }, y = with(density) { offset.y.toDp() }, ) .zIndex( 1f ) } else { Modifier.animateItem() // å
¥ãæ¿ããããåŽã«ã¢ãã¡ãŒã·ã§ã³ãèšå® } itemContent(item, modifier) } â¬ïžStep5: ãªã¹ãã®äžäžç«¯å°éæã®èªåã¹ã¯ããŒã« äŸãã°ã1çªç®ãã100çªç®ã«ç§»åãããããšãã£ã倧å¹
ãªç§»åãè¡ãããå ŽåãçŸç¶ã¯1åã®ãã©ãã°ã«ã€ãæå€§1ç»é¢åããç§»åã§ããªããããè€æ°åã®ãã©ãã°ãå¿
èŠã«ãªããŸãã ãã®åé¡ã解決ããããããã©ãã°ã«ãã£ãŠãªã¹ãã®äžäžç«¯ãŸã§æã£ãŠãã£ãå Žåã¯ãªã¹ãèªäœã®ã¹ã¯ããŒã«ãè¡ãæ©èœãå®è£
ããŸãã å®è£
ã®ãã€ã³ã ãã©ãã°äžã®èŠçŽ ããªã¹ãã®äžäžç«¯ããã©ãã ãã¯ã¿åºããŠããããç®åºãã ã¯ã¿åºããŠããå Žåã¯ãã¯ã¿åºããéã«å¿ããY軞移åéãç®åºãã ãªã¹ããšèŠçŽ ã®äž¡æ¹ãåæã«Y軞移åéåã ãç§»åããïŒåæããïŒ ãã®å®è£
ã¯ããã©ãŒãã³ã¹ãšç«¶ååé¿ã®èгç¹ããè€éãªéšåã§ãããã¹ã¯ããŒã«ãšèŠçŽ ç§»åãåæã«è¡ãåæåŠçã«å·¥å€«ãå¿
èŠã§ãã詳现ãªå®è£
㯠ã³ãã© ãåç
§ãã ããã ð ãŸãšããšä»åŸã®å±æ æ¬èšäºã§ã¯ãJetpack Composeã«ãããŠæšæºã§æäŸãããŠããªãæ©èœãã Modifier.pointerInput ãæŽ»çšããŠãŒãããäœãèŸŒãææ³ã解説ããŸããã ã¿ããã€ãã³ãã®æ€åºããªãã»ããã«ããäœçœ®èª¿æŽã Modifier.animateItem() ã«ããã¢ãã¡ãŒã·ã§ã³ããããŠèªåã¹ã¯ããŒã«ãçµã¿åãããããšã§ãåŸæ¥ã®Android Viewã® RecyclerView + ItemTouchHelper ã«å¹æµãããé«åºŠãªUXãå®çŸããããšãã§ããŸããã ãã®å®è£
ã«ã¯ææ¢ãã®éšåãå€ãããªãã¡ã¯ã¿ãªã³ã°ãããã©ãŒãã³ã¹æ¹åã®äœå°ã¯ååã«ãããšèããŠããŸãããæ¬èšäºãçæ§ã®Composeå®è£
ã®æå©ããšãªãã°å¹žãã§ãã ðå°æ¥çãªèŠéã å·çæç¹ã§ã¯èªåã§ã®å®è£
ãå¿
èŠã§ããããããŒããããã«ã¯ãã©ãã°ïŒããããã«é¢ããèšèŒããããããå°æ¥çã«ã¯æšæºæ©èœãšããŠãµããŒããããå¯èœæ§ãé«ãã§ãã åºå
žïŒJetpack Compose ã®ããŒãããã https://developer.android.com/jetpack/androidx/compose-roadmap?hl=ja ïŒ2025幎12æ3æ¥ã¢ã¯ã»ã¹ïŒ ãããŸã§ã¯ä»å解説ãããããªèªåã®å®è£
ãè¡ããããããã¯ãåŸæ¥ã®Android Viewã® ItemTouchHelper ã ComposeView ã§ãã¹ãããŠå©çšãããšããéžæè¢ãäžã€ã®åé¿çãšãªããŸããç¶æ³ã«å¿ããŠãæé©ãªã¢ãããŒããéžæããŠãã ããã ð» å®è£
ã³ãŒã å·çã«ããã£ãŠå®è£
ããã³ãŒãå
šäœã¯ã以äžã®GitHubãªããžããªã§å
¬éããŠããŸããæ¯éåèã«ããŠãã ããã https://github.com/ruiqma/DraggableGridSample ã¢ãã€ã«ããŒã ã¯éçºãã仲éãåéããŠããŸãïŒ open.talentio.com open.talentio.com
ãã®èšäºã¯ Safie Engineers' Blog! Advent Calendar 2025 9æ¥ç®ã®èšäºã§ãã ã¯ããã« ããã«ã¡ã¯ããšã³ãžãã¢ãªã³ã°ãªãã£ã¹ã®æšªé ( @m_yokomichi )ã§ãã 2025幎ãAIæè¡ã¯ç§ãã¡ã®äºæ³ãè¶
ããã¹ããŒãã§é²åãéããŸãããããŸãçæAIã䜿ãããªãããåŠãã¯ãå人ã®çç£æ§ã ãã§ãªãã ãšã³ãžãã¢ãšããŠã®ãã£ãªã¢ãã²ããŠã¯äŒæ¥ã®ç«¶äºåãã®ãã®ãå·Šå³ãã ãšèšã£ãŠãéèšã§ã¯ãããŸããã ä»åŸã掻çšã§ããå±€ãšããã§ãªãå±€ã®å·®ã¯åºããäžæ¹ã§ãããã®ãããçæAIã®æŽ»çšã¯ç§ãã¡ã»ãŒãã£ãŒã«ãšã£ãŠãå
šç€Ÿã®éèŠèª²é¡ã§ãããéçºæ¬éšãšããŠçµç¹çã«åãåãã¹ãããŒããšãªã£ãŠããŸãã æ¬èšäºã§ã¯ãéçºæ¬éšå
šäœã§åãçµãã§ãããçæAIå©çšä¿é²ãããžã§ã¯ããã«ã€ããŠã以äžã®ãã€ã³ããäžå¿ã«ã玹ä»ããŸãã çµç¹èª²é¡ã解決ããããã®ã5ã€ã®æŠç¥è»žã ããã ã¢ããã§é²ããå®éã®æŽ»åå
容 å°å
¥ã«ããå
·äœçãªææãšä»åŸã®å±æ åãªãããŒã«ã®å°å
¥äºäŸã§ã¯ãªãããçµç¹æåãã©ãå€ããŠãããããšãã芳ç¹ã§ã®å
šè²ããäŒãããŸãã ã¯ããã« ç§ãã¡ãçŽé¢ããŠããã5ã€ã®å£ã 1. æ
å ±åéã®ãéå¹çæ§ã 2. æè¡æ€èšŒã»å°å
¥ã®ãå±äººåã 3. ãã¬ããžã®ããµã€ãåã 4. æŽ»çšæ©éã®ã枩床差ã 5. æè¡çåãçµã¿ã®ãèªç¥äžè¶³ã 解決ãžã®æŠç¥çã¢ãããŒãïŒ5ã€ã®è»ž ãããžã§ã¯ãå
šäœæ§æ³å³ 軞1ïŒæ
å ±åéæŽ»æ§å ð¡ 軞2ïŒæè¡æ€èšŒã»å°å
¥ ð ïž è»ž3ïŒãã¬ããžããŒã¿ããŒã¹ãããžã¡ã³ã ð 軞4ïŒçæAI掻æ§å ð¥ 軞5ïŒç€Ÿå€çºä¿¡ ð¢ å®éã®æŽ»åãšæ³å®å€ã®åé¿ 20åã®æå¿ãéçµ åç§äŒã«ããèªåŸçãªéå¶ ææãšä»åŸã®å±æ äž»ãªææ ä»åŸã®ããŒãããã ãããã« ç§ãã¡ãçŽé¢ããŠããã5ã€ã®å£ã çæAI掻çšãçµç¹çã«æšé²ããããšããéãç§ãã¡ã¯å€§ããåããŠ5ã€ã®åé¡é åã«çŽé¢ããŠããŸããããããã¯ãå€ãã®éçºçµç¹ãå
±éããŠæ±ããæ©ã¿ã§ã¯ãªãã§ããããã 1. æ
å ±åéã®ãéå¹çæ§ã å€éšã®æè¡ååãå人ããã©ãã©ã«è¿œã£ãŠãããããçµç¹ãšããŠã®ã€ã³ããããéå¹çã§ããããé£ã®ããŒã ãåã調æ»ãããŠããããšããè»èŒªã®åçºæãèµ·ããŠãããçµç¹ãšããŠã®ã¹ããŒãæãæãªãããŠããŸããã 2. æè¡æ€èšŒã»å°å
¥ã®ãå±äººåã ããã®æ°æ©èœã䜿ãããããšæã£ãŠããå°å
¥ããã»ã¹ãè©äŸ¡åºæºãäžæç¢ºã§ãããçµæãšããŠãææ¬²ããã¡ã³ããŒã®æè¡éžå®ã«æéãããããæçãªæè¡ã®å°å
¥ã«ããæ©äŒæå€±ãçºçããŠããŸããã 3. ãã¬ããžã®ããµã€ãåã Aããã¯é«åºŠãªããã³ãããç¥ã£ãŠããã®ã«ãBããã¯åã課é¡ã§èºããŠãããæåäºäŸã倱æäºäŸïŒã¢ã³ããã¿ãŒã³ïŒãå
±æããããããŠããŠãå人ã®é ã®äžã ãã«çãŸã£ãŠããŸããã 4. æŽ»çšæ©éã®ã枩床差ã ã䟿å©ããã ãã©ãèªåã®æ¥åã§ã®äœ¿ãæãããããªãããšããã¡ã³ããŒãå€ããäžéšã®æåºŠãé«ãå±€ã ããæŽ»çšããŠããç¶æ
ã§ããã 5. æè¡çåãçµã¿ã®ãèªç¥äžè¶³ã ãã£ããå
é²çãªåãçµã¿ãããŠããŠãããããå€éšã«äŒãã£ãŠããªããã°æ¡çšããã©ã³ãã£ã³ã°ã«ã¯ç¹ãããŸããããŸããå€éšã³ãã¥ããã£ãšã®æ¥ç¹ãèãããã£ãŒãããã¯ãåŸãæ©äŒãäžè¶³ããŠããŸããã 解決ãžã®æŠç¥çã¢ãããŒãïŒ5ã€ã®è»ž ãããã®èª²é¡ãæç Žãããããç§ãã¡ã¯ã5ã€ã®è»žããå®çŸ©ããæŠç¥çãªã¢ãããŒããéå§ããŸããã ãããžã§ã¯ãå
šäœæ§æ³å³ ãŸãã以äžã®ãµã€ã¯ã«ãåãããšã§ãçæAIïŒAIæè¡ïŒã®å°å
¥ã»å®çãç®æããŸãããçæAIå©çšä¿é²ããŒã ããããšãªããéçºæ¬éšå
šäœãå·»ã蟌ãã§ããŸãã ããããã¯ãå
·äœçãª5ã€ã®è»žã«ã€ããŠè§£èª¬ããŸãã 軞1ïŒæ
å ±åéæŽ»æ§å ð¡ ç®çïŒ çµç¹çãªãã¢ã³ãããã®æåºŠãé«ããæè¡éžå®ãé«éåãã å人ã®åªåã«äŸåããŠããæ
å ±åéããçµç¹ã®æŽ»åãžãšæè¯ãããŸããã ãã¬ã³ãã®å®ç¹èŠ³æž¬: ææ°ããŒã«ãäºäŸãããŒã ã§åæ
ããŠèª¿æ» å°å
¥ãžã£ããž: å©ç𿹿³ãæç¢ºãªãã®ã¯ãå®åæ€èšŒããžãæªå°å
¥æè¡ã¯ãäŒç»ããžãšã¹ã ãŒãºã«ç§»è¡ããããããŒãç¢ºç« è»ž2ïŒæè¡æ€èšŒã»å°å
¥ ð ïž ç®çïŒ æ°æè¡ããå®å
šã«ããçŽ æ©ãã詊ããç°å¢ãäœã ã䜿ã£ãŠã¿ããããã䜿ãããã«ããããã®ç°å¢æŽåã§ãã ç°å¢æŽå: ã¢ã«ãŠã³ã管çãLLM Proxyåºç€ã®æ§ç¯ ã¬ã€ãã©ã€ã³çå®: ã»ãã¥ãªãã£ãå人æ
å ±ã®åãæ±ããæ©å¯æ
å ±ã®ä¿æã«é¢ããã«ãŒã«ãæç¢ºåããå®å
šã«å©çšã§ããç°å¢ãæäŸ 軞3ïŒãã¬ããžããŒã¿ããŒã¹ãããžã¡ã³ã ð ç®çïŒ ç¥èŠããè³ç£ãåããè»èŒªã®åçºæãé²ã DBæ§ç¯: ãã¹ããã©ã¯ãã£ã¹ã倱æäºäŸãããã³ããã©ã€ãã©ãªãäžå
管ç ã¡ã³ããã³ã¹: æ
å ±ã®é®®åºŠãä¿ã€ãããé³è
åããæ
å ±ã®æŽæ°ãããŒãæŽå ãã³ãã¬ãŒãå: éçºãåæãããã¥ã¡ã³ãäœæãªã©ãçšéå¥ã®ãåå©çšå¯èœãªããã³ããããæŽå 軞4ïŒçæAI掻æ§å ð¥ ç®çïŒ çµç¹å
šäœã®ãç±éããäžããæåãäœã ã€ãã³ãéå¬: å匷äŒãLTïŒã©ã€ããã³ã°ããŒã¯ïŒãããã«ãœã³ãªã©ãäŒç» 暪å±é: æåäºäŸãéšéãè¶
ããŠå
±æãããèªåããã£ãŠã¿ããããšãã空æ°ãéžæ 軞5ïŒç€Ÿå€çºä¿¡ ð¢ ç®çïŒ åãçµã¿ãã䟡å€ãã«å€ããæ°ããªç¥èŠãåŒã³èŸŒã ã¢ãŠãããã: æè¡ããã°ãã€ãã³ãç»å£ãéããçºä¿¡ éæµ: 瀟å€ããã®ãã£ãŒãããã¯ã瀟å
ã«åã蟌ã¿ããããªãæ¹åã«ã€ãªãããµã€ã¯ã« å®éã®æŽ»åãšæ³å®å€ã®åé¿ æŠç¥ã¯æããŸããããç§äžäººã§å®è¡ã§ãããã®ã§ã¯ãããŸãããããã§éçºæ¬éšå
šäœããã¡ã³ããŒãå
¬åãããšãããäºæ³å€ã®åå¿ããããŸããã 20åã®æå¿ãéçµ åœåã¯æ°åéãŸãã°è¯ããšèããŠããŸãããã çŽ20åãã®ã¡ã³ããŒãæãæããŠãããŸããã éçºæ¬éšã®ãšã³ãžãã¢ãã¡ããããã«ãã®èª²é¡ã«ç±æãæã£ãŠãããã®è¡šãã§ãããéåžžã«å¬ãã誀ç®ã§ããã åç§äŒã«ããèªåŸçãªéå¶ ã¡ã³ããŒã®èªäž»æ§ãå°éããåè¿°ã®5ã€ã®è»žããšã«ãåç§äŒããçµæããŸããã 鱿¬¡ã»éé±ã§å®äŸMTGãè¡ããããããã®åŒ·ã¿ã掻ãããŠã¢ã¯ã·ã§ã³ãã©ã³ãå®è¡ããŠããŸãããããããŠã³ã§ã¯ãªããçŸå Žã®ãšã³ãžãã¢ãäž»å°ããããã ã¢ããåã®ãããžã§ã¯ããšããŠæ©èœããŠããŸãã ææãšä»åŸã®å±æ 2025幎9æã®çºè¶³ããæ°ã¶æãåå°ã¥ããã«æ³šåããŠããŸãããããã§ã«ç®ã«èŠããå€åãèµ·ããŠããŸãã äž»ãªææ å©çšçã®åäž: Claude Codeã®Maxãã©ã³çã®é«åºŠãªæ©èœãå©çšããã¡ã³ããŒãåææ¯ã§å¢å åŸåã åŠç¿æåã®å®ç: éçºæ¬éšã® çŽåæ° ãçæAIå匷äŒã«åå ã ãã¬ããžããŒã¹çšŒå: ç¬èªã®ããŒã¿ããŒã¹ãæ§ç¯ãããæ¥ã
ç¥èŠãèç©ãããŠããã ããŒã¿ã«ãµã€ãéèš: ããŒã«ãã¬ã€ãã©ã€ã³ãææ°æ
å ±ãéçŽãããçæAIããŒã¿ã«ããå
¬éã ä»åŸã®ããŒãããã ð çæïŒFY25幎床å
ïŒ æè¡æ€èšŒ: LLM Proxyåºç€ã®æ§ç¯ãClaude Teamãã©ã³ãžã®ç§»ç®¡ã 掻æ§å: LT倧äŒã®å®æœïŒ11/27ã12/11äºå®ïŒããã³ãºãªã³ã»ããã«ãœã³ã®éå¬ã ãã¬ããž: ããã³ããã©ã€ãã©ãªã®ã«ããŽãªæ¡å
ïŒã³ãŒãã¬ãã¥ãŒãèšè𿝿Žãªã©ïŒã ð äžé·æïŒæ¥å¹ŽåºŠä»¥éïŒ å¹ææž¬å®: åãªãå©çšè
æ°ã§ã¯ãªããã³ãŒãå質ãéçºé床ãªã©ãçç£æ§ææšããžã®è²¢ç®ãå¯èŠåã å
šç€Ÿå±é: éçºæ¬éšã§å¹ã£ãããŠããŠãä»éšéãžæšªå±éããå
šç€ŸçãªDXãæ¯æŽã æåã®å®ç: æ°å
¥ç€Ÿå¡åãã®ãçæAI掻çšç ä¿®ããªã©ãéããAI掻çšã空æ°ã®ãããªãåœããåãã«ããã ãããã« çæAIãçµç¹ã§æŽ»çšã§ããŠããç¶æ
ã«ããã«ã¯ãå人ã®ãç¹ãã®æŽ»åã ãã§ã¯éçããããŸããçµç¹å
šäœã§æŠç¥çã«åãçµã¿ããé¢ãã®æŽ»åã«ããããšã§åããŠãç¥èŠã®æšæºåãæåéžæãå¯èœã«ãªããŸãã ä»åã玹ä»ããã5ã€ã®è»žãã¯ãããŸã§ã»ãŒãã£ãŒã®äžäŸã§ãããçµç¹çãªAI掻çšã«æ©ãçæ§ã®ãã³ãã«ãªãã°å¹žãã§ãã ã»ãŒãã£ãŒéçºæ¬éšã§ã¯ãä»åŸãã€ãã³ãçãéããŠç¥èŠããªãŒãã³ã«ããŠãããŸããããã¡ã§ã¯ããããŠãããïŒããšããä»ç€Ÿã®çæ§ããã²æ
å ±äº€æãããŠãã ããïŒ
ãã®èšäºã¯Â Safie Engineers' Blog! Advent Calendar  ã®8æ¥ç®ã®èšäºã§ãã ããã«ã¡ã¯ãã»ãŒãã£ãŒæ ªåŒäŒç€Ÿã§ãµã€ããŒã»ãã¥ãªãã£ãæ
åœããŠããéåã§ãã ååã®èšäºã ã»ãŒãã£ãŒã®ãµã€ããŒã»ãã¥ãªãã£æŠç¥ã®äœãæ¹ ãã§ã¯ãç§ãã¡ãç®æããã»ãã¥ãªãã£ãåœããåã®æåããšãããã«å°éããããã®æŠç¥ãã«ã€ããŠãäŒãããŸãããä»åã¯ãæŠç¥ã®å
·äœçãªæã¡æã®äžã€ã ãè
åšã¢ããªã³ã°ã ã«ã€ããŠæ·±æãããŸãã ãè
åšã¢ããªã³ã°ããšèããšãå°éçšèªãå€ããŠãé£ãããããæéããããããããšæããŠããŸãããšã¯ãããŸãããïŒ æ£çŽã«èšããšãç§ãã¡ãæåã¯ããã§ããã ãããã詊è¡é¯èª€ããŠãã©ãçããçµè«ã¯ã·ã³ãã«ã§ããè
åšã¢ããªã³ã°ã®æ¬è³ªã¯ ãé¢ä¿è
å士ã®å¯Ÿè©±ãä¿é²ããã³ãã¥ãã±ãŒã·ã§ã³ããŒã«ã ã ãšããããšã ä»åã¯ãäžè¬çãªè
åšã¢ããªã³ã°ã®ææ³ã解説ãã€ã€ãããããã»ãŒãã£ãŒã§ã¯ã©ãè§£éããéçšããŠãããããšãã å®è·µçãªãã¬ããžïŒïŒã»ãŒãã£ãŒæµã®åïŒ ãã»ããã§å
¬éããŸããããããè
åšã¢ããªã³ã°ãå§ãããæ¹ããã£ãšæŽ»çšããŠããããæ¹ã®ãçããæç§æžãã«ãªãã°å¹žãã§ãã ãããããè
åšã¢ããªã³ã°ãã£ãŠäœïŒ ãªãä»ãç§ãã¡ããããæšãã®ã è
åšã¢ããªã³ã°ã®é²ãæ¹ïŒè§£èª¬ãšã»ãŒãã£ãŒæµã®å®è·µïŒ 4ã€ã®éèŠãªè³ªå ãå1ãç§ãã¡ã¯äœã«åãçµãã§ãããïŒ ïœã¢ãã«ãäœãïœ ãå2ãäœãåé¡ã«ãªããããïŒ ïœSTRIDEã§ãªã¹ã¯ãèŠã€ããïœ ãå3ãããã«å¯ŸããŠäœãããã®ãïŒ ïœãªã¹ã¯è©äŸ¡ãšå¯Ÿçïœ ãå4ãååã«ããŸãã§ãããïŒ ïœãµããããïœ ã»ãŒãã£ãŒã§ã®æŽ»çšäºäŸ 1. ã»ãã¥ãªãã£ã¬ãã¥ãŒãžã®ãéšåå°å
¥ã 2. ãããã«å§ããããããã³ãã¬ãŒãã®çšæ 3. çæAIããå¯æçžŠå£«ãã«ãã ãããã« ãããããè
åšã¢ããªã³ã°ãã£ãŠäœïŒ äžèšã§ãããšã ãã·ã¹ãã ãäœãåã«ãæ»æè
ã®èŠç¹ãèžãŸããèµ·ãããå°ãããšããåæãã察çãèããæŽ»åã ã§ãã éåžžãéçºã®çŸå Žã§ã¯ãã©ããªæ©èœãäœããïŒèŠä»¶ïŒãããã©ããã£ãŠäœããïŒèšèšïŒãã«éäžããã¡ã§ããããã« ãäœãåé¡ã«ãªããããïŒã»ãã¥ãªãã£ãªã¹ã¯ïŒã ãšããèŠç¹ããã©ã¹ããŸãã ãªãä»ãç§ãã¡ããããæšãã®ã çç±ã¯å€§ãã2ã€ãããŸãã ãã·ããã¬ãããã®äžçæšæºã ãã NISTã®ãSSDFããOWASPã®ãSAMM v2ããªã©ãäž»èŠãªã¬ã€ãã©ã€ã³ã§æšå¥šãããŠããŸããèšè𿮵éã§ãªã¹ã¯ã朰ãããšã§ãææ»ããé²ãããã§ãã çããã»ãã¥ãªãã£æè²ã«ãªãããïŒâ
æéèŠïŒ ç§ãç¹ã«éèŠããŠããã®ã¯ãã¡ãã§ããè
åšã¢ããªã³ã°ãè¡ãã«ã¯ããšã³ãžãã¢ãPMãã»ãã¥ãªãã£æ
åœè
ãéãŸã£ãŠäŒè©±ãããå¿
èŠããããŸãã ãããã®ããŒã¿ã£ãŠãã©ãããæµãã§DBã«å
¥ããã ã£ãïŒã ããã®APIãèªèšŒãªãã§å©ãããããºãããïŒã ããããäŒè©±èªäœãã座åŠã®ç ä¿®ãããã¯ããã«å¹æç㪠ãçããã»ãã¥ãªãã£æè²ã ã«ãªããŸãããã¡ã€ã³ç¥èãšã»ãã¥ãªãã£ç¥èãã察話ãéããŠããŒã å
šäœã«æã¿æž¡ãã®ã§ãã è
åšã¢ããªã³ã°ã®é²ãæ¹ïŒè§£èª¬ãšã»ãŒãã£ãŒæµã®å®è·µïŒ ã§ã¯ãå
·äœçã«ã©ãé²ããã°ããã®ã§ããããïŒ åºæ¬ã¯ä»¥äžã® ã4ã€ã®éèŠãªè³ªåã ã«çãã圢ã§é²ããŠãããŸãã ããã§å€§äºãªå¿æ§ã㯠ãå®ç§ãç®æããªãã ããšãã»ãŒãã£ãŒã§ã¯ã ãééã£ãŠãããããããŸãã¯ãã¯ã€ãããŒãã«çµµãæããŠè©±ããã ãåèšèã«ããŠããŸãã 4ã€ã®éèŠãªè³ªå ãå1ãç§ãã¡ã¯äœã«åãçµãã§ãããïŒ ïœã¢ãã«ãäœãïœ ãŸãã¯ãã·ã¹ãã ã®ã圢ããå¯èŠåããŸããäžè¬çã«ã¯ãããŒã¿ãããŒãã€ã€ã°ã©ã ïŒDFDïŒãæšå¥šãããŸãã â DFDã®æžãæ¹ïŒãããªã詳现ãæããªãïŒ DFDã¯ãããŒã¿ãã©ãããæ¥ãŠãã©ããžè¡ãã®ãããšããæµãã«æ³šç®ããå³ã§ãã 以äžã®5ã€ã®èŠçŽ ã§å³ã衚çŸããŸãã ããã»ã¹ (Process) ïŒåŠçãæ©èœïŒäžžïŒ ããŒã¿ã¹ã㢠(Data Store) ïŒDBããã¡ã€ã«ãªã©ã®ããŒã¿ãçãŸããšããïŒäºæ¬ç·ïŒ å€éšãšã³ãã£ã㣠(External Entity) ïŒãŠãŒã¶ãŒã飿ºã·ã¹ãã ïŒåè§ïŒ ããŒã¿ãã㌠(Data Flow) ïŒããŒã¿ã®æµãïŒç¢å°ïŒ ä¿¡é Œå¢ç (Trust Boundary) ïŒã€ã³ã¿ãŒããããšç€Ÿå
LANã®éãªã©ã®å¢çç·ïŒç¹ç·ïŒ ããããèœãšã穎ãããæåããè©³çŽ°ã«æãããšããŠæ«æããããšããããšãç§ãã¡ã¯ ãæœè±¡ããå
·äœãžã ãšãã2ã¹ããããããããããŠããŸãã â ã³ã³ããã¹ããã€ã€ã°ã©ã ã§ãŸãã¯ãå€ããšãäžããåãã ã·ã¹ãã å
šäœã1ã€ã®ãç®±ããšããŠæããå€éšïŒãŠãŒã¶ãŒã飿ºã·ã¹ãã ïŒãšã®ããåãã ããæããŸããããã ãã§ãå®ãã¹ãç¯å²ããæç¢ºã«ãªããŸãã â¡ ã¬ãã«0ãã€ã€ã°ã©ã ã§å
éšæ§é ãåè§£ãã æ¬¡ã«ãç®±ã®äžèº«ãäž»èŠãªããã»ã¹ã«åè§£ããããŒã¿ã®ä¿åå ŽæïŒããŒã¿ã¹ãã¢ïŒãæãè¶³ããŸãã ããã§æãéèŠãªã®ã ãä¿¡é Œå¢çïŒTrust BoundaryïŒã ãšããç¹ç·ã§ãããããããŒã¿ããŸãããšããè
åšãçºçãããããªããŸãã å¿
èŠã«å¿ããŠãããããããã«ã¬ãã«1âŠãã®ããã«è©³çްåããŠãããŸãã â ã»ãŒãã£ãŒæµã®å®è·µïŒå³å¯ããããã察話ã®çš®ãïŒ æç§æžéãã®èšå·ïŒäžžãäºæ¬ç·ãªã©ïŒã䜿ãããšãããšãããã§ãã£ãŠãïŒããšæãæ¢ãŸããã¡ã§ããç§ãã¡ã®çŸå Žã§ã¯ã ããã¯ã€ãããŒãïŒãŸãã¯MiroïŒã«10åãããã§æããã¬ãã«ã§ããã ãšããŠããŸãã å³å¯ãªèšæ³ããã ãããŒã¿ã®æµãïŒç·ïŒã ãåã£ãŠããã°OKã 詳现ãªèšèšå³ã§ããå¿
èŠã¯ãªããå
ã»ã©ã® ãä¿¡é Œå¢çïŒç¹ç·ïŒãããŸããå Žæ ããããã°ããããæ»æãã€ã³ãã ãšå€æã§ããã å ããŠãäžåºŠã§çµããã«ãããåŸã
ã«è©³çŽ°åºŠãäžããŠããã¹ã¿ã€ã«ãåã£ãŠããŸãã ð ãã£ãšåŠã³ããæ¹ãž å
·äœçãªDFDã®äœãæ¹ã¯ãæžç±ãããŒã¿ãããŒãã€ã¢ã°ã©ã ãã«ããã®æè¡ããããã ã·ã¹ãã èšèšã®å¯èœæ§ãïŒå€§å¶åå¹žãæŸæ°žå®å³° / ç¿æ³³ç€ŸïŒãéåžžã«åèã«ãªããŸãã ãå2ãäœãåé¡ã«ãªããããïŒ ïœSTRIDEã§ãªã¹ã¯ãèŠã€ããïœ ã¢ãã«ãã§ããããæ¬¡ã¯ããããæ»æããããã©ããªãïŒããèããŸãã ããã§ã®ãã€ã³ãã¯ãé«åºŠãªãããã³ã°æ¹æ³ãèªãã®ã§ã¯ãªãã ãèµ·ãããå°ãããšã ãæŽãåºãããšã§ããæ»æææ³ã®è©±ã«ãªããšå°éå®¶ããããããªããªããŸããããå°ãããšããªãé¢ä¿è
å
šå¡ã§è°è«ã§ããŸãã â STRIDEãã¬ãŒã ã¯ãŒã¯ è
åšãèŠã€ããåãå£ãšããŠã ãSTRIDEïŒã¹ãã©ã€ãïŒã ãšãããã¬ãŒã ã¯ãŒã¯ã䜿ããšäŸ¿å©ã§ãã以äžã®ãããªãåãããããããªããå1ã§äœæããDFDäžã«ä»ç®ã§æžãåºããŠãããšã¹ã ãŒãºã§ãã é æå è
åšã®çš®é¡ åãããã®äŸ å
·äœäŸïŒWebã¢ããªïŒ S Spoofing (ãªãããŸã) ç§ãã¡ãŸãã¯ãŠãŒã¶ãŒã¯ããªãããŸããèµ·ããŠäœãå°ããïŒ ä»äººã®ã¢ã«ãŠã³ãã§ãã°ã€ã³ããã T Tampering (æ¹ãã) ç§ãã¡ãŸãã¯ãŠãŒã¶ãŒã¯ãããŒã¿æ¹ãããèµ·ããŠäœãå°ããïŒ DBã®å€ãéä¿¡å
å®¹ãæžãæãããã R Repudiation (åŠèª) ç§ãã¡ãŸãã¯ãŠãŒã¶ãŒã¯ãåŠèªã§ããç¶æ
ã§äœãå°ããïŒ ãæäœããŠããªãããšèšãéãããã I Information Disclosure (æ
å ±æŒæŽ©) ç§ãã¡ãŸãã¯ãŠãŒã¶ãŒã¯ãããŒã¿æŒæŽ©ãèµ·ããŠäœãå°ããïŒ å人æ
å ±ãæ©å¯ããŒã¿ãæŒãã D Denial of Service (ãµãŒãã¹æåŠ) ç§ãã¡ãŸãã¯ãŠãŒã¶ãŒã¯ãã·ã¹ãã ã®åæ¢/é
å»¶ãèµ·ããŠäœãå°ããïŒ ã·ã¹ãã ãããŠã³ããŠäœ¿ããªããªã E Elevation of Privilege (æš©éææ Œ) ç§ãã¡ãŸãã¯ãŠãŒã¶ãŒã¯ãæš©éãè¶ããæäœãã§ããŠäœãå°ããïŒ äžè¬ãŠãŒã¶ãŒã管çè
æäœãè¡ã â ã»ãŒãã£ãŒæµã®å®è·µïŒãæè忢ãé²ãã«ã³ãããšããŠäœ¿ã STRIDEãäºåã«ãã¹ãŠæèšããå¿
èŠã¯ãããŸãããç§ãã¡ã¯äžèšã®ãããªå
·äœäŸãããã€ãæ·»ãã衚ããåããç«ãŠãããã®ã«ã³ãããšããŠäœ¿ã£ãŠããŸãã ã¬ãã¥ãŒã®å Žã§åããããããã®ããªã¬ãŒã«ãªãã°ååã§ãããšã³ãžãã¢ããããããã ãšããããããšãèµ·ãããšå°ããŸããããšæ°ã¥ãã°ããããç«æŽŸãªè
åšåæã§ããå°éçšèªãèŠããããã ãå°ãããšããèšèªåã§ããããš ãéèŠããŠããŸãã ð ãã£ãšåŠã³ããæ¹ãž STRIDEãã»ãã¥ã¢èšèšã«ã€ããŠã¯ãæžç±ãã»ãã¥ã¢ãªãœãããŠã§ã¢ã®èšèšãšéçº è
åšã¢ããªã³ã°ã«åºã¥ãæ®éçã¢ãããŒããïŒããŒã¬ã³ã»ã³ã³ãã§ã«ã㌠/ ç§åã·ã¹ãã ïŒãããããã§ãã ãå3ãããã«å¯ŸããŠäœãããã®ãïŒ ïœãªã¹ã¯è©äŸ¡ãšå¯Ÿçïœ è
åšãããããåºãŠãããšããå
šéšçŽããªããŠç¡çïŒããšãªã£ãŠããŸããŸãããã 倧äºãªã®ã¯ããåæã«ãã¹ãŠã察çããããšã¯ã§ããªãã ãšããåæã«ç«ã€ããšã§ãããªãœãŒã¹ãæéãæéã§ããããåªå
é äœãã€ããå¿
èŠããããŸãã ãªã¹ã¯ãããïŒ ãçºç確çãÃã圱é¿åºŠãã§å®æ§çã«è©äŸ¡ããŠåªå
åºŠãæ±ºããŸãã 察çïŒ ãªã¹ã¯ãé«ãã®ãã®ããé ã«ãã±ããåããããã¯ãã°ã«ç©ã¿ãŸãã â ãªã¹ã¯ãããã®äŸ â ã»ãŒãã£ãŒæµã®å®è·µïŒå¿
èŠã«å¿ããŠè©äŸ¡æ¹æ³ãå€ãã æç§æžçã«ã¯å³å¯ã«ã¹ã³ã¢ãªã³ã°ããŠè©äŸ¡ããããšãæšå¥šãããã¡ã§ãããå
šãŠã®ãªã¹ã¯ã§ããããããšã¹ããŒããèœã¡ãŠããŸããŸãã ã»ãŒãã£ãŒã§ã¯ã察象ã·ã¹ãã ãæ
å ±ã®éèŠåºŠã«å¿ããŠãè©äŸ¡æ¹æ³ïŒç©å·®ãïŒãã䜿ãåããŠããŸãã ã¹ããŒãæãæè»æ§ãæ±ããããéåžžã®æ©èœã¯ãã宿§è©äŸ¡ïŒé«ã»äžã»äœïŒãã§ã¹ããŒãã£ã«å€æãã察çã®èŠåŠã決ããŸããäžæ¹ã§ã決æžåšããç¹ã«éèŠãªåºç€ã·ã¹ãã ã¯ããå®éè©äŸ¡ïŒ CVSS ã OWASP Risk Rating Methodology çïŒããçšããŠå³å¯ã«ã¹ã³ã¢ãªã³ã°ããç£æ»ã«ãèãããæ ¹æ ãæ®ããŸãããã¡ããã2ã€ãçµã¿åãããã±ãŒã¹ããããŸãã ãã¹ããŒãéèŠããšãå³å¯ããã®ã¡ãªããªãã€ããããšããããç§ãã¡ã¯å€§åã«ããŠããŸãã ð ãã£ãšåŠã³ããæ¹ãž ãªã¹ã¯è©äŸ¡ã®æ·±æãã«ã¯ãæžç±ãè
åšã€ã³ããªãžã§ã³ã¹ã®æç§æžãïŒç³å·æä¹
/ æè¡è©è«ç€ŸïŒãåèã«ãªããŸãã ãå4ãååã«ããŸãã§ãããïŒ ïœãµããããïœ ãã®ãµããããã¯é£ã°ãããã¡ã§ãããå®ã¯è
åšã¢ããªã³ã°ãçµç¹ãããŒã ã«æµžéãããããã«ã¯ããšãŠãéèŠãªåãã«ãªããŸãã 察çã劥åœãã©ããã®è©äŸ¡ã倧äºã§ããããè
åšã¢ããªã³ã°ã®é²ãæ¹èªäœãã©ãã ã£ããã ã®ãµããããã§çµéšåŠç¿ã®ãµã€ã¯ã«ãåããŸãã â ã»ãŒãã£ãŒæµã®å®è·µïŒ10åã§çµãããããã¿ã€ã ããã¯ã¹ãïŒ ãµããããã®ææ³ã¯å€æ°ãããŸãããã»ãŒãã£ãŒã§ã¯è»œéã«å®æœã§ãããïŒ/ÎïŒãã©ã¹/ãã«ã¿ïŒããæ¡çšããŠã ã10åéã ãšããæéãåºåã£ãŠå®è·µããŠããŸããçç±ã¯ãéããããšç¶ããªãããã§ããç¶ç¶æ§ã倧äºã ãDFDã®ã¹ã³ãŒããåºãããŠè°è«ãçºæ£ãããã ãÃÃããã詳ãããããæ¬¡ã¯åŒãŒãã ããããå°ããªæ¹åã®ç©ã¿éãïŒã¢ãžã£ã€ã«ãªã¢ãããŒãïŒããããŒã ã®ã»ãã¥ãªãã£çèãè²ãŠãŠãããŸãã ð ãã£ãšåŠã³ããæ¹ãž ãµããããã®ææ³ãæçšæ§ãåŠã¶ãªããæžç±ãã¢ãžã£ã€ã«ãªããŒã ãã€ãã ãµããããã¬ã€ããã㯠å§ãæ¹ã»ãµããããã®åã»ææ³ã»ãã€ã³ãã»ãããïŒæ£® äžæš¹ïŒç¿æ³³ç€ŸïŒãããããã§ãã ã»ãŒãã£ãŒã§ã®æŽ»çšäºäŸ ãããŸã§è
åšã¢ããªã³ã°ã®ææ³ãšã»ãŒãã£ãŒæµã®å®è·µããäŒãããŸãããã§ã¯ããããå
·äœçã«ã©ã®ããã«çŸå Žã«èœãšã蟌ãã§ããã®ãïŒç§ãã¡ã®çŸåšã®åãçµã¿ã玹ä»ããŸãã 1. ã»ãã¥ãªãã£ã¬ãã¥ãŒãžã®ãéšåå°å
¥ã ãããŸã§ãã§ãã¯ãªã¹ãããŒã¹ã§è¡ã£ãŠããã»ãã¥ãªãã£ã¬ãã¥ãŒã®äžéšã«ãè
åšã¢ããªã³ã°ãåãå
¥ãå§ããŠããŸãã éçºè
ãã説æãåããéãã»ãã¥ãªãã£ããŒã ãæå
ã§ç°¡æçãªã¢ãã«ãäœãããããã®ããŒã¿ã®æµããä¿¡é Œå¢çãŸããã§ããã©å€§äžå€«ïŒããšãã£ã察話ãããŸãã ãã§ãã¯ãªã¹ãã ãã§ã¯èŠããªãéèŠç®æã®ã¬ãã¥ãŒãã§ããŸãããéçãªã¢ãŒããã¯ãã£å³ãããããŒã¿ãããã»ã¹ã®æµããæŽçã§ããã®ã§ãéçºè
ããã奜è©ã§ããç§èªèº«ããå€ãã®ã»ãã¥ãªãã£ã¬ãã¥ãŒã宿œããäžã§ããããã©ããªã£ãŠãã£ãïŒããšãªã£ããšãã«ãã¬ãã¥ãŒæã«äœæããã¢ãã«ãèŠãããšã§æãåºãããšãã§ããŠå©ãã£ãŠãŸãã ã»ãã¥ãªãã£ã¬ãã¥ãŒã§äœã£ãè
åšã¢ãã«ã®äŸ 2. ãããã«å§ããããããã³ãã¬ãŒãã®çšæ ãæºåãé¢åããšããå¿ççããŒãã«ãäžããããããªã³ã©ã€ã³ãã¯ã€ãããŒãããŒã«ïŒMiroïŒã« ãè
åšã¢ããªã³ã°ãã³ãã¬ãŒãã ãäœæããŸããã DFDã®ããŒããšSTRIDEã®ä»ç®ããããŠãé²ãæ¹ãããããããé
眮ãããŠããŸãããããéãã°ãããã«è°è«ã«å
¥ããç¶æ
ãäœã£ãŠããŸãã è
åšã¢ããªã³ã°ãã³ãã¬ãŒãïŒMiroïŒ 3. çæAIããå¯æçžŠå£«ãã«ãã ãããæè¿ã®ããããããã¯ã§ããç§ãã¡ã¯ çæAIïŒGeminiçïŒ ãç©æ¥µçã«æŽ»çšããŠããŸãã ãŒããããã©ããªè
åšãããïŒããšèããã®ã¯ãèªç¥è² è·ãé«ãäœæ¥ã§ããããã§ãã·ã¹ãã ã®æŠèŠããŠãŒã¹ã±ãŒã¹ãAIã«äžããŠã ãDFDã®ãã©ãããããæ³å®ãããè
åšãªã¹ãã ãåºåãããŸãã ãã¡ããAIã®åºåã¯å®ç§ã§ã¯ãããŸããããããã ãAIãåºãã80ç¹ã®åçããã人éã®ãšã³ãžãã¢ããã»ãŒãã£ãŒã®çŸå Žç¥èïŒãã¡ã€ã³ç¥èïŒãã§ä¿®æ£ã»è£å®ããŠ100ç¹ã«ãã ãšããããã»ã¹ã¯ããŒãããèããããå§åçã«å¹ççã§ãã äŸãã°ããå°èŠæš¡ãªIoTã¯ã©ãŠãã«ã¡ã©ã·ã¹ãã ããšãããé¡ã§Geminiã«åºåãããäŸããã¡ãã§ããïŒæ³šïŒã»ãŒãã£ãŒã®ã·ã¹ãã ã§ã¯ãããŸããïŒ Geminiãåºåããã¢ãã«ïŒMermaidïŒ Geminiãåºåãããªã¹ã¯ã®äžäŸ ãã«ã¡ã©ã®ç©çççé£ããšãã£ããIoTãªãã§ã¯ã®ãªã¹ã¯ãŸã§ææããŠãããŠããŸãããããå©ãå°ã«ããããšã§ãè°è«ã®ã¹ã¿ãŒãå°ç¹ã倧å¹
ã«é²ããããšãã§ããŸãã ãããã« è
åšã¢ããªã³ã°ãçµç¹ã«æµžéãããããã«äžçªå€§åãªããšãããã¯ã ãæåããå®ç§ãç®æããªãã ããšã§ãã æåããæ£è§£ã®å³ãäœãããšãããšæãæ¢ãŸã£ãŠããŸããŸãããééã£ãŠãŠãããããããŸãã¯ãã¯ã€ãããŒãã«çµµãæããŠè©±ãããããã®ã¹ã¿ã³ã¹ããããã»ãã¥ãªãã£æåãäœãç¬¬äžæ©ã ãšç§ã¯ä¿¡ããŠããŸãã ãã®èšäºãèªãã§ããã¡ãã£ãšé¢çœããã ãªããšæã£ãæ¹ã¯ããã²æ¬¡ã®èšèšã¬ãã¥ãŒã§ ããããæ»æè
ã«çããããšããŠãèµ·ãããå°ãããšã¯äœã§ãããïŒã ãšåããããŠã¿ãŠãã ããã ã»ãŒãã£ãŒã§ã¯ãããããã察話ãã倧åã«ããªãããã»ãã¥ãªãã£ããå°éå®¶ã ãã®ä»äºããããåŸæ¥å¡ã¿ããªã®ä»äºãã«å€ããŠããããšããŠããŸãã ãäžç·ã«æåãäœã£ãŠããããïŒããšããæ¹ãããã°ããã²ã«ãžã¥ã¢ã«ã«ã話ãããŸãããïŒ https://safie.co.jp/teams https://open.talentio.com/r/1/c/safie/pages/71628
ãã®èšäºã¯ Safie Engineers' Blog! Advent Calendar ã®7æ¥ç®ã®èšäºã§ãã æ
å ±ã·ã¹ãã ã°ã«ãŒãã®æŸå°Ÿã§ãã 以åãåœããã°ã«ãŠãæ
ã·ã¹ããŒã ãã¢ãžã£ã€ã«åã®ä»äºã®è©±ãžå€é©ããéã®èšäºãæžãããŠããã ããŸããã engineers.safie.link ä»åã¯ãã®ç¶ç·šãšããŠãã¢ãžã£ã€ã«ãªããŒã äœããããã«é²ããäžã§çãŸããã ããããããªã¹ãããçšããç¶ç¶çæ¹åïŒã«ã€ãŒã³ïŒã®åãçµã¿ ã«ã€ããŠã話ãããŸãã ãé ããè² åµããžã®æ°ä»ã å¿ççããŒãã«ãäžããããããããªã¹ãã ç»é²ã³ã¹ããäžãããä»çµã¿ã ããããããããçãŸããå
·äœçãªã«ã€ãŒã³ 1. å
¥ç€ŸãããŒã«ãããããã»ã¹ã®æšæºå 2. é害察å¿ã®è±å±äººåïŒã¯ãã¹ãã¡ã³ã¯ã·ã§ãã«ãªããŒã ãžïŒ ãªãŒããŒä»»ãã«ããªããæç¶å¯èœãªéçšã«åã㊠ãé ããè² åµããžã®æ°ä»ã ã¹ããªã³ããåãäžã§ãæ¥ã
ã®æ¥åã«åãããã¡ãªãå°ããªéåæããæŸçœ®ããããšã§ãåé¡ãçºçããããšã«æ°ã¥ããŸããã ãããã¯åŸã§å¯Ÿå¿ããã»ãããããããšäŒè©±ã«ã¯åºããã®ã®ãã¿ã¹ã¯åãããã«æµããŠããŸããå¿ããé ã«åããã©ãã«ãçºçããŠææ»ãã«ãªãããšããããŸããã ããã¯ã¢ãžã£ã€ã«ã§èšããšããã® ãéææ§ã ãæ¬ ããŠããç¶æ
ã§ãããèŠããªãæè¡çè² åµãããŒã ã«èç©ãããŠããç¶æ
ã§ããã ããã§ç§ãã¡ã¯ããå®ç§ãªè§£æ±ºçããæåããæ±ããã®ã§ã¯ãªãããŸã㯠ãå°ããªéåæãããŒã ã§æ€ç¥ããã«ã€ãŒã³ããä»çµã¿ã ãäœãããšã«ããŸãããæ¹éã¯ä»¥äžã®2ç¹ã§ãã ã¹ããã¯ããïŒéæåïŒ: ããããªããããã¡ãã£ãšæ°ã«ãªãããå¯èŠåããå Žæãäœã æ¯ãè¿ãïŒæ€æ»ãšé©å¿ïŒ: 宿çã«èŠçŽããåçºé²æ¢ã®ä»çµã¿ã«å€ãã å¿ççããŒãã«ãäžããããããããªã¹ãã ãã®ä»çµã¿ãåããããNotionã«ããŒã¿ããŒã¹ãäœæããŸããã ããã§éèŠãªã®ã¯ã ãã¿ã¹ã¯ããšããŠç»é²ããã®ã§ã¯ãªãããããããããšããŠç»é²ããããš ã§ãã ãã¿ã¹ã¯ç»é²ããšèšããããšããå®äºæ¡ä»¶ã¯ïŒããæéã¯ïŒããšèããŠããŸããç»é²ã®å¿ççããŒãã«ãäžãã£ãŠããŸããŸãã ã¢ãžã£ã€ã«ãªããŒã ã«ã¯å¿ççå®å
šæ§ãäžå¯æ¬ ã§ããããã ããããããªã¹ãã ãšããååã«ããããšã§ãæªå®æã®ç¶æ
ã§ãæ°è»œã«æŸã蟌ããããã«ããŸããã ç»é²ã³ã¹ããäžãããä»çµã¿ã éçšãã培åºçã«ããŒãã«ãäžãã工倫ãããŸããã æåç»é²: æäŒãéè«ã§åºããã®ã¯ãã®å Žã§è¿œå Slack飿ºã«ããèªåç»é²: Slackäžã§èª²é¡ãããçºèšããã£ãéãç¹å®ã®ã¹ã¿ã³ããæŒããšèªåçã«Notionã®ããããããªã¹ããã«èµ·ç¥šããã ããã«ããããããŒæ
å ±ãšããŠæµããŠããŸããã¡ãªSlackäžã®äŒè©±ãã匷å¶çã«ã¹ããã¯æ
å ±ãšããŠèç©ããä»çµã¿ãæŽããŸããã ãªã¹ãã«å
¥ã£ãé
ç®ã¯ã2é±éã«äžåºŠã®ãµã€ã¯ã«ã§æ£åžããè¡ããŸããããã§åã㊠ãèŠå®ãïŒä»ã¯äœãããªãïŒã ã ã鲿äžïŒã¿ã¹ã¯åããïŒã ãã倿ããŸãã ããŒã ã®ãªãœãŒã¹ã«ã¯éãããããããããããããã¯å
šãŠã®é
ç®ãæ¹åããã®ã§ã¯ãªããçŸæç¹ã§ ã¯çŸç¶ç¶æã§ãåé¡ãªããšããŒã ã§å€æã§ãããã®ã¯äžæŠããçŸåšã®å¯Ÿå¿ã§ç¶ç¶ããã ãšããããšããããŸããã ããããããããçãŸããå
·äœçãªã«ã€ãŒã³ ãã®ãµã€ã¯ã«ãåãããšã§ãå®éã«ã©ã®ãããªæ¹åãè¡ãããããã玹ä»ããŸãã 1. å
¥ç€ŸãããŒã«ãããããã»ã¹ã®æšæºå æ°å
¥ç€Ÿå¡åãã®ITãªãªãšã³ããŒã·ã§ã³ã«ã€ããŠãæ¯æã®æ¯ãè¿ããéããŠããã»ã¹ãæ¹åããŸããã äœæ¥ãããŒã®çµ±äž: éçšåœ¢æ
ããšã«ãã©ãã©ã ã£ãæé ãçµ±äžããè€éæ§ãæé€ïŒãªãã¬ãŒã·ã§ã³ãã¹ã®åæžïŒ ãã£ãŒãããã¯ã®åæ : PCéµéæãä»£æ¿æ©è²žäžæã®ããã€ãªããããããªã¹ãããæŸãäžããäºå察çãããŒã远å äžåºŠæ±ºããã«ãŒã«ãå確èªããçºçããäºè±¡ã«åãããŠãããŒèªäœãã¢ããããŒããç¶ããŠããŸãã 2. é害察å¿ã®è±å±äººåïŒã¯ãã¹ãã¡ã³ã¯ã·ã§ãã«ãªããŒã ãžïŒ ãããã¯ãŒã¯é害ã¯ãã©ãããŠãç¹å®ã®ãšãã¹ããŒãã«äŸåããã¡ãªé åã§ããããããã¢ãžã£ã€ã«ãªããŒã ã¯ã誰ããããªããšåããªããç¶æ
ãè¯ããšããŸããã ããã§ãããããããªã¹ããã«äžãã£ãé害察å¿ãæ¯ãè¿ãã ãåŸæ¥å¡ã®æ¥åãæ¢ããæéãæ¥µåçãããïŒMTTRã®ççž®ïŒ ãããšã«ãã©ãŒã«ã¹ãçµã£ãåå察å¿ããã¥ã¢ã«ãäœæããŸããã ããã«ããã ãããã¯ãŒã¯å°ä»»æ
åœè
以å€ã§ãäžæ¬¡åãåããå¯èœã«ãªããããŒã å
šäœã§ã®å¯Ÿå¿åãåäžããŸããã ãªãŒããŒä»»ãã«ããªããæç¶å¯èœãªéçšã«åã㊠ããããããªã¹ããã®éçšã¯ãçŸåšã¯ã°ã«ãŒããªãŒããŒã§ããç§ããã¡ã·ãªããŒãããããšãå€ãã§ãããé·æçã«ã¯ ããŒã ã¡ã³ããŒã®èª°ãã課é¡ãçºèŠããèªåŸçã«æ¹åãµã€ã¯ã«ãåããïŒèªå·±çµç¹åïŒãç¶æ
ãç®æããŠãããããšèããŠããŸãã ä»åŸã¯éçšã«ãŒã«ã®ããã¥ã¡ã³ãåãé²ãã誰ã§ããã®ããã»ã¹ãéçšã§ããããã«ããŠãããŸãããŸããæºãŸã£ãŠãã ãèŠå®ããã¹ããŒã¿ã¹ã®æ£åžãã宿çãªã€ãã³ããšããŠçµã¿èŸŒã¿ãããããããªã¹ãããå¥å
šã«ä¿ã€ä»çµã¿ ãäœã£ãŠããäºå®ã§ãã æ¥å¹Žä»¥éããããããå°ããªãã«ã€ãŒã³ããç¹°ãè¿ããå€åã«åŒ·ãæ
ã·ã¹ããŒã ãäœã£ãŠãããããšæããŸãã
ãã®èšäºã¯ ã»ãŒãã£ãŒæ ªåŒäŒç€Ÿ Advent Calendar 2025 ã®12æ6æ¥ã®èšäºã§ãã ããã«ã¡ã¯ïŒ ã»ãŒãã£ãŒæ ªåŒäŒç€Ÿã®Androidãšã³ãžãã¢ã®ãžã§ããŒã ( @yujiro45 )ã§ãð æšå¹Žãç§ãæžããã Androidã§SceneViewã䜿ã£ãŠã3D/ARã衚瀺ãã ããšããèšäºã§ãã¢ããªã«3D/ARæ©èœãç°¡åã«å®è£
ã§ããã©ã€ãã©ãªã玹ä»ããŸããã ãããçŸåšãSceneViewã¯ã¡ã³ããã³ã¹ãããŠããããã³ã³ããªãã¥ãŒã¿ãŒããã® GitHubã§ã®ã³ã¡ã³ã ã«ããã°æ°ãããªãªãŒã¹ã®äºå®ã¯ãããŸããã åºå
žïŒGithub, https://github.com/SceneView/sceneview-android/issues/623#issuecomment-3097955731 (2025/11/12ã¢ã¯ã»ã¹) æ¬èšäºã§ã¯ã Android XR ã®æ°ããã©ã€ãã©ãªã SceneCore ãã䜿ã£ãŠãã¢ããªå
ã«3D/ARã衚瀺ããæ¹æ³ã説æããŸãã Android XRãšã¯ Android XRã®Emulatoräœææ¹æ³ SceneView vs SceneCore 3Dã¢ãã«ã衚瀺ãã SceneView SceneCore ExoPlayerã®åç»ã衚瀺ãã SceneView SceneCore ãŸãšã Android XRãšã¯ Android XR ã¯ãAR/VRåãã®ãããã»ãããã¹ããŒãã°ã©ã¹çšã«äœããããAIæèŒã®Android OSã§ããã¢ããªã3D空éã«è¡šç€ºã»æäœã§ããéçºã§ã¯Compose for XRãSceneCoreãªã©ã®ã©ã€ãã©ãªã䜿ã£ãŠå®è£
ããŸãã Android XRã®Emulatoräœææ¹æ³ Android XRã¯ãXRã察å¿ãã端æ«ã§ãã䜿ããªãã®ã§ç«¯æ«æã£ãŠããªãå Žåã¯ãXRã®Emulatorãäœæããªããšãããªãã§ãã ã»ãã·ã§ã³ã®äœæã¯ãAndroid XR ããã€ã¹ã§ã®ã¿ãµããŒããããŠããŸããäºææ§ã®ãªãããã€ã¹ã§ã»ãã·ã§ã³ãäœæããããšãããšãçµæã¯å€±æããŸãã https://developer.android.com/develop/xr/jetpack-xr-sdk/add-session Android Studioã®ããã€ã¹ãããŒãžã£ãŒã§XRã®ã«ããŽãªããããŸããããã§ãXRã®Emulatorãç°¡åã«äœæã§ããŸãã SceneView vs SceneCore 3Dã¢ãã«ã衚瀺ãã ð¡ãã®èšäºã§ã¯ãSceneCoreã®ææ°çïŒå·çæç¹ïŒã§ãã 1.0.0-alpha08 ã䜿çšããŠããŸãã SceneViewã¯ææ°çã® 2.3.0 ã䜿çšããŠããŸãã SceneViewãšSceneCoreã®éããçè§£ãããããäž¡æ¹ã®ã©ã€ãã©ãªã§ãããã€ãåãã®3Dã¢ãã«ã衚瀺ããŠã¿ãŸãããïŒÙ©( 'Ï' )Ù åºå
žïŒSketchfab, https://sketchfab.com/3d-models/android-7c30eda007684abbb78ea4b99d22fc2c ã(2025/11/12ã¢ã¯ã»ã¹) SceneView SceneviewexampleTheme { val engine = rememberEngine() val modelLoader = rememberModelLoader(engine) // 3Dã¢ãã«çšã®ããŒããäœæ val modelNode = ModelNode( // 3Dã¢ãã«ã®èªã¿èŸŒã¿ (/res/raw) modelInstance = modelLoader.createModelInstance(R.raw.android) ).apply { // 3Dã¢ãã«ã®åæèšå® scale = Scale( 1 / 40f ) position = Position( 0f ) } Scene( modifier = Modifier.fillMaxSize(), engine = engine, modelLoader = modelLoader, childNodes = rememberNodes { // ã¢ãã«ããŒãã®è¿œå add(modelNode) } ) } çµæïŒ è©³çŽ°ã¯ã以åã®èšäºã Androidã§SceneViewã䜿ã£ãŠã3D/ARã衚瀺ãã ãã§èª¬æããŠããã®ã§ããã²èªãã§ãã ãããð SceneCore Subspace { val session = LocalSession.current ?: return @Subspace val capabilities = LocalSpatialCapabilities.current var entity by remember(session) { mutableStateOf<GltfModelEntity?>( null ) } LaunchedEffect(session, capabilities.isContent3dEnabled) { // Full Spaceã¢ãŒãã«åãæ¿ã if ( ! capabilities.isContent3dEnabled) { session.scene.requestFullSpaceMode() return @LaunchedEffect } // çæã¯1åã ã if (entity == null ) { // 3Dã¢ãã«ã®èªã¿èŸŒã¿ (app/src/main/assets/models/android.glb) val model = GltfModel.create(session, Paths. get ( "models" , "android.glb" )) // 3Dã¢ãã«ãäœæãã entity = GltfModelEntity.create(session, model).apply { // Positionãèšå®ãã setPose(Pose(Vector3( 0f , 0f , - 1.5f ), Quaternion.Identity)) // Scaleãèšå®ãã setScale( 0.2f ) } } } // Lifecycle管ç DisposableEffect(session) { onDispose { entity?.setEnabled( false ) entity?.parent = null entity = null } } } çµæïŒAndroid XRã§3Dã¢ãã«ã衚瀺ã§ããŸãããïŒ SceneViewãšSceneCoreã®äž»ãªéãã¯ä»¥äžãšãªããŸãã SceneView SceneCore 3D Space Scene Subspace 3Dãªããžã§ã¯ã Node Entity 3Dã¢ãã«ã®Path /res/raw/ app/src/main/assets/models/ Lifecycleå¯Ÿå¿ rememberEngine / rememberModelLoader / rememberNodes ã䜿çšãããšãCompose ãã©ã€ããµã€ã¯ã«ãé¢åã¿ãããlifecycleã察å¿ããã®ã¯äžèŠã§ãã SceneCore ã® Entity 㯠XRåŽã§èªåç Žæ£ãããªããããComposableã®çµäºãã»ãã·ã§ã³åæ¿æã« DisposableEffect(session) å
ã§æç€ºçã«è§£æŸããªããšãããªãã§ãïŒã¡ã¢ãªãªãŒã¯é²æ¢ã®ããïŒã 3Dãªããžã§ã¯ãã®è¿œå æ¹æ³ Scene ã䜿ããšãäžã« Node ãäœæã§ããŸãã childNodes = rememberNodes { add(modelNode) } ã®ããã« Node ã远å ãããšã衚瀺ãããŸãã GltfModelEntity.create(session, model) ãåŒã¶ãšã3Dã¢ãã«çšã® Entity ãäœæããã .add() ããªããŠã衚瀺ãããŸãã 3Dã¹ããŒã¹ã¢ãŒããåãæ¿ãã äžèŠ Android XRã®Entityã䜿ãæã session.scene.requestFullSpaceMode() ã®ããã«ãFull Spaceã¢ãŒãã«åãæ¿ããªããšãããªãã§ãã ExoPlayerã®åç»ã衚瀺ãã åºå
žïŒPexels, https://www.pexels.com/ja-jp/video/13299023/ ã(2025/11/12ã¢ã¯ã»ã¹) SceneView SceneViewã§ä»¥åã®èšäºã Androidã§SceneViewã䜿ã£ãŠã3D/ARã衚瀺ãã ãã§æžããéãã§ãMaterialãäœæããªããšãããªãã§ãã class ExoPlayerVideoMaterial( engine: Engine, exoPlayer: ExoPlayer, private val materialLoader: MaterialLoader, ) { // SurfaceTextureäœæ private val surfaceTexture = SurfaceTexture( 0 ).apply { detachFromGLContext() } // SurfaceTextureâSurfaceäœæ private val surface = Surface(surfaceTexture) // Textureã®ããã«ãFilamentã®Streamäœæ private val stream = Stream.Builder() .stream(surfaceTexture) .build(engine) // Textureäœæ private val texture = VideoTexture.Builder() .stream(stream) .build(engine) // VideoTextureã䜿ã£ãMaterialInstanceäœæ val videoInstance get () = materialLoader.createVideoInstance(videoTexture = texture).apply { setExternalTexture(texture) } init { // ExoPlayerã®Surfaceèšå® exoPlayer.setVideoSurface(surface) } } SceneviewexampleTheme { // ExoPlayerã®èšå® val player = remember { ExoPlayer.Builder(context).build().apply { repeatMode = Player.REPEAT_MODE_ALL } } // ãã£ãã®äœæããExoPlayerVideoMaterial val videoMaterial = ExoPlayerVideoMaterial(engine, player, materialLoader) val videoNode = PlaneNode( engine = engine, // åç»ã¯16:9ã®ãã size = Size( 16f , 9f ), // Nodeã®MaterialInstanceèšå® materialInstance = videoMaterial.videoInstance, ) ARScene( //... childNodes = rememberNodes { // ããŒãã®è¿œå add(videoNode) }, ) } çµæïŒ SceneCore ExoPlayerã® .setVideoSurface() ã䜿ããš Surface ã«åçã§ããŸããSceneCoreã«ã¯ SurfaceEntity ãããã Surface ãæäŸãããããExoPlayerãæ¥ç¶ããŠXRã§åçã§ããŸãã Subspace { val session = LocalSession.current ?: return @Subspace val capabilities = LocalSpatialCapabilities.current val context = LocalContext.current // äœæãã SurfaceEntity ãä¿æ var surface by remember(session) { mutableStateOf<SurfaceEntity?>( null ) } // ExoPlayer ã¯ã³ã³ããŒã¶ãã«ã®ã©ã€ããµã€ã¯ã«ã«åãããŠ1ã€ã ã val player = remember { ExoPlayer.Builder(context).build().apply { repeatMode = Player.REPEAT_MODE_ALL } } // Lifecycleã®ãã DisposableEffect(session) { onDispose { player.clearVideoSurface() player.release() surface?.setEnabled( false ) surface?.parent = null surface = null } } LaunchedEffect(session, capabilities.isContent3dEnabled) { // Full Spaceã¢ãŒãã®åãæ¿ã if ( ! capabilities.isContent3dEnabled) { session.scene.requestFullSpaceMode() return @LaunchedEffect } if (surface == null ) { // SurfaceEntity val surfaceEntity = SurfaceEntity.create( session = session, pose = Pose( // Positionãèšå®ãã Vector3( 0f , 0f , - 1.5f ), ), // åç»ã¯16:9ã®ãã shape = SurfaceEntity.Shape.Quad(FloatSize2d( 16f , 9f )), ) // Scaleãèšå®ãã surfaceEntity.setScale( 0.25f ) // æåã®é»å¡ããé¿ããããã1ãã¬ãŒã ç®ãŸã§é衚瀺 surfaceEntity.setEnabled( false ) // ExoPlayerãSurfaceEntityã«æ¥ç¶ããŠåçïŒres/raw/video.mp4ïŒ val uri = RawResourceDataSource.buildRawResourceUri(R.raw.video) player.setVideoSurface(surfaceEntity.getSurface()) player.setMediaItem(MediaItem.fromUri(uri)) player.prepare() player.addListener( object : Player.Listener { override fun onRenderedFirstFrame() { screen.setEnabled( true ) } }) player.play() surface = surfaceEntity } } } çµæïŒAndroid XRã§åç»ã衚瀺ã§ããŸããïŒð åç»ã衚瀺ããããã«ã SceneView ãš SceneCore ã®äž»ãªéãã¯ä»¥äžãšãªããŸãã SceneView SceneCore ExoPlayerã®è¡šç€ºæ¹æ³ VideoNode ãã³ã¡ã³ãã¢ãŠããããŠããã®ã§ãåç»åççšã® Material ãäœæå¿
èŠããããŸãã SurfaceEntity ã䜿ããšãç°¡åã«åç»åçã§ããŸãã ãŸãšã SceneViewã¯ã¡ã³ããã³ã¹ãããŠããªãã®ã§ãSceneCoreã¯æåãªä»£æ¿ã§ããæžãæ¹ã¯ãããã䌌ãŠãããGoogleãäœã£ãŠããã©ã€ãã©ãªã§ãããã ãåè¿°ã®ãšãããAndroid XRã«å¯Ÿå¿ããããã€ã¹ã§ã®ã¿åäœããŸããäžè¬çãªã¹ããŒããã©ã³ã§ã¯å®è¡ã§ããŸãããããã²Emulatorã§è©ŠããŠéãã§ã¿ãŠãã ããïŒ ã¢ãã€ã«ããŒã ã¯éçºãã仲éãåéããŠããŸãïŒ open.talentio.com open.talentio.com
ãã®èšäºã¯Â Safie Engineers' Blog! Advent Calendar  ã®5æ¥ç®ã®èšäºã§ãã ã¯ãããŸããŠãã¯ãªãªãã£ãããžã¡ã³ããªãã£ã¹ QCDã°ã«ãŒãã®çš²å¡ã§ãã ãã®èšäºãæžãããšæã£ãçç±ã§ããã 2025幎1æã«ã»ãŒãã£ãŒã®QAããŒã ã«ãžã§ã€ã³ããŠãã°ããçµã¡ãŸããã®ã§ãããããã®QAãšã³ãžãã¢ãã»ãŒãã£ãŒã®QAããŒã ã§ã©ããªããšã«åãçµãã§ãããæ¯ãè¿ãããšæããŸããã ããŒã ã®ãã¹ã掻åãæ¹åããããã«ã©ã®ãããªæœçãå®è¡ããŠããã®ããå
±æããããšã§ãQAãšã³ãžãã¢ã®æ¹ã
ãéçºããŒã ã®æ¹ã
ã«ãšã£ãŠäœãããã®ãã³ãã«ãªãã°å¹žãã§ãã MagicPodã§ã®ãã¹ãèªåå QAãããŒã®æ¹å ã¹ã¯ã©ã ã®æ¹å MagicPodã§ã®ãã¹ãèªåå QAãæ
åœããããšã«ãªã£ãã·ã¹ãã ã¯ã¡ããã©ãã¹ãèªååãããããšãããã§ãŒãºã ã£ãããããã®ãã£ããã¢ããããè¡ããŸããã æ¡çšããŠããããŒã«ããMagicPodããšãããã®ã§ãäžèšã®ãããªç¹åŸŽããããŸãã AIã«ããã¹ã¯ãªããäœææ¯æŽïŒèªå修埩 ã€ã³ã¹ããŒã«äžèŠãªæè»œããšãã¯ã©ãŠãã®ç«¯æ«ããã©ãŠã¶ã䜿ã£ãŠããã«ãã¹ãäœæå¯èœ Webã¢ããªã»ã¢ãã€ã«ã¢ããªã«å¯Ÿå¿ MagicPodã¯æè»œããšçŽæçãªæäœãã§ãããšããããšã§ããã¡ãã¯äœãåŠç¿ã³ã¹ãã§å®è£
ã§ããããã«ãªããŸãããMagicPodã«è©³ããã¡ã³ãããªã³ããŒãã£ã³ã°ãããŠãããã®ã倧ããã£ãã§ãã å
±æã¹ãããã倿°ã®æŽ»çšãäžæãªããŒã¿åå²ãªã©ãã¯ãã«ã«ã«äœ¿ãããªãããšãããšãŸãæè¡ã¯å¿
èŠã«ãªã£ãŠããŸãã äžéããã¹ãã®èªååãå®äºã§ããŠãæ¥ã
ã®éçšã«ã®ãããšãããšãããå®çŸã§ããã®ã¯ããŒã ã¡ã³ãã®äœæ¥æéãæ¥ã
åºå®ã§æŒãããã®ãè¯ãã£ããšæããŸãïŒåŒ·å¶åŽåïŒ æ¥ã
åºå®ã®æéã確ä¿ããŠè¯ãã£ããã€ã³ãã¯ä»¥äžã§ãã å®è£
ã§å°ã£ãŠãããšããã質åããŠè§£æ¶ãããã å®è£
ãé²ããã¢ãããŒã·ã§ã³ã«ãªã å
šä»¶æåããæã¯æ°æã¡ãè¯ãã§ããé³¥ãç«ããããããã§ãã ãã®ãèªååã®æéããããããããããã¹ãèªååå®è£
ãçµãã£ãåŸã«å€§ããã®æ¹ä¿®ããã£ãŠããã¹ãèªååã¯è
ãããšãªããéçšãç¶ç¶ã§ããŠããŸãã QAãããŒã®æ¹å ä»ã«åãçµãã ã®ãQAãããŒã®æ¹åã§ãã éšã®ç®æšã§ãã£ããã¹ãã«ãŸã€ããâå·¥æ°åæžâãâå質åäžâãããã³çŸå Žã®âäžâã®è§£æ¶ãšããè»žã§æ¹åã«åãçµã¿ãŸããã æœçã®äžéš å·¥æ°åæžã®æ¹ã§ã¯èªåã§ãã£ãšããããããªãšæããããšããæ¯ãè¿ãããŒãã£ã³ã°ã§ã¡ã³ããŒãã話é¡ã«äžãã£ããã®ãæ¹åäºé
ãšããŠããã¯ã¢ããããŸããã äžèšã®æ¹åãèœã¡çããŠããã¯NotebookLMã䜿ã£ãŠãã¬ããžããŸãšããããéæ©èœèŠä»¶ã®ãã¹ã芳ç¹ãã·ã¹ãããã£ãã¯ã«çã蟌ãããAIã«äžå
·ååæãããããAIã«ãã¹ãã±ãŒã¹ã¬ãã¥ãŒããããããªã©ã«åãçµãã§ããŸãã ãã¹ãèšèšã§å€ãããšããã§ããšãæ¹ä¿®å
容ã«ãã£ãŠã¯ãã¹ãã±ãŒã¹ã®ç²åºŠã倧ããããŠãã¹ãã±ãŒã¹äœæã®å·¥æ°ãæžããããã«ããŸããã ãã¹ã宿œã®æ¹ã§ã¯ã客æ§ã¯Firefoxãã»ãšãã©äœ¿çšãããŠããªããšããäºãããŒã¿ããåãã£ãããããªã°ã¬ãã·ã§ã³ãã¹ãã¯èªåãã¹ãã«ä»»ããŠãæåã§ã®ãã¹ãã倧ããæžãããŸããã ãã¹ãã®æéã¯ãããã§ããããããŸãããå¿
èŠååãªãã¹ããå°ãªãæéã§ãããšããããšãæèããŠããŸãã ã¹ã¯ã©ã ã®æ¹å æåŸã«ã¹ã¯ã©ã ã®æ¹åãšããããšã§æã®ãã€ãªãŒã¹ã¿ã³ãã¢ããã®äžã«ããã§ãã¯ã¢ãŠããã®ã³ãŒããŒãäœãããã«ããŸããã ãã§ãã¯ã¢ãŠãã¯âäœã話ããŠãè¯ããâãšããã³ãŒããŒã§åœçªå¶ã§ãã QAé¢ä¿ã®ã話ãããããšãããã°ã奜ããªæŒ«ç»ãæ ç»ãæè¿è©±é¡ã®ââãããããã«ãªããããããã©ã¿ããªã©ãã§æè²·ã£ãŠããã¢ã¿ãã¯25圢åŒã®ã¯ã€ãºåè² ãããããç«ã®èéããåæ³ãããâèéæ¶²ïŒïŒïŒâããªããè¶³ã«ä»ããŠãŠãããèããã§ããããªã©ãªã©æããç¬ããèµ·ãããããŠããŠæ¥œãã¿ãªæéã«ãªã£ãŠããŸãã ããã¯ããŒã ã®å¿ççå®å
šæ§ãé«ããã®ã«äžåœ¹è²·ã£ãŠãããšæããŸãã ãããã®åãçµã¿ãéããŠãããŒã å
šäœãæ¹å掻åã«å¯Ÿããæèãé«ããããè¯ãQAããã»ã¹ã远æ±ããæåãéžæããã€ã€ãããŸããçŸç¶ã«æºè¶³ããã«ä»åŸãç¶ç¶çã«æ¹åãéããŠããäºå®ã§ãã ãã®æ°ãæã¯ãåã«ãã¹ããããã ãã§ãªããæ°ããããŒã ãšããŠæé·ããããã®åºç€ãç¯ãæéã§ãããä»åŸãããè¯ããããã¯ãå質ãšãã¹ãå質ã远æ±ããéçºããŒã ãšå
±ã«ã客æ§ã®ã«ã¡ã©ç®¡çãæ¥œã«ããçŽ æŽããããããã¯ããäžã®äžã«å±ããŠãããããšæããŸãã
ãã®èšäºã¯Â Safie Engineers' Blog! Advent Calendar  ã®4æ¥ç®ã®èšäºã§ãã ããã«ã¡ã¯ãã«ã«ãã£ãŒïŒã³ãã¥ãã±ãŒã·ã§ã³å®€ã® ããã ã¿ãã ã§ãã ã«ã«ãã£ãŒïŒã³ãã¥ãã±ãŒã·ã§ã³å®€ã¯ã瀟é·çŽèœçµç¹ãšããŠç€Ÿå
å€ã®åºå ±æŽ»åçãæ
åœããŠããããŒã ã§ãããæ åããæªæ¥ãã€ããããšããã»ãŒãã£ãŒã®ããžã§ã³å®çŸã«åããŠãã»ãŒãã£ãŒã«ã«ãã£ãŒããæšé²ããæŽ»åãå
å
ããŠããŸãã ç§ã¯2025幎4æãã¡ããã©åœç€Ÿã®ç€Ÿå¡æ°ã500åãè¶
ããã¿ã€ãã³ã°ã§ã»ãŒãã£ãŒã«è»¢è·ããŸãããã»ãŒãã£ãŒãäžå Žãã2021幎ããæ¯ã¹ããšç€Ÿå¡æ°ã¯2å以äžãããžãã¹ãçµç¹ãå§åçãªã¹ããŒãã§æé·ããŠããäŒç€Ÿã«å
¥ç€Ÿãããªããšæã£ãã®ãèŠããŠããŸãã äžè¬çã«ãçµç¹ãæ¡å€§ãããšãé£ã®ããŒã ãäœãããŠãããåãããªãïŒãµã€ãåïŒãããçµå¶ã®æå³ãäŒãããªãããšãã£ã課é¡ãçãŸããã¡ã§ãã å€ãã®äŒæ¥ã§ã¯ç€Ÿå
å ±ãšããã°ããã¹ããå€ããšæããŸãããç§ãã¡ã¯ãæ åããŒã¿ããæ±ãããã¯äŒæ¥ãšããŠãããã¹ãã§ã¯åãèœãšãããŠããŸããç±éãããæèããããéèŠã ãšèãããåç»ãã«ãã瀟å
ã³ãã¥ãã±ãŒã·ã§ã³ãè¡ã£ãŠããŸããããšããããšã§ãä»åã¯ç§ãæ
åœããŠãã瀟å
åç»ã¡ãã£ã¢ã空ãã¯ãã«ã€ããŠã玹ä»ããŸãã ã空ãã¯ããšã¯ çŸç¶ææ¡ã®ããã®ã¢ã¯ã·ã§ã³ çŸåšãŸã§ã«å®æœããããš ä¿¡é Œé¢ä¿ãã¬ãã¬ããžãããå
¬åŒçºä¿¡ãããããç¥ã£ãŠãã人ã ãåç»ã®åŒ±ç¹ããè£å®ããïŒÎ±ã®èŠçŽããã¹ã ã³ãã¥ãã±ãŒã·ã§ã³ã¯ç¶ããããš ã空ãã¯ããšã¯ 端çã«ãããšãã空ãã¯ïŒåç»ç€Ÿå
å ±ããšèããŠããã ããšã€ã¡ãŒãžãããããããšæããŸããã¹ã¿ãŒãããã®ã¯2023幎10æã§ãä»ãŸã§2幎以äžã«æž¡ãç¶ç¶ããŠç€Ÿå
åãã®çºä¿¡ãç¶ããŠããŸããã ã空ãã¯ãã¯éç§°ã§ãæ£åŒåç§°ã¯ã空é£ã¶ãã¯ããŠ~Safie's company newsletter~ãã§ããã»ãŒãã£ãŒã®ã·ã³ãã«ããŒã¯ã§ãã銎æã¿ã®ããã¯ããŠãã¯ç¥æµã®è±¡åŸŽãšãããŠããŸããã空ãã¯ãã®ååã«ã¯ã瀟å¡äžäººã²ãšããæã€ç¥æµãã·ã§ã¢ãããäºãã®ç¥æµã®åŸªç°ãéããŠã瀟å
ã³ãã¥ãã±ãŒã·ã§ã³ã掻çºã«ããŠãããããšããæ³ãã蟌ããããŠããŸãã 空ãã¯ã¯2ã€ã®ã«ããŽãªã§æ§æãããŠããŸãã Sadoxãµã㳠瀟é·ã®äœæž¡å³¶ãããã¹ããŒã«ãŒãšããŠèªãã³ã³ãã³ã ãã¯ããŠãã¡ã®ç¥æµæ³ 瀟å¡ã®æŽ»èºãéšçœ²ã®åãçµã¿ãèªãã³ã³ãã³ã å·ŠïŒSadoxãµãã³ã2030å¹Žç®æãããš_ã¹ãã¬ããçµç¹ã®èª²é¡ãšè§£æ±ºã«ãããŠã å³ïŒãã¯ããŠãã¡ã®ç¥æµæ³ããã¶ã€ã³ã»ã³ã¿ãŒ_ããŽãã¶ã€ã³ã®ææ³ãšãã»ãŒãã£ãŒãã€ãããã¶ã€ã³ãšã¯ã çŸç¶ææ¡ã®ããã®ã¢ã¯ã·ã§ã³ ç§ãæ
åœã«ãªã£ãŠãŸãè¡ã£ãã®ã¯ã¢ã³ã±ãŒãã§ãã瀟å¡ã®ã空ãã¯ã掻çšç¶æ³ãç¥ããä»åŸã®äŒç»ã«ãããŠåèãšããããã«è¡ãããšã«ããŸããã çµæãšããŠã90ïŒ
以äžã®äººãèªèããŠããã瀟å¡ã®2/3ã¯äœããã®ã³ã³ãã³ãã¯èŠãããšããããšããããžãã£ããªåçãåŸãããŸãããäžæ¹ã§ãèŠãããšããªãïŒããšãã瀟å¡ãå°ãªãããããç¶æ³ãããããŸãããèŠãæ©äŒããªãã£ã人ã¯å€§ããåãããšä»¥äžã®3ã€ã«åé¡ãããããšãææ¡ã§ããŸããã å¿ããèŠãæéããªã æŽæ°ã¿ã€ãã³ã°äžæ ããããååšãç¥ããªãã£ã å±ããçžæã§ããã瀟å¡ãã®çæ§ã®å£°ã確èªããããšã§ãå®éã«æŽ»åã®æ¹åæ§ã決ããããšã«ãç¹ãã£ããããåæã§ã¢ã³ã±ãŒãããšã£ãããšã¯éåžžã«æçšã§ããã çŸåšãŸã§ã«å®æœããããš ã¢ã³ã±ãŒãã宿œãã5æããçŸåšãŸã§ããŸãã¯çæç®ç·ã§ããã«ã§ããããšããã¢ã¯ã·ã§ã³ãè¡ã£ãŠããŸããã倧ããåãããšãåç¥ã®å·¥å€«ããšãããŸããŸãªç€Ÿå¡ãç»å ŽããäŒç»ãã§ãããã®ããã°ã§ã¯ãåç¥ã®å·¥å€«ãã«ãã©ãŒã«ã¹ããŠããå°ã詳ããã話ãããããšæããŸãã ä¿¡é Œé¢ä¿ãã¬ãã¬ããžãããå
¬åŒçºä¿¡ãããããç¥ã£ãŠãã人ã çªç¶ã®è©±ã§ãããå人ããæçŽãæž¡ããããšãããããããå¿
ãç®ãéããŸãããããããšåãã§åãããŒã ãé¢ä¿æ§ã®æ·±ãã¡ã³ããŒããã®Slackã¯ç®ã«ã€ããšæãã®ã§ããããããŸãããç¥ããªã人ããã®å
šäœã«åããSlackã¯èŠèœãšããã¡ã§ã¯ãªãã§ããããã ã空ãã¯ãã®åç¥ã¯ç€Ÿå
ã®SlackãæŽ»çšããŠçºä¿¡ããŠããŸãããå
šäœã¡ã³ã·ã§ã³ã§ã®ç§ããã®åç¥ã¯ãæ
å ±ã®ããã€ãºããšããŠåŠçãããŠããŸãå¯èœæ§ããããšæããŠããŸããã ããã§çç®ããã®ãã瀟å
ã«ãããããœãŒã·ã£ã«ã°ã©ãïŒäººéé¢ä¿ã®ã€ãªããïŒãã®æŽ»çšã§ããæ
åœè
ããèšããããããæ®æ®µé¢ããã®ããååãããåºæŒããã®ã§èŠãŠãã ããããšèšãããæ¹ããå§åçã«èŠèŽææ¬²ãæ¹§ãã¯ãã ã¢ããã°ãªææ³ã§ããããåºæŒè
ã«åç¥ååããé¡ãããããšãããããŒãçµã¿èŸŒãããšã§ããç¹ãã®çºä¿¡ããé¢ãã®åºããã«å€ãã工倫ãåãå
¥ããŸããã æè¿ããåºæŒè
ããã§ã¯ãªãã®ã§ããã瀟å¡ã®æ¹ãé¢çœãããšãèªèº«ã®ããŒã ã«çºä¿¡ããŠããã ããããšã§ã¢ã¯ã»ã¹ãæ¥å¢ããã±ãŒã¹ããããŸããããããã埪ç°ããã£ãšå¢ããããããã®ããã®åæãšããŠã¯ç€Ÿå¡ã®çæ§ããããããïŒããšæã£ãŠãããã³ã³ãã³ããéèŠã§ããäŒç»èªäœãåãå
¥ããŠããŸãããåŒãç¶ãè¯ãã³ã³ãã³ãäœãã«ã¯ç¹ã«æéãå²ããŠãããããšæããŸããã ãåç»ã®åŒ±ç¹ããè£å®ããïŒÎ±ã®èŠçŽããã¹ã æ åã¯å§åçã«åŸãããæ
å ±éãå€ãã®ãã¡ãªããã§ããäžæ¹ã§ããå¿ããæã«æãæ¢ããŠåç»ãèŠãã®ã¯æ£çŽããã©ããåéã ãšããŠãããšããã®ã¯æ£çŽããã®ã§ã¯ãšæããŸãã ãã®ããã空ãã¯NotionããŒãžã§å
¬éããéã«ãèå³ããããããã¯ãã©ãããæ°ç§ã§å€æã§ããããã«ãåç»ã§è©±ãããŠããããšããç®æ¡æžãã§æ·»ããããã«ãã工倫ãã¯ãããŸããã ãŸããèŠçŽã®äœæã«ã¯NotebookLMã«ç·šéããæ åãèªã¿èŸŒãŸããŠãããããããã¹ãæ¡ãæ€èšããããšã§å¹çåãé²ããŠããŸãã ã³ãã¥ãã±ãŒã·ã§ã³ã¯ç¶ããããš æ
åœãåŒãç¶ãéã«åä»»æ
åœè
ã®ã³ã¡ã³ãã§æãå°è±¡ã«æ®ã£ãããšã¯ãç¶ç¶ããŠçºä¿¡ãç¶ããããšã倧äºã«ããŠããããšãã話ã§ããéŠãããããã«ãªããããåæãããŸãããããã¯ãç§ãã³ã³ãã³ãã®çºä¿¡ã¯ç¶ç¶ããŠç¶ããŠããããšã倧äºã ãšæã£ãŠããããã§ãã çŸåšãã»ãŒãã£ãŒã¯éçºæ¬éšãå«ãã5ã€ã®æ¬éšã500人以äžã®ç€Ÿå¡ãããäŒç€Ÿã«æé·ããããžãã¹ãçµç¹ãæŽãªãé£èºã«åããŠã¿ããªã§æ©ã¿ãå éãããŠããŸãã æåŸã«ãªããŸãããã瀟å
ã®æŠç¥ãéçºç§è©±ãªã©ãå«ãŸãããããã空ãã¯ããèŠãããšãã§ããã®ã¯ç€Ÿå¡ã ãã®ç¹æš©ã§ããã»ãŒãã£ãŒã®ãä»äºã«ãèå³ãããæ¹ã¯ æ¡çšãµã€ã ããã²ã芧ãã ããã safie.co.jp ãã®èšäºãèªãã§ããã ããæ¹ãã仲éãšãªãåç»ãèŠãããã¯ããŸãåºæŒè
ãšããŠç»å Žããããšããæ¥ãæ¥ãã®ã楜ãã¿ã«ããŠããŸãã ä»åŸããããé¢çœããã圹ç«ã€ããæ¥œããã空ãã¯ã®çºä¿¡ãæåŸ
ããŠããã ãããšå¬ããã§ãïŒ
ã¯ããã« ãã®èšäºã¯ Safie Engineers' Blog! Advent Calendar ã®3æ¥ç®ã®èšäºã§ãã ããã«ã¡ã¯ãæè¡åºå ±ã®ãããïŒ @hitsan ïŒã§ãã 2024幎ã®äžç€ããæè¡åºå ±ãã¯ããã2025幎ã¯ã»ãŒãã£ãŒã«ãšã£ãŠ ãæè¡åºå ±æŽ»åãæ¬æ Œå§åããã幎ã ãšãããéåžžã«å€§ããªç¯ç®ã®1幎ãšãªããŸããã ãããŸã§ãæè¡çºä¿¡ã¯è¡ã£ãŠããŸããããä»å¹Žã¯çºä¿¡æ°ãå¢ããããšã«æ³šåããŸããã æ¬èšäºã§ã¯ãã»ãŒãã£ãŒã®æè¡åºå ±ãæ²ããããã·ã§ã³ãšã2025幎ã«åãçµãã å
·äœçãªæœçã«ã€ããŠæ¯ãè¿ããŸãã ã¯ããã« ã»ãŒãã£ãŒã«ãããæè¡åºå ±ã®ããã·ã§ã³ ãã¡ã³ãå¢ãããããããåºãã 2025å¹Žã®æŽ»å 1. ã€ãã³ãç»å£æ°ãå¢ãããã 2. æè¡åºå ±å°çšXã¢ã«ãŠã³ããã€ãã£ãã çŽè¿ã®ã€ãã³ãæ
å ± BASEãšã»ãŒãã£ãŒãèªãããã¯ãšã³ãéçºã®æè¡çè² åµè§£æ¶ãžã®éã®ã çæAIã§æ¥åãæ¹åãNightïŒ ãããã« ã»ãŒãã£ãŒã«ãããæè¡åºå ±ã®ããã·ã§ã³ ãã¡ã³ãå¢ãããããããåºãã æè¡åºå ±ãšããŠæ²ããŠããæå€§ã®ããã·ã§ã³ããã㯠瀟å
å€ã«ã»ãŒãã£ãŒã®ãã¡ã³ãå¢ããããš ã§ãã ãã®èšèã«ã¯2ã€ã®æå³ã蟌ããããŠããŸãã ãã»ãŒãã£ãŒã£ãŠæè¡çã«é¢çœãäŒç€Ÿã ãããšèªç¥ããŠãããããšã ãšã³ãžãã¢èªèº«ãèªåãã¡ã®éçºããŠãããããã¯ãã¯ããããšèžã匵ããç¶æ
ãäœãããšã ã©ãã»ã©ããããã¯ããè¯ããŠãäŒãããªããã°ãã¡ã³ã¯å¢ããŸããããã®ããã·ã§ã³ãéæããããã«ã以äžã®ãããª3幎èšç»ãçå®ããŸããã 幎床 ãã§ãŒãº 2025幎 çºä¿¡æåã®éžæ 2026幎 èãæãæèããçºä¿¡ 2027幎 ããã¯ãã©ã³ãã®ç¢ºç« 2025å¹Žã®æŽ»å 2025幎ã®ããŒãã¯ãåå£ã¥ãããšçºä¿¡æåã®éžæãã§ãã æåãäœãããã«ã¯ããŸãè¡åã®ç·éãå¢ããå¿
èŠããããŸããããã§æåžæ°ãå¢ãããŸããã çºä¿¡æ°ïŒæåžïŒãå¢ããã°ããèªåãã¡ã¯æè¡çºä¿¡ãããçµç¹ã ããšããèªèãçãŸãã 第äžè
ã®ç®ã«è§Šããããšã§ããèªåãã¡ãåœããåã«ãã£ãŠããããšã¯ãå®ã¯ãããããšãªãã ããšæ°ã¥ãã ããããå®çŸããããã«ãå
·äœçã«å®è¡ããæœçãã玹ä»ããŸãã 1. ã€ãã³ãç»å£æ°ãå¢ãããã ä»å¹Žã¯ã€ãã³ããžã®åå ã»é嬿°ã¯æšå¹Žãšæ¯èŒããŠ2åã«ãªããŸããã 2024幎ãŸã§ã¯äŸé Œãããã°ç»å£ãããšããã¹ã¿ã³ã¹ã§ããã2025幎ããã¯ä»ç€Ÿãšå
±å¬ããŠã€ãã³ããäŒç»ããããã«ãªããŸããã äŒç»ããè¡ãããšã§ãã¿ãŒã²ããå±€ãäŒãããæè¡ããŒããã³ã³ãããŒã«ã§ããããã«ãªãã以äžã®ãããªãããã¯ãæ·±ãæãäžããããšãã§ããŸããã æ åè§£æã¢ããªã±ãŒã·ã§ã³ã®éçºãã©ãããã©ãŒã æ§ç¯ã®çŽ¹ä» è¥æãšã³ãžãã¢ã®æŽ»èº å€§èŠæš¡ãããã¯ãã«ãããæè¡çè² åµã®è§£æ¶ äŒç»ããæºããããšã§ãåå è
ããã®ãã£ãŒãããã¯ããšã³ãžãã¢ãžçŽæ¥éå
ãããµã€ã¯ã«ãäœããŠããŸãã 2. æè¡åºå ±å°çšXã¢ã«ãŠã³ããã€ãã£ãã å
æãã»ãŒãã£ãŒæè¡åºå ±ã¢ã«ãŠã³ãïŒ @SafieDev ïŒãæ°ãã«éèšããŸããã ã¯ãããŸããŠïŒãã®ã¢ã«ãŠã³ãã¯ãã»ãŒãã£ãŒã®æè¡æ
å ±ããšã³ãžãã¢ã®åãçµã¿ãçºä¿¡ããã¢ã«ãŠã³ãã§ãð ãšã³ãžãã¢ã®çãããæ°ã«ãªãæ
å ±ããå±ãããŸãã ãã²ãæ°è»œã«ãã©ããŒããŠãã ããïŒ #ã»ãŒãã£ãŒ #ãšã³ãžã㢠#éçºè
#æè¡åºå ± — ã»ãŒãã£ãŒæè¡åºå ± (@SafieDev) 2025幎11æ7æ¥ ãããŸã§ã¯äŒæ¥å
¬åŒã¢ã«ãŠã³ãããçºä¿¡ããŠããŸãããã以äžã®çç±ããç¬ç«ãããŸããã ãšã³ãžãã¢ãPdMããã¶ã€ããŒã«ç¹åããæ
å ±ãå±ããã ãšã³ãžãã¢ã®æ¥åžžçãªåãçµã¿ã詊è¡é¯èª€ãçºä¿¡ããã äŒæ¥ã®å
¬åŒã¢ã«ãŠã³ããããé«é »åºŠã§æçš¿ããã ã¢ã«ãŠã³ããåããããšã§ãããã¯ããã°ã®æŽæ°æ
å ±ãã€ãã³ãæ
å ±ã«å ããéçºçŸå Žã®ç©ºæ°æãäŒãããããªçºä¿¡ã匷åããŠããŸãããã²ãã©ããŒããé¡ãããŸãïŒ çŽè¿ã®ã€ãã³ãæ
å ± 12æã¯æ³šç®ã®ã€ãã³ãã2ä»¶éå¬ããŸãããã²ãåå ãã ããã BASEãšã»ãŒãã£ãŒãèªãããã¯ãšã³ãéçºã®æè¡çè² åµè§£æ¶ãžã®éã®ã ææ¥ã12/4(æš)ã«BASEæ ªåŒäŒç€Ÿæ§ãšå
±å¬ã§ããã¯ãšã³ãã®æè¡çè² åµã«ãã©ãŒã«ã¹ããã€ãã³ããéå¬ããŸããã»ãŒãã£ãŒããã¯ãå€§èŠæš¡ãªã¢ãŒããã¯ãã£ã®åãçµã¿ã«ã€ããŠç޹ä»äºå®ã§ãã safie.connpass.com çæAIã§æ¥åãæ¹åãNightïŒ 12/15(æ)ã«ã¯ãçæAIãæŽ»çšããæ¥åæ¹åã€ãã³ããéå¬ããŸãã ãã¡ãã¯LTãã»ãã·ã§ã³ã§ã¯ãªããã¯ãŒã«ãã«ãã§åœ¢åŒãæ¡çšãåå è
å
šå¡ã§æ¥åæ¹åã®ã¢ã€ãã¢ããã£ã¹ã«ãã·ã§ã³ããåå åã€ãã³ãã§ãã safie.connpass.com ãããã« 2025å¹Žã®æŽ»åãæ¯ãè¿ããŸããããæ£çŽã«èšãã°ãå
šå¡ãèªç¶ãšçºä¿¡ããæåã«ã¯ãŸã å°éã§ããŠããŸããã ä»å¹Žã¯ã€ãã³ããšããå Žãçšæããæåžæ°ãå¢ããããšã«ã¯æåããŸããããããããããçµç¹å
šäœã®ç¿æ
£ãšããŠå®çãèªèµ°ããŠãããŸã§ã«ã¯ããŸã ããã€ãã®ããŒãã«ããããŸãã ãŸã ãŸã ææ¢ãã§ããããããããèµ°ãç¶ããã®ã§2026幎ã®ã»ãŒãã£ãŒã®æè¡çºä¿¡ã«ãããã²ãæåŸ
ãã ããã
ãã®èšäºã¯ Safie Engineers' Blog! Advent Calendar 2æ¥ç®ã®èšäºã§ãã ã¯ããã« ç§ã«ã§ããããš æ°ãã«äœã£ããã® ã¢ããªã®çŽ¹ä» äœã£ããã£ãã äœãæ¹ AWS Bedrockã§ãé¡ãçæ Next.jsã§UIå®è£
AWS Amplifyã§ããã〠çµããã« ã¯ããã« ããã«ã¡ã¯ïŒã»ãŒãã£ãŒã«25æ°åã§å
¥ç€ŸããAIéçºéšã«é
å±ãããå·äžã§ãã åŠçæä»£ã¯ç ç©¶ã§ãäººã®æ©ãæ¹ãè§£æããAIã®éçºãããŠããŸããã ãããŠé
å±åã«è¡ãããç ä¿®ã§ã¯ã瀟å
ååã管çããã¢ããªTreasure CollectionãéçºããŸãããïŒTreasure Collectionã®èšäºã¯åŸæ¥æ²èŒãããã®ã§ãã²ãäžèªãã ãããïŒ ãã®èšäºã§ã¯ç§ãæ°ããªæè¡é åã身ã«ä»ããããã«ã¢ããªã®éçºã«ææŠãã話ãããããšæããŸãã ç§ã«ã§ããããš å
ã«è¿°ã¹ãããã«ãåŠçæä»£ã¯Pythonãã€ãã£ãŠæ åã®ç ç©¶ãããŠããŸããããããŠç ä¿®ã®Treasure Collectionã®éçºã§ã¯ãå
¥ç€ŸãããŸã§ã«äœéšããããšããªãã£ãããã³ããšã³ãé åãæ
åœããŸãããç ä¿®ãçµããŠãããã³ããšã³ããšããã¯ãšã³ãïŒããŒã¿åŠçïŒã®é åãçµéšãããšã³ãžãã¢ã«ãªããŸããã ããããªãããã€ã³ãã©é åãåãããªããšããæ°ã¥ããåŸãŸããã Treasure Collectionã¯Webã¢ããªã§ããããã€ãªã©ã®ã€ã³ãã©åãã¯ãã¹ãŠããŒã ã¡ã³ããŒãå®è£
ããŠãããŸãããããã³ããšã³ãã®æè¡ã¯èº«ã«ã€ããããŸããããã¢ããªããŠãŒã¶ãŒã«å±ããæ¹æ³ãåãããªããšããç¶æ³ã«ãªããŸããã æ°ãã«äœã£ããã® ãããããç ä¿®ãçµããåŸã«éçºãã ice-breaker ãšããWebã¢ããªã®ç޹ä»ãããŸãããã®ã¢ããªãäœã£ãããšã§æ°ããªæè¡é åãäœéšã§ãããŠãŒã¶ãŒã«äœã£ããã®ãå±ããããããã«ãªã£ãã®ã§ãããå
±æã§ããã°ãšæããŸãã ã¢ããªã®çŽ¹ä» ice-breakerã¯ããŒãã£ã³ã°ãªã©ã®åé ã§è¡ãã¢ã€ã¹ãã¬ã€ã¯ã»ãã§ãã¯ã€ã³ã®ãé¡ãæäŸããŸãã ã¢ã€ã¹ãã¬ã€ã¯ãšãã§ãã¯ã€ã³ã¯å°ãç°ãªããã®ã§ããã倧ãŸãã«ä»¥äžã®ããã«èª¬æã§ããŸãã ã¢ã€ã¹ãã¬ã€ã¯ããã§ãã¯ã€ã³ãšã¯ ç®çïŒéãŸãã®åé ã§ãåå è
ã®éã®ç·åŒµãã»ãããå Žã«æŽ»æ°ãäžäœæãçã¿åºãããšã ç¹åŸŽïŒãå Žãã®é°å²æ°ã¥ããã«çŠç¹ãåœãŠãã å€ãã®å Žåãã²ãŒã ãç°¡åãªã¢ã¯ãã£ããã£åœ¢åŒã§è¡ãããã åå è
åå£«ãæ°è»œã«è©±ãããã£ãããæäŸããæ¬é¡ã«å
¥ãåã®å¿ççãªéå£ãåãé€ãã ãã®ã¢ã€ã¹ãã¬ã€ã¯ããã§ãã¯ã€ã³ã¯ã»ãŒãã£ãŒã«å
¥ç€ŸããŠããäœåºŠãè¡ã£ãŠããŸããããããŠãã®åºŠãã¢ã€ã¹ãã¬ã€ã¯ããã§ãã¯ã€ã³ã«åœ¹ç«ã€ã¢ããªãéçºããŸããã ã¢ããªã«ã¢ã¯ã»ã¹ãããšæ¬¡ã®ãããªç»é¢ã衚瀺ãããŸãã ç»é¢å·ŠåŽã®â話é¡ãçæâãã¿ã³ãæŒããšãã¿ã³ã®äžã«ãé¡ã衚瀺ãããŸãã åå è
äžèЧã«ååãå
¥åãâ远å âãã¿ã³ãæŒããšåå è
ã远å ãããŠãããŸãã âæ¬¡ã®çºè¡šè
âãã¿ã³ãæŒããšãã¿ã³ã®å·Šã«æ¬¡ã®çºè¡šè
ã衚瀺ãããçºè¡šæžã¿ã«çºè¡šè
ã远å ãããŸãã âæ¬¡ã®çºè¡šè
âãã¿ã³ãäœåºŠãæŒããŠãå
šå¡ãçºè¡šæžã¿ã«è¿œå ããããšâçµäºïŒå
šå¡è©±ãçµãããŸããâãšè¡šç€ºãããŸãã äœã£ããã£ãã é
å±åã«è¡ã£ãŠããç ä¿®ã®é±æ¬¡å®äŸã®åé ã«ã10åçšåºŠã®ã¢ã€ã¹ãã¬ã€ã¯ãè¡ã£ãŠããŸããã ã¢ã€ã¹ãã¬ã€ã¯ã®ãé¡ã¯ãã®éœåºŠèããŠããããã«ããé¡ã«å°ãããšããããŸããã ãŸãé²ãæ¹ã¯ãé¡ãèãã人ãæåã«çºè¡šããŠãçºè¡šããäººãæ¬¡ã®çºè¡šè
ãæåãããšããæ¹åŒããšã£ãŠããŸããããã®é²ãæ¹ã¯ã¢ã€ã¹ãã¬ã€ã¯ãçãäžããããæ¹æ³ã§ããããããããå
šå¡çºè¡šããïŒããšç¢ºèªããããæ¬¡èª°ã«ãããããšæ©ãã ãããŠãæéã䜿ã£ãŠããŸãããã«ã¢ã€ã¹ãã¬ã€ã¯ã®äºå®æéãå°ãè¶
ããŠããŸããšããåé¡ããããŸããã è¡ã£ãŠããã¢ã€ã¹ãã¬ã€ã¯ã®ãããä¿ã¡ãªãããå°ãããšã解決ããããã®ã¢ããªãäœã£ãŠã¿ãããšæã£ãããšããã®ã¢ããªãäœã£ããã£ããã§ãã äœãæ¹ ããããã¯ã¢ããªã®äœãæ¹ã説æããŸãã AWS Bedrockã§ãé¡ãçæ ãŸããã¢ããªã®æ žãšãªããé¡ã®çæã«ã€ããŠã§ãã ãé¡ã®çæã¯çæAIã§è¡ã£ãŠããŸããçæAIã¯AWS Bedrockããå©çšããŸãããAWS Bedrockã«ã¢ã¯ã»ã¹ããAPIããŒãçºè¡ããŸãã Next.jsã§UIå®è£
UIã¯Next.jsã§å®è£
ããŸãããNext.jsã䜿ã£ãçç±ã¯ç ä¿®ã§å¯äžèº«ã«ã€ããããã³ããšã³ãã®æè¡ã¹ã¿ãã¯ã ããã§ãã ã¢ããªã®æ§æã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã src/app/ âââ page.tsx # ã¡ã€ã³UIïŒã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãïŒ âââ api/ â âââ bedrock/ â âââ route.ts # Bedrock APIåŒã³åºãïŒãµãŒããŒãµã€ãïŒ âââ components/ âââ addNames.tsx # åå è
远å ã³ã³ããŒãã³ã âââ participants.tsx # åå è
衚瀺ã³ã³ããŒãã³ã UIã¯ã·ã³ãã«ãªã®ã§ãã¹ãŠã®ç޹ä»ã¯æ§ããŸããã工倫ããããšã2ã€ç޹ä»ããŸãã åã話é¡ã衚瀺ãããªãããã«ããã³ãããæ¹å api/bedrock/route.ts ã§ã¯AWS Bedrockã®APIã«ããã³ãããå«ãã ãAPI Requestãéä¿¡ããŠããŸãããã®ã³ãŒãã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã import { BedrockRuntimeClient, ConverseCommand } from "@aws-sdk/client-bedrock-runtime"; import { NextRequest, NextResponse } from "next/server"; export async function POST(request: NextRequest) { try { const url = "xxx"; const history = (await request.json()).history || []; const payload = { "messages": [ { "role": "user", "content": [{"text": "ã¡ãã£ãšå€ãã£ãã¢ã€ã¹ãã¬ã€ã¯ã®è©±é¡ã1ã€è¿ããŠã" + "éå»ã®è©±é¡å±¥æŽ: " + history.join(", ") }] } ], "inferenceConfig": { "temperature": 1.0, "maxTokens": 500, "topP": 1.0, } }; const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${process.env.NEXT_PUBLIC_API_KEY}` }, body: JSON.stringify(payload) }); const data = await response.json(); return NextResponse.json({ output: data }); } catch (error) { console.error("API Error:", error); } } éå»ã®è©±é¡å±¥æŽã page.tsx ãšé£æºããŠããã³ããã«å«ããªãã話é¡ãäœåºŠãçæãããšãã«åã話é¡ã衚瀺ãããªãããã«ããŸããã Next.jsã®ãµãŒããŒãµã€ãããAPI Rrequestãéä¿¡ 以äžã®ã³ãŒã㯠page.tsx ã«å®è£
ããã話é¡ãçæãããšãã«å®è¡ããã颿°ã§ãããã®é¢æ°ã§ã¯ãŸã api/bedrock ã«API Requestãéä¿¡ããŸããããã¯Next.jsã®ãµãŒããŒãµã€ãã§å®è£
ãããŠããAPIã§ãã const onGenerate = async () => { setloading(true); const data = await fetch("/api/bedrock", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ history: history, }), }) .then((res) => res.json()) .then((data) => { setResult(data.output.output.message.content[0].text); setHistory([...history, data.output.output.message.content[0].text]); }) .catch((error) => { console.error("Error fetching data:", error); }); setloading(false); }; å
ã«èª¬æããããã«AWS Bedrockãžã®API Requestã®é信㯠api/bedrock ããè¡ãããŸãã ãã®ããã«APIãçµç±ããŠAWS Bedrockãå©çšããŠããããšã«ã¯çç±ããããŸããããã¯AWS Bedrock ãžã® API Requestã®éä¿¡ã¯ããã³ããšã³ãããè¡ããªãããã§ããã»ãã¥ãªãã£äžã®çç±ã§ãã®ä»æ§ã«ãªã£ãŠããŸãã ä»åéçºã«çšããNext.jsã§ã¯å¥éããã¯ãšã³ããµãŒããŒãç«ãŠãã«ãµãŒããŒãµã€ãã«APIãšã³ããã€ã³ããç«ãŠãããšãã§ããŸããå³ããããéçºäžã«çãã課é¡ã解決ãããã¹ã ãŒãºãªéçºãé²ããããšãã§ããŸããã AWS Amplifyã§ããã〠ããŒã«ã«ç°å¢ã§åäœç¢ºèªãå®äºãããããããã€ã®æºåã§ãã ãããã€ã¯AWS Amplifyã§è¡ããŸãããAWS Amplifyã䜿ã£ãŠæ³å以äžã«æè»œã«ãããã€ãè¡ããŸããã AWS Amplifyãžã¯Githubçµç±ã§ã¢ããªããããã€ã§ããŸãã äœæããã¢ããªãGithubãžpushããã以äžã®AWSã®ããã¥ã¢ã«ã«åŸã£ãŠèšå®ãè¡ããŸãã https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/setting-up-GitHub-access.html#setting-up-github-app èšå®åŸã«AWS Amplifyã«ã¢ã¯ã»ã¹ãã以äžã®æµãã§AWS Amplifyäžã«ã¢ããªãäœæããŸãããããã€ããŒã¯GithubãéžæããŸããã ãããŸã§é²ããŠãåé¡ããªããã°ãã¹ãŠã®ã¢ããªããããããã€ãå§ãŸã£ãŠããããšã確èªã§ããŸãã5åçšåºŠåŸ
ã€ãšããããã€æžã¿ã«å€ãã£ãŠããŸããã ãã®æç¹ã§ãã¢ããªã¯ãããã€ããã¢ã¯ã»ã¹ããããšãã§ããŸãããããäžã€å¿
èŠãªèšå®ããããŸãã ç°å¢å€æ°ã®èšå®ã§ãã ãã¹ãŠã®ã¢ããªããããããã€ããã¢ããªãã¯ãªãã¯ããŸãããµã€ãã¡ãã¥ãŒã®ãã¹ãã£ã³ã°ãç°å¢å€æ°ãéžæããŠã以äžã®ç»é¢ã«é·ç§»ããŸãã ããã§å€æ°ã¯ããŒã«ã«ç°å¢ã§äœ¿ã.envãã¡ã€ã«ã§æ±ºãã倿°åã§ããå€ã¯ååŸæžã¿ã®AWS Bedrockã®APIããŒãå
¥åããŸãã ãããŸã§è¡ããšã¢ããªã¯ããŒã«ã«ãšåãããã«åäœããŸãããããã€ã»ãªãªãŒã¹ã®å®äºã§ãã çµããã« ãã®èšäºã§ã¯ç§ãåããŠèªèº«ã®åã§ãããã€ãè¡ã£ãã¢ããªã®ç޹ä»ãããŸããã ã¢ããªãäœã£ãŠã¿ãŠèããããšã倧ãã2ã€ãããŸãã 1ã€ç®ã¯ãœãããŠã§ã¢ãµãŒãã¹ã®ç解床ãäžãã£ãããšã§ãããããŸã§ã¯ã©ããã£ãããµãŒãã¹ãšããŠåäœãããã ãããšããæŒ ç¶ãšããçåãæ±ããªããéçºãªã©ãè¡ã£ãŠããŸããããããã©ããã£ããããããææ®µã1ã€ã§ãç¥ããããšã¯ãšãŠãè¯ãããšã ãšæããŸãã 2ã€ç®ã¯å¥ã®AWSãµãŒãã¹ãå©çšããããšæã£ãããšã§ããç§ã¯AIéçºã«é·ãéæºãã£ãŠããŸãããããããã¯ããŒã«ã«ç°å¢ã®ãã·ã³ã§åäœãããã ãã§ããããããæ©ã«ãªãªãžããªãã£ãæã£ãAIã䜿ã£ãã¢ããªããŠãŒã¶ãŒã«å±ããŠã¿ãããšæããŸããã ç§ãã»ãŒãã£ãŒã«å
¥ç€ŸããŠ8ã«æçµã¡ãŸãããããã®éæ°ããæè¡é åãäœéšã身ã«çããªãã課é¡è§£æ±ºã«åãçµããŠããŸãããã®èšäºãèªãã§ããã ãã人ã«ãšã£ãŠãã»ãŒãã£ãŒã§åããªããã©ã®ããã«æè¡ã身ã«çãæé·ã§ããããäŒãããšå¹žãã§ãã
ãã®èšäºã¯ Safie Engineers' Blog! Advent Calendar  1æ¥ç®ã®èšäºã§ãã ã¯ããã« ããããã1on1ããšã¯ïŒ å®çŸ©ã®åç¢ºèª 1on1 ã®ãŽãŒã«ïŒããããå§¿ïŒ äººã«ãã©ãŒã«ã¹ãã察話å1on1ã®ããã å
·äœçãªè³ªåäŸïŒïŒãæè¿ã©ãïŒããããè¯ããã工倫 å
·äœçãªè³ªåäŸïŒïŒæªæ¥å¿åãžã®èªå° 1on1 ã¯çµç¹éçºã®æåç· æåŸã« ã¯ããã« ã»ãŒãã£ãŒã® VPoE å
Œ éçºæ¬éš ãšã³ãžãã¢ãªã³ã°ãªãã£ã¹ 宀é·ã®æŠç°ã§ãã 2023幎ã«ã»ãŒãã£ãŒã«å
¥ç€Ÿãããšã³ãžãã¢çµç¹ã®çµç¹éçºã«åãçµããšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒãšããŠæŽ»åããŠããŸããã»ãŒãã£ãŒã§ã¯åµæ¥åœåãã 1on1 æå ãæ ¹ä»ããŠãããç§èªèº«2025幎ã«ã¯600件以äžã®1on1ã宿œããŸãããåè·ãå«ãããšã³ãžãã¢çµç¹éçºã®çµéšãšãã³ãŒãã³ã°ãæ¬è³ªè¡ååŠãªã©ã®åŠã³ã掻ããããã©ã€ïŒãšã©ãŒããåŸãã1on1ã®æ¬è³ªãã玹ä»ããŸãã ãããã ã1on1ããšã¯ïŒ å®çŸ©ã®åç¢ºèª ç§ãèãã1on1ã®å®çŸ©ã¯ä»¥äžã®éãã§ãã ð¡ 1on1ãšã¯ïŒ 1on1ãšã¯ãã¡ã³ã¿ãŒãšã¡ã³ãã£ãŒã宿çã«ãã³ããŒãã³ã§è¡ãããŒãã£ã³ã°ã®ããšã 人äºè©äŸ¡ãç®çãšããé¢è«ãšã¯ç°ãªãã äººã®æé·ä¿é²ãšçµç¹ã®æŽ»æ§å ãäž»ãªç®çãšãããäžåžã»éšäžã®é¢ä¿æ§ã«éããã人ãšçµç¹ã®æé·ãä¿ãããã®å¯Ÿè©±ã®å Žã§ããã ãã®1on1ã®å®çŸ©ã«ã¯ ããããæ£è§£ããšããåã¯ãããŸããã 1on1ã§ã¯ãæ¥åã®è©±ã¯ãã¹ãã§ã¯ãªãããšããäžè¬çãªé¢šæœ®ããããŸãããç§ã¯ãã®éãã§ã¯ãªããšèããŸãã ãªããªããã¡ã³ãã£ãŒãç®ã®åã®æ¥åã§å°ã£ãŠããã®ã«ãããã解決ããŠããããããããªã人ã«èããªãã®ã¯ãã©ã¹ãã¬ãŒã·ã§ã³ãããŸãã ããç¡çã«ãã£ãªã¢ã®è©±ã«èªå°ããããã ã¡ã³ãã£ãŒãæ¬åœã«æ±ããŠãã話 ãããããšããçµæçã«æé·ã«ã€ãªãããŸãã 1on1 ã®ãŽãŒã«ïŒããããå§¿ïŒ ã§ã¯ãç®æãã¹ã1on1ã®ãŽãŒã«ïŒããããå§¿ïŒã¯äœã§ããããã ããã¯ ãæ¬¡ã1on1ããããã ãšæã£ãŠããããç¶æ³ãäœãããšã§ãã 1on1ã¯ãäžåºŠããã®ã€ãã³ãã§ã¯ãªã ç¶ç¶ããŠããæå³ã®ãããã® ã«ãªããŸãã ååãããç¶æãã察話ãéããããšã§åããŠãäººã®æé·ãšçµç¹ã®æŽ»æ§åãšããç®çã«è¿ã¥ããŸãã ã¡ã³ã¿ãŒã®ã¹ã¿ã³ã¹ ã¡ã³ãã£ãŒã®ç¶æ³ã«åãããŠèšæ©å¿å€ã«å¯Ÿå¿ãã å
·äœçãªè¡å æ¥åã®è©±ãããã£ãªã¢ã®è©±ããããã³ãŒãã³ã°ãããã°ããã£ãŒãã³ã°ããã éèŠããããš ãã®ç¬éã1on1çŽåŸã«å¿å°ããæéãäœãããšã§ã¯ãªããæã«ã¯ãã¬ãã£ããªãã£ãŒãããã¯ãå¿
èŠ ç®æãç¶æ³ã 察話åŸãæéçµéãšå
±ã«æ°ã¥ãããããè¡åå€å®¹ãä¿ããçµæã䌎ãããšããããŠã察話ãç¶ç¶ã§ããŠããããšã 人ã«ãã©ãŒã«ã¹ãã察話å1on1ã®ããã ãæ¬¡ãããããããšæã£ãŠãããããã®ã³ãããã㯠ã察話ããããç¶æ³ã ãäœãããšã§ãã 察話ããããã®éµã¯ããäºïŒã³ãïŒãã§ã¯ãªã ã人ïŒããïŒãã«ãã©ãŒã«ã¹ ãã質åãããããšã«ãããŸãã â
ãäºããžã®è³ªå vs. ã人ããžã®è³ªå äŸãã°ãã¡ã³ãã£ãŒããé£ãã«è¡ã£ãŠããŸããããšè©±ããå Žåã®è³ªåäŸã§ãã 質åã®çŠç¹ å
·äœçãªè³ªåäŸ ã¡ã³ãã£ãŒã®ååããæ¹ äºã(ã³ã)ã - ã©ãè¡ããŸãããïŒ - é£ããŸãããïŒãããã äºå®ã®æ·±å ã 人ã(ãã)ã - 楜ãããŸãããïŒ - é£ã奜ããªãã§ããïŒ èªåã«åãåã£ãŠãããŠãã ãšæãã話ãããããªã 人㮠ææ
ïŒæ¥œããã奜ããªã©ïŒã«å¯ãæ·»ã 質åãæèãããšãã話ããããããªããŸãã äŸãã°ä»äºã§å€±æãããšãã¯ãªã倱æãããã®ãïŒã§ã¯ãªãããã®æã©ãæã£ãïŒã©ãæãããïŒãªãããæããã®ãïŒã¡ã³ã¿ãŒã®èªåã¯ã©ãæã£ããïŒäŸãã°æ²ããã£ããšãïŒãªã©ããäºãã®ææ
ãæ·±å ãã·ã§ã¢ããããšã§ãã人ã«åãåããããã«ãªããŸãã å
·äœçãªè³ªåäŸïŒïŒãæè¿ã©ãïŒããããè¯ããã工倫 1on1 ã®åãã«ãæè¿ã©ãïŒãããå§ãŸãããšã¯ãããããšæããŸãã ãã ããã®ãæè¿ã©ãïŒãã ãã§ã¯ãå°ããã£ãããªãã§ãã æåã®å°å
¥ãšããŠããã² ã¡ã³ã¿ãŒã®ææ ãä»ãå ããŠã»ããã§ãã ãããããšã¡ã³ãã£ãŒã¯ãã話ãããããªããŸããããã¯ã ã¡ã³ã¿ãŒã®æ°æã¡ïŒææ
ïŒãå
ã«äŒããŠãã ããšã§ãå
±æãçã¿ãããã¹ã ãŒãºãªå¯Ÿè©±ã«ã€ãªãã广ããããŸãã ããè¯ã質åäŸ ãã€ã³ã æè¿ã©ãïŒ ããå®äŸã§ã®ÃÃã®çºè¡šè¯ãã£ããå
容ãã ãã© ã€ãã€ã話ããŠããŠæåããã ããžãã£ããªææ ãäŒãã話ããã£ãããäœã æè¿ã©ãïŒ æ®æ¥æéãå€ããªã£ãŠãããããªã®ã§ ã¡ãã£ãšå¿é
æžå¿µç¹ïŒå¿é
ïŒ ãäŒããå®å
šãªå Žã§è©±ãããšãä¿ã â æ³šæãã¹ã質åäŸ ãæè¿ã©ãïŒå
æ°ããªãããã«æããã©å€§äžå€«ïŒ äœããã£ãïŒ ãã¯è¯ã質åã§ã¯ãããŸããã ãªããªããäœããã£ãïŒãã¯ã äºã®æ·±å ã ã«ã€ãªããããã§ããæ¬åœã«å
æ°ããªããšãã¯ãæ¥åžžã®å°ããªããšã®ç©ã¿éãã§ããããšãå€ãããç¹å¥ãªããšã¯ãããŸããããšããåçã§å¯Ÿè©±ãçµãã£ãŠããŸãå¯èœæ§ããããŸãã ããã æè¿ã©ãïŒå
æ°ããªãããã«æããã©å€§äžå€«ïŒ å¿é
ã§ãã å¿é
ããŠããæ°æã¡ãæ£çŽã«äŒããŠåå¿ãåŸ
ã¡ãŸãããã è£è¶³ ã¡ãªã¿ã«ç§ã¯1on1ãå§ãŸãåã«ãã®äººã®Goodãã€ã³ããæ¢ããšããäºåæºåããããããŸãããã¬ãã£ããªæ
å ±ã¯åºãããããã§ãããããžãã£ããªæ
å ±ã¯ãªããªã衚ã«åºãŠããŸããã1on1ã§ããžãã£ãæ
å ±ã亀æã§ããã°çµç¹å
šäœã®é°å²æ°ã«ãã€ãªãããŸãããã²ãEMã¯ããžãã£ãæ
å ±ãåžžã«æŸã£ãŠ1on1ã«ã€ãªããŠã»ãããšæããŸãã å
·äœçãªè³ªåäŸïŒïŒæªæ¥å¿åãžã®èªå° 1on1ã¯éå»ã®æ¯ãè¿ãïŒãµããããïŒã«ãªããã¡ã§ãã¯ã¯ã¯ã¯ãã«ããåŸåããããŸããéå»ã®çµæã¯åãããã£ãŠããããã§ãã ã§ããã ã æªæ¥ã®è©± ã«èªå°ããŸãããã 質åäŸ ç®ç ååããä»åãŸã§ã® èªå·±æºè¶³åºŠãäœç¹ ãããŸããïŒïŒ100ç¹æºç¹ã§ïŒ ã¡ã³ãã£ãŒã®çŸç¶èªèãåŒãåºã ïŒäŸïŒ60ç¹ãšåçïŒ40ç¹è¶³ããŠããªããã©ããã® 40ç¹ãå¢ããããã«ã¯äœãå¿
èŠã§ããïŒ ç§ãäžç·ã«ååã§ããããšãããŸããïŒ æ¬¡åãŸã§ã® Next Action ãã¡ã³ãã£ãŒäž»äœã§æ±ºãã æªæ¥ã®è©± ãžèªå°ãã ããã§ã®ãã€ã³ãã¯ãã¡ã³ãã£ãŒåŽã ãã§ãªãã ã¡ã³ã¿ãŒåŽã®Next Actionãæ±ºããããš ïŒå°ããªããšã§OKïŒããäºãã®ã³ãããã¡ã³ãã«ãããäžäœæãçãŸããŸãã 1on1 ã¯çµç¹éçºã®æåç· äŒç€Ÿãçµç¹ã¯äººã®éãŸãã§ããã çµç¹ïŒäºº ã§ãã 1on1ã¯ããã®äººã®ããšãç¥ãããã® äžçªã®ææ®µ ã§ãããçµç¹éçºã®æåç·ã§ãã1on1ãæ©èœããããšã§æ
å ±ãæµéããçµç¹ã掻æ§åãããã£ããã«ãªããŸãã ãã²EMïŒãšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒïŒã®çããã«ã¯ããã®1on1ã䜿ãããªããŠã»ãããšæããŸãã æ£è§£ããªãããããé¢çœãïŒ ãã®èšäºããããªãã®1on1ãæ¥œãããã£ããã«ãªãã°å¹žãã§ãã ð ãŸãšãïŒäººã«åãåã1on1ã®5ã€ã®èŠç¹ 1. åºæ¬ã¹ã¿ã³ã¹ã 1on1ã®ããæ¹ã«æ£è§£ã¯ãªã (ã¡ã³ãã£ãŒã®ç¶æ³ã«èšæ©å¿å€ã«å¯Ÿå¿ãã) 2. ç®çãã 人ïŒãšçµç¹ïŒãæé·ããããã«ã人ïŒãšçµç¹ïŒã«åãåãæéã 3. ãŽãŒã«ã ãæ¬¡ã1on1ããããã ãšæã£ãŠãããããšïŒç¶ç¶ã«ããæé·ãšææïŒ 4. ã³ã ãã ãäºãã§ã¯ãªã ã人ãã«ãã©ãŒã«ã¹ ãã質åã§ããã å
±æãšæ°ã¥ã ãäžãã 5. äŸ¡å€ ãã çµç¹éçºã®æåç·ãšããŠã æ
å ±æµéãšçµç¹æŽ»æ§å ã®ãã£ãããšãªã 6. é¡ããã 1on1 èªäœã楜ãããïŒ æåŸã« æ¬èšäºã§ã¯ãç§ãåãçµãã§ãã1on1ã®å®è·µã®äžéšãã玹ä»ããŸããã 1on1 ã¯å¥¥æ·±ãèªåèªèº«ããŸã ãŸã è¶³ããŠããªãéšåããããåžžã«ãµããããã宿œäžã§ãã ãŸãããã€ã³ãã¯ã»ãã«ãããïŒäŸãã°ã1on1 ã®æ
å ±ãã©ãä»ã®äººã«ã·ã§ã¢ããŠçµç¹å€é©ã«äœ¿ã£ãŠãããïŒãšèããŠããæ¥ã
奮éäžã§ãããŸããã€ãå¥ã®æ©äŒã«ã玹ä»ã§ããã°ãšæããŸãã æåŸã«å®£äŒã§ãïŒã»ãŒãã£ãŒã§ã¯ äžç·ã«åã仲éãåéäž ã§ãïŒ å°ãã§ããèå³ãæã£ãŠããã ãããããã²ä»¥äžã® æ¡çšãµã€ã ãèŠããŠã¿ãŠãã ããã
ã¯ããã« ããã«ã¡ã¯ãã»ãŒãã£ãŒã§ãµãŒããŒãµã€ããšã³ãžãã¢ãããŠããéæã§ãã æ¬èšäºã¯ãffmpegãåããŠäœ¿ãæ¹ãã360床ã«ã¡ã©ã®ãã¯ãŒãåŠçã«ã€ããŠåŠã³ããæ¹ã察象ã«ããŠããŸããå°éçãªç¥èã¯äžèŠã§ãã®ã§ããã²ãæ°è»œã«ãèªã¿ãã ããã ã»ãŒãã£ãŒã§ã¯ãå倩çã«ã¡ã©ãªã©ãéçŒã¬ã³ãºãçšããŠåºç¯å²ãæ®åœ±ãã360床ã«ã¡ã©ã®æ åãåãæ±ã£ãŠããŸãããã®ããããã®ãããªã«ã¡ã©ã®ç»åãæ åããã¯ãŒã (æªã¿ãè£æ£ããæªã¿ã®å°ãªãæ åã«å€æããããš) ãããŠãŒã¹ã±ãŒã¹ãååšããŸããä»äºãããéçšã§ãffmpegã®ãããªãã£ã«ã¿ãŒã䜿ã£ã倿ã«ã€ããŠèª¿ã¹ãã®ã§ãã¡ãã§å
±æããããŸãã ã¯ããã« ffmpegãšvfãªãã·ã§ã³ã«ã€ã㊠ãã¯ãŒãã®å
·äœçãªæé ãŸãšã ffmpegãšvfãªãã·ã§ã³ã«ã€ã㊠ffmpegã¯ãåç»ãé³å£°ãèšé²ã»å€æã»åçãããœãããŠã§ã¢ã§æ§ã
ãªåŠçãè¡ãããšãã§ããŸãããã®äžã§ããvfãªãã·ã§ã³(video filter ãªãã·ã§ã³) ã¯ãå
¥åã«å¯Ÿããæ åãæ¡å€§ãããäžéšåãåãåããè²ãè£æ£ãããªã©ã®åŠç(ãã£ã«ã¿ãŒ) ãé©çšããããšãã§ããæ©èœã§ãã ç°¡ç¥åãããšãäžèšã®ãããªã·ã³ã¿ãã¯ã¹ã§ãªãã·ã§ã³ãæå®ããããšãã§ããŸãã -vf <ãã£ã«ã¿å>=<ãã£ã«ã¿ãŒããšã®ãªãã·ã§ã³> (å®éã«ã¯ãã£ãšè€éãªæå®ãå¯èœã§ãã詳现ã¯å
¬åŒãµã€ãããåç
§ãã ããã https://ffmpeg.org/ffmpeg-filters.html) äŸãã°ãcropãã£ã«ã¿ãŒã§ããã°ãäžèšã®ãããªã³ãã³ãã§ç»é¢ã®äžéšãåãåã£ãæ åãäœãããšãã§ããŸãã ffmpeg -i input.mp4 -vf crop=500:500:100:100 output.mp4 vfãªãã·ã§ã³ã®äžã«ã¯ãv360ãã£ã«ã¿ãŒãããã360床ã«ã¡ã©ã§æ®åœ±ãããéçŒãªã©ã®æ åããã¯ãŒããããæ åã«å€æããããšãã§ããŸãã ãã¯ãŒãã®å
·äœçãªæé 360床ã«ã¡ã©ã®æ åãšç°å¢ã®æºå ä»åã¯ãffmpegã³ãã³ãã䜿ã£ã360床ã«ã¡ã©ã®å€æã«ã€ããŠèª¬æããŸãã å©çšããããŒã«ã®ããŒãžã§ã³ã¯äžèšã«ãªããŸãã ffmpegã®ããŒãžã§ã³ã¯7.1.1ã§ãã ãã¯ãŒãã®ããã®ffmpegã³ãã³ãã®èšè¿° ãã¯ãŒãã®ããã®ffmpegã³ãã³ãã®èšè¿° ä»åã¯ãv360ãã£ã«ã¿ãŒã䜿ã£ãŠãå倩çã«ã¡ã©ãªã©ã§æ®åœ±ããããéçŒ (fisheye)ã圢åŒã®æ åãæªã¿ãè£æ£ããæ åã«å€æããŸãã v360ãã£ã«ã¿ãŒã¯äžèšã®ãããªã·ã³ã¿ãã¯ã¹ã§æ§æãããŠãã âv360=<å
¥åã®åœ¢åŒ>:<åºåã®åœ¢åŒ>:<key=valueã§æå®ãããªãã·ã§ã³> ãšãã£ã圢åŒã§æå®ã§ããŸãã äŸãã°ãäžèšã®ã³ãã³ãã§ããã°æå®ãããªãã·ã§ã³ã§ãéçŒ (fisheye) ã®æ åãããã¯ãŒããããéåžžã®æ åã«å€æãããŸãã ffmpeg -i input.mp4 -vf âv360=fisheye:flat:v_fov=50:yaw=50â output.mp4 v360ãã£ã«ã¿ãŒã§ã¯ãäžèšã®ãããªå
¥å/åºåå
ãçšæãããŠããŸãã e / equirect => Equirectangular projection flat / gnomonic / rectilinear => regular video fisheye => éçŒ pannini => Pannini projection. and etc å
¥å/åºå圢åŒããšã«å¿
èŠãªãã©ã¡ãŒã¿ãŒãå€ãããæ§ã
ãªå€æãè¡ãããšãã§ããŸãã v360ã®ãã£ã«ã¿ãŒã§ã¯ãå
±éã§yaw/pitch/roll ãªã©ã®ã«ã¡ã©ã®èŠç¹ãã³ã³ãããŒã«ãããªãã·ã§ã³ããã«ã¡ã©ã®å転ãå¶åŸ¡ãããªãã·ã§ã³ããããŸãã ä»å䜿çšãã flatãã£ã«ã¿ãŒã§ã¯ãç¹ã«ãã¯ãŒãåŸã®èª¿æŽãè¡ããããåºåããã«ã¡ã©ã®ç»è§ã以äžã®ãªãã·ã§ã³ã§å¶åŸ¡ã§ããŸãã v_fov (åçŽç»è§) h_fov (æ°Žå¹³ç»è§) d_fov (察è§ç»è§) ãããã®ãªãã·ã§ã³ãå©çšããããšã§ã倿åŸã®æ åã现ãã調æŽããããšãå¯èœã§ãã ã³ãã³ãã®å®è¡äŸ äŸ1: äžäžã®æ¯ãåã ffmpeg -i input.mp4 -vf v360=fisheye:flat:v_fov=50:pitch=<è§åºŠ> output.mp4 äŸ2: å·Šå³ã®æ¯ãåã ffmpeg -i input.mp4 -vf v360=fisheye:flat:v_fov=50:yaw=<è§åºŠ> out.mp4 äŸ3: å³ã«æ¯ãåããæ åã®å·Šååã ããåãåã ffmpeg -i input.mp4 -vf v360=fisheye:flat:v_fov=50:yaw=30,crop=iw/2:ih:0:0 output.mp4 ãŸãšã ãã®ããã«éçŒã®æ åãªã©360床ã«ã¡ã©ã§æ®åœ±ããæ åã¯ãç°¡åã«ãã¯ãŒãããããšãã§ããŸããç»åãåç»ã®å€æã«åœ¹ç«ãŠãŠããã ããã°å¹žãã§ãã ã»ãŒãã£ãŒã§ã¯ããã®ãããªæ åè§£ææè¡ã掻çšããããé«åºŠãªãµãŒãã¹ãæäŸããŠããŸããèå³ããæã¡ããã ããŸãããããã²æ¡çšæ
å ±ãã芧ãã ããã
ã¯ããã« ããã«ã¡ã¯ãããŒã¿ããªãã³æšé²å®€ã§ããŒã¿ãšã³ãžãã¢ããã£ãŠããé¶Žã§ãïŒ ã¿ãªãããLightdashã®Table calculationæ©èœã£ãŠäœ¿ã£ãŠãŸããïŒ èªåã¯Lightdashãè§Šã£ãŠããŠ[+Table calculation]ãšãã衚èšãèŠãããéã« ãTable calculationã£ãŠããšã¯è¡šèšç®æ©èœã®ããšãã Tableauãšãã«ãããåºåããçµæããŒã¿ã®äžã§éèšããããããã€ã㪠ãããšäŸ¿å©ã ããªâŠãã®ãã¡äœ¿ãæ©äŒããã£ãããã ã¿ãããªããšèããŠããŸãè§Šããã¹ã«ãŒããŠãŸãã⊠åããããªæ¹ãããã£ãããã®ã§ã¯ãªãã§ããããïŒ å®ã¯Lightdashã®Table calculationæ©èœã¯ã¡ãã£ãšé¢çœãæ©èœã«ãªã£ãŠããã®ã§ããã§ã玹ä»ããããšæããŸãïŒ ã¯ããã« Table calculationãè§Šã£ãŠã¿ãã ãã³ãã¬ãŒãæ©èœããããŸã å®ã¯ããã ããããªãã£ãTable calculation æåŸã« We are hiring! Table calculationãè§Šã£ãŠã¿ãã ãŸãã¯Querying from tablesããèŠããããŒãã«ãéžæããResultã®å³äžã«ãã[+Table calculation]ãæŒããŠã¿ããšâŠ ãããªç»é¢ãåºãŠããŸãã ã€ãŸãåºåããããŒã¿ã䜿ã£ãŠSQLãæžããŠéèšããããšããæããªãã§ããã ãã¯ã衚èšç®ãšããã°ãŠã£ã³ããŠé¢æ°ãšããããšã§æžããŠã¿ãŸãïŒ ä»åãµã³ãã«ã§çšæããã¹ãŒããŒããŒã±ããããŒã¿ã§å£²äžåæ¥æ¯ãäœã£ãŠã¿ãŸãã â»æ¬èšäºã«ç»å ŽããããããããŒããã¯ããµã³ãã«ããŒã¿çšã«äœæããæ¶ç©ºã®åç§°ã§ãããå®åšã®ãããªãåºèã»å£äœãšãäžåé¢ä¿ãããŸãã SQLã¯ãããªæãã§ããç·šéç»é¢ã§æåãå
¥åãããšãµãžã§ã¹ãããŠãããã®ã§äŸ¿å©ã§ãã ${sample_supermarket_sales.sum_of_total_price} / LAG(${sample_supermarket_sales.sum_of_total_price} OVER(${sample_supermarket_sales.sale_date_day})) ãã®ããŒã¿ã¯ãœãŒããèšå®ããŠããã®ã§äžæŠORDER BYã¯èšèŒããé²ããŠã¿ãŸãã ãã©ãŒãããã¯ããŒã»ã³ã衚瀺ã«ããŸãããã ä¿åããŠå®è¡ãããšãããªæãã«ãªããŸããïŒ ãŸããã®äœã£ãé
ç®ãçŽæ¥ãã£ã«ã¿ãŒã«èšå®ããããšãã§ããŸãïŒ å³äžã®ãã¿ã³ãæŒããš[Filter by 売äžåæ¥æ¯]ãããã®ã§æŒããŠã¿ããšâŠ ãã£ã«ã¿ãŒæ¬ã«è¿œå ãããŸããïŒ ããã䜿ã£ãŠåæ¥å£²äžæ¯100%è¶ãã®æ¥ãåºããŠã¿ãããªããŠããšãã§ããŸãã ãã³ãã¬ãŒãæ©èœããããŸã ãŠã£ã³ããŠé¢æ°ã¯SQLã«æ
£ããŠããªãæ¹ã ãšæ£çŽé£ããéšåããããŸããã⊠ã§ããLightdashã«ã¯ãã³ãã¬ãŒããçšæãããŠãŸãïŒ [Sum of total price]ã®å³äžã®ãã¿ã³ãæŒããšãAdd quick calculationã«ãã³ãã¬ãŒãããããŸãã Percent change from previous(åããã®å€åç)ãã¯ãªãã¯ããŠã¿ãŸãã é
ç®ãèªåã§äœæãããŸããïŒ äžå¿å
容ã確èªããããé
ç®å³äžãæŒããEdit calcultationãã¯ãªãã¯ããŸãã å
容çã«ã¯å
ã»ã©èªåãäœã£ãã¯ãšãªã®å
容ã«è¿ãããžãã¯ããããããã«å¯ŸããŠ1ãåŒããŠãã圢ã«ãªããŸãã ãªããæ³šæããŠæ¬²ããã®ãLAG颿°ã®ORDER BYã®ç®æãDESCã«ãªã£ãŠããŸãã æ¥ä»ã§æé ã«ãããããããã¯æ¶ããŠãããŸãããã ããã¯èŠãããã®ã«ãããšæãã®ã§é©å®èª¿æŽããŠãã ããïŒ å®è¡ããçµæã¯ãããªããŸãããæ£çŽãã£ã¡ã®æ¹ãããããããã§ããïŒw ãã®ããã«ãã³ãã¬ãŒããããŸã䜿ããšãµã¯ããšäœããŸãã ä»ã«ããã³ãã¬ãŒãã¯ããã®ã§ãã²å
¬åŒããã¥ã¡ã³ã㮠解説ããŒãž ãã確èªãã ããã ãŸãä»ã®æä»£ã¯ChatGPTå
çãGeminiå
çãªã©ã«èãã°ããããããæããŠãããŸãããäœã£ãŠãããŸããæå¹ã«æŽ»çšããŠãããŸãããïŒ å®ã¯ããã ããããªãã£ãTable calculation ããŠããããŸã§è§Šã£ãŠããTable calculationã§ããå¯ãã®è¯ãæ¹ã¯ãã®ããšã«æ°ã¥ããŠãããããããŸãã⊠ãSQLã§æžããã£ãŠããšã¯SQLã§ãããããšã¯å²ãšäœã§ãã§ããã®ã§ã¯âŠïŒ ããã§ããäœã§ãã§ããŸãã ããšãã°ãã®ãããªCASEæãæžããŠããããã©ã°ãç«ãŠãããšãã§ããŸã(Result typeã¯booleanã«ããŠãŸã) ã¹ãã¢ãšååã®æååãçµåãããããªããã¹ãèšç®ãã§ããŸã(Result typeã¯stringã«ããŠãŸã) ãªããèªåãæã£ãŠã衚èšç®ãšéãâŠïŒïŒïŒïŒ éèšããé
ç®ãããã«å¥œããªããã«ããŒã¿å å·¥ã»èšç®ã§ããã®ã§é¢çœããšæããŸãã ãŸãå°ãåã® Lightdashã¢ããããŒã ã§äœæãã衚èšç®é
ç®ãåå©çšã§ããããã«ãªããŸããã ã€ãŸããããã£ãŠå
ã»ã©äœæããããããã©ã°ãšã¹ãã¢ãšååã®é
ç®ãåãããããšãå¯èœã§ãã äœæãã衚èšç®çµæãããã«èšç®ããŠâŠã¿ããã«åºããŠãããã®ã§æè»æ§ãäžãã£ãŠããã§ããïŒ æåŸã« Table calculationã¯å®çŸ©ãããã¡ããªãã¯ã§å¯Ÿå¿ã§ããªãã£ãéèšãããŒã¿å å·¥ãã«ããŒããæ©èœãšãªã£ãŠããŠå©çšãããæ¹ã¯ããããæ©èœããããšèªèãããŠãããæ¹ãè¯ãæ©èœã ãšæããŸãïŒ ãã å
¬åŒããã¥ã¡ã³ãã«ã èšèŒ ããããŸãããã®Table calculationã¯äžæçãªããŒãºã«å¯Ÿå¿ãããã®ãšããŠã¯è¯ãæ©èœã§ãããç¹°ãè¿ãåå©çšãããŠããå Žåã¯dbtåŽã®å®çŸ©ã«è¿œå ããŠç®¡çããããã«ããæ¹ãè¯ãã®ã§ç®¡çè
ã¯é©å®ãã§ãã¯ããŠãããŸãããã We are hiring! çŸåšãããŒã¿ããªãã³æšé²å®€ã§ã¯ ããŒã¿ãšã³ãžãã¢/ã¢ããªãã£ã¯ã¹ãšã³ãžãã¢ã倧åéäž ã§ãïŒ ã»ãŒãã£ãŒã®ããã€ã¹ãã¢ããªã±ãŒã·ã§ã³ããã¯1æ¥ãããæ°ååä»¶ã®ãã°ãçºçããããŒã¿éã¯ç·åœ¢çã«å¢å ããŠããŸãã ãã®ãããªè¶
ããã°ããŒã¿ãå¹ççã«åŠçããããžãã¹ã®æææ±ºå®ã«ç¹ããããã®ä»çµã¿ãäžç·ã«äœã£ãŠã¿ãŸãããïŒ ãèå³ã®ããæ¹ã¯ ã»ãŒãã£ãŒæ¡çšãµã€ã ãèŠããŠã¿ãŠäžããïŒ ããLightdash Lifeããããã§ã¯ãŸãïŒ
ããã«ã¡ã¯ïŒã»ãŒãã£ãŒã§ããŒããŠã§ã¢éçºãæ
åœããŠããæäžžã§ãã ãåãã®éãããã»ãŒãã£ãŒãã¯ã¯ã©ãŠãé²ç»ãµãŒãã¹ããœãããŠã§ã¢ãäºæ¥ã®äžæ žãšããäŒç€Ÿã§ãã ãããŠåœç¶ã®ããã«ãã¯ã©ãŠãããœãããŠã§ã¢ã®æè¡ãããŒã¹ãšãããšã³ãžãã¢ã®å²åãå€ãäŒç€Ÿã«ãªããŸãã ããããã客æ§ã«æé«ã®äœéšããå±ãããããã«ã¯ãæ åã®å
¥ãå£ãšãªãã«ã¡ã©ãã¯ãããšãããããŒããŠã§ã¢ãã®ååšãæ¬ ãããŸããã 仿¥ã¯ãæ®æ®µããŸãèªãããããšã®ãªããã»ãŒãã£ãŒã®ããŒããŠã§ã¢ãžã®ç±ãæ³ããšããã®åè³ªãæ¯ããåãçµã¿ã«ã€ããŠã玹ä»ããããšæããŸãã ãã¹ãŠã¯ãã客æ§ã«å¯ãæ·»ããããã« ããã ä»å
¥ãããã ãã§ã¯çµãããªããã»ãŒãã£ãŒã®è£œåè©äŸ¡ ä»çµã¿ã§æ¯ããå質ã補åè©äŸ¡ããã»ã¹ã®æšæºå äžå
·åè§£æãããè
ã®èŠãã©ãã ãããã« ãã¹ãŠã¯ãã客æ§ã«å¯ãæ·»ããããã« ç§ãã¡ããŒããŠã§ã¢æ
åœãæã倧åã«ããŠããã®ã¯ã ãã客æ§ã«å¯ãæ·»ã£ã補åïŒããŒããŠã§ã¢ïŒãæäŸããŠããã ãšããããšãŠãã·ã³ãã«ãªæ¹éã§ãã ã客æ§ãã©ã®ãããªã·ãŒã³ã§ãã©ã®ãããªèª²é¡ã解決ãããã®ãã ãããæ·±ãçè§£ããæ©èœãæ§èœã¯ãã¡ããã®ããšãé·æã«ããã£ãŠå®å¿ããŠäœ¿ããå質ããããŠå®å
šæ§ãå
Œãåãã補åããå±ãããããšã ãããç§ãã¡ã®äœ¿åœã§ãã ã»ãŒãã£ãŒãæäŸããããŒããŠã§ã¢è£œåã«ã¯ãä»ç€Ÿãã賌å
¥ãã補åïŒäžéšãã»ãŒãã£ãŒåãã«ã«ã¹ã¿ãã€ãºãããã®ãå«ãïŒãšãèªç€Ÿã§éçºãã補åã®2çš®é¡ããããŸãã ä»åã¯ãç¹ã«ä»ç€Ÿè£œåãã客æ§ã«ãå±ãããéã®ãç§ãã¡ã®ãã ããã«ã€ããŠã話ãããŸãã ããã ä»å
¥ãããã ãã§ã¯çµãããªããã»ãŒãã£ãŒã®è£œåè©äŸ¡ ä»ç€Ÿè£œåãéžå®ããäžã§ãç§ãã¡ã¯ç¹ã«ä»¥äžã®2ã€ã®ããã»ã¹ã«å€ãã®æéãè²»ãããŠããŸãã ã客æ§ã®å©çšã·ãŒã³ã®ææ¡ãšçè§£ æäŸãã補åã®èšèšææ³ã®èªã¿åã Fig1 ãªããªãããã®2ã€ã®ã¹ããããçãã«ãããšããæã蟌ã¿ãã«ãã£ãŠåŸã
倧ããªåé¡ãåŒãèµ·ãããããªãããã§ãã ãæ®éã¯ããã®ã¯ãã ããšãã£ãæã蟌ã¿ãæé€ããã客æ§ã®æ¬åœã®ããŒãºãšè£œåã®ç¹æ§ãæ£ç¢ºã«çµã³ã€ããã ãããŠãé¢ä¿è
å
šå¡ããã®å
±éçè§£ã®äžã«ç«ã€ããšãããããžã§ã¯ãæåã®éµãæ¡ã£ãŠããŸãã ãã®èãæ¹ã«åºã¥ããç§ãã¡ã¯ä»¥äžã®ãããªã¹ãããã§è£œåã®è©äŸ¡ãé²ããŠããŸãã ã客æ§ã®èŠæ±å
容ãæç¢ºã«ããææžåããïŒãŠãŒã¶ãŒæ
å ±ïŒ éžæãã補åã®ä»æ§ïŒæ©èœãæ§èœãå質ãªã©ïŒãã客æ§ã®èŠæ±ãæºãããŠãããã確èªããïŒè£œåæ
å ±ïŒ ã«ã¿ãã°ã¹ããã¯ã ãã§ã¯ç¢ºèªã§ããªãé
ç®ãæŽãåºããè©äŸ¡ã»æ€èšŒã宿œããïŒè¿œå è©äŸ¡ïŒ Fig2 ä»çµã¿ã§æ¯ããå質ã補åè©äŸ¡ããã»ã¹ã®æšæºå ãèšãã¯æããè¡ãã¯é£ããã§ããããããã®è£œåè©äŸ¡ããã»ã¹ãæ
åœè
ã®ã¹ãã«ãçµéšã ãã«äŸåããŠããŸããšãå質ã«ã°ãã€ããçãŸããŠããŸããŸãã ããã§ç§ãã¡ã¯ã誰ãæ
åœããŠãäžå®ã®å質ãæ
ä¿ã§ããããã«ãè©äŸ¡ããã»ã¹ãåè¿°ã®ããã«æšæºåããå°çšã®å
¥åãã©ãŒã ïŒäžèšåç
§ïŒãæé æžãæŽåããŠããŸãã å©çšã·ãŒã³ã®ææ¡: 補åèšçœ®èŠä»¶ç¢ºèªã·ãŒã 補åã®èšèšã»å®å
šææ³ã®ææ¡: èšçœ®ã¬ã€ãã®ç¢ºèªã·ãŒãã補åèªèšŒã®ç¢ºèªã·ãŒã è£œåæ§èœã»å質ã®ç¢ºèª: è£œåæ§èœã®ç¢ºèªã·ãŒãã補åå質ã®ç¢ºèªã·ãŒã Fig3 ããã«ããœãããŠã§ã¢ãšã³ãžãã¢ãå€ãåšç±ããã»ãŒãã£ãŒã®ç¹æ§ãèžãŸããåã·ãŒãã®å
¥åæ¹æ³ã泚æç¹ããŸãšããæé æžãæºåããŸããã ããã¯ãæ®æ®µããèšçœ®æ¥åãéšæã«è§ŠããŠããæ
åœã§ããã°çšèªã«ã粟éããŠããŸãããã©ãã«ã©ããã£ãæ
å ±ãããããããããããŸãã ããããé »åºŠã®äœã人ãäœæ¥ãå§ããããšãããšãæãã®ã»ãæéãããã£ãããããŸãããã®ãããªèæ¯ã«å¯Ÿå¿ããããã®æé æžãäœæããŠããŸãã Fig4 ããããçšããããšã«ãããããŒããŠã§ã¢ã®å°éå®¶ã§ãªããŠããã¹ã ãŒãºãã€ç¶²çŸ
çã«æ€èšŒãé²ããããç°å¢ãæŽããŠããŸãã å ããŠã䜿çšäžã®æ³šæãå®å
šäžã®æ³šæãèªèšŒåæãšãã£ãæèšãçšèªã衚çŸãå瀟ã§å¹
åºãåçŽãªæ€çŽ¢ã§ã¯ãããããªããã®ã«ã¯çæAIãçšããããšãæ³å®ãã察象é
ç®ã調æ»ã§ããããã«ããŒãã¬ãŒãºã䜵èšããŠããŸãã å€ãã®äººã宿ããŠããéããçæAIã«ãã調æ»ã®ã¡ãªããã¯ãç¶²çŸ
çãªæœåºãã§ããããšã«ããã調æ»ç¯å²ãäžååãªããšã«ããæããæŒãã®çºçãé²ãããšãã§ããŸãã ããããªããã調æ»è
ã®çµéšã»ç¥èãå°ãªãå Žåã«ã¯ãçæAIã«å
¥åãããã¬ãŒãºãååã§ãªãããã®ã¡ãªãããååã«äº«åã§ããªãã±ãŒã¹ã®çºçããããŸãã ãããããããã¬ãŒãºäŸã䜵èšããåºåçµæãéå®ãããããªãããã«ããŠããŸãã Fig5 äžå
·åè§£æãããè
ã®èŠãã©ãã ãã®ããã«ç¢ºèªãè¡ã£ã補åã§ãã£ãŠã販売åŸã«ãæ®å¿µãªããäœããã®äžå
·åãçºçããããšããããŸãããããªæãããç§ãã¡ããŒããŠã§ã¢æ
åœã®è
ã®èŠãã©ããã§ãã è§£æã®é²ãæ¹ã§äžçªãããã¡ãªããšã¯ãã€ãçµéšãšåã«é Œã£ãŠè§£æãé²ããŠããŸãããšã§ãã åœããã°ããã®ã§ãããåœãŠãå€ãããšåå ç©¶æãå°é£ã«ãªãããšãå€ã
ãããŸãã æã
ã¯è£œé ã¡ãŒã«ãŒã§ã¯ãªãã倧éã«äžã®äžã«è£œåãåºè·ããŠããããã§ã¯ãªãã®ã§ãè§£æãã§ããäžå
·å察象æ©ãæ°å°çšåºŠã§ããããšãåžžã§ãã æ
éã«ããšãé²ããããšãéèŠã«ãªããŸãã ãã®ãããªããšãèžãŸããªãããçµéšè±å¯ãªãšã³ãžãã¢ããããã§ãªãã¡ã³ããŒããåãæ
å ±ãæ®ããªããè§£æãé²ãããããããäœç³»çãªäžå
·åè§£æãããŒãæ§ç¯ããŠããŸãã äžå
·åå ±åã®ç¢ºèªïŒäžå
·åå ±å確èªã·ãŒãïŒ äžå
·ååã®å€èгïŒå€èŠ³ç¢ºèªå ±åã·ãŒãïŒ äžå
·ååçŸïŒåçŸç¢ºèªå ±åã·ãŒãïŒ äžå
·ååã®åè§£ïŒå解確èªå ±åã·ãŒãïŒ äžå
·ååã®è§£æïŒè§£æå ±åã·ãŒãïŒ åã·ãŒãã«ã¯ãHWãšã³ãžãã¢ã®çµéšããŠãã確èªé
ç®ããªã¹ãããããã®å
容ãé æ¬¡ãã§ãã¯ããŠããã€ããã«ãªã£ãŠããŸãã ããã«ãããåŸæ»ãã®ãªããç確ãªåå ç©¶æãšãåçºé²æ¢ã«ç¹ããŠããŸãã Fig6 ãããã« ä»åã¯ãã»ãŒãã£ãŒã®ããŒããŠã§ã¢ãžã®åãçµã¿ãç¹ã«ä»ç€Ÿè£œåãè©äŸ¡ããéã®ããã»ã¹åã³äžå
·åè§£æã«ã€ããŠã玹ä»ããŸããã ããã¯ã HWãšã³ãžãã¢ãæ±ããã»ãŒãã£ãŒã ããããã®ã¢ãããŒãã§ã ã ç§ãã¡ã®ç®æšã¯ããã® HWãšã³ãžãã¢ã®çµéšãèŠèã«è£æã¡ãããä»çµã¿ ãããã«é²åãããHWãšã³ãžãã¢ä»¥å€ã®ã¡ã³ããŒãå«ããå
šäœã®åºäžããããããšã§ã客æ§ã«å質ã®é«ãããŒããŠã§ã¢ãå±ããããããã«ããããšã§ãã æ¬¡åã¯ãããäžã€ã®æ±ã§ãããèªç€Ÿéçºè£œåãã«ã€ããŠã詳ããã話ãããããšæããŸãã®ã§ããæ¥œãã¿ã«ïŒ
ããã«ã¡ã¯ãã»ãŒãã£ãŒæ ªåŒäŒç€Ÿãšã³ãžãã¢ã®äŒè€ã§ãã ä»åã®ã話ã¯ãåç»é
ä¿¡ãµãŒãã¹ãéçºã»éå¶ãããŠããçããŸãž ãUI/UXã ã«ã€ããŠã®ãé¡ãã§ããåé ããããªã察象ãçµã£ãå
å®¹ã«æãããããããããŸãããããã£ãšå€ãã®æ¹ã«ãå
±æããŠããã ããéšåããããšæããŸãã ã©ããæ°è»œã«ãèªã¿ããã ããã°å¹žãã§ãã ãŸã㯠ãã¡ã ãã芧ãã ãããïŒâ»é³ãåºãŸãïŒ â» iOS ã§ã¯äžæã衚瀺ãããªãäžå
·åããããŸããåäœç°å¢ã¯ PC ããã¹ã¹ã¡ã§ãã åç»èŠãªããå¯èœã¡åé¡ ã·ãŒã¯ããŒã®ãã©ã€ãšãã çæ³ã®ã·ãŒã¯ããŒã®ææ¡ ãŸãšã ããŸãïŒã·ãŒã¯ããŒã®äœãæ¹ïŒ ã¹ãããïŒ èšèšå³ãæžã ã¹ãããïŒ åº§æšå€æ ã¹ãããïŒ æç» ã¹ãããïŒ åçäœçœ®ã®ç§»å & ã¹ã±ãŒã«å€æ ãŸãšã åç»èŠãªããå¯èœã¡åé¡ ããŠãçããã¯ãåç»é
ä¿¡ãµãŒãã¹ããå©çšããŠããŸããïŒ YouTubeãNetflixãAmazonãã©ã€ã ã»ãããªãä»ã«ãæ°ããããªãã»ã©ã®ãµãŒãã¹ãä¹±ç«ããŠããŸãããçŸä»£äººãªãäœãããäžã€ã¯äœ¿ã£ãŠããã®ã§ã¯ãªãã§ãããããäžã«ã¯ãããã€ãã®ãµãŒãã¹ã«å å
¥ããŠãæ¯æ©ã€ãã€ã倿ŽããããŠããŸã£ãããäŒæ¥ã¯æããæ©ãŸã§åç»æŒ¬ããããªããŠæ¹ãããã£ããããããããŸããããããèšãç§ãããããªåç»æŒ¬ãã®æ¯æ¥ãéã£ãŠããäžäººã§ãã ãããŠä»åã¯ããããªç掻ã®äžã§ã©ãããŠãæ°ã«ãªã âããUIâ ã«ã€ããŠãäžèšç©ç³ããããšæããŸãã ãã㯠ãã·ãŒã¯ããŒã ã§ãã ç§ã¯æ®æ®µãå¯ããã³ãªããã¹ããã§åç»ãèŠãããšãå€ãã®ã§ãããã€ãã€ã å¯èœã¡ ããŠããŸãããšããããŸããæ°ã¥ãã°åç»ã¯åçãçµãã£ãŠããŠããããïŒã©ããŸã§èŠããã ã£ãïŒããšãåŸããèŠè¿ãããšããã®ã§ãããããã§å°ãã®ãã·ãŒã¯ããŒã§ããåç»ã®ç·åçæéã«å¯ŸããŠãã·ãŒã¯ããŒã®è¡šç€ºãããŸãã«ãçããæã§æ£ç¢ºã«å¯èœã¡ããäœçœ®ãŸã§ç§»åããã®ããšãŠãé£ããã®ã§ãã ã·ãŒã¯ããŒã®ãã©ã€ãšãã ããããããããã£ãŠæ¬åœã«ãããªã«é£ããã®ïŒããšãã³ãšããªãæ¹ããããããããŸãããããã§ãã©ããããæäœãé£ããã®ããå®éçã«æ€èšŒããŠã¿ãŸãããã ãŸããã·ãŒã¯ããŒã®ç©ççãªé·ãã§ãããã¹ãããæšªåãã«ãããšãã®ç»é¢å¹
ã«äŸåããŸãã端æ«ã«ãã£ãŠéãã¯ãããã®ã®ã倧ããã®ã¹ããã§ãç»é¢ã®æšªå¹
ã¯ãããã 150mm çšåºŠã§ããïŒã¡ãªã¿ã«ãç§ã䜿ã£ãŠããã¹ãã㯠110mm ã§ããïŒ ãã ããããã¯ç»é¢å
šäœã®å¹
ãå®éã®ã·ãŒã¯ããŒã«ã¯å·Šå³ã«ããŒãžã³ïŒäœçœïŒããããããããŒèªäœã®æå¹ãªé·ãã¯ããå°ãçããªããŸããããã§ã¯ä»®ã«ãã·ãŒã¯ããŒã®é·ãã 140mm ãšããŠã¿ãŸãããããã®ç¶æ
ã§ 2æéïŒ= 7,200ç§ïŒã®æ ç»ãèŠãŠãããšãããšã 1mm ãããã®æé ïŒ 7,200ç§ Ã· 140mm â 50 ç§/mm ããã«ãæã®è
¹ã®å€ªãã¯ã ããã 15mm ããããããŸããããã€ãŸãã æå
1 æ¬åã«çŽ 12 å ïŒïŒ50ç§ Ã 15mmïŒã®æ åãå§çž®ãããŠããããã§ãã ãã®ç¶æ
ã§ãããš5ç§æ»ãããããšæã£ãŠãã1mm以äžã®ç¹çŽ°ãªæäœãæ±ããããŸãããŸãã§ãç±³ã«åãæžããããªãã®ã§ãããããããèŠåŽããŠã·ãŒã¯ããŒã埮調æŽãããšããã§ãåç»ãåçããããŸã§ã¯ãã©ã®å Žé¢ããå§ãŸãã®ãåãããŸãããããã®ã·ãŒã³ã¯ãŸã æèããã£ããªãããã£ãã¡ãã£ãšè¡ããããããããªããšãèããªãããã¹ã¯ãªãŒã³ãäœåºŠãæã§ã¹ãªã¹ãªããããŠãè¡ããããŠã¯æ»ããæ»ããããŠã¯é²ãããããããŠã埮調æŽãäœåºŠãç¹°ãè¿ã矜ç®ã«ãªãã®ã§ãã çæ³ã®ã·ãŒã¯ããŒã®ææ¡ ããã§åé ã®åç»ã®æ°ããã·ãŒã¯ããŒã®ææ¡ã§ããå瀟ã®åç»é
ä¿¡ãµãŒãã¹ã§ãã²æ¡çšããŠããã ãããã çæ³ã®ã·ãŒã¯ã㌠ãèªåãªãã«å®è£
ããŠã¿ãŸããã 工倫ãããã€ã³ãã¯ãäž»ã«ä»¥äžã®2ã€ã§ãã ïŒ. ã·ãŒã¯ããŒã®ã¹ã±ãŒã«ãæ¡å€§ã»çž®å°ã§ãã åçäœçœ®ã®æå®ã¯ãããŠã¹ãªããã©ãã°æäœã§ãã¹ãããªãã¿ããæäœã§è¡ããŸããããèªäœã¯äžè¬çãªæäœã§ãããããã« ã¹ã±ãŒãªã³ã°æ©èœ ãå ããŸããã ããŠã¹ãã€ãŒã«ã§æ¡å€§ã»çž®å°ïŒã¹ããã®å Žåã¯ãã³ãã€ã³ã»ãã³ãã¢ãŠãïŒ ã¹ã±ãŒã«ã倧ããããã°ããã£ããå
šäœãæ©éãã»å·»ãæ»ã ã¹ã±ãŒã«ãå°ããããã°ãç§åäœã§ã®åŸ®èª¿æŽãã¹ãã¬ã¹ããªãŒ ããŸã倧ãŸãã«æ¢ã â 现ãã調æŽããã ãšããåäœããã¹ã ãŒãºã«å®çµã§ããã®ã§ãã ïŒ. åç»ã®ãµã ãã€ã«ã衚瀺ããŠèŠèŠçã«æ€çŽ¢ã§ãã ã·ãŒã¯ããŒã®äžã« åç»ã®ãµã ãã€ã«ã衚瀺ãã æ©èœãå ããŸãããããã¯æè¿ã®ãã¬ã€ã€ãŒã«ãããèŠãããæ©èœã§ãããä»åã®ææ¡ã§ã¯ã¹ã±ãŒã«æ¡å€§ã»çž®å°ãšçµã¿åãããŠäœ¿ããã®ããã€ã³ãã§ãã æ¡å€§æã«ã¯ãååŸã®ãã¬ãŒã ãèŠèªã§ããããã«ããã·ãŒã³ã®åãæ¿ãããã²ãšç®ã§ææ¡ã§ãã ãã©ãã§å¯èœã¡ãããããèŠèŠçã«æ¢ãããããªã ãã®2ç¹ãçµã¿åãããããšã§ãããã®å Žé¢ãæ¢ãããã®ã«èŠã€ãããªãããšããããã®ãã©ãããããè§£æŸãããã®ã§ã¯ãªãããšèããŠããŸãïŒ ãŸãšã 以äžãçŸå Žããã®ãé¡ãã§ããïŒ ã¡ãªã¿ã«åé ã®ãã¢ã®ãµã ãã€ã«éšåã®æç»ã«ã¯ããã©ãŠã¶ã«ããããè² è·ãããã£ãŠããããã§ãäžæãåäœããªãããšããããŸããç¹ã« iOS ã§ã¯ãµã ãã€ã«ãäžæã衚瀺ãããªãäžå
·åãèŠã€ãã£ãŠããŸããåäœç°å¢ã¯ PC ããã¹ã¹ã¡ã§ãã ãŸãä»åäœã£ãã·ãŒã¯ããŒãã奜ããªåç»ã§ã詊ãããã ããããã«ã ãæå
ã®åç»ãã¡ã€ã«ãèªã¿èŸŒããããŒãžã§ã³ ãçšæããŸãããè¯ããã°ãã¡ãã䜿ã£ãŠã¿ãŠãã ããã åç»é
ä¿¡ãµãŒãã¹ãæãããçããŸãã©ãããã®å¯èœã¡ãŠãŒã¶ãŒã®å£°ã«è³ãåŸããŠããã ããã°å¹žãã§ãïŒ ããŸãïŒã·ãŒã¯ããŒã®äœãæ¹ïŒ ããããã¯ãšã³ãžãã¢åãã®ã話ãã«ãªããŸãããã£ãããªã®ã§ãã¹ã±ãŒã«ãèªç±ã«å€æŽã§ããã·ãŒã¯ããŒã®å®è£
æ¹æ³ã«ã€ããŠè§£èª¬ããããšæããŸãã åé ã®åç»ãµã³ãã«ã§ã¯ããµã ãã€ã«è¡šç€ºãªã©ã®æ©èœãå«ããŠãããããã³ãŒããå°ãè€éã«ãªã£ãŠããŸããããã§ãä»åã¯ã·ãŒã¯æ©èœã«éå®ããã·ã³ãã«ãª ã㢠ãçšæããŸããããã¡ãã®ã³ãŒããããŒã¹ã«ããŠãå
·äœçãªå®è£
ãã€ã³ããä»çµã¿ããããããã説æããŠãããããšæããŸãããœãŒã¹ã³ãŒã㯠ãã¡ã ã§ãã å®è£
æ¹æ³ã¯ããã€ãèããããŸãããä»åã¯Webã¢ããªãšããŠã®éçºãšããããšã§ã Canvas API ã䜿ã£ãŠå®è£
ããŸãããCanvas API ã¯æšæºçãªæç»åŠçã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŠãããã¢ãã€ã«ãªã©ä»ã®ãã©ãããã©ãŒã ã§ã䌌ããããªæ©èœãã©ã€ãã©ãªãããã®ã§ãæ¯èŒçç°¡åã«ç§»æ€ãå¯èœã ãšæããŸãã ã¹ãããïŒ èšèšå³ãæžã ãŸãã¯ãã¶ã€ã³ã決ããŠããã®èšèšå³ãæããŸããããCanvas API ã§ã¯ç¹ãç·ãé·æ¹åœ¢ãšãã£ãåºæ¬çãªå³åœ¢ã®ã»ããããã¹ããç»åãæç»ã§ããŸãããã©ããªGUIãäœãã«ããŠãããŸã㯠æããããã®ã现ããªèŠçŽ ã«åè§£ãã ããšã倧åã§ãã ãµã³ãã«ã¯äžå³ã®ãããªãã¶ã€ã³ã«ãªã£ãŠããŸãããããèŠããšç·ãšé·æ¹åœ¢ããããŠããã¹ãã§æ§æãããŠããããšãåãããšæããŸãã ãã¡ãã«çްãã寞æ³ãèšå
¥ããŠãããŸãã 寞æ³ã®åãæ¹ã¯ã»ã³ã¹æ¬¡ç¬¬ã§èªç±ã«æ±ºããŠããã ããŠæ§ããŸãããã ãã®ãããªãã©ã¡ãŒã¿ã倿°ãšããŠãŸãšããŠãã ãšãããšãããã¶ã€ã³ã調æŽãããšãã«ãšãŠã䟿å©ã§ãã const SEEKBAR_POS_Y = 60 ; const SEEKBAR_HEIGHT = 15 ; const SCALE_LINE_HEIGHT = 8 ; const SCALE_TIME_TEXT_SIZE = 16 ; const CURRENT_TIME_TEXT_SIZE = 28 ; const HEIGHT = 120 ; ã¹ãããïŒ åº§æšå€æ ç¶ããŠãã·ãŒã¯ããŒã®æç»ã«å¿
èŠãªç¥èãã€ã³ãããããŠãããŸãããã ã·ãŒã¯ããŒã®æšªæ¹åã¯ãåç»ã®æéã®çµéã衚ããŠããŸããããã§ãåç»ã®æéãšç»é¢äžã®æç»äœçœ®ãçµã³ã€ããããã«ã ã座æšå€æã ãšããèãæ¹ã圹ç«ã¡ãŸããèãæ
£ããªãèšèãããããŸããããå®ã¯äžåŠçã®ãšãã«ç¿ã£ã äžæ¬¡é¢æ° ã®èãæ¹ãšã»ãŒåããã®ã§ãã ä»åäœã£ããã®ã¯ããŸãå³ã®ããã«åç»å
šäœããããã®äžéšãåãåã£ãèµ€æ ã®éšåãç»é¢äžã«æç»ããŠããŸãããã®ããã«èãããšã ãåç»ã®æé軞ããšãç»é¢ã®åº§æšè»žã ãšããã2ã€ã®ç°ãªã座æšè»žãååšããŠããããšã«ãªããŸãã ããã§ãåç»ã®æå»ã ãç»é¢ã®æ°Žå¹³æ¹åã®äœçœ®ã ãšããŸããããã«ã ç»é¢ã®å·Šç«¯ã®äœçœ®ã«å¯Ÿå¿ããæéïŒ ç»é¢1ãã¯ã»ã«ãããã®æéå¹
ïŒ ãšãããšã次ã®ãããªå€æåŒãæãç«ã¡ãŸãã ãã¡ãã®åŒã ãã§ã¯ãæé軞ãšç»é¢åº§æšè»žã®å€æãå
·äœçã«ã€ã¡ãŒãžãã¥ãããšæãã®ã§ãäžèšã®ããã«å€ãå®çŸ©ããŠããã®é¢ä¿ãå³ç€ºããŠã¿ãŸãã ç»é¢ã®å¹
ïŒ çŸåšæå»ïŒ ç»é¢ã®å³ç«¯ã®äœçœ®ã«å¯Ÿå¿ããæéïŒ åç»ã®é·ãïŒ å³ã®äžåŽã®éè²ã®çŽç·ãæé軞ã§ãäžåŽã®ãªã¬ã³ãžè²ã®çŽç·ãç»é¢åº§æšè»žã«ãªããŸããã°ã©ãã«ãããšæ¬¡ã«ãããªçŽç·ïŒäžæ¬¡é¢æ°ïŒã§ãã ãã®çŽç·ã®åŒã®å®æ°é
ã§ãã ãå€åããããšãæé軞äžã§åãåãç¯å²ãå€ãããŸãããã®çµæãç»é¢äžã§ã¯ã·ãŒã¯ããŒã®è¡šç€ºäœçœ®ãå·Šå³ã«ç§»åãããŸãã§æéãåããŠããããã«èŠããã®ã§ãã ãŸããçŽç·ã®åŸãã衚ã ã®å€ãå€ãããšãç»é¢äžã§åãåºãããæéã®ç¯å²ãå€ãããŸããããã«ãããã·ãŒã¯ããŒã®ã¹ã±ãŒã«ãæ¡å€§ã»çž®å°ããããããªèŠãç®ã«ãªããŸãã ã¡ãªã¿ã«ä»åã®ãã¶ã€ã³ã§ã¯ãç»é¢ã®äžå€®ã®äœçœ®ãçŸåšæå» ( ) ããããããŠããã®ã§ã ã¯çŸåšæå»ããç»é¢å¹
ã®åå ( )ã®æéãå·®ãåŒããå€ãšãªããæ¬¡ã®ããã«è¡šããŸãã ãšããããã§ãåç»ã®åãåºãäœçœ®ãå¶åŸ¡ããããã®å€æ°ãšããŠçŸåšæå» ( ) ãã¹ã±ãŒã«ãå¶åŸ¡ããããã®å€æ°ãšããŠïŒãã¯ã»ã«åœããã®æé( ) ããã® 2 ã€ãä¿æããŠããã°ååã§ãã // çŸåšã®æå» currentTimeMs = 0 ; // 1ãã¯ã»ã«ãããã®æéïŒããªç§ïŒ timeMsPerPix = 2400 ; å
ã®å€æåŒã« ã代å
¥ããŠæ¶ããšãçŸåšæå» ( ) ãš1 ãã¯ã»ã«åœããæéå¹
( ) ãçšããåŒã«æŽçã§ããŸãã ããããããã«å€åœ¢ã㊠ã€ã³ãŒã«ã®åœ¢ã«ãããšãæé軞äžã®åº§æš ãç»é¢äžã®åº§æš ã«å€æã§ããŸãã ããããåç»ã®æé軞ãšç»é¢ã®åº§æšè»žãè¡ãæ¥ããããã®å€æåŒã«ãªããŸããæç»äœçœ®ã®èšç®ã®ããã«é »ç¹ã«å©çšããã®ã§ 颿°å ããŠãããŸãã pix2time ( pix ) { const startTimeMs = this. currentTimeMs - this. canvas . width / 2 * this. timeMsPerPix ; return pix * this. timeMsPerPix + startTimeMs ; } time2pix ( timeMs ) { const startTimeMs = this. currentTimeMs - this. canvas . width / 2 * this. timeMsPerPix ; return ( timeMs - startTimeMs ) / this. timeMsPerPix } ã¹ãããïŒ æç» ããŠãæºåãæŽã£ãã®ã§ãããããæç»æ¹æ³ã«ã€ããŠè§£èª¬ããŠãããŸãã æç»ã«çšãã Canvas API ã®å©ç𿹿³ã¯ããã§è©³ãã解説ã¯ããŸããããé·æ¹åœ¢ãšããã¹ãã®æç»ããçšããªãã®ã§ãäžèšã®ïŒç¹ã ãéã«çè§£ããŠããã°ãªãã±ã€ã§ãã é·æ¹åœ¢ã®æç» (fillRect) ããã¹ãã®æç» (fillText) æç»åŠç㯠draw() 颿° ã®äžã«ãŸãšããããŠããŸãããå°ãé·ãã®ã§æ®µéçã«èŠãŠãããŸãããã èæ¯ã®æç» ãŸãã¯èæ¯ã®æç»ãããããã§ã¯ããã£ã³ãã¹å
šäœãæå®ããè²ã§å¡ãã€ã¶ããŠããŸããã€ãŸãããã®æç¹ã§ã¯èæ¯ãçã£çœã«ãªã£ãŠããã ãã§ãã ctx . fillStyle = SEEKBAR_BACKGROUND_COLOR ; ctx . fillRect ( 0 , 0 , this. canvas . width , this. canvas . height ) ; ã·ãŒã¯ããŒæ¬äœã®æç» 次ã«ã·ãŒã¯ããŒæ¬äœãæç»ããŸããããŒã®èæ¯ã¯ç»é¢ã®æšªå¹
ãã£ã±ãã«é·æ¹åœ¢ãæãã ãã§ãããã®åŸã«åç»ã³ã³ãã³ããååšããéšåãç·è²ã§å¡ãåããŸãã // ã·ãŒã¯ããŒã®èæ¯æç» ctx . fillStyle = SEEKBAR_BLANK_COLOR ; ctx . fillRect ( 0 , SEEKBAR_POS_Y , this. canvas . width , SEEKBAR_HEIGHT ) ; // ã·ãŒã¯ããŒã®åç»ã³ã³ãã³ããããéšåãæç» const dataStartPosX = this. time2pix ( 0 ) ; const dataEndPosX = this. time2pix ( this. durationMs ) ; ctx . fillStyle = SEEKBAR_DATA_COLOR ; ctx . fillRect ( dataStartPosX , SEEKBAR_POS_Y , dataEndPosX - dataStartPosX , SEEKBAR_HEIGHT ) ; ã·ãŒã¯ããŒã®ç®çãã®æç» ç¶ããŠå°ãé·ãã§ãããã·ãŒã¯ããŒã®ç®çããæç»ããŠããã³ãŒããã玹ä»ããŸãã ctx . font = SCALE_TIME_TEXT_SIZE + 'px sans-serif' ; const { scaleInterval , textInterval } = this. adjustScale ( this. timeMsPerPix ) const startTime = this. pix2time ( 0 ) const endTime = this. pix2time ( this. canvas . width ) const firstScaleTime = Math . floor ( startTime / scaleInterval ) * scaleInterval let i = 0 while ( 1 ) { const scaleTime = firstScaleTime + i * scaleInterval if ( scaleTime > endTime ) { break; } if ( scaleTime > this. durationMs ) { break; } if ( scaleTime < 0 ) { i ++ continue } // ç®çããæç» const scalePosX = this. time2pix ( scaleTime ) const scalePosStartY = SEEKBAR_POS_Y + SEEKBAR_HEIGHT const scalePosEndY = scaleTime % textInterval === 0 ? scalePosStartY + SEEKBAR_SCALE_HEIGHT * 2 : scalePosStartY + SEEKBAR_SCALE_HEIGHT ctx . fillStyle = SEEKBAR_SCALE_COLOR ; ctx . fillRect ( scalePosX , scalePosStartY , 1 , scalePosEndY - scalePosStartY ) // æéãããã¹ãã§æç» if ( scaleTime % textInterval === 0 ) { ctx . textAlign = 'center' ctx . textBaseline = 'top' ctx . fillText ( this. time2str ( scaleTime ) , scalePosX , scalePosEndY + 5 ) } i ++ } æåã«æç»ããç®çãã®æéã¯ä»¥äžã®ããã«èšç®ããŠããŸãã const firstScaleTime = Math . floor ( startTime / scaleInterval ) * scaleInterval ããã§äœ¿ã£ãŠãã scaleInterval ã¯ç®çãã®ééã衚ã倿°ã§ã1ãã¯ã»ã«ãããã®æéå¹
ã«å¿ããŠèª¿æŽããŠããŸãããã®äœçœ®ã¯ãäžå³ã®ããã« ç»é¢ã®å·Šç«¯ã®ãªã®ãªã®å€ã«ããç®çãã®æé ãæããŠããŸãã æåã®ç®çãã®äœçœ®ã決ãŸãã°ãããšã¯ç»é¢å³ç«¯ãŸã§çééã§ç·ãæç»ããŠããã ãã§ãã let i = 0 while ( 1 ) { const scaleTime = firstScaleTime + i * scaleInterval ã» ã»ãã«ãŒããæããå€å® ã» const scalePosX = this. time2pix ( scaleTime ) ã» ã»ãscalePosX ã®äœçœ®ã«ç®çããæç» ã» ++ i } çŸåšæå»ã®æç» çŸåšæå»ã瀺ãèµ€ãç·ãšããã¹ããæç»ããŠå®æã§ãã // äžå¿ã®ç·ãæç» ctx . fillStyle = SEEKBAR_CENTER_LINE_COLOR ; ctx . fillRect ( this. canvas . width / 2 , 0 , 1 , this. canvas . height ) ; // çŸåšæå»ã®æåèæ¯ãå¡ãã€ã¶ã const textBgWidth = 100 const textBgHeight = CURRENT_TIME_TEXT_SIZE + 5 const textBgPosX = ( this. canvas . width - textBgWidth ) / 2 const textBgPosY = ( SEEKBAR_POS_Y - textBgHeight ) / 2 ctx . fillStyle = SEEKBAR_BACKGROUND_COLOR ; ctx . fillRect ( textBgPosX , textBgPosY , textBgWidth , textBgHeight ) ; // çŸåšæå»ã®ããã¹ããæç» ctx . font = CURRENT_TIME_TEXT_SIZE + 'px sans-serif' ; ctx . textAlign = 'center' ctx . textBaseline = 'middle' ctx . fillStyle = SEEKBAR_TIME_TEXT_COLOR ; const textPosX = this. canvas . width / 2 const textPosY = SEEKBAR_POS_Y / 2 ctx . fillText ( this. time2str ( this. currentTimeMs ) , textPosX , textPosY ) ; ã¹ãããïŒ åçäœçœ®ã®ç§»å & ã¹ã±ãŒã«å€æ æåŸã«ãããŠã¹ã€ãã³ãã«åãããŠåçäœçœ®ã®ç§»åãã¹ã±ãŒã«å€æŽãè¡ã£ãŠããã³ãŒããèŠãŠãããŸãããã ãŸããåçäœçœ®ã®ç§»åã¯ããŠã¹ã®ãã©ãã°æäœã«é£åã㊠currentTime ãæŽæ°ããã ãã§ãã this .canvas . addEventListener ( 'mousedown' , ( e ) => { this. isMouseDown = true this. mousePosX = e . offsetX }) this .canvas . addEventListener ( 'mouseup' , () => { this. isMouseDown = false }) this .canvas . addEventListener ( 'mouseleave' , () => { this. isMouseDown = false }) this .canvas . addEventListener ( 'mousemove' , ( e ) => { if ( this. isMouseDown ) { const prevMousePosX = this. mousePosX this. mousePosX = e . offsetX const diffX = prevMousePosX - this. mousePosX const newCurrentTime = this. currentTimeMs + diffX * this. timeMsPerPix this. currentTimeMs = Math . max ( 0 , Math . min ( this. durationMs , newCurrentTime )) this. draw () } }) 次ã«ãã¹ã±ãŒã«ã®å€æŽãã·ã³ãã«ã§ãããŠã¹ãã€ãŒã«ã®æäœã«å¿ã㊠timeMsPerPix ã調æŽããã ãã§ãã this .canvas . addEventListener ( 'wheel' , ( e ) => { e . preventDefault () ; let newTimeMsPerPix = this. timeMsPerPix if ( e . deltaY > 0 ) { newTimeMsPerPix *= 1 . 1 } else { newTimeMsPerPix *= 0 . 9 } this. timeMsPerPix = Math . max ( MIN_TIME_MS_PER_PIX , newTimeMsPerPix ) this. draw () }) ããã§ãããŠã¹æäœã«ããçŽæçãªã·ãŒã¯ãšã¹ã±ãŒã«èª¿æŽãå®çŸã§ããŸããã¿ããæäœããµããŒãããŠããŸãããå®è£
æ¹æ³ã¯éå»ã«å·çãã èšäº ã§ã解説ããŠãããŸãã®ã§ããã¡ããåèã«ããŠããã ããã°ãšæããŸãã ãŸãšã é·ããªããŸãããã以äžãåŠçã®å
šå®¹ã«ãªããŸãã ä»å解説ãã座æšå€æã®èããå©çšããã°ãã¢ã€ãã¢æ¬¡ç¬¬ã§è²ããªãã®ãäœããããªæ°ãããŸãããïŒã¡ãªã¿ã«åº§æšè»žãïŒæ¬¡å
ã«æ¡åŒµããã°ãGoogleMap ã®ãããªãããã¢ããªãäœããŸããã¿ãªããŸã®äœãã®ã圹ã«ç«ãŠãã°å¹žãã§ãã æåŸãŸã§ãä»ãåãããã ããããããšãããããŸããã
ããã«ã¡ã¯ïŒã»ãŒãã£ãŒã§QAãšã³ãžãã¢ãããŠããçŠå±±ã§ãã ä»åã¯ãå
¥ç€Ÿéããªãç§ããä»ãããžã§ã¯ãã®QAã¡ã³ããŒãå·»ã蟌ã¿ãæ¢çŽ¢çãã¹ãã§è£œåå質ãåäžãããçµéšãã話ãããŸãã ãã®èšäºã¯ãç¹ã«ãããªæ¹ã
ã«èªãã§ããã ãããšå¬ããã§ãã æ¢çŽ¢çãã¹ã ãæ°ããå質ä¿èšŒã®åãçµã¿ãèããŠããQAãšã³ãžãã¢ã®æ¹ ããŒã ãéšçœ²ã暪æãã飿ºã§ãçµç¹å
šäœã®çç£æ§ãå質ãé«ãããããã¯ãªãŒãããããŒãžã£ãŒã®æ¹ æ°ããç°å¢ã§èªèº«ã®åŒ·ã¿ã掻ãããŠææãåºãããäžéå
¥ç€Ÿã®æ¹ 課é¡ïŒãªãªãŒã¹ãåã«ãæ
åœããŒã ã ãã§ã¯èŠã€ããããªãäžå
·åã®å£ æåã®éµã¯ãå·»ã蟌ãåãïŒä»ããŒã 飿ºã§æèãã5ã€ã®å·¥å€« 1. ã¿ã€ãã³ã°ãèŠæ¥µãã 2. å¿ççããŒãã«ãäžããŠããã¹ãã«éäžã§ãããç°å¢ãäœã æ°å€çãªç®æšã¯æ
£ããŠãã æ°è»œã«å
±æã§ããå Žãèšãã ãã°ãèŠã€ããããšã ããææã§ã¯ãªã 3. äžé·ã峿¹ã«ã€ãã 4. ã¢ãããŒã·ã§ã³ãç¶æãã 鱿¿ããã®ç»é¢æ
åœããŒããŒã·ã§ã³ åå¥ãã©ããŒãšå¯ãªã³ãã¥ãã±ãŒã·ã§ã³ è¿
éãªãã£ãŒããã㯠5. å
±æã®å Žããé¢ä¿æ§ãç¯ã ãã¹ãçµæãæ°å€çã«å¯èŠå é¢é£é¡æãçšããååŒ·äŒ ææŠã®è£åŽïŒã¶ã€ãã£ãå£ãšãæããããªãçºèŠ ã¶ã€ãã£ãå£ å®æœæéãšä»æ¥åãšã®èª¿æŽ èªèº«ã®èªç¥åºŠãšä¿¡é Œæ æããããªãçºèŠ ã¡ã³ããŒã®ååçãªå§¿å¢ 倿§ãªèŠç¹ããã®çºèŠ ãŸãšãïŒçµç¹ãåãããææãåºãããã«å¿
èŠãªã㚠課é¡ïŒãªãªãŒã¹ãåã«ãæ
åœããŒã ã ãã§ã¯èŠã€ããããªãäžå
·åã®å£ ã»ãŒãã£ãŒã®QAéšéã«ã¯ãåèš16åã®QAãšã³ãžãã¢ãããŸãããããããè€æ°ã®è£œåãæ
åœããŠãããç§ãæ
åœãã補åã®QAã¡ã³ããŒã¯4åãæ®ãã®12åã¯å¥ã®è£œåã«æºãã£ãŠããŸãã æ¥é ãããã¹ãã¹ã¯ãªããã䜿ã£ãç¶²çŸ
çãªãã¹ããšãæ¢çŽ¢çãã¹ãã䞊è¡ããŠå®æœããŠããŸããããæ
åœãããžã§ã¯ãã®ã¡ã³ããŒã ãã§ã¯ãã©ãããŠãèŠã€ãã«ããäžå
·åããããšæããŠããŸããã è¿«ããããªãªãŒã¹ãåã«ãã©ãããã°ãã£ãšå質ãé«ããããã ããïŒããšèããç§ããã©ãçããã®ãã ãä»ãããžã§ã¯ããæ
åœããQAã¡ã³ããŒãå·»ã蟌ãã ãšããã¢ã€ãã¢ã§ãããåãQAãšããè·çš®ã§ããæ®æ®µã¯å¥ã®è£œåã«æºãã£ãŠããã¡ã³ããŒã®æ°é®®ãªèŠç¹ãšå°éçãªçµéšã掻ãããæ¢çŽ¢çãã¹ãã¯ããã£ãšè£œåã®é ããåé¡ãçºèŠããå質ãäžæ®µãšåŒãäžããŠããããšç¢ºä¿¡ããã®ã§ãã æåã®éµã¯ãå·»ã蟌ãåãïŒä»ããŒã 飿ºã§æèãã5ã€ã®å·¥å€« ä»ãããžã§ã¯ãã®QAã¡ã³ããŒã«ååãäŸé Œããã«ããããã¹ã ãŒãºãªé£æºãšåå è
ã®ã¢ãããŒã·ã§ã³ç¶æãéèŠã ãšèãã以äžã®ç¹ãæèããŠæºåãé²ããŸããã 1. ã¿ã€ãã³ã°ãèŠæ¥µãã ãã¹ãã®å®æœã¿ã€ãã³ã°ã¯éåžžã«éèŠã§ããä»åã¯ãæ©èœã90%以äžå®è£
ãããŠããããã€ãªãªãŒã¹ãŸã§1ã¶æåãšããã¿ã€ãã³ã°ã§ååãäŸé ŒããŸãããæªå®è£
ã®æ©èœãå€ããšãã¹ã¿ãŒãæ··ä¹±ããŸãããéå§ãé
ããããšéçºãžã®è² è·ã倧ãããªãããããã®ã¿ã€ãã³ã°ãæé©ã ãšå€æããŸããã 2. å¿ççããŒãã«ãäžããŠããã¹ãã«éäžã§ãããç°å¢ãäœã äž»æ
åœã§ã¯ãªã補åã®æ¢çŽ¢çãã¹ãã¯ã©ãããŠãå¿ççããŒãã«ããããããã§ããã ãããŒãã«ãäžããã¹ã ãŒãºã«é²ãããã«ããã€ã工倫ãè¡ããŸããã æ°å€çãªç®æšã¯æ
£ããŠãã ãŸãã¯ç®çãæèãã€ã€ãæ
£ããŠãããããšãæåã®ç®æšã«ããŸãããè£ã§ã¯å
·äœçãªç®æšæ°å€ã¯èšå®ããŠããŸãããããããªãæ°å€ãæç€ºãããšé广ã ãšèããåŸããå
±æããããšã«ããŸããã æ°è»œã«å
±æã§ããå Žãèšãã Backlogãžã®çŽæ¥èµ·ç¥šã¯ãããã¹ãã¬ããã·ãŒãã«èšå
¥ããŠããã圢åŒã«ããŸãããããã«ãããå
容ã®ç²ŸåºŠãäžå
·åã®éè€ãæ°ã«ããå ±åã§ãããããå¿ççãªããŒãã«ãäžãããŸãã ãã°ãèŠã€ããããšã ããææã§ã¯ãªã äžå
·åãæ€åºã§ããªãã£ãå Žåã§ãã¢ãããŒã·ã§ã³ãäžããªãããããäžå
·åããªããããšã貎éãªæ
å ±ã§ããããšãäŒããŸããããŸããéåæãããæ¹åç¹ããæè¿ããUI/UXåäžã«çŽçµããéèŠãªæ
å ±ã ãšåŒ·èª¿ããŸããã 3. äžé·ã峿¹ã«ã€ãã ãããžã§ã¯ããåæ»ã«é²ããã«ã¯ãäžé·ïŒã°ã«ãŒããªãŒããŒïŒGLïŒã®çè§£ãšååãäžå¯æ¬ ã§ããç§ãã¡ã¯2ã€ã®ã°ã«ãŒãã«åãããŠãããããä»ã°ã«ãŒãã®ã¡ã³ããŒãå·»ã蟌ãã«ã¯ãåã°ã«ãŒãã®GLã®çè§£ãšååãå¿
èŠã§ãããäºåã«çžè«ãã快諟ãåŸããšãšãã«è²Žéãªã¢ããã€ã¹ãããã ããŸãããäžå±€éšã®ãµããŒãã¯ããããžã§ã¯ããæåãããäžã§éåžžã«å¿åŒ·ãåŸæŒããšãªããŸãã 4. ã¢ãããŒã·ã§ã³ãç¶æãã çŽ1ã¶æåã®æ¢çŽ¢çãã¹ããžã®ã¢ãããŒã·ã§ã³ãç¶æããŠããããããå
·äœçãªä»çµã¿ãããã€ãå°å
¥ããŸããã 鱿¿ããã®ç»é¢æ
åœããŒããŒã·ã§ã³ åå è
ã«ã¯é±ããšã«æ
åœç»é¢ãå²ãåœãŠã飜ããé²ããªããäž»èŠæ©èœãåªå
çã«ãã¹ãã§ãããã工倫ããŸããã åå¥ãã©ããŒãšå¯ãªã³ãã¥ãã±ãŒã·ã§ã³ ãªã¢ãŒãã¯ãŒã¯äžå¿ã®ã¡ã³ããŒã«ã¯ãDMãªã©ã掻çšããŠç©æ¥µçã«ã³ãã¥ãã±ãŒã·ã§ã³ãåããäžå
·åæ€åºã®æè¬ãäŒããããå°ã£ãŠããããšããªãã確èªããŸããã è¿
éãªãã£ãŒãããã¯ å ±åãããå
容ã¯ã極åãã®æ¥ã®ãã¡ã«ç¢ºèªããäœãããè¿ä¿¡ããããã«å¿ãããŸãããè¿
éãªã¬ã¹ãã³ã¹ã¯ãå ±åããåŽã®ã¢ãããŒã·ã§ã³ç¶æã«ã€ãªãããŸãã 5. å
±æã®å Žããé¢ä¿æ§ãç¯ã ãã¹ãçµæãæ°å€çã«å¯èŠå æ¯é±ããã¹ãçµæãæ°å€çã«å¯èŠåããåå è
å
šå¡ã«å
±æããŸãããããã«ãããèªåãã¡ã®æŽ»åã補åå質ã«ã©ã®ããã«è²¢ç®ããŠãããã宿ããŠããããŸãããããã«ãç¹ã«åèã«ãªã£ãå ±åå
容ã«ã€ããŠã¯ãæè¬ã®æã蟌ããŠå
±æããåå è
ã®åªåãç§°ããŸããã é¢é£é¡æãçšããååŒ·äŒ ãã¹ãã®äžç€ã«ã¯ãæ¢çŽ¢çãã¹ãã«é¢ããå匷äŒãéå¬ããŸãããå
±éã®é¡æãéããŠããäºãã®èãæ¹ããã¹ãã¹ã¿ã€ã«ãå
±æããæ©äŒãèšããããŒã å
šäœã®ãã¹ãã¹ãã«åäžãšé£æºåŒ·åãå³ããŸããã ææŠã®è£åŽïŒã¶ã€ãã£ãå£ãšãæããããªãçºèŠ ä»åã®åãçµã¿ã§ã¯ããã¡ããæ©ã¿ããããŸãããã幞éã«ãå©ããããå Žé¢ãå€ããããŸããã ã¶ã€ãã£ãå£ å®æœæéãšä»æ¥åãšã®èª¿æŽ åã¡ã³ããŒã®æ¥åãèŠããªãç¶æ³ã§ãã©ã®çšåºŠæéãæ»åºå¯èœãã¯éåžžã«æ©ãŸããç¹ã§ãããGLã«çžè«ããæäœ1æé/é±ãšããäžéå€ãèšããŠèªäž»æ§ã«ä»»ããæ¹éãæ±ºå®ããŸããã èªèº«ã®èªç¥åºŠãšä¿¡é Œæ æãå°ã£ãã®ããã¡ãã§ããäžéå
¥ç€Ÿããå幎匱ãšããããšããããæ®æ®µæ¥ç¹ã®ãªãä»ã°ã«ãŒãã®ã¡ã³ããŒã«èªèº«ã®ååšãç¥ã£ãŠããããä¿¡é Œé¢ä¿ãç¯ãããšã課é¡ã§ãããå匷äŒãªã©ãéããŠç©æ¥µçã«èªå·±é瀺ãè¡ããå°ããã€é¢ä¿æ§ãæ§ç¯ããŠãããŸããã æããããªãçºèŠ ã¡ã³ããŒã®ååçãªå§¿å¢ éåžžãåããŠã®è©Šã¿ã§ã¯æ§åèŠããå
¥ãããšãå€ããã®ã§ãããçå
ããŠã¹ã¿ãŒãããã·ã¥ãåã£ãŠãããã¡ã³ããŒãããŸããããŸããäžç€ã§ãç±å¿ã«å€ãã®å ±åããããã¡ã³ããŒããããŠçµç€ãŸã§ç¶ç¶ããŠãã¹ãã«åå ããŠãããã¡ã³ããŒãªã©ãæ§ã
ãªååããããžã§ã¯ããåé²ãããŸããã 倿§ãªèŠç¹ããã®çºèŠ åã¡ã³ããŒãããããã®åŸæãªèгç¹ããæ§ã
ãªèŠç¹ããäžå
·åãæ€åºããŠãããã®ã¯å€§ããªåç©«ã§ãããããã«ãããç§èªèº«ãããããªèгç¹ããã£ãã®ãããšåŠã³ãæ·±ããããšãã§ããŸããããã®å€æ§ãªèŠç¹ããããæ¢çŽ¢çãã¹ãã®ç䟡ã ãšæ¹ããŠæããŸããã ãŸãšãïŒçµç¹ãåãããææãåºãããã«å¿
èŠãªããš ä»ãããžã§ã¯ãã®QAã¡ã³ããŒãå·»ã蟌ãã æ¢çŽ¢çãã¹ãã¯ã補åã®å質åäžã«å€§ããè²¢ç®ããã ãã§ãªããéšå
éã®ã³ãã¥ãã±ãŒã·ã§ã³æŽ»æ§åã«ãã€ãªãããéåžžã«ææçŸ©ãªåãçµã¿ã§ããã æ¬èšäºã®æå€§ã®äŸ¡å€ã¯ã補åã®å質åäžãšãã çµæ ã ãã§ãªãã ãã®ææãçã¿åºãããä»ããŒã ãå·»ã蟌ããããã®å
·äœçãªããã»ã¹ãšããŠã㊠ãå
±æããç¹ã«ãããŸããå
·äœçãªæ°å€ã¯çããã®ããŒã ã®ç¶æ³ã«ãã£ãŠå€ãããããããŸããããããã«æžãããŠãã工倫ãèãæ¹ã¯ããã£ãšçããã®çµç¹ã§ãåçŸã§ãããšæããŸãã ç§èªèº«ã®ããã«äžéå
¥ç€Ÿã§ãã¡ã€ã³ç¥èãå°ãªãã¡ã³ããŒã§ããä»åã®å·¥å€«ãåããããšã§ããã£ãšçŽ æŽãããææãçã¿åºãããšãã§ããã¯ãã§ãã æ¬èšäºããçããã®å質ä¿èšŒæŽ»åã®äžå©ãšãªãã°å¹žãã§ãã
ããã«ã¡ã¯ã25æ°åãšã³ãžãã¢ã®äžã§ãã 倧åŠé¢ã§ã¯ãããè»ã®äŒç€Ÿãšå
±åã§ãæ©æ¢°åŠç¿ãçšããŠç©çã·ãã¥ã¬ãŒã·ã§ã³ã眮ãæããææ³ãã«ã€ããŠç ç©¶ãè¡ããå
æ¥ããŒãã«ãŠè¡ãããAIé¢é£ã®åŠäŒã§ãã¹ã¿ãŒçºè¡šããŠããŸããããšã¹ãã¬ããœããã¹ã¿ãã¯ã€ã³ãçŸå³ããã£ãã§ãã ãã®ããã°ã§ã¯ãå
¥ç€ŸããŠãã4ã¶æåŒ±ã§è¡ãããæ°åç ä¿®ãããžã§ã¯ãã§åŠãã ããå
šäœåã®å¯èŠåãã®éèŠæ§ã«ã€ããŠè©±ããŠãããŸãã æ°åãšã³ãžãã¢ç ä¿®ã«ã€ã㊠ç ä¿®ã§çŽé¢ããå£ ãããžã§ã¯ãã®å
šäœåãèŠããªãã£ãåæãã§ãŒãº æ¯ãè¿ãäŒãšãå¯èŠåãã®åŸ¹åº Before After ç ä¿®ãæ¯ãè¿ã£ãŠã¿ãŠ 4æ-5æååïŒèª²é¡çºèŠãã§ãŒãº ããå
šäœåãå¯èŠåãããŠããã⊠5æåŸå-6æååïŒèª²é¡çºèŠãã§ãŒãº2 6æåŸå-7æïŒéçºãšæªæ¥èšèšã®ãã§ãŒãº ãŸãšã æ°åãšã³ãžãã¢ç ä¿®ã«ã€ã㊠ä»åã®ã»ãŒãã£ãŒã®æ°åãšã³ãžãã¢ç ä¿®ã§ã¯ã4æçãäžãã7ææ«ãŸã§ã®4ã¶æåŒ±ã§ãã瀟å
課é¡ã解決ããããã®ãããã¯ãéçºããè¡ãªããŸããããã®ç ä¿®ã®æå€§ã®ç®çã¯ãããããã¯ãæèãäœçŸãããšã³ãžãã¢ãšããŠæé·ãããããšã§ããã€ãŸãããŠãŒã¶ãŒç®ç·ã«ç«ã¡ããããã¯ããèããããã«æ²¿ã£ãŠéçºãé²ãããã®äžã§æé·ããŠããããšãæ±ããããŸããã ç ä¿®ã§çŽé¢ããå£ ç ä¿®ãããžã§ã¯ããå§ãŸã£ãŠããã«ç§ãã¡ãçŽé¢ããã®ã¯ããããŒã å
šå¡ã§ãããžã§ã¯ãã®å
šäœåãææ¡ããããšãã®é£ããã§ãããç§ãã¡ã®ããŒã ã«ã¯ã以äžã®2ã€ã®ç®çããããŸããã æ°åç ä¿®ãããžã§ã¯ãã®ç®çïŒãããã¯ãæèã身ã«ã€ãããšã³ãžãã¢ãšããŠæé·ãã ãããã¯ãã®ç®çïŒãŠãŒã¶ãŒã®èª²é¡ã解決ãã ãããžã§ã¯ãã®å
šäœåã®ææ¡ãã§ããŠããªããšããã®2ã€ã®ç®çãåæã«éæããããšã¯é£ãããšçæããŸããã ãããžã§ã¯ãã®å
šäœåãèŠããªãã£ãåæãã§ãŒãº ããŒã ã§ã®éçºãã§ãŒãºãå§ãŸã£ãåææ®µéã§ã¯ããããžã§ã¯ãã®é²æç¶æ³ãææ¡ã§ããŠããŸããã§ããã å£é ã§ã®ã¿ã¹ã¯ç®¡çïŒå£é ã§æ±ºãŸã£ãããšãã¿ã¹ã¯ãšããŠèšé²ããããããããã®ã¿ã¹ã¯ã®ç²åºŠããã©ãã©ã§ãã ã¿ã¹ã¯ã®åãïŒèª°ãäœãããã®ããææ§ã«ãªããããŒã å
šäœã§ã¿ã¹ã¯ãæ±ããŠãã人ãšãããã§ã¯ãªã人ã®å·®ã倧ãããªã£ãŠãããŸããã æŒ ç¶ãšããäžå®ïŒç®ã®åã®ã¿ã¹ã¯ãããªãããšã«ç²Ÿäžæ¯ã§ããæ¬åœã«ãŠãŒã¶ãŒã®èª²é¡ã解決ãããã®ãªã®ãïŒãããã®ããã»ã¹ãèªèº«ã®æé·ã«æ¬åœã«ã€ãªãã£ãŠããã®ãïŒããšããæŒ ç¶ãšããäžå®ãåžžã«ä»ããŸãšããŸããã ããã¯ããããžã§ã¯ãå
šäœã®ææ¡ãã§ããŠããªãããšã«ããããèªèº«ã®æé·ããšããŠãŒã¶ãŒã®èª²é¡è§£æ±ºããšãã2ã€ã®ç®çãèŠå€±ã£ãŠããããšãåå ã§ããã æ¯ãè¿ãäŒãšãå¯èŠåãã®åŸ¹åº ãããžã§ã¯ãå
šäœã®ææ¡ãã§ããŠããªããšãã課é¡ã解決ãããããç§ãã¡ã¯éçºæ©é¢ã®äžéå°ç¹ã§éå¬ããæ¯ãè¿ãäŒã§çŸç¶ãå
±æããŸãããããã§ãç§ãã¡ã¯ä»¥äžã®ã·ã³ãã«ãªã«ãŒã«ã培åºããããšã«æ±ºããŸããã ã¿ã¹ã¯ã¯å¿
ããã±ãããšããŠå¯èŠåããç²åºŠãæãã å
·äœçãªã«ãŒã«ã¯ä»¥äžã®éãã§ãã ãã±ããã¯1~2å¶æ¥æ¥ä»¥å
ã§å®äºãããã®ã«éå®ãã åŠçäžã®ã¿ã¹ã¯ã¯1~2åã«ãã è€æ°ã®ã¿ã¹ã¯ã忥ã«äžŠã¶å Žåã¯ãå
šãŠãã®æ¥ã§çµããããããå Žåã®ã¿ãšãã ãã®ã«ãŒã«ã«ãããã¡ã³ããŒéã§ã¿ã¹ã¯ã®å
±éèªèãçãŸããã¹ã ãŒãºã«éçºãé²ããããããã«ãªããŸããã Before åŒåœç«¶å調æ»ã®äžã§äœãããã®ããã©ã調ã¹ãã®ãããããããé²æç¶æ³ãäžç®ã§åããã¥ãããéçºæ¬éšäŒã¯1æ¥ã®ã¯ããªã®ã«4æ¥ååŒãããŠããããã®äžã§äœãããã®ããããããªãã After ã¢ã€ãã ç»é¢å®è£
ãšãã芪ã¿ã¹ã¯ã«å¯Ÿããäœãããã®ããå°ã¿ã¹ã¯ãšããŠèšå®ãã鲿ã確èªãããããªããŸããã ç ä¿®ãæ¯ãè¿ã£ãŠã¿ãŠ ããç ä¿®éå§åœåã«ãå
šäœåã®å¯èŠåãã®éèŠæ§ã«æ°ã¥ããŠããããç§ãã¡ã®ãããžã§ã¯ãã¯ãã£ãšã¹ã ãŒãºã«é²ãã ãšããä»®å®ã®ããšãéçºç ä¿®ãæ¯ãè¿ã£ãŠãããããšæããŸãã 4æ-5æååïŒèª²é¡çºèŠãã§ãŒãº ãã®ææã¯ããããžã§ã¯ãã®é²ãæ¹ã課é¡ãçºèŠããããã®ææ³ã«é¢ããç¥èãäžè¶³ããŠããŸããã ããå
šäœåãå¯èŠåãããŠããã⊠æçµãŽãŒã«ã®æç¢ºåïŒæçµçã«å®æããããããã¯ãã®èŠæš¡ãããžã§ã³ãæçµå°éç¹ãããŒã ã§æç¢ºã«åæããŠããã°ãããããéç®ããŠãã€ã«ã¹ããŒã³ãèšå®ã§ããã¯ãã§ã Backlogã®é©åãªéçšïŒãŽãŒã«ãå®ãŸã£ãŠããã°ãBacklogã®ãã±ããã®ç²åºŠãèªç¶ãšå®ãŸããææ¢ãã§ã®éçšãé¿ããããšãã§ããã¯ãã§ã 5æåŸå-6æååïŒèª²é¡çºèŠãã§ãŒãº2 ãã®æéã¯ãã¡ã³ããŒãå
¥ãæ¿ããã§ç ä¿®ã«åå ããŠãããããããŒã å
ã§ã®é²æå
±æãäžååã«ãªã£ãŠããŸããŸããã ãããå
šäœåããå¯èŠåãããŠããã... ã¹ã ãŒãºãªé²æå
±æïŒãããžã§ã¯ãã®å
šäœåãå¯èŠåãããBacklogã«é©åã«ãã±ãããåæ ãããŠããã°ãæ»ã£ãŠããã¡ã³ããŒãããã«ç¶æ³ãææ¡ã§ããã¯ãã§ã ããŒã ã®äžè²«æ§ã®ç¶æïŒããŒã ãšããŠã®å€æè»žãå®ãŸã£ãŠããã°ãã¡ã³ããŒãæããŠãæ¹åæ§ãã¶ããããšã¯ãªãã£ãã§ããã 6æåŸå-7æïŒéçºãšæªæ¥èšèšã®ãã§ãŒãº éçºæéã¯ãåœåã®èšç»ããããããã éçºã®å®äºãé
ããŠããŸããŸããããŸããæç¢ºãªã«ãŒã«ããªããŸãŸã¢ãžã£ã€ã«çãªé²ãæ¹ã«ãªã£ããããé²æã®ææ¡ã«èŠåŽããŸããã ãããå
šäœåããå¯èŠåãããŠããã... éçšãèŠæ®ããèšèš: éçºã®åææ®µéãããéçšããããèšèšã«ãªã£ãŠãããïŒããã³ã¹ãã«èŠåã䟡å€ããããïŒããšãã£ãåãã«åãåããå±äººåãé¿ããããã®äººå¡é
眮ãèšç»ãç«ãŠãããã¯ãã§ã ãŸãšã ãã®ç ä¿®ãããžã§ã¯ããéããŠãç§ã¯æè¡çãªã¹ãã«ã ãã§ãªãããããŒã å
šå¡ãåãå
šäœåãå
±æããç®çãæèããŠéçºãé²ããããšããããããžã§ã¯ãã®æåãšèªèº«ã®æé·ã«äžå¯æ¬ ã ãšåŠã³ãŸããã ç ä¿®ã§çŽé¢ããå£ã¯ãç§ãã¡ã倧ããæé·ãããŠãããŸãããé
å±ãããŠæ°é±éçµã£ãä»ããã®çµéšã掻ããã èªèº«ã®æé·ãšããŒã ãšããŠã®ææãäž¡æ¹ã®èŠç¹ãæã£ãŠè¡åããããš ãå¿ãããŠããŸãã ä»åŸããã®ç ä¿®ã§éçºãããããã¯ãã¯ã瀟å
éçšã«åããŠããŒã ã§è°è«ãéããŠãããŸããæè¡ãåŠã¶ã ãã§ã¯ãªããã®æ°åç ä¿®ãããžã§ã¯ããçµéšã§ããããšããããŠå€ãã®å£ãããŒã ã§ä¹ãè¶ããçµéšã¯ãããããã®ãšã³ãžãã¢ãšããŠã®ãã£ãªã¢ã«ãããŠãåžžã«æŽ»ããããŠãã倧åãªæèšã§ãã