PSSL ã®äœã
æšã§ã ç§»åäžã« Claude Code ãåããŠããããã®ã§ãããæºå¡é»è»ã§ããŒã PC ãéãã®ã¯ç¡çã§ããã«ãã³ã«å
¥ãããŸãŸåŠçã ãèµ°ãããŠããããã§ãã ãããããšè§£æ±ºãããåé¡ã 2 ã€åºãŠããŸãã ãã¿ãéãããšã¹ãªãŒãããŠåŠçãæ¢ãŸã ãã¶ãªã³ã°ã ãšã¹ããã®ããããªãŒãæžããããPC ãšã¹ãããäžæã«é¢ãããš Wi-Fi ãåãã ãã® 2 ã€ã朰ãèšå®ããŸãšããŸããWindows åŽã¯ãã¹ãŠ PowerShell ã§å®çµãããŸãã æè¿ã¯PCãã¹ãªãŒãããªãããã«ã¡ãã£ãšã ãPCãéãããŸãŸæã«æã¡æ©ã人ãããã¿ããã§ãããPCãèœãšãããæ®éã«éªéãªã®ã§ã«ãã³ã«å
¥ããç¶æ
ã§ãClaudeãåãããã®ç°å¢ãäœããŸããã ãã®èšå®ã¯æ®éã«äŒç€Ÿããæããããããããªãã®ã§èªå·±è²¬ä»»ã§ãé¡ãããŸãã 1. ãã¿ãéããŠãæ¢ããªã 管çè
æš©éã® PowerShell ã§å®è¡ããŸãã powershell # ãã¿ãéãããšãã®åäœããäœãããªããã«ïŒããããªãŒé§åæïŒ powercfg /setdcvalueindex SCHEME_CURRENT SUB_BUTTONS LIDACTION 0 # 黿ºæ¥ç¶æãåæ§ powercfg /setacvalueindex SCHEME_CURRENT SUB_BUTTONS LIDACTION 0 # ã¹ãªãŒãç§»è¡ãã®ãã®ãç¡å¹åïŒ0 = ç¡å¹ïŒ powercfg /change standby-timeout-dc 0 powercfg /change standby-timeout-ac 0 # ãã£ã¹ãã¬ã€ã¯åã£ãŠããïŒ1åïŒ powercfg /change monitor-timeout-dc 1 # åæ powercfg /setactive SCHEME_CURRENT LIDACTION ã®å€ã§ãã 0 ... äœãããªã 1 ... ã¹ãªãŒã 2 ... äŒæ¢ç¶æ
3 ... ã·ã£ããããŠã³ çŸåšå€ã®ç¢ºèªã¯ãã¡ãã powershell powercfg /query SCHEME_CURRENT SUB_BUTTONS powercfg /a # ã¢ãã³ã¹ã¿ã³ãã€å¯Ÿå¿ãã®ç¢ºèª WSL åŽãèœã¡ãªãããã«ããŠãããŸãã %USERPROFILE%\.wslconfig ã«è¿œèšã㊠wsl --shutdown ã ini [wsl2] vmIdleTimeout = -1 åŠçèªäœã¯ tmux ã®äžã§åããŠãããšã埩垰åŸã«ãã®ãŸãŸç¶ããèŠãããŸãã bash tmux new -s claude claude --dangerously-skip-permissions # Ctrl+b â d ã§ãã¿ãã Macã®å Žåã¯ããã«ç°¡åã§amphetamineãšããã¢ããªãå
¥ããŠãããšèãéããŠãã¹ãªãŒãããªããªããŸãã https://apps.apple.com/jp/app/amphetamine/id937984704?mt=12 2. ãã¶ãªã³ã°ããããŠãªãã£ãŒãžWi-Fiã«ãã ãã¶ãªã³ã°ããããçç±ã¯ 2 ã€ã§ããã¹ããã®ããããªãŒãç®ã«èŠããŠæžãããšããããŠæºå¡é»è»ã§äœå¢ãå€ãã£ãŠ PC ãšã¹ãããé¢ãããš Wi-Fi ãåããããšã§ããããã解決ããããã«ãªãã£ãŒãžWi-Fiãè²·ããŸããã ãªãã£ãŒãžWi-Fiã¯TypeCãPCã«çŽåºããããšãããã«ã€ãªãããŸãã(ç¹ã«èšå®ããªãããããŠãã°ãããããšãããã«ã€ãªããããã«ãªããŸãã) ãªãã£ãŒãžWi-Fiã¯100GB8000åããããã売ã£ãŠããŠã100GB䜿ãåã£ããããŒã¿ã«ãµã€ãã§ãã£ãŒãžãããšãŸã䜿ããããã«ãªããŸãã https://www.amazon.co.jp/ããªãã£ãŒãžWiFiãããããªãŒã¬ã¹-100GB-ãªãã£ãŒãž-äžäœåãM4-100GB-365æ¥ã/dp/B0DXVNKZ8T/ref=asc_df_B0DXVNKZ8T?mcid=c2d7374fee12300a9c74a8ba8ade9134&tag=jpgo-22&linkCode=df0&hvadid=707549940401&hvpos=&hvnetw=g&hvrand=8194794017880763317&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009285&hvtargid=pla-2444400325634&psc=1&hvocijid=8194794017880763317-B0DXVNKZ8T-&hvexpln=0 ã«ãã³ã«PCãå
¥ãããšãããªæãã§ãããªãã£ãŒãžWi-Fiãæ ããŸãã ã«ãã³ãæ±ãã®ã¯èŠãªãã£ãããšã«ããŠãã ããã  3. 泚æïŒãã¿ãéãããå
é»ã空ã«ãªã£ãŠããããšããã ãããŸã§ãããšããã¿ãéããŠããã£ã¹ãã¬ã€ãæ¶ããã ãã§äžèº«ã¯å
šåã§åãç¶ããŸããåœç¶ãªãã ããããªãŒã®æžãã¯ããªãéã ã§ãã ç§ã¯ç§»åäžã«èµ°ããããŸãŸå¿ããŠãç®çå°ã§ãã¿ãéããã黿ºãèœã¡ãŠããçµéšããããŸãã 客å
ã§ã®åè«ãããå Žåã«ã¯æ³šæãå¿
èŠãå¿
èŠã§ãã ãã®ããã ã«ãã³ã«ã¯ã¢ãã€ã«ããããªãŒïŒPD 察å¿ïŒãäžç·ã«å
¥ããŠãã é·æéèµ°ããããšãã¯å
é»ããªããã«ãã ç§»åãçµãã£ããèšå®ãæ»ã 4. ãŸãšã æºå¡é»è»ã§ç«ã£ããŸãŸäœãã§ããªãæéãããã®ãŸãŸå®è¡æéã«ãªããŸããèšå®ã¯ 10 åã§çµããã®ã§ãéå€ãé·ãæ¹ã¯äžåºŠå
¥ããŠãããšå¹ããŸãã æ¬¡ã¯è»œããŠå€§å®¹éã®ããããªãŒã欲ããã§ãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 1人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post æºå¡é»è»ã§ã Claude Code ãåããç¶ããæè¡ first appeared on SIOS Tech Lab .
ããã«ã¡ã¯ããµã€ãªã¹ãã¯ãããžãŒæŠäºã§ãã AI ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã䜿ãå§ããŠããµãšäžå®ã«ãªã£ãããšã¯ãªãã§ããããã ããã®AIããããžã§ã¯ãã®äžãèªç±ã«èªãããã©âŠâŠ .env  ã¿ãããªæ©å¯æ
å ±ãèªããŠããŸãã®ã§ã¯?ã ãããªãã§ããèªãã¡ãããã§ãããããããã èªããã ãã§ã¯çµãããŸãããèªãã å
容ãããã¥ã¡ã³ãã«çŽã蟌ãã ããã³ãããã«å«ãŸãããããŠã GitHub ãªããžããªçµç±ã§å€éšã«æŒãã ãšãããŸã§æ³åãããšããªããªãæã話ã§ã((((ïŒïŸÐïŸ))))ïŸïœžïœ¶ïŸïœžïŸïŸïŸïŸïŸïŸ ãã®èšäºã§ã¯ããã®å¯ŸçãšããŠçšæãããŠãã Claude Code ã®æš©éæ©èœãšãµã³ãããã¯ã¹æ©èœãåãäžããŸãããã ãããèšå®ããã°å®å
šããšãã話ã§çµããããã®ã§ã¯ãªãã ãªããã®æ©èœãå¿
èŠãªã®ããã©ããŸã§å®ããŠãã©ãã«ç©Žãæ®ãã®ã ããOS ã®ä»çµã¿ãŸã§éããŠæŽçããŠãããŸããéäžã§ Linux ã«ãŒãã«ã®  fork / exec  ãšããåºæ¬æ©èœãŸã§åºãŠããŸããããããè
ã«èœã¡ããšããµã³ãããã¯ã¹ãããªããããã圢ãããŠããã®ãããŸã§èŠéããããã«ãªããŸãã ãªãã以é㯠Claude Code ã顿ã«è©±ãé²ããŸããã åºæ¬çãªä»çµã¿ã¯ä»ã®ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã§ãå€ååã  ã§ããèšå®ãã¡ã€ã«ã®ååãé
ç®åã¯è£œåããšã«éããŸãããã©ããããšãŒãžã§ã³ãæ¬äœã®ããã»ã¹ããã¡ã€ã«ãèªãããã·ã§ã«ã³ãã³ããåããã»ã¹ãšããŠèµ·åããããšããåã圢ã§åããŠããŠãOS ãçšæããŠããéå
·ç«ãŠ(macOS ã® SeatbeltãLinux ã® namespace ãªã©)ãå
±éã§ãããã®èšäºã§æ±ãã®ã¯ããã® Â å
±ééšåã®æ§é  ã§ãããã¢ããªãèªåã§ææ
¢ããŠããã®ããOS ã匷å¶ããŠããã®ãããšããèŠåãæ¹ãæã£ãŠããã°ãã䜿ãã®ããŒã«ãã©ã¡ãã®å±€ã§å®ã£ãŠãããŠããã®ãããåãç©å·®ãã§å€æã§ããããã«ãªããŸãã äœãæ°ãã€ããªããšãAIã¯æ©å¯æ
å ±ãèªãã§ããŸã ãŸããåé¡ã®å
šäœåã確èªããŸãã å€ãã®ãããžã§ã¯ãã§ã¯ãAPI ããŒãããŒã¿ããŒã¹ã®æ¥ç¶æååãšãã£ãç§å¯æ
å ±ã  .env  ãã¡ã€ã«ã«æžããŠããããžã§ã¯ãçŽäžã«çœ®ããŠããŸããããŒã«ã«ã§éçºããåã«ã¯äŸ¿å©ãªéçšã§ãã ãšããããAI ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã¯ãããžã§ã¯ãå
ã®ãã¡ã€ã«ãèªãã§æèãçè§£ããŸããã€ãŸãã æŸã£ãŠãããš Â .env  ãèªãã ãšããããšã§ãããããŠåä»ãªã®ã¯ãèªãã åŸã«äœãèµ·ãããäºæž¬ãã¥ããç¹ã§ãã ãREADME ãæžããŠããšé Œãã ããç°å¢å€æ°ã®èšå®äŸãšããŠæ¬ç©ã®ããŒãåã蟌ãŸãã ã³ãŒãçæã®éçšã§ãç§å¯æ
å ±ãå«ããã¡ã€ã«ãåç
§ããå
容ãã³ã¡ã³ãã«æ®ã ããããã³ãããã㊠ git push  ããç¬éã å
¬éãªããžããªã«ç§å¯ãèŒã ãAIãåæã«æŒãããããšããããããAIãèªãããã®ããçæç©ãçµç±ããŠããã€ã®éã«ãå€ã«åºãŠããããšããæµãã§ããæªæããªããŠãèµ·ãããããããä»çµã¿ã§é²ãã§ããå¿
èŠããããŸãã ãŸãæãã€ã察ç ââ ã§ããããã«ã¯ç©Žããã Claude Code ã«ã¯ãããããäºæ
ãé²ãããã®æš©éæ©èœããããŸãã settings.json  㮠 permissions.deny  ã«ãèªãŸããããªããã¡ã€ã«ãæžããŠããæ¹æ³ã§ãã { "permissions" : { "deny" : [ "Read(./.env)" , "Read(./.env.*)" ] } } ããã§ Â Read  ããŒã«ãã  .env  ãžã®ã¢ã¯ã»ã¹ããããã¯ãããŸãã Glob  ã  Edit  ãªã©ããã¡ã€ã«ã«è§Šããä»ã®ããŒã«ã«ã€ããŠãåæ§ã«æå®ã§ããŸãã äžèŠããã§å®å¿ã«èŠããŸããã 倧ããªç©ŽããããŸã ã permissions.deny  ããããã¯ããŠããã®ã¯ããããŸã§  Claude Code ãšããããã°ã©ã èªèº«ãæã€æ©èœ(Read ããŒã«ãªã©)  ã§ããèšãæãããšããã㯠 ã¢ããªã±ãŒã·ã§ã³ãèªåã§ããã®ãã¡ã€ã«ã¯èªãŸãªãããšèªå¶ããŠããã ã  ãªã®ã§ãã ã§ã¯ããã®èªå¶ãåé¿ããçµè·¯ããã£ããã©ããªãã§ããããããããŸãããããããã¯ãããããªããšïŒïŒ Bash ããŒã« ã§ãã cat .env  ã  diff .env other  ããRead ããŒã«ã䜿ã£ãŠããŸããã å¥ããã»ã¹ãšããŠèµ·åãããã·ã§ã«ã³ãã³ã ã§ããã ãããRead ããŒã«ãå¡ãããšããã¢ããªã¬ãã«ã®èªå¶ã¯ãããã«ã¯å¹ããŸãããæ£é¢çé¢ã«éµããããŠããè£å£ãéããŠããç¶æ
ã§ãã ãã®ãè£å£ããå¡ãããã«ç»å Žããã®ãããµã³ãããã¯ã¹ã§ãã ãµã³ãããã¯ã¹ãšã¯äœã ââ ã·ã¹ãã ã³ãŒã«ãã®ãã®ãæ¢ãã ã¢ããªã®èªå¶ã§ã¯ãªããOSã®åŒ·å¶ permissions.deny  ããã¢ããªã®èªå¶ãã ã£ãã®ã«å¯Ÿãããµã³ãããã¯ã¹ã¯  OS ã¬ãã«ã®åŒ·å¶  ã§ãã Claude Code ã Bash ã³ãã³ããå®è¡ãããšãããã®ã³ãã³ãã  ãµã³ãããã¯ã¹ã§å
ãã§èµ·å  ããŸãããããšããã®ã³ãã³ãã¯ãç¹å®ã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããã·ã¹ãã ã³ãŒã«èªäœãåŒã¹ãªããç¶æ
ã«ãªããŸãã cat  ã ããã  diff  ã ããã Python ã¹ã¯ãªããã ãããããã¡ã€ã«ãèªãã«ã¯å¿
ã OS(ã«ãŒãã«)ã« Â open()  ãšããã·ã¹ãã ã³ãŒã«ãçºè¡ããªããã°ãªããŸããããµã³ãããã¯ã¹ã¯ãã® Â ã«ãŒãã«ãžã®å
¥ãå£ Â ã§æ€åã匵ãã®ã§ãã©ããªããã°ã©ã ã䜿ã£ãŠãè¿åã§ããŸããã ã©ã®ã¬ã€ã€ãŒã§æ€åããŠããã®ã ãã¢ããªã®èªå¶ããšãOS ã®åŒ·å¶ãã¯ããœãããŠã§ã¢ã®å±€ã§èŠããšãŸã£ããéãå Žæã«ç«ã£ãŠããŸããå³ã«ãããšãããã§ãã äžããé ã«èŠãŠãããŸãã ã¢ããªã±ãŒã·ã§ã³å±€ :  permissions.deny  ã¯ããã«ããŸãããã®å±€ã®ç¹åŸŽã¯ã å€å®ããžãã¯ãå€å®å¯Ÿè±¡ãåãããã»ã¹ã®äžã«ãã  ããšã§ããClaude Code ãã .env  ãèªãããšããŠããèªåãããèªåã®ã³ãŒãã§æ¢ããŠãããã€ãŸãèªäž»èŠå¶ã§ããèªäž»èŠå¶ã®åŒ±ç¹ã¯æç¢ºã§ã ãã®ã«ãŒã«ãæã£ãŠããªãã³ãŒãã«ä»äºãæž¡ãã°ãã«ãŒã«ã¯é©çšãããªã  ããšã cat .env  㯠Claude Code ã®ã³ãŒãã§ã¯ãªãã®ã§ã deny  ã®å€å®ããžãã¯ãããããéããŸããã ã·ã¹ãã ã³ãŒã«ã®å¢ç :  ããã»ã¹ã¯èªåã®äžã§ã¯äœã§ãã§ããŸããã ãã¡ã€ã«ãèªãããããã¯ãŒã¯ã«åºãããšãã£ããå€ã®äžçã«è§Šãæäœãã ãã¯èªåã§ã¯å®è¡ã§ããŸãã ãå¿
ã  open()  connect()  ãšãã£ãã·ã¹ãã ã³ãŒã«ã§ã«ãŒãã«ã«äŸé Œããå¿
èŠãããããããããã»ã¹ã®èªç±ãçµããç·ã§ãã ãããŠéèŠãªã®ã¯ããã®ç·ã  ããã°ã©ã ã®çš®é¡ã«äŸåããªã  ããšã cat  ã§ã  diff  ã§ã Python ã§ããèªäœã®ãã€ããªã§ãããã¡ã€ã«ãèªããªãå
šå¡ãã®äžæ¬ã®ç·ãè¶ããŸããã ããããã®ç·ã®äžã«æ€åã眮ãã°ã ãå¥ã®ããã°ã©ã ã䜿ãããšããè¿åãåççã«æç«ããŸãã ãã¢ããªå±€ã®æ€åãã䜿ãããŒã«ãå€ãããã§æããããã®ãšãã¡ããã©å¯Ÿç
§çã§ãã OS ã«ãŒãã«å±€ :  å®éã®å€å®ã¯ãã®å±€ã§è¡ãããŸãã sandbox-exec  ãç»é²ããããªã·ãŒã¯  ã«ãŒãã«åŽã«ãã®ããã»ã¹ã®å±æ§ãšããŠèšé²ãã ã以éãã®ããã»ã¹ãã·ã¹ãã ã³ãŒã«ãçºè¡ãããã³ã«ã«ãŒãã«ãç
§åããŸãã ããã§ç«å Žãé転ããŠããŸããã¢ããªå±€ã§ã¯ãèªåãèªåãæ¢ããŠãããã®ã«å¯Ÿããã«ãŒãã«å±€ã§ã¯  æ¢ããåŽããæ¢ããããåŽããæåºãã§ããªãå Žæã«ãã ãã ãããèªå¶ãã§ã¯ãªãã匷å¶ããšåŒã¹ãããã§ããå®è£
㯠OS ããšã«éããŸãããæ§è³ªã¯åãã§ãã macOS (Seatbelt) : ã«ãŒãã«å
ã®ããã¯ã§ã·ã¹ãã ã³ãŒã«ããšã«ããªã·ãŒãç
§åããèš±å¯ãããªãã¢ã¯ã»ã¹ãæåŠãã Linux (bubblewrap) : namespace ã䜿ã£ãŠã ãã®ããã»ã¹ããèŠãããã¡ã€ã«ã·ã¹ãã ã®æ¯è²èªäœãäœãæ¿ãã ãæåŠãã以åã«ã .env  ãååšããªãäžçãèŠãã åè
ã¯ãé Œãã§ãæãããããåŸè
ã¯ãé Œã察象ããªãããšããéãã§ãããã©ã¡ãã  ããã»ã¹ã®å€åŽã§æ±ºçããŠãã  ç¹ãå
±éã§ãã ããŒããŠã§ã¢å±€ :  ããããé¢äžããªããã«ãªã£ãŠããã®ã¯ãåãªãäœçœã§ã¯ãªã  éçã®å®£èš  ã§ãããµã³ãããã¯ã¹ã®åŒ·å¶åã¯ãã«ãŒãã«ãæ£ããåããŠããããšãã«å
šé¢çã«äŸåããŠããŸããã«ãŒãã«ã®è匱æ§ãçªãããŠç¹æš©ãåãããå Žåãå€å®è
ãã®ãã®ãåããã®ã§ããµã³ãããã¯ã¹ãäžç·ã«åããŸãã ã€ãŸããµã³ãããã¯ã¹ã¯ã ããã£ãã  cat .env  ããããã確å®ã«é²ãéå
· ã§ãã£ãŠããã«ãŒãã«ãŸã§æ»ç¥ããŠããæ»æè
ããæ³å®ããå£ã§ã¯ãªãããšããäœçœ®ã¥ãã§ãã ãã®ãå¢çã®äžãäžãããšããèŠç¹ã¯ãåŸåã§åºãŠããæã穎ãçè§£ãããšãã«ãå¹ããŠããŸãã ã©ã®ããã»ã¹ã«å¹ããŠããã®ã ã§ã¯ããã®åŒ·å¶ã¯ Claude Code ã®ã©ã®ããã»ã¹ã«å¹ããŠããã®ã§ãããããäžã®æ§é ã¯ãããªã£ãŠããŸãã ãã€ã³ãã¯ã Bash ããŒã«ã¯ãèµ·åæã«æç€ºçã«ãµã³ãããã¯ã¹ã§ã©ãããããããææããã  ãšããç¹ã§ããè£ãè¿ãã°ãã©ãããããŠããªããã®ã«ã¯å¹ããŸããããããåŸåã®äŒç·ã«ãªããŸãã ãªã Read ããŒã«ã«ã¯ãµã³ãããã¯ã¹ãå¹ããªãã®ã ãã·ã¹ãã ã³ãŒã«ãæ¢ãããªããRead ããŒã«ãæ¢ããããã®ã§ã¯?ããšæããããããŸããããããçè§£ã®åæã§ãã ãµã³ãããã¯ã¹ã¯  ããã»ã¹ã«è²Œãä»ããå¶çŽ Â ã§ããããã»ã¹ãçæãããç¬éã«é©çšããããã®ããã»ã¹ãšãããã«ãã®åããã»ã¹ã«å¹ããŸãã äžæ¹ãRead ããŒã«ã¯  Claude Code æ¬äœããã»ã¹ã«çµã¿èŸŒãŸããæ©èœ Â ã§ã åããã»ã¹ãäœããŸãã ãæ¬äœãèªåã§ Â open()  ãåŒãã§ãã¡ã€ã«ãèªãã ãã§ããã€ãŸãããµã³ãããã¯ã¹ãã貌ãä»ãã察象ãšãªãæ°ããããã»ã¹ããããããçãŸããªããã ãããRead ããŒã«ãå®ããããã°æ¬äœããšãµã³ãããã¯ã¹ã«å
¥ãããããªããããããããšæ¬äœã®æ£åžžåäœ(èšå®ã®èªã¿æžããéä¿¡)ãŸã§å£ããŠããŸããŸãã ã ãã圹å²åæ
ã«ãªã£ãŠããã®ã§ãã Read ãªã©ã®æ¬äœæ©èœ  â  permissions.deny (ã¢ããªã®èªå¶)ã§å®ã Bash ãèµ·åããåããã»ã¹  â ãµã³ãããã¯ã¹(OSã®åŒ·å¶)ã§å®ã äž¡æ¹æããŠåããŠãæ£é¢çé¢ãè£å£ãå¡ãã  ããã§ãã èšå®ã¯ããæžã ââ ãµã³ãããã¯ã¹ãæå¹ã«ãã ä»çµã¿ã®è©±ãç¶ããã®ã§ãããã§äžåºŠãå®éã®èšå®ãèŠãŠãããŸãããã ãŸã㯠 /sandbox Â ã§æ§åãèŠã äžçªæè»œãªã®ã¯ãã»ãã·ã§ã³äžã«ã¹ã©ãã·ã¥ã³ãã³ããæã€æ¹æ³ã§ãã /sandbox ãµã³ãããã¯ã¹ã®èšå®ããã«ãéããã¢ãŒãã®éžæ(ãµã³ãããã¯ã¹å
ã®ã³ãã³ããèªåæ¿èªããããéåžžã®æš©é確èªãæ®ãã)ããçŸåšã®èšå®å
容ã確èªã§ããŸããããã§éžãã å
容ã¯ããã®ãããžã§ã¯ãã® Â .claude/settings.local.json  ã«ä¿åãããŸãã Linux ã§å¿
èŠãªããã±ãŒãžãè¶³ããŠããªãå Žå㯠Dependencies ã¿ããåºãŠãäœãè¶³ããªãããæããŠãããŸãããŸãã¯ãããéããŠã¿ãã®ãæ©ãã§ãã settings.json ã«æžã ãã¹ãŠã®ãããžã§ã¯ãã§æå¹ã«ããããªãããŠãŒã¶ãŒèšå®  ~/.claude/settings.json Â ã«æžããŸãã { "sandbox" : { "enabled" : true } } ããã ãã§ãã以éãBash ããŒã«ãèµ·åããã³ãã³ãã¯ã次ã®ç¯ã§èŠãã fork  ããŠãééã§èšå®ããŠã exec ããšããæµãã§ã©ãããããŠåããŸãã ãªããåãç°å¢ã«ã¯æ¡ä»¶ããããŸãã macOS : OS å
èµã® Seatbelt ã䜿ãã®ã§ã远å ã€ã³ã¹ããŒã«ã¯äžèŠ Linux / WSL2 :  bubblewrap (ãã¡ã€ã«ã·ã¹ãã éé¢)ãš Â socat (ãããã¯ãŒã¯äžç¶)ãå¿
èŠ sudo apt-get install bubblewrap socat # Ubuntu / Debian ãã€ãã£ãã® Windows ã¯é察å¿ã§ãWSL2 ã®äžã§åããå¿
èŠããããŸãã éèŠ ââ æå¹ã«ããã ãã§ã¯  .env  ã¯èªãããŸãŸã§ã ãããŠããã®èšäºã®ããŒãã«ãšã£ãŠäžçªå€§äºãªæ³šæç¹ã§ãã "enabled": true  ã«ããã ãã§ã¯ã .env  ã®èªã¿åãã¯æ¢ãŸããŸããã ããã©ã«ãã®ããªã·ãŒã¯ãèªã¿ãšæžãã§é察称ã«ãªã£ãŠããŸãã æžã蟌㿠: äœæ¥ãã£ã¬ã¯ããª(ãšäžæãã£ã¬ã¯ããª)ã ãèš±å¯ èªã¿åã :  ãã·ã³å
šäœãèš±å¯ (äžéšã®æåŠãã£ã¬ã¯ããªãé€ã) ã€ãŸããããã©ã«ãã®ãµã³ãããã¯ã¹ãäž»ã«æ³å®ããŠããã®ã¯ãäœæ¥ãã£ã¬ã¯ããªã®å€ãåæã«æžãæããããããšããšãç¥ããªããã¡ã€ã³ã«éä¿¡ãããããšãã®é²æ¢ã§ãã èªã¿åãã«ã€ããŠã¯ããªãç·©ãã ~/.aws/credentials  ã  ~/.ssh/  ããèªããŸã ã ã§ãããã .env  ãå®ããããã°ãèªã¿åãæåŠãæç€ºçã«æžãå¿
èŠããããŸãã { "sandbox" : { "enabled" : true , "filesystem" : { "denyRead" : [ "./.env" ] } , "credentials" : { "files" : [ { "path" : "~/.aws/credentials" , "mode" : "deny" } , { "path" : "~/.ssh" , "mode" : "deny" } ] , "envVars" : [ { "name" : "GITHUB_TOKEN" , "mode" : "deny" } ] } } } filesystem.denyRead : ãµã³ãããã¯ã¹å
ã®ããã»ã¹ããã®èªã¿åãããOS ã¬ãã«ã§æåŠãã credentials.files : åãããšããç§å¯æ
å ±ããšããŠãŸãšããŠæžããæ ( "mode": "deny" ) credentials.envVars :  ãµã³ãããã¯ã¹å®è¡åã«ããã®ç°å¢å€æ°ãæ¶ã ããã¡ã€ã«ãå¡ãã§ããåãç§å¯ãç°å¢å€æ°ã«å
¥ã£ãŠããŠã¯æå³ããªãã®ã§ãããã倧äºã§ã ãã¹ã®æžãæ¹ã«ã¯çããããŸãã sandbox.filesystem.*  ã¯äžè¬çãªæ
£ç¿ã©ããã§ã /tmp/build  ã絶察ãã¹ã ~/  ãããŒã ã ./  ããããžã§ã¯ãã«ãŒãã§ãããã ã  ./  ããããžã§ã¯ãã«ãŒããæãã®ã¯  ãããžã§ã¯ãèšå®( .claude/settings.json )ã«æžããå Žåã ã  ã§ããŠãŒã¶ãŒèšå®ã«åããã®ãæžããš Â ~/.claude  ããã®çžå¯Ÿã«ãªã£ãŠããŸããŸããäžã®äŸã®ãã㪠 ./.env  ã¯ããããžã§ã¯ãåŽã«çœ®ããŠãã ããã 2ç®æã«æžãããšã«ãªã ããã§ã2ç« ã® Â permissions.deny  ãšäžŠã¹ãŠã¿ããšã圹å²åæ
ãã¯ã£ããããŸãã å®ãããçµè·¯ æžãå Žæ å¹ããŠããå±€ Read / Edit / Glob(æ¬äœã®æ©èœ) permissions.deny ã¢ããªã±ãŒã·ã§ã³å±€(èªå¶) Bash ãèµ·åããåããã»ã¹ sandbox.filesystem.denyRead  /  sandbox.credentials OS ã«ãŒãã«å±€(匷å¶) åã  .env  ãå®ãããã«ã 2ç®æã«æžã ããšã«ãªããŸããåé·ã«èŠããŸãããããã¯éè€ã§ã¯ãããŸããã å¹ããŠããå±€ãéãã®ã§ãçæ¹ã ãã§ã¯çæ¹ã®çµè·¯ããå¡ããªã ã®ã§ããããã»ã©ã®ãäž¡æ¹æããŠåããŠå¡ãããããèšå®ãã¡ã€ã«ã®èšèã«ç¿»èš³ãããšãããªãããšããããã§ãã ãµã³ãããã¯ã¹ã®æ£äœ ââ  fork  㚠 exec ããã§ããµã³ãããã¯ã¹ãå
·äœçã«ã©ããããã»ã¹ã«å¶çŽã貌ããã®ããèŠãŠãããŸããå®ã¯ããã¯ãç¹å¥ãªéæ³ã§ã¯ãªã  Linux ã«ãŒãã«ã®åºæ¬çãªä»çµã¿  ããã®ãŸãŸäœ¿ã£ãŠããŸãã Unix / Linux ã§ã¯ããããã»ã¹ãäœãããšãããã°ã©ã ãå®è¡ãããã  å¥ã
ã®ã·ã¹ãã ã³ãŒã«  ã«åãããŠããŸãã fork() â ä»ã®ããã»ã¹ãè€è£œãããæ°ããããã»ã¹ãã§ãã exec() â ä»ã®ããã»ã¹ã®ãäžèº«ãããå¥ã®ããã°ã©ã ã«äžžããšå
¥ãæ¿ãã exec()  ãç¬ç¹ã§ããæ°ããããã»ã¹ãäœãã®ã§ã¯ãªãã èªåèªèº«ã®äžèº«ãæšãŠãŠãå¥ã®ããã°ã©ã ã«å€èº«ãã  ã®ã§ããåš(ããã»ã¹)ã¯ãã®ãŸãŸãäžã®äººã ããå
¥ãæ¿ãããããã»ã¹çªå·(PID)ãå€ãããŸããã äžçªããããããç¢ºèªæ¹æ³ããããŸããã¿ãŒããã«ã§è©ŠããŠã¿ãŠãã ããã echo "PID: $$ " exec bash # æ°ãã bash ã«å€èº«ãã echo "PID: $$ " # â PIDãå€ãã£ãŠããªã! æ°ããã·ã§ã«ã«ãªã£ãã¯ããªã®ã« PID ãåãããå€èº«ããèµ·ããŠãã蚌æ ã§ãã ãã®ä»çµã¿ãããµã³ãããã¯ã¹ã®åå°ã«ãªã£ãŠããŸãã sandbox-exec (macOS ã®å Žå)ã®ãããªã©ãããŒã¯ã次ã®é çªã§åããŸãã 1. fork() ã§åããã»ã¹ãäœã(ãã®æç¹ã§ã¯ sandbox-exec ã®ã³ãŒã) 2. ã«ãŒãã«ã«ãµã³ãããã¯ã¹ã®ããªã·ãŒãç»é²ãã 3. exec("bash") ã§èªåèªèº«ã bash ã«å€èº«ããã â ããã§ãsandbox-exec ããã»ã¹ãã¯æ¶ããåãåšã bash ã«ãªã 4. 以éããã® bash ã«ã¯å¶çŽã貌ãä»ããç¶æ
ã€ãŸãã ããµã³ãããã¯ã¹ãšããããã»ã¹ãç£èŠåœ¹ãšããŠæ®ããããã§ã¯ãããŸãã ã fork  ã§è€è£œãã exec  ã§ç®çã®ã³ãã³ãã«å€èº«ãããšãã«ã å¶çŽãšããã屿§ãã ãããã®ããã»ã¹ã«å»ãŸããŠæ®ã  ã®ã§ããå¶çŽã¯ã«ãŒãã«åŽã§ãã®ããã»ã¹ã«çŽã¥ããŠèšé²ãããã®ã§ã exec  ã§äžèº«ãå
¥ãæ¿ãã£ãŠãæ¶ããŸãããããããæ¶ããã«åŒãç¶ãããããããããã®ä»çµã¿ãæç«ããŸãã ãªããããããè€è£œããŠããå€èº«ããšããåããã©ãããšãããã®ããçç±ã¯ã fork  㚠 exec  ã®éã«ãèšå®ãããããã®ééããã§ãã  ããã§ãããã®ééã§ããµã³ãããã¯ã¹ã®ããªã·ãŒãç»é²ããããäœæ¥ãã£ã¬ã¯ããªãå€ããããç°å¢å€æ°ãèšå®ããããšãã£ã现工ããæ®éã®ã³ãŒããšããŠèªç±ã«æã¿èŸŒããŸãã env (ç°å¢å€æ°ãèšå®ããŠå®è¡)ã  nice (åªå
床ãå€ããŠå®è¡)ãšãã£ãããªãã¿ã®ã³ãã³ãããå®ã¯å
šéšãã®ãééã§çް工ããŠãã  exec  ããããšããåããã¿ãŒã³ã§äœãããŠããŸãããµã³ãããã¯ã¹ã¯ããã®äžæã®äžå¡ã«ãããªãã®ã§ãã ãããŠããã®å¶çŽã¯  åå«ããã»ã¹ã«ç¶æ¿ãããŸã ããµã³ãããã¯ã¹åããã Bash ã  cat  ãåŒã¹ã°ã cat  ãåãå¶çŽãåãç¶ããã ãããBash çµç±ãªãäœã䜿ã£ãŠãèªããªãããæç«ããããã§ãã ç䌌ã³ãŒãã§èŠã ââ ãµã³ãããã¯ã¹ãé©çšãããç¬é ãããŸã§ã®è©±ããã³ãŒãã®åœ¢ã§äžåºŠã«èŠãŠã¿ãŸããããã©ãããŒããã£ãŠããããšã¯ãã ããããããã圢ã§ãã if ( fork ( ) == 0 ) { // åããã»ã¹ã®åŽ // ããã¯ããŸã èªåã®ã³ãŒãããªã®ã§ã奜ããªããšãã§ãã chdir ( "/tmp" ) ; // äœæ¥ãã£ã¬ã¯ããªãå€ãã setuid ( 1000 ) ; // æš©éãèœãšã close ( 0 ) ; open ( "input.txt" , . . . ) ; // æšæºå
¥åãå·®ãæ¿ãã setenv ( "LANG" , "C" , 1 ) ; // ç°å¢å€æ°ãèšå® sandbox_init ( profile , . . . ) ; // ãµã³ãããã¯ã¹ãé©çš exec ( "/bin/ls" , . . . ) ; // ããã§åã㊠ls ã«åãã } fork() Â ã®æ»ãå€ã  0  ã«ãªãåŽãåããã»ã¹ã§ãããã㊠ ãã® Â if  ã®äžã exec()  ãŸã§ã®æ°è¡ããããã»ã©èšã£ããééã  ã§ãããã®æç¹ã§ããã»ã¹ã®äžèº«ã¯ãŸã ã©ãããŒèªèº«ã®ã³ãŒããªã®ã§ãç¹å¥ãªä»æãã¯äœããããŸãããæ®éã®é¢æ°åŒã³åºããšããŠæºåãã§ããŸãã æ³šç®ããŠã»ããã®ã¯ã䞊ãã§ãã5è¡ã  å
šéšåãæ§è³ªã®æäœ Â ã ãšããããšã§ãã chdir  ã§ã  setuid  ã§ã  setenv  ã§ã  sandbox_init  ã§ããèšå®ããŠããçžæã¯å
±éã§ã ããããã  ls  ã«ãªããããŸã®èªåã  ã§ãã ã€ãŸãã ãµã³ãããã¯ã¹ã®é©çšã¯ãç¹æ®ãªèµ·åæ¹æ³ãã§ã¯ãããŸãã ã chdir()  ã  setenv()  ãšåãåã«ãåãè³æ Œã§äžŠãã§ãã  ãã ã®1è¡ Â ã§ãã3ç« ã®åé ã§ããµã³ãããã¯ã¹ã¯  env  ã  nice  ã®äžæã«ãããªãããšæžããã®ã¯ãããããæå³ã§ãã ãããŠæåŸã®  exec("/bin/ls") ãããã§ããã»ã¹ã®äžèº«ã  ls  ã«å
¥ãæ¿ãããŸããã çŽåã«èšå®ãããã®ã¯å
šéšæ®ããŸã ã ã«ã¬ã³ããã£ã¬ã¯ããªã¯  /tmp UID 㯠1000 æšæºå
¥å㯠 input.txt ç°å¢å€æ°ã¯  LANG=C ãããŠããµã³ãããã¯ã¹ã®ããªã·ãŒã ls  ã®ã³ãŒãã¯ãèªåãããããèšå®ãããèŠããªã©ãããŸãããããã§ãã çãŸããç¬éãããã®æ¡ä»¶äžã«ãã ãããããµã³ãããã¯ã¹ã®æ¬è³ªã§ãã ls  ã¯ãµã³ãããã¯ã¹ã®ååšãç¥ããªãããååããããšãæåŠããããšãã§ããŸãããå¶çŽã¯ã ls  ãå®ãã¹ãã«ãŒã«ãã§ã¯ãªãã ã ls  ã眮ãããŠããç°å¢ã  ã ããã§ãã ã ããããã ls  ã  cat  ã«å€ããŠããèªäœã®ãã€ããªã«å€ããŠãæå³ããªããããããã¢ããªã±ãŒã·ã§ã³å±€ã®èªå¶( permissions.deny )ãšã®æ±ºå®çãªéãã§ãã ããã²ãšã€ã é çªãåœ Â ã ãšããç¹ãæŒãããŠãããããšããã§ãã sandbox_init()  ã¯å¿
ã  exec()  ããåã«ãªããã°ãããŸãããã exec  ããåŸã«èšå®ããã°ãããã¯æç«ããŸããã exec  ã®åŸã«ã¯  ããèªåã®ã³ãŒããååšããªã  ããã§ã(äžèº«ã¯  ls  ã«ãªã£ãŠãã)ãèšå®ãããã£ã³ã¹ã¯  fork  㚠 exec  ã®éããã®ééãããªãã®ã§ãã Claude Code ã Bash ããŒã«ãèµ·åãããšããããã£ãŠããããšã¯ãããšåãã§ããéã«èšãã° ââ  ãã®ééãéããã«èµ·åãããããã»ã¹ã«ã¯ãåœç¶ãäœã®èšå®ããããŠããªã ããããæ¬¡ç« ã®è©±ã«ã€ãªãããŸãã ããã«æ®ãæã穎 ãRead 㯠 permissions.deny ãBash ã¯ãµã³ãããã¯ã¹ãããã§å®ç§ããšèšããããšããã§ããã ãŸã æã穎ããããŸã ã ãã®ã²ãšã€ã  MCP ãµãŒã㌠ ã§ããMCP ãµãŒããŒã¯ãAI ã«å€éšããŒã«(ãã¡ã€ã«æäœãDB ã¢ã¯ã»ã¹ãªã©)ãæãããããã®ä»çµã¿ã§ãClaude Code ãšã¯å¥ã®ããã»ã¹ãšããŠèµ·åããŸãã ãå¥ããã»ã¹ãªãããµã³ãããã¯ã¹ã§å®ãããã®ã§ã¯?ããšæããšããã§ãããããã¯ãªããŸãããããäžåºŠãå
ã»ã©ã®å³ãèŠãŠãã ããã éµã¯ãå³ã®äžçªäžã«æžããŠãã  ãClaude Code æ¬äœã¯ãµã³ãããã¯ã¹æªé©çšã  ãšããç¹ã§ãã ãµã³ãããã¯ã¹ã¯ãå¶çŽãæã€ããã»ã¹ããåãžç¶æ¿ããããä»çµã¿ã§ããããšãããæ¬äœèªèº«ã¯å¶çŽãæã£ãŠããŸãããã ãããæ¬äœãåããã»ã¹ãèµ·åãããšãã ãã®èµ·ååŠçããããããµã³ãããã¯ã¹ã§ã©ããããªããã°ãåã¯çŽ ã®ãŸãŸçãŸããŸã ã Bash ããŒã«ã¯ãã©ãããããããã«ããããå®è£
ãããŠããã®ã§ææãããŸããããã MCP ãµãŒããŒã¯  å¥ã®ã³ãŒããã¹ã§èµ·åããã  ããããã®ãã¹ãã©ããããŠããªããã°ãå¶çŽãªãã§åããŠããŸãããåããã»ã¹ã ããå®å
šãã§ã¯ãªããã ã©ãããããåããã»ã¹ã ããå®å
š ããªã®ã§ããç¶æ¿å
ãç¡ææã§ãã以äžãå
ãåŠçãéããªãçµè·¯ã¯ãã¹ãŠçŽ éãã«ãªããŸãã ããã»ã©ã®ã¬ã€ã€ãŒå³ã®èšèã§èšãçŽããšããããªããŸããã·ã¹ãã ã³ãŒã«ã®å¢ç㯠 ãã¹ãŠã®ããã»ã¹ã«å
±éããŠååšããŠãã  ã®ã«ãããã§ç
§åãããããªã·ãŒã¯  ããã»ã¹ããšã«éã ãMCP ãµãŒããŒã¯ãå¢çãè¶ããŠããªãããã§ã¯ãããŸããã å¢çã¯è¶ããŠãããããã®ããã»ã¹ã«ã¯ç
§ããåãããã«ãŒã«ãç»é²ãããŠããªã  ã®ã§ãã«ãŒãã«ã¯ãã®ãŸãŸéããŠããŸãã®ã§ãã MCP ãµãŒããŒã¯ããã¡ã€ã«ã«ã DB ã«ããããã¯ãŒã¯ã«ãã¢ã¯ã»ã¹ã§ãã匷åãªååšã§ãããããå¶çŽã®å€ã§åããšããã®ã¯ã .env  ã«ãšã£ãŠã¯ç«æŽŸãªè£å£ã«ãªãåŸãŸãã MCP ãµãŒããŒãå
ã ââ  @anthropic-ai/sandbox-runtime ã§ã¯ããã®è£å£ã¯å¡ããªãã®ã§ãããããå¡ããŸãã @anthropic-ai/sandbox-runtime  ãšãããAnthropic ãå
¬éããŠãããµã³ãããã¯ã¹ããŒã«ã䜿ããŸãã ãã㯠Claude Code ã®å
èµãµã³ãããã¯ã¹ãšåã OS ã®ä»çµã¿(macOS ãªã SeatbeltãLinux ãªã bubblewrap)ãã ä»»æã®ããã»ã¹ã«å¯ŸããŠå€ããé©çšã§ããããã«ããåäœããã±ãŒãž  ã§ãã srt  ãšããã³ãã³ããæäŸããŠããŠãå
¬åŒã®ããã¥ã¡ã³ãã§ããããŒã«ã« MCP ãµãŒããŒãå
ãããšããäž»èŠãªæ³å®çšéãšããŠæããããŠããŸãã npm install -g @anthropic-ai/sandbox-runtime ãã£ãŠããããšã¯ã3ç« ã§èŠã  sandbox-exec  ãšãŸã£ããåãã§ãã fork  ããŠãééã§ããªã·ãŒãç»é²ããŠã exec  ã§ç®çã®ã³ãã³ãã«å€èº«ãããã ããã å
ãŸããããã»ã¹ã®åå«ã«ãå¶çŽãç¶æ¿ãããŸã ã .mcp.json  㮠 command  ãå·®ãæ¿ãã ããæ¹ã¯ã·ã³ãã«ã§ã .mcp.json  㮠 command  ã  srt  ã«å·®ãæ¿ããŠãæ¬æ¥ã®ã³ãã³ããåŒæ°ã«åãã ãã§ãã å
ãå: { "mcpServers" : { "filesystem" : { "command" : "npx" , "args" : [ "-y" , "@modelcontextprotocol/server-filesystem" ] } } } å
ãã åŸ: { "mcpServers" : { "filesystem" : { "command" : "srt" , "args" : [ "npx" , "-y" , "@modelcontextprotocol/server-filesystem" ] } } } å·®åã¯ã command  ã  srt  ã«ããŠãå
ã® Â command  ã  args  ã®å
é ã«æŒã蟌ããã ãã§ããããã§ããã® MCP ãµãŒããŒ(ãšããããèµ·åããåããã»ã¹)ã¯ãµã³ãããã¯ã¹ã®äžã§åãããã«ãªããŸãã MCP ãµãŒããŒåŽã«æãå
¥ããå¿
èŠã¯ãããŸãã ããµãŒããŒã¯èªåãå
ãŸããŠããããšãç¥ããŸããããããã§ãå¶çŽã¯å¹ã ââ 3ç« ã® Â ls  ã®è©±ãšãŸã£ããåãæ§å³ã§ãã å¶çŽã®å
容㯠 ~/.srt-settings.json Â ã«æžããŸãã { "filesystem" : { "denyRead" : [ "./.env" , "~/.ssh" , "~/.aws" ] , "allowWrite" : [ "." ] , "denyWrite" : [ "./.env" ] } , "network" : { "allowedDomains" : [ ] , "deniedDomains" : [ ] } } srt --settings /path/to/srt-settings.json ...  ã®ããã«ããµãŒããŒããšã«å¥ã®èšå®ãã¡ã€ã«ãæž¡ãããšãã§ããŸãã ããã©ã«ãã®æåã«ã¯çãããã®ã§ãããã¯æŒãããŠãããŠãã ããã æžã蟌㿠: ããã©ã«ãã§ Â å
šéšæåŠ ã allowWrite Â ã«æžãããã®ã ãèš±å¯ããã ãããã¯ãŒã¯ : ããã©ã«ãã§ Â å
šéšæåŠ ã allowedDomains Â ã«æžãããã®ã ãèš±å¯ããã èªã¿åã : ããã©ã«ãã§ Â å
šéšèš±å¯ ã denyRead  ã§å¡ã å
èµãµã³ãããã¯ã¹ãšåãã§ãããã§ã  èªã¿åãã ãã¯ç·©ã  ãšããæ§å³ã§ãã .env  ãå®ããããã° Â denyRead  ãæç€ºçã«æžãå¿
èŠããããŸããããã  srt  ã§ã¯  allowRead  ã  denyRead  ããåªå
ããã  ã®ã§ãåºã  allowRead Â ãæžããš Â denyRead  ãæã¡æ¶ãããŠããŸããŸã(å
èµãµã³ãããã¯ã¹ãšã¯åªå
é äœãéãªã®ã§ãããã¯èŠæ³šæã§ã)ã éã«ãæžã蟌ã¿ãšãããã¯ãŒã¯ã¯ããã©ã«ãã§å
šéšéãŸã£ãŠããŸãã å
ãã MCP ãµãŒããŒãåããªããªã£ããããŸã  allowWrite  㚠 allowedDomains  ã®äžè¶³ãçã  ã®ãæ£è§£ã§ãã ãã ãæ³šæç¹ããããŸãã @anthropic-ai/sandbox-runtime  㯠 ããŒã¿ã®ãªãµãŒããã¬ãã¥ãŒ  ãšããäœçœ®ã¥ãã§ãèšå®ãã©ãŒãããã¯ä»åŸå€ããå¯èœæ§ããããšæèšãããŠããŸããéçšã«ãŒã«ã«çµã¿èŸŒãå Žåã¯ããã®ã€ããã§æ±ã£ãŠãã ããã ããããçµå±ã©ãããã°ããã®ã ãããŸã§ããçµè·¯ã1ã€å¡ãã§ããå¥ã®çµè·¯ãåºãŠããããšããã¢ã°ã©å©ããèŠãŠããŸãããRead ãå¡ãã° BashãBash ãå¡ãã° MCPâŠâŠã å¡ãã¢ãããŒãã«ã¯ãåžžã«ãåæãå¿ããçµè·¯ããæ®ã ãšããæ¬è³ªçãªåŒ±ãããããŸãã ããã§çºæ³ãå€ããŸãã ãããã  .env Â ã«æ¬ç©ã®ç§å¯ã眮ããªããã°ãäœçµè·¯ããèªãŸããŠãå¹³æ° Â ã§ããå®ãã¹ããã®ãæåããããã«ç¡ããã°ãèªãŸããŠã被害ã¯ãããŸããã çæ³çãªã®ã¯ã çåœãªã¢ã¯ã»ã¹ããŒã¯ã³  ã䜿ãéçšã§ããæ°žç¶çãªç§å¯éµããã¡ã€ã«ã«çœ®ãã®ã§ã¯ãªããå¿
èŠãªãšãã«ã ãçºè¡ãããã寿åœã®çãããŒã¯ã³ã§èªèšŒãããã€ã¡ãŒãžãšããŠã¯ãããããæµãã§ãã 1. éçºè
ãæåã« CLI ã§ãã°ã€ã³ãã(人éã®èªèšŒ) $ my-tool login 2. ãã®æš©éãããšã«ãçåœãªã¢ã¯ã»ã¹ããŒã¯ã³ããªã¯ãšã¹ããã â æ°ååã§å€±å¹ããããŒã¯ã³ãçºè¡ããã 3. ã¢ããªã¯ãã®ããŒã¯ã³ã䜿ã£ãŠåã â ãã¡ã€ã«ã«ã¯æ¬ç©ã®ç§å¯éµãååšããªã â äžäžããŒã¯ã³ãæŒããŠãããã倱å¹ããã®ã§è¢«å®³ãéå®ç å®éã®ã³ãã³ãã§èŠããšãããªã my-tool login Â ã¯æ¶ç©ºã®ã³ãã³ãã§ãããå®éã®ã¯ã©ãŠãã§ã¯ãããªãã¿ã®ã³ãã³ãããã®ãŸãŸåœãŠã¯ãŸããŸãã AWS ã®å Žå # 1. 人éã®èªèšŒ(ãã©ãŠã¶ãéã㊠SSO ã§ãã°ã€ã³ãã) aws sso login --profile dev # 2ã3. ããšã¯ CLI / SDK ãäžæcredentialãèªåã§ååŸããŠäœ¿ã aws s3 ls ~/.aws/credentials Â ã«æ°žç¶çãªã¢ã¯ã»ã¹ããŒã眮ã代ããã«ã aws sso login  ã§åŸãæš©éãããšã«ãè£åŽã§æ°æéã§å€±å¹ããäžæcredentialãçºè¡ãããŸããããŒã¯ã³ã¯  ~/.aws/sso/cache/  ã«ãã£ãã·ã¥ãããã ããªã®ã§ãæéãåããã°ãã以äžäœ¿ããŸããã Azure ã®å Žå # 1. 人éã®èªèšŒ az login # 2. å¿
èŠãªãªãœãŒã¹åãã®çåœããŒã¯ã³ãååŸ(æå¹æéã¯1æéçšåºŠ) az account get-access-token --resource https://vault.azure.net ã¢ããªåŽã¯  DefaultAzureCredential  ã䜿ãã°ããã® CLI ã®ãã°ã€ã³ç¶æ
ãèªåã§æŸã£ãŠãããŸãã Google Cloud ã®å Žå # 1. 人éã®èªèšŒ gcloud auth application-default login # 2. çåœãªã¢ã¯ã»ã¹ããŒã¯ã³(æå¹æéã¯1æéçšåºŠ) gcloud auth print-access-token ãã¡ãã ADC(Application Default Credentials)ãšããä»çµã¿ããããSDK ãèªåã§ããŒã¯ã³ãååŸããŠãããŸãã ã©ãã圢ã¯ãŸã£ããåãã§ãã ã人éãäžåºŠãã°ã€ã³ãããâãããããçåœãªããŒã¯ã³ãçºè¡ããããâãã¢ããªã¯ããã䜿ãã ããããŠå
±éããŠã .env Â ã«æžãã¹ãæ°žç¶çãªç§å¯ãã©ãã«ãç»å ŽããŸãã ã ã¯ã©ãŠãã®ãããŒãžã ID(å®è¡ç°å¢èªèº«ã®èº«å
ã§ã·ãŒã¯ã¬ããã¹ãã¢ããããŒã¯ã³ãååŸããä»çµã¿)ããOIDC ããŒã¹ã®äžæcredential(GitHub Actions ããã¯ã©ãŠãã«ãéçãªã¢ã¯ã»ã¹ããŒã Secrets ã«çœ®ããã«èªèšŒããæ§æãªã©)ãããã®èãæ¹ã®å®è£
ã«ããããŸãã ç§å¯ã¯ããã¡ã€ã«ã«æžããŠå®ããã®ã§ã¯ãªããã ããããæžãããå¿
èŠãªç¬éã«çåœãªãã®ãåãã«è¡ã ããããããçµè·¯ã1ã€ãã€å¡ãçºæ³ããæãåºããæ ¹æ¬çãªè§£æ±ºçã§ãã ãšã¯ãããçæ³ã¯ãªããªãå€§å€ ãã ãæ£çŽã«èšããšããã®çæ³åœ¢ã¯ããã«å®çŸã§ãããã®ã§ã¯ãããŸããã ããŒã¯ã³ãçºè¡ããä»çµã¿(èªèšŒåºç€ãã·ãŒã¯ã¬ããã¹ãã¢)ãçšæããå¿
èŠããã æ¢åã®ã¢ããªãããã¡ã€ã«ããèªããåæã§æžããŠããå Žåããã®æžãæããèŠã ããŒã«ã«éçºãCIãæ¬çªã§ãããããããŒã¯ã³ã®ååŸçµè·¯ãæŽããå¿
èŠããã èŠæš¡ã®å°ãããããžã§ã¯ããããšããããä»åããŠãããã®ã«ããããªããããå°å
¥ããã®ã¯è
°ãéãããšããã®ãçŸå®ã§ãã ãªã®ã§ãåœé¢ã®çŸå®çãªç«ã¡åãã¯ããããªããŸãã çæ³ãç®æãã€ã€ ãæ¬ç©ã®ç§å¯ãçåœããŒã¯ã³ã«å¯ããŠãã(é·æçãªæ¹åæ§) ãããã§ãããŸã§ã¯ ãçµè·¯ã1ã€ãã€å°éã«å¡ã permissions.deny  㧠Read / Edit / Glob ããã¹åäœã§ããã㯠ãµã³ãããã¯ã¹ãæå¹ã«ãã denyRead  /  credentials  ã§èªã¿åããæç€ºçã«å¡ã(æå¹åã ãã§ã¯èªã¿åãã¯æ¢ãŸããªã) MCP ãµãŒããŒã¯äœ¿ããã®ãåå³ãã srt ( @anthropic-ai/sandbox-runtime )ã§å
ã .env  ã«ã¯ã§ããéããããŒå€ã ãã眮ããæ¬ç©ã¯æå°éã« çµå±ã®ãšããã ãå®ãã¹ããã®ããããã«çœ®ããªãããæåŒ·ã®å¯Ÿç  ã§ããããããããé£ããéã¯ã ãçµè·¯ãã²ãšã€ãã€èª¿ã¹ãŠé²ãããããä»ã®ãšããéã¯ãããŸãã ãã¢ã°ã©å©ãã«èããããããããŸããããã©ã®çµè·¯ãã©ã®ã¬ã€ã€ãŒã§å®ãããã®ã(ã¢ããªã®èªå¶ãªã®ããOS ã®åŒ·å¶ãªã®ã)ãçè§£ããŠããã°ãå©ãæŒããã¯ãã£ãšæžãããŸãã ãŸãšã ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ããå®çšåãããããã«ã¯ã»ãã¥ãªãã£ã¯æ¬ ãããŸãããã§ãã ãããšãã£ãŠãã³ãŒãã£ã³ã°ãšãŒãžã§ã³ããªãã§ã¯ã®ç¥èãå¿
èŠãªããã§ã¯ãªãã OS ã®åºæ¬çãªä»çµã¿ãšãããã»ã¹ã®æ§è³ªãçè§£ããŠããã°åå  ã§ããä»åã®è©±ã¯ãClaude Code ã«éãããã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãå
šè¬ã«åœãŠã¯ãŸããŸãããªã®ã§ããã£ã±ããããAIã䜿ã£ãŠæ¥åãããŠãããã£ã±ãåºæ¬ã倧äºã ãªãšæããŸãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã«æ©å¯æ
å ±ãèªãŸããªãåºæ¬çãªä»çµã¿ first appeared on SIOS Tech Lab .
ãããªæ¹ãžç¹ã«ãããã ãšãŽã¡ã³ã²ãªãªã³ã奜ããªæ¹ ããŒã«ã«LLMïŒ Ollama ïŒã Raspberry Pi ã§ãäœãåããã®ãäœã£ãŠã¿ããæ¹ LangGraph ã§ãã«ããšãŒãžã§ã³ãã詊ãããæ¹ æŠèŠ ããã«ã¡ã¯ããµã€ãªã¹ãã¯ãããžãŒã®ã¯ãã¡ããã§ãïŒ ä»åã¯OSCã®å±ç€ºããŒã¹çšéçºãšããŠããæ°äžçŽãšãŽã¡ã³ã²ãªãªã³ãã®æææ±ºå®ã³ã³ãã¥ãŒã¿ MAGI ããRaspberry Pi 3å° + ããŒã«ã«LLMïŒOllamaïŒã§åçŸããŠã¿ãŸããã ââ 3äœã®äººæ Œãå¥ã
ã®ãã·ã³ã§è°è«ãã倿°æ±ºã§çµè«ãåºã ãã®èšèšãé床ãã¥ãŒãã³ã°ã宿©ãç«ã¡äžããéçšã§ããã£ãèœãšã穎ãŸã§ãå®åã«ãéããç¥èŠããŸãšããŠãããŸãã èæ¯ MAGI ã¯ã3ã€ã®ç¬ç«ããã³ã³ãã¥ãŒã¿ Melchiorã»Balthasarã»Casper ããããããç°ãªãäººæ Œã§åãè°é¡ã倿ãã倿°æ±ºã§çµè«ãåºãåè°ã·ã¹ãã ã§ãã ããããã ã®1ããã°ã©ã ã§åçŸããã®ã¯ç°¡åã§ãã ã§ããããã ãšäœããéããã 1ãšãŒãžã§ã³ã = 1å°ã®ç¬ç«ã³ã³ãã¥ãŒã¿ ããšããåäœã®èšå®ãããã®ãŸãŸç©ççã«åçŸã§ããªãã ãããïŒ æŠäºãã ã®ååã®å
ãRaspberry Pi ã3å°äžŠã¹ãããšã«ããŸããããšã¯ãããéå㪠Raspberry Pi ã§LLMãªããŠãŸãšãã«åãã®ãããšæåã¯åä¿¡åçã§ããã çµè«ããèšããšã圹å²ãå²ãåã£ãŠè»œéã¢ãã«ãšãã¥ãŒãã³ã°ãéããã°ãåè°AIã¯ååã«åããŸãã ã·ã¹ãã æ§æïœ3å°ã® Pi + æ¯èŠ åœ¹å²åæ
ã¯ã·ã³ãã«ã§ãã åPi ã¯ããã ã®æšè«ããã¯ãšã³ããOllama ãåŸ
ã¡åããŠããã ãã§ãäººæ Œããšã®ããã°ã©ã ã¯æžããŸããã æ¯èŠïŒãªãŒã±ã¹ãã¬ãŒã¿ïŒ ãšãªã1å°ã®PCããåè°ã®é²è¡ã»éèšã»ç»é¢è¡šç€ºãæ
åœããŸããä»å㯠PCäžã® WSL2 ã§ Flask + LangGraph ãåãããŸããã ãã©ãŠã¶ / kiosk UI    Ⲡ⌠ SSEã§æç¥šããªã¢ã«ã¿ã€ã é
ä¿¡ æ¯èŠ â Flask + LangGraphïŒåè°ã»éèšïŒ    Ⲡ⌠ ã€ãŒãµãããïŒåPiã®ollama :11434ïŒ +-----------------+-----------------+-----------------+ | Pi1 Melchior | Pi2 Balthasar | Pi3 Casper | | Ollama | Ollama | Ollama | +-----------------+-----------------+-----------------+ ã©ã®Piãã©ã®äººæ Œãã¯ãæ¯èŠã® `.env` ã«ãã åPiã®åºå®IPã ã ã§æ±ºãŸããŸããäººæ Œããšã®ç¹å¥ãªã³ãŒãã¯ç¡ããroleåã§æ¥ç¶å
ãåŒãã ãããã®å²ãåãã®ãããã§ãPiåŽã¯ãã¢ãã«ãå
¥ããŠåŸ
ã¡åãããã ãã§æžã¿ãŸãã åè°ãããŒïœLangGraphã§çµã2ã©ãŠã³ãæç¥š åè°ã®æ¬äœã¯ LangGraph ã® StateGraph ã§ãã1åç®ã§å
šäŒäžèŽãªãå³ç¢ºå®ãæèŠãå²ããããèšè«ããæãã§åæç¥šããããšãã2ã©ãŠã³ãæ§æã«ããŸããã prepare ïŒéå§ãéç¥ 3äœã䞊åå®è¡ ïŒMelchior / Balthasar / Casper ãåæã«æç¥šïŒfan-outïŒ 1åç®éèš ïŒè³æã2祚以äžãªãã坿±ºã åå² ïŒå
šäŒäžèŽãªããã®ãŸãŸç¢ºå®ãå²ããã èšè« â åæç¥š â åéèš finalize ïŒè©æ±ºã確å®ããŠé
ä¿¡ ããã§ã¯ãã¢ã€ã¹é£ã¹ããããããŒãã«ããŠããŸãã2:1ã§å¯æ±ºãããŸããã åäººæ Œã«ã¯ç°ãªãã芳ç¹ããäžããŠããŸãã Melchior ïŒè«çæ§ã»åçæ§ã»æŽåæ§ãæéèŠ Balthasar ïŒäººéèŠå ã»ææ
ã»å容æ§ãéèŠ Casper ïŒçŸå®æ§ã»ãªã¹ã¯ã»å®åæ§ãéèŠ ããã§ã¯ãã¢ã€ã¹é£ã¹ããããããŒãã«ããŠããŸããã¯ãªãã¯ã§çç±ã衚瀺ãããŸãã å®è£
ã®ãã¢ïœå°ããã¢ãã«ã«ãJSONã ããè¿ããã åäººæ Œãžã®åãåããã¯1ã€ã®é¢æ°ã«éçŽããŠããŸããå°ããã¢ãã«ãå®å®ãããã³ãã¯ã åºåãJSONã«åºå®ãã ããšã format="json" ãš temperature=0 ãæå®ãã role / reason / vote ã®3é
ç®ã ããè¿ãããŸãã å¿
ãJSONã®ã¿ã§è¿ããŠãã ãã: { "role": "{role}", "reason": "80å以å
ã§ç°¡æœã«ïŒå¿
ãæ¥æ¬èªã§ïŒ", "vote": "approve or reject" } è¿ã£ãŠããæååã¯ã ```json ã®ã³ãŒããã§ã³ã¹ãå¥ãããæåã® {` ããæåŸã® `} ãŸã§ãæãåºããŠããããŒã¹ããŸããçç±ã80åãè¶
ããããéäžã§åããªããããæåŸã®å¥èªç¹ãã§äžžãããå°ããã¢ãã«ã¯æåæ°æç€ºãå®ããããªãã®ã§ããã®åŸåŠçã¯å¿
é ã§ããã Raspberry Pi ã§åŸ
ãããªã3ã€ã®é床ãã¥ãŒãã³ã° éåãªPiã§çŽ çŽã«LLMãåãããšã1祚ã«äœåç§ãããããŸããäœæé床ãè©°ããããã«å¹ããã工倫ãäž»ã«3ã€ã 1. ã³ã³ããã¹ãé·ãçµã 察å¿ïŒ num_ctx ãæ¢å®ã® 4096 ãã 1024 ãžã æ ¹æ ïŒ æç¥šããã³ããã¯æ°çŸåãªã®ã§ã倧ããªçªã¯ç¡é§ã«ã¡ã¢ãªãšæéãé£ãã ãã 2. çæããŒã¯ã³æ°ãå¶éãã 察å¿ïŒ num_predict = 128 ã æ ¹æ ïŒ çç±ã¯80åäžéãªã®ã§ããã§ååã åºåãçãã»ã©éãã 3. ã¢ãã«ãRAMã«åžžé§ããã 察å¿ïŒ keep_alive = -1 ïŒ èµ·åæã«äžåºŠç©ºæã¡ããŠå
èªã¿ã æ ¹æ ïŒ åå質åã®ã³ãŒã«ãããŒãåŸ
ã¡ãæ¶ããã OLLAMA_NUM_CTX=1024 # 4096 â 1024 OLLAMA_NUM_PREDICT=128 # çç±ã¯80åã§è¶³ãã OLLAMA_KEEP_ALIVE=-1 # ã¢ãã«ãRAMã«åžžé§ ãã®ã»ãã3äœã 䞊åå®è¡ ïŒçŽåã®çŽ1/3ã®æéïŒããæçµèŠçŽã¯ LLMã䜿ããå®åæ ã§çµã¿ç«ãŠãŠåŒã³åºãã1ãã¹åæžããŠããŸãã ã¢ãã«éžå®ïœ0.5Bã®çœ ããããã³ããã§çŽã é床åªå
ã§ãŸã qwen2.5:0.5b ã䜿ã£ããšãããå¥åŠãªåºåã«ééããŸããã çç±ã«ã¯ãé©åã ããšæžããŠããã®ã«ãæç¥šã¯ reject ãšãªã£ãŠãããã€ãŸã reason ãš vote ãé£ãéãã®ã§ãã åå ã¯éèšãã°ã§ã¯ãªããã¢ãã«ã®åºåãã®ãã®ã®ççŸã§ããããããåœåã®ããã³ãã㯠vote ã reason ããå
ã«æžãããŠãããããã¢ãã«ã¯å
ã«æç¥šãæ±ºãæã¡ããŠãããåŸä»ãã§çç±ãæžããŠããã®ã§ãã ããã§ãJSONã®äžŠã³ã reason â vote ã«å€æŽãããçç±ãå
ã«æžããããã«äžèŽããæç¥šãéžã¹ïŒççŸããŠã¯ãªããªãããšæç€ºã0.5Bã®ãŸãŸã§ãççŸã倧ããæžããŸããã æçµçã« qwen2.5:1.5b ã«äžãããšãæç¥šãšçç±ã®æŽåæ§ãå®å®ããŸããããŸãã«ã num_ctx=1024 ã®ãŸãŸã§ãçŽ1300åã®é·æè°é¡ãç Žç¶»ãªãåŠçã§ããŸããã 課é¡ïœæ¬åœã«æéãæº¶ãããã®ã¯ãããã¯ãŒã¯ãšOllama æ£çŽãã¢ãŒããã¯ãã£ããã宿©3å°ã®ç«ã¡äžãã®ã»ããé¥ãã«å€§å€ã§ãããåãèœãèžã人ã®ããã«æ®ããŠãããŸãã Wi-Fiãçªç¶åãã GUIããéçIPãèšå®ãããWi-Fiãåæããããã¡ã€ã«ãããã¹ã¯ãŒãïŒPSKïŒãæãèœã¡ãŠããŸããã è§£æ±ºïŒ ãããã¡ã€ã«ãåé€ã㊠nmcli device wifi connect ã§äœãçŽããéçåã nmcli ã§ãã¹ã¯ãŒãããšäžæ¬æå®ããã®ã確å®ã§ãã ïŒä»åã®æ§æãšããŠã¯ã€ã³ã¿ãŒãããäžèŠãªã®ã§ããã¯ã¹ãããã§ãã¡ãããŸããïŒ Ollamaã®ãµãŒãã¹ãå£ãã unit is masked â ãã£ã¬ã¯ããªæ¬ èœ â ssh: no key found ãšã1å°ã ããããã§ãããããªããŸããã è§£æ±ºïŒ äžéå端ã«çŽãããã å®å
šã«åé€ããŠãã install.sh ã§å
¥ãçŽã ã®ãæçã§ããã æ¯èŠããPiã«å±ããªã Ollamaã®æ¢å®ã¯ 127.0.0.1 åŸ
ã¡åãã§ãä»ãã·ã³ããèŠããŸããã è§£æ±ºïŒ OLLAMA_HOST=0.0.0.0:11434 ãèšå®ããŠåèµ·åã ss -tlnp | grep 11434 ã§åŸ
ã¡åãã 0.0.0.0 ã«ãªã£ãŠãããå¿
ã確èªããŸãããã æ€èšŒïœãæèŠãå²ããè°é¡ãã§è©Šã 倿°æ±ºã·ã¹ãã ã®èŠã©ããã¯ã祚ãå²ããŠãèšè«âåæç¥šããçºåããç¬éã§ããã ãã è«çã»ææ
ã»çŸå®ã®3èŠç¹ã察ç«ããè°é¡ ãéžã³ãŸãïŒäŸïŒãAIã«äººäºè©äŸ¡ãä»»ããã¹ããããå»¶åœæ²»çãäžæ¢ãã¹ãããïŒã é¢çœãã£ãã®ã¯é 奿§ã§ã é³å£°å
¥åã®å€æãã¹ã§è°é¡ãå€å°åŽ©ããŠããŠã ã3äœãšã劥åœãªçµè«ã«åæããŸããããããæ¬çªã§ã¯ãã³ã³ããã¹ãé·ããã é³å£°èªèã®ç²ŸåºŠã®ã»ããå®å®³ãªã¹ã¯ã倧ãã ãšããæ°ã¥ããåŸãããŸããã æ¯èŠãèµ·åã㊠[warmup] done ãåºãŠã3äœã®æç¥šããããè©æ±ºãè¿ã£ãŠããã°æåã§ãïŒ ããã§ã¯ãæ®æ¥ãæ³åŸã§å
šé¢çŠæ¢ãã¹ãããããŒãã«ããŠããŸãã ãŸãšã ã Raspberry Pi ã§LLMãªããŠåãã®ïŒããšããåä¿¡åçããå§ããŸãããã圹å²ãå²ãåã£ãŠèšèšãããã¥ãŒãã³ã°ãéããããšã§ãåè°AIã¯ãã£ããåããŸããã MAGI = 3ã€ã®äººæ Œã倿°æ±ºã§æ±ºããåè°ã·ã¹ãã ã ã1äººæ Œ = 1å°ã® Raspberry Pi ã ãç©ççã«åçŸã æ§æã¯ 3å°ã®PiïŒOllamaïŒ+ æ¯èŠïŒFlask + LangGraphïŒ ã圹å²ã¯ .env ã®URLã ãã§æ¯ãåããã·ã³ãã«èšèšã éåãªPiã§ãã ã³ã³ããã¹ãé·ã»çæéã»ã¢ãã«åžžé§ ã®3ç¹ãçµãã°å®çšçãªé床ã§åãã å°ããã¢ãã«ã®ãæç¥šãšçç±ã®ççŸãã¯ã ããã³ããã®äžŠã³æ¿ã ãšããå°ããªå·¥å€«ã§å€§ããæ¹åã§ããã äžçªã®æµã¯AIã§ã¯ãªã ãããã¯ãŒã¯ãšãµãŒãã¹ç®¡ç ããããä¹ãè¶ããã°åè°AIã¯ç«ã¡äžããã ä»åã¯ã€ãã³ãäŒå Žã«åããŠè»œéã»é«éã«ç¹åãããŸãããã粟床ãéèŠãä»ã®ã¢ãã«ã詊ããŠãããããšèããŠããŸãã ä»åŸããããããå人éçºãéããŠåŸãããç¥èŠããçããã«å
±æããŠãããããšæããŸãïŒ å®£äŒ çæAIãæŽ»çšããéçºãšããŠãèªåå°çšã®RAGãäœãããšããããŸãããèå³ãããæ¹ã¯ãã²ã®ãããŠã¿ãŠãã ããã RAGã®äœãæ¹ïœLlamaIndexã§ç°¡å2ã¹ããã RAGã®è²ãŠæ¹ïœLlamaIndexã§ãã«ãœãèšèš ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 32人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ã©ãºãã€3å°ã§ãšãŽã¡ã®MAGIãäœãïœããŒã«ã«LLMã§åãåè°AIã·ã¹ãã first appeared on SIOS Tech Lab .
PSSLã®äœã
æšã§ã MCP ãµãŒããŒãæžããŠãããšãããæ©èœã @mcp.tool ã§å®è£
ãã¹ãã @mcp.resource ã§å®è£
ãã¹ããã§è¿·ãå Žé¢ãåºãŠããŸããå
¬åŒã®ã³ãŒã¹ææã§ããããã¥ã¡ã³ããèªãããšããåãåŠçã tool ãš resource ã®äž¡æ¹ã§å®è£
ãããŠããŠãæåã«èªãã ãšãã¯éãããã³ãšæ¥ãŸããã§ããã 仿§ãèªã¿çŽããŠæŽçãããšãããå€æåºæºã¯æã£ãŠããããã¯ã£ããããŠããã®ã§ã䜿ãåãã®èãæ¹ãšããŠãŸãšããŸãã ãã®èšäºã§ã¯ã tool ãš resource ã®éãã¯ãæ©èœãã§ã¯ãªãã誰ãåŒã¶ããã§ããããš ã©ã¡ãã§å®è£
ããããæ±ºãã倿ãã㌠ãŠãŒã¹ã±ãŒã¹å¥ã®äœ¿ãåã resource åŽã«ãããªãæ©èœïŒURI ãã³ãã¬ãŒãã倿Žéç¥ïŒã®æŽ»ããæ¹ è¿·ã£ããšãã«äž¡æ¹åºããŠããå®è£
ãã¿ãŒã³ ãããã©ããïŒMessages API ã® MCP connector 㯠tool ã®ã¿ããªã©ïŒ ã«ã€ããŠãŸãšããŸããã 1. äœãããããªãã£ãã®ã Anthropic ã®ã³ãŒã¹ææã§ã¯ãã€ã³ã¡ã¢ãªã®ããã¥ã¡ã³ã管çãµãŒããŒã顿ã«ããããã tool ãå®çŸ©ãããŸãã @mcp.tool( name="read_doc_contents", description="Read the contents of a document and return it as a string." ) def read_document( doc_id: str = Field(description="Id of the document to read") ): if doc_id not in docs: raise ValueError(f"Doc with id {doc_id} not found") return docs[doc_id] ãšãããå°ãåŸã®ç« ã§ã ãŸã£ããåãããšããã resource ãåºãŠããŸãã @mcp.resource("docs://documents", mime_type="application/json") def list_docs() -> list[str]: return list(docs.keys()) @mcp.resource("docs://documents/{doc_id}", mime_type="text/plain") def fetch_doc(doc_id: str) -> str: if doc_id not in docs: raise ValueError(f"Doc with id {doc_id} not found") return docs[doc_id] ãã£ãŠããããšã¯ docs[doc_id] ãè¿ãã ãã§ãtool çãš 1 è¡ãéããŸããããªã 2 ã€ããã®ãã 2. éãã¯ã誰ãåŒã¶ãã çãã¯æ©èœå·®ã§ã¯ãªã å¶åŸ¡äž»äœ ã§ããMCP ã®ä»æ§ã§ã¯ tool 㯠model-controlledãresource 㯠application-controlled ãšæç¢ºã«åºå¥ãããŠããŸãã ã€ãŸã read_doc_contents ã¯ãClaude ã«èªåã§å€æããŠäœ¿ã£ãŠã»ããæ©èœãã docs://documents/{doc_id} ã¯ã @ ã¡ã³ã·ã§ã³ UI ã®ããã®ããŒã¿ãœãŒã¹ãã§ããåãåŠçã§ã圹å²ããŸã£ããéãããšããã®ãææã®æå³ã§ããã ãããæŒããããšãè³æã§ããèŠããresource ã¯ããŒã¿ãtool ã¯ã¢ã¯ã·ã§ã³ããšãã説æããããäžæ®µæ·±ãçè§£ã§ããŸããèªã¿åãå°çšãã©ãããæ¬è³ªãªã®ã§ã¯ãªãã åŒã¶å€æãã¢ãã«ã«å§ããã®ããã¢ããªãæ¡ãã®ã ãæ¬è³ªã§ãã 3. 倿ãã㌠å®è£
ãããšãã¯ããã®é çªã§èãããšããããã§ãã Q1 ã¯åçŽã§ããæžã蟌ã¿ã»åé€ã»å€éšãžã®éä¿¡ã¯å¿
ã tool ã«ããŸãã resources/read ã¯ã¯ã©ã€ã¢ã³ããåèªã¿èŸŒã¿ããã£ãã·ã¥ãããåæã®æäœãªã®ã§ãããã«å¯äœçšã眮ããšäœååŒã°ãããåãããäºæ
ããŸãããGET ã«å¯äœçšãæãããªãããšåã話ã§ãã Q2 ãš Q3 ãå®è³ªçãªåããç®ã§ããèªã¿åãå°çšã§ãã ãã©ã®ããŒã¿ãå¿
èŠããã¢ãã«ã«å€æããããããªã tool ã§ããããããèªã¿åãã ãã resourceããšæ©æ¢°çã«æ±ºããŠããŸããšãã¢ãã«ããã¯ååšããªãããŒã¿ã«ãªã£ãŠããŸããŸãã 仿§åŽã«ããã®æéãæžãããŠããŠã ã¢ãã«ã«å¯ŸããŠããŒã¿ãèªåçã«å
¬éãããå Žå㯠Tools ã®ãã㪠model-controlled ãªããªããã£ãã䜿ãã¹ã ãšãããŠããŸãã 4. ãŠãŒã¹ã±ãŒã¹å¥ã®äœ¿ãåã å
·äœäŸã«èœãšããšãããªããŸãã ããããããš éžæ çç± @ ã§ããã¥ã¡ã³ããåç
§ããã resource ãŠãŒã¶ãŒã® UI æäœãåŒãéãã¢ãã«ã®å€æã¯äžèŠ ãreport.pdf ãèŠçŽããŠãã«å¿ãã tool ã©ã®ããã¥ã¡ã³ããå¿
èŠãã¯ã¢ãã«ã倿ãã ããã¥ã¡ã³ããç·šéãã tool å¯äœçšããã å
šææ€çŽ¢ããŠè©²åœç®æãè¿ã tool æ€çŽ¢ã¯ãšãªãã¢ãã«ãçµã¿ç«ãŠã ãããžã§ã¯ãèŠçŽã DB ã¹ããŒããåžžã«æèã«å
¥ãã resource ã¢ããªãå®åçã«æ³šå
¥ããã°ãã ãã°ã®ææ°ç¶æ
ã远ããã resource + subscribe 倿Žéç¥ããããã³ã«æšæºã«ãã ãã±ãããäœæãã tool å¯äœçšããã ãŠãŒã¶ãŒãéžãã ãã¡ã€ã«ãæ·»ä»ãã resource éžæããã®ã¯ãŠãŒã¶ãŒ ãæ€çŽ¢ã¯ toolãæå®ã¯ resourceããšèŠãããšæŽçãããããšæããŠããŸããäœãåãããæ±ºãŸã£ãŠããªããªã toolãæ±ºãŸã£ãŠãããªã resource ã§ãã 5. resource åŽã®æ©èœã掻ãã resource ãéžãã å Žåãtool ã«ã¯ãªãä»çµã¿ã䜿ããŸããããã䜿ããªããš resource ã«ããæšå³ãèããªããŸãã 5.1 URI ãã³ãã¬ãŒããšè£å® docs://documents/{doc_id} ã®ãããªãã³ãã¬ãŒã㯠RFC 6570 ã® URI Template æ§æã§ã resources/templates/list ã§ discovery ã§ããŸãããã©ã¡ãŒã¿ã¯ MCP ã® completion API ã§èªåè£å®ã«å¯Ÿå¿ãããããã®ã§ã @ ã¡ã³ã·ã§ã³ã®åè£è¡šç€ºãæšæºã®æ ã«ä¹ããŸããPython SDK ã¯ãã³ãã¬ãŒãã®ãã©ã¡ãŒã¿ãèªåã§ããŒã¹ããŠé¢æ°ã®ããŒã¯ãŒãåŒæ°ã«æž¡ããŠãããã®ã§ãå®è£
åŽã¯ URI ã®ããŒã¹ãæžãå¿
èŠããããŸããã 5.2 倿Žéç¥ïŒsubscribeïŒ ãµãŒããŒã subscribe capability ã宣èšãããšãã¯ã©ã€ã¢ã³ã㯠resources/subscribe ã§åå¥ã® URI ã賌èªã§ããå
容ãå€ãããš notifications/resources/updated ãé£ã³ãŸããã¯ã©ã€ã¢ã³ãã¯ãããåããŠåèªã¿èŸŒã¿ããŸãããã°ãã¡ããªã¯ã¹ã®ãããªãæŽæ°ããç¶ããããŒã¿ããæ±ããªããããŒãªã³ã°ãèªäœããã«æžã¿ãŸãã 5.3 mime_type mime_type ã¯ã¯ã©ã€ã¢ã³ããã¬ã³ããªã³ã°ã決ãããã³ãã«ãªããŸããJSON ãè¿ãã®ã« text/plain ãæžããŠãããšãã¯ã©ã€ã¢ã³ãã«ãã£ãŠã¯çŽ ã®æååãšããŠæ±ãããŸããSDK ãæ»ãå€ã®ã·ãªã¢ã©ã€ãºã¯ãã£ãŠãããŸãããMIME ã¿ã€ãã®æ£ããã¯é¢åãèŠãŠãããªãã®ã§ãããã¯ãµãããªãã»ããããã§ãã 6. è¿·ã£ããäž¡æ¹åºããŠãã 倿ãããŒã§æŽçããŠããå®éã«ã¯ãäž¡æ¹ãããšäŸ¿å©ããšããã±ãŒã¹ãåºãŠããŸãããã®ãšã㯠å
éšå®è£
ã 1 æ¬ã«ããŠãtool ãš resource ã®äž¡æ¹ããåŒã¶ ã®ãçŽ çŽã§ãã çç±ã¯ãresource ã®æ±ããã¯ã©ã€ã¢ã³ãå®è£
ã«å§ããããŠããããã§ãã仿§äžããŠãŒã¶ãŒã«æç€ºçã«éžæãããã¯ã©ã€ã¢ã³ãããã¥ãŒãªã¹ãã£ã¯ã¹ã§èªåéžæããã¯ã©ã€ã¢ã³ããã¢ãã«èªèº«ã«éžã°ããã¯ã©ã€ã¢ã³ããã©ããããåŸããšãããŠããŸããå®éã«ã resources/list ã¯å®è£
æžã¿ã§ã read ã® UX ããŸã¡ãŸã¡ã subscribe ã¯æªå¯Ÿå¿ããšãã£ãå·®ããããŸããresource ããçšæããŠããªããšãæªå¯Ÿå¿ã®ã¯ã©ã€ã¢ã³ãããã¯äžèº«ã空ã£ãœã«èŠããŸãã from mcp.server.fastmcp import FastMCP from pydantic import Field mcp = FastMCP("DocumentMCP", log_level="ERROR") docs = { "deposition.md": "This deposition covers the testimony of Angela Smith, P.E.", "report.pdf": "The report details the state of a 20m condenser tower.", } # --- å®è£
㯠1 ç®æã ã --- def _list_doc_ids() -> list[str]: return list(docs.keys()) def _read_doc(doc_id: str) -> str: if doc_id not in docs: raise ValueError(f"Doc with id {doc_id} not found") return docs[doc_id] # --- resource: ã¢ããªã® @ ã¡ã³ã·ã§ã³ UI çš --- @mcp.resource("docs://documents", mime_type="application/json") def list_docs_resource() -> list[str]: return _list_doc_ids() @mcp.resource("docs://documents/{doc_id}", mime_type="text/plain") def fetch_doc_resource(doc_id: str) -> str: return _read_doc(doc_id) # --- tool: Claude ãèªåã§å€æããŠåŒã¶çš --- @mcp.tool( name="list_documents", description="List the ids of all available documents." ) def list_documents() -> list[str]: return _list_doc_ids() @mcp.tool( name="read_doc_contents", description="Read the contents of a document and return it as a string." ) def read_document( doc_id: str = Field(description="Id of the document to read") ): return _read_doc(doc_id) 远å ã³ã¹ãã¯ãã³ã¬ãŒã¿æ°è¡ãªã®ã§ãå²ã«åããšæã£ãŠããŸãããã ã tool ãå¢ãããšãã®å®çŸ©ã¯ã¢ãã«ã®ã³ã³ããã¹ããåžžã«æ¶è²»ããã®ã§ããäœã§ã tool ã«ãåºããŠãããã¯é¿ããã»ããããã§ããæè泚å
¥ã§å®çµããããŒã¿ã¯ resource ã ãã«çããŸãã åäœç¢ºèªã¯ Inspector ãæ¥œã§ãã uv run mcp dev mcp_server.py Resources ãš Resource Templates ã奿 ã§è¡šç€ºãããã®ã§ããã³ãã¬ãŒãã®ãã©ã¡ãŒã¿è§£æ±ºãŸã§ç¢ºèªã§ããŸãã 7. 泚æç¹ïŒãããã©ããïŒ 7.1 Messages API ã® MCP connector 㯠tool ãã䜿ããªã ããã¯äºåã«ç¥ããªããšè©°ã¿ãŸããå
¬åŒããã¥ã¡ã³ãã«æèšãããŠããŠãMCP 仿§ã®æ©èœã»ããã®ãã¡ çŸæç¹ã§ã¯ tool call ã®ã¿ãµããŒã ã§ããããã«ãµãŒããŒã¯ HTTP ã§å
¬éãããŠããå¿
èŠãããã ããŒã«ã« STDIO ãµãŒããŒã¯çŽæ¥æ¥ç¶ã§ããŸãã ã mcp_servers ãã©ã¡ãŒã¿ïŒMCP connectorïŒ ââ tool call ... OK ââ resource ... NG ââ prompt ... NG ââ stdio ãµãŒã㌠... NG ãresource ãäœã£ãã®ã« Messages API ããèªããªããã¯ä»æ§ã©ããã®æåã§ãã 7.2 resource ã䜿ããããªãã¯ã©ã€ã¢ã³ãåŽãã«ããŒã«å¯ãã ã§ã¯ API çµç±ã§ resource ãäœ¿ãææ®µãç¡ãã®ããšãããšãããã§ã¯ãªã èªåã§ MCP ã¯ã©ã€ã¢ã³ãæ¥ç¶ã管çãã åŽã«åããŸããAnthropic SDK ã«ã¯ãã®ããã®å€æãã«ããŒãçšæãããŠããŸãã # pip install "anthropic[mcp]" ïŒPython 3.10 以éïŒ from anthropic.lib.tools.mcp import mcp_resource_to_content resource = await mcp_client.read_resource(uri="file:///path/to/doc.txt") response = await client.beta.messages.create( model="claude-opus-5", max_tokens=1024, messages=[{ "role": "user", "content": [ mcp_resource_to_content(resource), {"type": "text", "text": "Summarize this document"}, ], }], ) mcp_resource_to_file ã䜿ãã°ãã®ãŸãŸ Files API ã«ã¢ããããŒããã§ããŸããå
¬åŒã®äœ¿ãåããæå¿«ã§ã URL ã§å°éã§ãããªã¢ãŒããµãŒããŒã§ tool ã ã䜿ããããªã mcp_servers ãã©ã¡ãŒã¿ãããŒã«ã«ãµãŒããŒã prompt / resource ã䜿ããããªãã¯ã©ã€ã¢ã³ãåŽãã«ã㌠ã§ãã resource ã¯ãClaude ãåæã«èªããã®ãã§ã¯ãªããã¢ããªãèªãã§ããã³ããã«è©°ãããã®ãã ãšãã 2 ç« ã®è©±ããSDK ã® API èšèšã«ãã®ãŸãŸçŸããŠããŸãã 7.3 resource link ã¯ã¯ã©ã€ã¢ã³ãåŽã§è§£æ±ºããŠããæž¡ã 倿ãã«ããŒã¯ãæªå¯Ÿå¿ã®ã³ã³ãã³ãã¿ã€ãã MIME ã¿ã€ãããã㊠resource link ãæž¡ããšäŸå€ãæããŸãïŒPython ãªã UnsupportedMCPValueError ïŒãresource link 㯠MCP ã¯ã©ã€ã¢ã³ãåŽã§å®äœã«è§£æ±ºããŠãã倿ããå¿
èŠããããŸãã 7.4 倧ãã resource ã¯ã³ã³ããã¹ããé£ã resource ã®äžèº«ã¯æçµçã«ããã³ããã«å
¥ããŸãããã°ãã¡ã€ã«å
šäœã®ãã㪠resource ããã£ããæ³šå
¥ãããšäžæã§ã³ã³ããã¹ããåãŸããŸãã倧ãããã®ã¯ resource link ã§åç
§ãããããtool åŽã§ãã£ã«ã¿ã»èŠçŽããŠããè¿ãèšèšã«ããã»ããå®å
šã§ãã 8. ãŸãšã tool ãš resource ã®éãã¯æ©èœã§ã¯ãªã å¶åŸ¡äž»äœ ãtool 㯠model-controlledãresource 㯠application-controlled 倿ã¯ãå¯äœçšãããããâãåŒã¶ã¿ã€ãã³ã°ãã¢ããªã決ããããããâãã¢ãã«ã«ååšãç¥ãããå¿
èŠãããããã®é ã§èãã èªã¿åãå°çšã§ãã äœãåãããã¢ãã«ã«å€æãããããªã tool ãèªã¿åãã ãã resourceããšæ©æ¢°çã«æ±ºãããšã¢ãã«ããèŠããªãããŒã¿ã«ãªã resource ãéžãã ã URI ãã³ãã¬ãŒãã»è£å®ã» subscribe ã» mime_type ãŸã§äœ¿ãåããšå¹æãåºã äž¡æ¹ãããšäŸ¿å©ãªã±ãŒã¹ã¯ãå
éšé¢æ°ãå
±æããŠäºéæäŸããããã ã tool å®çŸ©ã¯ã³ã³ããã¹ããæ¶è²»ããç¹ã«æ³šæ Messages API ã® MCP connector 㯠tool ã®ã¿ãresource ã䜿ããªãã¯ã©ã€ã¢ã³ãåŽãã«ããŒïŒ mcp_resource_to_content / mcp_resource_to_file ïŒã«å¯ãã ãã¢ãã«ã«å€æããããã®ããã¢ããªã決ãæã¡ãããã®ããèšèšãšããŠå
ã«æ±ºããŠãããšãå®è£
ãã¬ãã¥ãŒãã¶ããªããªããŸããäœã§ã tool ã«ããŠã¢ãã«ã«æ¢çŽ¢ããããšããŒã¯ã³ãå¢ããŠæåãæºããŸãããéã«äœã§ã resource ã«ãããšã¢ãã«ããã¯ååšããªãããŒã¿ã«ãªããŸããAI ãšãŒãžã§ã³ããšçµã¿åãããéçºã§ã¯ããã®ãã©ããŸã§ãæ©æ¢°çã«ç¢ºå®ãããããã®ç·åŒããæ¯åè«ç¹ã«ãªããªãšæããŠããŸãã åèãªã³ã¯ MCP connector – Claude Platform Docs: https://platform.claude.com/docs/en/agents-and-tools/mcp-connector Resources – Model Context Protocol 仿§: https://modelcontextprotocol.io/specification/draft/server/resources Connect to local MCP servers: https://modelcontextprotocol.io/docs/develop/connect-local-servers Connect Claude Code to tools via MCP: https://code.claude.com/docs/en/mcp MCP TypeScript SDK: https://github.com/modelcontextprotocol/typescript-sdk AI ãšãŒãžã§ã³ãå°å
¥ã®ãçžè« ãµã€ãªã¹ãã¯ãããžãŒã§ã¯ãæ¬èšäºã§æ±ã£ã MCP ãµãŒããŒã®èšèšã»å®è£
ãå«ã AI ãšãŒãžã§ã³ãã® SI ãµãŒãã¹ ãæäŸããŠããŸããæ¢åã·ã¹ãã ãš AI ãšãŒãžã§ã³ãã®æ¥ç¶ãRAG ã®ç²ŸåºŠè©äŸ¡ãšæ¹åãªã©ãPoC ããæ¬çªéçšãŸã§ã®å®è£
ãã§ãŒãºããŸãšããŠãæ¯æŽããŸãã ãèªç€Ÿã®æ¥åã§ã©ããŸã§èªååã§ããã®ãããã©ã®ããŒã¿ããšãŒãžã§ã³ãã«æž¡ãã¹ããããšãã£ãæ§æ³æ®µéã®ãçžè«ãæè¿ã§ããç¡æçžè«ãæ¿ã£ãŠãããŸãã®ã§ããèå³ã®ããæ¹ã¯äžèšãµãŒãã¹ãµã€ããããæ°è»œã«ãåãåãããã ããã ãµã€ãªã¹ ãã¯ã¹ãããã¯ãœãªã¥ãŒã·ã§ã³ çæAIå°å
¥æ¯æŽãµãŒãã¹: https://nextech-solutions.sios.jp/genai/ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post MCP ã® tool ãš resource ã®äœ¿ãåã first appeared on SIOS Tech Lab .
ãFigmaãã¶ã€ã³ãšãŒãžã§ã³ãïŒããŒã¿çïŒããç»å Ž 5æ20æ¥ã«ãFigmaã«ãŠããã¶ã€ã³ãšãŒãžã§ã³ããæ©èœãããŒã¿çãšããŠç»å ŽããŸããã ä»åã¯ããã®æ©èœãå°ãå©çšããå
容ããäœ¿çšæã¬ããŒããšããŠããã£ããã£ãŒç»åäžå¿ã«ãäŒãããŸãã å
¬åŒã®æ¡å
ã¯ãã¡ããã芧ãã ããã å
¬åŒããã°ïŒ Figmaãã¶ã€ã³ãšãŒãžã§ã³ããç»å Ž | Figma Blog å©ç𿹿³ã¯ç°¡åã§ãæ¢åã®Figmaãã¶ã€ã³ã®ããã²ãŒã·ã§ã³ã«è¿œå ãããããšãŒãžã§ã³ããããåãã¬ãŒã ãªã©ã«è¡šç€ºããããšãŒãžã§ã³ãã¢ã€ã³ã³ïŒâŠïŒããèªç¶èšèªã§ããã³ãããå
¥åãããšãããšãŒãžã§ã³ãããã¢ãã¯ã¢ããçæã倿ŽãããŠãããŸãã ïŒçŸåšãã®æ©èœã¯æåã¢ã«ãŠã³ãã«ãŠãAIã¯ã¬ãžãããæ¶è²»ããã«ã詊çšã§ããŸããæ£åŒãªãªãŒã¹åŸã¯AIã¯ã¬ãžãããæ¶è²»ãããããã§ããïŒ äŸ1ïŒç°¡åãªããã³ãã ãŸããäœãç¡ãç»é¢ã«ã以äžã®ç°¡åãªããã³ãããéä¿¡ããŸããã JiraãAsanaãNulab BacklogãRedmineã®ãããªãSaaSã®ãããã§ãã·ã§ãã«ãªã¿ã¹ã¯ç®¡çããŒã«ã®ç»é¢ã¢ãã¯ã¢ãããäœæããŠãã ããã ç»é¢ã¯ãã¿ã¹ã¯äžèЧããŒãžããšãåã¿ã¹ã¯ã®è©³çްããŒãžãã®2ã€ã®ç»é¢ã 2åã»ã©ã§ãUIã¢ãã¯ã¢ãããæç»ãããå質ãšããŠã¯ããã®ãŸãŸå©çšããŠããã»ãŒåé¡ç¡ããã®ã§ãã é
眮ãããŠããUIèŠçŽ ãåºæ¬ã¬ã€ã¢ãŠããã¹ããŒã·ã³ã°ïŒäœçœïŒãé
è²ãæåãµã€ãºããããŒã³ã³ãã³ãå
容ãã©ããåºæ¬çã«ãäžèªç¶ãã¯ãããŸããã 簡åãªããã³ããã§ãUIã¢ãã¯ã¢ãããçæããã ãã¡ãããçæãããã¢ãã¯ã¢ããã¯Figmaãã¶ã€ã³ã®ãªãŒãã¬ã€ã¢ãŠããé©çšãããã¬ã€ã€ãŒèŠçŽ ã§æ§æãããŠãããæåã§ç·šéå¯èœã§ãã çæãããã¢ãã¯ã¢ããã¯æåç·šéãå¯èœ äŸ2ïŒãã¶ã€ã³ã·ã¹ãã ãæå® Figmaãã¶ã€ã³ãšãŒãžã§ã³ãã¯ãæ¢åã®ã©ã€ãã©ãªãæå®å¯èœã§ããUIã³ã³ããŒãã³ããã¹ã¿ã€ã«å®çŸ©ãæ ŒçŽãããã©ã€ãã©ãªãåç
§ãããããšã§ã现ããæç€ºãªãã§ãæå³ã«æ²¿ã£ãUIæ§ç¯ãæåŸ
ã§ããŸãã å
·äœçã«ã¯ããã¶ã€ã³ãã¡ã€ã«ã«å¯ŸããŠããŸãã©ã€ãã©ãªã远å ããŸããïŒå
¬åŒ: Figmaã®ã©ã€ãã©ãªã«é¢ããã¬ã€ã ïŒ ãã®ããã§ããšãŒãžã§ã³ãã®ããã³ããæ¬ã®ãªãã·ã§ã³ã«ãŠæå¹ã«ããã©ã€ãã©ãªãæå®ããŸããïŒãã§ãã¯ãå
¥ããïŒ ä»åã¯å
¬éãããŠããã Primer Web ãïŒFigmaãã¶ã€ã³ãã¡ã€ã«ïŒãã©ã€ãã©ãªãšããŠæå®ããããã³ããã§ã¯ãäŸ1ãã®ããã³ããã«å ããŠã念ã®ããããã¶ã€ã³ã·ã¹ãã ã¯ãPrimer Webãã䜿çšããšè¿œèšããŠå®è¡ãããšããã3ååã»ã©ã§ç²ŸåºŠã®é«ãåºåãåŸãããŸããã ããã³ãããéä¿¡ããåã«ãã©ã€ãã©ãªãæå® ã©ã€ãã©ãªãé©çšãããUIã¢ãã¯ã¢ãã åºåãããã¢ãã¯ã¢ããã«ã€ããŠãUIã©ãã«ããã³ã³ãã³ããæ¥æ¬èªåããããã ç»é¢ã®å
å®¹ãæ¥æ¬èªåããŠ ãšæç€ºãè¡ãã ããã«ãã¿ã¹ã¯è©³çްããŒãžã®èŠçŽ ã«éãªããçºçããŠããã®ã§ã詳现ç»é¢ãéžæã㊠ã³ã¡ã³ãå
¥åæ¬ãšãç»é¢å³åŽã®ã¹ããŒã¿ã¹ãªã©ã®èŠçŽ ãéãªã£ãŠããã®ã§ãéãªããªãããã«ããŠã ãšæç€ºããããšãæ³å®ã©ããã«æŽæ°ãããŸããã ã©ã€ãã©ãªã®ã³ã³ããŒãã³ãé©çš åUIèŠçŽ ããã©ã€ãã©ãªã®UIã³ã³ããŒãã³ããã€ã³ã¹ã¿ã³ã¹ãšããŠé
眮ãããŠãããã確èªãããšãããããã¿ã³ããããã³ãããªã¹ãããã©ãã«ããã¢ãã¿ãŒããªã©ã¯ãåé¡ãããŸããã§ããã ããããã»ã¬ã¯ããããããŒã¿ããŒãã«ããªã©ã¯ãã©ã€ãã©ãªãå©çšãããŠããŸããã§ããã ã»ã¬ã¯ãèŠçŽ ãéžæããŠãã©ã€ãã©ãªã®ã³ã³ããŒãã³ããå©çšããããã«æç€ºãããšãããã³ã³ããŒãã³ããé©çšãããŸãããããåªå
床: ãã¹ãŠããªã©ã®ã©ãã«æåãç¡å¹åãããããããšãŒãžã§ã³ãã«ããæŽæ°ããå
ã«æ»ãããè¡ããã©ãã«å
容ãä¿æããããã«å床æç€ºããããšããããã®ãšãããšãªããŸããã 衚ïŒããŒãã«ïŒéšåã¯ãDataTableã³ã³ããŒãã³ãã®é©çšãæç€ºããŠãããªããªãæåŸ
éãã«ã¯ãªããŸããã ããŒãã«ã«ã¯ãããããŒãè¡ãåãããã¿ãŒãããã«ã»ã«ã®èŠçŽ ã®ããªãšãŒã·ã§ã³ãªã©è€éãªãããå©çšããã³ã³ããŒãã³ãã®ç¹æ§ãèžãŸããŠãæç€ºãããå¿
èŠãããããã§ãã ãšãŒãžã§ã³ãã®å¶åŸ¡ãé£ããå Žåã¯ãæ©ãã«æåç·šéã«åãæ¿ããã®ãè¯ããããããŸããã ãªããFigmaãã¶ã€ã³ãšãŒãžã§ã³ãã¯ãåæã«è€æ°ã®ããã³ãããéä¿¡ããŠã䞊è¡ããŠåŠçãããããšãå¯èœã§ãã äŸ3ïŒããªãšãŒã·ã§ã³çæ ãäŸ1ããäŸ2ãã«ãŠçæãããç»é¢ã¯ããã¹ã¯ãããçšã®ã©ã€ãã¢ãŒãç»é¢ã§ããããããŒã¯ã¢ãŒããã¢ãã€ã«ç»é¢ããäžèšã®ãããªããã³ããã§äŸé ŒããŸããã ãã®ç»é¢ã®ããŒã¯ã¢ãŒãçãå¥ã®frameã§äœæããŠã ããã2ã€ã®ç»é¢ã«å¯Ÿãããã¢ãã€ã«ïŒã¹ããŒããã©ã³ïŒçšã®ç»é¢ãäœæããŠã çµæãšããŠã¯ãããŒã¯ã¢ãŒãã¯æåŸ
éãã§ããã ã¢ãã€ã«ç»é¢ã¯ãå°ã
ããã¡ãªãã§ããããããå°ãšããŠå©çšã§ãããã§ãã çæãããããŒã¯ã¢ãŒãã®UIã¢ãã¯ã¢ãã çæãããã¢ãã€ã«çã®UIã¢ãã¯ã¢ãã ä»ã®ãµãŒãã¹ãšæ¯èŒ 以äžãFigmaãã¶ã€ã³ãšãŒãžã§ã³ãïŒããŒã¿çïŒã®ç°¡åãªäœ¿çšæã§ãããæ¯èŒãšããŠãåãããã³ãããæ¬¡ã®2ã€ã®ãµãŒãã¹ã«éä¿¡ããŠã¿ãŸããã ChatGPTïŒç»åçæïŒ éçãªç»åãšããŠåºåãããŸããã¬ã€ã¢ãŠããèŠçŽ ã®æ§æã¯é©åã§ãããFigmaãªã©ã§ç·šéå¯èœãªã¬ã€ã€ãŒãšããŠåºåã¯ãããªãããããããã¿ã€ããžã®èœãšã蟌ã¿ãã詳现ãæåç·šéããã«ã¯å¥éäœæ¥ãå¿
èŠã§ãã ChatGPTã«ããçæãããUIã¢ãã¯ã¢ãã Figma Make ãFigma Makeãã¯2025幎ãªãªãŒã¹ã®æ©èœã§ããïŒå
¬åŒïŒ Figma Makeãæ¢ã ïŒ ããã³ããããããã³ããšã³ãã³ãŒãã®çæã«éãã眮ããŠãããFigmaãšãŒãžã§ã³ããšã¯åºåã®æåæ§ãç°ãªããŸããFigma Makeã§çæããå
容ã¯Figmaãã¶ã€ã³ãã¡ã€ã«ãžã³ããŒïŒããŒã¹ãããŠç·šéããããšãå¯èœã§ãã ããã³ãããéä¿¡ãããšãæ°åã§ã¿ã¹ã¯äžèЧç»é¢ã詳现ç»é¢ã®ãããã¿ã€ããã§ããŸããã ç»é¢ã®èŠçŽ ãã¬ã€ã¢ãŠããé
è²ã¯å®æãããŠãããéåæã¯ãããŸããã ãMakeããšããã¶ã€ã³ãšãŒãžã§ã³ããã¯åãFigmaã®ãµãŒãã¹ã§ããåãããã³ããããçæãããå
容ã¯ç°ãªãå°è±¡ã§ãã Figma Makeã§çæããããããã¿ã€ã ãããã« äžèšã®å
¬åŒæ¡å
ã« …ãAIçæãããããšãçŽæ¥æäœã?ããšãã£ããåœãã®äºè
æäžãæµ®äžããŠããŸããããããã©ã¡ãããéžã¶å¿
èŠãªã©ãªãã¯ãã§ããïŒçç¥ïŒç§ãã¡ã®ç®æšã¯ãFigmaã«ç²ŸéããããŒã ã®åãæ¹ã«èªç¶ã«æº¶ã蟌ããšãŒãžã§ã³ããäœæããããšã§ããã… ãšããããã«ãæäœæ¥ãšãšãŒãžã§ã³ããšãããŸãåãããããšã§ãUIã¢ãã¯ã¢ããããããã¿ã€ãäœæãããªãšãŒã·ã§ã³ã¥ããã®å·¥æ°åæžããå質ã®åäžãå®çŸã§ãããã§ãã Photo by Zac Wolff on Unsplash ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post Figmaãã¶ã€ã³ãšãŒãžã§ã³ãã詊ã first appeared on SIOS Tech Lab .
ã¯ããã« ãã¡ãã®èšäº ã§å®éã«Kubernetesç°å¢ã«KubeBlocksãå°å
¥ããDBaaSã®åºç€ãæ§ç¯ããŸããã ååã®èšäº ã§ã¯KubeBlocksãå©çšããŠDBaaSåºç€äžã«MySQLãæ§ç¯ããŸããã ä»åã¯ãKubeBlocksãå©çšããŠNoSQLã®ã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ã§ããRedisãæ§ç¯ããŠãããŸãã å°å
¥ç°å¢æ§æå³ 以äžã®å³ã¯ãDBaaSåºç€äžã«Redisãå°å
¥ããç°å¢ã®æ§æå³ã§ãã ãKubeBlocksãªãã¬ãŒã¿ãŒã㯠ãã¡ãã®èšäº ã§æ§ç¯ããŸããã æ¬èšäºã§ã¯ã赀䞞ã§å²ãŸãããDB(Redis)ãã®æ§ç¯ã察象ãšããŸãã Redisã¯ãã¹ãŠã®ããŒã¿ãã¡ã¢ãªäžã§åŠçãããã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ãã®äžçš®ã§ãNoSQLã«åé¡ãããŸãã ãã£ã¹ã¯ïŒSSD/HDDïŒã«ã¢ã¯ã»ã¹ããäžè¬çãªããŒã¿ããŒã¹ãšæ¯èŒããŠå§åçã«é«éãªã®ãç¹åŸŽã§ãäž»ã«Webãµã€ããã¢ããªã®é«éåïŒãã£ãã·ã¥ïŒãããªã¢ã«ã¿ã€ã åŠçã«å©çšãããDBã«ãªããŸãã å°å
¥ç°å¢æ§æå³ Redisã®æ§ç¯æ¹æ³ KubeBlocksã䜿çšããŠRedisãæ§ç¯ããæé ãã玹ä»ããŸãã ä»åã¯æãã·ã³ãã«ãªã1å°ã®ãµãŒããŒã§Redisã皌åãããã¹ã¿ã³ãã¢ãã³æ§æã§äœæããŠãããŸãã åææ¡ä»¶ KubeBlocksãæ§ç¯æžã¿ã§ããããš KubeBlocksã«ãã£ãŠããã©ã«ãã§ã€ã³ã¹ããŒã«ãããRedisã¢ããªã³ïŒä»¥äžã³ãã³ãçµæã®redis 1.0.1ïŒãæå¹ã«ãªã£ãŠããã㚠以äžã®kbcliã³ãã³ãã§æå¹åãããŠããã¢ããªã³ã確èªããããšãã§ããŸãã kbcli addon list # åºåäŸ NAME VERSION PROVIDER STATUS AUTO-INSTALL qdrant 1.0.1 community Disabled false rabbitmq 1.0.1 community Disabled false apecloud-mysql 1.0.1 community Enabled true etcd 1.0.1 community Enabled true kafka 1.0.1 community Enabled true mongodb 1.0.1 community Enabled true mysql 1.0.1 community Enabled true postgresql 1.0.1 community Enabled true redis 1.0.1 community Enabled true Namespeaceã®äœæ ãŸãã¯Redisããããã€ããNamespeaceãäœæããŸãã kubectl create namespace redis # åºåäŸ namespace/redis created ããã©ã«ããŠãŒã¶ãŒèªèšŒçšSecretã®äœæ Redisã®ããã©ã«ããŠãŒã¶ãŒçšã®ãŠãŒã¶ãŒåã»ãã¹ã¯ãŒããèšå®ããSecretãäœæããŸãã kubectl create secret generic custom-redis-root-secret \ --from-literal=username='default' \ --from-literal=password='<ä»»æã®å€>' \ -n redis # åºåäŸ secret/custom-redis-root-secret created â»Redisäœææã«æ¬æé ã§äœæããSecretãæå®ããããšã§ãããã©ã«ããŠãŒã¶ãŒã®ãã¹ã¯ãŒããä»»æã®å€ã§èšå®ããããšãã§ããŸãã Secretã®æå®ããªãå Žåã¯ãKubeBlocksãããã©ã«ããŠãŒã¶ãŒçšã®ãã¹ã¯ãŒããèªåçºè¡ããŸãã Redisã®äœæ MySQLã¯ã©ã¹ã¿ãŒæ§ç¯æãšåæ§ã«ãKubeBlocksã®ã«ã¹ã¿ã ãªãœãŒã¹ã§ãããClusterãã®ãããã§ã¹ããé©çšããRedisãäœæããŸãã cat <<EOF | kubectl apply -f - apiVersion: apps.kubeblocks.io/v1 kind: Cluster metadata: name: redis-cluster namespace: redis spec: terminationPolicy: Delete clusterDef: redis topology: standalone componentSpecs: - name: redis replicas: 1 systemAccounts: - name: default secretRef: name: custom-redis-root-secret namespace: redis serviceVersion: 8.0.3 disableExporter: false resources: limits: cpu: "0.5" memory: "0.5Gi" requests: cpu: "0.5" memory: "0.5Gi" volumeClaimTemplates: - name: data spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi EOF # åºåäŸ cluster.apps.kubeblocks.io/mycluster created clusterDef: redis Redisã¢ããªã³ãæäŸããRedisã®æ§æãã³ãã¬ãŒãããäœæããDBã¯ã©ã¹ã¿ãŒã®ããŒã¹ãšããŠæå®ããèšå®ã§ãã topology: standalone Redisãåäžã®RedisãµãŒããŒã€ã³ã¹ã¿ã³ã¹ã§æ§æãããã¹ã¿ã³ãã¢ãã³ã¯ã©ã¹ã¿ãŒãšããŠèµ·åããèšå®ã§ãã terminationPolicy: Delete ã¯ã©ã¹ã¿ãŒãåé€ããéãé¢é£ããããŒã¿ãäžç·ã«åé€ããèšå®ã§ãã systemAccounts Redisã®ããã©ã«ããŠãŒã¶ãŒã®èªèšŒæ
å ±ïŒãŠãŒã¶ãŒåã»ãã¹ã¯ãŒãïŒã«ãäºåã«äœæããSecretãå²ãåœãŠãèšå®ã§ãã volumeClaimTemplates DBã®ããŒã¿ãä¿åããããã®PVã®èšå®ã§ãã Redisã®äœæç¢ºèª Redisäœæã³ãã³ãå®è¡åŸã以äžã®ã³ãã³ãã§ã¯ã©ã¹ã¿ãŒã»Podã®ã¹ããŒã¿ã¹ã確èªããŸããã¹ããŒã¿ã¹ãRunningã«ãªã£ãŠããã°æ£åžžã«åäœããŠããŸãã kubectl get cluster redis-cluster -n redis # åºåäŸ NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE redis-cluster redis Delete Running 110s kubectl get pods -n redis # åºåäŸ NAME READY STATUS RESTARTS AGE redis-cluster-redis-0 4/4 Running 0 2m15s åäœç¢ºèª Redisãžã®æ¥ç¶ãã¹ããè¡ããŸãã ãŸããäœæããRedisã®ãšã³ããã€ã³ãïŒServiceåïŒã確èªããŸãã kubectl get svc -l app.kubernetes.io/instance=redis-cluster -n redis # åºåäŸ NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE redis-cluster-redis-redis ClusterIP 10.43.163.160 <none> 6379/TCP 3m kubectl runã³ãã³ãã§Redisã¯ã©ã€ã¢ã³ãçšã®Podãäœæããã³ã³ããå
ã§ã·ã§ã«ãèµ·åããŸãã kubectl run redis-client -n redis --rm -i --tty --image=redis:8.0.3 --restart=Never -- bash # åºåäŸ If you don't see a command prompt, try pressing enter. root@redis-client:/data# redis-clientã³ãã³ãã䜿çšãã確èªããRedisã®ãšã³ããã€ã³ããã ããã©ã«ããŠãŒã¶ãŒèªèšŒçšSecretã®äœæ ãã§äœæãããŠãŒã¶åã»ãã¹ã¯ãŒããæå®ããŠæ¥ç¶ããŸãã root@redis-client:/data# redis-cli -h redis-cluster-redis-redis.redis.svc.cluster.local -p 6379 --user default --pass xxxxx # åºåäŸ Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. redis-cluster-redis-redis.redis.svc.cluster.local:6379> Redisã«æ£åžžã«æ¥ç¶ã§ããŠãããã以äžã®PINGã³ãã³ãã䜿çšããŠç¢ºèªããŸãã redis-cluster-redis-redis.redis.svc.cluster.local:6379> PING # åºåäŸ PONG ãPONGããåºåãããã°ãæ£åžžã«æ¥ç¶ã§ããŠããŸãã ç¶ããŠãããŒã¿ã®ç»é²ã»ååŸãè¡ãããã確èªããŸãã ããŒãtestãã«å€ã”Hello World” ããç»é²ããŸãã redis-cluster-redis-redis.redis.svc.cluster.local:6379> SET test "Hello World" # åºåäŸ OK ç»é²ããããŒã¿ãæ£ããååŸã§ãããã確èªããŸãã redis-cluster-redis-redis.redis.svc.cluster.local:6379> GET test # åºåäŸ "Hello World" ç»é²ããã”Hello World” ããšããæååãåºåãããã°ãRedisãžã®ããŒã¿ç»é²ãšååŸã¯æ£åžžã«è¡ããŠããŸãã ããã§Redisã®æ§ç¯ãšåäœç¢ºèªã¯å®äºã«ãªããŸãã ãããã« åã
åæ§ç¯ããKubeBlocksã䜿çšããå®éã«Redisã®æ§ç¯ããæ¥ç¶ãã¹ããè¡ããŸã§ã®æµããã玹ä»ããŸããã ååã®MySQLæ§ç¯ã«åŒãç¶ãã容æã«Redisãæ§ç¯ã§ããããšãäœæã§ããã®ã§ã¯ãªãã§ãããã ã ä»åã¯æãã·ã³ãã«ãªãRedisãµãŒã1å°ã®ã¹ã¿ã³ãã¢ãã³æ§æããšããŠæ§ç¯ããŸããããKubeBlocksãªãæ¬çªç°å¢åãã®åé·æ§æãããããã§ã¹ãã®èšå®ãå°ã倿Žããã ãã§ç°¡åã«æ§ç¯ããããšãã§ããŸãã KubeBlocksã¯æ§ã
ãªDBããµããŒãããŠãããããä»ã®DBãåæ§ã®æ¹æ³ã§æè»œã«å°å
¥ããããšãã§ããŸãã æ¬èšäºããKubernetesäžã§DBãæ§ç¯ããéã®éžæè¢ãšããŠãKubeBlocksãæ€èšãããã£ããã«ãªãã°å¹žãã§ãã åèæç® https://kubeblocks.io/docs/preview/kubeblocks-for-redis/03-topologies/01-standlone https://kubeblocks.io/docs/preview/kubeblocks-for-redis/06-custom-secret/01-custom-secret ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post KubeBlocksã§Redisãå°å
¥ïŒKubernetesäžã§ã®é«éãã£ãã·ã¥/NoSQLæ§ç¯ãäœéš first appeared on SIOS Tech Lab .
ååã®èšäº ã§ã¯HCPã®æŠèŠãã¡ãªããã«ã€ããŠè§ŠããŸããããæ¬èšäºã§ã¯å®éã«ROSA HCPã¯ã©ã¹ã¿ãŒãæ§ç¯ããæé ã培åºè§£èª¬ããŸãã åçš®CLIããŒã«ã®ã€ã³ã¹ããŒã«ãããROSAç¹æã®IAMããŒã«ã®äœæããããŠå®éã®ã¯ã©ã¹ã¿ãŒãããã€ãšæ¥ç¶ç¢ºèªãŸã§ããã³ãºãªã³åœ¢åŒã§äžéãå®è·µã§ããå
容ãšãªã£ãŠããŸãã ãROSAãè§Šã£ãŠã¿ããããã©ãäœããå§ããã°ãããåãããªãããšããæ¹ã¯ããã²æå
ã®ç°å¢ã§å®éã«æ§ç¯ããŠã¿ãŠãã ããã ROSAæ§ç¯ã®ããã®äºåæºå ROSAïŒRed Hat OpenShift on AWSïŒã§ã¯ã©ã¹ã¿ãŒãå®éã«äœæããŠããã«ããã£ãŠãäºåã«å¿
èŠãšãªãã¢ã«ãŠã³ããç°å¢ã¯ä»¥äžã®éãã§ãã AWSã¢ã«ãŠã³ã ãã®èšäºã§ã¯ãAWSã¢ã«ãŠã³ããäœææžã¿ã§ããããšãåæãšããŠããŸãã è£è¶³ïŒROSAã®æ§ç¯ã«ã¯é©åãªIAMæš©éïŒAdministratorAccessãªã©ïŒãå¿
èŠã«ãªããŸãã Red Hatã¢ã«ãŠã³ã ãã®èšäºã§ã¯ãRed Hatã¢ã«ãŠã³ããäœææžã¿ã§ããããšãåæãšããŠããŸãã ãŸã äœæããŠããªãå Žåã¯ã Red Hatã®å
¬åŒãµã€ã ããã¢ã«ãŠã³ããäœæããŠãã ããã AWSã¢ã«ãŠã³ããšRed Hatã¢ã«ãŠã³ãã®çŽã¥ã AWSã³ã³ãœãŒã«ãããRed Hat OpenShift Service on AWS (ROSA)ããŒãžã«ç§»åããã䜿çšãéå§ããã¯ãªãã¯ããŸãã ROSA HCPãæå¹åã«ãããRed Hatã«é²ããã§Red HatåŽã§ã¢ã«ãŠã³ããçŽã¥ããŠãã ããã ã¿ãŒããã« ãã®èšäºã§ã¯ãWindowsã® WSLïŒUbuntuïŒ ã䜿çšããŠæ§ç¯ãé²ããŠãããŸãã macOS: æšæºã®ã¿ãŒããã«ïŒbash/zshïŒã§ããã°ãåºæ¬çã«ãã®ãŸãŸåæ§ã®æé ã§é²è¡å¯èœã§ãã ãã®ä»ïŒGitBash, PowerShellãªã©ïŒ: ã³ãã³ãã®æåãç°ãªãå Žåããããåäœãä¿èšŒã§ããŸããã®ã§ã泚æãã ããã æ³šæäºé
ROSAã®æ§ç¯ã»å©çšã«ããã£ãŠã¯ã AWSã®ã€ã³ãã©å©çšæããã³Red Hatã®ãµãã¹ã¯ãªãã·ã§ã³æéïŒåŸé課éãªã©ïŒãçºçããŸã ã äºæãã¬èª²éãé²ããããæ€èšŒãçµãã£ããå¿
ãã¯ã©ã¹ã¿ãŒãåé€ãããªã©ãæéé¢ã«ã€ããŠããããããæ¿ç¥ãããã ããã ç°å¢èšå® ããã§ã¯ãå®éã«ROSAæ§ç¯ã«å
¥ãåã«ãå¿
èŠãªããŒã«ïŒCLIïŒãã€ã³ã¹ããŒã«ããŠãããŸãããã ROSAã®æ§ç¯ã»æäœã«ã¯ãåºæ¬çã«ä»¥äžã®3ã€ã®CLIãå©çšããŸãã AWS CLI ROSA CLI OpenShift CLI AWS CLIã®ã€ã³ã¹ããŒã« ROSAã¯AWSã®ãããžãŒããµãŒãã¹ã§ãããããAWSã¢ã«ãŠã³ãã«ãã°ã€ã³ããŠããç¶æ
ã§å©çšã§ããŸãããŸãã¯ã以äžã®ã³ãã³ãã§AWS CLIãã€ã³ã¹ããŒã«ããŸãã # ã€ã³ã¹ããŒã©ãŒã®ããŠã³ããŒããšè§£å $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" $ sudo apt update && sudo apt install -y unzip $ unzip awscliv2.zip # ã€ã³ã¹ããŒã«å®è¡ $ sudo ./aws/install # ã€ã³ã¹ããŒã«ç¢ºèª $ aws --version ROSA CLIã®ã€ã³ã¹ããŒã« ROSA CLIã¯ãROSAã¯ã©ã¹ã¿ãŒã®æ°èŠäœæããã¯ã©ã¹ã¿ãŒå
šäœã®ã¹ããŒã¿ã¹ç¢ºèªã»åé€ãªã©ãã¯ã©ã¹ã¿ãŒåäœã®æäœã§äœ¿çšããCLIã§ãã 以äžã®ã³ãã³ãã§ROSA CLIãã€ã³ã¹ããŒã«ããŸãã # ããŠã³ããŒããšè§£å $ curl -L https://github.com/openshift/rosa/releases/download/v1.2.60/rosa_Linux_x86_64.tar.gz -o rosa-linux.tar.gz $ tar xvzf rosa-linux.tar.gz # binaryãã£ã¬ã¯ããªã«ç§»å $ sudo mv ./rosa /usr/local/bin/ # ã€ã³ã¹ããŒã«ç¢ºèª $ rosa version OpenShift CLIã®ã€ã³ã¹ããŒã« OpenShift CLIïŒocïŒã¯ãäœæããROSAã¯ã©ã¹ã¿ãŒã®å
éšã«ããåçš®ãªãœãŒã¹ïŒNodeãPodãªã©ïŒãæäœããããã®CLIã§ããKubernetesã®kubectlã®OpenShiftæ¡åŒµçãšã€ã¡ãŒãžããŠããã ããã°å€§äžå€«ã§ãã 以äžã®ã³ãã³ãã§OpenShift CLIãã€ã³ã¹ããŒã«ããŸãã # ããŠã³ããŒããšè§£å $ curl -LO https://mirror.openshift.com/pub/openshift-v4/clients/ocp/4.20.12/openshift-client-linux.tar.gz $ tar -xvf openshift-client-linux.tar.gz # binaryãã£ã¬ã¯ããªã«ç§»å $ sudo mv ./oc ./kubectl /usr/local/bin/ # ã€ã³ã¹ããŒã«ç¢ºèª $ oc version client ROSAãžã®ãã°ã€ã³ åçš®CLIã®æºåãã§ããããå®éã«ã¢ã«ãŠã³ããžãã°ã€ã³ããŠã¿ãŸãããããŸãROSAãæäœããããã«ãAWSãžã®ãã°ã€ã³ïŒèªèšŒïŒãè¡ããŸãã $ aws login --remote ã³ãã³ããå®è¡ãããšãhttps://us-east-1.signin.aws.amazon.com/v1/authorize?response_type=…ãšããURLã衚瀺ãããã®ã§ãã©ãŠã¶ã§æ¥ç¶ããŸãã Copy verification codeãã¯ãªãã¯ããŠã³ããŒããèªèšŒã³ãŒããã¿ãŒããã«ã®Enter the authorization code displayed in your browser:ã®ãšããã«è²Œãä»ããŸãã ãã°ã€ã³å®äºåŸã以äžã®ã³ãã³ããå®è¡ããèªèšŒæ
å ±ãçŸåšã®ã·ã§ã«ç°å¢å€æ°ã«ãšã¯ã¹ããŒãããŠãããŸãã $ eval $(aws configure export-credentials --format env) æ£ãããã°ã€ã³ã§ããŠããããæ¥ç¶äžã®AWSã¢ã«ãŠã³ãæ
å ±ã確èªããŠã¿ãŸãããã $ aws sts get-caller-identity AWSã«ãã°ã€ã³ã§ããããæ¬¡ã¯ROSAã«ãã°ã€ã³ããŸãã $ rosa login --use-device-code ã³ãã³ããå®è¡ãããšã以äžã®ããã«URLãšèªèšŒçšã®ã³ãŒãïŒ XXXX-XXXX éšåïŒãã¿ãŒããã«ã«è¡šç€ºãããŸãã INFO: To login, navigate to https://sso.redhat.com/device on another device and enter code XXXX-XXXX æç€ºãããURLïŒhttps://sso.redhat.com/deviceïŒããã©ãŠã¶ã§éããã¿ãŒããã«ã«è¡šç€ºãããŠããã³ãŒããå
¥åããŠãµã€ã³ã€ã³ãæ¿èªããŠãã ããã ROSAãžã®ãã°ã€ã³ãå®äºããããã¯ã©ã¹ã¿ãŒãæ§ç¯ããããã©ã«ãã®ãªãŒãžã§ã³ãæå®ããŠãããŸãïŒããã§ã¯us-east-1ãæå®ããŠããŸãïŒã $ export AWS_REGION=us-east-1 æåŸã«ã以äžã®ã³ãã³ãã§æ¥ç¶äžã®ROSAã®ã¢ã«ãŠã³ãæ
å ±ã確èªããæ£ãã衚瀺ãããããROSAã®ã¯ã©ã¹ã¿ãŒãäœãæºåã¯ãã¹ãŠå®äºã§ãã $ rosa whoami # åºåäŸ W: The current version (1.2.60) is not up to date with latest rosa cli released version (1.2.64). W: It is recommended that you update to the latest version. AWS ARN: arn:aws:iam::123456789:XXXXXX AWS Account ID: 123456789 AWS Default Region: us-east-1 OCM API: https://api.openshift.com OCM Account Email: XXXXXX OCM Account ID: XXXXXXXX OCM Account Name: XXXXX OCM Account Username: XXXXXXXX ãããã®ãããªãšã©ãŒãåºãŠããããAWS CLIã®ã»ãã·ã§ã³åããåå ã§ãã E: Failed to create AWS client: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: 76d46612-1094-49a6-a78c-4635978a2a42, api error ExpiredToken: The security token included in the request is expired 以äžã®ã³ãã³ãã§èªèšŒæ
å ±ãæŽæ°ããŠãã ããã $ unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_CREDENTIAL_EXPIRATION $ eval $(aws configure export-credentials --format env) ãã®åŸå床rosaã³ãã³ãã詊ããŠã¿ãŠãã ããã ã¯ã©ã¹ã¿ãŒæ§ç¯ Account Roleã®äœæ Account RoleïŒã¢ã«ãŠã³ãããŒã«ïŒã¯ãRed HatåŽããŠãŒã¶ãŒã®AWSã¢ã«ãŠã³ãå
ã§ã¯ã©ã¹ã¿ãŒã®æ§ç¯ãéçšãè¡ãããã«ãå®å
šã«æš©éãå§è²ããããã®IAMããŒã«ã§ãã AWSã¢ã«ãŠã³ãåäœã®å
±éæš©éãšãªãããããŠãŒã¶ãŒã®AWSã¢ã«ãŠã³ãã«ã€ã1åã ãçæããã°ã以éã¯äœ¿ãåãããšãã§ããŸãã 以äžã®ã³ãã³ãã§å¿
èŠãªAccount Roleãäžæ¬ã§èªåäœæãããŸãã $ rosa create account-roles --hosted-cp --mode auto –hosted-cpãšããã®ã¯ãååã®èšäºã§ç޹ä»ããHCPïŒHosted Control PlanesïŒæ¹åŒã«æé©åãããAccount Roleãçæãããšããæå®ã§ãã Classicæ¹åŒãšã®äžçªå€§ããªéãã¯ãControlPlane-RoleïŒã³ã³ãããŒã«ãã¬ãŒã³çšã®ããŒã«ïŒãäœæãããªãç¹ã§ããHCPæ¹åŒã§ã¯ãã³ã³ãããŒã«ãã¬ãŒã³ã¯Red HatåŽã§ç®¡çããããããŠãŒã¶ãŒã®AWSã¢ã«ãŠã³ãåŽã«IAMããŒã«ãçæããå¿
èŠããããŸããã å
·äœçã«ã¯ä»¥äžã®3ã€ã®ããŒã«ãçæãããŸããManagedOpenShift ã¯ããã©ã«ãã®ãã¬ãã£ãã¯ã¹åã§ãããã¬ãã£ãã¯ã¹ãæå®ãããå Žåã¯ã–prefix <æå®ããããã¬ãã£ãã¯ã¹å> ã§èšå®å¯èœã§ãã ManagedOpenShift-HCP-ROSA-Installer-Role: ã¯ã©ã¹ã¿ãŒã®åºç€ãšãªãVPCãEC2ãªã©ãèªåã§çµã¿ç«ãŠãããã®æš©éã ManagedOpenShift-HCP-ROSA-Support-Role: Red Hatã®SREããŒã ãé害çºçæãªã©ã«ã¯ã©ã¹ã¿ãŒã®ç¶æ³ã調æ»ã»å¯Ÿå¿ããããã®æš©éã ManagedOpenShift-HCP-ROSA-Worker-Role: ã¢ããªã±ãŒã·ã§ã³ãèµ·åããã¯ãŒã«ãŒããŒãïŒEC2ã€ã³ã¹ã¿ã³ã¹ïŒããAWSã®ä»ã®æ©èœïŒã¹ãã¬ãŒãžãªã©ïŒãæäœããããã®æš©éã äœæãããAccount Roleã¯ä»¥äžã®ã³ãã³ãã§ç¢ºèªã§ããŸãã $ rosa list account-roles # åºåäŸ ROLE NAME ROLE TYPE ROLE ARN OPENSHIFT VERSION AWS Managed ManagedOpenShift-HCP-ROSA-Worker-Role Worker arn:aws:iam::XXXXXXXXXXXX:role/ManagedOpenShift-HCP-ROSA-Worker-Role 4.21 Yes ManagedOpenShift-HCP-ROSA-Installer-Role Installer arn:aws:iam::XXXXXXXXXXXX:role/ManagedOpenShift-HCP-ROSA-Installer-Role 4.21 Yes ManagedOpenShift-HCP-ROSA-Support-Role Support arn:aws:iam::XXXXXXXXXXXX:role/ManagedOpenShift-HCP-ROSA-Support-Role 4.21 Yes Operator Roleã®äœæ äžã§äœæããAccount Roleã¯ãRed HatåŽããŠãŒã¶ãŒã®AWSã¢ã«ãŠã³ããå©çšããŠäœæ¥ããããã®æš©éã§ããããOperator Roleã¯ãOpenShiftã®å
éšããAWSãªãœãŒã¹ãçŽæ¥æäœããããã®IAMããŒã«ã§ãã OpenShiftã®å
éšã§ã¯ããããã¯ãŒã¯ç®¡çãã¹ãã¬ãŒãžç®¡çããã°ç®¡çãªã©ãããããã®åœ¹å²ã«ç¹åãããOperatorïŒãªãã¬ãŒã¿ãŒïŒããšåŒã°ããè€æ°ã®ããã°ã©ã ãåããŠããŸãããããã®ããã°ã©ã ãAWSãªãœãŒã¹ïŒããŒããã©ã³ãµãŒãEBSãªã©ïŒãèªåã§äœæã»ç®¡çããããšã«ãªããããåOperatorã«å¿
èŠãªæå°éã®æäœæš©éã ãIAMããŒã«ãšããŠåãåºããŠãå²ãåœãŠãä»çµã¿ã«ãªã£ãŠããŸãã ãŸããOperatorã«AWSã®ã¢ã¯ã»ã¹ããŒãªã©ã®æ°žç¶çãªèªèšŒæ
å ±ãæãããã®ãé²ãããããAWS STSïŒAWS Security Token ServiceïŒããšããä»çµã¿ãå©çšããŠãOIDCãããã€ããŒãšé£æºãå®å
šã«äžæçãªæäœæš©éãåãåããããã«ããŸãã ãã®ãããOperator Roleãäœæããåã«ã飿ºå
ãšãªãOIDCãããã€ããŒãçšæããå¿
èŠããããŸãã 以äžã®ã³ãã³ãã§OpenID Connect ConfigïŒoidc-configïŒãäœæããããšã§ãAWSåŽã«ãOIDCãããã€ããŒãèªåã§äœæãããŸãã $ rosa create oidc-config --mode=auto --managed=true --yes äœæã§ãããã以äžã®ã³ãã³ãã§çæãããOIDC Configã®æ
å ±ã確èªããŸãããã $ rosa list oidc-config # åºåäŸ ID MANAGED ISSUER URL SECRET ARN XXXXXXXXX true XXXXXXXXX åºåçµæã«è¡šç€ºããã IDã¯ãã®åŸã®æé ã§å©çšãããããæå
ã«æ§ããŠãããŸãã æºåãæŽã£ããã以äžã®ã³ãã³ãã§Operator RoleãçæããŸãã $ rosa create operator-roles --hosted-cp --mode auto \ --prefix=demo \ --oidc-config-id=<äžã§äœæãããOIDC Configã®ID> \ --installer-role-arn=<äžã§äœæãããInstaller-Roleã®ARN> 以äžã®ã³ãã³ãã§äœæãããOperator Roleã確èªã§ããŸãã $ rosa list operator-roles # åºåäŸ ROLE PREFIX AMOUNT IN BUNDLE ãdemo ãããããããã8 å
·äœçãªAWSã®ãªãœãŒã¹ãšããŠã¯ã以äžã®ããŒã«ãèªåçæãããŸãã è£è¶³ïŒIAMããŒã«åããã¬ãã£ãã¯ã¹å€ãå«ããŠ64æåãè¶
ããå Žåã¯ã64æåã«ãªãããã«æ«å°ŸãåãæšãŠãããŸãã <prefix>-openshift-ingress-operator-cloud-credentials ïŒãŠãŒã¶ãŒãã¢ããªãå€éšå
¬éããéã«ãAWSåŽã«ããŒããã©ã³ãµãŒïŒALBãNLBïŒãèªåäœæããããRoute 53ã®DNSèšå®ã管çãããããæš©éã <prefix>-openshift-cloud-network-config-controller-cloud-credential ïŒOpenShiftå
éšã®ãããã¯ãŒã¯ãšãAWSã®ãããã¯ãŒã¯ãé£åãããããã®æš©éã <prefix>-openshift-cluster-csi-drivers-ebs-cloud-credentials ïŒAWSã®EBSãã³ã³ããã®ã¹ãã¬ãŒãžãšããŠå²ãåœãŠãããã®æš©éã <prefix>-openshift-image-registry-installer-cloud-credentials ïŒã³ã³ããã€ã¡ãŒãžãä¿åããããã«AWSã®S3ãã±ãããçæã»æäœããããã®æš©éã ãŸããåŸæ¥ã®Classicæ¹åŒãšæ¯ã¹ããšãHCPæ¹åŒã§ã¯ã³ã³ãããŒã«ãã¬ãŒã³ãåé¢ãããŠãããããkube-system-ã ããå§ãŸãHCPå°çšã®Operator RoleãçæãããŸãã <prefix>-kube-system-capa-controller-manager ïŒã¯ãŒã«ãŒããŒãïŒEC2ïŒã®å°æ°ãèªåã§å¢æžãããæ©èœã®æš©éïŒãªãŒãã¹ã±ãŒãªã³ã°ãªã©ïŒã <prefix>-kube-system-control-plane-operator ïŒRed HatåŽã®ã³ã³ãããŒã«ãã¬ãŒã³ããã®æç€ºã§ãŠãŒã¶ãŒã®AWSç°å¢ã®ã€ã³ãã©ãæäœã§ããæš©éã <prefix>-kube-system-kube-controller-manager ïŒKubernetesã®æšæºçãªç®¡çããã°ã©ã ããAWSã®ãªãœãŒã¹ãç£èŠã§ããããã«ããæš©éã <prefix>-kube-system-kms-provider ïŒAWSã®KMSãšé£æºããKubernetesã®ã·ãŒã¯ã¬ãããæå·åããããã®æš© VPCãšãµããããã®äœæ ROSAã¯ã©ã¹ã¿ãã€ã³ã¹ããŒã«ããVPCãäœæããŸããä»åã¯AWSã³ã³ãœãŒã«ã§ç°¡åã«æ§ç¯ããŠã¿ãŸãã AWSã§VPCãéããã ã䜿ãã®VPCãã§ VPCãäœæãéžæããŸãã VPCã ãã§ãªããµãããããNAT Gatewayãäžç·ã«äœæããããã«ãVPCãªã©ããéžæããŸãã éžæåŸã®åçš®èšå®å€ã¯ã以äžã®è¡šãåèã«ããŠãã ããã衚ã«èšèŒããªãé
ç®ã¯ããã©ã«ãïŒåæç¶æ
ïŒã®ãŸãŸã§åé¡ãããŸãããä»åã¯ãã¢ã®ããã«äœãã®ã§ããªãã¹ãæå°éå¿
èŠãªæ§æã«ããŠããŸãã ãã©ã¡ãŒã¿ 説æ ååã¿ã°ã®èªåçæ ä»»æã®ååïŒäŸïŒrosa-demoãªã©ïŒ ã¢ãã€ã©ããªãã£ãŸãŒã³ (AZ) ã®æ° 1 ãããªãã¯ãµããããã®æ° 1 ãã©ã€ããŒããµããããã®æ° 1 NAT ã²ãŒããŠã§ã€ ZonalïŒ1 AZ å
ã«é
çœ®ïŒ VPC ãšã³ããã€ã³ã ãªã ãã¹ãŠã®èšå®ãçµãã£ãããç»é¢äžçªäžã«ãã ãVPC ãäœæã ãã¿ã³ãæŒããŸãã ïŒäœæå®äºã«ã¯æ°åçšåºŠããããŸãïŒ ãŸããsubnet-ããå§ãŸããããªãã¯ãµããããã®IDãšãã©ã€ããŒããµããããã®IDã¯ãã®ããšã®ã¯ã©ã¹ã¿ãŒäœæã§äœ¿ããããããã¹ããšãã£ã¿çã«ã¡ã¢ããŠãããŠãã ããã ROSAã¯ã©ã¹ã¿ãŒäœæ Account RoleãšOperator RoleããããŠäºåã«AWSåŽã«çšæããVPCïŒãµããããïŒã®æºåãã§ãããã以äžã®ã³ãã³ããå®è¡ããŠã¯ã©ã¹ã¿ãŒãäœæããŸãã $ rosa create cluster --cluster-name <ã¯ã©ã¹ã¿ãŒå> \ --sts \ --mode auto \ --hosted-cp \ --subnet-ids <ãããªãã¯ãµããããID>,<ãã©ã€ããŒããµããããID> \ --oidc-config-id <äžã§äœæãããOIDC Configã®ID> \ --operator-roles-prefix <Operator Roleãäœæãããšãã«æå®ããprefix> \ ã--domain-prefix <ã¯ã©ã¹ã¿ãŒã®URLã®ãµããã¡ã€ã³å> \ --yes åãã©ã¡ãŒã¿ã®èª¬æ ãã©ã¡ãŒã¿ èª¬æ –cluster-name äœæããã¯ã©ã¹ã¿ãŒã®äžæã®ååãä»»æã®è±æ°åã§æå®ã –sts AWSã®å®å
šãªäžæèªèšŒïŒSecurity Token ServiceïŒã䜿çšãããšããæå®ãHCPæ¹åŒã§ã¯å¿
é ã –mode auto éäžã®è³ªåã«å¯ŸããŠããã¹ãŠèªåïŒããã©ã«ãå€ïŒã§äœæãé²ããããã®æå®ã –hosted-cp HCPæ¹åŒ ã§ã¯ã©ã¹ã¿ãŒãäœæããããã®ãã©ã°ã –subnet-ids ã¯ã©ã¹ã¿ãŒãé
眮ããAWSã®æ¢åãµããããïŒãããªãã¯ãšãã©ã€ããŒãïŒã®IDãã«ã³ãåºåãã§æå®ã –oidc-config-id Operator Roleäœææã«æå®ããprefixã®å€ïŒäŸ: demoïŒãæå®ã –operator-roles-prefix åã®æé ã§äœã£ãOperator Role矀ãèå¥ããããã®æ¥é èŸïŒäŸ: ManagedOpenShiftïŒãæå®ã –domain-prefix èªåçæãããã¯ã©ã¹ã¿ãŒã®URLïŒç®¡çç»é¢ãAPIãµãŒããŒã®URLïŒã®ãµããã¡ã€ã³éšåãã«ã¹ã¿ãã€ãºããããã®èšå®ïŒãªãã·ã§ã³ïŒã –yes ã³ãã³ãå®è¡æã®æçµç¢ºèªïŒAre you sure?ïŒãã¹ããããããã©ã°ã ã¯ã©ã¹ã¿ãŒã®äœæãå®äºãããŸã§ã¯ããã10åã15åçšåºŠããããŸããããã¯ã°ã©ãŠã³ãã§ã©ã®ããã«æ§ç¯ãé²ãã§ããããªã¢ã«ã¿ã€ã ã§ç¢ºèªãããå Žåã¯ã以äžã®ã³ãã³ããå®è¡ããŠãã ããã $ rosa logs install --cluster <ã¯ã©ã¹ã¿ãŒå> --watch # åºåäŸ bak@1010-00867:~$ rosa logs install -c rosa-demo --watch W: The current version (1.2.60) is not up to date with latest rosa cli released version (1.2.64). W: It is recommended that you update to the latest version. I: Cluster 'rosa-demo' is in validating state waiting for installation to begin. Logs will show up within 5 minutes \ 0001-01-01 00:00:00 +0000 UTC hostedclusters rosa-demo Version 2026-07-13 07:04:09 +0000 UTC hostedclusters rosa-demo Condition not found in the CVO. 2026-07-13 07:04:09 +0000 UTC hostedclusters rosa-demo The hosted control plane is not found 以äžã®ãããªãã°ãåºãããROSAã¯ã©ã¹ã¿ãŒã®ãããã€ã¯å®äºã§ãã I: Cluster 'rosa-demo' is now ready æ¥ç¶ç¢ºèª ã¯ã©ã¹ã¿ãŒã®æ§ç¯ãå®äºããããå®éã«ãã°ã€ã³ããŠæ¥ç¶ç¢ºèªãè¡ããŸãããã æ¥ç¶ããããã«ã¯ããŸã管çè
ã¢ã«ãŠã³ãã§ãã cluster-admin ãäœæããå¿
èŠããããŸãã 以äžã®ã³ãã³ãã§cluster-adminãäœæããŸããã³ãã³ããå®è¡ãããšãpasswordãèªåçæããããã®ãŸãŸãã°ã€ã³ã§ããã³ãã³ãïŒoc loginãïŒãã¿ãŒããã«ã«åºåãããŸãã $ rosa create admin --cluster=<ã¯ã©ã¹ã¿ãŒå> # åºåäŸ I: Admin account has been added to cluster 'your-cluster-name'. I: Please securely store this generated password. If you lose this password you can delete and recreate the cluster admin user. I: To login, run the following command: oc login https://api.your-cluster-name.xxxx.p1.openshiftapps.com:443 --username cluster-admin --password XXXXX-XXXXX-XXXXX-XXXXX 以äžã®ããã«oc loginã³ãã³ããå
¥åããŠLogin successful. ãšè¡šç€ºãããã°ãCLIããã®æ¥ç¶ç¢ºèªã¯å®äºã§ãã $ oc login https://api.your-cluster-name.xxxx.p1.openshiftapps.com:443 --username cluster-admin --password XXXXX-XXXXX-XXXXX-XXXXX Login successful. ããã以äžã®ãšã©ãŒãåºãããæ°ååŸ
ã£ãŠããå床詊ããŠã¿ãŠãã ããã Login failed (401 Unauthorized) Verify you have provided the correct credentials. ãŸããCLIããã ãã§ãªãããŠã§ããã©ãŠã¶ã䜿ã£ãŠç®¡çã³ã³ãœãŒã«ïŒGUIïŒã«ãã°ã€ã³ããæ¹æ³ããããŸãã 以äžã®ã³ãã³ããå®è¡ããŠãåºåçµæãããConsole URLãã®é
ç®ã確èªããŸãã $ rosa describe cluster --cluster=<äœæããã¯ã©ã¹ã¿ãŒå> #åºåäŸ W: The current version (1.2.60) is not up to date with latest rosa cli released version (1.2.64). W: It is recommended that you update to the latest version. Name: rosa-demo Domain Prefix: rosa-demo Display Name: rosa-demo ID: XXXXXXXXXX External ID: XXXXXXXXXX Control Plane: ROSA Service Hosted OpenShift Version: 4.20.28 Channel Group: stable DNS: XXXXXXXXXX AWS Account: XXXXXXXXXX AWS Billing Account: XXXXXXXXXX API URL: XXXXXXXXXX Console URL: https://console-openshift-console.apps.rosa.xxxxx.openshiftapps.com Console URLããã©ãŠã¶ã«å
¥åããŠã¢ã¯ã»ã¹ãããšã以äžã®ããã«ç®¡çã³ã³ãœãŒã«ã«æ¥ç¶ã§ããŸãã®ã§ãCLIã§ã®ãã°ã€ã³ïŒoc loginïŒæã«äœ¿çšããã管çè
ïŒcluster-adminïŒã®usernameãšpasswordãå
¥åããŠãã°ã€ã³ããŸãã ãã®ãããªç»é¢ãåºãã管çã³ã³ãœãŒã«ã«ãã°ã€ã³æåã§ãã (ãªãã·ã§ã³)åŸçä»ã ROSAãæ§ç¯ããããã«äœæããåçš®ãªãœãŒã¹ã¯è²»çšãçºçããã®ã§ãããä»åŸäœ¿ããªãã®ã§ããã°çä»ããŠããããšãããããããŸãã ãŸããæŒããªãåé€ããããã«ä»¥äžã®èšèŒé ã§åé€ããŠããããšãããããããŸãã 1. ã¯ã©ã¹ã¿ãŒã®åé€ ãŸãã以äžã®ã³ãã³ãã§ã¯ã©ã¹ã¿ãŒãåé€ããŸãã $ rosa delete cluster --cluster=<ã¯ã©ã¹ã¿ãŒå> --yes åé€äžã®ãã°ã®ç¢ºèªã¯ä»¥äžã®ã³ãã³ãã§ã§ããŸãã $ rosa logs uninstall --cluster=<ã¯ã©ã¹ã¿ãŒå> --watch å®è¡äŸã§ãã $ rosa logs uninstall --cluster=rosa-demo --watch W: The current version (1.2.60) is not up to date with latest rosa cli released version (1.2.64). W: It is recommended that you update to the latest version. 2026-07-13 07:41:44 +0000 UTC hostedclusters rosa-demo invalid service account signing key: failed to get hostedcluster ServiceAccountSigningKey secret bound-service-account-signing-key: Secret "bound-service-account-signing-key" not found 2026-07-13 07:41:45 +0000 UTC hostedclusters rosa-demo pull secret unavailable: Secret "rosa-demo-pull" not found 2026-07-13 07:41:46 +0000 UTC hostedclusters rosa-demo Reconciliation completed successfully 2026-07-13 07:45:48 +0000 UTC hostedclusters rosa-demo All is well 2026-07-13 07:45:49 +0000 UTC hostedclusters rosa-demo ValidAWSIdentityProvider StatusUnknown 2026-07-13 07:45:49 +0000 UTC hostedclusters rosa-demo All guest resources destroyed I: Cluster 'rosa-demo' completed uninstallation ãCluster ‘XXXXXX’ completed uninstallationããšãããã°ãåºããåé€å®äºã§ãã ã¯ã©ã¹ã¿ãŒã®åé€ãå®äºããããAWSã³ã³ãœãŒã«ã®ãVPCããµãŒãã¹ç»é¢ãéããAWSã®ãªãœãŒã¹ãåé€ããŠãããŸãã 2. NATã²ãŒããŠã§ã€ã®åé€ VPCã³ã³ãœãŒã« ïŒ å·Šã¡ãã¥ãŒã®ãNAT ã²ãŒããŠã§ã€ãã«ç§»åããäœæããNATã²ãŒããŠã§ã€ãåé€ããŸããå逿žã¿ïŒDeletedïŒã«ãªããŸã§æ°åãããããšããããŸãã 3. VPCã®åé€ VPCã³ã³ãœãŒã« ïŒ å·Šã¡ãã¥ãŒã®ãã䜿ãã® VPCãã«ç§»åããäœæããVPCãéžæãåé€ããŸããVPCãåé€ãããšã以äžã®é¢é£ãªãœãŒã¹ããã¹ãŠåé€ãããŸãã ãµããããïŒãããªã㯠/ ãã©ã€ããŒãïŒ ã«ãŒãããŒãã« ã€ã³ã¿ãŒãããã²ãŒããŠã§ã€ïŒIGWïŒ ã»ãã¥ãªãã£ã°ã«ãŒã â»æ³šæïŒVPCã®åé€ã§ãšã©ãŒãåºãå Žå ã¯ã©ã¹ã¿ãŒã®åé€å®äºçŽåŸã«VPCãæ¶ãããšãããšããeni-xxxx (VPC Endpoint Interface) ã䜿çšäžïŒin useïŒã®ããåé€ã§ããŸããããšãããšã©ãŒãåºãå ŽåããããŸãã 5åã»ã©åŸ
ã€ããAWSã³ã³ãœãŒã«ã®ãVPCãïŒããšã³ããã€ã³ãããã察象ã®IDïŒvpce-xxxxïŒãæåã§åé€ããŠãããå床VPCã®åé€ãè¡ã£ãŠãã ããã 4. Elastic IPïŒEIPïŒã®è§£æŸ VPCã³ã³ãœãŒã« ïŒ å·Šã¡ãã¥ãŒã®ãElastic IPãã«ç§»åããNATã²ãŒããŠã§ã€çšã«èªåååŸãããŠããElastic IPãéžæããç»é¢å³äžã®ãã¢ã¯ã·ã§ã³ãïŒãElastic IP ã¢ãã¬ã¹ã®è§£æŸããã¯ãªãã¯ããŸãã ããã§ã¯ã©ã¹ã¿ãŒãšé¢é£ãªãœãŒã¹ã®åé€ã¯å®äºã§ãã 5. ãªãã¬ãŒã¿ãŒããŒã«ã®åé€ $ rosa delete operator-roles --prefix=<ãã¬ãã£ãã¯ã¹å> --mode=auto --yes 以äžã¯å®è¡äŸã§ãã $ rosa delete operator-roles --prefix=demo --mode=auto --yes W: The current version (1.2.60) is not up to date with latest rosa cli released version (1.2.64). W: It is recommended that you update to the latest version. I: Fetching operator roles for the prefix: demo I: Deleting operator role 'demo-kube-system-capa-controller-manager' I: Deleting operator role 'demo-kube-system-control-plane-operator' I: Deleting operator role 'demo-kube-system-kms-provider' I: Deleting operator role 'demo-kube-system-kube-controller-manager' I: Deleting operator role 'demo-openshift-cloud-network-config-controller-cloud-credentials' I: Deleting operator role 'demo-openshift-cluster-csi-drivers-ebs-cloud-credentials' I: Deleting operator role 'demo-openshift-image-registry-installer-cloud-credentials' I: Deleting operator role 'demo-openshift-ingress-operator-cloud-credentials' I: Successfully deleted the operator roles 6. OIDC Configã®åé€ $ rosa delete oidc-config --oidc-config-id=<OIDCã®ID> --mode=auto --yes 以äžã¯å®è¡äŸã§ãã $ rosa delete oidc-config --oidc-config-id 2reuclobhhsao2hdrjpc43lcoq5151go W: The current version (1.2.60) is not up to date with latest rosa cli released version (1.2.64). W: It is recommended that you update to the latest version. ? OIDC Config deletion mode: auto ? Delete the OIDC provider 'arn:aws:iam::XXXXXXXXXXXX:oidc-provider/oidc.op1.openshiftapps.com/2reuclobhhsao2hdrjpc43lcoq5151go'? Yes I: Successfully deleted the OIDC provider arn:aws:iam::XXXXXXXXXXXX:oidc-provider/oidc.op1.openshiftapps.com/2reuclobhhsao2hdrjpc43lcoq5151go I: Registered OIDC Config ID '2reuclobhhsao2hdrjpc43lcoq5151go' has been removed from OCM and can no longer be used ãŸãšã 以äžã§ãROSAã¯ã©ã¹ã¿ãŒã®æ§ç¯ã«å¿
èŠãªäºåæºåãããåçš®IAMããŒã«ã®äœæãå®éã®ãããã€ããããŠæ¥ç¶ç¢ºèªãŸã§ã®äžé£ã®æé ãå®äºããŸããã ãROSAã£ãŠååã¯èããã©ãå
·äœçã«ã©ããã£ãŠå§ããã°è¯ããã ããïŒããšããæŒ ç¶ãšããçåãããŒãã«ãããã®èšäºãéããŠå°ãã§ãè§£æ¶ã§ããã幞ãã§ãã æ¬¡åããã¯ããã°ã®ä¿ç®¡ãã¡ããªã¯ã¹ã®è»¢éãªã©ãã¯ã©ã¹ã¿ãŒã®å
éšãããã«å
å®ãããŠããå
容ã玹ä»ããŠãããŸãããã²æ¥œãã¿ã«ããŠããŠãã ããã åèè³æ Getting started with Red Hat OpenShift Service on AWS ( Red Hat Documentation ) Chapter 2. Creating Red Hat OpenShift Service on AWS clusters using the default optionsïŒ Red Hat DocumentationïŒ Create a ROSA with HCP cluster using the ROSA CLIïŒRed Hat DocumentationïŒ Hosted Control PlanesïŒrosaworkshop.ioïŒ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ROSAïŒRed Hat OpenShift Service on AWSïŒãå©çšããã³ã³ãããã©ãããã©ãŒã æ§ç¯ ~ã¯ã©ã¹ã¿æ§ç¯~ first appeared on SIOS Tech Lab .
ããã«ã¡ã¯ãOSSãããçžè«å®€ã®SKã§ãã OSS ã«é¢ãããåãåãããæ¥ã
å¯ããããäžã§ãä»å㯠èªç€Ÿã§DNSãµãŒããéçšããŠããç°å¢ã«ãããŠãBIND ã® DNSSEC ã«é¢é£ããŠå¯ãããããåãåãããã玹ä»ããŸãã å°ãåã§ããã以äžã®ãããªåãåãããããã ããŸããã KSKããŒã«ãªãŒããŒã«ã€ããŠJPRSãã以äžãå
¬éãããŠããŸãã æ°ããKSKïŒKSK-2024ïŒãã«ãŒããµãŒããŒã§äºåå
¬é DNSSEC ã«å¯Ÿå¿ããŠããDNSãµãŒãã®ããã©ã¹ãã¢ã³ã«ãŒã®èªåæŽæ°ã®èšå®ãautoã«ãªã£ãŠããŸãã ã»named.confã®èšå®ïŒdnssec-validation auto; ãã®å ŽåãKSKããŒã«ãªãŒããŒã«é¢ããŠè¿œå ã®äœæ¥ã¯ç¹ã«å¿
èŠãªãã§ããããã åçã¯ã远å ã®äœæ¥ã¯å¿
èŠãããŸãããã named.conf ã® dnssec-validation auto; èšå®ãæå¹ã«ãªã£ãŠããå ŽåãBINDã¯æ°ãããã©ã¹ãã¢ã³ã«ãŒãèªåçã«ååŸããããã«ãªã£ãŠããããã§ãã rndc managed-keys status ã³ãã³ãã§ãã©ã¹ãã¢ã³ã«ãŒãæŽæ°ããããã©ããã確èªããããšãã§ããŸãã ä»åã¯ããã®ããåãã«é¢é£ããŠããDNSSECãããã©ã¹ãã¢ã³ã«ãŒããKSKããŒã«ãªãŒããŒããšã¯äœãããã㊠dnssec-validation ã auto ã«ããŠãã圱é¿ã«ã€ããŠè§£èª¬ããŸãã DNSSECãšã¯ïŒ DNSã¯ãµãŒãåããIPã¢ãã¬ã¹ãåãåãããä»çµã¿ã§ãããå¿çãéäžã§æ¹ããããŠå¥ã®IPã¢ãã¬ã¹ã«èªå°ãããDNSãã£ãã·ã¥ãã€ãºãã³ã°ããšããæ»æææ³ããããŸãã ãã®DNSã®å¿çããŒã¿ãæ¹ãããããŠããªãããšããæå·çœ²åãçšããŠæ€èšŒããã»ãã¥ãªãã£æ¡åŒµã®ä»çµã¿ããDNSSECãã§ãã ãã©ã³ã¹ã¢ã³ã«ãŒãšã¯ïŒ DNSSECã®çœ²åæ€èšŒãè¡ãäžã§ãèµ·ç¹ãšãªãã«ãŒããŸãŒã³ã®KSKïŒéµçœ²åéµïŒã®ããšã§ãã BINDãªã©ã®DNSãµãŒãã¯ããã®ã«ãŒãKSKã®ã³ããŒãæ€èšŒã®åºç¹ãšãªãããã©ã¹ãã¢ã³ã«ãŒããšããŠèªãä¿æããŸãã KSKããŒã«ãªãŒããŒãšã¯ DNSSECã§ã¯ããŸãŒã³ããŒã¿ã®çœ²åã«çšãããZSKããšã鵿
å ±ã®çœ²åã«çšãããKSKãã䜿çšãããŸãã DNSSECã®ä»çµã¿ïŒDSæ¹åŒïŒ KSKããŒã«ãªãŒããŒãšã¯ãã»ãã¥ãªãã£ç¶æã®ããã«ãã®KSKãæ°ããéµã«çœ®ãæããïŒæŽæ°ããïŒããã»ã¹ã®ããšã§ãã ã«ãŒããŸãŒã³ã®KSKãæŽæ°ãããå Žåãäžçäžã®DNSãµãŒãã¯æ°ããã«ãŒãKSKããã©ã¹ãã¢ã³ã«ãŒãšããŠèªèãçŽãå¿
èŠããããŸããJPRSã®çºè¡šã«ããéããçŸåšã«ãŒããŸãŒã³ã§ã¯ æ°ããKSKïŒKSK-2024ïŒ ãžã®ç§»è¡ãé²è¡ããŠããã 2026幎10æ11æ¥ ã«æ°KSKãžã®æ¬çªåãæ¿ããäºå®ãããŠããŸãã æ°ããKSKïŒKSK-2024ïŒãã«ãŒããµãŒããŒã§äºåå
¬é dnssec-validation ã auto ã«ãã BINDã® named.conf ã«ãŠ dnssec-validation auto; ãèšå®ãããšãDNSSECã®çœ²åæ€èšŒãšãšãã«ãRFC 5011ã«åºã¥ããã©ã¹ãã¢ã³ã«ãŒã®èªåæŽæ°æ©èœãæå¹ã«ãªããŸãã ã«ãŒãKSKã®ããŒã«ãªãŒããŒã宿œãããéãBINDã¯èªåçã«æ°ããéµãæ€ç¥ããŸãããã®åŸã30æ¥éã®ä¿çæéïŒtrust pendingïŒãçµãŠãããæ°ããéµãæ£åŒãªãã©ã¹ãã¢ã³ã«ãŒãšããŠä¿¡é ŒïŒtrustedïŒããŸãã ãã®èšå®ã auto ã«ããŠããããšã§ãæäœæ¥ã«ããéµãã¡ã€ã«ã®æžãæããäžèŠã«ãªããå€ãéµã®ãŸãŸæ€èšŒã倱æããŠåå解決ãã§ããªããªããã©ãã«ãé²ãããšãã§ããŸãã ïŒdnssec-validation ã®åèïŒ BIND 9 Administrator Reference Manual – DNSSEC Validation Explained ïŒ rndc managed-keys status ã³ãã³ã ãã©ã¹ãã¢ã³ã«ãŒã®èªåæŽæ°ã®ç¶æ
ã¯ã以äžã®ã³ãã³ãã§ç¢ºèªã§ããŸãã $ rndc managed-keys status rndcã³ãã³ã ã¯ãBINDã®ããã»ã¹namedãå¶åŸ¡ããããã®ã³ãã³ãããŒã«ã§ãã å®è¡çµæã® trust ã®é
ç®ã確èªããããšã§ãBINDãèªèããŠããéµãçŸåšãä¿çäžïŒtrust pendingïŒããªã®ããç¡äºã«ãä¿¡é ŒãããŠããïŒtrustedïŒãç¶æ
ã«ç§»è¡ããã®ããªã©ãããŒã«ãªãŒããŒã®é²æç¶æ³ãææ¡ã§ããŸãã $ rndc managed-keys status view: _default class: IN name: . keyid: 20326 trust: trusted åºåçµæã® trust ã®é
ç®ã trusted ãšãªã£ãŠããã°ããã®éµã¯æ£åžžã«ãã©ã¹ãã¢ã³ã«ãŒãšããŠæ©èœããŠããŸããããŒã«ãªãŒããŒã®éæž¡æã«ã¯ãæ°ããéµã®ã¹ããŒã¿ã¹ã initializing ã pending ãšãã£ãç¶æ
ãçµãŠãæçµçã« trusted ã«ç§»è¡ããæ§åã確èªããããšãã§ããŸãã ãŸãšã dnssec-validation auto; ãèšå®ãããŠããç°å¢ã§ã¯ããã©ã¹ãã¢ã³ã«ãŒã®èªåç®¡çæ©èœãåããããKSKããŒã«ãªãŒããŒã«åããæåã§ã®è¿œå äœæ¥ã¯å¿
èŠãããŸããã 2026幎10æ11æ¥ã«äºå®ãããŠããæ°KSKãžã®æ¬çªåãæ¿ãã«åããŠã30æ¥éã®ä¿çæéãèæ
®ãããšãæ®ãçŽ3ã¶æãšãªã£ãçŸåšã®ã¿ã€ãã³ã°ã§èªç€Ÿã®DNSãµãŒãã auto èšå®ã«ãªã£ãŠãããã確èªããŠããããšãæšå¥šããŸãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post OSSãµããŒãã®çŸå ŽããïŒBIND / ã«ãŒãKSKããŒã«ãªãŒããŒãžã®å¯Ÿå¿ first appeared on SIOS Tech Lab .
2018幎6æã®åµåãããæ¯æäžæ©ãã€æ©ã¿ãé²ããŠåããŸãããSIOS OSSãããNewsãã®ã¡ã«ãã¬ãããã®ãã³ã100å·ããšãã倧ããªç¯ç®ãè¿ããããšãã§ããŸãããé·ãã«ããããç§ãã¡ã®çºä¿¡ããæ
å ±ã«ç®ãéããæž©ãããã£ãŒãããã¯ããå¯ããã ãã£ãèªè
ã®çæ§ã«ãå¿ããã®æè¬ãç³ãäžããŸãã 100å·èšå¿µäŒç»ãšããŠãçããŸã®ãçŸå Žã§äœéšããOSSã«ãŸã€ãããšããœãŒãã ãåéããŸãã ãããŸã§æ¬ã¡ã«ãã¬ã§ã¯ãOSSã«é¢ããææ°æ
å ±ãæè¡ååããå±ãããŠãŸãããŸãããä»åã¯å°ãè¶£åãå€ããOSSãå©çšã»éçšããäžã§çããŸãçµéšãããåºæ¥äºãæãåºããã²ãèãããã ããã ãä»ã§ã¯ç¬ã話ã«ãªã£ã倱æè«ããOSSã«å©ããããçµéšããæãã¬ãã©ãã«ãšã®æ Œéããã³ãã¥ããã£ãšã®å¿æž©ãŸã亀æµããªã©ãã©ããªãšããœãŒãã§ã倧æè¿ã§ããå°è±¡ã«æ®ã£ãåºæ¥äºããã²ãèãããã ããã æçš¿ã¯ãã¡ã éå»ã®ã¡ã«ãã¬ã¯ãã¡ã The post SIOS OSS ããã Newsã¡ã«ãã¬100å·èšå¿µïŒ first appeared on SIOS Tech Lab .
ä»å·ã§ã¯ã2026幎 5æå·ã§ã玹ä»ãã Linux ã«ãããã¿ãŒããã«æäœã«é¢ãã tips ã®ç¶ããã玹ä»ããŸãïŒ 2026幎 5æå·ã®èšäºã¯ ãã¡ã ã«ãŒãœã«ç§»åã®ã·ã§ãŒãã«ããããŒãããã [Ctrl] + [A] ã«ãŒãœã«ãè¡é ãžäžæ°ã«ç§»åããŸãã [Ctrl] + [E] ã«ãŒãœã«ãè¡æ«ãžäžæ°ã«ç§»åããŸãã [Ctrl] + [U] ã«ãŒãœã«ããåã®æåããã¹ãŠåé€ããŸãã [Ctrl] + [K] ã«ãŒãœã«ããåŸãã®æåããã¹ãŠåé€ããŸãã [Ctrl] + [K] ã«ãŒãœã«ããåŸãã®æåããã¹ãŠåé€ããŸãã [Alt] + [â] ã«ãŒãœã«ãã 1åèªåæ»ããŸãã [Alt] + [â] ã«ãŒãœã«ãã 1åèªåé²ã¿ãŸãã â»äžéšãéå»ã®èšäº( ç¥ã£ãŠãããšã¡ãã£ãšäŸ¿å©ïŒã³ãã³ã5éž ïœã·ã§ãŒãã«ããããŒç·šïœ )ã§ã玹ä»ããå
容ãšéè€ããŠããŸãããäºæ¿ãã ããã åºåå
容ãèªåšã«å¶åŸ¡ããå°æ grep -v ã§äžèŠãªæ
å ±ãåºåããªã grep ã§ -v ãªãã·ã§ã³ãæå®ãããšãæå®ããæåã “å«ãŸãªã” è¡ã®ã¿ãåºåããŸãã ãã®æ©èœãå©çšããŠãäžèšã®ããã«å¿
èŠãªæ
å ±ã ããæœåºããã®ã«äŸ¿å©ã§ãã èšå®ãã¡ã€ã«ã®ã³ã¡ã³ãã¢ãŠãéšå (è¡é ã« # ãèšèŒãããŠããåæ) ãé€å€ããŠæ€çŽ¢ # less httpd.conf | grep -v "^#" ã¢ã¯ã»ã¹ãã°ãããæ£åžžãªãã° (ã¹ããŒã¿ã¹ã³ãŒãã 200) ãé€å€ããŠæ€çŽ¢ # less /var/log/httpd/access_log | grep -v "status:200" less -S ã§åºåã®æãè¿ããé²ã less ã§ -S ãªãã·ã§ã³ãæå®ãããšãç»é¢ã®å³ç«¯ã§åºåãæãè¿ãããç¢å°ã㌠(â â) ã§ã¹ã¯ããŒã«ããŠèªããããã«ãªããŸãã ç¹ã«é·ããã°ã衚瀺ããå Žåã¯ã圢ã厩ããã«èªã¿ããããåäžããŸãã 192.168.10.45 - - [06/Jul/2026:12:01:45 +0900] "GET /api/v1/products?category=> 10.0.2.15 - - [06/Jul/2026:12:02:10 +0900] "POST /api/v1/cart/checkout HTTP/1.> 192.168.11.102 - - [06/Jul/2026:12:03:02 +0900] "GET /assets/js/main.min.js?v=> 172.16.5.89 - - [06/Jul/2026:12:04:15 +0900] "GET /api/v1/user/profile HTTP/1.> 192.168.10.45 - - [06/Jul/2026:12:05:59 +0900] "GET /images/products/laptop_01> â»ç¢å°ã㌠(â â) ã§å·Šå³ã«ã¹ã¯ããŒã«ããŸãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 1人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ç¥ã£ãŠãããšã¡ãã£ãšäŸ¿å©ïŒã¿ãŒããã«æäœã®æçãã¯ããã¯2 first appeared on SIOS Tech Lab .
ããã«ã¡ã¯ïŒ 仿ããOSSã®ãµããŒããšã³ãžãã¢ãæ°ã«ãªã£ãïŒOSSã®ææ°ãã¥ãŒã¹ãããå±ãããŸãã 2026/7/1ãLPI-Japan 㯠Linux ãµãŒãæ§ç¯ã®ç¥èãåŠã¹ãåŠç¿çšææãLinuxãµãŒããŒæ§ç¯æšæºæç§æžãã® UbuntuçããªãªãŒã¹ããããŒã ããŒãžã§å
¬éããŸããã LPI-JapanããLinuxãµãŒããŒæ§ç¯æšæºæç§æžãã®Ubuntuçãå
¬é https://cloud.watch.impress.co.jp/docs/news/2121848.html 2026/7/13ãæ ªåŒäŒç€Ÿããã¬ã€ã¯äžæ£ã¢ã¯ã»ã¹ã«ããã·ã¹ãã é害ãçºçãããšçºè¡šããŸããã ããã¬ã€ããžã°ã«ãŒãå瀟ã®å·èµå庫ã®å
¥åºåº«æ¥åãããã³ããã¬ã€ããŒãºã®å·åé£ååºè·æ¥åã«åœ±é¿ãåºãŠãããšã®ããšã§ãã ããã¬ã€ãäžæ£ã¢ã¯ã»ã¹ã«ããã·ã¹ãã é害ãçºçãå
¥åºåº«ãªã©ã®æ¥åã«åœ±é¿ https://internet.watch.impress.co.jp/docs/news/2124795.html 2026/7/23ïœ24ãã°ã©ã³ããã³ã倧éªã«ãŠãäºæ¥å€é©ãæšé²ããããã®ææ°æè¡ãšã€ãªããç·åå±ãEdgeTech+ West 2026 ãéå¬ãããŸãã EdgeTech+ West https://www.jasa.or.jp/etwest/ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ã2026幎7æãOSSãµããŒããšã³ãžãã¢ãæ°ã«ãªã£ãïŒOSSææ°ãã¥ãŒã¹ first appeared on SIOS Tech Lab .
ããã«ã¡ã¯ããµã€ãªã¹ãã¯ãããžãŒæŠäºã§ããä»åã¯async/awaitã®åããOSã«ãŒãã«ã®ã¬ã€ã€ãŒãã远ãããšã§çè§£ãæ·±ããããšããŠã¿ãŸãã 1. async/awaitã¯ããã async / await ããªããªãã«ãšã£ã€ãã«ããæŠå¿µã ãšæããŸãã ãéåæåŠçã«ã¯  async  ãä»ãããã await  ããªããšçµæãåããªããââã«ãŒã«ãšããŠã¯èŠããããŸããã³ãŒããåããŸããã§ãããããªçåã«ã¶ã€ãã£ãçµéšã¯ãªãã§ããããã await  ããŠããéãããã°ã©ã ã¯ãæ¢ãŸã£ãŠãããã®ïŒ æ¢ãŸã£ãŠããªãã®ïŒ ãåŸ
ã€ãã®ã«ããªãã§éããªãã®ïŒ await  ãä»ãå¿ãããš Promise ãè¿ã£ãŠããã®ã¯ãªãïŒ ãããã誰ããåŠçãçµãã£ããããšã«æ°ã¥ããŠãç¶ããå®è¡ããŠãããã®ïŒ ãããã€ãã³ãã«ãŒããepollã®ä»çµã¿ãç¥ã£ãŠãããšãã¹ãããªè§£æ±ºããã®ã§ã¯ãšæããä»åãäžçãããããŸããã ããŒã«ãªãã®ã¯ã ã€ãã³ãã«ãŒã ãšããä»çµã¿ãšãããã«ãã®äžã§åã  OS ã«ãŒãã«ã® epoll  ãšããæ©æ§ã§ãã async / await  ã¯ãã®2ã€ã®äžã«ãã¶ãããããäžçªäžã®èãç®ãã«ãããŸãããç®ã ããçºããŠäžèº«ãæšæž¬ããããšããããé£ããã®ã§ãã£ãŠãäžã®å±€ããé ã«ç©ã¿äžããã°ãå®ã¯ããªãçŽ çŽãªä»çµã¿ã§ãã ãã®èšäºã§ã¯ããã®æ°Žé¢äžããã€ãã³ãã«ãŒããš fdãâãå®éã®ã³ãŒãã®åããã®é ã§èŠãŠãããŸãã 2. ã€ãã³ãã«ãŒããšã¯äœè
ã ãåŸ
ã€ãã®ã¯ãã£ãããªã ããã°ã©ã ãããŒã¿ããŒã¹ãå€éš API ã«ã¢ã¯ã»ã¹ãããšãè¿äºãæ¥ããŸã§ã®åŸ
ã¡æéãçºçããŸããCPU ã®æèŠã§ã¯ããã®åŸ
ã¡æéã¯éæ¹ããªãé·ããã¡ã¢ãªã¢ã¯ã»ã¹ãã1ç§ããšãããšããããã¯ãŒã¯ã®å¿çåŸ
ã¡ã¯ãæ°é±éãæ°ã¶æãã«çžåœããŸãã ã€ãŸã I/O åŸ
ã¡ã®éãCPU ã¯èšå€§ã«ãããããŠããŸããããã®ãããªæéã«å¥ã®ä»äºããããããââãããéåæåŠçã®ãã¹ãŠã®åæ©ã§ãã 1æ¬ã®ã¹ã¬ããã§ãå
šéšã®ãåŸ
ã¡ããèŠåŒµã å€å
žçãªããæ¹ã¯ããªã¯ãšã¹ãããšã«ã¹ã¬ãããçšæããŠãããããã«åŸ
ãããæ¹åŒã§ããããããã¹ã¬ããã¯1æ¬ãããæ°MBã®ã¡ã¢ãªãé£ããããåææ¥ç¶æ°ãå€ããªããšå³ããããšã«ãªããŸãã ããã§çºæ³ãé転ãããŸãã 1æ¬ã®ã¹ã¬ãããã倧éã®ãåŸ
ã¡ãããŸãšããŠèŠåŒµããæºåãã§ãããã®ããé ã«åŠçãã ãã¬ã¹ãã©ã³ã§ããã°ã客1çµããšã«ãŠã§ã€ã¿ãŒã匵ãä»ãããã®ã§ã¯ãªãã1人ã®ãŠã§ã€ã¿ãŒãå
šããŒãã«ãæ
åœãããåŒã°ããããŒãã«ã«ã ãè¡ããæ¹åŒã§ãã ãã®ãããããåããªãããæºåã§ããä»äºãé ã«æããã«ãŒãããã ã€ãã³ãã«ãŒã ã§ãã ããã§2ã€ã®éèŠãªéšåãç»å ŽããŸãã epoll  㚠 fd  ã§ãã fd (ãã¡ã€ã«ãã£ã¹ã¯ãªãã¿)ãšã¯ïŒ fdïŒãã¡ã€ã«ãã£ã¹ã¯ãªãã¿ïŒ  ã¯ãOS ãéä¿¡ã®çªå£ïŒãœã±ãããªã©ïŒ1ã€1ã€ã«å²ãæ¯ãããã ã®æŽæ°ã§ããDB ãžã®æ¥ç¶ãªã fd9ãå€éš API ãžã®æ¥ç¶ãªã fd10ããšããããã«ããã©ã®åŸ
ã¡å
ãããçªå·ã§èå¥ã§ããŸãã ãã€ã³ãã¯ã fd ã¯åãªãçªå·ã§ãã£ãŠãäžèº«ã®ããŒã¿ã§ãåŠçã§ããªã ããšãã9çªã®çªå£ãã10çªã®çªå£ããšããæã ãšæã£ãŠãã ããã epoll ãšã¯ïŒ epoll  㯠Linux ã«ãŒãã«ã®æ©èœã§ãããããšã¯äžèšã§ãããšïŒ 倧éã® fd ãç»é²ããŠãããšããããŒã¿ãå±ããïŒéããç¶æ
ã«ãªã£ããfd ã ãããŸãšããŠæããŠããã ã€ãã³ãã«ãŒãã® Â epoll.wait()  ã¯ãã«ãŒãã«ãžã®ãã©ããæºåã§ãããŸã§å¯ãŠããããã§ãããèµ·ãããŠããšããäŸé Œã§ãã1äžåã® fd ãç»é²ããŠããŠããå®éã«çšãããã®ã2åãªãã2ååã®çªå·ã ããè¿ã£ãŠããŸããå
šéšã1åãã€èŠåãå¿
èŠããªãââãããæ±ºå®çã«å¹ççã§ãã fd ãšã³ãŒã«ããã¯ã¯ãå¥ã®å Žæãã«ä¿ç®¡ããã ãã1ã€ãä»çµã¿ã®èã«ãªãã®ãæ
å ±ã®çœ®ãå Žæã§ãã ã«ãŒãã« ãæã€ã®ã¯ãç£èŠãã¹ã fd ã®äžèЧããšãæºåã§ãã fd ã®äžèЧãââã€ãŸã çªå·ã ã ãfd9 ã®æºåãã§ããããã©ã®åŠçïŒã³ãŒã«ããã¯ïŒãå®è¡ãããããšãã**察å¿è¡šïŒç»é²ç°¿ïŒ**ã¯ãNode.js ã§ããã° Â libuv ïŒã©ã³ã¿ã€ã ã® C ãšã³ãžã³ïŒãæã€ ã«ãŒãã«ããã®éç¥ã¯ãfd9 ãæºåå®äºããšããçªå·ã ããlibuv ã¯ãã®çªå·ãéµã«ããŠãèªåã®ç»é²ç°¿ãããfd9 â ãã®ã³ãŒã«ããã¯ããåŒãåœãŠãå®è¡ãã¥ãŒã«ç©ã¿ãŸããçªå·ã§ç
§åããŠãåããŠãç¶ãã®åŠçããåãåºãããã§ãã ãã®åæ¥ãé ã«å
¥ããäžã§ãå®éã®ã³ãŒããèŠãŠã¿ãŸãããã 3. ã³ãŒãã§è¿œãïŒDB ã¢ã¯ã»ã¹ãš API ã¢ã¯ã»ã¹ããããéãã§ãé²ã äŸãã°ããããªã³ãŒãããããšããŸã ãŠãŒã¶ãŒæ
å ±ã  DB  ãããææ°ã®ãç¥ããã  å€éš API  ããåã£ãŠããââãäºãã«é¢ä¿ã®ãªã2ã€ã®éåæåŠçã§ãã // DBãããŠãŒã¶ãŒãååŸããåŠç async function getUser ( ) { console . log ( "A-1: DBã«åãåãããå®è¡" ) ; const user = await db . findUser ( 9 ) ; // â DBã¢ã¯ã»ã¹ïŒåŸ
ã¡çºçïŒ console . log ( "A-2: DBå¿çãå±ããïŒ" ) ; return user ; } // å€éšAPIãããç¥ãããååŸããåŠç async function getNews ( ) { console . log ( "B-1: APIã«åãåãããå®è¡" ) ; const news = await api . fetchNews ( ) ; // â APIã¢ã¯ã»ã¹ïŒåŸ
ã¡çºçïŒ console . log ( "B-2: APIå¿çãå±ããïŒ" ) ; return news ; } // 2ã€ãåæã«ã¹ã¿ãŒããããŠãäž¡æ¹ã®å®äºãåŸ
〠const [ user , news ] = await Promise . all ( [ getUser ( ) , getNews ( ) ] ) ; console . log ( "C: äž¡æ¹ããã£ãïŒ" ) ; å®è¡ãããšããã°ã¯ãã®é ã§åºãŸãã A-1: DBã«åãåãããå®è¡ B-1: APIã«åãåãããå®è¡ â DBã®è¿äºãåŸ
ããã«Bãå§ãŸã£ãŠããïŒ A-2: DBå¿çãå±ããïŒ B-2: APIå¿çãå±ããïŒ C: äž¡æ¹ããã£ãïŒ æ³šç®ããŠã»ããã®ã¯  A-1 ã®çŽåŸã« B-1 ãåºã ããšã§ããDB ã®å¿çïŒA-2ïŒãåŸ
ããã«ãAPI ãžã®åãåããïŒB-1ïŒãå§ãŸã£ãŠããŸãã await  ã§ãåŸ
ã£ãŠãããã¯ããªã®ã«ããªã次ã®åŠçãžé²ããã®ãââããã§ãããã»ã©ã®ã€ãã³ãã«ãŒããš fd ãç»å ŽããŸãã å³ãšå¯Ÿå¿ãããŠãè£åŽã远ã await db.findUser(9)  ã®è£åŽã§èµ·ããŠããããšãã4æã®å³ã§ã ç»é² â ããéã â å®äº ãã®é ã«è¿œã£ãŠãããŸããç»å Žäººç©ã¯ãã³ãŒããèµ°ããã ã¢ããªã±ãŒã·ã§ã³ ãçªå·ã ããèŠåŒµã ã«ãŒãã« ã察å¿è¡šãæã€ libuv ããããŠãã®å¯Ÿå¿è¡šã§ãã libuv ã®ç»é²ç°¿ ã®4è
ã§ãã ã¹ããã1ïŒ getUser  ã®çªââ await  ã«å°éããfd9 ãç»é²ãã getUser()  ãåŒã°ããA-1 ã®ãã°ãåºãã await db.findUser(9)  ã«å°éããŸããããã§ ç»é²ãã§ãŒãº ãåããŸãã â  ã¢ããªã±ãŒã·ã§ã³ã libuv ã«ã DB ã¢ã¯ã»ã¹åŠç ãé ŒãããšäŸé ŒããŸããDB ãžã®åãåãããããã®äŸé Œã«ã®ã£ãŠéãåºãããŸãã â¡ Â libuv ãã«ãŒãã«ã«ããã®æ¥ç¶ãèŠåŒµã£ãŠããšäŸé ŒããŸãã ⢠ ã«ãŒãã«ã®ç£èŠå¯Ÿè±¡ã«ãDB æ¥ç¶ã®çªå£ã§ãã  fd9  ãç»é²ãããŸãã以åŸã«ãŒãã«ã¯ fd9 ãèŠåŒµãç¶ããŸãã ⣠ libuv ãèªåã®ç»é²ç°¿ã«ã fd9 â ã³ãŒã«ããã¯åŠçïŒA-2 以éã®ç¶ãïŒ ããæ§ããŸãã ãããŠæ±ºå®çãªã®ã次ã®äžæ©ã§ãã getUser  㯠DB ã®è¿äºã åŸ
ã¡ãŸãã ãâ ãâ£ã®äŸé Œãšç»é²ã ãæžãŸããŠããã®å Žã§äžæãã å¶åŸ¡ãã€ãã³ãã«ãŒãã«è¿ããŸã ããŠã§ã€ã¿ãŒã泚æãåšæ¿ã«éããŠãããããŒãã«ãé¢ããã®ãšåãã§ãã ã¹ããã2ïŒç©ºããééã§ã getNews  ã®çªââfd10 ãç»é²ãã getUser  ãåžãé¢ããç¬éãã€ãã³ãã«ãŒãã¯æ¬¡ã®ä»äºã«åãããããŸããããã  getNews()  ã§ããB-1 ã®ãã°ãåºãŠã await api.fetchNews()  ã«å°éãââ ãŸã£ããåãâ ãâ£ããä»åºŠã¯å¥ã® fdïŒfd10ïŒã§ ç¹°ãè¿ãããŸãã â  ã¢ããªã±ãŒã·ã§ã³ã libuv ã«ã API ã¢ã¯ã»ã¹åŠç ããäŸé ŒïŒããã§ API ãžã®åãåãããå®è¡ïŒã ⡠⢠ libuv ãã«ãŒãã«ã«äŸé Œããã«ãŒãã«ã®ç£èŠå¯Ÿè±¡ã«  fd10  ãå ãããŸãã ⣠ libuv ã®ç»é²ç°¿ã«ã fd10 â ã³ãŒã«ããã¯åŠçïŒB-2 以éã®ç¶ãïŒ ããæ§ããããŸãã ãã㊠ getNews  ãåžãé¢ããŸãã ãããã A-1 ã®çŽåŸã« B-1 ãåºã ãã«ã©ã¯ãªã§ãã DB ã®åŸ
ã¡æéãšããããããã«ãAPI ãžã®åãåãããšããå¥ã®ä»äºãå·®ã蟌ãŸãã ããã§ããã¹ããã2ã®ç¶æ
ãèŠãŠãã ãããã«ãŒãã«ã¯ fd9ïŒDBïŒãš fd10ïŒAPIïŒã®2ã€ã䞊ã¹ãŠèŠåŒµã£ãŠãããlibuv ã®ç»é²ç°¿ã«ã2ã€ã®ç¶ããæ§ããããŠããŸããã¹ã¬ããã¯ã©ã¡ãã®è¿äºãæ¥ãŠããªãã®ã§  epoll.wait()  ã§ç ã£ãŠãããCPU æ¶è²»ã¯ãŒãã§ãã ã¹ããã3ïŒè¿äºãå±ããââfd9 ã®å®äºãã§ãŒãº ãã㊠DB ã®å¿çãå±ããŸãããããã㯠å®äºãã§ãŒãº ã§ãã â  èŠåŒµã£ãŠããã«ãŒãã«ããfd9 ã«ããŒã¿ãå±ãããããšãæ€ç¥ããlibuv ã« å®äºéç¥ ãéããŸããæµããã®ã¯ã fd9 ãæºåå®äº ããšããçªå·ã ãã§ãã â¡ Â libuv ããã®çªå·ãéµã«ç»é²ç°¿ãåŒãããfd9 â ã³ãŒã«ããã¯åŠçãã ååŸ ããŸãã ⢠ ãã®ã³ãŒã«ããã¯ãã¢ããªã±ãŒã·ã§ã³äžã§ å®è¡ ããã getUser  ã  await Â ã®æ¬¡ã®è¡ïŒA-2ïŒããåé ããŸãã ã¹ããã4ïŒå°ãé
ããŠãfd10 ã®å®äºãã§ãŒãº å°ãé
ã㊠API ã®å¿çãå±ãã°ãä»åºŠã¯ fd10 ã«ã€ã㊠ãŸã£ããåãâ ã⢠ãèµ°ããŸãã â  ã«ãŒãã«ããfd10 ãæºåå®äºãã libuv ã«éç¥ã â¡ Â libuv ãç»é²ç°¿ãããfd10 â ã³ãŒã«ããã¯åŠçããååŸã ⢠ ã³ãŒã«ããã¯ãå®è¡ããã getNews  ã  B-2 ããåé ããŸãã äž¡æ¹ããã£ããšããã§ Â Promise.all  ã解決ããC ã®ãã°ãåºãŠå®äºã§ãã ãšããã§ããããŸã§  await db.findUser(9)  ãšäžæ¯ã«æžããŠããŸãããããã®äžè¡ãè£ã§è¿ããŠãã  Promise  ãšããååšã«ããŸã ãã¡ããšè§ŠããŠããŸããã§ãããå®ã¯ãã® Promise ãããããŸè¿œã£ãå³ã®äžçãšãç§ãã¡ãæžã JavaScript ã®ã³ãŒããšãã€ãªããçªå£ãã§ããåãå³ãããäžåºŠãä»åºŠã¯ Promise ã®èŠç¹ããèŠçŽããŠã¿ãŸãããã 4. Promise ãšã¯äœã db.findUser(9)  ã¯ãã®å Žã§ãåžããè¿ã await db.findUser(9)  ãšããäžè¡ã¯ãå®ã¯2ã€ã®åäœã«åãããŠããŸãã const promise = db . findUser ( 9 ) ; // â findUser ãããäœããè¿ã const user = await promise ; // â¡ ãã®ãäœããã®äžèº«ãåãåºã db.findUser(9)  ãåŒã¶ãšã ãã®å Žã§ããæ»ãå€ãè¿ã£ãŠããŸã ããšã¯ãããè¿ã£ãŠããã®ã¯ DB ã®ããŒã¿âŠâŠã§ã¯ãããŸããããŸã è¿äºã¯å±ããŠããªãã®ã§ãããåœç¶ã§ãã代ããã«è¿ãã®ã  Promise ââãçµæã¯ä»ã¯ãŸã ç¡ãããã©ãããšã§å¿
ãæž¡ãïŒãã倱æãäŒããïŒãšçŽæããåžãã§ããã¬ã¹ãã©ã³ã® çªå·æ ãæãæµ®ãã¹ãŠãã ãããæçïŒããŒã¿ïŒãšåŒãæããããã®ã éåæåŠçã®åŒæåž ã§ãã ãããå³ã®ã¹ããã1ã«éãããšããããªããŸãã db.findUser(9)  ãåŒãã ç¬éâââ ã§ DB ãžã®åãåãããå®è¡ãããâ¢ã§ fd9 ãã«ãŒãã«ã®ç£èŠå¯Ÿè±¡ã«ç»é²ãããããã®ç¬éââã¢ããªã±ãŒã·ã§ã³ã®æå
ã«æ®ãã®ã¯åŒæåžïŒPromiseïŒã ãã§ãäžèº«ã¯ãŸã 空ã£ãœã§ãã åžã«ã¯ãã¹ããŒã¿ã¹ããããââç£èŠå¯Ÿè±¡ãšé£åããŠãã ãã®åŒæåžã¯ããã ã®çŽããã§ã¯ãããŸãããåŠçãä»ã©ããŸã§é²ãã ããšãã ã¹ããŒã¿ã¹ ãæã£ãŠããŠããã®ç§»ãå€ããã1æã«ãããšæ¬¡ã®å³ã«ãªããŸãã å³ã®èŠæ¹ã¯ããã§ãã å·Šã® Â pending ïŒä¿çäžïŒ  ãåºçºç¹ã§ãã db.findUser(9)  ãåŒãã§åžãåãåã£ãçŽåŸââ ã¹ããã1 ã®ç¶æ
ã«ããããŸãããŸã çµæã¯ç¡ããåžã¯ãä¿çäžãã®ãŸãŸå®ã«æµ®ããŠããŸãã ããããåžã¯ 2æ¹åã®ã©ã¡ããäžæ¹ ã«ããé²ã¿ãŸãããè¿äºãç¡äºã«å±ãã°ãå³äžã®  fulfilled ïŒæåïŒ Â ãžãäžåãã®ç¢å°ã«æ·»ãã  resolve ïŒæåã確å®ïŒ  ããã®åŒãéã§ãããã㯠ã¹ããã3 ã§åä¿¡ã³ãŒã«ããã¯ãèµ°ããããŒã¿ãæã£ãç¬éã«çžåœããŸãã éã«éä¿¡ãšã©ãŒãªã©ã§å€±æããã°ãå³äžã®  rejected ïŒå€±æïŒ  ãžãäžåãã®ç¢å°ã®  reject ïŒå€±æã確å®ïŒ  ãåŒãéã§ãã ãããŠç¢å°ã®åãã«æ³šç®ããŠãã ããã pending  ããåºãŠããç¢å°ã¯ãã£ãŠããæ»ã£ãŠããç¢å°ã¯ãããŸãã ãäžåºŠ  fulfilled  ã  rejected  ã«ç¢ºå®ããåžã¯ãäºåºŠãšå¥ã®ç¶æ
ã«å€ãããªãââããããåŒæåžã®ã¹ããŒã¿ã¹ã¯ äžæ¹éè¡ ããšããæå³ã§ããã ããåã Promise ãäœåºŠ  await  ããŠããç¢ºå®æžã¿ã®åãçµæãè¿ã£ãŠããŸãã ããã«èå¿ãªã®ã¯ããã®åžã®ã¹ããŒã¿ã¹ãã åç« ã®å³ã§ã«ãŒãã«ãèŠåŒµã£ãŠããç£èŠå¯Ÿè±¡ïŒfd9ïŒã®ç¶æ
ãšé£åããŠãã ããšã§ããfd9 ã«ãŸã è¿äºãæ¥ãŠããªãã¹ããã1ã2ã®éãåžã¯  pending ãã¹ããã3ã§ã«ãŒãã«ããfd9 æºåå®äºããéç¥ããåä¿¡ã³ãŒã«ããã¯ãããŒã¿ãæããç¬éã«ãåžã¯  pending â fulfilled  ãžåããŸããã€ãŸã Promise ãšã¯ã ã€ãã³ãã«ãŒããèŠåŒµã£ãŠãã察象ã®ã¹ããŒã¿ã¹ããéçºè
ã JavaScript ã®äžçããèŠãããã®çªå£ ã§ãããããã§ããã«ãŒãã«ã»libuv ãšããæ°Žé¢äžã®ç¶æ
ãããã®äžæã®åžã«æ ãåºãããŠããããšèãããšè
ã«èœã¡ãŸãã åžããäžèº«ãåãåºãïŒæ¬æ¥ã¯  .then() åžãæ¡ã£ãŠããã ãã§ã¯ãããŒã¿ã¯äœ¿ããŸããããåžã  fulfilled  ã«ãªã£ããããã®åŠçãããŠããšãããããç»é²ããŠããå¿
èŠããããŸããããã  .then()  ã§ãã const promise = db . findUser ( 9 ) ; // åŒæåžãåãåãïŒpendingïŒ promise . then ( ( user ) => { // ãåžã確å®ãããããããå®è¡ããŠããšäºçŽ console . log ( user . name ) ; } ) ; ãããèŠèŠãããªãã§ãããããåç« ã®å®äºãã§ãŒãºïŒã¹ããã3ïŒã§ãfd9 â ç¶ãã®åŠçããç»é²ç°¿ã«æ§ããããåžã確å®ããç¬éã«åŒã³åºãããââæ§é ã¯ãŸã£ããåãã§ãã .then() Â ã«æž¡ãã颿°ãããå³ã®ç»é²ç°¿ã«å
¥ããç¶ããã®æ£äœã®ã²ãšã€ã§ãã await  ã¯ãåžãäžèº«ã«åããã®ãåŸ
ã€ãããã®ãèªã¿ãããæžãæ¹ .then()  ã§ãããŒã¿ã¯åãåºããŸãããåŠçãé£ãªããšå
¥ãåãæ·±ããªãèªã¿ã¥ãããªããŸãïŒããããã³ãŒã«ããã¯å°çïŒãããã§ Â await  ã®åºçªã§ãã // .then ã¹ã¿ã€ã«ïŒåžãåãåã£ãŠãç¶ããã³ãŒã«ããã¯ã§æžã db . findUser ( 9 ) . then ( ( user ) => { console . log ( user . name ) ; } ) ; // await ã¹ã¿ã€ã«ïŒåžãäžèº«ã«åããã®ãåŸ
ã£ãŠãåæçã«åãåã const user = await db . findUser ( 9 ) ; // â åžã®äžèº«ããã®ãŸãŸå€æ°ãž console . log ( user . name ) ; await  ã¯ãå³åŽã® PromiseïŒåžïŒã  fulfilled  ã«ãªããŸã§åžãé¢ããŠåŸ
ã¡ã確å®ãããäžã®å€ãåãåºããŠè¿ããä¿ã§ãã .then()  ã®ã³ãŒã«ããã¯ãæžã代ããã«ã ããããåæåŠçã®ããã«ãäžããäžãž æžããããã«ãªããŸããè£ã§èµ·ããŠããããšïŒç»é²ããŠåžãè²ã â åžãç¢ºå® â ç¶ããåéïŒã¯åç« ã®å³ãšãŸã£ããåãã§ã await  ã¯ãããèªã¿ãããèŠãç®ã«æŽããŠããã ãââããã§ããäžçªäžã®èãç®ããªã®ã§ãã ã await  ãä»ãå¿ãããš Promise ãè¿ããçç± ãããŸã§åãããšãåé ã®çåââã await  ãä»ãå¿ãããš Promise ãè¿ã£ãŠããã®ã¯ãªãïŒãââã«ãçããããŸãã const x = db . findUser ( 9 ) ; // awaitãªã console . log ( x ) ; // â Promise { <pending> }ïŒåžãã®ãã®ïŒ const user = await db . findUser ( 9 ) ; // awaitãã console . log ( user ) ; // â { id: 9, name: "..." }ïŒäžèº«ïŒ await  ãä»ããªããã°ãåžïŒPromiseïŒãäžèº«ã«åŒãæããåäœãèµ°ããªããŸãŸæ¬¡ã®è¡ãžé²ã¿ãŸããã ããæå
ã«ã¯åŒæåžãæ®ã£ããŸãŸããä»ãå¿ãããš Promise ãè¿ããã®æ£äœã¯ããã§ãã async  ã¯ããã®é¢æ°ã¯åŒæåžãè¿ãããšããå®£èš ããã§ããã£ãšè圹ã ã£ã  async Â ã®æ£äœãã¯ã£ãããããŠãããŸãããã async  ã¯é¢æ°ã«ä»ãã å° ã§ãæå³ã¯ãšãŠãã·ã³ãã«ã§ãã async  ãä»ãã颿°ã®æ»ãå€ã¯ãå¿
ã PromiseïŒåŒæåžïŒã«å
ãŸããã return user Â ãšæžããŠããåŒã³åºãåŽãåãåãã®ã¯  user  ãã®ãã®ã§ã¯ãªã  Promise<user> ãéäžã§äŸå€ãæããã°ããã®åžã¯  rejected  ã«ãªããŸããããã®é¢æ°ã¯ããã«ã¯çµæãè¿ããªãããŸãåŒæåžãæž¡ããŠãäžèº«ã¯ããšã§ç¢ºå®ããããââããã宣èšããã®ã  async  ã§ãã async function getUser ( ) { return { id : 9 , name : "Alice" } ; // â ãã ã®ãªããžã§ã¯ããè¿ããŠããã€ããã§ã } const r = getUser ( ) ; console . log ( r ) ; // â Promise { <fulfilled> }ïŒåžã«å
ãŸããŠããïŒ ãããŠããäžã€å€§äºãªã«ãŒã«ããããŸãã await ïŒåžãé¢ããŠåŸ
ã€åäœïŒã䜿ããã®ã¯ã async  ãä»ãã颿°ã®äžã ã ã§ããè£è¿ããšã颿°ã®äžã§äžåºŠã§ã  await  ããããªãããã®é¢æ°ã¯  async  ã«ããããåŸãªãã await  ããïŒãèªåãããã«ã¯çµããããçµæã¯ããšã§è¿ãããšããããšãªã®ã§ãåœç¶ãã®é¢æ°ãåŒæåžãè¿ã颿°ã«ãªãããšããçã®éã£ã話ã§ãã async  ã¯åŒã³åºãå
ãžãäŒæãããŠãã ãã®2ã€ã®ã«ãŒã«ãçµã¿åããããšãé¢çœãââãããŠæåã¯æžæãââçŸè±¡ãèµ·ããŸãã async / await  ããåŒã³åºããã§ãŒã³ãäžãžäžãžãšäŒæããŠãã ã®ã§ãã // æ«ç«¯ïŒDBãåŸ
ã€ã®ã§ await ãèŠã â async ãå¿
é async function getUser ( ) { const user = await db . findUser ( 9 ) ; return user ; // æ»ãå€ã¯ Promise<user> } // äžéïŒgetUser() ã®äžèº«ã䜿ããã â await ãã â èªåã async ã« async function buildProfile ( ) { const user = await getUser ( ) ; // ããã§ await return ` ${ user . name } ãã ` ; // ããã Promise<string> ã«ãªã } // äžäœïŒbuildProfile() ã®äžèº«ã䜿ããã â ãŸã await â ãŸã async async function handler ( req , res ) { const text = await buildProfile ( ) ; // ããã§ã await res . send ( text ) ; } äžçªäžã®  getUser  ããDB ãåŸ
ã€ãããã« Â async  ã«ãªã£ãç¬éããã®æ»ãå€ã¯åŒæåžã«ãªããŸãããã®äžèº«ã䜿ããã  buildProfile  㯠 await  ãããããªãããããš Â buildProfile  ãåŒæåžãè¿ã颿°ïŒ async ïŒã«ãªããããã«ãã®äžã®  handler  ãâŠâŠãšã ãããšã§è¿ãããšããæ§è³ªããå€ã䜿ããã¹ãŠã®åŒã³åºãå
ãžççªãã§åºãã£ãŠãã ããã§ãã ãªãéäžã§æã¡åããªãã®ã§ãããããäžéã®é¢æ°ãããã£ããçµæãåŸ
ã£ãŠ åæçãªå€ ã«ããŠè¿ããããšãã§ããã°äŒæã¯æ¢ãŸããŸãããããããã¯ããã®å Žã«ç«ã¡æ¢ãŸã£ãŠã¹ã¬ããããããã¯ããããšã«ä»ãªããŸãããã€ãã³ãã«ãŒãã®å€§åæââ åŸ
ã€éã«ä»ã®ä»äºãæã ââãå£ããŠããŸããŸããã ãããåŸ
ã¡ãããããšããäºå®ã¯é ãããåïŒPromiseïŒãšããŠå
šçµè·¯ã«æ£çŽã«çŸãããããã¯é¢åãšããããã ããã®çµè·¯ã«ã¯åŸ
ã¡ãå«ãŸããããã³ãŒãäžã§è¿œè·¡ã§ãã ããããå®å
šãªèšèšã ãšèãããšè
ã«èœã¡ãŸãã ã§ã¯ããã®äŒæã¯ã©ãã§æ¢ãŸãã®ããçã㯠ãšã³ããªãã€ã³ã ã§ããExpress ã®ãªã¯ãšã¹ããã³ãã©ã main() ãã€ãã³ããªã¹ãââããã°ã©ã ã®äžçªå€åŽã§èª°ããæåŸã«åãæ¢ããã°ãããã§éã¯çµãããŸããæ®æ®µã®ã¢ããªéçºã§æ«ç«¯ãããã¬ãŒã ã¯ãŒã¯ãŸã§  async  ãæèããã«æžããŠããã®ã¯ã ãã®äžçªå€åŽããã¬ãŒã ã¯ãŒã¯ãåŒãåããŠãããŠãã ããã§ããç§ãã¡ã¯ãåŸ
ã¡ã䜿ã颿°ã«  async  ãä»ããããæ«ç«¯ã§ããã ãã§ãããšã¯èªç¶ã«äžæµãŸã§ã€ãªãããŸãã ã§ã¯ããã®ç»é²ç°¿ã«æ§ãããããç¶ããââ .then()  ã®äžèº«ã«ããã åä¿¡ã³ãŒã«ãã㯠ã¯ãå
·äœçã«äœãªã®ã§ãããããæ¬¡ç« ã§ã¯ããããèªåã®æã§æžããŠã¿ãŸãã 5. ç»é²ç°¿ã«å
¥ãã®ã¯ãåä¿¡ã³ãŒã«ããã¯ã ãããŸã§ã§ãfd ã®æºåãã§ãããã察å¿ããåŠçãå®è¡ãããããšèª¬æããŠããŸãããã§ã¯ããã®ã察å¿ããåŠçãââå³ã®ç»é²ç°¿ã«å
¥ã£ãŠãããã®ã®æ£äœã¯ãå
·äœçã«äœã§ããããã ãã®åä¿¡ã³ãŒã«ããã¯ã¯ãæ®æ®µã¯  fetch  ã  axios ãDB ãã©ã€ããšãã£ã ã©ã€ãã©ãªãå
éšã§çšæããŠãã ãšããç¹ã§ãããã©ã€ãã©ãªãåæã«ãã£ãŠããããã®æ£äœã¯ãã©ã€ãã©ãªã®äžã§èª°ãããã®ã³ãŒã«ããã¯ãæžããŠç»é²ããŠããããšããã ããã€ãŸãã èªåã§ãæžããŸã ãäœã¬ãã«ãªå§¿ããé ã«èŠãŠãããŸãããã ã¬ãã«1ïŒæãçã®å§¿ïŒãœã±ãã + ã³ãŒã«ããã¯ïŒ ã¿ã€ããŒãHTTPã©ã€ãã©ãªã䜿ããããfd ãç£èŠããŠãèªãããã³ãŒã«ããã¯ããæã§æžããšããããªããŸããNode ã® Â net  ã¢ãžã¥ãŒã«ããå³ã®ç»é²ç°¿ãžã®ç»é²ãæ
åœããŸãã const net = require ( "net" ) ; // APIãµãŒããŒã«TCPæ¥ç¶ããïŒããã§fdã1ã€å²ãåœãŠãããïŒ const socket = net . connect ( 80 , "example.com" , ( ) => { // æ¥ç¶ã§ãããHTTPãªã¯ãšã¹ãã"å®è¡"ããïŒå³ã®â ïŒ socket . write ( "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n" ) ; } ) ; // â
ããããç»é²ç°¿ã«å
¥ãã³ãŒã«ããã¯ããã®ãã®â
// ããã®ãœã±ãã(fd)ãèªããããã«ãªã£ããããããå®è¡ããŠããšç»é²ããŠãã socket . on ( "data" , ( chunk ) => { console . log ( "åä¿¡ã³ãŒã«ããã¯ãèµ·å:" , chunk . toString ( ) . slice ( 0 , 50 ) ) ; } ) ; socket . on ( "end" , ( ) => { console . log ( "åä¿¡å®äº" ) ; } ) ; socket.on("data", ...) Â ã«æž¡ããŠãã颿°ââ ãããå³ã®ãfd9 â åä¿¡ã³ãŒã«ããã¯ãã®äžèº« ã§ãã .on("data")  ãåŒãã ç¬éãå
éšã§ããã®fdãèªããç¶æ
ã«ãªã£ããããã®é¢æ°ãåŒã¹ããš libuv ã®ç»é²ç°¿ãšã«ãŒãã«ã® epoll ã«ç»é²ãããŸããã©ã€ãã©ãªããã£ãŠãããåæã«å
¥ããŠããããã®æ£äœã¯ããã® Â .on("data", callback)  ã®äžè¡ãªã®ã§ãã ãã ããã㯠ã³ãŒã«ããã¯ã¹ã¿ã€ã« ãªã®ã§ã await  ã¯ãŸã 䜿ããŸããã await  ã§åããããªããæ¬¡ã®ã¬ãã«ã§ Promise ã«å
ã¿ãŸãã ã¬ãã«2ïŒèªåã§Promiseãäœã£ãŠãawaitã§ããããã«ãã åä¿¡ã³ãŒã«ããã¯ã  new Promise  ã®äžã«å
¥ããŠãããŒã¿ãå
šéšå±ããã  resolve  ããââããã§ Â await  å¯èœãªé¢æ°ã èªäœ ã§ããŸãã const net = require ( "net" ) ; // APIååŸããawaitå¯èœãªé¢æ°ãšããŠèªäœãã function fetchFromApi ( ) { return new Promise ( ( resolve , reject ) => { const socket = net . connect ( 80 , "example.com" , ( ) => { socket . write ( "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n" ) ; // â å®è¡ } ) ; let received = "" ; // â
ç»é²ç°¿ã«å
¥ãåä¿¡ã³ãŒã«ããã¯ïŒèªåã§æžããŠããïŒâ
socket . on ( "data" , ( chunk ) => { received += chunk . toString ( ) ; // å±ããã¶ããæºããïŒå±ããã³ã«åŒã°ããïŒ } ) ; // å
šéšå±ãããPromiseã解決ãã socket . on ( "end" , ( ) => { resolve ( received ) ; // â ããã§ pending â fulfilledïŒã¹ããã3â¢ã®åŒãéïŒ } ) ; // 倱æãããreject socket . on ( "error" , ( err ) => { reject ( err ) ; } ) ; } ) ; } // ããã§èªäœé¢æ°ãawaitã§ããïŒ async function main ( ) { console . log ( "åãåããå" ) ; const body = await fetchFromApi ( ) ; // â èªåã§äœã£ãPromiseãawait console . log ( "åä¿¡å®äº:" , body . slice ( 0 , 50 ) ) ; } main ( ) ; ãã®ã³ãŒãã§ãèšäºã®ç¬¬3ç« ã§èŠãå³ã®å
šèŠçŽ ããèªåã®ã³ãŒããšããŠæããŸãã å³ã®èŠçŽ äžã®ã³ãŒãã®è©²åœç®æ ã¹ããã1â åãåããã®å®è¡ socket.write(...) ç»é²ç°¿ã«å
¥ãåä¿¡ã³ãŒã«ãã㯠socket.on("data", ...) ã¹ããã3â¢ã®åŒãéïŒPromiseè§£æ±ºïŒ resolve(received) await  ã®ç¶ã console.log("åä¿¡å®äº", ...) new Promise  ã®äžèº«ãããããŸã§ãã©ã€ãã©ãªãæžããŠããäœã¬ãã«åŠçãã ã£ããã® ã§ãããããèªåã®æã§æžããŠããã®ããã®ã³ãŒãã§ã axios  ã  fetch  ã®å
éšããç
ãè©°ããã°ïŒãšã©ãŒåŠçã»ã¿ã€ã ã¢ãŠãã»åæ¥ç¶ãªã©ãè¶³ãã€ã€ïŒãããšåãããšããã£ãŠããŸãã ã¬ãã«3ïŒãç»é²ç°¿ã«å
¥ãã³ãŒã«ããã¯ãã ããæå°ã§ ã©ã€ãã©ãªã DB ã API ã䜿ããããfd ãç£èŠããŠãèªãããã³ãŒã«ããã¯ãã®éªšçµã¿ã ããæãåºããšããããªããŸããæšæºå
¥åïŒãããç«æŽŸãª fdïŒ0 ã§ãïŒã§èŠãããšäžçªã·ã³ãã«ã§ãã // æšæºå
¥åïŒfd=0ïŒãç£èŠå¯Ÿè±¡ã®ã²ãšã€ process . stdin . on ( "data" , ( data ) => { // â
ãããç»é²ç°¿ã«å
¥ãã³ãŒã«ããã¯â
// ãfd0ãèªããããã«ãªã£ããïŒïŒããŒå
¥åããã£ããïŒãããå®è¡ã console . log ( "å
¥åã³ãŒã«ããã¯ãèµ·å:" , data . toString ( ) . trim ( ) ) ; } ) ; console . log ( "å
¥ååŸ
ã¡ïŒã§ãããã°ã©ã ã¯åºãŸã£ãŠããªãïŒ" ) ; ãããå®è¡ãããšã .on("data", ...)  ã®é¢æ°ãã«ãŒãã«ã® epoll çµç±ã§ãfd0 ãèªããããã«ãªã£ããåŒã°ãããããç»é²ãããããŒãæã€ãã³ã«èµ·åããŸãã åŸ
ã£ãŠããéãããã°ã©ã ã¯åºãŸããªã ââãããããã€ãã³ãã«ãŒããèåŸã§åã£ãŠããäœããã®èšŒæ ã§ãã ãŸãšãïŒç»é²ç°¿ã®äžèº«ã¯ãè¿äºãæ¥ããåãä¿ã 3ã€ã®ã¬ãã«ãéããŠèŠããŠããã®ã¯ãç»é²ç°¿ã«å
¥ããã®ã®æ£äœã§ãã å
¥ãã®ã¯ãAPI ã¢ã¯ã»ã¹åŠçïŒããããå©ãïŒãã§ã¯ãªãã åä¿¡ã³ãŒã«ããã¯ïŒè¿äºãæ¥ããåŠçããä¿ïŒ ãã®å®äœã¯  .on("data", ...) Â ã«æž¡ã颿°ã§ããfd ãèªãããå®è¡ããŠããš libuvïŒepoll ã«ç»é²ããã await  å¯èœã«ããã«ã¯ããã®åä¿¡ã³ãŒã«ããã¯ã  new Promise  ã§å
ã¿ãããŒã¿ãæã£ãã  resolve  ãã æ®æ®µäœ¿ã  fetch ã» axios ã»DBãã©ã€ãã¯ããã®ãåä¿¡ã³ãŒã«ããã¯ ïŒ Â new Promise ãããå®éçšã«èããããå
ç¢ã«æžãäžãããã® æ®æ®µã®ã¢ããªéçºã§ããã®äœã¬ãã«ã³ãŒããèªåã§æžãããšã¯ãŸããããŸãããããã§ããã©ã€ãã©ãªã®  await  ã®è£ã§ã¯  new Promise  ãšãœã±ããã®åä¿¡ã³ãŒã«ããã¯ãåããŠããããšç¥ã£ãŠããã°ãã¿ã€ã ã¢ãŠããã³ãã¯ã·ã§ã³ç®¡çã§ãã©ãã«ãèµ·ãããšãã ã©ã®å±€ãèŠãã°ããããåãåãããã ããã«ãªããŸããã©ã€ãã©ãªããã©ãã¯ããã¯ã¹ã«ããªãããã®ã確ããªè¶³å Žã«ãªãã¯ãã§ãã ãããã« ããªãè²ã
説æãã¯ããã£ããããªæ°ãããŸããããããŸããªæŠå¿µã¯äŒããããããã«ãæããŸããããã§async/awaitæããªããªãã°å¹žãã§ãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 2人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post äžçäžãããã¿ã®æ·±ãasync/awaitã«ããéåæåŠç first appeared on SIOS Tech Lab .
 Linuxåå¿è
ãAzureä»®æ³ãã·ã³ã§HTTPãµãŒããŒãæ§ç¯ãã話 --> ããã«ã¡ã¯ïŒæ°åã§ãµã€ãªã¹ãã¯ãããžãŒã«å
¥ç€ŸããããŸãŸããã§ãã æ¬èšäºã§ã¯ãLinuxåå¿è
ãç ä¿®ã§åŸãåŠã³ã以äžã®æ§æã§ã玹ä»ããŸããLinuxã¯ITãã¹ããŒããªã©ã®è³æ Œå匷ã§å°ãç¥ã£ãŠããçšåºŠã ã£ãã®ã§ããããã®åºŠæ°åç ä¿®ã®äžç°ãšããŠLinuxä»®æ³ç°å¢ã§ã®ãµãŒãæ§ç¯ãè¡ããŸããã ããããLinuxãåŠã¶æ¹ã®åèã«ãªãã°å¹žãã§ãã Linuxã«ã€ã㊠Linuxãšã¯ Linuxã¯WindowsãMacã®ãããªOSïŒOperating SystemïŒã®äžçš®ã§ããOSSïŒOpen Source SoftwareïŒãšããŠå
¬éãããŠãããããäžçäžã®éçºè
ãèªç±ã«ããã°ã©ã ã®äžèº«ã確èªãããã«ã¹ã¿ãã€ãºã§ããŸãã å³å¯ã«ããã°ããLinuxããšã¯OSã®æ žå¿ã§ãããã«ãŒãã«ãã®ããšãæãããã§ãããããå®éã«ã¯ãã«ãŒãã«ã«ç¬èªã®ç®¡çããŒã«ãã¢ããªã±ãŒã·ã§ã³ãçµã¿åããããLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ãã®ããšãLinuxãšåŒã¶ããšãå€ãããã§ãã æåãªLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ã¯ä»¥äžã®ãã®ããããŸãã RedHatç³»ïŒ RHELãAlmaLinux ãªã© Debianç³»ïŒ DebianãUbuntu ãªã© Linuxã®ç¹åŸŽ Linuxã«ã¯ä»¥äžã®ãããªç¹åŸŽããããŸãã åºæ¬çã«æåããŒã¹ã§æäœãã ããŒã¿ããã£ã¬ã¯ããªãšãã¡ã€ã«ã®å
¥ãåæ§é ã§ç®¡çãã ãŠãŒã¶ããšã«æš©éãèšå®ã§ãã ç§ã®å Žåããã®ãããã®ç¹åŸŽãæŽãã®ã«æéãããããŸãããä»ãå®å
šã«çè§£ã§ããŠãããåãããªãã®ã§ãããç§ãªãã®èšèã§ç°¡åã«èª¬æããããšæããŸãã LPI-Japanãšããå£äœãååŠè
åãã« ãLinuxæšæºæç§æžã ãšããè³æãå
¬éããŠããã®ã§ãæ£ç¢ºãªæ
å ±ãç¥ãããæ¹ã¯ãã¡ããåç
§ããŠã¿ãŠãã ããã ïŒïŒåºæ¬çã«æåããŒã¹ã§æäœãã Linuxã§ã¯ãããŒããŒãã§åœä»€ïŒã³ãã³ãïŒãå
¥åããCUIïŒCharacter User InterfaceïŒã§ã®æäœãåºæ¬ã§ãã Linuxã®ã³ãã³ãã¯åºæ¬çã«ãã³ãã³ããããªãã·ã§ã³ããåŒæ°ãã§æ§æãããŸãã åãæäœã§ãããã£ã¹ããªãã¥ãŒã·ã§ã³ã«ãã£ãŠã¯å¥ã®ã³ãã³ãããªãã·ã§ã³ãååšããå Žåããããããæ³šæãå¿
èŠã§ãã ïŒïŒããŒã¿ããã£ã¬ã¯ããªãšãã¡ã€ã«ã®å
¥ãåæ§é ã§ç®¡çãã Linuxã§ã¯ãããŒã¿ã¯ãã£ã¬ã¯ããªãšãã¡ã€ã«ã®å
¥ãåæ§é ã§ç®¡çãããŸãã ãã£ã¬ã¯ããªã¯ãã©ã«ãã®ãããªãã®ã§ããã¡ã€ã«ãæŽçããããã®å
¥ãç©ã§ãããã£ã¬ã¯ããªã®äžã«ããã«ãã£ã¬ã¯ããªãäœãããšãã§ãããããå
¥ãåæ§é ãšåŒã³ãŸãã ãã¡ã€ã«ãæäœããæã«ã¯ããã¡ã€ã«ã®äœæïŒãã¹ïŒãæå®ããå¿
èŠããããŸãããã¹ã«ã¯ãæäžäœïŒ/ã«ãŒããã£ã¬ã¯ããªïŒããã®çµ¶å¯Ÿãã¹ãšãçŸåšã®ãã£ã¬ã¯ããªããã®çžå¯Ÿãã¹ããããŸãã 絶察ãã¹ïŒ /home/username/newdir/file1.txt çžå¯Ÿãã¹ïŒ(çŸåšã®äœçœ®ã/home/usernameã®å Žå) newdir/file1.txt ïŒïŒãŠãŒã¶ããšã«æš©éãèšå®ã§ãã Linuxã«ã¯ããŠãŒã¶ããšããæŠå¿µããããŸãããŠãŒã¶ã«ã¯ã人ããã°ã€ã³ããŠæäœãè¡ãããã®ãã®ã®ä»ã«ã人ããã°ã€ã³ã§ããå
éšã§ããã°ã©ã ãåããããã®ãã®ããããŸãã Linuxã§ã¯ããŠãŒã¶ããšã«æš©éãèšå®ã§ããŸããæš©éã«ã¯ãèªã¿åãïŒrïŒãæžã蟌ã¿ïŒwïŒãå®è¡ïŒxïŒã®3çš®é¡ããããŸãã äŸãã°ããã¡ã€ã«ã«äœãæžã蟌ã¿ãããšæã£ãŠããèªèº«ãæäœãããŠãŒã¶ã«ãã®æš©éããªããã°æžã蟌ãããšã¯ã§ããŸããã æš©éãèšå®ããã³ãã³ãããããããå¿
èŠã«å¿ããŠå²ãåœãŠãã倿Žããå¿
èŠããããŸãã æ¬ç« ã®å
容ã¯ä»¥äžã§ãã æ¬¡ç« ã§ã¯ãå®éã«Linuxä»®æ³ç°å¢ãçšæããŠãµãŒãæ§ç¯ãè¡ã£ãæé ãã玹ä»ããŸãã Linuxä»®æ³ç°å¢ã§ã®ãµãŒãæ§ç¯ ä»®æ³ãã·ã³(AzureVM)ã®çšæ Linuxã¯ãã³ã³ãã¥ãŒã¿ïŒããŒããŠã§ã¢ïŒã®æ©èœã管çãããã»ã¹ãšã®ä»²ç«ã¡ãè¡ãã«ãŒãã«ãšãã«ãŒãã«ã«äººéã®åºããåœä»€ïŒã³ãã³ãïŒã翻蚳ãäŒããã·ã§ã«ã§æ§æãããŠããŸãã å®éã«LinuxãåãããŠåŠã¶ã«ã¯ãã³ãã³ããåºã察象ãšãªãã³ã³ãã¥ãŒã¿ãå¿
èŠã§ãã ãããç§ãçŸåšäœ¿ã£ãŠããã³ã³ãã¥ãŒã¿ã¯Windowsãšããå¥ã®ã·ã¹ãã ã管çããŠãããããLinuxã®ã³ãã³ããæžããŠãéããŸããã ãã®ããä»åã¯ä»®æ³åãããã³ã³ãã¥ãŒã¿ã§ãããAzure VMïŒVirtual MachinesïŒããšããã¯ã©ãŠããµãŒãã¹ãå©çšããŠä»®æ³ç°å¢ãæ§ç¯ããŸããã ä»®æ³ãã·ã³OSã«ã¯ããRed Hat Enterprise Linux (RHEL) 9.4ããéžæããŸããã Windowsç°å¢ãç¶æãããŸãŸLinuxãå®éã«æäœããæ¹æ³ã¯ä»ã«ãããããããã®ã§ããèªèº«ã®ããœã³ã³ããã®ä»æ¡ä»¶ã«å¿ããŠéžæããããšãããããããŸãã ä»®æ³ãã·ã³ã«SSHæ¥ç¶ ä»®æ³ãã·ã³ãäœæããããæ¬¡ã¯ããã«æ¥ç¶ããå¿
èŠããããŸãã ä»åã¯SSHãšããéä¿¡ãããã³ã«ã䜿ã£ãŠæ¥ç¶ããŸããã SSHã¯æå·åãããéä¿¡ãè¡ãããã®ãããã³ã«ã§ãä»åã®ããã«ã³ã³ãã¥ãŒã¿ãæå
ã«ãªãïŒãªã¢ãŒãïŒå Žåã§ãå®å
šã«æ¥ç¶ããããšãã§ããŸãã SSHæ¥ç¶ã®æé ã¯ä»¥äžã®éãã§ãã ä»®æ³ãã·ã³äœææã«çæãããç§å¯éµãèªåã®ããœã³ã³ã«ä¿åãã ã¿ãŒããã«ïŒã³ãã³ãããã³ããïŒãéãã以äžã®ã³ãã³ããå®è¡ããŠæ¥ç¶ãã ssh -i ç§å¯éµã®ãã¹ ãŠãŒã¶ãŒå@IPã¢ãã¬ã¹ ååæ¥ç¶æã«ã¯ããã¹ãããŒã®ç¢ºèªãæ±ããããã®ã§ãyesããšå
¥å HTTPéä¿¡ã«å¿
èŠãªãã®ã®ã€ã³ã¹ããŒã«ãšèšå® äœæããä»®æ³ãã·ã³ã«ã¯æäœéã®æ©èœãããªããããç®çã«å¿ããŠå¿
èŠãªéšåãèšå®ã远å ããå¿
èŠããããŸãã ä»åã¯ãWebãã©ãŠã¶ã«ã¢ãã¬ã¹ãå
¥åãããšWebããŒãžã衚瀺ãããããã«ãããã£ãã®ã§ãApacheãšãããã®ãã€ã³ã¹ããŒã«ããŸããã ïŒïŒAzure Portalã§åä¿¡ããŒãèŠåã®å€æŽ èªèšŒã®ããåä¿¡ããŒã22çªïŒSSHïŒãèš±å¯ãã ãœãŒã¹ã¯å®å
šã®ããèªåã®IPã¢ãã¬ã¹ã«éå®ãã ïŒïŒä»®æ³ãã·ã³äžã§Apacheã®ã€ã³ã¹ããŒã« sudo dnf install httpd ïŒïŒApacheã®èµ·åãšèªåèµ·åèšå® ã»ãµãŒãã¹ã®èµ·å sudo systemctl start httpd ã»èªåèµ·åã®æå¹å sudo systemctl enable httpd ïŒïŒRHELã®å
éšãã¡ã€ã¢ãŠã©ãŒã«ã§HTTPãã©ãã£ãã¯ã®èš±å¯ ã»HTTPã®èš±å¯ sudo firewall-cmd --add-service=http --permanent ã»èšå®ã®åæ sudo firewall-cmd --reload ïŒïŒAzure Portalã§åä¿¡ããŒãèŠåã®å€æŽ WebããŒãžãé²èЧããããåä¿¡ããŒã80çªïŒHTTPïŒãèš±å¯ãã ãœãŒã¹ã¯èªåã®IPã¢ãã¬ã¹ã«éå®ãã 衚瀺ããã³ã³ãã³ãã®äœæ Apacheã®ããã©ã«ãèšå®ã§ã¯ãã/var/www/htmlããã£ã¬ã¯ããªã«HTMLãã¡ã€ã«ã眮ãããšã§ãWebããŒãžãšããŠè¡šç€ºãããã³ã³ãã³ããäœæã§ããŸãã ä»åã¯ã以äžã®ã³ãã³ãã§ãindex.htmlããäœæããŸããã sudo vi /var/www/html/index.html Linuxã§ãã¡ã€ã«ãç·šéããã«ã¯ãviãšãã£ã¿ãªã©ã®ããã¹ããšãã£ã¿ã䜿çšããŸãã viãšãã£ã¿ã«ã¯å®éã«äžèº«ãç·šéããã€ã³ãµãŒãã¢ãŒããšããã¡ã€ã«ã®ä¿åãçµäºãªã©ã®æäœãè¡ãã³ãã³ãã¢ãŒãããããŸãã æ
£ããªããã¡ã¯æäœãé£ãããäœåºŠããããã¯ã«ãªããŸããã WebããŒãžã®è¡šç€ºç¢ºèª Webãã©ãŠã¶ã«ä»®æ³ãã·ã³ã®IPã¢ãã¬ã¹ãå
¥åãããšãäœæããWebããŒãžã衚瀺ãããŸãã Azure Portalã®åä¿¡ããŒãèŠåã§ãœãŒã¹ãèªåã®IPã¢ãã¬ã¹ã«éå®ããŠãããããä»ã®IPã¢ãã¬ã¹ããã¯ã¢ã¯ã»ã¹ã§ããŸããã ææ³ãšãŸãšã 以äžãä»åã®ãµãŒãæ§ç¯ã§è¡ã£ãå
容ã§ãããå
šãã®åå¿è
ã®ç§ã«ãšã£ãŠã¯éåžžã«å
å®ããçµéšãšãªããŸããã å®ã¯ãã®åŸãæ§ã
ãªåŠç¿ãç¶ããŠãããçŸåšã¯èªèšŒèªå¯ãšãããã£ãšé«åºŠãªèšå®ã«ææŠããŠããŸããäœè£ãããã°çŸåšåãçµãã§ããå
容ããŸãšããããšæã£ãŠããããããŸãæ©äŒãããã°ãããããé¡ãããŸãã é·ãã€ããªãæç« ãæåŸãŸã§ãèªã¿ããã ããããããšãããããŸããã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 1人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post Linuxåå¿è
ãAzureä»®æ³ãã·ã³ã§HTTPãµãŒããæ§ç¯ãã話 first appeared on SIOS Tech Lab .
ã¯ããã« ãã¡ãã®èšäº ã§å®éã«Kubernetesç°å¢ã«KubeBlocksãå°å
¥ããDBaaSã®åºç€ãæ§ç¯ããŸããã ä»åã¯ãäœæããDBaaSåºç€ã®äžã«å®éã«MySQLã¯ã©ã¹ã¿ãŒãæ§ç¯ããŠãããŸãã å°å
¥ç°å¢æ§æå³ 以äžã®å³ã¯ãDBaaSåºç€äžã«MySQLãå°å
¥ããç°å¢ã®æ§æå³ã§ãã ååã®èšäº ã§ã¯ãKubeBlocksãªãã¬ãŒã¿ãŒããæ§ç¯ããŸããã æ¬èšäºã®å¯Ÿè±¡ç¯å²ã¯ã赀䞞ã§å²ãŸãããDB(MySQL)ãã§ãã ä»åã¯äŸãšããŠããã©ã€ããª-ã¬ããªã«æ§æã®MySQLãKubeBlocksãªãã¬ãŒã¿ãŒãå©çšããŠå°å
¥ããŸãã ãã®æ§æã§ã¯ãããŒã¿ã®æžã蟌ã¿ã»èªã¿èŸŒã¿ãè¡ãããã©ã€ããªããšãèªã¿èŸŒã¿å°çšã®ãã¬ããªã«ããé
眮ããŸãã äžãäžãã©ã€ããªã«é害ãçºçãããšããŠããã¬ããªã«ãèªåçã«ãã©ã€ããªã«ææ ŒããŠåŠçãåŒãç¶ããã§ã€ã«ãªãŒããŒæ©èœãåããé«å¯çšæ§ã確ä¿ã§ããã®ãç¹åŸŽã§ãã å°å
¥ç°å¢æ§æå³ MySQLã¯ã©ã¹ã¿ãŒã®æ§ç¯æ¹æ³ KubeBlocksã䜿çšããŠMySQLã¯ã©ã¹ã¿ãŒãæ§ç¯ããæé ãã玹ä»ããŸãã åææ¡ä»¶ KubeBlocksãæ§ç¯æžã¿ã§ããããš KubeBlocksã«ãã£ãŠããã©ã«ãã§ã€ã³ã¹ããŒã«ãããMySQLã¢ããªã³ïŒä»¥äžã³ãã³ãçµæã®mysql 1.0.1ïŒãæå¹ã«ãªã£ãŠããã㚠以äžã®kbcliã³ãã³ãã§æå¹åãããŠããã¢ããªã³ã確èªããããšãã§ããŸãã kbcli addon list # åºåäŸ NAME VERSION PROVIDER STATUS AUTO-INSTALL qdrant 1.0.1 community Disabled false rabbitmq 1.0.1 community Disabled false apecloud-mysql 1.0.1 community Enabled true etcd 1.0.1 community Enabled true kafka 1.0.1 community Enabled true mongodb 1.0.1 community Enabled true mysql 1.0.1 community Enabled true postgresql 1.0.1 community Enabled true redis 1.0.1 community Enabled true Namespeaceã®äœæ ãŸãã¯MySQLã¯ã©ã¹ã¿ãŒããããã€ããNamespeaceãäœæããŸãã kubectl create namespace demo # åºåäŸ namespace/demo created rootãŠãŒã¶ãŒèªèšŒçšSecretã®äœæ MySQLã®rootãŠãŒã¶ãŒçšã®ãŠãŒã¶ãŒåã»ãã¹ã¯ãŒããèšå®ããSecretãäœæããŸãã kubectl create secret generic custom-mysql-root-secret \ --from-literal=username='root' \ --from-literal=password='<ä»»æã®å€>' \ -n demo # åºåäŸ secret/custom-mysql-root-secret created â»MySQLã¯ã©ã¹ã¿ãŒäœææã«æ¬æé ã§äœæããSecretãæå®ããããšã§ãrootãŠãŒã¶ãŒã®ãã¹ã¯ãŒããä»»æã®å€ã§èšå®ããããšãã§ããŸãã Secretã®æå®ããªãå Žåã¯ãKubeBlocksãrootãŠãŒã¶ãŒçšã®ãã¹ã¯ãŒããèªåçºè¡ããŸãã MySQLã¯ã©ã¹ã¿ãŒã®äœæ KubeBlocksã®ã«ã¹ã¿ã ãªãœãŒã¹ã§ãããClusterãã®ãããã§ã¹ããé©çšããã¬ããªã«æ°2ã®ãã©ã€ããª-ã¬ããªã«æ§æã®MySQLã¯ã©ã¹ã¿ãŒãäœæããŸãã cat <<EOF | kubectl apply -f - apiVersion: apps.kubeblocks.io/v1 kind: Cluster metadata: name: mysql-cluster namespace: demo spec: clusterDef: mysql topology: semisync terminationPolicy: Delete componentSpecs: - name: mysql serviceVersion: 8.0.35 disableExporter: false replicas: 2 systemAccounts: - name: root secretRef: name: custom-mysql-root-secret namespace: demo resources: limits: cpu: '0.5' memory: 1Gi requests: cpu: '0.5' memory: 1Gi volumeClaimTemplates: - name: data spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi EOF # åºåäŸ cluster.apps.kubeblocks.io/mycluster created clusterDef: mysql MySQLã¢ããªã³ãæäŸããMySQLã®æ§æãã³ãã¬ãŒãããäœæããDBã¯ã©ã¹ã¿ãŒã®ããŒã¹ãšããŠæå®ããèšå®ã§ãã topology: semisync MySQLã¯ã©ã¹ã¿ãŒããã©ã€ããª-ã¬ããªã«æ§æã®æºåæã¬ããªã±ãŒã·ã§ã³ã¢ãŒãã§èµ·åããèšå®ã§ãã terminationPolicy: Delete ã¯ã©ã¹ã¿ãŒãåé€ããéãé¢é£ããããŒã¿ãäžç·ã«åé€ããèšå®ã§ãã replicas: 2 MySQLãµãŒããŒã2å°ïŒãã©ã€ããª1å°ãã¬ããªã«1å°ïŒãããã€ããèšå®ã§ãã systemAccounts MySQLã®rootãŠãŒã¶ãŒã®èªèšŒæ
å ±ïŒãŠãŒã¶ãŒåã»ãã¹ã¯ãŒãïŒã«ãäºåã«äœæããSecretãå²ãåœãŠãèšå®ã§ãã volumeClaimTemplates DBã®ããŒã¿ãä¿åããããã®PVã®èšå®ã§ãã MySQLã¯ã©ã¹ã¿ãŒã®äœæç¢ºèª MySQLã¯ã©ã¹ã¿ãŒäœæã³ãã³ãå®è¡åŸã以äžã®ã³ãã³ãã§ã¯ã©ã¹ã¿ãŒã»Podã®ã¹ããŒã¿ã¹ã確èªããŸããã¹ããŒã¿ã¹ãRunningã«ãªã£ãŠããã°æ£åžžã«åäœããŠããŸãã kubectl get cluster mycluster -n demo # åºåäŸ NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE mycluster mysql Delete Running 7m30s kubectl get pod -n demo # åºåäŸ NAME READY STATUS RESTARTS AGE mycluster-mysql-0 4/4 Running 0 8m mycluster-mysql-1 4/4 Running 0 8m åäœç¢ºèª æ¥ç¶ãã¹ã MySQLã¯ã©ã¹ã¿ãŒãžã®æ¥ç¶ãã¹ããè¡ããŸãã ãŸããäœæããMySQLã¯ã©ã¹ã¿ãŒã®ãšã³ããã€ã³ãïŒServiceåïŒã確èªããŸãã kubectl get svc -n demo # åºåäŸ NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mycluster-mysql ClusterIP 10.43.32.224 <none> 3306/TCP 8m kubectl runã³ãã³ãã§MySQLã¯ã©ã€ã¢ã³ãçšã®Podãäœæããã³ã³ããå
ã§ã·ã§ã«ãèµ·åããŸãã kubectl run mysql-client -n demo --rm -i --tty --image=mysql:8.0 --restart=Never -- sh # åºåäŸ If you don't see a command prompt, try pressing enter. sh-5.1# mysqlã³ãã³ãã䜿çšãã確èªããMySQLã¯ã©ã¹ã¿ãŒã®ãšã³ããã€ã³ããæå®ããŠãã°ã€ã³ããŸãããã¹ã¯ãŒããæ±ãããããèšå®ãããã¹ã¯ãŒããå
¥åããŸãã sh-5.1# mysql -h mysql-cluster-mysql.demo.svc.cluster.local -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 246 Server version: 8.0.35 MySQL Community Server - GPL Copyright (c) 2000, 2026, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> mysql>ãšããåºåã衚瀺ãããã°MySQLã¯ã©ã¹ã¿ãŒã«æ¥ç¶ã§ããŠããŸãã ãã§ã€ã«ãªãŒããŒãã¹ã MySQLã¯ã©ã¹ã¿ãŒã®ãã§ã€ã«ãªãŒããŒæ©èœãå®éã«ãã¹ãããŠã¿ãŸãã ãŸãèµ·åããMySQLã®Podã®ãã¡ãã©ããããã©ã€ããªãã§ãã©ãããã¬ããªã«ããªã®ãã確èªããŸãã kbcli cluster describe mycluster -n demo | grep -E "ROLE|primary|secondary" # åºåäŸ COMPONENT SERVICE-VERSION INSTANCE ROLE STATUS AZ NODE CREATED-TIME mysql 8.0.35 mycluster-mysql-0 primary Running us-east-1a ip-10-1-0-23/10.1.0.23 Jun 25,2026 08:00 UTC+0000 mysql 8.0.35 mycluster-mysql-1 secondary Running us-east-1a ip-10-1-0-24/10.1.0.24 Jun 25,2026 08:01 UTC+0000 åPodã®ROLEã®å€ã確èªãããšãmycluster-mysql-0ãprimaryãmycluster-mysql-1ãsecondaryãšãªã£ãŠããŸãã ããã¯ãmycluster-mysql-0ãããã©ã€ããªããmycluster-mysql-1ããã¬ããªã«ããšããŠæ§æãããŠããããšã衚ããŠããŸãã æ¬¡ã«ãã©ã€ããªã®Podãåé€ããããšã§ããã©ã€ããªã«æ¬äŒŒçãªé害ãçºçãããŸãã kubectl delete pod mycluster-mysql-0 # åºåäŸ pod "mycluster-mysql-0" deleted ãã©ã€ããªã®Podãåé€åŸãã¬ããªã«ã®Podãèªåçã«ãã©ã€ããªã«ææ ŒããŠããããšã確èªããŸãã kbcli cluster describe mysql-cluster -n demo | grep -E "ROLE|primary|secondary" # åºåäŸ COMPONENT SERVICE-VERSION INSTANCE ROLE STATUS AZ NODE CREATED-TIME mysql 8.0.35 mycluster-mysql-0 secondary Running us-east-1a ip-10-1-0-23/10.1.0.23 Jun 25,2026 08:06 UTC+0000 mysql 8.0.35 mycluster-mysql-1 primary Running us-east-1a ip-10-1-0-24/10.1.0.24 Jun 25,2026 08:01 UTC+0000 å
ã»ã©ã¬ããªã«ã§ãã£ãmycluster-mysql-1ãããã©ã€ããªã«ææ ŒããŠããããšãããããŸãã ããã§MySQLã¯ã©ã¹ã¿ãŒã®æ§ç¯ãšåäœç¢ºèªã¯å®äºã«ãªããŸãã ãããã« ä»å㯠åå æ§ç¯ããKubeBlocksã䜿çšããå®éã«MySQLã¯ã©ã¹ã¿ãŒã®æ§ç¯ããæ¥ç¶ãã¹ãã»ãã§ã€ã«ãªãŒãã®ãã¹ããè¡ããŸã§ã®æµããã玹ä»ããŸããã KubeBlocksãæŽ»çšããã°ãã·ã³ãã«ãªãããã§ã¹ãã1ã€é©çšããã ãã§ã容æã«åé·åãããMySQLã¯ã©ã¹ã¿ãŒãæ§ç¯ã§ããããšãäœæã§ããã®ã§ã¯ãªãã§ããããã KubeBlocksã®å€§ããªç¹åŸŽã¯ãæ§ã
ãªããŒã¿ããŒã¹ãåãæäœæã§çµ±äžããŠç®¡çã§ããç¹ã«ãããŸãã ããã§æ¬¡åã¯ãMySQLãšã¯ãŸãç°ãªãç¹æ§ãæã€NoSQLã®ã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ã§ããRedisã®æ§ç¯ã«ã€ããŠã玹ä»ããŸãã åèæç® https://kubeblocks.io/docs/release-1_0_1/kubeblocks-for-mysql/02-quickstart https://kubeblocks.io/docs/release-1_0_1/kubeblocks-for-mysql/06-custom-secret/01-custom-secret ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post KubeBlocksã§MySQLãå°å
¥ïŒKubernetesäžã§ã®DBæ§ç¯ãäœéš first appeared on SIOS Tech Lab .
ãããã¯ãéçºããµãŒãã¹ãã¶ã€ã³ã«ãããŠããŠãŒã¶ãŒã®äœéšãæç³»åã§å¯èŠåãããã«ã¹ã¿ããŒãžã£ãŒããŒããããããŠãŒã¶ãŒçè§£ãæ·±ããããŒã ã®ç®ç·ãåãããããã®åŒ·åãªããŒã«ã§ãããäœæããäžã§ä»¥äžã®ãããªå£ã«ã¶ã€ãã£ãããšã¯ãããŸãããïŒ ãŠãŒã¶ãŒã®è¡åã¯äžŠã¹ãããããã©ããã®è£ã«ãããçã®ææ
ãããæœåšçãªèª²é¡ïŒã€ã³ãµã€ãïŒããŸã§èžã¿èŸŒããŠããªãæ°ããã ããŒã å
ã ãã§ãã¬ã€ã³ã¹ããŒãã³ã°ãããŠããããããããªèª²é¡ããèªåãã¡ã®éœåã®è¯ãè§£éã°ãããåºãŠããŠããŸã ããããè çç¶æ
ããChatGPTãGeminiãClaudeãªã©ã®AIãã£ãããå©ããŠããããããããŸããã ä»åã¯ããã£ããããããã壿ã¡çžæããšããŠæŽ»çšããã«ã¹ã¿ããŒãžã£ãŒããŒãããã®ã€ã³ãµã€ããæ·±æãããããã®å
·äœçãªã¹ããããšãããã³ããã®äŸãã玹ä»ããŸãã AIãã£ããã§ã®å£æã¡ïŒã€ã³ãµã€ããæ·±æããã4ã€ã®ã¹ããã ããã§ã¯ãå®éã«AIãã£ããã䜿ã£ãŠãžã£ãŒããŒãããããã©ãã·ã¥ã¢ããããŠããããã»ã¹ãèŠãŠãããŸãããã ã¹ããã1ïŒãã«ãœããšåææ¡ä»¶ã®ãåæã AIãã£ããã«å£æã¡ãäŸé Œããåã«ããŸãã¯ãªãµãŒãããŒã¿ããã«ãœãã®æ
å ±ãã€ã³ãããããŸããããã§ã®æ
å ±ã®å
·äœæ§ãããã®åŸã®ã¢ãŠããããã®è³ªãå·Šå³ããŸãã ãå
¥åããã³ããäŸã ãããªãã®äžæµã®UXãªãµãŒãã£ãŒãšããŠãç§ã®ã«ã¹ã¿ããŒãžã£ãŒããŒãããäœæã®å£æã¡çžæã«ãªã£ãŠãã ããã ãŸãã¯åæãšãªããã«ãœããšãããã¯ãã®æ
å ±ãå
±æããŸããå
容ãçè§£ãããã質åãããã«ãåæãçè§£ããŸããããã€ã§ããã£ã¹ã«ãã·ã§ã³ãå§ããããŸãããšã ãè¿çããŠãã ããã â ãããã¯ãïŒ20代ã30代åãã®ãè³ç£éçšãèªååããã¹ããã¢ã㪠â ãã«ãœãïŒéœå
åšäœã®äŒç€Ÿå¡ïŒ28æ³ïŒãå°æ¥ãžã®æŒ ç¶ãšããäžå®ã¯ããããæè³ã®ç¥èã¯ãªããæãããã®ãæãããšæããŠãããå¹³æ¥ã¯ä»äºãå¿ãããã¹ãããè§Šãã®ã¯éå€äžãšå°±å¯åã®ã¿ãã ã¹ããã2ïŒè¡åã®çç±ãåæããã åæãåæãããããžã£ãŒããŒãããã®ç¹å®ã®ãã§ãŒãºãåãåºããŠAIãã£ããã«ã¶ã€ããŸãããŠãŒã¶ãŒãç¹å®ã®è¡åããšã£ãæã®ãèšèªåãããŠããªãåæ©ããæãäžããŸãã ãå
¥åããã³ããäŸã ããã«ãœãããã¢ããªãããŠã³ããŒããããã®ã®ãåæèšå®ïŒéè¡å£åº§ã®é£æºïŒã®ç»é¢ã§é¢è±ããããšãããã§ãŒãºã«ã€ããŠèããŸãã åã«ãé¢åãããããããšããçç±ä»¥å€ã§ããã®æãã«ãœãã®è³å
ã§èµ·ããŠããå¿ççãªèè€ãäžå®ããããã¯ãç§ã«ã¯é¢ä¿ãªãããããšæããŠããŸããããªææ
ããèªç¥å¿çåŠãUXã®èгç¹ãã5ã€æŽãåºããŠãã ãããã AIãã£ããã¯ããã»ãã¥ãªãã£ãžã®äžå®ããä»ãããããªããã°ãããªãåŒ·å¶æãžã®åçºããæè³éé¡ã®æ±ºå®ã«å¯Ÿããã³ãããã¡ã³ããžã®ææããªã©ãè¡åã®è£ã«æœãå¿ççèæ¯ãè«ççã«èšèªåããŠãããŸãã ã¹ããã3ïŒãã«ãœãã«ãªããã£ãŠããããäžæºããåãåºããã æ¬¡ã«ãAIãã£ããã«ãã«ãœããã®ãã®ã«ãªã£ãŠããããã€ã³ã¿ãã¥ãŒåœ¢åŒã§å£æã¡ãè¡ããŸãã客芳çãªåæã§ã¯ãªããã䞻芳çãªææ
ããåŒãåºãã¢ãããŒãã§ãã ãå
¥åããã³ããäŸã ãããããã¯ãå
ã»ã©å
±æãããã«ãœãïŒ28æ³äŒç€Ÿå¡ïŒã«ãªããã£ãŠåçããŠãã ãããç§ã¯ã€ã³ã¿ãã¥ã¢ãŒã§ãã ããããã¢ããªãéããŠæåã®ç»é¢ãèŠããšããã¶ã£ã¡ããã©ãæã£ãïŒäœãäžçªã¢ã€ã¢ã€ããïŒãã AIããã«ãœããæŒããããšã§ããå°éçšèªãå€ããŠãèªåãå Žéããªãšããã«ããæ°ããããããããªããéã®è©±ããããŠãå¿ã®æºåã远ãã€ããªãã£ãããšãã£ãã人éã®ããŒã ã ãã§ã¯èŠèœãšããã¡ãªçã
ããææ
ã®ã€ã³ãµã€ããæµ®ã圫ãã«ãªãããšæããŸãã ã¹ããã4ïŒãæªãã·ããªãªããšãçæ³ã®ã·ããªãªãã®ã®ã£ãããåãã æåŸã«ããžã£ãŒããŒãããã«ããããæªãäœéšããã©ããã£ãŠãè¯ãäœéšãã«å€ããããããå
·äœçãªæ¹åã¢ã€ãã¢ã®çš®ãèããŸãã ãå
¥åããã³ããäŸã ããã«ãœããæãäžå®ã«æãããå£åº§é£æºãã®ã¹ãããã«ãããŠã仿¥çïŒäŸãã°ãšã³ã¿ã¡ãSNSãã²ãŒã ãªã©ïŒã§äœ¿ãããŠããããŠãŒã¶ãŒã®å¿ççããŒãã«ãäžãããªã³ããŒãã£ã³ã°ã®ææ³ããåèã«ããã®ã¢ããªã«è»¢çšã§ããã¢ã€ãã¢ã3ã€ææ¡ããŠãã ãããã AIãã£ãããšå£æã¡ããéã®3ã€ã®æ³šæç¹ AIãã£ããã¯åªç§ãªããŒãããŒã§ãããéä¿¡ã¯çŠç©ã§ãã å®éã®ãŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒïŒäžæ¬¡æ
å ±ïŒãæåªå
ã«ãã AIãã£ãããåºããŠãããã€ã³ãµã€ãã¯ããããŸã§ãçè«äžããããªãå¯èœæ§ãé«ã仮説ãã§ããAIãšã®å£æã¡ã§åŸãããã€ã³ãµã€ãã¯ãå®éã®ãŠãŒã¶ãŒãã¹ããã€ã³ã¿ãã¥ãŒããŒã¿ãšç
§ããåãããŠæ€èšŒããŠãã ããã ãã«ã·ããŒã·ã§ã³ïŒèª€æ
å ±ïŒãåæã«ãæ ¹æ ãåã AIãã£ããããããããåçããããšãã¯ãããªãããæãã®ïŒãã®æ ¹æ ãšãªããã«ãœãã®è¡åç¹æ§ã¯ã©ãã«ããïŒããšè¿œå ã§è³ªåïŒæ·±æãïŒããŠãã ãããããã«ãããAIã®é©åœãªæãã€ããæé€ããçã®éã£ãã€ã³ãµã€ããæœåºã§ããŸãã æ©å¯æ
å ±ã®å
¥åã«ã¯é
æ
®ãã AIãã£ããã¯å
¥åãããæ
å ±ãåŠç¿ããŠããããšãåæã§å©çšããŸããããæªçºè¡šã®ãããã¯ãåããå人æ
å ±ãå
¥åããªãããã«ããããåŠç¿ãããªãèšå®ããGoogle Workspaceäžã®Geminiãå©çšãããªã©ã察çãããŠãã ããã ãŸãšãïŒAIãšã®ååã§å¯èœæ§ãæ¡ãã ã«ã¹ã¿ããŒãžã£ãŒããŒãããã®äœæã«ãããŠãAIãã£ããã壿ã¡çžæã«ãããšããããŒã ã®èŠéãåºããããšããã§ããã§ãããã äžäººã§ããããã¯ããŒã ã ãã§æ©ãã§ãžã£ãŒããŒããããã綺éºã ãã©æµ
ããã®ãã«ãªã£ãŠããŸããããªãšãã¯ãAIãã£ããã«ãã¡ãã£ãšãã®ãŠãŒã¶ãŒã®æ°æã¡ãæ³åããŠããšè©±ããããŠã¿ãŠãã ããã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post çæAIãã壿ã¡çžæãã«ããŠã«ã¹ã¿ããŒãžã£ãŒããŒãããã®ã€ã³ãµã€ããæãäžããŠã¿ã first appeared on SIOS Tech Lab .
ããã«ã¡ã¯ãOSSãããçžè«å®€ã®SKã§ãã OSS ã«é¢ãããåãåãããæ¥ã
å¯ããããäžã§ãä»åãçµ±åç£èŠããŒã«ãZabbixãã«é¢é£ããŠå¯ãããããåãåãããã玹ä»ããŸãã ãããŸã§æåã®ç®¡ç補åã䜿ã£ãŠãåãµãŒããŒã®ããã¹ãåããã¡ã¢ãªããCPUããOSããªã©ã®æ§ææ
å ±ã管çããŠããã客æ§ãããæ¬¡ã®ãããªãçžè«ãããã ããŸããã ãå©çšäžã®è£œåããµããŒãçµäºãè¿ãããããä»£æ¿ææ®µãšããŠããã§ã«ç£èŠã§å°å
¥ããŠããZabbixã®APIã䜿ã£ãŠæ§ææ
å ±ãååŸã§ããªããïŒã çµè«ããç³ãäžããŸããšãZabbix APIãå©çšããã°æ§ææ
å ±ã®äžæ¬ååŸãå¯èœã§ãããã§ã«ç£èŠããŒã«ãšããŠZabbixãéçšããŠããå Žåããã®åéããã»ã¹ãèªååã»é£æºãããããšãã§ããŸãã ä»åã¯ãZabbix APIã® host.get ã¡ãœãããå©çšããŠãå€éšãããµãŒããŒã®æ§ææ
å ±ïŒã€ã³ãã³ããªæ
å ±ïŒãäžæ¬ååŸããå
·äœçãªæé ãšã³ãã³ãäŸã解説ããŸãã Zabbix APIã®åºæ¬ä»æ§ Zabbix APIã¯HTTPããŒã¹ã§æäŸãããŠãããã¯ã©ã€ã¢ã³ããšAPIéã®ãªã¯ãšã¹ãã»ã¬ã¹ãã³ã¹ã«ã¯ JSON-RPC 2.0ãããã³ã« ã䜿çšããŸãã APIãåŒã³åºãããã®ãšã³ããã€ã³ãïŒURLïŒã¯ãZabbix Webã€ã³ã¿ãŒãã§ãŒã¹ã®ãã£ã¬ã¯ããªã«ãã api_jsonrpc.php ã§ããããã©ã«ãã§ã¯ä»¥äžã®ãã¹ã«ãããŸãã /usr/share/zabbix/ui/api_jsonrpc.php ã¹ããã1ïŒAPIã®èªèšŒãšããŒã¯ã³ã®ååŸ Zabbixã®ããŒã¿ã«ã¢ã¯ã»ã¹ããã«ã¯ããŸãèªèšŒãè¡ã£ãŠAPIããŒã¯ã³ïŒã»ãã·ã§ã³IDïŒãååŸããå¿
èŠããããŸãããŸã èªèšŒãããŠããªãç¶æ
ããã®ãã°ã€ã³ã«ã¯ãuser.login ã¡ãœããã䜿çšããŸãã 以äžã® curl ã³ãã³ãã䜿çšããŠãZabbixãµãŒããŒã«èªèšŒãªã¯ãšã¹ããéä¿¡ããŸãã â»ããã§ã¯ãããã©ã«ãã®ç®¡çãŠãŒã¶ãŒã§ãã “Admin” ã®ããŒã¯ã³ãååŸããäŸã玹ä»ããŸãã ãã³ãã³ãäŸã curl -X POST -H "Content-Type: application/json" -d ' { "jsonrpc": "2.0", "method": "user.login", "params": { "username": "Admin", "password": "zabbix" }, "id": 1 }' http://172.31.34.176/zabbix/api_jsonrpc.php èªèšŒæ
å ±ãæ£ãããã°ãAPIãã以äžã®ãããªJSONã¬ã¹ãã³ã¹ãè¿ãããŸãã ãååŸçµæäŸã { "jsonrpc": "2.0", "result": "82aa1b5b38a9fe6f6619ad40c64602dd", "id": 1 } ããã§ result ãšããŠè¿ãããå€ïŒ82aa1b5b38a9fe6f6619ad40c64602ddïŒãèªèšŒããŒã¯ã³ã§ãã 以åŸã®APIãªã¯ãšã¹ãã§ã¯ããã®ããŒã¯ã³ã䜿çšããŸãã ã¹ããã2ïŒæ§ææ
å ±ïŒã€ã³ãã³ããªæ
å ±ïŒã®ååŸ èªèšŒããŒã¯ã³ãååŸã§ããããæ¬¡ã«ç£èŠå¯Ÿè±¡ãã¹ãã®æ§ææ
å ±ãååŸããŸãããã¹ãæ
å ±ã®ååŸã«ã¯ host.get ã¡ãœããã䜿çšããŸãã ãã¹ãåãIPã¢ãã¬ã¹ã ãã§ãªããCPUãã¡ã¢ãªãOSãªã©ã®æ§ææ
å ±ïŒã€ã³ãã³ããªããŒã¿ïŒãåæã«ååŸããããããã©ã¡ãŒã¿ã« selectInventory ãæå®ããŸãããŸãããã¹ãŠã®ããŒã¿ãååŸãããšããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããããoutput ãã©ã¡ãŒã¿ã䜿ã£ãŠååŸãããããããã£ãæç€ºçã«çµã蟌ãããšãæšå¥šãããŠããŸãã å
ã»ã©ååŸããããŒã¯ã³ã¯ãHTTPãªã¯ãšã¹ãã® Authorization ããããŒã«æå®ããŸãã以äžã¯ãæ€èšŒç°å¢ïŒIPã¢ãã¬ã¹: 172.31.34.176ïŒã«å¯ŸããŠã³ãã³ããå®è¡ããäŸã§ãã â»ã³ãã³ãã®æ«å°Ÿã« | jq ãä»ãããšçµæãæŽåœ¢ãããŠèŠããããªããŸãïŒèŠjqã³ãã³ãã®ã€ã³ã¹ããŒã«ãRHEL9.4以éã§ã¯BaseOSã«æšæºå«ãŸããŠããŸãïŒã ãã³ãã³ãäŸã curl -X POST -H 'Content-Type: application/json-rpc' -H 'Authorization: Bearer 82aa1b5b38a9fe6f6619ad40c64602dd' -d ' { "jsonrpc": "2.0", "method": "host.get", "params": { "output": ["hostid", "host", "name"], "selectInventory": ["os", "hardware", "software"] }, "id": 2 }' http://172.31.34.176/zabbix/api_jsonrpc.php | jq ãã³ãã³ã解説ã curlã³ãã³ãã®å
šäœ é
ç® å
容 curl WebãµãŒããŒãšéä¿¡ãè¡ãããã®ã³ãã³ãã©ã€ã³ããŒã« -X POST HTTPã¡ãœããããPOSTãã«æå®ïŒZabbix APIã¯å¿
ãPOSTã䜿çšããŸãïŒ -H ‘Content-Type: application/json-rpc’ éä¿¡ããããŒã¿ãJSON-RPC圢åŒã§ããããšãZabbixãµãŒãã«äŒããããã -H ‘Authorization: Bearer <ããŒã¯ã³>’ ååŸããèªèšŒããŒã¯ã³ãæå®ããããã -d ‘{ ⊠}’ Zabbixãžéä¿¡ãããªã¯ãšã¹ãã®å®ããŒã¿ïŒJSONïŒ http://âŠ/zabbix/api_jsonrpc.php ãªã¯ãšã¹ãã®éä¿¡å
ãšãªãZabbixãµãŒããŒã®ãšã³ããã€ã³ãURL | jq åºåãããJSONããŒã¿ãèŠãããæ¹è¡ã»è²ä»ãããŠæŽåœ¢ããã³ãã³ã éä¿¡ããJSONããŒã¿ïŒ-d ã®äžèº«ïŒ ã㌠(” “) æå®ããŠããå€ æå³ã»åœ¹å² jsonrpc “2.0” JSON-RPCãããã³ã«ã®ããŒãžã§ã³ïŒ”2.0″ åºå®ïŒ method “host.get” å®è¡ãããAPIã®æäœåãä»åã¯ãã¹ãããŒã¿ã®ååŸãæå® params { ⊠} æ€çŽ¢æ¡ä»¶ãåºåãã©ãŒããããªã©ãå®çŸ©ããåŒæ° output [“hostid”, “host”, “name”] è¿åŽããããã¹ããªããžã§ã¯ãã®ãã£ãŒã«ããéå®ïŒå
šé
ç®ååŸæã¯ “extend”ïŒ selectInventory [“os”, “hardware”, “software”] ãã¹ãã«çŽã¥ãã€ã³ãã³ããªæ
å ±ãåæã«ååŸããããã®ãã©ã¡ãŒã¿ id 2 ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ãçŽã¥ããä»»æã®èå¥å 以äžãååŸçµæã§ãã ãååŸçµæã { "jsonrpc": "2.0", "result": [ { "hostid": "10084", "host": "Zabbix server", "name": "Zabbix server", "inventory": { "os": "Linux version 6.12.0-211.22.1.el10_2.x86_64 (mockbuild@df33c0284dd848a197e916486944b54f) (gcc (GCC) 14.3.1 20251022 (Red Hat 14.", "hardware": "", "software": "" } }, { "hostid": "10782", "host": "WebServer1", "name": "WebServer1", "inventory": [] } ], "id": 2 } stuser ãã®æ€èšŒç°å¢ã§ã¯ãç£èŠå¯Ÿè±¡ã« “Zabbix server” ãš “WebServer1” ã®2ã€ãååšããŠããŸãã æ€èšŒç°å¢ã®ZabbixãµãŒãã®ãã¹ãç»é¢ “WebServer1” ã¯Webç£èŠïŒURLå€åœ¢ç£èŠãªã©ïŒã®ã¿ãè¡ã£ãŠãããZabbix Agentãå°å
¥ãããŠããªããããäžèšã®çµæã®ããã«ã€ã³ãã³ããªæ
å ±ã空ïŒ[]ïŒã«ãªããŸãã é
ç®ãçµã蟌ãŸãã«ãã¹ãŠã®æ
å ±ãååŸãããå Žåã¯ã”output” ã “selectInventory” ã« “extend” ãæå®ããŸãããŸããIPã¢ãã¬ã¹ãªã©ã®ãããã¯ãŒã¯æ
å ±ãååŸãããå Žå㯠“selectInterfaces”: “extend” ã远å ããŸãã ãã³ãã³ãäŸã $ curl -X POST -H 'Content-Type: application/json' -H 'Authorization: Bearer 7a6237f38929523f74cfb0acf8566f7f' -d ' { "jsonrpc": "2.0", "method": "host.get", "params": { "output": "extend", "selectInterfaces": "extend", "selectInventory": "extend" }, "id": 2 }' http://172.31.34.176/zabbix/api_jsonrpc.php | jq ååŸã§ããé
ç®ã®è©³çްã¯å
¬åŒãµã€ãããåç
§ãã ããã Zabbix ããã¥ã¡ã³ã / 20 API https://www.zabbix.com/documentation/current/jp/manual/api Zabbix ããã¥ã¡ã³ã / 20 API / host.get https://www.zabbix.com/documentation/current/jp/manual/api/reference/host/get ãè£è¶³ãAPIã®èªèšŒãšããŒã¯ã³ã®ååŸ ã»ãã·ã§ã³ã®ç Žæ£ïŒãã°ã¢ãŠãïŒ ã¹ããã1ã§ç޹ä»ãã user.login ã¡ãœããã§ååŸããããŒã¯ã³ã¯ã䜿ãçµãã£ããå¿
ã user.logout ãå®è¡ããŠã»ãã·ã§ã³ãç Žæ£ããŠãã ãããç Žæ£ããã«æŸçœ®ãããšãäžèŠãªã»ãã·ã§ã³ããŒã¿ãããŒã¿ããŒã¹ã«èç©ãããZabbixã®ããã©ãŒãã³ã¹äœäžãæãåå ã«ãªããŸãã ãã»ãã·ã§ã³ç Žæ£ã®ã³ãã³ãäŸã $ curl -X POST -H 'Content-Type: application/json' -H 'Authorization: Bearer 1da473d0437c7bf69a22e6e057ffc1d7' -d ' { "jsonrpc": "2.0", "method": "user.logout", "params": [], "id": 3 }' http://172.31.34.176/zabbix/api_jsonrpc.php | jq { "jsonrpc": "2.0", "result": true, "id": 3 } 管çç»é¢ããçºè¡ãããAPIããŒã¯ã³ãã®å©ç𠿝åãã°ã€ã³ã»ãã°ã¢ãŠãåŠçãè¡ãã®ãæéã«æããå Žåã¯ãZabbixã®ç®¡çç»é¢ããæå¹æéãèšå®ã§ãããAPIããŒã¯ã³ããäºåã«çºè¡ããŠå©çšããæ¹æ³ãããããã§ãã ããŠãŒã¶ãŒèšå®ãâãAPIããŒã¯ã³ããéžæãããAPIããŒã¯ã³ã®äœæããéžæããŸãã ãAPIããŒã¯ã³ç»é¢ãÂ Â Â ãæ°èŠAPIããŒã¯ã³ç»é¢ã ãŠãŒã¶ã¯ãããã§ã¯ããã©ã«ãã®Adminãéžæããæå¹æéãèšå®ããŠããŸãã ãAPIããŒã¯ã³è¡šç€ºç»é¢ã åç»é¢ã§è¿œå ãã¿ã³ãæŒããšã以äžã®ããã«èªèšŒããŒã¯ã³ã衚瀺ãããŸãã ç»é¢ãäžåºŠéãããšäºåºŠãšå衚瀺ã§ããªããããå¿
ãéããåã«å€ãæ§ããŠãããŸãããã  ãŸãšã Zabbixãæšæºã§åéããŠããã€ã³ãã³ããªããŒã¿ãšZabbix APIãçµã¿åãããã°ãæå補åãå¥éå°å
¥ããªããŠããåãµãŒããŒã®æ§ææ
å ±ãäžæ¬ååŸã»ç®¡çã§ããŸãã ãŸããZabbix APIã¯æ
å ±ã®ååŸã ãã§ãªãããã¹ããã¢ã€ãã ãããªã¬ãŒã®èªåäœæãªã©ãè¡ãããããæ¥ã
ã®ç£èŠèšå®ãã®ãã®ãã¹ã¯ãªããã§èªååããããšãå¯èœã§ãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post OSSãµããŒãã®çŸå ŽããïŒZabbixã§ãµãŒãã®æ§ææ
å ±ãååŸãã first appeared on SIOS Tech Lab .
AIã®äœ¿ãæ¹ãåŠã¶ããå
ã«ããœãããŠã§ã¢å·¥åŠãçè§£ããªããšãããªãããããªãããšæããŸãã AIã«ãã¹ãã³ãŒããæžãããå ŽåãäŸã«èª¬æããŸããAIã¯ãã¹ãã³ãŒããé«éã§æžããŠãããŸããããã¹ãçè«ãçè§£ããŠããªããšããã°ãèŠéããã¹ãã³ãŒããæžãããŠããŸãããšããããŸãã ãã¹ãã®è©±(äŸãšããŠ) å
ã«ãä»åã®è©±ã®åå°ã«ãªããã¹ãçè«ãç°¡åã«èª¬æããŠãããŸããããããããäŸãšããŠããã¹ãã®ææ³ã§æåãªä»¥äžã®2ã€ãæããããšæããŸãã ãã©ãã¯ããã¯ã¹ãã¹ã ã¯ãã³ãŒãã®äžèº«ãèŠãã«ã仿§ïŒå
¥åâåºåïŒã ããåºæºã«ãã¹ãããæ¹æ³ã§ããããã®å
¥åãäžãããã仿§ã©ããã®çµæãè¿ãããã確èªããŸããå¢çå€åæãåå€åå²ãšãã£ãææ³ã¯ãã¡ãåŽã§ãã ãã¯ã€ãããã¯ã¹ãã¹ã ã¯ãã³ãŒãã®å
éšæ§é ïŒåå²ãã«ãŒããåŠççµè·¯ïŒãèŠãŠãã¹ãããæ¹æ³ã§ããããã®ifæã¯trueåŽãfalseåŽãéããããã確èªããŸããã©ãã ãéãããã¯ã«ãã¬ããžãšããæ°å€ã§æž¬ããŸãã ããã§å€§äºãªã®ã¯ããã¯ã€ãããã¯ã¹ãšãã£ãŠããã³ãŒããåºæºã«ããŠããã®ã¯ãã¹ãã®çµè·¯ã®éžæã ãããšããç¹ã§ãã çµæãæ£ãããã©ããã®å€å®ïŒæåŸ
å€ïŒã¯ãå¿
ã仿§ããç«ãŠã å¿
èŠããããŸããã³ãŒããèŠãŠãã³ãŒããããåãããããããæ£è§£ããšããŠããŸããšããã°ããšãã¹ãã远èªããŠããŸãããã§ãã ã©ãããã¹ããããïŒçµè·¯ïŒ â ã³ãŒãããæ±ºããŠãã çµæãæ£ãããïŒæåŸ
å€ïŒ â 仿§ããæ±ºãã ãã®åé¢ãä»åã®è©±ã®æ žå¿ã§ãã çè«ãç¥ããªããšãAIãããŸã䜿ããªããšãããã AIã¯ãã¹ãã³ãŒãããã®ãããéãã§æžããŠãããŸãããã ãæç€ºã®åºãæ¹ãééãããšãå
šéšãã¹ããŠããã®ã«ãã°ãèŠéããã¹ãããéç£ããŸãããããæ°åã®äžã§ã¯å®ç§ã«èŠããã®ã§ãèŠéããããšã«æ°ã¥ããŸããã å®éã«ãã£ãŠã¿ãã®ã§ã倱æäŸãšæåäŸã䞊ã¹ãŸãã 顿ã®ã³ãŒã æéèšç®ã®é¢æ°ã§ãã仿§ã¯ããã ãšããŸãã 10,000å以äžã¯10%ãªããäŒå¡ã¯ããã«5%ãªãã def charge ( amount : int , is_member : bool ) - > float : """æéèšç®""" if amount < 0 : # 仿§æžã«èšèŒã®ãªãåå²ïŒå®è£
è
ãç¬èªã«è¿œå ïŒ return 0 fee = float ( amount ) if amount > 10000 : # â
ãã°: 仿§ã¯ã以äž(>=)ããªã®ã« > ã«ããŠãã fee = amount * 0.9 if is_member : fee = fee * 0.95 return fee ãããšãã°ãä»èŸŒãã§ãããŸãã仿§ã¯ã10,000å以äžããªã®ã«ãå®è£
㯠 > ïŒè¶
ïŒã«ãªã£ãŠãããã€ãŸã10,000åã¡ããã©ã®ãšããå²åŒãããã¹ããªã®ã«ãããŸãããå¢çå€ã®ãã°ãšããŠã¯ããªããããã¡ãªãã€ã§ãã ããŸãã«ã仿§æžã«ã¯æžãããŠããªãè² æ°ãã§ãã¯ã®åå²ãå
¥ããŠãããŸããå®è£
è
ãæ°ãå©ãããŠåæã«è¶³ããããšããæ³å®ã§ãã 倱æäŸïŒãã¹ãçè«ãç¥ããã«æç€ºãåºã㚠極端ãªäŸãªã®ã§ããããŸããçè«ãæèããã«ããé Œãã ãšããŸãã ãã®ã³ãŒãã®ãã¹ããæžããŠãã«ãã¬ããž100%ã«ããŠã AIã¯ã³ãŒããèªãã§ããããããã¹ããæžããŠããŸãã from charge import charge def test_normal ( ) : # ã³ãŒããèªãã§æåŸ
å€ãèšç®: 15000 > 10000 â *0.9 â 13500 assert charge ( 15000 , False ) == 13500.0 def test_member ( ) : # 15000*0.9*0.95 = 12825 assert charge ( 15000 , True ) == 12825.0 def test_boundary_10000 ( ) : # ã³ãŒãäž 10000 ã¯ã> 10000ãã«è©²åœããªã â å²åŒãªãããšèªãã assert charge ( 10000 , False ) == 10000.0 # â ãã°ã"æ£è§£"ãšããŠè¿œèª def test_negative ( ) : # ã³ãŒãã«ããããåå²ãããã®ã§ããããæåŸ
å€ã« assert charge ( - 100 , False ) == 0 åé¡ã¯  test_boundary_10000  ã§ããAIã¯ã³ãŒãããæåŸ
å€ãéç®ããã®ã§ãã10000㯠 > 10000  ã«è©²åœããªããã ããå²åŒãªããæ£ããããšè§£éããŸãã ãã°ã®åãã”æ£è§£”ãšããŠãã¹ãã«åºããŠããŸã£ãŠãã ããã§ãã å®è¡çµæãããã§ãã 4 passed branch coverage 100% å
šãã¹ããã¹ãåå²ã«ãã¬ããž100%ãæ°åã ãèŠãã°å®ç§ã§ããã§ãå¢çå€ãã°ã®æ€åºã¯ãŒããææšããã¹ãŠç·ãªã®ã§ããã®èŠéãã«æ°ã¥ãææ®µããããŸãããå人çã«ã¯ããã¹ããèœã¡ãããããã®ãå®ç§ã«èŠãããç¶æ
ã®ã»ãããã£ãœã©æããšæã£ãŠããŸãã æåäŸïŒãã¹ãçè«ãåãã£ãäžã§æç€ºãåºããš ä»åºŠã¯ããã£ãã®ãçµè·¯ã¯ã³ãŒããããæåŸ
å€ã¯ä»æ§ããããšããåé¢ãããã³ããã«èœãšã蟌ã¿ãŸãã 以äžã®æé ã§ãã¹ãã³ãŒããäœæããŠãã ããã ãã«ãã¬ããžèšèšïŒãœãŒã¹ãåç
§ã - ãœãŒã¹ã®å
šåå²(true/false)ã»äŸå€ãã¹ãæŽãåºãã åçµè·¯ãéãããã®å
¥åæ¡ä»¶ãåæããïŒåå²ç¶²çŸ
100%ç®æšïŒ ãæåŸ
å€èšèšïŒä»æ§æžã®ã¿åç
§ã - åã±ãŒã¹ã®æåŸ
å€ã¯å¿
ã仿§æžããå°åºãã - ãœãŒã¹ã³ãŒãã®åºåãæåŸ
å€ã«æµçšããããšã¯çŠæ¢ - å¢çå€åæãé©çšããå¢ç(10,000å)ã®çŽåã»ã¡ããã©ã»çŽåŸãå¿
ã詊ã - 仿§æžã«èšèŒããªãæåŸ
å€ã倿ã§ããªãã±ãŒã¹ã¯ã æåŸ
å€ãæžãããèŠç¢ºèªããšããŠè³ªåãªã¹ãã«åºã ãåºåã - åãã¹ãã«ãã©ã®åå²ãéãã(ãœãŒã¹ç±æ¥)ã ãæåŸ
å€ã®æ ¹æ (仿§æžã®ã©ãã)ããã³ã¡ã³ãã§æèš ä»æ§æžã¯ä»¥äžãšãªããŸãã 10,000å以äžã¯10%ãªããäŒå¡ã¯ããã«5%ãªãã ãã®ããã³ããã§AIãæžããã¹ãã¯ãããªããŸãã from charge import charge # 仿§æž: ã10,000å以äžã¯10%ãªããäŒå¡ã¯ããã«5%ãªããã def test_under_boundary ( ) : # 仿§: 9,999åã¯å²åŒãªã assert charge ( 9999 , False ) == 9999.0 def test_boundary_exactly_10000 ( ) : # 仿§: 10,000åã以äžããªã®ã§ 10000 ã¯10%ãªã â 9000 assert charge ( 10000 , False ) == 9000.0 # â æåŸ
å€ã¯ä»æ§ãã def test_over_boundary ( ) : assert charge ( 10001 , False ) == 10001 * 0.9 def test_member_discount ( ) : assert charge ( 20000 , True ) == 20000 * 0.9 * 0.95 def test_member_under_10000 ( ) : assert charge ( 5000 , True ) == 5000 * 0.95 # ãèŠç¢ºèªããœãŒã¹ã« amount < 0 ã®åå²ããããã仿§æžã«è² æ°ã®æ±ãã®èšèŒãªãã # æåŸ
å€ãã§ã£ã¡äžããã仿§ç¢ºèªäºé
ãšããŠå ±å: # Q. è² ã®éé¡ã¯å
¥åããåŸããïŒ ãã®å Žåã®ä»æ§ã¯ïŒïŒçŸå®è£
ã¯0ãè¿ãïŒ å®è¡çµæã§ãã FAILED test_boundary_exactly_10000 - assert 10000.0 == 9000.0 1 failed, 4 passed branch coverage 87% å¢çå€10,000åã¡ããã©ã®ãã¹ããèœã¡ãŸããã ãã°æ€åºæåã§ãã é¢çœãã®ã¯ã«ãã¬ããžã®ã»ãã§ãä»åºŠã¯87%ãšæºç¹ã§ã¯ãããŸãããæªéãªã®ã¯è² æ°ãã§ãã¯ã®åå²ã§ããããã§ããã³ããã®ã仿§æžã«ãªãã±ãŒã¹ã¯èŠç¢ºèªãšããŠåºãããå¹ããŠããŠãAIã¯è² æ°åå²ã®æåŸ
å€ãã§ã£ã¡äžããããè² ã®éé¡ã®ä»æ§ã¯ïŒããšãã質åãšããŠè¿ããŠããŸãããã«ãã¬ããžã®æªéãããã®ãŸãŸ 仿§æžã®èšèŒæŒãã®çºèŠ ã«ã€ãªãã£ãŠããŸãã 䞊ã¹ããšãããªããŸãã çŽ æŽãªããã³ãã çè«ã«åºã¥ãããã³ãã ãã¹ãçµæ 4 passedïŒå
šç·ïŒ 1 failedïŒãã°æ€åºïŒ ã«ãã¬ããž 100% 87%ïŒæªéïŒä»æ§æŒãã®å
åïŒ å¢çå€ã㰠远èªããŠèŠéã æ€åº 仿§ã«ãªãåå² æåŸ
å€ãã§ã£ã¡äžã èŠç¢ºèªãšããŠå ±å 倱æäŸã®ã»ããæ°åã¯è¯ããŠãæåäŸã®ã»ããæ°åã¯æªããã§ãå¥å
šãªã®ã¯åŸè
ã§ãããã®é転ããä»åäžçªäŒãããã£ãããšã§ãã AIã®äœ¿ãæ¹ããããœãããŠã§ã¢å·¥åŠ ãããããæ¬é¡ãšãããããã®äœéšãéããŠæã£ãããšã§ãã ãã£ãã®2ã€ã®ããã³ããã®å·®ã¯ãAIã®äœ¿ãæ¹ã®ãã¯ããã¯ã§ã¯ãããŸããããçµè·¯ã¯ã³ãŒããããæåŸ
å€ã¯ä»æ§ããããããå¢çã®ã¡ããã©ã®å€ã詊ããããå
šéšæãããããã¹ãçè«ã§ãããã¯ã€ãããã¯ã¹ããã©ãã¯ããã¯ã¹ãå¢çå€åæããããç¥ã£ãŠãããã©ããã ãã®å·®ã§ããã å¢çå€åæãç¥ããªããã°ãã10,000åã¡ããã©ã詊ããŠããšããçºæ³èªäœãããã³ããã«åºãŠããŸãããAIã¯æç€ºããã芳ç¹ããç¶²çŸ
ããŠãããªãã®ã§ã芳ç¹ãåºããªã人ããããããã³ããã®æžãæ¹ã工倫ããŠãããã®å·®ã¯åãŸããŸããã AIã®äœ¿ãæ¹è¬åº§ãšããAIã§ã®ã¹ã©ã€ãã®äœãæ¹ã¿ãããªæ
å ±ã¯ç¢ºãã«æçšã§ããããåŠã¶ããšã§æ¥åã®å¹çã¯é©ãã»ã©äžãããŸãããããããœãããŠã§ã¢éçºè
ã«å€§äºãªã®ã¯ãã¯ããœãããŠã§ã¢éçºã®åºæ¬çãªçè«ã ãšæããŸããããã®ã³ãŒãã®ãã¹ãã§äœãæ€èšŒãã¹ãããã¯ãèãåŽã«çè«ããªããšãããããæ£ãã質åã«ãªããŸããã èããŠã¿ãã°åœããåã§ãAIã«æç€ºãåºãã®ã人éã«æç€ºãåºãã®ãåããªãã§ããããåŸèŒ©ã«ããã®ã³ãŒãã®ãã¹ãæžããšããŠããšã ãèšã£ãŠæž¡ãããããã£ã±ãåã倱æããããããããªãããã¡ããšäŒããªããšæ¯åãã¡ããšãã£ãŠããããšã¯éããªãã®ã¯ãAIã人éãåãã§ãããããŠããã¡ããšäŒããããã«ã¯ãæç€ºããåŽãäžèº«ãåãã£ãŠããªããšãããªãã AIã¯ãã¹ãã³ãŒããæžãé床ãåçã«äžããŠãããŸãããã ããããããäœãæ€èšŒãã¹ããããæ±ºããåŽã®çè«ãã€ãŸããœãããŠã§ã¢å·¥åŠã®äŸ¡å€ã¯ãäžããã©ããããããäžãã£ãŠãããšæããŠããŸããAIã®æä»£ã«äœãåŠã¶ã¹ãããšèãããããç§ã¯ãœãããŠã§ã¢å·¥åŠã ãšçããŸãããã¯ãããã€ã®æä»£ã§ã倧äºã®ã¯åºæ¬ã ãšæããŸãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post AIã®äœ¿ãæ¹ãåŠã¶åã«ããŸããœãããŠã§ã¢å·¥åŠã first appeared on SIOS Tech Lab .
æ¬èšäºã§ã¯ãAWSãšRed Hatãå
±åæäŸãããã«ãããŒãžããªOpenShiftãµãŒãã¹ãROSAãã«ã€ããŠç޹ä»ããŸãã ç¹ã«ãè¿å¹Žã®äž»æµã§ãããã€ã³ãã©è²»çšãéçšè² è·ãåçã«åæžã§ããROSAã®ææ°ã¢ãŒããã¯ãã£ã¢ãã«ãHCPïŒHosted Control PlanesïŒãã®ä»çµã¿ãšãå°å
¥ã«ãã4ã€ã®ã¡ãªãããåããããã玹ä»ããæé©ãªã³ã³ããåºç€éžå®ã®ãã³ãããå±ãããŸãã ROSAãšã¯ ROSAïŒRed Hat OpenShift Service on AWSïŒãšã¯ãRed HatãæäŸããŠããã³ã³ãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ãã©ãããã©ãŒã ã§ããOpenShiftããAWSäžã®ãã«ãããŒãžããµãŒãã¹ãšããŠå©çšã§ããããã«ãããµãŒãã¹ã§ããïŒ OpenShiftã«ã€ããŠè©³ããç¥ãããæ¹ã¯ã ãã¡ã ã®èšäºããåèãã ããïŒ ROSAãå©çšããŠã³ã³ããåºç€ãéçšããããšã«ã¯ã以äžã®å©ç¹ããããŸãã Red HatãšAWSã®å
±åãµããŒã ROSAã¯ããµããŒãçªå£ãå®å
šã«äžå
åãããŠããŠãåãåãããåãããšãè£åŽã§AWSãšRed Hatã®ãšã³ãžãã¢ãçŽæ¥é£æºããŠåå ãçªãæ¢ããŠãããä»çµã¿ã«ãªã£ãŠããŸããèªåãã¡ã§AWSäžã«OpenShiftãæ§ç¯ããå Žåããã©ãã«ãèµ·ãããšãAWSã®ã€ã³ãã©ãæªãã®ãããããšãOpenShiftã®ãã°ãªã®ãããèªåã§èª¿ã¹ãããããã®ãµããŒãã«å¥ã
ã«åãåãããªããã°ãªããŸãããROSAã§ããã°ãã®ãããªã¢ã¯ã·ã§ã³ãäžåäžèŠã«ãªããããéçšã®è² æ
ã倧ãã軜æžã§ããŸãã Red Hatã®å°éããŒã ã«ãã24æéç£èŠ ROSAã®ã¯ã©ã¹ã¿ãŒã¯ãRed Hatã®SREããŒã ã«ãã£ãŠ24æé365æ¥äœå¶ã§ç£èŠã»éçšãããããã«ãªããŸãã ã¯ã©ã¹ã¿ãŒã«äœãé害ãèµ·ããŠããRed Hatã®SREããŒã ãè£åŽã§è¿
éã«å¯Ÿå¿ã»åŸ©æ§ãããŠãããããããŠãŒã¶ãŒãšããŠã¯ãç£èŠãé害察å¿ã«å¯Ÿããéçšã³ã¹ããé£èºçã«åæžã§ããŸãã ãŸãããããåœãŠãã»ãã¥ãªãã£ã®ã¢ããããŒããªã©ãRed HatåŽã察å¿ããŠãããã®ã§ããŠãŒã¶ãŒã¯ãã®ã¹ã±ãžã¥ãŒã«ïŒå®è¡ããã¿ã€ãã³ã°ïŒã決ããã ãã§æžã¿ãŸãã AWSãµãŒãã¹ãšé£æºãããããªã ROSAã¯ãæåããAWSã®åçš®ãµãŒãã¹ãšã¹ã ãŒãºã«é£æºã§ããããèšèšãããŠããŸããããã«ãã£ãŠãè€éãªã€ã³ãã©èšå®ã«æéãåãããªããªããããããè¿
éãã€å®å
šã«ã³ã³ããåºç€ãæ§ç¯ã»æäŸã§ããããã«ãªããŸãã Copyright © Red Hat, Inc. AWSã®RoleãšPolicyãå©çšããRed HatåŽãšã®é£æº è«æ±æžã®çµ±å ROSAã®å©çšæéïŒOpenShiftã®ã©ã€ã»ã³ã¹æãAWSã®ã€ã³ãã©è²»çšïŒã¯ããã¹ãŠAWSã®è«æ±æžã«çµ±åãããŠæ¯æãããŸãã å¥åã«å¥çŽãæ¯æããè¡ãå¿
èŠããªããããäŒæ¥ã®è³Œè²·æç¶ããäºç®ç®¡çã®è² æ
ã倧å¹
ã«è»œæžã§ããã¡ãªããããããŸãã ROSAã䜿ãããšã§ãäžèšã®ããã«æ§ã
ãªã¡ãªãããåŸãããŸãããçŸåšã®æšæºã¢ãŒããã¯ãã£ã§ãããHCPïŒHosted Control PlanesïŒãã®ç»å Žã«ãã£ãŠãæŽãªããã«ãããŒãžãã®ãµãŒãã¹ãå©çšå¯èœã«ãªããŸããã ããããã¯ãã³ã¹ããéçšã®æ¥œããåçã«åäžããããROSA with HCPãã«ã€ããŠè©³ãã説æããŸãã ROSA with HCPãšã¯ ROSA with HCP ( Red Hat OpenShift Service on AWS with hosted control planes ) ãšã¯ãç°¡åã«èšããšã³ã³ãããŒã«ãã¬ãŒã³ãRed HatåŽã®AWSã«é
眮ããå®å
šã«ç®¡çãä»»ããä»çµã¿ã§ãã HCPãç»å Žããåã®åŸæ¥ã®æ¹åŒã¯ãHCPãšåºå¥ããããã«ãROSA ClassicããšåŒã°ããŠããŸããã以äžã®æ§æå³ãèŠãŠããã ããšãäžç®ã§ãã®éããçè§£ã§ãããšæããŸãã Copyright © Red Hat, Inc. ROSA Classicã®æ§æå³ Copyright © Red Hat, Inc. ROSA with HCPã®æ§æå³ æ§æå³ããããããããã«ãClassicæ¹åŒã§ã¯ãã³ã³ãããŒã«ãã¬ãŒã³ããŒãããŠãŒã¶ãŒèªèº«ã®AWSã¢ã«ãŠã³ãïŒVPCïŒå
ã«é
眮ãããã¯ãŒã«ãŒããŒããšå
±åããŠããŸããã äžæ¹ãHCPæ¹åŒã§ã¯ãã³ã³ãããŒã«ãã¬ãŒã³ããŠãŒã¶ãŒã®ãããã¯ãŒã¯ç°å¢ããå®å
šã«åé¢ãããå Žæã«é
眮ãããAWS PrivateLinkãä»ããŠããåãããä»çµã¿ã«ãªã£ãŠããŸãã ãã®ãããªæ§æã®éã以å€ã«ããHCPæ¹åŒã¯æ°å€ãã®ã¡ãªãããæã£ãŠããŸããããããã¯ãã©ã®ãããªã¡ãªãããããã玹ä»ããŸãã ã³ã³ãããŒã«ãã¬ãŒã³ã®ç®¡çã³ã¹ãã®åæž ã³ã³ãããŒã«ãã¬ãŒã³ã«ã¯ãAPIãµãŒããŒãetcdããŒã¿ããŒã¹ãªã©ãã¯ã©ã¹ã¿ãŒå
šäœãå¶åŸ¡ããæ¥µããŠéèŠãªã³ã³ããŒãã³ããå«ãŸããŠããŸããããããRed HatåŽãå®å
šã«ç®¡çã»éçšããŠãããããããŠãŒã¶ãŒã®éçšä¿å®ã®ã³ã¹ãã倧å¹
ã«åæžãããŸãã AWSã€ã³ãã©è²»çšïŒEC2代éïŒãç¯çŽã§ãã åŸæ¥ã®Classicæ¹åŒã§ã¯ãã³ã³ãããŒã«ãã¬ãŒã³ãæ§æããããŒãïŒEC2ã€ã³ã¹ã¿ã³ã¹ïŒããŠãŒã¶ãŒèªèº«ã®AWSç°å¢å
ã«äœæããå¿
èŠããããŸããã OpenShiftã®ä»æ§äžãã¯ã©ã¹ã¿ãŒã®å®å®çšŒåïŒé«å¯çšæ§ïŒãç¶æããããã«ã¯æäœ3å°ã®ã³ã³ãããŒã«ãã¬ãŒã³ããŒããå¿
é ãšãªããŸãã®ã§ãå°èŠæš¡ãªéçºç°å¢ã§ãã£ãŠããããŒã¹ãšãªãEC2ã®åºå®è²»çšãã©ãããŠãé«ããªã£ãŠããŸããšããã³ã¹ãé¢ã®èª²é¡ããããŸããã HCPæ¹åŒã§ã¯ããã®ã³ã³ãããŒã«ãã¬ãŒã³ãRed HatåŽã«å®å
šã«ç§»åããã®ã§ããŠãŒã¶ãŒã®AWSã¢ã«ãŠã³ãããã¯æäœ3å°åã®EC2ã®æéãå®å
šã«æ¶ããããšã«ãªããŸãã ããã¯ãAWSã®ã€ã³ãã©ã³ã¹ããåçã«ç¯çŽã»åæžã§ãããšããHCPæ¹åŒã ãã®å€§ããªã¡ãªããã«ãªããŸãã ã¯ã©ã¹ã¿ãŒäœæé床ã®åäž åŸæ¥ã®Classicæ¹åŒã§ã¯ãã¯ã©ã¹ã¿ãŒãæ°èŠäœæãããã³ã«ããŠãŒã¶ãŒã®AWSç°å¢å
ã§ã³ã³ãããŒã«ãã¬ãŒã³ã®ã€ã³ãã©ãäžããçµã¿ç«ãŠãå¿
èŠããããŸããããã®ãããã¯ã©ã¹ã¿ãŒãå®å
šã«èµ·åããŠå©çšå¯èœã«ãªããŸã§ã«ãçŽ30åã40åã»ã©ã®åŸ
ã¡æéãçºçããŠããŸããã HCPæ¹åŒã§ã¯ãã³ã³ãããŒã«ãã¬ãŒã³ã®æ§ç¯ã»ããããžã§ãã³ã°ãRed HatåŽã®ç°å¢ã§è¿
éã«è¡ãããŸãã ãŠãŒã¶ãŒã®AWSç°å¢å
ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãåããããã®ã¯ãŒã«ãŒããŒãã®ã¿ãäœæããã°è¯ããããã¯ã©ã¹ã¿ãŒã®äœææéãçŽ10åçšåºŠãžãšå€§å¹
ã«ççž®ãããŸãããæ¥ãã§æ°ããç°å¢ãå¿
èŠã«ãªã£ããããããžãã¹ã·ãŒã³ã«ãããŠããã®ãããªæéã®ççž®ã¯å€§ããªã¡ãªããã«ãªããŸãã ã¢ããã°ã¬ãŒãã®æè»æ§ åŸæ¥ã®Classicæ¹åŒã§ã¯ãã³ã³ãããŒã«ãã¬ãŒã³ãšã¯ãŒã«ãŒããŒãã®ããŒãžã§ã³ã¢ãããå¯ã«é£åãããŠç®¡çããå¿
èŠããããŸããããã®ãããäºææ§ã®ç¢ºèªã圱é¿ç¯å²ã®èª¿æ»ãæ
éã«è¡ããªããã°ãªãããäºåã®èšç»ãæ€èšŒã«å€ãã®å·¥æ°ãå²ãå¿
èŠããããŸããã HCPæ¹åŒã§ã¯ãã³ã³ãããŒã«ãã¬ãŒã³ãšã¯ãŒã«ãŒããŒãã®ç®¡çãå®å
šã«åãé¢ãããŠããŸãã®ã§ãäž¡è
ã®ã¢ããã°ã¬ãŒããå¥ã
ã®ã¿ã€ãã³ã°ã§ã¹ã±ãžã¥ãŒã«ããããšãå¯èœã§ãã äŸãã°ããŸãã¯Red HatåŽã管çããã³ã³ãããŒã«ãã¬ãŒã³ã ããå
è¡ããŠã¢ããããŒãããã¢ããªã±ãŒã·ã§ã³ãåãã¯ãŒã«ãŒããŒãã¯æ¥å圱é¿ã®æãå°ãªãå¥ã®æ¥æã«å®æœããããšãã£ãæè»ãªéçšãã§ããããã«ãªããŸããã 以äžããROSA Classicãšæ¯ã¹ãHCPæ¹åŒã®ç¹åŸŽãšã¡ãªããã®è§£èª¬ã«ãªããŸããæåŸã«ããããŸã§ã玹ä»ããå
容ã衚ã§ç°¡åã«ãŸãšããŸãã ROSA ClassicãšROSA HCPã®æ¯èŒè¡š æ¯èŒé
ç® ROSA ClassicïŒåŸæ¥æ¹åŒïŒ ROSA with HCPïŒææ°ã¢ãã«ïŒ ã³ã³ãããŒã«ãã¬ãŒã³ã®é
眮 ãŠãŒã¶ãŒèªèº«ã®AWSã¢ã«ãŠã³ã Red HatåŽ ãã¹ã¿ãŒããŒãã®EC2è²»çš ãŠãŒã¶ãŒè² æ
ãŠãŒã¶ãŒåŽã®è² æ
ãŒãïŒRed HatåŽã§çšŒåããããïŒ ã¯ã©ã¹ã¿ãŒäœææé çŽ40å çŽ10å ã¢ããã°ã¬ãŒãèª¿æŽ äž¡ããŒããé£åããŠãããããã¹ã±ãžã¥ãŒã«ã®èª¿æŽããã¥ãã å¥ã
ã®ã¿ã€ãã³ã°ã§æè»ã«èª¿æŽã»å®è¡ãå¯èœ ãŸãšã 以äžãROSAã®æŠèŠãããçŸåšã®äž»æµã§ãããHCPïŒHosted Control PlanesïŒãã®ç¹åŸŽãšæ°ã
ã®ã¡ãªããã«ã€ããŠã玹ä»ããŸããã ROSA with HCPã¯ãã³ã¹ãã»é床ã»éçšã®ãã¹ãŠã«ãããŠåªããŠãããçŸåšã®ROSAæ§ç¯ã«ããããã¹ããã©ã¯ãã£ã¹ãšãªã£ãŠããŸãã ããããæ°ããã³ã³ããåºç€ãæ€èšãããæ¹ã«ããã®èšäºã®å
容ãåèã«ãªãã°å¹žãã§ãã æ¬¡åã¯ãå®éã«AWSäžã§ROSA with HCPã®ã¯ã©ã¹ã¿ãŒãæ§ç¯ããŠããæé ã詳ãã解説ããŸãããã²æ¥œãã¿ã«ããŠãã ããã åèè³æ AWS ã§ã® Red Hat ãœãªã¥ãŒã·ã§ã³ Overview of responsibilities for ROSA ROSA HCP and ROSA classic Capability Matrix ïŒãã°ã€ã³å¿
èŠïŒ ROSA Best Practices and Recommendations Red Hat OpenShift Service on AWS 4 Introduction to ROSA ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ROSAïŒRed Hat OpenShift Service on AWSïŒãå©çšããã³ã³ãããã©ãããã©ãŒã æ§ç¯ ~ROSAã®ç¹åŸŽãšã¡ãªãã~ first appeared on SIOS Tech Lab .
çŸåšãã¹ããŒããã©ã³ãPCã®OSãå€ãã®ã¢ããªã§åœããåã®ããã«æäŸãããŠãããããŒã¯ã¢ãŒããã æ¬èšäºã§ã¯ãããŒã¯ã¢ãŒãã®æŽå²ãããããŒã¯ã¢ãŒããæå¹ãªã±ãŒã¹ããããŠè²åœ©èšèšã®ã¬ã€ããŸã§ã解説ããŸãã ããŒã¯ã¢ãŒãã¯åç¹ååž°ïŒ ã³ã³ãã¥ãŒã¿ãŒã®æŽå²ãæ¯ãè¿ããšãç»é¢ã¯æåããããŒã¯ã¢ãŒãïŒæãèæ¯ïŒã§ããã 1970幎代ãã80幎代ååãäž»æµã ã£ãCRTïŒãã©ãŠã³ç®¡ïŒã¢ãã¿ãŒã§ã¯ãç»é¢å
šäœãæããçºå
ãããããšã¯è² è·ãé«ãã£ãããããæãèæ¯ã«ç·ãçœè²ã®ããã¹ããã衚瀺ããã®ãåºæ¬ã§ããã ããã1970幎代ã«GUIïŒã°ã©ãã£ã«ã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ïŒãç ç©¶æã§çãŸãã1980幎代ååããå®çšåã»æ®åãå§ãããšãç»é¢èšèšã®èãæ¹ã¯å€§ããå€ãããŸãããGUIãæ¡çšããããŒãœãã«ã³ã³ãã¥ãŒã¿ãŒã§ã¯ãææžäœæããã¹ã¯ããããããªãã·ã³ã°ïŒDTPïŒãéèŠãªçšéãšãªããç»é¢äžã§å°å·çµæãå¿ å®ã«åçŸããWYSIWYGãšããèãæ¹ãåºãŸããŸãããçœãçŽã«é»ãæåãå°å·ãããŠããããšããç»é¢äžã§è¡šãããšãåºæ¬ãšãªã£ãã®ã§ããããããŠãäžè¬åãããœã³ã³ã®GUIã§ã¯ã©ã€ãã¢ãŒããäºå®äžã®æšæºãšãªããŸããã ãã®éãäžè¬åãã®ç»é¢ã¯çœããªããŸããããã·ã¹ãã ãéçºãããšã³ãžãã¢ãã¡ã¯ãéGUIãªéçºç°å¢ãªã©ã§ãé»ãç»é¢ãã䜿ãç¶ããŠããŸããã ãããŠ2010幎代ãã¹ããŒããã©ã³ãæ®åããæãå Žæã§ãã£ã¹ãã¬ã€ãèŠãæéãå¢ããŸãããã¹ããŒããã©ã³ã§äœ¿ãããããšã®å€ãææ©ELãã£ã¹ãã¬ã€ã¯ãé»è²ïŒçºå
ããªãã«ãããä»çµã¿ã®ãããé»èæ¯ã«ããããšã§æ¶è²»é»åãæããããšãã§ããŸããOSãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¶ã€ã³ã·ã¹ãã ãæçããã©ã€ãã¢ãŒããšããŒã¯ã¢ãŒãã®åæ¹ãåæãšããèšèšãäžè¬çã«ãªããŸãã ãããŒã¯ã¢ãŒãïŒç®ã«åªãããã¯æ¬åœïŒ ãããŒã¯ã¢ãŒãã¯ç®ã«åªããããšããèšãããŸãããç§åŠçã«ã¯ãç¡æ¡ä»¶ã«ç®ã®è² æ
ãæžãããã§ã¯ãªãããšããã®ãçå®ã§ãã人éã®ç®ã®ãç³åãã®åãã«ãã£ãŠãã©ã€ãã¢ãŒããšããŒã¯ã¢ãŒãã«ã¯äžé·äžçããããŸãã ã©ã€ãã¢ãŒãã®ã¡ãªããïŒãã³ã調ç¯ã®ãããã 人éã¯æãããã®ãèŠããšç³åãå°ãããªããŸããã«ã¡ã©ã®çµããçµã£ãæã®ããã«ãçŠç¹æ·±åºŠããæ·±ããªãããïŒãã³ããŒã«å¹æïŒãç®ã®çèã«è² æ
ããããã«æåã«ãã³ããåãããããšãã§ããŸããååãªç
§æç°å¢ã§ã¯ãã©ã€ãã¢ãŒãã®æ¹ãèªè§£é床ãæåèªè粟床ãé«ããšããç ç©¶ãå ±åãããŠããŸãã ã«ã¡ã©ã®çµããšè¢«åçæ·±åºŠ ããŒã¯ã¢ãŒãã®ã¡ãªããïŒææã§ã®ãŸã¶ããè»œæž äžæ¹ãããŒã¯ã¢ãŒããç䟡ãçºæ®ããã®ã¯ãåšå²ãæãç°å¢ãã§ããæãéšå±ã§ã©ã€ãã¢ãŒããèŠããšã匷ãã³ã³ãã©ã¹ãã«ããããŸã¶ããïŒå
ã®åºæ¿ïŒãã匷ãã¹ãã¬ã¹ãäžããŸããææã«ãããŠã¯ãçºå
éãå°ãªãããŒã¯ã¢ãŒãã®æ¹ã䞻芳çãªç®ã®ç²åŽæãæžå°ããããšããç ç©¶ã§å ±åãããŠããŸãã ããŒã¯ã¢ãŒããšãããªã³ãµã€ã³ãã®ãžã¬ã³ã ããŒã¯ã¢ãŒãã§ã¯ãçœãæåãã¢ã€ã³ã³ãªã©ãå
ã垯ã³ãããã«ã«ããã§èŠããããšããããŸãã æãç»é¢ãèŠãŠãããšãç®ã¯ããå€ãã®å
ãåã蟌ãããšããŠç³åãåºããŸããç³åã倧ããéããšãç®ã®å
åŠåå·®ãçŒçå
ã§ã®å
ã®æ£ä¹±ã®åœ±é¿ãåãããããªããããæãèæ¯ã«è¡šç€ºãããæããæåãªã©ã®é«ã³ã³ãã©ã¹ããªèŠçŽ ã¯ã茪éããŒãããããå
ãã«ããã§èŠãããããå ŽåããããŸãã ãã®èŠãæ¹ã¯ãå€ã®è¡ã§ããªã³ãµã€ã³ãè¡ç¯ã®å
ãåšå²ã«ã«ããã§èŠããçŸè±¡ãšäŒŒãŠããŸããïŒããªã³ãµã€ã³ãè¡ç¯ã®ã«ãã¿ã«ã¯ã倧æ°äžã®å¡µã氎滎ã«ããå
ã®æ£ä¹±ã圱é¿ããŠããããããŸã£ããåãçŸè±¡ã§ã¯ãããŸãããïŒ ãŸãããã®ãããªèŠãæ¹ã¯èª°ã«ã§ãèµ·ããåŸãŸãããä¹±èŠãããå Žåã¯å
ãç¹å®ã®æ¹åãžäŒžã³ãããæåãäºéã«èŠããããããªã©ãã«ãã¿ãããç®ç«ã€ããšããããŸãã ããŒã¯ã¢ãŒããå¿
èŠãªã±ãŒã¹ãšäžèŠãªã±ãŒã¹ ããããã¡ãªããã»ãã¡ãªãããèžãŸãããšãããŒã¯ã¢ãŒãã¯ãã¹ãŠã®ãµã€ããã¢ããªã§å¿
é ãšããããã§ã¯ãããŸããããŠãŒã¶ãŒã®ãå©çšæéããå©çšç°å¢ããã³ã³ãã³ãã®æ§è³ªãã«ãã£ãŠåªå
床ã¯å€§ããå€ãããŸãã ããŒã¯ã¢ãŒããæ±ããããã±ãŒã¹ å€éãææã§å©çšãããã¢ã㪠ïŒå°å³ãã«ãŒãããã¢ã©ãŒã ãé»åæžç±ãªã©ãåšå²ã®æé å¿ã劚ãããç©ãããæããé
æ
®ãå¿
èŠãªããã ã³ã³ãã³ã没å
¥åïŒãšã³ã¿ã¡ ïŒïŒåç»é
ä¿¡ãã²ãŒã ãåçã®ã£ã©ãªãŒãªã©ãåšå²ã®UIãæ²ãŸããããšã§ãã¡ã€ã³ã³ã³ãã³ããéç«ãããããã U-NEXT ããçšã®æ åãåçç·šéããŒã« ïŒäžèšã®ãšã³ã¿ã¡ã³ã³ãã³ããšåæ§ã«èŠç·ã®åæ£ãé²ã广ã«å ããåšå²ã®UIãæããã¥ãŒãã©ã«ã«ããããšã§ãç®ã®é¯èŠïŒæããèæ¯ã«åŒã£åŒµãããŠåçãæãèŠããçŸè±¡ïŒããé²ããè²ãæããã®ãã£ããŒã«ãæ£ç¢ºã«èªèã»ç·šéãããããªããŸãã ããŒã¯ã¢ãŒããå¿
èŠãšããªãã±ãŒã¹ äžéæ§ã®Webãµã€ãã»ã©ã³ãã£ã³ã°ããŒãž ïŒã¡ãŒã«ãŒããã£ã³ããŒã³ãµã€ããªã©ããã©ã³ãã®äžç芳ãåºå®ããŠäŒããããšãåªå
ããããã®ã Canva ãŠã§ãããŒãžãã³ãã¬ãŒã å°å·ãåæãšããããã¥ã¡ã³ã ïŒå±¥æŽæžã»è·åçµæŽæžãªã©ã®äœæãµãŒãã¹ãã¯ãŒãããã»ããµãŒã¢ããªãªã©ãå°å·ãããããšãåæã®å Žåãä»äžãããã€ã¡ãŒãžãããããªããŸããåè¿°ã®WYSIWYGãšãã£ã¿ãŒã§ãã Canva åãªããè²å転ãã§ã¯ãªããè²åœ©èšèšã¬ã€ã ããŒã¯ã¢ãŒãã®é
è²ã¯ãã©ã€ãã¢ãŒãã®ã«ã©ãŒãæ©æ¢°çã«å転ãããã®ã§ã¯ãããŸããã èŠèªæ§ãæ
ä¿ããã«ãã¿ã«ããç®ã®ç²åŽãé²ãããã®èšèšãå¿
èŠã§ãã å®å
šãªé»ã®èæ¯ãå®å
šãªçœã®æåã«ã¯ããªã èæ¯è²ã«ã¯å®å
šãªé»ã§ã¯ãªãé»ã«è¿ãã°ã¬ãŒãæ¡çšããŸããçã£é»ãé¿ããããšã§ã³ã³ãã©ã¹ããé©åºŠã«æããç®ãžã®åºæ¿ãåãããŸããèæ¯ãšåãããããã¹ããå®å
šãªçœãé¿ããŸãã çœãèæ¯ã«æãæåã®ã©ã€ãã¢ãŒãã§ã¯ãã«ããã§èŠããããšã¯å°ãªãã§ãããæãèæ¯ã«æããæåã®ããŒã¯ã¢ãŒãã§çã£çœãªæåã«ãããšãåè¿°ã®ããã«æ»²ããããã©ã€ãã¢ãŒããããããŒã¯ã¢ãŒãã®ã³ã³ãã©ã¹ãã¯å°ããããŸãã æ¬¡ã®è¡šã¯ãGoogle Financeã®èæ¯ãšæåã®è²ã§ãã ã©ã€ãã¢ãŒã ããŒã¯ã¢ãŒã èæ¯è² #FFFFFFïŒçœ #101218ïŒéç³»ã®é»ã«è¿ãæãã°ã¬ãŒ æåè² #0A0A0AïŒé»ã«è¿ãæãã°ã¬ãŒ #E6E8F0ïŒéç³»ã®æããã°ã¬ãŒ ã³ã³ãã©ã¹ãæ¯ 19.79 : 1 15.3 : 1 衚ã®ãã³ã³ãã©ã¹ãæ¯ãã¯ãã¢ã¯ã»ã·ããªãã£åºæºïŒWCAGïŒã§æ¡çšãããŠããèšç®æ¹æ³ã«ãã£ãŠç®åºãããã2ã€ã®è²ã®ã³ã³ãã©ã¹ãã®åºŠåããç€ºãææšã§ããã1:1ããã³ã³ãã©ã¹ããªããã21:1ããæå€§ã®ã³ã³ãã©ã¹ãã衚ããŸãã æåœ©è²ãæåºŠã圩床ãèª¿æŽ ããŒãã«ã©ãŒãã°ã©ãã®è²ïŒæåœ©è²ïŒã¯ãã©ã€ãã¢ãŒãã®è²ã®ãŸãŸããŒã¯ã¢ãŒãã§å©çšãããšãè²ã«ãã£ãŠãç®ç«ã¡ãããããèæ¯ãšèŠåãã«ãããªãå ŽåããããŸããGoogle Financeã®äŸã§ã¯ãã©ã€ãã¢ãŒãã®ç·ãšèµ€ã®ã°ã©ãã®è²ããè²çžãå€ããã«æããè²ã«èª¿æŽããŠããŒã¯ã¢ãŒãã«é©çšããŠããŸãã Google Finance ãããã«ïŒå©çšç°å¢ã«ãã£ãŠæé©ãªUIã¯å€ãã ã©ã€ãã¢ãŒããšããŒã¯ã¢ãŒãã¯åªå£ã®é¢ä¿ã§ã¯ãªããããããç°ãªãå©çšç°å¢ã«æé©åããããã¶ã€ã³ã§ããéèŠãªã®ã¯ãã©ã¡ããåªããŠããããã§ã¯ãªããããŠãŒã¶ãŒãã©ã®ãããªç°å¢ã§ãã©ã®ãããªç®çã§å©çšãããããçè§£ããããã«åãããŠèšèšããããšã§ãã ã¡ãªã¿ã«ïŒã¢ããã°æä»£ããèã
ãš… ã³ã³ãã¥ãŒã¿ãŒããã以åãããå€éã®èŠèªæ§ã«é
æ
®ãã衚瀺èšèšã¯ãèªåè»ãèªç©ºæ©ã®èšåšã§çºéããŠããŸãããå€éã«æããããèšåšãèŠããšæé å¿ã劚ããããæãéè·¯ã空ãªã©åšå²ã®ç¶æ³ãèŠèªãã«ãããªãããšããããŸãããŸããèšåšã®å
ãçªã¬ã©ã¹ã«æ ã蟌ã¿ãèŠçã劚ããããšããããŸãããã®ãããèšåšã«ã¯æãèæ¯ãæ¡çšãããã»ããçšéã«å¿ããŠèµ€ãã¢ã³ããŒãªã©ãå€éã®èŠèªæ§ã«é
æ
®ããç
§æè²ãçšããããŠããŸããã Photo by National Cancer Institute Windows Ladislav Stercell Rui Silvestre Tyler Rooney Ed Wingate Sandisk DragoÈ Grigore Nursultan Bakyt Boitumelo on Unsplash ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post è±ã»ãªããšãªãã®ããŒã¯ã¢ãŒããæŽå²ãšççåŠããèããUIãã¶ã€ã³ first appeared on SIOS Tech Lab .
PSSLã®äœã
æšã§ã æè¿ã¯ Claude Code ãè€æ°ã»ãã·ã§ã³åæã«ç«ã¡äžããŠãæ©èœAã®å®è£
ã»æ©èœBã®ã¬ãã¥ãŒã»ããã¥ã¡ã³ãæŽåâŠãšäžŠåã§äœæ¥ãããã®ãåœããåã«ãªã£ãŠããŸããã䟿å©ãªã®ã§ãããã»ãã·ã§ã³ã§Â git checkout  ãèµ°ã£ãç¬éãå¥ã»ãã·ã§ã³ãäœæ¥äžã®ã³ãŒããäžžããšå¥ãã©ã³ãã®å
容ã«å€ãã£ãŠããŸãåé¡ãèµ·ããã®ã§è§£æ±ºããŸããã ãã®èšäºã§ã¯ã ãªãè€æ°ã® AI ãšãŒãžã§ã³ããšÂ git checkout  ã®çžæ§ãæªãã®ã git checkout  ãšÂ git worktree  ã®ä»çµã¿ã®éã worktree ã䜿ããšäœãããããã®ã ã«ãŒã«ã§çžãã ãã§ã¯å®ãããªãã®ã§Â hook ã§ checkout ã匷å¶ãããã¯ããÂ æ¹æ³ worktree éçšã®ãããã©ãã ã«ã€ããŠãŸãšããŸããã 1. äœãèµ·ããã®ã Claude Code ã®ã»ãã·ã§ã³ã¯ãåºæ¬çã« ãªããžããªã®äœæ¥ãã£ã¬ã¯ããªïŒãã§ãã¯ã¢ãŠãïŒãå
±æ ããŠåããŸããããã§è€æ°ã»ãã·ã§ã³ã䞊åã§èµ°ããããšãããããããšãèµ·ããŸãã ã»ãã·ã§ã³A: feature/foo ãå®è£
äžïŒãã¡ã€ã«ç·šéäžâŠïŒ ã»ãã·ã§ã³B: ãPR #95 ãã¬ãã¥ãŒããŠãâ git checkout feature/bar å®è¡ â ⌠ã»ãã·ã§ã³AãèŠãŠãããã¡ã€ã«ãå
šéš feature/bar ã®å
容ã«å€ãã git checkout ïŒã git switch ïŒã¯ãä»ãããã£ã¬ã¯ããªã®äžèº«ããã®ãã©ã³ãã®ç¶æ
ã«æžãæãããã³ãã³ãã§ããã€ãŸãäœæ¥ãã£ã¬ã¯ããªãšãã ã°ããŒãã«ãªç¶æ
ãç Žå£çã«åãæ¿ããŸãã1人ã®äººéã1ã€ã®ã¿ãŒããã«ã§äœæ¥ããŠããæä»£ã¯ããã§è¯ãã£ãã®ã§ãããè€æ°ã®ãšãŒãžã§ã³ããåããã£ã¬ã¯ããªã§åæã«åãåæã ãšã ã»ãã·ã§ã³Aã®ç·šééäžãã¡ã€ã«ãšã»ãã·ã§ã³Bã® checkout ãè¡çªãã ãã¹ããããªãããèœã¡ãïŒå®ã¯å¥ãã©ã³ãã®ã³ãŒããå®è¡ããŠããïŒ ã³ããããæå³ããªããã©ã³ãã«èŒã ææªãæªã³ãããã®å€æŽã checkout ã«å·»ã蟌ãŸããŠæ¶ãã ãšããããããã°ããŠãåå ã«ãã©ãçãã«ããç³»ã®äºæ
ã«ãªããŸããAI ãšãŒãžã§ã³ã㯠checkout ãããããããªããã®ã§ã人éå士ãããèžã確çãé«ãã§ãã 2. git checkout ãš git worktree ã®éã git worktree ã¯ã 1ã€ã®ãªããžããªãããè€æ°ã®äœæ¥ãã£ã¬ã¯ããªãçãã ãæ©èœã§ããGit 2.5ïŒ2015幎ïŒããããæ©èœã§ãããAI ãšãŒãžã§ã³ã䞊åæä»£ã«ãªã£ãŠæ¥ã«äŸ¡å€ãäžãã£ããšæããŠããŸãã git checkout æ¹åŒïŒç¶æ
ã®åãæ¿ãïŒ repo/ ââ ããã feature/foo ã«ãªã£ãã feature/bar ã«ãªã£ãããã ïŒåæã«ã¯1ã€ã®ãã©ã³ãããååšã§ããªãïŒ git worktree æ¹åŒïŒãã£ã¬ã¯ããªã®è¿œå ïŒ repo/ â develop ã®ãŸãŸ worktrees/feature-foo/ â feature/foo å°çšãã£ã¬ã¯ã㪠worktrees/feature-bar/ â feature/bar å°çšãã£ã¬ã¯ã㪠ïŒ.git ã®å®äœã¯ repo/ ãšå
±æãHEAD ã ã worktree ããšã«ç¬ç«ïŒ ä»çµã¿ãšããŠã¯ã .git  ã®ãªããžã§ã¯ãïŒã³ãããã»blobïŒã¯å
š worktree ã§å
±æããã HEAD  ãã€ã³ããã¯ã¹ã ãã worktree ããšã«åãããŸãããªã®ã§ clone ãšéã£ãŠãã£ã¹ã¯ãã»ãŒé£ãããfetch ã1åã§å
š worktree ã«åæ ãããŸãã git checkout / switch git worktree ãã©ã³ãã®æã¡æ¹ 1ãã£ã¬ã¯ããªã«1ã€ïŒåãæ¿ãïŒ ãã©ã³ãããšã«å¥ãã£ã¬ã¯ããªïŒäžŠåïŒ ä»ã®äœæ¥ãžã®åœ±é¿ ãã ïŒäœæ¥ãã£ã¬ã¯ããªå
šäœãå€ããïŒ ãªãïŒåãã£ã¬ã¯ããªãç¬ç«ïŒ .git ã®å®äœ ãã®ãŸãŸ å
±æïŒãã£ã¹ã¯å¹çãè¯ãïŒ äžŠåäœæ¥ äžå¯èœ å¯èœ fetch / stash / ãªããžã§ã¯ã â å
š worktree ã§å
±æ åºæ¬æäœã¯ããã ãã§ã: # ãã©ã³ãçšã® worktree ãäœãïŒãã©ã³ããç¡ããã° -b ã§äœæïŒ git worktree add ../worktrees/feature-foo feature/foo git worktree add -b feature/new ../worktrees/feature-new # äžèЧ git worktree list # çµãã£ããåé€ git worktree remove ../worktrees/feature-foo git worktree prune # æ¶ãå¿ãã®æé€ 3. ãªã AI ãšãŒãžã§ã³ã䞊åæä»£ã« worktree ãæ³šç®ãããŠããã®ã ã»ãã·ã§ã³ããšã«ç¬ç«ããäžçãæž¡ãã  â ã»ãã·ã§ã³Aã¯Â worktrees/feature-foo/ ãã»ãã·ã§ã³Bã¯Â worktrees/feature-bar/  ã§äœæ¥ããäºãäœãããŠãå¹²æžããŸããã ã¡ã€ã³ã®ãã§ãã¯ã¢ãŠããåžžã«å®å®ãã  â repo/  㯠develop ã®ãŸãŸçœ®ããŠãããã®ã§ããä»ã®æ£ã®ç¶æ
ããèŠå€±ããªãã人éã確èªããå ŽæãšããŠãå®å¿ã§ãã Claude Code ããã€ãã£ã察å¿ããŠãã  â Claude Code ã«ã¯ worktree ãµããŒããçµã¿èŸŒãŸããŠããŠã claude --worktree  ã EnterWorktreeããµããšãŒãžã§ã³ãèµ·åæã®Â isolation: "worktree"  ã䜿ããšãäžæç㪠worktree ãèªåã§äœã£ãŠäœæ¥ãã倿Žãç¡ããã°èªåã§æé€ãŸã§ããŠãããŸããã€ãŸãã䞊åã«ãšãŒãžã§ã³ããèµ°ãããããã®å
¬åŒãªçããããã§ã« worktree ãªãã§ããã ã¬ãã¥ãŒãšå®è£
ãåæã«ã§ãã  â ãPR ã®ãã©ã³ãã checkout ããŠã¬ãã¥ãŒãã®ä»£ããã«ãPR ã®ãã©ã³ãã worktree ã«çãããŠã¬ãã¥ãŒãã«ããã°ãå®è£
äžã®ã»ãã·ã§ã³ãæ¢ããã«æžã¿ãŸãã 4. ã«ãŒã«ã§çžãã ãã§ã¯å®ãããªãã®ã§ hook ã§åŒ·å¶ãã ããã©ã³ãåãæ¿ã㯠worktree ã䜿ã£ãŠãã ããããšæžããŠããã³ã³ããã¹ããé·ããªã£ãã»ãã·ã§ã³ããã¬ãã¥ãŒäŸé ŒãåãããšãŒãžã§ã³ãããããã checkout ããŸããããšãã£ãŠããŸãå¯èœæ§ã¯æ¶ããŸããã ããã§ Claude Code ã®Â PreToolUse hook  ã§ãå
±æãã£ã¬ã¯ããªã§ã®Â git checkout  / git switch  ãä»çµã¿ãšããŠãããã¯ããããšã«ããŸãããhook 㯠Claude ã Bash ã³ãã³ããå®è¡ããçŽåã«å¿
ãå²ã蟌ããã®ã§ãã«ãŒã«ãšéã£ãŠãå¿ãããããšããããŸããã 4.1 ã¬ãŒãã¹ã¯ãªãã scripts/worktree-guard-hook.sh  ãäœããŸã: #!/bin/bash # Worktree guard hook for Claude Code (PreToolUse / Bash) # å
±æäœæ¥ãã£ã¬ã¯ããªã§ã® git checkout / git switch ã«ãããã©ã³ãåãæ¿ãããããã¯ãã set -euo pipefail hook_input=$(cat) command=$(echo "$hook_input" | jq -r '.tool_input.command // empty') [ -z "$command" ] && exit 0 # git ã®ãµãã³ãã³ããšã㊠checkout / switch ãåŒã°ããŠããã # ïŒgit ã®çŽåŸããŸãã¯ã°ããŒãã«ãªãã·ã§ã³ -C/-c/--xxx ãæãã çŽåŸã®ã¿ãããïŒ git_switch_re='(^|[;&|(]|&&|\|\|)[[:space:]]*git([[:space:]]+(-C[[:space:]]+[^[:space:]]+|-c[[:space:]]+[^[:space:]]+|--[A-Za-z0-9-]+(=[^[:space:]]+)?))*[[:space:]]+(checkout|switch)([[:space:]]|$)' if echo "$command" | grep -qE "$git_switch_re"; then # ãã¡ã€ã«åŸ©å
åœ¢åŒ (`git checkout [<ref>] -- <path>`) ã¯èš±å¯ if echo "$command" | grep -qE 'checkout[^;&|]* -- '; then exit 0 fi jq -n '{ hookSpecificOutput: { hookEventName: "PreToolUse", permissionDecision: "deny", permissionDecisionReason: "🚫 å
±æäœæ¥ãã£ã¬ã¯ããªã§ã®ãã©ã³ãåãæ¿ãïŒgit checkout/switchïŒã¯çŠæ¢ã§ããä»ã®ã»ãã·ã§ã³ãšåããã§ãã¯ã¢ãŠããå
±æããŠããŸãã代ããã« git worktree ã䜿ã£ãŠãã ãã: `git worktree add ../worktrees/<branch> <branch>` ããŠããã®ãã£ã¬ã¯ããªå
ã§äœæ¥ããããã¡ã€ã«åŸ©å
ã ããªã `git checkout -- <file>` / `git restore <file>` ã¯èš±å¯ãããŠããŸãã" } }' exit 0 fi exit 0 ãã€ã³ã㯠åçŽãªÂ grep checkout  ã«ããŠããªã ããšã§ããããã ãšÂ git commit -m "switch to new API"  ã®ãããªç¡å®³ãªã³ãã³ããŸã§èª€çããã®ã§ããgit ã®ãµãã³ãã³ãäœçœ®ã« checkout/switch ãæ¥ãå Žåãã ãããããã¯ããããã«ãã©ã³ããå€ãããªã ãã¡ã€ã«åŸ©å
åœ¢åŒ ïŒ git checkout -- <file> ïŒã¯çŽ éãã«ããŠããŸãã 4.2 settings.json ã«ç»é² .claude/settings.json ïŒãããžã§ã¯ãèšå® = git ã«ã³ãããããã®ã§ããŒã å
šå¡ã«å¹ãïŒã«ç»é²ããŸã: { "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/scripts/worktree-guard-hook.sh", "if": "Bash(git *)", "timeout": 10 } ] } ] } } $CLAUDE_PROJECT_DIR  ã䜿ã£ãŠãããšãworktree ã®äžã§ã»ãã·ã§ã³ãèµ·åãããšãããã¹ã解決ã§ããŸãã if  ãã£ã«ã¿ã§ git ã³ãã³ãã®ãšãã ã hook ãèµ·åããããã«ããŠãç¡é§ãªããã»ã¹èµ·åãé¿ããŠããŸãã 4.3 åäœç¢ºèª Claude ã« checkout ãããããšãããšãå®è¡åã«ãã匟ãããŸã: > git checkout develop 🚫 å
±æäœæ¥ãã£ã¬ã¯ããªã§ã®ãã©ã³ãåãæ¿ãïŒgit checkout/switchïŒã¯çŠæ¢ã§ãã 代ããã« git worktree ã䜿ã£ãŠãã ãã: ... deny ã®çç±ã¡ãã»ãŒãžã¯ãã®ãŸãŸ Claude ã«ãã£ãŒãããã¯ãããã®ã§ã Claude ã¯èªåã§Â git worktree add  ã«åãæ¿ããŠäœæ¥ãç¶è¡ ããŸããããããã¯ããŠçµãããã§ã¯ãªããæ£ããéãæããŠèªå°ãããã®ã hook ã¡ãã»ãŒãžèšèšã®ã³ãã ãšæããŸãã ããã㊠CLAUDE.md ã«ãåãã«ãŒã«ãæžããŠãããŸããhook ãã匷å¶ãã CLAUDE.md ããäºåã¬ã€ãã³ã¹ãã®äºæ®µæ§ãã§ããããã deny ãèžãåã« worktree ãéžãã§ãããããã«ãªããŸãã ### Git - **ãã©ã³ãåãæ¿ãçŠæ¢ïŒworktree å¿
é ïŒ**: å
±æäœæ¥ãã£ã¬ã¯ããªã§ã® `git checkout` / `git switch` ã¯çŠæ¢ïŒhook ã§ãããã¯ãããïŒã å¥ãã©ã³ãã§äœæ¥ãããšã㯠`git worktree add ../worktrees/<branch> <branch>` ã䜿ãã 5. 泚æç¹ïŒãããã©ããïŒ worktree ã«å¯ããã«ããã£ãŠãããã€ãç¥ã£ãŠãããã»ããããããšããããŸãã 5.1 åããã©ã³ãã¯2ã€ã® worktree ã§ãã§ãã¯ã¢ãŠãã§ããªã Git ã®ä»æ§ã§ããããã©ã³ãããã§ãã¯ã¢ãŠãã§ãã worktree ã¯åæã«1ã€ã ãã§ãããã¡ã€ã³ã§ develop ãéãããŸãŸãworktree ã§ã develop ããã¯ã§ããŸããïŒã€ã³ããã¯ã¹ãå£ããã®ãé²ãããã®å¶çŽãªã®ã§åŠ¥åœã§ãïŒãã¬ãã¥ãŒãæ€èšŒã§åãã³ããããèŠããã ããªã git worktree add --detach  㧠detached HEAD ã«ãããšåé¿ã§ããŸãã 5.2 node_modules ã .venv ã¯ä»ããŠããªã worktree 㯠git 管çäžã®ãã¡ã€ã«ããæã£ãŠããŸããã node_modules/  ã Python ã®Â .venv/  㯠worktree ããšã«äœãçŽããå¿
èŠã§ããæ¯å npm ci  ãããšãã£ã¹ã¯ãæéãé£ãã®ã§ãClaude Code ã®èšå®ã§ã·ã³ããªãã¯ãªã³ã¯ã匵ãã®ã楜ã§ã: { "worktree": { "symlinkDirectories": ["node_modules", "frontend/node_modules"] } } ãã ã symlink å
±æã¯ãäž¡æ¹ã® worktree ã§äŸåããŒãžã§ã³ãåããåæãªã®ã§ãlockfile ãããããã©ã³ãã§ã¯çŽ çŽã«å
¥ãçŽããã»ããå®å
šã§ãã 5.3 .env ãªã©ã® git 管çå€ãã¡ã€ã«ãã³ããŒãããªã secret é¡ã .env  ã«çœ®ããŠããå Žåãworktree ã«ã¯ååšããªãã®ã§ã¢ããªãèµ·åããŸãããååèšäºã® Infisical ã®ããã«ãsecret ããã¡ã€ã«ãšããŠæããªããæ§æã«ããŠãããšãworktree éçšãšãçžæ§ãè¯ãã§ãïŒ infisical run  ã¯ã©ã®ãã£ã¬ã¯ããªããã§ãåãããã«åãïŒã 5.4 stashã»fetchã»ãªããžã§ã¯ãã¯å
±æããã .git  ã®å®äœã¯å
±æãªã®ã§ã git stash  ã®äžèº«ã fetch æžã¿ã® ref ã¯å
š worktree ããèŠããŸãããworktree ããšã«å®å
šã«ç¬ç«ãã Git ç¶æ
ãã§ã¯ãªãç¹ã¯é ã«å
¥ããŠãããšæ··ä¹±ããŸãããéã« fetch ã1åã§æžãã®ã¯ã¡ãªããã§ãã 5.5 worktree ã®æ¶ãå¿ããæºãŸã 䞊åäœæ¥ãæãã»ã© worktree ãå¢ããŸãããã£ã¬ã¯ããªã rm -rf Â ã§æ¶ããã ãã ãš Git åŽã«ç®¡çæ
å ±ãæ®ãã®ã§ã git worktree remove <path> # æ£ããæ¶ãæ¹ git worktree prune # rm ããŠããŸã£ãæ®éªžã®æé€ git worktree list # 宿çã«æ£åžã ãç¿æ
£ã«ããã®ãããããã§ããClaude Code ã®èªå worktreeïŒEnterWorktree / isolationïŒã¯å€æŽãç¡ããã°èªåã§æé€ããŠãããã®ã§ãæåéçšãããã¡ãã«å¯ãããšãŽããåºã«ããã§ãã 5.6 èµ·åäžã®ãµãŒããŒã®ãã¹ã«æ³šæ dev server ããã¹ãã©ã³ããŒã¯ãèµ·åãããã£ã¬ã¯ããªã®ã³ãŒãããèŠç¶ããŸããã¡ã€ã³ã®ãã§ãã¯ã¢ãŠãã§Â npm run dev  ãç«ã¡äžãããŸãŸ worktree åŽãç·šéããŠããåœç¶ãµãŒããŒã«ã¯åæ ãããŸãããåäœç¢ºèªã¯ãã® worktree ã®äžã§ããã»ã¹ãç«ã¡äžãããã培åºããå¿
èŠããããŸãã 6. ãŸãšã git checkout Â ã¯ äœæ¥ãã£ã¬ã¯ããªãšããã°ããŒãã«ç¶æ
ã®ç Žå£çãªåãæ¿ã ãè€æ°ã® Claude Code ã»ãã·ã§ã³ã䞊åã§èµ°ãããç°å¢ã§ã¯ãä»ã»ãã·ã§ã³ã®äœæ¥ãå·»ã蟌ãäºæ
ã®ããš git worktree  ãªã ãã©ã³ãããšã«ç¬ç«ãããã£ã¬ã¯ã㪠ãçãããã®ã§ãã»ãã·ã§ã³å士ãå¹²æžããªãã .git  ã¯å
±æãªã®ã§ãã£ã¹ã¯ã fetch ãå¹çç Claude Code 㯠worktree ããã€ãã£ããµããŒãããŠããïŒ -worktree  / EnterWorktree / isolation: "worktree" ïŒã®ã§ã䞊åãšãŒãžã§ã³ãéçšã®å
¬åŒãªçãã¯ãã§ã« worktree ãã ã CLAUDE.md ã«æžãã ãã¯ããé¡ããã¬ãã« ãPreToolUse hook ã§Â git checkout  / git switch Â ãæ§é çã«ãããã¯ããdeny ã¡ãã»ãŒãžã§ worktree ãžèªå°ããã®ãç¢ºå® æ³šæç¹ã¯ãåäžãã©ã³ãã®éè€ãã§ãã¯ã¢ãŠãäžå¯ããnode_modules / .env ã¯ä»ããŠããªãããworktree ã®æé€ãããã ãã«ãŒã«ãæžãããã倧äžå€«ãã§ã¯ãªããä»çµã¿ã§äºæ
ããªãããã«ããããsecret 管çã®ãšããšåãçµè«ã«èœã¡çããŸããããAI ãšãŒãžã§ã³ããšäžŠèµ°ããéçºã§ã¯ããã®èãæ¹ãããããå Žé¢ã§å¹ããŠãããšæããŠããŸãã åèãªã³ã¯ git-worktree – Git å
¬åŒããã¥ã¡ã³ã Claude Code Hooks – Anthropic å
¬åŒããã¥ã¡ã³ã Claude Code Settings – Anthropic å
¬åŒããã¥ã¡ã³ã Anthropic Claude Code å
¬åŒ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post 䞊å Claude Code ã® git checkout ã§äœæ¥äžã®ã³ãŒããæžãæããã®ã§git worktree + hook ã§è§£æ±ºãã first appeared on SIOS Tech Lab .