èªå·±èå¥
ç§ã®ååã¯ã¢ã¬ã¯ãµã³ããŒã§ããRosbankã°ã«ãŒãã®å éšç£æ»ãç®çãšããŠãããŒã¿ããã³ãã¯ãããžãŒåæã®æ¹åæ§ãéçºããŠããŸããç§ã®ããŒã ãšç§ã¯ãæ©æ¢°åŠç¿ãšãã¥ãŒã©ã«ãããã¯ãŒã¯ã䜿çšããŠãå éšç£æ»ç£æ»ã®äžç°ãšããŠãªã¹ã¯ãç¹å®ããŠããŸããç§ãã¡ã®å µåšåº«ã«ã¯ããµãŒããŒã300 GBã®RAMãš10ã³ã¢ã®4ã€ã®ããã»ããµãŒããããŸããã¢ã«ãŽãªãºã ã®ããã°ã©ãã³ã°ãŸãã¯ã¢ããªã³ã°ã«ã¯ãPythonã䜿çšããŸãã
åæžã
éè¡ååã®ç»é²æã«éè¡å¡ãæ®åœ±ãã顧客ã®åçïŒèåç»ïŒãåæãããšãã課é¡ã«çŽé¢ããŸãããç§ãã¡ã®ç®æšã¯ããããã®åçãã以åã«çºèŠããããªã¹ã¯ãç¹å®ããããšã§ãããªã¹ã¯ãç¹å®ããããã«ãäžé£ã®ä»®èª¬ãçæããŠãã¹ãããŸãããã®èšäºã§ã¯ãç§ãã¡ãæãã€ãã仮説ãšãããããã¹ãããæ¹æ³ã«ã€ããŠèª¬æããŸããçŽ æã®ç¥èŠãåçŽåããããã«ãç§ã¯ã¢ããªãµã䜿çšããŸã-ããã¯èåç»ã®ãžã£ã³ã«ã®æšæºã§ãã
åèšã確èª
æåã¯ããã¡ã€ã«ã®ãã§ãã¯ãµã ãæ¯èŒããã ãã§ãæ©æ¢°åŠç¿ãã³ã³ãã¥ãŒã¿ãŒããžã§ã³ã䜿çšããªãã¢ãããŒããæ¡çšããŸãããããããçæããããã«ãhashlibã©ã€ãã©ãªããåºã䜿çšãããŠããmd5ã¢ã«ãŽãªãºã ãååŸããŸããã
Python *ã®å®è£ ïŒ
#
with open(file,'rb') as f:
#
for chunk in iter(lambda: f.read(4096),b''):
#
hash_md5.update(chunk)
ãã§ãã¯ãµã ãäœæãããšããããã«èŸæžã䜿çšããŠéè€ããã§ãã¯ããŸãã
#
for file in folder_scan(for_scan):
#
ch_sum = checksum(file)
#
if ch_sum in list_of_uniq.keys():
# , , dataframe
df = df.append({'id':list_of_uniq[chs],'same_checksum_with':[file]}, ignore_index = True)
ãã®ã¢ã«ãŽãªãºã ã¯ãèšç®è² è·ã®ç¹ã§éåžžã«åçŽã§ãããµãŒããŒã§ã¯ã1000åã®ç»åã3ç§ä»¥å ã«åŠçãããŸãã
ãã®ã¢ã«ãŽãªãºã ã¯ãããŒã¿ã®äžããéè€ããåçãç¹å®ããã®ã«åœ¹ç«ã¡ããã®çµæãéè¡ã®ããžãã¹ããã»ã¹ãæ¹åã§ããå¯èœæ§ã®ããå ŽæãèŠã€ããããšãã§ããŸããã
ããŒãã€ã³ãïŒã³ã³ãã¥ãŒã¿ãŒããžã§ã³ïŒ
ãã§ãã¯ãµã æ³ã®è¯å®çãªçµæã«ãããããããç»åã®å°ãªããšã1ã€ã®ãã¯ã»ã«ãå€æŽããããšããã®ãã§ãã¯ãµã ã¯æ ¹æ¬çã«ç°ãªãããšãå®å šã«ç解ããŸãããæåã®ä»®èª¬ã®è«ççãªå±éãšããŠãç»åããããæ§é ã§å€æŽã§ãããšä»®å®ããŸãããã€ãŸããåä¿åïŒã€ãŸããjpgã®åå§çž®ïŒããµã€ãºå€æŽãããªãã³ã°ããŸãã¯å転ãè¡ããŸãã
ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã«ãèµ€ã茪éã«æ²¿ã£ãŠãšããžãããªãã³ã°ããã¢ããªãµãå³ã«90床å転ãããŸãããã
ãã®å Žåãç»åã®èŠèŠçã³ã³ãã³ãã«ãã£ãŠéè€ãæ€çŽ¢ããå¿ èŠããããŸãããã®ããã«ãç»åã®ããŒãã€ã³ããäœæããããŒãã€ã³ãéã®è·é¢ãèŠã€ããæ¹æ³ã§ããOpenCVã©ã€ãã©ãªã䜿çšããããšã«ããŸãããå®éã«ã¯ãéèŠãªãã€ã³ãã¯ãã³ãŒããŒãè²ã®ã°ã©ããŒã·ã§ã³ããŸãã¯è¡šé¢ã®ãžã§ã°ã§ããç§ãã¡ã®ç®çã®ããã«ãæãåçŽãªæ¹æ³ã®1ã€ã§ããBrute-ForceMatchingãç»å ŽããŸãããç»åã®èŠç¹éã®è·é¢ã枬å®ããããã«ãããã³ã°è·é¢ã䜿çšããŸããã次ã®å³ã¯ãå ã®ç»åãšå€æŽãããç»åã§ããŒãã€ã³ããæ€çŽ¢ããçµæã瀺ããŠããŸãïŒç»åã®æãè¿ã20åã®ããŒãã€ã³ããæç»ãããŠããŸãïŒã
ã¹ã¯ãªããã®å®è¡æéãæé©åããéèŠãªãã€ã³ãã®ããæ確ãªè§£éãæäŸãããããçœé»ãã£ã«ã¿ãŒã§ç»åãåæããŠããããšã«æ³šæããããšãéèŠã§ããäžæ¹ã®ç»åã«ã»ãã¢ãã£ã«ã¿ãŒããããããäžæ¹ã®ç»åããªãªãžãã«ã®ã«ã©ãŒã§ããå Žåãããããçœé»ãã£ã«ã¿ãŒã«å€æãããšãè²åŠçããã£ã«ã¿ãŒã«é¢ä¿ãªããéèŠãªãã€ã³ããç¹å®ãããŸãã
2ã€ã®ç»åãæ¯èŒããããã®ãµã³ãã«ã³ãŒã*
img1 = cv.imread('mona.jpg',cv.IMREAD_GRAYSCALE) #
img2 = cv.imread('mona_ch.jpg',cv.IMREAD_GRAYSCALE) #
# ORB
orb = cv.ORB_create()
# ORB
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
# Brute-Force Matching
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
# .
matches = bf.match(des1,des2)
# .
matches = sorted(matches, key = lambda x:x.distance)
# 20
img3 = cv.drawMatches(img1,kp1,img2,kp2,matches[:20],None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3),plt.show()
çµæããã¹ããããšãããããªããç»åã®å ŽåãããŒãã€ã³ãå ã®ãã¯ã»ã«ã®é åºãå€åãããã®ãããªç»åãåããã®ãšããŠèå¥ãããªãããšãããããŸããã代åãšããŠãåç»åãèªåã§ãã©ãŒãªã³ã°ããŠã2åïŒãŸãã¯3åïŒã®ããªã¥ãŒã ãåæã§ããŸããããã¯ãèšç®èœåã®ç¹ã§ã¯ããã«é«äŸ¡ã§ãã
ãã®ã¢ã«ãŽãªãºã ã¯èšç®ãéåžžã«è€éã§ããããã€ã³ãéã®è·é¢ãèšç®ããæäœã«ãã£ãŠæ倧ã®è² è·ãçºçããŸããåç»åããããããšæ¯èŒããå¿ èŠãããããããç解ã®ãšããããã®ãããªã«ã«ãã·ã¢ã³ã»ããã®èšç®ã«ã¯ãå€æ°ã®èšç®ãµã€ã¯ã«ãå¿ èŠã§ããããç£æ»ã§ã¯ãåæ§ã®èšç®ã«1ãæ以äžããããŸããã
ãã®ã¢ãããŒãã®ãã1ã€ã®åé¡ã¯ããã¹ãçµæã®è§£éãæªãããšã§ãããç»åã®èŠç¹éã®è·é¢ã®ä¿æ°ãååŸãããšããç»åãè€è£œãããŠãããšèŠãªãã«ã¯ããã®ä¿æ°ã®ã©ã®ãããå€ãéžæããå¿ èŠããããŸããïŒããšããçåãçããŸãã
ã³ã³ãã¥ãŒã¿ãŒããžã§ã³ã䜿çšããŠãæåã®ãã§ãã¯ãµã ãã¹ãã§ã«ããŒãããªãã£ãã±ãŒã¹ãèŠã€ããããšãã§ããŸãããå®éã«ã¯ããããã¯ä¿åãããããjpgãã¡ã€ã«ã§ããããšãå€æããŸãããåæãããããŒã¿ã»ããã§ã¯ãç»åå€æŽã®ããè€éãªã±ãŒã¹ã¯ç¹å®ãããŸããã§ããã
ãã§ãã¯ãµã VSããŒãã€ã³ã
éè€ãèŠã€ããŠããã€ãã®ãã§ãã¯ã§åå©çšããããã®2ã€ã®æ ¹æ¬çã«ç°ãªãã¢ãããŒããéçºããçµæãããŒã¿ã®å Žåããã§ãã¯ãµã ã¯ããå ·äœçãªçµæãããçãæéã§æäŸãããšããçµè«ã«éããŸããããããã£ãŠã確èªããæéãååã«ããå Žåã¯ãéèŠãªãã€ã³ãã§æ¯èŒããŸãã
ç°åžžãªç»åãæ€çŽ¢ãã
ããŒãã€ã³ãã®ãã¹ãçµæãåæãããšããã1人ã®åŸæ¥å¡ãæ®åœ±ããåçã«ã¯ãã»ãŒåãæ°ã®è¿ãããŒãã€ã³ããããããšãããããŸããããããŠãããã¯è«ççã§ãããªããªãã圌ãè·å Žã®ã¯ã©ã€ã¢ã³ããšéä¿¡ããåãéšå±ã§åçãæ®ããšããã¹ãŠã®åçã®èæ¯ãåãã«ãªãããã§ãããã®èŠ³å¯ããããã®åŸæ¥å¡ã®ä»ã®åçãšã¯ç°ãªãããªãã£ã¹ã®å€ã§æ®åœ±ãããå¯èœæ§ã®ããäŸå€çãªåçãèŠã€ããå¯èœæ§ããããšç§ãã¡ã¯ä¿¡ããŸããã
ã¢ããªãµã®äŸã«æ»ããšãä»ã®äººãåãèæ¯ã«è¡šç€ºãããããšãããããŸãããã ããæ®å¿µãªããããã®ãããªäŸã¯èŠã€ãããŸããã§ããããã®ã»ã¯ã·ã§ã³ã§ã¯ãäŸãªãã§ããŒã¿ã¡ããªãã¯ã瀺ããŸãããã®ä»®èª¬ããã¹ããããã¬ãŒã ã¯ãŒã¯å ã§èšç®é床ãäžããããã«ãããŒãã€ã³ããç Žæ£ããŠãã¹ãã°ã©ã ã䜿çšããããšã«ããŸããã
æåã®ã¹ãããã¯ãç»åãããã¹ãã°ã©ã éã®è·é¢ã§ç»åãæ¯èŒããããã«æž¬å®ã§ãããªããžã§ã¯ãïŒãã¹ãã°ã©ã ïŒã«å€æããããšã§ããåºæ¬çã«ããã¹ãã°ã©ã ã¯ç»åã®æŠèŠã瀺ãã°ã©ãã§ããããã¯ã暪軞ïŒX軞ïŒã«ãã¯ã»ã«å€ãããã瞊軞ïŒY軞ïŒã«æ²¿ã£ãŠç»åå ã®å¯Ÿå¿ãããã¯ã»ã«æ°ãããã°ã©ãã§ãããã¹ãã°ã©ã ã¯ãç»åã解éããã³åæããç°¡åãªæ¹æ³ã§ããåçã®ãã¹ãã°ã©ã ã䜿çšãããšãã³ã³ãã©ã¹ããæããã匷床ååžãªã©ã®çŽæçãªã¢ã€ãã¢ãåŸãããšãã§ããŸã
ç»åããšã«ãOpenCVã®calcHisté¢æ°ã䜿çšããŠãã¹ãã°ã©ã ãäœæããŸãã
histo = cv2.calcHist([picture],[0],None,[256],[0,256])
3ã€ã®ç»åã®äŸã§ã¯ã氎平軞ïŒãã¹ãŠã®ã¿ã€ãã®ãã¯ã»ã«ïŒã«æ²¿ã£ãŠ256ã®èŠçŽ ã䜿çšããŠãããã説æããŸããããã ãããã¯ã»ã«ãåé 眮ããããšãã§ããŸãã 256ã®èŠçŽ ã䜿çšããå Žåã®çµæã¯ããªãè¯å¥œã ã£ãããããã®éšåã§ã¯å€ãã®ãã¹ããè¡ããŸããã§ãããå¿ èŠã«å¿ããŠãcalcHisté¢æ°ã§ãã®ãã©ã¡ãŒã¿ãŒãçŽæ¥å€æŽã§ããŸãã
åç»åã®ãã¹ãã°ã©ã ãäœæããããã¯ã©ã€ã¢ã³ããæ®åœ±ããååŸæ¥å¡ã®ç»åããDBSCANã¢ãã«ãç°¡åã«ãã¬ãŒãã³ã°ã§ããŸããããã§ã®æè¡çãªãã€ã³ãã¯ãã¿ã¹ã¯ã®DBSCANãã©ã¡ãŒã¿ãŒïŒepsilonããã³min_samplesïŒãéžæããããšã§ãã
DBSCANã䜿çšããåŸãç»åã¯ã©ã¹ã¿ãªã³ã°ãå®è¡ããPCAã¡ãœãããé©çšããŠçµæã®ã¯ã©ã¹ã¿ãŒãèŠèŠåã§ããŸãã
åæãããç»åã®ååžãããããããã«ã2ã€ã®é¡èãªéãã¯ã©ã¹ã¿ãŒããããŸããçµå±ã®ãšãããåŸæ¥å¡ã¯ããŸããŸãªæ¥ã«ããŸããŸãªãªãã£ã¹ã§åãããšãã§ããŸãããªãã£ã¹ã®1ã€ã§æ®åœ±ãããåçã¯ãå¥ã®ã¯ã©ã¹ã¿ãŒãäœæããŸãã
ç·ã®ç¹ã¯äŸå€çãªåçã§ãããèæ¯ã¯ãããã®ã¯ã©ã¹ã¿ãŒãšã¯ç°ãªããŸãã
åçã詳现ã«åæãããšãããåœé°æ§ã®åçãå€æ°èŠã€ãããŸãããæãäžè¬çãªã±ãŒã¹ã¯ãå¹ãé£ã°ãããåçããŸãã¯é åã®å€§éšåãã¯ã©ã€ã¢ã³ãã®é¡ã§å ããããŠããåçã§ãããã®åææ¹æ³ã§ã¯ãçµæãæ€èšŒããããã«åŒ·å¶çãªäººéã®ä»å ¥ãå¿ èŠã§ããããšãå€æããŸããã
ãã®ã¢ãããŒãã䜿çšãããšãåçã«èå³æ·±ãç°åžžãèŠã€ããããšãã§ããŸãããçµæãæåã§åæããã«ã¯æéãããããŸãããããã®çç±ãããç£æ»ã®äžç°ãšããŠãã®ãããªãã¹ããå®è¡ããããšã¯ãã£ãã«ãããŸããã
åçã«é¡ã¯ãããŸããïŒïŒé¡æ€åºïŒ
ãããã£ãŠããã§ã«ããŸããŸãªåŽé¢ããããŒã¿ã»ããããã¹ããããã¹ãã®è€éããéçºãç¶ããŠã次ã®ä»®èª¬ã«é²ã¿ãŸããåçã«èŠèŸŒã¿é¡§å®¢ã®é¡ããããŸããïŒç§ãã¡ã®ä»äºã¯ãåçã®äžã®é¡ãèå¥ããåçã®å ¥åã«é¢æ°ãäžããåºåã§é¡ã®æ°ãååŸããæ¹æ³ãåŠã¶ããšã§ãã
ãã®çš®ã®å®è£ ã¯ãã§ã«ååšããŠãããGoogleã®FaceNetã¢ãžã¥ãŒã«ããã¿ã¹ã¯ã«MTCNNïŒMultitasking Cascade Convolutional Neural NetworkïŒãéžæããããšã«ããŸããã
FaceNetã¯ãç³ã¿èŸŒã¿å±€ã§æ§æãããæ·±ãæ©æ¢°åŠç¿ã¢ãŒããã¯ãã£ã§ããFaceNetã¯ãåé¢ã«å¯ŸããŠ128次å ã®ãã¯ãã«ãè¿ããŸããå®éãFaceNetã¯ãããã€ãã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ã§ããããããã®ãããã¯ãŒã¯ã®äžéçµæãæºåããã³åŠçããããã®äžé£ã®ã¢ã«ãŽãªãºã ã§ãããã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ã«ããé¡æ€çŽ¢ã®ä»çµã¿ã«ã€ããŠã¯ãè³æãããŸããªãããã詳ãã説æããããšã«ããŸããã
ã¹ããã1ïŒååŠç
MTCNNãæåã«è¡ãããšã¯ãè€æ°ã®ãµã€ãºã®åçãäœæããããšã§ãã
MTCNNã¯ãååçã®åºå®ãµã€ãºã®æ£æ¹åœ¢å ã®é¡ãèªèããããšããŸããç°ãªããµã€ãºã®åãåçã§ãã®èªèã䜿çšãããšãåçå ã®ãã¹ãŠã®é¡ãæ£ããèªèããå¯èœæ§ãé«ããªããŸãã
é¡ã¯éåžžã®ç»åãµã€ãºã§ã¯èªèãããªãå ŽåããããŸãããåºå®ãµã€ãºã®æ£æ¹åœ¢ã®å¥ã®ãµã€ãºã®ç»åã§ã¯èªèãããå ŽåããããŸãããã®ã¹ãããã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯ãªãã§ã¢ã«ãŽãªãºã çã«å®è¡ãããŸãã
ã¹ããã2ïŒP-Net
åçã®ããŸããŸãªã³ããŒãäœæããåŸãæåã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ã§ããP-Netãç»å ŽããŸãããã®ãããã¯ãŒã¯ã¯12x12ã«ãŒãã«ïŒãããã¯ïŒã䜿çšããŠãå·Šäžé ãããã¹ãŠã®åçïŒåãåçã®ã³ããŒã§ããããµã€ãºãç°ãªããŸãïŒãã¹ãã£ã³ãã2ãã¯ã»ã«ã®å¢åã䜿çšããŠç»åã«æ²¿ã£ãŠç§»åããŸãã
ç°ãªããµã€ãºã®ãã¹ãŠã®åçãã¹ãã£ã³ããåŸãMTCNNã¯åã³ååçãæšæºåãããããã¯åº§æšãåèšç®ããŸãã
P-Netã¯ããããã¯ã®åº§æšãšãåãããã¯ã«å«ãŸããé¢ã«å¯Ÿããä¿¡é Œã¬ãã«ïŒãã®é¢ã®ç²ŸåºŠïŒãæäŸããŸãããããå€ãã©ã¡ãŒã¿ãŒã䜿çšããŠãç¹å®ã®ã¬ãã«ã®ä¿¡é Œã§ãããã¯ãæ®ãããšãã§ããŸãã
åæã«ãç»åã«ã¯è€æ°ã®é¡ãå«ãŸããŠããå¯èœæ§ããããããä¿¡é ŒåºŠãæ倧ã®ãããã¯ãåçŽã«éžæããããšã¯ã§ããŸããã
1ã€ã®ãããã¯ãå¥ã®ãããã¯ãšéãªããã»ãŒåãé åãã«ããŒããŠããå Žåããã®ãããã¯ã¯åé€ãããŸãããã®ãã©ã¡ãŒã¿ã¯ããããã¯ãŒã¯ã®åæåäžã«å¶åŸ¡ã§ããŸãã
ãã®äŸã§ã¯ãé»è²ã®ãããã¯ãåé€ãããŸããåºæ¬çã«ãP-Netã¯äœç²ŸåºŠã®ãããã¯ã«ãªããŸãã以äžã®äŸã¯ãP-Netã®å®éã®çµæã瀺ããŠããŸãã
ã¹ããã3ïŒR-Net
R-Netã¯ãP-Netã®äœæ¥ã®çµæãšããŠåœ¢æãããæãé©åãªãããã¯ã®éžæãå®è¡ããŸããããã¯ãã°ã«ãŒãå ã§ã¯ãããã人ã§ããR-Netã¯P-Netãšåæ§ã®ã¢ãŒããã¯ãã£ãåããŠããŸãããã®æ®µéã§ãå®å šã«æ¥ç¶ãããå±€ã圢æãããŸããR-Netããã®åºåãP-Netããã®åºåãšåæ§ã§ãã
ã¹ããã4ïŒO-Net
O-Netãããã¯ãŒã¯ã¯ãMTCNNãããã¯ãŒã¯ã®æåŸã®éšåã§ããæåŸã®2ã€ã®ãããã¯ãŒã¯ã«å ããŠãåé¢ïŒç®ã錻ãåã®è§ïŒã«5ã€ã®ãã€ã³ãã圢æããŸãããããã®ãã€ã³ããå®å šã«ãããã¯ã«è©²åœããå Žåããã®äººãå«ãŸããŠããå¯èœæ§ãæãé«ããšå€æãããŸããè¿œå ã®ãã€ã³ãã¯éã§ããŒã¯ãããŠããŸãïŒ
ãã®çµæããããé¡ã§ãããšããäºå®ã®æ£ç¢ºãã瀺ãæçµãããã¯ãåŸãããŸããé¡ãèŠã€ãããªãå Žåã¯ãé¡ãããã¯ã®æ°ã¯ãŒãã«ãªããŸãã
ãã®ãããªãããã¯ãŒã¯ã«ãã1000æã®åçã®åŠçã¯ããµãŒããŒäžã§å¹³å6åããããŸãã
ç§ãã¡ã¯ãã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ãç¹°ãè¿ããã§ãã¯ã«äœ¿çšããŠãããã¯ã©ã€ã¢ã³ãã®åçã®äžããç°åžžãèªåçã«ç¹å®ããã®ã«åœ¹ç«ã¡ãŸããã
FaceNetã®äœ¿çšã«ã€ããŠãã¢ããªãµã®ä»£ããã«ã¬ã³ãã©ã³ãã®ãã£ã³ãã¹ã®åæãéå§ãããšãçµæã¯æ¬¡ã®ç»åã®ããã«ãªããèå¥ããã人ç©ã®ãªã¹ãå šäœã解æããå¿ èŠãããããšãä»ãå ããããšæããŸãã
çµè«
ãããã®ä»®èª¬ãšãã¹ãã¢ãããŒãã¯ã絶察ã«ãã¹ãŠã®ããŒã¿ã»ããã䜿çšããŠãèå³æ·±ããã¹ããå®è¡ããç°åžžãæ¢ãããšãã§ããããšã瀺ããŠããŸããçŸåšãå€ãã®ç£æ»äººãåæ§ã®ææ³ãéçºããããšããŠãããããã³ã³ãã¥ãŒã¿ãŒããžã§ã³ãšæ©æ¢°åŠç¿ã䜿çšããå®éçãªäŸã瀺ããããšæããŸããã
ãŸããé¡èªèããã¹ãã®æ¬¡ã®ä»®èª¬ãšèŠãªããããšãä»ãå ããŠãããŸããããããŸã§ã®ãšãããããŒã¿ãšããã»ã¹ã®è©³çŽ°ã¯ããã¹ãã§ãã®ãã¯ãããžãŒã䜿çšããããã®åççãªæ ¹æ ãæäŸããŠããŸããã
äžè¬çã«ãåçããã¹ãããæ¹æ³ã«ã€ããŠã話ããããã®ã¯ããã ãã§ãã
è¯ãåæãšã©ãã«ä»ããããããŒã¿ããç¥ãããŸãïŒ
*ãµã³ãã«ã³ãŒãã¯ãªãŒãã³ãœãŒã¹ããååŸãããŸãã