æçš¿è
ïŒ Denis Tsyplakov ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ããDataArtäœå¹Žãã®éãããã°ã©ããŒã¯æã
åãééããç¹°ãè¿ãããšãçºèŠããŸããã æ®å¿µãªãããéçºã®çè«çåŽé¢ã«é¢ããæ¬ã¯ããããåé¿ããã®ã«åœ¹ç«ã¡ãŸãããéåžžãæ¬ã«ã¯å
·äœçã§å®çšçãªã¢ããã€ã¹ããããŸããã ãããŠãç§ãçç±ãæšæž¬ããŸã...
ããšãã°ã
ãã®ã³ã°ãã¯ã©ã¹èšèšã«é¢ããŠæåã«é ã«æµ®ãã¶æšå¥šäºé
ã¯éåžžã«åçŽã§ãã ããããçµéšã§ã¯ãããã ãã§ã¯ååã§ã¯ãªãããšã瀺ãããŠããŸãã ãã®å Žåã®ã¯ã©ã¹ã®èšèšã¯è¯ãäŸã§ã-誰ãããã®è³ªåãç¬èªã®æ¹æ³ã§èŠããšããäºå®ããçããæ°žé ã®é çã ãããã£ãŠãåºæ¬çãªãã³ãã1ã€ã®èšäºã«ãŸãšããããšã§ãå€ãã®å
žåçãªåé¡ãåé¿ããæãéèŠãªããšãšããŠãååãããããæãããšã«ããŸããã ããã€ãã®ååãããªãã«ãšã£ãŠå¹³å¡ã«æããå ŽåïŒãããã¯æ¬åœã«å¹³å¡ã ããã§ãïŒïŒ-ããã§ããããã¯ãã§ã«ããªãã®ç®è³ªäžã«èœã¡çããŠãããããªãã®ããŒã ã¯ç¥çŠãããŸãã
ç§ã¯äºçŽãããŸããå®éãåçŽåã®ããã ãã«ã¯ã©ã¹ã«çŠç¹ãåœãŠãŸãã ã¢ããªã±ãŒã·ã§ã³ã®æ©èœããã®ä»ã®æ§æèŠçŽ ã«ã€ããŠãã»ãŒåãããšãèšããŸãã
ã¢ããªã±ãŒã·ã§ã³ãæ©èœããŠã¿ã¹ã¯ãå®è¡ããå Žåããã®èšèšã¯è¯å¥œã§ãã ãã©ããïŒ ã¢ããªã±ãŒã·ã§ã³ã®ç®çé¢æ°ã«äŸåããŸãã å±ç€ºäŒã§äžåºŠè¡šç€ºããå¿
èŠãããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã«éåžžã«é©ããŠãããã®ã¯ãéè¡ãé·å¹ŽéçºããŠããååŒãã©ãããã©ãŒã ã«ã¯é©ããªãå¯èœæ§ããããŸãã ããçšåºŠãŸã§ããã®è³ªåã«å¯Ÿããçãã¯
SOLIDååãšåŒã¶ããšãã§ããŸãããããã¯ããŸãã«ãäžè¬çã§ã-ååãšã®äŒè©±ã§åç
§ã§ãããããå
·äœçãªæ瀺ãå¿
èŠã§ãã
察象ã¢ããªã±ãŒã·ã§ã³
æ®éçãªçãã¯ãªãã®ã§ãç¯å²ãçããããšãææ¡ããŸãã HTTPãŸãã¯å¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠèŠæ±ãåãå
¥ãããããã®äžã«ããã€ãã®ããžãã¯ãå®è£
ãããã§ãŒã³å
ã®æ¬¡ã®ãµãŒãã¹ã«èŠæ±ãè¡ãããåä¿¡ããããŒã¿ãã©ããã«æ ŒçŽããæšæºã®ããžãã¹ã¢ããªã±ãŒã·ã§ã³ãäœæããŠãããšããŸãã ç°¡åã«ããããã«ãSpring IoCãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãããšä»®å®ããŸããããã¯çŸåšéåžžã«äžè¬çã§ãããæ®ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ããªã䌌ãŠããããã§ãã ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠäœãèšããŸããïŒ
- ããã»ããµã1ã€ã®ãªã¯ãšã¹ãã®åŠçã«è²»ããæéã¯éèŠã§ãããéèŠã§ã¯ãããŸãã-倩åã0.1ïŒ
å¢å ããŠãããã§ã¯ãããŸããã
- ãã©ãã€ãã®ã¡ã¢ãªãèªç±ã«äœ¿çšããããšã¯ã§ããŸããããã¢ããªã±ãŒã·ã§ã³ãããã«50ã100ãããã€ãã䜿çšããå Žåãããã¯çœå®³ã«ã¯ãªããŸããã
- ãã¡ãããéå§æéãçãã»ã©è¯ãã§ãã ãã ãã6ç§ãš5.9ç§ã®éã«æ ¹æ¬çãªéãã¯ãããŸããã
æé©ååºæº
ãã®å Žåãç§ãã¡ã«ãšã£ãŠäœãéèŠã§ããïŒ
ãããžã§ã¯ãã³ãŒãã¯ãããžãã¹ã§æ°å¹Žããããã10幎以äžäœ¿çšãããå¯èœæ§ããããŸãã
ã³ãŒãã¯ãäºãã«ãªãã¿ã®ãªãè€æ°ã®éçºè
ã«ãã£ãŠæ°åä¿®æ£ãããŸãã
æ°å¹ŽåŸã«ã¯ãéçºè
ãæ°ããLibXYZã©ã€ãã©ãªãŸãã¯FrABCãã¬ãŒã ã¯ãŒã¯ã䜿çšããããªãå¯èœæ§ããããŸãã
ããæç¹ã§ãã³ãŒãã®äžéšãŸãã¯ãããžã§ã¯ãå
šäœãå¥ã®ãããžã§ã¯ãã®ã³ãŒãããŒã¹ãšããŒãžã§ããŸãã
ãããŒãžã£ãŒã®äžã§ããã®ãããªåé¡ã¯ããã¥ã¡ã³ãã®å©ããåããŠè§£æ±ºãããããšãäžè¬çã«åãå
¥ããããŠããŸãã ãã¡ãããããã¥ã¡ã³ãã¯äŸ¿å©ã§äŸ¿å©ã§ãããããžã§ã¯ãã§äœæ¥ãéå§ãããšã5æã®ãªãŒãã³ãã±ãããããã£ãŠããã®ã§ããããžã§ã¯ããããŒãžã£ãŒããé²æç¶æ³ãå°ããããçŽ150åãèªãã§ïŒèŠããŠïŒãã ãããåªç§ãªäœå®¶ããã¯ã»ã©é ãæç« ã®ããŒãžã ãã¡ããããããžã§ã¯ãã«æ³šãã®ã«æ°æ¥ããããã¯æ°é±éããããŸããããåçŽãªç®è¡æŒç®ã䜿çšããå Žåã¯ãäžæ¹ã§5,000,000ãã€ãã®ã³ãŒããããäžæ¹ã§ã¯ãããšãã°50åŽåæéã§ãã å¹³åãããšã1æéããã100 KBã®ã³ãŒããæ¿å
¥ããå¿
èŠããããŸããã ãããŠãããã§ã¯ãã¹ãŠãã³ãŒãã®å質ã«å€§ããäŸåããŸãã ããããªå ŽåïŒçµã¿ç«ãŠãç°¡åã§ãé©åã«æ§é åãããäºæž¬å¯èœã§ããå Žåããããžã§ã¯ãã«æ³šãããšã¯ãããã»ã©èŠçã®å°ãªãããã»ã¹ã®ããã§ãã ããã§æåŸã®åœ¹å²ã¯ãã¯ã©ã¹ã®èšèšã§ã¯ãããŸããã æåŸããé ãã
ã¯ã©ã¹ã®ãã¶ã€ã³ãã欲ãããã®
äžèšã®ãã¹ãŠãããäžè¬çãªã¢ãŒããã¯ãã£ãæè¡ã¹ã¿ãã¯ãéçºããã»ã¹ãªã©ã«ã€ããŠå€ãã®èå³æ·±ãçµè«ãåŒãåºãããšãã§ããŸããããããæåããã¯ã©ã¹èšèšã«ã€ããŠè©±ãããšã«ããŸãããããã«é¢ããŠå
ã«è¿°ã¹ãããšããåŠã¹ãæçšãªããšãèŠãŠã¿ãŸãããã
- ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«å®å
šã«ç²ŸéããŠããªãéçºè
ãã¯ã©ã¹ãèŠãŠããã®ã¯ã©ã¹ã®æ©èœãç解ã§ããããã«ããããšæããŸãã ãããŠãã®é-æ©èœçãŸãã¯éæ©èœçèŠä»¶ãèŠããšãã¢ããªã±ãŒã·ã§ã³ããããæ
åœããã¯ã©ã¹ã®ã©ãã«ããã®ãããã«æšæž¬ã§ããŸããã ããŠãèŠä»¶ã®å®è£
ã¯ã¢ããªã±ãŒã·ã§ã³å
šäœã«ãåºãããã®ã§ã¯ãªãã1ã€ã®ã¯ã©ã¹ãŸãã¯ã¯ã©ã¹ã®ã³ã³ãã¯ããªã°ã«ãŒãã«éäžããããšãæãŸããã§ãã ã©ãããã¢ã³ããã¿ãŒã³ãªã®ããäŸãæããŠèª¬æããŸãããã ç¹å®ã®ã¿ã€ãã®10ã®ãªã¯ãšã¹ãããã¢ã«ãŠã³ãã«20ãã€ã³ã以äžãããŠãŒã¶ãŒã®ã¿ãå®è¡ã§ããããšã確èªããå¿
èŠããããšããŸãïŒãããäœã§ããïŒã ãã®ãããªèŠä»¶ãå®è£
ããããã®æªãæ¹æ³ã¯ãåãªã¯ãšã¹ãã®å
é ã«ãã§ãã¯ãæ¿å
¥ããããšã§ãã ãã®åŸãããžãã¯ã¯ç°ãªãã³ã³ãããŒã©ãŒã§10ã®ã¡ãœããã«åæ£ãããŸãã è¯ãæ¹æ³ã¯ããã£ã«ã¿ãŒãŸãã¯WebRequestInterceptorãäœæãããã¹ãŠã1ãæã§ãã§ãã¯ããããšã§ãã
- ã¯ã©ã¹ã³ã³ãã©ã¯ãã«åœ±é¿ãäžããªã1ã€ã®ã¯ã©ã¹ã®å€æŽããä»ã®ã¯ã©ã¹ã«åœ±é¿ãåãŒããªãããã«ããããå®éã«åœ±é¿ãäžããªãããã«ããŸãã èšãæããã°ãã¯ã©ã¹ã³ã³ãã©ã¯ãã®å®è£
ãã«ãã»ã«åããŸãã
- ã¯ã©ã¹ã³ã³ãã©ã¯ããå€æŽãããšãã«ãåŒã³åºãã®ãã§ãŒã³ããã©ã£ãŠæ€çŽ¢ã䜿çšããããšã§ããã®å€æŽã圱é¿ããã¯ã©ã¹ãèŠã€ããããšãã§ããããã«ããããšæããŸãã ã€ãŸããã¯ã©ã¹ã«éæ¥çãªäŸåé¢ä¿ããªãããã«ããŸãã
- å¯èœã§ããã°ãããã€ãã®åäžã¬ãã«ã®ã¹ãããã§æ§æãããã¯ãšãªåŠçããã»ã¹ããããã€ãã®ã¯ã©ã¹ã®ã³ãŒãã«ãã£ãŠå¡ãã€ã¶ãããããšã¯ãªããåãã¬ãã«ã§èšè¿°ãããããšã確èªããããšæããŸãã ãã®ãããªåŠçããã»ã¹ãèšè¿°ããã³ãŒãããæ確ãªååãæã€1ã€ã®ã¡ãœããå
ã®1ã€ã®ç»é¢ã«åãŸãå Žåãéåžžã«äŸ¿å©ã§ãã ããšãã°ãè¡å
ã®ãã¹ãŠã®åèªãæ€çŽ¢ããåèªããšã«ãµãŒãããŒãã£ãµãŒãã¹ãåŒã³åºããåèªã®èª¬æãååŸãã説æã«æžåŒãé©çšããŠãçµæãããŒã¿ããŒã¹ã«ä¿åããå¿
èŠããããŸãã ããã¯ã4ã€ã®ã¹ããããããªãäžé£ã®ã¢ã¯ã·ã§ã³ã§ãã ãããã®æé ã次ã
ã«å®è¡ãããã¡ãœãããããå Žåãã³ãŒããç解ãããã®ããžãã¯ãå€æŽãããšéåžžã«äŸ¿å©ã§ãã
- ã³ãŒãå
ã®åããã®ãåãæ¹æ³ã§å®è£
ãããã®ã§ãã ããšãã°ãã³ã³ãããŒã©ãŒããããŒã¿ããŒã¹ã«ããã«ã¢ã¯ã»ã¹ããå Žåã¯ãã©ãã§ãã¢ã¯ã»ã¹ããæ¹ãè¯ãã§ãããïŒãã ãããã®ãããªèšèšãè¯ãæ¹æ³ãšã¯åŒã³ãŸããïŒã ãŸãããµãŒãã¹ãšãªããžããªã®ã¬ãã«ããã§ã«å
¥åããŠããå Žåã¯ãã³ã³ãããŒã©ãŒããçŽæ¥ããŒã¿ããŒã¹ã«æ¥ç¶ããªãããšããå§ãããŸãã
- æ©èœçããã³éæ©èœçèŠä»¶ã«çŽæ¥è²¬ä»»ãè² ããªãã¯ã©ã¹/ã€ã³ã¿ãŒãã§ãŒã¹ã®æ°ãããã»ã©å€ããªãããšãæã¿ãŸãã ããžãã¯ãåããåã¯ã©ã¹ã«2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ïŒ5ã€ã®ã¯ã©ã¹ããã®ç¶æ¿ã®è€éãªéå±€ãã¯ã©ã¹ãã¡ã¯ããªãšæœè±¡ã¯ã©ã¹ãã¡ã¯ããªïŒããããããžã§ã¯ãã§ã®äœæ¥ã¯éåžžã«å°é£ã§ãã
å®çšçãªæšå¥šäºé
åžæãå®åŒåããŠãç®æšãéæããããã®å
·äœçãªæé ãæŠèª¬ã§ããŸãã
éçã¡ãœãã
ãŠã©ãŒã ã¢ãããšããŠãæ¯èŒçåçŽãªã«ãŒã«ããå§ããŸãã 䜿çšããã©ã€ãã©ãªã®ããããã®æäœã«å¿
èŠã§ãªãéããéçã¡ãœãããäœæããªãã§ãã ããïŒããšãã°ãããŒã¿åã®ã·ãªã¢ã©ã€ã¶ãŒãäœæããå¿
èŠããããŸãïŒã
ååãšããŠãéçã¡ãœããã䜿çšããŠãåé¡ã¯ãããŸããã ã¡ãœããã®åäœããã®ãã©ã¡ãŒã¿ã«å®å
šã«äŸåããŠããå Žåãå®éã«éçã«ããªãã®ã¯ãªãã§ããã ãã ããã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãããã€ã³ãããSpring IoCã䜿çšãããšããäºå®ãèæ
®ããå¿
èŠããããŸãã Spring IoCã¯ãBeanïŒBeanïŒãšãã®ã¹ã³ãŒãïŒScopeïŒã®æŠå¿µãæ±ããŸãã ãã®ã¢ãããŒãã¯ãã¯ã©ã¹ã«ã°ã«ãŒãåãããéçã¡ãœãããšçµã¿åãããããšãã§ããŸããããã®ã¢ããªã±ãŒã·ã§ã³ãç解ãããã®äžã®äœããå€æŽããããšããã§ããŸãïŒããšãã°ãã¡ãœãããŸãã¯ã¯ã©ã¹ã«ã°ããŒãã«ãã©ã¡ãŒã¿ãŒãæž¡ãå¿
èŠãããå ŽåïŒã
åæã«ãIoCãã³ãšæ¯èŒããéçã¡ãœããã¯ãã¡ãœããåŒã³åºãã®é床ã«ãããŠéåžžã«ããããªå©ç¹ããããããŸãã ãããŠããã§ãããããå©ç¹ãçµãããŸãã
ç°ãªãã¯ã©ã¹éã§å€æ°ã®è¶
é«éåŒã³åºããå¿
èŠãšããããžãã¹æ©èœãæ§ç¯ããŠããªãå Žåã¯ãéçã¡ãœããã䜿çšããªãæ¹ãè¯ãã§ãããã
ããã§ãèªè
ã¯ãããããStringUtilsã¯ã©ã¹ãšIOUtilsã¯ã©ã¹ã¯ã©ããªã®ãïŒããšå°ãããããããŸãããå®éãJavaã®äžçã«ã¯äŒçµ±ããããŸãã ãããããã®äŒçµ±ã¯ç§ã«ã¯ãããèãããããã§ãã ãã¡ãããããã«åŸãã°ã倧ããªå®³ã¯äºæ³ãããŸããããã¹ãŠã®Javaããã°ã©ããŒãæ
£ããŠããŸãã ãããããã®ãããªååŒçãªè¡åã«ã¯æå³ããããŸããã äžæ¹ã§ã¯ãStringUtils Beanãäœæããä»æ¹ã§ã¯ãBeanããã³ãã¹ãŠã®è£å©ã¡ãœãããéçã«ããªãã®ã§ããã°ãéçãªåã¯ã©ã¹StockTradingUtilsããã³BlockChainUtilsããã§ã«äœæããŸãããã éçã¡ãœããã«ããžãã¯ãé
眮ãå§ããŠãå¢çç·ãæããŠåæ¢ããã®ã¯å°é£ã§ãã å§ããªãã§ãã ããã
æåŸã«ãJava 11ã§ã¯ãéçºè
ããããžã§ã¯ãéã§äœå幎ãããŸãã£ãŠããå€ãã®ãã«ããŒã¡ãœããããæšæºã©ã€ãã©ãªã®äžéšã«ãªãããããšãã°Google Guavaã®ã©ã€ãã©ãªã«ããŒãžãããããšãå¿ããªãã§ãã ããã
ã¢ãããã¯ã§ã³ã³ãã¯ããªã¯ã©ã¹å¥çŽ
ãã¹ãŠã®ãœãããŠã§ã¢ã·ã¹ãã ã®éçºã«é©çšãããç°¡åãªã«ãŒã«ããããŸãã ä»»æã®ã¯ã©ã¹ãèŠããšãé·ãçºæ調æ»ã«é Œãããšãªãããã®ã¯ã©ã¹ãäœãããã®ããè¿
éãã€ã³ã³ãã¯ãã«èª¬æã§ããã¯ãã§ãã 説æã1ã€ã®æ®µèœã«åããããšãäžå¯èœãªå ŽåïŒãã ããå¿
ããã1ã€ã®æã§è¡šçŸããããšã¯éããŸããïŒããã®ã¯ã©ã¹ãããã€ãã®ã¢ãããã¯ã¯ã©ã¹ã«åããŠèãã䟡å€ããããããããŸããã ããšãã°ãããã£ã¹ã¯äžã®ããã¹ããã¡ã€ã«ãæ€çŽ¢ããããããã®æåZã®æ°ãã«ãŠã³ããããã¯ã©ã¹-ããã£ã¹ã¯äžã®æ€çŽ¢ã+ãæåã®æ°ãã«ãŠã³ããããå解ã®è¯ãåè£ã§ãã
äžæ¹ãããããã1ã€ã®ã¢ã¯ã·ã§ã³çšã«èšèšãããã¯ã©ã¹ãå°ããããããªãã§ãã ããã ããããã¯ã©ã¹ã¯ã©ã®ãµã€ãºã«ããå¿
èŠããããŸããïŒ åºæ¬çãªã«ãŒã«ã¯æ¬¡ã®ãšããã§ãã
- çæ³çã«ã¯ãã¯ã©ã¹ã³ã³ãã©ã¯ããããžãã¹æ©èœïŒãŸãã¯èŠä»¶ã®é
眮æ¹æ³ã«å¿ããŠãµãæ©èœïŒã®èª¬æãšäžèŽããå Žåã ããã¯åžžã«å¯èœã§ãããšã¯éããŸããããã®ã«ãŒã«ãé å®ããããšãããšãé¢åã§éèªæãªã³ãŒããäœæãããå Žåãã¯ã©ã¹ãå°ããªéšåã«åå²ããããšããå§ãããŸãã
- ã¯ã©ã¹å¥çŽã®å質ãè©äŸ¡ããããã®åªããã¡ããªãã¯ã¯ãå¥çŽã®è€éãã«å¯Ÿããåºæã®è€éãã®æ¯çã§ãã ããšãã°ãéåžžã«åªããïŒãšã¯ããçŽ æŽãããïŒã¯ã©ã¹ã³ã³ãã©ã¯ãã¯æ¬¡ã®ããã«ãªããŸãïŒããã®ã¯ã©ã¹ã«ã¯ãå
¥åæã«ãã·ã¢èªã§äž»é¡ã®èª¬æãå«ãè¡ãåãåããçµæãšããŠç¹å®ã®ãããã¯ã®ã¹ããŒãªãŒãäœæããã¡ãœããã1ã€ãããŸãã ããã§ã¯ãå¥çŽã¯ã·ã³ãã«ã§äžè¬çã«ç解ãããŠããŸãã ãã®å®è£
ã¯éåžžã«è€éã§ãããè€éãã¯ã¯ã©ã¹å
ã«é ãããŠããŸãã
ãã®ã«ãŒã«ãéèŠãªã®ã¯ãªãã§ããïŒ
- ãŸããåã¯ã©ã¹ãäœãããã®ããèªåèªèº«ã«æ確ã«èª¬æããèœåã¯åžžã«åœ¹ç«ã¡ãŸãã æ®å¿µãªããããã¹ãŠã®ãããžã§ã¯ãéçºè
ããããè¡ãããšã¯ã§ããŸããã ããããããã¯Pathã¯ã©ã¹ã®ã©ãããŒã§ããäœããã®çç±ã§Pathã®ä»£ããã«äœ¿çšããŸããã 圌女ã«ã¯ããã¹ãŠã®File.separatorãã¹ã2åã«ã§ããã¡ãœããããããŸããã¬ããŒããã¯ã©ãŠãã«ä¿åãããšãã«ãã®ã¡ãœãããå¿
èŠã§ãããäœããã®çç±ã§Pathã¯ã©ã¹ã«ãªããŸããã
- 人éã®è³ã¯ã5ã10åãŸã§ã®ãªããžã§ã¯ããåæã«æäœã§ããŸãã ã»ãšãã©ã®äººã¯7人以äžã§ãã ãããã£ãŠãéçºè
ãåé¡ã解決ããããã«7ã€ä»¥äžã®ãªããžã§ã¯ããæäœããå¿
èŠãããå Žåãäœããéããã1ã€ã®è«ççãªãåãã®äžã«è€æ°ã®ãªããžã§ã¯ããè©°ã蟌ãŸãªããã°ãªããŸããã ãŸã 梱å
ããå¿
èŠãããå Žåã¯ãããã«æèããŠããã®åã«æå³ã®ããååãšæ確ãªå¥çŽãäžããŠãã ããã
ãã¹ãŠãååã«ãã现ãã§ããããšã確èªããæ¹æ³ã¯ïŒ ååã«5åïŒ5åïŒäžããããé Œãã§ãã ããã çŸåšäœæ¥äžã®ã¢ããªã±ãŒã·ã§ã³ã®äžéšãæ
ããŸãã åã¯ã©ã¹ã«ã€ããŠããã®ã¯ã©ã¹ãæ£ç¢ºã«äœãããããååã«èª¬æããŸãã 5å以å
ã«åãŸããªãå ŽåããŸãã¯ãã®ã¯ã©ã¹ãå¿
èŠãªçç±ãååãç解ã§ããªãå Žåã¯ãããããäœããå€æŽããå¿
èŠããããŸãã ãŸãããŸãã¯å€æŽããã«ãå¥ã®ååãšå®éšãããçŽããŠãã ããã
ã¯ã©ã¹ã®äŸåé¢ä¿
ZIPã¢ãŒã«ã€ãã«ããã¯ãããPDFãã¡ã€ã«ã®ãªã³ã¯ãããããã¹ãã»ã¯ã·ã§ã³ã100ãã€ãããé·ãéžæããããããããŒã¿ããŒã¹ã«ä¿åããå¿
èŠããããšããŸãã ãã®ãããªå Žåã®äžè¬çãªã¢ã³ããã¿ãŒã³ã¯æ¬¡ã®ããã«ãªããŸãã
- ZIPã¢ãŒã«ã€ããéãããã®äžã®PDFãã¡ã€ã«ãæ¢ããŠInputStreamãšããŠè¿ãã¯ã©ã¹ããããŸãã
- ãã®ã¯ã©ã¹ã«ã¯ãããã¹ãã®PDF段èœãæ€çŽ¢ããã¯ã©ã¹ãžã®ãªã³ã¯ããããŸãã
- 次ã«ãPDFã§æ©èœããã¯ã©ã¹ã«ã¯ãããŒã¿ããŒã¹ã«ããŒã¿ãä¿åããã¯ã©ã¹ãžã®ãªã³ã¯ããããŸãã
äžæ¹ã§ã¯ããã¹ãŠãè«ççã«èŠããŸãããã§ãŒã³å
ã®æ¬¡ã®ã¯ã©ã¹ãšçŽæ¥åŒã°ããåä¿¡ããŒã¿ã ãã ããåæã«ããã§ãŒã³ã®æäžäœã«ããã¯ã©ã¹ã®ã³ã³ãã©ã¯ãã¯ããã®èåŸã«ãããã§ãŒã³ã«å«ãŸãããã¹ãŠã®ã¯ã©ã¹ã®ã³ã³ãã©ã¯ããšäŸåé¢ä¿ã«æ··åšããŸãã ãããã®ã¯ã©ã¹ãã¢ãããã¯ãã€çžäºã«ç¬ç«ãããããã3ã€ã®ã¯ã©ã¹ãçžäºã«æ¥ç¶ããŠåŠçããžãã¯ãå®éã«å®è£
ããå¥ã®ã¯ã©ã¹ãäœæããæ¹ãã¯ããã«æ£ç¢ºã§ãã
ãããããªãæ¹æ³ïŒããã§äœãééã£ãŠããŸããïŒ ZIPãã¡ã€ã«ãåŠçããã¯ã©ã¹ã¯ãPDFãåŠçããã¯ã©ã¹ã«ããŒã¿ãæž¡ãã次ã«ãããŒã¿ããŒã¹ãåŠçããã¯ã©ã¹ã«ããŒã¿ãæž¡ããŸãã ããã¯ãçµæãšããŠãäœããã®çç±ã§ZIPã§æ©èœããã¯ã©ã¹ãããŒã¿ããŒã¹ã§æ©èœããã¯ã©ã¹ã«äŸåããããšãæå³ããŸãã ããã«ãåŠçããžãã¯ã¯3ã€ã®ã¯ã©ã¹ã«åæ£ããŠããããããããç解ããã«ã¯ã3ã€ã®ã¯ã©ã¹ãã¹ãŠã調ã¹ãå¿
èŠããããŸãã RESTåŒã³åºããä»ããŠãµãŒãããŒãã£ã®ãµãŒãã¹ã«æž¡ãããã«PDFããååŸããããã¹ãã®æ®µèœãå¿
èŠãªå Žåã¯ã©ããªããŸããïŒ PDFã§åäœããã¯ã©ã¹ãå€æŽããå¿
èŠããããŸãããŸãããã®äžã§RESTã䜿çšããå¿
èŠããããŸãã
æ¹æ³ïŒããã«ã¯4ã€ã®ã¯ã©ã¹ããããŸãã
- ZIPã¢ãŒã«ã€ãã§ã®ã¿åäœããPDFãã¡ã€ã«ã®ãªã¹ããè¿ãã¯ã©ã¹ïŒãã¡ã€ã«ãè¿ãã®ã¯æªã-ãã¡ã€ã«ã¯å€§ãããã¢ããªã±ãŒã·ã§ã³ãå£ãã§ãããããããããã®å Žåã®åºãæå³ã§ã®ãæ»ãããšããèšèãèªãã§ã¿ãŸããããäŸãã°ãInputStreamããStreamãè¿ããŸãïŒ
- 2çªç®ã®ã¯ã©ã¹ã¯ãPDFã®æäœãæ
åœããŸãã
- 3çªç®ã®ã¯ã©ã¹ã¯ãããŒã¿ããŒã¹ã«æ®µèœãä¿åãã以å€ãäœãã§ããŸããã
- ãããŠãæåéãæ°è¡ã®ã³ãŒãã§æ§æããã4çªç®ã®ã¯ã©ã¹ã«ã¯ã1ã€ã®ç»é¢ã«åãŸããã¹ãŠã®ããžãã¹ããžãã¯ãå«ãŸããŠããŸãã
2019幎ã®Javaã«ã¯å°ãªããšã2ã€ã®è¯ãç¹ãããããšã匷調ããŸã
è¯ãïŒãã¡ã€ã«ãšãã¹ãŠã®æ®µèœã®å®å
šãªãªã¹ããã¡ã¢ãªå
ã®ãªããžã§ã¯ããšããŠè»¢éããªãæ¹æ³ã ããã¯ïŒ
- Java Stream API
- ã³ãŒã«ãã㯠ã€ãŸããããžãã¹é¢æ°ãå«ãã¯ã©ã¹ã¯ããŒã¿ãçŽæ¥è»¢éããŸããããZIP Extractorã䜿çšããŸãïŒããã«ã³ãŒã«ããã¯ããããŸããZIPãã¡ã€ã«ã§PDFãã¡ã€ã«ãæ¢ããåãã¡ã€ã«ã®InputStreamãäœæãã転éãããã³ãŒã«ããã¯ãåŒã³åºããŸãã
æé»ã®åäœ
以åã¯èª°ã解決ããŠããªãã£ããŸã£ããæ°ããåé¡ã解決ããããšãããä»ã®éçºè
ããã§ã«æ°çŸïŒãŸãã¯æ°åäžïŒåè¡ã£ãããšãããå ŽåãããŒã ã¡ã³ããŒå
šå¡ããœãªã¥ãŒã·ã§ã³ã®åŸªç°çãªè€éããšãªãœãŒã¹éçŽæ§ã«äžå®ã®æåŸ
ãæ±ããŠããã ããšãã°ããã¡ã€ã«å
ã§æåzã§å§ãŸããã¹ãŠã®åèªãæ€çŽ¢ããå¿
èŠãããå Žåãããã¯ãã£ã¹ã¯ãããããã¯åäœã§ãã¡ã€ã«ã1åã ãé£ç¶ããŠèªã¿åãããšã§ãã ã€ãŸãã
httpsïŒ//gist.github.com/jboner/2841832ã«çŠç¹ãåãããå Žåããã®ãããªæäœã«ã¯1 MBãããæ°ãã€ã¯ãç§ããããŸãããããããããã°ã©ãã³ã°ç°å¢ãšã·ã¹ãã è² è·ã«ãã£ãŠã¯ãæ°åãŸãã¯100ãã€ã¯ãç§ã«ããªããŸãããäžç§ã§ããããŸããã æ°åãããã€ãã®ã¡ã¢ãªãå¿
èŠã«ãªãïŒçµæãã©ãããããšãã質åã¯çããŸããããã¯å¥ã®ã¯ã©ã¹ã®é¢å¿äºã§ãïŒãã³ãŒãã¯ãããã1ç»é¢çšåºŠããããŸãã åæã«ãä»ã®ã·ã¹ãã ãªãœãŒã¹ã䜿çšãããªãããšãäºæ³ãããŸãã ã€ãŸããã³ãŒãã¯ã¹ã¬ãããäœæãããããŒã¿ããã£ã¹ã¯ã«æžã蟌ã¿ããããã¯ãŒã¯ãä»ããŠãã±ãããéä¿¡ããããŒã¿ããŒã¹ã«ããŒã¿ãä¿åããŸããã
ããã¯ã¡ãœããåŒã³åºãã®éåžžã®æåŸ
ã§ãïŒ
zWordFinder.findZWords(inputStream). ...
ããšãã°ãåèªãzã§ã¯ãªãzã«åé¡ãããªã©ãäœããã®çç±ã§ã¯ã©ã¹ã®ã³ãŒãããããã®èŠä»¶ãæºãããŠããªãå Žåãæ¯åRESTã¡ãœãããåŒã³åºãå¿
èŠããããŸãïŒãããå¿
èŠãªçç±ã¯ããããŸãããããããæ³åããŠã¿ãŸãããïŒã¯ã©ã¹ã³ã³ãã©ã¯ãã«ã¯éåžžã«æ
éã«èšè¿°ããå¿
èŠããããŸãããŸããã¡ãœããã®ååããåç
§ããã¡ãœãããã©ããã§å®è¡ãããŠããããšã瀺ããŠããå Žåã¯éåžžã«äŸ¿å©ã§ãã
æé»çãªåäœã®åççãªçç±ããªãå Žåã¯ãã¯ã©ã¹ãæžãæããŸãã
ã¡ãœããã®è€éããšãªãœãŒã¹éçŽåºŠãžã®æåŸ
ãç解ããæ¹æ³ã¯ïŒ 次ã®ç°¡åãªæ¹æ³ã®ããããã«é Œãå¿
èŠããããŸãã
- çµéšãç©ããšãããªãåºãèŠéãåºãããŸãã
- ååã«å°ãã-ããã¯ãã€ã§ãã§ããŸãã
- éçºãéå§ããåã«ãããŒã ã¡ã³ããŒãšå®è£
èšç»ã«ã€ããŠè©±ãåããŸãã
- 次ã®è³ªåãèªåããŠãã ãããããããããã®æ¹æ³ã§ã¯åé·ãªãªãœãŒã¹ã䜿ããããªãã®ã§ããïŒãéåžžãããã§ååã§ãã
æé©åã«ãé¢äžããå¿
èŠã¯ãããŸãããã¯ã©ã¹100,000ã§äœ¿çšãããšãã«100ãã€ããç¯çŽããŠããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããŸãæå³ããããŸããã
ãã®ã«ãŒã«ã¯ãããšã³ãžãã¢ãªã³ã°ã«10 GBãå¿
èŠãšããã¢ããªã±ãŒã·ã§ã³ã§10ãã€ãã®ã¡ã¢ãªãç¯çŽããããã«1ãæãè²»ããã¹ãã§ã¯ãªãããªã©ã®è³ªåã«å¯Ÿããçããé ãããªãŒããŒãšã³ãžãã¢ãªã³ã°ã®è±ããªäžçãžã®çªãéããŸãã ããããããã§ã¯ãã®ãããã¯ãäœæããŸããã 圌女ã¯å¥ã®èšäºã«å€ããŸãã
æé»çãªã¡ãœããå
Javaããã°ã©ãã³ã°ã§ã¯ãçŸåšãã¯ã©ã¹åãšãã®åäœã«é¢ããæé»çãªèŠåãããã€ããããŸãã ãããã®å€ãã¯ãããŸããããããããå£ããªãæ¹ãè¯ãã§ãã ç§ã®é ã«æµ®ãã¶ãã®ããªã¹ãããŠã¿ãŸãïŒ
- ã³ã³ã¹ãã©ã¯ã¿ãŒ-ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããªãåå²ããããŒã¿æ§é ãäœæã§ããŸãããããŒã¿ããŒã¹ã§åäœããããã£ã¹ã¯ã«æžã蟌ã¿ãããããããã¯ãŒã¯ãä»ããŠããŒã¿ãéä¿¡ããŸããïŒçµã¿èŸŒã¿ã®ãã¬ãŒã¯ããããã¹ãŠå®è¡ã§ããŸãããããã¯å¥ã®è©±ã§ããããã«ãããããã¯ãã®ã³ã°èšå®è
ã®è¯å¿ã«ãããŸãïŒã
- Getter-getSomethingïŒïŒ-ãªããžã§ã¯ãã®æ·±ãããäœããã®ã¡ã¢ãªæ§é ãè¿ããŸãã ç¹°ãè¿ããŸããããã£ã¹ã¯ãžã®æžã蟌ã¿ãè€éãªèšç®ã®å®è¡ããããã¯ãŒã¯ãä»ããããŒã¿ã®éä¿¡ãããŒã¿ããŒã¹ãšã®é£æºã¯è¡ããŸããïŒé
延ORMãã£ãŒã«ãã§ããå Žåãé€ããããã¯é
延ãã£ãŒã«ãã现å¿ã®æ³šæãæã£ãŠäœ¿çšããçç±ã®1ã€ã§ãïŒ ã
- Setter-setSomethingïŒäœãïŒ-ããŒã¿æ§é ã®å€ãèšå®ããè€éãªèšç®ãè¡ããããããã¯ãŒã¯çµç±ã§ããŒã¿ãéä¿¡ãããããŒã¿ããŒã¹ã§åäœããŸããã éåžžãã»ãã¿ãŒã¯ãéèŠãªã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ã®æé»çãªåäœãæ¶è²»ãæ³å®ããŠããŸããã
- equalsïŒïŒããã³hashcodeïŒïŒ-ããŒã¿æ§é ã®ãµã€ãºã«ç·åœ¢ã«äŸåããéã§ã®åçŽãªèšç®ãšæ¯èŒãé€ããŠãäœãæåŸ
ãããŠããŸããã ã€ãŸãã3ã€ã®ããªããã£ããã£ãŒã«ãã®ãªããžã§ã¯ãã«å¯ŸããŠããã·ã¥ã³ãŒããåŒã³åºããšãN * 3ã®åçŽãªèšç®åœä»€ãå®è¡ãããããšãäºæ³ãããŸãã
- toSomethingïŒïŒ-ãã®ã¡ãœããã¯ãããããŒã¿åãå¥ã®ããŒã¿åã«å€æããå€æã«ã¯æ§é äœã®ãµã€ãºã«å¹æµããã¡ã¢ãªéãšãæ§é äœã®ãµã€ãºã«ç·åœ¢ã«äŸåããããã»ããµæéã®ã¿ãå¿
èŠã§ãããšäºæ³ãããŸãã åå€æã¯åžžã«ç·åœ¢ã«å®è¡ã§ãããšã¯éããªãããšã«æ³šæããŠãã ãããããšãã°ããã¯ã»ã«ç»åãSVG圢åŒã«å€æããããšã¯éåžžã«ç°¡åãªã¢ã¯ã·ã§ã³ã«ãªãå¯èœæ§ããããŸããããã®å Žåã¯ã¡ãœããã«å¥ã®ååãä»ããæ¹ãé©åã§ãã ããšãã°ãcomputeAndConvertToSVGïŒïŒãšããååã¯ããåä»ã«èŠããŸãããå
éšã§éèŠãªèšç®ãè¡ãããŠããããšãããã«ããããŸãã
äŸãæããŸãããã ç§ã¯æè¿ãã¢ããªã±ãŒã·ã§ã³ç£æ»ãè¡ããŸããã äœæ¥ã®ããžãã¯ã«ãããã³ãŒãå
ã®ã©ããã®ã¢ããªã±ãŒã·ã§ã³ãRabbitMQãã¥ãŒããµãã¹ã¯ã©ã€ãããããšãããããŸãã ç§ã¯ã³ãŒããæ©ããŠããŸã-ãã®å ŽæãèŠã€ãããŸããã ç§ã¯ãŠãµã®ãžã®ã¢ããŒã«ãçŽæ¥æ¢ããŠãããç»ãå§ããŠããŸãããµãã¹ã¯ãªãã·ã§ã³ãå®éã«è¡ãããããžãã¹ãããŒã®å Žæã«è¡ããŸã-ç§ã¯èªããŸãã ã³ãŒãã§ã®è¡šç€ºïŒ
- service.getQueueListenerïŒtickerNameïŒã¡ãœãããåŒã³åºãããŸã-è¿ãããçµæã¯ç¡èŠãããŸãã ããã¯èŠåãããããããŸããããã¡ãœããã®çµæãç¡èŠããããããªã³ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³å
ã®å¯äžã®ã³ãŒãã§ã¯ãããŸããã
- å
éšã§ã¯ãtickerNameã®nullããã§ãã¯ãããå¥ã®getQueueListenerByNameïŒtickerNameïŒã¡ãœãããåŒã³åºãããŸãã
- ãã®äžã§ãQueueListenerã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ããã£ãã«ãŒã®ååã«ãã£ãŠããã·ã¥ããååŸããïŒããã§ãªãå Žåã¯äœæãããŸãïŒãgetSubscriptionïŒïŒã¡ãœãããåŒã³åºãããŸãã
- ãããŠä»ãgetSubscriptionïŒïŒã¡ãœããå
ã§ããµãã¹ã¯ãªãã·ã§ã³ãå®éã«è¡ãããŸãã ãããŠãããã¯3ç»é¢ã®ãµã€ãºã®ã¡ãœããã®éäžã§çºçããŸãã
ççŽã«èšã£ãŠ-ãã§ãŒã³å
šäœãå®è¡ããã泚ææ·±ãæ°åã®ã³ãŒãç»é¢ãèªãããšãªãããµãã¹ã¯ãªãã·ã§ã³ãã©ãã«ããããæšæž¬ããããšã¯éçŸå®çã§ããã ã¡ãœãããsubscribeToQueueByTickerïŒtickerNameïŒãšåŒã°ããå Žåãæéã倧å¹
ã«ç¯çŽã§ããŸãã
ãŠãŒãã£ãªãã£ã¯ã©ã¹
ãDesign PatternsïŒElements of Reusable Object-Oriented SoftwareïŒ1994ïŒããšããçŽ æŽãããæ¬ããããŸãããããã¯å€ãã®å ŽåãGOFïŒäœè
ã®æ°ã§ã¯4人ã®ã®ã£ã³ã°ïŒãšåŒã°ããŠããŸãã ãã®æ¬ã®æçšæ§ã¯ãäž»ã«ãããŸããŸãªåœã®éçºè
ã«ã¯ã©ã¹ãã¶ã€ã³ãã³ãã¬ãŒããèšè¿°ããããã®åäžã®èšèªãæäŸãããšããäºå®ã«ãããŸãã çŸåšããã¯ã©ã¹ã¯1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã«ã®ã¿ååšããéçã¢ã¯ã»ã¹ãã€ã³ããæã£ãŠããããšãä¿èšŒãããŠãããã®ä»£ããã«ããã·ã³ã°ã«ãã³ããšèšãããšãã§ããŸãã åãæ¬ã¯ãè匱ãªå¿ã«é¡èãªæ害ãåŒãèµ·ãããŸããã ãã®å®³ã¯ããã©ãŒã©ã ãååãWebã¹ãã¢ãäœæããå¿
èŠããããã©ã®ãã³ãã¬ãŒãããå§ããå¿
èŠãããããæããŠãã ãããã®1ã€ããã®åŒçšã§ãã説æãããŠããŸãã èšãæããã°ãäžéšã®ããã°ã©ããŒã¯èšèšãã¿ãŒã³ãä¹±çšããåŸåãããã1ã€ã®ã¯ã©ã¹ã§ç®¡çã§ããå Žåã¯ãã€ã§ãããæè»æ§ãé«ãããããã«5ã€ãŸãã¯6ã€ãäžåºŠã«äœæããŸãã
æœè±¡ã¯ã©ã¹ãã¡ã¯ããªïŒãŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ãããè€éãªå¥ã®ãã¿ãŒã³ïŒãå¿
èŠãã©ãããå€æããæ¹æ³ ããã€ãã®ç°¡åãªèæ
®äºé
ããããŸãã
- Springã§ã¢ããªã±ãŒã·ã§ã³ãäœæããŠããå Žåã99ïŒ
ã®æéã¯å¿
èŠãããŸããã Springã¯ãããé«ãã¬ãã«ã®ãã«ãã£ã³ã°ãããã¯ãæäŸããŸãã 圹ã«ç«ã€ãšæãããæ倧å€ã¯ãæœè±¡ã¯ã©ã¹ã§ãã
- ãã€ã³ã1ã§ããŸã æ確ãªçããåŸãããªãå Žåã¯ãåãã³ãã¬ãŒããã¢ããªã±ãŒã·ã§ã³ã®è€éãã+1000ãã€ã³ã瀺ããŠããããšã«æ³šæããŠãã ããã ãã³ãã¬ãŒãã䜿çšããã¡ãªãããããã®å®³ãäžåããã©ãããæ
éã«åæããŸãã ã¡ã¿ãã¡ãŒã«ç®ãåãããšãããããã®è¬ãæ²»çããã ãã§ãªãããããã«å®³ãäžããããšãå¿ããªãã§ãã ããã ãã¹ãŠã®è¬ãäžåºŠã«é£²ãŸãªãã§ãã ããã
äžèŠãªæ¹æ³ã®è¯ãäŸã¯ã
ãã¡ããã芧
ãã ãã ã
ãããã«
èŠçŽãããšãæãåºæ¬çãªæšå¥šäºé
ããªã¹ããããŠããããšã«æ³šæããŠãã ããã ç§ã¯ããããèšäºã®åœ¢ã§äœæããããšããããŸãã-ãããã¯ãšãŠãæçœã§ãã ããããéå»1幎éã§ããããã®æšå¥šäºé
ã®å€ããéåãããŠããã¢ããªã±ãŒã·ã§ã³ã«é »ç¹ã«åºããããŸããã èªã¿ãããä¿å®ããããã·ã³ãã«ãªã³ãŒããæžããŸãããã