
- TOP
- ã¿ã°äžèЧ
- ããã°ã©ãã³ã°
ããã°ã©ãã³ã°
ã€ãã³ã
ãã¬ãžã³
æè¡ããã°
ã¯ããã« ããã«ã¡ã¯ããã©ãããã©ãŒã éšã® åéç° ã§ãïŒ ä»åã¯æžç±ç޹ä»èšäºã®ç¬¬ïŒåŒŸã§ãïŒ æšå¹Žæçš¿ãã第äžåŒŸã®èšäºã¯ðã«ãããŸãã tech.stmn.co.jp ä»åã¯ããããè·çš®ã®ç°ãªãïŒäººãåã
GWã§èªãã§ããã£ãæžç±ã«ã€ããŠã玹ä»ãããŠããã ããŸãïŒ ãã®èšäºã§äœãåŠã³ã«ãªã£ãããæžç±ãèªããã£ããã«ãªã£ããå¬ããã§ãïŒ SREã®ç¥èå°å³ââ âåºç€ç¥èããçŸå Žã§ã®å®è·µãŸã§ åéç°ã玹ä»ããæ¬ã¯ããSREã®ç¥èå°å³ããšããæžç±ã§ãïŒ gihyo.jp ç§èªèº«ãä»å¹ŽããSREæ¥åã«æºããããšã«ãªã£ããããSREé¢é£ã®æžç±ãæ¢ããŠãããšãããã®æ¬ã«åºäŒããŸããïŒ èªãã§ã¿ãŠãSLIãSLOãThe Four Golden Signalsãšãã£ãSREæ¥åã§ãã䜿ãããçšèªã®æå³ããã£ãããšåŠç¿ããããšãã§ããŸãããçšèªã®æå³ãçè§£ããããšã§ãæ®æ®µäœæ°ãªã掻çšããŠããDatadogãªã©ã®ç£èŠããŒã«ãããã䜿ãããããªã£ãæ°ãããŸãã ãŸãããã®æžç±ãèªãã§ããã·ã¹ãã ã®ãæ»ããšå®ãããããšã©ãŒããžã§ããã«ã€ããŠæèããããã«ãªããŸãããåŒç€Ÿã§ã¯ãŸã æç¢ºã«SLOçãå®çŸ©ã§ããŠããããã§ã¯ãªãã®ã§ä»åŸã®èª²é¡ã§ãããæèã¥ããã§ããã®ã¯ããã£ãããªãšæã£ãŠããŸãïŒ ããã«ãæ®æ®µããŒã ã§è¡ã£ãŠããSREæ¥åãæ£ããè¡ããŠãããã®ãçãåããããã§ããã®ãããã£ãã§ããäŸãã°ãé害çºçæã«äœæããŠãããã¹ãã¢ãŒãã ã«ã€ããŠã¯ãæ¬ã«èšèŒãããŠããéããåçºé²æ¢ãããè¢«å®³ã®æå°åãã«åããå
·äœçãªãã¯ã¹ãã¢ã¯ã·ã§ã³ãŸã§èœãšã蟌ããŠããããšã確èªã§ããã®ã§ãããã¯ä»åŸãèªä¿¡ãæã£ãŠç¶ç¶ããŠããããã§ãã åŒç€Ÿã§ã¯AIãæŽ»çšãã¹ããéçºããŒã ã®åœ¢ã倧ããå€ãããŸããã æ¬æžã§ã¯ããŒã ããããžãŒã«ã€ããŠãè§ŠããããŠãããïŒã€ã®ããŒã ã¿ã€ããšïŒã€ã®äž»èŠãªã€ã³ã¿ã©ã¯ã·ã§ã³ã¢ãŒããå³è§£ã§ãããããã解説ãããŠããŸãããè²ã
ãªãã¿ãŒã³ã®SREã«ã€ããŠç¥ãããšãã§ããã®ã§ãèªçµç¹ã«ãã£ãåããã§ãããã粟é²ããŠããããã§ãïŒ SREæ¥åãå§ããããšã«ãªããSLIãSLOãªã©ã®åºç€çšèªãããã£ããçè§£ãããæ¹ã«ããããã§ãïŒ ãšã³ãžãã¢ãªã³ã°çµç¹è«ãžã®æåŸ
ããã«ã¡ã¯ãåå€å±ã§EMãããŠããããããïŒ @asashin227 ïŒã§ãã ç§ããå§ãããã®ã¯ãããšã³ãžãã¢ãªã³ã°çµç¹è«ãžã®æåŸ
ãã§ãã gihyo.jp æ¥ã
ãšã³ãžãã¢ãªã³ã°ã®çŸå Žã§çŽé¢ããæ§ã
ãªäžåçã«å¯ŸããŠããšã³ãžãã¢ãªã³ã°çµç¹è«ãžã®æåŸ
ãã¯ãããžãã¹ãçµç¹ãã³ãã¥ãã±ãŒã·ã§ã³ã®æ§é çãªèª²é¡ãšããŠæãçŽããã©ã®ããã«åãåãã¹ããã説æããŠããŸãã ãã®æ¬ãèªãã ããšã§ãäžç¢ºå®æ§ãããã«æå°åããããããäžç¢ºå®æ§ãåãå
¥ãããŸãŸãããã«åã«é²ãããããšããèŠç¹ãç¥ãããšãã§ããŸããã ãããžã§ã¯ããé²ããäžã§ãããããåãããªãã®ã§é²ããŸããããçµéšããªãããé£ããã§ãããšãã£ãã¡ã³ããŒããã®çžè«ãåããããšããããŸãã æ¬æžãèªãã ããšã§ãæªç¥ã®é åã«å¯ŸããŠããæ¬¡ã«é²ãããã®æ§é çãªèŠç¹ããæã£ãŠåãåããããã«ãªããŸããã çŸä»£ã¯AIã®é²åã«ãããå®è£
æ¹æ³ïŒHowïŒã«é ãæ©ãŸããã·ãŒã³ãåçã«æžããŸãããä»ç§ãã¡ãéäžãã¹ããªã®ã¯ããã©ã®ãããªèª²é¡ã解決ããã©ã®ãããªäŸ¡å€ãåµãã®ãããšããæ¬è³ªçãªåãã§ãã ãã®ãããªæä»£ã ããããããæªç¥ãæ¢ç¥ã«å€ããŠããããã»ã¹ããã®ãã®ã®éèŠæ§ãå¢ããŠããŸããèªåã®ç¥ããªãé åã«é£ã³èŸŒãããšãæããã仮説ãæã£ãŠææŠãç¶ããããã®ãã€ã³ãã»ããããããæè¡å以äžã«æ±ããããçŸä»£ã®éèŠãªãœããã¹ãã«ã§ã¯ãªãã§ããããã æ¬æžã¯ãçµç¹è«ã®è§£èª¬æžã§ã¯ãªããäžç¢ºå®ãªãã®AIæä»£ã§ãšã³ãžãã¢ãšããŠããããã¯ãªãŒããŒãšããŠãããã«æèããè¡åããããã®ãã€ã³ãã»ããã®äžå°ãäžããŠãããäžåã§ãã çŸç¶ã«é塿ãæããŠããæ¹ããæ°ããææŠã«èžã¿åºãåæ°ãæ¬²ããæ¹ã«ããã²æã«åã£ãŠããã ãããã§ãã ãã¶ã€ã³ã®äŒãæ¹ ã¯ãããŸããŠããããã¯ããã¶ã€ããŒã® hikky ã§ãã æè¿ã¯ã³ãŒããæžãæ©äŒãå¢ããŠããã®ã§ããšã³ãžãã¢ã«ããæžç±ç޹ä»ã«æ··ããŠããããŸããð¢ ç§ã玹ä»ããã®ã¯ããªã©ã€ãªãŒã ãã¶ã€ã³ã®äŒãæ¹ ãã§ãã www.oreilly.co.jp AIãšãŒãžã§ã³ãã®çºå±ã§ãã¶ã€ã³é åã«èžã¿èŸŒããšã³ãžãã¢ã®æ¹ãå¢ããŠããŸãããããã¶ã€ã³ã«çŽæ¥é¢ãããªãå Žåã§ããèªåãæžããã³ãŒãã«æ¿èªããããå Žé¢ã¯èª°ã«ã§ããããšæããŸããããã§åã£ãŠãåãé¢ããªãã®ããã³ãã¥ãã±ãŒã·ã§ã³ãã§ããæ¬æžã¯ãã®æ ¹ã£ãã«ããèãæ¹ãåŠã¹ãäžåãšãªã£ãŠããŸãã æ¬æžãæããŠãããããšã¯ã·ã³ãã«ã§ãã³ãã¥ãã±ãŒã·ã§ã³ã«ãããŠã èãã»äŒããã»ä¿¡é Œãç¯ã ããããã«å€§äºãããšããããšã§ããæåã«ããã°åœããåãªã®ã§ããããã®åœããåãäžçªé£ããã ããšãã°ãèããäžã€ãšã£ãŠããçžæã«ãã¡ãããšèªåã®è©±ãèããŠãããŠããããšæããŠããããŠããããã¹ã ãŒãºã«æ¬é³ãåŒãåºããŠãããããšãã£ã芳ç¹ããããŸãããäŒãããã«ã€ããŠããå°éçšèªã¯åãç¥èãæã€äººå士ã§ã¯å¹çã®è¯ãèšèã§ãããããã§ãªãçžæã«ã¯ãã€ãºã«ãªãåŸãŸããç«å Žã®éãçžæã«ã©ãå±ããããšããèŠç¹ãå¿
èŠãªã®ã§ãã æ¬æžãéããŠããšã³ãžãã¢ãããžãã¹ãµã€ãã®ã¡ã³ããŒã¯èªåãšéãç«å Žã§ç©äºãèŠãŠããããããåæã«æå³ãæ±²ã¿åãããšãããã€ã³ãã匷ããªããŸãããéãããããããäºããå°éããŠæ©ã¿å¯ãããšãã³ãã¥ãã±ãŒã·ã§ã³ã«ã¯æ¬ ãããŸãããAIãã©ãã ãé²åããŠãã人ãšäººãšã®å¯Ÿè©±ã¯å€ãããæ®ãç¶ããŸãã ä»è·çš®ã®ã¡ã³ããŒãšãã£ãšããŸã飿ºããŠãè¯ããã®ãå±ããŠãããããšæããŠããæ¹ã¯ããã²æã«åã£ãŠã¿ãŠãã ããïŒ æžãã¹ãã«ãèšèšã¹ãã«ãé£èºçã«äžããïŒ ããã°ã©ã ãèªãæè¡ GWäžã¯éŠãçããŠãå·Šãã»ãšãã©åããªãã£ãããšããšããŒã§ãã ç§ã¯æè¿ãã æžãã¹ãã«ãèšèšã¹ãã«ãé£èºçã«äžããïŒ ããã°ã©ã ãèªãæè¡ ããšããæžç±ãèªãã§ããŸããã bookplus.nikkei.com ãã®æ¬ã¯2024幎ã«çºå£²ãããåœæãäžåºŠæã«åã£ãã®ã§ãããæè¿ã®AIã®æ®åãªã©ãåããæ¹ããŠèªã¿è¿ããŠã¿ãããšã«ããŸããã å€ãã®ããã°ã©ãã³ã°æžã¯ãããã«ã³ãŒããæžãã(äŸ:ããã®å®è£
æ¹æ³ãXXå®è·µå
¥éãªã©)ãã«çŠç¹ãåœãŠããã®ãã»ãšãã©ã§ããã³ãŒãã®èªã¿æ¹ãã«ç¹åããæ¬ã¯çšã«æããŸããããããå®éã®æ¥åã§ã¯ã³ãŒããæžããããèªãæéã®ã»ããå§åçã«é·ããæ¯éã倧ããã®ãçŸå®ã§ããããã«ãè¿å¹Žã§ã¯ AI ãã³ãŒããçæããŠãããããã«ãªã£ããããæç€ºãããã³ãŒãã®æ£èª€ãæå³ãæ£ããçè§£ããåã¯ãããŸã§ä»¥äžã«éèŠãªã¹ãã«ã«ãªã£ãŠãããšæããŠããŸãã ãã®æ¬ã®åªããç¹ã¯ããçè«ããšãå®è·µããæç¢ºã«åããããŠããããšã§ãã ååã§ã¯ãã³ãŒããèªãéã®èŠç¹ãæèãã¹ããã€ã³ãã«ã€ããŠçè«ãšå°ãã®ãµã³ãã«ã³ãŒãããåŠã³ãåŸåã§ã¯ãããã§åŸãç¥èãæŽ»ãããŠå®éã«ããŸããŸãªã³ãŒããèªã¿è§£ããŠããæ§æã«ãªã£ãŠããŸãã ãµã³ãã«ã³ãŒãã«ã¯ãPython ãæ¡çšãããŠãããããèªã¿ããããå®éã®ä»äºã§ã®ã³ãŒãã§ãå®è·µããããã®ãé
åã§ãã æåŸã« æåŸãŸã§ãä»ãåãããã ãããããšãããããŸããïŒ ããããç°ãªãè·çš®ã®ã¡ã³ããŒã«ããéžæžã¯ãããã§ããã§ããããïŒ èšäºããŸãšããŠããŠãèªåèªèº«ãæã䌞ã°ããŠã¿ãããªãæžç±ããããŸããã AIã§ç°¡åã«æ
å ±ãæã«å
¥ãæä»£ã§ãããæ¬ãªãã§ã¯ã®èª¬åŸåãçŽåŸæãä»åæ¹ããŠæããŸããã ããæ°ã«ãªãæžç±ããããŸããããã²èªãã§ã¿ãŠãã ããïŒ herp.careers
Goã®time.Nowãšã¯ïŒ ãsynctestãæ·»ããŠã ã¯ããã« ãšããªãŒã§ãšã³ãžãã¢ããã£ãŠãããŸãã èµ€å· ã§ããé£äºç®¡çã¢ã㪠ãã«ã·ã« ã®éçºãéããŠGoãåãã§ããŸãã ãã€ãšããã»é£äºç®¡çã»äœé管çã»ã«ããªãŒèšç® - ãã«ã·ã« every, Inc. ãã«ã¹ã±ã¢ïŒãã£ãããã¹ ç¡æ ãµãšã以äžã®ã³ãŒããèŠãŠããGoã«ãããçŸåšæå»ã£ãŠãªããªãã âŠïŒããšãªããŸããã now := time.Now() OSããåã£ãŠæ¥ãŠããã®ã¯æ¢ç¥ãšããäžã§ãGoã®ã³ãŒãã§ãããã©ã®ãããªåœ¢ã§æ±ã£ãŠããã®ããsynctestã®ä»®æ³æå»ãè¿ãæåãã©ã®ããã«å®è£
ãããŠããã®ããªã©ãããããæ°ã«ãªã£ãã®ã§ã³ãŒãã远ã£ãŠããããšæããŸãã æ¬èšäºã§è©±ãããš Goã®æå»ã®æ±ãæ¹ Goã®çŸåšæå»ã®ååŸã®å®è£
ïŒããçšåºŠé«ã¬ã€ã€ãŒã®éšåã®ã¿ïŒ æ¬èšäºã§è©±ããªãããš ä»ããã°ã©ãã³ã°èšèªã®çŸåšæå»ã®ååŸæ¹æ³ãšã®éã ãã©ãããã©ãŒã å¥å®è£
ãªã©äœã¬ã€ã€ãŒã®è©³çް time.Now ã®æ»ãå€ã®äœããæ¹ ãŠã©ãŒã«ã¯ããã¯ãšã¢ããããã¯ã¯ãã㯠ãŸããOSãæäŸããæå»ãœãŒã¹ã«ã¯ã倧ãã2çš®é¡ãããŸãã çš®é¡ å
容 ç¹åŸŽ ãŠã©ãŒã«ã¯ãã㯠çŸå®ã§æ±ãããŠããæå»ãOSã¯UNIXãšããã¯ïŒ1970-01-01 UTCïŒããã®çµéç§æ°ãšããŠè¿ãããšãå€ã NTPè£æ£ã»ãµããŒã¿ã€ã ã»æå倿Žã§ éå»ã«å·»ãæ»ãããšããã ã¢ããããã¯ã¯ãã㯠ãã·ã³èµ·åãªã©ãèµ·ç¹ãšãããå調å¢å ããã«ãŠã³ã¿ å¿
ãå調å¢å ãæ¥ä»ãšããŠã®æå³ã¯æããªã ãããã®æ±ãã«ã€ããŠã time ããã±ãŒãžã®å
¬åŒããã¥ã¡ã³ã ã«æ¹éãæžãããŠããŸãã Operating systems provide both a âwall clock,â which is subject to changes for clock synchronization, and a âmonotonic clock,â which is not. The general rule is that the wall clock is for telling time and the monotonic clock is for measuring time. Rather than split the API, in this package the Time returned by time.Now contains both a wall clock reading and a monotonic clock reading; later time-telling operations use the wall clock reading, but later time-measuring operations, specifically comparisons and subtractions, use the monotonic clock reading. OSã¯ããŠã©ãŒã«ã¯ããã¯ããšãã¢ããããã¯ã¯ããã¯ãã®2ã€ãæäŸããŠããããŠã©ãŒã«ã¯ããã¯ã¯ã¯ããã¯åæã®ããã«å€æŽããããããã¢ããããã¯ã¯ããã¯ã¯å€æŽãããªããäžè¬çãªã«ãŒã«ãšããŠããŠã©ãŒã«ã¯ããã¯ã¯æå»ãç¥ãããïŒtelling timeïŒã«ãã¢ããããã¯ã¯ããã¯ã¯æéãæž¬ãããïŒmeasuring timeïŒã«äœ¿ããæ¬ããã±ãŒãžã§ã¯APIãåããã®ã§ã¯ãªãã time.Now ãè¿ã Time ã«ãŠã©ãŒã«ã¯ããã¯ãšã¢ããããã¯ã¯ããã¯ã®äž¡æ¹ã®èªã¿åãå€ãå«ããããšã«ããŠããã以éã®ãæå»ãç¥ããæäœã¯ãŠã©ãŒã«ã¯ããã¯ã®å€ãããæéãæž¬ããæäœïŒå
·äœçã«ã¯æ¯èŒãšå·®åïŒã¯ã¢ããããã¯ã¯ããã¯ã®å€ã䜿ãã time.Timeã®æ§é ããŠã©ãŒã«ïŒã¢ããããã¯ã®äž¡æ¹ã1ã€ã® Time ã§æ±ãããšããæ¹éãèžãŸããŠã src/time/time.go#L140-L161 ã§å®çŸ©ãããŠãã time.Time ã®æ§é ãèŠãŠã¿ãŸãããã type Time struct { // wall and ext encode the wall time seconds, wall time nanoseconds, // and optional monotonic clock reading in nanoseconds. // // From high to low bit position, wall encodes a 1-bit flag (hasMonotonic), // a 33-bit seconds field, and a 30-bit wall time nanoseconds field. // The nanoseconds field is in the range [0, 999999999]. // If the hasMonotonic bit is 0, then the 33-bit field must be zero // and the full signed 64-bit wall seconds since Jan 1 year 1 is stored in ext. // If the hasMonotonic bit is 1, then the 33-bit field holds a 33-bit // unsigned wall seconds since Jan 1 year 1885, and ext holds a // signed 64-bit monotonic clock reading, nanoseconds since process start. wall uint64 ext int64 // loc specifies the Location that should be used to // determine the minute, hour, month, day, and year // that correspond to this Time. // The nil location means UTC. // All UTC times are represented with loc==nil, never loc==&utcLoc. loc *Location } äžèº«ã¯ wall å
ã«æã£ãŠãã hasMonotonic ãã©ã°ã«ãã£ãŠ2ãã¿ãŒã³ã«åãæ¿ãããŸãã hasMonotonic = 1 ïŒãŠã©ãŒã«ïŒã¢ããããã¯ïŒ hasMonotonic = 0 ïŒãŠã©ãŒã«ã®ã¿ïŒ wall ãã©ã°(1) + ãŠã©ãŒã«ç§(33bit, 1885幎起ç¹) + ãŠã©ãŒã«ããç§(30bit) ãã©ã°(0) + 33bitç§ã¯æªäœ¿çš(0) + ãŠã©ãŒã«ããç§(30bit) ext ã¢ããããã¯ã¯ããã¯å€ ïŒããã»ã¹èµ·åããã®ããç§ïŒ ãŠã©ãŒã«ç§ ïŒè¥¿æŠ1幎起ç¹ã®ç¬Šå·ä»ã64bitïŒ loc ã¿ã€ã ãŸãŒã³ ã¿ã€ã ãŸãŒã³ ext ã hasMonotonic ã§æå³ãåãæ¿ããããã«ãªã£ãŠããã®ã¯ã wall ã®33bitç§ïŒ1885幎起ç¹ïŒã ãš 1885ã2157幎ã®çŽ272幎å ãã衚çŸã§ããªãããã§ãã time.Date(1500, ...) ã®ãããªç¯å²å€ã®æå»ãæ±ã hasMonotonic = 0 ã®ã±ãŒã¹ã§ã¯ããŠã©ãŒã«ç§ã wall ã®33bitãã ext (int64, 西æŠ1幎起ç¹) ã«ç§»ããŠããåºãç¯å²ãã«ããŒããŸãããã㯠Time ã®ãµã€ãºãå¢ãããã«ãã¢ããããã¯ä»ãããšãåºãæå»ç¯å²ããäž¡ç«ãããããã®å·¥å€«ã§ããæ¬¡ç¯ã® time.Now å®è£
ã®äžã«ãã以äžã®ããã«33bitäžéã«èšåããã³ã¡ã³ããåºãŠããŸãã // This will be true after March 16, 2157. time.Now æ¬äœã®å®è£
ãããŸã§ææ¡ããäžã§ã src/time/time.go#L1347-L1361 ã«ãã time.Now ã®å®è£
ãèŠãŠãããŸãïŒGo 1.26.3 çŸåšïŒã // Now returns the current local time. func Now() Time { sec, nsec, mono := runtimeNow() if mono == 0 { return Time{ uint64 (nsec), sec + unixToInternal, Local} } mono -= startNano sec += unixToInternal - minWall if uint64 (sec)>> 33 != 0 { // Seconds field overflowed the 33 bits available when // storing a monotonic time. This will be true after // March 16, 2157. return Time{ uint64 (nsec), sec + minWall, Local} } return Time{hasMonotonic | uint64 (sec)<<nsecShift | uint64 (nsec), mono, Local} } ã³ãŒãã«åºãŠãã宿°ã¯åãã src/time/time.go ã® L163-L169 ïŒ hasMonotonic ãªã©ïŒãš L535-L568 ïŒ unixToInternal ãªã©ïŒãããã³ L1341 ïŒ startNano ïŒã«ä»¥äžã®ããã«å®çŸ©ãããŠããŸããïŒç°¡åã®ããäžéšçç¥ããŠèšè¿°ããŠããŸãïŒ const ( secondsPerDay = 24 * 60 * 60 // 西æŠ1幎1æ1æ¥ ã UNIXãšããã¯(1970-01-01) ã®ç§æ° unixToInternal int64 = ( 1969 * 365 + 1969 / 4 - 1969 / 100 + 1969 / 400 ) * secondsPerDay // 西æŠ1幎1æ1æ¥ ã 1885幎1æ1æ¥ ã®ç§æ° wallToInternal int64 = ( 1884 * 365 + 1884 / 4 - 1884 / 100 + 1884 / 400 ) * secondsPerDay ) const ( hasMonotonic = 1 << 63 // wall ã®æäžäœbitã«ç«ãŠããã©ã° minWall = wallToInternal // wall ã®33bitç§ã®èµ·ç¹ïŒ= 1885å¹ŽïŒ nsecShift = 30 // wall ã«ç§ãè©°ãããšãã®ã·ããé ) // ããã»ã¹èµ·åæç¹ã®ã¢ããããã¯å€ïŒruntime åæåæã«ã»ãããããïŒ var startNano int64 (1969*365 + 1969/4 - 1969/100 + 1969/400) ã®åŒã¯é幎ãèæ
®ããŠãã®å¹ŽãŸã§ã®æ¥æ°ãèšç®ããŠããŸããããã« secondsPerDay ãæããããšã§ã西æŠ1幎1æ1æ¥ãããã®å¹ŽãŸã§ã® ç§æ° ãã«ãªããŸãã unixToInternal ã¯1970幎ã wallToInternal ã¯1885幎ãŸã§ã®ããã«ããããŸãã 圹å²ãæŽçãããšä»¥äžã®ãšããã§ãã 宿° åœ¹å² unixToInternal OSãè¿ãUNIXç§ã ã西æŠ1幎起ç¹ã ã«å€æãããªãã»ãã minWall (= wallToInternal ) 西æŠ1幎起ç¹ã ã1885幎起ç¹ã ã«ããããªãã»ããïŒ wall ã®33bitç§ã®åºæºåããïŒ nsecShift wall ã«ç§ãè©°ãããšãå·Šã«30bitã·ããããŠããç§ã®å Žæã空ãã hasMonotonic ã¢ããããã¯ãå
¥ã£ãŠãããã®ãã©ã°ïŒ wall ã®æäžäœbitïŒ startNano ããã»ã¹èµ·åæç¹ã®ã¢ããããã¯å€ããããåŒãããšã§ ext ã ãããã»ã¹èµ·åããã®çµénsã ã«æ£èŠåãã Local loc ã«å
¥ããããã©ã«ãã®ã¿ã€ã ãŸãŒã³ïŒ *Location ïŒ ããããèžãŸããŠããäžåºŠ time.Now ãèªã¿çŽããšã3ãã¿ãŒã³ã§ Time ãçµã¿ç«ãŠãŠããããšãããããŸãã func Now() Time { // OSããçŸåšã®ãŠã©ãŒã«ç§ã»ããç§ã»ã¢ããããã¯å€ãååŸ sec, nsec, mono := runtimeNow() // ããã¿ãŒã³1ãã¢ããããã¯ã¯ããã¯ãåããªãã£ãç°å¢ // â ãŠã©ãŒã«ã¯ããã¯ã ãã ext ã«å
¥ããŠè¿ãïŒhasMonotonic = 0 ã®ã¬ã€ã¢ãŠãïŒ if mono == 0 { // sec(UNIXç§) + unixToInternal ã§ã西æŠ1幎起ç¹ã®ç§ãã«å€æããext ã«è©°ãã return Time{ uint64 (nsec), sec + unixToInternal, Local} } // 以é㯠mono ãã mono -= startNano // ã¢ããããã¯ããããã»ã¹èµ·åããã®çµénsãã«æ£èŠå sec += unixToInternal - minWall // sec ãã1885幎起ç¹ã®ç§ãã«å€æïŒ33bité åã«è©°ããæºåïŒ // ããã¿ãŒã³2ã33bitã«åãŸããªãïŒ= 2157幎3æ16æ¥ä»¥éïŒ // â ã¢ããããã¯ã諊ããŠããŠã©ãŒã«ç§ã¯ ext ã®æ¹ã«çœ®ãïŒhasMonotonic = 0 ã®ã¬ã€ã¢ãŠãïŒ if uint64 (sec)>> 33 != 0 { // sec ã¯ããŸ1885幎起ç¹ãminWall ãè¶³ãæ»ããŠã西æŠ1幎起ç¹ãã«æ»ããŠãã ext ãž return Time{ uint64 (nsec), sec + minWall, Local} } // ããã¿ãŒã³3ãéåžžãã¹ // â hasMonotonic ãã©ã°ãç«ãŠããŠã©ãŒã«ã»ã¢ããããã¯äž¡æ¹ã wall / ext ã«è©°ãã // - sec ã¯1885幎起ç¹ã®ãŸãŸ wall ã®33bité åãžïŒ<< nsecShift ã§ããç§ã®å Žæã空ã㊠| ã§åæïŒ // - mono ã¯æ£èŠåæžã¿ã®å€ããã®ãŸãŸ ext ãž return Time{hasMonotonic | uint64 (sec)<<nsecShift | uint64 (nsec), mono, Local} } runtimeNow() ã®äžèº« runtimeNow() 㯠time ããã±ãŒãžåŽã§ã¯ã·ã°ããã£ã ãæžãããŠãããå®äœã¯ src/runtime/time.go#L16-L31 ã«ãããŸãã //go:linkname time_runtimeNow time.runtimeNow func time_runtimeNow() (sec int64 , nsec int32 , mono int64 ) { if bubble := getg().bubble; bubble != nil { sec = bubble.now / ( 1000 * 1000 * 1000 ) nsec = int32 (bubble.now % ( 1000 * 1000 * 1000 )) // Don't return a monotonic time inside a synctest bubble. // If we return a monotonic time based on the fake clock, // arithmetic on times created inside/outside bubbles is confusing. // If we return a monotonic time based on the real monotonic clock, // arithmetic on times created in the same bubble is confusing. // Simplest is to omit the monotonic time within a bubble. return sec, nsec, 0 } return time_now() } åå²ã¯2ã€ãããŸãã synctest bubble ã®åå² : å®è¡äžã®ãŽã«ãŒãã³ã synctest ã®ããã«å
ã«ããå Žåãããã«ã®ä»®æ³æå» bubble.now ã ãŠã©ãŒã«ç§ã»ããç§ãšããŠè¿ã ãã¢ããããã¯ã¯ 0 ãè¿ããŸãã éåžžã®åå² : time_now() ãåŒã³åºããŸããããã®å®äœã¯ãã©ãããã©ãŒã å¥ã«å®è£
ãããŠãããæçµçã«ã¯ã©ããOSãæäŸããæå»ååŸAPIãå©ããŠããŸãã time_now() ã®å®è£
ã¯äœã¬ã€ã€ãŒã«è¿ã話ã«ãªãã®ã§ä»åã¯è§ŠããŸããã bubble.now ã¯ã src/runtime/synctest.go#L186-L187 ã® synctestRun ã§åæåãããŸãã const synctestBaseTime = 946684800000000000 // midnight UTC 2000-01-01 bubble.now = synctestBaseTime ã¢ããããã¯ã䜿ããªãçç±ã«ã€ããŠã¯ãã³ã¡ã³ãã«æžãããŠããŸãã以äžãåèš³ã§ãã synctestããã«å
ã§ã¯ã¢ããããã¯æå»ãè¿ããªãããã«ããã ãã§ã€ã¯ã¯ããã¯ã«åºã¥ããã¢ããããã¯æå»ãè¿ããŠããŸããšãããã«å
ã§äœã£ãæå»ãšããã«å€ã§äœã£ãæå»ã®ããã ã§ã®èšç®çµæãçŽãããããªãã äžæ¹ã§å®ã¢ããããã¯ã¯ããã¯ã«åºã¥ããã¢ããããã¯æå»ãè¿ããŠããåãããã«å
ã§äœã£ãæå»å士ã®èšç®ãçŽãããããªãã ãã£ãšãã·ã³ãã«ãªè§£ã¯ãããã«å
ã§ã¯ã¢ããããã¯æå»ãçç¥ããããšã ã ã¢ããããã¯ã¯ããã¯ã¯ãã·ã³èµ·åãèµ·ç¹ãšãããã®ãªã®ã§ããŠã©ãŒã«ã¯ããã¯ã ãä»®æ³æå»ãé²ããŠãäž¡è
ã®å€ãé£ãéã£ãŠããŸããŸããäžæ¹ã§ synctestBaseTime ãèµ·ç¹ã«ããã¢ããããã¯å€ãå¥éçšæãããšããéžæè¢ããããŸããããã®å Žåãããã«å€ã§ååŸãã Time ãšã®å·®åèšç®ã§å®æéãšããã«å
ä»®æ³æéãæ··åšããŠããŸããŸããããããé¿ããããã«ãããã«å
ã§ã¯ãŠã©ãŒã«ã¯ããã¯ã®ã¿ãæ±ãå®è£
ã«ãªã£ãŠããããšããããšã§ããã ãŸãšã time.Now() ã®çµè·¯ã¯ä»¥äžã®ããã«ãªã£ãŠããããšãããããŸããã time.Now() â â â (sec, nsec, mono) ãååŸ âââ time.runtimeNow() ââ linkname âââ runtime.time_runtimeNow() â âââ synctest bubble å
â sec = bubble.now / 1e9 (ããã«ä»®æ³æå») â nsec = bubble.now % 1e9 â mono = 0 (ããã«å
ã§ã¯monoãè¿ããªã) â âââ éåžžçµè·¯ runtime.time_now() (ãã©ãããã©ãŒã å¥å®è£
) ââ OSãæäŸããæå»ååŸAPIãåŒã¶ â â â¡ åãåã£ãå€ã Time{wall, ext, loc} ã«çµã¿ç«ãŠãŠè¿ã â âââ mono == 0 â hasMonotonic=0, ext ã«ã西æŠ1幎起ç¹ãŠã©ãŒã«ç§ã âââ éåžž (33bit以å
) â hasMonotonic=1, wall=ãã©ã°|33bitç§(1885幎起ç¹)|30bitããç§, ext=mono(ããã»ã¹èµ·åããã®ns) âââ 33bit溢ã (2157幎以é) â hasMonotonic=0, ext ã«ã西æŠ1幎起ç¹ãŠã©ãŒã«ç§ã Goãæ±ãæå»ã®æ§é ãšãã®èšèšçç±ãsynctestã®åå²å®è£
ããããŠãŠã©ãŒã«ãšã¢ããããã¯ãå·§ã¿ã«çµã¿åããã工倫ãç¥ãããšãã§ãããšãŠãæºè¶³ããŠããŸãããã©ãããã©ãŒã ããšã®å®è£
ã¯ããŸãã¯èªåã䜿ã£ãŠããarm64ããèŠãŠã¿ãããšæããŸãã æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããïŒ åè Package time - pkg.go.dev Package testing/synctest - pkg.go.dev Go: src/time/time.go Go: src/runtime/time.go Go: src/runtime/synctest.go Go 1.9 Release Notes - Monotonic Clocks Proposal: Monotonic Elapsed Time Measurements in Go
ã¯ããã« ããã«ã¡ã¯ãã«ãŒã決æžéšã«ãŒã決æžãµãŒãã¹Aãããã¯ã® éå Ž ã§ããZOZOTOWNå
ã®ã«ãŒãæ©èœãæ±ºæžæ©èœã®éçºãä¿å®éçšãæ
åœããŠããŸãã çŸåšãZOZOTOWNã®ã«ãŒã決æžç»é¢ã¯ãªãã¬ã€ã¹ãé²è¡äžã§ããæ¢åã·ã¹ãã ãšãªãã¬ã€ã¹åŸã®ã·ã¹ãã ã䞊è¡ããŠéçºãããäžãæ¢åã·ã¹ãã ãžã®ããŸããŸãªæ©èœæ¹ä¿®ãããªãã¬ã€ã¹åŽã«ãåã蟌ãå¿
èŠããããŸãããã®éãæ¡ä»¶ã®çµã¿åãããèšå€§ã«ãªããã¹ããæåã§ç¶²çŸ
çã«å®æœããããšãçŸå®çã§ãªããç¹ã«æ³šæéé¡ã®èšç®çµæã®æ£ç¢ºæ§ã人éã1ä»¶ãã€ç¢ºèªããã«ã¯å€§ããªã³ã¹ããããã£ãŠããŸããã æ¬èšäºã§ã¯ãClaude CodeãšPlaywright CLIãçµã¿åãããŠãèªç¶èšèªã«ããE2Eãã¹ããèªååããä»çµã¿ãã玹ä»ããŸããConfluenceïŒAtlassian瀟ãæäŸãããã¬ããžå
±æããŒã«ïŒã«èªç¶èšèªã§ãã¹ãæé ãèšè¿°ããããšã§AIãèªåŸçã«ãã©ãŠã¶ãæäœããèšç®æ€èšŒãå«ããŠE2Eãã¹ããå®çµãããŠããŸããã³ãŒããæžããã«ãã¹ããäœæã»å®è¡ã§ããããããã¹ãèªååã®å±äººåè§£æ¶ã«ãã€ãªãããŸããã ç®æ¬¡ ã¯ããã« ç®æ¬¡ èæ¯ã»èª²é¡ ãªãã¬ã€ã¹ã«äŒŽãäºééçºãšãã¹ãã®èª²é¡ ãªãåŸæ¥ã®E2Eèªååã§ã¯è¶³ããªãã£ãã®ã AIãšãŒãžã§ã³ãé§åã®E2Eãã¹ãã·ã¹ãã å
šäœã¢ãŒããã¯ã㣠Playwright CLIã«ãããã©ãŠã¶æäœ Agent Skillsã«ããæäœæé ã®å®çŸ© ãã¹ãã±ãŒã¹ã®èšèšãšæåŸ
å€ã®ä¿èšŒ ConfluenceããŒã¹ã®ãã¹ãã±ãŒã¹ç®¡ç èšç®ãå¿
èŠãªãã¹ãã®æåŸ
å€ä¿èšŒ ãã¹ãå®è¡ã®6ã€ã®Step ãã¹ãæ¯æŽããŒã«ã®æ§ç¯ atlassian-cliïŒConfluenceæäœã®CLI zozo-sql-server-cliïŒSQL Serverã¯ãšãªå®è¡CLI AIãšãŒãžã§ã³ããå¿
èŠãªããŒã«ãèªãäœã åŸæ¥ã®ãã¹ãèªååãšã®æ¯èŒ å®è·µããåŸãããç¥èŠ ãã¹ãã±ãŒã¹ã®å®çžŸ å®è·µãéããæ°ã¥ã ãŸãšã èæ¯ã»èª²é¡ ãªãã¬ã€ã¹ã«äŒŽãäºééçºãšãã¹ãã®èª²é¡ åé ã®éããZOZOTOWNã®ã«ãŒã決æžç»é¢ã§ã¯ãªãã¬ã€ã¹ãé²è¡äžã§ããæ¢åã·ã¹ãã ãšãªãã¬ã€ã¹åŸã®ã·ã¹ãã ã䞊è¡ããŠåäœããæéäžãæ¢åã·ã¹ãã ã«å¯ŸããããŸããŸãªæ©èœæ¹ä¿®ããªãã¬ã€ã¹åŽãžåã蟌ãå¿
èŠããããŸãã ãããã®æ¹ä¿®ããã¹ãŠåã蟌ã¿ãæ¡ä»¶ã®çµã¿åãããççºçã«å¢å ãããã¹ãã±ãŒã¹ãæ€èšŒããå·¥æ°ã倧ããªèª²é¡ãšãªããŸããã ããšãã°ãããæ¡ä»¶ã®æ©èœãåã蟌ãå Žåã以äžã®ãããªå åã絡ã¿åããŸãã ãŠãŒã¶ãŒã®å±æ§ïŒæ§å¥ã»å¹Žéœ¢ çïŒ è³Œå
¥ååã®çš®é¡ã»éé¡ å²åŒã»ã¯ãŒãã³ã®æç¡ ãã€ã³ãå©çšã®æç¡ ãã£ã³ããŒã³æéã®å
å€ ããããçµã¿åããããšã1ã€ã®æ¡ä»¶ã ãã§ 100件以äžã®ãã¹ãã±ãŒã¹ ãçºçããããšããããŸãããããã«ãåãã¹ãã±ãŒã¹ã§ã¯ 泚æãããŒã®è€æ°ç»é¢ ïŒé
éã»æ¯æãéžæãæ³šæã®ç¢ºèª çïŒã§è¡šç€ºå€ã®ç¢ºèªãå¿
èŠã§ãããããŠã PCçšã®ç»é¢ãšã¹ããŒããã©ã³ïŒä»¥äžãSPãšè¡šèšããŸãïŒçšã®ç»é¢ãããããååš ãããããæ€èšŒéã¯å®è³ªçã«ããã«åã«ãªããŸãã ã«ãŒã決æžç»é¢ã§ã¯ã泚æéé¡ã®èšç®ããžãã¯ã«ããŸããŸãªèŠçŽ ãé¢ãã£ãŠãããåè¿°ã®éãæ¡ä»¶ããšã«æ¡ä»¶ã®çµã¿åããã倧ãããªããã¡ã§ãããããã«ãæåŸ
å€ã¯è€éãªèšç®åŒã§æ±ºãŸãããã人éã1ä»¶ãã€æèšç®ããããã§ç»é¢ã®è¡šç€ºãšç
§åããã«ã¯å€ãã®æéãããã£ãŠããŸããã ãªãåŸæ¥ã®E2Eèªååã§ã¯è¶³ããªãã£ãã®ã ZOZOTOWNã§ã¯ãæåãã¹ãã«å ããŠå質管çéšã«ããã³ãŒãããŒã¹ã®E2Eèªåãã¹ããæŽ»çšããŠããŸãããããããã®ãããªåŸæ¥ã®ã³ãŒãèšè¿°åã®èªåãã¹ãã䜿ã£ãã¢ãããŒãã§ã¯ä»¥äžã®èª²é¡ããããŸããã ããã°ã©ãã³ã°ã¹ãã«ãžã®äŸå ïŒCSSã»ã¬ã¯ã¿ãããŒã«ã䜿ã£ãèŠçŽ ç¹å®ã®ã³ãŒããæžãå¿
èŠããããããéçºè
ã§ãªããã°äœæã»ä¿å®ãé£ãã UI倿Žãžã®è¿œåŸã³ã¹ã ïŒUIã®å€æŽã«å¿ããŠãèŠçŽ ç¹å®ã®æ¹æ³ããã¹ãå
容ã®ã¡ã³ããã³ã¹ãå¿
èŠã«ãªã ãã¹ãã³ãŒãã®å±äººå ïŒèšè¿°ã»ä¿å®ã§ãã人ãéããããããç¹å®ã®éçºè
ãžã®äŸåãçãã å®çŸãããã£ãã®ã¯ã ãã¹ãæé ãèªç¶èšèªã§æžãã ãã§ãAIãèŠçŽ ãèªåã§èŠã€ããŠæäœããèšç®æ€èšŒãŸã§å®çµããä»çµã¿ ã§ãããã®ããã®ã¢ãããŒããšããŠãClaude Codeã®Agent SkillsãšPlaywright CLIãçµã¿åãããèªååã·ã¹ãã ãæ§ç¯ããŸããã AIãšãŒãžã§ã³ãé§åã®E2Eãã¹ãã·ã¹ãã å
šäœã¢ãŒããã¯ã㣠æ§ç¯ããã·ã¹ãã ã®å
šäœåã¯ä»¥äžã®éãã§ãã åã³ã³ããŒãã³ãã®åœ¹å²ã¯æ¬¡ã®éãã§ãã ã³ã³ããŒãã³ã åœ¹å² ConfluenceããŒãž ãã¹ãããŒã¿ã»æé ã»æåŸ
å€ãèªç¶èšèªã§èšèŒãããã¹ãã±ãŒã¹ç®¡çã®å Ž ãšãŒãžã§ã³ã ïŒ zozotown-qa-tester ïŒ ãã¹ãã®å®è¡ãããŒãå®çŸ©ããClaude CodeãšãŒãžã§ã³ã Agent Skills ZOZOTOWNã®æäœæé ãCLIã®äœ¿ãæ¹ãMarkdownã§å®çŸ©ããåå©çšå¯èœãªãªãã¡ã¬ã³ã¹ èšç®ãµãŒãã¹ïŒTypeScriptïŒ æåŸ
å€ãç®åºããããã®èšç®ããžãã¯å®è£
Playwright CLI ã³ãã³ãã§ãã©ãŠã¶ãæäœããCLIããŒã« atlassian-cli Confluenceã®èªã¿åããšããšããã³ã¹ãå«ããçµæã®èšèŒãè¡ãèªäœCLI zozo-sql-server-cli SQL Serverãžã®ã¯ãšãªå®è¡ãšçµæã®ç»ååãè¡ãèªäœCLI Claude Codeã®ãšãŒãžã§ã³ããConfluenceãããã¹ãã±ãŒã¹ãèªã¿åããŸããAgent Skillsãåç
§ããªããPlaywright CLIã§ãã©ãŠã¶ãæäœããçµæãConfluenceã«æžãæ»ããŸãã Playwright CLIã«ãããã©ãŠã¶æäœ Playwright CLI ã¯ããã©ãŠã¶æäœãã³ãã³ãã§å®è¡ã§ããCLIããŒã«ã§ãããã¹ãã³ãŒããæžã代ããã«ãã³ãã³ã1ã€ã§ãã©ãŠã¶ãæäœã§ããŸããPlaywright MCPããããŸãããCLIã®æ¹ãããŒã¯ã³äœ¿çšéãç¯çŽã§ããããéžæããŠããŸãã ç¹åŸŽçãªã®ã¯ ã¹ãããã·ã§ããæ©èœ ã§ããããŒãžãéããšãPlaywright CLIã¯ããŒãžã®æ§é ãYAML圢åŒã§ååŸããŸãããã®ãšãåèŠçŽ ã«ã¯ ref çªå·ãä»äžãããŠããŸããAIã¯ãã®ã¹ãããã·ã§ãããèªãã§èŠçŽ ãç¹å®ãã ref çªå·ã䜿ã£ãŠæäœããŸãã # refçªå·ã䜿ã£ãŠèŠçŽ ãã¯ãªã㯠playwright-cli click e42 --session = pc # ããã¹ããå
¥å playwright-cli fill e15 " test@example.com " --session = pc # ã¹ã¯ãªãŒã³ã·ã§ãããååŸ playwright-cli screenshot --output screenshots/cart-top.png --session = pc CSSã»ã¬ã¯ã¿ãããŒã«ãæç€ºçã«æå®ããªããŠããAIãã¹ãããã·ã§ãããè§£éããŠèŠçŽ ãç¹å®ã§ããŸãããã®ãããã»ã¬ã¯ã¿ããŒã¹ã®å®è£
ã«æ¯ã¹ããšã軜埮ãªUI倿Žã«ã¯è¿œåŸãããããªããŸãã PCãšSPã®åãæ¿ãã¯èšå®ãã¡ã€ã«ã§è¡ããŸãã // playwright-cli.jsonïŒPCçšïŒ { " browser ": { " launchOptions ": { " headless ": false } , " isolated ": false , " contextOptions ": { " viewport ": { " width ": 1400 , " height ": 1080 } } } } // playwright-cli-sp.jsonïŒSPçšïŒ { " browser ": { " launchOptions ": { " headless ": false } , " isolated ": false , " contextOptions ": { " viewport ": { " width ": 430 , " height ": 932 } , " userAgent ": " Mozilla/5.0 (iPhone; ...) Safari/604.1 ", " isMobile ": true , " hasTouch ": true } } } PCãã¹ããšSPãã¹ã㯠å¥ã»ãã·ã§ã³ã§åæã«å®è¡ã§ãã ããããã¹ãæéã®ççž®ã«ãè²¢ç®ããŸãã Agent Skillsã«ããæäœæé ã®å®çŸ© Agent Skillsã§ã¯ãClaude Codeã®Skillæ©èœã掻çšããŠZOZOTOWNåºæã®æäœæé ãå®çŸ©ããŠããŸããã³ãŒãããŒã¹ã®Playwrightã«ãããPage Object Modelã«çžåœãã圹å²ããMarkdownã«ããèªç¶èšèªã®æé æžã§æ
ãã€ã¡ãŒãžã§ãã æäœæé ã¯æ¬¡ã®ããã«èªç¶èšèªã§èšè¿°ããŸãã # ãã°ã€ã³æé ãªãã¡ã¬ã³ã¹ ## æé 1. 以äžã®ããŒãžãéã - PC: ` /_member/login.html ` - SP: ` /sp/_member/login.html ` 2. ` ã¡ãŒã«ã¢ãã¬ã¹ ` å
¥åæ¬ã«ã¡ãŒã«ã¢ãã¬ã¹ãå
¥åããã 3. ` ãã¹ã¯ãŒã ` å
¥åæ¬ã«ãã¹ã¯ãŒããå
¥åããã 4. ` ãã°ã€ã³ ` ãã¿ã³ãã¯ãªãã¯ããã ãã¹ãã±ãŒã¹ã«ããã¹ããŠãŒã¶ãŒAã®ã¢ã«ãŠã³ãã§ãã°ã€ã³ããããšæžãã°ããšãŒãžã§ã³ãããã®ãªãã¡ã¬ã³ã¹ãåç
§ããŠæé ãå®è¡ããŸããæäœããªãã¡ã¬ã³ã¹ãšããŠæšæºåããŠããããšã§ã èª°ãæžãããã¹ãã±ãŒã¹ã§ãåãæäœãåçŸã§ããŸã ã ä»åå®çŸ©ããäž»èŠãªãªãã¡ã¬ã³ã¹ã¯æ¬¡ã®éãã§ãã login-flow.md ïŒãã°ã€ã³æé ïŒPC / SP察å¿ïŒ add-to-cart-flow.md ïŒååãã«ãŒããžæå
¥ããæé order-flow.md ïŒæ³šæãããŒïŒã«ãŒãTOP â é
éã»æ¯æãéžæ â æ³šæç¢ºèª â æ³šæå®äºïŒ sql-execution-flow.md ïŒSQL Serverãžã®ã¯ãšãªå®è¡æé ãã¹ãã±ãŒã¹ã®èšèšãšæåŸ
å€ã®ä¿èšŒ ConfluenceããŒã¹ã®ãã¹ãã±ãŒã¹ç®¡ç ãã¹ãã±ãŒã¹ã¯ConfluenceããŒãžã§ç®¡çããŠããŸããããŒãžã®æ§æã¯æ¬¡ã®éãã§ãã ã»ã¯ã·ã§ã³ å
容 èŠä»¶ ãã¹ãå¯Ÿè±¡ã®æ©èœä»æ§ å åãšæ°Žæº ãã¹ãã«é¢ããæ¡ä»¶ã®æŽãåºãïŒãã¯ã€ãããã¯ã¹èгç¹ïŒ ãã·ãžã§ã³ããŒãã« æ¡ä»¶ã®çµã¿åãããã¿ãŒã³ ãã¹ãããŒã¿ ç°å¢URLããŠãŒã¶ãŒæ
å ±ãååæ
å ± ãã¹ãã±ãŒã¹ æé ããã©ã¡ãŒã¿ãæåŸ
å€ãå®è¡çµæããšããã³ã¹ ãã¹ãå®è¡åŸã¯ãClaude Codeããã®ããŒãžã«çµæïŒOK / NGïŒãšã¹ã¯ãªãŒã³ã·ã§ãããèªåã§æžã蟌ã¿ãŸãã å®éã«å®æœãããã¹ãã±ãŒã¹ã®äŸã玹ä»ããŸãã æ³šæéé¡ã«é¢ããèšç®ããžãã¯ã®æ€èšŒãã¹ã ïŒæ³šæã®ç¢ºèªç»é¢ã«è¡šç€ºãããéé¡ããèšç®ãµãŒãã¹ã®ç®åºçµæãšäžèŽããããšãæ€èšŒããŸããåè¿°ã®å åãçµã¿åãããæ°åä»¶ã®ãã¿ãŒã³ãå®çŸ©ããŠããŸãã ãã¹ãã®æé ã¯ãConfluenceããŒãžã«æ¬¡ã®ããã«èªç¶èšèªã§èšè¿°ãããŠããŸãã 1. ã«ãŒãã空ã«ãã 2. ãã©ã¡ãŒã¿ïŒååïŒã«èšèŒãããŠããååãã«ãŒãã«å
¥ãã 3. 泚æãžé²ã¿ããã©ã¡ãŒã¿ïŒæ¯æãæ¹æ³ïŒã®æ¯æãæ¹æ³ãéžæããŠæ³šæç¢ºèªç»é¢ã衚瀺ãã 4. 衚瀺ãããŠããèšç®çµæã®å€ã OrderAmountCalculationService.getã®å€ãš äžèŽããŠããããšã確èªãã 5. viewportã®ã¹ã¯ãªãŒã³ã·ã§ãããååŸãã 6. ãã©ã¡ãŒã¿ïŒãã€ã³ãå©çšïŒã«èšèŒã®ãã€ã³ããå©çšãã 7. 衚瀺ãããŠããèšç®çµæã®å€ãäžèšèšç®ãµãŒãã¹ã®å€ãšäžèŽããŠããããšã確èªãã ... ãã®æé ãClaude Codeãèªã¿åããAgent Skillsãåç
§ããªãããã©ãŠã¶ãæäœããŸãã èšç®ãå¿
èŠãªãã¹ãã®æåŸ
å€ä¿èšŒ èšç®çµæã®æ€èšŒã¯ãä»åã®åãçµã¿ã§æãéèŠãªãã€ã³ãã§ãã èª²é¡ ïŒæ³šæéé¡ã«é¢ããè€éãªèšç®çµæãã人éãæèšç®ããŠæåŸ
å€ãšç
§åããã«ã¯å€§ããªå·¥æ°ãå¿
èŠã§ããç¹ã«ãå²åŒã»ã¯ãŒãã³ã»ãã€ã³ãå©çšã»çšçã絡ã¿åãèšç®ã¯ããã¹ãçºçããããæéãããã£ãŠããŸããã 解決ç ïŒPlaywrightãã¹ãçšãªããžããªã«TypeScriptã§èšç®ãµãŒãã¹ãå®è£
ãããããããæåŸ
å€ãç®åºããŠãããŸããClaude Codeã¯ãã¹ãèšç»ã®äœææã«èšç®ãµãŒãã¹ãåŒã³åºããæåŸ
å€ããã©ã³ã«åºåããŠããããã©ãŠã¶ã®è¡šç€ºå€ãšç
§åããŸãã // ZOZOCARDéå
ãã€ã³ããèšç®ããã¯ã©ã¹ export class ZozocardRewardPointCalculationService { private static readonly POINT_RETURN_RATE = 0.05 ; public get ( goodsPriceWithoutTax : number , quantity : number , taxRate : number ): number { // ZOZOCARD éå
ãã€ã³ãã®èšç®åŠç... } } ãã®èšç®åŠçã¯ãã·ã¹ãã ãšåã仿§ãããšã«Claude Codeã§çæãã ç¬ç«ããå®è£
ã«ãªã£ãŠããŸããã·ã¹ãã åŽã®å®è£
ã³ãŒãããã®ãŸãŸæµçšãããšãåããã°ãå
±æããŠããŸããŸãã仿§ãå¥å®è£
ããããšã§ã ã·ã¹ãã åŽãšãã¹ãåŽã®ç¬ç«æ§ ãä¿ã£ãŠããŸããããã«ãããæåŸ
å€ãšã·ã¹ãã ã®è¡šç€ºå€ãç
§åãããšãã«ãåãªãäžè²«æ§ãã§ãã¯ã§ã¯ãªããã·ã¹ãã åŽã®å®è£
ã仿§ã©ããããæ€èšŒã§ããŸããå®éã«ããã®ãã¹ããéããŠã·ã¹ãã åŽã®å®è£
ã仿§ãæ£ããèæ
®ã§ããŠããªãã±ãŒã¹ãæ€ç¥ã§ããäºäŸããããŸããã æåŸ
å€ã®æ€èšŒãããŒã¯æ¬¡ã®éãã§ãã Claude Codeã¯ãã¹ãèšç»ãäœæããæ®µéã§èšç®ãµãŒãã¹ãå®è¡ããå
šãã¹ãã±ãŒã¹ã®æåŸ
å€ãäºåã«ç®åºããŸãããã¹ãå®è¡æã«ã¯ããã©ãŠã¶ã§ååŸãã衚瀺å€ãšäºåã«ç®åºããæåŸ
å€ãç
§åããŸãã ãã¹ãå®è¡ã®6ã€ã®Step ãšãŒãžã§ã³ãå®çŸ©ãã¡ã€ã«ïŒ zozotown-qa-tester.md ïŒã§ã¯ããã¹ãå®è¡ã次ã®6ã€ã®Stepã§å®çŸ©ããŠããŸãã --- name: zozotown-qa-tester description: ZOZOTOWN ã® QA ãã¹ããå®è¡ãããšãŒãžã§ã³ã skills: - playwright-cli - zozotown-operations - confluence-page-operations - atlassian-cli - zozo-sql-server-cli --- ## ãã¹ãå®è¡ãã㌠### 1. ãã¹ãã±ãŒã¹ã®ç¢ºèª ConfluenceããŒãžãããã¹ãã±ãŒã¹ãååŸãã 察象ã®éçºç°å¢ã»åææ¡ä»¶ã»æé ã»æåŸ
çµæãèªã¿åãã ### 2. ãã¹ãã±ãŒã¹ãã©ã³ã®äœæ ãã¹ãããŒã¿ã»æåŸ
å€ïŒèšç®ãµãŒãã¹ã®å®è¡çµæïŒã»å®è¡æé ãæŽçãã ` test-plans/ ` ãã£ã¬ã¯ããªã«Markdownãã¡ã€ã«ãšããŠåºåããã **ãŠãŒã¶ãŒã®æ¿èªãåŸãŠãããã¹ãå®è¡ã«é²ãã** ### 3. ãã¹ãæºå ãã©ãŠã¶ãèµ·åãããã°ã€ã³ãåæããŒã¿ã®ã»ããã¢ãããè¡ãã ### 4. ãã¹ãå®è¡ åã¹ãããã ` zozotown-operations ` ã®ãªãã¡ã¬ã³ã¹ã«åŸã£ãŠå®è¡ããã æé ãå®çŸ©ãããŠããªãæäœã¯ãå®éã«ãã©ãŠã¶ã§ç¢ºèªããŠæ°ãããªãã¡ã¬ã³ã¹ãäœæããã ### 5. çµæã®èšé² å®è¡çµæïŒOK / NGïŒãå€å®ããã¹ã¯ãªãŒã³ã·ã§ãããæ®åœ±ã㊠ConfluenceããŒãžã«çµæãšãšããã³ã¹ãæžã蟌ãã ### 6. çµæã®å ±å ãŠãŒã¶ãŒã«å®è¡çµæã®ãµããªãå ±åããã ç¹ã«éèŠãªã®ã¯ Step 2ã®ãã¹ãã±ãŒã¹ãã©ã³ã®äœæãšãŠãŒã¶ãŒæ¿èª ã§ããAIã¯é決å®çã«åäœããããããã¹ãã±ãŒã¹ã®è§£éãæå³ãšç°ãªãå¯èœæ§ããããŸããå®è¡åã«èšç»ãæç€ºããŠãŠãŒã¶ãŒã«ç¢ºèªããããšã§ã è§£éã®ãºã¬ãäºåã«æ€åº ã§ããŸãã ãŸããStep 4ã®ããªãã¡ã¬ã³ã¹ã«æé ããªãæäœã¯èªãäœæããããšããä»çµã¿ã«ããããšãŒãžã§ã³ããæ°ããæäœæé ãçºèŠãããã³ã«ãªãã¡ã¬ã³ã¹ãã¡ã€ã«ãèªåçã«è¿œå ãããŠãããŸãã䜿ãã»ã©ã«ãªãã¡ã¬ã³ã¹ãå
å®ãããã¹ãäœæãæ¥œã«ãªã£ãŠããä»çµã¿ã§ãã å®éã®ãã¹ãå®è¡ã§ã¯ããã¹ãèšç»ã®ç¢ºèªãšPC / SPã»ãã·ã§ã³ã®äžŠåå®è¡ãã¿ãŒããã«äžã§ç¢ºèªã§ããŸãã ãã¹ãæ¯æŽããŒã«ã®æ§ç¯ atlassian-cliïŒConfluenceæäœã®CLI Confluenceã®ãã¹ãã±ãŒã¹ããŒãžã詳现ã«åŠçãããããatlassian-cliãäœæããŸãããAtlassian MCPããããŸãããã¹ã¯ãªãŒã³ã·ã§ãããæ·»ä»ã§ããªããããREST APIãã©ããããCLIã§ãã ãã¹ãå®è¡ãããŒã§ã®äœ¿çšäŸã瀺ããŸãã # Confluence ã®ãã¹ãã±ãŒã¹ããŒãžãååŸ atlassian-cli confluence get-page 348678105 --body-format atlas_doc_format # ãã¹ãçµæã®ã¹ã¯ãªãŒã³ã·ã§ãããã¢ããããŒã atlassian-cli confluence upload-attachment 348678105 \ --file ./screenshots/confirm-pc.png # ãã¹ãçµæãããŒãžã«è¿œèš atlassian-cli confluence update-page 348678105 \ --body-file ./test-results/result.json \ --page-version 41 zozo-sql-server-cliïŒSQL Serverã¯ãšãªå®è¡CLI 泚æå®äºåŸã®DBããŒã¿ãæ€èšŒãããããzozo-sql-server-cliãäœæããŸãããæ³šæããŒã¿ãæ£ããä¿åãããŠããããSQLã§ç¢ºèªãã çµæãHTMLããŒãã«ãšããŠæç»ããŠPuppeteerã§ã¹ã¯ãªãŒã³ã·ã§ããå ããæ©èœãç¹åŸŽã§ãã # SQL ã¯ãšãªãå®è¡ããŠããŒãã«åœ¢åŒã§è¡šç€º zozo-sql-server-cli \ " SELECT total_amount, discount_amount FROM orders WHERE order_id = 12345 " # ã¯ãšãªçµæãã¹ã¯ãªãŒã³ã·ã§ããïŒHTMLããŒãã«ãšããŠæç»ïŒãšããŠä¿å zozo-sql-server-cli \ " SELECT total_amount, discount_amount FROM orders WHERE order_id = 12345 " \ --screenshot ./screenshots/order-db.png ãã®ã¹ã¯ãªãŒã³ã·ã§ããããã®ãŸãŸConfluenceã®ãšããã³ã¹ãšããŠæ·»ä»ããããšã§ãDBæ€èšŒã®èšŒè·¡ãèªåçã«èšé²ã§ããŸãã AIãšãŒãžã§ã³ããå¿
èŠãªããŒã«ãèªãäœã atlassian-cliãšzozo-sql-server-cliã¯ãããããClaude CodeãæŽ»çšããŠäœæããŸããã ãã¹ãèªååãé²ããäžã§ãConfluenceã«ã¹ã¯ãªãŒã³ã·ã§ãããæ·»ä»ãããããDBã®æ€èšŒçµæãç»åãšããŠä¿åãããããšãã£ãããŒãºãçãŸããŸãããããããCLIãšããŠClaude Codeã«å®è£
ããŠããããçæéã§å¿
èŠãªæ©èœãæããããšãã§ããŸããã AIãšãŒãžã§ã³ãã«å¿
èŠãªããŒã«ãAIèªèº«ãäœãã ãšããç¹ã¯ãèªååã®ãšã³ã·ã¹ãã ã倧å¹
ã«å éãããŸãã åŸæ¥ã®ãã¹ãèªååãšã®æ¯èŒ åŸæ¥ã®ã³ãŒãããŒã¹ã®E2Eèªåãã¹ããšãä»åæ§ç¯ããClaude Code + Playwright CLIã®ã¢ãããŒããæ¯èŒããŸãã èŠ³ç¹ ã³ãŒãããŒã¹ã®Playwright Claude Code + Playwright CLI ãã¹ãã±ãŒã¹ã®åœ¢åŒ TypeScript / JavaScriptã³ãŒã ConfluenceããŒãžïŒèªç¶èšèªïŒ èŠçŽ ã®ç¹å®æ¹æ³ CSSã»ã¬ã¯ã¿ / ããŒã« ã¹ãããã·ã§ããã®refçªå·ïŒAIãèªåç¹å®ïŒ æåŸ
å€ã®æ€èšŒ ããŒãã³ãŒããããã¢ãµãŒã·ã§ã³ èšç®ãµãŒãã¹ + AIã«ããç
§å UI倿Žãžã®èæ§ äœãïŒã»ã¬ã¯ã¿ã»ããŒã«ã®å€æŽå¯Ÿå¿ãå¿
èŠïŒ é«ãïŒã¹ãããã·ã§ããããŒã¹ã§æè»ã«å¯Ÿå¿ïŒ äœæã«å¿
èŠãªã¹ãã« ããã°ã©ãã³ã° ãã¡ã€ã³ç¥è + èªç¶èšèª æã倧ããªéãã¯ã ãã¹ãã³ãŒãã®èšè¿°ã»ä¿å®ã¹ãã«ããªããŠãE2Eãã¹ããäœæã»å®è¡ã§ãã ç¹ã§ãã Confluenceã§ãã¹ãæé ãæžãéã«ã¯ããã¹ããŠãŒã¶ãŒAã§ãã°ã€ã³ããããXXXã®ååãã«ãŒãã«å
¥ããããšãã£ãæ¥åžžçãªèšèã§èšè¿°ã§ããŸããAgent Skillsã®ãªãã¡ã¬ã³ã¹ã«ãã°ã€ã³ãã«ãŒãæå
¥ã®æé ãå®çŸ©ãããŠããããããã®èªç¶èšèªã®æç€ºã ãã§AIãæ£ç¢ºã«æäœãåçŸããŸãã ãŸããèšç®æ€èšŒã®èªååã«ããã人æã§ã¯é«ã³ã¹ãã ã£ãæåŸ
å€ç
§åãAIãå®è¡ã§ããããã«ãªããŸãããéçºè
ã¯å¥ã®æ¡ä»¶ã®éçºãé²ããªãããClaude Codeã«ãã¹ãã䞊è¡ããŠå®è¡ãããããšãã§ããŸãã å®è·µããåŸãããç¥èŠ ãã¹ãã±ãŒã¹ã®å®çžŸ å®éã«å®æœãããã¹ãã®å®çžŸã¯æ¬¡ã®éãã§ãã ãã¹ã察象 ãã¹ãã±ãŒã¹æ° 察象ç»é¢ ãã©ãããã©ãŒã æ¡ä»¶AïŒèšç®ããžãã¯ã®æ€èšŒïŒ ããã20ä»¶ 泚æãããŒã®åç»é¢ PC / SP æ¡ä»¶BïŒæ¡ä»¶ã®çµã¿åããæ€èšŒïŒ ããã50ä»¶ 泚æãããŒã®åç»é¢ PC / SP æåã§ã®ãããŒãšãä»åæ§ç¯ããAIãšãŒãžã§ã³ã掻çšåŸã®ãããŒãæ¯èŒãããšæ¬¡ã®ããã«ãªããŸãã 人ãè¡ãã®ã¯ããã¹ãèšç»ã®ã¬ãã¥ãŒã®ã¿ã§ããæ°åä»¶ã®ãã¹ãã±ãŒã¹ Ã è€æ°ããŒãž à PC / SPã®å
šãã¹ããClaude Codeã«ä»»ããããŸãããæ¡ä»¶Aã§ã¯è©³çްãªèšç®çµæããæ¡ä»¶Bã§ã¯è¥å€§åããæ¡ä»¶ã®çµã¿åãããæ€èšŒã§ãã人æã«ããæèšç®ã確èªã«ãããå·¥æ°ã倧ããæžãããŸããã å®è·µãéããæ°ã¥ã Agent Skillsã®ç²åºŠèšèš ïŒãã°ã€ã³ãã«ãŒãæå
¥ã泚æãããŒãšãããããª1ã€ã®æé ãšããŠæç€ºããç²åºŠãã¡ããã©ãããåå©çšããããã§ãã现ãããããšãªãã¡ã¬ã³ã¹ãå¢ããããŠç®¡çãé£ãããªããç²ããããšä»ã®ãã¹ãã±ãŒã¹ã§äœ¿ãã«ãããªããŸãã ãã¹ãèšç»æ¿èªãããŒã®å¹æ ïŒã2. ãã¹ãã±ãŒã¹ãã©ã³ã®äœæãã§AIãäœæããèšç»ãã¬ãã¥ãŒããããšã§ããã¹ãã±ãŒã¹ã®è§£éãã¹ãäºåã«æ€åºã§ããäºäŸããããŸãããã³ãŒãã£ã³ã°æãããã§ãããç§ã¯Claude Codeã®ãã©ã³ã¢ãŒããããå©çšããŸããäœãããããç¶¿å¯ã«èãããããã®ãèªåã確èªããããšã§ãããšã¯ãããå®è¡ããã ãã«ãªãã質ãé«ããªããšæããŠããŸãã èªå·±æ¹åãããªãã¡ã¬ã³ã¹ ïŒæªå®çŸ©ã®æäœã«ééããéããšãŒãžã§ã³ããå®éã«ãã©ãŠã¶ã§æäœããŠæé ã確èªããæ°ãããªãã¡ã¬ã³ã¹ãã¡ã€ã«ãèªåäœæããä»çµã¿ã¯å®çšçã§ããããã¹ããéããã»ã©ãªãã¡ã¬ã³ã¹ãå
å®ããç°å¢ãè²ãŠãŠããããšã§åŸã®ãã¹ãäœæãæ¥œã«ãªã£ãŠãããŸãã ãŸãšã æ¬èšäºã§ã¯ãClaude CodeãšPlaywright CLIãçµã¿åãããèªç¶èšèªE2Eãã¹ãã®æ§ç¯ãšå®è·µãã玹ä»ããŸãããConfluenceã«èªç¶èšèªã§ãã¹ãæé ãèšè¿°ããã ãã§AIãèªåŸçã«ãã©ãŠã¶ãæäœããèšç®æ€èšŒãå«ããŠE2Eãã¹ããå®çµãããããšãã§ããŸããã èšå€§ãªçµã¿åãããã¹ãã®èªååã»èšç®æ€èšŒã®æ£ç¢ºæ§æ
ä¿ã»ãã¹ãèªååã®å±äººåè§£æ¶ãšãã課é¡ãåæã«è§£æ±ºããéçºè
ãå¥ã®æ¡ä»¶ãé²ããªãããã¹ãã䞊è¡å®äºã§ããäœå¶ãå®çŸããŸãããä»åŸã¯ä»ã®ç»é¢ãžã®å±éãã宿çãªå®è¡ã«ãããªã°ã¬ãã·ã§ã³ã®æ€ç¥ãªã©ãæ€èšããŠãããããšèããŠããŸãã ZOZOã§ã¯ãäžç·ã«ãµãŒãã¹ãäœãäžããŠãã ããæ¹ãåéäžã§ãããèå³ã®ããæ¹ã¯ããã²æ¡çšããŒãžãã芧ãã ããã corp.zozo.com



























