
- TOP
- ã¿ã°äžèЧ
- ããã°ã©ãã³ã°
ããã°ã©ãã³ã°
ã€ãã³ã
ãã¬ãžã³
æè¡ããã°
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 ]( http: //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
Amazon ElastiCache ã§ã®å
šææ€çŽ¢ãå®å
šäžèŽæ€çŽ¢ãç¯å²æ€çŽ¢ããã€ããªããæ€çŽ¢
æ¬èšäºã¯ 2026 幎 5 æ 7 æ¥ã«å
¬éããã â Full-text, exact-match, range, and hybrid search on Amazon ElastiCache â ã翻蚳ãããã®ã§ãã èš³è
èš»ïŒ æ¬èšäºã®å
šææ€çŽ¢ã¯ãçŸæç¹ã§ã¯èšèªãªãã·ã§ã³ãšã㊠english ã®ã¿ããµããŒãããŠãããæ¥æ¬èªããã¹ãã¯ã¹ããŒã¹ãå¥èªç¹ã§åºåãããåäœã§ã€ã³ããã¯ã¹ãããŸããæ¥æ¬èªãå
šææ€çŽ¢ããå Žåã¯ãäºåã«åœ¢æ
çŽ è§£æã§èªããšã«ã¹ããŒã¹ã§åºåã£ãããã¹ããã€ã³ããã¯ã¹ããæ€çŽ¢ã¯ãšãªãåãåœ¢ã§æž¡ãããã«ããŠãã ããã Amazon ElastiCache ã¯ãå¥åã®æ€çŽ¢ãµãŒãã¹ã䜿çšããããšãªãããã£ãã·ã¥å
ã§çŽæ¥ãªã¢ã«ã¿ã€ã ã®å
šææ€çŽ¢ãå®å
šäžèŽæ€çŽ¢ãæ°å€ç¯å²æ€çŽ¢ããã€ããªããæ€çŽ¢ããµããŒãããããã«ãªããŸãããäœã¬ã€ãã³ã·ãŒã§åçããŒã¿ã«å¯Ÿããã¹ã±ãŒã©ãã«ãªæ€çŽ¢ãå¿
èŠãšããã¯ãŒã¯ããŒãã«å¯ŸããŠãã¢ããªã±ãŒã·ã§ã³ã¯ãã€ã¯ãç§åäœã®ã¬ã€ãã³ã·ãŒãšæ¯ç§æå€§æ°çŸäžåã®æ€çŽ¢æäœã®ã¹ã«ãŒãããã§ãã©ãã€ãèŠæš¡ã®ããŒã¿ãæ€çŽ¢ã§ããŸãããããã®æ°ããæ€çŽ¢æ©èœã«ãããéçºè
㯠ElastiCache ã«æ¢ã«ä¿åãããŠããããŒã¿ããåçŽãªããŒããªã¥ãŒæ€çŽ¢ãè¶
ãã屿§ã§æè»ã«ã¯ãšãªã§ããããã«ãªããŸãã å®å
šäžèŽæ€çŽ¢ã¯ãåååãã«ããŽãªããŠãŒã¶ãŒ IDãæ³šæçªå·ãªã©ãããã¹ããã¿ã°ãæ°å€å±æ§ã«ãããæ£ç¢ºãªå€ã®äžèŽã«ãã£ãŠããã¥ã¡ã³ããååŸããŸããæ°å€ç¯å²æ€çŽ¢ã¯ãäŸ¡æ Œã®ãããå€ãæ¥ä»ç¯å²ãååŒéé¡ãªã©ã®å±æ§ã«ãã£ãŠããã¥ã¡ã³ãããã£ã«ã¿ãªã³ã°ããŸããå®å
šäžèŽã«å ããŠãå
šææ€çŽ¢ã¯ããã¹ã屿§ã«å¯ŸããŠããªãŒãã³ã³ããªãŒã (å
¥åè£å®) çšã®ãã¬ãã£ãã¯ã¹ãããã³ã°ãã¿ã€ããã¹èš±å®¹ã®ããã®ãã¡ãžãŒãããã³ã°ãè€æ°èªæ€çŽ¢ã®ããã®è¿æ¥ãããã³ã°ãå®è¡ããŸãããããã®æ€çŽ¢ã¿ã€ãããã¯ãã«é¡äŒŒåºŠãšåäžã®ãã€ããªããã¯ãšãªã§çµã¿åãããããšãã§ããæ£ç¢ºãªçšèªãšæå³çãªæå³ã®äž¡æ¹ãæããããšã§ãããããã®ææ³ãåç¬ã§äœ¿çšãããããé¢é£æ§ã®é«ãçµæãæäŸããŸãããã¯ãã«ã¯ãŒã¯ããŒãã«ãããŠãElastiCache for Valkey 㯠AWS äžã®äž»èŠãªãã¯ãã«ããŒã¿ããŒã¹ã®äžã§ã95% 以äžã®åçŸçã§æäœã¬ã€ãã³ã·ãã€æé«ã¹ã«ãŒãããã®ãã¯ãã«æ€çŽ¢ããããŠæé«ã®äŸ¡æ Œæ§èœæ¯ãå®çŸããŸãã ãããã®æ€çŽ¢æ©èœã¯ãElastiCache version 9.0 for Valkey ã§å©çšå¯èœã§ããããªã¢ã«ã¿ã€ã åæãã¬ããŒãã£ã³ã°åãã®ãµãŒããŒãµã€ãéèšæ©èœã䜵ããŠæäŸãããŠããŸã ( Amazon ElastiCache ã§ã®éèšæ©èœã®ãç¥ãã ãåç
§)ãElastiCache version 9.0 for Valkey ã§ã¯ãåã
ã®ãã£ãŒã«ãã«å¯Ÿãããã现ãã TTL å¶åŸ¡ãå¯èœã«ããããã·ã¥ãã£ãŒã«ãã®æå¹æéæ©èœããæå€§ 40% åäžãããã€ãã©ã€ã³åã¹ã«ãŒããããå°å
¥ãããŠããŸãããªãªãŒã¹ã®è©³çްã«ã€ããŠã¯ã Amazon ElastiCache åã Valkey 9.0 ã®ãç¥ãã ãã芧ãã ããã ãã®èšäºã§ã¯ãæ°ããæ€çŽ¢æ©èœãé ã远ã£ãŠç޹ä»ããããããã©ã®ããã«é£æºãããã瀺ããªãããæ€çŽ¢ããã³ã¬ã³ã¡ã³ããŒã·ã§ã³ãšã³ãžã³ããŒãããæ§ç¯ããŠãããŸãã è€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã«ããã匷åãªãªã¢ã«ã¿ã€ã æ€çŽ¢ãå®çŸ ã客æ§ããã¯ãã¢ããªã±ãŒã·ã§ã³ãã¹ã±ãŒã«ããã«ã€ããŠãæ€çŽ¢ã¯ãŒã¯ãããŒãããžãã¹ã«æ±ããããã¹ã«ãŒãããããµããŒãããªããããŠãŒã¶ãŒãæåŸ
ããäœã¬ã€ãã³ã·ãŒã®äœéšãç¶æããå¿
èŠããããšã®å£°ãå¯ããããŠããŸããäŸãã°ã決æžãã©ãããã©ãŒã ãã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ããªã³ã©ã€ã³å°å£²æ¥è
ãªã©ã¯ãäœçŸäžãã®ããã¥ã¡ã³ãã ElastiCache ã«ä¿åãããã€ã¯ãç§ã®ã¬ã€ãã³ã·ãŒã§ã¡ã¿ããŒã¿å±æ§ã«ãã£ãŠããŒã¿ãååŸããå¿
èŠããããŸããããã«ãã¯ãŒã¯ããŒããé²åããã«ã€ããŠããã§ã« ElastiCache ã«ä¿åãããŠããããŒã¿ã«å¯ŸããŠæ°ãããŠãŒã¹ã±ãŒã¹ããµããŒãããè±å¯ãªæ€çŽ¢ã¯ãšãªãå¿
èŠã ãšããã客æ§ã®å£°ããããŸããäŸãã°ãã¢ããªã±ãŒã·ã§ã³ã¯ããã€ã¹ã¿ã€ããã»ãã·ã§ã³ç¶æ
ããŠãŒã¶ãŒã¢ã¯ãã£ããã£ãªã©ã®ãŠãŒã¶ãŒããã³ã»ãã·ã§ã³ã³ã³ããã¹ãã ElastiCache ã«ä¿åããäœã¬ã€ãã³ã·ãŒã®äœéšãæäŸããããšããããããŸããã¯ãŒã¯ããŒããé²åããã«ã€ããŠãã客æ§ã¯ãã®åãããŒã¿ãã¬ã³ã¡ã³ããŒã·ã§ã³ã·ã¹ãã ã®åºç€ãšããŠæŽ»çšããããšèããŠããããã®ããã«ã¯ãããã®å±æ§ããŸããã æ€çŽ¢ãå¿
èŠã«ãªããŸãã ElastiCache ã§ã¯ããã€ã¯ãç§åäœã®äœã¬ã€ãã³ã·ãŒãšæ¯ç§æ°çŸäžã¯ãšãª (QPS) ã®ã¹ã«ãŒãããã§ããŒã¿ãæ€çŽ¢ã»ååŸããããã®ããŸããŸãªæ¹æ³ãæäŸãããããã«ãªããŸãããæžã蟌ã¿ãå®äºãããšããã«ããŒã¿ãæ€çŽ¢å¯èœã«ãªããããã¢ããªã±ãŒã·ã§ã³ã¯åžžã«ææ°ã®çµæãã¯ãšãªã§ããŸãããããã®æ©èœã¯ãã«ã¿ãã°æ€çŽ¢ãã¬ã³ã¡ã³ããŒã·ã§ã³ãšã³ãžã³ããšãŒãžã§ã³ãåã¡ã¢ãªããªã¢ã«ã¿ã€ã ã®ãªãŒããŒããŒããã»ãã·ã§ã³æ€çŽ¢ãªã©ã®ãŠãŒã¹ã±ãŒã¹ãæ¯ããŸãã ã«ã¿ãã°æ€çŽ¢: ãªã³ã©ã€ã³å°å£²æ¥è
ãã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ã¯ã顧客ãå€§èŠæš¡ãªã«ã¿ãã°ããååãèŠã€ãããããããªæ€çŽ¢äœéšãæ§ç¯ããŠããŸãããããã®ãã©ãããã©ãŒã ã§ã¯ãåååã説ææã«å¯Ÿããããã¹ãæ€çŽ¢ãšããã©ã³ããã«ããŽãªãäŸ¡æ Œãè©äŸ¡ã«ãããã£ã«ã¿ãåäžã®ã¯ãšãªã§çµã¿åãããããšã§ããã¡ã»ãããã©ãŠãžã³ã°äœéšãæäŸã§ããŸãããã¬ãã£ãã¯ã¹ãããã³ã°ã¯ããŠãŒã¶ãŒãå
¥åããã«ã€ããŠåè£ãèªã¿èŸŒãã¿ã€ãã¢ãããæ€çŽ¢ãå®çŸãããã€ã¯ãç§åäœã§çµæãè¿ããããå³åº§ã«åå¿ãããããªäœéšãæäŸããŸããããã«ããã¡ãžãŒãããã³ã°ã掻çšããã¿ã€ããã¹ã«åŒ·ãæ€çŽ¢ãçµã¿åãããããšã§ãã¹ãã«ãã¹ãèªåçã«åŠçããæ€çŽ¢äœéšãããå
ç¢ã«ã§ããŸãããã¡ãžãŒãããã³ã°ã¯å®å
šäžèŽæ€çŽ¢ãããèšç®ã³ã¹ããé«ããããElastiCache ã®ãããªã€ã³ã¡ã¢ãªæ€çŽ¢ãšã³ãžã³äžã§å®è¡ããããšã§ãé«éã§å¿çæ§ã®é«ãäœéšãç¶æã§ããŸãã ã¬ã³ã¡ã³ããŒã·ã§ã³ãšã³ãžã³: ã«ã¿ãã°ãæ°çŸäžã¢ã€ãã ã«æ¡å€§ããã«ã€ããŠããŠãŒã¶ãŒã¯ããžã¿ã«ãã©ãããã©ãŒã ã«å¯ŸããŠãé¢é£æ§ã®é«ãã³ã³ãã³ããååãçŽ æ©ã衚瀺ããããŒãœãã©ã€ãºãããé²èЧäœéšãæåŸ
ããŠããŸããææ°ã®ã¬ã³ã¡ã³ããŒã·ã§ã³ã·ã¹ãã ã¯ããŠãŒã¶ãŒãšã¢ã€ãã ããã¯ãã«åã蟌ã¿ãšããŠãšã³ã³ãŒãããŸãããããã®ã·ã¹ãã ã¯ããã¯ãã«æ€çŽ¢ãšååã説æãã«ããŽãªãåšåº«ç¶æ³ãäŸ¡æ Œåž¯ãªã©ã®ãã£ã«ã¿ãŒãçµã¿åãããŠãæ°çŸäžã®ã¢ã€ãã ããã¬ã³ã¡ã³ããŒã·ã§ã³åè£ãååŸããŸãããã€ããªããæ€çŽ¢ã¯ãããã¹ããã¿ã°ãæ°å€ãã£ã«ã¿ãŒããã¯ãã«é¡äŒŒåºŠãšåäžã®ã¯ãšãªã§çµã¿åãããããšã§ããããµããŒãããååŸãããåè£ã¯æå³çã«é¢é£æ§ããããããžãã¹äžã®å¶çŽãæºãããŸããååããŒãžã§ã¯ãåãã«ããŽãªãšäŸ¡æ Œåž¯ã«ãã£ã«ã¿ãªã³ã°ããŠããåã蟌ã¿ã®é¡äŒŒåºŠã§ã©ã³ã¯ä»ãããããšã§ããé¡äŒŒã¢ã€ãã ãã衚瀺ã§ããŸãããããæ¡åŒµããŠãè¡åå±¥æŽ (é²èЧããã¢ã€ãã ã®åã蟌ã¿ã®å¹³åããŒãªã³ã°ãã¢ãã³ã·ã§ã³ããŒã¹ã®ã¢ãã«ãã·ãŒã±ã³ã·ã£ã«ã¢ãã«ãªã©ã®ææ³ã䜿çš) ãããŠãŒã¶ãŒåã蟌ã¿ãæ§ç¯ããããããã¯ãã«ã¯ãšãªãšããŠæž¡ãããšã§ãåŠç¿ããå奜ã«åºã¥ããŠçµæãã©ã³ã¯ä»ãããããŒãœãã©ã€ãºãããã¬ã³ã¡ã³ããŒã·ã§ã³ãå®çŸã§ããŸãã ãšãŒãžã§ã³ãã¡ã¢ãª: ãšãŒãžã§ã³ãã¡ã¢ãªã¯ããšãŒãžã§ã³ããéå»ã®ããåãããåŠç¿ããããšã§ãäŒè©±å±¥æŽå
šäœãåçããããšãªãå¿çã®é¢é£æ§ãåäžãããããŒã¯ã³ã³ã¹ããåæžããŸãããšãŒãžã§ã³ãã¡ã¢ãªã·ã¹ãã ã¯ãã¹ã³ãŒã屿§ (ãŠãŒã¶ãŒããšãŒãžã§ã³ããã»ãã·ã§ã³) ãšçŸåšã®ããåãã«å¯Ÿããæå³çé¢é£æ§ã«ãã£ãŠã¡ã¢ãªãä¿åã»ååŸããŸãããã€ããªããæ€çŽ¢ã䜿çšããããšã§ããããã®ã·ã¹ãã ã¯ã¹ã³ãŒããããã¹ããã£ã«ã¿ãŒãšãã¯ãã«é¡äŒŒæ§ã 1 ã€ã®ã¯ãšãªã§çµã¿åãããŸãããšãŒãžã§ã³ãã¡ã¢ãªã¯ã©ã€ãã®äŒè©±ãã¹äžã«ãããããæžã蟌ã¿åŸããã«èªã¿åããå¯èŠæ§ãæ±ããããæ°ããä¿åãããäºå®ãå³åº§ã«ååŸå¯èœã§ããå¿
èŠããããæ°ããã¡ã¢ãªã®ååŸãšçµ±åã®ããã«é«ãåæèªã¿æžãæ§èœãæ±ããããŸããElastiCache ã¯æžãèŸŒã¿æã«ã¡ã¢ãªãåæçã«ã€ã³ããã¯ã¹åãããã«ãã¹ã¬ããã£ã³ã°ã掻çšããAWS äžã®äž»èŠãªãã¯ãã«ããŒã¿ããŒã¹ã®äžã§æé«ã®ã¹ã«ãŒãããããã€ã¯ãç§ã¬ãã«ã®ã¬ã€ãã³ã·ãŒã§æäŸããŸããElastiCache ãš Mem0 ã䜿çšããã¹ããããã€ã¹ãããã®å®è£
ã«ã€ããŠã¯ã Build persistent memory for agentic AI applications with Mem0 Open Source, ElastiCache for Valkey, and Amazon Neptune Analytics ãã芧ãã ããã ElastiCache for Valkey ã¯ãã»ã«ããããŒãžãã®ã¡ã¢ãªã¬ã€ã€ãŒãæ§ç¯ãããå Žåããäœã¬ã€ãã³ã·ã§ã«ã¹ã¿ãã€ãºå¯èœãªã€ã³ã¡ã¢ãªã¹ãã¢ãå¿
èŠãªå Žåã«é©ããŠããŸãããã«ãããŒãžãã®ã¢ãããŒããã奜ã¿ã®å Žåã¯ã Amazon Bedrock AgentCore Memory ã䜿çšããŠã¡ã¢ãªã管çããããšãã§ããŸãã éèã¢ããªã±ãŒã·ã§ã³ãšãªãŒããŒããŒã: ååŒãã©ãããã©ãŒã ãã²ãŒã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãååŒéé¡ãã¿ã€ã ã¹ã¿ã³ãããªã¹ã¯ã¹ã³ã¢ããã¬ã€ã€ãŒã©ã³ãã³ã°ãšãã£ãæ°å€å±æ§ãæã€ããã¥ã¡ã³ããä¿åããäœã¬ã€ãã³ã·ãŒã§ååŸããå¿
èŠããããŸããElastiCache ã®æ°å€ç¯å²ã¯ãšãªã¯ããããã®å±æ§ã«å¯Ÿããé«éãªæ€çŽ¢ããµããŒãããæéæ ãéé¡ã®ãããå€ãã¹ã³ã¢åž¯ã«ãããã£ã«ã¿ãªã³ã°ãå¯èœã«ããŸããã²ãŒã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¹ã³ã¢ã®æŽæ°ãå³åº§ã«åæ ãããªã¢ã«ã¿ã€ã ãªãªãŒããŒããŒããç¶æã§ãããèªåã®å°åã®ããã 100 ãã¬ã€ã€ãŒãã®ãããªç¯å²ã¯ãšãªã«ã察å¿ã§ããŸãã ãŠãŒã¶ãŒããã³ã»ãã·ã§ã³ç®¡ç: 忥çã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã»ãã·ã§ã³ç®¡çã®ããã«ã»ãã·ã§ã³ IDãããã€ã¹ã¿ã€ãããŠãŒã¶ãŒãã³ãã«ãšãã£ãæ§é å屿§ããã£ãã·ã¥ã«ä¿åããŠããŸãããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒããã°ã€ã³ãããšã»ãã·ã§ã³ããŒã¿ããã£ãã·ã¥ã«æžã蟌ã¿ãã»ãã·ã§ã³ã®ã©ã€ããµã€ã¯ã«ãéããŠæŽæ°ãããããå³æã«æ€çŽ¢å¯èœãªé«éæžã蟌ã¿ãæ±ããããŸããElastiCache ã¯æŽæ°ãåæçã«ã€ã³ããã¯ã¹åãããããã»ãã·ã§ã³å±æ§ã«å¯Ÿããæ€çŽ¢ã¯é
å»¶ãªãææ°ã®ç¶æ
ãåæ ããŸããå®å
šäžèŽæ€çŽ¢ã«ãããæ°çŸäžã®ããã¥ã¡ã³ãããæ£ç¢ºãªèå¥åã«åºã¥ããŠã¢ã¯ãã£ããªã»ãã·ã§ã³ãæš©éããµãããªç§ã®ã¬ã€ãã³ã·ãŒã§ç¹å®ã§ããŸãã ElastiCache ã䜿ã£ãæ€çŽ¢ã»ã¬ã³ã¡ã³ããŒã·ã§ã³ãšã³ãžã³ã®æ§ç¯ ãããã®æ€çŽ¢ã¿ã€ããçµã¿åãããŠå®æŒããããããšã¬ã¯ãããã¯ã¹ãçŸå®¹ãå®¶åºçšåãªã©äœçŸäžãã®è£œåã販売ãã e ã³ããŒã¹ãã©ãããã©ãŒã AnyCompany åãã®æ€çŽ¢ããã³ã¬ã³ã¡ã³ããŒã·ã§ã³ãšã³ãžã³ãæ§ç¯ããŸããAnyCompany ã¯ãè²·ãç©å®¢ãããŒã¯ãŒãã§è£œåãèŠã€ãããã©ã³ããäŸ¡æ Œåž¯ãªã©ã®ãã£ã«ã¿ãŒã§çµã蟌ã¿ãé¡äŒŒæ§ãéããŠé¢é£ååãçºèŠã§ããæ€çŽ¢äœéšãæ±ããŠããŸããAnyCompany 㯠100 äžãè¶
ããååã«ã¿ãã°ã ElastiCache ã«ããã·ã¥ããŒã¹ã®ããã¥ã¡ã³ããšããŠä¿åããŠããŸã (ãã®äŸã§ã¯ãå®éã®ã¿ã€ãã«ã説æããã©ã³ããå«ã Amazon ESCI ããŒã¿ã»ãã ããæŽŸçãããã®)ãæ¬¡ã®ã³ãŒãã¯ããã®ããŒã¿ã«å¯Ÿã㊠5 ã€ã®ã¯ãšãªãã¿ãŒã³ãæ§ç¯ããŸã: å
¥åè£å®æ€çŽ¢ãå
šæäžèŽãã¿ã€ãã«åŒ·ããããã³ã°ããã£ã«ã¿ãŒä»ããã©ãŠãžã³ã°ããããŠé¡äŒŒååã®ã¬ã³ã¡ã³ããŒã·ã§ã³ã§ãã åææ¡ä»¶ ãã®èšäºã®äŸã§ã¯ã valkey-py ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªãš Python ã䜿çšããŠããŸããæé ãå®è¡ããã«ã¯ã以äžãå¿
èŠã§ã (æèŠæéã®ç®å®: 30 å): AWS ã¢ã«ãŠã³ã ãš AWS Command Line Interface (AWS CLI) ElastiCache ã¬ããªã±ãŒã·ã§ã³ã°ã«ãŒããäœæããæš©éãæã€ AWS IAM ããŒã« Amazon ElastiCache ã¯ã©ã¹ã¿ãŒãšåã VPC å
ã«ãã Amazon EC2 ã€ã³ã¹ã¿ã³ã¹ (ãŸã㯠Amazon ElastiCache ã«æ¥ç¶å¯èœ ãªä»»æã®ã¢ããªã±ãŒã·ã§ã³) Python 3.9 以éããã³ valkey-py ããŒãžã§ã³ 6.1.1 以é (pip install valkey) ãã®èšäºã®å®å
šãªãµã³ãã«ã³ãŒãã¯ãElastiCache samples GitHub ãªããžããªã§å
¥æã§ããŸãã ElastiCache for Valkey ã¯ã©ã¹ã¿ãŒã®ã»ããã¢ãã ElastiCache ã®æ€çŽ¢çšã¯ã©ã¹ã¿ãŒã¯ãAWS Management Console ãŸã㯠AWS CLI ã䜿çšããŠäœæã§ããŸãã以äžã®äŸã§ã¯ CLI ã䜿çšããŠããŸããæ€çŽ¢æ©èœã¯ ElastiCache for Valkey ããŒãžã§ã³ 9.0 以éã§å©çšå¯èœã§ãã aws elasticache create-replication-group \ --replication-group-id AnyCompany-cache \ --replication-group-description "AnyCompany Valkey cluster" \ --engine valkey \ --engine-version 9.0 \ --transit-encryption-enabled \ --cache-node-type cache.r7g.large \ --replicas-per-node-group 0 ã€ã³ããã¯ã¹ã®äœæãšããŒã¿ã®ããŒã ååããŒã¿ãæ€çŽ¢å¯èœã«ããããã products_vec_index ãšããã€ã³ããã¯ã¹ãäœæããŸããã¿ã€ãã«ãšèª¬æã¯ãããŒã¯ãŒããåæ¹äžèŽããããŸãæ€çŽ¢ããµããŒãããå
šææ€çŽ¢å¯èœãªå±æ§ãšããŠã€ã³ããã¯ã¹åãããŸãããã©ã³ããšè²ã¯ãçµãèŸŒã¿æ€çŽ¢ã®ããã«å®å
šäžèŽã¿ã°ãšããŠã€ã³ããã¯ã¹åãããŸããäŸ¡æ Œãè©äŸ¡ãåšåº«ã¯ãç¯å²ã¯ãšãªããœãŒãã®ããã«ãœãŒãå¯èœãªæ°å€å±æ§ãšããŠã€ã³ããã¯ã¹åãããŸãã embedding ã¯ãã»ãã³ãã£ãã¯é¡äŒŒæ€çŽ¢ãã¬ã³ã¡ã³ããŒã·ã§ã³ã®ããã«ãã¯ãã«å±æ§ãšããŠã€ã³ããã¯ã¹åãããŸãã import gzip import json import struct import urllib.request import valkey from valkey.commands.search.field import TextField, TagField, NumericField, VectorField from valkey.commands.search.indexDefinition import IndexDefinition, IndexType # : Insert your ElastiCache cluster's endpoint VALKEY_HOST = "placeholder_cluster.cnxa6h.clustercfg.use1.cache.amazonaws.com" client = valkey.Valkey(host=VALKEY_HOST, port=6379, decode_responses=False, ssl=True, ssl_cert_reqs="required") # Create the search index with text, tag, numeric, and vector fields try: client.execute_command("FT.DROPINDEX", "products_vec_index") except: pass client.ft("products_vec_index").create_index( fields=[ TextField("title"), TextField("description"), TagField("brand", separator=","), TagField("color", separator=","), NumericField("price"), NumericField("rating"), NumericField("stock"), VectorField("embedding", "FLAT", { "TYPE": "FLOAT32", "DIM": 64, "DISTANCE_METRIC": "COSINE"})], definition=IndexDefinition(prefix=["pv:"], index_type=IndexType.HASH)) ElastiCache ã¹ãã¢ã«ååããŒã¿ã»ãããæå
¥ããŸãããã®ããŒã¿ã»ãã㯠130 äžä»¶ã®ååã®ãµãã»ããã§ãã¿ã€ãã«ã説æããã©ã³ããããã³ Amazon ESCI Shopping Queries ããŒã¿ã»ããããå°åºãããäºåèšç®æžã¿ã® 64 次å
ãšã³ããã£ã³ã°ãå«ã 13.7 äžä»¶ã®ååã§æ§æãããŠããŸãããµã³ãã«ãªããžããªãã¯ããŒã³ããããŒãã¹ã¯ãªãããå®è¡ããŠãã ããïŒ git clone https://github.com/aws-samples/amazon-elasticache-samples.git cd amazon-elasticache-samples/blogs/elasticache-valkey/fts-benchmark # <å
¥åãå¿
èŠ>: VALKEY_HOST 倿°ãã¯ã©ã¹ã¿ãŒã®ãšã³ããã€ã³ãã§æŽæ°ããŠå®è¡: python load_products_blog.py ã¿ã€ãã¢ãããæ€çŽ¢ (å
è¡å
¥åæ€çŽ¢) ã€ã³ããã¯ã¹ãšããŒã¿ãæºåã§ããããAnyCompany ã¯ã€ã³ããã¯ã¹ã«å¯ŸããŠå®è¡ãããäžèŽããããã¥ã¡ã³ããè¿ã FT.SEARCH ã¯ãšãªã䜿ã£ãŠæ€çŽ¢ãšã³ãžã³ãæ§ç¯ã§ããŸãããŠãŒã¶ãŒãæ€çŽ¢ããŒã«å
¥åãããšãã¢ããªã±ãŒã·ã§ã³ã¯ãã¬ãã£ãã¯ã¹ã¯ãšãªãéä¿¡ãããªã¢ã«ã¿ã€ã ã§åè£ã衚瀺ããŸãã from valkey.commands.search.query import Query results = client.ft("products_vec_index").search( Query("wire*").return_fields("title").paging(0, 5)) # User has typed "wire" - prefix match shows suggestions # Output: # [{'title': 'xyz Kids Wireless Headphones'}, # ... # ... # {'title': 'Santas Wire Christmas Lighting Storage Bag'}] ãã¬ãŒãºãããã³ã° ãŠãŒã¶ãŒã Enter ããŒãæŒããšãã¢ããªã±ãŒã·ã§ã³ã¯ã¿ã€ãã«ãšèª¬æã«å¯ŸããŠå
šææ€çŽ¢ãå®è¡ããŸããSLOP ã¯ãåèªå士ãã©ãã ãé¢ããŠããŠãäžèŽãšèŠãªãããå¶åŸ¡ããåèªãããè¿æ¥ããŠããçµæã»ã©äžäœã«ã©ã³ã¯ä»ããããŸãã # User submits "wireless headphones" # SLOP 2 allows up to 2 words between terms results = client.ft("products_vec_index").search( Query("wireless headphones") .slop(2) .return_fields("title", "brand", "price").paging(0, 5)) # Output: # [{'title': 'xyz Studio3 Wireless Headphones - Gray (Renewed)', # 'brand': 'xyz', 'price': '1928.28'}, # ... # {'title': 'xyz TUNE 220TWS - True Wireless in-Ear Headphone - Blue', # 'brand': 'xyz', 'price': '1121.23'}] ã¿ã€ããã¹ã蚱容ãããããã³ã° ã¯ãšãªãçµæãè¿ããªãå Žåãã¢ããªã±ãŒã·ã§ã³ã¯ã¿ã€ããã¹ãä¿®æ£ããããã«ãããŸãäžèŽ (fuzzy matching) ã§å詊è¡ããŸãããããŸãäžèŽã¯ç·šéè·é¢ãèšç®ããããã³ã¹ããé«ãã®ã§ãããã©ã«ããšããŠã§ã¯ãªããã©ãŒã«ããã¯ãšããŠäœ¿ãã®ãæé©ã§ãã # Retry with fuzzy matching for "wireles headphoens" results = client.ft("products_vec_index").search( Query("%wireles% %headphoens%") .return_fields("title", "brand", "price").paging(0, 5)) # Output: # [{'title': 'xyz Comfort 35 Wireless Headphones, Noise Cancelling - Silver (Renewed)', # 'brand': 'xyz', 'price': '1811.75'}, # ... # ... # {'title': 'xyz SoundSport Wireless Headphones, Black + Charging Case', # 'brand': 'xyz', 'price': '568.47'}] ãã£ã«ã¿ãªã³ã°ã«ããé²èЧ è²·ãç©å®¢ãååãæ€çŽ¢ããŠãã£ã«ã¿ãŒãé©çšãããšãã¢ããªã±ãŒã·ã§ã³ã¯ããã¹ãæ€çŽ¢ãšã¿ã°ããã³æ°å€ãã£ã«ã¿ãŒãåäžã®ã¯ãšãªã§çµã¿åãããŸãã # ãŠãŒã¶ãŒããheadphonesããæ€çŽ¢ããäŸ¡æ Œ $50-$150ãè©äŸ¡ 4.0 以äžã§ãã£ã«ã¿ãªã³ã° results = client.ft("products_vec_index").search( Query("@title:headphones @price:[50 150] @rating:[4.0 5.0]") .return_fields("title", "brand", "price", "rating") .paging(0, 5)) # åºå: # [{'title': 'xyz WH1000XM3 Bluetooth Wireless Noise Canceling Headphones', # 'brand': 'xyz', 'price': '102.29', 'rating': '4.8'}, # ... # ... # {'title': 'Bluetooth Earbuds xyz SoundLink .. in Ear Headphones', # 'brand': 'xyz', 'price': '125.45', 'rating': '4.5'}] é¡äŒŒååã®ã¬ã³ã¡ã³ããŒã·ã§ã³ ãé¡äŒŒååãã®ã¬ã³ã¡ã³ããŒã·ã§ã³ãå®çŸããããã«ãAnyCompany ã¯ããã¹ããã£ã«ã¿ãŒã䜿ã£ããã€ããªããæ€çŽ¢ã§çµæã該åœããååã¿ã€ãã«çµã蟌ã¿ããã¯ãã«æ€çŽ¢ã§è¡šç€ºäžã®ååãšã®é¡äŒŒåºŠã«åºã¥ããŠãã£ã«ã¿ãŒæžã¿ã®çµæãã©ã³ã¯ä»ãããŠããŸãã # Get the embedding of the product the user is currently viewing # for example - "Kids Headphones with Microphone 2 Pack" product_embedding = client.hget("pv:B0825SSTMN", "embedding") # Hybrid: text pre-filter "headphones" + vector KNN for similarity ranking results = client.ft("products_vec_index").search( Query("@title:headphones =>[KNN 5 @embedding $vec AS score]") .return_fields("title", "brand", "price", "score") .dialect(2), query_params={"vec": product_embedding}) # Output: # {'title': 'xyz I35 Kid Headphones with Microphone Volume Limited ...', # 'brand': 'xyz', 'price': '155.06', 'score': '0.293'}, # ... # ... # {'title': 'Kids Headphones with Pouch, xyz Wired ...', # 'brand': 'xyz', 'price': '957.95', 'score': '0.351'}] ãã®ãã¿ãŒã³ãæ¡åŒµããŠãåã蟌ã¿ããŒã¹ã®æ€çŽ¢ãæŽ»çšããããŒãœãã©ã€ãŒãŒã·ã§ã³ãå®çŸã§ããŸããé²èЧããã¢ã€ãã åã蟌ã¿ã®å¹³åããŒãªã³ã°ãã¢ãã³ã·ã§ã³ããŒã¹ã®ã¢ãã«ãã·ãŒã±ã³ã¹ã¢ãã«ãªã©ã®ææ³ãçšããŠãè²·ãç©å®¢ã®ã€ã³ã¿ã©ã¯ã·ã§ã³å±¥æŽãããŠãŒã¶ãŒåã蟌ã¿ãæ§ç¯ããŸããåäžã®åååã蟌ã¿ã®ä»£ããã«ãŠãŒã¶ãŒåã蟌ã¿ããã¯ãã«ã¯ãšãªãšããŠæž¡ãããšã§ãKNN ã¹ã³ã¢ãªã³ã°ããã£ã«ã¿ãªã³ã°ãããéåã®äžãããè²·ãç©å®¢ã®åŠç¿æžã¿ã®å奜ã«åºã¥ããŠçµæãã©ã³ãã³ã°ããŸãã å
éšã®ä»çµã¿ãšããã©ãŒãã³ã¹ ã¬ã€ãã³ã·ãŒãšã¹ã«ãŒãããããããã¹ããšæ°å€ã®ã¯ãšãªã¿ã€ãã«ã€ããŠãã¬ããªã«ãªãã®åäžã® cache.r7g.2xlarge ããŒããå«ã 1 ã·ã£ãŒãæ§æã® ElastiCache for Valkey ã¯ã©ã¹ã¿ãŒäžã§èšæž¬ããŸãããããŒã¿ã»ããã«ã¯çŽ 1 GB ã®ããŒã¿ãå«ãŸããŠãããäžèšã®äŸã§èª¬æããããã¹ããã¿ã°ãæ°å€ããã¯ãã«å±æ§ãæã€ 130 äžä»¶ã®è£œåããã¥ã¡ã³ãã§æ§æãããŠããŸããã¬ã€ãã³ã·ãŒãšã¹ã«ãŒãããã®èšæž¬ã«ã¯ valkey-benchmark ã䜿çšããŸããã ã¯ãšãªã¿ã€ã P50 (ms) 1 ã¯ã©ã€ã¢ã³ã P99 (ms) 1 ã¯ã©ã€ã¢ã³ã QPS 300 ã¯ã©ã€ã¢ã³ã ããã¹ãæ€çŽ¢ (å®å
šäžèŽ) 0.135 0.255 60,000 åæ¹äžèŽ (ã¿ã€ãã¢ãããæ€çŽ¢) 0.135 0.279 57,692 æ°å€ç¯å² (åšåº«/è©äŸ¡ã§ã®ãã£ã«ã¿) 0.175 0.199 24,087 ãã€ããªããã¯ãšãª â ããã¹ã + æ°å€ç¯å² (ãã¡ã»ãããã©ãŠãžã³ã°) 0.135 0.295 52,632 ãã¯ãã«æ€çŽ¢ã®ã¬ã€ãã³ã·ãŒãšã¹ã«ãŒãããã®ãã³ãããŒã¯ã«ã€ããŠã¯ã Announcing vector search for Amazon ElastiCache ãåç
§ããŠãã ãããäžèšã®äŸã§ã¯ãåäžã® cache.r7g.2xlarge ããŒãã§ã®ããã©ãŒãã³ã¹ããã¹ãããŠããŸããã¬ããªã« (ã·ã£ãŒããããæå€§ 5 ã€) ãšã·ã£ãŒãã远å ããããšã§èªã¿åãã¹ã«ãŒããããã¹ã±ãŒã«ããæ°çŸäž QPS ã«å°éã§ããŸããåã¬ããªã«ã¯ç¬èªã®ã€ã³ããã¯ã¹ãæã¡ãç¬ç«ããŠæ€çŽ¢ãåŠçã§ããŸãããã¬ããªã«ããã®èªã¿åãã¯çµææŽåæ§ãšãªããŸããããŒã¿å®¹éãããäœã¬ã€ãã³ã·ãŒãåªå
ããå Žåã¯ã single-slot indexes ã䜿çšããŠãã€ã³ããã¯ã¹åããããã¹ãŠã®ããŒã¿ã 1 ã€ã®ã·ã£ãŒãã«ä¿æãããã¡ã³ã¢ãŠãã®ãªãŒããŒããããå®å
šã«åé¿ããŠãã ãããã·ã£ãŒãã远å ããããšã§ãã¯ã©ã€ã¢ã³ãã³ãŒãã倿Žããã«ã¡ã¢ãªå®¹éãå¢ããããšãã§ããŸãã ElastiCache ã¯ããŒã¿ã®å€æŽããªã¢ã«ã¿ã€ã ã§èªåçã«ã€ã³ããã¯ã¹åãããšã³ãžã³ã¯åæžã蟌ã¿ã確èªå¿çããåã«ã€ã³ããã¯ã¹åããŸãããã®ããããã以éã®æ€çŽ¢ã§ã¯æŽæ°åŸã®ããŒã¿ãè¿ãããread-after-write æŽåæ§ãæäŸãããŸãããã®æŽåæ§ã®åäœã¯ããã«ãããŒãã©ã³ã¶ã¯ã·ã§ã³ã Lua ã¹ã¯ãªããã§ãåæ§ã«ä¿ãããŸããValkey ã¯ãã«ãã¹ã¬ãããæŽ»çšããŠã€ã³ããã¯ã¹åŠçãè€æ°ã®ã¹ã¬ããã«ãŸããã£ãŠå®è¡ãããããElastiCache ã¯æžã蟌ã¿ã¹ã«ãŒãããã®é«ãã¯ãŒã¯ããŒãã«ãããŠãæ€çŽ¢ã¯ãšãªã§é«ãããã©ãŒãã³ã¹ãçºæ®ã§ããŸãã ã¯ãªãŒã³ã¢ãã ãã®ãŠã©ãŒã¯ã¹ã«ãŒã®ããã« ElastiCache ã¯ã©ã¹ã¿ãŒãäœæããäžèŠã«ãªã£ãå Žåã¯ãä»åŸã®æéãçºçããªãããã«ã次㮠AWS CLI ã³ãã³ãã䜿çšããŠã¯ã©ã¹ã¿ãŒãåé€ããŠãã ããã aws elasticache delete-replication-group --replication-group-id AnyCompany-cache ãŸãšã æ¬æçš¿ã§ã¯ãElastiCache ã«ãããå
šææ€çŽ¢ãå®å
šäžèŽæ€çŽ¢ãæ°å€ç¯å²æ€çŽ¢ãããã³ãã€ããªããæ€çŽ¢ã«ã€ããŠè§£èª¬ããŸããããããã®æ€çŽ¢ã¿ã€ãã®ãŠãŒã¹ã±ãŒã¹ãåãäžããæ€çŽ¢ããã³ã¬ã³ã¡ã³ããŒã·ã§ã³ã·ã¹ãã ã®æ§ç¯æ¹æ³ãã玹ä»ããŸãããå
šææ€çŽ¢ãå®å
šäžèŽæ€çŽ¢ãæ°å€ç¯å²æ€çŽ¢ãããã³ãã€ããªããæ€çŽ¢ã¯ãValkey 9.0 ãå®è¡ãã ElastiCache ã®ããŒãããŒã¹ã¯ã©ã¹ã¿ãŒã«ãããŠããã¹ãŠã® AWS åçšãªãŒãžã§ã³ãAWS GovCloud (US) ãªãŒãžã§ã³ãããã³äžåœãªãŒãžã§ã³ã§è¿œå è²»çšãªãã§ãå©çšããã ããŸããValkey ã¯ãæãå¶çŽã®å°ãªããªãŒãã³ãœãŒã¹ãã€ãã³ããŒãã¥ãŒãã©ã«ãª Redis ã«ä»£ããéžæè¢ã§ãããElastiCache ã«ãããæšå¥šãšã³ãžã³ã§ããå§ããã«ã¯ãAWS Management ConsoleãAWS SDKããŸã㯠AWS CLI ã䜿çšããŠãæ°ãã Valkey 9.0 以éã®ã¯ã©ã¹ã¿ãŒãäœæãããã æ¢åã®ã¯ã©ã¹ã¿ãŒãã¢ããã°ã¬ãŒã ããŠãã ããã詳现ã«ã€ããŠã¯ã ElastiCache ã®ããã¥ã¡ã³ã ãã芧ãã ãããã質åããã£ãŒãããã¯ã¯ã AWS re:Post for ElastiCache ãŸã§ãå¯ããã ããã èè
ã«ã€ã㊠Chaitanya Nuthalapati Chaitanya 㯠AWS ã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ãµãŒãã¹ã®ã·ãã¢ãã¯ãã«ã«ãããã¯ããããŒãžã£ãŒã§ãAmazon ElastiCache for Valkey ãæ
åœããŠããŸãã以åã¯ãçæ AIãæ©æ¢°åŠç¿ãã°ã©ããããã¯ãŒã¯ã掻çšãããœãªã¥ãŒã·ã§ã³ãæ§ç¯ããŠããŸãããä»äºä»¥å€ã®æéã§ã¯ãChaitanya ã¯è¶£å³ãéããããšã«å¿ãããçŸåšã¯ããã¹ãã¹ã±ãŒãããŒããããã«ããŒããæ¥œããã§ããŸãã Karthik Subbarao Karthik 㯠Amazon ElastiCache ã®ã·ãã¢ãœãããŠã§ã¢ãšã³ãžãã¢ã§ããªãŒãã³ãœãŒã¹ã® Valkey ãããžã§ã¯ãã«ç©æ¥µçã«è²¢ç®ããŠããŸãã忣ã·ã¹ãã ãããŒã¿ããŒã¹ãRustããããŠå
šè¬çã«ãœãããŠã§ã¢éçºã»æè¡ãéããã€ãããŒã·ã§ã³ã«æ
ç±ãæã£ãŠããŸãã Ian Childress Ian 㯠AWS ã®ãœãããŠã§ã¢éçºãããŒãžã£ãŒã§ãå
šææ€çŽ¢ã€ã³ãã©ã¹ãã©ã¯ãã£ãå«ã Valkey ã¢ãžã¥ãŒã«ããã³çµ±åæ©èœãæ§ç¯ããããŒã ãçããŠããŸããä»äºä»¥å€ã§ã¯ãIan ã¯ããã±ãŒããã¬ã€ããGo èšèªã§é«æ§èœã·ã¹ãã ãæžãããšã«æ²¡é ãã飜ããªãæ¢æ±è
ã§ããå€ã«ãªããšãæ°·ããæ¹ãžãšèå°ãç§»ããæ¯é±æ«å®¶æãšãŠã§ã€ã¯ãµãŒãã£ã³ã楜ããã§ããŸãã Eran Balan Eran 㯠AWS ã®ã¹ãã·ã£ãªã¹ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ãã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ããã³ Amazon ElastiCache ãå°éãšããŠããŸããEMEA å°åã®ã客æ§ãšååãããã£ãã·ã³ã°ã¢ãŒããã¯ãã£ã®èšèšãããã©ãŒãã³ã¹ã®æé©åãRedis OSS ãã Valkey ãžã®ç§»è¡ãªã©ãããŸããŸãªç§»è¡ãæ¯æŽããŠããŸããä»äºä»¥å€ã§ã¯ãEran ã¯ãã¥ãŒãžã«ã«ãæŒåã®èгåããã€ãã³ã°ããªãŒãã³ãŠã©ãŒã¿ãŒã¹ã€ãã³ã°ã楜ããã§ããŸãã ãããžã§ã¯ãå
šäœãéããŠãããžã§ã³ãæå°ããããŠå®è·µçãªè²¢ç®ãããã ãã Allen Samuels æ°ã«å¿ããæè¬ç³ãäžããŸãã æ¬èšäºã¯ã Full-text, exact-match, range, and hybrid search on Amazon ElastiCache ã翻蚳ãããã®ã§ãã翻蚳㯠Solutions Architect ã® Hayato Tsutsumi ãæ
åœããŸããã
Google Workspace MCPãµãŒããŒã®æŠèŠ ããããMCPãšã¯äœïŒ MCPãšã¯ãModel Context ProtocolïŒã¢ãã«ã»ã³ã³ããã¹ãã»ãããã³ã«ïŒã®ç¥ã§ãã 端çã«èª¬æãããšãAIãšãŒãžã§ã³ããAIã¢ããªããå€éšã®ããŒã¿ãããŒã«ã«å®å
šã»æšæºçã«ã€ãªããããã®å
±éèŠæ Œã§ããå
¬åŒããã¥ã¡ã³ãã§ã¯ãAIã¢ããªãšå€éšã·ã¹ãã ãæ¥ç¶ããããã®ãªãŒãã³ãœãŒã¹æšæºãšèª¬æãããŠããŸãã

























