ããã«ã¡ã¯ãç§ã¯ DRD KP ãããžã§ã¯ã (ãã€ãŒã« ã»ããã®ã©ã€ã ãµã€ã¯ã«ãç£èŠããããã®åæ£ããŒã¿ ã¬ãžã¹ããª) ã®ããŒã ã§åããŠããŸãã ããã§ã¯ããã¯ãããžãŒã®å¶çŽã®äžã§ãã®ãããžã§ã¯ãã®ãšã³ã¿ãŒãã©ã€ãº ãããã¯ãã§ãŒã³ãéçºããç§ãã¡ã®ããŒã ã®çµéšãå
±æããããšæããŸãã 䞻㫠Hyperledger Fabric ã«ã€ããŠèª¬æããŸãããããã§èª¬æããã¢ãããŒãã¯ãããããèš±å¯åãããã¯ãã§ãŒã³ã«é©çšã§ããŸãã ç§ãã¡ã®ç 究ã®æçµç®æšã¯ãæçµè£œåã䜿ãããããã¡ã³ããã³ã¹ãããã»ã©é£ãããªãããã«ããšã³ã¿ãŒãã©ã€ãº ãããã¯ãã§ãŒã³ ãœãªã¥ãŒã·ã§ã³ãæºåããããšã§ãã
ããã§ã¯çºèŠãäºæãã¬è§£æ±ºçããããŠãŠããŒã¯ãªå±éã匷調ãããããšã¯ãããŸããïŒç§ã«ã¯äœããªãã®ã§ïŒã ç§ã¯èªåã®ãããããªçµéšãå
±æãããããã¯å¯èœã ã£ããããšã瀺ãããã ãã§ãããããŠããããããã³ã¡ã³ãã§ä»ã®äººã®è¯ã決æãããŸãè¯ããªã決æãäžããçµéšã«ã€ããŠèªã¿ããã ãã§ãã
åé¡: ãããã¯ãã§ãŒã³ã¯ãŸã æ¡åŒµã§ããŸãã
çŸåšãå€ãã®éçºè ã®åªåã¯ããããã¯ãã§ãŒã³ãçŸããã©ãããŒã®æéç匟ã§ã¯ãªããçã«äŸ¿å©ãªãã¯ãããžãŒã«ããããšãç®çãšããŠããŸãã ã¹ããŒããã£ãã«ããªããã£ãã¹ãã£ãã¯ããŒã«ã¢ããããã©ãºããã·ã£ãŒãã£ã³ã°ã¯ããããäžè¬çã«ãªãã§ãããã ãã€ãã ãããã¯ãTON ã¯åã³æã¡äžãã XNUMX ãæ延æãã次ã®ãã©ãºãã°ã«ãŒãã¯æ¶æ» ãããããããŸããã ç§ãã¡ã¯æ¬¡ã®ããŒãããããä¿¡ããŠãå€ã«çŽ æŽããããã¯ã€ãããŒããŒãèªãããšã¯ã§ããŸãããä»ããã§ãç§ãã¡ãæã£ãŠãããã®ã§äœããããå¿ èŠããããŸãã ãã£ã¡ãŸãã
çŸåšã®ãããžã§ã¯ãã§ç§ãã¡ã®ããŒã ã«èšå®ãããã¿ã¹ã¯ã¯ãäžè¬çã«æ¬¡ã®ããã«ãªããŸããä¿¡é Œé¢ä¿ãæ§ç¯ããããªã被éšè ã¯æ°å人ã«äžããŸãã ç¹å¥ãªããã©ãŒãã³ã¹èŠä»¶ãå¿ èŠãšããã«éåžžã® PC ã§åäœããéäžäŒèšã·ã¹ãã ãšåçã®ãŠãŒã¶ãŒ ãšã¯ã¹ããªãšã³ã¹ãæäŸãããœãªã¥ãŒã·ã§ã³ã DLT äžã«æ§ç¯ããå¿ èŠããããŸãã ãœãªã¥ãŒã·ã§ã³ã®èåŸã«ãããã¯ãããžãŒã¯ãæªæã®ããããŒã¿æäœã®å¯èœæ§ãæå°éã«æããå¿ èŠããããŸããã ããããããããã¯ãã§ãŒã³ãç»å ŽããŸãã
ãã¯ã€ãããŒããŒãã¡ãã£ã¢ã®ã¹ããŒã¬ã³ã¯ã次ã®éçºã§ã¯ XNUMX ç§ãããæ°çŸäžä»¶ã®ãã©ã³ã¶ã¯ã·ã§ã³ãå¯èœã«ãªããšçŽæããŠããŸãã æ¬åœã®ãšããã¯äœã§ããããïŒ
ã¡ã€ã³ããã ã€ãŒãµãªã¢ã ã¯çŸåšãçŽ 30 tps ã§å®è¡ãããŠããŸãã ããã ãã§ã¯ãäŒæ¥ã®ããŒãºã«é©ãã圢ã§ãããã¯ãã§ãŒã³ãšããŠèªèããããšã¯å°é£ã§ãã èš±å¯ããããœãªã¥ãŒã·ã§ã³ã®äžã«ã¯ã2000 tps ã瀺ããã³ãããŒã¯ããããŸã (
ã¬ã€ãã³ã·
ãã©ã³ã¶ã¯ã·ã§ã³ãéå§ãããŠããã·ã¹ãã ã«ããæçµæ¿èªãŸã§ã®é 延ã¯ãã¡ãã»ãŒãžãæ€èšŒãšé åºä»ãã®ãã¹ãŠã®æ®µéãééããé床ã ãã§ãªãããããã¯åœ¢æãã©ã¡ãŒã¿ã«ãäŸåããŸãã ããšãç§ãã¡ã®ãããã¯ãã§ãŒã³ã 1000000 tps ã®é床ã§ã³ãããã§ãããšããŠãã10 MB ã®ãããã¯ãçæããã®ã« 488 åããããšããŠããããã¯ç°¡åã«ãªãã§ãããã?
Hyperledger Fabric ã®ãã©ã³ã¶ã¯ã·ã§ã³ ã©ã€ããµã€ã¯ã«ã詳ããèŠãŠãæéãã©ãã«è²»ããããããããããã¯çæãã©ã¡ãŒã¿ãŒã«ã©ã®ããã«é¢é£ããŠããããç解ããŸãããã
ããããåããã:
(1) ã¯ã©ã€ã¢ã³ãã¯ãã©ã³ã¶ã¯ã·ã§ã³ãäœæãããããæ¿èªãã¢ã«éä¿¡ããŸããåŸè ã¯ãã©ã³ã¶ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒãã (ãã§ãŒã³ã³ãŒãã«ãã£ãŠè¡ãããå€æŽãçŸåšã®ç¶æ ã«é©çšããŸãããå°åž³ã«ã¯ã³ãããããŸãã)ãRWSet (ããŒåãããŒãžã§ã³ãããã³å€) ãåãåããŸãã CouchDB ã®ã³ã¬ã¯ã·ã§ã³ããååŸããã( 2) ãšã³ããŒãµãŒã¯çœ²åããã RWSet ãã¯ã©ã€ã¢ã³ãã«éãè¿ããŸãã(3) ã¯ã©ã€ã¢ã³ãã¯ãå¿ èŠãªãã¹ãŠã®ã㢠(ãšã³ããŒãµãŒ) ã®çœ²åã®ååšã確èªããŠããããã©ã³ã¶ã¯ã·ã§ã³ãé åºä»ããµãŒãã¹ã«éä¿¡ããŸãã ããŸãã¯æ€èšŒãªãã§éä¿¡ããå Žå (ãã§ãã¯ã¯åŸã§è¡ãããŸã)ãé åºä»ããµãŒãã¹ã¯ãããã¯ã圢æãã( 4) ãšã³ããŒãµãŒã ãã§ãªããã¹ãŠã®ãã¢ã«éãè¿ããŸãã ãã¢ã¯ãèªã¿åãã»ããå ã®éµã®ããŒãžã§ã³ãããŒã¿ããŒã¹å ã®ããŒãžã§ã³ãšäžèŽããããšããã¹ãŠã®ãšã³ããŒãµãŒã眲åãæã£ãŠããããšã確èªããæåŸã«ãããã¯ãã³ãããããŸãã
ããããããã ãã§ã¯ãããŸããã ãé åºä»ãè ããããã¯ã圢æããããšããèšèã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®é åºã ãã§ãªãããªãŒããŒãããã©ãã¯ãŒãžããããŠãã®éãžã® 3 ã€ã®é£ç¶ãããããã¯ãŒã¯ ãªã¯ãšã¹ããé ããŸãããªãŒããŒã¯ã¡ãã»ãŒãžããã°ã«è¿œå ãããã©ãã¯ãŒã«éä¿¡ããåŸè ã¯ãããè¿œå ããŸãããã°ã«ã¬ããªã±ãŒã·ã§ã³æåã®ç¢ºèªãéä¿¡ãããªãŒããŒãã¡ãã»ãŒãžãã³ããããããã©ãã¯ãŒã«ã³ããã確èªãéä¿¡ãããã©ãã¯ãŒãã³ãããããŸãã ãããã¯åœ¢æã®ãµã€ãºãšæéãå°ããã»ã©ã泚æãµãŒãã¹ãã³ã³ã»ã³ãµã¹ã確ç«ããå¿ èŠãããé »åºŠãé«ããªããŸããã Hyperledger Fabric ã«ã¯ããããã¯åœ¢æã®ããã® XNUMX ã€ã®ãã©ã¡ãŒã¿ããããŸããBatchTimeout - ãããã¯åœ¢ææéãš BatchSize - ããã㯠ãµã€ãº (ãã©ã³ã¶ã¯ã·ã§ã³ã®æ°ãšãããã¯èªäœã®ãã€ãåäœã®ãµã€ãº)ã ããããã®ãã©ã¡ãŒã¿ãå¶éã«éãããšãããã«æ°ãããããã¯ã解æŸãããŸãã é åºããŒããå€ãã»ã©ãããã«ãããæéãé·ããªããŸãã ãããã£ãŠãBatchTimeout ãš BatchSize ãå¢ããå¿ èŠããããŸãã ãã ããRWSet ã¯ããŒãžã§ã³ç®¡çãããŠãããããäœæãããããã¯ã倧ãããªãã»ã©ãMVCC 競åãçºçããå¯èœæ§ãé«ããªããŸãã ããã«ãBatchTimeout ãå¢å ãããšãUX ãå£æ» çã«äœäžããŸãã ãããã®åé¡ã解決ããããã®æ¬¡ã®ã¹ããŒã ã¯ãç§ã«ãšã£ãŠåççã§æçœã§ããããã«æããŸãã
ãããã¯ã®ãã¡ã€ãã©ã€ãºãåŸ ããã«ãã©ã³ã¶ã¯ã·ã§ã³ã®ã¹ããŒã¿ã¹ã远跡ã§ããããã«ããæ¹æ³
圢ææéãšããã㯠ãµã€ãºãé·ãã»ã©ããããã¯ãã§ãŒã³ã®ã¹ã«ãŒãããã¯é«ããªããŸãã äžæ¹ãä»æ¹ããçŽæ¥ç¶ãããã§ã¯ãããŸããããRAFT ã§ã³ã³ã»ã³ãµã¹ã確ç«ããã«ã¯ããªãŒããŒãããã©ãã¯ãŒãžããããŠãã®ãªãŒããŒãããã©ãã¯ãŒãžã® XNUMX ã€ã®ãããã¯ãŒã¯ ãªã¯ãšã¹ããå¿ èŠã§ããããšãèŠããŠããå¿ èŠããããŸãã é åºããŒããå€ãã»ã©ãããã«ãããæéãé·ããªããŸãã ãããã¯åœ¢æã®ãµã€ãºãšæéãå°ããã»ã©ããã®ãããªçžäºäœçšãå€ããªããŸãã ãšã³ããŠãŒã¶ãŒã®ã·ã¹ãã å¿çæéãå¢å ãããã«ãçææéãšãããã¯ãµã€ãºãå¢ããã«ã¯ã©ãããã°ããã§ãããã?
ãŸããåãããŒãžã§ã³ã®ç°ãªã RWSet ãå«ãŸããå¯èœæ§ãããã倧ããªããã㯠ãµã€ãºã«ãã£ãŠåŒãèµ·ãããã MVCC 競åãäœããã®æ¹æ³ã§è§£æ±ºããå¿ èŠããããŸãã æããã«ãã¯ã©ã€ã¢ã³ãåŽ (ãããã¯ãã§ãŒã³ ãããã¯ãŒã¯ã«é¢ããŠèšãã°ãããã¯ããã¯ãšã³ãã§ããå¯èœæ§ãããããããããã¯ãšã³ãã§ããå¯èœæ§ããããŸã) ã§ã¯ã次ã®ããšãå¿ èŠã§ãã MVCC 競åãã³ãã©ãŒãå¥ã®ãµãŒãã¹ããŸãã¯åè©Šè¡ããžãã¯ã䜿çšããŠãã©ã³ã¶ã¯ã·ã§ã³ãéå§ããåŒã³åºãã®äžã®éåžžã®ãã³ã¬ãŒã¿ãŒã®ããããã«ããããšãã§ããŸãã
åè©Šè¡ã¯ææ°é¢æ°çãªæŠç¥ã§å®è£ ã§ããŸãããã¬ã€ãã³ã·ãåæ§ã«ææ°é¢æ°çã«äœäžããŸãã ãããã£ãŠãç¹å®ã®å°ããªå¶éå ã§ã©ã³ãã ãªåè©Šè¡ã䜿çšããããäžå®ã®åè©Šè¡ã䜿çšããå¿ èŠããããŸãã æåã®ãªãã·ã§ã³ã§ã¯è¡çªã®å¯èœæ§ãèæ ®ããŠã
次ã®ã¹ãããã§ã¯ãã¯ã©ã€ã¢ã³ããšã·ã¹ãã ã®å¯Ÿè©±ãéåæã«ããŠã15ã30ããŸã㯠10000000 ç§åŸ
æ©ããªãããã«ããŸããããã BatchTimeout ãšããŠèšå®ããŸãã ãããåæã«ããã©ã³ã¶ã¯ã·ã§ã³ã«ãã£ãŠéå§ãããå€æŽããããã¯ãã§ãŒã³ã«èšé²ãããŠãããã©ãããæ€èšŒããæ©èœãç¶æããå¿
èŠããããŸãã
ããŒã¿ããŒã¹ã䜿çšããŠãã©ã³ã¶ã¯ã·ã§ã³ã®ã¹ããŒã¿ã¹ãä¿åã§ããŸãã æãç°¡åãªãªãã·ã§ã³ã¯ã䜿ããããã®ç¹ã§ CouchDB ã§ããããŒã¿ããŒã¹ã«ã¯ããã«äœ¿çšã§ãã UI ãš REST API ããããã¬ããªã±ãŒã·ã§ã³ãšã·ã£ãŒãã£ã³ã°ãç°¡åã«èšå®ã§ããŸãã åã CouchDB ã€ã³ã¹ã¿ã³ã¹å
ã«ãFabric ã䜿çšããŠäžçã®ç¶æ
ãä¿åããå¥ã®ã³ã¬ã¯ã·ã§ã³ãäœæããã ãã§ãã ãã®ãããªçš®é¡ã®ææžãä¿ç®¡ããå¿
èŠããããŸãã
{
Status string // СÑаÑÑÑ ÑÑаМзакÑОО: "pending", "done", "failed"
TxID: string // ID ÑÑаМзакÑОО
Error: string // optional, ÑППбÑеМОе Пб ПÑОбке
}
ãã®ããã¥ã¡ã³ãã¯ããã©ã³ã¶ã¯ã·ã§ã³ããã¢ã«éä¿¡ãããåã«ããŒã¿ããŒã¹ã«æžã蟌ãŸããäœææäœã®å Žåã¯ãšã³ãã£ã㣠ID ããŠãŒã¶ãŒã«è¿ãããŸã (åã ID ãããŒãšããŠäœ¿çšãããŸã)ããã®åŸãã¹ããŒã¿ã¹ãTxIDãããã³ãšã©ãŒ ãã£ãŒã«ããé¢é£æ å ±ããã¢ããåä¿¡ããããšæŽæ°ãããŸãã
ãã®ã¹ããŒã ã§ã¯ããŠãŒã¶ãŒã¯ãããã¯ãæçµçã«åœ¢æãããã®ãåŸ
ããã«ãç»é¢äžã®å転ãã€ãŒã«ã 10 ç§éèŠãªãããã·ã¹ãã ããå³åº§ã«å¿çãåãåããäœæ¥ãç¶ããŸãã
ã¡ã¢ãªãç¯çŽããå¿
èŠããããç¹ã«ãã®ããåãããã¬ãŒã³ ããã¹ã ãããã³ã«ã䜿çšããŠè¡ãããå Žåãå¥ã®ããŒã¿ããŒã¹ ãµãŒããŒãšã®ãããã¯ãŒã¯ ã€ã³ã¿ã©ã¯ã·ã§ã³ã«æéãç¡é§ã«ããããªãããããã©ã³ã¶ã¯ã·ã§ã³ ã¹ããŒã¿ã¹ã®ä¿åã« BoltDB ãéžæããŸããã ã¡ãªã¿ã«ãCouchDB ã䜿çšããŠäžèšã®ã¹ããŒã ãå®è£
ããå Žåã§ããåã«äžçã®ç¶æ
ãä¿åããå Žåã§ãããããã®å Žåã§ããCouchDB ã«ããŒã¿ãä¿åããæ¹æ³ãæé©åããããšã¯æå³ããããŸãã CouchDB ã®ããã©ã«ãã§ã¯ãB ããªãŒ ããŒãã®ãµã€ãºã¯ 1279 ãã€ãã§ãããã¯ãã£ã¹ã¯äžã®ã»ã¯ã¿ãŒ ãµã€ãºãããã¯ããã«å°ãããããããªãŒã®èªã¿åããšãªãã©ã³ã¹ã®äž¡æ¹ã§ãã£ã¹ã¯ãžã®ç©çã¢ã¯ã»ã¹ãããå€ãå¿
èŠã«ãªããŸãã æé©ãªãµã€ãºã¯æšæºã«å¯Ÿå¿ããŸã
ããã¯ãã¬ãã·ã£ãŒ: ãããã¡ãŒæŠç¥
ããããããã«ã¯ããããã®ã¡ãã»ãŒãžãå«ãŸããŠããå¯èœæ§ããããŸãã ã·ã¹ãã ãåŠçã§ãã以äžã®ãªãœãŒã¹ããå³ã«ç€ºãããŠãããµãŒãã¹ä»¥å€ã«ãå€æ°ã®ä»ã®ãµãŒãã¹ãšå ±æããŸããããããã¹ãŠã¯ãIntellij Idea ã®å®è¡ãéåžžã«é¢åãªãã·ã³äžã§ãåé¡ãªãåäœããã¯ãã§ãã
éä¿¡ã·ã¹ãã ããããã¥ãŒãµãŒãšã³ã³ã·ã¥ãŒããŒã®å®¹éãç°ãªããšããåé¡ã¯ãããŸããŸãªæ¹æ³ã§è§£æ±ºãããŸãã äœãã§ãããèŠãŠã¿ãŸãããã
èœã¡ã: T ç§éã§æ倧 X åã®ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçã§ãããšäž»åŒµã§ããŸãã ãã®å¶éãè¶ ãããªã¯ãšã¹ãã¯ãã¹ãŠç Žæ£ãããŸãã ããã¯éåžžã«ã·ã³ãã«ã§ãããUX ã®ããšã¯å¿ããŠã倧äžå€«ã§ãã
å¶åŸ¡: ã³ã³ã·ã¥ãŒãã¯ãè² è·ã«å¿ããŠãããã¥ãŒãµã® TPS ãå¶åŸ¡ã§ãããããçš®ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæã£ãŠããå¿ èŠããããŸãã ããã¯æªããããŸããããè² è·ãäœæããã¯ã©ã€ã¢ã³ãã®éçºè ã«ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãã矩åã課ããããŸãã ãããã¯ãã§ãŒã³ã¯å°æ¥ãå€ãã®å€ãããååšããã·ã¹ãã ã«çµ±åãããããšã«ãªããããããã¯ç§ãã¡ã«ãšã£ãŠåãå ¥ããããããšã§ãã
ãããã¡ãªã³ã°: å ¥åããŒã¿ ã¹ããªãŒã ã«æµæãã代ããã«ããã®ã¹ããªãŒã ããããã¡ãªã³ã°ããå¿ èŠãªé床ã§åŠçã§ããŸãã åªãããŠãŒã¶ãŒ ãšã¯ã¹ããªãšã³ã¹ãæäŸãããå Žåããããæé©ãªãœãªã¥ãŒã·ã§ã³ã§ããããšã¯æããã§ãã RabbitMQ ã®ãã¥ãŒã䜿çšããŠãããã¡ãå®è£ ããŸããã
1 ã€ã®æ°ããã¢ã¯ã·ã§ã³ãã¹ããŒã ã«è¿œå ãããŸããã(2) API ãžã®ãªã¯ãšã¹ããå°çããåŸããã©ã³ã¶ã¯ã·ã§ã³ãåŒã³åºãããã«å¿
èŠãªãã©ã¡ãŒã¿ãŒãå«ãã¡ãã»ãŒãžããã¥ãŒã«é
眮ãããã¯ã©ã€ã¢ã³ãã¯ãã©ã³ã¶ã¯ã·ã§ã³ãåãå
¥ããããããšã瀺ãã¡ãã»ãŒãžãåãåããŸããã·ã¹ãã ã(XNUMX) ããã¯ãšã³ãã¯ãèšå®ã§æå®ãããé床ã§ãã¥ãŒããããŒã¿ãèªã¿åããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ãéå§ããã¹ããŒã¿ã¹ ã¹ãã¢å
ã®ããŒã¿ãæŽæ°ããŸãã
ããã§ã圢ææéãšãããã¯å®¹éã奜ããªã ãå¢ãããŠãé
延ããŠãŒã¶ãŒããé ãããšãã§ããŸãã
ãã®ä»ã®ããŒã«
ååãšããŠãã§ãŒã³ã³ãŒãã«ã¯æé©åãããã®ãäœããªããããããã§ã¯ãã§ãŒã³ã³ãŒãã«ã€ããŠã¯äœãè¿°ã¹ãããŠããŸããã ãã§ãŒã³ã³ãŒãã¯å¯èœãªéãã·ã³ãã«ãã€å®å
šã§ãªããã°ãªããŸãããå¿
èŠãªã®ã¯ããã ãã§ãã ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ããã§ãŒã³ã³ãŒããç°¡åãã€å®å
šã«äœæããã®ã«åœ¹ç«ã¡ãŸã
ããã«ãç§ãã¡ã®ããŒã ã¯ãFabric ã®æäœãç°¡åãã€æ¥œããããããã®äžé£ã®ãŠãŒãã£ãªãã£ãéçºããŠããŸãã
ãŸãšã
ãã®ã¢ãããŒãã«ãããHyperledger Fabric ã Quorumãä»ã®ãã©ã€ããŒã Ethereum ãããã¯ãŒã¯ (PoA ãŸã㯠PoW) ã«ç°¡åã«çœ®ãæããããšãã§ããå®éã®ã¹ã«ãŒãããã¯å€§å¹ ã«äœäžããŸãããåæã«éåžžã® UX (ãã©ãŠã¶ãŒã®ãŠãŒã¶ãŒãšçµ±åã·ã¹ãã ã®äž¡æ¹) ãç¶æã§ããŸãã ã¹ããŒã å ã®ãã¡ããªãã¯ãã€ãŒãµãªã¢ã ã«çœ®ãæããå Žåãåè©Šè¡ãµãŒãã¹/ãã³ã¬ãŒã¿ãŒã®ããžãã¯ã MVCC 競åã®åŠçããã¢ãããã¯ãªãã³ã¹å¢åãšåéä¿¡ã«å€æŽããã ãã§æžã¿ãŸãã ãããã¡ãªã³ã°ãšã¹ããŒã¿ã¹ ã¹ãã¬ãŒãžã«ãããå¿çæéããããã¯åœ¢ææéããåãé¢ãããšãå¯èœã«ãªããŸããã ããã§ãäœåãã®é åºããŒããè¿œå ã§ããããã«ãªãããããã¯ãé »ç¹ã«åœ¢æãããŠé åºä»ããµãŒãã¹ãèªã¿èŸŒãŸããããšãå¿é ããå¿ èŠããªããªããŸãã
åºæ¬çã«ãç§ãå
±æãããã£ãã®ã¯ããã ãã§ãã 誰ãã®ä»äºã®åèã«ãªãã°å¬ããã§ãã
åºæïŒ habr.com