ã³ãŒãã®ãã¹ãã§ã¯ããã¹ãŠãæ確ã«ãªããŸãïŒå°ãªããšããããããèšè¿°ããå¿ èŠããããšããäºå®ïŒã æ§æã®ãã¹ãã§ã¯ããã®ååšãã®ãã®ããå§ããŠããã¹ãŠãã¯ããã«æçœã§ã¯ãããŸããã 誰ããããããæžããŠããŸããïŒ ããã¯éèŠã§ããïŒ é£ããã§ããïŒ åœŒãã®å©ããåããŠã©ã®ãããªçµæãéæã§ããŸããïŒ
ãããéåžžã«æçšã§ããããšãå€æããŸããããããè¡ãããšã¯éåžžã«ç°¡åã§ãããåæã«æ§æã®ãã¹ãã«ã¯å€ãã®åŸ®åŠãªéãããããŸãã ã©ã®ãã®-å®éã®çµéšã«åºã¥ããŠç«ã®äžã«æãããŠããŸãã
ãã®è³æã¯ã Ruslan cheremin Cheremin ïŒãã€ãéè¡ã®Javaéçºè ïŒã«ããã¬ããŒãã®è»¢åã«åºã¥ããŠããŸãã 次ã¯äžäººç§°ã¹ããŒãã§ãã
ç§ã®ååã¯ã«ã¹ã©ã³ããã€ãéè¡ã§åããŠããŸãã ããããå§ããŸãã
ããã¹ãã¯ãããããããŸãããé ãããã¯ãã·ã¢èªã®ããã«æãããããããŸããã ããããããã¯çå®ã§ã¯ãããŸããã ããã¯éåžžã«å€ããŠå±éºãªèšèªã§ãã ç§ã¯ç°¡åãªãã·ã¢èªã«ç¿»èš³ããŸããïŒ
- ãã¹ãŠã®ãã£ã©ã¯ã¿ãŒãæ§æãããŠããŸã
- 泚æããŠäœ¿çšãã
- 圌èªèº«ã®è²»çšã§è¬å
ä»æ¥ã話ãããããšãç°¡åã«èª¬æããŸãã ã³ãŒãããããšããŸãïŒ
ã€ãŸããæåã¯äœããã®ã¿ã¹ã¯ããããããã解決ããããã®ã³ãŒããäœæãããšãããããåçãåŸãããŸãã äœããã®çç±ã§ãã®ã³ãŒããæ£ããæ©èœããªãå Žåãééã£ãã¿ã¹ã¯ã解決ããééã£ããéã皌ãã§ããŸãã ããžãã¹ã¯ãã®ãããªãéã奜ãŸãªã-圌ãã¯è²¡åè«žè¡šã§èŠãç®ãæªãã
ãã®ãããéèŠãªã³ãŒãã«ã¯ãã¹ãããããŸãïŒ
éåžžãããŸãã ä»ããããããã»ãŒå šå¡ããããæã£ãŠããŸãã ãã¹ãã¯ãã³ãŒããé©åãªåé¡ã解決ããé©åãªåçãäžããŠããããšã確èªããŸãã ãã ãããµãŒãã¹ã¯ã³ãŒãã«éå®ããããã³ãŒãã®æšªã«ãæ§æããããŸãã
å°ãªããšãç§ãåå ããã»ãšãã©ãã¹ãŠã®ãããžã§ã¯ãã§ã¯ããã®æ§æã¯äœããã®åœ¢ã§è¡ãããŸããã ïŒåæã®UIã®å Žåãæ§æãã¡ã€ã«ã¯ãããŸããã§ãããããã¹ãŠãUIãä»ããŠæ§æãããŠããããã€ãã®ã±ãŒã¹ããæãåºããŸããïŒãã®æ§æã«ã¯ãããŒããã¢ãã¬ã¹ãããã³ã¢ã«ãŽãªãºã ãã©ã¡ãŒã¿ãŒããããŸãã
æ§æããã¹ãããããšãéèŠãªã®ã¯ãªãã§ããïŒ
ããã«ç§isããããŸãïŒæ§æã®ãšã©ãŒã¯ãããã°ã©ã ã®å®è¡ã«ã³ãŒãã®ãšã©ãŒãšåãããã害ãåãŒããŸãã ãããããã³ãŒããééã£ãã¿ã¹ã¯ãå®è¡ããåå ã«ãªãå¯èœæ§ããããŸã-ãšäžèšãåç §ããŠãã ããã
æ§æã¯éåžžã³ã³ãã€ã«ãããªããããæ§æå ã®ãšã©ãŒãèŠã€ããããšã¯ã³ãŒãå ãããããã«å°é£ã§ãã ããããã£ãã¡ã€ã«ãäŸãšããŠåŒçšããŸããããäžè¬ã«ããŸããŸãªãªãã·ã§ã³ïŒJSONãXMLãYAMLã«ä¿åãããŸãïŒããããŸãããããããã³ã³ãã€ã«ãããããããã£ãŠãã§ãã¯ãããªãããšãéèŠã§ãã 誀ã£ãŠJavaãã¡ã€ã«ãå°å°ããå Žåãã»ãšãã©ã®å Žåãã³ã³ãã€ã«ã«åæ ŒããŸããã ããããã£ã®ã©ã³ãã ãªã¿ã€ããã¹ã¯èª°ãè奮ããããæ©èœããŸãã
ãŸããIDEã¯ãããããã£ãã¡ã€ã«ã®åœ¢åŒïŒããšãã°ïŒã«ã€ããŠæãåºæ¬çãªãã®ã®ã¿ãç¥ã£ãŠãããããæ§æã®ãšã©ãŒã匷調衚瀺ããŸãããããŒãšå€ãããããããã®éã«ã¯ãçããããã³ãã³ããŸãã¯ã¹ããŒã¹ããããŸãã ããããIDEã¯ãå€ãæ°å€ããããã¯ãŒã¯ããŒãããŸãã¯ã¢ãã¬ã¹ã§ãªããã°ãªããªããšããäºå®ã«ã€ããŠã¯äœãç¥ããŸããã
ãŸããUATãŸãã¯ã¹ããŒãžã³ã°ç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããŠããäœãä¿èšŒãããŸããã ååãšããŠãåç°å¢ã®æ§æã¯ç°ãªããUATã§ã¯UATæ§æã®ã¿ããã¹ãããããã§ãã
ãã1ã€ã®åŸ®åŠãªç¹ã¯ãå®çšŒåç°å¢ã§ããæ§æãšã©ãŒãããã«è¡šç€ºãããªãå Žåãããããšã§ãã ãµãŒãã¹ããŸã£ããéå§ãããªãå ŽåããããŸã-ããã¯è¯ãã·ããªãªã§ãã ããããããã¯éå§ã§ããéåžžã«é·ãæé-ç¬éXãŸã§ããšã©ãŒãå¿ èŠãªæ£ç¢ºãªãã©ã¡ãŒã¿ãŒãå¿ èŠã«ãªããŸã§åäœããŸãã ãããŠãããã§ã¯ãæè¿å®éã«ã¯å€æŽãããŠããªããµãŒãã¹ãçªç¶æ©èœããªããªã£ãããšãããããŸãã
çµå±ãç§ãèšã£ãããã«ãæ§æã®ãã¹ãã¯ããããªãããã¯ã«ãªãã¯ãã§ãã ããããå®éã«ã¯æ¬¡ã®ããã«ãªããŸãã
å°ãªããšãç§ãã¡ã®å Žåã¯ããã§ãã-ããæç¹ãŸã§ã ãããŠãç§ã®ã¬ããŒãã®ç®çã®1ã€ã¯ãããªãã«ãšã£ãŠããã®ãããªèŠæ¹ããããããšã§ãã ç§ã¯ããªãã«ãããããã·ã¥ã§ããããšãé¡ã£ãŠããŸãã
3幎åããã€ãéè¡ã®ç§ã®ããŒã ã§ã¯ãAndrei SatarinãQAãªãŒããŒãšããŠåããŠããŸããã æ§æã®ãã¹ãã®ã¢ã€ãã¢ããããããã®ã¯åœŒã§ãã-ã€ãŸãã圌ã¯æåã«ãã®ãããªãã¹ããåã£ãŠã³ãããããŸããã 6ãæåãåã®Heisenbugã§ã圌ã¯èŠããšããã«æ§æããã¹ãããããšã«ã€ããŠè¬æŒããŸããã ç§åŠèšäºã®åŽé¢ãšãæ§æãšã©ãŒãšãã®çµæã«ééãã倧äŒæ¥ã®çµéšã®äž¡æ¹ããã圌ãåé¡ãåºãèŠãŠãããã®ã§ãç§ã¯èŠãããšããå§ãããŸãã
ç§ã®ã¬ããŒãã¯ããçããªããŸã-å®éã®çµéšã«ã€ããŠã éçºè ãšããŠãæ§æãã¹ããäœæãããšãã«ã©ã®ãããªåé¡ã«ééããããããã³ãããã®åé¡ãã©ã®ããã«è§£æ±ºãããã«ã€ããŠèª¬æããŸãã ç§ã®æ±ºå®ã¯æè¯ã®æ±ºå®ã§ã¯ãªããããããŸããããããã¯ãã¹ããã©ã¯ãã£ã¹ã§ã¯ãããŸãã-ããã¯ç§ã®å人çãªçµéšã§ãããç§ã¯åºãäžè¬åããªãããã«ããŸããã
ã¬ããŒãã®æŠèŠïŒ
- ãæææ¥ã®ååŸãŸã§ã«ã§ããããšãïŒã·ã³ãã«ã§äŸ¿å©ãªäŸã
- ã2幎åŸã®æææ¥ãïŒã©ãã§ã©ã®ããã«æ¹åãããã
- æ§æã®ãªãã¡ã¯ã¿ãªã³ã°ã®ãµããŒãïŒå¯ãªã«ãã¬ããžãå®çŸããæ¹æ³ã ãœãããŠã§ã¢æ§æã¢ãã«ã
æåã®éšåã¯ããæ°ãèµ·ãããããã®ã§ãïŒç§ãã¡ããã¹ãŠãå§ããæãåçŽãªãã¹ãã«ã€ããŠèª¬æããŸãã ããŸããŸãªäŸããããŸãã ãã®ãã¡ã®å°ãªããšã1ã€ãããªããšå ±é³Žããããšãã€ãŸããäœããã®é¡äŒŒã®åé¡ãšãã®è§£æ±ºçãç®ã«ããããšãé¡ã£ãŠããŸãã
æåã®éšåã®ãã¹ãèªäœã¯åçŽã§ãåå§çã§ã-ãšã³ãžãã¢ãªã³ã°ã®èŠ³ç¹ããã¯ãã±ããç§åŠã¯ãããŸããã ããããããããè¿ éã«è¡ãããšããããšã ããç¹ã«äŸ¡å€ããããŸãã ããã¯ãæ§æãã¹ããžã®ãã®ãããªãç°¡åãªå ¥åãã§ããããããã®ãã¹ããæžãã«ã¯å¿ççãªéå£ãããããéèŠã§ãã ãããŠãç§ã¯ããããã§ãããããšã瀺ããããšæããŸããä»ããç§ãã¡ã«ãšã£ãŠã¯ããŸããããŸããããããŠã誰ãæ»ãã§ããªãã®ã«ãç§ãã¡ã¯ä»3幎çããŠããŸãã
2çªç®ã®éšåã¯ããã®åŸã®åŠçã«ã€ããŠã§ãã ç°¡åãªãã¹ããããããæžãããšãããµããŒãã®åé¡ãçããŸãã ãããã®ããã€ãã¯èœã¡å§ããŸããããªãã¯åœŒãããããã匷調ãããšã©ãŒãç解ããŸãã ããã¯åžžã«äŸ¿å©ã§ãããšã¯éããŸããã ãããŠãããè€éãªãã¹ããäœæãããšããçåãçããŸããçµå±ã®ãšãããåçŽãªã±ãŒã¹ããã§ã«ã«ããŒããŠããã®ã§ããã£ãšé¢çœããã®ã欲ããã§ãã ãããŠãããã§ããã¹ããã©ã¯ãã£ã¹ã¯ãããŸãããç§ãã¡ã®ããã«åããããã€ãã®ãœãªã¥ãŒã·ã§ã³ã説æããŸãã
3çªç®ã®éšåã¯ããã¹ããããªãè€éã§æ··ä¹±ããããæ§æã®ãªãã¡ã¯ã¿ãªã³ã°ãã©ã®ããã«ãµããŒãã§ãããã«ã€ããŠã§ãã åã³ã±ãŒã¹ã¹ã¿ãã£-ã©ããã£ãŠãã£ãã®ãã ç§ã®èŠ³ç¹ããèŠããšãããã¯å°ããªç©Žãå¡ãã ãã§ãªãããã倧ããªã¿ã¹ã¯ã解決ããããã«æ§æãã¹ããã©ã®ããã«æ¡åŒµã§ãããã®äŸã§ãã
ããŒã1.ããã®ããã«ã§ããŸãã
çŸåšãæåã®æ§æãã¹ããäœã§ãã£ãããç解ããã®ã¯å°é£ã§ãã ã¢ã³ãã¬ã€ã¯ããŒã«ã«åº§ã£ãŠã圌ã¯ç§ãåãã€ãããšèšãããšãã§ããŸãã ããããããã¯ãã¹ãŠããããå§ãŸã£ãããã«æããŸãïŒ
ç¶æ³ã¯æ¬¡ã®ãšããã§ãã1ã€ã®ãã¹ãã«nåã®ãµãŒãã¹ãããããããããããŒãã§ç¬èªã®JMXãµãŒããŒãèµ·åããç£èŠJMXããšã¯ã¹ããŒãããŸãã ãã¹ãŠã®ãµãŒãã¹ã®ããŒãã¯ãã¡ã€ã«ã§æ§æãããŸãã ãããããã¡ã€ã«ã¯ããã€ãã®ããŒãžãå æããä»ã®å€ãã®ããããã£ããããŸã-å€ãã®å Žåãç°ãªããµãŒãã¹ã®ããŒãã競åããããšãããããŸãã ééããç¯ããããã§ãã ãã®åŸããã¹ãŠã¯äºçŽ°ãªããšã§ãããµãŒãã¹ã«äŸåããªã人ã®ããã«ãµãŒãã¹ãäžæããåŸãäžéšã®ãµãŒãã¹ã¯äžæããŸãã-ãã¹ã¿ãŒã¯æ¿æããŸãã
ãã®åé¡ã¯ããã€ãã®è¡ã§è§£æ±ºãããŸãã ãã®ãã¹ãã¯ïŒç§ã«ã¯æããŸããïŒæåã®ãã¹ãã§ã次ã®ããã«èŠããŸããã
è€éãªããšã¯äœããããŸãããæ§æãã¡ã€ã«ã眮ãããŠãããã©ã«ããŒã調ã¹ãããããèªã¿èŸŒã¿ãããããã£ãšããŠè§£æããååã«ãjmx.portããå«ãŸããå€ããã£ã«ã¿ãŒåŠçãããã¹ãŠã®å€ãäžæã§ããããšã確èªããŸãã å€ãæŽæ°ã«å€æããå¿ èŠãããããŸããã ãããããããŒãã®ã¿ããããŸãã
ãããèŠããšãã®ç§ã®æåã®åå¿ã¯ããŸããŸã§ããïŒ
第äžå°è±¡ïŒç§ã®çŸããåäœãã¹ãã§ã¯äœã§ããïŒ ãªããã¡ã€ã«ã·ã¹ãã ã«ç»ã£ãã®ã§ããïŒ
ãããŠãé©ããæ¥ãŸããïŒãããã¯äœã ããïŒã
ãããã£ããã¹ããæžãã®ãé£ããããå¿ççãªéå£ãããããã«èŠããã®ã§ãç§ã¯ããã«ã€ããŠè©±ããŠããã ãããã3幎ãçµã¡ããããžã§ã¯ãã¯ãã®ãããªãã¹ãã§äžæ¯ã«ãªããŸããããæ§æã®èª€ãã«ã¶ã€ãã£ãååããã¹ããæžããªãããšããããããŸãã ã³ãŒãã«ã€ããŠã¯ã誰ãããã§ã«ååž°ãã¹ãã®äœæã«æ £ããŠãããããèŠã€ãã£ããšã©ãŒã¯åçŸãããŸããã ãããã圌ãã¯èšå®ã®ããã«ãããããŸãããäœããå¹²æžããŠããŸãã 察åŠããå¿ èŠã®ããå¿ççãªéå£ããããŸãããã®ãããç§ã¯ãã®ãããªåå¿ã«ã€ããŠèšåãããããçŸããå Žåã«èªåããèªèã§ããããã«ããŸãã
次ã®äŸã¯ã»ãšãã©åãã§ãããå°ãå€æŽãããŠããŸã-ãã¹ãŠã®ãjmxããåé€ããŸããã ä»åã¯ãsomething-there-portãšåŒã°ãããã¹ãŠã®ããããã£ããã§ãã¯ããŸãã ãããã¯æŽæ°å€ã§ãããæå¹ãªãããã¯ãŒã¯ããŒãã§ããå¿ èŠããããŸãã Matcherã®èåŸã«ããvalidNetworkPortïŒïŒã¯ãã«ã¹ã¿ã hamcrest Matcherãé衚瀺ã«ããŸããããã«ãããå€ãã·ã¹ãã ããŒãã®ç¯å²ãè¶ ããäžæããŒãã®ç¯å²ãäžåãããšã確èªãããŸããããã¯ãããã£ãŒã§ãã
ãã®ãã¹ãã¯ãŸã éåžžã«åå§çã§ãã ã©ã®ç¹å®ã®ããããã£ããã§ãã¯ããŠãããã¯ç€ºãããŠããªãããšã«æ³šæããŠãã ãã-ããã¯å·šå€§ã§ãã ãã®ãããª1ã€ã®ãã¹ãã§ã¯ãã... portããšããååã®500åã®ããããã£ããã§ãã¯ããå¿ èŠãªãã¹ãŠã®æ¡ä»¶ã§ããã¹ãŠãç®çã®ç¯å²ã®æŽæ°ã§ããããšã確èªã§ããŸãã 圌ããæžããããåæ°è¡-ããã ãã§ãã ããã¯éåžžã«äŸ¿å©ãªæ©èœã§ããæ§æãåçŽãªåœ¢åŒã§ããããã«è¡šç€ºãããŸãïŒ2ã€ã®åãããŒãšå€ã ãããã£ãŠã倧éåŠçãå¯èœã§ãã
å¥ã®ãã¹ãäŸã ããã§äœã確èªããŠããŸããïŒ
å®éã®ãã¹ã¯ãŒããæ¬çªç°å¢ã«æŒããŠããªãããšã確èªããŸãã ãã¹ãŠã®ãã¹ã¯ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
ããããã£ãã¡ã€ã«ã®ãã¹ããããããæžãããšãã§ããŸãã ç§ã¯ãã以äžäŸãæããŸãã-ç§ã¯èªåèªèº«ãç¹°ãè¿ããããããŸãããã¢ã€ãã¢ã¯éåžžã«åçŽã§ãããããŠãã¹ãŠãæ確ã§ãªããã°ãªããŸããã
...ãããŠããããã®ãã¹ããååã«æžããåŸãèå³æ·±ã質åãæµ®äžããŸãïŒæ§æãšã¯ã©ãããæå³ã§ããããã®å¢çã¯ã©ãã§ããïŒ ããããã£ãã¡ã€ã«ãæ§æãšèŠãªããã«ããŒããŸãã-åãã¹ã¿ã€ã«ã§ã«ããŒã§ãããã®ã¯äœã§ããïŒ
æ§æã®èæ ®äºé
å°ãªããšãéåžžã®ãã«ãããã»ã¹ã§ã¯ããããžã§ã¯ãå ã«ã³ã³ãã€ã«ãããŠããªãããã¹ããã¡ã€ã«ãå€æ°ããããšãããããŸãã ãããã¯ãµãŒããŒã§å®è¡ããããŸã§æ€èšŒãããŸãããã€ãŸãããšã©ãŒãé ããŠè¡šç€ºãããŸãã ãããã®ãã¹ãŠã®ãã¡ã€ã«ã¯ãããçšåºŠæ¡åŒµãããŠããŸãããæ§æãšåŒã¶ããšãã§ããŸãã å°ãªããšãããããã¯ã»ãŒåãããã«ãã¹ããããŸãã
ããšãã°ãå±éããã»ã¹äžã«ããŒã¿ããŒã¹ã«ããŒã«ãããSQLãããã®ã·ã¹ãã ããããŸãã
SQL * Plusçšã«äœæãããŠããŸãã SQL * Plusã¯60幎代ããã®ããŒã«ã§ãããããããçš®é¡ã®å¥åŠãªããšãå¿ èŠãšããŸããããšãã°ããã¡ã€ã«ã®çµãããæ°ããè¡ã«ããããšã確èªããããã§ãã ãã¡ããã人ã ã¯60幎代ã«çãŸããããã§ã¯ãªãã®ã§ãå®æçã«è¡æ«ãä»ããã®ãå¿ããŠããŸãã
ç¹°ãè¿ããŸãããåã12è¡ã§è§£æ±ºãããŸãããã¹ãŠã®SQLãã¡ã€ã«ãéžæããæ«å°Ÿã«ã¹ã©ãã·ã¥ãããããšã確èªããŸãã ã·ã³ãã«ã䟿å©ãé«éã
ãããã¹ããã¡ã€ã«ã®ãããªãå¥ã®äŸã¯crontabã§ãã crontabãµãŒãã¹ãéå§ããã³åæ¢ããŸãã ã»ãšãã©ã®å Žåã2ã€ã®ãšã©ãŒãçºçããŸãã
ãŸããã¹ã±ãžã¥ãŒã«åŒã®åœ¢åŒã ããã»ã©è€éã§ã¯ãããŸããããèµ·ååã«èª°ããã§ãã¯ããŸããã®ã§ãäœåãªã¹ããŒã¹ãã«ã³ããªã©ãç°¡åã«æ¿å ¥ã§ããŸãã
第äºã«ãåã®äŸã®ããã«ããã¡ã€ã«ã®çµãããæ°ããè¡ã«ãªããã°ãªããŸããã
ãããŠãããã¯ãã¹ãŠç¢ºèªãéåžžã«ç°¡åã§ãã ãã¡ã€ã«ã®çµããã¯ç解ã§ããŸãããã¹ã±ãžã¥ãŒã«ã確èªããããã«ãcronåŒã解æããæ¢è£œã®ã©ã€ãã©ãªãèŠã€ããããšãã§ããŸãã å ±åã®åã«ãç§ã¯ã°ãŒã°ã«ã§èª¿ã¹ãŸããïŒå°ãªããšã6人ãããŸããã ããã¯6ã€èŠã€ããŸããããäžè¬ã«ãã£ãšãããããããŸããã ç§ãã¡ãæžãããšããåŒã®å 容ããã§ãã¯ããå¿ èŠã¯ãªããæ§æã®æ£ç¢ºãã ãã確èªããå¿ èŠããã£ããããcronãæ£åžžã«ããŒããããããèŠã€ãã£ããã®ã®ãã¡æãåçŽãªãã®ãåããŸããã
ååãšããŠãããå€ãã®ãã§ãã¯ãçµäºããããšãã§ããŸã-ããªããæ£ããææ¥ã«éå§ããããšã確èªããŠãã ãããããªããä»äºã®çãäžã«ãµãŒãã¹ãåæ¢ããªãããšã確èªããŠãã ããã ããããããã¯ç§ãã¡ã«ãšã£ãŠããã»ã©æçšã§ã¯ãªãããšãå€æããç§ãã¡ã¯æ°ã«ããŸããã§ããã
ããŸãæ©èœããå¥ã®ã¢ã€ãã¢ã¯ãã·ã§ã«ã¹ã¯ãªããã§ãã ãã¡ãããbashã¹ã¯ãªããã®æ¬æ ŒçãªããŒãµãŒãJavaã§æžãããšã¯ãåæ¢ãªäººã«ãšã£ãŠã¯åã³ã§ãã ããããçµè«ãšããŠããããã®ã¹ã¯ãªããã®å€ãã¯å®å šãªbashã§ã¯ãããŸããã ã¯ããã³ãŒããçŽæ¥ãå°çãšå°çã§ããbashã¹ã¯ãªãããããã1幎ã«1åç«ã¡å¯ã£ãŠãèªã£ãŠéããŸãã ãã ããå€ãã®bashã¹ã¯ãªããã¯åãæ§æã§ãã ç®çã®å€ã«èšå®ãããã·ã¹ãã å€æ°ãšç°å¢å€æ°ãå€æ°ããããããã®å€æ°ã䜿çšããä»ã®ã¹ã¯ãªãããæ§æããŸãã ãããŠããã®ãããªå€æ°ã¯ããã®bashãã¡ã€ã«ããç°¡åã«grepããŠããããã«ã€ããŠäœãããã§ãã¯ã§ããŸãã
ããšãã°ãJAVA_HOMEãåç°å¢ã«ã€ã³ã¹ããŒã«ãããŠããããšããŸãã¯äœ¿çšããjniã©ã€ãã©ãªãLD_LIBRARY_PATHã«ããããšã確èªããŸãã ã©ãããããããJavaã®ããããŒãžã§ã³ããå¥ã®ããŒãžã§ã³ã«ç§»è¡ãããã¹ããæ¡åŒµããŸãããJAVA_HOMEãç°å¢ã®ãã®ãµãã»ããã«ã1.8ããå«ãããšã確èªããåŸã ã«æ°ããããŒãžã§ã³ã«ç§»è¡ããŸããã
以äžã«äŸã瀺ããŸãã çµè«ã®æåã®éšåãèŠçŽããŸãã
- æ§æãã¹ãã¯æåã¯æ··ä¹±ããŸãããå¿ççãªéå£ããããŸãã ãããããããå æããåŸãã¢ããªã±ãŒã·ã§ã³ã«ã¯ãã§ãã¯ã§ã«ããŒãããã«ããŒã§ããå ŽæããããããããŸãã
- 次ã«ããããã¯ç°¡åã«å æ°ã«æžãããŸã ïŒããã«å€§ããªå©çããããããäœãã¶ãäžãæç©ãããããããããŸãïŒã
- æ§æãšã©ãŒã®æ€åºãšä¿®æ£ã®ã³ã¹ããåæžããŸãã ãããã¯å®éã«ã¯åäœãã¹ãã§ãããããã³ãããããåã§ãã£ãŠãã³ã³ãã¥ãŒã¿ãŒã§å®è¡ã§ããããããã£ãŒãããã¯ã«ãŒããå€§å¹ ã«åæžãããŸãã ãã¡ããããããã®å€ãã¯ãããšãã°ãã¹ãã®å±é段éã§ãã¹ããããŠããã§ãããã ãããŠããããå®çšŒåæ§æã®å Žåãå€ãã¯ãã¹ããããŸããã ãããã£ãŠãããŒã«ã«ã³ã³ãã¥ãŒã¿ãŒã§çŽæ¥ãã§ãã¯ãããŸãã
- 圌ãã¯ç¬¬äºã®è¥è ãäžããŸãã ãŸã å€ãã®èå³æ·±ãããšããã¹ãã§ãããšããæèŠããããšããæå³ã§ã å®éãã³ãŒãã§ã¯ããã¹ãã§ãããã®ãèŠã€ããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã
ããŒã2.ããè€éãªã±ãŒã¹
ããã«è€éãªãã¹ãã«ç§»ããŸãããã ããã«ç€ºãããŠãããããªäºçŽ°ãªãã§ãã¯ã®ã»ãšãã©ãã«ããŒããåŸãçåãçããŸãïŒããè€éãªãã®ããã§ãã¯ããããšã¯å¯èœã§ããïŒ
ãããé£ããããšã¯ã©ãããæå³ã§ããïŒ ããã§èª¬æãããã¹ãã¯ããããã次ã®æ§é ã«ãªã£ãŠããŸãã
ç¹å®ã®ãã¡ã€ã«ã«å¯ŸããŠäœãããã§ãã¯ããŸãã ã€ãŸãããã¡ã€ã«ã調ã¹ãŠãããããã«ç¹å®ã®æ¡ä»¶ãã§ãã¯ãé©çšããŸãã ãããã£ãŠãå€ãã®ããšãæ€èšŒã§ããŸãããããæçšãªã·ããªãªããããŸãã
- UIã¢ããªã±ãŒã·ã§ã³ã¯ã ãã®ç°å¢ã®ãµãŒããŒã«æ¥ç¶ããŸãã
- åãç°å¢ã®ãã¹ãŠã®ãµãŒãã¹ã¯åã管çãµãŒããŒã«æ¥ç¶ããŸãã
- åãç°å¢å ã®ãã¹ãŠã®ãµãŒãã¹ã¯åãããŒã¿ããŒã¹ã䜿çšããŸãã
ããšãã°ãUIã¢ããªã±ãŒã·ã§ã³ã¯ç°å¢ãµãŒããŒã«æ¥ç¶ããŸãã æãå¯èœæ§ãé«ãã®ã¯ãUIãšãµãŒããŒãç°ãªãã¢ãžã¥ãŒã«ã§ããããããžã§ã¯ãã§ã¯ãªããšããŠãããããã®æ§æãç°ãªãå Žåãåãæ§æãã¡ã€ã«ã䜿çšããå¯èœæ§ã¯äœãããšã§ãã ãããã£ãŠã1ã€ã®ç°å¢ã®ãã¹ãŠã®ãµãŒãã¹ããã³ãã³ãã®é åžã«äœ¿çšããã1ã€ã®ããŒç®¡çãµãŒããŒã«æ¥ç¶ãããããã«ããããããªã³ã¯ããå¿ èŠããããŸãã ç¹°ãè¿ããŸãããããããããããã¯ç°ãªãã¢ãžã¥ãŒã«ãç°ãªããµãŒãã¹ã§ãããäžè¬ã«ç°ãªãããŒã ãããããéçºããŸãã
ãŸãã¯ããã¹ãŠã®ãµãŒãã¹ãåãããŒã¿ããŒã¹ãåããã®ã䜿çšããŸã-ç°ãªãã¢ãžã¥ãŒã«ã®ãµãŒãã¹ã
å®éããã®ãããªç¶æ³ããããŸããå€ãã®ãµãŒãã¹ã«ã¯ãããããç¬èªã®æ§ææ§é ããããŸãããããã®ããã€ããæžããã亀差ç¹ã§äœãã確èªããå¿ èŠããããŸãã
ãã¡ããããããæ£ç¢ºã«è¡ãããšãã§ããŸãã1ã€ç®ã2ã€ç®ãããŒãããã©ããã§äœããåŒãåºãããã¹ãã³ãŒããæ¥çããŸãã ããããã³ãŒããã©ãã ã倧ãããªããã©ãã ãèªã¿ããããªããæ³åã§ããŸãã ç§ãã¡ã¯ããããå§ããŸãããããããã©ãã»ã©é£ããããå®æããŸããã ããè¯ãæ¹æ³ã¯ïŒ
ããªãã倢ãèŠããšãããã¯ãã䟿å©ã ã£ãã®ã§ãç§ã¯ãã¹ãã人éã®èšèªã§èª¬æããããã«èŠããããšã倢èŠãŸããïŒ
@Theory public void eachEnvironmentIsXXX( Environment environment ) { for( Server server : environment.servers() ) { for( Service service : server.services() ) { Properties config = buildConfigFor( environment, server, service ); //⊠check {something} about config } } }
ç°å¢ããšã«ãæ¡ä»¶ãæºããããŸãã ããã確èªããã«ã¯ãç°å¢ãããµãŒããŒã®ãªã¹ãããµãŒãã¹ã®ãªã¹ããèŠã€ããå¿ èŠããããŸãã 次ã«ãæ§æãããŒããã亀差ç¹ã§äœãã確èªããŸãã ãããã£ãŠãç§ã¯ãã®ãããªãã®ãå¿ èŠã§ããç§ã¯ãããé 眮ã¬ã€ã¢ãŠããšåŒã³ãŸããã
ãã®ããŒã¿æ§é ãååŸããããã«ãã©ã®ãµãŒããŒã«ã©ã®ãµãŒãã¹ãã©ã®ç°å¢ã«é 眮ããããšãããã¢ããªã±ãŒã·ã§ã³ã®ãããã€æ¹æ³ã«ã¢ã¯ã»ã¹ããæ©äŒãã³ãŒãããåŸãå¿ èŠããããŸãã ãããŠããããé²ãã§ãæ§æã®ããŒããšåŠçãéå§ããŸãã
é 眮ã¬ã€ã¢ãŠãã¯ãåããŒã ããã³åãããžã§ã¯ãã«åºæã§ãã ç§ãæãã-ããã¯äžè¬çãªã±ãŒã¹ã§ããéåžžããµãŒããŒããµãŒãã¹ã®ã»ãããããããµãŒãã¹ã«ã¯1ã€ã ãã§ã¯ãªããæ§æãã¡ã€ã«ã®ã»ãããããå ŽåããããŸãã ãã¹ãã«åœ¹ç«ã€è¿œå ã®ãã©ã¡ãŒã¿ãå¿ èŠãªå ŽåããããŸãããè¿œå ããå¿ èŠããããŸãã ããšãã°ããµãŒããŒãé 眮ãããŠããã©ãã¯ãéèŠã«ãªãå ŽåããããŸãã Andreyã®ã¬ããŒãã§ã¯ãããã¯ã¢ãã/ãã©ã€ããªãµãŒãã¹ãç°ãªãã©ãã¯ã«é 眮ããããšããµãŒãã¹ã«ãšã£ãŠéèŠã§ããå Žåã®äŸã瀺ããŸããã圌ã®å Žåãå±éã¬ã€ã¢ãŠãã§ã©ãã¯ã®è¡šç€ºãä¿æããå¿ èŠããããŸãã
ç§ãã¡ã®ç®çã«ãšã£ãŠãååãšããŠãç¹å®ã®ããŒã¿ã»ã³ã¿ãŒã§ãããµãŒããŒã®å°åãéèŠã§ãããããããã¯ã¢ãã/ãã©ã€ããªã¯ç°ãªãããŒã¿ã»ã³ã¿ãŒã«ãããŸãã ãããã¯ãã¹ãŠè¿œå ã®ãµãŒããŒããããã£ã§ããããããžã§ã¯ãåºæã§ãããã¹ã©ã€ãäžã§ã¯å ±éç¹ã§ãã
é 眮ã¬ã€ã¢ãŠãã¯ã©ãã§å ¥æã§ããŸããïŒ å€§äŒæ¥ã«ã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ç®¡çã·ã¹ãã ãããããã¹ãŠãããã«èšèŒãããŠããããã§ãã
å°ãªããšãã2ã€ã®ãããžã§ã¯ãã§ã®ç§ã®å®è·µã§ã¯ãæåã«ããŒãã³ãŒãã£ã³ã°ãã次ã«3幎åŸã«ããŒãã³ãŒãã£ã³ã°ããæ¹ãç°¡åã§ããããšã瀺ãããŠããŸã...
ç§ãã¡ã¯ãã®ãããžã§ã¯ãã§3幎éçããŠããŸããã 第äºã«ãããã§ã1幎以å ã«ã€ã³ãã©ã¹ãã©ã¯ãã£ç®¡çãšçµ±åããããã«æãããŸãããããããã¹ãŠã®å¹Žã¯ãã®ããã«çããŠããŸããã çµéšãããã§ããã ãæ©ãæ¢è£œã®ãã¹ããååŸããããã«IMãšã®çµ±åã¿ã¹ã¯ã延æããããšã¯çã«ããªã£ãŠããŸãã ãããŠããµãŒããŒéã®ãµãŒãã¹ã®åæ£ã¯ããã»ã©é »ç¹ã«å€æŽãããªãããããã®çµ±åã¯ããã»ã©å¿ èŠã§ã¯ãªãããšãå€æããå ŽåããããŸãã
ããŒãã³ãŒãã¯æåéã次ã®ããã«ãªããŸãã
public enum Environment { PROD( PROD_UK_PRIMARY, PROD_UK_BACKUP, PROD_US_PRIMARY, PROD_US_BACKUP, PROD_SG_PRIMARY, PROD_SG_BACKUP ) ⊠public Server[] servers() {âŠ} } public enum Server { PROD_UK_PRIMARY(ârflx-ldn-1"), PROD_UK_BACKUP("rflx-ldn-2"), PROD_US_PRIMARY(ârflx-nyc-1"), PROD_US_BACKUP("rflx-nyc-2"), PROD_SG_PRIMARY(ârflx-sng-1"), PROD_SG_BACKUP("rflx-sng-2"), public Service[] services() {âŠ} }
æåã®ãããžã§ã¯ãã§äœ¿çšããæãç°¡åãªæ¹æ³ã¯ãããããã®ãµãŒããŒã®ãªã¹ãã䜿çšããŠç°å¢ãåæããããšã§ãã ãµãŒããŒã®ãªã¹ããããããµãŒãã¹ã®ãªã¹ããããã¯ãã§ããããããã ãŸãããŸããïŒéå§ã¹ã¯ãªããïŒãããæ§æã®äžéšã§ãïŒããããŸãã
åç°å¢ã«å¯ŸããŠãµãŒãã¹ãå®è¡ããŸãã ãããŠãservicesïŒïŒã¡ãœããã¯ãåã«ãµãŒããŒã®ãã¡ã€ã«ãããã¹ãŠã®ãµãŒãã¹ãgrep'aããŸãã ããã¯ãããã»ã©å€ãã®ç°å¢ããªãããµãŒããŒãã»ãšãã©è¿œå ãŸãã¯åé€ãããªãããã§ããããããå€ãã®ãµãŒãã¹ããããé »ç¹ã«ã·ã£ããã«ãããŸãã ããŒãã³ãŒãã£ã³ã°ãããã¬ã€ã¢ãŠããé »ç¹ã«å€æŽããªãããã«ãã¹ã¯ãªãããããµãŒãã¹ã®å®éã®ã¬ã€ã¢ãŠããããŒãããããšã¯çã«ããªã£ãŠããŸãã
ãã®ãããªãœãããŠã§ã¢æ§æã¢ãã«ãäœæãããšã楜ããããŒãã¹ã衚瀺ãããŸãã ããšãã°ã次ã®ãããªãã¹ããäœæã§ããŸãã
ãã¹ãã§ã¯ããã¹ãŠã®ç°å¢ã«ãã¹ãŠã®äž»èŠãªãµãŒãã¹ãååšããŸãã 4ã€ã®äž»èŠãªãµãŒãã¹ããããæ®ãã¯ããã§ãããããããªãããããã§ãªããããããªããããããã®4ã€ããªããã°æå³ããããŸããã ããããã©ãã§ãå¿ããŠããªãããšããã¹ãŠãåãç°å¢å ã«ããã¯ã¢ãããããŠããããšã確èªã§ããŸãã ã»ãšãã©ã®å Žåããããã®ã€ã³ã¹ã¿ã³ã¹ã®UATãæ§æãããšãã«ãã®ãããªãšã©ãŒãçºçããŸãããPRODã«ãªãŒã¯ããããšããããŸãã çµå±ã®ãšãããUATã®ãã°ã¯æéãšãã¹ã¿ãŒã®ç¥çµã浪費ããŸãã
æ§æã¢ãã«ã®é¢é£æ§ãç¶æãããšããçåãçããŸãã ãã®ããã®ãã¹ããæžãããšãã§ããŸãã
public class HardCodedLayoutConsistencyTest { @Theory eachHardCodedEnvironmentHasConfigFiles(Environment env){ ⊠} @Theory eachConfigFileHasHardCodedEnvironment(File configFile){ ⊠} }
æ§æãã¡ã€ã«ããããã³ãŒãå ã«é 眮ã¬ã€ã¢ãŠãããããŸãã ãããŠãããªãã¯åç°å¢/ãµãŒããŒ/ãªã©ã®ããã«ããã確èªããããšãã§ããŸã é©åãªæ§æãã¡ã€ã«ããããå¿ èŠãªåœ¢åŒã®ãã¡ã€ã«ããšã«ã察å¿ããç°å¢ããããŸãã 1ã€ã®å Žæã«äœããè¿œå ããã®ãå¿ãããšããã«ããã¹ãã¯å€±æããŸãã
äžçªäžã®è¡ã¯å±éã¬ã€ã¢ãŠãã§ãã
- è€éãªãã¹ãã®èšè¿°ãç°¡çŽ åããã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåã®æ§æããŸãšããŸãã
- ããããããæ確ã§èªã¿ãããããŸãã 圌ãã¯ããªãããããã«ã€ããŠèããæ¹æ³ãé«ã¬ãã«ã§èŠãŠãããèšå®ãè¡ãæ¹æ³ã§ã¯ãããŸããã
- äœæäžã«ã人ã ã質åããããšãå±éã«é¢ããŠå€ãã®èå³æ·±ãããšãããããŸãã ããšãã°ã1ã€ã®ãµãŒããŒã§2ã€ã®ç°å¢ããã¹ãããå¯èœæ§ã«é¢ããŠãæé»çãªç¥èãªç¥èã®å¶éãçããŸãã éçºè ã®èãæ¹ã¯ç°ãªããããã«å¿ããŠãµãŒãã¹ãèšè¿°ããŠããããšãããããŸãã ãããŠããã®ãããªç¬éã¯éçºè éã§èœã¡çãã®ã«åœ¹ç«ã¡ãŸãã
- ããã¥ã¡ã³ããè£å®ããŸãïŒããã§ãªãå Žåã¯ç¹ã«ïŒã ããšãããããã£ããšããŠããéçºè ãšããŠã®ç§ã«ãšã£ãŠã¯ãã³ãŒãã§ãããèŠãæ¹ã楜ããã§ãã ããã«ãããã«ã¯ãä»ã®èª°ãã§ã¯ãªããç§ã«ãšã£ãŠéèŠãªã³ã¡ã³ããæžãããšãã§ããŸãã ãŸããããŒãã³ãŒãããããšãã§ããŸãã ã€ãŸããåããµãŒããŒã«2ã€ã®ç°å¢ãååšã§ããªããšå€æããå Žåããã§ãã¯ãæ¿å ¥ã§ããŸãããçŸåšã¯ããã§ã¯ãããŸããã å°ãªããšã誰ããè©ŠããŠã¿ãã°ãããã§ãããã ã€ãŸããããã匷å¶ããæ©èœãåããããã¥ã¡ã³ãã§ãã ããã¯éåžžã«åœ¹ç«ã¡ãŸãã
ç¶ããŸãããã ãã¹ããæžãããåŸã圌ãã¯1幎éãèœã¡çãããããã€ãã¯èœã¡å§ããŸãã æ©ãèœã¡å§ãã人ãããŸãããããã»ã©æãã¯ãããŸããã 1幎åã«æžããããã¹ãã倱æãããšãããã®ãšã©ãŒã¡ãã»ãŒãžãèŠãŠãç解ã§ããŸããã
ãããç¡å¹ãªãããã¯ãŒã¯ããŒãã§ããããšãç解ããŠåæãããšããŸãããã©ãã«ãããŸããïŒ è¬æŒã®åã«ããããžã§ã¯ãå ã«1,200ã®ããããã£ãã¡ã€ã«ãããã90ã®ã¢ãžã¥ãŒã«ã«ãŸããã£ãŠãããåèš24,000è¡ããããšã確èªããŸããã ïŒé©ããŸããããæ°ããã°ãããã¯ããã»ã©å€ããããŸãã-4ã€ã®ãã¡ã€ã«ã«å¯Ÿãã1ã€ã®ãµãŒãã¹ã§ããïŒãã®ããŒãã¯ã©ãã«ãããŸããïŒ
assertThatïŒïŒã«ã¡ãã»ãŒãžåŒæ°ãããããšã¯æããã§ããå Žæãèå¥ããã®ã«åœ¹ç«ã€äœããå ¥åã§ããŸãã ãããããã¹ããæžããšããããªãã¯ããã«ã€ããŠèããŸããã ãããŠãããªããèããå Žåã§ããããªãã¯ãŸã 1幎ã§ãããç解ã§ããããã«ãã©ã®èª¬æãååã«è©³çŽ°ã«ãªãããæšæž¬ããå¿ èŠããããŸãã ãã®ç¹ãèªååãããã®ã§ããšã©ãŒãèŠã€ããããã®å€å°æ確ãªèª¬æãèªåçæãããã¹ããæžãæ¹æ³ããããŸãã
ç¹°ãè¿ããŸãããç§ã¯æ¬¡ã®ãããªãã®ã倢èŠã倢èŠãŸããã
SELECT environment, server, component, configLocation, propertyName, propertyValue FROM configuration(environment, server, component) WHERE propertyName like â%.port%â and propertyValue is not validNetworkPort()
ããã¯ãã®ãããªæ¬äŒŒSQLã§ãããŸããç§ã¯SQLãç¥ã£ãŠããã ãã§ãè³ã¯äœ¿ãæ £ãããã®ãã解決çãæšãŠãŸããã ã»ãšãã©ã®æ§æãã¹ãã¯ãåãã¿ã€ãã®è€æ°ã®éšåã§æ§æãããŠãããšããèãæ¹ã§ãã æåã«ãæ¡ä»¶ã«ãã£ãŠãã©ã¡ãŒã¿ãŒã®ãµãã»ãããéžæãããŸãã
次ã«ããã®ãµãã»ããã«é¢ããŠãå€ã«é¢ããŠäœãããã§ãã¯ããŸãã
ãããŠãå€ãèŠæ±ãæºãããªãããããã£ãããå Žåãããã¯ãšã©ãŒã¡ãã»ãŒãžã§åãåããã·ãŒããã§ãã
ãã€ãŠã¯ãSQLã®ãããªããŒãµãŒãèšè¿°ã§ãããã©ããããèããŠããŸãããä»ã¯é£ãããªãããã§ãã ããããIDEã¯ããããµããŒãããããããææ¡ããªãããšã«æ°ã¥ããã®ã§ã人ã ã¯IDEããã³ãããªãã§ãã³ã³ãã€ã«ãªãã§ãæ€èšŒãªãã§ããã®èªäœã®ãSQLãã«ã€ããŠç²ç®çã«æžãå¿ èŠããããŸã-ããã¯ããŸã䟿å©ã§ã¯ãããŸããã ãã®ãããããã°ã©ãã³ã°èšèªã§ãµããŒããããŠãããœãªã¥ãŒã·ã§ã³ãæ¢ãå¿ èŠããããŸããã .NETãããã°ãLINQã圹ç«ã¡ãŸããããã¯ã»ãšãã©SQLã«äŒŒãŠããŸãã
Javaã«ã¯LINQã¯ãããŸãããå¯èœãªéãã¹ããªãŒã ã«è¿ããã®ã§ãã ããã¯ããã®ãã¹ããã¹ããªãŒã ã§ã©ã®ããã«èŠãããã§ãïŒ
ValueWithContext[] incorrectPorts = flattenedProperties( environment ) .filter( propertyNameContains( ".port" ) ) .filter( !isInteger( propertyValue ) || !isValidNetworkPort( propertyValue ) ) .toArray(); assertThat( incorrectPorts, emptyArray() );
flattenedPropertiesïŒïŒã¯ããã®ç°å¢ã®ãã¹ãŠã®æ§æããã¹ãŠã®ãµãŒããŒããµãŒãã¹ã®ãã¹ãŠã®ãã¡ã€ã«ãååŸãããããã倧ããªããŒãã«ã«å±éããŸãã ããã¯åºæ¬çã«SQLã«äŒŒãããŒãã«ã§ãããJavaãªããžã§ã¯ãã®ã»ããã®åœ¢åŒã§ãã ãããŠflattenedPropertiesïŒïŒã¯ãã®æååã®ã»ãããã¹ããªãŒã ãšããŠè¿ããŸãã
次ã«ããã®Javaãªããžã§ã¯ãã®ã»ããã«ããã€ãã®æ¡ä»¶ãè¿œå ããŸãã ãã®äŸã§ã¯ãpropertyNameã«ãããŒãããå«ããã®ãéžæããå€ãæŽæ°ã«å€æãããªãããæå¹ãªç¯å²ããå€æãããªããã®ããã£ã«ã¿ãŒããŸãã ãããã¯èª€ã£ãå€ã§ãããçè«çã«ã¯ç©ºã®ã»ããã§ããå¿ èŠããããŸãã
ãããã空ã®ã»ããã§ã¯ãªãå Žåã次ã®ãããªãšã©ãŒãã¹ããŒãããŸãã
ããŒã3.ãªãã¡ã¯ã¿ãªã³ã°ã®ãµããŒããšããŠã®ãã¹ã
éåžžãã³ãŒããã¹ãã¯æã匷åãªãªãã¡ã¯ã¿ãªã³ã°ãµããŒãã®1ã€ã§ãã ãªãã¡ã¯ã¿ãªã³ã°ã¯å±éºãªããã»ã¹ã§ãããå€ãã®ããçŽããå¿ èŠã§ãããã®ãããã¢ããªã±ãŒã·ã§ã³ãåŒãç¶ãå®è¡å¯èœã§ããããšã確èªããããšæããŸãã ããã確èªãã1ã€ã®æ¹æ³ã¯ãæåã«ãã¹ãŠããã¹ãã§ãªãŒããŒã¬ã€ãã次ã«ããã§ãªãã¡ã¯ã¿ãªã³ã°ããããšã§ãã
ãããŠä»ãç§ã®åã«æ§æããªãã¡ã¯ã¿ãªã³ã°ããã¿ã¹ã¯ããããŸããã 7幎åã«1人ã®è³¢ã人ã«ãã£ãŠæžãããã¢ããªã±ãŒã·ã§ã³ããããŸãã ãã®ã¢ããªã±ãŒã·ã§ã³ã®æ§æã¯æ¬¡ã®ããã«ãªããŸãã
ããã¯äžäŸã§ããããã£ãšãããããããŸãã ããªãã«ã¬ãã«ã®å ¥ãåé åãããã¯æ§æå šäœã§äœ¿çšãããŸãã
æ§æèªäœã«ã¯ããã€ãã®ãã¡ã€ã«ããããŸããããããã¯äºãã«å«ãŸããŠããŸãã iuããããã£ã®å°ããªæ¡åŒµæ©èœ-Apache Commons Configurationã䜿çšããŸããããã¯ãæ¬åŒ§å ã®å å«ãšèš±å¯ã®ã¿ããµããŒãããŸãã
ãããŠãèè ã¯ãããäºã€ã®ããšã ãã䜿ã£ãŠçŽ æŽãããä»äºãããŸããã 圌ã¯ããã«ãã¥ãŒãªã³ã°ãã·ã³ãæ§ç¯ãããšæããŸãã ããã€ãã®å Žæã§ã¯ã圌ã¯å å«ãšçœ®æã䜿çšããŠèšç®ãè¡ãããšããŠããããã§ãã ãã®ãã¥ãŒãªã³ã°ã·ã¹ãã ãå®å šãã©ããã¯ããããŸãããã圌ã¯ãç§ã®æèŠã§ã¯ããããããã§ããããšã蚌æããããšããŸããã
ãããŠç·ã¯å»ã£ãã ã¢ããªã±ãŒã·ã§ã³ãåäœãã圌ã¯éè¡ãå»ããŸããã ãã¹ãŠãæ©èœããæ§æãå®å šã«ç解ããŠããã®ã¯èª°ãããŸããã
å¥ã®ãµãŒãã¹ãå©çšããå Žåã10åã®ã€ã³ã¯ã«ãŒãžã§ã³ã3åã®æ·±ãããã¹ãŠãå±éãããšåèš450åã®ãã©ã¡ãŒã¿ãŒãå«ãŸããŸãã å®éããã®ç¹å®ã®ãµãŒãã¹ã¯ãããã®10ã15ïŒ ã䜿çšããæ®ãã®ãã©ã¡ãŒã¿ãŒã¯ä»ã®ãµãŒãã¹çšã§ãããã¡ã€ã«ã¯å ±æãããŠãããããããã€ãã®ãµãŒãã¹ã§äœ¿çšãããŸãã ããããæ£ç¢ºã«10ã15ïŒ ããã®ç¹å®ã®ãµãŒãã¹ã䜿çšããŠããããšãç解ããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã èè ã¯æããã«ç解ããã ãšãŠãè³¢ã人ã§ã
ããããã®ã¿ã¹ã¯ã¯ãæ§æãšãã®ãªãã¡ã¯ã¿ãªã³ã°ãç°¡çŽ åããããšã§ããã åæã«ããã®ç¶æ³ã§ã¯ãã®å¯èœæ§ã¯äœããããã¢ããªã±ãŒã·ã§ã³ãåäœããç¶ããããšæããŸããã ç§ã欲ããïŒ
- æ§æãç°¡çŽ åããŸãã
- ãã®ããããªãã¡ã¯ã¿ãªã³ã°åŸããåãµãŒãã¹ã«ã¯å¿ èŠãªãã©ã¡ãŒã¿ãŒããã¹ãŠæ®ã£ãŠããŸãã
- 圌ãäœåãªãã©ã¡ãŒã¿ãæã£ãŠããªãããã«ã ããã«é¢ä¿ã®ãªã人ã®85ïŒ ãããŒãžãæ··ä¹±ãããã¹ãã§ã¯ãããŸããã
- ãã®ããããµãŒãã¹ã¯åŒãç¶ãã¯ã©ã¹ã¿ãŒã«æ£åžžã«æ¥ç¶ããã³ã©ãã¬ãŒã·ã§ã³ãå®è¡ããŸãã
åé¡ã¯ãã·ã¹ãã ãéåžžã«åé·ã§ãããããããããçŸåšã©ã®çšåºŠé©åã«æ¥ç¶ãããŠããããããããªãããšã§ãã ããšãã°ãå°æ¥ãèŠæ®ããŠããªãã¡ã¯ã¿ãªã³ã°äžã«ãå®çšŒåæ§æã®1ã€ã§ããã¯ã¢ããã¯ãªããã«4ã€ã®ãµãŒããŒãå¿ èŠã§ããããšãå€æããŸããããå®éã«ã¯2ã€ãããŸããã åé·æ§ã®ã¬ãã«ãé«ããããããã«æ°ã¥ãã人ã¯ããŸããã§ãã-ãšã©ãŒãå¶ç¶ã«è¡šé¢åããã®ã§ãããå®éã«ã¯åé·æ§ã®ã¬ãã«ã¯äºæ³ããããã£ãšäœããªã£ãŠããŸãã ãã€ã³ãã¯ãçŸåšã®æ§æãã©ãã§ãæ£ãããšããäºå®ã«é Œãããšãã§ããªããšããããšã§ãã
æ°ããæ§æãšå€ãæ§æãæ¯èŒããããšã¯ã§ããªããšããäºå®ã«ã€ãªãããŸãã åçã®å ŽåããããŸãããåæã«ã©ããééã£ãŠããŸãã è«çã³ã³ãã³ãã確èªããå¿ èŠããããŸãã
æå°ããã°ã©ã ïŒå¿ èŠãªåãµãŒãã¹ã®åå¥ã®ãã©ã¡ãŒã¿ãŒãåé¢ããããŒããããŒãã§ããããã¢ãã¬ã¹ãã¢ãã¬ã¹ã§ããããTTLãæ£ã®æ°ã§ãããªã©ãæ£åœæ§ã確èªããŸãã ãããŠããµãŒãã¹ãåºæ¬çã«ã¡ã€ã³ãšã³ããã€ã³ãã§æ¥ç¶ããäž»èŠãªé¢ä¿ã確èªããŸãã å°ãªããšããããéæãããã£ãã ã€ãŸããåã®äŸãšã¯ç°ãªããããã§ã®ã¿ã¹ã¯ã¯åã ã®ãã©ã¡ãŒã¿ãŒãæ€èšŒããããšã§ã¯ãªããå®å šãªãããã¯ãŒã¯ã®ãã§ãã¯ã§æ§æå šäœãã«ããŒããããšã§ãã
ããããã¹ãããã«ã¯ïŒ
public class SimpleComponent { ⊠public void configure( final Configuration conf ) { int port = conf.getInt( "Port", -1 ); if( port < 0 ) throw new ConfigurationException(); String ip = conf.getString( "Address", null ); if( ip == null ) throw new ConfigurationException(); ⊠} ⊠}
ãã®åé¡ãã©ã®ããã«è§£æ±ºããŸãããïŒ ããã€ãã®åçŽãªã³ã³ããŒãã³ãããããŸããããã®äŸã§ã¯æ倧éã«åçŽåãããŠããŸãã ïŒApache Commons Configurationã«åºäŒã£ãŠããªã人ã®ããã«ïŒConfigurationãªããžã§ã¯ãã¯Propertiesã«äŒŒãŠããŸãããåä»ãã¡ãœããgetIntïŒïŒãgetLongïŒïŒãªã©ããŸã ãããŸãããããã¯å°ããªã¹ããã€ãã®juPropertiesã§ãããšæ³å®ã§ããŸããïŒã³ã³ããŒãã³ãã«2ã€ã®ãã©ã¡ãŒã¿ãŒãå¿ èŠã§ãããšããŸãïŒäŸãã°ãTCPã¢ãã¬ã¹ãšTCPããŒãã ããããåŒãåºããŠç¢ºèªããŸãã ããã®4ã€ã®å ±ééšåã¯äœã§ããïŒ
ããã¯ããã©ã¡ãŒã¿ãŒã®ååãã¿ã€ããããã©ã«ãå€ïŒããã§ã¯ç°¡åã§ããnullãš-1ãæã«ã¯æ£åžžãªå€ããããŸãïŒããã³ããã€ãã®æ€èšŒã§ãã ããã®ããŒãã¯ãããŸãã«ãåçŽã«ãäžå®å šã«æ€èšŒãããŸããééããããŒããæå®ã§ããŸãããæå¹ãªãããã¯ãŒã¯ããŒãã§ã¯ãããŸããã ãããã£ãŠãç§ããã®ç¬éãæ¹åããããšæããŸãã ãããããŸã第äžã«ãããã4ã€ã®ããšã1ã€ã®ãã®ã«å€ããããšæããŸãã ããšãã°ãããïŒ
IProperty<Integer> PORT_PROPERTY = intProperty( "Port" ) .withDefaultValue( -1 ) .matchedWith( validNetworkPort() ); IProperty<String> ADDRESS_PROPERTY = stringProperty( "Address" ) .withDefaultValue( null ) .matchedWith( validIPAddress() );
ãã®ãããªè€åãªããžã§ã¯ãã¯ããã®ååãããã©ã«ãå€ãããã³æ€èšŒãå®è¡ã§ããããšãç¥ã£ãŠããããããã£ã®èª¬æã§ãïŒããã§ã¯ããã ã¯ã¬ã¹ããããã£ãŒãåã³äœ¿çšããŸãïŒã ãããŠããã®ãªããžã§ã¯ãã«ã¯æ¬¡ã®ãããªã€ã³ã¿ãŒãã§ãŒã¹ããããŸãïŒ
interface IProperty<T> { /* (name, defaultValue, matcherâŠ) */ /** lookup (or use default), * convert type, * validate value against matcher */ FetchedValue<T> fetch( final Configuration config ) } class FetchedValue<T> { public final String propertyName; public final T propertyValue; ⊠}
ã€ãŸããç¹å®ã®å®è£ ã«åºæã®ãªããžã§ã¯ããäœæããåŸãæ§æããè¡šããã©ã¡ãŒã¿ãŒãæœåºããããã«åœŒã«äŸé Œã§ããŸãã ãããŠã圌ã¯ãã®ãã©ã¡ãŒã¿ãŒãåŒãåºããããã»ã¹ããã§ãã¯ã€ã³ããŸãããã©ã¡ãŒã¿ãŒããªãå Žåã¯ãããã©ã«ãå€ãæå®ããç®çã®ã¿ã€ãã«å°ããããã«ååãšãšãã«è¿ããŸãã
ã€ãŸãããã©ã¡ãŒã¿ãŒã®ååãšããã®æ§æããèŠæ±ããå Žåã«ãµãŒãã¹ã確èªããå®éã®å€ã§ãã ããã«ãããè€æ°ã®ã³ãŒãè¡ã1ã€ã®ãšã³ãã£ãã£ã«ã©ããã§ããŸããããã¯ãæåã«å¿ èŠãªç°¡ç¥åã§ãã
åé¡ã解決ããããã«å¿ èŠãª2çªç®ã®åçŽåã¯ãæ§æã«ããã€ãã®ããããã£ãå¿ èŠãšããã³ã³ããŒãã³ããå°å ¥ããããšã§ããã ã³ã³ããŒãã³ãæ§æã¢ãã«ïŒ
ãããã®2ã€ã®ããããã£ã䜿çšããã³ã³ããŒãã³ããããããã®æ§æçšã®ã¢ãã«ããããŸã-ãã®ã¯ã©ã¹ãå®è£ ããIConfigurationModelã€ã³ã¿ãŒãã§ã€ã¹ã§ãã IConfigurationModelã¯ãã³ã³ããŒãã³ããè¡ããã¹ãŠãå®è¡ããŸãããæ§æã«é¢é£ããéšåã®ã¿ãå®è¡ããŸãã ã³ã³ããŒãã³ããç¹å®ã®ããã©ã«ãå€ã§ç¹å®ã®é åºã§ãã©ã¡ãŒã¿ãŒãå¿ èŠãšããå Žå-IConfigurationModelã¯ãã®æ å ±ãããèªäœã§çµåããã«ãã»ã«åããŸãã ã³ã³ããŒãã³ãã®ä»ã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ã圌ã«ãšã£ãŠéèŠã§ã¯ãããŸããã ããã¯ãæ§æã¢ã¯ã»ã¹ã«é¢ããã³ã³ããŒãã³ãã¢ãã«ã§ãã
ãã®ãã¥ãŒã®ç§Theã¯ãã¢ãã«ãçµåå¯èœã§ããããšã§ãã ä»ã®ã³ã³ããŒãã³ãã䜿çšããã³ã³ããŒãã³ãããããããããããã§çµåãããå Žåãåæ§ã«ããã®è€éãªã³ã³ããŒãã³ãã®ã¢ãã«ã¯ã2ã€ã®ãµãã³ã³ããŒãã³ãã®åŒã³åºãã®çµæãããŒãžã§ããŸãã
ã€ãŸããæ§æã¢ãã«ã®éå±€ããã³ã³ããŒãã³ãèªäœã®éå±€ãšäžŠè¡ããŠæ§ç¯ã§ããŸãã äžäœã¢ãã«ã§ãfetchïŒïŒãåŒã³åºããŸããããã¯ãååããæ§æããåãåºãããã©ã¡ãŒã¿ãŒããã·ãŒããè¿ããŸããããã¯ã察å¿ããã³ã³ããŒãã³ãããªã¢ã«ã¿ã€ã ã§å¿ èŠãšãããã©ã¡ãŒã¿ãŒãšãŸã£ããåãã§ãã ãã¡ããããã¹ãŠã®ã¢ãã«ãæ£ããèšè¿°ããå Žåã
ã€ãŸããã¿ã¹ã¯ã¯ãæ§æã«ã¢ã¯ã»ã¹ã§ããã¢ããªã±ãŒã·ã§ã³å ã®åã³ã³ããŒãã³ãã«å¯ŸããŠãã®ãããªã¢ãã«ãäœæããããšã§ãã ç§ã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯ããã®ãããªã³ã³ããŒãã³ããããªããããŸãããã¢ããªã±ãŒã·ã§ã³èªäœã¯ããªãç·è±ãã§ãããã³ãŒããç©æ¥µçã«åå©çšããããã70ã®ã¡ã€ã³ã¯ã©ã¹ã®ã¿ãæ§æãããŠããŸãã 圌ãã®ããã«ãç§ã¯70ã®ã¢ãã«ãæžããªããã°ãªããŸããã§ããã
è²»çšïŒ
- 12ãµãŒãã¹
- 70ã®æ§æå¯èœãªã¯ã©ã¹
- => 70ã®ConfigurationModelsïŒã60ã¯ç°¡åã§ãïŒ;
- 1-2人é±ã
èªåèªèº«ãæ§æããã³ã³ããŒãã³ãã®ã³ãŒãã§ç»é¢ãéãã ãã§ã次ã®ç»é¢ã§å¯Ÿå¿ããConfigurationModelã®ã³ãŒããäœæããŸããã ãããã®ã»ãšãã©ã¯ã瀺ãããŠããäŸã®ããã«ç°¡åã§ãã å Žåã«ãã£ãŠã¯ãåå²ãšæ¡ä»¶ä»ãé·ç§»ããããŸã-ã³ãŒãã¯åå²ãããããªããŸããããã¹ãŠã解決ãããŸãã ç§ã¯ãã®åé¡ã1.5é±éãã2é±éã§è§£æ±ºãã70åã®ã³ã³ããŒãã³ããã¹ãŠã«ã€ããŠã¢ãã«ã説æããŸããã
ãã®çµæããã¹ãŠããŸãšãããšã次ã®ã³ãŒããåŸãããŸãã
åãµãŒãã¹/ç°å¢/ãªã©ã«ã€ã㊠æ§æã¢ãã«ãã€ãŸããã®ããªãŒã®æäžäœããŒããååŸããæ§æãããã¹ãŠãååŸããããã«èŠæ±ããŸãã ãã®æç¹ã§ããã¹ãŠã®æ€èšŒãå éšãééããåããããã£ã¯ãèšå®ããèªèº«ãåŒãåºãããšãã«ããã®å€ãæ£ãããã©ããããã§ãã¯ããŸãã å°ãªããšã1ã€ããã¹ããªãå ŽåãäŸå€ãçºçããŸãã ãã¹ãŠã®ã³ãŒãã¯ããã¹ãŠã®å€ãåç¬ã§æå¹ã§ããããšã確èªããããšã«ãã£ãŠååŸãããŸãã
ãµãŒãã¹ã®çžäºäŸåæ§
ãµãŒãã¹ã®çžäºäŸåé¢ä¿ã確èªããæ¹æ³ã«ã€ããŠã¯ããŸã 質åããããŸããã ããã¯ããå°ãè€éã§ããçžäºäŸåé¢ä¿ã®çš®é¡ã調ã¹ãå¿ èŠããããŸãã çžäºäŸåé¢ä¿ã¯ããµãŒãã¹ããããã¯ãŒã¯ãšã³ããã€ã³ãã§ãæºãããå¿ èŠããããšããäºå®ã«èŠçŽãããããšãããããŸããã ãµãŒãã¹Aã¯ããµãŒãã¹Bããã±ãããéä¿¡ããã¢ãã¬ã¹ãæ£ç¢ºã«ãªãã¹ã³ããå¿ èŠãããããã®éãåæ§ã§ãã ç§ã®äŸã§ã¯ãç°ãªããµãŒãã¹ã®æ§æéã®ãã¹ãŠã®äŸåé¢ä¿ãããã«ãªããŸããã ãã®åé¡ãéåžžã«ç°¡åã«è§£æ±ºããããšãã§ããŸãããç°ãªããµãŒãã¹ããããŒããšã¢ãã¬ã¹ãååŸããŠãã§ãã¯ããŸãã å€ãã®ãã¹ããããã§ãããããããã¯ããã°ãã§ãããã ç§ã¯æ ãè ã§ãããã¯æ¬²ãããããŸããã§ããã ãããã£ãŠãããããªãã£ãã
ãŸãããã®ãããã¯ãŒã¯ãšã³ããã€ã³ãèªäœããªããšãæœè±¡åãããã£ãã ããšãã°ãTCPæ¥ç¶ã®å Žåãå¿ èŠãªãã©ã¡ãŒã¿ãŒã¯ã¢ãã¬ã¹ãšããŒãã®2ã€ã ãã§ãã ãã«ããã£ã¹ãæ¥ç¶ã®å Žåã4ã€ã®ãã©ã¡ãŒã¿ãŒã ãããäœããã®ãªããžã§ã¯ãã«å€ããããšæããŸãã ãšã³ããã€ã³ããªããžã§ã¯ãã§ãããè¡ããŸããããå éšã«ã¯å¿ èŠãªãã®ããã¹ãŠé ãããŠããŸãã ãã®ã¹ã©ã€ãã¯ãã¢ãŠãããŠã³ãTCPãããã¯ãŒã¯æ¥ç¶ã§ããOutcomingTCPEndpointã®äŸã瀺ããŠããŸãã
IProperty<IEndpoint> TCP_REQUEST = outcomingTCP( // (+matchers, +default values) âTCP.Request.Addressâ, âTCP.Request.Port» ); class OutcomingTCPEndpoint implements IEndpoint { //(localInterface, localAddress, multicastGroup, port) @Override boolean matches( IEndpoint other); }
Endpoint matches(), Endpoint, , .
« »? , : , , - , â . , , / . , , .
, , ---, , Endpoint. ConfigurationModels â , . ? :
ValueWithContext[] allEndpoints = flattenedConfigurationValues(environment) .filter( valueIsEndpoint() ) .toArray(); ValueWithContext[] unpairedEndpoints = Arrays.stream( allEndpoints ) .filter( e -> !hasMatchedEndpoint(e, allEndpoints) ) .toArray(); assertThat( unpairedEndpoints, emptyArray() );
environment' endpoint', , , , . . « » O(n^2), , endpoint' , .
Endpoint , , . , , - .
, , , «» â , . . , , . , .
. , , . , , , c, , .
ConfigurationModel :
- (â udp-, â)
- .
, . , , , â . : , . , , , , .
. , ConfigurationModels, . , UDP- , , .
, endpoints , .dot. . â .
. çµè«ïŒ
- , , â .
- , . , .
- , , , .
Heisenbug 2018 Piter , : 6-7 Heisenbug . . 1 â .