
ăłăźăăŽăăšăă§ăŻăăăšăŚăć確ăŤăŞăăžăďźĺ°ăŞăă¨ăăăăăăč¨čż°ăăĺż
čŚăăăă¨ăăäşĺŽďźă ć§ćăŽăăšăă§ăŻăăăŽĺĺ¨ăăŽăăŽăăĺ§ăăŚăăăšăŚăăŻăăăŤćç˝ă§ăŻăăăžăăă 誰ăăăăăăć¸ăăŚăăžăăďź ăăăŻéčŚă§ăăďź éŁăăă§ăăďź ĺ˝źăăŽĺŠăăĺăăŚăŠăŽăăăŞçľćăéćă§ăăžăăďź
ăăăé常ăŤćç¨ă§ăăăă¨ăĺ¤ćăăžăăăăăăčĄăăă¨ăŻé常ăŤç°Ąĺă§ăăăĺćăŤć§ćăŽăăšăăŤăŻĺ¤ăăŽĺžŽĺŚăŞéăăăăăžăă ăŠăŽăăŽ-ĺŽéăŽçľé¨ăŤĺşăĽăăŚçŤăŽä¸ăŤćăăăŚăăžăă
ăăŽčłćăŻă 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 );
ç°ĺ˘ăă¨ăŤăćĄäťśăćşăăăăžăă ăăă確čŞăăăŤăŻăç°ĺ˘ăăăľăźăăźăŽăŞăšăăăľăźăăšăŽăŞăšăăčŚă¤ăăĺż
čŚăăăăžăă 揥ăŤăć§ćăăăźăăă交塎çšă§ä˝ăă確čŞăăžăă ăăăăŁăŚăç§ăŻăăŽăăăŞăăŽăĺż
čŚă§ăăç§ăŻăăăé
罎ăŹă¤ă˘ăŚăă¨ĺźăłăžăăă

ăăŽăăźăżć§é ăĺĺžăăăăăŤăăŠăŽăľăźăăźăŤăŠăŽăľăźăăšăăŠăŽç°ĺ˘ăŤé
罎ăăăă¨ăăăă˘ăăŞăąăźăˇă§ăłăŽăăăă¤ćšćłăŤă˘ăŻăťăšăăćŠäźăăłăźăăăĺžăĺż
čŚăăăăžăă ăăăŚăăăăé˛ăă§ăć§ćăŽăăźăă¨ĺŚçăéĺ§ăăžăă
é
罎ăŹă¤ă˘ăŚăăŻăĺăăźă ăăăłĺăăă¸ă§ăŻăăŤĺşćă§ăă ç§ăćăă-ăăăŻä¸čŹçăŞăąăźăšă§ăăé常ăăľăźăăźăăľăźăăšăŽăťăăăăăăăľăźăăšăŤăŻ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> { 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(
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 :
, . , , , â . : , . , , , , .
. , ConfigurationModels, . , UDP- , , .
, endpoints , .dot. . â .
. çľčŤďź
Heisenbug 2018 Piter , : 6-7 Heisenbug . . 1 â .