ãŸãã¯ãZooKeeperãetcdãConsul KV çšã®ã¯ã©ã€ã¢ã³ã C++ ã©ã€ãã©ãªãã©ã®ããã«äœæããã
åæ£ã·ã¹ãã ã®äžçã§ã¯ãã¯ã©ã¹ã¿ãŒã®æ§æã«é¢ããæ
å ±ã®ä¿åãããŒãæ§æã®ç®¡çãé害ã®ããããŒãã®æ€åºããªãŒããŒã®éžæãªã©ã®å
žåçãªã¿ã¹ã¯ãå€æ°ãããŸãã
æ¬è³ªçã«ãããããã¹ãŠã®ã·ã¹ãã ã¯ãã©ãŒã«ããã¬ã©ã³ãã§ç·åœ¢åå¯èœãªããŒ/å€ã¹ãã¢ã§ãã äž¡è
ã®ããŒã¿ ã¢ãã«ã«ã¯å€§ããªéãããããŸãããããã«ã€ããŠã¯åŸã»ã©èª¬æããŸãããå®éäžã¯åãåé¡ã解決ããŸãã æããã«ã調æŽãµãŒãã¹ã䜿çšããåã¢ããªã±ãŒã·ã§ã³ã¯ããããã®ã¢ããªã±ãŒã·ã§ã³ã«é¢é£ä»ããããŠãããããç°ãªãã¢ããªã±ãŒã·ã§ã³ã§åãåé¡ã解決ããè€æ°ã®ã·ã¹ãã ã XNUMX ã€ã®ããŒã¿ ã»ã³ã¿ãŒã§ãµããŒãããå¿
èŠãçããå¯èœæ§ããããŸãã
ãã®åé¡ã解決ãããšããã¢ã€ãã¢ã¯ãªãŒã¹ãã©ãªã¢ã®ã³ã³ãµã«ãã£ã³ã°äŒç€ŸããçãŸãããããå®è¡ããã®ã¯ç§ãã¡åŠçã®å°ããªããŒã ã§ããããããããããã話ãããããšã§ãã
ç§ãã¡ã¯ãZooKeeperãetcdãConsul KV ãæäœããããã®å
±éã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããã©ã€ãã©ãªãäœæããããšãã§ããŸããã ãã®ã©ã€ãã©ãªã¯ C++ ã§æžãããŠããŸãããä»ã®èšèªã«ç§»æ€ããèšç»ããããŸãã
ããŒã¿ã¢ãã«
XNUMX ã€ã®ç°ãªãã·ã¹ãã ã«å ±éã®ã€ã³ã¿ãŒãã§ã€ã¹ãéçºããã«ã¯ããããã®ã·ã¹ãã ã®å ±éç¹ãšçžéç¹ãç解ããå¿ èŠããããŸãã ãããç解ããŸãããã
飌è²ä¿
ããŒã¯ããªãŒã«ç·šæãããããŒããšåŒã°ããŸãã ãããã£ãŠãããŒãã«ã€ããŠã¯ããã®åã®ãªã¹ããååŸã§ããŸãã znode ã®äœæ (create) ãšå€ã®å€æŽ (setData) ã®æäœã¯åé¢ãããŠãããæ¢åã®ããŒã®ã¿ãèªã¿åããå€æŽã§ããŸãã ãŠã©ããã¯ãããŒãã®ååšã®ç¢ºèªãå€ã®èªã¿åããããã³åã®ååŸã®æäœã«ã¢ã¿ããã§ããŸãã Watch ã¯ããµãŒããŒäžã®å¯Ÿå¿ããããŒã¿ã®ããŒãžã§ã³ãå€æŽããããšãã«èµ·åããã XNUMX åéãã®ããªã¬ãŒã§ãã äžæããŒãã¯é害ãæ€åºããããã«äœ¿çšãããŸãã ãããã¯ãããããäœæããã¯ã©ã€ã¢ã³ãã®ã»ãã·ã§ã³ã«é¢é£ä»ããããŸãã ã¯ã©ã€ã¢ã³ããã»ãã·ã§ã³ãéããããZooKeeper ãžã®ååšã®éç¥ãåæ¢ãããšããããã®ããŒãã¯èªåçã«åé€ãããŸãã åçŽãªãã©ã³ã¶ã¯ã·ã§ã³ããµããŒããããŠããŸããããã¯ããã¹ãŠãæåããããå°ãªããšã XNUMX ã€ãäžå¯èœãªå Žåã¯å€±æããäžé£ã®æäœã§ãã
etcd
ãã®ã·ã¹ãã ã®éçºè
ã¯æããã« ZooKeeper ã«è§ŠçºãããŠããããããã£ãŠãã¹ãŠãç°ãªãæ¹æ³ã§è¡ãããŸããã ããŒã«ã¯éå±€ã¯ãããŸããããèŸæžé ã«äžŠã¹ãããã»ããã圢æããŸãã ç¹å®ã®ç¯å²ã«å±ãããã¹ãŠã®ããŒãååŸãŸãã¯åé€ã§ããŸãã ãã®æ§é ã¯å¥åŠã«èŠãããããããŸããããå®éã«ã¯éåžžã«è¡šçŸåè±ãã§ãéå±€ãã¥ãŒããããéããŠç°¡åã«ãšãã¥ã¬ãŒãã§ããŸãã
etcd ã«ã¯æšæºã®æ¯èŒããã³èšå®æäœã¯ãããŸãããããã©ã³ã¶ã¯ã·ã§ã³ãšããåªããæäœããããŸãã ãã¡ãããããã㯠3.3 ã€ã®ã·ã¹ãã ãã¹ãŠã«ååšããŸãããetcd ãã©ã³ã¶ã¯ã·ã§ã³ã¯ç¹ã«åªããŠããŸãã ãããã¯ããã§ãã¯ãæåã倱æã® XNUMX ã€ã®ãããã¯ã§æ§æãããŸãã æåã®ãããã¯ã«ã¯äžé£ã®æ¡ä»¶ãå«ãŸããXNUMX çªç®ãš XNUMX çªç®ã®ãããã¯ã«ã¯æäœãå«ãŸããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã¢ãããã¯ã«å®è¡ãããŸãã ãã¹ãŠã®æ¡ä»¶ã true ã®å Žåã¯æåãããã¯ãå®è¡ããããã以å€ã®å Žåã¯å€±æãããã¯ãå®è¡ãããŸãã API XNUMX ã§ã¯ãæåãããã¯ãšå€±æãããã¯ã«ãã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ãå«ããããšãã§ããŸãã ã€ãŸããã»ãŒä»»æã®å
¥ãåã¬ãã«ã®æ¡ä»¶æ§é ãã¢ãããã¯ã«å®è¡ããããšãå¯èœã§ãã ã©ã®ãããªãã§ãã¯ãšæäœãååšãããã«ã€ããŠè©³ããã¯ã
ããã«ãæèšãååšããŸãããå°ãè€éã§åå©çšå¯èœã§ãã ã€ãŸããããŒç¯å²ã«ãŠã©ãããã€ã³ã¹ããŒã«ããåŸã¯ãæåã®ã¢ããããŒãã ãã§ãªãããŠã©ããããã£ã³ã»ã«ãããŸã§ããã®ç¯å²å ã®ãã¹ãŠã®ã¢ããããŒããåä¿¡ããŸãã etcd ã§ã¯ãZooKeeper ã¯ã©ã€ã¢ã³ã ã»ãã·ã§ã³ã«çžåœãããã®ã¯ãªãŒã¹ã§ãã
é äºK.V.
ããã«ãå³å¯ãªéå±€æ§é ã¯ãããŸããããConsul ã¯éå±€æ§é ãååšããããã«èŠããããšãã§ããŸããã€ãŸããæå®ããããã¬ãã£ãã¯ã¹ãæã€ãã¹ãŠã®ããŒãååŸããã³åé€ã§ããŸããã€ãŸããããŒã®ããµãããªãŒããæäœã§ããŸãã ãã®ãããªã¯ãšãªã¯ååž°çãšåŒã°ããŸãã ããã«ãConsul ã¯ãæ¥é èŸã®åŸã«æå®ãããæåãå«ãŸãªãããŒã®ã¿ãéžæã§ããŸããããã¯ãçŽæ¥ã®ãåããååŸããããšã«çžåœããŸãã ããããããã¯ãŸãã«éå±€æ§é ã®å€èŠ³ã§ããããšãèŠããŠãã䟡å€ããããŸãã芪ãååšããªãå Žåã«ããŒãäœæããããåãã·ã¹ãã ã«ä¿åããç¶ããŠããéã«åãæã€ããŒãåé€ãããããããšã¯ååã«å¯èœã§ãã
Consul ã¯ç£èŠã®ä»£ããã«ãHTTP ãªã¯ãšã¹ãããããã¯ããŸãã æ¬è³ªçã«ããããã¯ããŒã¿èªã¿åãã¡ãœãããžã®éåžžã®åŒã³åºãã§ãããä»ã®ãã©ã¡ãŒã¿ãŒãšãšãã«ãããŒã¿ã®æ¢ç¥ã®æåŸã®ããŒãžã§ã³ã瀺ãããŸãã ãµãŒããŒäžã®å¯Ÿå¿ããããŒã¿ã®çŸåšã®ããŒãžã§ã³ãæå®ãããããŒãžã§ã³ããã倧ããå Žåã¯ãå¿çãããã«è¿ãããŸãããã以å€ã®å Žåã¯ãå€ãå€æŽããããšãã«å¿çãè¿ãããŸãã ãã€ã§ãããŒã«ã¢ã¿ããã§ããã»ãã·ã§ã³ããããŸãã ã»ãã·ã§ã³ãåé€ãããšé¢é£ä»ããããããŒãåé€ããã etcd ã ZooKeeper ãšã¯ç°ãªããã»ãã·ã§ã³ãåçŽã«ããŒãããªã³ã¯è§£é€ããã¢ãŒããããããšã«æ³šæããŠãã ããã å©çšå¯èœ
ãã¹ãŠãäžç·ã«å ¥ããŠ
ZooKeeper ã«ã¯æãå³å¯ãªããŒã¿ ã¢ãã«ããããŸãã etcd ã§äœ¿çšã§ããè¡šçŸåè±ããªç¯å²ã¯ãšãªã¯ãZooKeeper ã Consul ã§ã¯å¹æçã«ãšãã¥ã¬ãŒãã§ããŸããã ãã¹ãŠã®ãµãŒãã¹ã®æè¯ã®ãã®ãçµã¿èŸŒãããšããçµæã次ã®éèŠãªäŸå€ãé€ããŠãZooKeeper ã€ã³ã¿ãŒãã§ã€ã¹ãšã»ãŒåçã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®æããŸããã
ã·ãŒã±ã³ã¹ãã³ã³ãããTTL ããŒã ãµããŒããããŠããŸãã- ACLã¯ãµããŒããããŠããŸãã
- set ã¡ãœããã¯ãããŒãååšããªãå Žåã«ããŒãäœæããŸã (ZK ã§ã¯ããã®å Žå setData ã¯ãšã©ãŒãè¿ããŸã)ã
- set ã¡ãœãããš cas ã¡ãœããã¯åé¢ãããŠããŸã (ZK ã§ã¯æ¬è³ªçã«åããã®ã§ã)
- Erase ã¡ãœããã¯ãããŒãããã®ãµãããªãŒãšãšãã«åé€ããŸã (ZK ã§ã¯ãããŒãã«åãããå Žåãdelete ã¯ãšã©ãŒãè¿ããŸã)ã
- åããŒã«ã¯ããŒãžã§ã³ã XNUMX ã€ã ããããŸã - å€ããŒãžã§ã³ (ZK ã§ã¯
ãããã®XNUMXã€ããããŸã )
ã·ãŒã±ã³ã·ã£ã« ããŒããæåŠãããã®ã¯ãetcd ãš Consul ã«ã·ãŒã±ã³ã·ã£ã« ããŒãã®ãµããŒããçµã¿èŸŒãŸããŠããããçµæãšããŠåŸãããã©ã€ãã©ãª ã€ã³ã¿ãŒãã§ã€ã¹äžã«ãŠãŒã¶ãŒãç°¡åã«å®è£ ã§ããããã§ãã
é ç¹ãåé€ãããšãã« ZooKeeper ãšåæ§ã®åäœãå®è£ ããã«ã¯ãetcd ãš Consul ã§ããŒããšã«åå¥ã®åã«ãŠã³ã¿ãŒãç¶æããå¿ èŠããããŸãã ã¡ã¿æ å ±ã®ä¿åãé¿ããããšããããããµãããªãŒå šäœãåé€ããããšã«ããŸããã
å®è£ ã®åŸ®åŠãªç¹
ããŸããŸãªã·ã¹ãã ã§ã®ã©ã€ãã©ãª ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã®ããã€ãã®åŽé¢ã詳ããèŠãŠã¿ãŸãããã
etcd ã®éå±€
etcd ã§éå±€ãã¥ãŒãç¶æããããšã¯ãæãèå³æ·±ãã¿ã¹ã¯ã® XNUMX ã€ã§ããããšãå€æããŸããã ç¯å²ã¯ãšãªã䜿çšãããšãæå®ããããã¬ãã£ãã¯ã¹ãæã€ããŒã®ãªã¹ããç°¡åã«ååŸã§ããŸãã ããšãã°ãã§å§ãŸããã¹ãŠã®ãã®ãå¿
èŠãªå Žåã "/foo"
ãç¯å²ãæ±ããŠããŸã ["/foo", "/fop")
ã ãã ããããã§ã¯ããŒã®ãµãããªãŒå
šäœãè¿ãããããããµãããªãŒã倧ããå Žåã«ã¯åãå
¥ããããªãå¯èœæ§ããããŸãã åœåã¯ããŒå€æã¡ã«ããºã ã䜿çšããäºå®ã§ãããã
"/foo" -> "u01/foo"
"/foo/bar" -> "u02/foo/bar"
次ã«ãããŒã®çŽæ¥ã®åããã¹ãŠååŸããŸã "/foo"
ç¯å²ããªã¯ãšã¹ãããããšã§å¯èœ ["u02/foo/", "u02/foo0")
ã ã¯ããASCII 㧠"0"
çŽåŸã«ç«ã€ "/"
.
ãããããã®å Žåãé ç¹ã®åé€ãã©ã®ããã«å®è£
ããã°ããã§ãããã? åã®ãã¹ãŠã®ç¯å²ãåé€ããå¿
èŠãããããšãããããŸããã ["uXX/foo/", "uXX/foo0")
XXã®å Žåã¯01ããFFãŸã§ã ãããŠãç§ãã¡ã¯ééããŸãã
ãã®çµæãåçŽãªããŒå€æã·ã¹ãã ãçºæãããããŒã®åé€ãšåã®ãªã¹ãã®ååŸã®äž¡æ¹ãå¹æçã«å®è£ ã§ããããã«ãªããŸããã æåŸã®ããŒã¯ã³ã®åã«ç¹æ®æåãè¿œå ããã ãã§ååã§ãã äŸãã°ïŒ
"/very" -> "/u00very"
"/very/long" -> "/very/u00long"
"/very/long/path" -> "/very/long/u00path"
次ã«ããŒãåé€ããŸã "/very"
åé€ã«å€ãããŸã "/u00very"
ãããŠç¯å² ["/very/", "/very0")
ãããã³ãã¹ãŠã®åãååŸããŸã - ç¯å²ããã®ããŒã®ãªã¯ãšã¹ã㧠["/very/u00", "/very/u01")
.
ZooKeeper ã§ã®ããŒã®åé€
ãã§ã«è¿°ã¹ãããã«ãZooKeeper ã§ã¯ãããŒãã«åãããå Žåã¯ããŒããåé€ã§ããŸããã ããŒããµãããªãŒãšãšãã«åé€ããããšèããŠããŸãã ã©ãããã°ããã§ããïŒ ç§ãã¡ã¯ããã楜芳çã«è¡ã£ãŠããŸãã ãŸãããµãããªãŒãååž°çã«èµ°æ»ããåå¥ã®ã¯ãšãªã§åé ç¹ã®åãååŸããŸãã 次ã«ããµãããªãŒã®ãã¹ãŠã®ããŒããæ£ããé åºã§åé€ããããšãããã©ã³ã¶ã¯ã·ã§ã³ãæ§ç¯ããŸãã ãã¡ããããµãããªãŒã®èªã¿åããšåé€ã®éã«å€æŽãçºçããå¯èœæ§ããããŸãã ãã®å Žåããã©ã³ã¶ã¯ã·ã§ã³ã¯å€±æããŸãã ããã«ããµãããªãŒã¯èªã¿åãããã»ã¹äžã«å€æŽãããå¯èœæ§ããããŸãã ããšãã°ããã®ããŒãããã§ã«åé€ãããŠããå Žåã次ã®ããŒãã®åã«å¯Ÿãããªã¯ãšã¹ãã¯ãšã©ãŒãè¿ãå¯èœæ§ããããŸãã ã©ã¡ãã®å Žåããããã»ã¹å šäœãããäžåºŠç¹°ãè¿ããŸãã
ãã®ã¢ãããŒãã§ã¯ãããŒã«åãããå ŽåãããŒã®åé€ã¯éåžžã«å¹æçã§ã¯ãªããªããŸãããŸããã¢ããªã±ãŒã·ã§ã³ãããŒã®åé€ãšäœæãè¡ã£ãŠãµãããªãŒãæäœãç¶ããå Žåã¯ãããã«å¹æãäœããªããŸãã ãã ããããã«ãããetcd ããã³ Consul ã§ã®ä»ã®ã¡ãœããã®å®è£ ãè€éã«ãªãããšãåé¿ã§ããŸããã
ZooKeeper ã«èšå®
ZooKeeper ã«ã¯ãããªãŒæ§é ãæäœããã¡ãœãã (createãdeleteãgetChildren) ãšãããŒãå ã®ããŒã¿ãæäœããã¡ãœãã (setDataãgetData) ãå¥ã ã«ãããŸããããã«ããã¹ãŠã®ã¡ãœããã«ã¯å³å¯ãªåææ¡ä»¶ããããŸããããŒãããã§ã«äœæãããŠããå Žåãcreate ã¯ãšã©ãŒãè¿ããŸããããŒã¿ããŸã ååšããªãå Žåã¯ãäœæãåé€ããŸã㯠setData ããŸãã ããŒã®ååšãæèããã«åŒã³åºãã set ã¡ãœãããå¿ èŠã§ããã
XNUMX ã€ã®ãªãã·ã§ã³ã¯ãåé€ãšåæ§ã«æ¥œèŠ³çãªã¢ãããŒããåãããšã§ãã ããŒããååšãããã©ããã確èªããŸãã ååšããå Žå㯠setData ãåŒã³åºããååšããªãå Žåã¯äœæããŸãã æåŸã®ã¡ãœããã§ãšã©ãŒãè¿ãããå Žåã¯ãããäžåºŠæåããç¹°ãè¿ããŸãã ãŸã泚æãã¹ãããšã¯ãååšãã¹ãã¯ç¡æå³ã§ãããšããããšã§ãã ããã« create ãåŒã³åºãããšãã§ããŸãã æ£åžžã«å®äºããå Žåã¯ãããŒããååšããã«äœæãããããšãæå³ããŸãã ãã以å€ã®å Žåãcreate ã¯é©åãªãšã©ãŒãè¿ããŸãããã®åŸãsetData ãåŒã³åºãå¿ èŠããããŸãã ãã¡ãããåŒã³åºãã®éã«ã競åããåŒã³åºãã«ãã£ãŠé ç¹ãåé€ãããå¯èœæ§ããããsetData ããšã©ãŒãè¿ããŸãã ãã®å ŽåãæåããããçŽãããšãã§ããŸãããããã ãã®äŸ¡å€ã¯ãããŸãã?
äž¡æ¹ã®ã¡ãœããããšã©ãŒãè¿ããå Žåã競åããåé€ãè¡ãããããšã確å®ã«ããããŸãã set ãåŒã³åºããåŸã«ãã®åé€ãè¡ããããšæ³åããŠã¿ãŸãããã ãã®ãšããç§ãã¡ã確ç«ããããšããŠããæå³ã¯ãã§ã«æ¶å»ãããŠããŸãã ããã¯ãå®éã«ã¯äœãæžã蟌ãŸããŠããªããŠããset ãæ£åžžã«å®è¡ããããšæ³å®ã§ããããšãæå³ããŸãã
æè¡çãªè©³çŽ°
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãåæ£ã·ã¹ãã ããé¢ããŠãã³ãŒãã£ã³ã°ã«ã€ããŠèª¬æããŸãã
ã客æ§ã®äž»ãªèŠä»¶ã® XNUMX ã€ã¯ã¯ãã¹ãã©ãããã©ãŒã ã§ãããã€ãŸãããµãŒãã¹ã®å°ãªããšã XNUMX ã€ã LinuxãMacOSãããã³ Windows ã§ãµããŒããããŠããå¿
èŠããããŸãã åœå㯠Linux åãã«ã®ã¿éçºãããã®åŸä»ã®ã·ã¹ãã ã§ããã¹ããéå§ããŸããã ããã«ããå€ãã®åé¡ãçºçããŸãããããã°ããã®éãã©ã®ããã«å¯ŸåŠããã°ããã®ããŸã£ããããããŸããã§ããã ãã®çµæãXNUMX ã€ã®èª¿æŽãµãŒãã¹ã¯ãã¹ãŠ Linux ããã³ MacOS ã§ãµããŒããããããã«ãªããŸããããWindows ã§ã¯ Consul KV ã®ã¿ããµããŒããããŠããŸãã
ç§ãã¡ã¯æåããããµãŒãã¹ã«ã¢ã¯ã»ã¹ããããã«æ¢è£œã®ã©ã€ãã©ãªã䜿çšããããšããŸããã ZooKeeper ã®å Žåãéžæã¯æ¬¡ã®ãšããã§ããã
ZooKeeper C++ ã©ã€ãã©ãªã®éåæã€ã³ã¿ãŒãã§ã€ã¹ããã€ã³ã¹ãã¬ãŒã·ã§ã³ãåŸãŠãéåæã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããããšã«ããŸããã ZooKeeper C++ ã¯ãããã« future/promise ããªããã£ãã䜿çšããŸãã æ®å¿µãªãããSTL ã§ã¯ããããã¯éåžžã«æ§ããã«å®è£
ãããŠããŸãã ããšãã°ãããã
then ã®å®è£ ã¯æ¬¡ã®ããã«æ©èœããŸãã åŒã³åºããããšãè¿œå ã® Promise/Future ãã¢ãäœæãããŸãã æ°ãã Future ãè¿ãããæž¡ããã Future ã¯ã察å¿ããé¢æ°ããã³è¿œå ã® Promise ãšãšãã«ãã¥ãŒã«é 眮ãããŸãã ããŒã«ã®ã¹ã¬ããã¯ãã¥ãŒããããã€ãã®å ç©ãéžæããwait_for ã䜿çšããŠããããããŒãªã³ã°ããŸãã çµæãå©çšå¯èœã«ãªããšã察å¿ããé¢æ°ãåŒã³åºããããã®æ»ãå€ã Promise ã«æž¡ãããŸãã
etcd ãš Consul ãžã®ã¯ãšãªãå®è¡ããããã«åãã¹ã¬ãã ããŒã«ã䜿çšããŸããã ããã¯ãåºç€ãšãªãã©ã€ãã©ãªãè€æ°ã®ç°ãªãã¹ã¬ããããã¢ã¯ã»ã¹ã§ããããšãæå³ããŸãã ppconsul ã¯ã¹ã¬ããã»ãŒãã§ã¯ãªããããppconsul ãžã®åŒã³åºãã¯ããã¯ã«ãã£ãŠä¿è·ãããŸãã
grpc ã¯è€æ°ã®ã¹ã¬ããããæäœã§ããŸããã埮åŠãªç¹ããããŸãã etcd ã§ã¯ãç£èŠã¯ grpc ã¹ããªãŒã çµç±ã§å®è£
ãããŸãã ãããã¯ãç¹å®ã®çš®é¡ã®ã¡ãã»ãŒãžçšã®åæ¹åãã£ãã«ã§ãã ã©ã€ãã©ãªã¯ããã¹ãŠã®ç£èŠã«å¯Ÿã㊠XNUMX ã€ã®ã¹ã¬ãããšãåä¿¡ã¡ãã»ãŒãžãåŠçãã XNUMX ã€ã®ã¹ã¬ãããäœæããŸãã ãããã£ãŠãgrpc ã¯ã¹ããªãŒã ãžã®äžŠåæžã蟌ã¿ãçŠæ¢ããŸãã ã€ãŸãããŠã©ãããåæåãŸãã¯åé€ããå Žåã¯ãåã®ãªã¯ãšã¹ãã®éä¿¡ãå®äºãããŸã§åŸ
ã£ãŠããã次ã®ãªã¯ãšã¹ããéä¿¡ããå¿
èŠããããŸãã åæã«äœ¿çšããŸã
åèš
èªåèªèº«ãåç
§ããŠãã ããïŒ
ç§ãã¡ã®ããŒã ïŒ
åºæïŒ habr.com