TSKaigi 2025 ã«åå ããŠããŸããïŒ ç®æ¬¡ TSKaigi 2025 ã«åå ããŠããŸããïŒ ã¯ããã« ã€ãã³ãã®æ§å åå ã¬ããŒã The New Powerful ESLint Config with Type Safety AI Coding Agent Enablements in TypeScript - ãšãŒãžã§ã³ããèªèµ°ãããã è€éãªãã©ãŒã ãç¶ç¶çã«éçºããŠããããã®æè¡éžå®ã»èšèšã»å®è£
TSç¹åClineããã°ã©ãã³ã° ãŸãšã æåŸã« ã¯ããã« Dev EnableããŒã ã® hond ãšåºåž( ktanonymous )ã§ãã 2025幎5æ23æ¥(é)ã24æ¥(å)ã®2æ¥éã«æž¡ã£ãŠéå¬ãããTSKaigi 2025ã«åå ããŠããŸããã®ã§ãã€ãã³ãã®æ§åãå°è±¡ã«æ®ã£ãã»ãã·ã§ã³ãããã€ãã玹ä»ããŸãã åã»ãã·ã§ã³ã®ã¢ãŒã«ã€ããå
¬éäºå®ãšã®ããšã§ãã®ã§ããã²å
¬åŒãµã€ãã»YouTubeãã£ã³ãã«ãªã©ããã§ãã¯ããŠã¿ãŠãã ããã 2025.tskaigi.org www.youtube.com ã€ãã³ãã®æ§å TSKaigi 2025ã¯ãæšå¹Žã®ããããããã®ãŸãŸã«ã2dayséå¬ã«æ¡å€§ããŠã®ã€ãã³ãéå¬ãšãªããŸããã TypeScriptãäžå¿ã«ããã«ã³ãã¡ã¬ã³ã¹ãšããŠTypeScriptã®ææ°æ
å ±ãæŽ»çšäºäŸãªã©ã玹ä»ãããã³ãã¥ããã£ã®çãäžãããæããããŸããã æšå¹ŽãšåãããäŒå Žã«ã¯å€ãã®ãšã³ãžãã¢ãéãŸãéåžžã«çãäžãã£ãŠããŸããã äŒå Žå
ã§ã¯æ§ã
ãªããŒã¹ãèšããããåã¹ãã³ãµãŒäŒæ¥ã§ã®TS掻çšäºäŸãªã©ã®ç޹ä»ãè¡ãããŠããŸããã ãªãŒããã³ã°ã®æ§å æ ªåŒäŒç€ŸKINTOæ§ã®ããŒã¹ æ ªåŒäŒç€Ÿãã¯ã³ãŽæ§ã®ããŒã¹ æ ªåŒäŒç€Ÿãã¯ã³ãŽæ§ã ã any åã䜿ãã®ã¯OKïŒããšããã¿ã€ãã«ã§ã¢ã³ã±ãŒãã宿œãããŠããŸããã ããŒãäžã®ã°ã©ããçªãæããŠåçããŠããæ¹ãããŠå°è±¡ã«æ®ã£ãŠããŸããããã®ã»ãã«ãã¢ã³ã±ãŒããTypeScriptã«ã¡ãªãã ã¯ã€ãºãªã©ã®ã³ã³ãã³ããæäŸãããŠããããŒã¹ãå€ããã©ããçæ³ã®æ§åã§ããã åå ã¬ããŒã The New Powerful ESLint Config with Type Safety çºè¡šè
: Anthony Fu ãã ã¬ããŒã: hond talks.antfu.me ãã®çºè¡šã§ã¯Legacy ConfigãšFlat Configã®æ¯èŒãç§»è¡æ¹æ³ã管çã»éçšããŠããäžã§ã®ããŠããŠã玹ä»ãããŠããŸããã ãã®äžã§ãç¹ã«ç®¡çã»éçšã«äŸ¿å©ãªããŒã«ãç¹ã«å°è±¡ã«æ®ã£ãã®ã§ç޹ä»ããŠãããŸãã ESLint Config Inspector ESLint Config Inspectorã¯ESLintã®èšå®ãã©ã®ããã«èšå®ãããŠãããèŠèŠçã«ææ¡ããããã®ããŒã«ã§ããã©ã®ãããªã«ãŒã«ãã©ã®ãã¡ã€ã«ã«é©çšãããŠããããç°¡åã«ææ¡ããããšãã§ããŸãã eslint-flat-config-utils eslint-flat-config-utilsã¯Flat Configãããç°¡åã«ç®¡çã»æäœããããã®ãŠãŒãã£ãªãã£éãšãªã£ãŠããŸããè€æ°ã®èšå®ãçµåããããã«ãŒã«ã®ç¡å¹åãªã©ã®æäœãèšå®ã®ãã§ã€ã³ãè¡ããããã«ããããã®ComposerãæäŸãããŠããŸãã eslint-typegen eslint-typegenã¯ESLintã®ã«ãŒã«ã¹ããŒãããåãèªåäœæããããŒã«ãšãªã£ãŠããŸãããããçšããããšã§ãšãã£ã¿ã§ã«ãŒã«ãªãã·ã§ã³ã®èªåè£å®ãåãã§ãã¯ãè¡ããã®ã§ã«ãŒã«ã®èšè¿°ã容æã«ãªããŸãã ãŸã åŒç€Ÿã§ã¯Flat Config察å¿ã§ããŠããªãéšåãããã®ã§ãããã®ããŒã«ãçšããŠé©åã«ç®¡çããŠããããã§ãã AI Coding Agent Enablements in TypeScript - ãšãŒãžã§ã³ããèªèµ°ãããã çºè¡šè
: Yuku Kotani ãã ( https://yuku.dev/ ) ã¬ããŒã: åºåž speakerdeck.com ãã¡ãã®ã»ãã·ã§ã³ã§ã¯ãAIã³ãŒãã£ã³ã°ãšãŒãžã§ã³ããããèªåŸçã«åããããšã§ãããéçºè
ã®ã¿ã¹ã¯ãæžãããŠããããã®ã¢ãããŒãã玹ä»ãããŸããã åºæ¬çãªæ¹éã¯ãAIãšãŒãžã§ã³ãã«æ¢çŽ¢ãããã解空éãçµã蟌ãããšããããšã§ãã ããã¯ãçºè¡šã§ã®è¡šçŸããåããããšãããä»»æã®TypeScriptããããã®åºã解空éãããè§£ïŒåºåïŒãæ¢çŽ¢ããã®ã¯ç²ŸåºŠãäœããªãããããã¡ã€ã³ãªã©ã®ãããžã§ã¯ãåºæã®ç¥èãäžããããšã§æ¢çŽ¢ããã¹ã解空éãçããããšããèãæ¹ã«åºã¥ããŠããŸãã 解空éãçµã蟌ãããã®ã¢ãããŒããšããŠã以äžã®ãã€ã³ããæããããŸããã ã³ã³ããã¹ããæ³šå
¥ããïŒe.g. cursor rules ãªã©ïŒ ã解空éã®å®çŸ©ããäžãã æ©æ¢°çæ€æ» åºåãæ€æ»ããŠãNGãªåºåã«ãã£ãŒãããã¯ããŠè§£ç©ºéã«æŒãæ»ã ãŸããå
·äœçã«åãçµãŸããŠããã¢ãããŒããšããŠã以äžã®ãããªãã®ã玹ä»ãããŸããã åæ
å ±ãäžããããšã§ã解空éãçµã蟌ã éçè§£æãèªåãã¹ããçµã¿èŸŒãããšã§ã解空éãçµã蟌ã ãã¶ã€ã³ã·ã¹ãã ã MCP ãµãŒããŒåããããšã§ã解空éãçµã蟌ã çæAIã¯çºå±ãèãããããã«æŽ»çšããããæš¡çŽ¢äžã®æ¹ãå€ãããšæããŸãããã解空éãçµã蟌ãããšããèãæ¹ãæ¹ããŠèšèªåãããããšã¯ããšãŠãçŽåŸæã®ããææ¡ã ãšæããŸããã ãŸãã30åã§å®è£
ããéçºè
ãš30ç§ã§å®è£
ããAIãšã§ã¯ã1åã®éçè§£æã«å¯Ÿããããã«ããã¯ã®çšåºŠã段éãã§ãããããããŒã«ãã§ã€ã³ãªã©ã®é床ãã·ãã¢ã«ãªã£ãŠãããšããç¹ãçºè¡šã®äžã§ãèšåããããŸããã ãããã£ãèŠç¹ã¯èªåèªèº«ã¯ããŸãæèã§ããŠããŸããã§ããããæ°åãèŠãŠã確ãã«äž¡è
ã®æã€æéã¹ã±ãŒã«ã¯å€ãã£ãŠãããªãšæãããšãŠãå°è±¡ã«æ®ããŸããã è€éãªãã©ãŒã ãç¶ç¶çã«éçºããŠããããã®æè¡éžå®ã»èšèšã»å®è£
çºè¡šè
: izumin5210 ãã ( https://x.com/izumin5210 ) ã¬ããŒã: åºåž speakerdeck.com ãã¡ãã®ã»ãã·ã§ã³ã§ã¯ãè€éã§é£ãããªããã¡ãªãã©ãŒã éçºã«ã€ããŠãããã«å¯Ÿããæè¡éžå®ãèšèšã»å®è£
ã®å·¥å€«ã«ã€ããŠè§£èª¬ãããŸããã ãã©ãŒã ã®éçºã¯ãå
¥åå€ã®ç®¡çãå
¥åã«åºã¥ãç¶æ
ã®æ§ç¯ãåæã»éåæåŠçããããŠæçµçãªåºåãŸã§ãçš®ã
ã®å·¥çšã絡ã¿åãããéåžžã«è€éã«ãªãããããšãã課é¡ããããŸãã çºè¡šã§ã¯ãŸããreact-hook-formã®ãããªãã©ãŒã ã®ç®¡çã䟿å©ã«ããŠããããã©ãŒã ã©ã€ãã©ãªã®äœ¿çšããããšã玹ä»ãããŸããã äžæ¹ã§ãããªããŒã·ã§ã³ã®ãããªããžãã¯ãªã©ãUIã®èšè¿°ã«åããããããšãããã¡ãªããããããããè€éãã«å¯ŸåŠããããã«ãããæ§é ãããããžãã¯ãããæ¯ãèããããã£ããåé¢ããŠã¢ããªã³ã°ããããšãéèŠã ãšèšåãããŠããŸããã å ããŠãzod ã®ãããªããªããŒã·ã§ã³ã¹ããŒãã©ã€ãã©ãªã掻çšããããšã§ãUIãšå¶çŽã®åé¢ã管çã«å¯ŸããŠèªç¶ãšæ³šç®ã§ããããã«ãªãã¡ãªããããããŸããããã«ãäžèŠãªãç¶æ
ããæãããã«ãå€ããšããŠæ±ãèšèšã«ããããšã§ãããã·ã³ãã«ã§ä¿å®ããããå®è£
ãå¯èœã«ãªãããšãžã®èšåããããŸããã 解決ããã課é¡ã«ãã£ãŠé©åãªã¢ãã«ã¯å€ãã£ãŠããããããããžã§ã¯ãã«å¿ããã¢ããªã³ã°ãæè¡éžå®ã»èšèšãéèŠã«ãªã£ãŠãããšæããŸããã äŸç€ºãããã©ãŒã ãåŸã
ã«è€éãªãã®ã«çœ®ãæããŠãããªããå
·äœçã«ã©ããã£ãã¢ãããŒããèããããã®ãã玹ä»ããããã©ãŒã éçºã®é£ãããããã«å¯Ÿããã¢ãããŒãã®èãæ¹ãåèªèã§ãããšæããŸãã åŒç€Ÿã§ãè€éãªãã©ãŒã ã®éçºãããŠããé åããããããéåžžã«å
±æã§ããå
容ã§ãåèã«ãªããããªãã®ã¯ç©æ¥µçã«å°å
¥ããŠãããããšæããŸããã TSç¹åClineããã°ã©ãã³ã° çºè¡šè
: mizchi ãã ã¬ããŒã: hond https://tskaigi.mizchi.workers.dev/ ãã®çºè¡šã§ã¯éçºãè¡ãäžã§å®éã«ããŸããã£ãããã³ãããããŸããããªãã£ãããã³ããããããã®èå¯ãèªãããŠããŸããã ç¹ã«å°è±¡çã ã£ããã®ã«ã€ããŠç޹ä»ããŠãããŸãã å¹ãããã³ãã: ãã¹ãé§åéçº (æéèŠ) AIèªèº«ãå£ããããšãæ©æã«æ€ç¥ãèªå·±ä¿®åŸ©ããããã«TDDã¯å€§äºãšã®ããšã§ããTSKaigiã®ä»ã®çºè¡šã§ããããŸãããtestçãæ¡çšãã人éãè©äŸ¡ããæ¹é(ãã¥ãŒãã³ã€ã³ã¶ã«ãŒã)ããšããšäººéã®è©äŸ¡æéãããã«ããã¯ã«ãªãã®ã§ãã®æ¹éã¯å€§äºã ãªãšæããŸãããç¹ã«commitç²åºŠãé«ãããŠããã°å£ããæç¹ã§å
ã®ç¶æ
ã«æ»ãããããæ¹ããŠäœæ¥ãåéããããšãã§ãããšæããŸããã å¹ãããã³ãã: ã³ã¡ã³ãã«ããèªå·±èšè¿° å®è£
æã«ã³ãŒãã ãã§ãªããã®ã³ãŒãã®å®è£
ã®æŠèŠãã³ã¡ã³ãã§èšè¿°ãããããšã§ä¿®æ£ãè¡ãéã«äžè²«æ§ãæããããšã®ããšã§ãããå人çã«ãå®è£
æãšä¿®æ£æã§åããããªããã³ãããäžããŠããããããŠããŸãããšãåé¡ã«æããŠããŠã¡ã¢ãªãã³ã¯ã䜿ã£ãŠAIãè¡ã£ãäœæ¥ãæãåºãããããšããŠããŸããããã³ãŒããšäžå¯Ÿäžã§å¯Ÿå¿ããããã§ã¯ãªãã®ã§å®å
šãªäžè²«æ§ãæãããããšã¯ã§ããŠããŸããã§ãããã³ã¡ã³ããAIã«ããããããšã§åè¿°ã®éãAIã«ä¿®æ£ãè¡ãããéã«äžè²«æ§ãçãŸããã ãã§ãªããAIãäœæããã³ãŒãã人éãä¿®æ£ãããšãã«ããã®å©ãã«ãªããšæããŸããã å¹ã: URL ãèªãèœå (MCP) mizchiãããäœæããURLã®å
ã®ãµã€ãã®æ¬ææœåºãè¡ãmarkdownã«å€æããããŒã«ã玹ä»ãããŠããŸããããã®ããŒã«ãçšããŠååŸããå
容ãããã«èŠçŽããŠdocsã«ä¿åãããšãããŸãããcursorãgeminiã§ã¯webæ€çŽ¢ã®æ©èœã¯ãããŸãããããè¡ããšã³ã³ããã¹ããèšãäžãã粟床ã®äœäžãæããŠããã®ã§æ€çŽ¢ãèŠçŽãæç¢ºã«åããŠèŠçŽããçµæã®ã¿ãããã³ãããšããŠäžããã®ã¯æå¹ãªæ¹æ³ã ãªãšæããŸããã ä»åããã¯ã¢ãããããã®ä»¥å€ã«ãããããã®ããã³ãããããŸããã£ãçç±ãšãããªãã£ãçç±ãäžå¯§ã«èª¬æãããŠããŸããããŸããããããã®ããã³ãããã¹ã©ã€ãã«èšè¿°ãããŠããŠããã«äœ¿ããããã¡ã«ãªã£ãŠããã®ã§TSKaigiãçµäºæ¬¡ç¬¬ãã詊ããŠã¿ãããšæããŸãïŒ ãŸãšã TSKaigi 2025ã¯ãTypeScriptãäžå¿ã«ããã«ã³ãã¡ã¬ã³ã¹ãšããŠãå€ãã®ãšã³ãžãã¢ã«ãšã£ãŠæçãªæ
å ±ãåŸãããã€ãã³ãã§ããã TypeScriptã®ææ°æ
å ±ãæŽ»çšäºäŸãåŠã¶ããšãã§ããæ°ããæè¡ãã¢ã€ãã¢ã«è§Šããããšãã§ããŸããã ä»åŸããTypeScriptã³ãã¥ããã£ã®çºå±ãšããšã³ãžãã¢ã®ã¹ãã«ã¢ããã«è²¢ç®ããã€ãã³ããšããŠãTSKaigiãç¶ããããŠããããšãæåŸ
ããŠããŸãã ãŸããä»åã®åå ã¬ããŒãããTypeScriptãåŠã³ããæ¹ããTypeScriptãæŽ»çšãããæ¹ã®åèã«ãªãã°å¹žãã§ãã æåŸã« ãšããªãŒã§ã¯ããšãã«åã仲éãåéããŠããŸãã ããã¯ããã°ãèªãã§å°ãã§ããšããªãŒã«èå³ãæã£ãŠããã ããæ¹ã¯ããã²äžåºŠã«ãžã¥ã¢ã«é¢è«ã«ãè¶ããã ããïŒ corp.every.tv æåŸãŸã§ãèªã¿ããã ããããããšãããããŸããïŒ
ã¯ããã« ããã«ã¡ã¯ãããªãã·ã¥ãããã³éçºéšã§ãœãããŠã§ã¢ãšã³ãžãã¢ãããŠããæ°è°·ã§ãã æ°åã§å
¥ç€ŸããŠããæ©1幎ãçµã¡ãæã®æµãã®éããæããŠããŸãã ä»åã¯ãã¢ããªèª²éã·ã¹ãã ã«ããããµãŒããŒåŽã®ãã¹ãæ¹æ³ã«ã€ããŠã玹ä»ããŸãã æè¿ãããªãã·ã¥ãããã³ãšãã«ã·ã«ã«ãããã¢ããªèª²éã·ã¹ãã ã®ãµãŒããŒåŽã®ä¿®æ£ãè¡ããŸããã ãã®éããã¹ãæ¹æ³ã«èŠæŠããã®ã§ããã®å
容ããŸãšããããšæããŸãã ã¢ããªèª²éã·ã¹ãã ã®æŠèŠ ããªãã·ã¥ãããã³ãšãã«ã·ã«ã§ã¯ãiOSãšAndroidã®äž¡æ¹ã§ã¢ããªèª²éãã§ããŸãããä»åã¯iOSã®èª²éã«ã€ããŠã®ã玹ä»ã§ãã ããããã¢ããªèª²éã«ã¯ã以äžã®2çš®é¡ããããŸãã äžåºŠåãã®è²·ãåãå ãµãã¹ã¯ãªãã·ã§ã³åïŒå®æèª²éïŒ ä»åãæ±ãã®ã¯ãµãã¹ã¯ãªãã·ã§ã³åïŒå®æèª²éïŒã®èª²éã§ãã ãµãã¹ã¯ãªãã·ã§ã³ã®èª²éã¯ãåŠçãšããŠå€§ãã2ã€ã«åããããæåã®è³Œå
¥åŠçãšãã®åŸã®éç¥åŠçã§ãã éç¥åŠçãšã¯ãAppleããéç¥ããã賌èªç¶æ
ãåããŠããŠãŒã¶ãŒã®ç¶æ
ãæŽæ°ããåŠçã§ãã 1ã€ç®ã®è³Œå
¥åŠçã®æŠèŠã¯ä»¥äžã®å³ã®ããã«ãªãã賌å
¥ããã¬ã·ãŒãã®æ€èšŒãšã¬ã·ãŒãã®ä¿åãäž»ãªåŠçã§ãã ããã§ã¯ãsubscriptionåŠçãšåŒã¶ããšã«ããŸãã 2ã€ç®ã®éç¥åŠçã®æŠèŠã¯ä»¥äžã®å³ã®ããã«ãªãããŠãŒã¶ãŒã®èª²éç¶æ
ãæŽæ°ããã®ãäž»ãªåŠçã§ãã ããã§ã¯ãnotificationåŠçãšåŒã¶ããšã«ããŸãã ããªãã·ã¥ãããã³ãšãã«ã·ã«ã§ã¯ã課éãµãŒããŒãåãããŠããã®ã§ãå³å¯ã«ã¯äžèšã®å³ã§ã¯ãªãã®ã§ãããè¡ã£ãŠããåŠçã¯å€§æ ã§ã¯åãã§ãã ãã«ã·ã«ã®èª²éãµãŒããŒã«ã€ããŠã¯ã以äžã®èšäºã§è§£èª¬ãããŠããŸãã tech.every.tv ãµãŒããŒåŽã§ãã¹ãããã¹ãç®æ ãµãŒããŒåŽã§ãã¹ãããã¹ãç®æã¯ãsubscriptionåŠçãšnotificationåŠçã®å
ã課éãµãŒããŒåŽã§è¡ãåŠçã§ãã ãã¹ãé
ç®ã«ã€ããŠã¯ãä»åçç¥ããŸãããåºæ¬çã«ã¯subscriptionåŠçãšnotificationåŠçã§ãDBã«ä¿åããŠããã¬ã·ãŒãã®æ
å ±ãæ£ãããã©ããããã¹ãããããšã«ãªããŸãã ãã¹ãæ¹æ³ iOS課éã«ã¯ããã¹ãããæ¹æ³ãšããŠã以äžã®2ã€ããããã©ã¡ããšãå®éã«èª²éããŠãè«æ±ã¯çºçããŸããã TestFlightã§ã®èª²é Sandboxã¢ã«ãŠã³ãã§ã®èª²é TestFlightã§ã®èª²é TestFlightã§ã®èª²éã¯ãTestFlightã§é
åžããããã¹ãããŒãžã§ã³ã®ã¢ããªã§èª²éãè¡ãæ¹æ³ã§ãã TestFlightã§èª²éãããšãæŽæ°é »åºŠã¯éåžžããçããªã以äžã®è¡šã®ããã«ãªããŸãã 1é±é 1ã¶æ 2ã¶æ 3ã¶æ 6ã¶æ 1幎 æŽæ°é »åºŠ 1æ¥ 1æ¥ 1æ¥ 1æ¥ 1æ¥ 1æ¥ è©³ããæ
å ±ã¯å
¬åŒãµã€ããåç
§ããŠãã ããã developer.apple.com Sandboxã¢ã«ãŠã³ãã§ã®èª²é Sandboxã¢ã«ãŠã³ãã§ã®èª²éã¯ãSandboxã«ãããAppleã¢ã«ãŠã³ããApp Store Connectã«ç»é²ããããšã§ãSandboxã¢ã«ãŠã³ãã§èª²éãè¡ããŸãã Sandbox課éã¯ãæŽæ°é »åºŠã¯App Store Connectã§èšå®ããããšãã§ããããã©ã«ãã5åãšãªã£ãŠããŸãã 衚ã«ãããšä»¥äžã®ããã«ãªããŸãã æŽæ°é »åºŠ 1é±é 1ã¶æ 2ã¶æ 3ã¶æ 6ã¶æ 1幎 æŽæ°é »åºŠ 3å 5å 10å 15å 30å 1æé æŽæ°é »åºŠã¯ä»¥äžã®åè£ããããŸãã 3å 5åïŒããã©ã«ãïŒ 30å 1æé ãã¡ããã詳ããæ
å ±ã¯å
¬åŒãµã€ããåç
§ããŠãã ããã developer.apple.com TestFlightã§é
åžããŠããã¢ããªã§Sandbox課éãè¡ãæ¹æ³ TestFlightã§èª²éããå Žåã®æ³šæç¹ãšããŠã課éããŠããŸããšãã£ã³ã»ã«ããããšãã§ããŸããããŸããæŽæ°é »åºŠã1æ¥ã«1åã§1é±éç¶ãã®ã§ãnotificationåŠçã®ãã¹ãã1æ¥ã«1åãã確èªã§ããããã£ã³ã»ã«ãŸã§1é±éåŸ
ã€å¿
èŠããããŸãã ãã®ãããåºæ¬ãã¹ããããšãã¯Sandboxã¢ã«ãŠã³ãã§èª²éãè¡ãããã§ãã ããããTestFlightã§é
åžããŠããã¢ããªã§ã¯ãTestFlightã§ç»é²ãããŠããAppleã¢ã«ãŠã³ãã§èª²éãããããŠããŸããŸãã ããã¯ãTestFlightã§é
åžããŠããã¢ããªã§ã¯ãTestFlightã®ã¢ã«ãŠã³ãã§èª²éãããããŠããŸãããã§ãã ãã®ãããäžåºŠãApple Storeãããµã€ã³ã¢ãŠããè¡ãããšã§ãTestFlightã®ã¢ã«ãŠã³ããããµã€ã³ã¢ãŠãããŸãã ãã®åŸã課éãããããšãããšä»¥äžã®ããã«ãã°ã€ã³ç»é¢ã«é·ç§»ããŸãã ããã§ãSandboxã¢ã«ãŠã³ãã§ãã°ã€ã³ãè¡ãããšã§ãSandbox課éãè¡ãããšãã§ããŸãã ãŸãšã ä»åã¯ãiOS課éã®ãµãŒããŒåŽã®ãã¹ãæ¹æ³ã«ã€ããŠã玹ä»ããŸããã Androidã®èª²éã«ã€ããŠã¯ããŸãããæ¹ãç°ãªãã®ã§ããŸãèšäºã«ããããšæããŸãã iOS課éã®å®è£
ããã¹ããè¡ãéã®åèã«ãªãã°å¹žãã§ãã
æŠèŠ TIMELINEéçºéšã®å
åã§ãã ä»åã¯AWS ALBã«å¯Ÿãããªã¯ãšã¹ãæãéä¿¡å
ãšãªãIPã¢ãã¬ã¹ãåºå®ããæ¹æ³ã«ã€ããŠèª¿æ»ããŸããã®ã§ãã®å
±æã§ãããããŸã§äžè¬çãªèŠä»¶ã§ã¯ãªãæ°ã¯ããŸãããåèã«ãªãã°å¹žãã§ãã èæ¯ ãšããç°å¢ã«ãããŠãALBã«å¯Ÿããéä¿¡å
åŽãIPã¢ãã¬ã¹ã®ãã¯ã€ããªã¹ã圢åŒã§éä¿¡ãèš±å¯ããæ§æã«ãªã£ãŠããããåè¿°ã®èŠä»¶ãæºããå¿
èŠããããŸããã ãã ãAWSã®ALBã¯IPã¢ãã¬ã¹ãåºå®ãããŠããããç¶æ³ã«ãã£ãŠå€åãããšãã仿§ã«ãªã£ãŠããŸãããã®ãããDNSã§ALBãæå®ããã«ã¯ALB DNSåãCNAMEã§æå®ããããRoute53ã®Aliasæ©èœãçšããŠæå®ããã®ãäžè¬çã§ãã ãã®ããæ¹ã ãšIPã¢ãã¬ã¹ãå€åãããããæ¥ç¶å
ããæ¥ç¶å
IPã¢ãã¬ã¹ãåºå®ããããšããããŒãºã¯æºãããŸããã ALBã®å Žåã¯EIPãçšããŠåºå®åããããšãã§ããªã仿§ã§ãã 解決ç ããã€ãéžæè¢ãèããããŸãã Global Accelerator(GA) ãçšãã GAã¯æ¬æ¥é«éåãå®å®åã®æèã§çšããããæ©èœã§ããã坿¬¡çã«åºå®IPã¢ãã¬ã¹(2å)ãä»äžããããã®IPã¢ãã¬ã¹çµç±ã§éä¿¡å¯èœã«ãªãããIPã¢ãã¬ã¹ã®åºå®åãããããšãã§ããŸãã GAã¯ãšã³ããã€ã³ããšããŠALB, NLB, EC2, EIPãéžæããããšãå¯èœã§ããã€ãŸãALBã«å¯ŸããProxyãšããŠæ©èœãããã®äžã§Networkçµè·¯ã®æé©åãMulti-AZã§ã®fail overãšãã£ãé«éåãå®å®åãå®çŸã§ããŸãã æ§ç¯æé ã¯ä»¥äžã®éãã§ãã Global Acceleratorã远å ãªã¹ããŒãæå®ãä»åã¯SSLã®ã¿å¯Ÿå¿ããã°ãããã443, TCPãæå® ãšã³ããã€ã³ãã¿ã€ããšããŠALBãããŒããã©ã³ãµãšããŠæ¢åALBãéžæ äœæåŸãããããžã§ãã³ã°å®äºãåŸ
〠äžèšãå®äºãããšGAã®DNSåãšåºå®IPã¢ãã¬ã¹(2å)ãçºè¡ãããŸãããŸãDNSåã解決ãããš2åã®Aã¬ã³ãŒããè¿åŽãããŸãããã®éãçæ¹ã®IPã¢ãã¬ã¹ã®ã¿ã§ãéä¿¡ã¯å¯èœã§ãããå¯çšæ§ãèæ
®ãããšåé·ãªæ§æãæãŸããããDNSçµç±ã§ã®éä¿¡ãé©åœããšèããŸãã ãã®éãSSLèšŒææžã¯ALBãä¿æããŠãããã®ãå©çšããããããæ¥ç¶ããéã®ãã¹ãåã¯SSLèšŒææžãšåèŽããŠããå¿
èŠããããŸãã Network Load Balancer(NLB) + Elastic IP(EIP) ãçšãã NLBã¯åºå®IPã¢ãã¬ã¹ãä»äžããããšãå¯èœãªããŒããã©ã³ãµãŒã§ããALBãšç°ãªããã¬ã€ã€ãŒ4ã®ããŒããã©ã³ãµãŒãšãªããããSSLçµç«¯ã¯ã§ããŸããããã®ãããSSLçµç«¯ã¯ALBã§è¡ããNLBã¯ALBã®å段ã«é
眮ããæ§æãšãªããŸãã æ§ç¯æé ã¯ä»¥äžã®éãã§ãã NLBãäœæ ãªã¹ããŒãæå®ãä»åã¯SSLã®ã¿å¯Ÿå¿ããã°ãããã443, TCPãæå® ã¿ãŒã²ããã°ã«ãŒããäœæããæ¢åALBãæå® EIPãååŸããäœææžã¿NLBã«ã¢ã¿ãã äžèšãå®äºãããšNLBã«åºå®IPã¢ãã¬ã¹ãä»äžãããŸãããŸãNLBã®DNSåã解決ãããšEIPã®Aã¬ã³ãŒããè¿åŽãããããããã®IPã¢ãã¬ã¹çµç±ã§éä¿¡ãå¯èœã«ãªããŸãã ãã®éãSSLèšŒææžã¯ALBãä¿æããŠãããã®ãå©çšããããããæ¥ç¶ããéã®ãã¹ãåã¯SSLèšŒææžãšåèŽããŠããå¿
èŠããããŸãã EC2 + Elastic IP(EIP) ãçšãã EC2ã€ã³ã¹ã¿ã³ã¹ã«Reverse Proxy(äŸ: Nginx)ãæ§ç¯ããEIPãä»äžããæ¹æ³ã§ããALBã®å段ã«é
眮ããALBã«å¯ŸããProxyãšããŠæ©èœããŸãã æ§ç¯æé ã¯ä»¥äžã®éãã§ãã EC2ã€ã³ã¹ã¿ã³ã¹ãäœæ Nginxçã®Reverse Proxyãã€ã³ã¹ããŒã« Reverse Proxyã®èšå®ãè¡ã EIPãååŸããEC2ã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¿ãã äžèšãå®äºãããšEC2ã€ã³ã¹ã¿ã³ã¹ã«åºå®IPã¢ãã¬ã¹ãä»äžãããŸãããŸãDNSã解決ãããšEIPã®Aã¬ã³ãŒããè¿åŽãããããããã®IPã¢ãã¬ã¹çµç±ã§éä¿¡ãå¯èœã«ãªããŸãã ãã®éãSSLèšŒææžã¯EC2ã€ã³ã¹ã¿ã³ã¹äžã«èšçœ®ããå¿
èŠããããŸãããALBã®èšŒææžãšç°ãªã£ãŠããŠãããããšã«ãªããŸãã æ¯èŒ ããããã®ææ³ã«ãããŠç¹åŸŽã確èªããŸãã ãªããããã®ææ³ã«ãããŠãæ¢åã®ALBã®å段ã«ã¢ã¿ãããã圢åŒãšãªãããããµãŒãã¹ã®ããŠã³ã¿ã€ã ã¯çºçããŸãããïŒãã ãæ¥ç¶å
ã®åãæ¿ãäœæ¥ã¯å¿
èŠã§ãïŒ ãŸãæ©èœèŠä»¶ãšããŠã¯ä»¥äžãæ³å®ããŸãã æ¥ç¶ã¯SSL æ±äº¬ãªãŒãžã§ã³(éä¿¡å
ã¯æ¥æ¬åœå
) 100GB/æã®ããŒã¿è»¢é 24æéçšŒå æ¯èŒè¡š ä»åã®ãŠãŒã¹ã±ãŒã¹ã«ãããã³ã¹ããæ©èœã«ã€ããŠã®æ¯èŒè¡šã¯ä»¥äžã§ãã ãªããGAãNLBã«ãããŠæé©ãªå©çšã·ãŒã³ã¯å
ã
å·®ç°ããããŸãããä»åã®çšéã«ãããŠç¹ã«åœ±é¿ããªãã£ãéšåã¯ç¡èŠããŠããŸãã ææ³ è²»çš åé·æ§ çµè·¯æé©å SSLçµç«¯å ã»ãã¥ãªãã£ä¿è· GA GAæ¬äœ $0.025 à 24h à 30æ¥ = $18.00 ããŒã¿è»¢é $0.010 à 100GB = $1.00 IPã¢ãã¬ã¹ 2å à $0.005 à 24h à 30æ¥ = $7.20 åèšçŽ $26.20/æ â ãã äžèŠ ãã NLB+EIP NLBæ¬äœ $0.0243 à 24h à 30æ¥ = $17.49 LCU $0.006 à 24h à 30æ¥ = $4.32 EIP $0.005 à 24h à 30æ¥ = $3.60 åèšçŽ $25.41/æ â ãªã äžèŠ ãªã EC2+EIP EC2 (t3.micro) $0.0136 à 24h à 30æ¥ = $9.79 ããŒã¿è»¢é $0.114 à 100GB = $11.40 EIP $0.005 à 24h à 30æ¥ = $3.60 åèš çŽ $24.79/æ â³ ãªã å¿
èŠ ãªãïŒèŠå®è£
ïŒ ã³ã¹ãçã«ã¯ã©ã®éžæè¢ã倧ããªéãã¯ãªãããã§ãã ãã EC2+EIPã¯å¥éSSLçµç«¯åãå¿
èŠã§ããããã€å¥éã€ã³ã¹ã¿ã³ã¹ã®ã¡ã³ããã³ã¹ãå¿
èŠãšãªãéçšã³ã¹ããé«ããªããŸãããŸãåé·æ§ã«ã課é¡ãããããããã®éžæè¢ãæ¡ãå©ç¹ã¯èãããã«æãããŸãã GAãšNLB+EIPãšã§ã¯ã³ã¹ãçã«ã¯å€å°åŸè
ãäœããã®ã®ã»ãŒåã¬ãã«ã§ããGAã®ã»ãã¯çµè·¯æé©åãå¯èœã§ãããæ¥æ¬åœå
éã®éä¿¡ã§ããã°ãã»ã©åœ±é¿ã¯ãªããããããŸããã GAã®ã»ããæ°æ©èœã§ããããšãèžãŸãããšãããæŽ»çºãªæ©èœè¿œå ãè¡ãããå¯èœæ§ã¯é«ãããªã®ã§ããæå©ãšèšãããããããŸããã ãŸãšã ALBã®IPã¢ãã¬ã¹ãåºå®åããè€æ°ã®ææ³ã«ã€ããŠæ¯èŒæ€èšããŠã¿ãŸããã ä»åã®ãŠãŒã¹ã±ãŒã¹ã«ãããŠã¯GAãçšããã®ãäžçªé©åœã«æãããŸãããç¶æ³ã«ãã£ãŠã¯å¥ã®éžæè¢ãããåŸããã§ãã
ç®æ¬¡ ã¯ããã« JSAI ãšã¯ïŒ ãšããªãŒã«ããã AI å©çšã«é¢ããåãçµã¿ ã€ãã³ãåœæ¥ã«ã€ã㊠æåŸã« ã¯ããã« ããã«ã¡ã¯ããã¢ããéçºéšãœãããŠã§ã¢ãšã³ãžãã¢å
ŒãCTO 宀 Dev Enable ã°ã«ãŒãã® rymiyamoto ã§ãã ãã®åºŠãæ ªåŒäŒç€ŸãšããªãŒã¯ã2025 幎 5 æ 27 æ¥(ç«)ãã 30 æ¥(é)ã«éå¬ããããJSAI2025 (2025 幎床 人工ç¥èœåŠäŒå
šåœå€§äŒ)ãã«ããã©ããã¹ãã³ãµãŒãšããŠåè³ããããšã«ãªããŸããïŒ www.ai-gakkai.or.jp (2025/06/04远èš) åå ã¬ããŒãã¯ãã¡ã tech.every.tv JSAI ãšã¯ïŒ JSAI ã¯ãæ¥æ¬äººå·¥ç¥èœåŠäŒã®ç¥ç§°ã§ãã人工ç¥èœã«é¢ããç ç©¶ã®é²å±ãšç¥èã®æ®åãå³ããåŠè¡ã»æè¡ãªãã³ã«ç£æ¥ã»ç€ŸäŒã®çºå±ã«å¯äžããããšãç®çãšããŠèšç«ããããæ¥æ¬ã®åŠäŒã§ãã ä»å¹Žã§ 39 åç®ãè¿ããå
šåœå€§äŒã¯ã倧éªã®å€§éªåœéäŒè°å ŽïŒã°ã©ã³ãã¥ãŒã倧éªïŒã§éå¬ãããŸãã ãšããªãŒã«ããã AI å©çšã«é¢ããåãçµã¿ ã¡ã€ã³ãµãŒãã¹ã§ãããããªãã·ã¥ãããã³ãã§ã¯ããäœãããïŒãèŠã€ãããããµãŒãã¹ã®ã³ã³ã»ãããšããŠãæ§ã
ãªæ©èœãæäŸããŠããŸããã äžæ¹ããŠãŒã¶ãŒã²ãšãã²ãšãã®å€æ§ãªããŒãºã«åãããã¬ã·ããææ¡ããŠããã«ã¯æ¢åæ©èœã ãã§ã¯é£ããéšåããããAI ã«ããæçã¢ã·ã¹ã¿ã³ããšããŠãããªãã·ã¥ AIããäžéšãŠãŒã¶ãŒåãã«æäŸãå§ããŠããŸãã tech.every.tv ãŸãããããã® AI 掻çšãæ¯ãã CI/CD ãã€ãã©ã€ã³ã®æ§æã«ãåãå
¥ããŠããŸãã ãã®äžã§äœ¿ã£ãŠãã Databricks Asset Bundles ã¯ãããŒã¿ã AI ãããžã§ã¯ãã«ãããŠããœãããŠã§ã¢éçºã«ããããœãŒã¹ç®¡çãã³ãŒãã¬ãã¥ãŒããã¹ããCI/CD ãšãã£ããã©ã¯ãã£ã¹ã®å°å
¥ã容æã«ããããŒã«ã§ããããã«ãããDatabricks ã®åçš®ãªãœãŒã¹ã Infrastructure-as-CodeïŒIaCïŒãšããŠç®¡çããŠããŸãã tech.every.tv ãããªãã·ã¥ AIãã®å
éšã§ã¯ OpenAI API ãå©çšããŠãã Structured Outputs ã«ã€ããŠãè§ŠããŠããã®ã§ããã²ã芧ãã ããã tech.every.tv ã€ãã³ãåœæ¥ã«ã€ããŠ åœæ¥ã¯åŒç€ŸããŒã¹ã«ãŠããããªãã·ã¥ AIãã®ãã¹ã¿ãŒå±ç€ºããã¢ãè¡ããŸãã ãŸããããã«ãã£ãé
åžäºå®ã§ãã®ã§ããã²ãèå³ã®ããæ¹ã¯ãè¶ããã ããïŒ æåŸã« ãšããªãŒã§ã¯ããšãã«åã仲éãåéããŠããŸãã ãã®ããã¯ããã°ãèªãã§å°ãã§ããšããªãŒã«èå³ãæã£ãŠããã ããæ¹ã¯ããã²äžåºŠã«ãžã¥ã¢ã«é¢è«ã«ãè¶ããã ããïŒ corp.every.tv æåŸãŸã§ãèªã¿ããã ããããããšãããããŸããïŒ
éçºæ¬éšã®ããŒã¿&AIããŒã ã§ããŒã¿ãµã€ãšã³ãã£ã¹ããããŠãã倿¿µã§ãã ä»åã¯ãææŠWEEKã§å®è£
ãããã¬ã·ãææã®å矩èªèŸæžèªååããLLMã§å®è£
ããå
容ããŸãšããŸãã ææŠWEEKã«é¢ããŠã¯ã以äžã®èšäºãã芧ãã ããã tech.every.tv èæ¯ ãŠãŒã¶ãŒã®ã¯ãšãªã«ãã£ãŠãåãæå³ã衚ãèšèã§ãç°ãªãåèªã䜿ãããããšããããŸãã ããªãã·ã¥ãããã³ã顿ã«äŸãæãããšãé¶ããèãããšãããèããé³¥ããèããªã©ã§ãã ãããã®åèªå士ãå矩èªïŒã·ããã ïŒããããã®å矩èªã察å¿ã¥ãããã®ãå矩èªèŸæžãšåŒã³ãŸãã ããªãã·ã¥ãããã³ã®æ€çŽ¢æ©èœã§ã¯å矩èªèŸæžã人æã§äœæããŠå¯Ÿå¿ããŠããŸãã ããã¯å
人ãã¡ã®èŠåŽãå£éèŠããç¬éã§ãããã®ã§ãããæ€çŽ¢æ©èœä»¥å€ã§å矩èªèŸæžãå¿
èŠã«ãªãå Žé¢ã倿°åºãŠããŠãããæ€çŽ¢æ©èœãšåæ§ã®éçšãç¶ç¶ããããšã¯é£ãããªã£ãŠããŸããã ããã§ã以äžã®èšäºãåèã«ãå矩èªèŸæžã®èªååãææŠWEEKã®é¡æãšããŠå®è£
ããŠã¿ãŸããã çŽ3幎åã®èšäºã§ãããOpenAI APIãªã©å®¹æã«LLMãæŽ»çšã§ãã仿¥ã§ã¯ãããç°¡æçã«å®è£
ã§ããããã«ãªã£ãŠãããšæããŸãã engineering.mercari.com ææ³ èšäºãåèã«ã以äžã®ãããªæé ã§å矩èªèŸæžãäœæããŸããã æ€çŽ¢çµæã«è¡šç€ºãããŠããã¬ã·ããã¿ããããæã«åŸãããããã®æ€çŽ¢ããŒã¯ãŒããšã¬ã·ãææã®ãã¢ããŒã¿ãæœåºããã æ€çŽ¢ããŒã¯ãŒããåèªã«åå²ããã æ€çŽ¢ããŒã¯ãŒãäžã®åèªãšã¬ã·ãã®ææã®åºçŸåæ°ãšå
±èµ·åæ°ãèšç®ããã ããããã®èªã®åºçŸåæ°ãšå
±èµ·åæ°ãããšã«NPMIïŒè©³çްã¯åŸè¿°ïŒãèšç®ããã NPMIãããšã«å矩èªãã¢ã®åè£ã䞊ã³ãããäžäœ5äžãã¢ãæœåºããã OpenAIã®Embedding APIãçšããŠå矩èªãã¢ïŒæ€çŽ¢ããŒã¯ãŒããšææåïŒããããããã¯ãã«ã«å€æããã ã³ãµã€ã³é¡äŒŒåºŠãèšç®ããã³ãµã€ã³é¡äŒŒåºŠãšNPMIãããšã«ããããã®éŸå€ãèšå®ããŠãå矩èªèŸæžãåºåããã 1. æ€çŽ¢ããŒã¯ãŒããšã¬ã·ãææã®ãã¢ããŒã¿ãæœåº ãŸããæ€çŽ¢ãã°ãšèŠèŽãã°ãJOINããŠãæ€çŽ¢ããŒã¯ãŒããšããã«çŽã¥ããŠãŒã¶ãŒID, ã¬ã·ãIDãååŸããŸãã æ€çŽ¢ãã°ã«ã¯æ€çŽ¢ããŒã¯ãŒããšãŠãŒã¶ãŒIDãèŠèŽãã°ã«ã¯ãŠãŒã¶ãŒIDãšã¬ã·ãIDãèšé²ãããŠããããŠãŒã¶ãŒIDãšæ¥ä»ãäžèŽãããã®ãJOINããŸããã å³å¯ã«æ€çŽ¢âèŠèŽã®é ã«ãã°ãèšé²ãããããšãä¿èšŒããã«ã¯ãunixtimeãæ€çŽ¢<èŠèŽã«ãªã£ãŠããå¿
èŠããããŸãã ããããããã§ã¯ãŠãŒã¶ãŒãæ€çŽ¢ãå©çšããéã¯ç¹å®ã®ç®çãæã£ãŠãããšä»®å®ããæ€çŽ¢âèŠèŽãèŠèŽâæ€çŽ¢ã®ã©ã¡ãã®é åºã§ããåäžã®èå³ãæã£ããŠãŒã¶ãŒè¡åãšããŠæ±ãããšã«ããŸããã ã€ãŸããåãæ¥ã®ãŠãŒã¶ãŒè¡åã§ããã°ãæ€çŽ¢ãèŠèŽã®ã©ã¡ããå
ã ã£ããšããŠããçããå
±èµ·ãããã¢ãšã¿ãªãããã®ãã¢ãå矩èªãã¢ã®åè£ãšããŠæœåºããŠããŸãã ãããŸã§ãŠãŒã¶ãŒã®æ€çŽ¢ããŒã¯ãŒããšã¬ã·ãã®ææã®å
±èµ·ã«é¢å¿ããããæç³»åãæ·±ãæ°ã«ããªãæ¹éãåããŸããã 2. æ€çŽ¢ããŒã¯ãŒãã®åå² ä»¥äžã®æåã§ãæ€çŽ¢ããŒã¯ãŒããåå²ããŸããã åè§ã¹ããŒã¹ å
šè§ã¹ããŒã¹ èªç¹ ã«ã³ã å³å¯ã«åèªã ããæœåºããå Žåã¯åœ¢æ
çŽ è§£æãããªã©ã®ååŠçãå¿
èŠã§ãããããªãã·ã¥ãããã³ã®æ€çŽ¢ããŒã¯ãŒãã®å€ãã¯åèªåºåãã§ããããšãå€ããããããã ãã§ãæ€èšŒã¯é²ããããŸããã ãŸããã¬ã·ãã®ææã«é¢ããŠã¯ããã¹ã¿ãŒããŒã¿ãšããŠ1ã¬ã·ãã«å¯ŸããŠè€æ°ã®ææãçŽã¥ããããŠããŸãã ææããŒã¿ã¯åååèªã§ãŸãšãŸã£ãŠãããããã»ãšãã©ååŠçããããšãªããã®ãŸãŸäœ¿çšããŸããã æçµçã«æ€çŽ¢ããŒã¯ãŒããšã¬ã·ãææã®ãã¢ããŒã¿ã以äžã®ããã«ãªããŸãã äŸãšããŠããããŠãŒã¶ãŒAãšBã«ãã£ãŠãæ€çŽ¢ããŒã¯ãŒãããé³¥ããè ç
§ãçŒããããšãããè ç
§ãçŒãããšããæ€çŽ¢ãããããã®ã¬ã·ãçµæã§è¡šç€ºãããã¬ã·ããèŠèŽããããšããŸãã æ€çŽ¢ããŒã¯ãŒã ãŠãŒã¶ãŒID ã¬ã·ãID ã¬ã·ãææ é³¥ããè A 9876543210 é¶ããè é³¥ããè A 9876543210 ãããã é³¥ããè A 9876543210 ã¿ãã ç
§ãçŒã A 9876543210 é¶ããè ç
§ãçŒã A 9876543210 ãããã ç
§ãçŒã A 9876543210 ã¿ãã ãšãããè B 9876543210 é¶ããè ãšãããè B 9876543210 ãããã ãšãããè B 9876543210 ã¿ãã ç
§ãçŒã B 9876543210 é¶ããè ç
§ãçŒã B 9876543210 ãããã ç
§ãçŒã B 9876543210 ã¿ãã 3. æ€çŽ¢ããŒã¯ãŒãäžã®åèªãšã¬ã·ãã®ææã®åºçŸåæ°ãšå
±èµ·åæ°ãèšç® æ€èšŒã®ããã2025幎3æ23æ¥ã®1æ¥ã®ã¿ã®ããŒã¿ã䜿çšããŸããã 1æ¥ã®æ€çŽ¢ãã°ãšèŠèŽãã°ããã¢ããŒã¿ãšããŠãããããã®åºçŸåæ°ãšå
±èµ·åæ°ãèšç®ããŸãã å
±èµ·åæ°ã ãã ãšãã©ã®ã¬ã·ãã«ãç»å Žããèª¿å³æãªã©ãå€ãåºçŸããŠããŸããŸãã åŸç¶ã®NPMIã®èšç®ã§ã¯ããã®æ§è³ªãæå¶ããã®ã«åããŸãã ãªããPMIãå
±èµ·åæ°ãå°ãªããšæ¯èŒçé«ãå€ã«ãªãããããããå
±èµ·åæ°ã100å以äžã®ãã¢ããŒã¿ã®ã¿ãæœåºããŸããã ããŒã¿ã®ã¹ã±ãŒã«ã¯ç°ãªããŸãããåèèšäºã®å·¥å€«ç¹ãèžè¥²ããŠããŸãã 4. NPMIã®å€ãèšç® æ€çŽ¢ããŒã¯ãŒãã®åºçŸç¢ºçãP(x)ãã¬ã·ãææã®åºçŸç¢ºçãP(y)ãå
±èµ·ç¢ºçãP(x, y)ãšãã以äžã®åŒã«åŸã£ãŠãNPMIãèšç®ããŸãã ããããçè«äžã§ã¯ç¢ºçã§ãããå®åã§ã¯åºçŸåæ°ãšå
±èµ·åæ°ãããšã«èšç®ããããšãå€ãããšæããŸãã æ€çŽ¢ããŒã¯ãŒãã®åºçŸåæ°ãC(x)ãã¬ã·ãææã®åºçŸåæ°ãC(y)ãå
±èµ·åæ°ãC(x, y)ããã¢ããŒã¿ã®ç·æ°ãNãšãã以äžã®åŒã«åŸã£ãŠãNPMIãèšç®ããŸãã PMIããNPMIãèšç®ããããšã§ãå€ã-1~1ã®éã«åãŸããŸãã ããã¯çŽæçã§è§£éãããããªãããšãããããšæããŸãã PMIã§ã¯éèšãããã³ã«å€åããã£ãå ŽåãéŸå€ãèšå®ããããšãé£ãããªããŸãããNPMIã§ã¯-1~1ã®éã«åãŸããããéŸå€ãèšå®ããããšã容æã«ãªããŸãã ãŸããããŒã¿ã®ã¹ã±ãŒã«ãç°ãªãå ŽåïŒæ€èšŒã¯1æ¥ã®ããŒã¿ã§ãããå®éçšã¯1ã¶æåã®ããŒã¿ã«ããããªã©ïŒã«ã察å¿ã§ããŸãã 5. å矩èªãã¢ã®åè£ãæœåº NPMIã®å€ãããšã«ãäžäœ5äžä»¶ãå矩èªãã¢ã®åè£ãšããŠæœåºããŸããã ãã®æ°å€ã¯ãOpenAIã®Batch APIã®äžéã«åãããŸããã platform.openai.com 6. å矩èªãã¢ã®ãã¯ãã«å 匷ãå
±èµ·ããã£ããšããŠãããã®æ€çŽ¢ããŒã¯ãŒããšã¬ã·ãã®ææã䌌ãŠãããšã¯éããŸããã äŸãã°ãæ€çŽ¢ããŒã¯ãŒããããããã±ãŒãããã¯ã¹ããã¬ã·ãã®ææããç¡å¡©ãã¿ãŒããªã©ããèåäœãã®çéãã¿ãŒã³ã®ãããªçµã¿åãããNPMIã¯é«ããªããŸãã ãã®ãããªå Žåã§ã¯ãåèªå士ãã©ãã ã䌌ãŠããããèæ
®ããããªããŸãã ããã§ãOpenAIã®Embedding APIãçšããŠãæ€çŽ¢ããŒã¯ãŒããšã¬ã·ãã®ææããããã«å¯ŸããŠãã¯ãã«ãååŸããŸãã 7. å矩èªèŸæžã®åºå ãããããã¯ãã«ãããšã«ãã³ãµã€ã³é¡äŒŒåºŠãèšç®ããŸãã ããã«ãããNPMIãšã³ãµã€ã³é¡äŒŒåºŠã®çµæãããšã«ãããããã®éŸå€ã決ããããšã§å矩èªãã¢ãæœåºã§ããŸãã ããã§æœåºããå矩èªãã¢ãæçµçã«å矩èªèŸæžãšããŠèšé²ããŸãã 以éããã®åŠçãåããç¶ããã°ãæ¥ã
ã®ãŠãŒã¶ãŒè¡åãå
ã«å矩èªèŸæžãæŽæ°ã§ãããšãã£ãæµãã§ãã çµæ NPMIãšã³ãµã€ã³é¡äŒŒåºŠãæ£åžå³ãšããŠå¯èŠåããŸããã æ€çŽ¢ããŒã¯ãŒããšã¬ã·ãã®ææãå®å
šäžèŽãããã®ã1ããã以å€ã0ãšããŠã©ãã«ä»ãããŸããã 以éãã©ãã«ã0ã®ããŒã¿ãçµæã®å¯Ÿè±¡ã«ããŸãã NPMIã0.2ã«åºå®ããã³ãµã€ã³é¡äŒŒåºŠãå€åãããæã®çµæã以äžã«ç€ºããŸãã éŸå€ã¯èµ€ãç¹ç·ãšããŠè¡šçŸããŸããã æ€çŽ¢ããŒã¯ãŒããšææã¯éŸå€ä»è¿ãã®ã20ä»¶ãã€æœåºããŠããŸãã NPMI>=0.2 ã³ãµã€ã³é¡äŒŒåºŠ>=0.6 NPMI>=0.2 ã³ãµã€ã³é¡äŒŒåºŠ>=0.8 NPMI>=0.2 ã³ãµã€ã³é¡äŒŒåºŠäžäœ20ä»¶ æ£åžå³ å矩èªãã¢ çµæ ãããªãããšãããªç²ãã¯åé¡ãªãããã§ããããããããã¹ã¿ããšãããããœãŒã¹ãã®ããã«ã¬ã·ãåã®æ€çŽ¢ããŒã¯ãŒããšææãå矩èªãã¢ã«ã«ãªããŸããã éŸå€ãé«ãã»ã©ãã·ã«ãªããŸããããããããå°æŸèçãããšãå°æŸèãã®ããã«ã¬ã·ãåãšææãå矩èªãã¢ã«ãªãåé¡ã¯ããã§ã解決ããŸããã ãããã³ãªããšãããã³ããªã©ã飿ãšããŠã¯å¥ç©ã§ãååã¯äŒŒãŠããããšãåå ã§å矩èªãã¢ã«å«ãŸããã±ãŒã¹ãããããšãããããŸããã ãŸãšã å矩èªèŸæžãèªååããä»çµã¿ãæ€èšŒããŸããã 1æ¥ã®ããŒã¿ã®ã¿ã䜿çšããæ€èšŒã§ãããOpenAI APIããã«æŽ»çšããããšã§ãçæéã§å®æ§çãªæ€èšŒãã§ãããšæããŸãã æ€çŽ¢æ©èœã®ããžãã¯ã«äŸåããåé¡ïŒæ¥µç«¯ã«èšãã°ãæ€çŽ¢ããžãã¯ãã©ã³ãã ã«è¿ãå Žåã«ç Žç¶»ãããªã©ïŒã¯ãããŸããããŠãŒã¶ãŒãå
¥åããæ€çŽ¢ããŒã¯ãŒããããšã«ãããçšåºŠã®å矩èªèŸæžã§ããã°èªååå¯èœãªããšã確èªã§ããã®ã¯è¯ãã£ãã§ãã ä»åŸã®èª²é¡ãšããŠã¯ãæ€çŽ¢ããŒã¯ãŒããã¬ã·ãåã®ãšãã«ãææãšå矩èªãã¢ã«ãªãåé¡ã®è§£æ¶ããããŸãã ä»åã¯æ€çŽ¢ããŒã¯ãŒããšææã®å
±èµ·ã«çç®ããŸããããã¬ã·ãåããã¹ã¿ãŒããŒã¿ãšããŠç®¡çãããŠãããããæ€çŽ¢ããŒã¯ãŒããšã¬ã·ãåã®å
±èµ·ãèæ
®ããå¿
èŠããããšèããŠããŸããäŸãã°ãã¬ã·ãåãšã®å
±èµ·æ§ãåŒ·ãæ€çŽ¢ããŒã¯ãŒãã¯ãææãšã®å矩èªãã¢ã«ããªããªã©ã®å·¥å€«ãã§ãããããããŸããã æ€èšŒå
šäœãéããŠãå®ç§ãªå矩èªèŸæžãèªååãããŸã§ã¯é£ãããªãšããææã§ãã ãããã³ãªããšãããã³ãã®ã±ãŒã¹ãä»åèŠã€ãããŸãããã䌌ããããªã±ãŒã¹ãä»ã«ãååšãããããããŸããã ãã ããå®ç§ãªå矩èªèŸæžã§ãªããŠãåé¡ãªãéçšã§ããå ŽåããããšæããŸãã®ã§ããã®ãããªã±ãŒã¹ã«ãããŠãã®ææ³ããã©ãã·ã¥ã¢ãããããããã¯ãã«å°å
¥ã§ããã°ãšèããŠããŸãã
ç®æ¬¡ ã¯ããã« 2024å¹ŽåºŠã®æ¯ãè¿ããšæ¹åç¹ ææ èª²é¡ èª²é¡ã®è§£æ¶ã«åããæœçã«ã€ã㊠ç ä¿®ã®ç®çã»ã«ãªãã¥ã©ã ç ä¿®ã®ç®ç ã«ãªãã¥ã©ã CTO ããã®ã¡ãã»ãŒãž 掻èºããæ°å2幎ç®ãšã³ãžãã¢ããã®ã¡ãã»ãŒãž ããã¯ãšã³ã/ã€ã³ãã©è¬çŸ© ã¢ãã€ã«è¬çŸ© Web è¬çŸ© ããŒã¿è¬çŸ© 次åã«åã㊠ãããã« ã¯ããã« ããã«ã¡ã¯ã ãã¢ããéçºéšãœãããŠã§ã¢ãšã³ãžãã¢å
ŒãCTO宀Dev Enableã°ã«ãŒãã®åºåž( ktanonymous )ã§ãã æ¬èšäºã§ã¯ã2024幎床ãã宿œãå§ãã第2åç®ãšãªã2025幎æ°åãšã³ãžãã¢åãç ä¿®ã®åãçµã¿ã«ã€ããŠã玹ä»ããŸãã æšå¹ŽåºŠå®æœããæ°åç ä¿®ã«ã€ããŠã¯ã以äžãã芧ãã ããã 2024å¹ŽåºŠã®æ¯ãè¿ããšæ¹åç¹ æšå¹ŽåºŠã®ãšã³ãžãã¢æ°åç ä¿®ã§ã¯ã以äžã®ãããªææãšèª²é¡ãèŠãããŸããã ææ ãšããªãŒã®ãšã³ãžãã¢ãšããŠã®ãã€ã³ãã»ããã®çè§£ åæè¡é åã®å
šäœåã®ææ¡ ç€Ÿå
ãšã³ãžãã¢ãšã®ãããã¯ãŒã¯æ§ç¯ èª²é¡ åæç¥èã®äžè¶³ã«ããçè§£ã®å°é£ã åçš®ããŒã«ã®äœ¿ãæ¹ã«é¢ããäºåæºåã®äžè¶³ 課é¡ã®è§£æ¶ã«åããæœçã«ã€ã㊠æšå¹ŽåºŠã®èª²é¡ãèžãŸããéå¶ããŒã ã§ã¯åŠäœã«å
¥ç€Ÿæã®åæç¥èã®äžè¶³ãã°ãã€ããè§£æ¶ããã®ããæ€èšããŠããŸããã ãã®äžã§ãå
¥ç€Ÿåããæ°åïŒåœæã¯å
å®è
ïŒã®ææ¬²ãé«ããåŠç¿ã³ã³ãã³ããããã°ç©æ¥µçã«æŽ»çšããããšãã声ãå€ããããŸããã ããã§ãå
å®è
ç ä¿®ãšãã圢ã§å
¥ç€ŸåŸã®ãªã³ããŒãã£ã³ã°ãã¹ã ãŒãºã«ããããã®åºç€çãªãã£ããã¢ããããã©ããŒããç ä¿®ã宿œããŸããã å
å®è
ç ä¿®ã«ã€ããŠã®ããã°ãå
¬éããŠãããŸãã®ã§ããã²ã芧ãã ããã ç ä¿®ã®ç®çã»ã«ãªãã¥ã©ã ä»å¹ŽåºŠã®ç ä¿®ã§ã¯ãæšå¹ŽåºŠã®ãã©ãŒããããèžè¥²ãã€ã€ãææã課é¡ãèžãŸããŠãæ¹åçãªã©ãæ€èšããŸããã ç ä¿®ã®ç®ç ç ä¿®èªäœã®ç®çãæ¹éã«ã€ããŠã¯ãæšå¹ŽåºŠãšå€§ããã¯å€ããã以äžã®ããã«èšå®ããŸããã ç®ç ããªãŒãã·ãããæã£ãŠãããã¯ã課é¡ã®è§£æ±ºã«åãããšã³ãžãã¢ãžã®åå°ãäœãã æ¹é ãšããªãŒã®ãšã³ãžãã¢ãšããŠæ±ãããããã€ã³ããçè§£ãã å°éé åãè¶
ããŠãšããªãŒå
šäœã§äœ¿ãããŠããæè¡ã¹ã¿ãã¯ãçè§£ãã ã«ãªãã¥ã©ã ç ä¿®ã®ã«ãªãã¥ã©ã ã«ã€ããŠããæšå¹ŽåºŠãšå€§æ ã¯å€ãã£ãŠããŸããã æ°åã®çããã«ã¯ã5æ¥éã§ä»¥äžã®ãããªã«ãªãã¥ã©ã ã«åŸã£ãŠç ä¿®ã«åå ããŠããããŸããã ãã€ã³ãç ä¿® CTO ããã®ã¡ãã»ãŒãž 掻èºããæ°å2幎ç®ãšã³ãžãã¢ããã®ã¡ãã»ãŒãž æè¡ã¹ã¿ãã¯ã®ææ¡ïŒè¬çŸ© + ãã³ãºãªã³ïŒ ããã¯ãšã³ã/ã€ã³ãã© ã¢ãã€ã« Web ããŒã¿ ã©ã³ãäŒ ååããã®å€æŽç¹ãšããŠããã€ã³ãé¢ã®ç ä¿®ã«çã蟌ãã§ããã€ã³ã·ãã³ããžã®åãåãæ¹ã®ããŒãã倿Žã«ãªã£ãŠããŸãã è¬çŸ©å
容ããã身è¿ã«æããŠãããããã«ã掻èºããŠããæ°å2幎ç®ãšã³ãžãã¢ããã®ã¡ãã»ãŒãžãšããŠåæ§ã®èŠçŽ ãåã蟌ã¿ã€ã€ãå®éã«å
¥ç€ŸçŽåŸããæŽ»èºããŠããå
茩ãã©ã®ãããªããšãæèããªããæ¥åã«åãçµãã§ããã®ããäŒããŠããããŸããã CTO ããã®ã¡ãã»ãŒãž ãã®è¬çŸ©ã§ã¯ãAI/LLMæä»£ã«ããããšããªãŒã®ãšã³ãžãã¢ãšããŠéèŠãšãªããã€ã³ãã»ããã«ã€ããŠè¬çŸ©ãããŸããã çæAIãç Žç«¹ã®å¢ãã§é²æ©ããŠããäžã§ãšã³ãžãã¢ãåãå·»ãç°å¢ã¯ã©ãå€ãã£ãŠããã®ãããŸãããšããªãŒã®ãšã³ãžãã¢ãšããŠã©ãããå§¿å¢ã§èšãã¹ããã«ã€ããŠãCTO èªãã®èŠç¹ã亀ããå
容ãšãªããé
å±ã«åããŠåºæ¿ãåŸãããè¬çŸ©ã§ããã æŽ»èºããæ°å2幎ç®ãšã³ãžãã¢ããã®ã¡ãã»ãŒãž ãã®è¬çŸ©ã§ã¯ãå
¥ç€ŸçŽåŸããæŽ»èºããŠããå
茩ãã©ã®ãããªããšãæèããªããæ¥åã«åãçµãã§ããã®ããäŒããŠããããŸããã å®éã«æŽ»èºããŠããè¿ãäžä»£ã®å
茩ã®ãã€ã³ããäŒããããšã§ãå®éã«è¡åã«ç§»ããäŸããããããå
·äœçãªã€ã¡ãŒãžãæã£ãŠãããããšãã§ãããšæããŸãã ããã¯ãšã³ã/ã€ã³ãã©è¬çŸ© ããã¯ãšã³ã/ã€ã³ãã©è¬çŸ©ã§ã¯ããšããªãŒã§å
±éçã«çšããããæè¡ãç¥èã«ã€ããŠãäžéãè§ŠããŠçè§£ããããšãäž»ãªç®æšãšããŸããã ãã³ãºãªã³ãéããŠä»¥äžã®å
容ãåŠã³ãŸããã 瀟å
ã®æè¡ã¹ã¿ã㯠Go ãå©çšããç°¡æç㪠API ãµãŒãã®éçºäœéš CLIã«ããæåãããã€ããCDã«ããèªåãããã€ãŸã§ãäœéš ã¢ãã€ã«è¬çŸ© ã¢ãã€ã«è¬çŸ©ã§ã¯ãã¢ããªã®éçºã®åºç€ãå®è£
ã«è§ŠããŠããããAPI èšèšããã°è§£æãäžå
·åè§£æã®éã«ã¢ããªãµã€ãã®éçºèгç¹ãèæ
®ã§ããããã«ãªãããšãç®æšãšããŸããã äž»ãªå
å®¹ïŒ ã¢ãã€ã«ã¢ããªéçºã®åºæ¬æŠå¿µ åºæ¬ç㪠UI å®è£
ã¢ããªãã°ãåæã®å®è£
APIæ¥ç¶ãã³ãºãªã³ çµç¹éçºã«ãããæ³šæç¹ Web è¬çŸ© Web è¬çŸ©ã§ã¯ãWebã®æŽå²ããçŸåšã®æè¡ãçè§£ããããšãWebéçºã®åºç€ç¥èã身ã«ã€ããããšãäž»ãªç®æšãšããŸããã è¬çŸ©å
å®¹ïŒ ç€Ÿå
ã®æè¡ã¹ã¿ã㯠Web éçºã®æŽå²ãšåºç€ç¥è éçºã«ãããéèŠãªãã€ã³ã ããªãã·ã¥ãããã³ã¢ããªã顿ãšããŠç»é¢å®è£
ãã³ãºãªã³ ããŒã¿è¬çŸ© ããŒã¿è¬çŸ©ã§ã¯ãããŒã¿é åã®ååéã«ã€ããŠäœç³»çã«åŠã³ãŸããã äž»ãªå
å®¹ïŒ åçš®è·èœã®åœ¹å² 瀟å
ã§ã®æ¥åãžã®é¢ããæ¹ AIã®æŠèгïŒç€Ÿå
ã§ã®æŽ»çšäºäŸ ããŒã¿åºç€ ããŒã¿å質ã®ç®¡ç å®è·µçãªããŒã¿åŠçãã³ãºãªã³ 次åã«åã㊠ç ä¿®åŸã®èª¿æ»ã§ãåè¬è
ããã¯ä»¥äžã®ããã«å¥œæçãªãã£ãŒãããã¯ãå¯ããããŸããã åæãšæ¥œãã¿ãªããé²ãããã ç ä¿®ãéããŠåŠã¶ã¹ãããšãç¥ãããšãã§ãã å
šé åãæšªæçã«è§Šããããšã§æ¥åã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ã«ãç¹ãããããšæãã ç ä¿®ãæ¥œãã¿ãªããããšããªãŒã®ãšã³ãžãã¢ãšããŠå¿
èŠãšãªããã®ãèªèããŠãããããšãã§ããç®çã¯éæã§ããã®ã§ã¯ãªãããšæããŸãã ããããæ¹åç¹ããªããªã£ãããã§ã¯ãããŸããã ç¹ã«ãçæAIã®é²æ©ã«å¯Ÿå¿ããã³ã³ãã³ãäœãã¯1ã€ã®å€§ããªæžå¿µææã«ãªããšæããŸãã åŒç€Ÿã§ã¯ãAIãšãã£ã¿ã§ãã Cursor ããšã³ãžãã¢ïŒããã³PdMïŒã察象ã«å°å
¥ãããŸãã 1 ã çµç¹å
šäœãšããŠã暡玢äžã§ããéçºæ¥åã«ãããAI掻çšã¯ãã¡ãããåè¬è
ã®AIå©çšãåæãšããã³ã³ãã³ããã©ã®ããã«æ§æããã¹ãããæ€èšããå¿
èŠããããšèããŠããŸãã è¬çŸ©é¢šæ¯ è¬çŸ©é¢šæ¯ ãããã« 2025幎床ã®ãšã³ãžãã¢æ°åç ä¿®ã§ã¯ã2024幎床ã®èª²é¡ãèžãŸããæ¹åã宿œããããå
å®ããç ä¿®ããã°ã©ã ãæäŸããããšãã§ããŸããã é
å±åã®ã¿ã€ãã³ã°ã§æšªæçãªã³ã³ãã³ããæäŸããããšã§ããšã³ãžãã¢ãšããŠã ãã§ã¯ãªãæ¥åã«æºããã¡ã³ããŒãšããŠããæ©ææé·ã®æå©ããã§ããŠãããšæããŠããŸãã ä»åŸããç ä¿®ãªã©ãéããŠãšããªãŒéçºçµç¹å
šäœã®æŽ»æ§åã»åŒ·åãç®æããŠãããããšæããŸãã æåŸã«ãæ¬ç ä¿®ã®å®æœã«ããããè¬çŸ©ã«å¿«ããååããã ããçæ§ã«æè¬ç³ãäžããŸãã ãšããªãŒãAIãšãã£ã¿ãCursorããå
šãšã³ãžãã¢ããã³ãããã¯ããããŒãžã£ãŒã«å°å
¥ ↩
ã¯ããã« ããã«ã¡ã¯ãããªãã·ã¥ãããã³ã§ã¯ã©ã€ã¢ã³ããšã³ãžãã¢ãæ
åœããŠãã kikuchi ã§ãã ããªãã·ã¥ãããã³ã® Android ã¢ããªéçºããŒã ã§ã¯æ°èŠæ©èœã®éçºã ãã§ãªããæ¥ã
ã¢ããªã®æ¹åã®ããã«äžå
·åã®ä¿®æ£ãæåã®æ¹åã«ã€ããŠãåãå
¥ããŠãããã¢ããªã®ããã©ãŒãã³ã¹ã®éšåãªã©çްããéšåãæ°å€ãæ¹åãããŠãããã·ãã¢ã«èšæž¬ããŒã¿ã§ç¢ºèªããŠããŸãã ä»åã¯ãã®ããã©ãŒãã³ã¹ã®éšåã§ ãã¢ããªã®èµ·åæéã®æ¹åã ã®èгç¹ã§ç¹ã«å¹æãé«ãã£ã察å¿ããŸãšããŠã¿ãããšæããŸãã ã¢ããªã®èµ·åæéã確èªããæ¹æ³ ã¢ããªèµ·åæéã¯ä»¥äžã§èª¿ã¹ãããšãåºæ¥ãŸãã Google Play Console ã® Android Vitals ã§ã³ãŒã«ãã¹ã¿ãŒããªã©ã®æéã確èªãã ã¢ããªã® TTID (Time To Initial Display) ãš TTFD (Time To Full Display) ã確èªãã ãã°ãä»èŸŒã 1 ã«ã€ããŠã¯ãGoogle Play Console äžã§ Android Vitals ãšããæ©èœã䜿ã£ãŠã³ãŒã«ãã¹ã¿ãŒããªã©ã®æ°å€ã確èªããããšãããã®ã«ãªããŸãã ãã¡ã㯠OS ã®ããŒãžã§ã³ãCPUãRAM ãªã©ã§çްãããã£ã«ã¿ãªã³ã°ãã§ãããŸãäœãã é¡äŒŒãããµãŒãã¹ã®ã¢ããªããä»»æã§éžæããã¢ããªãšæ¯èŒã§ãã ãšããç¹ãä»ç€Ÿã®ã¢ããªãšçŽæ¥æ¯èŒã§ããæ°å°ãªãææšã«ãªãããéå®ããŠããŸãã (ãªããå®å€ã§æ¯èŒã§ããããã§ã¯ãªãããããŸã§ã³ãŒã«ãã¹ã¿ãŒããªã©ã®æéãé·ããŠãŒã¶ã®å²åãæ¯èŒã§ããã®ã¿) 2 ã«ã€ããŠã¯ Google Developers ã®å
¬åŒãµã€ãã§è©³ãã玹ä»ãããŠããŸãã TTID : åæè¡šç€ºãŸã§ã®æéã®ããšã§ãã¢ããªã® UI ã®æåã®ãã¬ãŒã ã衚瀺ãããŸã§ã«ãããæé https://developer.android.com/topic/performance/vitals/launch-time?hl=ja#time-initial TTFD : å®å
šè¡šç€ºãŸã§ã®æéã®ããšã§ãã¢ããªããŠãŒã¶æäœå¯èœãªç¶æ
ã«ãªããŸã§ã®æé https://developer.android.com/topic/performance/vitals/launch-time?hl=ja#time-full TTID ã«ã€ããŠã¯ã©ã®ã¢ããªã«ã€ããŠã Logcat ã§ç°¡åã«ç¢ºèªããããšãåºæ¥ãŸãã 以äžã¯ API Level 36 ã®ãšãã¥ã¬ãŒã¿ã§ Chrome ã¢ããªãèµ·åããå Žåã®ãã°ã«ãªããŸãã Displayed ã§ãã£ã«ã¿ããããŠè¡šç€ºãããã°ã§ãã1s312msããšããæ°å€ã TTID ãšãªããŸãã äžèšã®ããã«ã¢ããªãèµ·åããã ãã§åºåããããã°ã®ãããèªç€Ÿã§éçºããã¢ããªãã¹ãã¢ããã€ã³ã¹ããŒã«ããã¢ããªãªã©é¢ä¿ãªã確èªããããšãåºæ¥ãŸãã ãªããTTFD ã«ã€ããŠã¯ ComponentActivity ã® reportFullyDrawn() ãšããã¡ãœãããæå³çã«åŒã¶å¿
èŠããããããåºæ¬ã¯èªç€Ÿã§éçºããã¢ããªã®ã¿ã§ç¢ºèªã§ããŸãã TTFD ã«ã€ããŠã¯ä»åãŸãšããå
å®¹ãšæ·±ãé¢ããéšåã§ã¯ãªãããã岿ãããŠããã ããŸãã 3 ã«ã€ããŠã¯ã现ãã Log ã¯ã©ã¹ãªã©ãé§äœ¿ããŠãã°ãä»èŸŒãã§ããæ¹æ³ã«ãªããŸãã ãã¡ãã¯ãããŸã§ã¢ããªãèµ·åããŠãã (ã€ãŸã㯠Application ãç¶æ¿ããã¯ã©ã¹ã® onCreate ã¡ãœãããã³ãŒã«ãããŠãã) ã®åŠçã«ãã°ãä»èŸŒãããã®ãšãªããããæªããå®è£
ãç¡ãããç¹å®ããéã«æé©ãªæ¹æ³ã ãšèšããŸãã 調æ»èŠ³ç¹ èµ·åæéãæ¹åããããšäžèšã§èšã£ãŠããæåœããæ¬¡ç¬¬èª¿æ»ãããŠã广ã¯åºã«ãããšèããããã以äžã«èгç¹ãçµã£ãŠèª¿æ»ãããŸããã ã¢ããªèµ·åæã«äžèŠãªåŠçãå®è¡ããŠããªãã äžèŠãªã©ã€ãã©ãªãååšããªãã èµ·åæéãã®ãã®ãæé©åããŠççž®ã§ããªãã çµæãå
ã«ãäŒããããšã1 ã«ã€ããŠã¯ãã°ã现ããä»èŸŒãã§èª¿æ»ãããã®ã®å
šãåé¡ãªããäœèšãªåŠçã倧ããççž®ã§ããããªåŠçã¯ååšããã2 ãš 3 ã«å€§ãã广ãããæ¹åãã€ã³ããååšããŠããŸããã 以éã®é
ç®ã§ 2 ãš 3 ã«ã€ããŠçްãããŸãšããŠãããããšæããŸãã äžèŠã©ã€ãã©ãªã®èª¿æ» äžèŠã©ã€ãã©ãªãååšãããã«ã€ããŠã¯ãå°å
¥ããŠããã©ã€ãã©ãªãäžã€äžã€ç¢ºèªããŠãããŸããã ãšã¯ãããããªãã·ã¥ãããã³ã®ããã°ã©ã ã®èŠæš¡ã¯ããªã倧ããå
šéšã§ 100 åè¿ãã®ã©ã€ãã©ãªãå°å
¥ããŠãããããAndroidX ãªã©å¿
é ã®ã©ã€ãã©ãªã¯é€ããŠç»åé¢é£ã®ã©ã€ãã©ãªãªã©ãµãŒãããŒãã£è£œã®ã©ã€ãã©ãªã«çµã£ãŠèª¿æ»ããããšã«ããŸããã çµæã Firebase In-App Messaging ãããªãèµ·åæéã«æªåœ±é¿ãäžããŠãããšããããšãåãããŸããã è€æ°ç«¯æ«ã§ Firebase In-App Messaging ãé€å€ããç¶æ
ã§ TTID ãæ€èšŒããçµæã¯ä»¥äžã®ããã«ãªããŸããã ããã€ã¹ A / OS 8.1.0 / RAM 4GB ⊠180msec çšåºŠæ¹å ããã€ã¹ B / OS 12 / RAM 6GB ⊠120msec çšåºŠæ¹å ããã€ã¹ C / OS 13 / RAM 8GB ⊠30msec çšåºŠæ¹å OS ãå€ããRAM ãå°ãªã端æ«ã»ã©æ¹åå¹
ã倧ããããšããçµæã«ãªããŸããã ãã¡ãã«ã€ããŠã¯ããªãã·ã¥ãããã³ããŒã å
šäœã§ç¢ºèªããçµæãä»ã¯äœ¿çšããŠãããä»åŸã䜿ãå¯èœæ§ã¯ç¡ãããšããããšãåãã£ãããã©ã€ãã©ãªãé€å€ããçµè«ãšãªããŸããã äœæ
Firebase In-App Messaging ãèµ·åæéã«æªåœ±é¿ãäžããŠããã®ã In-App Messaging ã§ãããã©ãã§ãã¡ãã»ãŒãžã衚瀺ã§ãããšããç¹æ§äžã WebView ã§äœãããŠããããšãèµ·åæéãé·ãããŠããèŠå ã§ããã WebView ã®åæåãçæã¯éåžžã«ã³ã¹ããããããããFirebase In-App Messaging 㯠ã©ã€ãã©ãªãå°å
¥ããŠããã ãã§åçç¡çšã§ã¢ããªèµ·åæã«åæåããã ä»çµã¿ãšãªã£ãŠãããæå³çã«ããã°ã©ã ã§åæååŠçãåŒã°ãªããŠãåæååŠçãèµ°ã£ãŠããŸããã çµæãã¢ããªèµ·åæã« WebView ã®åæååŠçãŸã§èµ°ã£ãŠäœèšã«æéãããã£ãŠãããšããç¶æ³ã«ç¹ãã£ãŠããŸããã ä»ã«ã In-App Messaging ã®æ©èœãæäŸããŠããã©ã€ãã©ãªã§ãåæ§ã«åæååŠçã«æéãããã£ãŠãããããIn-App Messaging ã®ã©ã€ãã©ãªã䜿çšããŠããå Žåã¯ã©ã€ãã©ãªã®èŠçŽããããŠã¿ãã®ãè¯ãããç¥ããŸããã èµ·åæéãã®ãã®ãæé©åããæ¹æ³ã®èª¿æ» èµ·åæéãã®ãã®ãæé©åããæ¹æ³ã«ã€ããŠã¯ãAndroid Gradle Plugin (AGP) ãš Android Jetpack ã®äžéšãšããŠæäŸãããŠãã Baseline Profiles ãšããä»çµã¿ãå°å
¥ã³ã¹ããäœããæ¹åã®æåŸ
å€ãé«ããšããããšãåãããŸããã Baseline Profiles ã«ã€ããŠã¯ Google Developers ã«æŠèŠããŸãšããããŠããŸãã https://developer.android.com/topic/performance/baselineprofiles/overview?hl=ja Baseline Profiles ãšã¯ãã¢ããªã®èµ·åã«å¿
èŠãªæ
å ±ãäºå (AOT) ã³ã³ãã€ã«ããŠããããšã§ãã¢ããªã®èµ·åæã«å®è¡ããã³ãŒããã¹ã®è§£éããžã£ã¹ãã€ã³ã¿ã€ã (JIT) ã³ã³ãã€ã«ãçç¥ã§ããååèµ·åããã®ã³ãŒãå®è¡é床ãçŽ 30% ãåäžãããã®ãšãªããŸãã ãªããBaseline Profiles ãæ¡çšããããšã§èµ·åæéãççž®ããã ãã§ãªãããžã£ã³ã¯ (ããã€ã) ã®è»œæžãå
šäœçãªããã©ãŒãã³ã¹ã®åäžã«ãç¹ãããŸãã Baseline Profiles ã®å°å
¥èªäœã¯å®¹æã§ããæ¬¡ã®é
ç®ã§å°å
¥æé ããŸãšããŸãã Baseline Profiles ã®å°å
¥æé å®éã«ãããžã§ã¯ãã«è¿œå ããæé ãç»åã亀ããŠç޹ä»ããŸãã â Android Studio ã§ãFile > New > New Moduleããéžæ â¡Templates ã§ãBaseline Profile Generatorããéžæããå¿
èŠã«å¿ããŠå€ãèšå®ããFinish ãéžæ â»ãUse Gradle Managed Deviceãã«ãã§ãã¯ãä»ããããšã§ãGradle ã§ç®¡çãããŠããããã€ã¹ (GMD) ã䜿çšã㊠Baseline Profiles ãäœæããããã®åæèšå®ãèªåçã«è¡ãããŸã â¢ããŒã«ããŒã® Run / Debug Configrations ã§ãæé 2 ã«ãŠçæããé
ç®ãéžæã㊠Run ãå®è¡ â£app ã¢ãžã¥ãŒã« > src > release / generated / baselineProfiles ã« baseline-prof.txt ãåºåããã 以äžã§å®äºãšãªããŸãã â»å®éã®ãããžã§ã¯ãã®ç°å¢ã«ãã£ãŠã¯æé ãç°ãªãå¯èœæ§ããããããå
è¿°ããå
¬åŒãµã€ãã®æ
å ±ã確èªããªããèšå®ãè¡ãããšãããããããŸãã Baseline Profiles ã®å°å
¥çµæ Baseline Profiles ãå°å
¥ããçµæã® TTID ã¯ä»¥äžã®ããã«ãªããŸããã ããã€ã¹ A / OS 8.1.0 / RAM 4GB ⊠200msec çšåºŠæ¹å ããã€ã¹ B / OS 12 / RAM 6GB ⊠150msec çšåºŠæ¹å ããã€ã¹ C / OS 13 / RAM 8GB ⊠70msec çšåºŠæ¹å ãã¡ããäžèŠã©ã€ãã©ãªé€å€ãšåæ§ãOS ãå€ããRAM ãå°ãªã端æ«ã»ã©æ¹åå¹
ã倧ããããšããçµæã«ãªããŸããã Baseline Profiles ã«ã€ããŠã¯ãããžã§ã¯ãã®èŠæš¡ãªã©ã«ã倧ããå·Šå³ãããŸããã倧ããªæ¹åãèŠèŸŒããããšãåãããŸãã 察å¿ããçµæ ä»å泚åããŠå¯Ÿå¿ãããäžèŠã©ã€ãã©ãªé€å€ãããBaseline Profiles ã®å°å
¥ãã®ã¿ã§ã æå€§ã§ 400msec è¿ããã®èµ·åæéãççž® ã«æåããŸããã 調æ»ã察å¿ã«åœç¶å·¥æ°ã¯ããã£ãŠãããã®ã®ãæ€èšŒèŸŒã¿ã§ 1 é±éçšåºŠã®å°ãªãå·¥æ°ã®èŠè¿ããšããŠã¯ããªã倧ãããã®ã ã£ããšæããŠããŸãã ãã以å€ã«ã TTID 以å€ã®ææšã䜿çšããŠçްããèšæž¬ããœãŒã¹ã®ãªãã¡ã¯ã¿ãªã³ã°ãªã©ãçµãŠãæçµçã«ã¯å¯Ÿå¿åãšå¯Ÿå¿åŸã§èµ·åæéãååã«ããããšãåºæ¥ãŸããã ãªããèµ·åæéãççž®ããçµæãäžçªæ©æµãåããã®ãã¹ãã©ãã·ã¥ç»é¢ã«ãªããŸããã OS 12 以éã¯ã¹ãã©ãã·ã¥ç»é¢ (Splash Screen) ã衚瀺ãããããã«ãªããŸããããTTID ãçãã»ã©ã¹ãã©ãã·ã¥ç»é¢ã®è¡šç€ºãçããªããŸãã ã¹ãã©ãã·ã¥ç»é¢ã¯ã¢ã€ã³ã³ã ãã®ç»é¢ã«ãªã£ãŠããŠç¡æ©è³ªãªç»é¢ã«èŠããããšãå€ããã¹ãã©ãã·ã¥ç»é¢ã®è¡šç€ºæéãé·ããšããªãŒãºããŠããããã«èŠãããããããã«ãŠãŒã¶ãæäœã§ããç¶æ
ã«ãªãããšã¯ãŠãŒã¶ããªãã£ã®åäžã«ç¹ãããŸãã ãããã« Firebase In-App Messaging ã®é€å€ãBaseline Profiles å°å
¥ãšãã£ãå·¥æ°ãå°ãªã察å¿ã§å€§å¹
ãªèµ·åæéã®ççž®ã«ç¹ããããšãåºæ¥ãŸããã ããªãã·ã¥ãããã³ã®ããã«ã©ã€ãã©ãªã®èŠçŽãã ãã§ãèµ·åæéã®æ¹åã«ç¹ããããšãããã®ã§ãããŒãžã§ã³æŽæ°ã ãã§ãªããäœ¿çšæç¡ã®æ£åžããããã ãã§ãéåžžã«å¹æçã ãšèããŸãã ãŸã Baseline Profiles ã«ã€ããŠãããããã£ãããšãããããããšæŒ ç¶ãšæ°ã«ãªã£ãããšã§ã調ã¹ãŠã¿ããšæ©èœãæäŸãããŠããããšãããããããšã³ãžãã¢ã®åç¹ã§ã¯ãããŸãããæ°ã«ãªã£ãã調ã¹ãããšããè¡åã¯å¿
èŠäžå¯æ¬ ã ãšèããŸãã æ¬èšäºã®æ
å ±ãçæ§ã®ã圹ã«ç«ãŠãã°å¹žãã§ãã
ã¯ããã« ããã«ã¡ã¯ããªããŒã«ããéçºéšã®æ± ã§ãã ãšããªãŒã¯ 2025/05/02 ã«ãã¬ã¹ãªãªãŒã¹ãåºããéã Cursor ãå
šãšã³ãžãã¢ãšãããã¯ããããŒãžã£ãŒã«å°å
¥ããAI掻çšã«ããçç£æ§ã®åäžã«ç©æ¥µçã«åãçµãã§ããŸãã corp.every.tv çŸåšãäžã®äžã§ã¯ Cursor ã®ãããªéçºæ¯æŽããŒã«ã䜿ã£ãŠLLMãããŒã¹ãšãããšãŒãžã§ã³ãã®éçºã¯ãŒã¯ãããŒãæ§ç¯ããåããé²ãã§ããŸãã ãšãŒãžã§ã³ãã«å®å®ããæåããããã«ã¯ãäžè²«ããã³ã³ããã¹ãã®æäŸãå¿
èŠã§ãããæ°žç¶çãªã«ãŒã«ããã¡ã€ã«ãçšããŠãã®æ¯ãèããå¶åŸ¡ããã¢ãããŒããäžè¬çã«ãªãã€ã€ãããŸãã ããã«ã¯åãªãããã¥ã¡ã³ãæŽåã§ã¯ãªããã«ãŒã«ã®æ§é åãããèšèšãå¿
èŠã§ãã ã©ã®ãããªçš®é¡ã®ãã¡ã€ã«ãå¿
èŠã ã©ã®ãã©ãŒãããã»ãã³ãã¬ãŒãã§èšè¿°ããã®ã ãšãŒãžã§ã³ãã¯ã©ã®ã¿ã€ãã³ã°ã§ãããåç
§ããã®ã ã©ã®ããã«å
å®¹ãæŽæ°ããŠæ°žç¶åãç¶ããã®ã ããããã«ãŒã«èšèšã¯çŸç¶ã¯ãŸã æšæºãååšããã黿æã«ãããšæããŠããŸãã ãã®ãããªç°å¢ã«ãããŠãç§ã«ãšã£ãŠæçšãªæ
å ±æºãšãªã£ãŠããã®ã Reddit ã DiscordãX ãªã©ã® Cursor ã³ãã¥ããã£ã§ãã ã³ãã¥ããã£ã§ã¯å€ãã®ãŠãŒã¶ãŒãæ¥ã
ã®è©Šè¡é¯èª€ãå
±æããã£ãŠããããããŠãŒã¶ãŒã®å®äœéšã«åºã¥ããæ°ããç¥èŠããã£ããã¢ããããã«ã¯éåžžã«åœ¹ç«ã¡ãŸãã ãã®èšäºã§ã¯ãã³ã³ããã¹ã管çã®å¿
èŠæ§ã説æããåŸãã³ãã¥ããã£ã®äžã§èå³ãæã£ã Cursor Custom modes ãæŽ»çšããã¯ãŒã¯ãããŒã®ææ³ vanzen01/cursor-memory-bank ã«ã€ããŠã詊ããŠã¿ãããšæããŸãã â» Cursor å
¬åŒã®ã¯ãŒã¯ãããŒã§ã¯ãªãã®ã§ã泚æãã ããã LLMãæŽ»çšããéçºã«ãããèª²é¡ ãŸãåæãšããŠãLLMã¯ãã³ã³ããã¹ããŠã£ã³ããŠãè¶
ããæ
å ±ãä¿æã§ãããåºæ¬çã«ã¯çŽè¿ã®ããŒã¯ã³ã®ã¿åç
§ããŸãã ã€ãŸããäžå®ã®ããŒã¯ã³æ°ãè¶
ãããšæèãéåããéå»ã®ãããšããå¿ããŠããŸããããªçŸè±¡ãèµ·ãããŸãã ïŒãã ããã¢ãã«ã«ãã£ãŠã¯å€ãæ
å ±ã圱é¿ã匱ããªããæ®ãã±ãŒã¹ãããããã§ããïŒ ãã®åé¡ã¯ããããžã§ã¯ãã®éçºãé²ããäžã§é »ç¹ã«èµ·ããã®ã§ãæèã®æç¶ãæ±ããããã¿ã¹ã¯ã«ãããŠé²æãæªãããèŠå ã«ãªããŸãã ãã®ãããã³ã³ããã¹ããå¹çãã管çããŠé©åãªéã®æ
å ±ãLLMã«æž¡ãããšãéµãšãªã£ãŠããŸãã ã³ã³ããã¹ããŠã£ã³ããŠãšã¯ ã³ã³ããã¹ããŠã£ã³ããŠãšã¯ãã¢ãã«ãäžåºŠã®ããã³ãããäŒè©±å±¥æŽãšããŠãèªèã»åç
§ãã§ããããŒã¯ã³ã®æå€§éã®ããšã§ãã ã³ã³ããã¹ããµã€ãºã®æ¯èŒè¡šïŒ2025幎5ææç¹ïŒã¯æ¬¡ã®ããã«ãªã£ãŠããŸãããã®ãŠã£ã³ããŠãµã€ãºã«åãŸãããã«ã³ã³ããã¹ã管çãè¡ãããšãéèŠã§ãã ãŸããã³ãŒãçæã«ãããŠãã³ã³ããã¹ããµã€ãºãè¶
ãããšãåçç²ŸåºŠãæªããªããšãã声ããããããã³ã³ããã¹ãéãæããããšã倧äºã«ãªããŸãã 2025幎5ææç¹ã«ããããäž»èŠãªã¢ãã«ã®ãŠã£ã³ããŠãµã€ãºã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã ã¢ãã«å ã³ã³ããã¹ããŠã£ã³ããŠãµã€ãº ãªãªãŒã¹ææ GPT-4.1 1,000,000ããŒã¯ã³ 2025幎4æ GPT-4.5 128,000ããŒã¯ã³ 2025幎2æ o3 200,000ããŒã¯ã³ïŒå
¥åïŒïŒ100,000ããŒã¯ã³ïŒåºåïŒ 2025幎4æ o4-mini 200,000ããŒã¯ã³ïŒå
¥åïŒïŒ100,000ããŒã¯ã³ïŒåºåïŒ 2025幎4æ o4-mini-high 200,000ããŒã¯ã³ïŒå
¥åïŒïŒ100,000ããŒã¯ã³ïŒåºåïŒ 2025幎4æ Claude 3.5 Sonnet 200,000ããŒã¯ã³ 2024幎6æ Claude 3.7 Sonnet 200,000ããŒã¯ã³ 2025幎2æ Gemini 2.5 Pro 1,000,000ããŒã¯ã³ 2025幎4æ ãŸããããŒã¯ã³æ°ã«å ããŠåã¢ãã«ã«ãããŠåŸæ/äžåŸæãªäœæ¥ãããããããããèæ
®ããŠã¢ãã«éžæãè¡ãããšã倧äºã§ãã ã³ã³ããã¹ã管çã®ã¢ãããŒã ã³ã³ããã¹ã管çã¯æ§ã
ãªã¢ãããŒããèããããŸãã 1. ã¿ã¹ã¯ã®åå²ãšèšèš ããŒã¯ã³å¶éãèæ
®ããŠãã¿ã¹ã¯ãå°ããåå²ããããããã®ã¿ã¹ã¯ã«å¿
èŠãªã³ã³ããã¹ãã ããæäŸããããšã§ã粟床ãä¿ã€ããšãã§ããŸãã 詳ããã¯æ¬èšäºã§ã¯è§ŠããŸããããã¿ã¹ã¯ç®¡çã«ã€ããŠã¯ claude-task-master ãæŽ»çšããäºäŸãã³ãã¥ããã£ã§ ããç®ã«ããã®ã§ãããã£ããåç
§ããŠãã ããã 2. ã¡ã¢ãªãã³ã¯ã®æŽ»çš ã¡ã¢ãªãã³ã¯ãšã¯ããšãŒãžã§ã³ããåç
§ãã¹ãç¥èãæ¯ãèãã®ã«ãŒã«ãæ§é åããŠä¿åããä»çµã¿ã§ãã ããã§æ±ã£ãŠããã¡ã¢ãªãã³ã¯ã¯ãããŸã§å€éšããã¥ã¡ã³ããæç€ºçã«ã³ã³ããã¹ããšããŠæ¯åæž¡ãèšèšã§ãããã¢ãã«èªäœã«æ°žç¶çã«èšæ¶ãããããã§ã¯ãããŸããã 詳ãã㯠Cline Memory Bank ãåç
§ãã ããã äžèšã¯Clineãæå±ããã¡ã¢ãªãã³ã¯ã§ãããClineå°çšã®æ©èœã§ã¯ãªãæ¹æ³è«ã§ãããããåãä»çµã¿ãCursorã«é©çšããããšãã§ããŸãã 3. ã¢ãã«ã®äœ¿ãåã ã¢ãã«ããšã«ç¹æ§ãã³ã³ããã¹ããŠã£ã³ããŠãµã€ãºãç°ãªããããã¿ã¹ã¯ã®æ§è³ªã«å¿ããŠæé©ãªã¢ãã«ãéžæããããšã§ãã³ã³ããã¹ãå¹çãšç²ŸåºŠã®äž¡æ¹ãåäžãããããšãã§ããŸãã ç§ã¯çŽè¿ã§ã¯ä»¥äžã®äºã€ã䜿ãåããŠããŸãã Claude 3.7 SonnetïŒæ¯èŒçå°ããã³ã³ããã¹ãã§é«ç²ŸåºŠãæ±ããããå Žé¢ãç¹ã«ã³ãŒãçè§£ãåæã¿ã¹ã¯ Gemini 2.5 ProïŒå€§èŠæš¡ãªèšèšã»å
šäœæ§æææ¡ãªã©ãè€éãªãããžã§ã¯ãæ§é ã®çè§£ 4. ã¯ãŒã¯ãããŒã®å®çŸ© ã¯ãŒã¯ãããŒãæç¢ºã«å®çŸ©ããäœæ¥ããšã®ã³ã³ããã¹ããå¹ççã«åŒãç¶ãããšãéèŠã§ãã äŸãã°ããèšç»âå®è£
âãã¹ãâã¬ãã¥ãŒããšããæµãã§ãåã¹ãããã«å¿
èŠãªæ
å ±ã ããéžæçã«æäŸããããšã§ãããŒã¯ã³æ¶è²»ãæããªããäžè²«æ§ãä¿ãŠãŸãã 5. å€éšããã³ã³ããã¹ããååŸãã ã³ã³ããã¹ã管çããã¯å°ãå€ããŸãããMCPãRAGïŒæ€çŽ¢æ¡åŒµçæïŒãªã©ãå©çšããŠã瀟å
ã®ææžç®¡çã·ã¹ãã ãFigmaã®èšèšããŒã¿ãªã©ãåçã«æ€çŽ¢ã»ååŸããå¿
èŠã«å¿ããŠLLMã«æž¡ãããšã§ããªããžããªå€ã®æ
å ±ãæŽ»çšã§ããŸãã ãªããžããªã§ç®¡çã§ããªã瀟å
ããã¥ã¡ã³ãããããã¹ããšããŠã³ããŒãã¥ãããããªFigmaãã¶ã€ã³ããŒã¿ãªã©ãMCPãRAGãªã©ãéããŠååŸã»æŽæ°ãããšäŸ¿å©ã§ãã Cursor Custom modes ãå©çšãã cursor-memory-bank ã詊ã 以äžã®ã³ã³ããã¹ã管çã®å¿
èŠæ§ãšã¢ãããŒãæ¹æ³ãèžãŸãã€ã€ãããããã¯2025幎3æ Cursor v0.48 ã§æèŒãããã«ã¹ã¿ã ã¢ãŒããå©çšããã³ã³ããã¹ã管çã®ã¯ãŒã¯ãããŒã«ã€ããŠãç§ãèå³ãæã£ãäžèšãããžã§ã¯ãã®ææ³ã詊ããŠã¿ãŸãã github.com ãã®ãããžã§ã¯ãã§ã¯Cursorã®ã«ã¹ã¿ã ã¢ãŒããæŽ»çšããAIãã»ãã·ã§ã³éã§ã®èšæ¶ãç¶æããªãããæ§é åãããéçºã¯ãŒã¯ãããŒãå®çŸããããšãç®çãšããŠããŸãã æ¬èšäºã¯ Cursor v0.48 æç¹ã§ã®èšå®æ¹æ³ã«åºã¥ããŠããŸãã以éã®ããŒãžã§ã³ã§UIãèšå®é
ç®ã倿Žãããå¯èœæ§ãããã®ã§ã泚æãã ããã ãŸããcursor-memory-bank ã v0.6-beta æç¹ã®ã¯ãŒã¯ãããŒã«åºã¥ããŠãããã¡ããã©å·çæç¹ã§ v0.7-beta ã«ã¢ããããŒããããŠãããããææ°ã®ã¯ãŒã¯ãããŒãšã¯å€å°ç°ãªã£ãŠããŸãã Cursor Custom modes ãšã¯ Custom modes ãšã¯ãCursor ã®ã¢ãŒããç¬èªã«å®çŸ©ã§ããæ©èœã§ãã䜿çšããããŒã«ãã¢ãã«ãã«ãŒã«çãèšå®ããç¬èªã®ã¢ãŒããäœæããããšãã§ããŸãã ãã®ã«ã¹ã¿ã ã¢ãŒããæŽ»çšããããšã§ãäŸãã°ã³ãŒãçææãšã³ãŒãã¬ãã¥ãŒæã§ç°ãªãã«ãŒã«ã»ãããé©çšã§ãããããããããã®ã¯ãŒã¯ãããŒã«ç¹åããäœæ¥ãè¡ãããããšãã§ããããã«ãªããŸãã Custom modes å§ãæ¹ 1. Cursor Settings > Features ã® Custom modes ãèš±å¯ãã 2. Chatã»ã¯ã·ã§ã³ã®ã¢ãŒãéžæ > Add custom mode ãéžæ 3. å¿
èŠãªã«ãŒã«ãèšå®ãã cursor-memory-bank ã詊ããŠã¿ã cursor-memory-bank 㯠Cursor ã®ã«ã¹ã¿ã ã¢ãŒããéããŠã以äžã®4ã€ã®éçºãã§ãŒãºã«å¯Ÿå¿ããã¢ãŒããæäŸããŸãã VANã¢ãŒãïŒãããžã§ã¯ãã®åæåãšã¡ã¢ãªãã³ã¯ã®èšå® PLANã¢ãŒãïŒã¿ã¹ã¯ã®èšç»ãšæŠç¥ã®ç«æ¡ CREATIVEã¢ãŒãïŒèšèšãšã¢ã€ãã¢ã®åµåº IMPLEMENTã¢ãŒãïŒå®è£
ãšé²æã®ç®¡ç ããã«ãããåã¯ãŒã¯ãããŒã«ç¹åããäžè²«æ§ã®ããéçºãè¡ããŸãã â» v0.6-beta æç¹ã®ã¯ãŒã¯ãããŒã§ãã VAN â PLAN â CREATIVE â IMPLEMENT ãšããé ã«å®è¡ããŠéçºãè¡ããŸãã èšå®æ¹æ³ cursor-memory-bank ããããžã§ã¯ãã«é©çšããæé ã¯ä»¥äžã®éãã§ãïŒ 1. ãªããžããªã®ã¯ããŒã³ cursor-memory-bankãã¯ããŒã³ããäœæ¥ãããããžã§ã¯ãã«ç§»ããŸãã git clone https://github.com/vanzan01/cursor-memory-bank.git 2. Custom modes ã®èšå® åéçºãã§ãŒãºã®ã¢ãŒãïŒVAN, PLAN, CREATIVE, IMPLEMENTïŒãäœæããŸãã äŸïŒPLANã¢ãŒãã®èšå® ãšãŒãžã§ã³ããžã®æç€ºãPLANã¢ãŒãçšã®å
容ãã«ã¹ã¿ã ã¢ãŒãã«èšå®ããŸãã 詳现ãªèšå®æ¹æ³ã¯cursor-memory-bankã®READMEã«èšèŒãããã®ã§ãã¡ããåç
§ãã ããã å®è¡æ¹æ³ 次ã«ãåã¢ãŒãã䜿ã£ãå®éã®å®è¡äŸã玹ä»ããŸãã ãµãŒããŒåŽã§ãã¢ãã€ã«ã¢ããªã®åŒ·å¶ã¢ããããŒããå¿
èŠãã©ãããå€å®ããããã«ãŠã§ã¢æ©èœãå®è£
ããã¿ã¹ã¯ããã¡ããã©è¯ã倧ããã®ã¿ã¹ã¯ã ã£ãã®ã§ããã®æ©èœã®å®è£
ã§è©ŠããŸãã VANã¢ãŒã ã«ã¹ã¿ã ã¢ãŒãã§èšå®ããVANã¢ãŒããéžæããŠãVANããšå
¥åãããšããããžã§ã¯ãå
šäœãèªã¿èŸŒã¿ãã¡ã¢ãªãã³ã¯ã®åæåãè¡ããŸãã ãã ããä»åã¯äœ¿ãæ¹ãèšå®ã«èª€ãããã£ãã®ãããã®æ¹æ³ã§ã¯ã¡ã¢ãªãã³ã¯ã®åãã¡ã€ã«ã®å
容ãçæãããŸããã§ããã ããã§ãä»å㯠gemini-2.5-pro-exp-03-25 ã¢ãã«ãå©çšãããã£ããäžã§æç€ºãããŠãããžã§ã¯ãå
šäœã®ã³ã³ããã¹ããããã¥ã¡ã³ãåããŸããã Gemini 2.5 Pro ã¯ã³ã³ããã¹ããŠã£ã³ããŠãµã€ãºã1Mãšå€§ããããããžã§ã¯ãå
šäœãè§£éããŠèšèšãèšç»ç«ãŠãè¡ãããšãåŸæã§ããããã ã¡ã¢ãªãã³ã¯ã®ã³ã³ããã¹ãçææã«å©çšãããšæ¯èŒç詳现ã«ããã¥ã¡ã³ãåããŠãããŸãã PLANã¢ãŒã PLANã¢ãŒã㯠memory-bank/tasks.md ã®ã¿ã¹ã¯å
容ããèšèšãå®è£
èšç»ãäœæããŸãã äºåã«èŠä»¶ã仿§ã memory-bank/tasks.md ã«èšè¿°ããäžã§ãPLANã¢ãŒããéžæããŠãPLAN MODEããšå
¥åãããšãèšç»ç«ãŠããŠãããŸãã å®è¡ããéã¯ãæ°ãããã£ãããéããŠè¡ãã®ãããããã§ãã åèãŸã§ã« memory-bank/tasks.md ã®å
容ã¯ä»¥äžã§ãã è¶³ããªãéšåã¯ãã£ããããªããè£ãåæã§ãã£ãããšããèšè¿°ãšãªã£ãŠããŸãã memory-bank/tasks.md ã衚瀺 ## èŠä»¶ã»ä»æ§ - OSããšã«åŒ·å¶ã¢ããããŒãã®ããŒãžã§ã³ãæå®ã§ãã - 匷å¶ã¢ããããŒãæ¡ä»¶ - ãµãŒããŒã§èšå®ãããŠãã匷å¶ã¢ããããŒãããŒãžã§ã³ > ã¢ããªããŒãžã§ã³ ## èšèš - ã¢ã㪠- å
šAPIã®ãªã¯ãšã¹ãããããŒã«äžèšæ
å ±ãä»äž - OSïŒXX-XXX-XXXX - `iOS` - `Android` - ã¢ããªããŒãžã§ã³ïŒXX-XXX-XXXX - `1.0.0` - ãµãŒããŒããHTTPã¹ããŒã¿ã¹ã³ãŒã427ãè¿åŽãããå Žåã«åŒ·å¶ã¢ããããŒãã®ãã€ã¢ãã°ã衚瀺ãã - ãµãŒã㌠- ã¢ããªåãã®å
šAPIã«ãããå
±éåŠçã®ããã«ãŠã§ã¢ãšããŠå®è£
- ãªã¯ãšã¹ãããããŒã§å¿
èŠãªæ
å ±ãåãåã - OSïŒXX-XXX-XXXX - ã¢ããªããŒãžã§ã³ïŒXX-XXX-XXXX - OSãããã¯ã¢ããªããŒãžã§ã³æ
å ±ããªã¯ãšã¹ãããããŒã«ãªãããããã¯äžæ£ã ã£ãå Žåã¯ãšã©ãŒ - HTTPã¹ããŒã¿ã¹ã³ãŒã 400ïŒ - OSããã³ã¢ããªããŒãžã§ã³æ
å ±ãããšã«ããŒãžã§ã³å€å®ãè¡ã - 匷å¶ã¢ããããŒã察象ã®å Žå HTTPã¹ããŒã¿ã¹ã³ãŒã427ãè¿åŽ mermaid flowchart TD A[ããŒãžã§ã³èŠä»¶ãå€å®ããããã«ãŠã§ã¢] --> B[HTTPãªã¯ãšã¹ãããããŒããã¢ããªã®ããŒãžã§ã³æ
å ±ãååŸ] B --> C{ããŒãžã§ã³æ
å ±ãæå¹ã} C -- No --> D[ãšã©ãŒ HTTPã¹ããŒã¿ã¹ã³ãŒã 400 è¿åŽ] C -- Yes --> F[HTTPãªã¯ãšã¹ãããããŒãã端æ«ã®OSæ
å ±ãååŸ] F --> G{ããŒãžã§ã³æ
å ±ãæå¹ã} G -- No --> D G -- Yes --> H{ããŒãžã§ã³æ
å ±ãšOSæ
å ±ãã匷å¶ã¢ããããŒã察象å€å®} H -- No --> J[ããã«ãŠã§ã¢çµäºã次ã®åŠçã«é²ãã] H -- Yes --> I[ãšã©ãŒ HTTPã¹ããŒã¿ã¹ã³ãŒã 427 Require Update è¿åŽ] subgraph ããŒãžã§ã³å€å®ããžã㯠K[OSæ
å ±ãããµãŒããŒã§å®çŸ©ãããŠããiOSãããã¯Android ã®minVersion ãååŸ] K --> L{ã¢ããªããŒãžã§ã³ < minVersion} L -- No --> M[Return False] L -- Yes --> N[Return True] end H --> |ããŒãžã§ã³å€å®ããžãã¯| K å
¥åå
容ã¯ãã¡ãã 以äžãå®è¡çµæã§ããä»åã¯1åã®æç€ºã®ã¿ã§è©³çްãªèšç»ãç«ãŠãŠãããŸããã memory-bank/ é
äžã®ãã¡ã€ã«ã詳现ã«èšè¿°ããŠãããªã©ãåæ®µã®æºåããã£ããããŠããããšã§ããã£ãããžã®å
¥åã¯ã»ãšãã©ç¡ã詳现ãªçµæãè¿åŽããŠãããŸãã PLANã¢ãŒã å®è¡çµæã衚瀺 # 匷å¶ã¢ããããŒãæ©èœ å®è£
èšç»ïŒPLAN MODEïŒ ## 1. èŠä»¶åæïŒRequirements AnalysisïŒ - [x] OSããšã«åŒ·å¶ã¢ããããŒãã®ããŒãžã§ã³ããµãŒããŒåŽã§æå®ã§ãã - [x] ãµãŒããŒã§èšå®ããã匷å¶ã¢ããããŒãããŒãžã§ã³ > ã¢ããªããŒãžã§ã³ã®å Žåã匷å¶ã¢ããããŒããèŠæ± - [x] å¿
èŠãªãªã¯ãšã¹ãããããŒïŒRA-Device-OS, RA-App-VersionïŒããªã/äžæ£ãªå Žåã¯400ãšã©ãŒ - [x] 匷å¶ã¢ããããŒã察象ã®å Žåã¯HTTP 427ïŒRequire UpdateïŒãè¿åŽ ### æè¡çå¶çŽ - [x] ãµãŒããŒåŽã¯å
šAPIã«å¯ŸããŠå
±éããã«ãŠã§ã¢ãšããŠå®è£
- [x] ããŒãžã§ã³æ
å ±ã»OSæ
å ±ã¯ãªã¯ãšã¹ãããããŒã§åãåã - [x] ãµãŒããŒåŽã§OSããšã®minVersionã管ç --- ## 2. ã³ã³ããŒãã³ãåæïŒComponent AnalysisïŒ ### 圱é¿ç¯å² - APIãµãŒããŒïŒLaravelæ³å®ïŒ - å
±éããã«ãŠã§ã¢å±€ïŒå
šAPIã«é©çšïŒ - ããŒãžã§ã³ç®¡çèšå®ïŒconfig or DBïŒ - ãšã©ãŒãã³ããªã³ã°ïŒ400, 427ïŒ - ã¯ã©ã€ã¢ã³ãïŒã¢ããªïŒ - ããããŒéä¿¡ - 427åä¿¡æã®ãã€ã¢ãã°è¡šç€ºïŒâ»ãµãŒããŒåŽèšç»å€ïŒ ### 倿Žç¹ã»äŸåé¢ä¿ - ããã«ãŠã§ã¢æ°èŠäœæ - ãªã¯ãšã¹ãããããŒæ€èšŒ - ããŒãžã§ã³å€å®ããžã㯠- ãšã©ãŒ/匷å¶ã¢ããããŒãå¿ç - èšå®ç®¡ç - OSããšã®minVersionãã©ãã§ç®¡çãããïŒconfigãã¡ã€ã« or DBïŒ - ãã¹ã - åäœãã¹ãïŒããã«ãŠã§ã¢ïŒ - çµ±åãã¹ãïŒAPIçµç±ïŒ --- ## 3. èšèšå€æïŒDesign DecisionsïŒ ### ã¢ãŒããã¯ã㣠- [x] Laravelã®HTTPããã«ãŠã§ã¢ãšããŠå®è£
- [x] èšå®ã¯ `config/force_update.php` ãªã©ã§ç®¡çïŒåæã¯ãã¡ã€ã«ãå°æ¥çã«DBåãèæ
®ïŒ - [x] ããŒãžã§ã³æ¯èŒã¯Semveräºæã®æ¯èŒããžãã¯ãå®è£
### UI/UX - [ ] ãµãŒããŒåŽã¯é該åœïŒã¢ããªåŽã§427æã«ãã€ã¢ãã°è¡šç€ºïŒ ### ã¢ã«ãŽãªãºã - [x] ããŒãžã§ã³æ¯èŒããžãã¯ïŒSemver察å¿ïŒ - [x] ããããŒæ€èšŒããžã㯠--- ## 4. å®è£
æŠç¥ïŒImplementation StrategyïŒ ### ãã§ãŒãº1: ããã«ãŠã§ã¢å®è£
- [ ] ããã«ãŠã§ã¢æ°èŠäœæïŒäŸïŒ`ForceUpdateMiddleware`ïŒ - [ ] ããããŒæ€èšŒ - [ ] ããŒãžã§ã³å€å®ããžãã¯å®è£
- [ ] èšå®ãã¡ã€ã«äœæïŒ`config/force_update.php`ïŒ ### ãã§ãŒãº2: ãšã©ãŒã»åŒ·å¶ã¢ããããŒãå¿ç - [ ] 400, 427ã¬ã¹ãã³ã¹ã®å®è£
- [ ] ãšã©ãŒãã³ããªã³ã°ã®çµ±äž ### ãã§ãŒãº3: ãã¹ãã»ããã¥ã¡ã³ã - [ ] åäœãã¹ãïŒããã«ãŠã§ã¢ïŒ - [ ] çµ±åãã¹ãïŒAPIçµç±ïŒ - [ ] API仿§æžã»READMEæŽæ° --- ## 5. ãã¹ãæŠç¥ïŒTesting StrategyïŒ - [ ] ããããŒãæ£ããå Žå/äžæ£ãªå Žåã®ãã¹ã - [ ] ããŒãžã§ã³ãminVersionæªæº/以äžã®ãã¹ã - [ ] OSããšã®åå²ãã¹ã - [ ] 400, 427ã¬ã¹ãã³ã¹ã®æ€èšŒ - [ ] ãã¹ãã«ãã¬ããžã®ç¢ºèª --- ## 6. ããã¥ã¡ã³ãèšç»ïŒDocumentation PlanïŒ - [ ] API仿§æžïŒãªã¯ãšã¹ãããããŒããšã©ãŒã³ãŒã远å ïŒ - [ ] å®è£
æé ã»èšå®æ¹æ³ã®READMEè¿œèš - [ ] ãã¹ãã±ãŒã¹äžèЧ --- ## 7. ã¯ãªãšã€ãã£ããã§ãŒãºèŠåŠïŒCreative Phase IdentificationïŒ - UI/UX: **äžèŠ**ïŒãµãŒããŒåŽã®ã¿ïŒ - ã¢ãŒããã¯ãã£: **å¿
èŠ**ïŒèšå®ç®¡çæ¹æ³ãããŒãžã§ã³æ¯èŒããžãã¯èšèšïŒ - ã¢ã«ãŽãªãºã : **å¿
èŠ**ïŒSemveræ¯èŒïŒ --- ## 8. ãã§ãã¯ãªã¹ãïŒVerification ChecklistïŒ - [x] èŠä»¶ããã¹ãŠç¶²çŸ
ãããŠãã - [x] 圱é¿ç¯å²ã»ã³ã³ããŒãã³ããæç¢º - [x] èšèšå€æã»å®è£
æŠç¥ãæèšãããŠãã - [x] ãã¹ãã»ããã¥ã¡ã³ãèšç»ããã - [x] ã¯ãªãšã€ãã£ããã§ãŒãºïŒã¢ãŒããã¯ãã£ã»ã¢ã«ãŽãªãºã ïŒãæç€º --- ### 次ã¢ãŒãæšå¥š - **ã¢ãŒããã¯ãã£èšèšã»ããŒãžã§ã³æ¯èŒããžãã¯ã®è©³çްèšèšãå¿
èŠãªãããæ¬¡ã¯ãCREATIVE MODEãæšå¥šã** CREATIVEã¢ãŒã PLANã¢ãŒãã§ãã¢ãŒããã¯ãã£èšèšã»ããŒãžã§ã³æ¯èŒããžãã¯ã®è©³çްèšèšãå¿
èŠãšããããšã ã£ãã®ã§ãCREATIVEã¢ãŒããçšããŠãã®äœæ¥ãè¡ããŸãã ä»ãŸã§åæ§ã«ãCREATIVEã¢ãŒããéžæããŠãCREATIVE MODEããå
¥åããŸãã ãã®éã«ãclaude-3.7-sonnet ã® Thinking ãèšå®ããããšã§ããé«ç²ŸåºŠãªèšèšãè¡ã£ãŠãããŸãã CREATIVEã¢ãŒã å®è¡çµæã衚瀺ïŒäžéšïŒ # 匷å¶ã¢ããããŒãæ©èœ ããŒãžã§ã³æ¯èŒã¢ã«ãŽãªãºã èšèš ðšðšðš ENTERING CREATIVE PHASE: ALGORITHM ðšðšðš Focus: 匷å¶ã¢ããããŒãæ©èœã«ãããããŒãžã§ã³æ¯èŒããžã㯠Objective: æ£ç¢ºãã€å¹ççãªããŒãžã§ã³æ¯èŒã¢ã«ãŽãªãºã ãèšèšãã Requirements: - åºæ¬çãªããŒãžã§ã³æ¯èŒïŒX.Y.Z圢åŒïŒ - ãªã¯ãšã¹ãããããŒããååŸããããŒãžã§ã³æååã®æ€èšŒ - ããã©ãŒãã³ã¹ãèæ
®ããå®è£
- ã·ã³ãã«ãªå®è£
ãéèŠ ## ã³ã³ããã¹ã ### ã¢ã«ãŽãªãºã èŠä»¶ - ããŒãžã§ã³åœ¢åŒ: `X.Y.Z`ïŒã¡ãžã£ãŒ.ãã€ããŒ.ãããïŒã®åœ¢åŒã®ã¿ - ç¡å¹ãªããŒãžã§ã³æååã®æ€åºãšåŠç - åçŽãªããŒãžã§ã³æ¯èŒïŒæ°ãããå€ããïŒ ### æè¡çå¶çŽ - PHPã§ã®å®è£
- é«éãªæ¯èŒåŠçïŒå
šãªã¯ãšã¹ãã§å®è¡ãããããïŒ - Laravelããã«ãŠã§ã¢ããã®APIãšããŠã®å©çšãããã ## ããŒãžã§ã³æ¯èŒã¢ã«ãŽãªãºã ã®ãªãã·ã§ã³ ### ãªãã·ã§ã³1ïŒç¬èªå®è£
ïŒã«ã¹ã¿ã ããžãã¯ïŒ - **説æ**: PHPã®æååæäœãšæ°å€æ¯èŒãçšããç¬èªå®è£
- **ææ³**: 1. ããŒãžã§ã³æååã`.`ã§åå² 2. ã¡ãžã£ãŒããã€ããŒãããããããããæ°å€æ¯èŒ - **é·æ**: - å®å
šã«ã«ã¹ã¿ãã€ãºå¯èœ - å€éšäŸåããªã - ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«æé©åå¯èœ - **çæ**: - å®è£
ã®è€éæ§ - ãšããžã±ãŒã¹ã®èŠèœãšããªã¹ã¯ - ã¡ã³ããã³ã¹ã³ã¹ã - **èšç®é**: O(n)ïŒnã¯ããŒãžã§ã³æååã®é·ãïŒ - **å®è£
è€éæ§**: äž ### ãªãã·ã§ã³2ïŒæ¢åã®ã©ã€ãã©ãªæŽ»çšïŒcomposer/semverïŒ - **説æ**: ComposerãæäŸãã`composer/semver`ããã±ãŒãžãäœ¿çš - **ææ³**: 1. `composer/semver`ãã€ã³ã¹ããŒã« 2. `Comparator`ã¯ã©ã¹ã®`lessThan()`/`greaterThan()`ã¡ãœãããäœ¿çš - **é·æ**: - åºã䜿ãããŠããä¿¡é Œæ§ãé«ã - SemVerã®ä»æ§ã«æºæ - ã¡ã³ããã³ã¹ã®å¿é
ããªã - **çæ**: - å€éšäŸåé¢ä¿ã®è¿œå - å€å°ã®ãªãŒããŒããã - ã·ã³ãã«ãªã±ãŒã¹ã«ã¯éå°ãªæ©èœ - **èšç®é**: ã©ã€ãã©ãªå
éšå®è£
ã«äŸå - **å®è£
è€éæ§**: äœ ### ãªãã·ã§ã³3ïŒPHPæšæºé¢æ° version_compare - **説æ**: PHPã®æšæºé¢æ°`version_compare()`ãäœ¿çš - **ææ³**: 1. `version_compare($version1, $version2, $operator)`ãåŒã³åºã 2. çµæã«åºã¥ããŠå€å® - **é·æ**: - PHPã«æšæºæèŒ - 远å äŸåé¢ä¿ãäžèŠ - ã·ã³ãã«ãªAPI - é«éãªåŠç - **çæ**: - è€éãªããŒãžã§ã³æ¯èŒã±ãŒã¹ã«ã¯äžåãïŒä»åã¯å¿
èŠãªãïŒ - **èšç®é**: O(n)ïŒPHPã®å
éšå®è£
ã«ããïŒ - **å®è£
è€éæ§**: éåžžã«äœ ## æ±ºå® - **éžæãããªãã·ã§ã³**: ãªãã·ã§ã³3ïŒPHPæšæºé¢æ° version_compareïŒ - **çç±**: - PHPã«æšæºæèŒãããŠããå€éšäŸåé¢ä¿ãäžèŠ - ã·ã³ãã«ã§é«éãªå®è£
ãå¯èœ - åºæ¬çãªX.Y.Z圢åŒã®ããŒãžã§ã³æ¯èŒã«ååå¯Ÿå¿ - 远å ã®ããã±ãŒãžå°å
¥ãäžèŠã§ãããžã§ã¯ãã軜éå - ä»åã®èŠä»¶ã«æé©ãªã·ã³ãã«ããæäŸ - **å®è£
ã¬ã€ãã©ã€ã³**: // ããŒãžã§ã³æ¯èŒ public function isUpdateRequired(string $clientVersion, string $requiredVersion): bool { return version_compare($clientVersion, $requiredVersion, '<'); } // ããŒãžã§ã³æ€èšŒïŒX.Y.Z圢åŒã®ã¿èš±å¯ïŒ public function isValidVersion(string $version): bool { // X.Y.Zã®åœ¢åŒã®ã¿èš±å¯ããåçŽãªæ£èŠè¡šçŸ $pattern = '/^\d+\.\d+\.\d+$/'; return preg_match($pattern, $version) === 1; } ## æ€èšŒ - èŠä»¶ã®å
è¶³: - [â] åºæ¬çãªããŒãžã§ã³æ¯èŒïŒX.Y.Z圢åŒïŒ - [â] ããŒãžã§ã³æååã®æ€èšŒ - [â] ããã©ãŒãã³ã¹ãžã®é
æ
® - [â] ã·ã³ãã«ãªå®è£
- æè¡çå®çŸæ§: é«ïŒPHPæšæºé¢æ°ã䜿çšïŒ - ãªã¹ã¯è©äŸ¡: äœïŒPHPã®æšæºæ©èœã«äŸåïŒ ðš CREATIVE CHECKPOINT: ã¢ã«ãŽãªãºã èšèšç¢ºå® - 鲿: ããŒãžã§ã³æ¯èŒããžãã¯ã®æ±ºå®å®äº - 決å®: PHPã®æšæºé¢æ°version_compareãšåçŽãªæ£èŠè¡šçŸãäœ¿çš - 次ã®ã¹ããã: ForceUpdateMiddlewareã®å®è£
ðšðšðš EXITING CREATIVE PHASE ðšðšðš Summary: ããŒãžã§ã³æ¯èŒã¢ã«ãŽãªãºã ãšããŠãã·ã³ãã«ããšå®è£
ã®å®¹æããèæ
®ããŠPHPã®æšæºé¢æ°`version_compare`ãæ¡çšãåºæ¬çãªX.Y.Z圢åŒã®ããŒãžã§ã³æ€èšŒã®ã¿ãè¡ãåçŽãªå®è£
ã¢ãããŒããæ±ºå®ã Key Decisions: - PHPã®æšæºé¢æ°version_compareã䜿çšããŠããŒãžã§ã³æ¯èŒãå®è£
- ã·ã³ãã«ãªæ£èŠè¡šçŸã«ããX.Y.Z圢åŒã®ã¿ã®æ€èšŒ - å€éšäŸåé¢ä¿ãæžãããã·ã³ãã«ãªå®è£
Next Steps: - ForceUpdateMiddlewareãžã®å®è£
- åäœãã¹ãã«ããæ€èšŒ è€æ°ã®èšèšãã¿ãŒã³ãæ€èšããæ¡çšããèšèšã®æææ±ºå®ã®å
容ãŸã§èšè¿°ããŠãããŸããã IMPLEMENTã¢ãŒã 以äžã®å®è£
èšç»ãšèšèšãããšã«å®è£
ããŸãã IMPLEMENTã¢ãŒããéžæããŠãIMPLEMENT MODEããšå
¥åãããšå®è£
ã«é²ã¿ãŸãã ããã§æ°ãããã£ãããéããŠå®è¡ãããšè¯ãã§ãããã çµæã¯é·ãã®ã§å²æããŸããã1åã®ããåãã§ã¯å
šãŠå®ç§ãªå®è£
ãšã¯ãªããããã¹ããŸã§å
šãŠæåãããŸã§ã«ã¯äœåºŠãããåããç¹°ãè¿ããŸããã ãã ãèšç»ã®ãã§ãã¯ãªã¹ãã«èªåçã«ãã§ãã¯ãã€ããªããå®è£
ããŠããããããå
容ã®ç¶²çŸ
æ§ãé«ãããŸããå¹ççãªããåããè¡ãããšæããŸããã ãŸãšã ä»åã¯ç°¡åãªæ©èœå®è£
ãäŸã« Cursor Custom modes ãå©çšãã cursor-memory-bank ã®ã¯ãŒã¯ãããŒã詊ããŸããã å°ããå
容ã®ã¿ã¹ã¯ã§ãã£ãããå¹ççã«åãããŒãå®è¡ã§ããŸãããããã£ãšå€§ããªãããžã§ã¯ãã§å€§ããªèª²é¡ã«å¯ŸããŠå®è¡ãããšãŸãéã£ãçµæã«ãªãããšæããŸãããŸããä»åŸã詊ããŠã¿ãããšæããŸãã ä»å玹ä»ããææ³ã¯ããããŸã§çŸæç¹ã§ã®ã¢ãããŒãã®äžäŸã«éããŸãããéèŠãªã®ã¯ãèªåãã¡ã®ã¯ãŒã¯ãããŒãéçºã¹ã¿ã€ã«ã«åãããŠé©åã«ã«ã¹ã¿ãã€ãºããç¶ç¶çã«æ¹åããŠããããšã ãšæããŸãã æ¬èšäºãå°ãã§ãåèã«ãªãã°å¹žãã§ããããããšãããããŸããïŒ
Amazon CloudWatch Logs Insights ã䜿ã£ããã°èª¿æ»ãææ°æ©èœãæ·»ã㊠ãŸããã èæ¯ Cloud Watch Logs Insightsã䜿ã£ã調æ»äºäŸ ææ°ã®Cloud Watch Logs Insightsäºæ
æ°æ©èœ1ïŒAIã¢ã·ã¹ã¿ã³ãã«ããã¯ãšãªèªåçæ æ¥æ¬èªããã³ããã®å¶éäºé
è±èªããã³ããã®äŸïŒæ¥æ¬èªæååããïŒãšã©ãŒçºçïŒ è€éãªããã³ããäŸïŒãšã©ãŒçºçïŒ æ°æ©èœ2ïŒOpenSearchSQLã¯ãšãª ç·æ¬ æåŸã« ãããã«ã¡ã¯ãéçºæ¬éš RetailHUBéçºéš NetSuperã°ã«ãŒãå
ŒãCTO 宀 Dev Enable ã°ã«ãŒãã«æå±ãããã«ã¹ã¿ãã¯ãšã³ãžãã¢ãããããŠããã ããŠããŸããããŒã¯ðŠ
ã¢ã€ðïžã§ããAWS Summit2025ãæ¥æã«éå¬ãããŸããããããéããã§ããããã aws.amazon.com ãŸããã ãåŒç€Ÿã§ã¯ã€ãå
ã ã£ãŠãã¬ã¹ãªãªãŒã¹ãããŸãããCursorãšãã£ã¿ã®å
šãšã³ãžãã¢é
åžã瀟å
ã§æãã€ã³ãã¯ãã®ããåºæ¥äºãšãªã£ãŠããéçºéšå
ã§ãSlackã§å°çšã®ãã£ã³ãã«ãçšæããŠäŒè©±ããããã瀟å
å匷äŒã®éå¬ãè¿ã
äºå®ããŠããããšå€§ãã«çãäžãã£ãŠãããŸãã prtimes.jp èæ¯ ãæšå¹Žãç§ãå·çããããã°èšäºã§Amazon Data Firehoseã«ã€ããŠè§ŠããããŠããã ããŸããããããŒã¿ãŠã§ã¢ããŠã¹ãªãã°ç®¡çã»åæææ³ãšããŠçŸåšãæå±ããŒã ã§çšŒåäžã§ãã tech.every.tv äžæ¹ãå¥ã®ã€ã³ãã©æ§æã§çšŒåããŠããGraphQLã·ã¹ãã ããããã¡ãã¯AWS Lambdaãå°å
¥ããŠããã ãã§ãã®ãã°ã¯æšæºã®Amazon CloudWatch Logsã«å
šäŸåããŠããã®ãçŸç¶ã§ãããããªäžããšãã調æ»ãå¿
èŠã«ãªããã®Lambdaã®ãã°ã°ã«ãŒãã®å€§éã®ãã°ãæ€çŽ¢ããªããã°ãªããªãããšã«ãªã£ãã®ã§ããæ§é åãã°ãšéæ§é åãã°ãæ··åšããŠããS3ã«ä¿åãããŠããªãã®ã§éå»ã®ãã°ãä»ããã«Athenaã䜿ã£ãŠã¯ãšãªçºè¡ãã§ããªããã仿¹ãªãLogs Insightsã䜿ã£ãŠçŽæ¥æ€çŽ¢ããããšã«ãªããŸãããLogs Insightsèªäœã¯2018幎ã«GAãšãªã£ãŠããã¬ã¬ã·ãŒæè¡ã§ãããå®ã¯çŽè¿ã§å€§ããªæ°ããæ©èœã远å ãšãªã£ãŠããã®ã§ããã玹ä»ãã€ã€ãæ¬èª¿æ»ã®äœéšè«ããããããã ããŸãã Cloud Watch Logs Insightsã䜿ã£ã調æ»äºäŸ ãå
ã»ã©è¿°ã¹ãLambdaãã°ã調æ»ããã«ããããçŸç¶ã·ã¹ãã ã®ãã°åºååæã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã APIããã°ã©ã å
ã§åºåããããã°ã®çš®é¡ã¯ãåŠçéäžã®å€æ°å€ãã¿ã€ã ã¹ã¿ã³ããèšããinfoãã°ãšäŸå€çºçæã®ãšã©ãŒãã°ãããããã®2çš®é¡ãåããã°ã°ã«ãŒãã«æ··åšããŠãã(æ§é åã»éæ§é åãã°ã®æ··åš) 調æ»å¯Ÿè±¡ã®APIã¯ãã°ã€ã³åŸã«ç¹å®ã®ãŠãŒã¶ïŒã¹ããã¢ããªïŒãå©ããã®ã ãäžéšã®ãã°ã«ãããŠãŒã¶IDãåã蟌ãŸããŠããªã ãšã©ãŒãã°ã«ã¯ãã®ãŠãŒã¶IDã¯åã蟌ãŸããŠããªã STGç°å¢ãšPRDç°å¢ã®ãã°ãåããã°ã°ã«ãŒãã«æ··åšããŠãã ããã®åææ¡ä»¶ã®äžã1ãªã¯ãšã¹ãã§åºåããããã°ããŸãšããŠãããæéäžã«ã©ã®ãŠãŒã¶ãç¹å®ãšã©ãŒãèµ·ãããã®ãããŸããã®ä»¶æ°ã¯ããã€ãªã®ããäœäººããšã©ãŒãèµ·ãããã®ããæœåºããããšããèŠä»¶ããããŸããã ãããããèžãŸããŠChatGPTãšå£æã¡ã®çµæããªããšãLogs Insights QLã®ã¯ãšãªæ§æã宿ãããããšãã§ããæåŸ
ããããŒã¿ãæœåºããããšãã§ããŸãããã¯ãšãªäŸã¯ä»¥äžã®ããã«ãªããŸãã fields @ timestamp , @message | parse @message " *\t*\t*\t* " as level , timestamp , request_id, body | parse body / ' user_id ' :\s* ' (?<usr_id>[^ ' ]+) ' / | parse body / ' shop_id ' :\s* ' (?<shp_id>[^ ' ]+) ' / | parse body / ' db_name ' :\s* ' (?<db_nme>[^ ' ]+) ' / | parse body / ' error_message ' :\s* ' (?<err_message>[^ ' ]+) ' / | stats latest(usr_id) as user_id, latest(shp_id) as shop_id, latest(db_nme) as db_name, latest(err_message) as error_message, latest( timestamp ) as log_timestamp by request_id | filter error_message = " æ
å ±ãååŸã§ããŸããã§ããã " and db_name != " stg_database " ãç°¡åã«èª¬æãããšã@messageã§ãã°æååå
šäœãååŸããŠãã¿ãåºåãã«ãªã£ãŠããéšåã4åå²ããŠLambdaã®ãªã¯ãšã¹ããäžæã«æ±ºããRequestIdãååŸãã€ã€ããã°æ¬äœãbodyãšããŠããŸãããã®RequestIdã§ã°ã«ãŒãã³ã°ããããšã§1ãªã¯ãšã¹ãã®ãã°å
šäœãéçŽããŸããããã°ã¯ãplaintextã®å Žåãããã°Json圢åŒã®å Žåããã£ããããŸãJson圢åŒããã¹ãããŠããããšJsonããŒã¹ãå
±éã«ãŒã«åããŠèšè¿°ã§ããªãã£ãã®ã§åçŽã«æ£èŠè¡šçŸã§user_idãªã©ãæœåºããŠããŸããæåŸã«PRDç°å¢ã®ã¿ãšããæ¡ä»¶ã远å ããŠããŸãã ææ°ã®Cloud Watch Logs Insightsäºæ
ãCloudWatch Logs ã§ã¯2024幎12æã以äžã®3ã€ã®æ©èœãGAãšãªã£ãŠå¯èœæ§ãåºãã£ãŠãããŸãã çæAIãçšããèªç¶èšèªã«ããã¯ãšãªäœæã»æŽæ°æ©èœ OpenSearch Service Piped Processing Language (PPL)ã®ãµããŒã OpenSearch Service Structured Query Language (SQL)ã®ãµããŒã ããŸãã2025幎7æ31æ¥ä»¥éã¯ãIAMããªã·ãŒã§ logs:StartQuery,logs:GetQueryResults ã®æš©é远å ãå¿
é ãšãªãã»ãã¥ãªãã£åäžãèŠèŸŒãŸããŸãã ãããã§ãå
ã»ã©ã®Lambdaãã°èª¿æ»ã§äœ¿ã£ãã¯ãšãªãšåæ§ã®çµæãåºãããã®SQLèšè¿°ã¯ã©ã®ãããªãã®ãªã®ããçæAIããã³ããã§ãªã¯ãšã¹ããããšã©ã®ãããªã¯ãšãªãçæããã®ããæ°ã«ãªããŸãããããããããããã£ãšç°¡åãªææ³ã§èšè¿°ã§ããŠããã®ã ããããGPTãšã®å£æã¡ãããŠãã£ãšã®æãã§å®æãããã¯ãšãªã ã£ãã®ã§ãã®æéççž®ãã§ããã®ã§ããã°è¯ãéžæè¢ã«ãªããšæã詊ãããšã«ããŸããã æ°æ©èœ1ïŒAIã¢ã·ã¹ã¿ã³ãã«ããã¯ãšãªèªåçæ æ¥æ¬èªããã³ããã®å¶éäºé
ãCursorã«äžèšã®å®æåœ¢ã®ã¯ãšãªãæž¡ããŠããã®ã¯ãšãªçµæãšåãã«ãªãã¯ãšãªãçæããŠãããããã®ããã³ãããèããŠããšãé¡ãããŠäœæããŠããã£ããã®ã䜿ã£ãŠå®è¡ããŠã¿ãã以äžã®ãšã©ãŒã«ãªããŸãããæ¥æ¬èªããããããã¡ã ã£ãããã§ããã # æ¥æ¬èªã§ã®å
¥åäŸïŒãšã©ãŒã«ãªããŸãïŒ Lambda颿°ã®ãã°ãã以äžã®æ¡ä»¶ã§åæããããã§ãïŒ 1. ãã°ããuser_id, shop_id, db_name, error_messageãæœåº 2. request_idã§ã°ã«ãŒãåããåãã£ãŒã«ãã®ææ°å€ãååŸ 3. error_messageã"æ
å ±ãååŸã§ããŸããã§ããã"ã§ã db_nameã"stg_database"以å€ã®ãã®ãæœåº â ïž ãšã©ãŒã¡ãã»ãŒãž Bad Request - Query generation currently only supports prompts in English. Only english characters, numbers and standard punctuations are allowed. è±èªããã³ããã®äŸïŒæ¥æ¬èªæååããïŒãšã©ãŒçºçïŒ ãæ¥æ¬èªã«ã¯å¯Ÿå¿ããŠããªããããªã®ã§ãè±èªããã³ããã«å€æŽããŠãšCursorã«ãé¡ãããŠäœæãçŽããŠããããŸãããããã䜿ã£ãŠå®è¡ãããšãŸããããšã©ãŒã«ãªã£ãŠããŸããŸããããã©ããããã¡ãã»ãŒãžæååãã®ãã®ãæ¥æ¬èªïŒãã«ããã€ãïŒïŒãæ··ãã£ãŠãããšãšã©ãŒã«ãªãããã§ãã I want to analyze Lambda function logs with the following conditions: 1. Extract user_id, shop_id, db_name, and error_message from logs 2. Group by request_id and get the latest value for each field 3. Filter where error_message is "æ
å ±ãååŸã§ããŸããã§ããã" and db_name is not "stg_database" â ïž ãšã©ãŒã¡ãã»ãŒãž Bad Request - Query generation currently only supports prompts in English. Only english characters, numbers and standard punctuations are allowed. è€éãªããã³ããäŸïŒãšã©ãŒçºçïŒ ããšããããã§å
šãŠè±èªã®ããã³ãããCursorã«ãé¡ãããŠäœæããŠããããããã䜿ã£ãŠå®è¡ããŠã¿ãŸãããã以äžã®ããã«ãŸããŸããšã©ãŒã«ãªã£ãŠããŸããŸãããé·æã ã£ããèŠä»¶ãè€æ°ã»è€éã ãšãšã©ãŒãåºãŠã¯ãšãªçæã«å€±æããŠããŸã£ãã®ã§ããããç°¡åãªã¯ãšãªçæã«ãã察å¿ã§ããªãããã§ãã I want to analyze Lambda function logs with the following conditions: 1. Extract user_id, shop_id, db_name, and error_message from logs 2. Group by request_id and get the latest value for each field 3. Filter where error_message is "Information could not be retrieved" and db_name is not "stg_database" â ïž ãšã©ãŒã¡ãã»ãŒãž Bad Request - The provided query prompt failed to generate a valid query. Try rephrasing the query prompt. ããã®åŸãç°¡åãªæç« ããã³ããã§å°ãã¥ã€ã¯ãšãªãçµã¿ç«ãŠããããšãGenerate New QueryâUpdate QueryâUpdate Query...ãšç¹°ãè¿ããŠãããŸãããåçŽã«Updateã§ããã³ããã®çµæã远å ããæãããã°äžæžãããæããã£ãã®ã§äžã
äžççžã§ã¯ãããªãçµæãšãªããŸãããã æ°æ©èœ2ïŒOpenSearchSQLã¯ãšãª ããã¡ããåæ§ã«Cursorã䜿ã£ãŠSQLãäœã£ãŠããã£ãŠãããå®è¡ããæ¹æ³ã§è©ŠããŸããã確ãã«ç°¡åãªSQLæ§æã§ã¯æ£ããåããŸããããå
ããããç¥èŠããã®ãŸãŸäœ¿ã£ãŠããã«ã¯ãšãªäœæãã§ããã®ã¯äŸ¿å©ã§ãããããããä»åã®ãããªã¡ãã£ãšè€éãªã¯ãšãªèŠä»¶ã«ãªããšCursorãçæããSQLïŒä»¥äžãäžäŸïŒã§ã¯ææ³NGã ã£ããå®è¡ã§ããŠããããæ°0ä»¶ã ã£ãããšäœåºŠã壿ã¡ããŠè©ŠããŸãããäžæããããŸããã§ãããã SELECT request_id, user_id, shop_id, db_name, error_message, `@ timestamp ` as log_timestamp FROM `/aws/lambda/FunctionA` WHERE regexp_extract(`@message`, ' error_message '' ?\s*:\s* '' ([^ '' ]+) ''' , 1 ) = ' æ
å ±ãååŸã§ããŸããã§ããã ' AND regexp_extract(`@message`, ' db_name '' ?\s*:\s* '' ([^ '' ]+) ''' , 1 ) != ' stg_database ' | fields regexp_extract(`@message`, ' user_id '' ?\s*:\s* '' ([^ '' ]+) ''' , 1 ) as user_id, regexp_extract(`@message`, ' shop_id '' ?\s*:\s* '' ([^ '' ]+) ''' , 1 ) as shop_id, regexp_extract(`@message`, ' db_name '' ?\s*:\s* '' ([^ '' ]+) ''' , 1 ) as db_name, regexp_extract(`@message`, ' error_message '' ?\s*:\s* '' ([^ '' ]+) ''' , 1 ) as error_message, split(`@message`, ' \t ' )[ 3 ] as request_id, `@ timestamp ` | sort `@ timestamp ` desc | limit 1000 ; ç·æ¬ ãæ¬èšäºã§ã¯ãååã§CloudWatch Logs Insightsã䜿ã£ããã°èª¿æ»äºäŸã«ã€ããŠè©±ããŸãããåŸåã§ã¯ãææ°æ©èœã«ã€ããŠãè§ŠããŸãããçæAIã«ããèªåçæã¯ãŸã ãŸã æ¹åã®äœå°ããããããªçµæã§ãããSQLã®æ¹ã¯æ§æã颿°ã¯æ¢ã«åºæã£ãŠããã®ã§ããããå
šãŠçè§£ããã°è€éãªã¯ãšãªå®è¡ãæåããããšã¯ã§ãããšæããŸãã ããããããLogs Insights䜿çšã¯ãããŒã³ã¹ããæããããããã ãã䜿ã£ããã°ç®¡çéçšã¯æé©è§£ã§ã¯ãªããããããŸããããã®ãã䜿çšé »åºŠã¯é«ããªããšæããŸãããä»åã®ãããªããŒã¿ã¬ã€ã¯ãªããããªåœ¢åŒã®ãã°ãæ··åšããŠããã®ãäžæ¬ããŠæ€çŽ¢å¯èœã§ãã£ãããè€æ°ã®LogGroupsãæšªæããŠæ€çŽ¢å¯èœã§ãã£ãããCloudWatch Dashboardsã§ãªã¢ã«ã¿ã€ã ç£èŠãã§ãããããšäœ¿ãåããšããŠäœ¿çšæ©äŒèªäœã¯ãŸã ãŸã ãããŸãã®ã§æ°ããæ©èœãé§äœ¿ããŠå¿«é©ãªãã°ã©ã€ããéãããšè¯ããšæããŸããã ããŸããæ°ãããã°åæææ³ãšããŠããŒã¿ã¬ã€ã¯ãšããŠApache IcebergããµããŒãããS3 Tablesã䜿ã£ãŠAthenaã§åæãããã¿ãŒã³ãåºãŠããŸããã2025幎5æå·çæç¹ã§ã¯ã³ã³ãœãŒã«äžã§namespaceäœæãããŒãã«äœæãå¯èœãšãªã£ãŠãããŸããããã¡ãã¯æ¢åã®åŒç€Ÿã·ã¹ãã ã®ãã°åæææ³ãã¢ããããŒãã§ãåŸããã®ãšããŠåŸæ¥æ€èšŒããŠå¥éå ±åã§ããã°ãšæããŸãã ãããã«ãŠæ¬èšäºã®çµã³ãšãããŠããã ããŸãã æåŸã« ãšããªãŒã§ã¯ããšãã«åã仲éãåéããŠããŸãã ããã¯ããã°ãèªãã§å°ãã§ããšããªãŒã«èå³ãæã£ãŠããã ããæ¹ã¯ããã²äžåºŠã«ãžã¥ã¢ã«é¢è«ã«ãè¶ããã ããïŒ corp.every.tv
ã¯ããã« ããã«ã¡ã¯ãéçºæ¬éšã®ããŒã¿ïŒAIããŒã ã®è柀ã§ãã Amazon QuickSight(以äžquicksight)ã«ã¯ãã€ã©ã€ãæ©èœããããŸãããã€ã³ã¿ã©ã¯ãã£ãã«ã©ã³ãã³ã°è¡šã®æå®ããã¯ãŒãã«ãã€ã©ã€ãããããšã¯ã§ããŸããã æ¬èšäºã§ã¯quicksightã®ãã€ã©ã€ãæ©èœã䜿çšããã«ãã©ã³ãã³ã°è¡šã®åãã¯ãŒãã«ãã€ã©ã€ãããæ¹æ³ã玹ä»ããããšæããŸãã æ¬èšäºã¯quicksightã®æ©èœãäžéãç¥ã£ãŠããæ¹åãã®å
容ã«ãªã£ãŠããŸãã 䜿çšããããŒã¿ ä»å䜿çšããããŒã¿ã¯ãã¬ã·ãåç»ãµãŒãã¹ã®æ€çŽ¢ããŒã¿ãéèšããŠäœæãããã«ããããšäžç·ã«æ€çŽ¢ãããåæ°ãå€ãã¯ãŒãã®å¹ŽåºŠããš(2021幎ã2024幎)ã®ã©ã³ãã³ã°ãã®ããŒã¿ã§ãã äžç·ã«æ€çŽ¢ãããã¯ãŒããšã¯ãã«ããã ãããããã®ããã«ã¹ããŒã¹åºåãã§å
±ã«æ€çŽ¢ãããã¯ãŒãã®ããšãæããŸãã quicksightã®ãããŒãã«ãããžã¥ã¢ã«ã䜿çšããŠã©ã³ãã³ã°è¡šã衚çŸããããã«ãrankã«ã©ã ãšå幎床ã®ã«ã©ã ãäœæããå幎床ã®ã«ã©ã ã«ã¯äžç·ã«æ€çŽ¢ãããã¯ãŒããæ ŒçŽããŸãã â»ããŒã¿ã¯ãµã³ãã«ãªã®ã§å®éã®åŸåãšã¯ç°ãªããŸãã å®éã«quicksightã§ããŒãã«ãäœæãããšäžèšç»åã®ãããªããŒãã«ãäœæã§ããŸãã ãã€ã©ã€ããã€ãã å
ã»ã©ã®ã©ã³ãã³ã°è¡šãèŠãŠã¿ããšãããããããã®é äœã2021幎ãã2024幎ã«ãããŠäžãã£ãŠããããšãããå€§æ ¹ãã®é äœã2021幎ãã2024幎ã«ãããŠäžãã£ãŠããããšãããããŸãã ãããããã®è¡šã§ããããããããå€§æ ¹ãã®é äœã®é·ç§»ãç®ã§è¿œãã®ã¯å€§å€ãªã®ã§ãç¹å®ã®ã»ã«ã®ã¿ã«è²ãã€ãã(ãã€ã©ã€ããã)ãšããã®ããä»åã®ç®æšã«ãªããŸãã 1.ãã©ã¡ãŒã¿ãäœæ 以äžã®ãããªãã©ã¡ãŒã¿ãäœæããŸãã ãã®ãã©ã¡ãŒã¿ã«ã¯ããã€ã©ã€ããããã¯ãŒããå
¥ãªãŸãã 2.èšç®ãã£ãŒã«ããäœæ 以äžã®ãããªèšç®ãã£ãŒã«ããäœæããŸãã 2021幎ã«ã©ã ã®å€ããHighlightãã©ã¡ãŒã¿ãšåãå Žåã¯1ãç°ãªãå Žåã¯0ãè¿ãèšç®ãã£ãŒã«ãã«ãªã£ãŠããããã®å€ã«ãã£ãŠåŸè¿°ããæ¡ä»¶ä»ãæžåŒãèšå®ããŸãã åæ§ã«ããŠ2022~2024çšã®èšç®ãã£ãŒã«ããäœæããŸãã 3.æ¡ä»¶ä»ãæžåŒãèšå® ãããã㣠-> æ¡ä»¶ä»ãæžåŒèšå® -> åã§ã2021ããéžæ -> èæ¯è²ã远å ãã ã§ä»¥äžã®ããã«èšå®ããŸãã æ¡ä»¶ã®å¯Ÿè±¡ãã£ãŒã«ãã«ã¯å
ã»ã©äœæãã察å¿ããèšç®ãã£ãŒã«ããéžæããæ¡ä»¶ã¯ã次ãšçããããå€ã¯1ã«ããŸãã 2022~2024ã«ãåãèšå®ãããŸãã 4.ã³ã³ãããŒã«ã远å 1.ã§äœæãããã©ã¡ãŒã¿ã以äžã®èšå®ã§ã³ã³ãããŒã«ã«è¿œå ããŸãã 5.宿 å¿
èŠãªå·¥çšã¯1~4ã«ãªããŸãã äœæããã³ã³ãããŒã«ã«ãã€ã©ã€ããããã¯ãŒããå
¥åããã°ãã©ã³ãã³ã°è¡šã«è²ãã€ããŸãïŒ ãã€ã©ã€ããã€ãããšã§é äœã®é·ç§»ãèŠããããªããŸããïŒ ãŸãšã æ¬èšäºã§ã¯ãquicksightã§ç¹å®ã®ã»ã«ã«ãã€ã©ã€ããã€ããããšãã§ããã©ã³ãã³ã°è¡šã®äœææ¹æ³ã玹ä»ããŸããã ãã®èšäºããã€ã誰ãã®å©ãã«ãªãã°å¹žãã§ãïŒ æåŸãŸã§èªãã§ããã ãããããšãããããŸããã
ã¯ããã« èæ¯ ADRã«ã€ã㊠ADRã®å§ãæ¹ ADRã®å®è·µäŸ ADRã®å
·äœäŸ ãããã« ã¯ããã« ããªãã·ã¥ãããã³ã®iOSã¢ããªéçºãæ
åœããŠããæ± ç°ã§ããä»åã¯iOSããŒã ã§ADRïŒArchitecture Decision RecordïŒãçšããŠããŒã ã®æææ±ºå®ã®èšé²ãæ®ãå§ãã話ãããŸããæ£ç¢ºã«ã¯å人ã§ADRãèšé²ããŠãããã®ã®ãããŒã ã§ã®éçšã¯ããŠããªãã£ãããããã®æ©äŒã«ããŒã ã§ã®ç®¡çãéå§ããŸããã èæ¯ ããªãã·ã¥ãããã³ã®iOSéçºã¯åœåå°äººæ°ã§è¡ã£ãŠãããããå®è£
ã«é¢ãã詳现ãªããã¥ã¡ã³ããäœæãããšããç¿æ
£ããããŸããã§ããããããè¿å¹Žãã¡ã³ããŒã®å
¥ãæ¿ãããæ°å
¥ç€Ÿå¡ã®åå ã«ãããèšèšãå®è£
ã®çµç·¯ã説æããæ©äŒãå¢ããŠããŸããããããè¯ãæ©äŒãšæããç§ãå人ã§èšé²ããŠããADRãããŒã ã«å
±æããããšã«ããŸããã ADRã«ã€ã㊠ADRãšã¯ãArchitecture Decision Recordãã®ç¥ã§ããããžã§ã¯ãã«ãããéèŠãªæææ±ºå®ãèšé²ããããã®ããã¥ã¡ã³ãã§ããããŒã ã§ã®æ±ºå®äºé
ãšãã®çµç·¯ãäžæç¢ºã«ãªããéœåºŠç¢ºèªãå¿
èŠã«ãªã£ãããçµç·¯ãç¥ã人ãéè·ããŠããŸã£ããããçµéšã¯å€ãã®æ¹ãããã§ããããADRãæ®ãããšã§ããã®ãããªæææ±ºå®ããã»ã¹ã®æ¶å€±ãé²ãããšãã§ããŸãã æææ±ºå®ã¯æéãšãšãã«æ¶å€±ãã ADRã«ãŸãšããäž»ãªé
ç®ã¯ä»¥äžã®éãã§ãã ã¿ã€ãã«ïŒäœã«ã€ããŠã®æ±ºå®ãç°¡æœã«è¡šçŸ ã¹ããŒã¿ã¹ïŒææ¡äžãæ¿èªæžã¿ã廿¢ã倿Žãªã© ã³ã³ããã¹ãïŒãã®æ±ºå®ãå¿
èŠã«ãªã£ãèæ¯ãç¶æ³ 決å®äºé
ïŒæ¡çšããéžæè¢ãšãã®çç±ãæ€èšããä»£æ¿æ¡ çµæïŒãã®æ±ºå®ã«ãã圱é¿ïŒã¡ãªããã»ãã¡ãªããïŒ ADRã®å§ãæ¹ ADRãå§ããã«ã¯ããã€ãã®ã¹ãããããããŸãã ãã³ãã¬ãŒãã®äœæãšåæ - æå°éã®é
ç®ã§ã·ã³ãã«ã«å§ããããšãéèŠã§ããããŒã ã§åæãããã©ãŒããããããã°ãäžè²«æ§ãç¶æãããããªããŸãã èšé²å Žæã®æ±ºå® - ã¢ã¯ã»ã¹ãããããæ°è»œã«ç·šéã§ããå Žæãçæ³çã§ããGitHubãConfluenceãªã©ãããŒã ãæ¥åžžçã«äœ¿çšããããŒã«ãæé©ã§ãã æåã®ADRã®äœæ - å®ç§ãç®æããããããŸãã¯èšé²ããããšãåªå
ããŸãããã ADRã®å®è·µäŸ ç§ãã¡ã®ããŒã ã§ã¯GitHub Discussionã«ADRããŸãšããããšã«ããŸãããeveryã§ã¯Confluenceãå©çšããŠãããããããã«èšèŒããéžæè¢ããããŸããããéçºé¢é£ã®å
容ãšãã®ä»ã®æ
å ±ãåé¢ããç®çããGitHub DiscussionãéžæããŸããã ãã ãæ¯ãè¿ã£ãŠã¿ããšãPdMããã¶ã€ããŒãªã©ã®éãšã³ãžãã¢ãšã®å
±æããè€æ°ãªããžããªã«å¯ŸããADRã®äžå
管çã®èгç¹ããã¯ãConfluenceã§ã®ç®¡çã®æ¹ãé©ããŠãããããããŸããã ç§ãã¡ã®ããŒã ã§ã¯åè¿°ã®5é
ç®ãããŒã¹ãšããã·ã³ãã«ãªãã³ãã¬ãŒããäœæããŸãããã¿ã€ãã«ã«ã¯æ±ºå®äºé
ãèšèŒããã¹ããŒã¿ã¹ã«ã¯GitHub Discussionã®ã«ããŽãªãŒæ©èœã掻çšããããšã«ããŸãããå®éã®ãã³ãã¬ãŒãã¯ä»¥äžã®éãã§ãã # çµç·¯ # ææ¡å
容 # æ¿èªããå Žåã®çµæ ## ã¡ãªãã ## ãã¡ãªãã # åè æåã®ADRã¯ãµã³ãã«ã®æå³åãã蟌ããŠãADRã䜿ã£ãŠæææ±ºå®äºé
ãæ®ãããšããããŒãã§äœæããŸããã ADRã®å
·äœäŸ å®éã®ADRã®äŸ ãããã« ããªãã·ã¥ãããã³ã®iOSããŒã ã§ã¯ADRã®èšé²ãå§ããŸãããããã«ãããæ°ããã¡ã³ããŒãåå ããéã«ãã¹ã ãŒãºã«éçºãé²ããããããã«ãªããšèããŠããŸãã ãŸããè¿å¹Žã§ã¯AIãæŽ»çšããéçºãé²ãã§ããŸãããæç¢ºãªããã¥ã¡ã³ããããããšã§AIã«å¯ŸããŠãé©åãªæç€ºãåºãããããªãããããžã§ã¯ãã®æèãçè§£ããäžã§ãã質ã®é«ãææ¡ãåŸãããããã«ãªãã§ãããã éèŠãªã®ã¯å®ç§ãç®æãã®ã§ã¯ãªãããŸãã¯å°ããå§ããŠç¿æ
£åããããšã§ããæåã¯ç°¡åãªèšé²ããå§ããåŸã
ã«æŽç·ŽãããŠããã°ååã§ããæææ±ºå®ã¯ã³ãŒããšåæ§ã«éèŠãªè³ç£ã§ãããããŒã å
šäœã§å
±æã»ç®¡çããããšã§ãé·æçãªéçºå¹çãšå質åäžã«ã€ãªãããŸãã çããããã²ADRãåãå
¥ãã誰ããéçºããããç°å¢ãæŽåããŠãããŸãããã
ã¯ããã« ããã«ã¡ã¯ãããªãã·ã¥ãããã³éçºéšã®æäžã§ãã åŒç€Ÿã§ã¯ãšã³ãžãã¢ãšPdMå
šå¡ã«Cursorãé
åžããŠãããçæAIãæŽ»çšããéçºãç©æ¥µçã«è¡ã£ãŠããŸãã prtimes.jp ãšã³ãžãã¢çµç¹ã§ã¯éçºçç£æ§10åãç®æšãšããŠããŸãããããã«å°éããããã«ã¯æ°ããæè¡ãããŒã«ã«è§Šããªããã ããæå³ã§ãããŸã§ã®éçºã®ããæ¹ãæ ¹åºããçã£ãŠã¿ãŠãçæAIã®æŽ»çšãåæãšããæ°ããçµç¹ã»æ¥åèšèšãããŠãã倧èããæ±ããããŠãããŸãã ãããªäžã§ãç§ã®æå±ããçµç¹ã§ã¯ã¡ããã©LPã®éçºã«ã€ããŠèããæ©äŒããããŸããã LPã¯ãããŸã§è€éãªæ©èœã¯ãªããåºæ¬çã«ã¯ãã¶ã€ã³ã«åºã¥ããã³ãŒãã£ã³ã°ãäžå¿ã«ãªããŸãããå°å³ã«æéãããããŸãã ããã§ãæè¿è©±é¡ã®Figma-Context-MCPã䜿ã£ãæ€èšŒãããŠããã®ã§ããã§åŸãç¥èŠã玹ä»ããããšæããŸãã 仿ã®åãã«ã¯åŒç€ŸCTOãMCPãµãŒããŒã«é¢ããèšäºããããŠããã®ã§ãã²ãã¡ããã芧ãã ããã tech.every.tv Figma-Context-MCPãšã¯ Figma-Context-MCPãšã¯ãFigmaã®ãã¶ã€ã³ããŒã¿ãCursorãªã©ã®AIã³ãŒãã£ã³ã°ããŒã«ã® "ããŒã«åŒã³åºã" ãšããŠæ±ããããã«ãã Model Context Protocol (MCP) ãµãŒããŒã§ããFigma APIããååŸããè€éãªJSONã®æ
å ±ãæŽçããŠLLMã«æ©æž¡ãããããšã«ãã£ãŠãå¹ççã«ãã¶ã€ã³è§£æãã³ãŒãçæãå¯èœã«ãªããŸãã github.com å§ãæ¹ ã»ããã¢ããã¯ç°¡åã§å
¬åŒã® ã¯ã€ãã¯ã¹ã¿ãŒã ãèŠãã°ããã«å©çšããããšãã§ããŸããããã¡ãã§ãç°¡åã«èª¬æããŸãã Figmaã¢ã¯ã»ã¹ããŒã¯ã³ã®ååŸ Figma-Context-MCPã¯Figma APIãéããŠFigmaã®æ
å ±ã«ã¢ã¯ã»ã¹ããã®ã§ã¢ã¯ã»ã¹ããŒã¯ã³ãå¿
èŠã«ãªããŸãã ã¢ã¯ã»ã¹ããŒã¯ã³ã¯ã¢ã«ãŠã³ãã®èšå®ã¡ãã¥ãŒããSecurityã¿ããéãã°ãã¢ã¯ã»ã¹ããŒã¯ã³çºè¡ã®å°ç·ãèŠã€ãããŸããå
¬åŒããã¥ã¡ã³ãã«ãããš File content ãš Dev resources ã®èªã¿åãæš©éãå®è¡ã«å¿
èŠãªããæ³šæããŠãã ããã CursoråŽã§MCPãµãŒããŒãèšå® ãã¡ããå
¬åŒããã¥ã¡ã³ãããã»ãšãã©å€ããŠããªãã§ããã .cursor/mcp.json ã«MCPãµãŒããŒã®èšå®ã远å ããŸãã ïŒâ»2025幎4æ27æ¥æç¹ã§ããŒãžã§ã³æå®ãããŠããªããšæ¥ç¶ãšã©ãŒãšãªããããææ°ã®v0.2.1ãæå®ããŠããŸãïŒ { " mcpServers ": { " Framelink Figma MCP ": { " command ": " npx ", " args ": [ " -y ", " figma-developer-mcp@0.2.1 ", " --figma-api-key=<API KEY> ", " --stdio " ] } } } ã·ã³ãã«ãªLPãã¶ã€ã³æ§æã§ã³ãŒãçæã詊ã ãŸãã¯å®éã«åŒç€Ÿå
ã§ãã¶ã€ã³ãããŠããLPã®FigmaããŒã¿ããéšåçã«åãåºããŠã·ã³ãã«ãªç»åèŠçŽ äžå¿ã®LPã§æ€èšŒããŠã¿ãŸãã ä»åã¯é¡æãšããŠãããªãã·ã¥ãããã³ãææããŠããå·åå®
é
åŒåœã®ã Meals ãã®ãã¶ã€ã³ããŒã¿ã䜿ããŸãã Figmaã®æ§é åãåºããFigmaã®LPããŒã¿ã¯ä»¥äžã®ãããªæ§é ã§ç»åãäžå¿ãšãªã£ãŠããããããšãŠãã·ã³ãã«ã§ãã test1ïŒFrameïŒ âââ Group 48ïŒGroupïŒ â âââ kvïŒGroupïŒ â âââ 垯ïŒGroupïŒ â â âââ ãã®ããŒãžããèŠ§ã®æ¹ éå®ïŒïŒTextïŒ â â âââ Rectangle 40ïŒRectangleïŒ â âââ kv_foodïŒImageïŒ âââ diet_onayamiïŒImageïŒ LPçæ Cursorããæç€ºãåºããŠã¿ãŸããFigmaã§ã¯ãCopy Link to Sectionããšãã圢ã§ã»ã¯ã·ã§ã³ã®ãªã³ã¯ãååŸã§ããã®ã§ãã®ãªã³ã¯ã䜿çšããŸãã Figmaã§ããŒãžå
šäœãå
±æãããšè€æ°ãã¶ã€ã³ããããŠããå Žåã«ããã«Contextäžéã§å¿çããã©ãŒãã³ã¹ãæªããªããããçæããããã®ã ãã«çµãããšããå§ãããŸãã 以äžã®figmaã®ãã¶ã€ã³ãåç
§ããŠãã³ãŒãã£ã³ã°ãè¡ã£ãŠãã ããã @<figmaã®è©²åœã»ã¯ã·ã§ã³ã®URL> ãã¶ã€ã³ãšçæãããLPã®ã¹ã¯ã·ã§ãæ¯èŒããã®ããã¡ãã§ãã ããããŒã®äœçœ®ããããŠããŸã£ãŠããããmarginãäœèšã«å
¥ã£ãããšæºè¶³ã®ãããã®ãåºãŠããŸããã Auto Layoutæ©èœã䜿ã£ãŠã¬ã€ã¢ãŠããèªèããã 調ã¹ãŠãããšå
¬åŒããã¥ã¡ã³ãã® Best Practices ã§ä»¥äžã®èšåããããŠããŸããã Use auto layoutsâthe MCP isn't great at handling floating or absolutely positioned elements just yet ã©ãããMCPã¯Groupã§æå®ããã絶察å€åç
§ã®ã¬ã€ã¢ãŠããåŸæã§ã¯ãªãããã§Auto Layoutã䜿ãããšãæšå¥šãããŠããŸãããç§ã¯Figmaã«ã€ããŠã¯åå¿è
ãªã®ã§è©³ããããã§ã¯ãªãã§ãããAuto Layoutã¯CSSã§ããflexboxã®ããã«èŠçŽ ãèŠåçã«äžŠã¹ãããšãåºæ¥ãæ©èœã§èŠçŽ ã®äžŠã³æ¹ãèŠçŽ éã®gapãå®çŸ©ããããšãã§ããŸãã ãã£ããã kv ãš å
šäœïŒ test1 ïŒã«Auto Layoutãé©çšããŠãFigmaãæŽæ°ããŠã¿ãŸãã test1ïŒAuto LayoutïŒ âââ Group 48ïŒGroupïŒ â âââ kvïŒAuto LayoutïŒ â âââ 垯ïŒGroupïŒ â â âââ ãã®ããŒãžããèŠ§ã®æ¹ éå®ïŒïŒTextïŒ â â âââ Rectangle 40ïŒRectangleïŒ â âââ kv_foodïŒImageïŒ âââ diet_onayamiïŒImageïŒ ãã®ç¶æ
ã§å
ã»ã©ãšåãæç€ºã§LPçæãè¡ã£ãçµæã以äžã®ç»åã§ãã Auto Layoutãæå®ããã ãã§ãã®ä»ã¯æ§é ãåœåãå€ããŠããŸããããèŠçŽ ã®äœçœ®ãèªèããŠãã¶ã€ã³éãã«é
眮ããŠãããŠããŸããç»åäžå¿ã®ã¬ã€ã¢ãŠãã§ããã°ãããããçžŠã«æ°ãå¢ãããŠãã¢ãŠããããã®ç²ŸåºŠã¯å€§ããå€åããå®å®ããŠããŸããã ããå°ãè€éãªLPãã¶ã€ã³æ§æã§ã³ãŒãçæã詊ã ã»ãšãã©ã®ã»ã¯ã·ã§ã³ãç»åãšãªã£ãŠãããã¶ã€ã³æ§æã§ããã°ãåè¿°ã®æ¹æ³ã§ãããªãLPã®éçºãã·ã§ãŒãã«ããã§ãããã§ããããããã£ãã±ãŒã¹ã ãã§ã¯ãªãããã§ããããå°ãæ§æèŠçŽ ãå€ããã®ã§ã¿ãŠã¿ãŸãããã Figmaã®æ§é ä»åãAuto Layoutèšå®ã¯äžéšã«èšå®ããŠããŸãããèŠçŽ ããã®é
眮ã¯å
ã»ã©ããããè€éã§ãã test3ïŒAuto LayoutïŒ âââ nutritionïŒFrameïŒ âââ titleïŒGroupïŒ â âââ icon_pointïŒImageïŒ â âââ nutrition_titleïŒImageïŒ â âââ nutrition_title_bgïŒImageïŒ âââ æ é€åºæºïŒAuto LayoutïŒ âââ Group 31ïŒGroupïŒ â âââ ç³è³ªã»è質ã»å¡©åã»éèéãªã©8é
ç®ã®æ é€åºæºïŒTextïŒ â âââ Rectangle 25ïŒRectangleïŒ âââ nutrition_ingredients_imgïŒImageïŒ âââ â»äžèšã«åãããŠè質(10~20g)ãçæ°Žåç©(15~35g)ã®åºæºãèšå®ïŒTextïŒ LPçæ å
ã»ã©ãšåãæç€ºã§LPçæãããŠã¿ãŸãã 以äžã®figmaã®ãã¶ã€ã³ãåç
§ããŠãã³ãŒãã£ã³ã°ãè¡ã£ãŠãã ããã @<figmaã®è©²åœã»ã¯ã·ã§ã³ã®URL> çæãããLPãã¿ãŠã¿ããšãã¶ã€ã³ã«æ¯ã¹ãŠã倧ãã厩ããŠããããšãããããŸãã 絶察å€ã§éãªã£ãŠæ§æãããŠããèŠçŽ ã¯äžã€ã®ç»åãšããŠæ±ã 倧ãã厩ããéšåã¯ä»¥äžã®titleã®Groupé
äžã®èŠçŽ ã§ããã test3ïŒAuto LayoutïŒ âââ nutritionïŒFrameïŒ âââ titleïŒGroupïŒ âââ icon_pointïŒImageïŒ âââ nutrition_titleïŒImageïŒ âââ nutrition_title_bgïŒImageïŒ ä»åã®Figmaãã¶ã€ã³ã§ã¯3ã€ã®ç»åã§äžã€ã®ããããŒã»ã¯ã·ã§ã³ãæ§æããŠããŸããããããã¯åè¿°ããããã«çµ¶å¯Ÿå€ãèŠæãšããMCPã§ã¯ã³ãŒãçæã®ã¯ãªãªãã£ãäžãããŸããå¯èœãªéãããããã£ãèŠçŽ ã¯äžã€ã®ç»åã«ãŸãšãããšèªåçæã楜ã«ãªããŸãã åäžããã¹ãéã§éãæåãµã€ãºãè²ã䜿ãå Žåã¯ããã¹ãããšåãã Figmaã§ã¯åäžããã¹ãããŒãã§ãéäžããå¥ã®æåãµã€ãºãè²ãé©çšããããšãå¯èœã§ããä»åã ãšãç³è³ªã»è質ã»å¡©åã»éèéãªã©8é
ç®ã®æ é€åºæºãã®éšåã¯ãã¶ã€ã³ã ãšã8é
ç®ã®æ é€åºæºãã®éšåã®ããã¹ããµã€ãºã倧ãããããã¹ãã«ã©ãŒãç·ã«å€ãã£ãŠããŸãã ããããMCPã§ãã¶ã€ã³ããŒã¿ãååŸãããšãã®æ
å ±ãLLMã«æž¡ãéçšã§æ¬ èœããŠããŸããŸãã以äžã¯MCPã§ã®ããŒã«å¿çã®è©²åœç®æãæç²ãããã®ã§ããFigmaãšããŠã¯overrideããstyleæ
å ±ã¯æã£ãŠããããã§ãããå°ãªããšãv0.2.1ã®Figma-Context-MCPã§ã¯ãã®ã¹ã¿ã€ãªã³ã°ã«ã¯å¯Ÿå¿ããŠããªãããã§ãã children: - id: '5414:5619' name: ç³è³ªã»è質ã»å¡©åã»éèéãªã© 8é
ç®ã®æ é€åºæº type: TEXT textStyle: style_S5EO4M fills: fill_WTN9RR layout: layout_8PK5H6 text: |- ç³è³ªã»è質ã»å¡©åã»éèéãªã© 8é
ç®ã®æ é€åºæº globalVars: styles: style_S5EO4M: fontFamily: Noto Sans fontWeight: 700 fontSize: 14 lineHeight: 1.3620000566755022em letterSpacing: 10% textAlignHorizontal: CENTER textAlignVertical: TOP fill_WTN9RR: - '#322012' ããã§ãããããã¶ã€ã³ãLPã«åæ ãããããã«ã¯ããã¹ãããŒãèªäœãåããŠé
眮ããããšã§èªèããããšãã§ããŸãã Figmaã®æ§æãä¿®æ£ããŠLPãåçæ ããã2ç¹ãæ¹åã§ããããã«Figmaã®æ§æãèŠçŽããŠãããŸãã section_titleã§1ã€ã®ç»åã«ãã text_wrapperé
äžã§ããããã¹ã¿ã€ã«ã®éãããã¹ããé
眮 Figmaã®æçµæ§æã¯ä»¥äžã®ããã«ãªããŸãã test3ïŒAuto LayoutïŒ âââ nutritionïŒFrameïŒ âââ section_titleïŒImageïŒ âââ æ é€åºæºïŒAuto LayoutïŒ âââ Group 31ïŒGroupïŒ â âââ text_wrapperïŒAuto LayoutïŒ â â âââ ç³è³ªã»è質ã»å¡©åã»éèéãªã©ïŒTextïŒ â â âââ 8é
ç®ã®æ é€åºæºïŒTextïŒ â âââ Rectangle 25ïŒRectangleïŒ âââ nutrition_ingredients_imgïŒImageïŒ âââ â»äžèšã«åãããŠè質(10~20g)ãçæ°Žåç©(15~35g)ã®åºæºãèšå®ïŒTextïŒ ãã®ç¶æ
ã§å床çæãããŠã¿ãŸãã çæãããçµæã¯ãäžéšã«ç¡é§ãªpaddingãååšããŠããŸã£ãŠããŸãããããã ãæ¶ãã°ãåçŸåºŠã¯é«ããã§ãã ã«ã«ãŒã»ã«èŠçŽ ã®ããLPãã¶ã€ã³æ§æã§ã³ãŒãçæãè©Šã æ¬¡ã«ãã¶ã€ã³ãã³ãŒãã®ã¹ã¿ã€ãªã³ã°ãè€éãªã«ã«ãŒã»ã«èŠçŽ ã®ãã¶ã€ã³ã®ã³ãŒãçæãæ€èšŒããŠã¿ãŸãã Figmaã®æ§æ Auto Layoutæ©èœã䜿ã£ãŠãmenu_otherãã«ã«ãŒã»ã«ã®èŠçŽ ãšããŠé
眮ãããŠããŸãã test5ïŒAuto LayoutïŒ âââ Frame 74ïŒAuto LayoutïŒ âââ ãã®ä»ã®ã¡ãã¥ãŒïŒTextïŒ âââ menuïŒFrameïŒ âââ FrameïŒAuto LayoutïŒ âââ menu_otherïŒFrameïŒ âââ menu_otherïŒFrameïŒ âââ menu_otherïŒFrameïŒ âââ menu_otherïŒFrameïŒ âââ menu_otherïŒFrameïŒ âââ menu_otherïŒFrameïŒ âââ menu_otherïŒFrameïŒ âââ menu_otherïŒFrameïŒ âââ menu_otherïŒFrameïŒ LPçæ LPçæãããŠã¿ãŸãã 以äžã®figmaã®ãã¶ã€ã³ãåç
§ããŠãã³ãŒãã£ã³ã°ãè¡ã£ãŠãã ããã @<figmaã®è©²åœã»ã¯ã·ã§ã³ã®URL> çæãããLPãã¿ãŠã¿ããšããããã«ã«ãŒã»ã«ãèªèã§ããã«çžŠäžŠã³ã«ãªã£ãŠããŸãã æå³ã®ããèŠçŽ åã§ã³ãŒãã®çæç²ŸåºŠãé«ãã å
¬åŒããã¥ã¡ã³ãã® Best Practices ã§Auto Layoutãšäžç·ã«èªãããŠããã®ãFigmaäžã§ã®åœåã«ã€ããŠã§ãã Name your frames and groups - Protip: Try Figma's AI to automatically generate names ããã¯åçŽã«ååãã€ããã°ããã®ã§ã¯ãªããLLMãçæããã³ãŒãã®htmlæ§é ãã¹ã¿ã€ã«ãæ£ãããªãããã«ãã®èŠçŽ ãé©åã«è¡šããååã«ããªããšãããªããšããããšã§ãã ãšã³ãžãã¢ã§ããã°ã倿°ãhtmlã®classåã«å¯ŸããŠæ°ãã€ããããã«Figmaã®èŠçŽ ã«å¯Ÿããåœåãã³ãŒãã®çæç²ŸåºŠã«é¢ãã£ãŠããŸãã ä»åã®ã«ã«ãŒã»ã«ã§ããã°ã«ã«ãŒã»ã«ã®èŠçŽ ã ãšãããããã«åœåããã®ãæãŸããã§ãããã test5ïŒAuto LayoutïŒ âââ Frame 74ïŒAuto LayoutïŒ âââ ãã®ä»ã®ã¡ãã¥ãŒïŒTextïŒ âââ menuïŒFrameïŒ âââ carousel_containerïŒAuto LayoutïŒ âââ carousel_itemïŒFrameïŒ âââ carousel_itemïŒFrameïŒ âââ carousel_itemïŒFrameïŒ âââ carousel_itemïŒFrameïŒ âââ carousel_itemïŒFrameïŒ âââ carousel_itemïŒFrameïŒ âââ carousel_itemïŒFrameïŒ âââ carousel_itemïŒFrameïŒ âââ carousel_itemïŒFrameïŒ åœåã ãã®éãã§ãããLPãçæããŠã¿ããšä»¥åãšå€ãã£ãŠã«ã«ãŒã»ã«åœ¢åŒã§ã®ã¹ã¿ã€ãªã³ã°ãé©çšãããŸãããã ãã2ã€ã®ä¿®æ£ã¯å¿
èŠã«ãªããŸãã itemèŠçŽ ã®ç»åã®çµ¶å¯Ÿå€ãèªèã§ããªãã®ã§itemããšç»ååãæ€èš äž¡åŽã®paddingèŠçŽ ãæé€ ãã®ä»: å®å®ããã³ãŒãçæãããããã®Cursorã«ãŒã« ä»åã®ãããã®æ€èšŒã§äœåºŠãç¹°ãè¿ãçæãããŠãããšæåãäžå®å®ãªã±ãŒã¹ããã£ãã®ã§æäœéã®ã«ãŒã«ãšããŠ./cursor/rulesã«ä»¥äžãé
眮ããŸããã ## ã¬ã€ãã©ã€ã³ - get_figma_dataã§ã¯å¿
ãnodeIdãæå®ããŠãã ããã - download_figma_imagesã倱æããå Žåã¯æ£ããJSON圢åŒã§ç»åã®ããŠã³ããŒããå床詊ã¿ãŠãã ããã - ç»åã¯backgroundèŠçŽ ã§ãªãéããhtmläžã§imgã¿ã°ã䜿ã£ãŠãã ããã get_figma_dataã§ã¯å¿
ãnodeIdãæå®ããŠãã ããã äœåãæç€ºãåºããŠãããšããŸã«æž¡ããURLã®ã»ã¯ã·ã§ã³æ
å ±ãç¡èŠããŠããã¡ã€ã«æå®ã®ã¿ã§figmaã®ãã¶ã€ã³ããŒã¿ãååŸããããšããŸãããã¡ã€ã«ã«ãã¶ã€ã³ããŒã¿ãå€ããšcontextæ
å ±ãå€ããŠã¹ã¿ãã¯ããŠããŸãã®ã§ãå¿ããªãããã«ã«ãŒã«ãå
¥ããŠããŸãã download_figma_imagesã倱æããå Žåã¯æ£ããJSON圢åŒã§ç»åã®ããŠã³ããŒããå床詊ã¿ãŠãã ããã 2025幎4æ27æ¥æç¹ã§ã¯ç»åã®ããŠã³ããŒãã¯ããªãäžå®å®ã§ãinvalid parameterããšãã圢ã§ãšã©ãŒãé »åºããŸãããã¡ããšã«ã¯ãªããŸããããªãã©ã€ãæç¢ºã«æç€ºåºãããããšã§æå確çã¯å°ãäžãããŸããã ç»åã¯backgroundèŠçŽ ã§ãªãéããhtmlã®imgã¿ã°ã䜿ã£ãŠãã ããã ããŸã«figmaã®ç»åãcssã®background-imageãšããŠå
šãŠåç
§ããŠããŸããã¹ã¿ã€ã«ã倧ãã厩ããããšããããŸãããåºæ¬çã«ã¯imgã¿ã°ã䜿ã£ãŠç»åãé
眮ãã€ã€ãåœåã§ background_* ãšæžããŠãããšãã ãã¯background-imageãšããŠäœ¿ã£ãŠããããªã©äœ¿ãåãããšè¯ãããã§ãã ãŸãšã ãŸã ãŸã æ€èšŒã¯è¶³ããªãã§ãããããããŠFigmaã®MCPã䜿ã£ãŠã¿ããšçŸç¶ã§ã¯äººéããã¶ã€ã³ããã³ãŒããèµ·ãããŠãããã倧ããªåé¡ã«ãªããªãéšåã§ãAIã«çæããããšãªããšã²ãšå·¥å€«å¿
èŠãªã±ãŒã¹ãå€ãèŠããŠããŸããã ä»åŸã®æ¥åã§æŽ»çšã§ããã¬ãã«ãŸã§å°éããã«ã¯ããã«AIãMCPã«çžæ§ã®è¯ãFigmaã®ãã¶ã€ã³ææ³ãèŠã€ããçµã¿ç«ãŠãŠããããã1ããèããããšã倧åã«ãªããããªã®ã§ããšã³ãžãã¢ããã¶ã€ããŒãããèªåãã¡ã®é åãè¶
ããŠãã³ãã¥ãã±ãŒã·ã§ã³ãåã£ãŠããã¹ãã§ãããã ããããæ¥åã§ã®æŽ»çšã«äŒŽãæ€èšŒã¯çæçã«èŠãã°ãéå¹çã§çŽæ¥æžããæ¹ãæ©ããšæãå Žé¢ã¯äœåºŠããããŸãããããããããã§è²»ãããåŽåãå°æ¥çãªéçºã¹ããŒãã®å€§ããªå·®ã«ãªã£ãŠãããšæãã®ã§ãåŒç€Ÿã§ã¯åŒãç¶ãçæAIãç©æ¥µçã«æŽ»çšããæ¥åæ¹åã«ãã£ã¬ã³ãžããŠãããŸãïŒ ãã²ããã®åãçµã¿ã«èå³ãæã£ãæ¹ã¯äžåºŠã«ãžã¥ã¢ã«é¢è«ã§ã話ããŸãããïŒ
ã¯ããã« ããã«ã¡ã¯ãéçºéšã§iOSãšã³ãžãã¢ãããŠããéå£ã§ãã ä»åã¯ææŠWEEKã«ãŠiOSçããªãã·ã¥ãããã³ã«ãŠã£ãžã§ããæ©èœãå®è£
ããéã®å®è£
æ¹æ³ããå®è£
äžã«çŽé¢ãã課é¡ãšãã®è§£æ±ºæ¹æ³ã«ã€ããŠã話ãããŸããïŒâ»æ¬èšäºã§ã¯iOSçã«ã€ããŠè§£èª¬ããŸãããAndroidçã«ãåæ§ã®æ©èœã远å ããŠããŸãïŒ åŒç€Ÿã®ææŠWEEKã®åãçµã¿ã«ã€ããŠã¯ä»¥äžã®èšäºãã芧ãã ããïŒ tech.every.tv ãŠã£ãžã§ããã«ã€ããŠã¯ä»¥åãŸãšããŠããèšäºãããã®ã§ä»¥äžã®èšäºãã芧ãã ããïŒ tech.every.tv ä»åå®è£
ãããŠã£ãžã§ããã«ã€ã㊠ä»åå®è£
ãããŠã£ãžã§ããã®èŠä»¶ã¯ãã¡ãã§ãã以äžããŽãŒã«ãšããŠäœæããŸããã ããããã¬ã·ãã衚瀺ãã ã¬ã·ãã¯15åæ¯ã«æŽæ°ãã ãŠã£ãžã§ãããã¿ãããããšã¢ããªã®ã¬ã·ã詳现ã§åç»ãåçïŒâ»ã¿ããåŸã®ã¬ã·ã詳现ã®å®è£
ã¯æ¬èšäºã§ã¯çç¥ããŸãïŒ å®æãããŠã£ãžã§ããã¯ãã¡ãã§ãã å®è£
ã®æµã ä»åã¯Xcode16.0ã䜿çšãã WidgetKit ãã¬ãŒã ã¯ãŒã¯ãçšããŠãŠã£ãžã§ãããäœæããŸãã å®è£
ã®æµããšããŠã¯ä»¥äžã®ããã«ãªããŸãã ãŠã£ãžã§ããã¿ãŒã²ããã®å°å
¥ ã¬ã·ãããŒã¿ã®ååŸãšã¿ã€ã ã©ã€ã³ç®¡ç ãŠã£ãžã§ããç»é¢ã®äœæ 1. ãŠã£ãžã§ããã¿ãŒã²ããã®å°å
¥ ãŸããæ¢åã®ã¢ããªãããžã§ã¯ãã«ãŠã£ãžã§ããæ©èœã远å ããããã®ã¿ãŒã²ãããå°å
¥ããŸãã Appleã®ããã¥ã¡ã³ã ã«åŸãã以äžã®æé ã§é²ããŸãã File > New > Target ãéžæãã Widget Extension ãéžæã㊠Next ãæŒããŸãã ãããã¯ãåãæå®ããŸããä»åã¯ã©ã€ãã¢ã¯ãã£ããã£ãã³ã³ãããŒã«æ©èœã¯äœ¿çšããªãããã Include Live Activity ã Include Control ã Include Configuration App Intent ã®ãã§ãã¯ã¯å€ã㊠Finish ãæŒããŸãã æ³šæç¹: æ°ãã« Target ã远å ããããããŠã£ãžã§ããã¯æ¢åã¢ããªãšã¯å¥ã®ã¢ããªãšããŠæ±ãããŸãããã®ããããªãªãŒã¹æã«ã¯Apple Developerãµã€ãã§ãŠã£ãžã§ããçšã® Identifiers ïŒApp IDïŒãç»é²ããå¿
èŠããããŸãã 2. ã¬ã·ãããŒã¿ã®ååŸãšã¿ã€ã ã©ã€ã³ç®¡ç ãŠã£ãžã§ããã«è¡šç€ºããããŒã¿ãååŸãããã€æŽæ°ãããã管çããã®ã TimelineProvider ã®åœ¹å²ã§ãã ã¿ãŒã²ããäœææã«ãåºæ¬ç㪠TimelineProvider ã®ãã³ãã¬ãŒãã³ãŒããçæãããŸãã // åæã®ãã³ãã¬ãŒãã³ãŒãïŒæç²ïŒ struct Provider : TimelineProvider { // ããŒã¿ååŸäžå¯æã®ãã¬ãŒã¹ãã«ããŒè¡šç€ºçšããŒã¿ãå®çŸ© func placeholder ( in context : Context ) -> SimpleEntry { ... } // ãŠã£ãžã§ããã®ã£ã©ãªãŒã§ã®ã¹ãããã·ã§ãã衚瀺çšããŒã¿ãå®çŸ© func getSnapshot ( in context : Context , completion : @escaping ( SimpleEntry ) -> () ) { ... } // ãŠã£ãžã§ããã®è¡šç€ºæŽæ°ã¿ã€ãã³ã°ãšããŒã¿ïŒã¿ã€ã ã©ã€ã³ïŒãå®çŸ© func getTimeline ( in context : Context , completion : @escaping ( Timeline < Entry >) -> () ) { ... } } // ãŠã£ãžã§ããã«è¡šç€ºããããŒã¿ã®åäœ (Entry) struct SimpleEntry : TimelineEntry { let date : Date // ãã®ããŒã¿ã衚瀺ãããã¹ãæ¥æ let emoji : String // 衚瀺ããããŒã¿ïŒåæãã³ãã¬ãŒãïŒ } ä»åå®è£
ããã«ãããã TimelineProvider ã§ä»¥äžã®åŠçãè¡ããŸãã placeholder : ã¬ã·ãããŒã¿ããªãå Žåã®è¡šç€ºå
容ãå®çŸ©ããŸããïŒå®è£
詳现ã¯çç¥ïŒ getSnapshot : ãŠã£ãžã§ããè¿œå æã®ãã¬ãã¥ãŒçšã«ãæåã®ã¬ã·ãæ
å ±ãååŸããŠè¡šç€ºããŸãã getTimeline : APIããã¬ã·ãæ
å ±ãååŸãã15åããšã«è¡šç€ºå
容ãåãæ¿ãããããªã¿ã€ã ã©ã€ã³ãäœæããŸãã 以äžã TimelineProvider åšãã®å®è£
ã³ãŒãå
šäœåã§ããïŒAPIéä¿¡åŠçã®å®è£
ã¯çç¥ããŠããŸãïŒ import WidgetKit import SwiftUI struct Provider : TimelineProvider { // ãã¬ãã¥ãŒçšããŒã¿ååŸ func getSnapshot ( in context : Context , completion : @escaping @Sendable ( RecipeTimelineEntry ) -> Void ) { Task { let result = await fetchRecipes() // ã¬ã·ãæ
å ±ååŸ switch result { case .success( let response ) : if let firstRecipe = response.recipes.first { // æåã®ã¬ã·ãç»åãååŸ let fetchedImage = await loadImage(url : firstRecipe.imageURL ) let recipeEntry = RecipeEntry( id : firstRecipe.id , title : firstRecipe.title , image : fetchedImage // ä»ã®ã¬ã·ãæ
å ±ãèšå® ) completion(RecipeTimelineEntry(date : Date (), recipe : recipeEntry )) // æåã®ã¬ã·ãæ
å ±ãåæ } else { // ã¬ã·ãããªãå Žå completion(RecipeTimelineEntry(date : Date (), recipe : nil )) } case .failure : // APIãšã©ãŒã®å Žå completion(RecipeTimelineEntry(date : Date (), recipe : nil )) } } } // ã¿ã€ã ã©ã€ã³çšããŒã¿ååŸã»çæ func getTimeline ( in context : Context , completion : @escaping @Sendable ( Timeline < RecipeTimelineEntry >) -> Void ) { Task { let result = await fetchRecipes() // ã¬ã·ãæ
å ±ååŸ switch result { case .success( let response ) : if response.recipes.isEmpty { // ã¬ã·ãããªãå Žåã¯ç©ºã®ã¿ã€ã ã©ã€ã³ãè¿ã completion(Timeline(entries : [ RecipeTimelineEntry ( date: Date () , recipe: nil )] , policy : .atEnd)) return } let interval : Int = 15 // æŽæ°ééïŒåïŒ let currentDate = Date() // --- ã¬ã·ã衚瀺ã®åŸªç°æ§ãä¿ã€ããã®èšç® --- let calendar = Calendar(identifier : .gregorian) let midnight = calendar.startOfDay( for : currentDate ) // 仿¥ã®åå0æãååŸ // 仿¥ã®0æããçŸåšæå»ãŸã§ã«çµéããåæ°ãèšç®ãã15åééã§å²ã // ããã«ãããã仿¥ãå§ãŸã£ãŠããäœçªç®ã®15ååºéãããããã let currentTimelineOffset : Int = (calendar.dateComponents([.minute], from : midnight , to : currentDate ).minute ?? 0 ) / interval // --- ãããŸã§ --- var entries : [ RecipeTimelineEntry ] = [] // çŸåšã®åºéãã8ã€å
ãŸã§ïŒ2æéåïŒã®ãšã³ããªãŒãäœæ // ã«ãŒãã®éå§ç¹ã currentTimelineOffset ã«ããããšã§ãgetTimeline ããã€åŒã°ããŠã // ãã®æç¹ããã®é©åãªã¬ã·ãã衚瀺ãããããã«ãã for timelineOffset in currentTimelineOffset ..< currentTimelineOffset + 8 { // 衚瀺ããã¬ã·ãã®ã€ã³ããã¯ã¹ãèšç® (ãªã¹ãã®æ«å°ŸãŸã§è¡ã£ããå
é ã«æ»ã) let recipeIndex = timelineOffset % response.recipes.count let recipe = response.recipes[recipeIndex] // ã¬ã·ãç»åãååŸ let fetchedImage = await loadImage(url : recipe.imageURL ) let recipeEntry = RecipeEntry( id : recipe.id , title : recipe.title , image : fetchedImage // ä»ã®ã¬ã·ãæ
å ±ãèšå® ) // ãã®ã¬ã·ãã衚瀺ããæ¥æãèšç® (仿¥ã®0æãã timelineOffset * 15 ååŸ) if let entryDate = calendar.date(byAdding : .minute, value : timelineOffset * interval, to : midnight ) { entries.append(RecipeTimelineEntry(date : entryDate , recipe : recipeEntry )) } } // çæãããšã³ããªãŒãªã¹ããšãæåŸã®è¡šç€ºãçµãã£ãåŸã«æŽæ°ããããªã·ãŒã§ã¿ã€ã ã©ã€ã³ãäœæ completion(Timeline(entries : entries , policy : .atEnd)) case .failure : // APIãšã©ãŒã®å ŽåããšããããçŸåšã®ããŒã¿ã§çµäº completion(Timeline(entries : [ RecipeTimelineEntry ( date: Date () , recipe: nil )] , policy : .atEnd)) } } } // éåæã§ç»åãèªã¿èŸŒã private func loadImage (url : URL ) async -> Image? { do { let (data, _) = try await URLSession.shared.data(from : url ) if let uiImage = UIImage(data : data ) { return Image(uiImage : uiImage ) } } catch { print( "Image loading error: \( error ) " ) } return nil } } // 1ã€ã®ã¿ã€ã ã©ã€ã³ãšã³ããªãŒãæã€ããŒã¿æ§é struct RecipeTimelineEntry : TimelineEntry { let date : Date // ãã®ããŒã¿ã衚瀺ãããæ¥æ let recipe : RecipeEntry? // 衚瀺ããã¬ã·ãæ
å ± } // ã¬ã·ãæ
å ±ã®è©³çްãä¿æããæ§é äœ struct RecipeEntry { let id : Int64 // ã¬ã·ãID let title : String // ã¬ã·ãã¿ã€ãã« let image : Image? // ã¬ã·ãç»å (SwiftUIçš) // 以äžãå¿
èŠã«å¿ããŠä»ã®ã¬ã·ãæ
å ± } getSnapshot ã®è§£èª¬ getSnapshot ã¯ããŠãŒã¶ãŒããŠã£ãžã§ããã远å ããããšããéã«è¡šç€ºããããã¬ãã¥ãŒç»é¢ã®ããã®ãã®ã§ããããã§ã¯ã¬ã·ãæ
å ±ã®æåã®1ä»¶ ( response.recipes.first ) ã䜿ã£ãŠãã¬ãã¥ãŒçšã® SimpleEntry ãäœæãã completion ãã³ãã©ã§è¿ããŠããŸãã ã¡ãªã¿ã«ãã¬ãã¥ãŒè¡šç€ºã¯ãããªæãã«ãªããŸãã getTimeline ã®è§£èª¬ getTimeline ã¯ãŠã£ãžã§ããã®è¡šç€ºå
容ãšãã®æŽæ°ã¿ã€ãã³ã°ãå®çŸ©ããŸãã 課é¡: ã¬ã·ãã®åŸªç°è¡šç€º èŠä»¶ã¯ã15åããšã«ã¬ã·ããæŽæ°ãããããšãªã®ã§ãåçŽã«15åééã®ãšã³ããªãŒããªã¹ãã®å
é ããé ã«çæããããšãèããããŸãããããã WidgetKit ã®ã¿ã€ã ã©ã€ã³ã®æŽæ°ã¿ã€ãã³ã°ã¯OSã«ãã£ãŠæé©åãããŠãããå¿
ãããäœæããå
šãšã³ããªãŒïŒä»åã¯2æéåïŒã衚瀺ãããåŸã«æ¬¡ã® getTimeline ãåŒã°ãããšã¯éãããOSã«ããæŽæ°ãé »ç¹ã«èµ·ãã£ãå Žåã«ãæåã®æ°åã®ã¬ã·ãã°ããã衚瀺ããç¶ããããšããåé¡ãçºçãåŸãŸãã 解決ç: çŸåšæå»ã«å¿ããéå§äœçœ®ã®èšç® ãã®åé¡ãåé¿ããã¬ã·ãã埪ç°çã«è¡šç€ºãããããã以äžã®èšç®ãè¡ã£ãŠããŸãã let calendar = Calendar(identifier : .gregorian) let midnight = calendar.startOfDay( for : currentDate ) // 仿¥ã®åå0æ (åºæºç¹) // 仿¥ã®0æããçŸåšæå»ãŸã§ã«ã15åéã®åºç»ããäœåçµéããããèšç® let currentTimelineOffset : Int = (calendar.dateComponents([.minute], from : midnight , to : currentDate ).minute ?? 0 ) / interval Calendar ã䜿ã£ãŠã仿¥ã®åå0æ ( midnight )ããååŸããŸããããã1æ¥ã®åºæºç¹ãšããŸãã dateComponents ã§ãåå0æããçŸåšæå» ( currentDate ) ãŸã§ã®çµéæéããåãã§èšç®ããŸãã ãã®çµéåæ°ã interval (15) ã§å²ããŸãããã®çµæã currentTimelineOffset ãšãªããã仿¥ãå§ãŸã£ãŠããçŸåšæå»ãŸã§ã«ã15åã®åºåããäœåãã£ãããã瀺ããŸãã ã¿ã€ã ã©ã€ã³ãšã³ããªãŒã®çæ ãã® currentTimelineOffset ã䜿ã£ãŠã for ã«ãŒãã§ã¿ã€ã ã©ã€ã³ãšã³ããªãŒãçæããŸãã // çŸåšã®åºé (currentTimelineOffset) ãã8ã€å
ãŸã§ (2æéå) ã®ãšã³ããªãŒãäœæ for timelineOffset in currentTimelineOffset ..< currentTimelineOffset + 8 { // ã¬ã·ããªã¹ãå
ã§åŸªç°ããããã«ã€ã³ããã¯ã¹ãèšç® let recipeIndex = timelineOffset % response.recipes.count let recipe = response.recipes[recipeIndex] // ... (ç»åååŸãRecipeEntryäœæ) ... // ãšã³ããªãŒã衚瀺ãããã¹ãæ¥æãèšç® if let entryDate = calendar.date(byAdding : .minute, value : timelineOffset * interval, to : midnight ) { entries.append(SimpleEntry(date : entryDate , recipe : recipeEntry )) } } // çæãããšã³ããªãŒãªã¹ãã§ã¿ã€ã ã©ã€ã³ãäœæã.atEnd ã¯ãªã¹ãã®æåŸã衚瀺åŸã«æŽæ°ãä¿ã completion(Timeline(entries : entries , policy : .atEnd)) ã«ãŒãéå§ç¹ã currentTimelineOffset ã«ããããšã§ãOSããã€ãŠã£ãžã§ãããæŽæ°ããŠãããã®æå»ã«å¿ããã¬ã·ããã衚瀺ãå§ãŸãããã«èª¿æŽãããŸããããã«ãããåžžã«ãªã¹ãã®å
é ããã¹ã±ãžã¥ãŒã«ãäœãããŠããŸãã®ãé²ãã§ããŸãã ããã«ãã«ãŒãå
ã§äœ¿ãã¬ã·ãçªå·ã¯ let recipeIndex = timelineOffset % response.recipes.count ã§èšç®ããŠããŸããããã«ãã£ãŠãã¬ã·ããªã¹ãã®æåŸãŸã§è¡šç€ºãããæ¬¡ã¯å
é ã®ã¬ã·ãã«æ»ãããã«åŸªç°çã«è¡šç€ºã§ããŸãã ç»åã®æ±ã ç»åã衚瀺ããéã« AsyncImage ã䜿çšããããšãã§ããŸããã§ããããªã®ã§ã TimelineProvider åŽã§ Image ã«å€æããŠãã SimpleEntry ã«å«ããããã«ããŠããŸãã // éåæã§ç»åãèªã¿èŸŒã private func loadImage (url : URL ) async -> Image? { do { let (data, _) = try await URLSession.shared.data(from : url ) if let uiImage = UIImage(data : data ) { return Image(uiImage : uiImage ) } } catch { print( "Image loading error: \( error ) " ) } return nil } ãŠã£ãžã§ããç»é¢äœæ ãŠã£ãžã§ããã®UI㯠SwiftUI ã䜿ã£ãŠæ§ç¯ããŸãã ãŸãã Widget ãããã³ã«ã«æºæ ããæ§é äœ (äŸ: RecipeWidget ) ã§ãŠã£ãžã§ããå
šäœã®èšå®ãè¡ããŸãã ããã§ã .supportedFamilies ã¢ãã£ãã¡ã€ã¢ã䜿ã£ãŠããµããŒããããŠã£ãžã§ããã®ãµã€ãºïŒä»å㯠.systemSmall ãš .systemMedium ïŒãæå®ããŸãã ãŸãã .contentMarginsDisabled() ã§ããã©ã«ããããŒãžã³ãç¡å¹ããŠç»é¢ãã£ã±ãã«ç»åã衚瀺ã§ããããã«ããŠããŸãã struct RecipeWidget : Widget { let kind : String = "RecipeWidget" var body : some WidgetConfiguration { StaticConfiguration(kind : kind , provider : Provider ()) { entry in RecipeWidgetEntryView(entry : entry ) .containerBackground(.fill.tertiary, for : .widget) } .contentMarginsDisabled() // ãŠã£ãžã§ããã®ããã©ã«ãããŒãžã³ãç¡å¹ã«ãã .configurationDisplayName( "æ¬æ¥ã®ããããã¬ã·ã" ) .supportedFamilies([.systemSmall, .systemMedium]) // 察å¿ãµã€ãºãæå® } } 次ã«ãå®éã«ãŠã£ãžã§ããã®å
容ã衚瀺ãã View (äŸ: RecipeWidgetEntryView ) ãäœæããŸãã ãµã€ãºååŸ: @Environment(\.widgetFamily) ã䜿ã£ãŠãçŸåšè¡šç€ºãããŠãããŠã£ãžã§ããã®ãµã€ãº ( .systemSmall ãªã©) ãååŸããŸãã ããŒã¿åãåã: var entry: Provider.Entry ã®ããã« TimelineProvider ããæž¡ãããããŒã¿ïŒ SimpleEntry ïŒãåãåãããããã£ãå®çŸ©ããŸãã Linkã§ã¿ããæã®åäœãèšå®: Link ã䜿ã£ãŠãŠã£ãžã§ããå
šäœãŸãã¯äžéšãã©ããããã¿ãããããéã«æå®ãã URL ã¹ããŒã ("ã¢ããªã®URLã¹ããŒã ://ã¬ã·ã詳现ãã¹/(recipe.id)") ã䜿ã£ãŠã¢ããªæ¬äœã®ç¹å®ç»é¢ãžé·ç§»ãããŸãã ãµã€ãºã«å¿ããŠè¡šç€ºãåãæ¿ã: family ã«å¿ããŠSmallãMediumãŠã£ãžã§ããã«åãæ¿ãã struct RecipeWidgetEntryView : View { @Environment ( \.widgetFamily ) var family // ãµã€ãºååŸ var entry : Provider.Entry // 2. ããŒã¿åãåã var body : some View { if let recipe = entry.recipe { // 3. Linkã§ã¿ããæã®åäœãèšå® Link(destination : URL (string : "ã¢ããªã®URLã¹ããŒã ://ã¬ã·ã詳现ãã¹/ \( recipe.id ) " ) ! ) { // 4. ãµã€ãºã«å¿ããŠè¡šç€ºãåãæ¿ã if family == .systemSmall { SmallWidgetView(recipe : recipe ) } else { MediumWidgetView(recipe : recipe ) } } } } } struct SmallWidgetView : View { let recipe : RecipeEntry // ... Smallãµã€ãºçšã®ã¬ã€ã¢ãŠã ... var body : some View { Text( "Medium: \( recipe.title ) " ) } // çç¥ } struct MediumWidgetView : View { let recipe : RecipeEntry // ... Mediumãµã€ãºçšã®ã¬ã€ã¢ãŠã ... var body : some View { Text( "Medium: \( recipe.title ) " ) } // çç¥ } ãã®ããã«ã Widget æ§é äœã§å
šäœèšå®ãè¡ãã衚瀺çšã® View ã§ããŒã¿ããµã€ãºã«å¿ããUIæ§ç¯ããããšã§ããŠã£ãžã§ããç»é¢ãäœæããŸãã çµããã« ä»åã®ææŠWEEKã§ã®ãŠã£ãžã§ããæ©èœè¿œå ã«ããããŠãŒã¶ãŒã¯ã¢ããªãèµ·åãããšãããŒã ç»é¢ã§æè»œã«ããããã¬ã·ãããã§ãã¯ã§ããããã«ãªããŸãããããã«ãã£ãŠã¢ããªã®èµ·åçã®åäžã«ç¹ããããšãæåŸ
ããŠããŸãã ãŠã£ãžã§ããéçºã¯ãã¿ã€ã ã©ã€ã³ç®¡çãªã©éåžžã®ã¢ããªéçºãšã¯ç°ãªãèæ
®ç¹ããããŸãããããã®ææŠãéããŠWidgetKitã®ç¥èŠãæ·±ããããšãã§ããä»åŸã®éçºã«ã掻ããã貎éãªçµéšãšãªããŸããã ä»åå®è£
ãããŠã£ãžã§ããæ©èœã¯æ¢ã«ãªãªãŒã¹æžã¿ã§ãã®ã§ãããªãã·ã¥ãããã³ãã䜿ãã®æ¹ã¯ããã²ããŒã ç»é¢ã«è¿œå ããŠè©ŠããŠã¿ãŠãã ããïŒ æåŸãŸã§ãèªã¿ããã ããããããšãããããŸããã
ã¬ãããã¯ããã«åŒç€Ÿããã¯ããã°ã玹ä»ããŠããããŸãã å¬ãããã¥ãŒã¹ ããã¯ããã°ã®äŸ¡å€ ããããèšäºã®ãçŽ¹ä» ããã¯ãšã³ãéçº ããã³ããšã³ãéçº ã€ã³ãã©ã»ã¯ã©ãŠã ã¢ããªéçº AIæè¡ æ©æ¢°åŠç¿ ä»åŸã®å±æ æåŸã« ãããã«ã¡ã¯ãéçºæ¬éš RetailHUBéçºéš NetSuperã°ã«ãŒãå
ŒãCTO 宀 Dev Enable ã°ã«ãŒãã«æå±ããããŒã¯ðŠ
ã¢ã€ðïžã§ãã å¬ãããã¥ãŒã¹ ãå
æ¥ãå¬ãããã¥ãŒã¹ãå±ããŸãããã¬ãããã¯æ ªåŒäŒç€Ÿæ§ãéå¶ãããã¬ãããã¯ããªãŒã©ã³ã¹ããšãããã©ãããã©ãŒã ã§ãåŒç€Ÿã®ããã¯ããã°ã玹ä»ããŠããããŸããïŒ freelance.levtech.jp ããã®èšäºã§ã¯ããšã³ãžãã¢ã®ã¹ãã«ã¢ããã«åœ¹ç«ã€æ§ã
ãªäŒæ¥ã®ããã¯ããã°ã玹ä»ãããŠããŸããåŒç€Ÿä»¥å€ã«ããå€ãã®äŒæ¥ã®ããã°ãæ²èŒãããŠãããæè¡æ
å ±ã®å®åº«ãšãªã£ãŠããŸãã ããã¯ããã°ã®äŸ¡å€ ãããã¯ããã°ã¯ãåãªãæè¡æ
å ±ã®å
±æã ãã§ãªããåäŒæ¥ã®éçºæåã課é¡è§£æ±ºã®ã¢ãããŒããå£éèŠãããšãã§ãã貎éãªãªãœãŒã¹ã§ããåŒç€Ÿã®ããã°ãããããªäŸ¡å€ãæäŸã§ããããå¿ãããŠããŸãã ãåŒç€Ÿã®ããã¯ããã°ã¯ãå®åã«å³ããå
·äœçãªå
容ãäžå¿ã§ãããã¯ãšã³ãããããã³ããšã³ããã€ã³ãã©ãã¢ããªéçºãæ©æ¢°åŠç¿ãªã©å€å²ã«ãããèšäºãé«é »åºŠã§æçš¿ããŠããŸããæ¯é±2åã®ããã°å
¬éãç®æšã«ãææ°ã®æè¡ååãå®è·µçãªç¥èŠãå
±æããŠããŸãã ãç¹ã«ãAIæè¡ã®æŽ»çšã¯åŒç€Ÿã®éèŠãªæŠç¥ã®äžã€ã§ãããä»åŸãç©æ¥µçã«æ
å ±çºä¿¡ããŠããäºå®ã§ãã ããããèšäºã®ãçŽ¹ä» ãåŒç€Ÿã®ããã¯ããã°ãããååéã®ããããèšäºãã玹ä»ããŸãïŒ ããã¯ãšã³ãéçº tech.every.tv tech.every.tv ããã³ããšã³ãéçº tech.every.tv tech.every.tv ã€ã³ãã©ã»ã¯ã©ãŠã tech.every.tv tech.every.tv ã¢ããªéçº tech.every.tv tech.every.tv AIæè¡ tech.every.tv tech.every.tv æ©æ¢°åŠç¿ tech.every.tv tech.every.tv ä»åŸã®å±æ ããã®ãããªåœ¢ã§å€éšããè©äŸ¡ããã ããããšã¯ãåŒç€Ÿã®ããã¯ããã°æŽ»åã®å±ã¿ã«ãªããŸããä»åŸãããã質ã®é«ãæè¡æ
å ±ãçºä¿¡ãç¶ããŠãããããšèããŠããŸãã ãèªè
ã®çæ§ã«ã¯ãåŒãç¶ãåŒç€Ÿã®ããã¯ããã°ããæ¥œãã¿ããã ããã°å¹žãã§ãããŸããããã°ãéããŠåŒç€Ÿã«èå³ãæã£ãŠããã ããæ¹ã¯ããã²æ¡çšæ
å ±ãã芧ãã ããã æåŸã« ãšããªãŒã§ã¯ããšãã«åã仲éãåéããŠããŸãã ããã¯ããã°ãèªãã§å°ãã§ããšããªãŒã«èå³ãæã£ãŠããã ããæ¹ã¯ããã²äžåºŠã«ãžã¥ã¢ã«é¢è«ã«ãè¶ããã ããïŒ corp.every.tv
ããŒã¿&AIããŒã ã§ããŒã¿ãšã³ãžãã¢ãæ
åœããŠããå¡ç°ã§ãã ã¯ããã« ãšããªãŒã§ã¯ããŒã¿åºæ¿ã®æŽ»çšã®æ¹æ³ãšããŠRedashãšAmazon QuickSightãå©çšããŠããŸãã ããžãã¹è·ã§ãSQLã䜿ã£ãããŒã¿ååŸã»åæã¯äžå®çšåºŠã§ããç¶æ³ã§ã¯ãããŸããããŸã ãŸã å©çšããã«ããã£ãŠå£ãããããšãäºå®ã§ãã ä»åãAmazon QuickSightã«æèŒãããŠããçæAIã¢ã·ã¹ã¿ã³ãã§ãã Amazon Q ã«æ°æ©èœãã·ããªãªåæããGAãããŸããã æ¬èšäºã§ã¯ããã®Amazon Q in QuickSightã® ã·ããªãªåææ©èœ ã«ãã©ãŒã«ã¹ããåŒç€ŸãµãŒãã¹ã®ããªãã·ã¥ãããã³ã®æ€çŽ¢ããŒã¿ãäŸã«ãã®å¯èœæ§ãæ€èšŒããŸãã Amazon QuickSight ãšã¯ïŒ Amazon QuickSight ã¯ãAWSãæäŸããã¹ã±ãŒã©ãã«ã§ãµãŒããŒã¬ã¹ãªã¯ã©ãŠãããŒã¹ã®ããžãã¹ã€ã³ããªãžã§ã³ã¹ïŒBIïŒãµãŒãã¹ã§ãã æ§ã
ãªããŒã¿ãœãŒã¹ã«æ¥ç¶ããã€ã³ã¿ã©ã¯ãã£ããªããã·ã¥ããŒããã¬ããŒããç°¡åã«äœæã»å
±æã§ããŸããç¹åŸŽãšããŠåŸé課éã¢ãã«ã§ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®ç®¡çãäžèŠãªç¹ã«ãããŸãã Amazon Q ãšã¯ïŒ (QuickSight æèã§) Amazon Q ã¯ãAWSãéçºããçæAIã¢ã·ã¹ã¿ã³ãã§ããããã¥ã¡ã³ãã®èŠçŽãã³ãŒãçæãªã©ãæ§ã
ãªæ¥åãæ¯æŽããæ©èœãæã£ãŠããŸããQuickSightã«ããã Amazon Q ã¯ããã®çæAIæ©èœãããŒã¿åæã«å¿çšãããã®ã§ãã å
·äœçã«ã¯ãQuickSight äžã§ãå»å¹Žã®å£²äžããã3ã®è£œåã¯ïŒããå
æãšæ¯èŒããŠã³ã³ããŒãžã§ã³çã¯ã©ãå€åããïŒããšãã£ãèªç¶èšèªã§è³ªåãããšæå³ãçè§£ããé©åãªããŒã¿åæãè¡ããã°ã©ãã衚ããããã¯æç« ã«ãããµããªãŒãšããŠçµæãè¿ããŠãããŸãã ã·ããªãªåæããªãå¿
èŠã ããŒã¿ãå
ã«ããåæã¯ä»®èª¬ãç«ãŠãŠå¿
èŠãªããŒã¿ãéãåæãçµæãåºåãæ€èšŒãããšããæµããäœåãç¹°ãè¿ãããšã§å®æœããŠãããŸãã 人éã§ã¯ããããã®ãã§ãŒãºããšã«æéãããã¿ã¹ã¯ãé²ããŠãããŸããã çæAIãæŽ»çšããåæã ãšä»®èª¬ãç«ãŠãæã«ãããåºåè²»ãxx%å¢ãããã...ããšããææ§ãªå
容ããåºåè²»ãšããã¡ããªã¯ã¹ãããçŸåšã®å€ããxx%å¢å ãããããšããä»®èª¬ã®æ¡ä»¶ãç¹å®ãããã®å
容ã«åºã¥ããŠããŒã¿ããã®é¢é£æ§ã倿ãé©åãªããŒã¿ã®å©çšãéèšãè¡ã£ãŠãããŸãã ãŸããéèšããããŒã¿ã®ã·ãã¥ã¬ãŒã·ã§ã³ãçµæã®èŠèŠåãŸã§å¹
åºã察å¿ãè¡ãããšãã§ããåŸããçµè«ãŸã§ã®éçãèªåçã«åºåããããšã«ãã£ãŠåæã®å¹
ã¯åºãããšæã£ãŠããŸãã ãã®ãããªä»çµã¿ã掻çšããããšã§ã¢ã€ãã¢ãçŽ æ©ãæ€èšŒãããæ¢åããã»ã¹ã®å¹çåãå³ããããã«ãªã£ãŠãããšèããŠããŸãã å®éã«å©çšããŠã¿ã â»ä»åã玹ä»ããæ©èœã¯å·çæç¹ã§å©çšå¯èœãªæš©éããªãŒãžã§ã³ã«å¶éããããŸãã®ã§ãå©çšç°å¢ã確èªããäžã§å©çšããŠãã ããã è©²åœæ©èœãå©çšå¯èœãªç¶æ
ã®ãšãã¯å·Šã¡ãã¥ãŒã« Scenarios ã®ã¡ãã¥ãŒã衚瀺ããããããéžæãããšå³äžã« NEW SCENARIO ã®ãã¿ã³ãããã®ã§ããããæ°ããã·ããªãªåæãéå§ã§ããŸãã ãã®åŸå©çšããããŒã¿ãéžæããŸãããã§ã«QuickSightãå©çšããŠããã°ããã·ã¥ããŒãã®ããŒã¿ã䜿ãããšãã§ããŸãããæå
ã«ããCSVãªã©ã®ããŒã¿ãå©çšããããšãå¯èœã§ãã ä»åã¯åŒç€Ÿã¢ããªã®ããªãã·ã¥ãããã³ã®æ€çŽ¢ãã°ã®éèšæžã¿ããŒã¿ãçšããŠåæããŠã¿ãããšæããŸãã ãã®ããŒã¿ã¯æ¥æ¯ã®æ€çŽ¢ã¯ãŒããæ€çŽ¢åæ°ã1æ¥ã®æ€çޢ忰ãªã©ãå
¥ã£ãŠããããŒã¿ãšãªããŸãã ç°¡åãªéèšã®è³ªåãæããŠã¿ã ãã®ããã«è³ªåãæããããšã§è±èªã§ã®åçã«ãªããŸããã質åã«è¿ããåæã¡ãã¥ãŒãæç€ºããŠãããŸãã ä»åã¯è³ªåãšåãå
容㮠Show the top 20 most searched words in the last 7 days ãéžæããŸãã éžæãããšããŒã¹ã®ããŒã¿ã«å¯ŸããŠã®åææ¹æ³ãšãšãã«çµæãåºåãããŸãã â»å
ãšãªã£ãããŒã¿ãæåã§éèšãããšããåæ§ã®çµæãšãªã£ãŠããŸã ãŸãããã®çµæã«å¯ŸããŠè¿œå ã®åæãè¡ãããšãå¯èœã§ è±èã®æ¥æ¯ã®ãã¬ã³ã ã远å åæãããšä»¥äžã®ãããªçµæãšãªããã¡ããå
ããŒã¿ãšäžèŽããŠããŸãã â»ããŒã¿ã¯ãµã³ãã«ãšãªãã®ã§ãå®éã®åŸåãšã¯ç°ãªããŸã åãããŒã¿ãçšããåæãšã㊠éå» 1 é±éã§æãæ€çŽ¢ãããäžäœ 5 ã€ã®æ€çŽ¢ããªã¥ãŒã ã®åŸå ãåºåããŸããã â»ããŒã¿ã¯ãµã³ãã«ãšãªãã®ã§ãå®éã®åŸåãšã¯ç°ãªããŸã ãã®ããã«Step1ããStep5ã®åŠçãçµãŠçµè«ãŸã§åºåãããŸããã åæã¹ãã«ããªãæ¹ã§ãå©çšãããããŒã¿ãæå
ã«ããã°åæã¯ãã¡ããé¢é£ãã远å ã®ç€ºåã ããè¡ããç¶æ
ã«ãªããŸãã ãŸãšã ä»åã¯QuickSightãäŸã«æè»œããšæŽ»çšç¯å²ã®å€§ããã説æããŸããããããã«éãã倿°ã®ããŒã«ãäžã®äžã«ã¯åºãŠããç¶æ³ã§ãã ãããã£ãããŒã«ã«ãããããŒã¿åæã®å°éå®¶ã§ã¯ãªãããžãã¹ãŠãŒã¶ãŒã§ããç¥ãããæ
å ±ãè¿
éã«ãå€è§çã«æ¢çŽ¢ã§ããããã«ãªããšèããŠããŸãã ã¢ã€ãã¢ãçŽ æ©ãæ€èšŒããå€åã«å³å¿ããããã®ããŒã¿ã«åºã¥ããæææ±ºå®ãåãåãã®äºæ¥ã®æé·ã«ãå¯äžã§ããå¯èœæ§ãåºãããŸãã ãã®äžã§äœã䜿ãããã©ã®ããã«è©äŸ¡ãããã¯ããããã®ç¶æ³ã«ãã£ãŠã¡ãªããã»ãã¡ãªãããããããšã¯æããŸããã ããŒã¿ãå®å
šãªç¶æ
ã§å©çšããããšãã§ããç°å¢ãäœã£ãŠãããšããããšã¯ããŒã¿ãšã³ãžãã¢ãšããŠç¶ç¶çã«åãçµãã§ããã¹ãéèŠãªèª²é¡ã ãšæ¹ããŠèªèããŸããã
sealed Class ãšã¯ ãã£ãŒããªã³ã¯ã®å¶åŸ¡ã sealed Class ãå©çšããŠãªãã¡ã¯ã¿ãªã³ã°ããŠã¿ã ãªãã¡ã¯ã¿ãªã³ã°åã®ã³ãŒã ãªãã¡ã¯ã¿ãªã³ã°ã®å
容 䜿çšäŸ 責åãåé¢ããããšã«ããåŸãããæ©æµ sealed Class ã«ããåŸãããæ©æµ çµããã« ãšããªãŒã§å°å£²æ¥çåãåãã®éçºãè¡ã£ãŠãã @kosukeohmura ã§ããç§ã¯æ®æ®µã¯ããã¯ãšã³ãã®éçºãè¡ã£ãŠããŸãããæ°ã¶æã»ã©åãã Flutter ã¢ããªã®éçºã«ãåŸäºããŠãããŸãããšããªãŒã§ã¯ããæ°å¹Žããã€ãã® Flutter ã¢ããªãéçºïŒéçšããŠããŸãã ä»å㯠Flutter ã¢ããªã«æ©èœè¿œå ããäžã§ã sealed Class ã䜿ã£ãŠãªãã¡ã¯ã¿ãªã³ã°ãçµãŠæ©èœè¿œå ããŠã¿ãã®ã§ããã®äŸã玹ä»ããŸãã sealed Class ãšã¯ Dart ã«ããã sealed Class 㯠ãã®ã¯ã©ã¹èªäœã®ã€ã³ã¹ã¿ã³ã¹ãçæã§ããªãç¹ã§ abstract Class ãšäŒŒãŠããŸãã abstract Class ãšç°ãªãç¹ãšããŠã Exhaustiveness checking (æèš³: ç¶²çŸ
æ§ãã§ãã¯) ã«ããã switch æããã¿ãŒã³ãããã³ã°ã§ãµãã¯ã©ã¹ãç¶²çŸ
çã«æ±ããããšããããŸããããã«ãããäŸãã° switch æã§ã±ãŒã¹ã®æžãæŒããååšãããšã³ã³ãã€ã«ãšã©ãŒãšãªãæ°ã¥ãããšãã§ããŸãã enum ã䜿ãããšã§ãç¶²çŸ
æ§ãã§ãã¯ãè¡ããŸãããåæåããããã«ã¯ãã£ãŒã«ããã¡ãœãããæãããããšã¯ã§ããŸãããäžæ¹ abstract Class ã§ã¯ãã£ãŒã«ããã¡ãœãããæã€ããšãã§ããŸãããç¶²çŸ
æ§ãã§ãã¯ã¯è¡ããŸããã sealed Class ã«ã¯ãã¹ãŠã®ãµãã¿ã€ãã¯åããã¡ã€ã«ã«å®çŸ©ãããšããå¶çŽããããŸããããããåãå
¥ããããšã§ç¶²çŸ
æ§ãã§ãã¯ãå¯èœãšãªããçµæçã« abstract Class ãšç¶²çŸ
æ§ãã§ãã¯ããããã®æ©æµãåãããããšçè§£ããŠããŸãã ãã£ãŒããªã³ã¯ã®å¶åŸ¡ã sealed Class ãå©çšããŠãªãã¡ã¯ã¿ãªã³ã°ããŠã¿ã ã¢ããªã®ãã£ãŒããªã³ã¯çµç±ã§ã®èµ·åã®ãã³ããªã³ã°ãå®è£
ããéãURL ãã¹ããšã«åŠçãé·ç§»å
ç»é¢ãç°ãªãããŸãããããç¹å®ã®ãã¹ãã©ã¡ãŒã¿ãã¯ãšãªãã©ã¡ãŒã¿ãæåŸ
ããããšæããŸãã sealed Class ã®ç¹åŸŽãå©çšããããšã§ãURL ãã¹ããšã«ç°ãªããã©ã¡ãŒã¿ãã³ãŒãäžã«è¡šçŸããªãããå®å
šãã€èŠéãããããžãã¯ãèšè¿°ã§ãããšæããå®éã«ãªãã¡ã¯ã¿ãªã³ã°ãè¡ããŸããã ãªãã¡ã¯ã¿ãªã³ã°åã®ã³ãŒã 以äžã¯ãã£ãŒããªã³ã¯ã«å¿ããããã€ãã®æ¡ä»¶ãæºããå Žåã«ç»é¢é·ç§»ãè¡ãã³ãŒãã§ãã // app.dart // ãªã³ã¯ãåä¿¡ããå Žåã«åŒã°ãããããåŠçãã颿° void openDeepLink(Uri uri) { final hostName = uri.host; if (hostName.isEmpty) return ; switch (hostName) { case 'news' : if (uri.pathSegments.length == 1) { final newsId = int .parse(uri.pathSegments[0]); // newsId ã䜿ã£ãŠç¹å®ã®ãç¥ããã®ç»é¢ãžé·ç§» } break ; case 'carts' : // ã«ãŒãç»é¢ãžé·ç§» break ; default : // æªç¥ã®ãªã³ã¯ break ; } } ãã®ã³ãŒãã«ã¯ä»¥äžã®åé¡ããããŸã: 責åãæ··åšããŠãã URL ã«å¿ããããªããŒã·ã§ã³ãå€ã®åãåºããç»é¢é·ç§»ã®åŠçããã¹ãŠ app.dart ãšããã¢ããªå
šäœã®èšå®ãæžããã¡ã€ã«å
ã® openDeepLink 颿°ã«å«ãŸããŠããŸããåäœãã¹ãã¯å°é£ã§ãè²ã
ãªãã¿ãŒã³ã® URL ãå®éã«èžããªã©ãåäœç¢ºèªããããããªããéå¹çã§ãã URL æ§é ã®è¡šçŸã®æ¬ èœ ããããã® URL ãã¹ãã©ãããæå³ã®ãã©ã¡ãŒã¿ã®ååšãæåŸ
ããŠãããïŒããªããïŒããã³ãŒãäžã«æç¢ºã«çŸããŠããŸããã 'news' ã®ã±ãŒã¹ã§ã¯ myapp://news/:id ãšãã£ã圢åŒãæåŸ
ããŸããã uri.pathSegments.length ãšãã£ãããªããã£ããªèŠçŽ ãæ±ãããã仿§ãšåŠçã®äžèŽãèªã¿åãã«ãããªã£ãŠããŸãã ãããã®èª²é¡ã解決ããããããªãã¡ã¯ã¿ãªã³ã°ãããŠã¿ãŸãã ãªãã¡ã¯ã¿ãªã³ã°ã®å
容 DeepLink ãšãã sealed Class ãå®çŸ©ããURL ãç¹å®ã®æ¡ä»¶ãæºãããŠãããã確èªããå€ãåãåºããããã«ãã責åã察象ã®é¢æ°ããåé¢ããŸãããçµæäžèšã®ããã«ãªããŸãã: // deep_link.dart sealed class DeepLink { final Uri uri; DeepLink._( this .uri); factory DeepLink.fromUri(Uri uri) { switch (uri.host) { case 'carts' : return CartDetailDeepLink.fromUri(uri); case 'news' : return NewsDetailDeepLink.fromUri(uri); } throw FormatException( 'Unknown URI pattern. URI: $uri' ); } } class NewsDetailDeepLink extends DeepLink { final int newsId; NewsDetailDeepLink(Uri uri, this .newsId) : super ._(uri); factory NewsDetailDeepLink.fromUri(Uri uri) { if (uri.pathSegments.length != 1) { throw FormatException( 'Invalid NewsDetailDeepLink URI: $uri' ); } return NewsDetailDeepLink(uri, int .parse(uri.pathSegments[0])); } } class CartDetailDeepLink extends DeepLink { CartDetailDeepLink(Uri uri) : super ._(uri); factory CartDetailDeepLink.fromUri(Uri uri) { if (uri.pathSegments.isNotEmpty) { throw FormatException( 'Invalid CartDetailDeepLink URI: $uri' ); } return CartDetailDeepLink(uri); } } 䜿çšäŸ ãªãã¡ã¯ã¿ãªã³ã°å
ã®é¢æ°ã¯ä»¥äžã®ããã«æžãæããŸããã // app.dart void openDeepLink(Uri uri) { final DeepLink deepLink; try { deepLink = DeepLink.fromUri(uri); } catch (e) { // ãšã©ãŒãã³ããªã³ã° } switch (deepLink) { case NewsDetailDeepLink(: final newsId): // `:final newsId` ã®èšè¿°ã§ãªããžã§ã¯ãã®ããããã£ãããŒã«ã«å€æ°ãšããŠå©çš // newsId ã䜿ã£ãŠç¹å®ã®ãç¥ããã®ç»é¢ãžé·ç§» break ; case CartDetailDeepLink: // ã«ãŒãç»é¢ãžé·ç§» break ; } } 責åãåé¢ããããšã«ããåŸãããæ©æµ URL æ§é ã®ã³ãŒãã§ã®è¡šçŸ ã©ã® URL ãã¹ãã©ãããæå³ã®ãã©ã¡ãŒã¿ã®ååšãæåŸ
ããŠãããïŒããªããïŒããã³ãŒãäžã«æç¢ºã«è¡šçŸã§ããããã«ãªããŸããã èŠéãã®è¯ãããã¹ãå¯èœæ§ã®åäž URL ã®è§£æãšç»é¢é·ç§»ã®ããžãã¯ãåé¢ããããšã§ãã³ãŒãã®èŠéããè¯ããªããŸãããURL ã®è§£æããžãã¯ãç¬ç«ãããããšã§ã以äžã®ããã«åäœãã¹ããç°¡åã«èšè¿°ã§ããŸãããªããã¹ã察象ãåçŽã«ãªããšããã¹ãã³ãŒãã®èšè¿°ã AI ä»»ãã«ããã®ã楜ã«ãªããŸãã group( 'DeepLink.fromUri' , () { test( 'should return NewsDetailDeepLink for valid news URI' , () { final uri = Uri.parse( 'example://news/123' ); final deepLink = DeepLink.fromUri(uri); expect(deepLink, isA<NewsDetailDeepLink>()); final newsDeepLink = deepLink as NewsDetailDeepLink; expect(newsDeepLink.newsId, 123); }); }); sealed Class ã«ããåŸãããæ©æµ ä»å責åã®åé¢ã«å ãã sealed Class ã®äœ¿çšã«ããæ©æµãåããããããã«ãªããŸããã ç¶²çŸ
æ§ãã§ã㯠switch æã§ default ã±ãŒã¹ãèšè¿°ããå¿
èŠããªããªããŸããããã€ãcase ã®æŒããçããå Žåã«ã¯ã³ã³ãã€ã«æã«ãšã©ãŒãšãªããããæŒããé²ããŸãã ã³ãŒãã®äžè²«æ§ ãµãã¯ã©ã¹ãåããã¡ã€ã«å
ã«èšè¿°ããå¶çŽãçãŸããããšã§ãé¢é£ããã³ãŒããäžç®æã«ãŸãšãŸããã¡ã³ããã³ã¹æ§ãåäžããŸãã çµããã« sealed Class ã䜿ã£ãŠãå®éã«ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããäŸãã玹ä»ããŸããã ãŸã ãŸã æªç㪠Flutter ãšã³ãžãã¢ã§ãããFlutter / Dart ã®éçºæ¥åã®äžã§ç¥èŠãæ·±ããŸãã玹ä»ã§ããã°ãšæããŸãããèªã¿ããã ãããããšãããããŸããã
ã¯ããã« ããã«ã¡ã¯ïŒãã¢ããã§éçºãè¡ã£ãŠããåç°ã§ãã ä»å㯠Serverless Framework ã§äœæãã Lambda 颿°ã lambroll ã«ç§»è¡ããããšããããšã«ã€ããŠæžããŸãïŒ ç§»è¡æ€èšã®èæ¯ æšå¹ŽãServerless Framework ã® v4 ããªãªãŒã¹ãããŸããã v4 ããã¯ã©ã€ã»ã³ã¹åœ¢æ
ã倿ŽãããŠãåçã®éŸå€ãæºããããããã¯è¶
ããçµç¹ã§ã¯ææã§ãµãã¹ã¯ãªãã·ã§ã³ã賌å
¥ããå¿
èŠããããŸãããŸã v3 㯠2024 幎ãŸã§ã®ãµããŒãã§ãã¯ãªãã£ã«ã«ãªã»ãã¥ãªãã£åé¡ããã°ã«ãã察å¿ããŸããã ä»ã«ãã©ã³ã¿ã€ã ã®ã¢ããããŒãã«ã察å¿ããŠããªããããä»ã¯å€§äžå€«ã§ãããã AWS Lambda ã®ã©ã³ã¿ã€ã ãµããŒããåãããããv3 ãã v4 ãžã®ããŒãžã§ã³ã¢ãããå¿
èŠã«ãªããŸãã www.serverless.com ããã§ Serverless Framework v3 ã v4 ã«äžãã以å€ã®æ¹æ³ã«ã€ããŠæ€èšããŸããã Serverless Framework ããã®ç§»è¡å
åè£ã«ã€ã㊠1. Pulumi æŠèŠ : Go ã TypeScript ãªã©ã®æ±çšããã°ã©ãã³ã°èšèªã§å©çšã§ãããã«ãã¯ã©ãŠã察å¿ã® IaC ããŒã« ã¡ãªãã: Go, TypeScript, Python ãªã©ã§èšè¿°ã§ãã ãŠããããã¹ããæžãã é¢é£ãªãœãŒã¹ããããã€å¯èœ ãã¡ãªãã: æéãçºçããå¯èœæ§ãããèŠæš¡ã«ãã£ãŠã¯ç¡ææ ã«åãŸãããæéäœç³»ã倿Žãããå Žåã«ã¯ä»åãšåæ§ã«ç§»è¡å
ã®æ€èšãå¿
èŠã«ãªã 2. AWS CDK (AWS Cloud Development Kit) æŠèŠ : Pulumi ãšåæ§ã«æ±çšããã°ã©ãã³ã°èšèªã§å©çšã§ãã AWS åãã® IaC ããŒã«ãAWS CloudFormation ãéããŠã€ã³ãã©ã¹ãã©ã¯ãã£ã®ãªãœãŒã¹ããããã€ãServerless Framework ã§ãããã€ããã¹ã¿ãã¯ããç§»è¡ã§ãã cdk migrate ãšããããŒã«ã¯ããããæžå¿µäºé
ããã ã¡ãªãã: Go, TypeScript, Python ãªã©ã§èšè¿°ã§ãã é¢é£ãªãœãŒã¹ããããã€å¯èœ ç¡åã§å©çšå¯èœ ãã¡ãªãã: cdk migrate ã§ç§»è¡ããå Žåãæ§é ãæé©åãããªãå¯èœæ§ãããã äžèšã®ããšãããç§»è¡å·¥æ°å€ã docs.aws.amazon.com 3. AWS SAM (AWS Serverless Application Model) æŠèŠ : Serverless Framework ãšåæ§ã« yaml ããŒã¹ã§ã€ã³ãã©å®çŸ©ãèšè¿°ããŠãCLI ããæäœããããŒã«ãAWS CloudFormation ãéããŠã€ã³ãã©ã¹ãã©ã¯ãã£ã®ãªãœãŒã¹ããããã€ããã ã¡ãªãã: Serverless Framework ãšåãã yaml ããŒã¹ã§ã®å®çŸ©èšå® é¢é£ãªãœãŒã¹ããããã€å¯èœ ç¡åã§å©çšå¯èœ ãã¡ãªãã: Serverless Framework ããããã©ã°ã€ã³ã¯å°ãªããªã 4. fujiwara/lambroll æŠèŠ : Lambda 颿°ããããã€ããããšã«ç¹åããããŒã«ã ã¡ãªãã: tfstate ãåç
§ããŠé£æºã§ããã CD ã®çšæãã ç¡åã§å©çšå¯èœ 瀟å
ã§ã®å©çšå®çžŸãããã ãã¡ãªãã: é¢é£ãªãœãŒã¹ã¯ Terraform ã§ç®¡çããå¿
èŠããã 5. Terraform + AWS CLI æŠèŠ: æ¢åã® Terraform ã§ã®ã€ã³ãã©ç®¡çã«äŸ¿ä¹ãããã¬ãŒã³ãªææ®µ ã¡ãªãã: ã€ã³ãã©ç®¡çããŒã«ã 1 ã€ã«ãŸãšããããïŒåŒç€ŸçéœåïŒ åŠç¿ã³ã¹ãã¯äœã ç¡åã§å©çšå¯èœ ãã¡ãªãã: èªåãããã€ãªã©ã® CD ã«é¢ããŠãããŒãæŽçããå¿
èŠããã åŠç¿ã³ã¹ããéçšå®çžŸãªã©ãéã¿ä»å㯠fujiwara/lambrollïŒä»¥äž lambrollïŒã§ç§»è¡ãå¯èœãªã®ã調æ»ãè¡ããŸããã ïŒããç§»è¡ã§ãããšããŠã CloudFormation ã§äœæãããã®ãéäžã§å¥ã®ããŒã«ãžç§»è¡ããŠäžå
·åãèµ·ããªãã®ãçãšæžå¿µäºé
ã¯ãããŸããä»åã¯ãã®ç¹ã¯èæ
®ããäžæŠã©ã€ãã«å®éšããŸããïŒ Serverless Framework ãš lambroll ã®éã ç§»è¡ã«ãããäž¡è
ã®éãã¯çè§£ããŠããå¿
èŠããããŸãã Serverless Framework ã®ç¹åŸŽãšããŠã¯ä»¥äžãæããããŸãã Lambda ãã¡ã€ã³ãšããã€ã³ãã©ãªãœãŒã¹ããããã€ãã ãããã€ã¯ CloudFormation ã䜿çšããŠè¡ããã äžæ¹ lambroll 㯠Lambda 颿°ã®ãããã€ã®ã¿ãè¡ã Lambda 颿°ã«é¢é£ãããªãœãŒã¹ããããã€ããããšã¯ã§ããŸããã lambroll does not, Manage resources related to the Lambda function. For example, IAM Role, function triggers, API Gateway, and etc. Only the function URLs can be managed by lambroll if you want. Build native binaries or extensions for Linux (AWS Lambda running environment). ( https://github.com/fujiwara/lambroll ãã) ç§»è¡ã§ããã詊ããŠã¿ã config ãã¡ã€ã«ã lambroll ã§äœæããã以å€ã¯å€æŽããããã〠æ¢å颿°ã®ããŠã³ããŒãïŒLATEST ã§åäœããŠãã zip ãããŠã³ããŒãã§ããïŒ $ lambroll init --download ããŠã³ããŒããããš Lambda 颿°ã®å®çŸ©ãšãªã function.json ãäœæãããã®ã§èšå®å€ãèª¿æŽ ãããã€(ãã°ã詳现ã«ç¢ºèªãããã£ãã®ã§ log-level ãªãã·ã§ã³ãèšå®) $ lambroll deploy --envfile=<ç°å¢å¥ã®èšå®ãã¡ã€ã«> --log-level=debug ãããã€æã®ãã°ã確èªãããš tag ã®èšå®ã«å€±æããŠããŸããã 2025 / 02 / 20 17:14:29 [ info ] lambroll v1. 1 . 3 2025 / 02 / 20 17:14:29 [ debug ] { " Src " : " . " , " Publish " :true, " AliasName " : " current " , " AliasToLatest " :false, " DryRun " :false, " SkipArchive " :false, " KeepVersions " :0, " Ignore " : "" , " FunctionURL " : "" , " SkipFunction " :false, " ExcludeFile " : " .Lambdaignore " , " KeepSymlink " :false } 2025 / 02 / 20 17:14:29 [ info ] starting deploy function < 颿°å > 2025 / 02 / 20 17:14:30 [ info ] creating zip archive from . ïŒäžéšçç¥ïŒ 2025 / 02 / 20 17:14:30 [ info ] updating function configuration ... 2025 / 02 / 20 17:14:30 [ info ] State:Active LastUpdateStatus:Successful 2025 / 02 / 20 17:14:31 [ info ] updating function configuration accepted. waiting for LastUpdateStatus to be successful. 2025 / 02 / 20 17:14:31 [ info ] State:Active LastUpdateStatus:InProgress 2025 / 02 / 20 17:14:31 [ info ] waiting for LastUpdateStatus Successful 2025 / 02 / 20 17:14:32 [ info ] State:Active LastUpdateStatus:InProgress 2025 / 02 / 20 17:14:32 [ info ] waiting for LastUpdateStatus Successful 2025 / 02 / 20 17:14:34 [ info ] State:Active LastUpdateStatus:Successful 2025 / 02 / 20 17:14:34 [ info ] updating function configuration successfully 2025 / 02 / 20 17:14:34 [ debug ] 7 tags found 2025 / 02 / 20 17:14:34 [ debug ] remove tag cloudformation: < tagå > 2025 / 02 / 20 17:14:34 [ debug ] remove tag cloudformation: < tagå > 2025 / 02 / 20 17:14:34 [ debug ] remove tag cloudformation: < tagå > 2025 / 02 / 20 17:14:34 [ debug ] remove tag aws:cloudformation: < tagå > 2025 / 02 / 20 17:14:34 [ debug ] remove tag aws:cloudformation: < tagå > 2025 / 02 / 20 17:14:34 [ debug ] remove tag aws:cloudformation: < tagå > 2025 / 02 / 20 17:14:34 [ info ] removing 6 tags 2025 / 02 / 20 17:14:34 [ error ] FAILED. failed to untag resource: operation error Lambda: UntagResource, https response error StatusCode: 400 , RequestID: 6798028d-f699-4508-b000-0ba7b5eab222, InvalidParameterValueException: One or more of your tags had a problem, please ensure none of your tag names start with " aws: " , none are empty, and there are no duplicate tags ãã config ã®æŽæ°ã¯æåããŠãããã§ãã 2025 / 02 / 20 17:14:34 [ info ] updating function configuration successfully å®éã«ã³ã³ãœãŒã«ã§ç¢ºèªãããšãS3 ã« zip ãã¡ã€ã«ã¯ã¢ããããŒããããLambda 颿°ãåäœããããšã確èªã§ããŸããã ãã ããããã€ããããã¡ã€ã«ã®ãµã€ãºã¯ Serverless ã§ã¢ããããŒããããã®ãã倧ãããªã£ãŠããŸã£ãŠããã®ã§ããã®èŸºãã¯ã¡ãããšèŠçŽãå¿
èŠãããããã§ãã äžèšã§ config ãã¡ã€ã«ããããã€ã§ããã®ã確èªã§ããã®ã§è©Šãã«ã©ã³ã¿ã€ã ã®æŽæ°ãã§ããã詊ãããšãããã¡ããåé¡ãªãã§ããŸããã Lambda 颿°ã®åŠçå
容ãå€æŽ config ã¯èšå®ã§ããã®ã§åŠçå
容ã倿ŽããŠã¿ãŸããããã°ã¯å
ã»ã©ãšåæ§ã«ã¿ã°ã®èšå®ã§ãšã©ãŒãåºãŸããã 2025 / 02 / 20 18:04:02 [ error ] FAILED. failed to tag resource: operation error Lambda: TagResource, https response error StatusCode: 400 , RequestID: 7e16baf5-4b77-4248-a3c9-5f3d75d13fa0, InvalidParameterValueException: One or more of your tags had a problem, please ensure none of your tag names start with " aws: " , none are empty, and there are no duplicate tags ã³ã³ãœãŒã«ã§ç¢ºèªããã¿ããšãã確ãã« aws: ã§å§ãŸãã¿ã°ããããŸãããã¿ã°ã«é¢ãããèšå®å€ã¯åºæ¬çã«æ¢åãªãœãŒã¹ã®èšå®ãããŠã³ããŒããããã®ã ã£ãã®ã§ç¹ã«å€æŽã¯ããŠããŸããã§ããã aws: ã§å§ãŸãã®ããã¡ãªããããããªãããã«ããã°ãããã¿ã°åã倿Žããäžãããã€ãããã¿ã°ãèšå®ããã«ãããã€ããŠã¿ãŸããããå€ãããã¿ã°æäœã§å€±æããããã€ã§ãã...ïŒãã§ã«èšå®ããã aws:~ ã®ã¿ã°ãå€ãããšãã§ããŸããã§ããïŒ äžå¿ AWS CLI ã§ untag-resource ã³ãã³ããå®è¡ããŠã¿ãŸããããã¡ãã§ãã¿ã°ã®å€æŽã¯ã§ããŸããã§ããã $ aws lambda untag-resource \ --resource arn:aws:Lambda: < region > : < ã¢ã«ãŠã³ãID > :function: < 颿°å > \ --tag-keys aws:cloudformation:stack-name \ --tag-keys aws:cloudformation:stack-id \ --tag-keys aws:cloudformation:logical-id An error occurred ( InvalidParameterValueException ) when calling the UntagResource operation: One or more of your tags had a problem, please ensure none of your tag names start with " aws: " , none are empty, and there are no duplicate tags ãªãœãŒã¹ã® serverless.yml ãèŠãŠã tag ãæç€ºçã«æå®ããŠãããšããããªãã£ãã®ã§èª¿ã¹ããšããã CloudFormation ã§ã¯ãã¬ãã£ãã¯ã¹ aws: ãä»ãã以äžã®ãããªã¹ã¿ãã¯ã¬ãã«ã®ã¿ã°ãèªåçã«äœæãããšã®ããšã§ããã aws:cloudformation:logical-id aws:cloudformation:stack-id aws:cloudformation:stack-name https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html ããã«ä»¥äžã®èšè¿°ããããŸããã aws: ãã¬ãã£ãã¯ã¹ã¯ AWS çšã«éå®ãããŠããŸãããã®ãã¬ãã£ãã¯ã¹ã§ã¯ã倧æåãšå°æåã¯åºå¥ãããŸãããKey ãŸã㯠Value ããããã£ã§ãã®ãã¬ãã£ãã¯ã¹ã䜿çšãããšãã¿ã°ãæŽæ°ãŸãã¯åé€ããããšã¯ã§ããŸããã ã¿ã°ã®ãšã©ãŒãåºãåå ãåãããŸããã ä»åã®èª¿æ»ã§ã¯ãCloudFormation ã«ãã£ãŠèªåçã«ä»äžããã aws: ãã¬ãã£ãã¯ã¹ã®ã¿ã°ãåå ã§ãlambroll ããã®ã¿ã°æäœã倱æããServerless Framework ã§äœæãã Lambda 颿°ã lambroll ã«ç§»è¡ããããšã¯é£ãããšããçµè«ã«è³ããŸããã çµããã« Serverless Framework ã§äœæãã Lambda 颿°ã lambroll ã«ç§»è¡ããããšã¯ã§ããŸããã§ããã ãã Serverless Framework ãã lambroll ãžä¹ãæããå Žåã«ã¯ä»¥äžã®æé ã§äœæ¥ãè¡ãå¿
èŠãããããã§ãã æ¢å颿°ã®ããŠã³ããŒãïŒ $ lambroll init --download ïŒ æ¢åã®é¢æ°ãšåçã®é¢æ°ãã§ããããã« function.json ã®èšå®å€ãèª¿æŽ Serverless ã§äœæãããªãœãŒã¹ãåé€ lambroll ã§ Lambda 颿°ããã〠lambroll ã¯æ¢åã® Lambda 颿°ãããŠã³ããŒãããããšãã§ããã®ã§ãç§»è¡ããæã®ããŒãã«ã¯ãããŸã§é«ããªãã®ããªãšæããŸããããŸã lambroll ã§ã¯é¢é£ãªãœãŒã¹ãäœæãããªããããããã«ã€ããŠã¯ terraform ã«ç§»è¡ãããªã©å¥ã§æ€èšãå¿
èŠã«ãªããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããïŒ 2025/5/15 è¿œèš ãªããšãã®ããã°ã lambroll ã®äœè
ã§ãã fujiwara ããã«èªãã§ããã ããŸããïŒ ãªãã»ã©ãaws: prefixãä»ããã¿ã°ãç¡èŠããããã«ããã解決ããïŒ / âServerless Framework ã§äœæãã Lambda 颿°ã lambroll ã«ç§»è¡ã§ããã®ã調æ»ããŸãã - every Tech Blogâ https://t.co/VdaupqClp6 — fujiwara (@fujiwara) 2025幎4æ15æ¥ ãã㊠4/25 ã«æŽæ°ããã ãªãªãŒã¹ããŒã ã®äžã« ignore AWS managed tags for tag/untag operation. ãšãã倿ŽãïŒïŒ æ©éææ°ã®ããŒãžã§ã³ v1.3.0 ã«äžããŠããã°å
ã®æäœãåãã©ã€ããŠã¿ãŸããïŒ â»ãã°ã¯äžéšçç¥ããŠããŸã $ lambroll deploy --envfile = .env.dev --log-level = debug 2025 / 05 / 14 21:09:41 [ info ] lambroll v1. 3 . 0 ... 2025 / 05 / 14 21:09:44 [ info ] updating function configuration ... 2025 / 05 / 14 21:09:44 [ info ] State:Active LastUpdateStatus:Successful 2025 / 05 / 14 21:09:45 [ info ] updating function configuration accepted. waiting for LastUpdateStatus to be successful. 2025 / 05 / 14 21:09:45 [ info ] State:Active LastUpdateStatus:InProgress 2025 / 05 / 14 21:09:45 [ info ] waiting for LastUpdateStatus Successful 2025 / 05 / 14 21:09:46 [ info ] State:Active LastUpdateStatus:Successful 2025 / 05 / 14 21:09:46 [ info ] updating function configuration successfully 2025 / 05 / 14 21:09:46 [ debug ] 4 tags found 2025 / 05 / 14 21:09:46 [ info ] ignoring AWS managed tag aws:cloudformation:stack-id 2025 / 05 / 14 21:09:46 [ info ] updating function code ... 2025 / 05 / 14 21:09:46 [ info ] State:Active LastUpdateStatus:Successful 2025 / 05 / 14 21:09:47 [ info ] updating function code accepted. waiting for LastUpdateStatus to be successful. 2025 / 05 / 14 21:09:47 [ info ] State:Active LastUpdateStatus:InProgress 2025 / 05 / 14 21:09:47 [ info ] waiting for LastUpdateStatus Successful 2025 / 05 / 14 21:09:48 [ info ] State:Active LastUpdateStatus:InProgress 2025 / 05 / 14 21:09:48 [ info ] waiting for LastUpdateStatus Successful 2025 / 05 / 14 21:09:50 [ info ] State:Active LastUpdateStatus:InProgress 2025 / 05 / 14 21:09:50 [ info ] waiting for LastUpdateStatus Successful 2025 / 05 / 14 21:09:55 [ info ] State:Active LastUpdateStatus:Successful 2025 / 05 / 14 21:09:55 [ info ] updating function code successfully 2025 / 05 / 14 21:09:55 [ info ] deployed version 30 2025 / 05 / 14 21:09:55 [ info ] updating alias set current to version 30 2025 / 05 / 14 21:09:55 [ info ] alias current is not found. creating alias 2025 / 05 / 14 21:09:55 [ info ] alias updated ãšã©ãŒã¯åºãç¡äºã«ã¢ããããŒããå®äºããŠããããšãã³ã³ãœãŒã«ã§ç¢ºèªã§ããŸããã fujiwara ããã«ãã®ããã°ãå±ããšã¯æã£ãŠããªãã£ãã®ã§ãXïŒæ§ TwitterïŒã«ãã¹ãããŠããã ããã ãã§ãé©ãã§ããããããã°ã®å
容ãåæ ãããã®ãã¢ããããŒãã«å«ãã§ããã ããããšã«ã¯ããã«é©ããŸãããæ¬åœã«ããããšãããããŸãïŒ
ã¯ããã« ãã«ã·ã«ã«ã€ã㊠ã¢ãžã¥ãŒã«åã®å©ç¹ ã¢ãŒããã¯ãã£ãšé¢å¿ã®åé¢ã®åŸ¹åº ãã«ãæéã®ççž® ãã¹ãã®å®¹ææ§ ãã«ã·ã« Android ã¢ããªæ¢åã®ã¢ãžã¥ãŒã«åæŠç¥ æ¢åã®ã¢ãžã¥ãŒã«åæŠç¥ã®åé¡ç¹ æ¹ååŸã®ã¢ãžã¥ãŒã«åæŠç¥ ã¢ãžã¥ãŒã«ã®åé¡ æ¢åã¢ãžã¥ãŒã«ã®åœåå€æŽ feature ã¢ãžã¥ãŒã«ã®æ°èš ãŸãšã ã¯ããã« Android éçºãšã³ãžãã¢ãæ
åœããŠãã岡ç°ã§ãã ãµãŒãã¹ã®æé·ã«äŒŽããã³ãŒãã®è¥å€§åã»è€éåã¯é¿ããããªããã®ã ãšæããŸãã ããããªãããµãŒãã¹ã®æé·è§åºŠãäžããªãããã«ã¯ãæç¶å¯èœã§ä¿å®æ§ã®é«ãã³ãŒããä¿ã€å¿
èŠããããŸãã ä»åã¯åŒç€Ÿã®ãµãŒãã¹ã§ãããã«ã·ã«ã«ãŠãäžèšã®åé¡ãæ¹åãã¹ã Android ã¢ããªã®ã¢ãžã¥ãŒã«åã«ã€ããŠåæ€èšã»å®è£
ããŸããã®ã§ã話ããããŠããã ããŸãã ãã«ã·ã«ã«ã€ã㊠ãã«ã·ã«ã¯å¥åº·çãªç掻ãéãããã®ãã«ã¹ã±ã¢ã¢ããªã§ãã ãã®æ©èœã䜿ãããšã§ãé£äºãäœéãäœèèªçãèšé²ã§ããŸãã é£äºã®èšé²ã§ã¯ã«ããªãŒèšç®ã«ããå¥åº·çãªé£ç掻ãç®æããŸãã ãã«ã·ã«ã¯ä»¥äžã®ãªã³ã¯ããããŠã³ããŒãå¯èœã§ãïŒæ¯éãå©çšããŠã¿ãŠãã ããã ãã«ã·ã« -å¥åº·ç®¡çã®ããã®é£äºèšé²ã»äœé管çã¢ã㪠every, Inc. ãã«ã¹ã±ã¢ïŒãã£ãããã¹ ç¡æ apps.apple.com play.google.com ã¢ãžã¥ãŒã«åã®å©ç¹ ã¢ãžã¥ãŒã«åã話é¡ã«ãªã£ãŠæ°å¹Žãçµã¡ãŸããããããã§æ¹ããŠã¡ãªããã«ã€ããŠç°¡åã«ãŸãšããããšæããŸãã 以äžã«èªåãç¹ã«å€§ãããšæããŠããã¡ãªããã 3 ã€éžåºããŸããã ã¢ãŒããã¯ãã£ãšé¢å¿ã®åé¢ã®åŸ¹åº ã¢ãŒããã¯ãã£ã«åŸã£ãŠæ©èœã圹å²ããšã«ã¢ãžã¥ãŒã«ãåå²ããããšã§ãã³ãŒãã®å¯èªæ§ã»ä¿å®æ§ãåäžããŸãã ã¢ãžã¥ãŒã«éã®äŸåé¢ä¿ãèšèšæå³ãã³ãŒãã¬ãã«ã§è¡šçŸã§ãããããæ°èŠåå
¥è
ã«ã¢ãŒããã¯ãã£ãå
±æãããããªããŸãã ãã«ãæéã®ççž® ã¢ãžã¥ãŒã«ããšã«ç¬ç«ããŠãã«ãã§ããããã倿Žããã£ãã¢ãžã¥ãŒã«ã®ã¿ãåãã«ãããããšã§ãå
šäœã®ãã«ãæéãççž®ã§ããŸãã ç¹ã«å€§èŠæš¡ãªãããžã§ã¯ãã§ã¯ãå·®åãã«ãã«ããæ©æµã倧ãããªããŸãã ãã¹ãã®å®¹ææ§ ã¢ãžã¥ãŒã«ããšã«ç¬ç«ããŠãã¹ãã§ããããããŠããããã¹ããçµåãã¹ããå¹ççã«å®è¡ã§ããŸãã ãã¹ãã«ãã¬ããžãåäžãããå質ã®é«ãã¢ããªã±ãŒã·ã§ã³ãéçºã§ããŸãã ä»ã«ããã³ãŒãã®åå©çšæ§ãåäžããããã ããŒã ã§éçºãåå²ãããããªãããªã©ã®å©ç¹ããããŸãã 詳ããã¯æ¯éãGoogle Developers ã®å
¬åŒããã¥ã¡ã³ããåç
§ãã ããã developer.android.com developer.android.com èªåã®äžã§ã¯ã ã¢ãŒããã¯ãã£ãšé¢å¿ã®åé¢ã®åŸ¹åº ããäžçªã®å©ç¹ã«æããŠããŸãã ä»ã®å©ç¹ãéèŠã§ãããã³ãŒãã®æ§é çãªåŒ·å¶åã¯ã¢ãžã¥ãŒã«åãªãã§ã¯ã®å¹æã§ããããã§ãã ä»åã¯ãã¡ããéèŠèŠããŠã¢ãžã¥ãŒã«åæŠç¥ãåèããŸããã ãã«ã·ã« Android ã¢ããªæ¢åã®ã¢ãžã¥ãŒã«åæŠç¥ ãã«ã·ã« Android ã¯ãæ¢ã«ã¢ãžã¥ãŒã«åããããããžã§ã¯ãã§ããã ã¢ãžã¥ãŒã«åå²ã¯ä»¥äžã®éãã«ãªã£ãŠããã åã¢ãžã¥ãŒã«ã¯ã modules ãšãããã£ã¬ã¯ããªé
äžã«äœæãããŠããŸããã ã¢ãžã¥ãŒã«å 説æ app ã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãŒãã€ã³ããæ©èœã«é¢ããã³ãŒããä¿æããŠãã api ãããã¯ãŒã¯éä¿¡ãå€éšAPIãšã®é£æºãæ
ã debug ãããã°ãã«ãå°çšã®ããŒã«ãæ©èœãæäŸãã core ã¢ããªã±ãŒã·ã§ã³å
šäœã§å
±éããŠäœ¿çšãããæ©èœããŠãŒãã£ãªãã£ãæäŸãã repos repository ã®ç¥ã§ãããŒã¿ã®ãªããžããªãã¿ãŒã³ãå®è£
ãã resource ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããå
±éã®ãªãœãŒã¹ã管çãã usecase ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ãå®è£
ãã widget åå©çšå¯èœãªUIã³ã³ããŒãã³ããæäŸãã model ã¢ããªå
ã§äœ¿çšããå
±éã®ã¢ãã«ã¯ã©ã¹ãå®è£
ãã æ¢åã®ã¢ãžã¥ãŒã«åæŠç¥ã®åé¡ç¹ æ¢åã®ã¢ãžã¥ãŒã«åæŠç¥ã«ã¯ä»¥äžã®ããã«ãããã€ãåé¡ç¹ããããŸããã api ã repos ã usecase ã«é¢ããŠããã¿ãŒã³åãåœåã«äœ¿çšããŠãããããã¢ãŒããã¯ãã£ãæèãã¥ãã widget ã core ã«é¢ããŠãåèŠã§äœãæ ŒçŽãããŠããã®ãæèãã¥ãã core ãšä»ã¢ãžã¥ãŒã«ã®åºåãææ§ åæ©èœã«é¢ããã³ãŒãã app é
äžã«ååšããŠãããããäŸåé¢ä¿ãææ§ modules ãã£ã¬ã¯ããªãäžèŠã§ãã repos ã«é¢ããŠãç¥ç§°ã䜿çšãããŠããåããã«ãã ç¹ã« 1 ~ 4 ã«é¢ããŠãã¢ãžã¥ãŒã«åã®ã¡ãªããã§ãããã¢ãŒããã¯ãã£ãšé¢å¿ã®åé¢ã®åŸ¹åºãããååã«äº«åã§ããŠããªããããªæŠç¥ã«ãªã£ãŠããããšããã£ããªãç¹ã§ããã æ¹ååŸã®ã¢ãžã¥ãŒã«åæŠç¥ æ¢åã®åé¡ç¹ãæ¹åããããã®ã¢ãžã¥ãŒã«åæŠç¥ã¯ä»¥äžã®éãã§ãã ã¢ãžã¥ãŒã«åæŠç¥ãåèããã«ãããã Now In Android > Modularization learning journey ãåèã«ããŸããã ã¢ãžã¥ãŒã«ã®åé¡ å€§ããªå€æŽç¹ãšã㊠modules ãã£ã¬ã¯ããªãåé€ãããã¹ãŠã®ã¢ãžã¥ãŒã«ã core ã¢ãžã¥ãŒã«ãš feature ã¢ãžã¥ãŒã«ã® 2çš®é¡ã«åé¡ ããŸããã ãã«ã·ã«ã§ã¯çŸæç¹ãæ©èœã«é¢ããã³ãŒã㯠app ã¢ãžã¥ãŒã«é
äžã«æ ŒçŽãããŠãããããæ¢åã®ã¢ãžã¥ãŒã«ã¯ãã¹ãŠ core ã¢ãžã¥ãŒã«é
äžã«ç§»åããŸããã ã¢ãžã¥ãŒã«å 説æ core ã¢ãžã¥ãŒã«éã§å
±æããå¿
èŠãããã³ãŒã feature åäžã®è²¬ä»»ãåŠçããããã«ã¹ã³ãŒãèšå®ãããã³ãŒã ãã® 2 ã€ã®ã¢ãžã¥ãŒã«ã«ã€ããŠã¯ãäŸåé¢ä¿ãéèŠã§ãã core ã¢ãžã¥ãŒã«ã¯ä»ã®ã¢ãžã¥ãŒã«ããäŸåãããŠãè¯ã feature ã¢ãžã¥ãŒã« 㯠app ã¢ãžã¥ãŒã«ä»¥å€ããã®äŸåãèš±ããªã äŸåé¢ä¿ã匷å¶ããããšã§ãã¢ãžã¥ãŒã«åã®ã¡ãªããã§ãããã¢ãŒããã¯ãã£ãšé¢å¿ã®åé¢ã®åŸ¹åºãã享åã§ããŸãã æ¢åã¢ãžã¥ãŒã«ã®åœåå€æŽ ä»¥äžã®éãã«ã¢ãžã¥ãŒã«ã®åœåã倿ŽããŸããã 倿Žå 倿ŽåŸ api network repos data usecase domain core common widget ui api ã repos ã usecase ã¯ãã¿ãŒã³åã§ãªããå
·äœçãªåœ¹å²ã瀺ãååã«å€æŽããŸãã core ã¯å
±éæ©èœãå«ãããšãããæç¢ºã«ããããã« common ã«å€æŽããŸãã widget 㯠UI ã«é¢é£ããèŠçŽ ãå«ãããšã瀺ãããã« ui ã«å€æŽããŸãã åœå倿Žããããšã§ãã¢ãŒããã¯ãã£ã«ã€ããŠæèãããããªããŸããã ãŸã Now In Android ãšã¢ãžã¥ãŒã«ã®åœåã䌌ãããããæ°èŠåå
¥è
ã«äŒããããããªã£ããšæããŸãã feature ã¢ãžã¥ãŒã«ã®æ°èš çŸæç¹ã§ã¯ app é
äžã«ãã¹ãŠæ ŒçŽãããŠããç¶æ
ã¯ãé¢å¿ã®åé¢ã®èгç¹ãã奜ãŸãããªãã§ãã åŸã£ãŠãåäžã®æ©èœãæã€ feature ã¢ãžã¥ãŒã«ãæ°èšããŸããã ä»åŸã¯æ©èœããšã« feature ã¢ãžã¥ãŒã«é
äžãžã¢ãžã¥ãŒã«ãäœæããå®è£
ãé²ããŠãããŸãã ãŸãšã ãã«ã·ã« Android ã¢ããªã®ã¢ãžã¥ãŒã«åæŠç¥ãåèãã以äžã®æ¹åã宿œããŸããã ã¢ãžã¥ãŒã«ã®åé¡ æ¢åã¢ãžã¥ãŒã«ã®åœåå€æŽ feature ã¢ãžã¥ãŒã«ã®æ°èš ãããã®æ¹åã«ãããã¢ãŒããã¯ãã£ãšé¢å¿ã®åé¢ã®åŸ¹åºãå³ããŸããã çŸåšãã«ã·ã«ã¯ãã®ã¢ãžã¥ãŒã«åæŠç¥ã«åŸãããªãã¡ã¯ã¿ãªã³ã°äœæ¥ã®çã£åªäžã§ãã ä»åŸãå¥å
šãã€äººéã«ãšã£ãŠåªããã³ãŒããç®æããŠãããããšæããŸãïŒ
ç®æ¬¡ ã¯ããã« åæ ææŠWEEK ãšã¯ 宿œã«ããã£ãŠæ°ãã€ããŠããããš æœçã®æµã å®éã«è¡ããããã® åŸããã广 ä»èŠããŠããåé¡ ãŸãšã æåŸã« ã¯ããã« ããã«ã¡ã¯ããã¢ããéçºéšãœãããŠã§ã¢ãšã³ãžãã¢å
ŒãCTO 宀 Dev Enable ã°ã«ãŒãã® rymiyamoto ã§ãã ïŒæã§ç€ŸäŒäºº 9 幎ç®ã«çªå
¥ããããè¥æãšã¯èšããªã幎霢ã«ãªã£ãŠããé©ããé ããŸããã ä»åã¯åŒç€Ÿã§ã®çµç¹æŽ»æ§æœçã®äžç°ãšããŠè¡ã£ãŠãã ææŠWEEK ã®å¹æã®æ¯ãè¿ããè¡ããŸãã 瀟å
å€ãããã®åãçµã¿ã«äŒŽã广ãèãããããšãå€ããªã£ãŠããã®ã§ã宿œããå
容ãå¹æãæ¯ãè¿ãããšã§ãä»åŸã®æœçã«æŽ»ãããã°ãšæããŸãã ææŠWEEK èªäœã«é¢ããæ
å ±ã¯éå»ã«ç޹ä»ããŠããã®ã§ãã²ã芧ãã ããã tech.every.tv éå¶ã«é¢ããŠãéå»ã®èšäºã§ç޹ä»ãããŠããŸãã tech.every.tv åæ ãšããªãŒã§ã¯ãããªãã·ã¥ãããã³ããããªããŒã«ããããããã¢ãããããTIMELINEãã®è€æ°ã®ãããã¯ããéçºããŠããŸãã ãã®äžã§ãéçºéšã¯åãããã¯ãã®éçºãè¡ãããŒã ãååšããåããŒã ã¯ããããç°ãªãæè¡ã¹ã¿ãã¯ãéçºç°å¢ãæã£ãŠããŸãã äŸãã°ç§ã®æå±ããããã¢ããéçºéšãã§ã¯ãµãŒããŒãµã€ããšããã³ããšã³ããäžæ¬ãã«ããããŒã ãšãã¯ã©ã€ã¢ã³ãã¢ããªå°éã®ããŒã ãååšããŸãã ãŸããããŒã¿ã AI ãªã©ããå°éæ§ãé«ãé åã«å¯ŸããŠã¯æšªæçµç¹ãååšããåãããã¯ãã®éçºãæ¯æŽããŠããŸãã ãã®çµç¹äœå¶äžã ãšä»ã®ããŒã ã§ã®åºæ¥äºãæè¡çãªææŠãç¥ãæ©äŒãå°ãªããåããŒã ã®ã¡ã³ããŒå士ã®äº€æµãå°ãªãããããã¬ããžå
±æãã³ãã¥ãã±ãŒã·ã§ã³ã®æŽ»æ§åã課é¡ãšãªã£ãŠããŸãã ãã®ããè¡ã£ãŠããæœçã®äžã€ã« ææŠWEEK ããããŸãã ææŠWEEK ãšã¯ ææŠWEEK ãšã¯ãæ®æ®µã®æ¥åããé¢ãã1 é±éãããŠæè¡çãªææŠã«åãçµãã€ãã³ãã§ãã æè¡çãªææŠãéããŠããšã³ãžãã¢åäººã®æé·ãšçµç¹ã®æŽ»æ§åãä¿é²ããããšãç®çãšããŠããŸãã éåžžæ¥åã§æ±ããŠãã課é¡ã®è§£æ±ºïŒäŸïŒããã©ãŒãã³ã¹æ¹åïŒãæ°ããæè¡ã®æ€èšŒïŒäŸïŒAI æè¡ã®å°å
¥æ€èšŒïŒãéçºç°å¢ã®æ¹åïŒäŸïŒCI/CD ãã€ãã©ã€ã³ã®æ§ç¯ïŒãªã©ãæ®æ®µã¯æéã確ä¿ãã«ããããŒãã«éäžããŠåãçµãããšãã§ããŸãã çŽè¿ã ãšçæ AI æè¡ã掻çšããæ©èœãããŒã«ã®éçºãè¡ãããŸããã ãŸããä»ããŒã ã®ã¡ã³ããŒã®äº€æµãæ·±ããæ©äŒã«ããªã£ãŠããŸãã 宿œã«ããã£ãŠæ°ãã€ããŠããããš ãŸãã1 é±éã¯äºæ¥éšã®æœçã MTG ã«ã¯åå ãããéäžããŠ ææŠWEEK ã«åãçµããããã«ããã¹ãã¯ãåäºæ¥éšã®çæ§ã«ãååããŠããã ãå¿
èŠããããŸãã 1 é±éæœçãæ¢ããããšã¯ããã®æéãããã¯ãéçºãæ¢ãŸã売äžããµãŒãã¹ã«åœ±é¿ãåºãŠããŸããããå€å€§ãªåœ±é¿ãäžããããšã«ãªããŸãã ãã®ãã宿œããå
容ã®ç²Ÿæ»ã¯æ
éã«è¡ã£ãŠããã1 é±éã§ããæå€§éã®ææãç¥èŠãåŸããããããªå
容ã«èª¿æŽããŠããŸãã ãããŸã§ã§ 5 å宿œããŠããŸãããããã æ°ããæè¡ã詊ãããã ãã§ã¯ãªããå°æ¥çµç¹ããããã¯ãã«è²¢ç®ã§ãããããªãã®ãéžå®ããŠããŸãã ãã¡ãããå®ç§ã«äœãåããã®ãæ±ããã®ã§ã¯ãªãã1 é±éã§ã®ææç©ãäœæããããšãç®çãšããŠããŸãã æœçã®æµã ææŠWEEK ã§ã¯ã¡ã³ããŒããã®ææ¡(ããããŒã¶ã«)ãåéããéžå®ããããã®ãããŒã ã§åãçµã圢ã§å®æœããŠããŸãã ææŠå
容ã®åé ããããŒã¶ã«éžå® æç¥š ããŒã åã ææŠWEEK ã®å®æœ(æçµæ¥ææçºè¡šäŒ) 宿œåŸã¢ã³ã±ãŒã 以åã¯åãªãŒããŒããããŒãžã£ãŒããææ¡ããŠããã圢ã§ããããåå ããã¡ã³ããŒèªãæèŠãåºãããšã§æ®æ®µãããžã¡ã³ãå±€ããèŠããŠããªãæè¡çãªèª²é¡ãèå³ãæã£ãŠããããŒããç¥ãããšãã§ããããå€ãã®ã¡ã³ããŒã®åå ã®æèãé«ãŸãããã«ãªããŸããã å®éã«è¡ããããã® ææŠWEEK ã®å®æœå
容ã¯ãæ¯åç°ãªããŸãããéå»ã®å®æœå
å®¹ãæ¯ãè¿ããšå€§ããåããŠä»¥äžã®ãããªããŒãããããŸããã å
±éåºç€ã®æè¡æ€èš æ°ããæè¡ã®æ€èšŒ ããã©ãŒãã³ã¹ãã»ãã¥ãªãã£ã®æ¹å AI ãããã°ããŒã¿æŽ»çš ç°ãªããããã¯ãã®ã³ã©ãã¬ãŒã·ã§ã³ æ®æ®µã§ããã°ã³ã¹ããæèããããŠåºæ¥ãªãã£ãããä»ã®ãããã¯ãã®ããŒããããããé¢ããŠããŸã£ãŠã¿ã€ãã³ã°ãèŠã€ãããªãã£ããããããŒãã«ææŠããããšãã§ãããããã¡ã³ããŒã®ã¢ãããŒã·ã§ã³ãé«ããæ®æ®µã®æ¥åã§ã¯æãåºãã¥ããããŒããè¡ã£ãŠããŸããã å®éã«å®æœããããã®ã«é¢ããŠã¯ä»¥äžã§ç޹ä»ãããŠããŸãã tech.every.tv tech.every.tv tech.every.tv tech.every.tv åŸããã广 æè¡çãªææŠãéããŠãã¡ã³ããŒåå£«ã®æè¡çãªç¥èŠã®å
±æãé²ã¿ãæ®æ®µã®æ¥åã«ãããŠãæ°ããæè¡ãã¢ãããŒããåãå
¥ããæ©äŒãå§¿å¢ãèœçããŠããŠããŸããäºæ¥éšåŽã§ã ææŠWEEK ã§ãã£ãŠãããããæè¡æ€èšŒãäŸé Œãããããšãããã ææŠWEEK ã®ææããããã¯ãã«æŽ»ããæ©äŒãå¢ããŠããŸããã å®éã« ææŠWEEK ã§äœåºŠãçæ AI ã«å¯Ÿããåãçµã¿ãè¡ãããŠãããã®äžã§åŸãããç¥èŠãåºã«ããããã¯ãã«çµã¿èŸŒãããšãã§ããããã«ãªã£ãŠããŸããã æåã®é 㯠OpenAI ãéããŠçæ AI ã䜿ã£ãŠã¿ããšããããã§å³ãå·Šãããããªãç¶æ
ã§ã¯ãããŸãããã ææŠWEEK ã 2~3 åéããããšã« 1 æ©èœãšããŠå®éšçã«äœæãããšãããŸã§å°éã§ããããã«ãªã£ãŠããŸããã ãã®ç¥èŠãåºã«å®éã«åããŠãããããã¯ãã§æ£åŒããŒããããã®äžã§å®è£
ãããããã«ããã¡ã€ã³ã®ãããã¯ãã§ãããããªãã·ã¥ãããã³ãã«çæ AI ãæŽ»çšãããããªãã·ã¥ AIããšããæ©èœãå®è£
ããããŠãŒã¶ãŒã®ã¬ã·ãæ€çŽ¢ããµããŒãããŠããŸãã ã¢ãŒããã¯ãã£ã«é¢ããŠã¯ä»¥äžã®èšäºã§ç޹ä»ãããŠããŸãã tech.every.tv ãŸãåŒç€Ÿã® VP of Product ããã® AI/LLM ã«ãã£ãŠãtoC åããµãŒãã¹ã®åšãæ¹ããããã¯ãã®äœãæ¹ã«é¢ãã玹ä»ããããŸãã®ã§ããã²ã芧ãã ããã AI/LLMでtoC向けサービスはどう変わるのか?『DELISH KITCHEN』は、「レシピ動画アプリ」から「AI料理アシスタント」へ ãŸãéçºçµç¹ã®ã¡ã³ããŒå士ã®äº€æµã¯ãåå宿œãã 2023 幎 3 æãšæ¯èŒãããšã³ãã¥ãã±ãŒã·ã§ã³ã掻çºã«ãªã£ãŠããŠãããæ®æ®µã®æ¥åã§ã¯é¢ããããšã®ãªãã¡ã³ããŒå士ã§ã®äº€æµãçãŸããŠããŸããäžåºŠåãããŒã ã§ 1 é±ééãããŠéçºãè¡ãããšã§ãæŠåã®ãããªäžäœæãçãŸããæ°è»œã«çžè«ãããããªã£ãããä»ããŒã ã®ã¡ã³ããŒãšè©±ãæ©äŒãå¢ããŠããŸãã ä»èŠããŠããåé¡ ææŠWEEK ã®å®æœãéããŠãã¡ã³ããŒå士ã®äº€æµããã¬ããžå
±æãé²ãã§ããŠããŸããããŸã ãŸã åé¡ãæ®ã£ãŠããŸãã åºããŠããã£ãããããŒã¶ã«ã粟æ»ãæç¥šã®äžã§ãæè¡çãªå®çŸå¯èœæ§ãã¹ã±ãžã¥ãŒã«ããªãœãŒã¹ãªã©ã®å¶çŽã«ãã宿œã§ããªããã®ãå€ããã¡ã³ããŒã®æèŠãååã«åæ ããããŠããªãéšåããããŸããã 宿œåŸã®ã¢ã³ã±ãŒãããéžèããã»ã¹ã®èŠçŽãããçµæã®äŒãæ¹ã工倫ããããšã§ãã¡ã³ããŒå
šå¡ãçŽåŸã§ãããããªããããŒã¶ã«ã®éžå®ãè¡ãå¿
èŠããããŸãã ãŸã ææŠWEEK ã§çãŸãããã®ããã¹ãŠãã®ãŸãŸãããã¯ãã«æŽ»ãããããã§ã¯ãããŸãããå®éã«ãããã¯ãã«çµã¿èŸŒãããã«ã¯ãçŸåšã®ããŒããããã仿§èŠä»¶ãæºããå¿
èŠããããŸãã äœæãããã®ããã®ãŸãŸäœ¿ããªããŠããææŠã®éçšã§åŸãããç¥èŠã¯ãããã¯ãã«æŽ»ããããšãã§ããŸããã©ããªææŠãããŠã©ããªç¥èŠãåŸããããã瀟å
å€ã«çºä¿¡ããããšã§ã1 é±éã®äºæ¥éšã®æœçãæ¢ããŠãŸã§è¡ã£ãããšã®æçŸ©ãæããŠããããããã«ããŠããããã§ãã ãŸãšã ææŠWEEK ã¯ããšã³ãžãã¢åäººã®æé·ãšçµç¹ã®æŽ»æ§åãä¿é²ããããã®æœçãšããŠãæè¡çãªææŠã«åãçµãã€ãã³ãã§ãã æ®æ®µã®æ¥åããé¢ããéäžããŠåãçµãããšã§ãã¡ã³ããŒå士ã®äº€æµããã¬ããžå
±æãé²ã¿ããšã³ãžãã¢ãªã³ã°æåã®éžæã«å¯äžããŠããŸãã ãŸãã ææŠWEEK ã§åŸãããç¥èŠãæè¡ããããã¯ãã«æŽ»ããæ©äŒãå¢ããŠããŠãããçµç¹å
šäœã®æé·ã«ãã€ãªãã£ãŠããŸãã 倧äºãªããšãšããŠåäºæ¥éšåŽã®çããã«ååã®äžã§æãç«ã£ãŠããŸããæ¹ããŠæè¬ç³ãäžããŸãã ä»åŸã ææŠWEEK ãéããŠããšã³ãžãã¢ãªã³ã°æåã®éžæãçµç¹ã®æŽ»æ§åãä¿é²ããŠãããããšæããŸãã æåŸã« ãšããªãŒã§ã¯ããšãã«åã仲éãåéããŠããŸãã ããã¯ããã°ãèªãã§å°ãã§ããšããªãŒã«èå³ãæã£ãŠããã ããæ¹ã¯ããã²äžåºŠã«ãžã¥ã¢ã«é¢è«ã«ãè¶ããã ããïŒ corp.every.tv æåŸãŸã§ãèªã¿ããã ããããããšãããããŸããïŒ
ã¯ããã« ããã«ã¡ã¯ãããªãã·ã¥ãããã³éçºéšã§ãœãããŠã§ã¢ãšã³ãžãã¢ãããŠããæ°è°·ã§ãã ãšããªãŒã®éçºéšã§ã¯ãææŠweekããšãã1é±éã®æééå®ãã£ã¬ã³ãžã宿çã«éå¬ããŠããŸããããã¯æ¥åžžæ¥åããé¢ããŠãæ°ããæè¡ãã¢ã€ãã¢ã«ææŠããåãçµã¿ã§ãã ä»åã¯ããã®ææŠweekæéäžã«ããªãã·ã¥ãããã³ã®æ€çŽ¢åºç€ãElasticsearchããOpenSearchãžç§»è¡ããææŠãè¡ããŸããã®ã§ããã®å
容ã玹ä»ããŸãã â» ææŠweekã®è©³çްã«ã€ããŠã¯éå»ã®èšäºã§ç޹ä»ããŠããŸãã®ã§ãèå³ã®ããæ¹ã¯ä»¥äžãã芧ãã ããã tech.every.tv èæ¯ïŒãªãElasticsearchã®ç§»è¡ãå¿
èŠãªã®ã ããªãã·ã¥ãããã³ã§ã¯ãã¬ã·ãæ€çŽ¢ãšãµãžã§ã¹ãæ©èœã®ããã«é·ããElasticsearch 5.5ãECSäžã§éçšããŠããŸãããã以äžã®ãããªèª²é¡ããããŸããã ããŒãžã§ã³ã®å€ã ïŒElasticsearch 5.5ã¯æ¢ã«æ°å¹Žåã®ããŒãžã§ã³ã§ãããã»ãã¥ãªãã£é¢ãæ©èœé¢ã§ææ°çã«å£ã£ãŠããŸã æ€çŽ¢åšãã®æœçå±éã®å°é£ã ïŒå€ãããŒãžã§ã³ã§ãããããæ°ããæ€çŽ¢æ©èœã®å®è£
ãé£ãããªã£ãŠããŸãã éçšè² è· ïŒECSäžã§ã®èªåéçšã«ããä¿å®ç®¡çã³ã¹ããããã£ãŠããŸãã ãããã®èª²é¡ã解決ããããã«ãElasticsearchããAWSãäž»å°éçºããŠããOpenSearchãžã®ç§»è¡ãæ€èšããããšã«ãªããŸããã ElasticsearchãšOpenSearchãšã¯ OpenSearchã¯Elasticsearchãããã©ãŒã¯ãã圢ã§èªçãããªãŒãã³ãœãŒã¹ã®æ€çŽ¢ãšã³ãžã³ã§ããå
ã
Elasticsearchã¯å®å
šãªãªãŒãã³ãœãŒã¹ã§ããããElastic瀟ã¯ããŒãžã§ã³7.11以éããã©ã€ã»ã³ã¹ãElastic License 2.0ã«å€æŽããŸãããããã«å¯ŸãAWSã¯ãå®å
šã«ãªãŒãã³ãœãŒã¹ãã®ç¶æ
ãç¶æããããã«OpenSearchãšãããã©ãŒã¯ãããžã§ã¯ããç«ã¡äžããŸããã çŸåšãããããã®éçºã¯äžŠè¡ããŠé²ããããŠããŸãããAWSäžã®ãããŒãžããµãŒãã¹ãšããŠã¯OpenSearchãåªå
çã«ãµããŒããããŠããŸãã é
ç® Elasticsearch 7.11以é OpenSearch ã©ã€ã»ã³ã¹ Elastic License 2.0 / SSPL Apache License 2.0 åçšå©çš å¶éããïŒSaaSæäŸã«ã¯å¶éïŒ å®å
šã«èªç± ãœãŒã¹ã³ãŒãã®å€æŽãšåé
åž èš±å¯ããããå¶éãã å®å
šã«èªç± SaaSæäŸ å¶éãã å¶éãªã éçºäž»äœ Elastic瀟 AWSäž»å°ã®ã³ãã¥ããã£éçº ææŠweekã§ã®åãçµã¿ ãææŠweekããšããããã1é±éã®ãããžã§ã¯ãæéãš3人ãšããå°äººæ°ããŒã ã§ã®åãçµã¿ã ã£ããããç§»è¡ã«ããã£ãŠã¯çŸå®çãªç¯å²ã§ä»¥äžã®ãããªã¹ããããèšå®ããŸããã ããŒã«ã«ç°å¢ã§ã®OpenSearchã®å°å
¥ ããŒã«ã«ç°å¢ã§ã®åäœæ€èšŒ ïŒå°æ¥çã«å®æœïŒAWS ã€ã³ãã©æ§ç¯ ïŒå°æ¥çã«å®æœïŒCI æŽå åœåã¯4ã€ã®ã¹ããããã¹ãŠã«ææŠããäºå®ã§ããããå®éã«åãçµãã§ã¿ããšæ³å®ä»¥äžã«è€éãªèª²é¡ãèŠã€ãããäžé±éã§ã¯æåã®2ã¹ãããã§ããæ€èšŒéšåãã宿œã§ããŸããã§ãããããã§ãããã®éãããæéã§å€ãã®è²Žéãªç¥èŠãåŸãããšãã§ããŸããã 宿œå
容ïŒããŒã«ã«ç°å¢ã§ã®æ€èšŒ ããŒã«ã«ç°å¢ã§ElasticsearchããOpenSearchãžåãæ¿ããããã«ã以äžã®äœæ¥ãè¡ããŸããã Dockerç°å¢ã®æŽå OpenSearchã®Dockerã³ã³ããã䜿çšããããã«èšå®ã倿ŽãããããDockerfileã®ä¿®æ£ãè¡ããŸãããå
·äœçã«ã¯ã elasticsearch/elasticsearch ãã opensearchproject/opensearch ãžDockerã€ã¡ãŒãžã倿ŽããŠããŸãããŸããdocker-compose.ymlã察å¿ãã圢ã§ä¿®æ£ããããŒã«ã«ã§OpenSearchãç«ã¡äžããããããã«ããŸããã ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªã®æ€èšŒ ããªãã·ã¥ãããã³ã§ã¯Goã®ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªãšã㊠gopkg.in/olivere/elastic.v5 ã䜿çšããŠããŸããããOpenSearchãžã®ç§»è¡ã«äŒŽãã opensearch-project/opensearch-go/v4 ãžã®åãæ¿ããå¿
èŠã«ãªããŸããã æ€èšŒã®çµæã以äžã®ãããªèª²é¡ãèŠã€ãããŸããã æ°åã¡ãœããã®æžãæããå¿
èŠ æ°ããã©ã€ãã©ãªã¯æ¯èŒçèãããããªã¯ãšã¹ãããã£ãèªåã§çµã¿ç«ãŠãå¿
èŠããã åœåã®æ³å®ã倧ããäžåãäœæ¥éãå¿
èŠã§ããããšã倿ããŸãããäžé±éã®éãããæéã§ã¯å
šå®¹ãææ¡ããã ãã§ã倧å€ã§ããã ããŒã¿æå
¥ã¹ã¯ãªããã®æŽå OpenSearchã«ãã¹ãããŒã¿ãæå
¥ããããã«ãã¹ã¯ãªããåããŠmakeã³ãã³ãããå®è¡ã§ããããã«æ¹åããŸãããããã«ãããç¹°ãè¿ããã¹ããè¡ãããããªããŸããã äž»ãªæè¡çèª²é¡ æ€èšŒéçšã§æããã«ãªã£ãäž»ãªå€æŽç¹ãšèª²é¡ã«ã€ããŠè§£èª¬ããŸãã 1. _typeãã©ã¡ãŒã¿ãŒã®å»æ¢ Elasticsearch 5.5ã§ã¯ _type ãã©ã¡ãŒã¿ã䜿çšããŠã1ã€ã®ã€ã³ããã¯ã¹å
ã§ç°ãªãçš®é¡ã®ããã¥ã¡ã³ããåºå¥ããŠããŸãããããããOpenSearch 2.19ã§ã¯ _type ã¯å®å
šã«å»æ¢ããã1ã€ã³ããã¯ã¹1çš®é¡ã®ããã¥ã¡ã³ããšããèšèšã«å€æŽãããŠããŸãã åœåã®ãããã³ã°å®çŸ©ã§ã¯ãingredientsãrecipesãtagsã®3ã€ã®ããã¥ã¡ã³ãã1ã€ã®ã€ã³ããã¯ã¹ã§å®çŸ©ãããŠãããæå
¥æã« _type=recipes ãæå®ããããšã§å¯Ÿå¿ããŠããŸãããç§»è¡ããã«ã¯ããrecipesãã ãã®å®çŸ©ã«å€æŽãã _type æå®ãªãã§ãåäœããããã«ä¿®æ£ããå¿
èŠããããŸãã ããã¯ããŒã¿æ§é ã®èŠçŽããæå³ããåçŽãªçœ®ãæãã§ã¯è§£æ±ºã§ããªã課é¡ã§ãã 2. ã€ã³ããã¯ã¹ãããã³ã°ã®å³æ Œå OpenSearch 2.19ã§ã¯ãããã³ã°ã®å¶çŽã匷åãããŠããŸããç¹ã«ã·ããã ïŒå矩èªïŒã®èšå®ãã¡ã€ã«ã«é¢ããŠãElasticsearch 5.5ã§ã¯èš±å®¹ãããŠããäžéšäžé©åãªå®çŸ©ãOpenSearchã§ã¯ãšã©ãŒãšãªããŸããã å
·äœçã«ã¯ã以äžã®ãããªã·ããã å®çŸ©ãã¡ã€ã«ã®åé¡ãèŠã€ãããŸããã 圢åŒãäžæ£ãªå矩èªã®å®çŸ© éè€ããå®çŸ© è§£æã§ããªãæåãå«ãŸããå®çŸ© äžé±éã§å
šãŠä¿®æ£ããã«ã¯æéãè¶³ããªããããäžæçãªå¯Ÿå¿ãšããŠã·ããã éšåã« "lenient": true å®çŸ©ã远å ããåé¡ã®ããè¡ããã£ãŠãç¡èŠãããã察å¿ããŸãããæ¬æ¥ã¯ãã·ããã å®çŸ©ãèŠçŽããåé¡ã®ããè¡ãä¿®æ£ããå¿
èŠããããŸãã 3. ã¯ãšãªä»æ§ã®å€æŽ OpenSearch 2.19ã§ã¯boolã¯ãšãªã®ããã©ãŒãã³ã¹ãåäžããŠãããšããã¡ãªããããããŸããã以äžã®ãããªå€æŽç¹ããããŸããã _all ãã£ãŒã«ãã®åé€ïŒå
ã
falseã§äœ¿çšããŠããªãã£ããããå®çŸ©èªäœãåé€ïŒ allow_leading_wildcard ã®ããã©ã«ãç¡å¹å default_field ã®æç€ºçæå®å¿
é å ãã®ä»ã现ããªä»æ§å€æŽ ãããã®å€æŽã«ãããæ¢åã®æ€çŽ¢ã¯ãšãªã®å€ããèŠçŽãå¿
èŠããããæ€çŽ¢çµæãžã®åœ±é¿ãäžã€ã²ãšã€æ€èšŒããå¿
èŠããããŸãã 4. xpackãã©ã°ã€ã³ xpackãã©ã°ã€ã³ã«ã€ããŠã¯ãOpenSearchã§ã¯ãµããŒããããŠããªããããä»£æ¿æ©èœã®æ€èšãå¿
èŠã§ããäžé±éãšããéãããæéå
ã§ã¯ãè©³çŽ°ãªæ€èšãŸã§ã¯è³ããŸããã§ããã æ€çŽ¢åè³ªã®æ€èšŒçµæ ããŒã«ã«ç°å¢ã§ã®æ€èšŒåŸãå®éã®æ€çŽ¢å質ãè©äŸ¡ããããã«æ¯èŒãã¹ããè¡ããŸãããçŽè¿ã®ã¢ã¯ã»ã¹ãã°ãã1,000ä»¶ã®æ€çŽ¢ã¯ãŒãããµã³ããªã³ã°ããElasticsearchãšOpenSearchã®äž¡æ¹ã§æ€çŽ¢ããŠçµæãæ¯èŒããŸããã以äžãæ¯èŒããçµæã®äžéšã§ãã çµæãšããŠã¯ãã©ã¡ããäžå®ã®åŠ¥åœæ§ã®ããæ€çŽ¢çµæãåŸãããŸããããè€æ°ã®åé¡ç¹ãçºèŠããŸããã 1. æ€çŽ¢çµæã®å質äœäž ç¹å®ã®æ€çŽ¢ã¯ãŒãã§OpenSearchã®ã»ããå£ã£ãŠããã±ãŒã¹ãèŠã€ãããŸãããäŸãã°ãã麻è¬ããŸãããšããæ€çŽ¢ã¯ãŒãã§ã¯ã以äžã®ãããªéãããããŸããã Elasticsearch: ã麻è¬ããŸãããäžã€ã®æ€çŽ¢èªãšããŠæ±ãããã麻è¬åµãã¬ã·ããããã OpenSearch: ã麻ããè¬ããããããŸããããã®ããã«åãããŠããŸããã麻è¬åµãã¬ã·ãããããããªã ãã®ãããªéãã¯ãããŒã¯ãã€ã¶ãŒãã¢ãã©ã€ã¶ãŒã®èšå®ã®éãã«ãããã®ãšèããããŸãã 2. ãã®ä»ã®èª²é¡ æ€èšŒçµæãããElasticsearchãšOpenSearchã«ãããŠæç¢ºã«å·®ç°ã¯ãããŸããããªãå·®ç°ãããã©ã®ãããªãã¿ãŒã³ã§å·®ç°ãåºãã®ãã¯æç¢ºã«ãªã£ãŠããŸããã ã麻è¬åµãã¯äžäŸã§ããããã®ä»ã®å·®ç°ã«ã€ããŠã¯æ€èšãå¿
èŠã§ãã ä»åŸã®æ€èšäºé
ææŠweekã®åãçµã¿ã§æããã«ãªã£ã課é¡ãèžãŸããä»åŸåãçµãã¹ãæ€èšäºé
ã¯ä»¥äžã®éãã§ãã 1. ã·ããã ã»èŸæžæŽå çŸç¶ã®åé¡ã®ããå®çŸ©ãæŽãåºããŠãElasticsearchã®ã·ããã å®çŸ©ãOpenSearchã®ã·ããã å®çŸ©ã«å€æŽ æ¥æ¬èªåœ¢æ
çŽ è§£æã®èšå®èŠçŽããElasticsearchãšåçã®èšå®ã«ãã 2. 段éçç§»è¡èšç» ãŠãŒã¶ãŒäœéšã®æ¥æ¿ãªå€åãé¿ãããããæ®µéçãªç§»è¡ãç«ãŠã äžåºŠã«OpenSearchã«ç§»è¡ããã®ã§ã¯ãªããElasticsearchãšOpenSearchãå
±åãããã«ããªã¢ãªãªãŒã¹ãè¡ãçã®æ¹æ³ãæ€èš 3. æ€çŽ¢å質ã®è©äŸ¡æ¹æ³ã®æ€èš å®è·µæå
¥ã«åãã0ä»¶ãããççã®æ€çŽ¢å質ã®è©äŸ¡æ¹æ³ãæ€èšãã ãŸãšã ææŠweekåã¯ãElasticsearchãšOpenSearchã®ç¥èãã»ãŒãªãç¶æ
ã§ã¹ã¿ãŒãããŸããããã·ããã ã®èšå®æ¹æ³ããããããã®ä»æ§å·®åãŸã§äžé±éã§åŠã³ãè¯ãçµéšã«ãªããŸããã å®éã«åãçµãã§ã¿ãŠãåãªãããŒãžã§ã³ã¢ããã§ã¯ãªããã¢ãŒããã¯ãã£ã®èŠçŽããå«ãå€§èŠæš¡ãªãããžã§ã¯ãã«ãªãããšãåãããŸããã çæéã®æ€èšŒã§ã¯ãããŸããããä»åŸãæ©äŒãèŠã€ããŠãããªãæ€èšŒãšèª²é¡è§£æ±ºãé²ããæçµçã«ã¯æ€çŽ¢æ©èœã®å質ãåäžããã圢ã§ã®ç§»è¡ãç®æããããšæããŸãã