ã¯ããã« ããã«ã¡ã¯ïŒä»åã¯ïŒ @arus4869 ã @yoshi_engineer_ ïŒã®2人ã§å·çããŸããïŒ ãã®èšäºã§ã¯ãç§éã®ããŒã ããã¹ããªã³ããŽãŒã«ã§äŸ¡å€ãé§åãããã ãšããæžç±ã®èŒªèªäŒããã£ããã«ã圢骞åããã¡ã ã£ãã¹ããªã³ããŽãŒã«ã ãããŒã ã®çŸ
éç€ã ãšããŠæ©èœãããã¹ããªã³ãã®éæçã äœæå€ã§50%ãã80%ã«åäžãããå
·äœçãªå®è·µèšé²ãã玹ä»ããŸãã ãã®èšäºã¯ãç¹ã«ä»¥äžã®ãããªèª²é¡ãæããŠããæ¹ã«èªãã§ããã ãããã§ãã ã¹ããªã³ããŽãŒã«ããã¿ã¹ã¯ãªã¹ããã«ãªããã¡ã§ããªãããã®ãïŒWhyïŒãã©ããªäŸ¡å€ãçãŸããã®ãïŒOutcomeïŒãææ§ã«ãªã£ãŠããã ã¹ã¯ã©ã ãå®è·µäžã§ãã¹ããªã³ããŽãŒã«ã®è³ªã«æ©ãã§ããã ã¹ããŒã¯ãã«ããŒãããŒã ã¡ã³ããŒãšæ©èœã®è©±ã¯ã§ããŠãã ã䟡å€ãã«ã€ããŠã®äŒè©± ããã¥ããã ãªããã®æ¬ãéžãã ã®ã ç§éã®ããŒã ãããŸãã«äžèšã®ãããªèª²é¡ã«çŽé¢ããŠããŸããã ã¹ã¯ã©ã éçºãé·ãç¶ããŠãããã®ã®ããã€ããããã£ãŒãã£ãŒãã¡ã¯ããªãŒãã®ããã«ãªããã¹ããªã³ããŽãŒã«ãåãªãã¿ã¹ã¯ãªã¹ãã«ãªã£ãŠããŸãããããŒã ãšããŠããããããšãå€ãããŠåžžã«ããã¯ãã°ãç©ã¿ãããåŸåãããããã¬ãã¥ãŒã§äœãåŠãã ãããã¢ãŠãã«ã ã§èªãããšãé£ãããã¢ãŠããããã®è©±ã«çµå§ããã¡ã§ããã ãã®ããªããšãªãããªãã ããã®ç¶æ
ãè±åŽãããããããªæãã§ãã¹ããªã³ããŽãŒã«ãèãçŽããã³ããäžããŠãããããªæ¬æžãã茪èªäŒã®ããŒããšããŠéžã³ãŸããã ããããã¹ããªã³ããŽãŒã«ãšã¯äœãïŒ ã¹ããªã³ããŽãŒã«ã¯ãªãèšå®ãããã®ãç¥ã£ãŠããŸããïŒç§ã¯èª¬æããããšãã§ããŸããã§ããã ã¹ã¯ã©ã ã¬ã€ãã§ã¯ä»¥äžã®ããã«å®çŸ©ãããŠããŸãã ã¹ããªã³ããŽãŒã«ã¯ã¹ããªã³ãã®å¯âŒã®âœ¬çã§ãããã¹ããªã³ããŽãŒã«ã¯éçºè
ã確çŽãããã®ã ããã¹ããªã³ããŽãŒã«ãéæããããã«å¿
èŠãšãªãäœæ¥ã«å¯ŸããŠã¯æè»æ§ããããããã¹ããªã³ããŽãŒã«ã¯ãŸããâŒè²«æ§ãšéäžã✣ã¿åºããã¹ã¯ã©ã ããŒã ã«âŒèŽå£çµããäœæ¥ãä¿ããã®ã§ãããã ã¹ããªã³ããŽãŒã«ã¯ãã¹ããªã³ããã©ã³ãã³ã°ã§äœæãããã¹ããªã³ãããã¯ãã°ã«è¿œå ããããéçºè
ãã¹ããªã³ãã§äœæ¥ãããšãã«ã¯ãã¹ããªã³ããŽãŒã«ã念é ã«çœ®ããäœæ¥ãäºæ³ãšç°ãªãããšã倿ããå Žåã¯ãã¹ããªã³ããŽãŒã«ã«åœ±é¿ãäžããããšããªãããã«ããããã¯ããªãŒããŒãšäº€æžããŠã¹ããªã³ãããã¯ãã°ã®ã¹ã³ãŒãã調æŽããã ã¹ããªã³ããŽãŒã«ã¯ã¹ããªã³ãã® å¯äžã®ç®ç ã ã¹ããªã³ãã«ãããŠããã®ç®æšãéæããããšããã倧æ¬åœãªããã§ãã ã§ã¯ããã®éèŠæ§ãæ·±ãŒã£ãŠãããŸãããã ã¹ããªã³ããŽãŒã«ããªãå¿
èŠãªã®ãïŒ ã¹ããªã³ããŽãŒã«ã®éèŠæ§ããŸãæããããã®ã¯ãããŒã ã®æèãã¿ã¹ã¯ããŒã¹ã® ãã¢ãŠãããããããããŠãŒã¶ãŒã«æäŸãããã¢ãŠãã«ã ããžãšè»¢æ ããããããšã§ãã ããŒã 㯠ããŠãŒã¶ãŒãžã®äŸ¡å€ã®æäŸããæ¬æ¥ã®ç®çãšããŠè¡ã£ãŠããŸããå®éã®ããŒã ã皌åããŠããéã«ããã€ã®éã«ãã¿ã¹ã¯ãªã¹ãã®ã¿ãæéãšããŠäœæ¥ãé²ãã§ããŸã å¯èœæ§ããããŸãã äŸãã°ãããŠãŒã¶ãŒç»é²ç»é¢ã®å®è£
ãããããŒã¿ããŒã¹ç»é²åŠçããšãã£ãã¿ã¹ã¯ã®çŸ
åã ãã§ã¯ãéçºè
ã¯ãªããã®äœæ¥ãè¡ã£ãŠããã®ãããã®äœæ¥ãæçµçã«ã©ã®ãããªãŠãŒã¶ãŒäŸ¡å€ã«è²¢ç®ããã®ããããŒã ã¡ã³ããŒãå
±éããŠçè§£ãã«ããå ŽåããããŸãã ã¹ããªã³ããŽãŒã«ãããããšã§ããŠãŒã¶ãŒã«å±ããã䟡å€,ã¢ãŠãã«ã ãã¿ã¹ã¯ãšé£çµããŠãäžã€ã®å
·äœçãªã€ã³ã¯ãªã¡ã³ããçã¿åºããšããæç¢ºãªæå³ãå
±æãããŸãã ãã®ããã«ããŒã 㯠ãã¿ã¹ã¯ã®é²æã ã ãã§ãªãã ãŽãŒã«ãžã®è²¢ç®åºŠ ãåžžã«æèã§ããããã«ãªããããè¯ãæææ±ºå®ãšå調æ§ãçã¿åºãã ã¹ããªã³ããŽãŒã«ã®å¹èœ ã¹ããªã³ããŽãŒã«ãããŒã ã«å¯ŸããŠããããå¹èœã¯ä»ã«ããããŸãããã㯠ãéäžã ãš ãäžè²«æ§ãã§ãã ããŒã ã«æç¢ºãªãŽãŒã«ããªããã°ãããŒã ã¯ãããã¯ãããã¯ãã°ã¢ã€ãã ïŒPBIïŒãã¹ããªã³ãããã¯ãã°ã«å«ãŸããå Žåãããããã®PBIãç¬ç«ããäœæ¥ãšããŠæããããããŒã ãã°ãã°ãã«äœæ¥ãããªã¹ã¯ããããŸã ããã®ãããªç¶æ³ã§ã¯ãããŒã ãšããŠã®å調æ§ãçãŸãããç¹å®ã®PBIãæ
åœããå人ãå€ç«ããããäœæ¥ã®è©°ãŸããçºçãããããå¯èœæ§ããããŸã ã ã¹ããªã³ããŽãŒã«ã¯ããããã®PBIãããªãæã
ã¯ããããåæã«é²ããã®ãããšãã å
±éã®ç®çã«éçŽããŸã ãå
±éã®ç®çãæã€ããšã§ãããŒã å
šå¡ãåãç®æšã«åãã£ãŠåªåããäžäœæãé«ããããšãã§ããŸãã ããã«ãããããŒã ã¡ã³ããŒã¯ ããŽãŒã«éæã®ããã«èª°ããå©ããã ãšããåæ©ä»ããçãŸããååããŠåé¡ã解決ããå§¿å¢ãèªç¶ã«è²ãŸããŸããåã
ã®ã¿ã¹ã¯ã®å®äºã§ã¯ãªããããŒã å
šäœã®ãŽãŒã«éæã«çŠç¹ãåœãŠããšãããã¹ã¯ã©ã ã®æ¬è³ªãäœçŸããŸãã è¯ãã¹ããªã³ããŽãŒã«ã建ãŠãããã« ããã§ã¯ ã¿ã¹ã¯ããŒã¹ã®ãŽãŒã«èšå® ãš ç¶æ
ããŒã¹ã®ãŽãŒã«èšå® ã«ã€ããŠã話ãããŸããã¿ã¹ã¯ããŒã¹ã®ãŽãŒã«ã§ã¯ãããŒã ã¡ã³ããŒããèªåã®ã¿ã¹ã¯ãçµãããªãã£ãããšããå人ã®åçã«çµå§ãããã¬ãã£ããªå
çã«é¥ããããå¯èœæ§ããããŸãã ã¹ããªã³ããŽãŒã«ããã¢ã€ã¢ã€ãè§£æ¶ãããç¶æ
ãããç¹å®ã®äŸ¡å€ãæäŸãããç¶æ
ããšãã£ããç¶æ
ãããŒã¹ã§èšå®ãããšãããŒã ã¯ãã¬ãã·ã£ãŒããè§£æŸãããããååããªæ¯ãè¿ãããããããªããŸãã ãŸãããŽãŒã«ãæªéæã§ãã£ãŠããããŒã 㯠ããªããã®ç¶æ
ã«è³ããªãã£ãã®ãããšããæ ¹æ¬çãªåå ã客芳çã«åæãã ããšãã§ãããããæ¬¡ã®ã¹ããªã³ãã§ã®æ¹åç¹ãšããŠæããããšãã§ããŸã ã ãã®ãããªããã»ã¹ã¯ãããŒã ã¡ã³ããŒéã®ä¿¡é Œé¢ä¿ãæ·±ãã倱æãåŠç¿ã®æ©äŒãšæããå¥å
šãªæåãéžæããŸããã¹ããªã³ããŽãŒã«ã®éæã«åããŠäºãã«å©ãåãç¿æ
£ã¯ã ããŒã å
šäœã®ååäœå¶ã匷å ãã åã
ã®ã¢ãããŒã·ã§ã³ãç¶æãã äžã§éèŠãªåœ¹å²ãæãããŸã ã ã¹ããªã³ããŽãŒã«ãé§åããŠæåã®éµãšããŠæŽ»çšããŠããããã« ã¹ããªã³ããŽãŒã«ãåãªãã¿ã¹ã¯ç®¡çããŒã«ã§ã¯ãªãã ããŒã ã®éäžåãæè»æ§ããããŠäŸ¡å€åµåºãæå€§åããããã®äžå¯æ¬ ãªèŠçŽ ã§ã ã¹ããªã³ããŽãŒã«ã ãã¿ã¹ã¯ã®ãªã¹ãã ãã ãææã瀺ãçŸ
éç€ã ãžãšé²åãããããšã§ã ããŒã ã¯ãäœããããããããäœãæãéãããããžãšæèãå€ããããšãã§ããŸãã äœãå®è·µããã®ãïŒèŒªèªäŒã§ã®åãçµã¿ïŒ 茪èªäŒã§ã®åŠã³ãå
ã«ãç§éã¯ä»¥äžã®3ã€ã®å
·äœçãªã¢ã¯ã·ã§ã³ãããŒã ã«å°å
¥ããŸããã 1. ã¹ããªã³ããŽãŒã«ã®ãæ±ºãæ¹ããåæåœ¢æã®ããã»ã¹ã«å€ãã ãããŸã§ææ§ã ã£ãã¹ããªã³ããŽãŒã«ã®æ±ºãæ¹ããããŒã ã§åæã圢æããããã®æç¢ºãªããã»ã¹ã«å€æŽããŸãããå
·äœçã«ã¯ãã¹ããªã³ããã©ã³ãã³ã°ã§ä»¥äžã®ã¹ããããèžãã§ããŸãã å
šå¡ã§ã¹ããªã³ããŽãŒã«æ¡ã1ã€èããïŒ ãŸããPOã ãã§ãªãããŒã å
šå¡ã§ã¹ããªã³ããŽãŒã«æ¡ãåºããŸãã èªä¿¡åºŠã®å¯èŠåãšæç¥šïŒ ãã®ã¹ããªã³ããŽãŒã«æ¡ã«å¯ŸããŠãéæã§ããèªä¿¡åºŠãåèªã衚æããåèæ
å ±ãšããŠæç¥šãè¡ããŸãïŒå€æ°æ±ºã§ã¹ããªã³ããŽãŒã«ã決ããããã§ã¯ãããŸããïŒã 察話ãšè°è«ïŒ ãªããã®èªä¿¡åºŠãªã®ãããªããã®æ¡ãè¯ããšæãã®ããå
šå¡ã§å¯Ÿè©±ããçŽåŸè§£ãæ¢ããŸãã ãFOCUSãã§æçµãã§ãã¯ïŒ æåŸã«ããã®ã¹ããªã³ããŽãŒã«æ¡ãè¯ããŽãŒã«ã®ç¹æ§ïŒâ»ïŒãæºãããŠããããããŒã ã§ãã§ãã¯ããæçµæ±ºå®ããŸãã â»FOCUSãšã¯ïŒ è¯ãã¹ããªã³ããŽãŒã«ã®ç¹æ§ã瀺ããé åèªãFunïŒæ¥œããïŒ, Outcome-basedïŒã¢ãŠãã«ã ããŒã¹ïŒ, CollaborativeïŒå調çïŒ, UltimateïŒç©¶æ¥µçïŒ, SingularïŒåäžïŒã®5ã€ã®èгç¹ã ãã®ããã»ã¹ã«ãããã¹ããªã³ããŽãŒã«ãã誰ããæ±ºããç®æšããããèªåãã¡ãåæããç®æšãã«å€ãããŸããã 2. ãããããšããåæ°ããã£ãŠçµã蟌ãã éå»ã®ç§éã¯ãã¹ããªã³ããŽãŒã«ã«éäžã§ããã«å質ãäœäžããããããŽãŒã«èªäœãéæã§ããªãçµéšããããŸãããæ¬ãããåæã«å€ãã®äœæ¥ã«åãçµãããšã¯ãååã劚ããäŸ¡å€æäŸãæžå°ãããã ãšããååãåŠã³ã茪èªäŒäžã«ããŒã ã® åæãšããŠä»¥äžã®ã«ãŒã«ã決ããŸããã ãã¹ããªã³ããã©ã³ãã³ã°ã§ã¹ããªã³ãããã¯ãã°ã«å
¥ããã®ã¯ãã¹ããªã³ããŽãŒã«éæã«çŽæ¥è²¢ç®ããPBIã ãã«ããã ããã«ãããããŒã ã®ãšãã«ã®ãŒã忣ããããšãªããå
šå¡ããŽãŒã«éæã«éäžã§ããããã«ãªããŸããã 3. ã¬ãã¥ãŒã§ãããŒã¿ããèªãããšãå§ãã 䟡å€ïŒã¢ãŠãã«ã ïŒãæèãããããã¹ããªã³ãã¬ãã¥ãŒã§é¢é£ãããããã¯ãã®ããã·ã¥ããŒããåå è
ã§èŠãããšããå§ããŸããããŸã éåã°ã§ãããããã«ããäŒè©±ããäœãäœã£ããïŒOutputïŒããããããã«ãã£ãŠäœãå€ãããããïŒOutcomeïŒããžãšå°ããã€ã·ãããããã£ããã«ãªã£ãŠããŸãã ãã£ãçµæã©ãã ã£ããïŒèŒªèªäŒã®ææïŒ ãããã®åãçµã¿ã®çµæãããŒã ã«ã¯æç¢ºãªå€åãçãŸããŸããã ã¹ããªã³ããŽãŒã«éæçãåäžïŒ ãããŸã§äœæå€ã§ãããã¹ããªã³ããŽãŒã«ã®éæç㯠çŽ50%ãã80%ãžãšåäž ããŸããã ãã©ã³ãã³ã°ã®è³ªãåäžïŒ ããã®PBIã¯ã¹ããªã³ããŽãŒã«éæã«ã©ãç¹ãããã ã£ãïŒããšããåããããèªç¶ã«çãŸããããã¯ãã°éžæã®è¿·ããæžå°ããŸããã ãã€ãªãŒã¹ã¯ã©ã ã®äŒè©±ãå€ãã£ãïŒ åãªãé²æå ±åã§ã¯ãªãããã¹ããªã³ããŽãŒã«ãéæããããã«ã仿¥ã¯ãããããããšæãããšãã£ãããŽãŒã«ãæèããäŒè©±ãäžå¿ã«ãªããŸããã åå è
ã®å£° 茪èªäŒã®åå è
ã®å£°ãæç²ããŸãã ç·åçã«èŒªèªäŒã«åå ããŠè¯ãã£ããšããææ³ã«ãªããŸããã ãäžç¢ºå®æ§ãžã®å¯ŸåŠãã«ããã説æãããã«å¯Ÿãããœãªã¥ãŒã·ã§ã³ã倧å€åŠã³ã«ãªã£ãã äžäººã§èªããšã€ã³ãããã ãã§çµãããã¡ã§ãããããŒã ã§ããã«å®è·µã§ããã®ã茪èªäŒã®è¯ããšããã ãšæããŸããã FOCUSã¯äžã€ã®HOWã«éããªããšæãã€ã€ã茪èªäŒããå
·äœçãªã¢ã¯ã·ã§ã³ãçãŸããã®ã¯ãšãŠãè¯ããªããšæããŸããã äŸ¡å€æäŸãéèŠããFOCUSã®èãæ¹ã§ãŽãŒã«ãæã¡ç«ãŠãããšãæ¬ãéããŠå°è±¡ã«æ®ããŸããã ãŸãšã ä»åã®èŒªèªäŒãšå®è·µãéããŠãç§éã¯éèŠãªåŠã³ãšæ°ã¥ããåŸãããšãã§ããŸããã çµéšããã®åŠã³ïŒ è¯ãã¹ããªã³ããŽãŒã«ãšã¯ãåªããæç« 以äžã«ã ããŒã ã§ãäœã«éäžããäœã顧客ã«å±ããã®ãããåæããããã»ã¹ãã®ãã® ã§ããã æ°ã¥ãïŒ ããŒã ãå
±éã®ãŽãŒã«ã«éäžããããšã§åããŠã æ¥ã
ã®è¡åã䟡å€ãããåŸç¹ãã«ç¹ãã ã®ã ãšæ°ã¥ããŸããã ãã®èšäºã§ç޹ä»ããç§éã®ãã¹ããªã³ããŽãŒã«ã®æ±ºãæ¹ããã»ã¹ããããã®äžå©ãšãªãã°å¹žãã§ãã æåŸãŸã§ãèªã¿ããã ããããããšãããããŸããã
ããã«ã¡ã¯ãiOSãšã³ãžãã¢ã®å€§å¡ãå±±åŽãæ©å·( @hykwtmyk )ãåç°( @naoya_maeda ) ã§ãã 2025幎9æ19-21æ¥ã«ææã»ã³ãã©ã«ã¿ã¯ãŒããŒã«ïŒã«ã³ãã¡ã¬ã³ã¹ã§éå¬ãããiOSDC Japan 2025ã«ãã¿ã€ããŒããŽãŒã«ãã¹ãã³ãµãŒãšããŠåè³ãããŠããã ããŸããã ã€ãã³ãã¯ä»¥äžã®ããã«ã3æ¥éé£ç¶ã§è¡ãããŸããã 9æ19æ¥ïŒæšïŒïŒday0ïŒåå€ç¥ïŒ 9æ20æ¥ïŒéïŒïŒday1ïŒæ¬ç·š1æ¥ç®ïŒ 9æ21æ¥ïŒåïŒïŒday2ïŒæ¬ç·š2æ¥ç®ïŒ ç§ãã¡ãã€ãã³ãã«åå ããã®ã§ãã¡ã³ããŒãããããæ°ã«ãªã£ãã»ãã·ã§ã³ãææ³ãã玹ä»ããŸãã å€§å¡ ç·š å
æ¥ãiOSDC Japan 2025ã«åå ããŸãããä»å¹Žã¯äŒå ŽãäŸå¹Žãšã¯ç°ãªããã«ã³ãã¡ã¬ã³ã¹å
šäœã®é°å²æ°ã«ãã€ããšéã£ãæ°é®®ãªå°è±¡ãåããŸãããç§ã¯æ¯å¹ŽiOSDCã«åå ããŠããŸãããæ¥ã
ã®æ¥åãèªå·±åŠç¿ã ãã§ã¯è§Šããæ©äŒã®å°ãªããé«åºŠã§ããããªé åã®ç¥èãéäžçã«åŸãããç¹ããæ¬ã«ã³ãã¡ã¬ã³ã¹ã®æå€§ã®é
åã ãšæããŠããŸããæ¬ã¬ããŒãã§ã¯ããã®äžã§ãç¹ã«å°è±¡ã«æ®ã£ããéèãµãŒãã¹ã®æé·ãæ¯ãã "æ¬äººç¢ºèªãããŒ" ã®æ¹åãšåãå·»ãç°å¢ã®å€åãã®ã»ãã·ã§ã³ã«ã€ããŠãå ±åããããŸãã æŠèŠ ã»ãã·ã§ã³ã¯ã1. æ¬äººç¢ºèªãããŒã®æ¹åãš2. æ³ä»€æ¹æ£ãªã©åãå·»ãç°å¢ã®å€åã«ã€ããŠã®çºè¡šã§ããã 1. æ¬äººç¢ºèªãããŒã®æ¹å ååã¯ãJPKIæ¹åŒãçšããæ¬äººç¢ºèªã®å®è£
æŠç¥ã«ã€ããŠã®è§£èª¬ã§ããããªãŒãã¿ã€ã ãççž®ããããããã€ãã³ããŒã«ãŒãã®èªã¿åãããã³é»åèšŒææžã®æ€èšŒãšãã£ãæ©èœã¯ãå€éšãã³ããŒãæäŸãã SDK ãçšããŠå®è£
ããŠããããã§ããäžæ¹ã§ããŠãŒã¶ãŒãçŽæ¥è§ŠããUIéšåã¯ãããŠèªç€Ÿã§éçºãããšããæŠç¥ãæ¡ã£ãŠããŸããUIãèªç€Ÿã§éçºããããšã§ãé¢è±çãæ¹åããããã®æ§ã
ãªå®éšçãªæœçãã¹ããŒãã£ãŒã«å°å
¥ãããã®æé©åã®ã¡ãªããã享åãããŠããããã§ãã 2. æ³ä»€æ¹æ£ãªã©åãå·»ãç°å¢ã®å€å åŸåã¯ãéèãµãŒãã¹ãåãå·»ãç¯åæ³ãªã©ã®æ³ä»€æ¹æ£ãããã«ã¢ããªéçºã«åœ±é¿ãããã«ã€ããŠã§ããç¹ã«JPKIã®çœ²åçšé»åèšŒææžãçšããæ¹åŒãã«ãŒã代æ¿é»ç£çèšé²ãçšããæ¹åŒãªã©ãå€éšç°å¢ã®å€åã«ãšã³ãžãã¢ãã©ã察å¿ãã¹ããã«çŠç¹ãåœãŠè§£èª¬ãããŠããŸããã ææ³ ç§ãæå±ããããŒã ã§æ
åœããŠããæ¬äººç¢ºèªãããŒã«é¢ããçºè¡šã ã£ããããç¹ã«åŒ·ãé¢å¿ãæã£ãŠæèŠããŸãããä»ç€Ÿã§ã¯ã©ã®ããã«JPKIæ¹åŒãå®è£
ããé¢è±çã®æ¹åãšããé£ãã課é¡ã«å¯Ÿããã©ã®ãããªèгç¹ã§æè¡ããããã¯ãèšèšã®éžæãè¡ã£ãŠããã®ããå
·äœçã«ç¥ãããšãã§ãã倧å€å匷ã«ãªããŸããã å±±åŽ ç·š iOSDCã¯ä»ååããŠåå ãããŠããã ããŸãã! ååå ã ããããæããçŸå°ã®ç±æ°ãã»ãã·ã§ã³ã®ææ³ãªã©ãã¬ããŒãããŸããã¡ãªã¿ã«ãç§ã¯day0ãšday2ã®2æ¥éåå ããŸããã day0ïŒã«ã³ãã¡ã¬ã³ã¹ã®ç±æ°ã«è§Šãã day0ã§ã¯ãŸãããã¬ãªãŒããã³ã°ã»ãã·ã§ã³ã«åå ããiOSDCã®æŽå²ãã³ãã¥ããã£ã®æãç«ã¡ã«ã€ããŠç¥ãããšãã§ããŸãããå€ãã®éçºè
ã®æ
ç±ã«ãã£ãŠãã®çŽ æŽãããå ŽãäœãããŠããããšãç¥ããåå ã§ããããšãžã®æè¬ã®æ°æã¡ã§èžããã£ã±ãã«ãªããŸããã ãã®åŸã¯ãåŒç€Ÿã®å²éšããïŒ @beryu ïŒã®çºè¡šãå¿æŽãã«è¡ã£ãããèå³ã®ããã»ãã·ã§ã³ãããã€ãæèŠããŸãããã©ããã¬ãã«ãé«ããç¥ç奜å¥å¿ã匷ãåºæ¿ãããå
容ã°ããã§ããã day2ïŒããŒã¹ã§ã®äº€æµ day2ã§ã¯ãåŒç€Ÿã®ããŒã¹ã«ç«ã¡ãããããã®åå è
ã®æ¹ã
ãšã³ãã¥ãã±ãŒã·ã§ã³ãåãããŠããã ããŸããã ç§ãã¡ã®ããŒã¹ã§ã¯ããæè¿ããŸããã£ãããšããããŒãã«ä»ç®ãæžããŠãããããšããäŒç»ã宿œããŠããŸãããããããã£ããã«äŒè©±ã匟ã¿ããæè¿ãSwiftUIåãããŸããã£ããã§ãããAIãããæŽ»çšããŠæ¥åæ¹åããŸããããšãã£ãå
·äœçãªã話ããããã䌺ãããšãã§ããŸãããç¹ã«AI掻çšã®ãããã¯ã¯å€ãã®æ¹ã®é¢å¿äºã®ããã§ãä»ç€Ÿããã®ãŠããŒã¯ãªåãçµã¿ãèããã®ã¯å€§ããªåç©«ã§ããã å¿ã«æ®ã£ãã»ãã·ã§ã³ æ¥åã§çŽæ¥é¢ããæ©äŒã®å°ãªãé åã§ã®ã»ãã·ã§ã³ãæ©äŒãå€ãã£ãã®ã§ãããã©ããæ°é®®ã§éåžžã«é¢çœãã£ãã§ãã æè©±ãžã§ã¹ãã£ãŒã®æ€ç¥ãšç¿»èš³~ãã³ããã©ããã³ã°ã®å¯èœæ§ãšéç~ fortee.jp Apple Vision Proã§ã®ç«äœåç»ã¢ããªã®å®è£
ãš40ã®å·¥å€« fortee.jp ããã°ã©ãã®ããã®äœæ²å
¥é fortee.jp ãiPhoneã®ãã€ãã³ããŒã«ãŒããã®ãã¹ãŠ fortee.jp ç¹ã«ãApple Vision Proé¢é£ã®ã»ãã·ã§ã³ã¯ãåŸæ¥ã®ã¢ããªéçºãšã¯ç°ãªãã3D空éäžã§UIãUXãããã«èªç¶ã«èŠããããšããç¹ã«å€ãã®å·¥å€«ãåããããŠããã倧å€è峿·±ãã£ãã§ãããªããžã§ã¯ãã空éã«éåæãªãé
眮ããããšã®é£ãããæ¹ããŠæããŸããã ãã€ãã³ããŒã«ãŒãã®è©±ã¯ãå®éã«ã©ã®ãããªAPIã䜿ãããŠããã®ããšããæè¡çãªè§£èª¬ãéåžžã«ããã«ãªããŸãããã¢ããªå
ã察é¢ããã©ãŠã¶ã®3çš®é¡ã®Verifier APIã®å
·äœçãªäœ¿ãæ¹ããŠãŒã¹ã±ãŒã¹ãããã«ã¯mdocã®ããŒã¿æ§é ãæ¥æ¬ã®ããã«äœãããAPIã®ç޹ä»ãªã©ãæ®æ®µã¯ç¥ãããšã®ã§ããªãå®è£
ã®è©³çްã«è§Šããããšãã§ãããšãŠã貎éãªäœéšã§ããã Swiftã³ãŒãããã«ãšLT倧äŒã®ç±æ° Swiftã³ãŒãããã«ã¯ãå¶éæéå
ã«èŠä»¶ãæºããããã°ã©ã ããSwiftã§ããã«çãæžãããšããç«¶æã§ãç·åŒµæã®ããäžãåå è
ã®æ¹ã
ã®ã³ãŒãã£ã³ã°ã¹ããŒããšçºæ³åã«å§åãããŸããã LT倧äŒã¯ãåå è
ããµã€ãªãŠã ãæ¯ã£ãŠäŒå Žå
šäœãäžäœãšãªããã©ã€ãã®ãããªè³ãããªé°å²æ°ã§ããïŒç¹ã«å°è±¡çã ã£ãã®ã¯ã課éåšãã®LTãç¶ããæé垯ã§ããå瀟ããããã®ç¥èŠã工倫ãåçž®ãããŠããããšãŠãå匷ã«ãªããŸããã åããŠã®iOSDCã¯ãæè¡çãªåŠã³ã¯ãã¡ãããäœãããã³ãã¥ããã£ã®æž©ãããšç±éãèã§æããããæé«ã®äœéšã§ãããããŒã¹ã§ã®äº€æµãåºæ¿çãªã»ãã·ã§ã³ããããŠãŠããŒã¯ãªäŒç»ãŸã§ãšãŠãç±çæã®ããçŽ æŽãããã€ãã³ãã§ããïŒ æ©å· ç·š ã¿ã€ããŒã§iOSãšã³ãžãã¢ãããŠããæ©å·ã§ãã äžæšå¹Žã¶ãã«iOSDC Japan 2025ã«ãªãã©ã€ã³åå ããŠããŸããïŒä»å¹ŽããäŒå Žãå€ããããŸããã€ããšéãé°å²æ°ã§ãããïŒå人çã«ã¯ãèªå®
ããè¿ããªã£ãã®ã§å¬ããã§ãïŒã ããŠãããã€ãã®ã»ãã·ã§ã³ãèŽè¬ããäžã§ãç¹ã«åŠã³ãå€ãã£ãã®ãããã¹ã¯ã¹ãããçºè¡šãããã 5000äžããŠã³ããŒããè¶
ããæŒ«ç»ãµãŒãã¹ãæ¯ãããã°åºç€ã®èšèšéçºã®å
šãŠ ãã§ãã speakerdeck.com å€§èŠæš¡ãµãŒãã¹ã«ããããã°åºç€ãšãããæ®æ®µãªããªãç¥ãããšã®ã§ããªãé åã«ã€ããŠã詳现ãªã³ãŒãããŒã¹ã§ã®è§£èª¬ãå®è·µçãªç¥èŠãå
±æãããŠãããå€ãã®åŠã³ããããŸãããæ¬èšäºã§ã¯ãçºè¡šå
容ã®èŠç¹ãšç¹ã«å°è±¡ã«æ®ã£ãç¹ã«ã€ããŠãŸãšããŠãããŸãã çºè¡šã®èŠç¹ 1. æ°ãã°åºç€ãTrackerãã®èšèšææ³ãšç¹åŸŽ ããã©ãŒãã³ã¹ãšæè»æ§ã®åäžãç®çãšããã¢ãã³ãªæè¡ã¹ã¿ãã¯ãå
šé¢çã«æ¡çšãSwift 6ã® Sendable ã«æºæ ããèšèšãããŒã¹ã«ã䞊è¡åŠçã«ããé«ãããã©ãŒãã³ã¹ãgzip/deflateã«ããããŒã¿å§çž®ããããŠã¢ãã€ã«ç°å¢ã®äžå®å®ãªãããã¯ãŒã¯ãèæ
®ããExponential Backoffã«ããå
ç¢ãªãªãã©ã€æŠç¥ãäž»ãªç¹åŸŽãšããŠæããããŠããŸããã 2. Clean Architectureã«ãã責åã®åé¢ ã¢ãŒããã¯ãã£ã«ã¯Clean Architectureãæ¡çšãEntityãUse CaseãData LayerãPublic Interfaceãæç¢ºã«åé¢ããããšã§ãåã³ã³ããŒãã³ããç¬ç«ããŠæ©èœãããã¹ãå®¹ææ§ã倿Žå®¹ææ§ãæ Œæ®µã«åäžãããšã®ããšã§ãããããã«ãããå
šäœã§80%以äžãšããé«ããã¹ãã«ãã¬ããžãå®çŸããŠããŸããã 3. Firebase Remote ConfigãæŽ»çšããå®å
šãªç§»è¡æŠç¥ Firebase Remote Configããã©ã°ãšããŠå©çšããæ§åºç€ãšæ°åºç€ã䞊è¡çšŒåããããã€ã§ãåãæ»ããå¯èœãªç¶æ
ã§æ®µéçã«ç§»è¡ãé²ãããšãããéåžžã«çŸå®çã§ãªã¹ã¯ç®¡çã«åªããã¢ãããŒãã玹ä»ãããŸããã ç¹ã«å°è±¡ã«æ®ã£ãç¹ã»ææ³ ãã®çºè¡šã§ã¯ããã°åºç€ãšããããŒãã«çãŸãããå€§èŠæš¡ãªã¢ãã€ã«ã¢ããªéçºå
šè¬ã«åœ¹ç«ã€ç¥èŠãéæã«èŠãããŸããã ãã°ã®éä¿¡èªäœã¯ãŠãŒã¶ãŒã®ç®ã«èŠããªãéšåã§ãããã¡ã€ã³ã¹ã¬ããããããã¯ããªããã¡ã¢ãªãå§è¿«ããªããšãã£ã ãŠãŒã¶ãŒãã¡ãŒã¹ããªèŠç¹ ãšããã¹ãå®¹ææ§ãé«ããã¢ãŒããã¯ãã£èšèšãé«ããã¹ãã«ãã¬ããžãšãã£ã éçºè
ãšããŠã®ãã ãã ãèŠäºã«äž¡ç«ãããŠããããŸãã«ãŠãŒã¶ãŒãšéçºè
ã®åæ¹ã«ãšã£ãŠãWin-Winããªå
容ã ãšæããŸããã ãŸããFirebase Remote Configã®æŽ»çšæ³ãéåžžã«å°è±¡çã§ãããç¹ã«ã å°æ¥çã«å
šäœå
¬éããåæã®Configã¯ãããã©ã«ãå€ãtrueã«ããŠããããšã§ãç§»è¡å®äºåŸã«Configãåé€ã§ãã ããšããç¥èŠã¯ãç§èªèº«ãéå»ã«éã®èšèšã§å€±æããçµéšãããããããã倧å€å
±æããŸããã ãã®ããã«ãèªèº«ã®æ¥åã§ããã²åèã«ãããŠããã ãããåŠã³ã®å€ããçŽ æŽãããçºè¡šã§ããã åç° ç·š åã¯ä»å¹Žãäºåç®ã®iOSDCãžã®åå ã§ãããä»åãå¹
åºããžã£ã³ã«ã§è峿·±ãããŒã¯ããããããããŸããããã®äžã§ãåãæãé¢çœããšæããã»ãã·ã§ã³ã¯ã ãã£ãã ããã®ãç¬èªUIã§å®çŸããå€éšã¹ãã¬ãŒãžããã€ã¹ã®èªã¿æžããã§ããã fortee.jp å¶ç¶ãªã®ã§ãããã¡ããã©ãã®ããŒã¯ã®åæ¥ã«ãåãå人çã«èª¿æ»ãå§ãããããã¯ã§ããã åã«ãšã£ãŠã¯ãããããããªãããã¯ã ã£ãããšããã¢ã亀ããèŽè¬è
ãæ¹ãã€ããããŒã¯ãé
åçã«æããã®ã§ãã¡ãã®ããŒã¯ãéžã³ãŸããã ãã®ããŒã¯ã¯ãiPhoneã§æ®åœ±ããåçãã»ãããªããŒã¿ãå€éšã¹ãã¬ãŒãžã«çŽæ¥ä¿åããæ¹æ³ã玹ä»ããå
容ã§ãããŸã æ
å ±èªäœãå°ãªãããšããããAppleã®ãšãŽã¡ã³ãžã§ãªã¹ãã®æ¹ãšäžç·ã«èª¿æ»ãé²ããŠãå®è£
ãå®çŸãããšããœãŒãã亀ããããŒã¯ã«ãªããŸãã iPhoneã®ã«ã¡ã©ã§æ®åœ±ããåçãã»ãããªããŒã¿ãä¿åããå Žæãæ¹æ³ã¯ã倧ãã2ãã¿ãŒã³ãçšæãããŠããŸãã äžã€ç®ã®æ¹æ³ã¯ãiPhoneã®ã¹ãã¬ãŒãžã«ä¿åããæ¹æ³ã§ããããã¡ãã®æ¹æ³ã¯æãããç¥ãããŠããããµã³ãã«ã³ãŒããè±å¯ã§é£æåºŠã¯ãããŸã§é«ããããŸããã PhotoKit ãã¬ãŒã ã¯ãŒã¯ã䜿çšããããšã§ã10è¡çšåºŠã®ã³ãŒãã§å®çŸããããšãã§ããŸãã zenn.dev äºã€ç®ã®æ¹æ³ã¯ãiPhoneã«æ¥ç¶ããŠããå€éšã¹ãã¬ãŒãžã«ä¿åããæ¹æ³ã§ãããã¡ãã®æ¹æ³ã¯ãããã«2ãã¿ãŒã³ã«åãããŠããŸãã äžã€ç®ã®æ¹æ³ã¯ã UIDocumentPickerViewController ãŸãã¯ã.fileExporter ã¢ãã£ãã¡ã€ã¢ã䜿çšããæ¹æ³ã§ãããããã®APIã䜿çšããããšã§ãããŒã¿ãå€éšã¹ãã¬ãŒãžã«ä¿åããããšãã§ããŸãããããããããã®æ¹æ³ã§ã¯ããŠãŒã¶ãŒã«ããŒã¿ã®ä¿åå
ãéžãã§ãããå¿
èŠããããŸãããŠãŒã¶ãŒã¯ãããŒã¿ã®ä¿åå
ãéžæããããšãã§ããã¡ãªãããããäžæ¹ããŠãŒã¶ãŒã®æäœæ°ãå¢ãããŠããŸãããšã«ãªããŸãã ããã§ä»åã®ããŒã¯ã§ç»å ŽããAPIãã AVExternalStorageDevice ã§ããiOS 17ãã䜿çšå¯èœãªæ¯èŒçæ°ããAPIã§ãããã®APIãšé¢é£APIã䜿çšããããšã§ãiPhoneã«æ¥ç¶ããŠããå€éšã¹ãã¬ãŒãžã«ãããŒã¿ãçŽæ¥ä¿åã§ããŸããå®è£
ã³ã¹ããé«ããªããæ°åè¡çšåºŠã®ã³ãŒãã§æ¬æ©èœãå®çŸã§ããããšãç¥ããŠãåã«ãšã£ãŠã¯åŠã³ãå€ãããŒã¯ã§ããã æ¬ããŒã¯ã§ã¯ãå®éã«äŒå Žã§æ®åœ±ããåçããiPhoneã«æ¥ç¶ãããŠããå€éšã¹ãã¬ãŒãžã«çŽæ¥ä¿åããä¿åããããŒã¿äžèЧã衚瀺ãããšãã£ããã¢ããããæ¥œããããŒã¯ãèŽãããšãã§ããŸããã æè¿ã§ã¯ãé«ã¹ãã¬ãŒãžç«¯æ«ãé€ããŠã¯ãProRes LogããŒã¿ãæ®åœ±ããæã«å€éšã¹ãã¬ãŒãžãšã®æ¥ç¶ãå¿
é ã«ãªã£ãŠããŠããŸããä»åŸãå€éšã¹ãã¬ãŒãžæ¥ç¶ãå¿
é ã«ãªãæ©èœãå¢ãããããããªãç¶æ³ã«ãªãå¯èœæ§ãããã®ã§ãããã«æ·±æããé²ããŠã¿ãããšæããŸãã æåŸã« ãã®3æ¥éãéããŠæè¡çãªç¥èŠãæ·±ããããä¹
ããå人ã«äŒã£ãŠè©±ãããããšãã§ãããããææçŸ©ãªæéãéãããŸããããã®å ŽãçšæããŠãã ãã£ãiOSDCã¹ã¿ããã®æ¹ã
ãåå è
ã®ã¿ãªããæ¬åœã«ããããšãããããŸããïŒ äžèšã§ç޹ä»ããã»ãã·ã§ã³ä»¥å€ã«ãéåžžã«è峿·±ãã»ãã·ã§ã³ãå€ããããŸããã èšäºã«ããå
容ãããã®ä»ã®å
容ã«ã€ããŠããããã¿ã€ããŒã®ãšã³ãžãã¢ãšè©±ããããšããæ¹ãããã£ãããã°ãã²ãæ°è»œã«ã話ãããŸãããïŒ
ã¿ã€ããŒã®æ±ç°ã埳å¯ãç¥å±±ãäºäºãæ¡åãå¿è³ã§ãã KaigiPass ãšããå¶åºŠãå©çšã㊠Kaigi on Rails 2025 ã«åå ããŠããŸãããã¿ã€ããŒã¯æšå¹Žã«åŒãç¶ãã¹ãã³ãµãŒããããŠããã ããä»å¹Žã¯ãªããšå¹žããªããšã«ããŒã¹ãåºãããŠããã ããŸãããä»åã¯ãã㪠Kaigi on Rails 2025 ã®åå ã¬ããŒãã KaigiPass ãå©çšããã¡ã³ããŒã§èšè¿°ããŠããããšæããŸãã 2åå°ã§1500 examples å®èµ°ïŒçé CI ãæ¯ããç°å¢æ§ç¯è¡ Hiroshi Tokudomi https://kaigionrails.org/2025/talks/falcon8823/#day1 ã2åå°ã§1500 examples å®èµ°ïŒçé CI ãæ¯ããç°å¢æ§ç¯è¡ããšããã¿ã€ãã«éããCI ãã©ã®ããã«é«éåããŠãããã«ã€ããŠã®çºè¡šã§ããã åŒç€Ÿã§ãçŸåš self-host runner ã䜿ã£ãŠ GitHub Actions äžã§ CI ãåããŠããã2 äž 2 åä»¶ã®ãã¹ããå¹³å 9ã10 åçšåºŠã§å®è¡ããŠããŸããCI ã¯çããã°çãã»ã©ãããã®ãªã®ã§ããã®ã»ãã·ã§ã³ã¿ã€ãã«ãèŠããšãã«ãããã¯çµ¶å¯Ÿã«èŠã«è¡ããããšæã£ãã®ã§ããããŸãã«æåŸ
éãåèã«ãªãå
容ã§ããã ãã¹ãã䞊åã«åå²ããŠå®è¡ããæ¹æ³ãšã㊠Knapsack Pro ã玹ä»ãããŠãããèªåãã¡ã䜿ã£ãŠãã split-test ãšæ¯èŒããªããèãããšãã§ããŸãããKnapsack Pro ã¯å®è¡æéã®å±¥æŽãããšã«åå²ãæé©åã§ãããšã®ããšã§ãä»åŸæ€èšããŠã¿ãããšæããŸãã ãŸããEBS ã® I/O ãããã«ããã¯ã«ãªãããšã§ CI ãé
ããªã話ãå°è±¡çã§ãããåŒç€Ÿã§ã CI å®è¡ãéãªããš I/O 䜿çšçãã®ãªã®ãªãŸã§äžããããšããããtmpfs ã䜿ãããšã§æ¹åã§ããå¯èœæ§ãããã®ã§ã¯ããšã¯ã¯ã¯ã¯ããªããèããŠããŸããã ã¡ããã©æè¿ CI åºç€ã self-host runner ã«ç§»è¡ããã°ããïŒ åè ïŒãšããããšãããããæ¬¡ã¯ã©ãããã¥ãŒãã³ã°ã§ãããããšèããŠããã¿ã€ãã³ã°ã§ã®ã»ãã·ã§ã³ã ã£ãã®ã§ãå人çã«ã¯ããªãåºãããŸãããCI ãã©ãéããããã¯æ¥ã
ã®éçºäœéšã«çŽçµããããŒããªã®ã§ãä»åã®åŠã³ãæã¡åž°ã£ãŠæ¹åã«ã€ãªããŠããããã§ãã https://speakerdeck.com/falcon8823/2fen-tai-de1500exampleswan-zou-bao-su-ciwozhi-eruhuan-jing-gou-zhu-shu-kaigi-on-rails-2025 dynamic! Keisuke Kuwahara https://kaigionrails.org/2025/talks/moro/#day1 https://speakerdeck.com/moro/dynamic 1æ¥ç®ã®ããŒããŒããdynamic!ãã¯ãéçãªã¢ãããŒããšã¯å¯Ÿç
§çã«ãæåããå®ç§ãªãŽãŒã«ãç®æãã®ã§ã¯ãªããç¶ç¶çã«å€åããŠããããã»ã¹ãéèŠããããŒãã§ããã ã»ãã·ã§ã³ã§ã¯ãéçºã现ããé²ããããã®ç¬¬äžæ©ãšããŠããããããŒãã¹ãã®å®è£
ãéèŠã ãšåŒ·èª¿ãããŠããŸãããããããŒãã¹ãšã¯ããŠãŒã¶ãŒã䜿ãããæå°éãã€æãã·ã³ãã«ãªæ©èœãã®ããšã§ãããããããŸãå®è£
ããããšã§ãæ©ã段éã§ãã£ãŒãããã¯ãåŸãŠãæ¹åãµã€ã¯ã«ãåãããšãå¯èœã«ãªããŸãã ç¹ã«å°è±¡çã ã£ãã®ã¯ãéçºè
ã ãã§ãªããããŒã å
šäœã§å€åãèµ·ãããŠãããšããèãæ¹ã§ããç§èªèº«ãè€éãªæ©èœãå®è£
ããéãæåãããã¹ãŠãç¶²çŸ
ããããšæéããããçµæããããã¢ãããŠã¿ããšå€ãã®ãã£ãŒãããã¯ãããã£ãããšããçµéšããããŸãããã®æã¯ã§ããã ãææãããããªãããã«å®è£
ãããããšããæ°æã¡ã«ãªã£ãŠããŸããããä»åã®è©±ãèããŠãåããã®ããã¡æ©ãããŒã ã¡ã³ããŒãã¹ããŒã¯ãã«ããŒã«ç¢ºèªããŠããããæ©ããã£ãŒãããã¯ãåŸãããšã®éèŠæ§ãåèªèããŸããã ãŸããããŸã§ã¯ãåªç§ãªãšã³ãžãã¢ã»ã©ãäžçºã§å®ç§ãªãããã¯ããäœããã®ã ããšæŒ ç¶ãšæã£ãŠããŸããããå®éã¯éã§ãããçµéšè±å¯ãªãšã³ãžãã¢ã»ã©ãæå°éã®éçºããå§ããæ®µéçãªæ¹åãç©ã¿éããŠããã®ã ãšæ°ã¥ããŸããã ã¢ãžã£ã€ã«éçºã¯ä»ã®ããŒã ã§ã¯åœããåã«ãªã£ãŠããŸããããåçã«å€åãç¶ããããšãã®éèŠæ§ãæ¹ããŠæ·±ãæããŸãããå®ç§äž»çŸ©ã«ãšããããŠæåã®å®è£
ã«æéããããã®ã§ã¯ãªããå€åãæããã«ããã®æã
ã§æãã·ã³ãã«ãªæ¹æ³ãå®è·µããŠãããããšæããŸãã ãæè¡è² åµã«ãªããªãã»ééããªãã æš©é管çã®èšèšãšå®è£
Akitoshi Shiga https://kaigionrails.org/2025/talks/naro143/#day2 https://speakerdeck.com/naro143/ji-shu-fu-zhai-ninaranaijian-wei-enai-quan-xian-guan-li-noshe-ji-toshi-zhuang WebãµãŒãã¹ã«ãããŠé »åºã®èª²é¡ã§ããæš©é管çã«å¯ŸããŠãèªç€Ÿã®ãããã¯ãã§è¡ã£ãåãçµã¿ãçºè¡šãããŠããŸããã æš©é管çã®ãããã¡ãªã¢ã³ããã¿ãŒã³ãšããŠãæš©éã®å€å®ãå¿
èŠãªå Žæã§æäœè
ã®åœ¹å²ãå€å®ãããããªå®è£
ã«ã€ããŠãããããŠããŸããã äŸ: ããControllerã®createã¢ã¯ã·ã§ã³å
ã§ if admin? 圹å²ãå€å®ããå Žåã¯ãå€å®ããç®æã圹å²ããšã«äœãã§ããããææ¡ããå¿
èŠããããŸãã 圹å²ããšã®æš©éã¯ããµãŒãã¹å
容ãäºæ¥ç°å¢ã®å€åãæ¿ããç¶æ³ã«ãããŠã¯ããã«è€éåããŸãã ãã®äžããã®å®è£
ã§ã¯æš©éã倿Žãããã³ã«ããã¹ãŠã®å€å®ç®æã«æãå ããªããã°ãããŸããã ãã®çµæãšããŠããã«ä¿å®ãå°é£ã«ãªããŸãã ããã§ã圹å²=äœè
ã§ãããã§ã¯ãªãæš©é=äœãã§ããã ã«äŸåããããšããã®äžã§ãæš©é管çã«å¿
èŠãªèŠçŽ ã§ããã察象ããæäœãã圹å²ããæ¡ä»¶ãã«å¯Ÿããèšè¿°ãåé¢ã»ææåããèšèšãçºè¡šãããŠããŸããã å
·äœçã«ã¯ãmoduleåãããã察象ãããšã«ã圹å²ãã®ã¯ã©ã¹ãäœãããæäœãã«çŽã¥ããã¡ãœããå
ã§ãæ¡ä»¶ããå€å®ããå®è£
ãè¡ã£ãŠããŸããã ããã«ãã£ãŠã察象ããšã«åœ¹å²ãæäœãè¡ãããã®æ¡ä»¶ãéåžžã«ã·ã³ãã«ã«ãªããŸããã https://speakerdeck.com/naro143/ji-shu-fu-zhai-ninaranaijian-wei-enai-quan-xian-guan-li-noshe-ji-toshi-zhuang?slide=64 ãã®çµæãã«ã¹ã¿ããŒãµããŒãããããã¯ããããŒãžã£ãŒãGitHubã§ã³ãŒããèªãã§çè§£ã§ããããã«ãªãã瀟å
ããã®ãšã³ãžãã¢ãžã®æš©éã«é¢ããåãåããã0ã«ãªã£ãããã§ãã ææãšããŠãæäœãã察象ãå¢ãããã³ã«ãã¹ãŠã®åœ¹å²ã®ã¯ã©ã¹ãäœæããå¿
èŠããããã®ã®ãæ¡ä»¶ãšããã³ã¢ãªããžãã¯ã¯äžç®æã«éäžãããã®ã§ä¿å®ãããããã ãšæããŸããã ãŸããæš©éãšããè€éãªããžãã¹ããžãã¯ãéãšã³ãžãã¢ãçè§£ã§ããã»ã©ã·ã³ãã«ã«ã³ãŒãã§è¡šçŸãããŠããããšã«æéãåããŸããã è€éãªããžãã¹ããžãã¯ã«ã¡ãããšåãåã£ãŠã·ã³ãã«ãªè¡šçŸãç®æãããšã®å¹æãšå€§åããä»äžåºŠå®æããŸããã Railsã«ãã人工çãèšèšãå
¥é Yutaka Kamei https://kaigionrails.org/2025/talks/nay/#day1 äºäºã§ããäžèã®å€§å Žããã®ãã¡ãã®ã»ãã·ã§ã³ãçŽ æµã ãªãšæã£ãã®ã§ããã®ã»ã¯ã·ã§ã³ãæžãããŠããã ããŠããŸããç§ãªãã«ãã®çºè¡šãè§£éãããšãèšèšãããŸããªãæ¹æ³ã«ã€ããŠæ·±æãããå
容ã ã£ãã®ããªãšæããŸãããã® AI æä»£ã«ã³ãŒãã£ã³ã°ã AI ã«ä»»ããããšã¯å¢ããŠããäžã§ã人éãèšèšãã§ããããšã®éèŠæ§ããšãŠãé«ãŸã£ãŠããŸãããããªäžã§ãã©ã®ããã«ããŠãã£ãšããŸãèšèšãã§ããããã«ãªãã®ãïŒãšããã®ããèªèº«ã®å¶ç¶ã®çµéšãã圢åŒç¥ã«ããŠãŸãšããŠãã ãã£ãå
容ã§ããã 宿ããã·ã¹ãã ãæãæµ®ãã¹ãŠãããããéç®ãããŠèããŠãããšããã®ã§ã¯ãªããïŒãšããã®ãéèŠããã§ãããç§ã®çµéšã§ãããŽãŒã«ãæãæµ®ãã¹ãŠããã«è³ããŸã§ã®ãã€ã«ã¹ããŒã³ãæãã¹ããããéãããšããããæ¹ãããã®ã§ã¯ãªããïŒãšããããšã æã£ãŠãã ã®ã§éåžžã«çŽåŸæããããŸãããŸãã«å
šäœããéšåãžããšããæèãè¡ãããšã«ãã£ãŠããŸãèšèšãã§ããããšããèãæ¹ã§ããããããã«ã Ruby on Rails ã MVC ãããŒã¹ã«ãããã¬ãŒã ã¯ãŒã¯ã ãããšãã£ãŠãã¢ãã«âã³ã³ãããŒã©ãŒâãã¥ãŒãšããé çªã«æžãå¿
èŠããªãã§ãããããããã®é çªã§æžããšå
šäœãèŠããªãç¶æ
ã§éçºãããããšã«ãªãã®ã§ã次第ã«ã€ãã¯ãã ããã®ã³ãŒããçæãããŠããŸããŸãããã®å Žãã®ãã®ã³ãŒãã«ãªã£ãŠããŸããšããã¯ãããã¯ããã§ä»åŸã®ã¡ã³ããã³ã¹æ§ã«åœ±é¿ããŠããããã§ããããã¹ãç¶æ
ããããã¯æ¬è³ªçãªãŽãŒã«ãæããŠãããããéç®ãããããšããèãæ¹ã®èšèªåããšãŠãçŽ æµã§ããã ãŸããåä»ãã®éèŠæ§ã«ã€ããŠèªã£ãŠããããã®ãããã£ãã§ããã Ruby çéã§ã¯ãååéèŠããšããã®ã¯ããç¥ãããŠãããšæããŸãããèšèšã®äžã§ãªãåä»ããéèŠãªã®ãïŒãšããããšã«ã€ããŠã®èšèªåãã¯ãªã¢ã§ããããããã£ãã§ããããããã³ãŒãã®ã¬ãã«ã§ã¯ãªããæœè±¡åºŠã®é«ãã¬ãã«ã§çãååãã€ããªããèããé²ããŠããã¶ã€ã³ããŒãããåæšéžæãã仮眮ããããããšãéèŠãšãããããªããšããã£ããã£ãŠãããšæããŸããã仮眮ãããšããã¯ãŒãã£ã³ã°ãããã§ããããããã«ããæ±ºå®ããšãããšåŸæ»ããã§ããªãæããããŸãããã仮眮ãããšããã®ã¯ã倿Žã®äœå°ãããããšãã瀺åããæããããŠãæ¥æ¬äººãšããŠããããæ¥æ¬èªè¡šçŸãå©çšã§ããã®ã¯ãšãŠãã©ãããŒã ãªãšæããŸããããããã°ãã仮眮ããã§æãåºããŸãããããã®ã»ãã·ã§ã³ã§åç
§ãããããŒããŒãã® dynamic! ã«ããã£ãããã«ããªãã·ã§ããªãã£ãŒã«ã€ããŠèšåãæè¿å¢ããŸããããã仮眮ãããšããçšèªã«ããªãã·ã§ã³ãšãããã¥ã¢ã³ã¹ãæããŸãããTidy First?ããèªãã§ç§ãªãã«ãªãã·ã§ã³ã«ã€ããŠçè§£ãããŠããã€ããã§ããããããããŠãããããªç»å£ãèããŠç§ãªãã®è§£éããããããã£ãŠãããªäºæãããŠãããããæããŠããŸããã¿ã㪠Kent Beck ã奜ãã§ããããç§ãã§ãã 仿¹ããŠServiceã¯ã©ã¹ã«ã€ããŠèãã ãããRailséçºè
ã®10幎ã Yuki Eda (edy) https://kaigionrails.org/2025/talks/joker1007/#day1 Ruby on Railsã§ã¢ããªã±ãŒã·ã§ã³éçºã«åŸäºããŠãããšã³ãžãã¢ã§ããã°äžåºŠã¯éãã§ãããServiceã¯ã©ã¹ã2025幎ã®ãã®ã¿ã€ãã³ã°ã§jokerããããã®ã¿ã€ãã³ã°ã§çºè¡šãè¡ãçç±ãæ°ã«ãªãèŠèŽããŸããã åé ã§æŽå²çãªçµç·¯ãå«ããŠæ¥æ¬åœå
ã§åžæããèæ¯ã®èå¯ãããããŒãã§ã¯ãRuby on Railsãã«ãŠServiceã¯ã©ã¹ã顿ã«å·çãããåœæã®æå³ãå·çåŸæ°å¹Žçµã£ãŠããã®[Qiitaã§ã®ãšã³ããª]( https://qiita.com/joker1007/items/25de535cd8bb2857a685 )ãªã©ã«è§Šãããã€ã€ãServiceã¯ã©ã¹ã«å¯ŸããŠã¯åºæ¥ãéã䜿ããªãæ¹ãè¯ããšçµè«ã¥ããããŠããŸãããçç±ã¯ãéçºçµ±å¶ã®å°é£ããäžåãã¡ãªãããåŸãããªãããšã®ããšã ãã®ç¹ãç§ãæãåœããç¯ã¯ãããäŸãã°Fat Modelãè§£æ¶ããææ®µãšããŠServiceã¯ã©ã¹ãéžæããŠããéå»ããããŸããé©åãªåœåä»ãããããšããŠããã¢ããªã±ãŒã·ã§ã³ã®æé·ãæ°å¹Žéã®éçšã®éçšã§ç¹å®ã®ãã¡ã€ã³ã ãã®åŠçã§çãŸããã«è¥å€§åãããã©ã³ã¶ã¯ã·ã§ã³ã¹ã¯ãªããã«ãªãåŸåããããšæããŸããããã¯jokerãããèšåãããŠãããåºæºã®äœãã«ãããããæ¥ãéšåããé©åãªãã¡ã€ã³ã¢ããªã³ã°ãæ ã£ãçµæã®2ã€ã倧ããªåå ã ãšãçºè¡šãèããªããæ¹ããŠèããããããŸããã çµå±ã®ãšãããããžãã¹ã«ãããé¢å¿äºã顧客ãããŒã ã¡ã³ããŒã亀ããªããã·ã¹ãã å
ã§ããŸãå
·åã«è¡šçŸã§ãããããããã®äžå¯§ãªæœè±¡åãšå
·äœåã®ç¹°ãè¿ãäœæ¥ã倧äºã§ãServiceã¯ã©ã¹ãããã§ãã察æéЬãšããŠæããããããšã®å€ãFormã¯ã©ã¹ãå«ããŠããã¶ã€ã³æ¹æ³ã¯è¡šçŸææ³ã®äžã€ã«éããªããšããããšã§ããã çºè¡šã®æ«å°Ÿã®ã¹ã©ã€ãã®ãæ£è§£ã¯ãªããäžç·ã«èãç¶ããŸããããããœãããŠã§ã¢èšèšã¯ç¶ç¶çãªå¶ã¿ããéåžžã«å°è±¡çã§å¿ã«çããŠãããããšæããŸããã å±¥æŽ on Rails : Bitemporal Data Modelã§å®çŸããå±¥æŽç®¡ç Daichi Kamiyama - dak2 https://kaigionrails.org/2025/talks/hypermkt/#day2 https://speakerdeck.com/hypermkt/history-on-rails-with-bitemporal-data-model çŽè¿ã§å±¥æŽãæ®ããã©ããã®èšèšã«é ãæ©ãŸããããšããããBitemporal Data Model ã§ã®å±¥æŽç®¡çã®è¯ãæªããæ°ã«ãªã£ãã®ã§ãæèŠãããŠããããŸããã å±¥æŽããŒãã«ã®ãã¿ãŒã³ãšããŠåèã«ãªãã®ã¯ãäžäŒããã® https://user-first.ikyu.co.jp/entry/history-table ãã®ã¹ã©ã€ããéåžžã«åèã«ãªããšæã£ãŠããŸããæ®éã«âå±¥æŽâãšããæŠå¿µã衚çŸããã®ã§ããã°ããã®ã¹ã©ã€ãã®å
å®¹ã«æ²¿ã£ãŠå ŽååãããŠããã°å€ãã®å Žåã¯ç¶²çŸ
ã§ããããããªãããšæã£ãŠããŸãã ãã ãSmartHR ãããæ±ããã¡ã€ã³ãšã㊠âåŸæ¥å¡ãèµ·ç¹ãšããå€åâ ã«åãåã£ãŠããå Žåããããšããåãã£ãåºæ¥äºãæ£ããæ¥ä»ã§åæ ãããããšããããŒãºãããããã§ãã確ãã«èšãããŠã¿ãã°ããã§ãããã ã¬ã³ãŒããšããŠæå¹ãªæéïŒex. 2025/09/26 ãŸã§ã«åœ¹è·ãéšé·ã ã£ãïŒãšãæäœæéã®2ã€ã®æé軞ã§å±¥æŽã管çããã³ã³ã»ããã Bitemporal Data Model ã§ããæå¹ãªæéã ãã ãšããã®ã¬ã³ãŒãããã€ç»é²/ç¡å¹ã«ãªã£ããã®äºå®ãæãèœã¡ãã®ã§ã2ã€ã®æé軞ã§ç®¡çããããšãã話ã®ããã§ãã ãããšçŽæçã«æã£ãã®ã¯2ã€ã®æé軞ãèæ
®ããªããšãããªãã®ã§ãèããããšãæãç®ã§å¢ããŠããŸãæžå¿µãæã¡ãŸãããSQL ãè€éã«ãªãããã§ããããåŸããæå¹ãªæéã远å ãããå Žåã«ãæå¹æéãéè€ããŠã¯ãããªããšæãã®ã§ãããã®å¶çŽã Model ã®ããªããŒã·ã§ã³ãDatabase ã®å¶çŽãšãã«èæ
®ããå¿
èŠã¯ãããã ãããªãšãã ã¹ã©ã€ãã§ãæ³å®å€ã®å±¥æŽããŒã¿ãäœãããŠããããšããããåå 調æ»ã«äžžäžæ¥ããã£ããšããèšåããããŠããŸãããåºæ¬çã« INSERT ãããã¯ããªã®ã§ãããããåé¡ãšãªã£ãŠããããŒã¿ãç¹å®ããã®ã«æéãããããšããã®ã¯ãããã ãããªãšãactiverecord-bitemporal gem ã§ã¯ visualizer æ©èœããããã¬ã³ãŒãã®å±¥æŽãå¯èŠåããŠãããããã§ãã æå¹æéã®æ¥ä»ç®¡çã timestamp ã ãšæåç§ã®ç®¡çããããããdate åã«å€æŽããŠéçšå®¹ææ§ãæ
ä¿ãããšãã話ãè峿·±ãã£ãã§ãããã®éšåã§æå³ããªãã¬ã³ãŒããçãŸããã±ãŒã¹ã¯ããããã ãªãšæã£ãŠãããšããã https://tech.smarthr.jp/entry/2025/09/12/115617 ãæèŠãããŸãã«ãã®åé¡ããã£ãããã§ãããâå±¥æŽã®äžæ¬åºååŸãExcelã§é©çšæ¥ãç·šéãããšExcelã®ä»æ§ã§æåç§ã®æ
å ±ãã00:00:00ãã«äžžããããŠããŸãâãâäŸãã°éšçœ²ãã¹ã¿ãŒã®æŽæ°ãäžŠã¹æ¿ããåé€ãåŸæ¥å¡éšçœ²ã®ç»é²ãæŽæ°ãªã©ã§ã¯å€æ°ã®ã¢ãã«ãåäžãã©ã³ã¶ã¯ã·ã§ã³ã§æŽæ°ãããŸãã ãã®ãšããé©çšæ¥ã®æå»ãåºå®ããŠæããªããšãåŠçã¿ã€ãã³ã°ã®å
ããªãºã¬ã«ãã£ãŠé©çšæ¥ãç§æªæºã®ç²ŸåºŠã§ç°ãªã£ãå±¥æŽãäœæãããŠããŸãâ ãâåäžé©çšæ¥ã®æŽæ°ã«ãããŠã瀟å¡çªå·ãšé©çšæ¥ã®çµã¿åããã§ã¬ã³ãŒããç¹å®ããéããŠãŒã¶ãŒããç§æªæºãåãäžããæ¥æãåãåããç§æªæºãèæ
®ããŠå¯Ÿè±¡ã®å±¥æŽãæ¢ãâ ãªã©ãªã©ãããªãè² ã®åŽé¢ãæ±ããŠããããã§ãã倧å€ãªç§»è¡ã ã£ãããã§ããããšãŠãæå³ã®ããç§»è¡ã ãªãšæããªããæèŠããŸãããdate åã ãš unique å¶çŽã«ãã£ãŠéè€ã匟ãããããªããŸãããã âå±¥æŽâ ã衚çŸãã1ã€ã®ææ®µãšã㊠Bitemporal Data Model ã䜿ã£ããªã¢ã«ãªå£°ãå
¬éãããŠããã®ã¯ãæ¬åœã«å¬ããã§ããããšãŠãåèã«ãªã話ãèããŸãããä»åŸã¢ããªã³ã°ããéã¯ã1ã€ã®ææ®µãšããŠé ã®çé
ã«ã€ã³ããã¯ã¹ã貌ã£ãŠããããšæããŸããã Kaigi on Rails 2025 ã«åå ããã¿ã€ããŒã®ã¡ã³ããŒ
ããã«ã¡ã¯! ã¿ã€ããŒã§ããŒã¿ã¢ããªã¹ããããŠããtakahideã§ãã çªç¶ã§ãããããã®äºæ¥ãæåãããã«ã¯ã©ãããã°ïŒããšãã£ãããµããããšå€§ããªããŒããæž¡ãããŠããããŠãã©ãããæãã€ãããã...ã ãšæ©ãã çµéšã¯ãããŸãããïŒ ã¿ã€ããŒã§ããä»åŸããäŒç€Ÿã®éèŠèª²é¡ã«é¢ããåæãããžã§ã¯ããå¢ããäžã§ãããããäžæµã®èª²é¡ãèŠã€ãã粟床ã®é«ã仮説ãç«ãŠãåãããããã課é¡çºèŠã»ä»®èª¬æèåãã®éèŠæ§ãé«ãŸããšèããŠããŸãã æ¬èšäºã§ã¯ãã仮説åäžãããžã§ã¯ããã§ã®åãçµã¿ãå
ã«ãè€éãªèª²é¡ãæ§é åããå
·äœçãªã¢ã¯ã·ã§ã³ã«ç¹ããããã®æèæŽçè¡ãã玹ä»ããŸãã ãã®èšäºããåãããã«èª²é¡çºèŠã«æ©ãæ¹ã
ã®å©ãã«å°ãã§ããªãã°å¹žãã§ãã ãç¥ã£ãŠããããšãã§ãããã®å£ æèã®ããã»ã¹ãå¯èŠåããã仮説åäžãããžã§ã¯ãã æèæŽçã®ã3ã€ã®ã¹ãããã 1. ãåããããã5W1Hããžã®æŽç 2. ã5W1HããããFlywheelããžã®èœãšã蟌㿠3. ãFlywheelããããå®çŸ©ãã®åæŽçãž ä»åŸã®å±æ:æèããã»ã¹ãAIãçšããŠã¹ã±ãŒã«ããã Weâre Hiring! ãç¥ã£ãŠããããšãã§ãããã®å£ ãããŸã§ãããŒã¿ã¢ããªãã£ã¯ã¹éšã§ã¯ãäºæ¥éšã®ã¡ã³ããŒåãã«ä»®èª¬æ§ç¯ã®å匷äŒãéããŠããŸããã1åç®ã¯ä»®èª¬ã®ã¿ãããä»®èª¬ã®æšãè²ãŠãã仮説æ§ç¯ãã®å
šäœåãã2åç®ã§ã¯è«çãæŽçããããã®ã䟿å©ãªéå
· (ãã¬ãŒã ã¯ãŒã¯)ãã«ã€ããŠè¡ããŸããã ãããã§ãããŒã å
ã§ã仮説ããšããèšèã®ç®ç·ã¯äžå®æã£ãã®ããªããšæã£ãŠããŸããäžæ¹ãç¥èãšããŠãç¥ã£ãŠãããããšãšãå®è·µã§ã䜿ãããªãããããšã®éã«ã¯ãæã£ã以äžã«å€§ããªéããããããŸãã(åœããåã§ã¯ãããŸãããã)ã æèã®ããã»ã¹ãå¯èŠåããã仮説åäžãããžã§ã¯ãã ããã§ããã®å£ãä¹ãè¶ããããã«ãå®éšçãªã仮説åäžãããžã§ã¯ãããç«ã¡äžããŸããã ãã®ãããžã§ã¯ãã®ç®çã¯ããšãŠãã·ã³ãã«ã§ãã ãåããç«ãŠãåãåŒãäžããããšãã åæã®ç²ŸåºŠã¯ãæåã®ãåããã®è³ªã§ãã®ã»ãšãã©ã決ãŸã£ãŠããŸããŸããMECE (ã¢ã¬ãªããããããªã) ãããžãã¯ããªãŒãšãã£ããã¬ãŒã ã¯ãŒã¯ãšãã£ã調çåšå
·ã䜿ãåã«ããããããã©ã®é£æãã©ãæçããã¹ãã?ã ãšãããèŠç«ãŠãå (çŽ æã®ç®å©ã)ããéããããšã«ãã©ãŒã«ã¹ããŠã¿ãŸããã å
·äœçã«ã¯ãäŒç€ŸãšããŠã®éèŠããŒãã顿ã«ãã¡ã³ããŒãš1on1圢åŒã§ãã£ã¹ã«ãã·ã§ã³ãéããŸããããã®æœè±¡çãªãé¡ããã©ãæŽçããå
·äœçãªåæããŒãã«èœãšã蟌ãã§ãããããã®æèããã»ã¹ãç¹°ãè¿ããŸããã æèæŽçã®ã3ã€ã®ã¹ãããã ãã®å®éšçãªåãçµã¿ãæ°åç¹°ãè¿ãäžã§ãæå¿ãã®ããæèæŽçã®ããã»ã¹ãèŠããŠããŸããã 1. ãåããããã5W1Hããžã®æŽç ãã¹ãŠã¯ãäžã€ã®å€§ããªãåããããå§ãŸããŸããç¹ã«äŒç€Ÿã®éèŠèª²é¡ã«ã€ãªãããããªæœè±¡çãªåãã®å Žåããã®ãŸãŸã§ã¯ãã©ãããæãã€ããã°è¯ãã倿ããã¥ããã§ãã ããã§ããŸãã¯åããå
·äœçãªèŠçŽ ã«åè§£ããããšã§ããã®åŸã®ããã»ã¹ãã¹ã ãŒãºã«é²ãããšãåãããŸããã ç¹ã«ã5W1Hã¯åããå
·äœåããåææ®µéã«ãããŠãã·ã³ãã«ã§ãã䟿å©ãªãã¬ãŒã ã§ããã Who (誰ã) ãŸããã誰ã«ãšã£ãŠã®æåãªã®ã?ããå®çŸ©ããŸããç¹ã«ç§ãã¡ã®ãããªãã©ãããã©ãŒã äºæ¥ã§ã¯ãé¢ãããã¬ã€ã€ãŒãè€æ°ååšããŸããäŸãã°ããã¯ãŒã«ãŒããšãäºæ¥è
ãã§ãã What (äœã) 次ã«ããã®æ°ããäºæ¥ããå
·äœçã«äœã䟡å€ãšããŠæäŸããã®ããããããããã®ãã¬ã€ã€ãŒã®ç®ç·ã§å®çŸ©ããŸãã Why (ãªã) ãããŠãããããã®ãã¬ã€ã€ãŒãããªããæäŸããã䟡å€ã«é¢å¿ãæã£ãŠãé¢ãããããïŒããšããåæ©ãæ·±æãããŸããæäŸè
ãæ±ãããäžå®å®ããžã®äžæºãããå©çšè
ãæãããæ¢åãµãŒãã¹ãžã®ã³ã¹ããå質é¢ã®èª²é¡ããªã©ã äžã€ã®åããæ§ã
ãªèŠç¹ããåè§£ããŠããããšã§ãæŒ ç¶ãšããŠããããŒãã®èŒªéãèŠããŠããŸããããŒã å
šå¡ã®ç®ç·ãåãããåæã®ãã¬ããªããããã®æãéèŠãªåå°äœããšèããŠããŸãã 2. ã5W1HããããFlywheelããžã®èœãšã蟌㿠5W1Hã§äºæ¥ã®æ§æèŠçŽ ãæŽãåºããããæ¬¡ã«è¡ãã®ãFlywheel (ã¯ãã¿è»)ãžã®èœãšã蟌ã¿ã§ãã Flywheelãšã¯ãäºæ¥ããäžåºŠåãã°èªåŸçã«æé·ããŠãããµã€ã¯ã«ããšããŠæããããã®æèããŒã«ã§ãããäœãã©ãäœçšããŠã次ã®ã©ããªçµæã«ç¹ããã®ãïŒã ãšããäžé£ã®å æé¢ä¿ã®ã«ãŒããšããŠå¯èŠåããããšã§ãäºæ¥æé·ã®ãšã³ãžã³ãã©ãã«ããã®ããç¹å®ãããããªããŸãã ç§ãã¡ã®ãããªãã©ãããã©ãŒã äºæ¥ãäŸã«èããŠã¿ãŸãã 1. ãŸããäºæ¥ã®æé·ãä¿ãããã®ã¢ã¯ã·ã§ã³ããããŸããäŸãã°ãããŒã±ãã£ã³ã°æœçãå¶æ¥æŽ»åã«ãã£ãŠãã¯ãŒã«ãŒã®é客ã匷åãããšããŸãã 2. ãã©ãããã©ãŒã äžã®ã¯ãŒã«ãŒãå¢ãããšã人æãæ¢ããŠããäºæ¥è
ã«ãšã£ãŠã®é
åãå¢ããããããªãè¯ã人ãèŠã€ããããã ããšäºæ¥è
ã®å©çšãå¢å ããŸãã 3. äºæ¥è
ã®å©çšãå¢ããã°ãä»äºã®åéä»¶æ°ãå¢ããŸãã 4. ä»äºãå¢ããããšã§ãã¯ãŒã«ãŒã¯ããå€ãã®å°±æ¥æ©äŒãåŸãããšãã§ããæºè¶³åºŠãé«ãŸããŸãã 5. æºè¶³ããã¯ãŒã«ãŒããªããŒããããšãäºæ¥è
ã®æºè¶³åºŠã«ãç¹ãããŸããæºè¶³ããäºæ¥è
ã¯ç¶ç¶çã«å©çšããããã«å€ãã®ä»äºãåéããŠãããŸãã ãã®ããã«ããã¯ãŒã«ãŒã®å¢å â äºæ¥è
ã®å¢å â ä»äºã®å¢å â ã¯ãŒã«ãŒã®æºè¶³åºŠåäž â äºæ¥è
ã®æºè¶³åºŠåäž â ãããªãã¯ãŒã«ãŒãšäºæ¥è
ã®å¢å ...ã ãšããããã«ãçæ¹ã®æºè¶³ãããçæ¹ã®æºè¶³ãåŒã³ãéªã ããŸåŒã«äºæ¥ãæé·ããŠãã奜埪ç°ãçãŸããŸãã ãã®å³ãæããŠå
±éèªèãåŸãããšã§ãããã®ãµã€ã¯ã«ã®ã©ãã«ãšãã«ã®ãŒã泚ãã°ãæãå¹ççã«å
šäœãå éãããããã®ã?ã ãšãããäºæ¥æŠç¥ã®åæãèŠããŠããŸãã 3. ãFlywheelããããå®çŸ©ãã®åæŽçãž æåŸã®ã¹ãããã¯ãFlywheelã§äºæ¥å
šäœã®ãµã€ã¯ã«ã俯ç°ããªãããããäžåºŠæåã®åãã«ç«ã¡è¿ãããå®çŸ©ã®åæŽçãã§ãã 5W1Hã§åèŠçŽ ãåè§£ã(ç¹ã®çè§£)ãFlywheelã§ãããã®å æé¢ä¿ãç¹ãåããã(ç·ã®çè§£) ããšã§ãäºæ¥ãäžã€ã®åçãªã·ã¹ãã ãšããŠæããããããã«ãªããŸãããã®èŠç¹ãæã€ãšãåœåãŒããããšèšå®ããŠããèšèã®å®çŸ©ããããè§£å床ã®é«ããå
·äœçãªãã®ã«å€åããŠããããšã«æ°ã¥ããŸãã ç¹ã«ãæ±ããããŠãããæåãããFlywheelã®ã©ã®éšåããã©ã®ããã«åãããšãªã®ã?ããšããåãã«å€ãããŸãã ãçæçãªå£²äžããæåãšããã°ãæ°èŠç²åŸããããã³ã°çãšãã£ãå転æ°ãäžããããã®åæã«éäžããŸãã äžæ¹ããé·æçãªæé·ããæåã§ããã°ããªããŒãçãè©äŸ¡ãšãã£ã質ãé«ããé å¿åã匷ããããã®åæã«æ³šåããŸãã ãã®ããã«ãæœè±¡çãªèšèããå
·äœçãªææšãã¢ã¯ã·ã§ã³ãšçµã³ã€ãããããªããŸãã ãã®ã¹ããããè¡ãããšã§ãåæãåããã¹ããŽãŒã«ãæç¢ºã«ãªãããã®ç²ŸåºŠãé«ãŸããšæããŸãã ä»åŸã®å±æ:æèããã»ã¹ãAIãçšããŠã¹ã±ãŒã«ããã ä»åŸã¯ãæ¬ãããžã§ã¯ãã§åŸãããç¥èŠãåºã«ãAIãšã®å¯Ÿè©±ãéããŠåæ§ã®ã¯ãŒã¯ã誰ã§ãå®çŸã§ããä»çµã¿ãäœããããšèããŠããŸã(äŸãã°ä»¥äžã®ãããªãã®ãæ³å®ããŠããŸã)ã 1. åæããããåãããAIã«å
¥åãã 2. AIã察話圢åŒã§åæããŒãããµããŒããã 3. 仮説ãéžæã»ç·šéãã 4. æçµçãªåæãã©ã³ãææ¡ããã ç§ãã¡ã®ææŠã¯ãŸã å§ãŸã£ãã°ããã§ããããŒã¿ãã䟡å€ãçã¿åºãããã«ããããããã¢ããªã¹ãèªèº«ã®ãèããåãã磚ãç¶ããŠãããããšæããŸãã Weâre Hiring! ã¿ã€ããŒã®ããŒã¿ã¢ããªãã£ã¯ã¹éšã§ã¯ããšãã«åãã¡ã³ããŒãåéããŠããŸãïŒïŒ ã«ãžã¥ã¢ã«é¢è« ãè¡ã£ãŠããŸãã®ã§ãå°ãã§ãèå³ããããŸããããæ°è»œã«ãé£çµ¡ãã ããã
ã¯ããã« ã¿ã€ããŒã§Androidãšã³ãžãã¢ãããŠãããµãªã¡ã§ãã æ¬èšäºã¯ã ãDroidKaigi 2025 åå ã¬ããŒããPart 1ãã ã®èšäºã®ç¶ãã«ãªããŸãïŒ ãŸã Part 1ãèªãã§ãªããïŒãšèšãæ¹ã¯ããã²Part 1ãèªãã§ããã ãããšå¬ããã§ãã æ¬èšäºïŒPart 2ïŒã§ã¯ãPart 1ããç¶ããŠãšã³ãžãã¢ã¡ã³ããŒã«ããã»ãã·ã§ã³ã¬ããŒããšãã¿ã€ããŒã®ããŒã¹åºå±ã®æ§åããå±ãããŸã ð£ ãšã³ãžãã¢ã«ããã»ãã·ã§ã³ã¬ããŒã nakagawa 玹ä»ããã»ãã·ã§ã³ïŒ Gemini ãšãŒãžã§ã³ãã§ Android Studio éçºãé«éå ã¿ã€ããŒã§ã¯droidkaigiã§ããŒã¹ãåºããŠãããå€ãæ¹ã«è¶³ãæ¢ããŠããã ãããšãã§ããŸããã ããŒã¹ã«ç«ã£ãŠããäžã§åæ¥ã«ã©ããèŠèŠãã®ããæ¹ãããã£ããããããäŒãããããšãããŸããã£ãïŒããšèããŠã¿ãããç¹ã«é¢èã¯ãªããšã®ããšâŠ ç¿æ¥ã«èŽè¬ããã»ãã·ã§ã³ã§ãã®æ¹ãç»å£ããŠããããã®æã«æ°ã¥ããŸããã ããã®äººãYouTubeã®Geminiã§E2Eãã¹ãã®åç»ã«åºãŠã人ã ïŒïŒã www.youtube.com ã»ãã·ã§ã³ã§ã¯YouTubeã§èŠãŠæªæ¥ã«æãã銳ããŠããGeminiãèªç¶èšèªã§èšè¿°ããããã¹ããå®è¡ããJourneyã®ã©ã€ããã¢ãèŠãããšãã§ããã¡ããã©åœæ¥ã«Android Studio Canaryã§ãªãªãŒã¹ãããã°ãããšã®ããšã§ããã ãã¢ã§ã¯æ¥æ¬èªã§èšè¿°ããŠå®è¡çµæã®ã¹ã¯ãªãŒã³ã·ã§ãããšãã®çµæãšãã®æ ¹æ ãããã¹ãã§åºåããŠãããã¡ã³ããã³ã¹ã³ã¹ããäœãE2Eãã¹ãã®å®è£
ãã§ãããã ãšæããŸããã åŸã«Ask the speakerã«è³ªåããã«ãããèŠèŠãããã£ãçç±ã®è©±ãããã®ã§ãããã圌ã¯YouTube Famousã ãããããšäžç·ã«ç»å£ãããŠããMandaãããç¬ã£ãŠããŸããã ãCIã§åãããã«ãªãã®ã¯ãã€ã§ããïŒããšäŒºã£ããšãããçµ¶è³éçºäžãšã®ããšã§ãããæåŸ
ã§ãã DroidKaigiããåž°ã£ãŠãã£ããã¿ã€ããŒã®ãããžã§ã¯ãã§è©ŠããŠã¿ãŸãããããŸã åããªããâŠïŒBuild Logic䜿ã£ãŠãããããããŸã ããŸãèªããŠãªããããªæ°ãããŠããŸããããŸã ãã£ãããšã¯èŠããŠããŸãããå®å®çã«äœ¿ããããã«ãªã£ããå®éã®éçšã§äœ¿ããã詊ããŠã¿ãããšæããŸããã murataïŒ @murata ïŒ çŽ¹ä»ããã»ãã·ã§ã³ïŒ Cache Me If You Can RyuNen344ããã«ãããCache Me If You Canãã¯ãå€ãã®Androidéçºè
ã"äœãšãªã"ã§äœ¿ã£ãŠããŸããã¡ãª Gradleã®ãã£ãã·ã¥æ©æ§ ã«æ·±ãè¿«ãã»ãã·ã§ã³ã§ããã ç§èªèº«ãGradleã¯ãã©ãã¯ããã¯ã¹åç¶ã§ããã«ããšã©ãŒãèµ·ãããã³ã«Stack Overflowã圷埚ãâŠãããªå Žåœããçãªå¯Ÿå¿ãç¹°ãè¿ããŠããŸããããã®ã»ãã·ã§ã³ã¯ããããªç§ã®Gradleã«å¯ŸããèŠææèãæã¡ç ŽãããŸãã«ç®ããé±ã®å
容ã§ããïŒ ã»ãã·ã§ã³ã§åŸãç¥èãå
ã«ãã£ãããããžã§ã¯ãã®Gradleèšå®ãèŠçŽãããšããããã«ãããã©ãŒãã³ã¹ã«ã€ãªãã以äžã®æ¹åãå®çŸã§ããŸããã Configuration CacheãšäžŠåå®è¡ã®æå¹å ïŒ org.gradle.configuration-cache.parallel=true ïŒ ç°å¢å€æ°ãåç
§ããŠãã System.env() ã Provider API ã«çœ®ãæã éåžžã®ãã«ãã§ã¯äžèŠãªã¿ã¹ã¯ãæäŸãããã©ã°ã€ã³ã®é©ç𿹿³ãæé©å ãããŸã§ã¯Configuration Cacheãå¹ããã«é ãæ©ãŸããããšãå€ã
ãããŸããããä»ã§ã¯ãã®ã»ãã·ã§ã³ã§åŠãã ç¥èãæŠåšã«ãèªä¿¡ãæã£ãŠåå ã調æ»ã§ããæ°ãããŠããŸãð ãGradleã®ãã«ãé
ããªâŠã§ãããããããªãããåŸåãïŒããšãªã£ãŠãããããã®ããªãïŒ ãã²æ¬ã»ãã·ã§ã³ã®ã¢ãŒã«ã€ãåç»ãèŠèŽããŠãäžç·ã«Gradleã®äžçãåãæããŠã¿ãŸãããïŒð ã¹ãã³ãµãŒããŒã¹ãå€§çæ³ã§ããð DevRelã®ã¿ãŒãïŒ @earlgrayMK ïŒã§ãã ä»åã¿ã€ããŒã§ã¯ãŽãŒã«ãã¹ãã³ãµãŒãšããŠããŒã¹ãåºå±ããŸããã å€ãã®æ¹ã«ãç«ã¡å¯ãããã ããããããšãããããŸãïŒ ã¹ãããã€ããšããŠã¢ã³ã±ãŒãã®ãä»äºãã¿ãªããã«ãé¡ãããããããã®åçãããã ããã®ã§ã玹ä»ããŸãã ã¿ãªããã®ãæç¥šã®çµæãAndroidéçºã«ãããŠæãå°é£ã ãšæããããŠããã®ã¯ããæ¢åã³ãŒãããŒã¹ã®ä¿å®ã»æ¹åããšãOSããŒãžã§ã³ã»ããã€ã¹ã®å€æ§æ§ãã§ããããšãæããã«ãªããŸããã ãã®æ ¹æ·±ã課é¡ã«å¯ŸããŠãã¿ã€ããŒã®Androidãšã³ãžãã¢ãã©ã®ããã«åãåã£ãŠããã®ããå
·äœçãªåãçµã¿ããŸãšããŸããã 1. OSããŒãžã§ã³ã»ããã€ã¹ã®å€æ§æ§ãžã®å¯Ÿå¿ èªåãã¹ãã®æŽ»çš ãã¹ãèªååããŒã«ãMagicPodããå°å
¥ãããµããŒã察象OSã®äžäžéããŒãžã§ã³ã§æ¯æ¥ãã¹ããå®è¡ãåºç¯å²ã®ç°å¢ãå¹ççã«ã«ããŒããŠããŸãã 倿§ãªç©çããã€ã¹ã§ã®æ€èšŒ å€éšã®QAããŒã ããã¯ã©ãŠãåæ€èšŒãµãŒãã¹ãRemoteTestKitããæŽ»çšãããã«ã瀟å
Slackã§ç¹å®ç«¯æ«ãæã€ã¡ã³ããŒã«ååãä»°ããªã©ãç©çããã€ã¹ã§ã®å®æ©æ€èšŒã培åºããŠããŸããå人çã«æãããã¿ã¹ããã賌å
¥ããæ€èšŒã«æŽ»ããéçºè
ãããŸãã 2. æ¢åã³ãŒãããŒã¹ã®ä¿å®ã»æ¹å 鲿ã®ãèŠããåããšãä»çµã¿åã ãªãã¡ã¯ã¿ãªã³ã°ã®é²æãLinterã®warningæ°ãã¢ãžã¥ãŒã«ã®åå²ç¶æ³ãªã©ã§å®éçã«å¯èŠåããããŒã å
šäœã§èª²é¡æèãå
±æããä»çµã¿ãéèŠããŠããŸãããã¶ã€ã³ã·ã¹ãã ã®æ§ç¯ãEdge-to-Edge察å¿ããã®äžç°ã§ãã ãããã¯ããªãŒããŒïŒPOïŒãšã®å
±éçè§£ æè¡çè² åµã®è§£æ¶ããããã¯ãã®äŸ¡å€åäžã«äžå¯æ¬ ã§ãããšããç¹ãPOãšå
±æãããã«ãããèšç»çãªãªãã¡ã¯ã¿ãªã³ã°ãå®çŸããŠããŸãã é©åãªãšã³ãžãã¢ãªãœãŒã¹ã®ç¢ºä¿ ãªãœãŒã¹äžè¶³ãè² åµã®èç©ãšéçºã®æªåŸªç°ãæããªããããAndroidãšã³ãžãã¢ã®é©åãªãªãœãŒã¹ç¢ºä¿ã«åªããŠããŸãã ãã©ã³ã¹ã®åããæè¡éžå® æ°æè¡ã®å°å
¥æã¯ãå¿
ããã®åŠ¥åœæ§ãããŒã ã§è°è«ããåæåœ¢æãå³ããŸããããã«ãããå°æ¥ã®è² åµåãé²ããæè¡çãªãã©ã³ã¹ãä¿ã£ãŠããŸããïŒãã®é åã§ã¯ãç¹ã«ãšã³ãžãã¢ã®æç°ãéèŠãªåœ¹å²ãæ
ã£ãŠããŸããïŒ é«ããµãŒãã¹ã¬ãã«ç®æšïŒSLOïŒã®ç¶æ ãããã¯ãã®åè³ªç®æšãé«ãèšå®ãããããç¶æããæåããã³ãŒãããŒã¹ã®å¥å
šæ§ãä¿ã€åæ©ä»ãã«ããªã£ãŠããŸãã 䞡課é¡ã«å
±éãããã¿ã€ããŒã®åŒ·ã¿ åãããŒã äœå¶ ããŒã ã¡ã³ããŒãå€ããããæ°èŠã®ãããã¯ãéçºãšäžŠè¡ããªãããæ€èšŒããªãã¡ã¯ã¿ãªã³ã°ãšãã£ãæ¹å掻åãåæ
ããŠé²ããããäœå¶ã匷ã¿ã§ãã ãå°éãªåªåãã®æå ã¡ã³ããŒå
šå¡ããå°éã«æ¹åãç¶ãããããªãããšããå
±éèªèãæã£ãŠãããæ¥ã
ã®ç¶ç¶çãªåãçµã¿ã倧åã«ããŠããŸãã Day2ãéçºããŠããäžã§AIãã©ã®ããã«æŽ»çšããŠããŸããïŒã Day2ã§ã¯æ§ã
ãªãåçãããã ããã®ã§ãç¹ã«å€ãã£ããã®ãé¢çœããšæã£ããã®ããŸãšããŸããã ãããã« DroidKaigi 2025ã§ã¯ãåã»ãã·ã§ã³ãåå è
ã®æ¹ã
ãšã®äº€æµãããæ¥ã
ã®éçºã®åèã«ãªãç¥èŠãåŸãããšãã§ããŸãããããã§åŸãåŠã³ã¯ãä»åŸã®ãããã¯ãéçºã«ã€ãªããŠãããããšæããŸãðª ãŸãã10æ21æ¥(ç«)ã«ã³ã³ãã©ç€Ÿãã¢ã³ãããã瀟ã什åãã©ãã«ç€ŸããããŠã¿ã€ããŒã®4瀟å
±å¬ã§ã After iOSDC & DroidKaigi 2025 ããéå¬ããŸãã åœæ¥ã¯åŒç€ŸããAndroidãšã³ãžãã¢ã® tick-taku ãç»å£ããŸã ð ãã€ããªããéå¬ ãšãªã£ãŠãããŸãã®ã§ããèå³ã®ããæ¹ã¯ãã²æ°è»œã«ãåå ãã ãã ð reiwatravel.connpass.com æåŸã«ãæ¬ã«ã³ãã¡ã¬ã³ã¹ãæ¯ããéå¶ã»ç»å£è
ã®ã¿ãªããããªãã³ã«ã¿ã€ããŒããŒã¹ã«ãè¶ãããã ããæ¹ã
ãããããšãããããŸããïŒ
ã¯ããã« ã¿ã€ããŒã§Androidãšã³ãžãã¢ãããŠããã¿ãã¿ã§ãã 2025幎9æ10æ¥ãã12æ¥ã«ãããŠãAndroidã®æè¡ã«ã³ãã¡ã¬ã³ã¹ã§ããã DroidKaigi 2025 ããéå¬ãããŸãããã¿ã€ããŒããã¯AndroidããŒã ãã¯ãããšããè€æ°ã®ã¡ã³ããŒãçŸå°ã«åå ããä»å¹Žãæšå¹Žã«ç¶ããŠãŽãŒã«ãã¹ãã³ãµãŒãšããŠããŒã¹ãåºå±ããŸããã ã»ãã·ã§ã³ã§ã¯ææ°ã®ç¥èŠã«è§Šããæ©äŒãå€ããæ¥ã
ã®æ¥åã«ãã€ãªããå
·äœçãªåŠã³ãåŸãããšãã§ããŸããããŸããäŒæãéããŠã¯ç«ã¡è©±ãå±ç€ºããã£ããã«åå è
å士ãè°è«ãæ·±ããå Žé¢ãå€ãããã亀æµã®åºããã匷ãæããŸããããã®ãããªæ§åã¯äŒå Žã«ãšã©ãŸãããXãªã©ã®SNSãéããŠããªã³ã©ã€ã³ã§ãçãäžãããã¿ããŠããã®ãå°è±¡çã§ãã Part1ãPart2ã®2èšäºã«æž¡ãããšã³ãžãã¢ã¡ã³ããŒã«ããã»ãã·ã§ã³ã¬ããŒããšãããŒã¹åºå±ã®æ§åããå±ãããŸãã æ¬èšäºïŒPart 1ïŒã§ã¯ããšã³ãžãã¢ã¡ã³ããŒã«ããã»ãã·ã§ã³ã¬ããŒããã玹ä»ããŸãïŒ ãšã³ãžãã¢ã«ããã»ãã·ã§ã³ã¬ããŒã ãŸãã¯ãDroidKaigiã«åå ãããšã³ãžãã¢ã¡ã³ããŒã«ããã»ãã·ã§ã³ã¬ããŒãã玹ä»ããŸãã HunachiïŒ @_hunachi ïŒ çŽ¹ä»ããã»ãã·ã§ã³ïŒ Androidã©ã€ãã©ãªã¢ã³ã®æåŒãïŒå
ç¢ãªã©ã€ãã©ãªãšSDKã®æ§ç¯ ç§ã¯ã©ã€ãã©ãªãå
¬éããçµéšã¯ãªãã®ã§ããããã®ã»ãã·ã§ã³ã¯ã©ã€ãã©ãªéçºè
ã ãã§ãªãããã«ãã¢ãžã¥ãŒã«æ§æã§éçºããŠãã人ããããŠã©ã€ãã©ãªãå©çšãã人ã«ãå€ãã®åŠã³ããããéåžžã«æçãªå
容ã§ããã ãã®ã»ãã·ã§ã³ã§ç¹ã«å°è±¡çã ã£ããæ°ããåŠã¹ãç¹ãããã€ãã玹ä»ããŸãã å
¬éç¯å²ã®å¶åŸ¡ã®éèŠæ§ã«ã€ã㊠internal ãæ£ãã䜿ãããšã¯ãã¡ããã Explicit API mode ãæå¹ã«ããããšã§ãæå³ãããããªãã¯APIãå
¬éãããŠããŸãã®ãé²ãããšç¥ããŸãããããã«ãã£ãŠãã¢ãžã¥ãŒã«ã®è²¬ä»»ç¯å²ãæç¢ºã«ãªããAPIã®å¥å
šæ§ãä¿ã€ããšãã§ããŸãã 芪åãªAPIã®éæšå¥šåã€ã㊠ã¯ã©ã¹ã颿°ãéæšå¥šïŒDeprecatedïŒã«ããéã @Deprecated ã¢ãããŒã·ã§ã³ã® message ã replaceWith åŒæ°ã«å
·äœçãªèª¬æãèšè¿°ããããšã§ãå©çšè
ãã¹ã ãŒãºã«æ°ããå®è£
ã«ç§»è¡ã§ããé
æ
®ã倧åã ãšåŠã³ãŸããã ç Žå£ç倿Žã®èªåæ€ç¥ã«ã€ã㊠ãããªãã¯APIã倿Žãç¹ã«åé€ããéã«ã¯ã binary-compatibility-validator ãå°å
¥ããŠèªåçã«ãã§ãã¯ããããææ³ã玹ä»ãããŠããŸããããã£ããäºææ§ãå£ããŠããŸããã¹ãé²ãããã®ä»çµã¿ã¯ãç¹ã«ã©ã€ãã©ãªã®ã¡ã³ããã³ã¹ã«ãããŠéåžžã«éèŠã ãšæããŸãããã©ã€ãã©ãªãäœæããæ©äŒããã£ããå©çšããããã«ãããã§ãã ãŸããã©ã€ãã©ãªãšãããå©çšãããããžã§ã¯ãéã§ãªãœãŒã¹åãè¡çªãããšããåé¡ã«ã€ããŠã話ããããŸããããã«ãã¢ãžã¥ãŒã«ã§ã®åé¡ã«ãããŠã¯åŒç€Ÿã§ã察å¿ã¯æžãã§ãããã®ã®ãã©ã€ãã©ãªäœ¿çšè
ãšããŠäºæãã¬æåã«æ©ãŸãããçµéšãäœåºŠãããã®ã§èªåãã©ã€ãã©ãªãäœãåŽã«ãªã£ãæã¯æ°ãã€ããããšæããŸããã ã©ã€ãã©ãªã®è£åŽã§äœãèµ·ããŠããã®ããç¥ãããšã§ãå©çšè
ãšããŠãããè³¢ãä»ãåã£ãŠããããšãã§ãããšåèªèããŸãããä»åŸããã«ãã¢ãžã¥ãŒã«ã§ã®éçºãã©ã€ãã©ãªãå©çšããéã«ãä»ååŠãã ç¥èãæŽ»ãããŠããããã§ãã tick-taku 玹ä»ããã»ãã·ã§ã³ïŒ EncryptedSharedPreferences ã deprecated ã«ãªã£ã¡ãã£ãïŒã©ããããïŒ ã¿ã€ãã«ã®éãã§ããªã deprecated ã«ãªã£ãããªã©ã®èæ¯ãå«ã玹ä»ãèŠæãæ±ºããããŠãããçŽ æŽãããã»ãã·ã§ã³ã§ããã ã¿ã€ããŒã§ã¯ KeyStore + Cipher + DataStore ãå©çšããŠããŸããããå¥ã®ããã°ã§ Tink ãå©çšãããšããæãã« wrap ãããŠãè€éãªæå·ååšããã©ã€ãã©ãªã«ä»»ãã€ã€å®è¡é床ãéããªããšç¥ããŸãããç¹å®ç«¯æ«ã§ã®ã¿ã¯ã©ãã·ã¥ããŠãããªæ°é
ã Crashlytics ãã芳枬ããŠãããããããèªåã®å®è£
ãæªã Tink ã§ããã° Google æäŸã ããã®èŸºã察åŠããŠãããŠããã®ã§ã¯âŠ?ããšæãç§»è¡ããããšã¡ããã© DroidKaigi çŽåã« Issue ãäœæããŠæ€èšããŠãããšããããã®ã»ãã·ã§ã³ã®ååšãç¥ããŸããã çµè«ããã§ãããããæ¹ããããšã®ããšã§ã ð ã©ããã芳枬ããŠããã¯ã©ãã·ã¥ã¯ OEM ããã€ã¹ã® KeyStore ã®ãã°ã§ã©ããããããªããšãããµãªã§ããããã㯠security-crypto ã deprecated ã«ãªã£ãèŠå ã®1ã€ããããTink ã«ç§»è¡ãããšããã§è§£æ±ºããããããã¢ããªåŽã§ã®ãã³ããªã³ã°ãé£ãããªãããã§ãããããªã£ããã©ããããããªãã®ã§ããŒã¿ã¯æšãŠãŸããããšå²ãåããããªããšã®ããšã§ãã⊠ãŸããã¯ã©ãã·ã¥ã®èŠå ãšããŠãã1ã€ããã¯ã¢ããèšå®ã®è©±ããããŸããã allowBackup=false ã«èšå®ããŠãããã倧äžå€«ãšèããŠããã®ã§ãããAndroid 12 ããã¡ãŒã«ãŒã«ãã£ãŠã¯ device-transfer ã«ããããã¯ã¢ãã㯠allowBackup ã®èšå®ãç¡èŠããããã«ãªã£ãŠããããã§ãããããã§ããŒã¿ã¯ç§»è¡ãããã®ã« key ãç°ãªãã®ã§åŸ©å·ã«å€±æãããšãããã®ã§ããã æ¬åœã«ã¡ãããšäœã£ãŠããã¡ãŒã«ãŒâŠ ãŸã EncryptedSharedPreference ãååšããŠããŸããæ
ã«æã
ã¯ãªãã§ãããã§ãããã€ã¹ã®ã¹ãã¬ãŒãžã«ä¿åããŠããŸããšããææ³ã®ããš deprecated ã«ããèæ¯ãããããããããããããã®ããŒã¿ãããã€ã¹ã«ä¿åããå¿
èŠãããã®ãïŒãã¯èšèšæã«åžžã«æèãããäºé
ã ãšæããŸããã 玹ä»ããã»ãã·ã§ã³ïŒ OAuthãæ£ããå®è£
ããïŒAndroidã¢ããªã®ããã®ã»ãã¥ã¢ãªèªèšŒ OAuth ãå°å
¥ããããã®åºç€ç¥èãæŽå²ãçè§£ã§ããå
容ã§ããã äžåºŠå®è£
ãããè§Šãããããããšããã人ã¯ããã ãããšãªãå
容ãå€ã OAuth ã®å
¥éãšããŠéåžžã«å匷ã«ãªããšæããŸãã æ°ã«ãªã£ãç¹ãšããŠã¯ãå€ãã®ã¢ããªã§ã¯ access token ãããã€ã¹äžã«ä¿åããŠãããšæããŸããããã®éã¯å€ã«æå·åããã«ã·ã³ãã«ã« SharedPreference ã䜿ã£ãŠããã€ã¹ãä¿¡é ŒããŸããããšãã£ãè¶£æšã®å
容ã話ãããŠããŠãAndroid 㯠root åãããåŒãæãããšæã£ãã®ã§ãã倧äžå€«ãªãã§ãããã⊠ãŸãã PKCE ããã¹ããã©ã¯ãã£ã¹ãããã§ããããããŸã§å®è£
ããŠããã¢ããªã¯ã©ãã ãããã®ãæ°ã«ãªããŸãã haru 玹ä»ããã»ãã·ã§ã³ïŒ ã¹ããæ°æ³ã£ãŠäœïŒïŒïŒææœè¡ïŒã¢ããªããžãã¹ã«åœ±é¿ããã®ïŒ DroidKaigiåã®å
¬æ£ååŒå§å¡äŒã®äººã«ããçºè¡šã§ãäž»ã«ããããæœè¡ãããæ°ããæ³åŸã«é¢ãã話ã§ããã 察象ã«ãªãã®ã¯åºæ¬çã«AppleãGoogleãªã©ã®ãã©ãããã©ãŒã äºæ¥è
ã§ãIn App Biilingãªã©ã®æ©èœã«å¯ŸããŠåœ±é¿ãããããã§ããã ãšã¯ãããäžè¬ããããããŒã«éæŸããŠããªãæ©èœãéæŸããŠæ¬²ãããªã©ã®ãªã¯ãšã¹ããéãããšãã§ããããã«ãªããããã®ã§ãä»åŸã©ããªã£ãŠãããç®ãé¢ããªãæ³åŸã®1ã€ã§ããããŸããã ã¿ã㿠玹ä»ããã»ãã·ã§ã³ïŒ Be a Business-Driven Android Engineer DroidKaigi 2025ã«åå ããŠãç¹ã«å°è±¡ã«æ®ã£ãã»ãã·ã§ã³ã®1ã€ããohzonoããã®ã Be a Business-Driven Android Engineer ãã§ããAndroidãšã³ãžãã¢ãã©ã®ããã«ããžãã¹ã®æé·ã«è²¢ç®ã§ããã®ããè§£ãã»ãããå
容ã§ãä»ã®èªåãæå±ããã¹ããªãŒã ã¢ã©ã€ã³ãããŒã ïŒäŸ¡å€æäŸããŒã ïŒã®ç¶æ³ãšãéãªãããšãŠãå¿ã«æ®ããŸããã ç¹ã«å
±æããã®ã¯ãè¶å¢ããšããèãæ¹ã§ããçŸåšæå±ããããŒã ã¯å°äººæ°ã®ããããšã³ãžãã¢ãããŒã¿åæãæ
ã£ãããå°éå€ã®å®è£
ã«ææŠããããšã圹å²ã®å£æ ¹ãè¶ããåãæ¹ãèªç¶ã«è¡ãããŠããŸãããã®ããããè¶å¢ããšããèšèã¯ããšããšããŒã å
ã§ãããŒã¯ãŒãã«ãªã£ãŠããŸãããä»åã®ã»ãã·ã§ã³ã¯ãããããåãçµã¿ã䟡å€ãããã®ãšããŠè¯å®ããŠãããå
容ã§ããã倧ããªå±ã¿ã«ãªããŸãããAIã®é²åã«ãã£ãŠå°éå€ã®é åã«èžã¿èŸŒã¿ããããªã£ãŠããä»ããè¶å¢ãã¯ãããããŸããŸãéèŠã«ãªããšæããŸãã ãŸããéçºããŒã ã売äžãçŽæ¥çãªKPIãšããŠæã€ãšããè©±ãæ°é®®ã§ãããç§ã¯ãããŸã§ãããã©ãŒãã³ã¹æ¹åããšã©ãŒçã®äœæžããŠãŒã¶ãŒè¡åã«åºã¥ãææšãšãã£ããããã¯ãå
éšã®ææã«æ³šç®ããããšãå€ãã£ãã®ã§ããããã®ã»ãã·ã§ã³ã§ã¯ããã«å ããŠãèªåãã¡ã®ã¢ãŠãããããäºæ¥å
šäœã®ææãšçµã³ã€ããŠèããèŠç¹ãæç€ºãããŸãããèªåã®ä»äºãã©ãããžãã¹ã€ã³ãã¯ãã«ã€ãªããã®ããæèããããšã§ããšã³ãžãã¢ãšããŠãã£ãšåºãèŠéã§åãçµãã§ãããããšæããŸããã ããã«ããã®èãæ¹ãæè¡é¢ããæ¯ããææ®µãšããŠãKotlin Multiplatform (KMP) ã®ååšæãæ¹ããŠå®æããŸããã坿¥ãå¥ãããžã§ã¯ãã§KMPãå©çšããŠããçµéšãããããã®æå¹æ§ã匷ãæããŠããŸãããã¡ããããã«ãé床ãKMPãã®ãã®ã®è€éããiOSãšAndroidãšã³ãžãã¢éã®é£æºãšãã£ã課é¡ã¯ãŸã ãããŸãããã¡ã€ã³ã¬ã€ã€ãŒã®å
±éåã«ããã¡ãªããã¯å€§ãããKMPã¯Androidãšã³ãžãã¢ãiOSéçºãžãšãè¶å¢ãããåŸæŒããšãªããããŒã å
šäœã®çç£æ§ãé«ããçŸå®çãªéžæè¢ã ãšæããŸããä»åŸã泚ç®ããŠããããæè¡ã§ãã syam 玹ä»ããã»ãã·ã§ã³ïŒ Kotlinã§ã®AI掻çšã«ããéçº JetBrains ã® Sebastian Aigner ãããš Márton Braun ããã«ããã Kotlinã§ã®AI掻çšã«ããéçº ããšããã»ãã·ã§ã³ãæ°ã«ãªã£ãã®ã§èŽè¬ããŸããïŒ Kotlin ãš AI ã®é¢ããæ¹ããã³ãŒãè£å®ã®ãããªè»œãæ¯æŽãããããšãŒãžã§ã³ãã«ä»»ããèªåå®è£
ããŸã§æ®µéçã«ç޹ä»ããŠãããJetBrains ã® AI ãšãŒãžã§ã³ã Junie ã䜿ã£ããã¢ã§ã¯ãæ°ããç»é¢è¿œå ã UI ã®æ¹è¯ãèªåã§è¡ã£ãŠããŠãæ¢åã³ãŒãã®ãã¿ãŒã³ãèžãŸããä¿®æ£ãå°è±¡çã§ããã ãŸããKotlin 補ã®ãã¬ãŒã ã¯ãŒã¯ Koog ã玹ä»ããããã«ããã©ãããã©ãŒã ã§ AI ãšãŒãžã§ã³ããçµã¿èŸŒããä»çµã¿ãšããŠæŽ»çšã§ãããšã®ããšã§ããã nshibaïŒ @nshiba310 ïŒ çŽ¹ä»ããã»ãã·ã§ã³ïŒ ãŠãŒã¶ãŒãéçºè
ãæ©ãŸããªã TV ã¢ããªéçº - Compose ã®å
éšå®è£
ããåŠã¶ãã©ãŒã«ã¹å¶åŸ¡ AndroidTVã¢ããªã Compose ã䜿ã£ãŠå®è£
æ¹æ³ã玹ä»ããã»ãã·ã§ã³ã§ããã Compose 以åã®æä»£ã«ååšããŠãã leanback library ãšãã Google 補ã®ã©ã€ãã©ãªããããŸãããããã㯠Compose ã«ã¯å¯Ÿå¿ããŠããŸããã Compose ã§ AndroidTV ãå®è£
ããããšæã£ãããã©ããã£ãã©ã€ãã©ãªã䜿ã£ããè¯ãããšè¡ã£ãåºç€çãªããšããå§ãŸããleanback library ã§ã¯ããã©ã«ãã§ã©ã€ãã©ãªã察å¿ããŠãããŠããããã©ãŒã«ã¹åšãã®å¶åŸ¡ãããŸã©ã®UIã«ãã©ãŒã«ã¹ããã£ããŠãããããããããããªãUIã®å¶åŸ¡ãªã©ã Compose ã§ã¯èªåã§å®è£
ããå¿
èŠãããã©ããã£ã察å¿ãå¿
èŠãã«ã€ããŠã詳ãã解説ãããŠããŸããã ãŸã AndroidTV ã¢ããªã§ã¯ãã¹ã¯ããŒã«ã®å¶åŸ¡ã«ã€ããŠãéåžžã®ã¢ãã€ã«ã¢ããªãšã¯ç°ãªãå®è£
æ¹æ³ãå¿
èŠã«ãªããããã«ã€ããŠã詳ãã解説ãããŠããŸããã ã»ãã·ã§ã³ã¿ã€ãã«ã®éãã©ã®ã»ã¯ã·ã§ã³ã§ã Compose ã®å
éšå®è£
ãŸã§ã¡ãããšåŠçã远ã£ãŠèª¬æãããŠããŠãšãŠãããããããããããã Compose ã§ AndroidTV ã¢ããªãäœæããæ¹ã«ãšã£ãŠå¿
èŠã®å
容ãã€ãŸã£ãŠããŸããïŒ ç¶ãã¯Part 2ã®èšäºã§ïŒ åŒãç¶ããPart 2ã®èšäºã«ãŠä»ã®ãšã³ãžãã¢ã¡ã³ããŒã«ããã»ãã·ã§ã³ã¬ããŒããšãããŒã¹åºå±ã®æ§åããå±ãããŸãã ãã²èªãã§ãã ããïŒ tech.timee.co.jp
ããã«ã¡ã¯ãã¿ã€ããŒã§ãšã³ãžãã¢ãããŠãã埳å¯ã§ãã ä»åã¯ã EKSäžã«GitHub Actions Self-hosted Runneråºç€ãæ§ç¯ãã話 ããå±ãããŸãã èæ¯ïŒGitHub Actionsãžã®ç§»è¡ãšãæ°ãã«èŠããŠããèª²é¡ 2024幎10æã«å
¬éãã CIåºç€ãGitHub Actionsãžç§»è¡ããèšäº ã§ç޹ä»ãããšããã CircleCIããGitHub Actionsãžã®ç§»è¡ã«ãã£ãŠãç§ãã¡ã®CIäœéšã¯å€§ããæ¹åããŸããã ããããéçºè
ããã¹ãã±ãŒã¹ãå¢ããæéãçµã€ã«ã€ã㊠æ°ããªèª²é¡ ãèŠããŠããŸããã å®è¡åæ°ã®æ¥å¢ã«ããã³ã¹ãé«éš° 2025幎2æé ããDevinãã¯ãããšããAIãšãŒãžã§ã³ãã®å©çšãé²ã¿ãPRãpushã®åæ°ãäžæ°ã«å¢å éçºè
æ°ã®å¢å ãéãªããã¯ãŒã¯ãããŒå®è¡åæ°ãæ¯äŸããŠäŒžã³ãŠãã£ã GitHub-hosted Runnerã¯æéãå®å®æ§ã®é¢ã§ããçšåºŠæé©åãããŠãããããSelf-hostedã«åãæ¿ããã°å¿
ãããã³ã¹ãåæžã«ã€ãªãããšã¯éããªãã ããããå²åŒãªãã·ã§ã³ãå°ãªããã³ã¹ãã³ã³ãããŒã«ãé£ãã ãšãã課é¡ããã äžæ¹AWSãªãSavings PlansãSpotã€ã³ã¹ã¿ã³ã¹ãªã©ã®ä»çµã¿ã掻çšã§ããæè»ã«æé©åãå¯èœãéçºè
ããšãŒãžã§ã³ãã®å©çšå¢å ã§å®è¡åæ°ãæ¥å¢ããã¿ã€ããŒã®ãŠãŒã¹ã±ãŒã¹ã«ãããŠã¯ããã®ãæè»ã«æé©åã§ããããšããç¹ã倧ããªã¡ãªããã§ããããšãããã£ãŠããŸãã ãã¹ãæéã®ãããããšããå¢å ãã¹ãã±ãŒã¹æ°ã®å¢å ã«ãããå
šäœã®å®è¡æéãé·ããªã£ãŠããŠãã apt install ãªã©ã®ã»ããã¢ããåŠçã«ãæéãããã£ãŠãã ãã©ã³ããŒã€ã¡ãŒãžã«äºåã€ã³ã¹ããŒã«ããŠããã°ãã£ãšéãã§ããã®ã§ã¯ïŒããšãã声ãåºå§ãã ãã³ã¹ããã³ã³ãããŒã«ããªããããã¹ãããã£ãšéããããã ãããªæããããç§ãã¡ã¯ Self-hosted Runneråºç€ã®æ§ç¯ ãæ€èšãå§ããŸããã æåã®ã¢ãããŒãïŒECS + Lambdaæ§æ åœå㯠ECS + Lambda + API Gateway ãçµã¿åãããŠãã©ã³ããŒåºç€ãæ§ç¯ããããšããŸããã ãããå®éã«æ€èšŒããŠã¿ããšãããã«ããã€ãã®èª²é¡ã«çŽé¢ããŸããã ã¬ãŒããªãããã®èæ
® 1åã®CIå®è¡ã§æå€§35䞊åã®ã©ã³ããŒãèµ·åããŠãŸãã ãæ¥äžã¯å€ããšãã§ 1æéã«60åä»¥äž å®è¡ãããããšããããGitHub API ã® ã¬ãŒããªããã ãæèããèšèšãå¿
èŠã«ãªããŸãã â ããã Lambda åŽã§èæ
®ããŠå®è£
ããã®ã¯ããªãè€éã ã©ã³ããŒã¯30ç§ä»¥å
ã«ç«ã¡äžãã£ãŠã»ãã ãšããèŠä»¶ãããã Lambda ã®ã³ãŒããç¶ç¶çã«ã¡ã³ããã³ã¹ããã³ã¹ã ãç¡èŠã§ããªãã ãé·æçã«éçšããã«ã¯ããã®æ§æã¯å°ãè€éããããããããªãã ãã倿ããããã·ã³ãã«ã«éçšã§ããå¥ã®ã¢ãããŒããæ¢ãããšã«ããŸããã éžãã ã®ã¯ EKS(auto mode) à Actions Runner Controller ããã§ç®ãã€ããã®ããGitHubå
¬åŒãæäŸãã **Actions Runner Controller (ARC)**ã ARCã¯GitHub ActionsãšKubernetesãã€ãªããå¿
èŠãªãšãã ãã©ã³ããŒPodãåçã«èµ·åããŠãããŸãã ããã«ã¯ã©ã¹ã¿åºç€ã«ã¯ EKS Auto Mode ãæ¡çšããŸããã ããŒã管çãã¹ã±ãŒãªã³ã°èšå®ãã»ãšãã©èªåã§æããã«æžããããéçšã®æéã倧å¹
ã«æžãããã®ãé
åã§ãã ãEKS Auto Mode à ARC ã§ããã°ã管çã³ã¹ããæãã€ã€æè»ãªSelf-hosted Runnerãäœããã®ã§ã¯ïŒã ããèãããã®æ§æã§é²ããããšã«ããŸããã ã¢ãŒããã¯ãã£æŠèŠ ãã£ãããšããæ§æã¯ãããªã€ã¡ãŒãžã§ãã ã¢ãŒããã¯ãã£ãŒå³ ARC : GitHub APIãšé£æºããã©ã³ããŒPodãèªåçã«äœæã»åé€ EKS Auto Mode : ã¯ã©ã¹ã¿ç®¡çãæå°éã«æãã€ã€ãæè»ãªã¹ã±ãŒãªã³ã°ãå¯èœ Karpenter : Auto Modeã®è£åŽã§åãããããžã§ããŒãåŸæ¥ã®Cluster Autoscalerããnodeèµ·åãéã ç¹ã«CIã®ããã«æé垯ã«ãã£ãŠå¿
èŠãªãœãŒã¹ã倧ããå€åããã¯ãŒã¯ããŒãã§ã¯ã Auto ModeïŒKarpenterã®çµã¿åãããéåžžã«çžæ§ãè¯ããã¡ã³ããã³ã¹æ§ã»æè»æ§ã®äž¡ç« ãã§ããŸããã å°å
¥æã«çŽé¢ãã課é¡ãšè§£æ±ºç ãããããæ¬çªã§ãã å®éã«å°å
¥ãé²ããŠãããšã次ã
ãšåé¡ãçºçããŸããã 1. Spotã€ã³ã¹ã¿ã³ã¹ã®å®å®æ§åé¡ åœåã¯ã³ã¹ãåæžãçã£ãŠã忢çã®äœãã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã® Spotã€ã³ã¹ã¿ã³ã¹ ãæ¡çšããŠããŸããã ããããåŒç€Ÿã®CI㯠35䞊åã§é«é »åºŠã«å®è¡ ããããããå¿
èŠãªã€ã³ã¹ã¿ã³ã¹æ°ãå€ããªããåæ¢ç¢ºçãäœãã¿ã€ãã§ã 1æ¥ããã5ã10åã»ã©ããŒããèœã¡ã ããšããããŸããã ãã®çµæãCIãéäžã§å€±æããã±ãŒã¹ãé »çºãã éçºè
äœéšã倧ããæããèŠå ãšãªã£ãŠããŸããŸããã 察ç ããã§æãåã£ãŠ ãªã³ããã³ãã€ã³ã¹ã¿ã³ã¹ã«åãæ¿ã ãå¿
èŠã«å¿ã㊠Savings Plans ãé©çšããæ¹éã«ããŸããã ãªã³ããã³ãã«ããããšã§ãã©ã³ããŒãçªç¶èœã¡ããªã¹ã¯ããªããªããå®å®ããŠCIãåããããã«ãªã£ã å®å®æ§ãåäžããããšã§ãCIã ãã§ãªã ãããã€ãªã©ä»ã®ã¯ãŒã¯ãããŒãSelf-hosted Runnerã«å¯ãã ããšãå¯èœã« ããã«ããEC2ã®ã¢ã€ãã«æéãæžããã皌åçãé«ããããšã§ã³ã¹ãå¹çãæ¹åã§ããŸãã 2. ã¹ã±ãŒã«ã€ã³ã§ã©ã³ããŒPodã匷å¶çµäºããåé¡ æ¬¡ã«çŽé¢ããã®ã¯ãEC2ã®ã¹ã±ãŒã«ã€ã³ã«ãã£ãŠãã©ã³ããŒPodãCIå®è¡äžã«çªç¶èœã¡ãããšããåé¡ã§ãã åå ã¯ãKarpenterã®èšå®ã§ããã ããã©ã«ãã§ã¯ disruption.consolidationPolicy ã WhenEmptyOrUnderutilized ã«ãªã£ãŠããã ããŒãã®ãªãœãŒã¹äœ¿çšçãäœããšã Podã皌åäžã§ã容赊ãªãããŒããèœãšããŠããŸã ã®ã§ãã (åè: https://karpenter.sh/docs/concepts/disruption/) 察ç consolidationPolicy ã WhenEmpty ã«å€æŽ PodããªãããŒãã®ã¿ã¹ã±ãŒã«ã€ã³å¯Ÿè±¡ãšããããèšå® spec : disruption : consolidationPolicy : WhenEmpty ããã§ã©ã³ããŒPodãå®è¡äžã«æ¶ããåé¡ã¯è§£æ¶ããŸããã 3. ããŒããå
šç¶ã¹ã±ãŒã«ã€ã³ããªãåé¡ ããããããã§å¥ã®åé¡ãçºçããŸãã ãäžåºŠã¹ã±ãŒã«ã¢ãŠããããšãããŒããã»ãšãã©æžããªãããšããçŸè±¡ã§ãã åå 㯠Kubernetes ã®ã¹ã±ãžã¥ãŒãªã³ã°ã Kubernetes ã®ã¹ã±ãžã¥ãŒã©ã«ã¯ãPod ãã§ããã ãåçã«é
眮ããããšããä»çµã¿ããããŸãã ãã®ãã Pod ãè€æ°ã®ããŒãã«åæ£ããŠé
眮ãããããã ããŒãäžã® Pod ã 0 ã«ãªãã±ãŒã¹ãå°ãªã ãããã¹ã±ãŒã«ã€ã³ããªããªãé²ãŸãªããªããŸãã 察ç Pod Affinity ãå©çšããã©ã³ããŒPodã¯ãªãã¹ãåãããŒãã«è©°ããããèšå® Podé
çœ®ã®æçåãé²ããã¹ã±ãŒã«ã€ã³ããããããŸãã affinity : podAffinity : preferredDuringSchedulingIgnoredDuringExecution : - weight : 100 podAffinityTerm : labelSelector : matchLabels : actions.github.com/scale-set-namespace : arc-runners topologyKey : kubernetes.io/hostname ããã«ãããªãœãŒã¹å¹çã倧ããæ¹åãããŸããã 4. å€éã«ãªãœãŒã¹ãæé©åããäœæŠ ãªãœãŒã¹å¹çãããã«é«ããããã æ¥äžã¯å®å®æ§ãåªå
ããå€éã ãæ®µéçã«ããŒããæŽçããä»çµã¿ ãå°å
¥ããŸããã å
·äœçã«ã¯ã disruption.consolidationPolicy ã WhenEmptyOrUnderutilized ã«èšå®ããããã§ãå€éã« äžå®ééã§15åã ãpodãååšããããŒãã®ã¹ã±ãŒã«ã€ã³ãèš±å¯ â ãã®åŸã¯åã³çŠæ¢ ãšãããµã€ã¯ã«ãç¹°ãè¿ããŸãã ããã«ãããããŒãäžã«Podãæ®ã£ãŠããŠãäžæ°ã«æ¶ãããããšã¯ãªãã ãæ¥ã«Podãèœã¡ãŠCIãæ¢ãŸãããšãã£ããªã¹ã¯ãé¿ããªãããå°ããã€ãªãœãŒã¹ãæé©å ã§ããããã«ãªããŸãã spec : disruption : consolidationPolicy : WhenEmptyOrUnderutilized consolidateAfter : 5m budgets : - nodes : "0" reasons : - Underutilized schedule : "0 0 * * *" # 0:00ã11:45 UTC çŠæ¢ (JST 9:00ã20:45) duration : "11h45m" - nodes : "0" reasons : - Underutilized schedule : "0 12 * * *" # 12:00ã15:00 UTC çŠæ¢ (JST 21:00ãç¿0:15) duration : "3h15m" - nodes : "0" reasons : - Underutilized schedule : "30 15 * * *" # 15:30ã17:00 UTC çŠæ¢ (JST ç¿0:30ãç¿2:15) duration : "1h45m" - nodes : "0" reasons : - Underutilized schedule : "30 17 * * *" # 17:30ã20:00 UTC çŠæ¢ (JST ç¿2:30ãç¿5:15) duration : "2h45m" - nodes : "0" reasons : - Underutilized schedule : "30 20 * * *" # 20:30ã24:00 UTC çŠæ¢ (JST ç¿5:30ãç¿9:00) duration : "3h30m" ãã®ä»çµã¿ã«ãã£ãŠã æ¥äžã¯å®å®ããŠCIãåãã€ã€ãå€éã¯å°ããã€ããŒããæŽçããŠãªãœãŒã¹ãå¹ççã«æŽ»çš ã§ããããã«ãªããŸããã 5. ã³ãŒã«ãã¹ã¿ãŒãåé¡ãã©ã³ããŒããŒã«ã§è§£æ¶ åŒç€Ÿã§ã¯ 35䞊å ã®ã©ã³ããŒãå©çšããŠããŸãã ãã®ãããå®å
šãªãªã³ããã³ãèµ·åã§ã¯éã«åããã ã©ã³ããŒèµ·ååŸ
ã¡ãçºçããŠããŸãããšããããŸããã ããã§ãARCã® minRunners èšå®ã掻çšãã ã©ã³ããŒããŒã«ãäœæ ã ãããããäžå®æ°ã®ã©ã³ããŒãèµ·åããŠããããšã§ã èŠæ±ãããã°ããã«å²ãåœãŠãããããã«ãªãã GitHub-hosted runnerãšåãå¿«é©ãªäœ¿ãå¿å°ãå®çŸããŸããã 5 Runner Podã§Dockerã䜿ã工倫 æåŸã®ããŒãã«ã¯ãã©ã³ããŒPodã§Dockerãã©ã䜿ãããã§ãã ç§ãã¡ã®CIã§ã¯MySQLãRedisãªã©ã® service container ãå€çšããŠãããããRunnerã³ã³ããããDockerãæäœã§ããä»çµã¿ãå¿
èŠã§ããã éžãã æ¹æ³ Runnerã§Dockerãæ±ãæ¹æ³ã¯å€§ããåã㊠DooD (Docker outside of Docker) ãš DinD (Docker in Docker) ã®2çš®é¡ããããŸãã(åè: GitHub Actions ã® self-hosted runner ã§ Docker ã䜿ãéã®ãã¿ãŒã³æŽç )ã ä»å㯠DinD ãæ¡çšããŸãããããã®äžã§ãããã«å®çŸæ¹æ³ã2ãã¿ãŒã³ååšããŸãã Runnerã³ã³ããå
ã§çŽæ¥DockerããŒã¢ã³ãèµ·åããæ¹åŒ Runnerã³ã³ããèªèº«ã dockerd ãç«ã¡äžãã docker build ã docker run ãèªå·±å®çµçã«å®è¡ããã ã·ã³ãã«ã§ãããRunnerã³ã³ããã« ç¹æš©ã¢ãŒãã倧éã®æš©é ãä»äžããå¿
èŠããããããã»ãã¥ãªãã£é¢ã§ã®æžå¿µãæ®ããŸãã ãŸããRunnerã³ã³ãããšDockerããŒã¢ã³ãåå±
ããããšã§ãªãœãŒã¹ç®¡çãè€éåããããããã©ãã«ã·ã¥ãŒãããã¥ãããšãã課é¡ããããŸãã DockerããŒã¢ã³ããµã€ãã«ãŒãšããŠèµ·åããæ¹åŒ Podå
ã§ Runner ãš dockerd ãåé¢ãã emptyDir ãªã©ãä»ã㊠ãœã±ããéä¿¡ ãããã Dockerã®å®è¡ç°å¢ã¯ãµã€ãã«ãŒã«éãããããRunnerã³ã³ããã¯éåžžæš©éã§åãããã CIãžã§ãçµäºãšãšãã«Podããšåé€ããããããã€ã¡ãŒãžãããªã¥ãŒã ãªã©ã®äœæ¥çãèªåçã«æé€ãããç¹ãã¡ãªããã§ãã ç§ãã¡ã¯ Runnerã³ã³ããã«åŒ·ãæš©éãæãããªãããšãéèŠ ããåŸè
ã® DinDãµã€ãã«ãŒæ¹åŒ ãéžæããŸããã ãŸãšããšæ¬¡åäºå ä»åã EKS à ARC ã䜿ã£ãŠGitHub Actions Self-hosted Runneråºç€ãæ§ç¯ãã ã³ã¹ãã»ããã©ãŒãã³ã¹ã»æè»æ§ã®ãããã©ã³ã¹ã§å®çŸã§ããŸããã ãã ãããã§çµããã§ã¯ãããŸããã æ¬¡åã¯ããã®åºç€ã®äžã§ ãã¹ãå®è¡æéãããã«ççž®ããããã«è¡ã£ããã¥ãŒãã³ã° ã«ã€ããŠè©³ãã玹ä»ããäºå®ã§ãã ãGitHub-hosted runnerã§éçãæããŠããã ãEKSã§Self-hosted Runnerãæ€èšããŠããã ãããªæ¹ã®åèã«ãªãã°ããããã§ãã
ããã«ã¡ã¯ïŒâšã¿ã€ããŒã§BackendEngineerãããŠããå¿è³( @akitoshiga )ã§ãïŒâš 2025幎9æ6ïŒåïŒã«éå¬ãããããªããRubyäŒè°01ãã«è¡ã£ãŠããŸããã®ã§ããã®æ§åãæ¯ãè¿ããããšæããŸãïŒ ãªããRubyäŒè°ã«ã¯ããKaigi Passããšãã瀟å
å¶åºŠãå©çšããŠåå ããŸãããâš ãKaigi Passããšã¯ãäžçäžã§éå¬ãããŠãããã¹ãŠã®æè¡ã«ã³ãã¡ã¬ã³ã¹ã«ç¡å¶éã§åå ã§ããå¶åºŠã§ãã productpr.timee.co.jp äŒå Žã®æ§å åœæ¥ã¯é·è¯å·æ²¿ãã«ããã é·è¯ããããã¥ãŒãžã¢ã ããšãããšãŠãçŽ æµãªå Žæã§éå¬ãããŸããã äŒå Žå
ã«ã¯ã¹ãã³ãµãŒããã«ãã£ãå±ç€ºãªã©ããããŸããã ã»ãã·ã§ã³ã®æ§å refinementsã®ã¡ãœããå®çŸ©ã4000åéããã話 alpaca-tc ãã Ruby3.2以éãrefinementsã«ãããã¡ãœããå®çŸ©ã¯çŽ1äžåäœéåããŠããŸããã 瀟å
ãµãŒãã¹ã®éçºã§ãã®äºæ
ã«çŽé¢ããéã«ãåå ã®ç©¶æããRubyãžã®ã³ã³ããªãã¥ãŒããŸã§ãè¡ã£ãéçšãã話ããããŠããŸããã refinementsãšã¯Ruby2.0ããå°å
¥ãããå®å
šã«Rubyãæ¡åŒµããä»çµã¿ã®ããšã§ãã¢ã³ããŒããããåœãŠãã¯ã©ã¹ã®ã¹ã³ãŒããéå®ãããããšãå¯èœã§ãã ãã£ããã¯ã瀟å
ãµãŒãã¹ã®Rubyã®ã¢ããããŒãã®éã«Ruby on Railsã®ã¢ããªã±ãŒã·ã§ã³ã®èµ·åã«æ°åç§ãããããã«ãªã£ãŠããŸã£ãããšã§ããããã Vernier ãšMiddlewareãå©çšããŠèšæž¬ãè¡ã£ããšãããããã«ããã¯ãšãªã£ãŠããåŠçã倿ããŸããã ããã«refinementsã®ã¡ãœãã Module#refine ãååšããŠããŸããã Ruby3.3ã§ã¯ã Module#refine ãåŒã³åºããéã«refineã®callcacheãã¯ãªã¢ãããåŠçã远å ãããŸãã ãã®callcacheãåé€ãããããšãäœéåã®åå ã§ããã ããã Ruby Issue Tracking System ã§å ±åãããšããã¢ããã€ã¹ãããããŸããã ããããalpaca-tcããã¯Rubyã®å®è£
ã§ããCèšèªã«ã¯éŠŽæã¿ããããŸããã§ããã ãã®åé¡ã«å¯ŸããŠã¯Chat-GPTã ko1/rubyhackchallenge ãæŽ»çšãããã³ãã¥ããã£ã§ã¢ããã€ã¹ãåŸãããšã§è§£æ±ºããŠãããŸããã æçµçã«ãã«ãªã¯ãšã¹ããäœæããŠRubyæ¬äœãžã®ããŒãžãå®çŸããããã§ãã æè¡çãªã®ã£ãããåããããã«AIãæŽ»çšããã®ã¯çŽ æŽãããè§£æ±ºæ¹æ³ã§ãããç²ã匷ãåãçµã¿Rubyãžã®ã³ã³ããªãã¥ãŒããå®çŸããå§¿ã¯çŽ æŽããããšæããŸããïŒ Â ç¥ã£ãŠããããã§ç¥ããªãrails newã®äžç luccafortãã speakerdeck.com  Ruby on Railsã§ã¯ãããžã§ã¯ãã®åæåã®éã« rails new ãšããã³ãã³ããå®è¡ããŸãã ãããããã®ã³ãã³ãã®è£åŽã§ã©ã®ãããªåŠçãè¡ãããŠãããã¯å€ãã¯ç¥ãããŠããŸããã ããã§ãã³ãã³ãã¯ã©ã®ãããªå®è¡ãããŒãè¡ã£ãŠãããããŸã䜿ãããŠããæè¡ãã©ã®ãããªèšèšã®çµã¿åããã«ãã£ãŠå®çŸããŠãããã«ã€ããŠæ·±æãããŠã話ããããŠããŸããã luccafortããã®ä»åã®çºè¡šã®åæ©ã®äžã€ã«ã¯ããªãŒã¬ãã€ã¶ãŒãåããããã é¢è¥¿RubyäŒè°08 ãã§ã®äœéšãããå人éçºä»¥å€ã®æé·ã®éžæè¢ã暡玢ãããã£ããšããæ³ãããã£ãããã§ãã rails new ã§å®è¡ãããåŠçã¯ä»¥äžã®æµãã«ãªã£ãŠããŸãã ã³ãã³ãè§£æ ãžã§ãã¬ãŒã¿åæå ãªãã·ã§ã³åŠç ãã£ã¬ã¯ããªäœæ ãã¡ã€ã«çæ bundle install ããã ãã§ãé·å€§ãªåŠçãªã®ã§ãæ¬çºè¡šã§ã¯ã³ãã³ãã®è§£æãããžã§ãã¬ãŒã¿ã®åæåãŸã§äžå¿ã«èª¬æããŠããŸããã rails new ãå®è¡ãããš Rails::Command ã«ãã£ãŠargã®è§£æããšã©ãŒãã§ãã¯ãè¡ãããŸãã ãã®åŸã Rails::Command.invoke ã«ãã£ãŠå
¥åããã³ãã³ãã®å
容ãã Rails::Command ã®é©åãªãµãã¯ã©ã¹ãåŒã³åºãããŸãã ä»åã®å Žå㯠Rails::Command::ApplicationCommand ãèªã¿èŸŒãŸããŸãã Rails::Command::ApplicationCommand#perform ã«ãã£ãŠç¡å¹ãªã³ãã³ããã§ãã¯ãªã©ãè¡ãããåŸã Rails::Generators::AppGenerator.start ã§å®çŸ©ãããåçš®ãã¡ã€ã«ã®çæã¿ã¹ã¯ãå®è¡ãããŸãã ãã®åŸã Rails::Generators::AppGenerator#bundle_command ã«ãã£ãŠ bundle install ãå®è¡ããæçµçã«ã³ãŒã«ããã¯ãåŒã³åºãããŸãã rails new ã«é¢ãã説æã¯ä»¥äžã§ãã ãã®åãçµã¿ãéããŠluccafortããã¯ä»çµã¿ãçè§£ããéèŠæ§ã«ã€ããŠæ°ã¥ãããã£ãããã§ãã ä»çµã¿ãçè§£ããŠããªããŠãRuby on Railsã¯äœ¿ãããã®ã®ãæ·±ãçè§£ããããšã§æ°ããçºæ³ãæ°ããªæ°ã¥ãã®ãã£ããã«ãªããšã話ããããŠããŸããã Ruby à iOSã¢ããªéçºïŒå
±ã«æ©ãã ãšã³ã·ã¹ãã ã®ç©èª Tomoki Kobayashi ãã speakerdeck.com Kobayashiããã¯æ®æ®µã¯äž»ã«ã¢ãã€ã«ãšã³ãžãã¢ãšããŠæŽ»åãããŠããŸãã Rubyã¯iOSéçºã®æŽå²ã«ãããŠéå»å€§ããªåœ¹å²ãæ
ã£ãŠããããŸãiOSéçºã³ãã¥ããã£ãRubyã«å€§ããè²¢ç®ããŠããŸãã iOSéçºãšRubyãä»ãŸã§ã©ãé¢ãã£ãŠãããã®æŽå²ãã話ããããŠããŸããã 2010幎ããã®iOSã¢ããªéçºã¯Objective-Cã䜿çšãããŠããŸãããããµãŒãããŒãã£ã®ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«ã倧å€ã ã£ãããã§ãã ã©ã€ãã©ãªã«ãã£ãŠã€ã³ã¹ããŒã«ã®ä»æ¹ãç°ãªã£ãŠãããXcodeã®ãã«ãèšå®ãè¡ãéã«ãAppleã®éå
¬éã®ç¬èªä»æ§ã®ããã«ä¿å®æ§ãéåžžã«äœããã®ã§ããã ãã®åé¡ã解決ããããã« CocoaPods ãšããããã±ãŒãžãããŒãžã£ãŒãç»å ŽããŸããã ããã«ããã©ã€ãã©ãªã®äŸåæ§è§£æ±ºã»ããŠã³ããŒãã»Xcodeãžã®ãããžã§ã¯ãçµ±åãŸã§èªåã§ããããã«ãªããŸããã CocoaPodsã¯Rubyã§ã©ã€ãã©ãªç®¡çã«äœ¿çšãããRubyGemsãšBundlerãåèã«äœæãããŠãããæ¬äœã®å®è£
ãRubyã§æžãããŠããŸãã ãã®ä»ã nomad-cli ã fastlane ãšãã£ãRubyãåèã«ããããŒã«ãç»å ŽããŠããŸããã ãã®èæ¯ã¯ããŒã«ã®äœæè
ãå
ã
RubyãRuby on Railsã®ãšã³ãžãã¢ãå€ãã£ãããšã«ããããã§ãã ãããŠãCocoaPodsã®äŸåé¢ä¿ãªãŸã«ããŒã§ãã MolinilloïŒã¢ãªããŒãžã§ïŒ ã¯Bundler1.9, RubyGems2.9ã«æèŒãããããã«ãªããŸããã ããããªãããiOSéçºãšRubyã®é¢ããã¯èãã€ã€ããããã§ãã 2014幎ã®Swiftã®ç»å Žãæ©ã«Swiftãå
¬åŒã®ããã±ãŒãžãããŒãžã£ãŒãçºè¡šãããBundler2.4ã§MolinilloãåŒéããŠããŸãã Ruby Mini Languageäœæèš ããã³ãºãªã³ã§åŠã¶ã€ã³ã¿ããªã¿ã®äžçã haruguchi ãã RubyãçšããŠã€ã³ã¿ããªã¿ãäœæããçµéšãããšã«ãåå¥è§£æãæ§æè§£æãè©äŸ¡ãšã£ãåŠçã®å®è£
æ¹æ³ãèšèšäžã®æ³šæç¹ã«ã€ããŠã話ããããŠããŸããã ã€ã³ã¿ããªã¿ãäœãããšæã£ãã®ã¯haruguchiãããRubyKaigi2025ã«åå ããããšããã£ããã ããã§ãRubyKaigiã§ããçºè¡šãããèšèªåŠçã®è©±ã®çè§£ãæ·±ããããšæã£ãæã«ã€ã³ã¿ããªã¿ã®å®è£
ãæãã€ããããã§ãã haruguchiãããåå ãããŠããå匷äŒã§ãã®è©±ãæã¡èŸŒã¿ãä»ã®ã¡ã³ããŒãšå®è£
ããŠããããšã«ãªããŸããã ã€ã³ã¿ããªã¿ã¯FizzBuzzãåããã®ããŽãŒã«ãšããŠãåçŽãª2é
æŒç®ã®å®è£
ããã¯ãããããšã«ããŸããã æåã¯åçŽãªããŒãµãŒã®ã¿ã§å®è£
ããããšãšããã€ã³ã¿ããªã¿ã®æ©èœã远å ããŠããã«ã€ããŠã¬ããµãŒãå®è£
ãããæ§æè§£ææ¹æ³ã工倫ããããšå®è£
ãé²ããŠãããŸããã èªèº«ã§å®è£
ããããšãé¢çœããããã€ã³ããšããŠifæã®æ¡ä»¶åŒã®åºåãã < > ã«ããããšãªãªãžãã«ã®èŠçŽ ã远å ããŠãã£ãããã§ãã 5ã¶æã»ã©ã§Fizz Buzzã®å®è£
ãŸã§å®äºããŠãéäžãã¢ã§å®è·µããŠããŸããã äŒå Žã®ã¿ããªã§ã¢ãããããŠãã®è¯ããã #nagara01 pic.twitter.com/PX9v0mA3k2 — ãã ãããšã (@akitoshiga) 2025幎9æ6æ¥ åœåã®ãŽãŒã«ãšããŠã¯éæããã®ã§ãããããããé
åãããã·ã¥ãšãã£ãããŒã¿æ§é ãè¡ã£ãŠã¿ãããšã®ããšã§ããã èšèªåŠçã®è©±é¡ã¯Rubyã§ã¯ããåºãŠããã®ã§ããããã®çè§£ã®ããã«ã€ã³ã¿ããªã¿ãèªåã§å®è·µãããšããã«å°æ¬ããŸããããŸããèªåãææŠããŠã¿ãããšæããŸããã ð¡RubyïŒã²ããã³ãŒïŒ å·èŸºã§ç¯ãPicoRubyããã®å
bash ãã speakerdeck.com PicoRubyãšããçµã¿èŸŒã¿åãã®è»œéãªRubyã䜿ã£ãŠLEDãç¹ç¯ããããšãããããé³å£°ãå é床ãšãã£ãã»ã³ãµãŒã远å ããŠæ§ã
ãªããšã«ææŠããããšã§Rubyã§çµã¿èŸŒã¿éçºãããæ¥œããã«ã€ããŠã話ããããŠããŸããã æåã®æ©æã¯ã ATOM Matrix ããšããéçºããŒãã§ãå
èµã®LEDãç¹ç¯ããããšããããå§ãŸããŸããã ãŸããåºæ¬çãªã¢ãŒããã¯ãã£ã¯ãSuper Loop Architectureããšãããã®ãçšããŠããŸããã Super Loop Architectureãšã¯ãåæåã®åŸã«çºçãããç¡éã«ãŒãã®äžã§LEDã«å¯ŸããŠã®æäœãè¡ããã®ã§ãã LEDã®ç¹ç¯ã«æåãããããšã¯ãã©ã³ãã ã«ç¹ç¯ããããèªåã®åãã«åãããŠç¹ç¯ãããããšãã£ã詊ã¿ãè¡ã£ãŠãããŸããã æçµçã«ã¯æ£ç¶ã®LEDãMIDIã·ã³ã»ãµã€ã¶ãŒãšãã£ãä»ã®æ©æãšé£æºããã詊ã¿ãè¡ã£ãŠããŸããã ã©ã€ãã»ã€ããŒãæ¯ãåãbashãã #nagara01 pic.twitter.com/SSv6g6SMAE — ãããã (@uproad3) 2025幎9æ6æ¥ 365æ¥ã®OSSéçºãç¶ããèå°è£ Koichi ITO(Koic) ãã speakerdeck.com  RuboCopã®ã³ããã¿ãŒã§ããã365æ¥OSSã«ã³ã³ããªãã¥ãŒããè¡ã£ãŠããITOããã®æ®æ®µã®éçºç°å¢ãOSSã«å¯Ÿããå¿æ§ãã«ã€ããŠã話ããããŠããŸããã éçºç°å¢ã¯æ¥åã®ã³ãŒããšOSSã®ã³ãŒããééçã«æ±ããããã«ããããšãããŒããšããŠããŸããã ãã®ããã®ããŒã«ãšã㊠ghq ã gem-src ã®äœ¿çšãæšå¥šãããŠããŸããã OSS掻åããããšããŒã«ã«ãªããžããªã倧éã«å¢ããã®ã§ããããã®ç¹ã«ã€ããŠã¯ peco ã fzf ãçšãã察çã玹ä»ãããŠããŸããã å°è±¡çã ã£ãã®ã¯ãgitã³ãã³ãã®æ±ãæ¹ã§ã³ãããæš©ã®ãªããªããžããªãšãªããžããªã§ã®æ¯ãèããåãããããã«Forkå
ã®ãªããžããªãoriginãšããŠãupstreamãForkããæ¹ã®ãªããžããªãšããããšãæšå¥šãããŠããç¹ã§ãã ããã«ãã£ãŠã©ã®ç°å¢ã«ããã·ã¥ããéã git push upstream head ãšåäžã®ã³ãã³ãã«ã§ããå©ç¹ã«ã€ããŠåŒ·èª¿ãããŠããŸããã å¿æ§ãã«ã€ããŠã¯ãã³ãŒãã®å
容ã ãã§ã¯ãªãçºèšãã¬ãã¥ãŒã«ã€ããŠãæ¥ãããããªãæ¯ãèããããããšããããœãŒã·ã£ã«ã³ãŒãã£ã³ã°ããšããèãæ¹ããOSSãå°çå
šäœã§ã®éåæéçºãšæããŠèªå·±å®çµããã³ãŒãã®ã¿ã®PRãåºããã«ã³ã³ããã¹ããæç« åããŠäŒããããšã®éèŠæ§ã«ãè§ŠããããŠããŸããã ã ã¢ãã¿ãŒã€ãã³ã æèŠªäŒã®åŸã«ã¯ã¢ãã¿ãŒã€ãã³ããšããŠéµé£ŒæŒã®èŠ³èŠ§ããããŸããïŒ éµåã¿ã§ãã #nagara01 pic.twitter.com/EPTU5bsiJ3 — ã©ã¿ã«ãã525 (@Dominion525) 2025幎9æ6æ¥ æ®å¿µãªããèªåã¯åå ã§ããªãã£ãã®ã§ããã倧å€çãäžãã£ãã¿ããã§ãã ãŸãšã ã¹ãã³ãµãŒLTãå«ããŠã©ã®ã»ãã·ã§ã³ã倧å€é¢çœãã£ãã§ãã çºè¡šè
ã®ããããããããããããïŒããšãã£ãæ°æã¡ã«åºã¥ããçºè¡šãå€ãã£ãã®ã§ããããã®å§¿å¢ããšãŠãå°æ¬ããŸããã ãŸãå°èŠæš¡ã®éå¬ã ã£ãããšããããã¢ããããŒã ã§åå è
éã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ããšããããããããã®æ¹ãšäº€æµã§ããŸããã ãŸããèªèº«ã¯ä»ååããŠå²éã«è¡ã£ãã®ã§ãããèªç¶ãšäººã
ã®ç掻ã調åãããšãŠãçŽ æŽãããå Žæã§ããã 倧å€å¿ã«æ®ãçŽ æŽãããäŒã ã£ãã®ã§ã次åéå¬ãããéã¯ãŸããã²äŒºããããªãšæããŸããïŒ Â
ã¯ããã« ããã«ã¡ã¯ãã¿ã€ããŒã§ããŒã¿ãšã³ãžãã¢ãããŠãã chanyou ã§ãã å
æ¥ãããããé¢è¥¿åã§åããŠã®ããŒã¿ãšã³ãžãã¢ãªã³ã°ã»ã¢ããªãã£ã¯ã¹ãšã³ãžãã¢ãªã³ã°ãããŒããšããã€ãã³ãã é¢è¥¿ããŒã¿ãšã³ãžãã¢/ã¢ããªãã£ã¯ã¹ãšã³ãžãã¢Meetup ã«åå ããŠããŸããïŒ https://monotaro.connpass.com/event/360460/ monotaro.connpass.com ãã®ããŒãã¢ããã¯ãæ ªåŒäŒç€ŸMonotaROäž»å¬ã®ããšããé¢è¥¿ã«äœã¿ãªããããŒã¿é¢é£ã®ä»äºããããããé¢è¥¿ã§åãè·çš®ã®ä»²éãšç¹ããããããšããæ³ããæã€ããŒã¿å°éè·åãã«éå¬ãããŸããã åœæ¥ã¯æ ªåŒäŒç€Ÿ10Xãæ ªåŒäŒç€ŸMonotaROããã€ããå·¥æ¥æ ªåŒäŒç€ŸããããŠåœç€Ÿã¿ã€ããŒã®4瀟ã®çºè¡šãšãæåŸã«ããã«ãã£ã¹ã«ãã·ã§ã³ããããŸããã éåžžã«ç±éããã€ãã³ãã§ããã®ã§ãå
容ããŸãšããŠãäŒãããŸãã äŒç€Ÿã«ããŒã¿ãšã³ãžãã¢ãããããšã§ã§ããããã«ãªãããš ãŸãã¯æ ªåŒäŒç€Ÿ10X åç°ããã®çºè¡šã§ãã speakerdeck.com ãããŒãžããµãŒãã¹ãæ®åãã誰ã§ãããçšåºŠã®ããŒã¿åºç€ãæ§ç¯ã§ããããã«ãªã£ãçŸä»£ã«ãããŠãæ¹ããŠããªãããŒã¿ãšã³ãžãã¢ãå¿
èŠãªã®ãããšããåãã«ãå
·äœçãªäºäŸã§çããŠããå
容ã§ããã ç¹ã«å°è±¡çã ã£ãã®ã¯ã以äžã®2ã€ã®åãçµã¿ã§ãã ã¢ã»ã¹ã¡ã³ãã®å®æœãšããŒã¿åè³ªã®æ¹å DMBOKãæ ãæã«ããŒã¿å質ãå®çŸ©ããããŒã¿ã»ããããšã«å¯èŠåããä»çµã¿ãæ§ç¯ãããŠãããšã®ããšã æ£çŽããŒã¿å質ã®ç¶ç¶çãªã¢ãã¿ãªã³ã°ãŸã§ãããŠããŠãèŠç¿ã£ãŠãããã°ãšæããŸããã Data Contractã«ããããŒã¿ãœãŒã¹ä»æ§ã®ç¢ºç« ããŒã¿ã®çç£è
ãšããŒã¿ã®æ¶è²»è
ã®æ©æž¡ã圹ãšããŠã飿ºã®ãããã³ã«ãåãæ±ºããŠéçšãããŠãããšã®ããšã ããããŸããããŒãžããµãŒãã¹ã ãã§ã¯å®çŸã§ããªãã人éã«æ®ãããä»äºã®ãã¡ã®ã²ãšã€ã ãªãšæããŸããã ã»ãã·ã§ã³å
šäœãéããŠããããŒã¿ãšã³ãžãã¢ã®æ¬è³ªãšã¯äœãïŒããšããåããçªãã€ãããããããªæèŠã§ã身ãåŒãç· ãŸãæãã§ããâŠïŒïŒ çµç¹çããŒã¿æŽ»çšãã¹ã±ãŒã«ããããã¢ããªãã£ã¯ã¹ãšã³ãžãã¢ãªã³ã°ã®å®è·µ ç¶ããŠæ ªåŒäŒç€ŸMonotaRO å°è°·ããã®çºè¡šã§ãã ã¢ããªãã£ã¯ã¹ãšã³ãžãã¢ãªã³ã°ã«ç¹åããéšçœ²ãç«ã¡äžããçµç¹çãªããŒã¿æŽ»çšãã¹ã±ãŒã«ãããŠããå®è·µäŸãå
±æãããŸããã ä»åçºè¡šãããå°è°·ããã¯ãå¶æ¥å°éã®ã¢ããªãã£ã¯ã¹ãšã³ãžãã¢ãšããŠãå¶æ¥çµç¹ã«ãã«ã³ããããæ·±ãå
¥ã蟌ãã§èª²é¡ã®ç¹å®ãããœãªã¥ãŒã·ã§ã³ã®å®è£
ã»éçšãŸã§ãããŠããããã§ãã å°è±¡çã ã£ãã®ã¯å¶æ¥çµç¹ã«æ¬åœã«æ·±ãå
¥ã蟌ãã§ããç¹ã§ãå¶æ¥ç®¡çéšçœ²ã®å®äŸã«åå ããã®ã¯ãã¡ãããäœæ¥ãåãéšå±ã§è¡ããªã©ã培åºçã«çŸå Žã«å¯ãæ·»ã£ãŠããŸãããããã«ããçã®èª²é¡ãç¹å®ããŠãææã«ã€ãªãã£ããšã®ããšã§ããã ãã㫠瞊ã«äŒžã°ããŠæšªã«åºãã ãšãããã¢ããªãã£ã¯ã¹ãšã³ãžãã¢ãæ·±ããæ¢æ±ããŠãããŒã¿ãšã³ãžãã¢ããããæšªå±éããææ³ãèªãããŠãããéåžžã«å
±æã§ããèãæ¹ã ãªãšæããŸããïŒïŒ å
·äœçãªãœãªã¥ãŒã·ã§ã³ã«ã€ããŠããã»ãã³ãã£ãã¯ã¬ã€ã€ãŒãæŽåããããçæAIã«ããè°äºé²äœæã®èªååãããããšãèžã¿èŸŒãã ããŒã¿æŽ»çšããããŠããŠå匷ã«ãªããŸããã AnalyticsEngineeringããããããå®ã€ã³ãã¯ããšæªæ¥ã®ããŒãããã åœç€Ÿ okodoon ããã«ããçºè¡šã§ãã speakerdeck.com ã¿ã€ããŒã«ãããã¢ããªãã£ã¯ã¹ãšã³ãžãã¢ãªã³ã°ããããŒã¿æŽ»çšUXã®æ¹åããšå®çŸ©ãããããŸã§è¡ã£ãŠããããŒã¿ã¢ããªã³ã°ãããŒã¿ã¢ããªã±ãŒã·ã§ã³éçºããå®éã«ã©ã®ãããªã€ã³ãã¯ããããããããã玹ä»ããŸãããå
·äœçã«ã¯ä»¥äžã®äºäŸã玹ä»ããŸããã LookeræŽåã«ããã¢ããªã¹ãã®è² è·è»œæžãšææšçµ±äž å人æ
å ±ãå«ãããŒã¿ã®ã¢ãŠããããç³è«ãããŒã®ã»ã«ããµãŒãã¹å ãŸããåŸåã§ã¯ããã«ããŒã¿æŽ»çšäœéšãåäžãããããã«è¡ã£ãŠãããã¢ãªã³ã°æŽ»åã«ã€ããŠãè§ŠããŸããã ããŒã¿å©çšè
ã®æ¥åçè§£ã«ã¯ããžã§ãçè«ãšãŠãŒã¶ãŒã¹ããŒãªãŒãããã³ã°ãçµã¿åãããç¬èªã®ãã¬ãŒã ã¯ãŒã¯ã§ãã¢ãªã³ã°ã宿œãããã¢ããªã³ã°ãè¡ããšãªã£ãéã«ã¯ã¢ãžã£ã€ã«ããŒã¿ã¢ããªã³ã°ãå®è·µããŠããŸãã ãŸãã¢ããªãã£ã¯ã¹ãšã³ãžãã¢ãªã³ã°ã®é
åã«æ³šç®ããŠèªã£ãŠããŠãokodoonãã㯠飜ããªãããšãéèŠ ãšè©±ããŠããã®ãååãªããé¢çœãã£ãã§ãã è£œé æ¥ã«ãããããžã¿ã«äººæã®æŽ»èºãã€ã³ã ãã€ããå·¥æ¥æ ªåŒäŒç€Ÿ 倪å€ããã«ããçºè¡šã§ããåçNGã®ã¹ã©ã€ãã§ããã®ã§æç« ã®ã¿ã§ãäŒãããŸãïŒ èªåè»ã¡ãŒã«ãŒãšããããšã§ä»ã®3瀟ãšã¯ãããŒã¿ãåãå·»ãç°å¢ãå
šãç°ãªã£ãŠããŸãããAIãBIãã¢ããªéçºã®3軞ã§ããããããŠã³ãšããã ã¢ããã®äž¡é¢ã§å€é©ãæšé²ããŠãããšã®ããšã§ããã AI ã«é¢ããŠã¯ãã¹ãã«ããã¡ã³ããŒãçŸå Žã«å
¥ã蟌ã¿ããã£ã2ã¶æã§ãªãªãŒã¹ããŠåã£ãŠãããšã®ããšã§ãããã¹ã¿ãŒãã¢ããé¡è² ããªã¹ããŒãæã«é©ããŸããâŠïŒ BI ã«é¢ããŠã¯ãã¡ãã£ãšããã·ã¥ããŒãäœããã¬ãã«ã®æ¹ãå¢ããã®ã§ã¯ãªããäººã«æããããã¬ãã«ã®æ¹ãå¢ããããšã«æ³šåããæŠç¥ãåãããŠãããšã®ããšã§ããã ã¢ããªéçºè»žã«é¢ããŠã¯ãæãæãããã£ãªã¢ãã§ã³ãžãããæ¹ãªã©ã«ããã°ã©ãã³ã°æè²ã宿œããŠãå
ã®éšçœ²ãç°ååŸã®éšçœ²ã§çŸå Žã®èª²é¡ã解決ããåããåã£ãŠããã£ãŠãããšã®ããšã§ãããå®éã«äººæã§è¡ã£ãŠããäœæ¥ãèªååããå
補ã¢ããªããããããšéçºãããŠããŠãçŸå Žã®èª²é¡ããã®ãŸãŸããã«è§£æ±ºã§ããç°å¢ãå®çŸãããŠãããã ãªãšæããŸããâŠãããã ããã«ãã£ã¹ã«ãã·ã§ã³ ã»ãã·ã§ã³åŸã¯ãç»å£è
å
šå¡ã«ããããã«ãã£ã¹ã«ãã·ã§ã³ãè¡ãããŸãããå€å²ã«ãããããŒãã§è°è«ã亀ããããç¹ã«å°è±¡ã«æ®ã£ãç¹ãããã€ãã玹ä»ããŸãã Q. ãžã§ãçè«ã®æŽ»çšãšãã£ãç¥èã®ã€ã³ãããããããŒã ã§ã®è°è«ã¯ã©ãé²ããŠããïŒ okodoon(ã¿ã€ããŒ): ããããã¯ãéçºã®ç¥èŠãåèã«ããŠããã瀟å
ã®ãããã¯ããããŒãžã£ãŒãå®è·µããŠãããžã§ãçè«ããŠãŒã¶ãŒã¹ããŒãªãŒãããã³ã°ã®ææ³ããããŒã¿åºç€ã®å©çšè
ãã¢ãªã³ã°ã«å¿çšãããã åç°ãã(10X): ãX(æ§Twitter)ãªã©å€éšããã®æ
å ±åéã«å ãããœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°ã®ç¥èŠãåèã«ããããšãå€ãããã ããåã«æ°ããæè¡ãå°å
¥ããã®ã§ã¯ãªããèªåãã¡ã®çµç¹ã®ãã§ãŒãºã«åã£ãŠããããéèŠãçµå¶é£ã«ã幎åäœã§ç¹°ãè¿ãäŒãç¶ããç²ã匷ããå¿
èŠãã Q. 倧人æ°ãããŒã¿ãè§Šãäžã§ã®ã¬ããã³ã¹ã管çäœå¶ã¯ã©ã®ããã«æ
ä¿ããŠãïŒ å€ªå€ãã(ãã€ãã): ããŸãã¯ã»ãã¥ãªãã£ãåºããã»ãã¥ã¢ãªç°å¢ãæ§ç¯ãããã®äžã§èªç±ã«äœ¿ããããã«ããŠãããæ°ããæè¡ã詊ãããã®Sandboxç°å¢ãçšæãããªã©ãç®çã§äœ¿ãåããŠãããã Q. ããŒã¿å質æ¹åã®å¯äœçšããä»éšçœ²ãžã®èª¬åŸã¯ã©ãä¹ãè¶ããïŒ åç°ãã(10X): ããªãã¬ãŒã·ã§ã³éšéãªã©ãšã®é£æºã¯èª²é¡ã«ãªããããããŸãã¯çŸç¶ã®å®çŸ©ããªãæ£ãããªãã®ããçŽè§£ããããã¹ãå§¿(to-be)ãèãããå
ããŒã¿ã®äœããè¯ããªããªããããŒã¿åºç€åŽã§åžåããã¢ãããŒããåããã å°è°·ãã(ã¢ãã¿ããŠ): ãå¶æ¥çµç¹ãªã©ã¯ç¹ã«ææšãå€ããããšã«ææã ããäžå¯§ã«èª¬æããããšã§çè§£ãåŸãããæåããããã Q. äœãäœããã®æææ±ºå®ãã©ãã«ãããããïŒ okodoon(ã¿ã€ããŒ): ãæè³ããŠãè
ããªãé åã«ããããããAEãæ
ãææšã®å®çŸ©ãªã©ã¯ãããã°ããã ã人éãAIãåã¶é åãã åç°ãã(10X): ãããžãã¹ããã»ã¹ãã©ãå®çŸ©ããããæ¯ãããã¬ãŒã ã¯ãŒã¯ã¯LLMãè§£éãããããã Q. ã¢ããªãã£ã¯ã¹ãšã³ãžãã¢ãšããããŒã«ã¯ã©ããã£ãŠçãŸããïŒ okodoon(ã¿ã€ããŒ): ãã¢ããªã¹ããéå ã¡ããŠèªçããïŒç¬ïŒããåæããŒãã«ãæ±ãããšãã£ãæãã¿ã解決ããããšããæ³ããåååãã åç°ãã(10X): ãããŒã«ã¯ãªãã§ããããŠãå·å¿µãã©ãã«æ§ãããããã®éããã ãããã« ä»åã®ããŒãã¢ãããéããŠãé¢è¥¿ã®ããŒã¿ã³ãã¥ããã£ã®ç±éãèã§æããããšãã§ããŸããã å瀟ã®çºè¡šãåºæ¿ã«ãªã£ãã®ã¯ãã¡ãããããã«ãã£ã¹ã«ãã·ã§ã³åŸã®æèŠªäŒã§ã¯æ§ã
ãªé åã®äŒæ¥ã®æ¹ãšã話ã§ããŠãæ¬åœã«è¥¿æ¥æ¬ã«ãããçãäžãããæããŸããâŠïŒ ãã®ãããªçŽ æŽãããå ŽãèšããŠãã ãã£ãéå¶ã»ç»å£è
ã®çæ§ããããŠåœæ¥ã話ããããŠããã ããåå è
ã®çæ§ãæ¬åœã«ããããšãããããŸããïŒ ä»ååŸãåŠã³ãæ¥ã
ã®æ¥åã«æŽ»ãããã¿ã€ããŒã®ããŒã¿æŽ»çšãããã«åé²ãããŠãããããšæããŸãã
ããã«ã¡ã¯ãã¿ã€ããŒã§ããã¯ãšã³ãã®ããã¯ãªãŒããããŠããæ°è°· ( @euglena1215 ) ã§ãã ã¿ã€ããŒã§ã¯ãéçºå¹çãåäžããããããDevin ã Claude Code Action ãšãã£ã AI ããŒã«ã掻çšããŠã³ãŒãã¬ãã¥ãŒã®èªååãé²ããŠããŸãã Claude Code ã¯ãã€ã³ã©ã€ã³ã³ã¡ã³ãã§ã¬ãã¥ãŒããŠããšäŒãããšã€ã³ã©ã€ã³ã§ã®ã¬ãã¥ãŒãããŠãããã®ã§ãããDevin ã¯åãæç€ºãããŸãè§£éã§ããã€ã³ã©ã€ã³ã§ã¬ãã¥ãŒããŠãããŸããã ãã®èœåã®å·®ã¯ GitHub MCP ã䜿ãããã©ããã®å·®ã§ã¯ãããšæãã®ã§ãããDevin ãš Claude Code Action ã§ã®ã¬ãã¥ãŒå
容ã®ç²ŸåºŠãæ¯èŒããããšããéã«ãã¬ãã¥ãŒãã©ãŒããããç°ãªã£ãŠãããšçŽç²ãªæ§èœæ¯èŒãé£ãããªããŸãã ããã§ãä»å㯠Devin ã§ãã€ã³ã©ã€ã³ã³ã¡ã³ãã«ããã¬ãã¥ãŒãå®çŸããããã®æ¹æ³ã調ã¹ãŠã¿ãã®ã§ç޹ä»ããããšæããŸãã æ¹æ³ æ¹æ³ã¯ç°¡åã§ã以äžã® GitHub API ã䜿ã£ãŠã€ã³ã©ã€ã³ã³ã¡ã³ããæçš¿ããæ¹æ³ãèšããããã¥ã¡ã³ãã Devin ã® knowledge ãšããŠç»é²ããã ãã§ãã ããªã¬ãŒèšå®ã¯ç»é²æã« Devin ãææ¡ããŠããããã©ã«ãã®å
容ã§åé¡ãªãåäœããŸããã How to post comments with code embedded: 1. Create JSON file for each comment you want to post. Example 1: { "body": "Security Issue: Hardcoded API key. Recommendation: Use environment variables", "commit_id": "954...12312", "path": "file.py", "line": 11, "side": "RIGHT" } Example 2: { "body": "Multiple issues found:\n1. Hardcoded API key should be in environment variables\n2. Inconsistent class naming (userAccount vs Product)\n3. Inconsistent parameter casing (Password vs username)\n4. Missing docstrings and type hints\n5. Inconsistent spacing around operators", "commit_id": "323......87686", "path": "code.py", "start_line": 11, "start_side": "RIGHT", "line": 25, "side": "RIGHT" } body: The text of the review comment. Include markdown code blocks for snippets commit_id: SHA of the commit you're reviewing. Not using the latest commit SHA may render your comment outdated if a subsequent commit modifies the line you specify as the position. path: Relative file path in repo line (integer): Specifies the exact line in the pull requestâs diff view to which your comment should attach. Required unless using subject_type:file. The line of the blob in the pull request diff that the comment applies to. For a multi-line comment, the last line of the range that your comment applies to. side: In a split diff view, the side of the diff that the pull request's changes appear on. Can be LEFT or RIGHT. Use LEFT for deletions that appear in red. Use RIGHT for additions that appear in green or unchanged lines that appear in white and are shown for context. For a multi-line comment, side represents whether the last line of the comment range is a deletion or addition. subject_type: The level at which the comment is targeted. Either "line" or "file". Use "line" for inline comments. Use "file" for file-level comments. start_line (integer): Required when using multi-line comments unless using in_reply_to. The start_line is the first line in the pull request diff that your multi-line comment applies to. start_side: Required when using multi-line comments unless using in_reply_to. The start_side is the starting side of the diff that the comment applies to. Can be LEFT or RIGHT. A pull request diff may not match the original file's absolute line numbering. That is, if the PR contains additions or deletions before the line youâre commenting on, the line indices shown in the âFiles changedâ tab can shift from the original fileâs line numbers. For example: In the pre-PR state, line 231 might refer to a completely different section of code than line 231 in the post-PR diff (because code added or removed above it shifts everything down or up). Therefore, you must use the line numbers as shown in the PR diff rather than the original fileâs line numbers. If you have issues, visit the docs: https://docs.github.com/en/rest/pulls/comments?apiVersion=2022-11-28#create-a-review-comment-for-a-pull-request 2. Use gh api command. gh api \\ --method POST \\ -H "Accept: application/vnd.github+json" \\ /repos/owner/repo/pulls/4/comments \\ --input comment.json owner: the account owner of the repository. The name is not case sensitive. repo: The name of the repository without the .git extension. The name is not case sensitive. pull number: The number of the pull request. Key points: use "line" instead of "position", include code snippets in body using markdown, , set side="RIGHT" for additions ãã® knowledge ãç»é²ããããšã§ Devin ã«ãã€ã³ã©ã€ã³ã³ã¡ã³ãã§ã¬ãã¥ãŒããŠããšäžèšäŒãããšãå®å®ããŠæ£ããã€ã³ã©ã€ã³ã³ã¡ã³ãã§ã¬ãã¥ãŒããŠãããããã«ãªããŸããïŒ ð å®ã¯ãäžèšã® knowledge ã®å
容㯠Devin ã®éçºå
ã§ãã Cognition 瀟ã®èšäºã«ãã®ãŸãŸæ²èŒãããŠããŸãã cognition.ai å
¬åŒããã¥ã¡ã³ããèªã¿ãŸãããã以äžãã®å
容ã§ã¯ãããŸãããããŸãæ¥æ¬èªã®æç®ãèŠã€ãããªãã£ãã®ã§èšäºã«ããŠã¿ãŸããã ãã®èšäºããåãããã« AI ã³ãŒãã¬ãã¥ãŒã«åãçµãæ¹ã
ã®å©ãã«ãªãã°å¹žãã§ãã
ã¯ããäºäºã§ãã ã€ã³ã¿ãŒãããäžã§ã¯ãyykameiïŒãããããããïŒãšããååã§æŽ»åããŠããŸããæå±ã¯ã¿ã€ããŒã§ãã Kaigi Pass ãå©çšã㊠ã¹ã¯ã©ã ãã§ã¹ä»å°2025 ã«è¡ã£ãŠããŸããã®ã§ãåå ã¬ããŒããšãã圢ã§ãã¡ãã«æçš¿ããŠããŸãã ãŸãã¯ãã¹ã¯ã©ã ãã§ã¹ä»å°ã®éå¶ã®çãããã¹ãã³ãµãŒã®çãããäŒå ŽæäŸãããŠãã ãã£ã enspace ããããããŠãç»å£è
ãåå è
ãå§ããšããé¢ãã£ãŠãã ãã£ãçãããããããšãããããŸããçããã®ãããã§çµå§æ¥œãããŸããã 1æ¥ç®ã¯ããŒããŒããè¡ãããŸããä»å㯠ã¢ã³ããã£ãªå±±åœ¢ ã®çžç°ãããããŒããŒãã¹ããŒã«ãŒãšããŠç»å£ãããŸãããã¢ã³ããã£ãªå±±åœ¢ã«å
¥ã£ãŠããçžç°ããã宿œããåãçµã¿ãäžå¿ã«ãä»åŸã®å±æã«ã€ããŠã話ãããŠããŸãããããšããšæ¥œå€©ã€ãŒã°ã«ã¹ããŽã£ãã»ã«ç¥æžãªã©ã«é¢ãã£ãŠããããšããããã¯ã©ãéå¶ã«ã€ããŠã®ç¥èŠãªã©ããã£ããšæãã®ã§ãããè²ã
ãšå€ããŠããããšãããªãŒããŒãåããŠã¢ã³ããã£ãªå±±åœ¢ã«ãžã§ã€ã³ããããè²ã
ããããããã§ããããšãã°ããªãã£ã¹ãããŸãã«ãããªãŒãã³ãããããããã«æ
å ±ãçæãã«ãªã£ãŠããã®ã§ããããããŒã ãšããŠãŸãããããšããããšã§ãªãã£ã¹ã®æ¹åãããŠã»ãã¥ãªãã£ãŒã¬ãã«ã®åäžããããããã¯ã©ããçµå±ã¯å£²äžã倧äºãªã®ã§ã詊åãããŠããªããšãã«ã©ã®ããã«ããŠå£²äžããããŠãããïŒããšããããšãèããŠã¹ã¿ãžã¢ã ã®åšèŸºã®ç°å¢ãæŽåããããããããã§ããå°è±¡çã ã£ãã®ã¯ãå°åã«ãã£ãŠãããŠããã£ãïŒããšèšã£ãŠããããããšããããŠãããã®ããŒã ã«å
¥ãããïŒããšéžæã«æãããããšãç®æããŠããããšããããšã§ãããã¹ã¯ã©ã ãã§ã¹ã®ããã«åå°åã§è¡ãããŠããã¹ã¯ã©ã ãã§ã¹ã¯ããããã®å°åã§éå¶ã¡ã³ããŒãç°ãªããŸãããåãã¹ã¯ã©ã ãã§ã¹ãšããååãå ããŠããŠãç¹è²ãç°ãªããŸãããã®ãããªç¬èªæ§ããã€å°åã¹ã¯ã©ã ãã§ã¹ã§ãããã¿ããªãå°åã«è²¢ç®ãããããšããæããããã®ã§ã¯ãªãããšç§ã¯æã£ãŠããŸããããããäžã§ãã¹ã¯ã©ã ãã§ã¹ä»å°ã§çžç°ãããããŒããŒãã«ãæãããã®ã¯äœãæãããã®ããããŸããããŸããçžç°ããã®è©±ãããããèããŠãããšããããã® æ¹å ããããã®ã§ããããã® æ¹å ã®è£ã«ã¯äžå¯§ãª èŠ³å¯ ããã£ãã®ã§ã¯ãªãããšæšå¯ããŸãããšããã®ããå
ã»ã©ã®ãªãã£ã¹ã®è©±ã«ããŠãçŸå Žã«å
¥ã£ãŠããããèŠãŠã¿ãªããšç¶æ³ã¯ããããªãã§ããããããã®ããã§å¯Ÿçãè¡ããšãã話ããŸãã«ã¹ã¯ã©ã ã§ãããšãããšããã®æ€æ»ãšé©å¿ãªã®ã ãªãšã ããŒããŒãã®ããšã«ãããã¯ãŒãã³ã°ããŒãã£ãŒããããŸãããããã§åçãæ®ã£ãŠãããªãã£ãããšãåŸæããŠããŸããããšã«ããããããããããŠããã ããŸãããç¹ã«å°è±¡ã«æ®ã£ãŠããã®ã¯ãããŒã®Aããã«ãããããã¯... ãããããããã§ããïŒããšãããããã§ããããã²ãããªã§ããããããšæžããã€ãããªã®ã§ãããåãæ±ãã£ãããã§ãããããããã«èŠããããã§ããã©ãã§ãããïŒãããªã«ãããã§ããïŒ ãããããïŒãããããïŒ 2æ¥ç®ã¯ãããããšç»å£ã»ãã·ã§ã³ããããŸãããååã¯æãã ShinoP ã®ç»å£ãšããããšã§èããŠãããŸãããç§ã¯ãããããäžã®äººããªã®ã§ç¥ã£ãŠããå
容ã§ã¯ãã£ãã®ã§ããããããããŠèããŠã¿ããšãããŸãšãŸã£ãŠãã話ã§ãããããã£ãã è³æ ãã¢ããããŒãããŠããã ããã¿ããã§ããé¢çœãã£ãã®ã¯ãããŸã§ã®è¡åãæ¹ããŠèšèªåããŠããå
±ææ§ããéææ§ããäžè²«æ§ããšãããã®ã«ãŸãšãããšããã§ããã誰ãããã®åŸè³ªåããããŠããã®ãçã¿èããããšãããå®éã«è¡åãè¡ã£ãŠããæã¯ãã®èšèªåããããšãæèããŠãã£ãŠããããã§ã¯ãªãããšã®ããšã§ãããæ¹ããŠãµãããã£ãŠèšèªåããŠã¿ãçµæãããããæŠå¿µã«ãã©ãã€ããããšããããšã®ããã§ãããããããã§ããããã¡ãããå
容èªäœã®åŠã³ãããã®ã§ãããç»å£ããã£ããã«æ·±ããµããããã«ããå
çãè¡ããèªèº«ã®è¡åãæç¢ºåãããããšãããšããã«ãåŠã³ããããŸãããå¥ã«ç»å£ããæ©äŒããªããŠãããããå
çèªäœã«ã¯äŸ¡å€ãããããã§ããããããæ°ã¥ããäžããŠãããçã¿èãã®äŒè©±ãããã®ãã«ã³ãã¡ã¬ã³ã¹ã®ééå³ã§ããã ç¶ããŠãããããã® ã©ããã人ã£ãŠå€ãããããããäžå¹Žåã³ãŒãã³ã°ãåããŠèŠã€ããã³ã³ãã©ãŒããŸãŒã³ã®è¶
ãæ¹ã ãšããç»å£ãæèŠããŸãããå人çã«æè¿ã³ãŒãã³ã°ã«èå³ããã£ãŠåŠãã§ããæäžãªã®ã§ãããã¯ã©ã€ã¢ã³ãèŠç¹ã§ã©ãè¡åå€å®¹ãè¡ãããã®ãïŒãšãã話ã¯éåžžã«åŠã³ããããŸããã³ãŒãèŠç¹ã ãšã¯ã©ã€ã¢ã³ãã®è©±ãèããªããé©åãªã³ãŒãã³ã°ã®ã¹ãã«ã掻çšããŠããããšãæ±ããããã®ã§ã¯ãªãããšæãã®ã§ããããã®ã³ãŒãã®ããæ¹ãã¯ã©ã€ã¢ã³ãåŽããã¯ã©ãèŠããã®ãïŒãå£éèŠããŸãããã³ãŒãã³ã°ã¯å
±åé¢ä¿ã ãšæãã®ã§ããããŸãã«ã³ãŒãã ãã§ã¯ãªãã¯ã©ã€ã¢ã³ãã®åªåããã£ãŠããã®è¡åå€å®¹ãªãã ãªãšæããŸããã ãæŒã®æé垯ã¯ãã¯ãããŸããŠïŒããªæ¹ã
ãšã©ã³ãã«è¡ããŸãããå³å¯ã«ã¯ã¿ããªãã¿ããªãã¯ãããŸããŠïŒãã§ã¯ãªãã®ã§ããããŸãããã§ããããããŸããŸåãã°ã«ãŒãã«å°å
ã®æ¹ãããã£ããããŸããã®ã§ãããæãã®ãã©ãŒã¡ã³å±ããã«è¡ããŸãããããããã£ãã§ããããã®åŸã é¯ãã¡ ãšãããã¿ãã«è¡ã£ãŠããã é€
ã®ããçŒããé£ã¹ãŸããã ååŸã®æé垯ã¯ãã¯ãç»å£ãè¡ãããã®ã§ãããç»å£ãšäžŠè¡ããŠã³ãŒããºã¯ãªããã¯ãã¯ãŒã¯ã·ã§ããããã©ãããŒã¹ãOSTãè¡ãããŸãããªããã¯ãŒã¯ã·ã§ããã¯ååäžãããããŸãããæ¬åœã¯ã§ããã¯ãŒã¯ã·ã§ããããã£ãã®ã§ããã1æ¥ç®ã®æç¹ã§ã»ãšãã©ã®ã¯ãŒã¯ã·ã§ãããå®å¡ã«éããŠããŸã£ãã®ã§è«ŠããŸãããç§ã¯ã»ãšãã©OSTãè¡ãéšå±ã§éãããŠããŸããããOSTãšã¯ããã€ã€ããã£ãšèª°ãã話ãããããŒããç±ãèªãåã£ãŠããããããŸã«ãªãŒã³ã³ãŒããŒã§æ§é çã«è©±é¡ãåãæ¿ããªãã話ãããŠããŸãããããã§ã¯ããªããã£ãŒããªå
容ã話ããŠããã®ããªãšæããŸããããããç»å£ã§ã¯èšããªããããªè©±ãšããããã®ã§ãå®ã¯çµæ§åŠã³ã«ãªãå Žã ã£ããããªããšã ããããã°ãã¹ã¯ã©ã ãã§ã¹ä»å°ãéå¬ãããäŒå Žã§ãã enspace ããã«ã€ããŠè©±ããŠããŸããã§ãããããšããšæåã®ãªãŒã¬ãã€ã¶ãŒã ã£ã倩éããããã¹ã¯ã©ã ãã§ã¹ä»å°ãããããªãŒããšããæ§æ³æ®µéã§ãããããã¡ã§ãããªãïŒããšå£°ããããŠãããã®ã enspace ããã ããã§ããå Žæãæ¥çšã決ãŸã£ãŠããªããããªããªãã©ãããã³ã³ã»ããã§äœãããã®ãããæ±ºãŸã£ãŠããªãç¶æ
ã§å£°ããããŠããã£ãæãã¿ããã§ããã enspace ããã¯ãã®ããã«ååããããªãååçãªã®ã§ãããå®éã®ã¹ã¯ã©ã ãã§ã¹ä»å°åœæ¥ã®åãã«ã€ããŠãããªãååçã§ããã¹ã¯ã©ã ãã§ã¹ä»å°ã§ã¯ã ãããéå¶ã®æ¹ã玫è²ã®Tã·ã£ããããŠããã£ãããã®ã§ããã enspace ã®ã¹ã¿ããã®çãããåãéå¶ã®Tã·ã£ããããŠããŸããã€ãŸãã enspace ã®ã¹ã¿ããã®æ¹ã
ãã¹ã¯ã©ã ãã§ã¹ä»å°ã®éå¶ãšããŠå
šé¢çã«ååãããŠããŸããã enspace ã®ã¹ã¿ãããããäºäººãšè©±ãæ©äŒããããŸãããäžäººç®ã®æ¹ã¯å€§åŠ4幎çã ãšã®ããšã§ã enspace ã«ã¯å€§åŠ1幎çã®é ããã€ã³ã¿ãŒã³ãšããŠãä»äºããããŠãããšã®ããšã§ããããããã®ãä»äºã¯ãã®ãããæ¥œããããšèšã£ãŠããã®ãå°è±¡çã§ããæ¥å¹Žããã¯æ°ç€ŸäŒäººãšããŠæ±äº¬ã®äŒç€Ÿã«å°±è·ãããããã§ enspace ããé¢ããã®ãåæ®æãããã«è©±ããŠãããŸãããããäžäººã®æ¹ã¯å€§åŠ3幎çã§ enspace ã«ã¯å€§åŠ2幎çã®é ããé¢ãã£ãŠããããã§ãããã¡ãã®æ¹ãããããããæ¥œãããŠããã®ã楜ãã¿ãªãã§ãããšããããšãèšã£ãŠããŸããããããŠãã¹ã¯ã©ã ãã§ã¹ä»å°ãéå¬ãããæ¥çšã決ãŸããšãèªåã®ã·ãããããã«åãããããã«ãããšã®ããšã§ããããããããã¹ã¯ã©ã ãã§ã¹ã¯æ¥œããããšã®ããšã§ããäŒå ŽãæäŸããŠããã¹ã¿ããã®æ¹ããããã颚ã«èšã£ãŠãããã®ã¯ããã ã®åå è
ã§ããç§ã«ãšã£ãŠããšãŠãããããã§ãããããããŠãããããååãæãã¿ãªãæäŸãã enspace ã®ã¹ã¿ããã®çããã«ãæ¬åœã«æè¬ãããã§ãã ãããŸã§ã€ãã€ããšã¹ã¯ã©ã ãã§ã¹ä»å°ã®ææ³ãæžããŠã¿ãŸããããã¡ãããããããã®ç»å£ã«ãåŠã³ããããŸãããããã®å Žèªäœã«ååšããããšããã ãã§ãåŠã³ããããŸãããã¹ã¯ã©ã ãã§ã¹ä»å°ã¯ä»åãåããŠã®åå ã§ãããããŸãæ¥å¹Žãæ©äŒãããã°è¡ãããã§ãããæåŸã«ãã¿ã€ããŒã®ã¡ã³ããŒã§æ®ã£ãåçãã¯ã£ãŠãããããšæããŸãã ã¿ã€ããŒããããåå è
ã®çãã
8æ6æ¥ãã¿ã€ããŒãUPSIDERãã«ã±ãã·ã®3瀟å
±å¬ã«ããã çæAIæä»£ã®PdM - 掻çšãšæªæ¥æŠç¥ ããšé¡ããã€ãã³ããéå¬ãããŸãããæ¬ã€ãã³ãã§ã¯ããããã¯ããããžã¡ã³ãã«ãããçæAIã®æŽ»çšãšãããã«äŒŽãPdMã®åœ¹å²ã®å€åã«çŠç¹ãåœãŠãããŸãããæ¬ã¬ããŒãã§ã¯ãã¿ã€ããŒã®ãããã¯ããããŒãžã£ãŒã§ããæ¿è°· æš¹ã®è¬æŒãAIã§å€ããPdMã®åœ¹å² â æèããåãæŠåšã«ãªãããæžãèµ·ãã圢åŒã§ãäŒãããŸãã ã¯ããæ ªåŒäŒç€Ÿã¿ã€ããŒã®æ¿è°·ãšç³ããŸãããããããé¡ãããŸãã æ¬æ¥ã¯ãçæAIæä»£ã®PdMããšããããŒãã§ããAIã§å€ããPdMã®åœ¹å² â æèããåãæŠåšã«ãªãããšãããå°ã
ä»°ã
ããã¿ã€ãã«ã§ã話ãããŸããä»åã¯ãæèããããŒãã«ããããšæããŸãã æ¹ããŸããŠèªå·±ç޹ä»ããããŠãã ãããæ ªåŒäŒç€Ÿã¿ã€ããŒã§ãããã¯ããããŒãžã£ãŒãããŠããæ¿è°·ã§ããããã¯ã°ã©ãŠã³ããšããŠã¯ããªã¯ã«ãŒãã§æ°èŠäºæ¥éçºãçµéšåŸãäž»ã«toBé åã®ãããã¯ããããžã¡ã³ãã5幎ã»ã©çµéšããŸãããæšå¹Žã¿ã€ããŒã«ãžã§ã€ã³ããçŸåšã¯ããŒãã£ã«ã«ãªåžå Žã§ã®å£²äžæ¡å€§ãæ
åœããŠããŸããã¿ã€ããŒã¯2-side-platformã§ãããtoBæ
åœã»toCæ
åœã®ããã«ç·ãåŒãããããªã¥ãŒã¹ããªãŒã ïŒãŠãŒã¶ãŒã«äŸ¡å€ãå±ãäžé£ã®æµãïŒãåäœã«éçºããŒã ãçµæããŠããŸãããã®ããã1人ã®PdMããã©ãããã©ãŒã ã®äž¡é¢ã暪æããŠèŠãããšãå€ãã§ãã ããã§ã¯æ¬é¡ã«å
¥ããŸãããã®ããŒããèããã«ãããããããã¯ãéçºã®åæã倧ããå€ããäžã§ãçµå±PdMã«äœãæ®ãã®ããçªãè©°ããçµæãPdMã®äŸ¡å€ã¯ãæèããžã·ããããã®ã§ã¯ãªãããšããçµè«ã«è³ããŸãããæ¬æ¥ã¯ãã®ç¹ã«ã€ããŠéç¹çã«ã話ãã§ããã°ãšæããŸãã ã¢ãžã§ã³ãã¯ãæèããããæèãæ¢ããªãããæèç°å¢ãæŽãããã®3ã€ã§ãã 1. æèãã ââ æèãèšèšããåºåãèŠæ¥µãã察話ã§å
±æãã ãŸããæèãããã«ã€ããŠã§ãããæèãšã¯äœãããšãã話ã§ããããã«ã«ãã®ãææããæ
ã«æããããšãã£ã話ã§ã¯ãªããç§ãèªãã æ¬ã®äžã§éåžžã«ç確ã ãšæãã説æãåŒçšããŸãããæèãšã¯ãæè察象ã«å¯ŸããŠäœããã®æå³ãåŸãããã«ãé ã®äžã§æ
å ±ã»ç¥èãå å·¥ããããšãã§ããããã¯é¢æ°çãªåŠçãšæããããšãã§ããäºè±¡ãšç¥èãšããã€ã³ãããããã¡ãã»ãŒãžãæå³åããšããã¢ãŠãããããåºãããã»ã¹ã§ãã ãã®æ§é ã¯AIã®åŠçãšäŒŒãŠããŸãããæ¬è³ªçã«ç°ãªãç¹ããããŸããAIã¯äžå®å
šãªå
¥åã«å¯ŸããŠãããã«ã·ããŒã·ã§ã³ïŒãã£ãšããããåïŒã«ãã£ãŠãããããåºåãçæããŠããŸããŸãããã®ãããçµå±ã¯äººéã«ããå質æ
ä¿ãäžå¯æ¬ ã§ããããã«äººéã®äŸ¡å€ãæ®ããšèããŠããããããã¯ããããŒãžã£ãŒã«ã¯ãã³ã³ããã¹ãèšèšèœåããšãåºåã«å¯Ÿãã審çŸçŒããæ±ããããããã«ãªããŸãã ãã®å€åã«äŒŽããããã¥ã¡ã³ãã®äœçœ®ã¥ããå€ãã£ãŠããŸããã¢ãžã£ã€ã«éçºå®£èšã§ã¯ãããã¥ã¡ã³ããŒã·ã§ã³ããã察話ããšãããŠããŸããããAIã«èªã¿èŸŒãŸããã³ã³ããã¹ããéèŠã«ãªãä»ãããã¥ã¡ã³ããAIãžã®éèŠãªã€ã³ããããšãªããPdMã«ã¯ãWhyããæ§é åããã¹ãã«ãæ±ããããããã«ãªããŸããããã¯PdMã®åœ¹å²ããã³ã³ããã¹ããã¶ã€ããŒãã«å€ããããšãæå³ããŸãããã ãããã¯ããã¥ã¡ã³ã䞻矩ãžã®ååž°ã§ã¯ãªããã³ãã¥ãã±ãŒã·ã§ã³ã®éèŠæ§ã¯æ®éã§ããæçµçã«PdMã«ã¯ãæèã®æ§é åããšãçŽåŸãçã察話åããæ±ããããããã«ãªããšèããŠããŸãã 2. æèãæ¢ããªã ââ ç¶ç¶çãã£ã¹ã«ããªãŒãç«¶äºåã®æºæ³ã« 次ã«ãæèãæ¢ããªããã«ã€ããŠã§ããããããã®æä»£ãç¶ç¶çãªãã£ã¹ã«ããªãŒãããç«¶äºåã®æºæ³ã«ãªããšèããŠããŸããäžæ¬¡æ
å ±ãéåžžã«éèŠã«ãªããŸããéçºã®ããªããªãŒé床ãççºçã«åäžããäžã§ããã£ã¹ã«ããªãŒãåãé床ã§åãå¿
èŠããããŸãããã®ããã«ã¯ãé«éã§äžæ¬¡æ
å ±ã«è§Šããããç°å¢ãæ§ç¯ããããããåŸãæ
å ±ãããšã«æèãåžžã«ã¢ããããŒããç¶ããä»çµã¿ãäžå¯æ¬ ã§ãã ã§ã¯ãäœã倧äºããšãããšããããAIãšã¯çŽæ¥é¢ä¿ãªãéšåããããŸãããã€ã³ã¿ãã¥ãŒã®ãªãŒãã¿ã€ã ãæ¥µéãŸã§ççž®ããããšã§ããææ¥ã€ã³ã¿ãã¥ãŒããããšæã£ãããææ¥å®è¡ã§ãããããªãªãã¬ãŒã·ã§ã³ãæ§ç¯ããããšãéèŠã§ãããã®äžã§ãè°äºé²ã®äžæžãäœæãªã©ã¯AIã«ä»»ãã人éã¯èå¯ã«éäžã§ããç°å¢ãäœããŸãããããŠã ãªããã¥ããã£ã»ãœãªã¥ãŒã·ã§ã³ã»ããªãŒïŒOSTïŒ ãã®ãããªæèãã¬ãŒã ã¯ãŒã¯ã掻çšããè«ç¹ãåžžã«ã¢ããããŒããç¶ããããšãéèŠã§ãã 3. æèç°å¢ãæŽãã ââ Bullshit Jobãæžãããæå³ããä»äºã«éäžãã æåŸã«ãæèç°å¢ãæŽãããã«ã€ããŠã§ããPdMã®ä»äºã¯ãæå³ãäœãä»äºããžãšã·ããããŠãããŸããAIã®é²åã«ãããè°äºé²äœæãäŒè°èŠçŽãšãã£ãæŠè¡çãªåŽåããè§£æŸãããPdMã¯ãæå³ã®åµé ããšãããããæ¬è³ªçãªäŸ¡å€ã«æéãå
ãŠãããããã«ãªããŸãããã®ããã«ã¯ãããããããã«ã·ããã»ãžã§ãïŒç¡æå³ãªä»äºïŒããæžãããæèããããç°å¢ãæŽããããšãéèŠã§ãã ããŒã ãçµç¹ã§AIãæŽ»çšããæ¹åæ§ã¯ã倧ãã2ã€ã«åãããããšèããŠããŸããäžã€ã¯ãåäººã®æåäºäŸã暪å±éããããŒã å
šäœã®çç£æ§ãåºäžããã詊ã¿ãããäžã€ã¯ãAIåæã®ãªãã¬ãŒã·ã§ã³ãææ¬çã«èšèšãçŽã詊ã¿ã§ãããŸãã¯å人ãã¢ãããã¯ã«AIãæŽ»çšããããã§åŸãã³ã³ããã¹ããåªããããã³ãããããŒã ã§å
±æãããªã©ãããã ã¢ããã§é²ããŠããã®ãçŸå®çã§ãããã ãŸãšã ãŸãšãã«ãªããŸãããããããã®PdMã«æ±ããããããšã¯ããæèããããæèãæ¢ããªãããæèç°å¢ãæŽããããšãã3ç¹ã§ãã ã¿ã€ããŒã¯ç©æ¥µæ¡çšäžã§ãããèå³ã®ããæ¹ã¯ãã«ãžã¥ã¢ã«é¢è«ããã§ããã²ã声ãããã ãããããããšãããããŸããã hrmos.co æ¬è¬æŒã®ã¢ãŒã«ã€ãã¯ãã¡ã æ¬è¬æŒã®ç»å£è³æã¯ãã¡ã speakerdeck.com
ã¿ã€ããŒQAEnablingããŒã ã®æŸç°( @yoshi_engineer_ )ã§ãã å
æ¥ãç§ã®å°å
ã§éå¬ãããã¹ã¯ãã§ã¹å€§éªã«åå ããŠããŸããïŒ ã¹ã¯ã©ã ãã§ã¹ã«åããŠåå ããã®ã¯å»å¹Žã®ã¹ã¯ã©ã ãã§ã¹å€§éª24ã§ããŠããã®æã®æåãšç±ãå¿ããããã25幎床ãåå ããããšã«æ±ºããŸããã www.scrumosaka.org å»å¹Žã¯å人ã§åå ããã®ã§ãããä»åã¯åŒç€Ÿã®TED10ãšãããšã³ãžãã¢ã®æé·ãæ¯ããå¶åºŠãå©çšããŠåå ãããŠããã ããŸããã productpr.timee.co.jp ä»å¹Žã®ã¹ã¯ã©ã 倧éªã¯å»å¹Žãšã¯ãŸãéã£ãåãçµã¿ãå€ããåå è
ãšããŠã¯ãšãŠãæºè¶³ããŠãããã®åãçµã¿ã玹ä»ã§ããã°ãšæããŸãã ã³ãŒããŒãºã¯ãªãã㯠ïœçµéšè±å¯ãªã³ãŒãã«çžè«ããŠã¿ããïœ ä»åã¹ã¯ãã§ã¹å€§éªåã®è©Šã¿ã®ã³ãŒããŒãºã¯ãªããã¯ã ä»ã®ã¹ã¯ãã§ã¹ã§ã¯äœåºŠãéå¬ããã倧å€å¥œè©ã ã£ãããšããä»å倧éªã§ãæ¡çšããããšã®ããšã§ãã ãããŠä»åã¯ãããããããšã«yoh nakamura( @yohhatu ) ãããšã®ã³ãŒããŒãºã¯ãªããã¯ãåããããšãã§ããŸããã 以åããå人çã«ç¥ã£ãŠããã倧å€å°æ¬ãããæ¹ã§ããã£ãã®ã§ããšãŠã€ããªãç·åŒµããŠããã®ã§ãããæž©ããªç¬é¡ã§è¿ããŠãã ãããå®å¿ããŠå¯Ÿè©±ãå§ããããšãã§ããŸããã ç§ã®ã¹ã¯ã©ã ã«é¢ããæ©ã¿ãåŸèŽããŠããã ããæž©ããªç©ºæ°ã®äžãèªåã§ãé©ãã»ã©è©±ãããšãã§ããŸããã yohãããå¯ãæ·»ããªããçžæ§ãéãããã©ãããŠæŸç°ããã¯ããæã£ãã®ããªãŒïŒããæŸç°ããã®äžã§ã©ããã£ããããå°ãè¯ãã§ããã ããïŒãç§ãæ©ã¿ãäŒããäžã§ãç確ãªã¿ã€ãã³ã°ã§åããããã ããŸããããã®çãããã,,,,ãããããããããè¯ãããâŠïŒããš1人ã§ã¯æ°ä»ããªãã£ã(確信ãæãŠãªãã£ã)仮説ã«èªåããæ°ã¥ãèšèã«ããããšãã§ããŸããã ã»ãšãã©ç§ã®è©±ã ãã§çµããŠããŸã£ãã³ãŒãã³ã°ã®æéã§ããããyohãããããã¹ã¯ã©ã ãããæã倧äºãªã®ã¯ã匷ãæ
ç±æã€ããšã ããããšäžèšããã ããŸããã ãã®èšèãèããŠãç§ã¯ã°ãŒã£ãšäœã®è¯ããåãæ¹§ãèµ·ãããããªæèŠã«ãªããŸããã èªåãå°é£ãªæãæ«ãããã«ãªã£ãæãyohããããããã£ãèšèããå®ãã«é 匵ãããšæããŸãã yohãããææçŸ©ãªãæéããã ãæ¬åœã«ããããšãããããŸããïŒ ç§ã®å¿ãæã£ãsession ã¢ãžã£ã€ã«ã諊ããªãã£ã10幎 JTC,SIer,åèšã§æãã ãªã¢ã« confengine.com JTC,SIer,åèšäŒç€Ÿã®3瀟ã§ã¢ãžã£ã€ã«éçºãæšé²ã詊ã¿ãŠããOshikata( @oshikata200 )ããããã®ç»å£ã¯ãŸãã«çæ³ãšçŸå®ã®äžã§æ³¥èãå®è·µãè¡ã£ãŠããOshikataããã®10幎éã®è»è·¡ã赀裞ã
ã«èªã£ãŠããã ããŸããã ãã®ã»ãã·ã§ã³ã§è©±ãããå
容ã¯äžèšã§èšãã°ãçµç¹æ¹é©ãžã®å®è·µç¥ãã§ãã ã眮ãããå Žæã§å²ããããããå²ããå Žæãæ¢ããã¹ããªã®ã Oshikataããã¯ãããŸã§çµç¹ã«ã¢ãžã£ã€ã«ãå°å
¥ãã¹ãäœåºŠã奮éããŠããããã®ã§ãããçµç¹ã®ç¿æ
£ã圢æ
ã«ããå°å
¥ããã«ããã£ãŠäœåºŠãå£ã«ã¶ã€ãããŸããã ããããOshikataããã®æ°ã¥ãã¯ããã§ããã ãœãªã¥ãŒã·ã§ã³ããã©ã¯ãã£ã¹ãå°å
¥ããããšãéèŠããã®ã§ã¯ãªãããŸãããŒã ããããŠçµç¹æåãžã®ã¢ãããŒããå¿
èŠããŸããããã¯é·ãæéããããŠå°ããã€è¡ãããšãéèŠã 倱æãæããããå¢ãããããããææŸãããž äŒæ¥ã®ç¹æ§äžãããã¥ã¡ã³ããã«ãŒã«ãå é床çã«å¢ããçŸç¶ããããŸãããã®èæ¯ã«ã¯ãéå°ãªå€±æãžã®åé¿ããããããŠãå¯èœæ§ããããŸãã ããããããã§å¢ããããã¥ã¡ã³ããã«ãŒã«ã¯éã«ã¡ã³ããŒãããŒã ãžã®è¶³æ·ã«ãªãé床ãšèªç«æ§ã倱ãããŸãã è³ç£ãšæãç©ã¿éãããã®ã¯ããã€ã®éã«ãè² åµã«å€å®¹ã çŸç¶ãæç Žããããã«ãã圢骞åãããã«ãŒã«ãããã¥ã¡ã³ããæžããããšãæšé²ãããŸããã è² åµã倧ããããããããåããããããããã«ææŸãããšãå®è·µãããŸããã è©°ã蟌ã¿ãããå¶åºŠ,ã«ãŒã«ããããšãããã詊è¡é¯èª€ããå§¿å¢ãæãªãããŠãããŸãã â人ãå²ãâãã,âã¿ããªã§ç©ºæ°ãèãâ ãã¡ã³ããŒãžã®å·çãææŸããããã§ã¯ãªãçµç¹ã®ç©ºæ°ãèããã¡ã³ããŒã«å·çããããšã§èªåã®ããŒã ã ããå²ãããšã¯ãé·æçã«èŠãã°çµç¹ã®è¡°éãå©é·ããŸãã ããã§ã¯ãªããã§ãã人æããã©ãã©ãä»ã®éšçœ²ãããŒã ã«ææŸãããããŠãŸãæ°ããªã¡ã³ããŒãšå¯Ÿè©±ããçµç¹ã®ç©ºæ°ãèããŠããã ãããäœçŸããããã«ããå人ãžã®ä¿¡é Œé¢ä¿ã®æ§ç¯ãèã«ãªãã ä¿¡é Œé¢ä¿ã®æ°ä»ããçµç¹ãèããã¡ã³ããŒãããç¯çã®å¶åºŠã®äžã§ã¯ãŒã¯ããããšã§å·¥å€«ãè¡ããããã ãâ匷ãåâãéããã®ã§ã¯ãªããâã¿ããªâã§ç©ºæ°ãèãã å°ããã€ãäžæ©äžæ©ç¢ºå®ã«ã¿ããªã§é²ãããšãã颚åãéžæãããŠããã äžæäžå€ã§çµç¹ã¯å€ãããªããããã®äžã€äžã€ã®ç©ã¿éããæçŽã«è¡ãããšã§èœãéãããšãŠã€ããªã倧ããæ
ç±ãæã£ãŠæ©ãã§ããããOshikataããã®sessionã¯å€§ããªåŠã³ãšæ°ã¥ããäžããŠãã ãããŸããã å°é£ãªç¶æ
ããçµç¹ã®å®æ
ããã€ãã¹ãªèŠçŽ ããããã°ããªããªãç¶æ
ã§ãã£ããšããŠããå°ããã€æ¹åãéãé²ãŸããŠããå§¿ããä»åºŠã¯èªåãé 匵ããïŒãšå¿ã«ç«ãç¯ããããªæèŠãèŠããŸããã ãããã« ä»åã®ã¹ã¯ã©ã ãã§ã¹ã§ã倧å€å€§ããªæ°ã¥ããšåŠã³ãåŸãããšãã§ããŸããã ãã®æ°ã¥ããšåŠã³ã掻ãããŠããã粟é²ããŠãããããšæããŸãïŒ ãã€ãç§ãèŽè¬è
ãšããŠã§ã¯ãªããç»å£è
ãšããŠã¹ã¯ã©ã ãã§ã¹ã«å¯äžã§ããã°ãšæããŸãïŒ
ããã«ã¡ã¯ãããŒã¿ã¢ããªã¹ãã®tomitaã§ãã å
æ¥ã瀟å
ã®PdMïŒãããã¯ããããŒãžã£ãŒïŒãšã¢ããªã¹ããäžå¿ãšãªããåœç€Ÿã«ãšã£ãŠéèŠãªæ¥çã®äžã€ã§ããç©æµæ¥çã«é¢ããå匷äŒãéå¬ããŸããã ä»åã¯ããã®å
容ãšãããã§èŠããŠããåœç€Ÿã®é
åã«ã€ããŠã玹ä»ããããšæããŸãïŒ çæAIãé§äœ¿ãããAIé§åå匷äŒã ä»åã®å匷äŒã§æãç¹åŸŽçã ã£ãã®ããçæAIãæŽ»çšããæ°ããåŠç¿ã¹ã¿ã€ã«ãAIé§åå匷äŒãã§ãã ããã¯ãåå è
åèªããªãµãŒãã¯ãšã¹ãã§ã³ãèšå®ããããã«å¯ŸããŠçæAIã䜿ã£ãŠèª¿æ»ãè¡ããã¢ãŠãããããšæ·±æããè¡ãã¹ã¿ã€ã«ã§ãã çæAIã䜿ãããšã§ããããŸã§äœæéãããã£ãŠããæ
å ±åéãççž®ããããæ¬è³ªçãªè°è«ã«æéãå²ããããã«ããŸããã å匷äŒã®æ§å ãAIé§åå匷äŒãã®é²ãæ¹ ãªãµãŒãã¯ãšã¹ãã§ã³ãç«ãŠã (5å)ïŒåèªãç¥ãããããŒãã«ã€ããŠå
·äœçãªåããç«ãŠãŸãã AIã§èª¿æ»ãã (15å)ïŒçæAIã䜿ããèšå®ããåãã«ã€ããŠå¹ççã«æ
å ±ãåéããŸãã ã¢ãŠããããïŒè³ªåæ·±æã (2å)ïŒèª¿æ»çµæãç°¡æœã«ãŸãšããåå è
ãšå
±æãçåç¹ããããªãæ·±æãã«ã€ããŠè°è«ããŸãã ãã®ã»ãã·ã§ã³ã1.5ã2æéã§2ã3åç¹°ãè¿ãããšã§ãçæéã§å€ãã®åŠã³ãåŸãããšãã§ããŸããã åå è
ããã®å£° ããªãµãŒãã¯ãšã¹ãã§ã³ãå
ã«ç«ãŠãããšã§ãéäžããŠåŠç¿ã§ããïŒã ãã¢ãŠãããããšè³ªåæ·±æãã®æéã§ãåŠç¿å
容ãããæ·±ãå®çããã ãAI掻çšã®ç·ŽåºŠãäžããã广çãªããã³ãããªã©ã®ç¥èŠãå
±æãããã®ãè¯ãã£ãã ãä»ã®äººã®ãªãµãŒãã¯ãšã¹ãã§ã³èªäœã«åŠã³ããããèŠéãåºãã£ãã éšçœ²ãè¶
ããã¡ã³ããŒãšã®äº€æµ ä»åã®å匷äŒã«ã¯ãã¢ããªã¹ãã ãã§ãªããPdMãå
CSMïŒã«ã¹ã¿ããŒãµã¯ã»ã¹ãããŒãžã£ãŒïŒã§ç©æµæ¥çã«è©³ããã¡ã³ããŒãŸã§ãå¹
åºãè·çš®ã®ã¡ã³ããŒãåå ããŸããã äŸãã°ãå
CSMã®ã¡ã³ããŒããã¯ãç©æµçŸå Žã§ã®ãªã¢ã«ãªèª²é¡ãå
±æãããAIã«ãããªãµãŒãã ãã§ã¯åŸãããªãåŠã³ããããŸããã å€è§çãªèŠç¹ããã®è°è«ã¯ãç§ãã¡ããŒã¿ã¢ããªã¹ããããŒã¿ããå°ãåºããã€ã³ãµã€ããããããã¯ãæ¹åãããžãã¹æŠç¥ã«ç¹ããäžã§äžå¯æ¬ ã§ããç°ãªãå°éæ§ãæã€ã¡ã³ããŒãšæ°è»œã«æèŠäº€æã§ããç°å¢ã¯ãåœç€Ÿã§åã倧ããªé
åã®äžã€ã ãšæ¹ããŠæããŸããã ãªã¢ãŒãåå ãå¯èœãªæè»ãªåãæ¹ ä»åã®å匷äŒã§ã¯ãå€ãã®ã¡ã³ããŒããªãã£ã¹ã«éãŸããŸãããç§èªèº«ã¯å®¶åºã®äºæ
ã§ãªã¢ãŒãã§ã®åå ã§ãããããªãã£ã¹ã«ããã¡ã³ããŒãšå€ããããæŽ»çºãªè°è«ãã§ããŸããã åœç€Ÿã®ãããã¯ãçµç¹ã§ã¯ãåãæ¹ã®æè»æ§ãæ
ä¿ãã芳ç¹ããããªã¢ãŒãã¯ãŒã¯OKãšãªã£ãŠããŸããå Žæãæéã«ãšããããã«è³ªã®é«ãã€ã³ããããšã¢ãŠãããããã§ããã®ã¯ãéåžžã«ãããããç°å¢ã§ãã çµããã« ä»åã®ç©æµæ¥çå匷äŒã¯ãåœç€Ÿã®PdMãšã¢ããªã¹ããäžå¿ãšãªããçæAIãé§äœ¿ããç¬èªã®ã¹ã¿ã€ã«ã§å®æœããŸãããAIã§èª¿æ»ãé²ãããã®çµæãã¢ãŠããããã»æ·±æãããããšã§å¹ççã«ç©æµæ¥çãžã®çè§£ãæ·±ããããšãã§ããŸããã ãŸããéšçœ²ãè¶
ããŠæ§ã
ãªè·çš®ã®ã¡ã³ããŒãåå ããããšã§ãAIã ãã§ã¯åŸãããªãç©æµçŸå Žã§ã®ãªã¢ã«ãªèª²é¡ãåŸãããããå€è§çãªèŠç¹ããã®è°è«ãã§ãããããŸããã Weâre Hiring! ç§ãã¡ã¯ããšãã«åãã¡ã³ããŒãåéããŠããŸãïŒïŒ ã«ãžã¥ã¢ã«é¢è« ãè¡ã£ãŠããŸãã®ã§ãå°ãã§ãèå³ããããŸããããæ°è»œã«ãé£çµ¡ãã ããã
ããã«ã¡ã¯ãã¿ã€ããŒã§Platform EngineerãããŠããè¿è€ã§ãã ããŒãžãã¥ãŒäžã®ãšã©ãŒéç¥ã«ã€ã㊠GitHubã®ããŒãžãã¥ãŒã¯ãããŒã ãå¹ççãã€å®å
šã«ã³ãŒãããªãªãŒã¹ããããã«æ¬ ãããªãä»çµã¿ã§ããç¹ã«ãå€§èŠæš¡ãªããŒã ãé »ç¹ã«ã³ãŒãããããã€ãããããžã§ã¯ãã§ã¯ãããŒãžãã¥ãŒãCI/CDããã»ã¹ã®æ žãšãªããŸããããããããŒãžãã¥ãŒäžã§ãšã©ãŒãçºçããéããã®éç¥ãè¿
éã«åãåãããšã極ããŠéèŠã§ããéç¥ãé
ããããèŠèœãšãããããããšã次ã®ãããªåé¡ãçããå¯èœæ§ããããŸãã ãªãªãŒã¹ã®é
å»¶ ãšã©ãŒãçºçãããšãåé¡ã®ãã倿Žã¯å·®ãæ»ãããŸãã ãã®çµæãåŸç¶ã®PRã®ããŒã¹ã倿ŽããããããããŒãžãã¥ãŒäžã§ã®CIåŠçãåå®è¡ããå¿
èŠãçããŸãã ããã«ãããæ¬æ¥ã¹ã ãŒãºã«é²ãã¹ããªãªãŒã¹ãµã€ã¯ã«ãåæ»ããéçºã¹ããŒããèããäœäžããŸãã éçºè
äœéšïŒDXïŒã®äœäž ããŒãžãã¥ãŒã§ã®ãšã©ãŒéç¥ãé©åã«è¡ãããªããšãéçºè
ãæ··ä¹±ããããäžèŠãªææ»ãäœæ¥ã匷ãããããããŸããããã«ãããéçºè
ã®ã¢ãããŒã·ã§ã³ãçç£æ§ã®äœäžãæãããšã«ããªããŸãã 以äžã®çç±ãããGitHubã®ããŒãžãã¥ãŒã§ãšã©ãŒãçºçããéã®éç¥ã確å®ã«è¡ãããšã¯ãéçºå¹çãä¿ã¡ãè¿
éãªåé¡è§£æ±ºãä¿ãããã«äžå¯æ¬ ã§ããéç¥ã®ä»çµã¿ãæŽåããããŒã å
šäœãå³åº§ã«åé¡ã«å¯ŸåŠã§ããç°å¢ãæŽããããšãæ±ããããŸãã ãšã©ãŒéç¥ã®èª²é¡ åã«ã¯ãŒã¯ãããŒäžã«ãšã©ãŒéç¥ã®ãžã§ããå
¥ããã ãã§ã¯ãå
è¡ããŠããŒãžãã¥ãŒã«ç©ãŸããPRã«CIãšã©ãŒãçºçããå
容ãå«ãŸããŠããå ŽåãåŸç¶ã®äººã«ãäžèŠãªãšã©ãŒéç¥ãå±ããŠããŸããŸãããããåé¿ããããã«ãGitHubã®concurrencyæ©èœã掻çšããŠCIãé©åã«ãã£ã³ã»ã«ããä»çµã¿ãå°å
¥ããŸããã sequenceDiagram autonumber participant DevA as éçºè
A participant DevB as éçºè
B participant Queue as ããŒãžãã¥ãŒ participant CI as CI (GitHub Actions) participant Master as master ãã©ã³ã DevA->>Queue: PR A ããã¥ãŒã«è¿œå DevB->>Queue: PR B ããã¥ãŒã«è¿œå par Queue->>CI: PR A + master ã®ãã¹ã Queue->>CI: PR B + PR A + master ã®ãã¹ã end CI--x Queue: PR A + master ã§ãã¹ããšã©ãŒ Queue->>DevA: PR A ããã¹ããšã©ãŒã«ãªããŸãã Queue->>DevB: PR B ããã¹ããšã©ãŒã«ãªããŸãã Queue->>Queue: PR B + master ã®åãšã³ãã¥ãŒ Queue->>CI: PR B + master ã®ãã¹ã CI-->>Queue: PR B ã®ãã¹ãåæ Œ Queue->>Master: PR B ã master ã«ããŒãž PR AãšPR BãããŒãžãã¥ãŒã«ç©ãŸããç¶æ
ã§ãå
è¡ããPR Aã§ãšã©ãŒãçºçãããšãPR Bã¯èªåçã«PR Aã®å
容ãé€å€ããç¶æ
ã§å床ããŒãžãã¥ãŒã«å
¥ããããŸãã ãã®éãããŒãžãã¥ãŒã®å®è¡æã«äœæããããã©ã³ãåã¯éœåºŠå€åããŸãããã£ãŠåçŽã«ãã©ã³ãåãããŒãšãã以äžã®èšå®ã§ã¯ãæåŸ
éãã«åäœããŸããã concurrency : group : ${{ github.ref_name }} cancel-in-progress : true ããã§ãããŒãžãã¥ãŒäžã§äœæããããã©ã³ãåã®èŠåæ§ãå©çšããŸãããã©ã³ãåã«ã¯PRçªå·ãå«ãŸããŠãããããã¯ãŒã¯ãããŒå
ã§ãã©ã³ãåããPRçªå·ãæœåºãããžã§ãã远å ããŸããã æçµçã«æ¡çšããã¯ãŒã¯ãããŒã¯ä»¥äžã®éãã§ããæå€ãšç¥ãããŠããŸããããconcurrencyããŒã¯ãŒãã¯ãžã§ãã¬ãã«ã§ãæå®å¯èœã§ãã name : ci on : push : branches : - '**' - '!master' - '!gh-readonly-queue/**' tags-ignore : - '*' merge_group : permissions : id-token : write contents : read pull-requests : write jobs : concurrency_key : runs-on : ubuntu-latest outputs : key : ${{ steps.extract_pr.outputs.key }} steps : - id : extract_pr name : Extract PR number from branch name shell : bash run : | if [[ $ {{ github.event_name }} == 'merge_group' ]] ; then full_ref="${{ github.ref_name }} " pr_number=$(basename " $full_ref" | cut -d- -f2) echo "key=$pr_number" >> "$GITHUB_OUTPUT" else echo "key=${{ github.ref }}" >> "$GITHUB_OUTPUT" fi ci : needs : concurrency_key concurrency : group : ${{ github.workflow }}-${{ needs.concurrency_key.outputs.key }} cancel-in-progress : true uses : ./.github/workflows/_ci.yml with : skip : ${{ github.event_name != 'merge_group' }} secrets : inherit merge_group_notify : needs : ci if : ${{ failure() && github.event_name == 'merge_group' }} uses : ./.github/workflows/_merge_group_notify.yml with : role_to_assume : arn:aws:iam::012345678901:role/example notification_type : failure secrets : inherit äžèšã®ä»çµã¿ãå°å
¥ããããšã§ãå
è¡ããPRã§ãã¹ããšã©ãŒãçºçããŠãããã®åœ±é¿ã§åŸç¶PRã«å¯ŸããŠäžèŠãªãšã©ãŒéç¥ãéä¿¡ãããããšãé²ããŸãã sequenceDiagram autonumber participant DevA as éçºè
A participant DevB as éçºè
B participant Queue as ããŒãžãã¥ãŒ participant CI as CI (GitHub Actions) participant Master as master ãã©ã³ã DevA->>Queue: PR A ããã¥ãŒã«è¿œå DevB->>Queue: PR B ããã¥ãŒã«è¿œå par Queue->>CI: PR A + master ã®ãã¹ã Queue->>CI: PR B + PR A + master ã®ãã¹ã end CI--x Queue: PR A + master ã§ãã¹ããšã©ãŒ Queue->>DevA: PR A ããã¹ããšã©ãŒã«ãªããŸãã Queue->>Queue: PR B + master ã®åãšã³ãã¥ãŒ alt 倱æéç¥ããã£ã³ã»ã« Queue -x DevB: PR B ããã¹ããšã©ãŒã«ãªããŸãã (ãã£ã³ã»ã«) end Queue->>CI: PR B + master ã®ãã¹ã CI-->>Queue: PR B ã®ãã¹ãåæ Œ Queue->>Master: PR B ã master ã«ããŒãž ãã ããPR AãšPR Bãã»ãŒåæã«ããŒãžãã¥ãŒãžæå
¥ãããå Žåãªã©ã極ããŠçšãªã¿ã€ãã³ã°ã«ãã£ãŠã¯ããã£ã³ã»ã«åŠçãéã«åããåŸç¶ã®PRã«å¯ŸããŠäžèŠãªãšã©ãŒéç¥ãéä¿¡ãããŠããŸãã±ãŒã¹ãæ®ã£ãŠããŸããŸãã ãããããšããžã±ãŒã¹ãŸã§å®å
šã«æå¶ããããšãããšãã¯ãŒã¯ãããŒå
šäœã®å®è£
ã倧å¹
ã«è€éåããéçšã»ä¿å®ã³ã¹ããå¢å€§ããŠããŸãæžå¿µããããŸãã ãã®ãããä»åã¯ãäžèŠãªéç¥ã®çºçãçŸå®çãªç¯å²ã§æå°åãã€ã€ãå®è£
ã®ã·ã³ãã«ããåªå
ããããšããæ¹éãéžæããŸããã ãŸãšã æ¬ä»çµã¿ã«ãã£ãŠãããŒãžãã¥ãŒéçšæã®äžèŠãªãšã©ãŒéç¥ã倧å¹
ã«åæžãã€ã€ãããŒã å
šäœã®éçºå¹çãšå®å¿æãäž¡ç«ã§ããããã«ãªããŸããã ä»åŸããããè¯ãéçºäœéšãç®æããŠãçŸå Žã®å®æ
ããã£ãŒãããã¯ãåãå
¥ããªãããç¶ç¶çãªæ¹åãé²ããŠãããŸãã
ããã«ã¡ã¯ãã¿ã€ããŒã§ããã¯ãšã³ãã®ããã¯ãªãŒããããŠããæ°è°· ( @euglena1215 ) ã§ãã GitHubããŒãžãã¥ãŒTIPSã·ãªãŒãºãååãŸã§ã«ãããŒãžã¡ãœããã®å¶çŽãCIã®é«éåãšãã£ãTIPSãå
±æããŠããŸãããä»åã¯ãããŒãžãã¥ãŒã®ããã³ã·ã£ã«ãæå€§éã«åŒãåºãããã®ãã©ã¡ãŒã¿ãã¥ãŒãã³ã°ãšããã®ããã«äžå¯æ¬ ãªãã¥ãŒã®ç¶æ
ã®å¯èŠåã«ã€ããŠè§£èª¬ããŸãã ãããã€å¹çãšå®å®æ§ã®ãã¬ãŒããªã ããŒãžãã¥ãŒã«ã¯ããã®æåãã³ã³ãããŒã«ããããã®ããã€ãã®ãã©ã¡ãŒã¿ãååšããŸãã Build concurrency ïŒããŒãžãã¥ãŒã®CIãåæã«å®è¡ããäžŠåæ°ã Minimum/Maximum pull requests to merge ïŒäžåºŠã®ãããã€ïŒããŒãžïŒã«å«ããPRã®æå°æ°ãšæå€§æ°ã ãããã®ãã©ã¡ãŒã¿ã¯ãå¹çæ§ãšå®å®æ§ãšãããäºã€ã®çžåããèŠçŽ ã調æŽããããã«äœ¿çšããŸãã å¹çæ§ïŒãããã€ã®éãïŒ ïŒéçºè
ã®åŸ
ã¡æéãççž®ãããããPRãè¿
éã«ããŒãžããããšãæ±ããããŸãã å®å®æ§ïŒå€æŽã®åé¢ïŒ ïŒåé¡çºçæã®åœ±é¿ç¯å²ãéå®ããåå ç¹å®ã容æã«ãããããäžåºŠã«ããŒãžãã倿Žã¯å°ãªãããããšãæãŸããã§ãã äŸãã°ã Maximum pull requests to merge ã10ã«èšå®ãããšãããã€ã®ã¹ã«ãŒãããã¯åäžããŸãããé害çºçæã«ã¯10åã®PRã®äžããåå ãç¹å®ããããšãå°é£ã«ãªããŸããéã«1ã«èšå®ãããšãåå ç¹å®ã¯å®¹æã«ãªããŸãããPRã倿°åŸ
æ©ããŠããå Žåã«åŸ
ã¡æéãå¢å ããŸãã ãã¥ãŒã®é·ããèšæž¬ããå¿
èŠæ§ ãã®é¢ä¿ãèæ
®ããŠãã©ã¡ãŒã¿ã調æŽããã«ã¯ããçŸåšã®ããŒãžãã¥ãŒã§åŸ
æ©ããŠããPRãã©ã®çšåºŠãããããšããããŒã¿ãå¿
èŠã§ãããã¥ãŒã«åŸ
æ©ããŠããPRããªããã°èšå®ã倿Žããå¿
èŠã¯ãããŸããããåžžã«å€æ°ã®PRãåŸ
æ©ããŠããå Žåã¯ãCIã®äžŠåæ°ãå¢ãããªã©ã®å¯Ÿçãæ€èšããå¿
èŠããããŸãã ãããããã¥ãŒã®é·ããåŸ
ã¡æéãšãã£ãæ
å ±ã¯ãGitHubã®æšæºæ©èœã§ã¯æäŸãããŠããŸããããã®ããããã¥ãŒã®é·ããèšæž¬ããå¯èŠåããä»çµã¿ãæ§ç¯ããŸããã ãã¥ãŒã®é·ããèšæž¬ããæ¹æ³ ç§ãã¡ã®ããŒã ã§ã¯ãGitHub Actionsãå©çšããŠãã¥ãŒã®é·ããèšæž¬ããDatadogãžéä¿¡ããŠããŸãã ãã®å®è£
ã§å©çšããŠããæ¹æ³ã玹ä»ããŸãã gh ã³ãã³ãã«ãããã¥ãŒé·ã®ååŸ GitHubããŒãžãã¥ãŒã®çŸåšã®é·ãã¯ãGitHubã®GraphQL APIãéããŠååŸã§ããŸãã gh ã³ãã³ãã䜿ãã°ãããã1è¡ã®ã³ãã³ãã§ç°¡åã«è¡ããŸãã 䜿çšããã³ãã³ãã¯ä»¥äžã®éãã§ãã QUEUE_COUNT=$(gh api graphql -f query=' query { repository(owner: "THIS_IS_ORG_NAME", name: "THIS_IS_REPO_NAME") { mergeQueue(branch: "DEFAULT_BRANCH_NAME") { totalCount: entries { totalCount } } } } ' --jq '.data.repository.mergeQueue.totalCount.totalCount') ãã®ã³ãã³ãã¯ãGraphQLã¯ãšãªã§å¿
èŠãªããŒã¿ ( totalCount ) ãæå®ãã gh ã³ãã³ãã® --jq ãã©ã°ã§ã¬ã¹ãã³ã¹ããå€ãçŽæ¥æœåºããŠããŸãã ãã®ã³ãã³ããã on.merge_group ïŒPRãããŒãžãã¥ãŒã«è¿œå ãããæïŒãããªã¬ãŒã«ããGitHub Actionsã§å®è¡ããŸãããã®çµæãã¢ãã¿ãªã³ã°ããŒã«ïŒç§ãã¡ã®å Žåã¯DatadogïŒã«éä¿¡ããããšã§ããã¥ãŒã®é·ããæç³»åã°ã©ããšããŠå¯èŠåã§ããŸãã ããŒãžãã¥ãŒã«å
¥ã£ãŠãã Pull Request ã®æ°ã®æç³»åã°ã©ã ãã®ããã·ã¥ããŒãã«ãã£ãŠãã©ã®æé垯ã«ããŒãžãéäžããã®ãããçŸåšã®ãã©ã¡ãŒã¿èšå®ã§ãã¥ãŒãå¹ççã«åŠçãããŠãããããšãã£ãç¶æ³ãææ¡ã§ããããã«ãªããŸããã ããŒã¿ã«åºã¥ããã©ã¡ãŒã¿èª¿æŽã®å®é ãã®ããã·ã¥ããŒãã2é±ééçšããçµæãç§ãã¡ã®ããŒã ã§ã¯åæã«ããŒãžãã¥ãŒã«ç©ãŸããŠããPRã¯æå€§ã§ã 3ä»¶ ã§ããããšãåãããŸããã ãã®å®çžŸããŒã¿ã«åºã¥ããå®å®æ§ãããã«é«ããããããã©ã¡ãŒã¿ã以äžã®ããã«èª¿æŽããŸããã Maximum pull requests to merge : 倿Žå 5 â 倿ŽåŸ 3 Build concurrency : 倿Žå 10 â 倿ŽåŸ 6 äžåºŠã«ããŒãžããPRæ°ãå®çžŸå€ïŒ3ä»¶ïŒã«åããããã«ãã®äžŠåæ°ïŒ Build concurrency ïŒããã®2åã«èšå®ããŸãããããã«ããããªãœãŒã¹ãå¹ççã«äœ¿ãã€ã€ãããå®å®ããéçšãç®æããŸããã ãŸãšã ããŒãžãã¥ãŒã¯å°å
¥ããã ãã§ãäžå®ã®å¹æããããŸããããã®å¹æãé«ããã«ã¯ãéçºã®èŠæš¡ãç¶æ³ã«å¿ããŠãã©ã¡ãŒã¿ãç¶ç¶çã«èª¿æŽããããšãéèŠã§ãããã®èª¿æŽã¯ãåãæèŠã§ã¯ãªããä»å玹ä»ãããããªå¯èŠåãããããŒã¿ã«åºã¥ããŠè¡ãããšãæšå¥šãããŸãã ä»åã¯ãã¥ãŒã®å¯èŠåãšãã©ã¡ãŒã¿èª¿æŽã«ã€ããŠè§£èª¬ããŸãããæ¬¡å以éããããŒãžãã¥ãŒããã广çã«æŽ»çšããããã®æ
å ±ããå±ãããŸãã
ããã«ã¡ã¯ãã¿ã€ããŒã§ããã¯ãšã³ãã®ããã¯ãªãŒããããŠããæ°è°· ( @euglena1215 ) ã§ãã ãã®ã·ãªãŒãºã§ã¯ ãã¢ããªã¹Railsã«ããŒãžãã¥ãŒãå°å
¥ããŠãããã€ãããŒãå®å®ãããã ã®ç¶ç·šãšããŠãå°å
¥æã®TIPSã玹ä»ããŠããŸããåå㯠ãGitHubããŒãžãã¥ãŒTIPSïŒCIã®å®è¡ãæé©åããé害察å¿ã10åé«éåããã ã«ã€ããŠè§£èª¬ããŸããã æ¬èšäºã§ã¯ãGitHubã®ããŒãžãã¥ãŒå°å
¥åŸã«çºçããããã©ã³ãä¿è·æ©èœïŒRulesetïŒã®bypass listæ©èœãšã®éäºææ§ã«ã€ããŠè§£èª¬ããŸãã ãããŸã§ã®ã³ãŒãããªãŒãºéçš ã¿ã€ããŒã§ã¯ãäž»ã«å¹Žæ«å¹Žå§ãGWãšãã£ãéçºè
ãå°ãªãæéã«ã³ãŒãããªãŒãºæéãèšããŠããŸãããã®éçšãå®çŸãããããæã
ã¯GitHubã®Rulesetsãšããã®bypass listæ©èœã掻çšããŠããŸããã ããã¯éåžžã«äŸ¿å©ãªæ©èœã§ã以äžã®ãããªéçšãå¯èœã«ããŠããŸãã éåžžæïŒ éçºè
ã¯èªç±ã«ããŒãžã§ããã ã³ãŒãããªãŒãºæéäžïŒ Rulesetãæå¹åããååããŒãžãçŠæ¢ããã ç·æ¥æïŒ ãã ããbypass listã«ç»é²ãããéçºè
ã®ã¿ããã§ãã¯ããã¯ã¹äžã€ã§ãã®ã«ãŒã«ãåé¿ããç·æ¥ã®ä¿®æ£ãããŒãžã§ããã ãã®ä»çµã¿ã§ãã³ãŒãããªãŒãºæéäžã®å®å
šæ§ãšãç·æ¥æã®æè»ãªå¯Ÿå¿ãäž¡ç«ããŠããŸããã ããŒãžãã¥ãŒå°å
¥åŸã«çºèŠããåé¡ ããŒãžãã¥ãŒãå°å
¥ããé 調ã«éçšãå§ãŸã£ããã®ããã«æããããæ¥ãã³ãŒãããªãŒãºæéçŽåã«åé¡ãçºèŠããŸããã bypass listã«ç»é²ãããŠããã«ãããããããã«ãŒã«ãåé¿ããŠããŒãžããããšãã§ããªããªã£ãŠããã®ã§ãã ã³ãŒãããªãŒãºæéäžã«ã³ãŒãã倿Žããããšã¯åºæ¬ãããŸããããäŸãã°é害察å¿ã§ç·æ¥ã®ä¿®æ£ãå¿
èŠã«ãªã£ãéã«ããããŸã§ã®ããã«ç¹å®ã®æ
åœè
ãå³åº§ã«ããŒãžã§ããªããªãããšãã圱é¿ãèããããŸããããã¯ãæè»ãªå¯Ÿå¿ãæåŸ
ããŠããéçºè
ã«ãšã£ãŠã¯æå³ããªã仿§å€æŽã§ããã åå ãšå¯Ÿå¿ 仿§äžã®éäºææ§ èª¿æ»ã®çµæãããŒãžãã¥ãŒãšRulesetã®bypassæ©èœã¯äœµçšã§ããªãGitHubã®ä»æ§ã§ããããšãåãããŸããããã®ä»¶ã¯GitHubã®å
¬åŒDiscussionã§ãå ±åãããŠããŸãã ref. https://github.com/orgs/community/discussions/45208 ãã®ä»æ§ã«å¯ŸããçŽæ¥çãªè§£æ±ºçã¯èŠã€ãããªãã£ããããbypass listã䜿çšããªãéçšãžã®å€æŽãå¿
èŠã«ãªããŸããã æ°ããéçšãžã®å€æŽ ä»£æ¿æ¡ãšããŠã以äžã®éçšãæ§ç¯ããŸããã ã³ãŒãããªãŒãºæéäžã åžžã«å€±æããCIãžã§ã ãã¯ãŒã¯ãããŒã«è¿œå ããã ãã ãããã®CIãžã§ãã¯ãã©ã³ãä¿è·ã«ãŒã«ã® å¿
é ãã§ãã¯ã«ã¯èšå®ããªã ã ããã«ãããéçºè
ã¯CIã®èŠå衚瀺ããã³ãŒãããªãŒãºæéäžã§ããããšãèªèã§ããæå³ããªãããŒãžã®ææ¢ã«ã€ãªãããŸãã ãŸãšã GitHubã®ããŒãžãã¥ãŒã¯æçšãªæ©èœã§ãããRulesetã®ãããªæ¢åã®æ©èœãšçµã¿åãããéã«ã¯ãæå³ããªãåäœãããªããæ³šæãå¿
èŠã§ããïŒãã®èšäºã¯2025幎7ææç¹ã®GitHubã®ä»æ§ã«åºã¥ããŠããŸããïŒ ç§ãã¡ã®ã±ãŒã¹ã§ã¯ãå°å
¥åŸã«ãã®åé¡ã倿ããã³ãŒãããªãŒãºçŽåã®å¯Ÿå¿ãå¿
èŠãšãªããŸããã ããŒãžãã¥ãŒã®å°å
¥ãæ€èšããéã¯ãéåžžã®ãããã€ãããŒã ãã§ãªããã³ãŒãããªãŒãºã®ãããªç¹å®ã®éçšæ¡ä»¶äžã§ãæå³ããéãã«åäœããããäºåã«æ€èšŒããããšãæšå¥šããŸãã ç¹ã«ããèªèº«ã®ããŒã ã以äžã®ç¹ã«åœãŠã¯ãŸãããäžåºŠç¢ºèªããŠã¿ãŠãã ããã ãã©ã³ãä¿è·ïŒRulesetsïŒã§ãç¹å®ã®æ
åœè
ãããŒã ã«ããŒãžã®äŸå€ïŒBypassïŒãèš±å¯ããŠãããïŒ ãã®äŸå€çãªããŒãžã¯ãç·æ¥æã®å¯Ÿå¿ãªã©ãä»åŸãå¿
èŠãªéçšãïŒ ç§ãã¡ã®ã±ãŒã¹ã§ã¯ãå°å
¥åŸã«ãã®åé¡ã倿ããã³ãŒãããªãŒãºçŽåã®å¯Ÿå¿ãå¿
èŠãšãªããŸããã ããŠã次åã¯ããŒãžãã¥ãŒã®ããã³ã·ã£ã«ãæå€§éã«åŒãåºãããã®ãè©°ãŸãå
·åã®å¯èŠåããšããã©ã¡ãŒã¿ãã¥ãŒãã³ã°ã«ã€ããŠã玹ä»ããŸãã
ããã«ã¡ã¯ãã¿ã€ããŒã§ããã¯ãšã³ãã®ããã¯ãªãŒããããŠããæ°è°· ( @euglena1215 ) ã§ãã ãã®ã·ãªãŒãºã§ã¯ ãã¢ããªã¹Railsã«ããŒãžãã¥ãŒãå°å
¥ããŠãããã€ãããŒãå®å®ãããã ã®ç¶ç·šãšããŠãå°å
¥æã«å·¥å€«ããç¹ãçŽé¢ãã課é¡ãTIPS圢åŒã§ç޹ä»ããŠããŸããååã®èšäºã§ã¯ ãGitHubããŒãžãã¥ãŒã®å¶çŽïŒããŒãžã¡ãœããã1ã€ã«åŒ·å¶ãããã ã«ã€ããŠè§£èª¬ããŸããã ä»åã¯ãããŒãžãã¥ãŒã®ç¹æ§ã掻ãã㊠CIã®å®è¡æ¹æ³ãæé©åããç¹ã«ç·æ¥æã®ãããã€ãé«éåãã 話ã玹ä»ããããšæããŸãã Pull Requestã«ãããCIã¯æ¬åœã«å¿
é ãïŒ ããŒãžãã¥ãŒã®æãåºæ¬çãªæ©èœã¯ããšã³ãã¥ãŒãããPull RequestïŒPRïŒã åžžã«ææ°ã® master ãã©ã³ãã«åã蟌ãã ç¶æ
ã§CIãå®è¡ãã ããšã§ããããã«ããmaster ãã©ã³ãã®CIæåãä¿èšŒããããããç§ãã¡ã¯ãŸããmaster ãã©ã³ããžã®ããŒãžåŸã®CIããäžèŠãšå€æããŸããã ããã«ãç§ãã¡ã¯ããäžæ©èžã¿èŸŒãã§èããŸããã ããããããPRäžã§ã®CIå®è¡ãå¿
é ã§ã¯ãªããªã£ãã®ã§ã¯ïŒã ä»®ã«PRåäœã§CIã倱æãããšããŠãããã®å€æŽã¯ããŒãžãã¥ãŒã®CIã§æ€ç¥ããããã¥ãŒããèªåçã«åãé€ãããŸããmaster ãã©ã³ããå£ããããšã¯ãªããããPRäœææã®CIã¯ãããŸã§éçºè
ã®ããã®ä»»æå®è¡ãšããããŒãžããããã¯ãããå¿
é ãã§ãã¯ãããå€ããã®ã§ã¯ãªããããšããçºæ³ã§ãã CIããå¿
é ããšãä»»æãã«åããæ¹æ³ ãã®ãPRã§ã®CIãå¿
é ãšããªããéçšãå®çŸããã«ã¯ãäžã€æè¡çãªå£ããããŸããã GitHubã®ä»æ§äžã®å£ GitHubã®ä»æ§ã§ã¯ãPRã®å¿
é ãã§ãã¯ïŒRequired CheckïŒãšããŒãžãã¥ãŒã®å¿
é ãã§ãã¯ãåããããšãã§ããŸãããããŒãžãã¥ãŒã§ããŒãžåã«ãã§ãã¯ãããCIã¯PRã§ãåžžã«å®è¡ããå¿
èŠããããŸãã ãã¡ãã¯ããŒãžãã¥ãŒãžã®ãã£ãŒãããã¯ãšããŠæãã£ãŠããŸããã2025幎7ææç¹ã§ã¯å¯Ÿå¿ãããŠããŸããã§ããã ref. https://github.com/orgs/community/discussions/46757#discussioncomment-4912738 PRã§ã®å¿
é ãã§ãã¯ãå€ãããã«ãã§ãã¯ãå€ããšãããŒãžãã¥ãŒã§ãå¿
é ã§ã¯ãªããªã£ãŠããŸããCIãå®è¡ãããªããŸãŸããŒãžãããåé¡ãçããŸãã ã¯ãŒã¯ãããŒåå²ã«ãã解決ç ããã§æã
ã¯ãCIã®ã³ã¢ããžãã¯ãåå©çšå¯èœãªã¯ãŒã¯ãããŒïŒ _ci.yml ïŒãšããŠåãåºãããããåŒã³åºã2ã€ã®ã¯ãŒã¯ãããŒã«åå²ããããšã§ããã®åé¡ã解決ããŸããã 1. ci.ymlïŒããŒãžãã¥ãŒã§ã®å¿
é CIïŒ ããããã©ã³ãä¿è·ã«ãŒã«ã®å¿
é ãã§ãã¯ã«èšå®ããŸãããã®ã¯ãŒã¯ãããŒã¯ push ã€ãã³ããš merge_group ã€ãã³ãã®äž¡æ¹ã§ããªã¬ãŒãããŸããã github.event_name ãå€å®ãã merge_group ã€ãã³ãã§ãªãå Žå㯠skip: true ãæž¡ãããšã§ãCIã®å®è¡ãã¹ãããããŸãã ããã«ããããå¿
é ãã§ãã¯ãšããŠã¯ååšããããPRäžã§ã¯å³åº§ã«å®äºïŒã¹ãããïŒããããŒãžãã¥ãŒã§ã®ã¿å®è¡ããããç¶æ
ãäœãåºããŸãã # .github/workflows/ci.yml name: ci on: push: branches: - '**' - '!master' merge_group: jobs: ci: # ... uses: ./.github/workflows/_ci.yml with: # merge_group ã€ãã³ãã§ãªãå Žå㯠true ãæž¡ããã¯ãŒã¯ãããŒãã¹ãããããã skip: ${{ github.event_name != 'merge_group' }} secrets: inherit 2. ci_branch.ymlïŒPRã§ã®ä»»æCIïŒ ãã¡ãã¯å¿
é ãã§ãã¯ã«ã¯èšå®ããŸããã push ã€ãã³ãã§ã®ã¿ããªã¬ãŒãããåžžã« skip: false ãæž¡ããŠCIãå®è¡ããŸããéçºè
ã¯ãã®CIã®çµæãåèã«ããŸãããå®äºãåŸ
ããã«ãšã³ãã¥ãŒã§ããŸãã # .github/workflows/ci_branch.yml name: ci branch on: push: branches: - '**' - '!master' jobs: ci: uses: ./.github/workflows/_ci.yml with: # ãã¡ãã¯åžžã« false ãæž¡ããCIãå®è¡ããã skip: false secrets: inherit ãã®æ§æã«ããããPRäžã§ã¯CIå®è¡ã¯å¿
é ã§ã¯ãªãããããŒãžãã¥ãŒã§ã¯CIå®è¡ãå¿
é ããšããç¶æ
ãå®çŸããŸããã å®è¡çµæã確èªãã æåã確èªããããã«ãå®è¡çµæã確èªããŠã¿ãŸãããã PRäžã§ã¯ãci.yml ãš ci_branch.yml ãå®è¡ãããŸããå¿
é ã§ããci.ymlã¯ã»ãšãã©ã®ã¹ããããskipãããŠããã®ã§å
šäœãæ°ç§ã§ç¢ºèªã§ããŸãã察ããŠãci_branch.ymlã§ã¯æ°åããã£ãŠããŸãããå¿
é ã§ã¯ãªãã®ã§å®è¡éäžã§ãããŒãžãã¥ãŒã«ãšã³ãã¥ãŒã§ããŸãã PRäžã§ã®ci.ymlã®å®è¡çµæ PRäžã§ã®ci_branch.ymlã®å®è¡çµæ 察ããŠãããŒãžãã¥ãŒäžã§ã¯ci.ymlã®ã¿ãå®è¡ãããŸããããŒãžãã¥ãŒã§å®è¡ããå Žåãci.ymlã¯skipãããã«å®è¡ãããã®ã§ãCIã倱æããŠããã®ã«masterãã©ã³ãã«ããŒãžãããŠããŸããšãã£ããªã¹ã¯ã¯ãããŸããã ããŒãžãã¥ãŒäžã§ã®ci.ymlã®å®è¡çµæ é害察å¿ã®ãããã€ã10åççž® ãã®æé©åã¯ãç¹ã«ç·æ¥ã®ä¿®æ£ïŒRevertãªã©ïŒããããã€ããéã«å€§ããªå¹æãçºæ®ããŸãã 倿Žå featureãã©ã³ãã®CIïŒ10åïŒ + masterããŒãžåŸã®CIïŒ10åïŒ + ãããã€ïŒ5åïŒ = åèš25å 倿ŽåŸ ããŒãžãã¥ãŒã®CIïŒ10åïŒ + ãããã€ïŒ5åïŒ = åèš15å çµæãšããŠãé害çºçãã埩æ§ãŸã§ã®æéã 10åççž® ã§ããŸããã ãŸãšã ããŒãžãã¥ãŒã¯master ãã©ã³ããå®å®ãããããã®æ©èœã§ããããã®ç¹æ§ãããŸãå©çšããCIã®å®è¡æ¹æ³ã工倫ããããšã§ããããã€ã®å®å®åãšãããã€ã®é«éåãäž¡ç«ãããããšãã§ããŸããããŸãã«äžç³äºé³¥ã®æ¹åã ã£ããšæããŠããŸãã æ¬¡åã¯ãããŒãžãã¥ãŒå°å
¥æã«çºèŠãããGitHubã®ãã©ã³ãä¿è·æ©èœïŒRulesetïŒãšã®æãã¬éäºææ§ã«ã€ããŠç޹ä»ããŸãã
ããã«ã¡ã¯ãã¿ã€ããŒã§ããã¯ãšã³ãã®ããã¯ãªãŒããããŠããæ°è°· ( @euglena1215 ) ã§ãã å
æ¥å
¬éããèšäº ãã¢ããªã¹Railsã«ããŒãžãã¥ãŒãå°å
¥ããŠãããã€ãããŒãå®å®ãããã ã§ã¯ãå€ãã®éçºè
ãé¢ããã¢ããªã¹ãªããžããªã®ãããã€ãããŒãå®å®ãããããã«ãGitHubã®ããŒãžãã¥ãŒãå°å
¥ããäºäŸã玹ä»ããŸããã ä»åããã¯ãå°å
¥ã«ããã£ãŠçŽé¢ãã課é¡ããæã
ã®éçºããã»ã¹ã«ããŸãçµã¿èŸŒãããã«å·¥å€«ããç¹ãªã©ããTIPSãšããŠäœåãã«åããŠç޹ä»ããŠãããŸãã ã·ãªãŒãºæåã®ãããã¯ã¯ãããŒãžãã¥ãŒãå°å
¥ãããšçŽé¢ããããŒãžã¡ãœããã®å¶çŽã«ã€ããŠã§ãã éçºè
ã®èªç±ããªããªãïŒããŒãžãããŒã®å€å ããŒãžãã¥ãŒãå°å
¥ãããšãéçºè
ã®ããŒãžäœæ¥ã®ãããŒã倧ããå€ãããŸããæã倧ããªå€åã¯ãéçºè
ãçŽæ¥ãMergeããã¿ã³ãæŒãã®ã§ã¯ãªãããMerge when readyããã¿ã³ã§ãšã³ãã¥ãŒïŒããŒãžãã¥ãŒã«è¿œå ïŒããç¹ã§ãã ãšã³ãã¥ãŒãããPull Requestã®ããŒãžäœæ¥ãã®ãã®ã¯ãéçºè
ã§ã¯ãªãbotãå
éšçã«èªåçã«è¡ãããã«ãªããŸãã ããŒãžã¡ãœãããæå®ã§ããªã仿§ 2025幎7ææç¹ã§ã®GitHubããŒãžãã¥ãŒã®ä»æ§ã§ã¯ãåéçºè
ããšã³ãã¥ãŒåŸã®ããŒãžã¡ãœãããéžã¶ããšã¯ã§ããŸããã代ããã«ããªããžããªã®èšå®ãšããŠãã©ã®ããŒãžã¡ãœããïŒMerge commit, Squash and merge, Rebase and mergeïŒã䜿ãããæå®ããŠããå¿
èŠããããŸãã çµæãšããŠã ãããŸã§éçºè
ãå人ã®å¥œã¿ã§ããŒãžã¡ãœãããéžãã§ããéçšã¯ã§ããªããªããå
šå¡ãåãã¡ãœããã䜿ãããšã匷å¶ãããŸãã æã
ãè¡ã£ãéžæãšãã®ããã»ã¹ ããŒãžãã¥ãŒãå°å
¥ããã«ããããæã
㯠Merge commit ãš Squash and merge ã®ã©ã¡ãã«çµ±äžãããããšããéžæãè¿«ãããŸããã åéžæè¢ã®èª²é¡ã®æ¯èŒ ããããã®èšå®ãããã©ã«ãã«ããå Žåã«ãéçºè
ã«ã©ã®ãããªåœ±é¿ãåºãããæ¯èŒæ€èšããŸããã Squash and merge ãéžæããå Žåã®èª²é¡: æå³çã«è€æ°ã®ã³ãããã«åããŠãããã«ãªã¯ãšã¹ãããããŒãžæã«åŒ·å¶çã«1ã€ã«ãŸãšããããŠããŸããŸããããã«ãGitHubã®UIäžã§èªåçæãããã³ãããã¡ãã»ãŒãžã¯ãåã
ã®ã³ãããã¡ãã»ãŒãžãåçŽã«é£çµãããã®ã«ãªããããŒãžæã«ã¡ãã»ãŒãžããããã«æŽåœ¢ããããšãã§ããŸããã Merge commit ãéžæããå Žåã®èª²é¡: ãããŸã§ feature branch äžã§äœæ¥éäžã®ã³ãããã现ããç©ã¿ãããŒãžæã«UIäžã§1ã€ã«ãŸãšããŠããéçºè
ã«ãšã£ãŠã¯ãæŽåœ¢åã®ã³ãããããã®ãŸãŸ master ãã©ã³ãã®å±¥æŽã«æ®ã£ãŠããŸãããšã«ãªããŸãã æã
ã®æ±ºå®ïŒãMerge commitãã®æ¡çšãšéçšã«ããã«ã㌠䞡è
ãæ¯èŒããçµæãæã
ã¯ãªããžããªã®ããã©ã«ãèšå®ãšã㊠Merge commit ã®æ¡çšã決å®ããŸããã æ±ºãæã¯ã Squash and merge ãéžæããéã®ãã³ãããã¡ãã»ãŒãžãé©åã«æŽåœ¢ã§ããªãããšããå¶çŽã®åœ±é¿ã倧ãããšå€æããããã§ãã ãã®äžã§ã Merge commit ãéžæããå Žåã®èª²é¡ïŒæŽåœ¢åã®ã³ããããæ®ã£ãŠããŸãïŒã«ã€ããŠã¯ãéçšã§ã«ããŒããæ¹éãšããŸããã å
·äœçã«ã¯ãã³ãããã1ã€ã«ãŸãšãããéçºè
ã«å¯ŸãããããŒãžãã¥ãŒã«å
¥ããåã«ã feature branch äžã§ git rebase -i ãªã©ã䜿ã£ãŠäºåã«ã³ããããæŽçããŠãããããšããååããé¡ãããããšã«ããŸããã ãã®éçšã«ãããæå³ããã³ãããå±¥æŽããã®ãŸãŸæ®ãããã±ãŒã¹ãšãè€æ°ã®ã³ãããã1ã€ã«ãŸãšããŠããŒãžãããã±ãŒã¹ããã®äž¡æ¹ã«å¯Ÿå¿ã§ãããšèããŸããã ãã®æ±ºå®ã®èæ¯ãšå
·äœçãªéçšã«ãŒã«ãããã¥ã¡ã³ãã«ãŸãšããéçºè
å
šå¡ã«ååãäŸé Œããããšã§ãã¹ã ãŒãºãªç§»è¡ãç®æããŸããã ãŸãšã GitHubã®ããŒãžãã¥ãŒã¯ãããã€ãããŒãå®å®ãããæçšãªããŒã«ã§ãããäžæ¹ã§ãããŒã ã®éçºã¹ã¿ã€ã«ã«åœ±é¿ãäžããå¶çŽãååšããŸããç¹ã«ãããŒãžã¡ãœããã1çš®é¡ã«åºå®ãããç¹ã¯ãå°å
¥åã«ããŒã å
ã§ã³ã³ã»ã³ãµã¹ãåã£ãŠããã¹ãéèŠãªãã€ã³ãã§ãã ãã®ãããŒãžã¡ãœããã匷å¶çã«åºå®ãããããšãã仿§ã¯ãèŠèœãšãããã¡ãªãã€ã³ãã ãšæããŸããã®ã§ãæåã®TIPSãšããŠç޹ä»ããŸããã æ¬¡åã¯ãããŒãžãã¥ãŒã®ç¹æ§ã掻ãããŠãéå®³å¯Ÿå¿æã®CIåŸ
ã¡æéãççž®ãã工倫ã«ã€ããŠã玹ä»ããŸãã
GitHubããŒãžãã¥ãŒå°å
¥æã®GitHub Actions CIèšå®å€æŽ ããã«ã¡ã¯ãã¿ã€ããŒã§Platform EngineerãããŠããè¿è€ã§ãã ä»åã¯ãGitHubã®ããŒãžãã¥ãŒïŒMerge QueueïŒã«å¯Ÿå¿ããããã«ãGitHub Actionsã®CIèšå®ãä¿®æ£ãã話ã玹ä»ããŸãã TL;DR GitHubã®ããŒãžãã¥ãŒïŒMerge QueueïŒãå°å
¥ããå Žåã以äžã®èšå®ãå¿
èŠã§ãã Rule SetsïŒBranch protection ruleïŒã§ãRequire status checks to passããæå¹å ãMerge Queueãã®æå¹å CIã¯ãŒã¯ãããŒïŒci.ymlïŒã®å€æŽ merge_group ã€ãã³ãã®è¿œå gh-readonly-queue/** ãã©ã³ããpushã€ãã³ãããé€å€ GitHub Actionsã®åŸæ¥ã®CIã¯ãŒã¯ãã㌠ãŸããåŸæ¥ã®CIã¯ãŒã¯ãããŒïŒci.ymlïŒã®èšå®ãæ¯ãè¿ããŸããå
ã
ã®èšå®ã¯ä»¥äžã®ããã«ãªã£ãŠããŸããã name : ci on : push : branches : - '**' - '!master' tags-ignore : - '*' concurrency : group : ${{ github.workflow }}-${{ github.ref }} cancel-in-progress : true permissions : id-token : write contents : read pull-requests : write jobs : ci : uses : ./.github/workflows/_ci.yml secrets : inherit ãã®èšå®ã§ã¯ãmasterãã©ã³ã以å€ã®ãã¹ãŠã®pushã€ãã³ãã§CIãå®è¡ãããŸãã ãããã€ãŸã§ã®åŸæ¥ã®æµã ã¿ã€ããŒã®deployã¯ãŒã¯ãããŒã¯GitHub Flowãæ¡çšããŠããããã以äžã®ãããªæµãã«ãªã£ãŠããŸããã PRãäœæããCIãéãããšã確èªã PRãmasterãã©ã³ãã«ããŒãžã ããŒãžã«ãã£ãŠmasterã«pushãçºçãããããã€çšã¯ãŒã¯ãããŒïŒdeploy_prod.ymlïŒãå®è¡ãããã deploy_prod.yml ã¯æ¬¡ã®ããã«ãªã£ãŠããŸãã name : deploy_prod on : push : branches : - master jobs : deploy : runs-on : ubuntu-latest steps : - name : Checkout uses : actions/checkout@v4 # ãããã€åŠç... GitHubã§ã®èšå®å€æŽïŒRule SetsïŒ ããŒãžãã¥ãŒã䜿ãã«ã¯ãGitHubã®èšå®ç»é¢ãããRule SetsãïŒåŸæ¥ã¯ãã©ã³ããããã¯ã·ã§ã³ã«ãŒã«ïŒãèšå®ããŸãã å€ãã®ã±ãŒã¹ã§ã¯ãã§ã«ã¹ããŒã¿ã¹ãã§ãã¯å¿
é ïŒRequire status checks to passïŒã®èšå®ããããŠãããšæããŸãã®ã§ããã®å Žåã¯ãMerge Queueãã远å ã§ONã«ããã ãã§ãã GitHub Actionsã®CIã¯ãŒã¯ãããŒå€æŽ PRããããŒãžãã¥ãŒã«ç©ãŸããéã gh-readonly-queue/xxxx ãšãããã©ã³ããäœæããããããCIã¯ãŒã¯ãããŒïŒci.ymlïŒã«ä»¥äžã®å€æŽãå¿
èŠã«ãªããŸããã name : ci on : push : branches : - '**' - '!master' + - '!gh-readonly-queue/**' tags-ignore : - '*' + merge_group : concurrency : group : ${{ github.workflow }}-${{ github.ref }} cancel-in-progress : true permissions : id-token : write contents : read pull-requests : write jobs : ci : uses : ./.github/workflows/_ci.yml secrets : inherit ãã€ã³ã merge_group ã€ãã³ãã远å ããããšã§ãããŒãžãã¥ãŒã«ãšã³ãã¥ãŒããããšãã«CIãå®è¡ãããŸãã gh-readonly-queue/** ãé€å€ããããšã§ãäžèŠãªäºéå®è¡ãé²ããŸãã æ³šæç¹ merge_group ã€ãã³ãã¯åç¬ã§å®çŸ©ã§ãããå¿
ãä»ã®ã€ãã³ããšäžç·ã«å®çŸ©ããå¿
èŠããããŸãã GitHubå
¬åŒããã¥ã¡ã³ã - merge_group The merge_group event cannot be the only event defined in a workflow. 倿ŽãäžèŠãªã¯ãŒã¯ãã㌠ãããã€ç³»ã¯ãŒã¯ãããŒïŒäŸïŒ deploy_prod.yml ïŒãªã©ãmasterãã©ã³ããžã®pushã®ã¿ã§åäœããã¯ãŒã¯ãããŒã¯ãããŒãžãã¥ãŒå¯Ÿå¿åŸã倿ŽäžèŠã§ãã ãããã« GitHubã®ããŒãžãã¥ãŒã¯å°å
¥ãæ¯èŒçç°¡åã§ãããæ¢åã®GitHub Actionsã«ã圱é¿ãäžããŸããæ¬èšäºãåèã«ãã¹ã ãŒãºã«ããŒãžãã¥ãŒãå°å
¥ããŠããã ããã°å¹žãã§ãã æåŸãŸã§ãèªã¿ããã ããããããšãããããŸããïŒ