ç§èªèº«ã®çµéšã«ã¯ãäŸåé¢ä¿ãåªå æŠå¿µãšããŠèšå®ãããŠããGoogleã®å éšãªããžããªã§ã® 10幎éã®äœæ¥ãšãGoããã°ã©ãã³ã°èšèªã®äŸåé¢ä¿ã·ã¹ãã ã®éçºãå«ãŸããŠããŸã ã
äŸåé¢ä¿ã«ã¯ãèŠéããããã¡ãªæ·±å»ãªãªã¹ã¯ã䌎ããŸãã ãœãããŠã§ã¢ã®æå°éšåã®åçŽãªåå©çšãžã®ç§»è¡ã¯éåžžã«è¿ éã«è¡ããããããäŸåé¢ä¿ã®å¹æçãªéžæãšäœ¿çšã®ããã®ãã¹ããã©ã¯ãã£ã¹ããŸã éçºããŠããŸããã ããããé©åã§ãããšããšããã§ãªããšãã決å®ããããšããã ãã®èšäºã®ç®çã¯ããªã¹ã¯ãè©äŸ¡ãããã®åéã§ã®ãœãªã¥ãŒã·ã§ã³ã®æ€çŽ¢ãä¿é²ããããšã§ãã
äžæ¯ãšã¯äœã§ããïŒ
çŸä»£ã®éçºã§ã¯ã äŸåé¢ä¿ã¯ããã°ã©ã ããåŒã³åºãããè¿œå ã®ã³ãŒãã§ãã äŸåé¢ä¿ãè¿œå ããããšã§ãç¹å®ã®ã³ãŒãåäœã®èšèšãäœæããã¹ãããããã°ããµããŒããªã©ããã§ã«è¡ãããŠããäœæ¥ã®ç¹°ãè¿ããåé¿ã§ããŸãã äžéšã®ã·ã¹ãã ã§ã¯ãããã±ãŒãžã®ä»£ããã«ã©ã€ãã©ãªãã¢ãžã¥ãŒã«ãªã©ã®ä»ã®çšèªã䜿çšãããŸããããã®ã³ãŒããŠããããããã±ãŒãžãšåŒã³ãŸãã
å€éšäŸåé¢ä¿ãåãå ¥ããããšã¯å€ãç¿æ £ã§ããã»ãšãã©ã®ããã°ã©ããŒã¯ãCã®PCREãŸãã¯zlibãC ++ã®BoostãŸãã¯QtãJavaã®JodaTimeãŸãã¯Junitãªã©ãå¿ èŠãªã©ã€ãã©ãªãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸããã ãããã®ããã±ãŒãžã«ã¯ãäœæã«ããªãã®çµéšãå¿ èŠãªé«å質ã®ãããã°ãããã³ãŒããå«ãŸããŠããŸãã ããã°ã©ã ããã®ãããªããã±ãŒãžã®æ©èœãå¿ èŠãšããå Žåããã®æ©èœããŒãããéçºããããããããã±ãŒãžãæåã§ããŠã³ããŒããã€ã³ã¹ããŒã«ãããã³æŽæ°ããæ¹ãã¯ããã«ç°¡åã§ãã ãããã倧ããªåæè²»çšã¯ãæåã§ã®åå©çšãé«äŸ¡ã§ããããšãæå³ããŸããå°ããªããã±ãŒãžã¯èªåã§æžãã®ãç°¡åã§ãã
äŸåé¢ä¿ãããŒãžã£ãŒ ïŒããã±ãŒãžãããŒãžã£ãŒãšãåŒã°ããŸãïŒã¯ãäŸåé¢ä¿ããã±ãŒãžã®ããŠã³ããŒããšã€ã³ã¹ããŒã«ãèªååããŸãã äŸåé¢ä¿ãããŒãžã£ãŒã䜿çšãããšãåã ã®ããã±ãŒãžãç°¡åã«ããŠã³ããŒãããã³ã€ã³ã¹ããŒã«ã§ãããããåºå®ã³ã¹ããåæžããããšã§ãå°ããªããã±ãŒãžã®çºè¡ãšåå©çšãçµæžçã«ãªããŸãã
ããšãã°ãNPMãšåŒã°ããNode.jsäŸåé¢ä¿ãããŒãžã£ãŒã¯ã750,000ãè¶ ããããã±ãŒãžãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã ãã®1ã€ã§ãã
escape-string-regexp
ã«ã¯ãå ¥åããŒã¿ããæ£èŠè¡šçŸæŒç®åããšã¹ã±ãŒãããåäžã®é¢æ°ãå«ãŸããŠããŸãã ãã¹ãŠã®å®è£ ïŒ
var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; module.exports = function (str) { if (typeof str !== 'string') { throw new TypeError('Expected a string'); } return str.replace(matchOperatorsRe, '\\$&'); };
äŸåé¢ä¿ãããŒãžã£ãŒãç»å Žããåã¯ã8è¡ã®ã©ã€ãã©ãªãå ¬éããããšã¯æ³åã§ããŸããã§ããããªãŒããŒããããå€ãããŠãå©çãå°ãªãããŸãã ããããNPMã¯ãªãŒããŒããããã»ãŒãŒãã«åæžãããã®çµæãã»ãšãã©äºçŽ°ãªæ©èœãããã±ãŒãžåããŠåå©çšããããšãã§ããŸããã 2019幎1ææ«ã«ã
escape-string-regexp
äŸåé¢ä¿ã¯ãéçºè ãèªåã§äœ¿çšããããã«äœæãããããªãã¯ãã¡ã€ã³ã§å ¬éããªããã¹ãŠã®ããã±ãŒãžã¯èšããŸã§ããªããä»ã®ã»ãŒ1000åã®NPMããã±ãŒãžã«çµã¿èŸŒãŸããŸããã
çŸåšãã»ãšãã©ãã¹ãŠã®ããã°ã©ãã³ã°èšèªã«äŸåé¢ä¿ãããŒãžã£ãŒãç»å ŽããŠããŸãã Maven CentralïŒJavaïŒãNugetïŒ.NETïŒãPackagistïŒPHPïŒãPyPIïŒPythonïŒãRubyGemsïŒRubyïŒ-ããããã«100,000ãè¶ ããããã±ãŒãžããããŸãã ãã®ãããªå°ããªããã±ãŒãžã®åºç¯å²ã«ãããåå©çšã®åºçŸã¯ãéå»20幎ã«ããããœãããŠã§ã¢éçºã®æ倧ã®å€åã®1ã€ã§ãã ãããŠããã£ãšæ³šæãæ ããšãæ·±å»ãªåé¡ã«ã€ãªãããŸãã
äœãããããã®ã§ããããïŒ
ãã®è°è«ã®æèã§ã¯ãããã±ãŒãžã¯ã€ã³ã¿ãŒãããããããŠã³ããŒããããã³ãŒãã§ãã äŸåé¢ä¿ãè¿œå ãããšããã®ã³ãŒãã®éçºäœæ¥ïŒèšèšãäœæããã¹ãããããã°ãããã³ãµããŒãïŒããéåžžã¯ç¥ããªãã€ã³ã¿ãŒãããäžã®ä»ã®èª°ãã«å§ããããŸãã ãã®ã³ãŒãã䜿çšããŠãç¬èªã®ããã°ã©ã ãäŸåé¢ä¿ã®ãã¹ãŠã®ã¯ã©ãã·ã¥ãšæ¬ ç¹ã®åœ±é¿ã«ããããŸãã ãœãããŠã§ã¢ã®å®è¡ã¯ãæåéãã€ã³ã¿ãŒãããããã®èŠç¥ãã¬äººã®ã³ãŒãã«äŸåããŠããŸãã ãã®ããã«èšãã°ããã¹ãŠéåžžã«å®å šã§ã¯ãªãããã«æããŸãã ãªã誰ããããã«åæããã®ã§ããããïŒ
ç§ãã¡ã¯åæããŸããããã¯ç°¡åã§ããã¹ãŠãããŸãããããã«èŠããããã§ããä»ã®èª°ãããããããããã§ãããããŠæãéèŠãªããšã¯ããããäœäžçŽãæãã確ç«ãããæ £è¡ã®èªç¶ãªç¶ç¶ã ããã§ã ããããç¡èŠããéèŠãªéãããããŸãã
äœå幎ãåãã»ãšãã©ã®éçºè ã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãã³ã³ãã€ã©ãªã©ãäŸåããŠããããã°ã©ã ãäœæããä»ã®éçºè ãä¿¡é ŒããŠããŸããã ãã®ãœãããŠã§ã¢ã¯ãããç¥ãããŠãããœãŒã¹ããè³Œå ¥ãããŸããããå€ãã®å Žåãäœããã®ãµããŒãå¥çŽããããŸãã ãšã©ãŒãå®å šãªç Žå£ã®äœå°ã¯ãŸã ãããŸãã ããããç§ãã¡ã¯å°ãªããšã誰ãšååŒããŠããããç¥ã£ãŠãããååãšããŠã圱é¿åã®åæ¥çãŸãã¯æ³çæ段ã䜿çšããããšãã§ããŸãã
ã€ã³ã¿ãŒããããä»ããŠç¡æã§é åžããããªãŒãã³ãœãŒã¹ãœãããŠã§ã¢ã®çŸè±¡ã¯ããœãããŠã§ã¢ãè³Œå ¥ãããšããåŸæ¥ã®æ £ç¿ã«å€§ããåã£ãŠä»£ãããŸããã åå©çšãäŸç¶ãšããŠå°é£ã§ãã£ããšãããã®ãããªäŸåé¢ä¿ãå°å ¥ãããããžã§ã¯ãã¯ã»ãšãã©ãããŸããã§ããã 圌ãã®ã©ã€ã»ã³ã¹ã¯éåžžããç¹å®ã®ç®çã«å¯Ÿããåæ¥ç䟡å€ãšé©åæ§ã®ä¿èšŒããæŸæ£ããŠããŸãããããããžã§ã¯ãã¯è¯ãè©å€ãç¯ããŸããã ãŠãŒã¶ãŒã¯ãææ決å®ãè¡ãéã«ãã®è©å€ã倧éšåèæ ®ããŠããŸãã åæ¥çããã³æ³çä»å ¥ã®ä»£ããã«ãè©å€ã®ãµããŒããæ¥ãŸããã ãã®æ代ã®å€ãã®äžè¬çãªããã±ãŒãžã¯ä»ã§ãé«ãè©äŸ¡ãåŸãŠããŸããããšãã°ãBLASïŒ1979幎ã«å ¬éïŒãNetlibïŒ1987ïŒãlibjpegïŒ1991ïŒãLAPACKïŒ1992ïŒãHP STLïŒ1994ïŒãzlibïŒ1995ïŒãªã©ã§ãã
ããããããŒãžã£ãŒã¯ãã³ãŒãã®åå©çšã¢ãã«ãéåžžã«ã·ã³ãã«ã«åæžããŸãããéçºè ã¯ãæ°åè¡ã®åã ã®é¢æ°ãšæ£ç¢ºã«ã³ãŒããå ±æã§ããããã«ãªããŸããã ããã¯çŽ æŽãããæè¡çææã§ãã å©çšå¯èœãªããã±ãŒãžã¯ç¡æ°ã«ããããããžã§ã¯ãã«ã¯å€æ°ã®ããã±ãŒãžãå«ãŸããå ŽåããããŸãããåæ¥çãæ³çããŸãã¯è©å€ã®ã³ãŒãä¿¡é Œã¡ã«ããºã ã¯éå»ã®ãã®ã§ãã ããå€ãã®ã³ãŒããä¿¡é ŒããŸãããä¿¡é Œã®çç±ã¯ã»ãšãã©ãããŸããã
æªãäžæ¯ã®ã³ã¹ãã¯ãåæªãçµæã®äŸ¡æ Œã«ãã®ç¢ºçïŒãªã¹ã¯ïŒãæããäžé£ã®ãã¹ãŠã®å¯èœãªæªãçµæã®åèšãšèããããšãã§ããŸãã
æªãçµæã®äŸ¡æ Œã¯ãäŸåé¢ä¿ã䜿çšãããã³ã³ããã¹ãã«äŸåããŸãã ã¹ãã¯ãã«ã®äžç«¯ã«ã¯ãã»ãšãã©ã®æªãçµæã®äŸ¡æ ŒããŒãã«è¿ãå人çãªè¶£å³ã®ãããžã§ã¯ãããããŸãããã 楜ããã§ããã ãã§ããã¹ã¯ããå°ãã®æéãé€ããŠæ¬åœã®åœ±é¿ã¯ãããŸããã ãããã£ãŠããªã¹ã¯ã®ç¢ºçã¯ã»ãšãã©ç¡é¢ä¿ã§ãããŒããæããŸãã ã¹ãã¯ãã«ã®ããäžæ¹ã®ç«¯ã«ãã補åãœãããŠã§ã¢ã¯ãäœå¹ŽããµããŒãããå¿ èŠããããŸãã ããã§ã¯ãäŸåé¢ä¿ã®ã³ã¹ããéåžžã«é«ããªãå¯èœæ§ããããŸãããµãŒããŒãèœã¡ãããæ©å¯ããŒã¿ãé瀺ããããã顧客ãèŠããã ããäŒæ¥ãç Žç£ãããããå¯èœæ§ããããŸãã æ¬çªç°å¢ã§ã¯ãé倧ãªé害ã®ãªã¹ã¯ãè©äŸ¡ããŠæå°åããããšãã¯ããã«éèŠã§ãã
äºæ³ãããäŸ¡æ Œã«é¢ä¿ãªããäŸåé¢ä¿ãè¿œå ãããªã¹ã¯ãè©äŸ¡ããŠåæžããããã®ã¢ãããŒããããã€ããããŸãã ããã±ãŒãžãããŒãžã£ãŒã¯ããããã®ãªã¹ã¯ãæžããããã«æé©åããå¿ èŠããããŸããããããŸã§ã®ãšãããããŠã³ããŒããšã€ã³ã¹ããŒã«ã®ã³ã¹ãã®åæžã«æ³šåããŠããŸããã
äŸåæ§ãã§ãã¯
èããããšããªããäœãç¥ããªãéçºè ãéãããšã¯ãªãã§ãããã æåã«ãããªãã¯åœŒã«ã€ããŠäœããåŠã³ãŸãïŒãªã³ã¯ããã§ãã¯ããã€ã³ã¿ãã¥ãŒãè¡ããŸãã ã€ã³ã¿ãŒãããã§èŠã€ããããã±ãŒãžã«äŸåããåã«ããã®ããã±ãŒãžã«ã€ããŠå°ãåŠã¶ããšãè³¢æã§ãã
åºæ¬çãªãã§ãã¯ã«ããããã®ã³ãŒãã䜿çšããããšãããšãã«åé¡ãçºçããå¯èœæ§ãç¥ãããšãã§ããŸãã æ€æ»äžã«è»œåŸ®ãªåé¡ãèŠã€ãã£ãå Žåãããããé€å»ããããã®å¯Ÿçãè¬ããããšãã§ããŸãã ãã§ãã¯ã§é倧ãªåé¡ãæããã«ãªã£ãå Žåã¯ãããã±ãŒãžã䜿çšããªãæ¹ãè¯ãå ŽåããããŸããããé©åãªããã±ãŒãžãèŠã€ããããèªåã§éçºããå¿ èŠããããããããŸããã ãªãŒãã³ãœãŒã¹ããã±ãŒãžã¯ãæçšæ§ãæåŸ ããŠäœæè ã«ãã£ãŠå ¬éãããŠããŸããã䜿ããããããµããŒããä¿èšŒãããã®ã§ã¯ãããŸããã å®çšŒåã§é害ãçºçããå Žåãããããããã°ããã®ã¯ãŠãŒã¶ãŒæ¬¡ç¬¬ã§ãã æåã®GNU General Public LicenseãèŠåããããã«ããããã°ã©ã ã®å質ãšããã©ãŒãã³ã¹ã«é¢é£ãããã¹ãŠã®ãªã¹ã¯ã¯ããªãã«ãããŸãã ããã°ã©ã ã«æ¬ é¥ãããããšãå€æããå Žåããã¹ãŠã®å¿ èŠãªä¿å®ãä¿®çããŸãã¯ä¿®æ£ã®è²»çšãè² æ ããŸãã
次ã«ãããã±ãŒãžããã§ãã¯ããããã±ãŒãžã«äŸåãããã©ããã決å®ããããã®èæ ®äºé ã®æŠèŠã説æããŸãã
èšèš
ããã±ãŒãžã®ããã¥ã¡ã³ãã¯æ確ã§ããïŒ APIã«ã¯æ確ãªèšèšããããŸããïŒ èè ãAPIãšãã¶ã€ã³ã人ã«ããŸã説æã§ããã°ããœãŒã¹ã³ãŒãã§å®è£ ãã³ã³ãã¥ãŒã¿ã«ããŸã説æã§ããå¯èœæ§ãé«ããªããŸãã æ確ã§é©åã«èšèšãããAPIã®ã³ãŒããèšè¿°ããæ¹ãç°¡åã§ãé«éã§ããããããšã©ãŒãçºçãã«ããã§ãããã äœæè ã¯ãå°æ¥ã®æŽæ°ãšäºææ§ããããšã¯ã©ã€ã¢ã³ãã³ãŒãã«æåŸ ãããã®ãææžåããŸãããïŒ ïŒäŸã«ã¯C ++ããã³Goäºææ§ããã¥ã¡ã³ããå«ãŸããŸãïŒã
ã³ãŒãå質
ã³ãŒãã¯ããŸãæžãããŠããŸããïŒ ããã€ãã®ã¹ãããããèªãã§ãã ããã èè ã¯çšå¿æ·±ããèª å®ã§ãäžè²«ããŠããããã«èŠããŸããïŒ ãããã°ãããã³ãŒãã®ããã«èŠããŸããïŒ ãããå¿ èŠã«ãªãå ŽåããããŸãã
ã³ãŒãå質ã確èªããããã®ç¬èªã®äœç³»çãªæ¹æ³ãéçºããŸãã éèŠãªã³ã³ãã€ã©èŠåããªã³ã«ããŠCãŸãã¯C ++ã§ã³ã³ãã€ã«ããïŒããšãã°
-Wall
ïŒãªã©ãåçŽãªãã®ã¯ãéçºè ãããŸããŸãªæªå®çŸ©ã®åäœãåé¿ããããã«ã©ãã ãçå£ã«åãçµãã ããç¥ãããšãã§ããŸãã GoãRustãSwiftãªã©ã®æè¿ã®èšèªã§ã¯ã
unsafe
ããŒã¯ãŒãã䜿çšããŠãåã·ã¹ãã ã«éåããã³ãŒãã瀺ããŠããŸãã å®å šã§ãªãã³ãŒãã®éã確èªããŠãã ããã InferãSpotBugsãªã©ã®ããé«åºŠãªã»ãã³ãã£ãã¯ããŒã«ã圹ç«ã¡ãŸãã ãªã³ã¿ãŒã¯ããŸãæçšã§ã¯ãããŸãããæ¬åŒ§ã¹ã¿ã€ã«ãªã©ã®ãããã¯ã«é¢ããæšæºçãªã¢ããã€ã¹ãç¡èŠããã»ãã³ãã£ãã¯ã®åé¡ã«çŠç¹ãåãããå¿ èŠããããŸãã
ããªããæ £ããŠããªããããããªãéçºæ¹æ³ãå¿ããªãã§ãã ããã ããšãã°ãSQLiteã©ã€ãã©ãªã¯ã200,000åã®ã³ãŒããš11,000è¡ã®ããããŒãæã€åäžã®ãã¡ã€ã«ãšããŠæäŸãããŸã-è€æ°ã®ãã¡ã€ã«ãããŒãžããçµæã§ãã ãããã®ãã¡ã€ã«ã®ãµã€ãºã¯ããã«èµ€åã«ãªããŸããããã培åºçãªèª¿æ»ã«ãããéçºã®å®éã®ãœãŒã¹ã³ãŒãã«ã€ãªãããŸãã100ãè¶ ãããœãŒã¹Cãã¡ã€ã«ããã¹ããããã³ãµããŒãã¹ã¯ãªãããå«ãåŸæ¥ã®ãã¡ã€ã«ããªãŒã§ãã åäžãã¡ã€ã«ã®é åžã¯ãå ã®ãœãŒã¹ããèªåçã«æ§ç¯ãããããšãããããŸãããããã¯ããšã³ããŠãŒã¶ãŒãç¹ã«äŸåé¢ä¿ãããŒãžã£ãŒãæããªããŠãŒã¶ãŒã«ãšã£ãŠç°¡åã§ãã ïŒã³ã³ãã€ã©ã¯ããå€ãã®æé©åãªãã·ã§ã³ãèªèãããããã³ã³ãã€ã«ãããã³ãŒããé«éã«åäœããŸãïŒã
ãã¹ãäž
ã³ãŒãã«ãã¹ãã¯ãããŸããïŒ ããããå¶åŸ¡ã§ããŸããïŒ åœŒãã¯éããŸããïŒ ãã¹ãã¯ãã³ãŒãã®äž»ãªæ©èœãæ£ããããšã確ç«ããéçºè ãçå£ã«ãããç¶æããããšããŠããããšã瀺ããŸãã ããšãã°ãSQLiteéçºããªãŒã«ã¯ã30,000ãè¶ ããåå¥ã®ãã¹ãã±ãŒã¹ãæã€éåžžã«è©³çŽ°ãªãã¹ãã¹ã€ãŒããå«ãŸããŠããŸãã ãã¹ãæŠç¥ã説æããéçºè åãã®ããã¥ã¡ã³ãããããŸã ã äžæ¹ããã¹ããã»ãšãã©ãŸãã¯ãŸã£ãããªãå ŽåããŸãã¯ãã¹ãã倱æããå Žåãããã¯é倧ãªå±éºãã©ã°ã§ããããã±ãŒãžã®å°æ¥ã®å€æŽã¯ã容æã«æ€åºã§ãããªã°ã¬ãã·ã§ã³ã«ã€ãªããå¯èœæ§ããããŸãã ã³ãŒãå ã®ãã¹ããèŠæ±ããå ŽåïŒå³ïŒïŒãä»ã®äººã«æž¡ãã³ãŒãã®ãã¹ããæäŸããå¿ èŠããããŸãã
ãã¹ããååšãå®è¡ãããã³åæ Œãããšä»®å®ãããšãããŒã«ãå®è¡ããŠã³ãŒãã«ãã¬ããžãåæãã 競åç¶æ ãæ€åºããã¡ã¢ãªå²ãåœãŠã確èªããã¡ã¢ãªãªãŒã¯ãæ€åºããããšã«ãããè¿œå æ å ±ãåéã§ããŸãã
ãããã°
ãã®ããã±ãŒãžã®ãã°ãã©ãã«ãŒãèŠã€ããŸãã å€ãã®ãªãŒãã³ãšã©ãŒã¡ãã»ãŒãžããããŸããïŒ åœŒãã¯ã©ã®ãããéããŠããŸããïŒ ä¿®æ£ããããã°ã®æ° æè¿ä¿®æ£ããããã°ã¯ãããŸããïŒ å®éã®ãã°ãç¹ã«é·æéã¯ããŒãºãããŠããªããã°ã«ã€ããŠå€ãã®æªè§£æ±ºã®è³ªåãããå Žåãããã¯æªãå åã§ãã äžæ¹ããšã©ãŒããŸãã§ããã«ä¿®æ£ãããå Žåãããã¯çŽ æŽãããããšã§ãã
ãµããŒã
ã³ãããã®å±¥æŽãèŠãŠãã ããã ã³ãŒãã¯ã©ã®ãããã¢ã¯ãã£ãã«ç¶æãããŠããŸããïŒ çŸåšç©æ¥µçã«ãµããŒããããŠããŸããïŒ é·æéã«ããã£ãŠç©æ¥µçã«ãµããŒããããŠããããã±ãŒãžã¯ãåŒãç¶ããµããŒããããå¯èœæ§ããããŸãã ããã±ãŒãžã§äœæ¥ããŠãã人ã¯äœäººã§ããïŒ å€ãã®ããã±ãŒãžã¯ãéçºè ãèªç±æéã«åš¯æ¥œã®ããã«äœæããå人ãããžã§ã¯ãã§ãã ãã®ä»ã¯ãæåã®éçºè ã°ã«ãŒããäœåæéãäœæ¥ããçµæã§ãã äžè¬ã«ã2çªç®ã®ã¿ã€ãã®ããã±ãŒãžã¯ãéåžžããšã©ãŒãããè¿ éã«ä¿®æ£ããæ°æ©èœãçå®ã«å°å ¥ããäžè¬çã«ã¯ããé©åã«ãµããŒããããŸãã
äžæ¹ãäžéšã®ã³ãŒãã¯æ¬åœã«ãå®ç§ãã§ãã ããšãã°ãNPMã®
escape-string-regexp
ãå床å€æŽããå¿ èŠã¯ãããŸããã
䜿çšãã
ãã®ã³ãŒãã«äŸåããããã±ãŒãžã®æ°ã¯ïŒ å€ãã®å Žåãããã±ãŒãžãããŒãžã£ãŒã¯ãã®ãããªçµ±èšæ å ±ãæäŸããŸãããŸãã¯ãä»ã®éçºè ããã®ããã±ãŒãžã«ã€ããŠèšåããŠããé »åºŠãã€ã³ã¿ãŒãããã§ç¢ºèªã§ããŸãã ãŠãŒã¶ãŒæ°ãå€ããšããããšã¯ãå°ãªããšãå€ãã®ã³ãŒãã§éåžžã«ããŸãæ©èœãããšããäºå®ãæå³ãããã®ãšã©ãŒã¯ããè¿ éã«èªèãããŸãã åºç¯ãªäœ¿çšã¯ãç¶ç¶çãªãµãŒãã¹ã®éšåçãªä¿èšŒã§ããããŸããåºã䜿çšãããŠããããã±ãŒãžãã¡ã³ãããŒã倱ã£ãå Žåãé¢å¿ã®ãããŠãŒã¶ãŒããã®åœ¹å²ãåŒãåããå¯èœæ§ãéåžžã«é«ããªããŸãã
ããšãã°ãPCREãBoostãJUnitãªã©ã®ã©ã€ãã©ãªã¯éåžžã«åºã䜿çšãããŠããŸãã ããã«ãããçºçããå¯èœæ§ã®ãããšã©ãŒã確å®ã«ä¿èšŒãããããã§ã¯ãããŸããããçºçããå¯èœæ§ã®ãããšã©ãŒã¯ãä»ã®ãŠãŒã¶ãŒãåã«çºçããããã«æ¢ã«ä¿®æ£ãããŠããå¯èœæ§ãé«ããªããŸãã
å®å šæ§
ãã®ããã±ãŒãžã¯å®å šã§ãªãå ¥åã§ãåäœããŸããïŒ ããå Žåãæªæã®ããããŒã¿ã«å¯Ÿããèæ§ã¯ã©ã®çšåºŠã§ããïŒ åœŒã¯ã National Vulnerability DatabaseïŒNVDïŒã§èšåãããŠãããã°ãæã£ãŠããŸããïŒ
ããšãã°ã2006幎ã«Jeff Deanãšç§ãGoogle Code Search ïŒå ¬éã³ãŒãããŒã¹ã®
grep
ïŒã«åãçµã¿å§ãããšãã人æ°ã®ããæ£èŠè¡šçŸã©ã€ãã©ãªPCREãæçœãªéžæè¢ã§ããããã«æãããŸããã ãã ããGoogleã»ãã¥ãªãã£ããŒã ãšã®äŒè©±ã®äžã§ãPCREã«ã¯ç¹ã«ããŒãµãŒã§ã®ãããã¡ãªãŒããŒãããŒãªã©ã®åé¡ã®é·ãæŽå²ãããããšãããããŸããã ç§ãã¡èªèº«ã¯ãNVDã§PCREãæ¢ãããšã§ããã確信ããŸããã ãã®çºèŠã¯ããã«PCREãæŸæ£ããããã«ã¯ãªããŸããã§ãããããã¹ããšåé¢ã«ã€ããŠããæ éã«èããããã«ãªããŸããã
å èš±
ã³ãŒãã¯æ£ããã©ã€ã»ã³ã¹ãããŠããŸããïŒ åœŒã¯ã©ã€ã»ã³ã¹ããæã£ãŠããŸããïŒ ã©ã€ã»ã³ã¹ã¯ãããžã§ã¯ããŸãã¯äŒç€Ÿã§åãå ¥ããããŸããïŒ GitHubãããžã§ã¯ãã®é©ãã¹ãéšåã«ã¯æ確ãªã©ã€ã»ã³ã¹ããããŸããã ãããžã§ã¯ããŸãã¯äŒç€Ÿã¯ãäŸåã©ã€ã»ã³ã¹ã«è¿œå ã®å¶éãèšããå ŽåããããŸãã ããšãã°ãGoogleã¯AGPLïŒå³ããããïŒãWTFPLïŒææ§ãããïŒãªã©ã®ã©ã€ã»ã³ã¹ã®äžã§ã®ã³ãŒãã®äœ¿çšãçŠæ¢ããŠããŸãã
äŸåé¢ä¿
ãã®ããã±ãŒãžã«ã¯ç¬èªã®äŸåé¢ä¿ããããŸããïŒ éæ¥çãªäŸåé¢ä¿ã®æ¬ é¥ã¯ãçŽæ¥çãªäŸåé¢ä¿ã®æ¬ ç¹ãšåããããæ害ã§ãã ããã±ãŒãžãããŒãžã£ãŒã¯ãç¹å®ã®ããã±ãŒãžã®ãã¹ãŠã®æšç§»çãªäŸåé¢ä¿ãäžèŠ§è¡šç€ºã§ããŸãããŸããçæ³çã«ã¯ããã®ã»ã¯ã·ã§ã³ã§èª¬æããããã«ããããããã§ãã¯ããå¿ èŠããããŸãã å€ãã®äŸåé¢ä¿ãæã€ããã±ãŒãžã«ã¯ãå€ãã®äœæ¥ãå¿ èŠã«ãªããŸãã
å€ãã®éçºè ã¯ãã³ãŒãã®æšç§»çãªäŸåé¢ä¿ã®å®å šãªãªã¹ããèŠãããšããªããããäŸåé¢ä¿ãããããŸããã ããšãã°ã2016幎3æãNPMãŠãŒã¶ãŒã³ãã¥ããã£ã¯ãBabelãEmberãReactãå«ãå€ãã®äººæ°ãããžã§ã¯ããã8è¡é¢æ°ã®
left-pad
ãšåŒã°ããå°ããªããã±ãŒãžã«éæ¥çã«äŸåããŠããããšãçºèŠããŸããã 圌ãã¯ã
left-pad
äœè ãNPMããããã±ãŒãžãåé€ããNode.jsãŠãŒã¶ãŒã®ã»ãšãã©ã®ã¢ã»ã³ããªãäžæ³šæã«ç Žå£ãããšãã«ããããçºèŠããŸããã ãããŠããã®ç¹ã§
left-pad
ã»ãšãã©äŸå€çã§
left-pad
ãŸããã ããšãã°ãNPMã®750,000ãã±ããã®30ïŒ ã¯ãå°ãªããšãéæ¥çã«ã¯
escape-string-regexp
äŸåããŠããŸãã ããã±ãŒãžãããŒãžã£ãŒã¯ãã¬ã¹ãªãŒã©ã³ããŒãã®åæ£ã·ã¹ãã ã®èŠ³å¯ã«åãããŠãããªãã®ç¥ããªãååšã§ãããã±ãŒãžé害ãçºçãããšãç¬èªã®ã³ãŒãã䜿çšã§ããªããªãç¶æ³ãç°¡åã«äœæããŸãã
äžæ¯ãã¹ã
æ€èšŒããã»ã¹ã«ã¯ãç¬èªã®ããã±ãŒãžãã¹ãã®å®è¡ãå«ããå¿ èŠããããŸãã ããã±ãŒãžããã¹ãã«åæ Œãããããžã§ã¯ããããã«äŸåãããããšã«ããå Žåã次ã®ã¹ãããã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ©èœã«ç¹åããæ°ãããã¹ããäœæããããšã§ãã å€ãã®å Žåããããã®ãã¹ãã¯çãã¹ã¿ã³ãã¢ãã³ãââãã°ã©ã ãšããŠéå§ãããããã±ãŒãžAPIãç解ã§ããããšãããã³ããã±ãŒãžAPIãæå³ãããšããã«åäœããããšã確èªããŸãïŒç解ã§ããªãå ŽåããŸãã¯å¿ èŠãªããšãå®è¡ã§ããªãå Žåã¯ãããã«åæ¢ããŠãã ããïŒ ãã®åŸããããã®ããã°ã©ã ããããã±ãŒãžã®æ°ããããŒãžã§ã³ã§å®è¡ãããèªååããããã¹ãã«å€æããã®ã«äœåãªåªåããã䟡å€ããããŸãã ééããèŠã€ããŠæœåšçãªä¿®æ£ãããå Žåã¯ãç¹å®ã®ãããžã§ã¯ãã®ãããã®ãã¹ããç°¡åã«åèµ·åããä¿®æ£ãä»ã®äœããå£ããªãããšã確èªã§ããŸãã
ããŒã¹ã©ã€ã³ã¬ãã¥ãŒäžã«ç¹å®ãããåé¡é åã«ã¯ãç¹ã«æ³šæãæãå¿ èŠããããŸãã ã³ãŒãæ€çŽ¢ã®å Žåãéå»ã®çµéšãããç¹å®ã®æ£èŠè¡šçŸã®å®è¡ã«PCREãæéããããããšãããããšãããã£ãŠããŸããã æåã®èšç»ã¯ããåçŽãªãæ£èŠè¡šçŸãšãè€éãªãæ£èŠè¡šçŸçšã«å¥ã ã®ã¹ã¬ããããŒã«ãäœæããããšã§ããã æåã®ãã¹ãã®1ã€ã¯ã
pcregrep
ãä»ã®ããã€ãã®
grep
å®è£ ãšæ¯èŒãããã³ãããŒã¯ã§ããã
pcregrep
ã1ã€ã®åºæ¬çãªãã¹ãã±ãŒã¹ã®æé
grep
ããã70åé ãããšãããã£ããšããPCREã®äœ¿çšèšç»ãåèãå§ããŸããã æçµçã«PCREãå®å šã«æŸæ£ãããšããäºå®ã«ããããããããã®ãã¹ãã¯ä»æ¥ãã³ãŒãããŒã¹ã«æ®ã£ãŠããŸãã
äŸåé¢ä¿ã®æœè±¡å
ããã±ãŒãžã®äŸåé¢ä¿ã¯ãå°æ¥ãªããã¢ãŠãã§ãããœãªã¥ãŒã·ã§ã³ã§ãã ããããæŽæ°ã«ãããããã±ãŒãžã¯æ°ããæ¹åã«é²ãã§ãããã é倧ãªã»ãã¥ãªãã£åé¡ãèŠã€ããå ŽåããããŸãã ããããæè¯ã®ãªãã·ã§ã³ã衚瀺ãããŸãã ããããã¹ãŠã®çç±ããããããžã§ã¯ãã®æ°ããäŸåé¢ä¿ãžã®ç§»è¡ãç°¡çŽ åãã䟡å€ã¯ãããŸãã
ãããžã§ã¯ããœãŒã¹ã³ãŒãã®å€ãã®å Žæããããã±ãŒãžãåŒã³åºãããå Žåãããããã¹ãŠã®ç°ãªãå Žæãå€æŽããŠãæ°ããäŸåé¢ä¿ã«åãæ¿ããå¿ èŠããããŸããããã«æªãããšã«ãããã±ãŒãžãç¬èªã®ãããžã§ã¯ãã®APIã§æ瀺ãããŠããå Žåãæ°ããäŸåé¢ä¿ã«ç§»è¡ããã«ã¯ãAPIãåŒã³åºããã¹ãŠã®ã³ãŒããå€æŽããå¿ èŠããããããã¯ãã§ã«å¶åŸ¡ã§ããªãå¯èœæ§ããããŸãããã®ãããªã³ã¹ããåé¿ããã«ã¯ãäŸåé¢ä¿ã䜿çšããŠãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã·ã³ã©ãããŒãšå ±ã«ç¬èªã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ããã®ãçã«ããªã£ãŠããŸããã©ãããŒã«ã¯ãäŸåé¢ä¿ãæäŸãããã®ãã¹ãŠã§ã¯ãªãããããžã§ã¯ããäŸåé¢ä¿ããèŠæ±ãããã®ã®ã¿ãå«ããå¿ èŠãããããšã«æ³šæããŠãã ãããçæ³çã«ã¯ãããã«ãããåŸã§é©åãªå¥ã®äŸåé¢ä¿ã眮ãæããã©ãããŒã®ã¿ãå€æŽã§ããããã«ãªããŸããæ°ããã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããããã«åãããžã§ã¯ãã®ãã¹ãã移è¡ãããšãã€ã³ã¿ãŒãã§ã€ã¹ãšã©ãããŒã®å®è£ ããã§ãã¯ãããäŸåé¢ä¿ã®æœåšçãªçœ®æã®ãã¹ããç°¡çŽ åãããŸãã
ã³ãŒãæ€çŽ¢çšã«ã
Regexp
æ£èŠè¡šçŸãšã³ãžã³ã«å¿ èŠãªã³ãŒãæ€çŽ¢ã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ããæœè±¡ã¯ã©ã¹ãéçºããŸããã次ã«ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããPCREã®åšãã«èãã©ãããŒãäœæããŸããããã®æ¹æ³ã«ããã代æ¿ã©ã€ãã©ãªã®ãã¹ãã容æã«ãªããPCREã®å éšã³ã³ããŒãã³ãã®ç¥èããœãŒã¹ããªãŒã®æ®ãã«å¶çºçã«æ³šå ¥ãããã®ãé²ããŸãããããã«ãããå¿ èŠã«å¿ããŠå¥ã®äŸåé¢ä¿ã«ç°¡åã«åãæ¿ããããšãã§ããŸãã
äŸåé¢ä¿ã®åé¢
ãŸãããšã©ãŒã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ã®ããæ害ãå¶éããããã«ãå®è¡æã«äŸåé¢ä¿ãåé¢ããããšãé©åã§ããããšãã°ãGoogle Chromeã䜿çšãããšããŠãŒã¶ãŒã¯ãã©ãŠã¶ã«äŸåé¢ä¿ïŒæ¡åŒµã³ãŒãïŒãè¿œå ã§ããŸãã Chromeã2008幎ã«åããŠèµ·åãããšãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®åå¥ã®ããã»ã¹ã§å®è¡ãããŠãããµã³ãããã¯ã¹å ã®åæ¡åŒµæ©èœãåé¢ããããã®éèŠãªæ©èœïŒçŸåšã¯ãã¹ãŠã®ãã©ãŠã¶ãŒã§æšæºïŒãå°å ¥ãããŸãããäžå®å šã«èšè¿°ãããæ¡åŒµæ©èœã®æœåšçãªæªçšã¯ããã©ãŠã¶èªäœã®ã¡ã¢ãªå šäœãžã®èªåã¢ã¯ã»ã¹ãæã£ãŠããŸããã§ããäžé©åãªã·ã¹ãã ã³ãŒã«ãè¡ãããšã¯ã§ããŸããã§ãããã³ãŒãæ€çŽ¢ã§ã¯ãPCREãå®å šã«åé€ãããŸã§ãå°ãªããšãåããããªãµã³ãããã¯ã¹ã§PCREããŒãµãŒãåé¢ããèšç»ã§ãããçŸåšãå¥ã®ãªãã·ã§ã³ã¯gVisorãªã©ã®è»œéã®ãã€ããŒãã€ã¶ãŒããŒã¹ã®ãµã³ãããã¯ã¹ã§ããäŸåé¢ä¿ã®åé¢ã«ããããã®ã³ãŒãã®å®è¡ã«é¢é£ãããªã¹ã¯ã軜æžãããŸãã
ãããã®äŸãä»ã®æ¢è£œã®ãªãã·ã§ã³ã䜿çšããŠããå®è¡æã«çãããã³ãŒããåé¢ããããšã¯äŸç¶ãšããŠè€éãããŠããã£ãã«å®è¡ãããŸãããçã®åé¢ã«ã¯ãåæå®ãããŠããªãã³ãŒãã«ã¯ã©ãã·ã¥ããããšãªããå®å šã«ã¡ã¢ãªã»ãŒããªèšèªãå¿ èŠã§ãããããã¯ãCãC ++ãªã©ã®å®å šã«å®å šã§ãªãèšèªã ãã§ãªããJNIããªã³ã«ãªã£ãŠãããšãã®Javaããå®å šã§ãªãæ©èœããªã³ã«ãããšãã®GoãRustãSwiftãªã©ã®å¶éãããå®å šã§ãªãæäœãæäŸããèšèªã§ãè€éã§ãã JavaScriptã®ãããªã¡ã¢ãªã»ãŒããªèšèªã§ãã£ãŠããã³ãŒãã¯å¿ èŠä»¥äžã«ã¢ã¯ã»ã¹ã§ããããšããããããŸãã 2018幎11æã«ãææ°ããŒãžã§ã³ã®npmããã±ãŒãž
event-stream
ïŒJavaScriptã€ãã³ãçšã®æ©èœçãªã¹ããªãŒãã³ã°APIïŒã«æ··ä¹±ãæãæªæã®ããã³ãŒããå«ãŸããŠããããšãå€æããŸãã2ãæååã«è¿œå ãããŸãããã³ãŒãã¯Copayã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒãããããã³ã€ã³ãŠã©ã¬ãããåéããã€ãã³ããããŒã®åŠçãšã¯ãŸã£ããé¢ä¿ã®ãªãã·ã¹ãã ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãååŸããŸããããããã®çš®é¡ã®åé¡ããä¿è·ããå€ãã®å¯èœãªæ¹æ³ã®1ã€ã¯ãããè¯ãäŸåé¢ä¿ã®åé¢ã§ãã
äžæ¯ã®æŸæ£
äžæ¯ãããŸãã«å±éºã§ãããšæããããããåé¢ã§ããªãå Žåãæè¯ã®éžæè¢ã¯ãããå®å šã«æŸæ£ããããå°ãªããšãæãåé¡ã®ããéšåãé€å€ããããšã§ãã
ããšãã°ãPCREã®ãªã¹ã¯ãããããç解ãããšãGoogle Code Searchã®èšç»ã¯ãPCREã©ã€ãã©ãªãçŽæ¥äœ¿çšããããããPCREã䜿çšããããããŒãµãŒããµã³ãããã¯ã¹ã«å ¥ãããããæ°ããæ£èŠè¡šçŸããŒãµãŒãäœæããããPCREãšã³ãžã³ãä¿åãããã«å€æŽããã次ã«ããæ°ããããŒãµãŒãèšè¿°ãããããå¥ã®ããå¹ççãªãªãŒãã³ãœãŒã¹ãšã³ãžã³ã«æ¥ç¶ããŸãããåŸã«ãJeff Deanãšç§ããšã³ãžã³ãæžãçŽããã®ã§ãäŸåé¢ä¿ã¯æ®ã£ãŠããŸããã§ãããçµæã¯RE2ã§ããã
äŸåé¢ä¿ã®ããäžéšããå¿ èŠãªãå Žåãæãç°¡åãªæ¹æ³ã¯ãå¿ èŠãªãã®ã®ã³ããŒãäœæããããšã§ãïŒãã¡ãããé¢é£ããèäœæš©ããã³ãã®ä»ã®æ³çéç¥ãä¿æããããšã§ãïŒããšã©ãŒä¿®æ£ãã¡ã³ããã³ã¹ãªã©ã®è²¬ä»»ãè² ããŸããããã倧ããªãªã¹ã¯ããå®å šã«éé¢ãããŸããGoéçºè ã³ãã¥ããã£ã«ã¯ããã¡ãã£ãšããã³ããŒã¯ãã¡ãã£ãšããäŸåé¢ä¿ãããåªããŠããããšããæ ŒèšããããŸãã
äŸåé¢ä¿ã®æŽæ°
é·ãéããœãããŠã§ã¢ã§äžè¬ã«åãå ¥ããããŠããç¥æµã¯æ¬¡ã®ãšããã§ããããæ©èœããå Žåã¯ãäœã觊ããªãã§ãã ããããæŽæ°ã«ã¯ãæ°ãããšã©ãŒãçºçãããªã¹ã¯ã䌎ããŸããå ±é ¬ãªã-æ°ããæ©èœãå¿ èŠãªãå Žåããªããªã¹ã¯ãåãã®ã§ããïŒãã®ã¢ãããŒãã¯2ã€ã®åŽé¢ãç¡èŠããŸãããŸãã段éçãªã¢ããã°ã¬ãŒãã®ã³ã¹ãããœãããŠã§ã¢ã§ã¯ãã³ãŒããå€æŽããè€éãã¯çŽç·çã«ã¹ã±ãŒãªã³ã°ããŸããã10åã®å°ããªå€æŽã¯ã察å¿ãã1ã€ã®å€§ããªå€æŽãããäœæ¥ãå°ãªãç°¡åã§ãã第äºã«ããã§ã«ä¿®æ£ããããšã©ãŒã®æ€åºã®é£ãããç¹ã«ãæ¢ç¥ã®ãšã©ãŒãç©æ¥µçã«æªçšãããã»ãã¥ãªãã£ã³ã³ããã¹ãã§ã¯ãæŽæ°ãªãã§æ¯æ¥æ»æè ãå€ãã³ãŒãã®ãã°ãå©çšã§ãããªã¹ã¯ãå¢å ããŸãã
ããšãã°ããšã¯ã€ãã¡ãã¯ã¹ã®2017幎ã®ã¹ããŒãªãŒãèããŠã¿ãŸããããå¹¹éšã¯è°äŒã§ã®èšŒèšã§è©³ããè¿°ã¹ãŠããŸãã 3æ7æ¥ãApache Strutsã®æ°ããè匱æ§ãçºèŠãããããããé©çšãããããŒãžã§ã³ããªãªãŒã¹ãããŸããã 3æ8æ¥ãEquifaxã¯ãApache Strutsã®äœ¿çšãæŽæ°ããå¿ èŠããããšããUS-CERTéç¥ãåãåããŸããã Equifaxã¯ããããã3æ9æ¥ãš15æ¥ã«ãœãŒã¹ã³ãŒããšãããã¯ãŒã¯ã®ã¹ãã£ã³ãéå§ããŸãããè匱ãªWebãµãŒããŒãã€ã³ã¿ãŒãããäžã§éãããŠããããšãæ€åºããã¹ãã£ã³ã¯1ã€ã§ã¯ãããŸããã 5æ13æ¥ãæ»æè ã¯ãEquifaxã®å°é家ãèŠã€ããããªãã£ããµãŒããŒãèŠã€ããŸããã圌ãã¯ãApache Strutsã®è匱æ§ã䜿çšããŠEquifaxãããã¯ãŒã¯ããããã³ã°ããä»åŸ2ãæã§1å4800äžäººã«é¢ãã詳现ãªå人æ å ±ããã³è²¡åæ å ±ãçã¿ãŸãããæåŸã«ã7æ29æ¥ã«ãEquifaxã¯ãããã³ã°ã«æ°ã¥ãã9æ4æ¥ã«ãããå ¬è¡šããŸããã 9ææ«ãŸã§ã«ãEquifaxã®CEOãšCIOããã³CSOã¯èŸä»»ããè°äŒã§èª¿æ»ãéå§ãããŸããã
Equifaxã®çµéšã«ãããããã±ãŒãžãããŒãžã£ãŒã¯ãã«ãäžã«äœ¿çšããããŒãžã§ã³ãç¥ã£ãŠããŸãããå®çšŒåç°å¢ã§ã®å±éäžã«ãã®æ å ±ã远跡ããä»ã®ã¡ã«ããºã ãå¿ èŠã§ãã Goèšèªã®å Žåãå±éããã»ã¹ãæŽæ°ãå¿ èŠãšããäŸåé¢ä¿ã«ã€ããŠãã€ããªãã¹ãã£ã³ã§ããããã«ãåãã€ããªã«ãããã§ã¹ããããã§ã¹ããèªåçã«å«ããå®éšãè¡ã£ãŠããŸãããŸããGoã¯å®è¡æã«ãã®æ å ±ãå©çšã§ããããã«ããŸããããã«ããããµãŒããŒã¯æ¢ç¥ã®ãšã©ãŒã®ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããæŽæ°ãå¿ èŠãªå Žåã«ç£èŠã·ã¹ãã ã«åå¥ã«å ±åã§ããŸãã
è¿ éãªæŽæ°ã¯éèŠã§ãããæŽæ°ãšã¯ãããžã§ã¯ãã«æ°ããã³ãŒããè¿œå ããããšãæå³ããŸããã€ãŸããæ°ããããŒãžã§ã³ã«åºã¥ããŠäŸåé¢ä¿ã®äœ¿çšã®ãªã¹ã¯è©äŸ¡ãæŽæ°ããå¿ èŠããããŸããå°ãªããšããçŸåšã®ããŒãžã§ã³ããæŽæ°ãããããŒãžã§ã³ã«å ããããå€æŽã瀺ãéãã確èªããããå°ãªããšããªãªãŒã¹ããŒããèªãã§ãæŽæ°ãããã³ãŒãã§æãå¯èœæ§ã®é«ãåé¡é åãç¹å®ããŸããå€ãã®ã³ãŒããå€æŽããããã®éããç解ããã®ãé£ããå Žåãããããªã¹ã¯è©äŸ¡ã®æŽæ°ã«å«ããããšãã§ããæ å ±ã§ãã
ããã«ããããžã§ã¯ãå°çšã«äœæããããã¹ããåå®è¡ããŠãæŽæ°ãããããã±ãŒãžãå°ãªããšã以åã®ããŒãžã§ã³ãšåããããžã§ã¯ãã«é©ããŠããããšã確èªããå¿ èŠããããŸãããŸããç¬èªã®ããã±ãŒãžãã¹ããåå®è¡ããããšãçã«ããªã£ãŠããŸããããã±ãŒãžã«ç¬èªã®äŸåé¢ä¿ãããå Žåããããžã§ã¯ãæ§æã§ã¯ãããã±ãŒãžã®äœæè ã䜿çšããããŒãžã§ã³ãšã¯ç°ãªãããŒãžã§ã³ïŒããå€ããŸãã¯ããæ°ããïŒã®äŸåé¢ä¿ã䜿çšããå¯èœæ§ããããŸããç¬èªã®ããã±ãŒãžãã¹ããå®è¡ãããšãæ§æã«åºæã®åé¡ããã°ããç¹å®ã§ããŸãã
ç¹°ãè¿ããŸãããæŽæ°ã¯å®å šã«èªåã§ããå¿ èŠã¯ãããŸãããæŽæ°ãããããŒãžã§ã³ãå±éããåã«ãããããç°å¢ã«é©ããŠããããšã確èªããŠãã ããã
ã¢ããã°ã¬ãŒãããã»ã¹ã«ããã§ã«äœæãããçµ±åããã³èªå®ãã¹ãã®åå®è¡ãå«ãŸããå Žåãã»ãšãã©ã®å ŽåãæŽæ°ã®é 延ã¯è¿ éãªæŽæ°ããããªã¹ã¯ãé«ããªããŸãã
éèŠãªã»ãã¥ãªãã£æŽæ°ã®ãŠã£ã³ããŠã¯ç¹ã«å°ãããªããŸããEquifaxããããã³ã°ãããåŸããã©ã¬ã³ãžãã¯ã»ãã¥ãªãã£ããŒã ã¯ãå ¬éãããŠããããã3æ¥åŸã®3æ10æ¥ã«ãæ»æè ïŒããããç°ãªãïŒã圱é¿ãåãããµãŒããŒã®Apache Strutsè匱æ§ãæªçšãã蚌æ ãèŠã€ããŸããããããã圌ãã¯ããã«1ã€ã®ããŒã ã ããç«ã¡äžããŸãã
whoami
ã
ããªãã®äžæ¯ãèŠãŸã
çµå±ã®ãšãããäœæ¥ã¯å®äºããŠããŸãããäŸåé¢ä¿ã®ç£èŠãç¶ç¶ããå Žåã«ãã£ãŠã¯ããããç Žæ£ããããšãéèŠã§ãã
æåã«ãããã±ãŒãžã®ç¹å®ã®ããŒãžã§ã³ãåŒãç¶ã䜿çšããããã«ããŠãã ãããã»ãšãã©ã®ããã±ãŒãžãããŒãžã£ãŒã§ã¯ãç¹å®ã®ããŒãžã§ã³ã®ããã±ãŒãžã«å¿ èŠãªãœãŒã¹ã³ãŒãã®æå·åããã·ã¥ãç°¡åã«ããŸãã¯èªåçã«èšé²ããããã±ãŒãžãå¥ã®ã³ã³ãã¥ãŒã¿ãŒãŸãã¯ãã¹ãç°å¢ã«åããŠã³ããŒããããšãã«ãã®ããã·ã¥ãæ€èšŒã§ããŸããããã«ããããã¹ãããã³ãã¹ããããã®ãšåãäŸåé¢ä¿ãœãŒã¹ã³ãŒãããã«ãã§äœ¿çšãããŸãããã®ãããªãã§ãã¯ã«ãããæ»æè ã¯é²åŸ¡ãããŸãã
event-stream
ãæ¢ã«ãªãªãŒã¹ãããããŒãžã§ã³3.3.5ã«æªæã®ããã³ãŒããèªåçã«æ¿å ¥ããŸãã代ããã«ãæ»æè ã¯æ°ããããŒãžã§ã³3.3.6ãäœæãã人ã ãæŽæ°ããã®ãåŸ ã€å¿ èŠããããŸããïŒå€æŽã泚ææ·±ãèŠãªãã§ïŒã
ãŸããæ°ããéæ¥çãªäŸåé¢ä¿ã®åºçŸãç£èŠããããšãéèŠã§ããæŽæ°ã«ãããæ°ããããã±ãŒãžãç°¡åã«å°å ¥ãããå¯èœæ§ããããŸããããã«ããããããžã§ã¯ãã®æåãå·Šå³ãããŸãã圌ããããªãã®æ³šæã«å€ããŸãããã®å Žåã
event-stream
æªæã®ããã³ãŒãã¯å¥ã®ããã±ãŒãžã«é ãããŠããŸãã
flatMap-stream
ããã
event-stream
ã¯ãæ°ããããŒãžã§ã³ã®æ°ããäŸåé¢ä¿ãšããŠè¿œå ãããŸããã
äŸåé¢ä¿ã®ã¯ãªãŒãã¯ããããžã§ã¯ãã®ãµã€ãºã«ã圱é¿ããå¯èœæ§ããããŸããGoogle Sawzallã®éçºäž-JITãã°åŠçèšèª-ããŸããŸãªæç¹ã§ãèè ã¯ã¡ã€ã³ã€ã³ã¿ãŒããªã¿ãŒãã€ããªã«JIT Sawzallã ãã§ãªããïŒæªäœ¿çšã®ïŒPostScriptãPythonãããã³JavaScriptã€ã³ã¿ãŒããªã¿ãŒãå«ãŸããŠããããšãçºèŠããŸãããæ¯åãç¯äººã¯ãSawzallã©ã€ãã©ãªãŒã«ãã£ãŠå®£èšãããæªäœ¿çšã®äŸåé¢ä¿ã§ããããšãå€æããGoogleãã«ãã·ã¹ãã ãæ°ããäŸåé¢ä¿ãå®å šã«èªåçã«äœ¿çšãããšããäºå®ãšçµã¿åããããŸãããããããGoã³ã³ãã€ã©ãæªäœ¿çšã®ããã±ãŒãžãã€ã³ããŒããããšãã«ãšã©ãŒãã¹ããŒããçç±ã§ãã
æŽæ°ã¯ãå€åããäŸåé¢ä¿ã䜿çšãã決å®ã確èªããããã®èªç¶ãªæéã§ãããŸããããã§ãªãäžæ¯ãå®æçã«ç¢ºèªããããšãéèŠã§ãå€åããŠããŸããã»ãã¥ãªãã£äžã®åé¡ãä¿®æ£ãã¹ãä»ã®ãšã©ãŒããªããšèããããŸããïŒãããžã§ã¯ãã¯æŸæ£ãããŠããŸããïŒãã¶ãããã®äŸåé¢ä¿ã®ä»£æ¿ãèšç»ããæã§ãã
ãŸããåäŸåé¢ä¿ã®ã»ãã¥ãªãã£ãã°ãå確èªããããšãéèŠã§ããããšãã°ãApache Strutsã¯2016幎ã2017幎ã2018幎ã«æ·±å»ãªãªã¢ãŒãã³ãŒãå®è¡ã®è匱æ§ãæããã«ããŸãããèµ·åããŠããã«æŽæ°ãããµãŒããŒãå€æ°ããå Žåã§ãããã®ãããªå®çžŸã¯ã䜿çšãã䟡å€ããããã©ããã瀺åããŠããŸãã
ãããã«
ãœãããŠã§ã¢ã®åå©çšã®æ代ãããããå°æ¥ããŸãããç§ã¯å©ç¹ã軜èŠããããããŸãããããã¯éçºè ã«éåžžã«ååããªå€åããããããŸããããã ããæœåšçãªçµæãååã«èæ ®ããã«ããã®å€æãæ¡çšããŸãããäŸåé¢ä¿ãä¿¡é Œãã以åã®çç±ã¯ãäŸåé¢ä¿ããããŸã§ä»¥äžã«å€ããªããšãåæã«é¢é£æ§ã倱ããŸãã
ãã®èšäºã§èª¬æããç¹å®ã®äŸåé¢ä¿ã®éèŠãªåæã¯ãããªãã®éã®äœæ¥ãè¡šããŠãããã«ãŒã«ã§ã¯ãªãäŸå€ã®ãŸãŸã§ããããããç§ã¯ãã¹ãŠã®å¯èœãªæ°ããäžæ¯ã®ããã«ãããè¡ãããã«æ¬åœã«äžçæžåœã«åããŠããéçºè ãããããšãçããŸããç§ã¯èªåã®äŸåé¢ä¿ã®ããã€ãã«ã€ããŠããã®äœæ¥ã®äžéšã®ã¿ãè¡ããŸãããåºæ¬çã«ããœãªã¥ãŒã·ã§ã³å šäœã¯æ¬¡ã®ããã«ãªããŸãããäœãèµ·ãããèŠãŠã¿ãŸãããããããŸãã«ãé »ç¹ã«ããã£ãšäœããããŸãã«ãå€ãã®åªåã®ããã§ãã
ããããCopayããã³Equifaxæ»æã¯ãä»æ¥ã®ãœãããŠã§ã¢äŸåé¢ä¿ã®äœ¿çšæ¹æ³ã«ãããå®éã®åé¡ã®æ確ãªèŠåã§ããèŠåãç¡èŠããŠã¯ãªããŸããã 3ã€ã®äžè¬çãªæšå¥šäºé ã瀺ããŸãã
- . , , , . , .
- . , , . , , . , , , .
- . . . , . , , . , , API. .
è¯ããœãããŠã§ã¢ããããããããŸããäžç·ã«äœæ¥ããŠãå®å šã«äœ¿çšããæ¹æ³ãèŠã€ããŸãããã