ãã®çãèšäºã§ã¯ãäœäžãã®ããã«ã®ããŒã¿ããŒã¹ã«ããæ€çŽ¢ãšãã£ã«ã¿ãªã³ã°ã®ã¿ã¹ã¯ãåºçŸãã芳å ããŒã¿ã«ã®åºæºã«åŸã£ãŠãã»ãšãã©ã®ãªã³ã©ã€ã³ã¹ãã¢è£œåãã£ã«ã¿ãªã³ã°ã·ã¹ãã ã«ã¯ã©ã·ãã¯ãå®è£ ããçµéšãå ±æããããšæããŸããåã¿ã¹ã¯ã¯ãå€æ°ã®ãã©ã¡ãŒã¿ãŒãšæäŸãããæ°åã®ãµãŒãã¹ã®ååšã«ãã£ãŠèšè¿°ãããŸãäœçŸãã®å¯èœæ§ããã
åé¡ã®å£°æ
æ°äžã®ãªããžã§ã¯ãã®ããã«ã®ããŒã¿ããŒã¹ããããŸãã åããã«ã®èª¬æã¯æ¬¡ã®ãšããã§ãã
- ããããã«å°æ°ã®å¯èœãªãªãã·ã§ã³ããããã©ã¡ãŒã¿ã«è¿ãã ããšãã°ãããã«ã®æã®è©äŸ¡ïŒ1ã5ããŸãã¯ããã«ã®é£äºã®çš®é¡ïŒãããã®å€ãããããŸããã ãªã©ãªã©ã ããã§ã®é£ããã¯ãåããã«ã®äžéšã®ãã©ã¡ãŒã¿ãŒã«ã€ããŠã¯1ã€ã®å€ãã䜿çšã§ããªãããšãããã³äžéšã®å¯èœãªã»ããã«ã€ããŠã®ã¿ã§ãã ãã ããå¯èœãªãªãã·ã§ã³ã¯å°æ°ã§ãããããã¯ãŸã åé¡ã§ã¯ãããŸããã
- äŸ¡æ Œ ã¿ã¹ã¯ãç°¡çŽ åããããã«ãææ¥å°çããå Žåã®1æ¥2åã®æäœäŸ¡æ Œãåºæ¬äŸ¡æ ŒãšããŠæ¡çšãããŸãã ãããŠããã®äŸ¡æ Œã®ç¯å²ã¯0ïŒããããã...ïŒããæ倧ã§æ°åãŸã§ã§ãã ãã£ã«ã¿ãªã³ã°ã«ã¯ãããã€ãã®äŸ¡æ Œåž¯ããããŸãã ãããã£ãŠãäžå®ã®æéå ã«äŸ¡æ Œãäžããããã«ãæ¢ãå¿ èŠããããŸãã
- å°åæå±ã ç¶æ³ã¯ãã©ã°ã©ã1ãšåãã§ãããåºæºãåœãã®å¯èœãªãªãã·ã§ã³ã®æ°ã¯200ãããã³ãéœåžãã®æšå®ãªãã·ã§ã³ã¯ãã§ã«æ°åãšèŠç©ããããŠããŸãã ãã®ã¿ã¹ã¯ã¯ãåããã«ãåœãšéœåžã®ãã©ã¡ãŒã¿ãŒã«å¯ŸããŠç¬èªã®éèŠæ§ãæã€ãšããäºå®ã«ãã£ãŠä¿é²ãããŸãã
- ãããŠæåŸã«ãæãèå³æ·±ãã®ã¯ãããã«ãæäŸãããµãŒãã¹ã®ãªã¹ãã§ãã ãã®åé¡ã解決ãå§ããŠããµãŒãã¹ã®ãªã¹ãã¯700以äžã®ã¢ã€ãã ã§ããã æåã§ãäžèŠãªãã®ããã¹ãŠæšãŠããããšãšã°ã«ãŒãåã®å©ããåããŠããµãŒãã¹ã®æ°ã¯300ã«åæžãããŸãããããããå°ãªããããŸããã 次ã«ããããšãè ãããŠããããšã
å®éã«ã¯ãã¿ã¹ã¯ïŒããã«ã説æããå¯èœãªãã©ã¡ãŒã¿ãŒå€ã®ä»»æã®çµã¿åããã®ä»»æã®ã»ããã§ãã£ã«ã¿ãªã³ã°ãããã£ã«ã¿ãŒã®ãªã¹ãã衚瀺ãããšãã«ãåãã£ã«ã¿ãŒã®å察åŽã®ããã«ã®æ°ã衚瀺ããŸãã ãã£ã«ã¿ãŒã®åçµã¿åããã«ã¯æ確ãªURLã䜿çšããåçŸãããããã«ã®éžæãåæ ããå¿ èŠããããŸãã
æ°äžã®ãªããžã§ã¯ãã®æ°ãšçžå¯Ÿçãªéçæ å ±ã®æ¡ä»¶ã䜿çšããåºæºã«ããããã«ã®æ€çŽ¢ã¯ãåãªã¯ãšã¹ããæåã§åæ/æé©åããã€ã³ããã¯ã¹ãæ§ç¯ããããšã«ãããã»ãŒç¡çã§å®è£ ãããŸããæ£èŠåãããããŒã¿ããŒã¹ã®å Žåã¯20åã®ããŒãã«ããŸãã¯ãã¹ãéžæãããŠããå Žåã¯1ã€ã®ã¯ã€ãããŒãã«éæ£èŠåã«ããåé¡ã解決ããŸãã
ããããããã§ã¯ãæ€çŽ¢ãã©ã¡ãŒã¿ãŒã®å¯èœãªå€ããšã«ãµã³ãã«ã«è©²åœããããã«ã®æ°ãæ°ãããšãã圢ã®å°ããªãããããããããããã®å€ã®æ°ã1000ã«è¿ã¥ããšãæåã¯å°ããªæ··ä¹±ãåŒãèµ·ãããŸããã
ã¡ãã£ãšããçµã¿åãã
é ãéå»ã®äŸ¡æ Œã¢ã°ãªã²ãŒã¿ãŒã®åæ§ã®ã¿ã¹ã¯ã¯æ£é¢ãã解決ãããå€ãã®å¶éããããŸãããäºåã«èšç®ããããã£ã«ã¿ãŒã®çµã¿åãããšåçµã¿åããã®ååã®éãå«ã巚倧ãªããŒãã«ãããŒã¿ããŒã¹ã«ä¿åãããŸããã ããŒãã«ã¯æ¯æ©å®å šã«åèšç®ããããã®æäœã«ã¯ããªãé·ãæéãããããŸããã
ãã®å Žåãããšãã°ãåæã«èšå®ããããã£ã«ã¿ãŒã®æ°ãªã©ãå¶éã®ãªããããæ®éçãªããšãè¡ããŸãã ãã®ç¶æ ã¯ãªããããªã«éèŠãªã®ã§ããïŒ Excelãšçµã¿åããã®åºç€ç¥èãåãããã®è³ªåã«çããŸãã
ãã®ç®çã®ããã«ãExcelã«ã¯çŽ æŽãããæ©èœãNUMBER COMBãããããŸããããã¯ãéžæãããèŠçŽ ã®ç¹å®ã®æ°ã«å¯ŸããèŠçŽ ã®ç¹å®ã®æ°ã®çµã¿åããã®æ°ãè¿ããŸãã æ確ã«ããããã«ã10åã®èŠçŽ ãåããéžæãã1ã2ã3ãªã©ã®èŠçŽ ã®å¯èœãªçµã¿åããã®æ°ãæ€èšããŸãã ããŒãã«ãååŸããŸãã
1 | 10 |
2 | 45 |
3 | 120 |
4 | 210 |
5 | 252 |
6 | 210 |
7 | 120 |
8 | 45 |
9 | 10 |
10 | 1 |
åèšïŒ1023ãªãã·ã§ã³ã ãããã£ãŠãå¯èœãª10åã®ãã£ã«ã¿ãŒã«ã€ããŠã1023åã®ãã£ã«ã¿ãŒã®çµã¿åãããæã€ããŒãã«ãäœæããå¿ èŠããããŸããããããã®ãã£ã«ã¿ãŒã®çµã¿åããã«è©²åœããããã«ã®æ°ãèšç®ããå¿ èŠããããŸãã ãã¹ãŠã¯åé¡ãããŸãããããã£ã«ã¿ãŒã®æ°ãå¢ãããšããªãã·ã§ã³ã®æ°ãå¢ããŠå人çã«ã·ã§ãã¯ãåããŸããã
200ã«çãããµãŒãã¹æ°ïŒãã ãå®éã«ã¯ãã£ãšå€ããããŸãïŒããã³éžæãããµãŒãã¹ã®å¯èœãªæ°ã§ã10ã63床ã®çµã¿åããã®æ°ãååŸããŸãã ã€ãŸããèšç®ãããæ°ã®ããã«ã§10ååã®ãšã³ããªãä¿æããããŒãã«ãäœæããå¿ èŠããããŸãããã®ãšã³ããªãæ¯æ¥æŽæ°ããå¿ èŠããããŸãã
çµè«ïŒããããããã䜿çšããæ å ±ãæŽæ°ããããšã§ãããããŒã¿ããŒã¹ã«åæ§ã®ãã®ãä¿æããããšã¯ãéçŸå®çã§ãã ãŸããã å¥ã®æ¹æ³ãæ¢ãå¿ èŠããããŸãã
MongoDBã䜿çšãã
10åãè¶ ããããã«ã®äŸ¡æ Œãä¿åããããã«èŠ³å ããŒã¿ã«çšã®ããŒã¿ããŒã¹ãéžæããããšãã MongoDBã¯æåç·ã§ãã¹ããããŸããã åœæãç§ã¯äžèšã®ããŒã¹ã§ã³ãŒã¹ãå®äºããã°ããã§ããã¹ãŠãè¹è²ã«èŠããŸããïŒã·ã£ãŒãã£ã³ã°ãã¬ããªã±ãŒã·ã§ã³ãããã¥ã¡ã³ãæåããŒã¿ããŒã¹ãé«æ§èœ...ãããããã¹ãŠãå³åº§ã«ã¯ã©ãã·ã¥ããŸããïŒ ã³ã¬ã¯ã·ã§ã³ã¬ãã«ã§ã®ããã¯ã®ãã±ããã¯10genïŒå€æ°ã®è€åã€ã³ããã¯ã¹ãå«ãããã¥ã¡ã³ãã®éåžžã«é ã競åæ¿å ¥ïŒåœŒãã®æ±ãè¡çºãè¡ããŸããïŒå€ãã®å®éšã®åŸãããŒã¿ããŒã¹ã¯å€§ããªãããŠãã§ã¹ã¯ã©ããã«éãããŸããã ããã¯æ°žé ã«æããŸãã ãããã人çã§ãã°ãã°èµ·ããããã«ãåã¿ã¹ã¯ããšã«-ç¬èªã®ããŒã«ã ãããŠãMongoDbã¯ç¿Œã§åŸ ã£ãŠããŸããã
ãªãMongoDBãªã®ãïŒ
ã¿ã¹ã¯ã«ã€ããŠã¯ãã¹ããŒãã¬ã¹ã§ããã¥ã¡ã³ãæåã®Mongaã§ããããã以äžã«åªãããã®ã¯ãããŸãããåããã«ããä»»æã®å±æ§ã»ãããæã€ããã¥ã¡ã³ããšããŠè¡šããïŒéèŠïŒïŒåå±æ§ã®å€ã®é åãæ ŒçŽããæ©èœãåããŠããŸãã ã€ãŸããããã¥ã¡ã³ãå ã®é åã«è€æ°ã®å€ãåæã«ååŸã§ãããµãŒãã¹ããã³ãã®ä»ã®ãã©ã¡ãŒã¿ãŒã®ãªã¹ããæ ŒçŽãããããã®ã€ã³ããã¯ã¹ãäœæããããã¥ã¡ã³ãã®ã³ã¬ã¯ã·ã§ã³å šäœã§ä»»æã®æ€çŽ¢ãå®è¡ã§ããŸãã ãã¡ãããMongoDBã«å ããŠãä»ã®NoSQLããŒã¿ããŒã¹ã®ãªãã·ã§ã³ãæ€èšãããŸãããããã®ã·ã³ãã«ããšããã¥ã¡ã³ãå ã®ã³ã¬ã¯ã·ã§ã³ã§ã€ã³ããã¯ã¹æ€çŽ¢ãä¿åããã³å®è¡ããæ©èœã§åã£ãã®ã¯Mongaã§ããã
ããã«ã説æããããã¥ã¡ã³ãã®ããªãã³ã°ãããïŒhelloãNDAïŒæ§é ããããããŸãã
"_id" : ObjectId(), "hotel_id" : int, "country_id" : int, "city_id" : int, "category_id" : int, "services" : [int, int, int...]
çå ã«ãããšããã®ã³ã¬ã¯ã·ã§ã³ã¯ãMongovsky upsertã䜿çšããŠã¡ã€ã³ããŒã¿ããŒã¹ããã®æ å ±ã«åºã¥ããŠæŽæ°ãããŸãã
ãŸãããã®ã³ã¬ã¯ã·ã§ã³ãããä»»æã®ãã£ã«ã¿ãŒã»ãããæã€ããã«ã®ãªã¹ããååŸããã®ã«åé¡ã¯ãããŸããã äŸïŒ
- {country_idïŒ1ããµãŒãã¹ïŒ{$ allïŒ[10ã20]}}-åæã«ãµãŒãã¹10ãš20ãæã€åœ1ã®ãã¹ãŠã®ããã«ã
- {category_idïŒ5ããµãŒãã¹ïŒ{$ inïŒ[20ã30]}}-ãµãŒãã¹ã10ãŸãã¯20ã®ãã¹ãŠã®ã«ããŽãª5ããã«ã
ãµãŒãã¹ã ãã§ãªããããã«ã説æããä»ã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒã«å¯ŸããŠããŸã£ããåããã£ã«ã¿ãŒã圢æãããŸãã ãããã£ãŠã10é建ãŠã®SQLã¯ãšãªãã¡ã€ã³ããŒã¿ããŒã¹ã«æžã蟌ãå¿ èŠã¯ãããŸããã åæã«ãçç£æ§ã¯éåžžã«é«ãã¬ãã«ã®ãŸãŸã§ãã æ°åãŸãã¯æ°äžã®ããã¥ã¡ã³ãã®æ¯èŒçéçãªã³ã¬ã¯ã·ã§ã³ãšãé©åãªè€åã€ã³ããã¯ã¹ãšååãªRAMã«ãããMongoDBã¯çŽ æŽãããä»äºãããŸãã
ãããïŒ MapReduceã¯ãããšäœã®é¢ä¿ããããŸããïŒ
ãã®ããããã£ã«ã¿ãŒã䜿çšããŠGETãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ãŒã解æããåŸãMongoDbã§ããã«ã®ãªã¹ããååŸãããªã¯ãšã¹ããäœæã§ããŸãã ããã§ããã£ã«ã¿ãŒã®ãªã¹ããäœæããåãã£ã«ã¿ãŒã«è©²åœããããã«ã®æ°ãååŸããŸãã ãã®ããŒã«ã¯ãèšäºã®ã¿ã€ãã«MongoDBïŒMapReduceããæããã§ãã
MapReduceçè«ãé·ãéæããŠããŸããã ããŒã¿åŠçãžã®ãã®ã¢ãããŒãã¯ããããã³ã°ãšç³ã¿èŸŒã¿ã®2ã€ã®æ®µéã§æ§æãããŠããããšãæãåºããŠãã ããã ããã«ãåã¹ããŒãžã¯è€æ°ã®ã³ã¢/ããã»ããµ/ãµãŒããŒ/ã¯ã©ã¹ã¿ãŒã§äžŠè¡ããŠçºçããåäžã®ããŒã¿é åã§åäœããŸãã å ±æã¡ã¢ãªïŒãã®å Žåã¯Mongaã䜿çšïŒãä»ããŠãããã³ã°æäœã«ãã£ãŠããŒã¿ãæºåããããšããã®ããŒã¿ã¯æããããŸããæçµçãªåŠçãšç®çã®é åãžã®å€æãè¡ãããŸãã
ãã®çè«ãç解ãããšãå®éã«ã¯ãã¹ãŠãé©ãã»ã©ã·ã³ãã«ã«ãªããŸãã ãããã®ãœãŒã¹ã³ãŒããæå®ããã¡ãœãããæžãããŸãã
var map = function() { emit({"category": this.category_id}, 1); if (this.services) this.services.forEach(function(value) { emit({"service": value}, 1); }); if (this.types) this.types.forEach(function(value) { emit({"type": value}, 1); }); // âŠ................................. // And a large number of other filters }; var reduce = function(key, values) { return Array.sum(values); };
ã©ã®ããã«æ©èœããŸããïŒ
ãšãŠãç°¡åã§ãïŒ
MongoDbããŒã¿ããŒã¹ã«ä¿åãããŠããåããã«ã¯ãããã³ã°é¢æ°ã«å ¥ããåãµãŒãã¹/çš®é¡ã®é£ã¹ç©/ããã«ã®å ŽæïŒãªã¹ãå ãªã©ïŒã«å¯ŸããŠãemitïŒïŒé¢æ°ãåŒã³åºãããŸããããã¯ãã¡ã¢ãªã®é£æ³é åã«çªå·ã1ãã§è¿œå ãããŸããµãŒãã¹ã
éçãŸã§ã®ç³ã¿èŸŒã¿é¢æ°ã¯ç°¡åã§ãããããã³ã°æ®µéã§ååŸããé£æ³é åã®åèŠçŽ ã®æ°éã®æ¡ãåèšããŸãã
以äžã§ãïŒ
åºå£ã§ãåãµãŒãã¹ã®ããã«æ°ãèšç®ãããã¹ãŠã®ãµãŒãã¹ã®é åãååŸããŸãã ãã®æäœå šäœãå®å šã«äžŠåã§ãããšãããšããã®é åã®åœ¢æé床ã¯æ°åã®1ç§ã§ãã ãã¡ããããã£ãã·ã¥ãå¿ããªãã§ãã ããã ç§ãã¡ã®ã±ãŒã¹ã§ã¯ããã£ãã·ã³ã°ãæ倧éã«æŽ»çšã§ããŸãã æ å ±ã¯æ¯èŒçéçã§ãããéžæã¯ã¹ããŒã¹ãã»ãšãã©æ¶è²»ãããå ã®GETãªã¯ãšã¹ãã«åºã¥ããWhirlpoolããã·ã¥ããã®ããŒã«ãã£ãŠmemcachedã«å®å šã«ä¿åã§ããŸãã
äž»ãªããªãã¯ã¯ãMapReduceé¢æ°ãããã«ã³ã¬ã¯ã·ã§ã³ã®äžéšã«äœ¿çšã§ããããšã§ãã ã€ãŸã MapReduceé¢æ°ã䜿çšãããšãã«çæãããåããªã¯ãšã¹ãã䜿çšããŠããã«ã®ãªã¹ããååŸããããå°æ°ã®ããã«ã§ãã¹ãŠã®ã¢ã¯ã·ã§ã³ãé »ç¹ã«å®è¡ã§ããŸãã ãã®ã¢ãããŒãã®å¯äœçšãšããŠããµãŒãã¹ã¢ã¬ã€ã§ã¯ãç®çã®éžæã®ããã«ãæã€ãµãŒãã¹ã®ã¿ãåãåããçŸåšã®éžæã®ããã«ãæã€ãµãŒãã¹ã®ã¿ããµã€ãã®åé¢ã«éåžžã«ç°¡åã«è¡šç€ºã§ããŸããæçµçã«ãŠãŒã¶ããªãã£ã«ãã©ã¹ã®å¹æããããŸãã
æé©åããããšã¯å¯èœã§ããïŒ
ã¯ããã§ããŸãã å®éã«ã¯ãå€æ°ã®ããã«ïŒããšãã°10äžä»¶ïŒãåŠçããåããã«ã«åèš100åã®ãã©ã¡ãŒã¿ãŒå€ã®ã»ãããããå Žåã1000äžåã®åŒã³åºãïŒïŒãè¡ãããŸãã䞊ååã®ããã ãããŠè§£æ±ºçãèŠã€ãããŸããïŒ
var map = function() { var obj = { "categories": {}, "services": {} // Other params }; if (this.category_id > 0) obj.categories[this.category_id] = 1; var attrs = ["services", "types"]; for (var i = 0; i < 2; i++) { var attrKey = attrs[i]; var attrsArray = this[attrKey]; for (var key in attrsArray) { obj[attrKey][attrsArray[key]] = 1; } } emit("attrs", obj); }; var reduce = function(key, values) { var obj = { "categories": {}, "services": {} // Other params }; var attrs = ["categories", "services"]; for (var j = 0; j<2; j++) { attrObjArray = []; for (var i = 0; i < values.length; i++) { attrValuesArray = values[i][attrs[j]]; for (var attrKey in attrValuesArray) { var val = parseInt(attrValuesArray[attrKey]); if (!attrObjArray[attrKey]) { attrObjArray[attrKey] = val; } else { attrObjArray[attrKey] += val; } } } finalAttrObj = {}; for (i = 0; i < attrObjArray.length; i++) { var val = attrObjArray[i]; if (val) { finalAttrObj[i] = val; } } obj[attrs[j]] = finalAttrObj; } return obj; };
æé©åããããœãªã¥ãŒã·ã§ã³ã§ã¯ãè€æ°ã®æŸåºã®ä»£ããã«ããããã³ã°æäœããšã«ããã«ã®ãã©ã¡ãŒã¿ãŒããªããžã§ã¯ãã«ããã±ãŒãžåããããªããžã§ã¯ããæŸåºã«è»¢éãããã¢ã³ããã¯ãã«ãŠã³ããããã³ç³ã¿èŸŒã¿ãå®è¡ãããŸãã èŠèŠçã«ã¯ããœãªã¥ãŒã·ã§ã³ã¯ã¯ããã«å°é£ã§ããããšãå€æããŸããããããã±ãŒãžã®æ°ã¯ããã«ã®æ°ã«åæžãããŸããã åœç¶ããªããžã§ã¯ãã®æ¢±å ãšé梱ã®ããé£ããæäœã®ããã ãã®çµæããã®ãœãªã¥ãŒã·ã§ã³ã¯éåžžã«å€§ããªããã«ã®ãµã³ãã«ã§ã®ã¿å¹æçã«æ©èœãããµã³ãã«ã§æ倧1äžã®ããã«ã倱ãããšãä¿èšŒãããŸãã ç§ãã¡ã®ãããžã§ã¯ãã®çŸå®ã«åºã¥ããŠãããããã®ã±ãŒã¹ã§ç°ãªãã¿ã€ãã®MapReduceã®äžèŠãªãã§ãã¯ãšåŒã³åºãã§ã³ãŒããç©ã¿äžããããã®ã¡ãœããããä¿çãã®ãŸãŸã«ããããšã決å®ããŸããã
次ã¯ïŒ
ãã¡ããããã®èšäºã§ã¯ãããã«ã®ãµã³ãã«ãååŸããŠãã£ã«ã¿ãªã³ã°ã·ã¹ãã ãæ§ç¯ããåºæ¬çãªååã®ã¿ã説æããŸããããã¯ãæåã¯ããã«ã®äŸ¡æ ŒãMongoDBã«ä¿åããããšããä»®å®ã«ããå€§å¹ ã«ç°¡çŽ åãããŸããã å®éããã¹ãŠãããè€éã§ããããŠãŒã¶ãŒãäŸ¡æ Œã§ãã£ã«ã¿ãŒãéžæãããšãæ¬åœã®éæ³ãå§ãŸããŸãããµãŒãã¹ãã£ã«ã¿ãŒã«è©²åœããç¹å®ã®ééããç¹å®ã®äººæ°/æ³/æ¥ä»ã®äŸ¡æ Œã®ãã¹ãŠã®ããã«ãèŠã€ããããšãå¿ èŠã«ãªããŸãã ç¹ã«ãããã«ã®äŸ¡æ Œã¯RESTãµãŒãã¹ãžã®ãªã¯ãšã¹ãã䜿çšããŠååŸãããããšãèæ ®ããŠãã ããã æ°çŸäžã®ããŒã¿ããŒã¹ãæäœãããã®éæ³ãšãã³ãŒã«ããã£ãã·ã¥ãšæãé£ããã¯ãšãªã§æ倧100ããªç§ã®å¿çæéãéæããæ¹æ³ã«ã€ããŠã¯ã次ã®èšäºã§ããã£ãããšå ¬éããäºå®ã§ãã
åèš
MongoDBãšMapReduceã䜿çšããŠãéåžžã«äœ¿ãããããªãœãŒã¹ãéåžžã«ç解ãããããæ¡åŒµæ§ã®é«ããœãªã¥ãŒã·ã§ã³ãäœæããããšãã§ããŸããã
ç§ã¯è³ªåã«åãã§ããã§ãããïŒ
ãæž èŽããããšãããããŸããïŒ