ãã·ã¢ã§ã¯2019幎ãã衚瀺矩åã«é¢ããæ³åŸãæœè¡ãããŠããã ãã®æ³åŸã¯ãã¹ãŠã®ååã°ã«ãŒãã«é©çšãããããã§ã¯ãªããååã°ã«ãŒãããšã«è¡šç€ºçŸ©åã®çºå¹æ¥ãç°ãªããŸãã ã¿ãã³ãéŽãå»è¬åãæåã«çŸ©å衚瀺ã®å¯Ÿè±¡ãšãªããéŠæ°Žãç¹ç¶è£œåãçä¹³ãªã©ã®ä»ã®è£œåãåŸã«è¿œå ãããäºå®ã§ãã ãã®æ³çé©æ°ã«ããã補åã®çç£ããæçµæ¶è²»è ã«ããè³Œå ¥ããããŠãã®ããã»ã¹ã®ãã¹ãŠã®åå è ïŒåœèªäœãšãååã販売ãããã¹ãŠã®çµç¹ã®äž¡æ¹ïŒã«è³ã補åã®ã©ã€ããã§ãŒã³å šäœã远跡ã§ããæ°ãã IT ãœãªã¥ãŒã·ã§ã³ã®éçºãä¿ãããŸããã矩åçãªã©ãã«è¡šç€ºã
X5 ã§ã¯ãã©ãã«ä»ãååã远跡ããåœããµãã©ã€ã€ãŒãšããŒã¿ã亀æããã·ã¹ãã ã¯ãããŒã«ã¹ããšåŒã°ããŸãã 誰ãã©ã®ããã«éçºããã®ãããã®æè¡ã¹ã¿ãã¯ã¯ã©ã®ãããªãã®ãªã®ãããããŠãªãåœç€Ÿãèªãã¹ããã®ãããã®ãââãé çªã«èª¬æããŸãããã
ãªã¢ã«ãã€ããŒã
ãããŒã«ã¹ãã¯å€ãã®åé¡ã解決ããŸãããäž»ãªåé¡ã¯ãã©ãã«ä»ã補åã®ç§»åã远跡ããããã®ãX5 æ å ±ã·ã¹ãã ãšã©ãã«ä»ã補åã®ç¶æ æ å ±ã·ã¹ãã (GIS MP) éã®çžäºäœçšã®çµ±åã§ãã ãã®ãã©ãããã©ãŒã ã¯ãåœç€Ÿãåãåã£ããã¹ãŠã®ã©ãã« ã³ãŒããšããªããžã§ã¯ãéã§ã®ãããã®ã³ãŒãã®ç§»åå±¥æŽå šäœãä¿åããã©ãã«ä»ã補åã®åã°ã¬ãŒãã£ã³ã°ãæé€ããã®ã«åœ¹ç«ã¡ãŸãã ã©ãã«ä»ãååã®æåã®ã°ã«ãŒãã«å«ãŸããŠããã¿ãã³è£œåã®äŸã䜿çšãããšããã©ã㯠600 å°åã®ã¿ãã³ã«çŽ 000 ããã¯ãå«ãŸããŠãããããããã«ç¬èªã®ã³ãŒããä»ããŠããŸãã ãããŠãç§ãã¡ã®ã·ã¹ãã ã®åœ¹å²ã¯ãå庫ãšåºèã®éã§ã®ãã®ãããªåããã¯ã®ç§»åã®åæ³æ§ã远跡ããã³æ€èšŒããæçµçã«æçµè³Œå ¥è ãžã®è²©å£²ã®èš±å®¹æ§ãæ€èšŒããããšã§ãã ãŸãã125 æéãããçŽ 000 件ã®çŸéååŒãèšé²ããŠããããã®ãããªåããã¯ãã©ã®ããã«ããŠåºå ã«æ¬å ¥ãããããèšé²ããå¿ èŠããããŸãã ãããã£ãŠããªããžã§ã¯ãéã®ãã¹ãŠã®ç§»åãèæ ®ãããšã幎éæ°çŸåã®ã¬ã³ãŒããçºçãããšäºæ³ãããŸãã
ããŒã M
Marcus 㯠X5 å ã®ãããžã§ã¯ããšã¿ãªãããŠããã«ããããããã補åã¢ãããŒãã䜿çšããŠå®è£ ãããŠããŸãã ããŒã ã¯ã¹ã¯ã©ã ã«åŸã£ãŠäœæ¥ããŸãã ãã®ãããžã§ã¯ãã¯æšå¹Žã®å€ã«å§ãŸããŸããããæåã®çµæãåŸãããã®ã¯ 16 æã«ãªã£ãŠããã§ãããç§ãã¡èªèº«ã®ããŒã ãå®å šã«ç·šæãããã·ã¹ãã ã¢ãŒããã¯ãã£ãéçºãããæ©åšãè³Œå ¥ãããŸããã çŸåšãããŒã 㯠XNUMX åã§æ§æãããŠããããã®ãã¡ XNUMX åã¯ããã¯ãšã³ããšããã³ããšã³ãã®éçºã«æºãã£ãŠããããã®ãã¡ XNUMX åã¯ã·ã¹ãã åæã«æºãã£ãŠããŸãã ããã« XNUMX 人ãæåãã¹ããè² è·ãã¹ããèªåãã¹ããããã³è£œåã¡ã³ããã³ã¹ã«æºãã£ãŠããŸãã ããã«ãåœç€Ÿã«ã¯ SRE ã¹ãã·ã£ãªã¹ããããŸãã
ç§ãã¡ã®ããŒã ã§ã³ãŒããæžãã®ã¯éçºè ã ãã§ã¯ãããŸãããã»ãŒå šå¡ããèªåãã¹ããããŒã ã¹ã¯ãªãããèªååã¹ã¯ãªããã®ããã°ã©ãã³ã°ãšäœææ¹æ³ãç¥ã£ãŠããŸãã 補åãµããŒãã§ãé«åºŠãªèªååãå¿ èŠãªãããç§ãã¡ã¯ããã«ç¹ã«æ³šæãæã£ãŠããŸãã ç§ãã¡ã¯åžžã«ããããŸã§ããã°ã©ãã³ã°ãããããšããªãååã«ã¢ããã€ã¹ããŠæå©ãããåãçµãããã®å°ããªã¿ã¹ã¯ãããã€ãäžããããåªããŠããŸãã
ã³ãããŠã€ã«ã¹ã®ãã³ãããã¯ã«ãããç§ãã¡ã¯ããŒã å šäœããªã¢ãŒãã¯ãŒã¯ã«ç§»è¡ããŸããããéçºç®¡ççšã®ãã¹ãŠã®ããŒã«ãå©çšå¯èœã«ãªããJira ãš GitLab ã§æ§ç¯ãããã¯ãŒã¯ãããŒã«ããããã®æ®µéãç°¡åã«ééããããšãã§ããŸããã æ°ãæéãªã¢ãŒãã§éãããçµæãããŒã ã®çç£æ§ãäœäžããããšã¯ãªãã£ãããšãããããŸãããå€ãã®äººã«ãšã£ãŠãè·å Žã§ã®å¿«é©ãã¯åäžããŸããããå¯äžæ¬ ããŠããã®ã¯ã©ã€ãã³ãã¥ãã±ãŒã·ã§ã³ã§ããã
ãªã¢ãŒãããŒã ããŒãã£ã³ã°
ãªã¢ãŒãã¯ãŒã¯äžã®äŒè°
ãœãªã¥ãŒã·ã§ã³ã®æè¡ã¹ã¿ãã¯
X5 ã®æšæºãªããžããªããã³ CI/CD ããŒã«ã¯ GitLab ã§ãã ã³ãŒãã®ä¿åãç¶ç¶çãªãã¹ãããã¹ã ãµãŒããŒãšéçšãµãŒããŒãžã®å±éã«ããã䜿çšããŸãã ãŸããéçºè ãã³ãŒãã«å ããå€æŽãå°ãªããšã 2 人ã®ååãæ¿èªããå¿ èŠãããå Žåã«ã¯ãã³ãŒã ã¬ãã¥ãŒãå®æœããŸãã éçã³ãŒã ã¢ãã©ã€ã¶ãŒ SonarQube ãš JaCoCo ã¯ãã³ãŒããã¯ãªãŒã³ã«ä¿ã¡ãå¿ èŠãªã¬ãã«ã®åäœãã¹ã ã«ãã¬ããžã確ä¿ããã®ã«åœ¹ç«ã¡ãŸãã ã³ãŒããžã®ãã¹ãŠã®å€æŽã¯ããããã®ãã§ãã¯ãééããå¿ èŠããããŸãã æåã§å®è¡ããããã¹ãŠã®ãã¹ã ã¹ã¯ãªããã¯ããã®åŸèªååãããŸãã
ãMarcusãã«ããããžãã¹ ããã»ã¹ã®å®è£ ãæåãããã«ã¯ãå€ãã®æè¡çåé¡ãé çªã«è§£æ±ºããå¿ èŠããããŸããã
ã¿ã¹ã¯ 1. ã·ã¹ãã ã®æ°Žå¹³æ¹åã®ã¹ã±ãŒã©ããªãã£ã®å¿ èŠæ§
ãã®åé¡ã解決ããããã«ãç§ãã¡ã¯ã¢ãŒããã¯ãã£ã«å¯ŸããŠãã€ã¯ããµãŒãã¹ ã¢ãããŒããéžæããŸããã åæã«ããµãŒãã¹ã®è²¬ä»»ç¯å²ãç解ããããšãéåžžã«éèŠã§ããã ããã»ã¹ã®å 容ãèæ ®ããŠãæ¥åã«åå²ããŠã¿ãŸããã ããšãã°ãå庫ã§ã®åãå ¥ãã¯ããã»ã©é »ç¹ã§ã¯ãããŸããããéåžžã«å€§èŠæš¡ãªäœæ¥ã§ããããã®éãåãå ¥ããããååã®åäœã«é¢ããæ å ±ãå·èŠå¶åœå±ããè¿ éã«ååŸããå¿ èŠãããããã®æ°ã¯600000åã®é éã§XNUMXäžåã«éããŸãã ããã®è£œåãå庫ã«åãå ¥ããããšãã§ãããã©ããã確èªããå庫èªååã·ã¹ãã ã«å¿ èŠãªãã¹ãŠã®æ å ±ãè¿ããŸãã ãã ããå庫ããã®åºè·ã¯ã¯ããã«åŒ·åºŠãé«ããªããŸãããåæã«å°éã®ããŒã¿ã§åäœããŸãã
ç§ãã¡ã¯ãã¹ãŠã®ãµãŒãã¹ãã¹ããŒãã¬ã¹ ããŒã¹ã§å®è£ ããKafka ã»ã«ããããã¯ãšåŒã°ãããã®ã䜿çšããŠå éšæäœãã¹ãããã«åå²ããããšããããŠããŸãã ããã¯ããã€ã¯ããµãŒãã¹ãããèªäœã«ã¡ãã»ãŒãžãéä¿¡ãããšãã§ãããããã«ããããªãœãŒã¹ã倧éã«æ¶è²»ããæäœã®è² è·ã®ãã©ã³ã¹ãåãã補åã®ã¡ã³ããã³ã¹ãç°¡çŽ åãããŸããããã«ã€ããŠã¯åŸã»ã©èª¬æããŸãã
ç§ãã¡ã¯ãå€éšã·ã¹ãã ãšå¯Ÿè©±ããããã®ã¢ãžã¥ãŒã«ãå¥ã®ãµãŒãã¹ã«åé¢ããããšã«ããŸããã ããã«ãããæ¥åæ©èœãæã€ãµãŒãã¹ã«ã»ãšãã©åœ±é¿ãäžããããšãªããå€éšã·ã¹ãã ã®APIãé »ç¹ã«å€æŽãããåé¡ã解決ããããšãã§ããŸããã
ãã¹ãŠã®ãã€ã¯ããµãŒãã¹ã¯ OpenShift ã¯ã©ã¹ã¿ãŒã«ãããã€ãããŠãããããåãã€ã¯ããµãŒãã¹ã®ã¹ã±ãŒãªã³ã°ã®åé¡ã解決ããããµãŒãããŒãã£ã® Service Discovery ããŒã«ã䜿çšããªããŠãæžã¿ãŸãã
ã¿ã¹ã¯ 2. ãã©ãããã©ãŒã ãµãŒãã¹éã§é«è² è·ããã³éåžžã«éäžçãªããŒã¿äº€æãç¶æããå¿ èŠæ§: ãããžã§ã¯ãã®ç«ã¡äžããã§ãŒãºã ãã§ãã600 ç§ãããçŽ 5000 ã®æäœãå®è¡ãããŸãã å°å£²åºãåœç€Ÿã®ãã©ãããã©ãŒã ã«æ¥ç¶ããã«ã€ããŠããã®å€ã¯ XNUMX ops/ç§ãŸã§å¢å ãããšäºæ³ãããŸãã
ãã®åé¡ã¯ãKafka ã¯ã©ã¹ã¿ãŒããããã€ãããã©ãããã©ãŒã ã®ãã€ã¯ããµãŒãã¹éã®åæ察話ãã»ãŒå®å
šã«æŸæ£ããããšã§è§£æ±ºãããŸããã ãã¹ãŠã®æäœãéåæã«ã§ããããã§ã¯ãªããããã·ã¹ãã èŠä»¶ãéåžžã«æ³šææ·±ãåæããå¿
èŠããããŸãã åæã«ããããŒã«ãŒãéããŠã€ãã³ããéä¿¡ããã ãã§ãªããå¿
èŠãªãã¹ãŠã®ããžãã¹æ
å ±ãã¡ãã»ãŒãžã§éä¿¡ããŸãã ãããã£ãŠãã¡ãã»ãŒãžã®ãµã€ãºã¯æ°çŸãããã€ãã«éããå¯èœæ§ããããŸãã Kafka ã®ã¡ãã»ãŒãž ãµã€ãºå¶éã§ã¯ãã¡ãã»ãŒãž ãµã€ãºãæ£ç¢ºã«äºæž¬ããå¿
èŠããããå¿
èŠã«å¿ããŠã¡ãã»ãŒãžãåå²ããŸãããåå²ã¯è«ççãªãã®ã§ãããããžãã¹ ãªãã¬ãŒã·ã§ã³ã«é¢é£ããŠããŸãã
ããšãã°ãè»ã§å°çããååãç®±ã«åããŸãã åææäœã®å Žåãåå¥ã®ãã€ã¯ããµãŒãã¹ãå²ãåœãŠããã培åºçãªè² è·ãã¹ããå®è¡ãããŸãã Kafka ã䜿çšãããšãå¥ã®èª²é¡ãçºçããŸãããKafka ã®çµ±åã«ãããã¹ãŠã®åäœãã¹ããéåæã«ãªãããšãèæ
®ããŠãµãŒãã¹ã®åäœããã¹ããããšããããšã§ãã ç§ãã¡ã¯ãEmbedded Kafka Broker ã䜿çšããŠç¬èªã®ãŠãŒãã£ãªã㣠ã¡ãœãããäœæããããšã§ããã®åé¡ã解決ããŸããã ããã«ãããåã
ã®ã¡ãœããã®åäœãã¹ããäœæããå¿
èŠããªããªãããã§ã¯ãããŸããããKafka ã䜿çšããŠè€éãªã±ãŒã¹ããã¹ãããããšã奜ã¿ãŸãã
ãµãŒãã¹ã®æäœäžãŸã㯠Kafka ãããã®æäœäžã«äŸå€ãçºçãããšãã« TraceId ã倱ãããªãããã«ããã¬ãŒã¹ ãã°ã«ã¯çŽ°å¿ã®æ³šæãæãããŸããã æåã®ã±ãŒã¹ã§ç¹å¥ãªåé¡ããªãã£ãå ŽåãXNUMX çªç®ã®ã±ãŒã¹ã§ã¯ããããã«ä»å±ãããã¹ãŠã® TraceId ããã°ã«èšé²ãããã¬ãŒã¹ãç¶è¡ãã XNUMX ã€ãéžæããå¿ èŠããããŸãã ãã®åŸãå ã® TraceId ã§æ€çŽ¢ãããšãã©ã®ãã¬ãŒã¹ãç¶ç¶ãããã®ããç°¡åã«ããããŸãã
ã¿ã¹ã¯ 3. 倧éã®ããŒã¿ãä¿åããå¿ èŠããã: ã¿ãã³ã ãã§ã幎é 1 å以äžã®ã©ãã«ã X5 ã«éãŸããŸãã ç¶ç¶çãã€è¿ éãªã¢ã¯ã»ã¹ãå¿ èŠã§ãã åèšãããšãã·ã¹ãã ã¯ãããã®ã©ãã«ä»ãååã®ç§»åå±¥æŽã®çŽ 10 å件ã®èšé²ãåŠçããå¿ èŠããããŸãã
5 çªç®ã®åé¡ã解決ããããã«ãNoSQL ããŒã¿ããŒã¹ MongoDB ãéžæãããŸããã 3 ã€ã®ããŒãã®ã·ã£ãŒããæ§ç¯ããåããŒãã«ã¯ XNUMX å°ã®ãµãŒããŒã®ã¬ããªã« ã»ããããããŸãã ããã«ãããã·ã¹ãã ãæ°Žå¹³æ¹åã«æ¡åŒµããŠã¯ã©ã¹ã¿ãŒã«æ°ãããµãŒããŒãè¿œå ãããã©ãŒã«ã ãã¬ã©ã³ã¹ã確ä¿ã§ããŸãã ããã§ãæ°Žå¹³æ¹åã«ã¹ã±ãŒã©ãã«ãªãã€ã¯ããµãŒãã¹ã®äœ¿çšãèæ ®ããŠãmongo ã¯ã©ã¹ã¿ãŒã§ã®ãã©ã³ã¶ã¯ã·ã§ã³æ§ã確ä¿ãããšããå¥ã®åé¡ãçºçããŸããã ããšãã°ãç§ãã¡ã®ã·ã¹ãã ã®ã¿ã¹ã¯ã® XNUMX ã€ã¯ãåãã©ãã« ã³ãŒãã䜿çšããŠè£œåãå販売ããããšããè©Šã¿ãèå¥ããããšã§ãã ããã§ã¯ãã¬ãžä¿ã«ãã誀ã£ãã¹ãã£ã³ãŸãã¯èª€ã£ãæäœã«ãã£ãŠãªãŒããŒã¬ã€ã衚瀺ãããŸãã ãã®ãããªéè€ã¯ãåŠçãããŠãã XNUMX ã€ã® Kafka ãããå ãšã䞊è¡ããŠåŠçãããŠãã XNUMX ã€ã®ãããå ã§çºçããå¯èœæ§ãããããšãããããŸããã ãããã£ãŠãããŒã¿ããŒã¹ã«ã¯ãšãªãå®è¡ããŠéè€ããã§ãã¯ããŠãäœãåŸãããŸããã§ããã ãã€ã¯ããµãŒãã¹ããšã«ããã®ãµãŒãã¹ã®ããžãã¹ ããžãã¯ã«åºã¥ããŠåé¡ãåå¥ã«è§£æ±ºããŸããã ããšãã°ããã§ãã¯ã«ã€ããŠã¯ããããå ã«ãã§ãã¯ãè¿œå ããæ¿å ¥æã®éè€ã®åºçŸã«ã€ããŠå¥ã®åŠçãè¿œå ããŸããã
ãŠãŒã¶ãŒã«ããæäœå±¥æŽã®æäœãæãéèŠãªããšãã€ãŸãããžãã¹ ããã»ã¹ã®æ©èœã«ãããªã圱é¿ãåãŒããªãããã«ããããããã¹ãŠã®å±¥æŽããŒã¿ãå¥åã®ããŒã¿ããŒã¹ãåããå¥åã®ãµãŒãã¹ã«åé¢ããKafka ãéããŠæ å ±ãåãåããŸãã ã ãã®ããã«ããŠããŠãŒã¶ãŒã¯ãé²è¡äžã®æäœã§ããŒã¿ãåŠçãããµãŒãã¹ã«åœ±é¿ãäžããããšãªããåé¢ããããµãŒãã¹ãæäœã§ããŸãã
ã¿ã¹ã¯ 4: ãã¥ãŒã®ååŠçãšç£èŠ:
åæ£ã·ã¹ãã ã§ã¯ãããŒã¿ããŒã¹ããã¥ãŒãå€éšããŒã¿ ãœãŒã¹ã®å¯çšæ§ã«é¢ããŠåé¡ããšã©ãŒãå¿ ç¶çã«çºçããŸãã Marcus ã®å Žåããã®ãããªãšã©ãŒã®åå ã¯å€éšã·ã¹ãã ãšã®çµ±åã§ãã ã¿ã€ã ã¢ãŠããæå®ããŠèª€ã£ãå¿çã«å¯Ÿãããªã¯ãšã¹ããç¹°ãè¿ãå®è¡ã§ããããã«ããªãããåæã«ã¡ã€ã³ ãã¥ãŒå ã®æåãããªã¯ãšã¹ãã®åŠçãåæ¢ããªããœãªã¥ãŒã·ã§ã³ãèŠã€ããå¿ èŠããããŸããã ãã®ç®çã®ããã«ãããããããããã¯ããŒã¹ã®åè©Šè¡ãã³ã³ã»ãããéžæãããŸããã ã¡ã€ã³ ãããã¯ããšã«ã誀ã£ãã¡ãã»ãŒãžãéä¿¡ããã XNUMX ã€ä»¥äžã®ãªãã©ã€ ãããã¯ãäœæãããåæã«ã¡ã€ã³ ãããã¯ããã®ã¡ãã»ãŒãžåŠçã®é 延ã解æ¶ãããŸãã ã€ã³ã¿ã©ã¯ã·ã§ã³ã¹ããŒã -
ãã®ãããªã¹ããŒã ãå®è£
ããã«ã¯ããã®ãœãªã¥ãŒã·ã§ã³ã Spring ãšçµ±åããã³ãŒãã®éè€ãé¿ããå¿
èŠããããŸããã Web ãµãŒãã£ã³äžã«ãSpring BeanPostProccessor ã«åºã¥ãåæ§ã®ãœãªã¥ãŒã·ã§ã³ãèŠã€ããŸããããããã¯ç§ãã¡ã«ãšã£ãŠäžå¿
èŠã«é¢åã«æããŸããã ç§ãã¡ã®ããŒã ã¯ãã³ã³ã·ã¥ãŒããäœæããããã® Spring ãµã€ã¯ã«ã«çµ±åããããã« Retry Consumer ãè¿œå ã§ãããããã·ã³ãã«ãªãœãªã¥ãŒã·ã§ã³ãäœæããŸããã ç§ãã¡ã¯ Spring ããŒã ã«ãœãªã¥ãŒã·ã§ã³ã®ãããã¿ã€ããæäŸããŸãããã芧ã®ãšããã§ãã
ãã¹ãŠã®åè©Šè¡åŸã«ã¡ãã»ãŒãžãåŠçã§ããªãã£ãå Žåãã¡ãã»ãŒãžã¯ Spring DeadLetterPublishingRecoverer ã䜿çšã㊠DLT (ããã ã¬ã¿ãŒ ãããã¯) ã«éãããŸãã ãµããŒãã®èŠè«ã«å¿ããŠããã®æ©èœãæ¡åŒµããDLTãstackTraceãtraceId ã«å«ãŸããã¡ãã»ãŒãžãããã³ãããã«é¢ãããã®ä»ã®æçšãªæ å ±ã衚瀺ã§ããå¥ã®ãµãŒãã¹ãäœæããŸããã ããã«ããã¹ãŠã® DLT ãããã¯ã«ç£èŠãšã¢ã©ãŒããè¿œå ãããå®éã«ãDLT ãããã¯ã«ã¡ãã»ãŒãžã衚瀺ããããšãæ¬ é¥ãåæããŠä¿®æ£ããå¿ èŠããããŸãã ããã¯éåžžã«äŸ¿å©ã§ãããããã¯ã®ååã«ãã£ãŠãåé¡ãããã»ã¹ã®ã©ã®æ®µéã§çºçããããããã«ããããæ ¹æ¬åå ã®æ€çŽ¢ãå€§å¹ ã«ã¹ããŒãã¢ãããããŸãã
æè¿ã§ã¯ãåå ãæé€ã (å€éšã·ã¹ãã ã®æ©èœã埩å
ãããªã©)ããã¡ããåæã®ããã«å¯Ÿå¿ããæ¬ é¥ã確ç«ããåŸããµããŒããå©çšããŠã¡ãã»ãŒãžãåéä¿¡ã§ããã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããŸããã ããã§ã»ã«ããããã¯ã圹ã«ç«ã¡ãŸããé·ãåŠçãã§ãŒã³ãåèµ·åããªãããã«ãç®çã®ã¹ãããããåèµ·åã§ããŸãã
ãã©ãããã©ãŒã ã®éçš
ãã®ãã©ãããã©ãŒã ã¯ãã§ã«çç£çã«çšŒåããŠãããæ¯æ¥é éãšåºè·ãå®è¡ããæ°ããé éã»ã³ã¿ãŒãšåºèãæ¥ç¶ããŠããŸãã ãã€ãããã®äžç°ãšããŠããã®ã·ã¹ãã ã¯ãã¿ãã³ããšãéŽãã®è£œåã°ã«ãŒãã§åäœããŸãã
åœç€Ÿã®ããŒã å šäœããã€ãããã®å®æœã«åå ããæ°ããªåé¡ãåæãããã°ã®æ¹åããããã»ã¹ã®å€æŽã«è³ããŸã§ã補åãæ¹åããããã®ææ¡ãè¡ã£ãŠããŸãã
ç§ãã¡ã®ééããç¹°ãè¿ããªãããã«ããã€ãããäžã«èŠã€ãã£ããã¹ãŠã®ã±ãŒã¹ãèªåãã¹ãã«åæ ãããŸãã å€æ°ã®èªåãã¹ããšåäœãã¹ããååšãããããæåéãæ°æé以å ã«ååž°ãã¹ããå®æœããããããã£ãã¯ã¹ãã€ã³ã¹ããŒã«ã§ããŸãã
çŸåšãç§ãã¡ã¯ãã©ãããã©ãŒã ã®éçºãšæ¹åãç¶ããŠãããåžžã«æ°ãã課é¡ã«çŽé¢ããŠããŸãã ãèå³ãããããŸãããã次ã®èšäºã§ãœãªã¥ãŒã·ã§ã³ã«ã€ããŠèª¬æããŸãã
åºæïŒ habr.com