
- TOP
- ã¿ã°äžèЧ
- Cèšèª
Cèšèª
ã€ãã³ã
ãã¬ãžã³
æè¡ããã°
Developer Engagementãããã¯ã® @ikkou ã§ãã2026幎4æ22æ¥ãã24æ¥ã®3æ¥éã«ãããåæµ·éã¯åœé€šåžã® åœé€šãµãŒã¢ã³ã»ãŸããªãŸã¢ãªãŒã ã§ã RubyKaigi 2026 ããéå¬ãããŸããã æ¥æ¬Rubyã®äŒãRubyKaigi 2026ãç¹å¥ã©ã€ãã¢ãã ä»åã®åœé€šéå¬ã«ããããéåžžã®çœè²ã®ã¿ã®äºçšéã¿ã¯ãŒã®ã©ã€ãã¢ããããRubyãã€ã¡ãŒãžããç¹å¥è²ã®ã¬ããã«ã©ã€ãã¢ãããããŠããŸããã ZOZOã¯ä»å¹Žããã©ããã¹ãã³ãµãŒãšããŠåè³ããã¹ãã³ãµãŒããŒã¹ãåºå±ããŸããã technote.zozo.com æ¬èšäºã§ã¯ãååã¯WEARã®ããã¯ãšã³ããšã³ãžãã¢ãæ°ã«ãªã£ãã»ãã·ã§ã³ã玹ä»ããŸããåŸåã§ã¯ãZOZOã®åè³ããŒã¹ã®æ§åãšå瀟ã®ããŒã¹ã«ãããã³ãŒãã£ããŒããåçäžå¿ã«å ±åããŸãã ZOZOãšWEARãšRubyKaigi WEARã®ããã¯ãšã³ããšã³ãžãã¢ãæ°ã«ãªã£ãã»ãã·ã§ã³ A Faster FFI ããããFFIãšã¯ïŒ çŸç¶ã®FFIã®èª²é¡ ãªãFFIã¯é
ãã®ãïŒ æ¹å1 æ¹å2 FFXã®ä»çµã¿ æçµçãªããã©ãŒãã³ã¹ ruby.wasm can also enable JavaScript to call Ruby libraries. The Less-Told Story of Socket Timeouts ãªãopen_timeoutãå¿
èŠã ã£ãã®ã net/httpã®timeoutã©ã€ãã©ãªäŸååé¡ resolv_timeout + connect_timeoutã§ã¯ä»£æ¿ã§ããªã open_timeoutã®API仿§ 詊ããŠã¿ã Ruby 3.4: fast_fallback ON Ruby 3.4: fast_fallback OFF Ruby 4.0: open_timeout fast_fallback ON + open_timeout fast_fallback OFF + open_timeout åææå®ã¯ãšã©ãŒ å
šäœã®å¯Ÿæ¯ ãããã« Autoresearching Ruby Performance with LLMs Autoresearchãšã¯ ãªããã«ãŒãããéèŠãªã®ã 4ã€ã®ã«ãŒããã¿ãŒã³ Ralphã«ãŒã Autoresearchã«ãŒã Factoryã«ãŒã Sidekiqã§ã®å®èšŒå®éš å®éšã®èæ¯ "ããŒãžãããªãã³ãŒããçæããããšã®æå³" PRã¬ãã¥ãŒãšã¯äœãïŒ 4ã€ã®ã¬ãã¹ã³ Lesson 1: ãèªå調æ»ãã§ãã£ãŠãèªå倿Žãã§ã¯ãªã Lesson 2: èªåããªãŒããŒã§ Architect ã§ãªããã®ã« Autoresearch ãé©çšããªã Lesson 3: ã«ãŒãã¯ãã¿ãŒã»ã¬ãã¹ã³ãå®è·µãã Lesson 4: 人éã®ã²ãŒãããœãããŠã§ã¢ã²ãŒãã«å€æãã Software Factory ãšãã®èª²é¡ ãŸãšã ãããã« Exploring RuboCop with MCP The Journey of Box Building Ruby Boxãšã¯äœã Ruby Boxã®ä»çµã¿ Ruby BoxãçãŸããæŽå² ãããã« ZOZOããŒã¹ã®çŽ¹ä» åè³äŒæ¥ããŒã¹ã®ã³ãŒãã£ããŒããŸãšã RubyKaigi 2026 ã¢ãã¿ãŒã€ãã³ããååå LTã»ã¹ãã³ãµãŒ4瀟ã®ããã«ããéå¬ããŸã ãããã« ZOZOãšWEARãšRubyKaigi ç§ãã¡ãéå¶ãã ãã¡ãã·ã§ã³ã³ãŒãã£ããŒãã¢ããªãWEAR by ZOZOã ã®ããã¯ãšã³ãã¯Ruby on Railsã§éçºãããŠããŸãã2013幎ã«VBScriptã§æ§ç¯ãããã·ã¹ãã ã§ãããã2020幎é ããã³ãŒãããªãŒãºããRubyãžã®ãªãã¬ã€ã¹ãéå§ããŸãããçŸåšããªãã¬ã€ã¹ãé²ããªãããæ°èŠã®æ©èœãRubyã§éçºããŠããŸãããŸããMatzãããæè¡é¡§åãšããŠãè¿ãããæ¯æMatz MTGãšç§°ãããªã³ã©ã€ã³ããŒãã£ã³ã°ã宿œããŠããŸãã ZOZOãšRubyKaigiã®é¢ä¿ã¯ãZOZOã®å身ã§ããVASILYæä»£ã® RubyKaigi 2017 ã«é¡ããŸããã³ããçŠãçµãŠåéãã RubyKaigi 2022 ããã¯WEARã®ããã¯ãšã³ãéçºãæ
ãããŒã ãäžå¿ãšãªã£ãŠåè³ãšã¹ãã³ãµãŒããŒã¹ã®åºå±ãç¶ããŠããŸãã RubyKaigi2017åå ã¬ããŒã(å
šæ¥å)ãšã¹ã©ã€ããŸãšã RubyKaigi2018åå ã¬ããŒã RubyKaigi 2019åå ã¬ããŒããsonotsç»å£ã»ãã·ã§ã³ & ãšã³ãžãã¢8åã«ããå³éžã»ãã·ã§ã³ RubyKaigi 2022åå ã¬ããŒã ããšã³ãžãã¢ã«ããã»ãã·ã§ã³ç޹ä»ã RubyKaigi 2023åå ã¬ããŒã ããšã³ãžãã¢ã«ããã»ãã·ã§ã³ç޹ä»ã RubyKaigi 2024 åå ã¬ããŒã RubyKaigi 2025 åè³&åå ã¬ããŒã WEARã®ããã¯ãšã³ããšã³ãžãã¢ãæ°ã«ãªã£ãã»ãã·ã§ã³ ä»å¹Žã¯WEARããŒã ãã6åã®ããã¯ãšã³ããšã³ãžãã¢ãRubyKaigiã«åå ããŸãããæ¬ããŒãã§ã¯åãšã³ãžãã¢ãç¹ã«æ°ã«ãªã£ãã»ãã·ã§ã³ãåã
ã®èŠç¹ã§ç޹ä»ããŸãã A Faster FFI chika ã§ããç§ããã¯Aaron PattersonïŒ @tenderlove ïŒæ°ã®ã A Faster FFI ãã玹ä»ããŸãã ãã®ã»ãã·ã§ã³ã§ã¯ããRubyã¯CèšèªããéããªããïŒããšããåãããã¹ã¿ãŒãããå
·äœçã«ã¯Rubyã®FFIãé«éåãããã€ãã£ãã®CèšèªïŒCæ¡åŒµïŒãããRubyãéãå®è¡ã§ãããïŒããšããã®ãã¡ã€ã³ã®è°é¡ã§ããã äœè«ã§ãããAaronæ°ã¯RubyKaigi 2026ã®å€åœäººç»å£è
ã®äžã§ããããå¯äžæ¥æ¬èªã§ã¹ããŒãããæ¹ã§ããæµæ¢ãªæ¥æ¬èªã«å ããŠææãžã§ãŒã¯ã亀ãã倧å€ãŠããŒã¯ãªã»ãã·ã§ã³ã§ããæ¯å¹Žæ¥œãã¿ã«æèŽããŠããŸãïŒæåã®æšæ¶ã§ã¯ãå€åœäººã¿ãããªååã§ãããå€åœäººã§ãããšæ¥æ¬èªã§ãžã§ãŒã¯ãèšã£ãŠããŠé¢çœãã£ãã§ãïŒã ããããFFIãšã¯ïŒ FFIãšã¯Foreign Function Interfaceã®ç¥ç§°ã§ãäžè¬çã«ã¯Rubyã®ãããªé«æ°ŽæºèšèªããCèšèªãRust, Zigãªã©ã§æžãããå€éšã®é¢æ°ãåŒã³åºãããã®ãæŠå¿µãã®ããšãæããŸãïŒFFIèªäœã¯ãããããã°ã©ãã³ã°èšèªããä»ã®ããã°ã©ãã³ã°èšèªã§å®çŸ©ããã颿°ãªã©ãå©çšããããã®æ©æ§ïŒã Rubyã§ã¯äž»ã«libffiãšããã©ã€ãã©ãªãfiddle gemãä»ããŠå©çšããããã©ãããã©ãŒã ããšã®åŒã³åºãèŠåã®éããåžåããŠãããŸãã äŸïŒFFIã䜿ã£ãhello world #include <stdio.h> void hello ( void ) { printf ( "Hello, World from C! \n " ); } require ' ffi ' module Hello extend FFI :: Library ffi_lib File .expand_path( ' libhello.dylib ' , __dir__ ) attach_function :hello , [], :void end Hello .hello cc -shared -o libhello.dylib hello.c && ruby hello.rb #=> Hello, World from C! FFIã¯ãã€ãã£ãCæ¡åŒµã«æ¯ã¹ãCRuby, JRuby, TruffleRubyãšãã£ãç°ãªãRubyå®è£
ã§ããã»ãŒãã®ãŸãŸåããšããããŒã¿ããªãã£ã®èгç¹ã§ãã¡ãªããããããŸãã çŸç¶ã®FFIã®èª²é¡ äžèŠãããšRubyããCèšèªã®é¢æ°ãçŽæ¥åŒã³åºããã®ã¯ããã©ãŒãã³ã¹ãç§»æ€æ§ãªã©ã®èгç¹ãã䟿å©ããã«èŠããŸãããå®éã®ãšããFFIã¯æ»
å€ã«äœ¿ãããŠãããããã®çç±ãšããŠããã©ãŒãã³ã¹ãæªããšããç¹ãæããããŠããŸããã ãã³ãããŒã¯æ¯èŒã§ã¯ãæ¢åã®Cæ¡åŒµãšFFIãæ¯èŒãããšããã€ãã£ãCæ¡åŒµã®æ¹ãçŽ2.4åãé«éã«åäœããŠãããšã®ããšã§ããïŒFFæïŒFFIïŒããŠãªãâŠïŒã ãªãFFIã¯é
ãã®ãïŒ FFIãé
ãäž»ãªåå ãšããŠã以äžã®äžç¹ãæããŠããŸããã äœåãªãã¬ãŒã ããã·ã¥ Rubyããç®çã®Cèšèªã®é¢æ°ãæçµçã«åŒã³åºããŸã§ã«ãåŒã³åºãèŠåã®å€æãªã©ãè¡ããäžéçãªé¢æ°ããFFIãVMå
éšã§äœå±€ãåŒã³åºãããããã®ãã³ã«ã³ãŒã«ã¹ã¿ãã¯ã«äœåãªãã¬ãŒã ãç©ãŸããïŒããã·ã¥ãããïŒããã颿°åŒã³åºããã®ãã®ã®ãªãŒããŒãããã倧ãããªã£ãŠããŸãã å€ã®æž¡ãæ¹ã®éã Rubyã¯ã¹ã¿ãã¯ã䜿ã£ãŠå€ãæž¡ãããCèšèªã¯ïŒx86_64ãARM64ãªã©ã®ç°å¢ã«ãããŠïŒCPUã®ã¬ãžã¹ã¿ã䜿çšããŠå€ãåãåãããã®ãããCèšèªã®åŒã³åºãèŠçŽïŒABIïŒã«åãããŠãã¹ã¿ãã¯ããã¬ãžã¹ã¿ãžå€ãã³ããŒããŠè©°ãçŽãæäœãçºçããã ã¿ã€ã倿 Rubyã®ãªããžã§ã¯ããCèšèªãçè§£ã§ããåã«å€æããCããã®æ»ãå€ãåã³Rubyãªããžã§ã¯ãã«å€æãããªãŒããŒããããçºçããã æ¹å1 ãã®é
ãåå ãè§£æ¶ããããã«ãJITã³ã³ãã€ã©ãçšããŠãããã®ã³ã¹ããåæžããã¢ãããŒãã詊ã¿ãŠããŸããããããŠãRubyã§æžãããFFIã®ããã®JITã³ã³ãã€ã©ãFJITããèªçããŸãããããã¯fiddle gemãªã©è€æ°ã®gemã®æ©èœã掻çšããŠçŽæ¥ãã·ã³ã³ãŒããçæããããšã§ãæ¢åã®FFIå®è£
ã«æ¯ã¹ãŠçŽ2åã»ã©é«éåããããšãå¯èœãšãªããŸããã æ¹å2 ããã«ãã1ã€ã®è§£æ±ºæ¡ãšããŠææ¡ãããã®ããCRubyå
èµã®JITã³ã³ãã€ã©ã§ããZJITãšãæ°ãããã©ã³ã¹ã¬ãŒã¿ã§ãã FFX ã§ããã FFXã®ä»çµã¿ FFXã¯ãRubyã§æžãããFFIæ¡åŒµã®ã³ãŒããèªã¿èŸŒã¿ãèªåçã«Cæ¡åŒµã®ã³ãŒãã«å€æããŸãããã®æãçæãããCã³ãŒãã®äžã«ã¯ZJITåãã®ãã³ãïŒå
·äœçã«ã¯ãçæãããCã³ãŒãã®äžã«ããã®é¢æ°ã®åŒæ°ã¯ããããåã§ããããšãã£ãã¡ã¿ããŒã¿ãZJITãèªã¿åãã圢ã§é
眮ããïŒãæå³çã«åã蟌ãŸããŸããZJITã¯ãã®ãã³ããã颿°ã®åŒæ°ãæ»ãå€ã®åæ
å ±ãèªèããããšã§ãæé©åãããé«éãªãã·ã³ã³ãŒããåçã«çæããããšãå¯èœãšãªããŸãã æçµçãªããã©ãŒãã³ã¹ ãããã®æ¹åãå°å
¥ããã³ãããŒã¯ã枬å®ãããšããããªããšCæ¡åŒµãããçŽ1.4åéãåäœãããšããçµæã«ãªããŸãããçµæçã«ããRubyã¯CãããéããªãïŒããšããåãã«å¯ŸããŠã¯ããïŒJITãšFFXã®åãåããã°ïŒã€ãšã¹ããšãªããã€ãŸããRubyã¯Cãããéãããšããçµè«ã§ç· ãæ¬ãããŠããŸããïŒç¬ïŒ FFIã®ãé
ããã䜿ããªãããšããåžžèãèŠãã€ã€ãããZJITãFFXã®æçã«ãã£ãŠRubyããCã©ã€ãã©ãªãæ°è»œã«ã»é«éã«åŒã¹ãæªæ¥ãè¿ã¥ããŠãããšæããŸããã ruby.wasm can also enable JavaScript to call Ruby libraries. å°å³¶ïŒ @KojimaNaoyuki ïŒã§ããç§ããã¯Shigeru NakajimaïŒ @ledsun ïŒããã®ã ruby.wasm can also enable JavaScript to call Ruby libraries. ãã玹ä»ããŸãã www.docswell.com ãã®ã»ãã·ã§ã³ã§ã¯ãruby.wasmã®ãããŸã§ç©ã¿éããããŠããæ¹åãæ¯ãè¿ãã€ã€ããªããŸã å®åã§ã®æ¡çšäºäŸãå°ãªãã®ãã®åæãšãããè§£æ¶ããããã«ãJSããRubyãåŒã³åºããæ©èœã匷åããŠããæ¹éã話ãããŠããŸããã ruby.wasmãšã¯ããã©ãŠã¶ç°å¢ã§Rubyå®è¡ãå¯èœã«ãããã®ã§ããJavaScriptãšçžäºã§é£æºããªããRubyããã©ãŠã¶ç°å¢ã§å®è¡ã§ããŸãã ruby.wasmã¯ãããŸã§RubyããJavaScriptãåŒã³åºãæ¹åãå€ã宿œããŠããŸããããããçŸç¶ãæ¬çªç°å¢ã§å©çšãããŠããäŸã¯ããŸããªãããã§ãããã®åå ãšããŠãã®ã»ãã·ã§ã³ã§ã¯ä»¥äžã®2ç¹ã«ã€ããŠèšåãããŠããŸããã ruby.wasmãã€ããªã倧ãããã JSããRubyãåŒã¶ãµããŒãã匱ã ruby.wasmãã€ããªã倧ããããããšã«ã€ããŠã¯ https://cdn.jsdelivr.net/npm/@ruby/head-wasm-wasi@2.9.3-2.9.4/dist/ruby+stdlib.wasm ãäŸã«åºããŠè©±ãããŠããŸããããã¡ãã®ãã¡ã€ã«ã¯éå§çž®ã§31.80MiBãå§çž®ãããš8.84MiBã«ãªãããã§ãããããŠãBtoCã®ãã©ãŠã¶ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããŠã³ããŒããµã€ãºãéèŠã§ãããBtoBã®å Žåã¯ããŠã³ããŒããµã€ãºã¯å€§ããªåé¡ã§ã¯ãªãå¯èœæ§ããããšã»ãã·ã§ã³ã§ã¯è©±ãããŠããŸããã JSããRubyãåŒã³åºããµããŒãã匱ãããšã«ã€ããŠã¯ãRubyããJSãåŒã³åºãå ŽåãšJSããRubyãåŒã³åºãå Žåãæ¯èŒããŠæ±ããããã®éããèšåããŠããŸããã以äžãã»ãã·ã§ã³ã§äœ¿çšãããŠãã衚ã§ãã Feature R â J J â R eval Yes Yes Method Call Yes call Property Access Yes N/A Object Conversion Yes string Load Ruby Scripts browser No åºå
žïŒ ruby.wasm can also enable JavaScript to call Ruby libraries. | ãã¯ã»ã« ïŒæçµé²èЧæ¥ïŒ2026/05/07ïŒ ãã¡ããèŠããšç¢ºãã«JSããRubyãåŒã³åºãå Žåã«ãµããŒããããŠããªããã®ãå€ãå°è±¡ã§ãããçŸç¶JSããRubyãåŒã³åºãã«ã¯evalã¡ãœãããå©çšããŠå®è¡ã§ããŸãããrubyã®å®è¡çµæã®æ»ãå€ãæ±ãé©åãªAPIãäžè¶³ããŠããããšèª²é¡ãããããã§ãã ãããã®çŸç¶ãåããŠãæ¬çªç°å¢ã§å©çšãããŠããäŸãå°ãªãã®ã¯ãJSããRubyãåŒã¶ãæ©èœãäžååã§ããããã§ã¯ãªãããšåæãããŠããŸããããããŠãããJSããRubyãåŒã¶ããšãç°¡åã«ã§ãããªããããžãã¯ã®äºéå®è£
ãé²ãããšãã§ããããæçšã§ã¯ãªãããšãã£ããã£ãŠããŸãããããžãã¯ãRubyã«çµ±äžã§ããã°ä¿®æ£ã容æã«ãªãä¿å®æ§ãåäžãããã§ããïŒ ãJSããRubyãåŒã¶ãæ©èœã匷åããŠããããã«ã¯Rubyãªããžã§ã¯ããã©ããããRbValueãæ¡åŒµããå¿
èŠãããããã®ãããžã§ã¯ãããRubyâs BlanketããšåŒã¶ãšçºè¡šããããŸãããã¡ãªã¿ã«ããRubyâs Blanketããšããåœåã¯åœé€šåºèº«ã®äººæ°ãã³ãGLAYã®æ¥œæ²ã«ç±æ¥ããŠãããšããã£ããã£ãŠããŸããã ã»ãã·ã§ã³ã§ã¯ãç®æããŠããããçæ³ã®å§¿ã玹ä»ãããŠããã以äžã®ãããªäœ¿çšæãæ³å®ããŠããããã§ãã vm . evalFile ( "dog.rb" ) ; const dog = vm .eval ( âDog . newâ ) ; dog . vow () ; dog . vow () ; const count = dog . count_of_vows . toInt () ; åºå
žïŒ ruby.wasm can also enable JavaScript to call Ruby libraries. | ãã¯ã»ã« ïŒæçµé²èЧæ¥ïŒ2026/05/07ïŒ JSãã€ãã£ããªããããã£ã¢ã¯ã»ã¹ãã¡ãœããåŒã³åºãã§Rubyããã°ã©ã ãæ±ã£ãŠãããšããã瀺ããŠããŸãããããçŽæçã«JSããRubyã³ãŒããåŒã³åºããŠããŸããïŒ ã»ãã·ã§ã³ã®æåŸã«ã¯ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã®æŽ»çšã«ã€ããŠãèªãããŠããŠã以åãããé£ãã課é¡ã«åãçµãããšãã§ããŠãããšèªãããŠããŸããããRuby Committers and the WorldãããMatz Keynoteãã§ãAI掻çšãè°é¡ã«äžãã£ãŠãããå€ãã®ã³ããã¿ãŒãAIãé§äœ¿ããŠRubyã®æ¹åã«åœãã£ãŠããããã§ãã å人çã«ã¯ãèšèªå®è£
ã®ãããªãäžççã«ãµã³ãã«ãå°ãªãããªäœã¬ã€ã€ãŒã®é åãã¯AIãäžåŸæãªåéã ãšæã蟌ãã§ãããããããã»ã©å€ãã®ã³ããã¿ãŒã掻çšããŠããäºå®ã«é©ããããŸããã Rubyæ¬äœãåšèŸºã©ã€ãã©ãªã®éçºããAI掻çšã«ãã£ãŠä»åŸããã«å éããŠããã®ãéåžžã«æ¥œãã¿ã§ãïŒ ãã®ã»ãã·ã§ã³ãéããŠãJSããRubyãåŒã¶ãæ©èœãå
å®ããããšã§ãRubyã®æŽ»çšã®å¹
ãåºããæªæ¥ãæããŸãããå®éã®ãããã¯ãã®ãã©ãŠã¶äžã§RubyãåããŠãããšãããç®ã«ããããšãæåŸ
ããŠããŸãïŒ The Less-Told Story of Socket Timeouts WEARã®ããã¯ãšã³ãéçºãæ
åœããŠããaao4seyã§ããç§ããã¯ã @coe401_ ããã®ã The Less-Told Story of Socket Timeouts ãã玹ä»ããŸãã ãã®ã»ãã·ã§ã³ã§ã¯ãRuby 4.0ã§ Socket.tcp / TCPSocket.new ã«æ°ããå ãã£ã open_timeout ã®å°å
¥çµç·¯ãšããã®èåŸã«ããsocketã©ã€ãã©ãªã®ã¿ã€ã ã¢ãŠãã®æŽå²ãèªãããŠããŸãããæ¬èšäºã§ã¯ open_timeout ãå¿
èŠã«ãªã£ãçµç·¯ãçºè¡šå
容ãèžãŸããŠæŽçããç¶ããŠåRubyããŒãžã§ã³ã§å®éã«ã¿ã€ã ã¢ãŠãã®æåãã©ãå€ããã®ããæå
ã§èгå¯ããçµæã玹ä»ããããšæããŸãã ãªãopen_timeoutãå¿
èŠã ã£ãã®ã net/httpã®timeoutã©ã€ãã©ãªäŸååé¡ çºè¡šè
ã®ããšã«ãnet/httpã®timeoutã©ã€ãã©ãªäŸåãå€ãããããšããçžè«ãå±ããããšãã open_timeout å°å
¥ã®ãã£ããã§ãããã¹ã©ã€ãå
ã§ã玹ä»ãããŠããŸãããRuby 2.7ã®éçºæä»£ã«ãnet/httpã®ãããªæšæºã©ã€ãã©ãªããæšæºã§ã¯ãªãã©ã€ãã©ãªã«äŸåããªãã»ããè¯ãã®ã§ã¯ãšããè¶£æšã®ææ¡ããªãããŠããŸããã å ããŠãtimeoutã©ã€ãã©ãªã¯å
éšã§ Timeout::State::GLOBAL_STATE ãšããå
±æç¶æ
ãæã£ãŠãããããnon-main Ractorããããã«ã¢ã¯ã»ã¹ãããš Ractor::IsolationError ãçºçããŠããŸãç¶æ³ã§ããã resolv_timeout + connect_timeoutã§ã¯ä»£æ¿ã§ããªã Ruby 4.0éçºæç¹ã§ã Socket.tcp / TCPSocket.new ã«ã¯åå解決ã®ã¿ã€ã ã¢ãŠããæå®ãã resolv_timeout ãšãæ¥ç¶ç¢ºç«ã®ã¿ã€ã ã¢ãŠããæå®ãã connect_timeout ããã§ã«çšæãããŠããŸãããããããçµã¿åãããã°timeoutã©ã€ãã©ãªã®ä»£æ¿ã«ãªãããã«ãæããŸãããå®éã«ã¯ã¡ãœããå
šäœã®çµ¶å¯Ÿäžéæéãå¶åŸ¡ã§ããŸããã ããã§åæãšããŠ1ã€è£è¶³ããŠãããšãRuby 3.4ã§ Socket.tcp / TCPSocket.new ã«ã¯Happy Eyeballs Version 2 (HEv2 / RFC 8305)ã fast_fallback ãšããååã§ããã©ã«ãæå¹ãšããŠå°å
¥ãããŸãããHEv2ã¯è€æ°åè£ã®IPã¢ãã¬ã¹ã«å¯ŸããŠååè§£æ±ºãšæ¥ç¶è©Šè¡ã䞊è¡å®è¡ããã¢ã«ãŽãªãºã ã§ãïŒHEv2 èªäœã®è§£èª¬ã¯ååãã RubyKaigi 2025 åè³&åå ã¬ããŒã ãã§æžããŠããã®ã§ãæ¬èšäºã§ã¯ãã¡ãã«å§è²ããŸãïŒããªããRuby 3.4ãŸã§ã¯ fast_fallback: false çµè·¯ã® resolv_timeout ãAPI onlyã§å®è£
ãããŠããããæ¬èšäºã®å¯Ÿè±¡ã§ããRuby 4.0ã§äž¡çµè·¯ã§æ©èœããããã«ä¿®æ£ãããŠããŸãã ãã®äžã§ãããšãã°fast_fallbackæå¹ã§ resolv_timeout: 2000ms , connect_timeout: 1000ms ãæå®ããå ŽåãIPv6ãå
ã«è§£æ±ºãããŠIPv4ã解決åŸ
ã¡ã®ãŸãŸæ¥ç¶è©Šè¡ãå§ãŸããšã connect_timeout ã®1000msãéããŠã resolv_timeout ã®æéãŸã§åŸ
æ©ãç¶ããŸããçµæãå
šäœã¿ã€ã ã¢ãŠãã¯2ã€ã®åèšã§ã connect_timeout ã®å€ã§ããªãã resolv_timeout ã®å€ã§ãã2000msã«æ¯é
ãããŠããŸããŸãã HEv2ã®Connection Attempt Delay (250ms)ã絡ãã±ãŒã¹ã§ã¯ã connect_timeout: 1000ms ãæå®ããŠãå
šäœã¯1250msåŸ
ã€ããfast_fallbackç¡å¹ã§ã¯ãIPæ° Ã connect_timeout ããšããããããŠãŒã¶ãŒãæå®ããå€ãšã¯å¥ã®å€ã§å
šäœæéãæ±ºãŸã£ãŠããŸããŸãã open_timeoutã®API仿§ ãããã®èæ¯ãåããŠãçºè¡šè
ãèªèº«ã open_timeout ã Socket.tcp / TCPSocket.new ã«è¿œå ããææ¡ããããŸããã open_timeout ã¯timeoutã©ã€ãã©ãªãšåãããååè§£æ±ºãæ¥ç¶ç¢ºç«ã®å
šäœãã1ã€ã®æéã§ç®¡çãããªãã·ã§ã³ã§ãã Socket .tcp( " ruby-lang.org " , 80 , open_timeout : 1 ) èšèšäžã®è«ç¹ãšããŠã open_timeout ã resolv_timeout / connect_timeout ãšäœµçšãããå Žåã«ã©ãæ¯ãèãããæŽçããå¿
èŠããããŸããããè€éã«ãªããããŠããŸããšãã課é¡ããããæçµçã« open_timeout 㯠connect_timeout / resolv_timeout ãšã®åææå®ãçŠæ¢ããåææå®æã¯ ArgumentError ãæãã仿§ãšãªã£ãããã§ãã çºè¡šå
ã§ã¯å®è£
ã®çްããéšåã fast_fallback ãããªãããšã«èª¬æãããŠããŸããïŒãã¹ã©ã€ãã®p.224以éã«èšèŒãããŠããŸãã 詊ããŠã¿ã ãããŸã§èŠãŠããçµç·¯ãèžãŸããŠã open_timeout ãRuby 4.0ã§åäœããã®ãã®æ€èšŒãããŠã¿ãŸãããŸããç§èªèº«ã¯Ruby 3.4ã§å°å
¥ããã fast_fallback æ©èœããã®çºè¡šå
ã§ç¥ã£ãã®ã§ããã¡ãã®æåãåãããŠç¢ºèªããŠã¿ãããšã«ããŸããã å®éšã®ãã /etc/hosts ã«å¿çããªã3ã€ã®IPãå²ãåœãŠã test-multi-local.wear.jp ãçšæããŸããïŒèšèŒã®IPã¯dummyã§ãïŒã 192.168.xx.1 test-multi-local.wear.jp 192.168.xx.2 test-multi-local.wear.jp 192.168.xx.3 test-multi-local.wear.jp æ¥ç¶å
ã«ã¯å¿çããªãããŒãïŒ50000ïŒãæå®ããSYNãéã£ãŠãå¿çãè¿ã£ãŠããªãç¶æ³ãäœããŸãã Ruby 3.4: fast_fallback ON ãã®å ŽåãHEv2ã®ã¢ã«ãŽãªãºã ã«åŸã以äžã®ãããªæåã«ãªãã¯ãã§ãã çŽ250msééïŒConnection Attempt DelayïŒã§æ¬¡ã®IPãžäžŠè¡ã«è©Šè¡ãçºå°ããŠãã æåŸ
çµæïŒ (IPæ°-1) à 250ms + connect_timeout = 1.5 ç§ ã§å
šäœã¿ã€ã ã¢ãŠã æ€èšŒã¹ã¯ãªãã require " socket " t = Time .now begin Socket .tcp( " test-multi-local.wear.jp " , 50000 , connect_timeout : 1 , fast_fallback : true ) { |s| s.close } rescue => e puts "#{ e.class } : #{ e.message }" ensure puts " elapsed= #{ Time .now - t } s " end å®è¡çµæïŒRuby 3.4.9ïŒ Errno::ETIMEDOUT: Operation timed out \- user specified timeout elapsed=1.51281s tcpdumpã®çµææç² 10:41:18.580 SYN â .1 â IP1 éå§ (t=0) 10:41:18.836 SYN â .2 â IP2 éå§ (tâ0.256) 10:41:19.086 SYN â .3 â IP3 éå§ (tâ0.506) æ³å®ã©ãããçŽ1.5ç§ã§timeoutãšã©ãŒã«ãªãããšã芳枬ã§ããŸããïŒããŸããtcpdumpã§SYNãã±ããããã£ãã芳枬ããçµæãçŽ250msããšã«ç°ãªãIPãžSYNãã±ãããé£ãã§ããããšãèŠãŠåããŸããã Ruby 3.4: fast_fallback OFF fast_fallback: false ãæž¡ããšãRuby 3.3以åãšåãçŽåãã©ãŒã«ããã¯ã®æåã«æ»ããŸãã以äžã®ãããªæåã«ãªãã¯ãã§ãã åIPã«å¯Ÿã㊠connect_timeout: 1 ã§1ç§ãã€é çªã«è©Šè¡ æåŸ
çµæïŒ IPæ° Ã connect_timeout = 3 ç§ ã§å
šäœã¿ã€ã ã¢ãŠã æ€èšŒã¹ã¯ãªãã åè¿°ã®ã¹ã¯ãªããã® Socket.tcp åŒã³åºãè¡ã以äžã®ããã«å€æŽããŸãã - Socket.tcp("test-multi-local.wear.jp", 50000, connect\_timeout: 1, fast\_fallback: true) { |s| s.close } + Socket.tcp("test-multi-local.wear.jp", 50000, connect\_timeout: 1, fast\_fallback: false) { |s| s.close } å®è¡çµæïŒRuby 3.4.9ïŒ Errno::ETIMEDOUT: Operation timed out \- user specified timeout elapsed=3.013505s tcpdumpã®çµææç² 10:40:20.753 SYN â .1 â IP1 éå§ (t=0) 10:40:21.760 SYN â .2 â IP2 éå§ (tâ1.0) 10:40:22.764 SYN â .3 â IP3 éå§ (tâ2.0) æ³å®éããfast_fallbackãç¡å¹ã«ãããšIP1 â IP2 â IP3ãš1ç§ãã€é çªã«è©Šè¡ãããåèšçŽ3ç§ã§å
šäœã¿ã€ã ã¢ãŠãããããšã芳枬ã§ããŸããã Ruby 4.0: open_timeout ãããŸã§ã®çµæããã connect_timeout ã ãã§ã¯ã¡ãœããå
šäœã®äžéæéãå¶åŸ¡ã§ããªãããšãèŠããŸãããRuby 4.0ã§å°å
¥ããã open_timeout ã䜿ããšæåãã©ãå€ããããèŠãŠãããŸãã fast_fallback ON + open_timeout fast_fallback ONã§ open_timeout ãæ©èœããã詊ããŸãã æåŸ
çµæïŒopen_timeoutã«æå®ãã1ç§ã§ã¿ã€ã ã¢ãŠã æ€èšŒã¹ã¯ãªãã åè¿°ã®ã¹ã¯ãªããã® Socket.tcp åŒã³åºãè¡ã以äžã®ããã«å€æŽããŸãã \- Socket.tcp("test-multi-local.wear.jp", 50000, connect\_timeout: 1, fast\_fallback: true) { |s| s.close } \+ Socket.tcp("test-multi-local.wear.jp", 50000, fast\_fallback: true, open\_timeout: 1) { |s| s.close } å®è¡çµæïŒRuby 4.0.3ïŒ IO::TimeoutError: user specified timeout for test-multi-local.wear.jp:50000 elapsed=1.004653s æ³å®éããçŽ1.0ç§ã§ IO::TimeoutError ãçºçãã open_timeout: 1 ã§æå®ããæéãšã»ãŒåãæéã§ã¿ã€ã ã¢ãŠãããããšã芳枬ã§ããŸããïŒ fast_fallback OFF + open_timeout fast_fallback OFFã§ open_timeout ãæ©èœããã詊ããŸãã æåŸ
çµæïŒopen_timeoutã«æå®ãã1ç§ã§ã¿ã€ã ã¢ãŠã æ€èšŒã¹ã¯ãªãã åè¿°ã®ã¹ã¯ãªããã® Socket.tcp åŒã³åºãè¡ã以äžã®ããã«å€æŽããŸãã \- Socket.tcp("test-multi-local.wear.jp", 50000, connect\_timeout: 1, fast\_fallback: true) { |s| s.close } \+ Socket.tcp("test-multi-local.wear.jp", 50000, fast\_fallback: false, open\_timeout: 1\) { |s| s.close } å®è¡çµæïŒRuby 4.0.3ïŒ Errno::ETIMEDOUT: Operation timed out \- user specified timeout for 192.168.xx.1:50000 elapsed=1.007804s ãã¡ããæ³å®éããçŽ1.0ç§ã§ user specified timeout ãçºçãã open_timeout: 1 ã§æå®ããæéãšã»ãŒåãæéã§ã¿ã€ã ã¢ãŠãããããšã芳枬ã§ããŸããïŒã fast_fallback ã®èšå®æç¡ã«é¢ããã open_timeout ãæ©èœããŠããããšãããããŸããã åææå®ã¯ãšã©ãŒ open_timeout 㯠connect_timeout / resolv_timeout ãšã®åææå®ãçŠæ¢ãããŠããã Socket.tcp ã®å
¥å£ã§ ArgumentError ãå³åº§ã«çºç«ããŸãã Socket .tcp( " test-multi-local.wear.jp " , 50000 , connect_timeout : 1 , open_timeout : 1 ) { |s| s.close } # => ArgumentError: Cannot specify open_timeout along with connect_timeout or resolv_timeout å
šäœã®å¯Ÿæ¯ ãããŸã§èŠ³æž¬ããçµæã䞊ã¹ããšä»¥äžã®ããã«ãªããŸãã Ruby èšå® elapsed 3.4.9 fast_fallback: false , connect_timeout: 1 çŽ 3.01 ç§ 3.4.9 fast_fallback: true , connect_timeout: 1 çŽ 1.51 ç§ 4.0.3 fast_fallback: false , open_timeout: 1 çŽ 1.01 ç§ 4.0.3 fast_fallback: true , open_timeout: 1 çŽ 1.00 ç§ connect_timeout ã ããæå®ããã±ãŒã¹ã§ã¯ããŠãŒã¶ãŒã®æå®å€ãšã¯å¥ã®å€ã§å
šäœæéãæ±ºãŸã£ãŠããã®ã«å¯Ÿãã open_timeout ãæå®ããã° æå®å€ãŽã£ããã§æã¡åããã ããã«ãªããŸããã ãããã« æ¬ããŒãã§ã¯ã»ãã·ã§ã³ã®å
容ã§ãã open_timeout ã®å°å
¥çµç·¯ãšãå®éã« fast_fallback ã open_timeout ã®æåã芳枬ããçµæã玹ä»ããŸããïŒ open_timeout ã®å®è£
ã«ãããæ¥ç¶è©Šè¡å
šäœã®ã¿ã€ã ã¢ãŠãã管çãããããªã£ããšæããŸããå®éã®ã»ãã·ã§ã³ã§ã¯Ruby 2.0ã®éçºæä»£ããä»ã«è³ããŸã§ã®socketã©ã€ãã©ãªã®ã¿ã€ã ã¢ãŠãå°å
¥ã®æŽå²ã詳现ã«èª¬æãããŠãããåæä»£ããšã«ã©ããªèª²é¡ãããã©ã解決ããŠããã®ããç¥ãããšãã§ããšãŠãè峿·±ãã£ãã§ãããŸãããã®ã»ãã·ã§ã³ã«éããã§ãããRubyKaigiå
šäœãéããŠçºè¡šè
ã®æ¹ã®ã¢ãããŒã·ã§ã³ãå£éèŠãããšãã§ããã®ãèªåã«ãšã£ãŠè¯ãåºæ¿ãšãªããŸããã Autoresearching Ruby Performance with LLMs å°å±± ã§ããç§ããã¯Nate BerkopecïŒ @nateberkopec ïŒããã®ã Autoresearching Ruby Performance with LLMs ãã玹ä»ããŸãã Berkopecæ°ã¯ãSpeedshop代衚ã§ããPumaã¡ã³ãããŒãRailsããã©ãŒãã³ã¹ã³ã³ãµã«ã¿ã³ããšããŠåºãç¥ãããŠããŸããæ¬ã»ãã·ã§ã³ã¯ Autoresearch ãšããå
è¡ããŒã«ãåèã«ãAIãšãŒãžã§ã³ãã䜿ã£ãŠãRubyã®ããã©ãŒãã³ã¹åé¡ãèªåã§èª¿æ»ããåãçµã¿ãšããã«ããåŸããã瀺åã®çºè¡šã§ããã çºè¡šè³æã¯ä»¥äžã®ãªããžããªã§å
¬éããŠãã ãã£ãŠãããããåç
§ãã ããã github.com Autoresearchãšã¯ Autoresearchã¯ã2026幎3æã«Andrej KarpathyïŒ @karpathy ïŒæ°ãå
¬éããLLMå®éšèªååããŒã«ã§ããä»çµã¿ã¯ã·ã³ãã«ã§ãã AIãšãŒãžã§ã³ããã³ãŒããžã®å€æŽãææ¡ã»é©çšãã äžå®æéãã³ãããŒã¯ãå®è¡ãã ããŒã¹ã©ã€ã³ããè¯ããã°ã³ããããæªããã°ãªããŒã 1ã«æ»ã ãããç¡éã«ç¹°ãè¿ããŸããPyTorchãšåäžã®ã¡ã€ã³ãã¡ã€ã«ä»¥å€ã«äŸåé¢ä¿ããªãã1æéãããçŽ12å®éšãäžæ©ã§çŽ100å®éšãåããŸããBerkopecæ°ããã®ã³ã³ã»ãããRubyã®ããã©ãŒãã³ã¹æ¹åã«å¿çšã§ããããæ¢ã£ãã®ãä»åã®çºè¡šã§ãã ãªããã«ãŒãããéèŠãªã®ã ã»ãã·ã§ã³ã§ç¹°ãè¿ã匷調ãããã®ã ã«ãŒã ãšããæŠå¿µã§ãã AIãšãŒãžã§ã³ãã¯æ¬è³ªçã«ã¯ã«ãŒãã«ãããªããšãBerkopecæ°ã¯æ¬¡ã®ã³ãŒãäŸã§èª¬æããŠããŸãã messages = [user_prompt] loop do reply = llm.call(messages, tools : TOOLS ) break puts(reply.text) unless reply.tool_call? result = run_tool(reply.tool_name, reply.arguments) messages << reply messages << tool_result(result) end ãã®ã«ãŒãã« ã©ã®ãããªã²ãŒãïŒé鿡件ïŒã眮ãã ããã«ãŒãã®æ§æ Œã決ããŸãããããã»ãã·ã§ã³å
šäœã®äžè²«ããããŒãã§ããã 4ã€ã®ã«ãŒããã¿ãŒã³ Berkopecæ°ã¯ãã²ãŒãã®çš®é¡ã«ãã£ãŠã«ãŒãã4çš®é¡ã«åé¡ããŸããã ã«ãŒã ã²ãŒã ã·ã°ãã« ææç© Agents LLM èªå·±åæ¢ é¢æ£ æçµçãªè¿ç Ralph ãã«ãïŒãã¹ã 颿£ ã°ãªãŒã³ãªã³ããã Autoresearch ãã³ãããŒã¯å·®å é£ç¶ æ¹åãã diff Factory 倿°ã®ãã§ã㯠å€å€æ° ããŒãžå¯èœãª PR Ralphã«ãŒã while :; do cat PROMPT.md | claude-code ./build \_ and \_ test || continue git add \- A git commit \- m " ralph: passing build " git push done ãã«ããšãã¹ããã²ãŒãã«ããã«ãŒãã§ãããã¹ããéã£ã倿Žã ããã³ããããç¶ããŸãããã°ãžã®å¯ŸåŠã«åããŠããŸãã Autoresearchã«ãŒã best \= benchmark loop do change \= agent.propose\_optimization apply(change) score \= benchmark if score \> best git\_commit(change.summary) best \= score else git\_revert end end ã²ãŒããããŒã«å€ïŒpass/failïŒã§ã¯ãªã é£ç¶å€ïŒãã³ãããŒã¯ã¹ã³ã¢ã®æ¹åéïŒ ã§ããç¹ãRalphãšã®éãã§ãã Factoryã«ãŒã backlog.each do |spec| loop do code \= agent.implement(spec) gates \= scenarios.map { |s| s.run(code) } break if gates.all?(& :pass? ) end ship(code) end ã¹ããã¯ããã³ãŒããçæããè€æ°ã®ã²ãŒããå
šãŠééãããåºè·ãããã¿ãŒã³ã§ããStrongDM瀟ã®ã Software Factory ããåç
§ãããŠããŸããã Sidekiqã§ã®å®èšŒå®éš ã»ãã·ã§ã³äžã«ç޹ä»ãããå®éšã®1ã€ãã pi-autoresearch ãçšãããSidekiqã察象ã«ããèªåæé©åã§ãã å®éšã®èæ¯ Sidekiqã® Processor::Counter ã¯ã¢ãããã¯ãªã«ãŠã³ã¿ãŒã§ã16è¡çšåºŠã®ã·ã³ãã«ãªå®è£
ã§ããAutoresearchãšãŒãžã§ã³ãã¯ããã«ã¹ãã©ã€ããããã¯ïŒåã¹ã¬ãããèªåã®ç¶æ
ãæã¡ãæžã蟌ã¿ãå®ãããä»çµã¿ïŒãé©çšãã倿Žãææ¡ããŸããã ãŸããå¥ã®PRã§ã¯ Time.now.to_i ã Process.clock_gettime ã«çœ®ãæããããšãææ¡ãããŸããã Comparison: Process.clock_gettime: 17294486.8 i/s Time.now.to_i: 12698329.6 i/s - 1.36x slower Timeãªããžã§ã¯ããçæããã«æŽæ°ãçŽæ¥è¿ãããšã§1.36åé«éåã§ããŸãã "ããŒãžãããªãã³ãŒããçæããããšã®æå³" ãããã®å€æŽã«ã€ããŠBerkopecæ°ã¯ãOSSã¡ã³ãããŒã¯å®éã«ã¯ãããããŒãžããªãã ããããšæ£çŽã«è¿°ã¹ãŠããŸããããã®äžã§ããªãããŒãžã§ããªãã³ãŒããçæããã®ãããšããåããæããããŸããã "Why generate code that you can't merge?" ãã®åãã«å¯ŸããŠãã»ãã·ã§ã³ã¯ PR ã¬ãã¥ãŒã®ç®çãåå®çŸ©ããããŒã ãžãšå±éããŸããã PRã¬ãã¥ãŒãšã¯äœãïŒ å€æŽãåŽäžããçç±ãšããŠãBerkopecæ°ã¯ä»¥äžãæããŸããã ãã°ããã â LLMã¯ããçšåºŠåŸæ ãã¬ãŒããªãããã âãååã«éãããšã¯ã©ã®ã¬ãã«ãïŒ è€éããã â Flog/Flayã¹ã³ã¢ãABCã¹ã³ã¢ãLOC ãªã¹ã¯ãé«ããã â ãã£ãã·ã¥ç¡å¹åãªã©ïŒAutoresearchã¯ãã£ãã·ã¥ã倧奜ãã§ãããããã°ããããïŒ ãã¹ããéãã... â Autoresearchã¯è¯ããã¹ããããåæã§åã GPL éåãªã© â GitHubå€ã®æ³çã»ã³ã³ãã©ã€ã¢ã³ã¹ãã§ã㯠èŠããã« ãããŒãžã§ããããã倿ããèœåãããArchitectã§ãã ãšãã䞻匵ã§ãã 4ã€ã®ã¬ãã¹ã³ ã»ãã·ã§ã³ãéããŠæç€ºããã4ã€ã®ã¬ãã¹ã³ããŸãšããŸãã Lesson 1: ãèªå調æ»ãã§ãã£ãŠãèªå倿Žãã§ã¯ãªã Stan Loæ°ïŒShopifyïŒã®åãçµã¿ã玹ä»ãããŸãããRuby-lspã®CIæéã33ïŒ
åæžãrubydexã®ã€ã³ããã¯ã¹é床ã10ïŒ
ã50ïŒ
æ¹åãããšãã£ãææããAIã®ææ¡ãèªèº«ãã¬ãã¥ãŒããäžã§å®çŸããŠããŸããAIã®åºåã人éãæ€èšŒã»çè§£ããŠåã蟌ãå§¿å¢ãéèŠã ãšããäŸã§ãã Lesson 2: èªåããªãŒããŒã§ Architect ã§ãªããã®ã« Autoresearch ãé©çšããªã çè§£ã»æ€èšŒã»ä¿®æ£ã§ããã³ãŒãã«ã®ã¿é©çšãã¹ãã§ãã Lesson 3: ã«ãŒãã¯ãã¿ãŒã»ã¬ãã¹ã³ãå®è·µãã Richard Suttonããã®ãèŠãæèšïŒBitter LessonïŒãïŒäººéã®ç¥èãçµã¿èŸŒããããèšç®ã®ã¹ã±ãŒã«ã«ãã£ãŠæ¢çŽ¢ã»åŠç¿ããæ¹ãé·æçã«åªãããšããæèšïŒãã«ãŒãã¯äœçŸããŠããŸããã«ãŒãã¯äººéã®ã²ãŒããæ
ä¿ããããŒãžã§ã³ã«éãããã²ãŒãããœãããŠã§ã¢ã«çœ®ãæããããšã§æ¢çŽ¢ãã¹ã±ãŒã«ãããããŸãã Lesson 4: 人éã®ã²ãŒãããœãããŠã§ã¢ã²ãŒãã«å€æãã ãé
ãããšããæèŠãèµ€/ç·ã®ç¶æ
ã»ãã°ãã±ããã«å€æããããã»ã¹ãããã©ãŒãã³ã¹æ¹åã®æ¬è³ªã§ããããšãAutoresearchã倱æããŠããã²ãŒããå®çŸ©ããéçšã§ãœãããŠã§ã¢ã®å質èªäœãäžãããŸãã Software Factory ãšãã®èª²é¡ ã»ãã·ã§ã³åŸåã§ã¯ã Software Factory ïŒStrongDMç€Ÿã®æå±ããã³ã³ã»ããïŒã玹ä»ãããŸããã "Code must not be written by humans. Code must not be reviewed by humans." â StrongDM's "Software Factory" ããã¯äººéã®ã¬ãã¥ãŒãå®å
šã«æé€ãã倿°ã®èªåã²ãŒããééããã³ãŒãã®ã¿ãåºè·ããèãæ¹ã§ããã»ãã·ã§ã³ã§ã¯ããããdark factoryããšè¡šçŸããBerkopecæ°ã¯å€ãã®æªè§£æ±ºã®åãã䞊ã¹ãŠç޹ä»ããŸããã åœ¢åŒææ³ã»ããããã£ããŒã¹ãã¹ãã¯çŸå®çã«ã¹ã±ãŒã«ãããïŒ æ¢åã®å€§èŠæš¡ã³ãŒãããŒã¹ïŒãã©ãŠã³ãã£ãŒã«ãïŒã«é©çšã§ãããïŒ LOCã®è¥å€§åãã©ãé²ããïŒ LLMããã¬ãŒãã³ã°ããŒã¿ã®èåãªæé©åããåçºæãããã ãã«ãªããªããïŒ æ±ºå®è«çãªã²ãŒããšLLMãžã£ããžãã©ãçµã¿åããããïŒ Berkopecæ°ã¯ãããã«å¯ŸããŠçŸæç¹ã§çãã¯ãªããšããªãããããã²ãŒãèšèšãããéèŠã«ãªãããšããæ¹åæ§ã瀺ããŸããã ãŸãšã Berkopecæ°ã®ã»ãã·ã§ã³ãäžèšã§ãŸãšãããšã ãAI ã«èªåŸçãªã«ãŒããåãããããšã¯ã§ãããããããæå³ã®ããææã«å€ããã«ã¯ã²ãŒãèšèšãšãã人éã®ã¹ãã«ãå¿
èŠã ãšããã¡ãã»ãŒãžã§ããã çºè¡šã§æšå¥šãããŠããå®è·µã¹ãããã¯ä»¥äžã®éãã§ãã èªåãååã«çè§£ã»ã¬ãã¥ãŒã§ããã³ãŒãã«ã®ã¿é©çšããïŒStan Loæ°ã®ã¢ãããŒãïŒ æçããå°ããªã¢ãžã¥ãŒã«ããå§ãã ã²ãŒããæå°ã§æžãå Žæããã¹ã¿ãŒããã ã²ãŒããå¢ããã°äººéã®ã¬ãã¥ãŒãæžããã RalphïŒé¢æ£ïŒã»AutoresearchïŒé£ç¶ïŒã»FactoryïŒå€ã²ãŒãïŒã®ããããã®ã«ãŒãã詊ããŠã¿ã ãããã« ä»å¹Žã®RubyKaigiã¯AIã«é¢ããã»ãã·ã§ã³ã®å€ããå°è±¡çã§ãããæ®æ®µã®æ¥åã§èªèº«ãAIãæŽ»çšããŠããŸããæ¬ã»ãã·ã§ã³ã§ç޹ä»ãããŠããã²ãŒãã®èšèšã»å°å
¥ã«æ³šåããŠãããã©ãŒãã³ã¹æ¹åã¯ãã¡ããã®ããšããã以å€ã®ããããæ¥å課é¡ã®èªååãããæšé²ããŠãããããšæããŸããïŒ Exploring RuboCop with MCP äŒè€ã§ããä»å¹ŽãRubyKaigiã«åå ããŠããŸããïŒãç§ãã㯠@koic ããã®ã Exploring RuboCop with MCP ããã玹ä»ããŸãã speakerdeck.com æ¬ã»ãã·ã§ã³ã¯ãI. MCP Ruby SDKããII. RuboCop x MCPãã®2éšæ§æã§ãååã§ã¯ @koic ãããã³ããã¿ãŒãåããå
¬åŒã® MCP Ruby SDK ïŒ mcp gemãšããŠå
¬éïŒã®èšèšããStreamable HTTPã§ã®ã»ãã·ã§ã³ç®¡çã»Samplingã»ElicitationãŸã§ã解説ãããŸãããåŸåã¯ãRuboCop 1.85.0ã§å®éšçã«è¿œå ãããçµã¿èŸŒã¿MCPãµãŒããŒã®ç޹ä»ã§ããã ããã§ã¯ç¹ã«åŸåãRuboCop x MCPãã顿ã«ãWEARã®ããã¯ãšã³ããšã³ãžãã¢ãšããŠå®éã«æå
ã§åãããŠã¿ãææ³ãäžå¿ã«ã玹ä»ããŸãã rubocop --mcp ã¯ãRuboCop 1.85.0ããå°å
¥ããããµãã³ãã³ãã§ãAIãšãŒãžã§ã³ãïŒClaude Codeãªã©ã®MCPã¯ã©ã€ã¢ã³ãïŒããRuboCopãåŒã³åºããããã«ããçµã¿èŸŒã¿MCPãµãŒããŒãèµ·åããŸããstdio transportã§éä¿¡ãã以äžã®2ã€ã®ããŒã«ãå
¬éããŸãã rubocop_inspection ïŒãªãã§ã³ã¹æ€æ»ïŒèªã¿åãå°çšïŒ rubocop_autocorrection ïŒãªãŒãã³ã¬ã¯ãé©çšïŒç Žå£çïŒ ãªããRuboCopã§ã¯ã³ãŒãã£ã³ã°èŠçŽéåã®ããšãããªãã§ã³ã¹ïŒoffenseïŒããšåŒã³ãŸãã以鿬èšäºã§ããã®çšèªã䜿ããŸãã rubocop --lsp ã®å
éšã§äœ¿ãããŠããèšºææ©æ§ïŒ RuboCop::LSP::Runtime ïŒããã®ãŸãŸåå©çšããŠããã®ãç¹åŸŽã§ãåºåããããªãã§ã³ã¹ã¯LSPã® Diagnostic 圢åŒïŒJSONïŒã§ããClang圢åŒã®ããã¹ããããæ§é åãããŠãããããAIãšãŒãžã§ã³ãããã®ãŸãŸããŒã¹ããŠæ±ãããã圢ã«ãªã£ãŠããŸãã ããããã¯å®éã«æå
ã§åãããŠã¿ãŸãã rubocop --mcp ã䜿ãã«ã¯ãRuboCopæ¬äœã«å ã㊠mcp gemãå¿
èŠã§ãïŒRuboCop㯠mcp ãruntime dependencyãšããŠæã£ãŠããªãããïŒãæ¢åã®Gemfileã®developmentã°ã«ãŒãã«ä»¥äžã远å ããŸãã group :development do gem ' mcp ' end 次ã«Claude Codeã« .mcp.json ã§RuboCopã®MCPãµãŒããŒãç»é²ããŸãïŒClaude Codeãèšå®ãèªã¿ãèµ·åæã« bundle exec rubocop --mcp ããµãããã»ã¹ãšããŠç«ã¡äžããŠãããŸãïŒã { " mcpServers ": { " rubocop ": { " command ": " bundle ", " args ": [ " exec ", " rubocop ", " --mcp " ] } } } Claude Codeäžã§ /mcp ãå©ããšãç»é²ãã rubocop ãµãŒããŒãã2ã€ã®ããŒã«ãèªèãããŠããã®ã確èªã§ããŸãã ⯠/mcp ââââââââââââââââââââââââââââââââââââââââââââââââââââ Tools for rubocop 2 tools ⯠1\. RuboCop's inspection read-only 2\. RuboCop's autocorrection destructive ããã§ã¯å®éã« rubocop_inspection ãåŒãã§ã¿ãŸãããªãã§ã³ã¹ãæå³çã«ä»èŸŒãã 以äžã®ãµã³ãã«ãã¡ã€ã« sample.rb ãçšæããŠãæ€æ»ãåŒãã§ããããŸãã # frozen_string_literal: true def greet ( name ) message = " Hello, " +name+ " ! " puts message end greet( " WEAR " ) ã sample.rb ãRuboCopã§æ€æ»ããŠããšãé¡ããããšãClaude Codeã rubocop_inspection ããŒã«ãåŒã³ãçµæã以äžã®ããã«æŽåœ¢ããŠæç€ºããŠãããŸããã ⯠sample.rb ãRuboCopã§æ€æ»ã㊠Called rubocop (ctrl+o to expand) ⺠sample.rb ã®æ€æ»çµæ: 9 ä»¶ã® offense ãæ€åºãããŸããïŒãã¹ãŠèªåä¿®æ£å¯èœïŒã âââââââ¬ââââââââââââââââââââââââââââââ¬ââââââââââââââââââââââââââââââ â è¡ â Cop â å
容 â âââââââŒââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââââââ†â 2 â Layout/SpaceInsideParens â æ¬åŒ§å
ã®äœèšãªã¹ããŒã¹ïŒ2 â â â â ç®æïŒ â âââââââŒââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââââââ†â 3 â Style/StringConcatenation â \+ é£çµããæååè£éãæšå¥š â âââââââŒââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââââââ†â 3 â Style/StringLiterals â "Hello, " â â â â â ã·ã³ã°ã«ã¯ã©ãŒãæšå¥š â âââââââŒââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââââââ†â 3 â Style/StringLiterals â "\!" â ã·ã³ã°ã«ã¯ã©ãŒãæšå¥š â âââââââŒââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââââââ†â 3 â Layout/SpaceAroundOperators â \+ æŒç®åã®ååŸã«ã¹ããŒã¹ç¡ â â â â ãïŒ2 ç®æïŒ â âââââââŒââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââââââ†â 4 â Layout/IndentationConsisten â ã€ã³ãã³ããäžæã â â â cy â â âââââââŒââââââââââââââââââââââââââââââŒâââââââââââââââââââââââââââââ†â 7 â Style/StringLiterals â "WEAR" â â â â â ã·ã³ã°ã«ã¯ã©ãŒãæšå¥š â âââââââŽââââââââââââââââââââââââââââââŽââââââââââââââââââââââââââââââ ãã¹ãŠ rubocop \-A ã§èªåä¿®æ£ã§ããŸããèªåä¿®æ£ãå®è¡ããŸããïŒ ãèªåä¿®æ£ãå®è¡ããŸããïŒããšãããã©ããŒã¢ããä»ãã§ãç¶ã㊠rubocop_autocorrection ããŒã«ãžã®åãæ¿ããŸã§èªç¶ã«ææ¡ããŠãããŠããã®ãåãããŸãïŒè¡çªå·ãLSPã®0-indexedå€ã®ãŸãŸè¡šç€ºãããŠããã®ã¯ãRuboCopãè¿ãLSP Diagnosticã®å€ãClaude CodeåŽã§1-indexedã«å€æããã«è¡šç€ºããŠããããã§ãïŒã ãã®ãšãè£ã§ rubocop_inspection ããè¿ã£ãŠããŠããçã®JSONã¯ãçŽé¢ã®éœåã§ code_actions ãçç¥ããæ€åºããã9ä»¶ã®ãã¡ä»£è¡š2ä»¶ã®ã¿æç²ãããšä»¥äžã®ããã«ãªã£ãŠããŸãã { " files ": [ { " path ": " sample.rb ", " offenses ": [ { " range ": { " start ": { " line ": 2 , " character ": 10 } , " end ": { " line ": 2 , " character ": 11 } } , " severity ": 3 , " code ": " Layout/SpaceInsideParens ", " codeDescription ": { " href ": " https://docs.rubocop.org/rubocop/cops_layout.html#layoutspaceinsideparens " } , " source ": " RuboCop ", " message ": " Layout/SpaceInsideParens: Space inside parentheses detected. ", " data ": { " correctable ": true , " code_actions ": [ /* çç¥ */ ] } } , { " range ": { " start ": { " line ": 3 , " character ": 12 } , " end ": { " line ": 3 , " character ": 30 } } , " severity ": 3 , " code ": " Style/StringConcatenation ", " codeDescription ": { " href ": " https://docs.rubocop.org/rubocop/cops_style.html#stylestringconcatenation " } , " source ": " RuboCop ", " message ": " Style/StringConcatenation: Prefer string interpolation to string concatenation. ", " data ": { " correctable ": true , " code_actions ": [ /* çç¥ */ ] } } ] } ] , " summary ": { " target_file_count ": 1 , " offense_count ": 9 } } LSPã®èšºæãšåã圢åŒãªã®ã§ãåãªãã§ã³ã¹ã«copåã»è©²åœç¯å²ã»copåå¥ã®ããã¥ã¡ã³ãURLã»èªåä¿®æ£å¯åŠïŒ correctable ïŒãŸã§æ§é åããã圢ã§å«ãŸããŸããããã«çç¥ãã code_actions ã«ã¯å®éã®autocorrectã§æ¿å
¥ããæååïŒäŸ: Style/StringConcatenation ãªã "Hello, #{name}!" ãžã®çœ®æïŒãã # rubocop:disable ãå
¥ããŠè©²åœè¡ã§ç¡å¹åããæ¡ãLSPã® WorkspaceEdit 圢åŒã§å«ãŸããŠããããšãŒãžã§ã³ãããæ©æ¢°çã«æ±ããããã«ãªã£ãŠããŸãã rubocop_autocorrection ããŒã«ã«åãæ¿ããã°ããã®ãŸãŸç Žå£çã«ä¿®æ£ããããããšãã§ããŸãã WEARã®ããã¯ãšã³ãã§ã¯ãã§ã«RuboCop+åçš®pluginãå€§èŠæš¡ã«éçšããŠããã®ã§ãçæAIã«ããéçºãåãå
¥ããéã«ããRuboCopãéã£ãŠããããšããæ±ºå®çãªã²ãŒãã¯ãã®ãŸãŸäœ¿ãç¶ãããããšæ¥é ããæã£ãŠããŸãããæ¬ã»ãã·ã§ã³ã¯ããŸãã«ãã®ã決å®çãªããŒã«ïŒRuboCopïŒããšã確ççãªLLMãã rubocop --mcp ãšããããã¡ã§çŽ çŽã«æ©æž¡ãããŠãããçºè¡šã§ãèããªããèªåã®éçºãããŒã«çµã¿èŸŒãçµµãå
·äœçã«æµ®ãã³ãŸããã ã»ãã·ã§ã³åŸåã§ @koic ãããæããããããŠãã "What happens when combined?"ïŒæ±ºå®çãªããŒã«ãšç¢ºççãªLLMãçµã¿åããããšäœãèµ·ãããïŒãšããåããå°è±¡çã§ãããäŸãã°ãçŸç¶ã® .rubocop.yml ã§ç¡å¹åããŠããcopãLLMã«äžæçã«æå¹åãããã¬ãã¥ãŒèгç¹ãšããŠãããŸç¡å¹ã«ãªã£ãŠããcopããããŠèŠããã©ãèŠãããããæç€ºããŠãããããšãã£ãäœ¿ãæ¹ã¯ãããŒã«åäœã ãšåºãŠããªãçºæ³ã§ããStreamable HTTPã§ã®SamplingãElicitationãŸã§å«ããŠããŸã ãæ¢çŽ¢ãå§ãŸã£ãã°ããããšããç· ããããéããããããRuboCopÃMCPã§ã©ããªè©Šã¿ãåºãŠããããšãŠã楜ãã¿ã§ãã The Journey of Box Building åå
ïŒ @sakam0cchan ïŒã§ããç§ããã¯Satoshi TagomoriïŒ @tagomoris ïŒããã®ã The Journey of Box Building ããšããã»ãã·ã§ã³ã玹ä»ããŸãã speakerdeck.com ãã®ã»ãã·ã§ã³ã¯ãRuby 4.0ã§å®éšçã«å°å
¥ãããæ°æ©èœãRuby BoxããããŒãã«ããKeynoteã§ããBoxã®åºæ¬æŠå¿µãããå®è¡äžã®Rubyããã°ã©ã ã®äžã§Boxãç¹å®ããéã®é£ããããããŠãã®å®è£
ã«è³ããŸã§ã®èæ¯ãªã©ãèªãããŠããŸããã ç§èªèº«ãåããŠRubyKaigiã«åå ãããããŠåããŠèããKeynoteããã®å
容ã ã£ãããšããããããããã®3æ¥éãã©ããªãã®ã«ãªãããšãŠãããããããŸããããããªæãã蟌ããŠãå
容ãå
±æããŸãã Ruby Boxãšã¯äœã Ruby BoxïŒRubyKaigi 2025ãŸã§ã¯ãNamespaceããšåŒã°ããŠããæ©èœïŒã¯ãRuby 4.0ã§å°å
¥ãããå®éšçãªæ©èœã§ãã Ruby Boxã¯ããããŸã§Rubyã®ããã»ã¹å
šäœã§å
±æãããŠããã¯ã©ã¹ãã¢ãžã¥ãŒã«ãã¢ã³ããŒããããªã©ããå¥ã®ç©ºéïŒBoxïŒãšããŠåé¢ãèªã¿èŸŒã¿ã»å®è¡ã§ãã驿°çãªæ©èœãšãªã£ãŠããŸããããšãã°ã something.rb ã«æžãããã¯ã©ã¹ããã¡ã€ã³ç°å¢ãšã¯ç¬ç«ããBoxã®äžã«èªã¿èŸŒãã€ã¡ãŒãžã§ãã # something.rb class Something def hello = " hello from Something " end # main.rb box = Ruby :: Box .new box.require( ' something ' ) s = box:: Something .new p s.hello # => "hello from Something" Boxã®äžã§èªã¿èŸŒãã Something 㯠box::Something ãšããŠã ãã¢ã¯ã»ã¹ã§ããBoxã®å€ããã¯èŠããŸãããããã«ãããã©ã€ãã©ãªãã¢ã³ããŒããããããã»ã¹å
šäœãžæŒãããã«äœ¿ããã®ãBoxã®ã³ã¢ã¢ã€ãã¢ã§ããã»ãã·ã§ã³ã®äžã§ã¯ã以äžã®ãããªçšéãBoxã®å©çšã·ãŒã³ãšããŠæããããŠããŸããã äžéšã®ã³ãŒãã«ãŠæå¹ãªã¢ã³ããŒãããã®é©çš ãã¹ãå
ã§ã®ã¢ãã¯åŠç ç°ãªãããŒãžã§ã³ã®ã©ã€ãã©ãªã«äŸåããè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ããåãããã»ã¹å
ã«åå±
ããã ã©ã¡ãã«ãåããªã¯ãšã¹ããéãããšã§ãç°ãªãããŒãžã§ã³ã®ã©ã€ãã©ãªã§ã®æåãæ¯èŒãã ãã®ããã«ãBoxã¯ãåãããã»ã¹å
ã§ã®éé¢ãããç°å¢ããæäŸããããšã§ããããŸã§Rubyã§é£ããã£ãããšãå¯èœã«ããæ©èœãšããŠæåŸ
ãããŠããŸãã Ruby Boxã®ä»çµã¿ æ¬ã»ãã·ã§ã³ã§ã¯ãRuby Boxãå®çŸããäžã§å¿
èŠäžå¯æ¬ ãšãªããçŸåšãå®è¡äžã®ã³ãŒããã©ã®Boxã«å±ããŠãããããå€å®ããä»çµã¿ã詳现ã«è§£èª¬ãããŠããŸããã Ruby Boxã§ã¯ãã1ã€ã®ãã¡ã€ã«ããå¥ã®Boxã§åæã«èªã¿èŸŒãããšãã£ãããšãå¯èœã§ããã€ãŸãããã¡ã€ã«èªäœã¯ç¹å®ã®Boxã«çžãããŠããªããããããã°ã©ã ãå®è¡ããããã³ã«ãRubyèªèº«ããèªåã¯ä»ãã©ã®Boxã®äžã§åããŠããã®ãïŒããåçã«ç¹å®ãç¶ããªããã°ãªããŸããã Boxã®ç¹å®ã»æ±ºå®ã®ããã»ã¹ã¯ã以äžã®ãããªã¹ãããã§è¡ãããŠãããšã®ããšã§ããã çŸåšå®è¡äžã®ãã¬ãŒã ãç¹å®ãã ãŸããèªåãããŸå®è¡ããŠããControl FrameãèŠã€ãã LOCALãªå€æ°ã¹ã³ãŒããæ¢ã ããããããããã¯ãäŸå€åŠçãšãã£ãéããŒã«ã«ãªãã®ãç¡èŠãããã¡ã€ã«å
šäœãã¯ã©ã¹ãã¡ãœãããšãã£ããLOCALïŒå±æçïŒããªã¹ã³ãŒããæã€ãã¬ãŒã ãŸã§ããã®ãŒã Boxã®æ
å ±ãåŒã£åŒµãåºã ããã§ãèŠã€ããLOCALãªãã¬ãŒã ã®äžã«ä¿åãããŠããæ
å ±ããã©ããããã«çŽä»ããŠãããBoxæ
å ±ããååŸãã ããã§äžçªè峿·±ãã£ãã®ã¯ãControl FrameãšããŒã«ã«å€æ°ãªã©ã管çããŠããENVãšã®é¢ä¿æ§ã§ããããããã¯Rubyãå®è¡ããäžã§ãçŸæç¹ã§ã©ã®ã³ãŒããåããŠããã®ããææ¡ããããã®ãã®ã§ããRubyã®ã¡ã¢ãªäžã§ã¯ãControl FrameãšENVã®2ã€ã䞡端ããå
åŽã«åãã£ãŠäŒžã³ãŠããç¹æ®ãªæ§é ãšãªã£ãŠããããã§ãã ãã®äºã€ãè¡çªãããšãStack Overflowãçºçãããšãã話ããã®ã»ãã·ã§ã³ã§åããŠç¥ããä»ãŸã§ããŸãæèããŠããªãã£ãRubyã®å
éšæ§é ã«ã€ããŠããã£ãšããç¥ã£ãŠå匷ããããšæ¹ããŠæããŸããã Ruby BoxãçãŸããæŽå² ããã«ãå°è±¡ã«æ®ã£ãŠãããã1ã€ã®ãããã¯ãšããŠãRuby BoxãçãŸããæŽå²ã«ã€ããŠã®è©±ããããŸããéçºè
ã®TagomoriãããRuby Boxã®éçºãå§ãããã£ããã¯ãRubyKaigi 2023ã§çºè¡šããã ãMultiverse Rubyãã®ã»ãã·ã§ã³ ã§ããããã®å
容ããéå»ã«èªèº«ãæ±ããŠãã課é¡ãšéãªããšæããããšã§ãäžæ°ã«ã¢ãããŒã·ã§ã³ãé«ãŸã£ãããã§ãã ããã«ããã®äŒæäžã«çºè¡šè
ã®æ¹ãšçŽæ¥è©±ãæ©äŒããããåœåã¯ãHakoããšããåœåã«ããŠåœé€šã®RubyKaigiã§çºè¡šãããããšãã話ããã£ãããã§âŠããããŠå®éã«ä»ãããããŠçºè¡šã«è³ã£ãŠããããªããšèžãç±ããªãå±éã§ããããã ãããªãšããœãŒããéããŠããã¿ãªããã«ãããµãšã¢ãããŒã·ã§ã³ãæ¹§ãäžããç¬éããããããããªããããªãã«ãšã£ãŠã®ãMultiverse Rubyãããããããããªãããããªããã»ã¹ãå«ããŠRubyKaigiãæ¥œããã§ã»ããããšããèšèãå°è±¡çã§ãããæåã®ã»ãã·ã§ã³ã§ãã®äžèšãèãããšããããããå§ãŸã3æ¥éã®RubyKaigiã«ãšãŠããããããããã®ç¬éããä»ã§ãèŠããŠããŸãããããªéçºã®è£ãšããœãŒããå«ãããšãŠãå°è±¡çãªã»ãã·ã§ã³ã§ããã ãããã« æ¬ã»ãã·ã§ã³ã¯ãæ°æ©èœã®ç޹ä»ããšããããããã©ããªãµãã«å®çŸãããŠããã®ããããã«ãã®æ©èœãçãŸããç¬éãèŽããçºè¡šã§ãèŽããåŸã®äœé»ãé·ãæ®ãããŒããŒãã§ããã WEARã®ããã¯ãšã³ãã¯Ruby on Railsã§éçºã»ãªãã¬ã€ã¹ãé²ããŠãããmonkey patchã絡ãç®æã®ã¹ã³ãŒã管çã«èŠåŽããå Žé¢ãä»åŸåºãŠãããããããŸãããBoxã®ããã«ãå®è¡æã®å¢çãã衚çŸã§ããããã«ãªãã°ãããšãã°ã©ã€ãã©ãªã®å·®ã蟌ã¿ããã¹ãç°å¢åºæã®äžæžãããããèŠéãããæ±ããããã«ãªãå¯èœæ§ãæããŸãããRuby Boxã¯ãŸã å®éšçãªæ©èœã§ã¯ãããŸãããä»åŸãåŒãç¶ã泚ç®ããŠããããã§ãïŒ ZOZOããŒã¹ã®çŽ¹ä» ããã«ã¡ã¯ãDeveloper Engagementãããã¯ã® wiroha ã§ããããããã¯ZOZOãå瀟ã®åè³ããŒã¹ã®æ§åã玹ä»ããŸãã ä»åã¯åºçºåœæ¥ã®æã管å¶ãã©ãã«ã®åœ±é¿ã§é£è¡æ©ã®éèªã«ä¹±ããåºãŠããç¶æ³ããã®ã¹ã¿ãŒããšãªããŸãããæä¹äºå®ã®äŸ¿ãé
å»¶ãæ¬ èªãã®èŠéããç«ããªãã£ããããæ©ã
ã«ãã£ã³ã»ã«ããŠæ°å¹¹ç·ãžåãæ¿ããããšãåãå¥ãã4ã5æéããã£ããã®ã®æ¯èŒçæ©ãã®æéã«åœé€šå
¥ãã§ããŸããããŸãçŽåã®å°éã®åœ±é¿ã§åæµ·éã§ã¯é
éã®é
å»¶ãèµ·ããŠããããã§ããã幞ãããŒã¹ã®è·ç©ã¯ç¡äºã«å±ããŠãããäºå®ã©ããéå¶ã§ãããã§ã»ã£ãšããŸããã ä»åã®ããŒã¹ã¯ãã¡ãã·ã§ã³ÃAIã®2ã€ã®æ°ããäœéšããçšæããŸãããã²ãšã€ã¯ã Apps in ChatGPT ããããã²ãšã€ã¯WEARã¢ããªå
ã®ã çåãææ¡ ãæ©èœã§ãã ãã¡ãã·ã§ã³ÃAIã®æ°æ©èœãäœéšãããïŒ ã Apps in ChatGPT ãã®äœéšã§ã¯ãæè¡ã«ã³ãã¡ã¬ã³ã¹ã«åãã³ãŒãã£ããŒããçžè«ããæ¹ããèªåã®åçãæ®ã£ãŠããã£ãšããããã«ããã«ã¯ã©ããããããïŒããšè³ªåããæ¹ãªã©ãããããèªç±ãªå¯Ÿè©±ã楜ããã§ããæ§åãèŠãããŸããã ãApps in ChatGPTããäœéšäžã®æ§å ã çåãææ¡ ãã¯ç¹å®ã®ã¢ã€ãã ãéžæãããšããã¡ãã·ã§ã³ã«ç¹åããAIããŠãŒã¶ãŒã®å¥œã¿ã«åãããçåããææ¡ããŸãããç¥ããªãã£ãã䟿å©ããïŒããšããææ³ãå€ãããã ããŸããã ãçåãææ¡ããäœéšäžã®æ§å ããããã®äœéšãããŠããã ããæ¹ã«ãZOZOãããããã«ãã£ã®ã æŽæ¿¯ããã ãããã¬ãŒã³ãããŸããããã¡ããã©ä»æ¥æŽæ¿¯ããããšæã£ãŠãŸããããæŽæ¿¯ããããæ¬²ãããŠäœéšãã«æ¥ãŸããããšãã£ã声ããããæ¥åžžçã«äœ¿ããã¢ã€ãã ãšããŠå€ãã®æ¹ã«åãã§ããã ããŸããïŒ ZOZOãããããã«ãã£ã®æŽæ¿¯ããã åè³äŒæ¥ããŒã¹ã®ã³ãŒãã£ããŒããŸãšã assu_ ã§ããåœé€šãžã¯ãããªã蟿ãçãââã¯ãã§ãããäŒäž¹ç©ºæž¯ã§çªåŠå±ãæ¬ èªã®ç¥ãããæºåžã®åœé€šäŸ¿ãè¿«ãããæ±ºæãæ»ã蟌ãã æ°åæ³è¡ããããããã§é«ã寿åžãè²·ããç¹æ¥åæã§åœé€šãžãå®¶ãåºãŠããå®ã«13æéãæ¥µå¯ã®åœé€šã«å°çââèç¡ã®å¿ãæã£ãã®ã¯ãåœé€šé§
åã®ãã»ã¬ã¯ã¹ãã¢ã波乱ã®ç§»åãçµãŠèŸ¿ãçããäŒå Žã«ã¯ãåãããã«å€§å€ãªæãããã人ãå°ãªããããŸããã§ããã ãããªäŒå Žãããååã® RubyKaigi 2025 åæ§ãçŽ æµãªã³ãŒãã£ããŒãã®åè³äŒæ¥ã®çæ§ãæ®åœ±ãããŠããã ããŸããïŒ ãã¶ã€ã³ã¹ãã³ãµãŒã®Gaji-Laboãã Committeréå®ã®MA-1ã¯ãåžå°æ§ãšåºç¹ã®2026ãã¶ã€ã³ããšãŠãã¯ãŒã«ã åæµ·éãããã€ã©ã¹ãããããã£ãããŒãã£ãŒã® note ããã ãã³ããã¢ãã¯ãã«ãããšåæµ·éããããªã£ããšãã GMO Flatt Security ããã CM ã§ããªãã¿ã®ãã£ã©ã¯ã¿ãŒã«ããåæ§çãªãã¶ã€ã³ã® ãã¡ã€ã³ã㣠ããã ã·ã³ãã«èžå
ãšã«ã¿ã«ãèäžã®å¯Ÿæ¯ãè¯ããããããããã¯ã·ã§ã³ãºããã è¥ã·ã£ãã«çµãä»ãã®è£Ÿãç·æ§ã女æ§ãçããªãäžæã ã£ãã®ããã£ããã ããŽã®ã©ã€ã³ãä»ã£ãœããèŠèªæ§ãé«ãã»ã³ã¹ã®è¯ãWEDããã èªãé«ããã¶ã€ã³ã«ãããé·ã RubyæŽ ã衚ããŠããKOMOJUããã æ¡ãæºéã®åœé€šã«äžçªãŽã£ãããªã«ã©ãŒãšãæ³è¢«ã§è¯ãããªwithããã Wellness Sponsorããããã©ãã¯ã§ â W âorkoutããããããªhacomonoããã åæµ·éã»åœé€šããããã¶ã€ã³ããå€åããæ°æž©ã«å¯Ÿå¿ããããããªåœ¢ãç®ç«ã£ãåã§ãããããå¿ããäžãååããã ããããŒã¹ã®çãããæ¬åœã«ããããšãããããŸããïŒ RubyKaigi 2026 ã¢ãã¿ãŒã€ãã³ããååå LTã»ã¹ãã³ãµãŒ4瀟ã®ããã«ããéå¬ããŸã RubyKaigi 2026 ã¢ãã¿ãŒã€ãã³ããååå LTã»ã¹ãã³ãµãŒ4瀟ã®ããã«ã 5æ13æ¥ïŒæ°ŽïŒã«RubyKaigi 2026ã¹ãã³ãµãŒäŒæ¥ã®æ ªåŒäŒç€ŸZOZOãæ ªåŒäŒç€Ÿãªãã»ã³ã¹ãæ ªåŒäŒç€ŸTOKIUMãæ ªåŒäŒç€Ÿãã€ãã¹ãã§RubyKaigi 2026ã®ã¢ãã¿ãŒã€ãã³ãã RubyKaigi 2026 ã¢ãã¿ãŒã€ãã³ããååå LTã»ã¹ãã³ãµãŒ4瀟ã®ããã«ã ããéå¬ããŸãã RubyKaigi 2026ã«åå ããæ¹ããåå ã§ããªãã£ãæ¹ãããã²ãæ°è»œã«ãåå ãã ããïŒ mybest.connpass.com ãããã« äžçäžã®Rubyistãåœé€šã®å°ã«éãŸããŸããïŒ ZOZOã¯æ¯å¹ŽRubyKaigiã«åè³ããããŒã¹ãåºå±ããŠãããä»å¹Žãå€ãã®æ¹ã
ãšã®äº€æµãéããŠææçŸ©ãªæéãéããããšãã§ããŸãããå®è¡å§å¡äŒã®çæ§ããããŠæž©ããè¿ããŠãã ãã£ãåœé€šåžã®çæ§ã«æè¬ç³ãäžããŸããæ¥å¹Žãåã³çŽ æŽãããæéãå
±æã§ããããšã楜ãã¿ã«ããŠãããŸãïŒ æè¡ã«ã³ãã¡ã¬ã³ã¹ã§ã¯æäŸã®ã¹ãã³ãµãŒããã«ãžã®ãµã€ã³ïŒ RubyKaigi 2027 #rubykaigi ðïž 14..16 Apr 2027 ð¥ Miyazaki, Japan — RubyKaigi (@rubykaigi) 2026幎4æ24æ¥ ãããŠã次åã®éå¬å°ã¯ç§ãã¡ZOZOã®å®®åŽãªãã£ã¹ãããå®®åŽçã§ããå®®åŽåšäœãšã³ãžãã¢ãæ°ååšç±ããŠããã®ã§ãå°å
ãçãããã€ãã³ããªã©ãã§ãããšè¯ãã§ãããããã§ã¯ãŸãæ¥å¹ŽãRubyKaigi 2027ã§ãäŒãããŸããããçŸå Žããã¯ä»¥äžã§ãïŒ ZOZOã§ã¯ãæ¥å¹Žã®RubyKaigi 2027ãäžç·ã«çãäžãããšã³ãžãã¢ãåéããŠããŸãããèå³ã®ããæ¹ã¯ä»¥äžã®ãªã³ã¯ãããå¿åãã ããã corp.zozo.com
ã¯ããã« ããã«ã¡ã¯ãã¯ã©ãŠããšãŒã¹æ ªåŒäŒç€Ÿ 第äºéçºéšã®ç°äžã§ãã ããã°ã©ã ã³ãŒããåãªããæååããšããŠäžèŽæ€çŽ¢ããã®ã§ã¯ãªãããã®ãåŠçå
å®¹ïŒæå³ïŒãã§æ€çŽ¢ãããæ¯èŒãããã§ããã䟿å©ã ãšæããŸãããïŒ ç€Ÿå
ã®ã³ãŒãããŒã¹ãå¢ããã»ã©ãããã®åŠçãã©ãã«ãã£ãã£ãïŒããšæå³ã§æ€çŽ¢ããããªãå Žé¢ã¯å€ããšæããŸãã ä»åã¯ãGoogle Cloud ã® BigQuery ã§æäŸãããŠãã AI.EMBEDïŒãšã³ããã£ã³ã°çæïŒã䜿ã£ãŠãç°ãªãããã°ã©ãã³ã°èšèªéããã³ãŒããšæ¥æ¬èªïŒèªç¶èšèªïŒã®ãæå³çãªè¿ãããæž¬ãå®éšãããŠã¿ãŸããã åã蟌ã¿ã¢ãã«ã«ã¯ gemini-embed
ã¯ããã« ããã«ã¡ã¯ãã¯ã©ãŠããšãŒã¹æ ªåŒäŒç€Ÿ 第äºéçºéšã®ç°äžã§ãã ããã°ã©ã ã³ãŒããåãªããæååããšããŠäžèŽæ€çŽ¢ããã®ã§ã¯ãªãããã®ãåŠçå
å®¹ïŒæå³ïŒãã§æ€çŽ¢ãããæ¯èŒãããã§ããã䟿å©ã ãšæããŸãããïŒ ç€Ÿå
ã®ã³ãŒãããŒã¹ãå¢ããã»ã©ãããã®åŠçãã©ãã«ãã£ãã£ãïŒããšæå³ã§æ€çŽ¢ããããªãå Žé¢ã¯å€ããšæããŸãã ä»åã¯ãGoogle Cloud ã® BigQuery ã§æäŸãããŠãã AI.EMBEDïŒãšã³ããã£ã³ã°çæïŒã䜿ã£ãŠãç°ãªãããã°ã©ãã³ã°èšèªéããã³ãŒããšæ¥æ¬èªïŒèªç¶èšèªïŒã®ãæå³çãªè¿ãããæž¬ãå®éšãããŠã¿ãŸããã åã蟌ã¿ã¢ãã«ã«ã¯ gemini-embed


















