ããã«ã¡ã¯ãã¿ã€ããŒã§ãšã³ãžãã¢ãããŠãã埳å¯ã§ãã ä»åã¯ã 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ãäœããã®ã§ã¯ïŒã ããèãããã®æ§æã§é²ããããšã«ããŸããã å®éãEKS Auto Mode ãæ¡çšããããšã§ ã¯ã©ã¹ã¿ã®ã¢ããããŒããèªåå ã§ããçŸåšã®éçšã¯ Renovate ãäœæãã宿ã¢ããããŒãã® PR ãã¬ãã¥ãŒã»ããŒãžããçšåºŠã§æžãã§ããŸãã ã¢ãŒããã¯ãã£æŠèŠ ãã£ãããšããæ§æã¯ãããªã€ã¡ãŒãžã§ãã ã¢ãŒããã¯ãã£ãŒå³ 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ãµã€ãã«ãŒæ¹åŒ ãéžæããŸããã 6. Docker Hub ã®ã¬ãŒããªãããåé¡ DinDæ§æã§service containerãå©çšããŠãããšãCIå®è¡ã®ãã³ã« Docker Hub ããã€ã¡ãŒãžã pull ããããšã«ãªããŸãã åŒç€Ÿã§ã¯ 35䞊å à é«é »åºŠå®è¡ ãšããæ§æã®ãããDocker Hub ã® ã¬ãŒããªããã ã«ããå°éããŠããŸãã Too Many Requests ã§CIã倱æããã±ãŒã¹ãçºçããŸããã 察ç DinDãµã€ãã«ãŒã® dockerd èµ·åæã«ã ã¬ãžã¹ããªãã©ãŒ ãšã㊠mirror.gcr.io ãæå®ããããšã§ãDocker Hub ãžã®çŽæ¥ãªã¯ãšã¹ããæžãããŸããã args : - dockerd - --host=unix:///var/run/docker.sock - --group=$(DOCKER_GROUP_GID) - --registry-mirror - http://mirror.gcr.io - --max-concurrent-downloads=8 ããã«ãããpull ãªã¯ãšã¹ãã¯ãŸã Google ã®å
¬éãã©ãŒãåç
§ãããã£ãã·ã¥ãããã°ããããååŸããããããDocker Hub ãžã®ãªã¯ãšã¹ãæ°ã倧å¹
ã«åæžã§ããŸãã çµæãšããŠãã¬ãŒããªãããã«ããCI倱æã¯ãŒãã«ãªããå®å®ããŠservice containerãèµ·åã§ããããã«ãªããŸããã ãŸãšããšæ¬¡åäºå ä»åã 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ã«ã圱é¿ãäžããŸããæ¬èšäºãåèã«ãã¹ã ãŒãºã«ããŒãžãã¥ãŒãå°å
¥ããŠããã ããã°å¹žãã§ãã æåŸãŸã§ãèªã¿ããã ããããããšãããããŸããïŒ
ããã«ã¡ã¯ãã¿ã€ããŒã§ããã¯ãšã³ãã®ããã¯ãªãŒããããŠããæ°è°· ( @euglena1215 ) ã§ãã ã¿ã€ããŒã®ããã¯ãšã³ãã¯ãå€ãã®éçºè
ãé¢ããã¢ããªã¹ãªRailsã¢ããªã±ãŒã·ã§ã³ãäžå¿ã«æ§æãããŠããŸããæ¬èšäºã§ã¯ããã®ã¢ããªã¹ãªããžããªã®ãããã€ãããŒãå®å®ãããããã«GitHubã®ããŒãžãã¥ãŒãå°å
¥ããäºäŸã玹ä»ããŸãã æ¬èšäºããmasterãã©ã³ãã«ããŒãžããã³ãŒãã§CIãé »ç¹ã«å€±æããéçºããã»ã¹ã«åœ±é¿ãåºãŠããããŒã ã®åèã«ãªãã°å¹žãã§ãã masterãã©ã³ãã®CIãé »ç¹ã«å€±æããŠãã ã¿ã€ããŒã®ã¢ããªã¹Railsãªããžããªã§ã¯ã1æ¥ã«20件以äžã®Pull RequestãããŒãžãããããšããããŸããå€ãã®éçºè
ãåæã«éçºãé²ããäžã§ãããåé¡ãé »çºããŠããŸããã ããã¯ãä»ã®äººã®å€æŽãmasterãã©ã³ãã«åã蟌ãŸããããšã«æ°ä»ãããå€ãmasterãå
ã«ããPull RequestãããŒãžããŠããŸããçµæçã«masterãã©ã³ãã§CIã倱æããããšããäºè±¡ã§ãã masterãã©ã³ãã§CIã倱æããå³ ãã®äºè±¡ã«ãããéçºããŒã ã«æ¬¡ã®ãããªåœ±é¿ãåºãŠããŸããã ãªãªãŒã¹é
å»¶ masterãäžåºŠCIã«å€±æãããšãåå ã®ç¹å®ãšä¿®æ£ïŒRevertãªã©ïŒãçµãããŸã§ã誰ããããã€ã§ããªããªããŸããããã«ããããŠãŒã¶ãŒã«å±ããã䟡å€ãã¿ã€ã ãªãŒã«å±ããããªãäºæ
ãçºçããŠããŸããã ã³ã³ããã¹ãã¹ã€ãããšã³ãã¥ãã±ãŒã·ã§ã³ã³ã¹ãã®å¢å€§ masterã®CI倱æã¯ãSlackã§ã®å
šäœåšç¥ãåå 調æ»ã®äŸé ŒãããŒãžã®äžæåæ¢åŒã³ãããªã©ãå€ãã®éçºè
ãå·»ã蟌ãã³ãã¥ãã±ãŒã·ã§ã³ãçºçãããããŒã å
šäœã®çç£æ§ãäœäžãããŠããŸããã å®éã«ã2025幎ã®ãã2ã¶æéã調æ»ãããšãããmasterãã©ã³ãã§ã®CI倱æã®ãã¡ã ææ°ã®masterãåã蟌ãã§ããã°é²ããå¯èœæ§ãé«ããã®ã¯6ä»¶ ãããŸããããã®èª²é¡ã解決ãããããæã
ã¯è§£æ±ºçã®æ€èšãéå§ããŸããã ãªããããŒãžãã¥ãŒãã ã£ãã®ãïŒ ãã®åé¡ã解決ããã«ããããæã
ã¯GitHubããŒãžãã¥ãŒãéžæããŸããããã®èæ¯ãã説æããŸãã ãŸãã解決çãšããŠèããããããã¹ãŠã®Pull Requestã¯ãããŒãžçŽåã«å¿
ãæåã§ææ°ã®masterãåã蟌ãããšããã«ãŒã«éçšã¯ã1æ¥ã«20件以äžãããŒãžããããªããžããªã§ã¯çŸå®çã§ã¯ãããŸããã§ãããCIã®åŸ
ã¡æéãåã¬ãã¥ãŒã®ã³ã¹ããèãããšãéçºé床ã®äœäžã¯é¿ããããªããšå€æããŸããã äžæ¹ã§ãã¿ã€ããŒã§ã¯æ¢ã«GitHub Enterprise Cloudãå°å
¥æžã¿ã§ããããã®ãããããŒãžãã¥ãŒã¯è¿œå ã³ã¹ããæ°ããªã»ãã¥ãªãã£ã¬ãã¥ãŒãªãã«å©çšã§ããæ©èœã§ããã æ¢åã®ãã©ãããã©ãŒã ã®æ©èœã掻çšããããšã¯ãæã
ã«ãšã£ãŠåççãªå€æã§ããããã®ãããä»ã®ãµãŒãããŒãã£ããŒã«ãæ¯èŒæ€èšããããšã¯ãããããŒãžãã¥ãŒã®å°å
¥ã«ãã©ãŒã«ã¹ããŠèª¿æ»ãé²ããããšã«ããŸããã 解決çïŒGitHubããŒãžãã¥ãŒãšã¯ïŒ GitHubã®ããŒãžãã¥ãŒãæ¹ããŠèª¬æãããšãmasterãã©ã³ãã«ããŒãžãããåã«ãææ°ã®masterãšåäœãããç¶æ
ã§CIãå®è¡ããæåãããã®ã ããèªåã§ããŒãžããä»çµã¿ãã§ãã éçºè
ãPull RequestãããŒãžãã¥ãŒã«è¿œå ãããšãGitHubã¯å
éšçã«äžæçãªãã©ã³ããäœæãããã®æç¹ã§ã®ææ°ã®masterãšPRã®å€æŽãããŒãžããŠCIãå®è¡ããŸããCIãæåããã°ããã®å€æŽãmasterã«ããŒãžãããããšããä»çµã¿ã§ãã ãéèŠãGitHub Enterprise Cloudãåæ ç¹°ãè¿ãã«ãªããŸãããGitHubã®ããŒãžãã¥ãŒã¯privateãªããžããªã§å©çšããå ŽåãGitHub Teamsãã©ã³ã§ã¯ãªãGitHub Enterprise Cloudãã©ã³ã®å¥çŽãå¿
èŠãšãªããŸãã 詳ããã¯å
¬åŒããã¥ã¡ã³ããã芧ãã ããã docs.github.com ãŸãšã GitHubããŒãžãã¥ãŒãå°å
¥ããããšã§ã課é¡ã§ãã£ããå€ãmasterãšã®ç«¶åã«ããCI倱æãã¯ãªããªããmasterãã©ã³ããCIã®æåããç¶æ
ãç¶æã§ããããã«ãªããŸããã ãã®çµæã¯ããã æ©èœãæå¹åããã ãã§åŸããããã®ã§ã¯ãããŸãããç§ãã¡ã¯ãæ¬æ Œå°å
¥ã«å
ç«ã¡ãããŒãžãã¥ãŒããã¹ãç°å¢ã§æ€èšŒããŸããããã®çµæããã æå¹åããã ãã§ã¯æã
ã®éçºãããŒãšã®äºææ§ãä¿ã€ã®ãé£ãããããã€ãã®ãã¥ãŒãã³ã°ãå¿
èŠãªãã€ã³ããæããã«ãªããŸããã ãããã®ãã€ã³ãã«äºåã«å¯ŸåŠããããšããã¹ã ãŒãºãªå°å
¥ã®éµãšãªããŸããã æ¬¡åã®èšäºã§ã¯ããã®å°å
¥ãæåã«å°ãããå
·äœçãªæ€èšŒå
容ãšãããã«åºã¥ããŠæã
ãå®è£
ãããã¥ãŒãã³ã°æ¹æ³ïŒGitHub Actionsã®ã¯ãŒã¯ãããŒèšå®ãªã©ïŒã«ã€ããŠã詳ãã解説ããŠãããããšæããŸãã tech.timee.co.jp tech.timee.co.jp tech.timee.co.jp tech.timee.co.jp tech.timee.co.jp tech.timee.co.jp
ã¿ã€ããŒã§ã¯ãFlaky Test ããããã€ã®åŠšãã«ãªãããšã§éçºå¹çãæªåããŠããŸãã ãã®åé¡ã解決ãããããAI ãšãŒãžã§ã³ããDevinããæŽ»çšããFlaky Test ã®æ€åºããä¿®æ£ãã«ãªã¯ãšã¹ãã®äœæãŸã§ãå®å
šã«èªååããŸãã çµæãCIã¯å®å®ããéçºè
ã¯æ¬æ¥ã®æ¥åã«éäžã§ããããã«ãªã£ãããšã§ãéçºäœéšãåäžããŸãã ããã«ã¡ã¯ïŒã¿ã€ããŒã§ããã¯ãšã³ããšã³ãžãã¢ãšããŠåããŠãã çŠäº ( bary822 ) ã§ãã çãã㯠Flaky Test ã«æ©ãŸãããçµéšã¯ãªãã§ãããã? ã¿ã€ããŒã§ããFlaky Test ã«ãã£ãŠ CI ã®ä¿¡é Œæ§ãäœäžããéçºè
ã®è²Žéãªæéã奪ã£ãŠããŸããšãã課é¡ãæ±ããŠããŸããã ããæéã«ãããŠã¯ master ãã©ã³ãã«ããããã¹ãå®è¡ã® 4.5% ã Flaky Test ã«ãã£ãŠå€±æããŠããã20+å/æ¥ ã®é »åºŠã§ãããã€ãããŠããããšãèãããš1æ¥ã«1å㯠CI ã re-run ããããåŸãªãç¶æ
ã«é¥ã£ãŠããŸããã ãã®èšäºã§ã¯ãæ ¹æ·±ã Flaky Test åé¡ã解決ããããã«ãDevin ãæŽ»çšããŠä¿®æ£ãã«ãªã¯ãšã¹ãã®äœæãèªååããCI ã®å®å®åãšéçºäœéšã®åäžãå®çŸããåãçµã¿ã«ã€ããŠã玹ä»ããŸãã ç§ãã¡ãæ±ããŠããèª²é¡ Flaky Test ãæŸçœ®ãããšéçºããŒã å
šäœã«æ§ã
ãªæªåœ±é¿ãåãŒããŸããç§ãã¡ãçŽé¢ããŠããäž»ãªèª²é¡ã¯ä»¥äžã®éãã§ãã éçºå¹çã®æªå : åé¡ãªãã¯ãã® Pull Request ã® CI ã Flaky Test ã«ãã£ãŠå€±æãããšãéçºè
ã¯æ¬æ¥äžèŠãªåå 調æ»ã CI ã®åå®è¡ã«æéãè²»ããããšã«ãªããŸããå€ãã®äººã«ãšã£ãŠäžå®ã®ç·åŒµãçºçãããããã€äœæ¥ã®äžç°ãšããŠå®è¡ããã CI ã倱æãããšããã®ã¯ç²Ÿç¥çã«ã倧ããªè² æ
ãšãªããŸãã ãããã€ã®é
å»¶ : master ãã©ã³ãã® CI ã倱æãããšããããã€æ
åœè
ã¯ããã Flaky Test ã«ãããã®ãã©ãããåãåãã調æ»ã匷ããããŠããŸããã Flaky Test ã ã£ãå Žåã¯åå®è¡ã«ãã£ãŠãã®å Žãåãããšãåžžæ
åããŠãããè¿
éãªäŸ¡å€æäŸã®åŠšããšãªã£ãŠããŸãããããã¯ãããžãã¹ã®æ©äŒæå€±ã«ãç¹ãããããŸããã CI ã«ãããå質ä¿èšŒã®æ©èœäžå
š : ãã¹ãã®æåŠãäžå®å®ãªãããmaster ãã©ã³ãã§æ¢åæ©èœãæ£ããåäœããããšãä¿èšŒãããŠãããã©ãããæ£ç¢ºã«å€æã§ããªããªããŸããç§ãã¡ã®å Žåã¯ãã®å€ããããã¹ãã¯æ£ããæžãããŠãããäœããã®äžå®å®ãªèŠå ã«ãã£ãŠå€±æããããšããããã±ãŒã¹ã ã£ããããå®è³ªçãªå質ã®äœäžã¯ã»ãšãã©çºçããŠããŸããã§ããããããããã®å察(æ¬æ¥å€±æãã¹ããªã®ã«ããŸããŸãã¹ããŠããŸã)ãçºçããŠãããšããŠãããŸã Flaky ãâŠããšèŠéãããŠããŸãã³ãŒãã®ä¿®æ£ãé
ããå¯èœæ§ããããŸããã ãããã®èª²é¡ã解決ããéçºè
å
šå¡ãå®å¿ããŠé«éã«éçºãé²ããããç°å¢ãäœããããç§ãã¡ã¯ Flaky Test ã®æ©æçºèŠãšä¿®æ£ãèªååããä»çµã¿ã®æ§ç¯ã«ä¹ãåºããŸããã 解決çïŒDevin ã«ãã Flaky Test ä¿®æ£ã®å®å
šèªåå ç§ãã¡ã¯ã以äžã®ã¹ãããã§ Flaky Test ã®ç¹å®ããä¿®æ£ãŸã§ãèªååããä»çµã¿ãèæ¡ããŸããã Flaky Test ã®èªåæ€åº : CI ç°å¢ã§å®è¡ããããã¹ãã®å®è¡ããŒã¿ã Datadog (Test Optimization)ã«éä¿¡ããFlaky Test ãèªåã§æ€åºãã Devin ã«ããä¿®æ£PRã®äœæ : æ°ãã Flaky Test ãæ€åºããããšããããããªã¬ãŒã« GitHub Actions ã®ã¯ãŒã¯ãããŒãèµ·åãããã¯ãŒã¯ãããŒã¯ããã¹ããã¡ã€ã«åããšã©ãŒã¡ãã»ãŒãžãªã©ã®æ
å ±ãããã³ããã«å«ã㊠API çµç±ã§ Devin ã«æž¡ããä¿®æ£ãã«ãªã¯ãšã¹ãã®äœæãäŸé Œããã ã¬ãã¥ãŒãšããŒãž : Devin ã«ãã£ãŠäœæããããã«ãªã¯ãšã¹ãã¯ã CODEOWNERS  ã®èšå®ã«åºã¥ããŠé©åãªããŒã ã«èªåã§ã¬ãã¥ãŒãå²ãåœãŠãããŸããããŒã ã¯ãDevin ãææ¡ããä¿®æ£å
容ã確èªããå¿
èŠã«å¿ããŠå€æŽãå ããããŒãžããŸãã ãã®ä»çµã¿ã®å
šäœåã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã Flaky Test ã®çºèŠããä¿®æ£ã®ãå©ãå°ãäœæãŸã§ãèªååãã ãã®ãããŒã«ãããFlaky Test ã®çºçããä¿®æ£ææ¡ãŸã§ãå®å
šã«èªååãããéçºè
㯠Devin ãäœæãã Pull Request ãã¬ãã¥ãŒããã ãã§ãããªããŸããã ãã¡ãã Flaky Test ã®çºèŠèªäœã誀æ€ç¥ã§ããå¯èœæ§ãããããããã®å Žåã¯ããŒã ã®å€æã§ã¯ããŒãºããŸãã ãŸããDevin ã誀ã£ãåå 仮説ã«åºã¥ããæãŸãããªãä¿®æ£ãææ¡ããå Žåããããããå¿
èŠãªã远å ã®å€æŽãè¡ã£ãããæ°ãã Pull Request ãäœæãããããŠæè»ã«å¯Ÿå¿ããŸãã ãããã«ãã Flaky ãªç¶æ
ãçããããã¹ããçºèŠããããšãã»ãšãã©åãã¿ã€ãã³ã°ã§æ
åœããããŒã ããããèªèããä¿®æ£ã®ãå©ãå°ãããã§ã«äœæãããŠããç¶æ
ãå®çŸããããšãã§ããŸããã Devin ã¯ã©ã®ããã«ãã¹ããä¿®æ£ããã®ãïŒ ãDevin ãæ¬åœã« Flaky Test ãä¿®æ£ã§ããã®ãïŒããšçåã«æãæ¹ããããããããŸããã ç§ãã¡ãæåã¯åä¿¡åçã§ããããDevin ã¯åœåã®æåŸ
ãäžåãã»ã©ç確ãªä¿®æ£ãææ¡ããŠãããŠããŸãã ããã¯ãDevin ã«æž¡ããŠããããã³ããã®äžéšã§ããåçŸæé ã®ç¹å®ãã Pull Request ã®äœè£ãä¿®æ£ã®åæãªã©ã现ããæç€ºããŠããŸãã ã¬ãã¥ã¢ãŒãã©ãã«ãªã©ãPull Request äžã§èšå®ããéçãªé
ç®ã«é¢ããŠã¯æåŸ
å€ã宣èšçã«å®çŸ©ããCLIã³ãã³ãã®è¿ãå€ã«ãã£ãŠãã®æ€èšŒãè¡ãããã«æç€ºããŠããã®ãéèŠãªãã€ã³ãã§ãã ããããããšã§ãDevin èªèº«ãã»ã«ããã§ãã¯ãè¡ããããããŠæ±ããåºåãå®å®çã«åŸãããããã«ããŠããŸãã 以äžã® Flaky Test ã®ä¿®æ£ãè¡ãã${ã¬ããžããªå} ã« Pull Request ãäœæããŠãã ããã # ãã¹ãæ
å ± ## ãã¹ããã¡ã€ã« ${Flaky Test ãçºçãããã¹ããã¡ã€ã«å} ## ãã¹ãã±ãŒã¹ ${Flaky Test ãçºçãããã¹ãã±ãŒã¹å} ## ãšã©ãŒã¡ãã»ãŒãž(å
é 20è¡) ${ãã¹ã倱ææã®ãšã©ãŒã¡ãã»ãŒãžãšã¹ã¿ãã¯ãã¬ãŒã¹} ## å®è¡ã³ãã³ã ${ãã¹ãã®å®è¡ã³ãã³ã} (CIç°å¢ã§ã¯ãã¹ããã¡ã€ã«ãåå²ããŠäžŠåå®è¡ããŠãããããã©ã®ãã¹ããã¡ã€ã«ãã©ã®é çªãSeedå€ã§å®è¡ããŠãããã®æ
å ±ãå¿
èŠ) ## åé¡çºçæã®ã³ããã ${çŽåã® Commit ã® SHA} # äœæ¥å
容 1. ãã¹ãã³ãŒãã®ä¿®æ£ 2. ä¿®æ£åŸãåœè©²ãã¹ããããŒã«ã«ç°å¢ã§5åå®è¡ããå
šãŠæåããããšãç¢ºèª - seedå€ãå€ããªãããã¹ããå®è¡ããæã¯ã1ã€ä»¥äžã®ä»ã®ãã¹ããã¡ã€ã«ãåæã«å®è¡ - è€æ°ã®ãã¹ããã¡ã€ã«ã«æž¡ã£ãŠã©ã³ãã ãªé çªã§ãã¹ããå®è¡ãããããã«ããã 3. 以äžã®èŠä»¶ãæºãã Pull Request ãDraftã§äœæ - ã¿ã€ãã«: flaky: (åå ãšä¿®æ£å
容ãç°¡æœã«èšèŒ) - ã³ãŒããªãŒããŒã®èšå®ã«åŸã£ãŠã¬ãã¥ãŒãªã¯ãšã¹ããéä¿¡ãã³ãŒããªãŒããŒäžåšã®å Žå㯠${ã³ãŒããªãŒããŒäžåšã®å Žåã«å¯Ÿå¿ãã GitHub Team å} ã«éä¿¡ 4. CIãæåããããPull Request ã Open ã«å€æŽ # Pull Request ã® description ã«å«ããæ
å ± - çºçããŠããåé¡ã®æŠèŠ - ä¿®æ£å
容ãšããã«ãã£ãŠ Flaky ãè§£æ¶ããããšå€æããçç± - Datadog äžã®ãã¹ãçµæããŒãžã®URL # éèŠãªæ³šæäºé
## å¶çŽ - ä¿®æ£å
å®¹ã¯æå°éã«æãããã¹ãã®æå³ã倿Žããªãããã«ããŠãã ããã - ä»ã® spec ãã¡ã€ã«ã§äœ¿çšãããŠããæ¢åã®ãã¿ãŒã³ã«åãããå®è£
ãè¡ã£ãŠãã ãã - å¯èœãªéãä¿®æ£åã«å€±æãããŸã§æ¡ä»¶ãå€ããªãããã¹ããå®è¡ãã倱æãããšãã®å®è¡ã³ãã³ããªã©ã®åçŸæé ãæèšããŠãã ããã - ãã¹ãã®å€±æãåçŸãããšãã«ã¯äžŠåå®è¡ç°å¢äžã§èªç¶ã«çºçãåŸãæ¡ä»¶ãèšå®ããŠãã ãããç¹å®ã®ããŒã¿ãæåã§äœæãããªã©ããããšã¯çŠæ¢ããŸãã - ãã¹ãã®ä¿®æ£ã«ãã£ãŠ Flaky ãè§£æ¶ããããšå€æããçç±ãæèšããŠãã ããã ## æ€èšŒã³ãã³ã 以äžã®ã³ãã³ãã§åé
ç®ãæ£ããèšå®ãããŠããããšã確èªããŠãã ããïŒ ### PRã¹ããŒã¿ã¹ã Open ã§ããããšã®ç¢ºèª \`\`\` bash gh api repos/${ã¬ããžããªå}/pulls/{pr _ number} --jq '.state, .draft' # æåŸ
å€: "open" ãš false ã衚瀺ããã \`\`\` ### ã¬ãã¥ã¢ãŒã远å ãããŠããããšã®ç¢ºèª \`\`\` bash # 倿Žãããã¡ã€ã«ã«ã³ãŒããªãŒããŒãèšå®ãããŠããå Žå gh api repos/${ã¬ããžããªå}/pulls/{pr _ number}/requested _ reviewers # æåŸ
å€: teamsé
åã« ã³ãŒããªãŒããŒã®Teamå ãå«ãŸãã # 倿Žãããã¡ã€ã«ã«ã³ãŒããªãŒããŒãèšå®ãããŠããªãå Žå gh api repos/${ã¬ããžããªå}/pulls/{pr _ number}/requested _ reviewers # æåŸ
å€: teamsé
åã« "${ã³ãŒããªãŒããŒäžåšã®å Žåã«å¯Ÿå¿ãã GitHub Team å}" ãå«ãŸãã \`\`\` ### devin-fix-flaky-test ã©ãã«ãèšå®ãããŠããããšã®ç¢ºèª \`\`\` bash gh api repos/${ã¬ããžããªå}/issues/{pr _ number}/labels # æåŸ
å€: name ã "devin-fix-flaky-test" ã®ãªããžã§ã¯ããå«ãŸãã \`\`\` # åèæ
å ± - ãã¹ãã¯ãã¡ã€ã«ããšã«äžå®ã®ãŸãšãŸãã§åå²ãããŠäžŠåå®è¡ãããŠãããã©ã³ãã ã«èšå®ãããSeedå€ã䜿ã£ãŠå®è¡é åºãå¶åŸ¡ããŠããŸã - ããããã®å®è¡ç°å¢ã§ã¯ç¬ç«ããããŒã¿ããŒã¹ãçšæãããŠãããå®è¡ç°å¢éã§ããŒã¿ãå
±æãããªãããã«ããŠããŸã ãã®ããã³ããã«åºã¥ããDevin ã¯æ§ã
ãªãã¿ãŒã³ã® Flaky Test ãä¿®æ£ããŠãããŸããã ããã§ã¯ããã®äžãã代衚çãª2ã€ã®äŸãã玹ä»ããŸãã ä¿®æ£äŸ1ïŒ ããªããŒã·ã§ã³ãšã©ãŒã«ããäžå®å®æ§ã®è§£æ¶ éå§ãçµäºæéãå®çŸ©ãã2ã€ã® DateTime åã®ã«ã©ã ã«ãã£ãŠèšç®ãããå€ã«äŸåããããªããŒã·ã§ã³ã®ãã¹ãã«ãããŠãåŠçæéãšã¿ã€ãã³ã°ã«ãã£ãŠã¯å€±æããã±ãŒã¹ããããŸããã Before: context ' ... ' do before do create( :offering , :just_working ) end end offering ã¯ãããããæ±äººãã衚çŸããã¢ãã«ã§ãã just_working trait ã§ã¯çšŒåæéãã¡ããã©6æéã«ãªãããã«èšå®ãããŠããŸãã trait :just_working do start_at { Time .current.ago( 5 .hours) } end_at { Time .current.since( 1 .hour) } end åŽååºæºæ³ã§ã¯6æéãè¶
ãããš45å以äžã®äŒæ©ã矩åä»ããããŸãããã®å Žåã¯ã®ãªã®ãª6æéãªã®ã§äŒæ©æéã0åã§ã offering ã¬ã³ãŒãã®ä¿åã«æåããŸãã ããããéå§ã»çµäºæé( start_at ãš end_at )ã¯ãããèšå®ããããšãã®çŸåšæå»ã«äŸåããŠããããã start_at ãèšå®ãããåŸã®ã¿ã€ãã³ã°ã§ã¡ããã©1ç§ããŸããã§ããŸããšã end_at = start_at + 6æé + 1ç§ ãšãªã£ãŠããŸããããäŒæ©æéãèšå®ãããŠããªããšããªããŒã·ã§ã³ãšã©ãŒãçºçããŠããŸããŸãã ActiveRecord :: RecordInvalid : åŽåæéã 6 æéãè¶
ããŠããŸããæ³å®äŒæ©æéãæºããããã«äŒæ©æéãèšå®ããŠãã ããã After (Devinã«ããä¿®æ£): context ' ... ' do before do create( :offering , :just_working , :with_rests ) # :with_rests trait ã远å end end Devinã¯ã with_rests trait ã远å ããããšã§ã6æéè¶
ã®åŽåæéã«å¯ŸããŠæ³å®äŒæ©æéïŒ45å以äžïŒãèªåçã«èšå®ããããã«ä¿®æ£ããŸããã ããã«ãããããªããŒã·ã§ã³ãšã©ãŒãåé¿ãããã¹ããå®å®ããŠæåããããã«ãªããŸããã ä¿®æ£äŸ2ïŒFactoryBot ã®ã©ã³ãã ããŒã¿çæã«ããäžå®å®æ§ FactoryBot ã§çæãããã©ã³ãã ãªããŒã¿ãããã¹ã察象ã®ã¡ãœããã®æ¡ä»¶åå²ã«åœ±é¿ãäžã㊠Flaky ã«ãªã£ãŠããã±ãŒã¹ããããŸããã Before: describe ' ... ' do let( :client ) { create( :client ) } context ' ... ' do let( :serializer ) { BrandUserSerializer .new(brand_user, client_id : client.id) } let( :brand_user ) { build_stubbed( :brand_user ) } # brand_user ã« client ãçŽã¥ã it { expect(serializer.kind).to eq :other } end end ãã®ãšã BrandUserSerializer#kind ã¡ãœããã¯æ¬¡ã®ããã«å®è£
ãããŠããŸããã def kind if @brand_user .client_id == @client_id :manual else :other end end BrandUserSerializer ã®ã€ã³ã¹ã¿ã³ã¹çææã®ç¬¬äžåŒæ°ãšããŠæž¡ããã brand_user ã«çŽã¥ã cliend_id ãšã第äºåŒæ°ãšããŠçŽæ¥æž¡ããã client_id ã®å€ãæ¯èŒããåäžã§ããã° :manual ããããã§ãªããã° :other ãè¿ããŸãã ãã®ãã¹ãã§ã¯ç°ãªãå€ãèšå®ããã :other ãæåŸ
å€ãšããŠããŸããããããã build_stubbed ã§ã¯ ID ãã©ã³ãã ã«èšå®ããããããããå
ããªç¢ºçã§ç¬¬äºåŒæ°ãšããŠæž¡ããã client.id ã®å€ãšäžèŽããããšããããŸãã ãã®å Žå .kind 㯠:manual ãè¿ããããã¹ãã倱æããŠããŸããŸãã After (Devinã«ããä¿®æ£): describe ' ... ' do let( :client ) { create( :client ) } context ' ... ' do let( :serializer ) { BrandUserSerializer .new(brand_user, client_id : client.id) } # æç€ºçã«å¥ã® client ãäœæããŠç¢ºå®ã«ç°ãªã client_id ãè¿ãããã«ãã let( :other_client ) { create( :client ) } let( :brand_user ) { build_stubbed( :brand_user , client : other_client) } it { expect(serializer.kind).to eq :other } end end Devinã¯ãæç€ºçã« other_client ãäœæãã brand_user ã«èšå®ããããšã§ã確å®ã«ç°ãªã client_id ãæã€ããã«ããŸããã ãã®å€æŽã«ãããserializerã®æ¡ä»¶åå²ã§æ£ãã :other ãè¿ãããããã«ãªãããã¹ããå®å®ããŠæåããããã«ãªããŸããã å°å
¥åŸã®ææãšä»åŸã®å±æ ãããæžããŠããæç¹ã§ 3ä»¶ ã® Flaky Test ãä¿®æ£ãã Pull Request ã Devin ã«ãã£ãŠäœæãããŸãããããã®ãã¡ 2ä»¶ ã¯éçºè
ã«ãã£ãŠå€æŽãå ããããããšããªãããŒãžãããŸããã çµæãšããŠãCI ã®æåçã¯å®å®ããéçºè
㯠Flaky Test ã«ããææ»ããäžèŠãªèª¿æ»ããè§£æŸããããã䟡å€ã®ããæ©èœéçºã«éäžã§ããããã«ãªããŸããã Devin ãäœæãã Pull Request ããå©ãå°ããšããŠãããŒã å
ã§ä¿®æ£æ¹éãè°è«ãããã远å ã®å€æŽãå ããããšãã£ãããã建èšçãªæŽ»åãçãŸããŠããããšãéèŠãªãã€ã³ãã§ãã ä»åŸã¯ãããã«ããã³ãããæŽç·Žãããããè€é㪠Flaky Test ã«ã察å¿ã§ããããã«æ¹åãç¶ããŠããäºå®ã§ãããŸããä»åã®æåãè¶³ãããã«ãFlaky Test ä¿®æ£ä»¥å€ã®éçºããã»ã¹ã«ãç©æ¥µçã« AI ãæŽ»çšããŠããããšãæ€èšããŠããŸãã ãããã« ä»åã¯ã Devin ãæŽ»çšã㊠Flaky Test ã®ä¿®æ£ãèªååããCI ã®å®å®åãšéçºäœéšã®åäžãå®çŸããäºäŸãã玹ä»ããŸãããAI ãéçºã¯ãŒã¯ãããŒã«çµã¿èŸŒãããšã§ããããŸã§äººéãæéããããŠå¯Ÿå¿ããŠããéå±ãªäœæ¥ããªãããããåµé çãªä»äºã«éäžã§ããç°å¢ãäœãããšãã§ããŸãã ãã®èšäºããåãããã« Flaky Test ã«æ©ãéçºè
ã®çããã«ãšã£ãŠãå°ãã§ãåèã«ãªãã°å¹žãã§ãã æåŸãŸã§ãèªã¿ããã ããããããšãããããŸããïŒ
ã¯ããã« ããã«ã¡ã¯ãã¿ã€ããŒã§Androidãšã³ãžãã¢ãããŠãã HunachiïŒãµãªã¡ïŒ ã§ãã 2025幎6æ25æ¥ãã26æ¥ã«éå¬ãããdroidcon NYC 2025ã«åå ããŠããŸããããã®ããã°ã§ã¯ãdroidcon NYCã®é°å²æ°ãšãç¹ã«å°è±¡ã«æ®ã£ãã»ãã·ã§ã³ã«ã€ããŠã玹ä»ããŸãïŒ droidcon NYC 2025ã®é°å²æ° åå è
㯠700åä»¥äž ãã»ãã·ã§ã³ã¯4ã€ã®ã¹ããŒãžã§ 80ä»¥äž ãšãDroidKaigiãšã»ãŒåèŠæš¡ãå°ãå°ãããããã®ã€ãã³ãã§ããã äž»ã«ã¢ã¡ãªã«ã§åãAndroidãšã³ãžãã¢ãéãŸã£ãŠãããç§ã話ããæ¹ã
ã¯ãã¥ãŒãšãŒã¯è¿éã ãã§ãªããã¢ã¡ãªã«åå°ããæ°æéãããŠæ¥ãŠããæ¹ãã»ãšãã©ã§ãããåŒç€Ÿç€Ÿå¡ãé€ãæ¥æ¬ããã®åå è
ã«ã¯åºäŒããŸããã§ããã ãŸããåãäŒå Žã§ Fluttercon ãéå¬ãããŠãããFlutterãšã³ãžãã¢ãšã®äº€æµã楜ãããŸããã èå³ã®ããã»ãã·ã§ã³ã倿°èããã®ã¯ãã¡ããã®ããšãæµ·å€ã®ãšã³ãžãã¢ã®æ¹ã
ãšäº€æµã§ããã®ã¯è²Žéãªçµéšã§ããã è±èªãã¹ã©ã¹ã©ãšåããèš³ã§ã¯ãªãã®ã§ãããä»ã®åå è
ã®æ¹ã
ããšãŠãåªããæ¥ããŠãã ãããæ¥œããæéãéãããŸãããGoogleã®ç€Ÿå¡ã®æ¹ãã¹ããŒã«ãŒã®æ¹ã«çŽæ¥è³ªåã§ããæ©äŒããããéåžžã«ææçŸ©ã§ããã äžç·ã«ã»ãã·ã§ã³ãèããããã話ããããããŠãŸããïŒ ã©ã³ãã®æéã§ãä»ã®åå è
ãšäº€æµããããšãã§ããŸããïŒ Day2ã«ã¯ã忥ã«ä»²è¯ããªã£ã人ãã¡ãšäžç·ã«ã»ãã·ã§ã³ãèãããããããã¹ããããã§ããŸãããã©ã³ãã®æéãä»ã®åå è
ãšäº€æµããããšãã§ããèªåããåãããã«è¡ãã°ä»ã®åå è
ãšæ¥œããã³ãã¥ãã±ãŒã·ã§ã³ãåããé°å²æ°ã§ãã ð€ èããŠããã»ãã·ã§ã³ã®äžéšã玹ä»ããŸãïŒ Panel: The Future of Dependency Injection in Modern Android ãã®ããã«ãã£ã¹ã«ãã·ã§ã³ã§ã¯ãçŸä»£ã®Androidéçºã«ãããDIïŒäŸåæ§æ³šå
¥ïŒã®æªæ¥ã«ã€ããŠè°è«ãããŠããŸããã KMPïŒKotlin MultiplatformïŒã§ã¯ãMetroããšããDIãã¬ãŒã ã¯ãŒã¯ããã䜿ãããã DIã®ååèªäœã¯è€éã§ã¯ãªããæã
ã¯åé¡è§£æ±ºã«éäžãã¹ãã§ãDIã®ããšãæ°ã«ããã®ã¯è¯ããªãã ãµãŒãã¹ãã±ãŒã¿ãŒã¯é¿ããã¹ãã§ãäŸåé¢ä¿ã¯ã³ã³ãã€ã«æã«è§£æ±ºãã¹ãã DIãã¬ãŒã ã¯ãŒã¯ã¯æ©ãã«å°å
¥ã決å®ããããšãæšå¥šã§ãç§»è¡ã«ã¯ã³ã¹ãããããããæ³šæãå¿
èŠã CompositionLocal ã¯ã°ããŒãã«å€æ°ã®ããã«äœ¿ãããããšããããã³ã³ãã€ã«æã«ãšã©ãŒã«ãªããªããããªã¹ã¯ãããã ãªã©ãAndroidãKMPã®æåç·ãèµ°ã£ãŠããæ¹ã
ããDIã«é¢ããã話ãèãããšãã§ããŠããšãŠãå匷ã«ãªããŸããã Tackling Memory Issues on the Instagram Android App at Scale Instagramã®Androidã¢ããªã«ãããå€§èŠæš¡ãªã¡ã¢ãªåé¡ãžã®å¯ŸåŠæ³ã«ã€ããŠã®ã»ãã·ã§ã³ã§ããã ã¢ããªã§ãŠãŒã¶ãŒãã³ã³ãã³ããç·šéäžã«èœãšããªãããã®å·¥å€«ããã¡ã¢ãªãè¶³ããã«ã¢ããªãã¯ã©ãã·ã¥ããæã®èª¿æ»æ¹æ³ïŒHPROFãã¡ã€ã«ã䜿ã£ã調æ»ïŒã®èª¬æããããŸããã ç¹ã«å°è±¡çã ã£ãã®ã¯ãã¡ã¢ãªã«ã€ããŠè©³ãããªããããªãã Runtime.getRuntime() ããã /proc/meminfo ãããååŸã§ããããŒã¿ãªã©èŠããšè¯ããšãã现ããªã¢ããã€ã¹ããã£ãããšã§ãã倧åã®æ®éã®Androidãšã³ãžãã¢ã¯äžçè§Šããªãã ããå
容ã§ãããåè·ã§ã¡ã¢ãªãšåãåã£ãããšã®ããç§ã«ãšã£ãŠã¯ãšãŠãèå³ãæ¹§ãå
容ã§ããã The Future of Android...And How to Prepare For It Androidã®æªæ¥ãšãããã«åããŠã©ã®ããã«æºåãã¹ããã«ã€ããŠã®ããã«ãã£ã¹ã«ãã·ã§ã³ã§ããã AIã®é²åã«ãããã¹ã¯ãªããã ãã§éçºã§ããæä»£ãæ¥ãŠãããå°æ¥çã«ã¯ã³ãŒãã®70%ãAIã«ãã£ãŠçæãããã ããã ãšã³ãžãã¢ã¯ããè€éãªåé¡ã解決ããããã«åãããã«ãªã£ãŠããŠããã AIã«ããããžã·ã§ã³ã®åæžãªã©ããããŸãããéã«AIã®ãããã§ç§ãã¡ãããããåéã§åããããã«ãªããããããžãã£ããªåŽé¢ãå€ãããã ãã®ãããªã«ã³ãã¡ã¬ã³ã¹ã§ããããªäººãšåé¡ãªã©è²ã
ãªããšã«ã€ããŠè©±ãçããšã³ãžãã¢å士ã®äº€æµãéèŠã«ãªã£ãŠããã AIã«ããåŠã¶ããšãåãã容æã«ãªã£ãŠããã äžè¬çãªç¥èïŒããããªèšèªãåéïŒã身ã«ã€ããããšã倧åã ãšãã£ãçœç±ããããŒã¯ãè¡ãããŠããŸããã åŒç€Ÿã§ãAIã®æŽ»çšã¯ãšãŠãæšå¥šãããŠããã®ã§AIã䜿ã£ãéçºãæ¥åžžã«ãªãã€ã€ã¯ãããã®ã®ããã®ããã«ãã£ã¹ã«ãã·ã§ã³ãèããŠãç§ããã£ãšAIãæŽ»çšããŠä»ãŸã§ãããå€ãã®åéã§ãããå€ãã®äœæ¥éãããªãããšãã§ãã人æã«ãªããããªãšæããŸããã Career Office Hours with Stacy Devino Stacy Devinoæ°ã«ãããã£ãªã¢ã«é¢ãããªãã£ã¹ã¢ã¯ãŒã«ãè¡ããŸããã ãã£ãªã¢ãèããäžã§å€§åã ãšèšãããŠããããšã®ãã¡å°è±¡ã«æ®ã£ããã®ã¯ã çµæžçã«å®å¿ã§ããç¶æ³ãäœã AIã§ã«ããŒã§ããªãç¯å²ãªã© ãŠããŒã¯ãªã¹ãã«ãæã€ èªåãäœã楜ããã§ãäœãåŸæããèªèãã ããžãã¹ããã»ã¹ãå¹çåã«ã€ããŠåŠç¿ãã ã¬ã€ãªãã®å±æ© ãæããããäºåã«æºåãã ã®5ã€ã§ãã ã¬ã€ãªããæ¥æ¬ããã身è¿ãªã¢ã¡ãªã«ã ããããã®è©±ãèããŠãšãŠãçºã«ãªããŸããã Server Driven UIs: the future of cross-platform rendering architectures ãµãŒããŒé§ååUIïŒSDUIïŒã«ã€ããŠã®ã»ãã·ã§ã³ã§ããã SDUIã¯UIã®ããŒã¿ããµãŒããŒåŽã«æãããŠãåçãªUI倿Žãå¯èœã«ããä»çµã¿ã®ããšãªã®ã§ãããå人çã«ãšãŠã芪ãã¿ã®ããå
容ã§ããã ã¿ã€ããŒã§ãåãå
¥ãããããšå¬ãããªãšæããŸããã Google瀟å¡ã®æ¹ããã¹ããŒã«ãŒã®æ¹ã«è³ªåããŠãã åºçºåã«ç€Ÿå
ã®Androidã¡ã³ããŒã«èããŠããŠæ¬²ããããšããããæèŠãèããŸããã ããã§åºãŠããæèŠãå人çã«æ°ã«ãªã£ãŠããããšãGoogle瀟å¡ã®æ¹ããç»å£è
ã®æ¹ã«è³ªåããŠããŸããã 瀟å
ã§è³ªåãããããšãæ°ã«ãªãã»ãã·ã§ã³ãèããæã®miroã®ããŒã Googleã®æ¹ã«ã"Ask Android" Office Hours ã®æéã䜿ã£ãŠè³ªåãããŸããã ãGoogleçã«ãAdaptive layoutsãæšããŠããšæããã©ãæéããªããã¶ã€ããŒã察å¿ããããšæããæ
å ±ãã?ã ãAndroidçšã®MCPã£ãŠã©ããªã®ãããïŒã çã®è³ªåãããŸããã Googleã®æ¹ãš2察1ïŒGoogle瀟å¡ã®æ¹2人ãç§1人ïŒãšããèŽ
æ²¢ãªç°å¢ã§ãã£ã·ãæéã䜿ã£ãŠè³ªåããããšãã§ããŸããããŸããGoogle I/Oã®åç»ã«åºãŠããæ¹ãæ°äººãããçŽæ¥ã話ãã§ããŠãšãŠãã¯ã¯ã¯ã¯ããŸãããGoogle瀟å¡ã®æ¹ããããããããã¥ãŒãšãŒã¯ã ãããããªç¶æ³ã§è³ªåã§ãããšæãã®ã§ãdroidcon NYCã«æ¥ãç²æããã£ããšæããç¬éã®äžã€ã§ããã ãŸããããªãŒã®æéã§ããã£ãªã¢ã®ã»ãã·ã§ã³ãããŠããStacyãããšãã女æ§ã®æ¹ã«ãã£ãªã¢ãšè²å
ã«ã€ããŠã®è³ªåããããŠããã ããŸããã èªåã«ã¯ãŸã åäŸãããŸããããå°æ¥çã«å¿
èŠã«ãªããããããªãã¢ããã€ã¹ãå€ãããããŸãããç¹ã«ãåäŸãç£ãã ãè²ãŠãããšã¯æ³å以äžã«å€§å€ã ããééé¢ã§ãæéã®é¢ã§ãäœè£ãæã£ãŠããããšããªã¹ã¹ã¡ã ããããåäŸãšã®æéãä»äºäž¡æ¹å€§åã ãã©ããã®æã
ã§åªå
é äœã決ããŠè¡åããªãããåæã«äž¡æ¹ãå
šåã§ããã®ã¯å³ããããããšããèšèããšãŠãå¿ã«é¿ããŸããã ææ³ åããŠã®æµ·å€ã«ã³ãã¡ã¬ã³ã¹ã§ãããç·åŒµããŠããã®ã§ããããšã£ãŠã楜ããã£ãã§ãïŒ ç§ã¯ãŸã è±èªã«èŠææèããã£ãã®ã§ãããåèªèŠããã»ãã·ã§ã³ãç°ãªãããåŒç€Ÿã¡ã³ããŒã§åºãŸããã«å¥è¡åããããïŒãšãªããDay1ã®æå以å€ã®å€§åã®æéãå¥è¡åããŠããŸããããã®ãã£ã¬ã³ãžã®ãããã§èªåã®åã ãã§ãæµ·å€ã®æ¹ãšä»²è¯ããªãããšããèªä¿¡ãã€ããããšãã§ããŠãšãŠãå¬ããã£ãã§ãã ãŸããä»åã®droidconã¯AIã®è©±ãå€ããAIã®åœ±é¿ã«ããè¯ãé¢ãæªãé¢ã«ã€ããŠèããè¯ãæ©äŒã«ããªããŸãããäžèšã§ç޹ä»ããŠããªãã®ã§ãããStacyããã®ã»ãã·ã§ã³ã§ãAIã®åºçŸã¯Composeã®åºçŸãšäŒŒããããªãã®ã§ãæããå¿
èŠã¯ãªããæã
ã¯å€åã«å¯Ÿå¿ã§ãããããšãã話ãèããããžãã£ããªæå³ã§ãã£ãšAIãšä»²è¯ããªããããã«é 匵ãããšæããŸããã ä»åã®ã«ã³ãã¡ã¬ã³ã¹ã§åŠãã ããšãããããã®ãã£ãªã¢ã瀟å
ã§ã®æ¯ãèãã«æŽ»ãããŠããããã§ãã é¢é£èšäº productpr.timee.co.jp tech.timee.co.jp ããŸã è¡ããŸã§ã®æºå è±èªã®å匷ãããŸãããNative Campã§äŒè©±ãããç·Žç¿ãããããDuolingoã§ææ³ãåèªãå匷ããŸããããŸããè±èªã®ãã©ããæ¯æ¥èŠãŠãè±èªã«èŠªãã¿ãèŠããããã«ããŸããã ä»å¹ŽãGoogle I/Oã®åç»ã§ã¢ãã€ã«ã«é¢é£ãããã®ã¯ã»ãŒå
šéšèŠãŸãããå»å¹Žããè±èªã®å匷ãããç²æãããè±èªã§ã®èŠèŽã§ãã»ãŒåé¡ããªãã£ãã®ã§ã¹ã©ã¹ã©èŠãããšãã§ããŸããã droidcon NYC 2025ã®èªåçšã®ã¢ããªãäœããŸãããäœææã«ãŸã å
¬åŒã¢ããªããªãã£ãããã§ããåŸããåºãŠããã®ã§çšç¡ãã«ãªããŸããããAIãã©ãããã䜿ããããã®ãç¥ããè¯ãæ©äŒã«ãªããŸããã现ãããšã©ãŒãªã©ã¯æåã§ä¿®æ£ãã€ã€ã倧éšåã®ã³ãŒããAIã«æžããããšããã¹ã¿ã€ã«ã ãšçéã§ã¢ããªãäœããããšãããããŸããããã®çµéšã®ãããã§droidconã®äžã§è¡ãããŠããAIã®è°è«ã«ãããã€ããŠè¡ãããšãã§ããæ°ãããŸãïŒ I'll be attending droidcon NYC 2025ð» To save sessions I want to attend, I developed an Android application for personal use. While it's not a polished app, I used Cursor so it only took me about four hours to create. AI is very powerful ð pic.twitter.com/K2QbyoAkV7 — ð¥ãµãªã¡ð¥ (@_hunachi) June 21, 2025 芳å
ã«ã³ãã¡ã¬ã³ã¹ä»¥å€ã§ã¯ããã¥ãŒãšãŒã¯åžå
ã§èгå
ãæ¥œãã¿ãŸããã ãµããŠã§ã€ãªã©ã®ããŒã«ã«ãªé£²é£åºããããŒã«ã«ãªã¹ãŒããŒãè²ã
ãšè¡ããŸããã ãã£ã³ã¯ã¯ãããŒã奜ããªã®ã§ãè²ã
ãªãåºã§ã¯ãããŒãè²·ã£ãŠé£ã¹ãããããŸããã ã©ã®ãåºã®åºå¡ãããããããªãããšãæããŠãããããšãšãŠãåªããéãããããã£ãã§ããä¹ãé»è»ãããããªããªã£ãæããé§
å¡ãããšä»ã®ä¹å®¢ã®æ¹ã
ããã¡ããã¡ãäžå¯§ã«éãæããŠãããŠæåããŸããð ãŸãæ©äŒãããã°ãã¥ãŒãšãŒã¯ã«ãdroidconã«ãè¡ãããã§ãïŒ
ããã«ã¡ã¯ïŒã¿ã€ããŒã§Androidã䞻軞ã«ããªãããããã¯ããšã³ãžãã¢ãããŠããäžå·ã§ãã 6æ25, 26æ¥ã®2æ¥éããã¥ãŒãšãŒã¯ã®ãã«ãã¯ãªã³ã§éå¬ããã droidcon 2025 NYCã«åå ããŠããŸããã ä»åã®åå ã«ã¯ãå人çã«åŒ·ãåæ©ããããŸããã 30æ³ã«ãªãç¯ç®ã«ãæ¥æ¬ã ãã§ãªãäžçã§èªåããšã³ãžãã¢ãšããŠã©ã®äœçœ®ã«ããã®ãã確ããããã£ãã®ã§ãã ä»åãã®ãããªè²Žéãªæ©äŒãããã ããã®ã¯ãæ¥é ããæ¯ããŠãã ãã£ãŠãã瀟å
ã®é¢ä¿è
ã®çããŸã®ãçè§£ãšãæ¯æŽããããŠäžåšã®éãçŸå Žãæ¯ããŠãããããŒã ã¡ã³ããŒã®ãããã§ããå¿ããæè¬ããŠããŸãã ã¿ã€ããŒã«ã¯ãäžçäžã§éå¬ãããŠãããã¹ãŠã®æè¡ã«ã³ãã¡ã¬ã³ã¹ã«ç¡å¶éã§åå ã§ãããKaigi Passããšããå¶åºŠããããä»åã¯ãã®å¶åºŠãå©çšããŠã«ã³ãã¡ã¬ã³ã¹ã«åå ããŸããã詳ããã¯ä»¥äžãã芧ãã ããã productpr.timee.co.jp ç§èªèº«ããå
¥ç€Ÿããåã«ã¿ã€ããŒã®ãšã³ãžãã¢çµç¹ã«ã€ããŠèª¿ã¹ãŠããã2023幎ã«ãçŸåšã®ååã droidcon San Francisco ã«åå ããèšäºãèªã¿ããããã®ãšã³ãžãã¢ã®æé·ã匷ãåŸæŒãããŠãããå¶åºŠã«é
åãæããå®éã«å
¥ç€Ÿã決ããäžã€ã®å€§ããªèŠå ãšãªããŸããã productpr.timee.co.jp ä»åã®droidcon 2025 NYCã¯ãã¥ãŒãšãŒã¯ã® Brooklyn Storehouse ã§éå¬ãããŸãããäŒå Žã¯Storehouseãšããåã®éãå庫ã®åœ¢ãããŠãããããã10,000ã¡ã®åºå€§ãªã¹ããŒã¹ã§ã»ãã·ã§ã³ããšã«ä»åããèšããã«éå¬ãããŸããã ã«ã³ãã¡ã¬ã³ã¹äŒå Žã«ã¯é«ã5ã¡ãŒãã«ã»ã©ã®å·šå€§ãªããã€ããããèšçœ®ãããŠãããåããŠã®äººã§ããããã droidcon ã ããšæããããŠããã象城çãªååšã§ããã ãããããã以äžã«ååšæãæŸã£ãŠããâèŠããªã 象 âãããŸããââãã㯠AIãšã¬ã€ãªã ã§ãã Youâre Not an Android Developer Anymore (Keynote) Stacy Devino å
šç±³ã®ã¿ãªããäžçäžããAndroidãšã³ãžãã¢ãéãŸãã«ã³ãã¡ã¬ã³ã¹ã®åã£ç«¯ããããããªãæ žå¿ãçªãã¿ã€ãã«ãç»å ŽããŸããã"ããããã®åŸ
ã£ãŠããâŠUSAâŠ" ãšã¿ã€ãã«ãèŠãæããæããŠããŸããã ä»ãã¢ã¡ãªã«ã«ã¯å€§ããªã¬ã€ãªãã®æ³¢ãæ¥ãŠãããå®éã«ã¬ã€ãªãããããŠä»äºãæ¢ããŠãã人ãåšãã«ããããšãã質åã«å¯ŸãçŽ7å²ã®äººãææããŠãããã¢ã¡ãªã«ã®ITæ¥çã®çŸç¶ãèã§æããæ©äŒã«ãªããŸããã ã»ãã·ã§ã³ã§ã¯Stacyãé·å¹Žã«ããããããŸããŸãªäŒæ¥ã§ Android ãšã³ãžãã¢ãšããŠæŽ»èºããŠããçµéšãããšã«ãããããã®æä»£ã«çãæ®ãããã®æŠç¥ãèªããŸããã AIã®é²åã«ãã£ãŠããããã¯ããããŒãžã£ãŒããã¶ã€ããŒãªã©ã®ãšã³ãžãã¢ä»¥å€ã®è·çš®ã§ãããçšåºŠã®æ©èœãäœããç°å¢ã«ãªã£ãŠããŠããŸãã ãããŠä»åŸãã¢ãã«ãé²åããã誰ã§ããœãããŠã§ã¢ãäœããæä»£ãæ¥ããããããªãââãã®äžã§ãAndroidãšã³ãžãã¢ããœãããŠã§ã¢ãšã³ãžãã¢ã¯ã©ãããã¹ããïŒãåããããã»ãã·ã§ã³ã§ããã ã»ãã·ã§ã³ã®äžã§èªãããŠãã åé¡è§£æ±ºã«ãã©ãŒã«ã¹ããããš èªåã®å°éé åã«ãšããããè¶å¢ãããããš å°ããªè·èœæšªæããŒã ã§ãŽãŒã«ã«åãã£ãŠåãããš ãããã¯ãŸãã«ãã¿ã€ããŒã«ãããSAããŒã ã®ãããã¯ããšã³ãžãã¢ã®ã¹ã¿ã€ã«ãšåŒ·ãéãªãéšåã§ãèŽããŠããŠéåžžã«å
±æããŸããã docs.google.com "Ask Android" Office Hours Google's Android DevRel team ããŸããŸãªã»ãã·ã§ã³ã®è£ã§èªç±ã«Googleã®Android DevRel teamã®ã¡ã³ããŒã«ãªãã§ã質åãããããšãã§ãã"Ask Android"ã«ãåå ãããŸããããã®äŒã¯ç¹ã«ãã¡ã·ãªããŒã¿ãŒãã«ãŒã«ãªã©ã¯ãªãããã®å Žã«ããGoogleã®Android DevRel teamã®ã¡ã³ããŒãæãŸããŠããããªè³ªåãã¶ã€ããããšãã§ããŸããã å®éã«Composeã«æ³šåãããŠããAlexã«è©±ãèãæ©äŒããããEdge to edge察å¿ãLarge Screen Device, Material Designã«ã€ããŠããŸããŸãªè©±ïŒããã«ã¯æžããªãè£è©±ãå«ããŠïŒãèãããšãã§ãã貎éãªæéã«ãªããŸããã 圌ãã®ãããªã©ã€ãã©ãªãæäŸããåŽãããããšãéã«ã¢ããªã±ãŒã·ã§ã³ãéçºãããšã³ãžãã¢ãã©ããªããšãèããªããã¢ããªãäœã£ãŠãããã«èå³ãããããäºãã«æ
å ±äº€æãããæ©äŒã«ããªããŸããã Alexã¯Handling configuration changes in Composeãšããã¿ã€ãã«ã§2æ¥ç®ã®ã»ãã·ã§ã³ã«ãç»å£ãããŠããããã®"Ask Android" Office Hoursããã£ããã«åœŒã®ã»ãã·ã§ã³ãèŽè¬ããã®ã§ããããªããšComposeã®åäœã«é¢ããäŸã§å®éã«UIãã¹ã©ã€ãå
ã§åäœããŠãããããã¯ãããâŠãšæããªããæåŸãŸã§èããŠãããšããã¯ãã¹ã©ã€ãèªäœãComposeã§ã§ããŠãããComposeãæäŸããŠããåŽãªãã§ã¯ã®ãå§åçãªç±éã«é©ããããŸããã https://alex.vanyo.dev/talks/configurationchanges/ Career Office Hours with Stacy Devino å
è¿°ããStacyãšåå è
ãåã«ãªã£ãŠåº§ãããã£ãªã¢ã®çžè«ãããäŒã§ããããã®ã»ãã·ã§ã³ã«ã¯ã¹ã©ã€ããã¢ãžã§ã³ãããªãé²ç»ããããŸãããçŽç²ã«ããããã®ãã£ãªã¢ã®çžè«ãStacyãšäžç·ã«èããäŒã§ããã çžè«ã®å
容ã¯ã¬ã€ãªãã®æ³¢ããããããªãæ·±å»ãªãã®ãå€ãã£ãã§ããåã
人ã®è©±ã§ããã®ã§ããŸã詳现ã«ã¯è§Šããªãã®ã§ãã å®éã«ã¬ã€ãªãã«ãã£ã ãããŒãžã£ãŒããICã«æ»ãããšã«å¯Ÿããèè€ Native/Flutter/React Nativeãªã©ããŸããŸãªã¢ãã€ã«éçºææ³ã«æãåºãããã©ããæ·±æãã§ããŠãããèªä¿¡ãæãŠãã«æ©ãã§ãã 倧åŠã§CSãåŠãã ãå
¥åŠæãšåæ¥æã§ããŒã±ãããæ¿å€ããŠããŠå°±è·ã«èŠããã§ãã ãªã©èããŠããŠèžãèŠãããªããããªè©±é¡ãå€ããããŸããããã®ãããªå°é£ãªçžè«ã«å¯ŸããŠãStacyã®æã¡åã®ããžãã£ãããšããããŸã§ã®çµéšã«åºã¥ãç確ãªã¢ããã€ã¹ã«ãã£ãŠ40åéã®ã»ãã·ã§ã³ã§ããããåå è
ã¯ã»ãã·ã§ã³åŸã«ã¯åããã¯æããé¡ã«ãªã£ãŠããã®ããã®å Žã§æããŸããã ãªããçŸå°ã«è¡ããããšã倧ããªæå³ãæã€ã®ãïŒ ãã®èšäºã®å·çæç¹ã§ã¯å
¬éãããŠããŸããããä»åã®droidconã®åç»ã¯äŸå¹Žéãã§ããã°ã€ã³ã¿ãŒãããäžã«å
¬éãããŸããããããªããå®éã«è¶³ãéã°ãªããã°åŸãããªãäœéšãããããçµéšããããšãã§ããŸããã ã«ã³ãã¡ã¬ã³ã¹ã¯ã»ãã·ã§ã³ãèãã ãã®å Žæã§ã¯ãªãã³ãã¥ããã£ãååšããå Žæã§ãã åç»ãåŸããã¢ããããŒããããã«ã³ãã¡ã¬ã³ã¹ã§ãçŸå°ã§ããåŸãããªãäœéšãå€ãååšããäŸãã°ä»¥äžã®ãããªãã®ãæããããŸãã çŸå°ã§ã®åºäŒãããã£ããã«ãå®éã«ä»äºã決ãŸãããšããã ã»ãã·ã§ã³å€ã§ã¹ããŒã«ãŒã«ããŸããŸãªè³ªåãã¶ã€ããããšãã§ãã ææ©ãäŒå Žã«å
¥ã£ãŠStacyã®ãããªæåãªãšã³ãžãã¢ãèŠã€ããŠäŒå Žã§æé£ãé£ã¹ãªãã話ãããããšãã§ãã æåãªäººãæãŸãããšèªç¶ãšäººãéãŸã£ãŠããŠãããŸããŸãªè°è«ãå§ãŸã£ãããã ã»ãã·ã§ã³åŸã«ã¹ããŒã«ãŒã«ã»ãã·ã§ã³ã«é¢é£ããããšãããã以å€ã®æ°ã«ãªãããšã質åããããšãã§ãã Androidãšããå
±éã®è©±é¡ãããŒã¹ã«ãã£ãªã¢ã ãã§ãªããã©ã€ããŒãã«ã€ããŠã話ãããããšãã§ãã Jake Whartonãšè©±ãããŠèšå¿µåçãæ®ãããšãã§ãã äžçäžã®ãšã³ãžãã¢ãéãŸãå Žã§æããããš äžçãšæ¯ã¹ãŠããã¿ã€ããŒã®ãšã³ãžãã¢ãã¡ã¯ååã«æŠããŠãããšæããŸãã æåOSSãJetpackã©ã€ãã©ãªã®éçºè
ãªã©ãäžççã«æŽ»èºããŠãããšã³ãžãã¢ãã¡ã¯ããã¯ãå§åçã§ãã jakewharton.com ãã¹ãŠã®ã»ãã·ã§ã³ãäžèšã®Jakeã®ã»ãã·ã§ã³ã®ãããªAdvancedãªå
容ã§ã¯ãªããèªåãããçšåºŠç¥ã£ãŠããå
容ã®ã»ãã·ã§ã³ãäžå®æ°ãããèªåããã€ãããã®èå°ã«ç«ãŠããããããªããšããåžæãæãŠãŸãã éçšã«ã€ããŠæ¹ããŠèãçŽããã£ããã« ä»åã®ã«ã³ãã¡ã¬ã³ã¹ãéããŠãèªåèªèº«ã®ãã£ãªã¢ã ãã§ãªãããéçšããã®ãã®ã«ã€ããŠãèãçŽãæ©äŒã«ãªããŸããã ã¢ã¡ãªã«ã®å€§èŠæš¡ãªã¬ã€ãªãã®æ³¢ãç®ã®åœããã«ãããããŸã§å®å®ã ãšæã£ãŠããâæ£ç€Ÿå¡âãšããç«å ŽããäŒæ¥ã®æ¹éãåžæ³ã®åœ±é¿ãåããŠç°¡åã«å€ããããçŸå®ã宿ããŸãããäžæ¹ã§ãå人ãšããŠæŠåšãæã¡ãã©ãã«ããŠã䟡å€ãçºæ®ã§ããç¶æ
ã§ããããšã®éèŠæ§ã匷ãæããŸããã ã¿ã€ããŒãšãããåãæ¹ãã«åãåã£ãŠããäŒç€Ÿã§åãèªåãã âéçšãšã¯äœãâ ãã¢ã¡ãªã«ã®çŸå°ã§åãçŽããšããã®ã¯ããšãŠã象城çãªäœéšã ã£ãããã«æããŸãã ããŸã æå·®ãã±ãèæ
®ããŠã¹ã±ãžã¥ãŒã«ãçµãŸããŠããã ããã«ã³ãã¡ã¬ã³ã¹ã®ãªãæ¥ã¯ããã£ãããã¥ãŒãšãŒã¯ãŸã§è¡ã£ãã®ã§ã芳å
ãæ¥œããããšãã§ããŸããïŒãã¡ããä»äºãã¡ãããšããŠããŸããïŒã ãã€ããã¥ãŒãžã¢ã ã®èå°ã«ãªã£ãã¢ã¡ãªã«èªç¶å²åç©é€š ãããŒããŠã§ã€ã«ãŠãã€ã±ã«ãžã£ã¯ãœã³ã®åçããã¥ãŒãžã«ã«ã«ããMJ the Musical
ããã«ã¡ã¯ïŒã¿ã€ããŒã§Backend EngineerãããŠãã @akitoshiga ã§ãïŒ 7æ3æ¥ïŒæšïŒã7æ4æ¥ïŒéïŒã«æ±äº¬ã®äžžã®å
ã§éå¬ããããéçºçç£æ§Conference2025ãã«åå ããŠããŸããïŒð dev-productivity-con.findy-code.io èªèº«ã¯7æ3æ¥ïŒæšïŒã®Day1ã«çŸå°åå ããã®ã§ããã®æã®æ§åãæ¯ãè¿ã£ãŠã¿ãããšæããŸãïŒ åœæ¥ã®æ§å é¢è¥¿åšäœã®èªåã¯ãKaigi Passããšãã瀟å
å¶åºŠãå©çšããŠåå ããŸããã ãKaigi Passããšã¯ãäžçäžã§éå¬ãããŠãããã¹ãŠã®æè¡ã«ã³ãã¡ã¬ã³ã¹ã«ç¡å¶éã§åå ã§ããå¶åºŠã§ãã productpr.timee.co.jp äŒå Žã¯JPã¿ã¯ãŒããŒã«&ã«ã³ãã¡ã¬ã³ã¹ãšããæ±äº¬é§
è¿ãã«ããäŒå Žã§è¡ãããŸããã æåã®ã»ãã·ã§ã³ã§åºèª¿è¬æŒãè¡ã£ãã®ã¯ã±ã³ãã»ããã¯æ°ã§ããã 圌ã®ãã¡ã³ã§ããèªèº«ã¯ä»åèŽè¬ã§ããŠæç¡éã§ããã Day1 KeynoteãKent Beck @KentBeck æ° 11æããã¯ãµã€ã³äŒã宿œããŸãïŒâïž #éçºçç£æ§con_findy #éçºçç£æ§con_findy_A pic.twitter.com/s0COYqZCY2 — éçºçç£æ§Conference/Developer Productivity Engineering (@dpe_findy) 2025幎7æ3æ¥ ãã®åŸã®ãµã€ã³äŒã§ã±ã³ãã»ããã¯æ°ã«ãµã€ã³ãããããŸããïŒ ãµã€ã³äŒã®å Žã§åœŒã«å¯Ÿããæ³ããšæè¬ãçŽæ¥äŒããããšãã§ããŠå¬ããã£ãã§ãã ãµã€ã³äŒã®åŸãã¹ãã³ãµãŒããŒã¹ãåã£ãŠã¿ãã®ã§ãããéåžžã«çæ³ã§ããã ããŒã¹ããããããããŸãããããã以äžã«åå è
ã®å€ãã«å§åãããŸããã ã¿ã€ããŒã®ããŒã¹ããããªæãã§åºå±ããŠããŸããïŒ ïŒŒ #éçºçç£æ§con_findy ããŒã¹ç޹ä»âš ïŒ æ ªåŒäŒç€Ÿã¿ã€ããŒæ§ @TimeeDev pic.twitter.com/lq9LWwyE8y — éçºçç£æ§Conference/Developer Productivity Engineering (@dpe_findy) 2025幎7æ3æ¥ ãŸããã¿ã€ããŒããã¯ãã©ãããã©ãŒã ãšã³ãžãã¢ãªã³ã°éšéšé·ã®æ©ç°ãç»å£ããŸããã åå ããã»ãã·ã§ã³ èªèº«ãåå ããã»ãã·ã§ã³ã«ã€ããŠãããã€ã玹ä»ãããããšæããŸãã åºèª¿è¬æŒïŒéçºçç£æ§æž¬å®ã®ãã¬ãŒããªã ãã°ããããŒãã®æ³åãã¯ãã£ãšæ²èгçã«æããã¹ãã ã£ã ã±ã³ãã»ããã¯æ° åé ã§ãç©äºãããè¯ãããããšããŠããã£ãŠçµæãæªããªã£ãŠããŸãããšããæšã®ãã€ãã®ããšããã玹ä»ããŠãããèŠæèŠæã§ãã¡ãã«èšåããŠããã®ãå°è±¡çã§ããã ãã°ããããŒãã®æ³åããšã¯ãææšãç®çã«ãªã£ãé端ããã¯è¯ãææšã§ã¯ãªããªããããšãèšãããã§ããããæå±ããè±åœã®çµæžåŠè
ã®ååã«ã¡ãªãã§åä»ããããããã§ãã çç£æ§åäžã®ããã«ææšãèšã枬å®ãããšããŠããéçºè
ã«ãã¬ãã·ã£ãŒãããããšãã®ææšãéæããããšãç®çã«ãªã£ãŠããŸããšäž»åŒµããŠããŸããã ã¿ã€ãã«ã«ããã£ãšæ²èгçã«æããã¹ãã ã£ãããšãããŸããããã®ãããªææšã®ç®çåçŸè±¡ã¯æã
ã®æ³å以äžã«èµ·ãããããããŸããããããªãšããã§ãã®ãããªå Žé¢ã«ã±ã³ãã»ããã¯ã¯çŽé¢ããŠããããã§ãã å®éã«ãã®ãããªäºæ
ã¯èª°ãããäžåºŠã¯çµéšãããã®ã§ã¯ãªãã§ããããã ãã®ããšã«ã€ããŠãéçºè
ã«ã¯ãã¬ãã·ã£ãŒããããã®ã§ã¯ãªãç®çæèãå
±æããããšãéèŠã ãšäž»åŒµãããŠããŸããã ãŸããæž¬å®ããããšèªäœã¯è¯ãããæ±ºããŠç®æšã«ããŠã¯ãªããæž¬å®ã®ãã€ã³ãã«ã泚æãå¿
èŠã ãšäž»åŒµããŠããŸããã ã±ã³ãã»ããã¯æ°ã¯ãPath of ValueããšããŠä»¥äžã®4ã€ã®ããã»ã¹ã玹ä»ããŸãã Effort ã³ãŒããæžãããš Output å
·äœçãªææç©ïŒç»é¢äžã®ãã¿ã³ãªã©ïŒ Outcome ãŠãŒã¶ãŒã®äŸ¡å€å€å®¹ Impact ãŠãŒã¶ãŒã®è¡åå€å®¹ 1ãã4ã«è¡ãã»ã©æž¬å®ã¯ãã¥ãããããŠãŒã¶ãŒã®äŸ¡å€ã«ã€ãªãããããæž¬å®ã®å€æã¯å
éãã«ããŠãªãã¹ãåŸãã®ããã»ã¹ã§æž¬å®ããããšãæšå¥šããŠããŸããã æåŸã«ã°ããããŒãã®æ³åã«å¯Ÿå¿ãã圢ã§ä»¥äžãçµè«ã¥ããŸããã Observe laterïŒèšæž¬ã¯ãªãã¹ãé
ããåŸãã®æ®µéã§è¡ãïŒ Encourage awarenessïŒæ°ã¥ãã奚å±ããïŒ Avoid pressureïŒãã¬ãã·ã£ãŒããããããšé¿ããïŒ Instill purposeïŒç®çæèãå
±æããïŒ ãã°ããããŒãã®æ³åãã«åºã¥ãã±ã³ãã»ããã¯æ°ã®äž»åŒµã¯ãããçš®åœç¶ãšèšãã°åœç¶ã®ããã«ãæãããã®ã§ããã圌ããã®äž»åŒµãããããšã«ãã®ãããæå³ããããšæããŸããã éçºããã»ã¹ã«ãããæ¬è³ªçãªéšåãããŒãã«ãã圌ãããçºè¡šã ãšæããŸããïŒ NTTããŒã¿ã«ããçæAI掻çšïŒéçºå¹çåãšããžãã¹å€é© æ ªåŒäŒç€ŸNTTããŒã¿ã°ã«ãŒã 海浊 éäžæ° NTTããŒã¿ã¯2025幎7æã«Apps&Dataæè¡éšããAIæè¡éšãžãšçµç¹æ¹ç·šããŠçæAIã®æŽ»çšãæ¬æ Œçã«æšé²ããŠããããããŸã§ã®ããã·ã§ã³ã¯ãªãã£ã«ã«ãªã·ã¹ãã æ§ç¯ã§å¹ã£ãçç£æ§åäžããŠããŠãåºç€ã«ãéçºã¹ããŒãåäžãšåè³ªç¶æã®äž¡ç«ãç®æããŠããããã§ãã åãçµã¿ã®ããŒãããããšããŠã¯èªååã®æ®µéçæšé²: 2023幎ã®ã¿ã¹ã¯èªååããå§ãŸãã2025幎ã«ã¯ããã»ã¹èªååã2027幎ã«ã¯ããžãã¹å
šäœã®èªååãç®æããŠãããæ¢ã«250以äžã®ãããžã§ã¯ãã§AIãæŽ»çšããŠãããšã®ããšã§ããã äž»ãªåãçµã¿ãšææãšããŠä»¥äžã«ã€ããŠç޹ä»ããŠããŸããïŒäžéšïŒ ã¢ããã€ãŒãŒã·ã§ã³ãšã¬ã¬ã·ãŒã·ã¹ãã ã®è§£æ Figmaããã®Reactã³ãŒãçæïŒLocofyïŒ ãœãŒã¹ã³ãŒãããã®éçºããã¥ã¡ã³ãã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã° OSSããã®ããã¥ã¢ã«çæãªã©ã«ãããã·ã¹ãã ã®çè§£ãšä¿å®ã«ãããå·¥æ°ãåæž å±äººå鲿¢ãšããã¥ã¡ã³ãäœæã®å¹çå æèè
ã®æé»ç¥ã圢åŒç¥åããç¬èªæ§åŒã®èšèšæžãæšæºåœ¢åŒã«å€æãããCoding by NTT DATAãã®æŽ»çš ExcelããMarkdownãžã®å€æãªã©ãAIãèªã¿åãããããã©ãŒããããæ¡çš éçºããã»ã¹ã®å段éã§ã®AIæŽ»çš GitHub CopilotãAzure OpenAIãå©çš èšèšæžããã®çµåãã¹ãé
ç®ãäœæ ãããªãçç£æ§åäžãžã®å±æãšããŠéçºå·¥çšå
šäœã®çç£æ§åäžãç®æããèŠæ±åæããçŽæ¥ã³ãŒããçæãããã®åŸèšèšæžããªããŒã¹ãšã³ãžãã¢ãªã³ã°ãããéWã¢ãã«ããšãã£ãæ°ããéçºããã»ã¹ã®å®çŸã暡玢ããŠããããšãéåžžã«å°è±¡çã§ããã å
šäœçã«AIãäžå¿ã«æ®ããŠæå€§éAIã®æ©æµãåããããããã«éçºããã»ã¹ãèšèšããŠããããã«èŠåãããè峿·±ãã£ãã§ãã ãŸããå€çš®å€æ§ãªãããžã§ã¯ãã«æºãã£ãŠãã匷ã¿ã掻ãããŠã·ã¹ãã éçºã«ãããå
šåã«æž¡ã£ãŠå®è·µã»ãã£ãŒãããã¯ã»åœ¢åŒç¥åã»æšªå±éãè¡ããŠããã®ãçµç¹ãšããŠéåžžã«é
åçã«æããŸããïŒ çæAIæä»£ã®å質ä¿èšŒïŒèªååãšAIã«ãããã¹ãæ¹å speakerdeck.com mablæ ªåŒäŒç€Ÿ å°ç° ïšå¹³æ° çŸç¶ãåãå·»ãQAã®åé¡ç¹ãšããã®ãœãªã¥ãŒã·ã§ã³ãšããŠAIãšãŒãžã§ã³ãã«ããèªåŸåãã¹ãã玹ä»ãããŠããŸããã QAã«é¢ããŠèª²é¡ãæ±ããŠãããšããã¯å€ãããã§ãç¬èªã¢ã³ã±ãŒãã«ãããšå¯Ÿè±¡è
ã®6å²ãæåã§ã®ãã¹ã察å¿ãè¡ã£ãŠãããšã®ããšã§ããã ãã®èæ¯ã«ã¯ä»¥äžã®åé¡ãããããã§ãã ä¿å®ã³ã¹ã åºç€ã®æ§ç¯ãšå®æœã³ã¹ã ãã¬ããžäžè¶³ ç¹ã«AIã®å°é ã«ãããããã€é »åºŠã®å¢å ãšåè³ªç¶æã®èŠæ±ãé«ãŸãäžã§ããã¹ãã®èªååãšAIã®æŽ»çšãäžå¯æ¬ ã§ãããšããããšã匷調ãããŠããŸããã ãããã®èª²é¡ã®ãœãªã¥ãŒã·ã§ã³ãšããŠAIãæŽ»çšãããã¹ããããŒãžãããŒã«ã®ææ¡ããããŠããããmablããšãããµãŒãã¹ãããŒã¹ãšããŠä»¥äžã®ãããªãã¹ããããŒãžãããŒã«ã®æ©èœã«ã€ããŠç޹ä»ãããŠããŸããã ãããŒãžãããŒã«ã®æŽ»çš çæAIã«ãããã¹ãèªå修埩æ©èœã§ã¡ã³ããã³ã¹ã³ã¹ããåæž AIã«ããããŒã¿åæã»æšè« ãã¹ããã°ããã®åå åæãflakyãã¹ããžã®å¯Ÿå¿ èªç¶èšèªã§ã®ãã¹ãæ§ç¯ ãŠãŒã¶ãŒã¹ããŒãªãŒãããã¹ãã±ãŒã¹ãèªåçæ CI/CDç°å¢ãšã®çµ±å ã·ãŒã ã¬ã¹ãªãã¹ãããã»ã¹ãå®çŸ AIãæŽ»çšãããã¹ãããŒã«ã¯ãããŸã§è©³ãã远ã£ãŠããªãã£ãã®ã§æ³å以äžã®å€æ©èœã»é«æ©èœãã«é©ããŸããïŒ éçºé床ã®åäžã«äŒŽãè¿
éãªQAã¯ä»åŸããæ±ããããŠããã®ã§ããããã£ãããŒã«ãäžå¯æ¬ ã«ãªã£ãŠããããã ãšæããŸããã æ¥œå€©ã®AIæŠç¥ïŒ70以äžã®ãµãŒãã¹éå¶ãšéçºçç£æ§åäž æ¥œå€©ã°ã«ãŒãæ ªåŒäŒç€Ÿ ä¹
ç° çŽæ¬¡éæ° æ¥œå€©ã°ã«ãŒãã®å±éãã70以äžãµãŒãã¹ã®äžã§ãAIãäºæ¥æé·ãšéçºçç£æ§åäžã®äž¡èŒªãšããŠæŽ»çšããŠããçŸç¶ã玹ä»ãããŠããŸããã æ¥œå€©ã°ã«ãŒãã®AIæšé²æŠç¥ãšããŠãããªãã«20ããæã¡åºããŠããŸãã ãã®æŠç¥ã¯AIãæŽ»çšããŠããŒã±ãã£ã³ã°ã»ãªãã¬ãŒã·ã§ã³ã»ã«ã¹ã¿ããŒãµããŒãã®å©çããããã20%åäžãããããšã§ã幎é105ååã®å©çè²¢ç®ãç®æšãšããŠããŸãã 瀟å
ã§ã®AI掻çšã¯éåžžã«å¹æãåºãŠããããã§ãæ¢ã«16,000å以äžã®AIããŒã«ã»ãã³ãã¬ãŒããäœæãããå¶æ¥è³æã®äœææéã¯48%æžãããžãã¹ã¡ãŒã«äœææé54%æžãªã©ã®å¹æãåºãŠãããšã®ããšã§ããã ãŸããæ°ããªäºæ¥ãšããŠãRakuten AI for Businessããéå§ããŠããäžè¬ãŠãŒã¶ãŒåãã«äºåã»å¶æ¥ã»äŒç»/ããŒã±ãã£ã³ã°ã»ãšã³ãžãã¢åããµãŒãã¹ãæäŸããŠããããã§ãã ããã ãã§ãªãããRakuten AI LLMããšããèªç€ŸLLMã®éçºãè¡ã£ãŠãããçšéã«åãããæé©åã»æ¥æ¬äŒæ¥ã«åãããèšèšã»æ¥æ¬èªæ§èœã®é«ãã匷ã¿ãšããŠããããã§ã éçºã«ãããAI掻çšã§ã¯ã³ãŒãã£ã³ã°ãæãå€ããGitHub Copilotãªã©ã®çæAIã³ãŒãã£ã³ã°ããŒã«ã®å°å
¥PoCã§äžå®ã®å¹æã確èªããŠãããšã®ããšã éçºãµã€ã¯ã«ã¿ã€ã ã®ããŒã¿åéãšæšæºçãªå¯èŠåãé²ããŠããã30%ïœ80%ã®éçºå¹çåæžãç®æããŠããããã§ãã æ¥œå€©ã°ã«ãŒãã«ã¯çŽ30,000人ã®åŸæ¥å¡ã®æ¹ãããããã§ãAIã«ããæ¥åå¹çåã®ã€ã³ãã¯ãã¯éåžžã«å€§ãããšæããŸããã ãŸããèªç€Ÿã§æ¥æ¬èªæ§èœã匷ã¿ã«ããLLMãéçºãããŠããã®ãéåžžã«è峿·±ããã©ããã£ããšããã§æŽ»çšãããŠããã®ãã«ã€ããŠãèå³ãæ¹§ããŸããã ãŸãšã éçºçç£æ§Conferenceã«ã¯ä»ååããŠåå ããã®ã§ãããå瀟ã®éçºçç£æ§ã«å¯Ÿããæ§ã
ãªåãçµã¿ãåå è
ã®ç±éãæããŸããã ä»ååå ããŠåŸãç¥èŠãèªèº«ãåšãã®éçºã«ã掻ãããããçç£çãªãããã¯ãéçºãè¡ã£ãŠãŸãããŸãïŒ ãç¥ãã éçºçç£æ§Conference2025ã§ã¿ã€ããŒãšåããç»å£ããããã°ã©ã¹ãããDELTAãããšååã§ãçç£æ§æ¹åãNightããšé¡ããã¢ãã¿ãŒã€ãã³ããéå¬ããŸãïŒ ãéçºçç£æ§ Conference 2025ãã«åå ãããæ¹ã¯ãã¡ãããéçºçç£æ§ã®åäžãã瀟å€ã®ãšã³ãžãã¢ãšã®äº€æµã«èå³ãããæ¹ã倧æè¿ã§ãã®ã§ãã²éã³ã«æ¥ãŠãã ããïŒ timeedev.connpass.com
ããã«ã¡ã¯ïŒã¿ã€ããŒã§ããã¯ãšã³ãã®ããã¯ãªãŒããããŠããæ°è°·ïŒ @euglena1215 ïŒã§ãã æè¿ãç§ãã¡ã®ããŒã ã§ã¯èªåŸå AI ãšãŒãžã§ã³ã Devinã®æŽ»çšãåºãã£ãŠããŸããç¹ã«ãGitHub Actionsã®ã¹ã±ãžã¥ãŒã«å®è¡ãç¹å®ã®ã€ãã³ããããªã¬ãŒã«ãå®åçãªã¿ã¹ã¯ãDevinã«ä»»ãããšãã£ãäœ¿ãæ¹ã詊ããŠããŸãã ããããDevinã䜿ãããªãããšãããšãå€ãã®æ¹ããããªèª²é¡ã«çŽé¢ããã®ã§ã¯ãªãã§ããããã ãæåã«äœã£ãããã³ããã§ã¯ããªããªãæåŸ
éãã®ã¢ãŠãããããåºãŠããªãâŠã çµå±ãäœåºŠã远å ã®æç€ºãç¹°ãè¿ããŠãããããæãçµæã«ãã©ãçããããã¯ãAIããããããšãèšããç¶æ³ã§ãããããããŠãæ¬åœã«å€§å€ãªã®ã¯ããããã§ããä»åã®ããåãã§åŸãç¥èŠãæ¹åç¹ããæ¬¡åã®å®è¡ã®ããã«å
ã®ããã³ãããžæåã§ãã£ãŒãããã¯ããäœæ¥ããããå°å³ã«é¢åã§ãã€ãåŸåãã«ããŠããŸããã¡ã§ãã ããã§ç§ãã¡ã¯ããã®ããã³ããã®æ¹åäœæ¥èªäœãDevinã«ä»»ãããšãããé¢çœã詊ã¿ãå§ããŸãããä»åã¯ãã®å
·äœçãªææ³ãšãããã«ãã£ãŠåŸãããã¡ãªããã«ã€ããŠã玹ä»ããŸãã é¢åãªããã³ããä¿®æ£ã¯ãDevinèªèº«ã«ãä»»ã Devinãšã®æ°åã®ã©ãªãŒãçµãŠãã¿ã¹ã¯ãç¡äºã«å®äºãããšããŸããããã§ãDevinã«æ¬¡ã®ãããªããã³ãããæããããŸãã ä»åç§ãè¡ã£ãææããæ¬¡å以éã¯ããªããŠæžãããã«ã{ããã«GitHub Actionsã®YAMLãã¡ã€ã«ã®ãã¹} ã«èšèŒããŠããããã³ããã«å€æŽãå ããŠãã ããã ãã£ãããã ãã§ããããã«ãããDevinã¯ä»ãŸã§ã®ããåãããã¹ãŠåŠç¿ãã人éããã®ãã£ãŒãããã¯ãåæ ããæ°ããããã³ãããèªãçæããŠãããŸãã Pull Requestã«ãã倿޿æ¡ã§ãã¬ãã¥ãŒãç°¡å ããã«ãç§ãã¡ã¯Devinã«æ¬¡ã®æ¡ä»¶ã远å ã§æç€ºããŠããŸãã æ¡ä»¶ 倿Žå
容ã¯ãæ°ããPull RequestãšããŠäœæããŠãã ããã ä»åã®ããåãã§è¿œå ããæç€ºãšãæ¢åã®ããã³ããã«æå³çã«éè€ããéšåãããã°ãããããçµ±åããŠããã³ããå
šäœãæé©åããŠãã ããã ãã®æç€ºã«ãããDevinã¯ããã³ããã®å€æŽå
容ããŸãšããPull Requestãèªåã§äœæããŠãããŸãã Devinãäœã£ãŠãããPull Request ãšã³ãžãã¢ã¯ããã®Pull Requestãã¬ãã¥ãŒããã ãã§OKã§ãã æ°ããããã³ããã§ãã¹ã: å®éã«æ°ããããã³ããã䜿ã£ãŠDevinã«ã¿ã¹ã¯ãäŸé Œããæå³éãã®ã¢ãŠãããããåºããã確èªããŸãã è©äŸ¡ãšããŒãž: æ¹åãããå Žå: Pull RequestãããŒãžããããã³ãããã¢ããããŒãããŸãã å€ãããªãã»æªåããå Žå: ããŒãžã¯ããããªãæåŸ
éãã«ãªããªãã£ãã®ããDevinã«å床ãã£ãŒãããã¯ããŸãããã®ãµã€ã¯ã«ãç¹°ãè¿ãããšã§ãããã³ããã¯ç¶ç¶çã«æŽç·ŽãããŠãããŸãã AIãçæããã³ãŒããèŠãªããŠè¯ãæä»£ã¯ãŸã å
ããã§ã⊠ãAIãšãŒãžã§ã³ããæžããã³ãŒããã人éãäžåã¬ãã¥ãŒããªããŠè¯ãããšããæªæ¥ã¯ããŸã å°ãå
ãããããŸãããããããAIãšãŒãžã§ã³ãã«äžããããã³ãããã人éãéäžã¡ã³ããã³ã¹ããªããŠãè¯ãæä»£ã¯ãããç®ã®åã«æ¥ãŠãããšæããŠããŸãã Devinã«ããã³ããèªèº«ãæ¹åãããã¢ãããŒãã¯ãåãªãäœæ¥å¹çåã«çãŸããŸãããããã¯ãAIãåãªãããŒã«ãšããŠäœ¿ãã®ã§ã¯ãªãã 察話ãšãã£ãŒãããã¯ãéããŠAIãè²ãŠã ãšãããæ°ãã忥ã®åœ¢ãšèšããã®ã§ã¯ãªãã§ããããã æåŸã« ä»åã¯ãDevinã®ããã³ãããDevinèªèº«ã«æ¹åããããšãããç§ãã¡ã®ããŒã ã®åãçµã¿ã«ã€ããŠã玹ä»ããŸããããã®å°ããªå·¥å€«ããçããã®éçºããã»ã¹ãããã¹ã ãŒãºã«ããäžå©ãšãªãã°å¹žãã§ãã çãããªãã®Devin掻çšè¡ãé¢çœãã¢ã€ãã¢ãããã°ããã²æããŠãããããšå¬ããã§ãã