Pythonã§ã«ã¼ã¿ã«pingãã
çéã§ããæ§ç¯ããã«ã¼ã¿ä¸è¦§ãä½æããå¿ è¦ãããã Pythonã§ã«ã¼ã¿ã«pingãã¦ããã®çµæãä¸è¦§ã«ãã¦ã¿ã¾ããã
ã¯ããã«
ããæ¥ãPrometheusã®ç£è¦å¯¾è±¡ã«ã¼ã¿ä¸è¦§ãä½æãããã¨ã«ãã¾ãããã 管çå°å¸³ä¸ã§ã¯ã«ã¼ã¿ã¯120å°ãããããããã«è¦ãã¾ãã
ããããªããããããã確èªããã¨ãæ§ç¯ã延æã«ãªã£ãããããããæ¬ çªã«ãªã£ãããã¦ã å®éã«æ§ç¯ããã«ã¼ã¿ããã©ããããããããªãç¶æ ã«ãªã£ã¦ãã¾ããã æ§ç¯ããã¦ããªãã«ã¼ã¿ãç£è¦å¯¾è±¡ã«å ¥ããã®ã¯ãã£ãããªãã®ã§ã çéã§ããã«ã¼ã¿ã®ä¸è¦§ãä½æãããã¨ã«ãã¾ããã
çé確èªã¯pingã§ãã¾ããã 1åç®ã®pingã§ã¯å¿çããªãã«ã¼ã¿ããããããå¿ ã2åpingãå®è¡ãã¦ã ã«ã¼ã¿ä¸è¦§ãä½æãããã¨ã«ãã¾ãã
ä»åã¯éã«å®å ãªã¹ããä½æãã¦ãPingã®çµæï¼OK or NGï¼ããå®å ãªã¹ãã«è¿½è¨ãã¾ãã
å¾ã ãYAMLå½¢å¼ã«å¤æãã¦åºåãããã¨èããã®ã§ãPythonã§ã«ã¼ã¿ã«pingãã¦ã ãã®çµæãä¸è¦§ã¨ãã¦CSVã«ä¿åãããã¨ã«ãã¾ãã
ãããã
Pythonã«ã¯ãICMP echo request/replyç¨ã®pyping
ãªã©ã®ã©ã¤ãã©ãªãããã¾ãã
ãã ããé£ç¹ãªã®ã管çè
権éï¼rootï¼ãå¿
è¦ãªãããè¸ã¿å°ãµã¼ãçµç±ãªã©ããæ軽ã«å®è¡ã§ããªãå ´åãããã¾ãã
ãã®ãããWindowsã®ping.exe
ã³ãã³ããsubprocess
ã©ã¤ãã©ãªã
å©ç¨ãã¦å¤é¨ããã»ã¹ã¨ãã¦èµ·åããã«ã¼ã¿ã«pingãã¾ãã
ä»åã¯ãWin10ã®ç°å¢ã®ãããWin10ã®ping.exe
ãå®è¡ãããã¨ã«ãã¾ããã
ä¸è¨ã®éããWin10ã®ç°å¢ã«ãAnacondaãã¤ã³ã¹ãã¼ã«ããç°å¢ãç¨æãã¦æ¤è¨¼ãã¾ãã
é ç® | 詳細 |
---|---|
OS | Windows 10 |
Python | Anaconda 2019.10 (Python 3.7.4) |
pingã³ãã³ã | Windows 10 æ¨æºã®ping.exe ã³ãã³ããå©ç¨ |
ä¸å³ã®éããå®å ãªã¹ãCSVçæâpingå®è¡âPrometheus SNMP Exporterç¨YAMLãã¡ã¤ã«ã®çæã¨ãã段éã§ä½æ¥ãã¾ãã pingå®è¡ã«ã¤ãã¦ã¯ãé次å®è¡ãã¿ã¼ã³ã¨ã並åå®è¡ãã¿ã¼ã³ã®2種é¡ãç¨æãã¾ããã
Pythonã§Win10ä¸ã®ping.exeã®å®è¡
ä¸è¨ã¯ãsubprocess
ã©ã¤ãã©ãªãããping.exe
ã³ãã³ããå®è¡ããä¾ã«ãªãã¾ãã
ping.exe
ã¯ãä½ãããã®pingå¿çããã£ãå ´åãæ»ãå¤ï¼return code
/ exit status
ï¼ãã0
ã«ãªãåé¡ãããã¾ãã
Ping NGã§ããICMP Unreachableãè¿ã£ã¦ããã¨ãæ»ãå¤ã0
ã«ãªãã¾ãã
ãã®ãããæ»ãå¤ã§ã¯ãPing OKã¨å¤æã§ãã¾ããã
åèï¼【バッチ】戻り値で結果を判定する場合に注意が必要なコマンド(tarやping)【シェル】 - 俺のメモ帖
ãã®ãããping.exe
ã®æ¨æºåºåããæååãæãåºãã¦ãPing NGãPing OKããå¤æããå¿
è¦ãããã¾ãã
ä»åã¯pingãæåããå ´åãä¸è¨ã®ãããªæååã表示ãããå¿
ãTTL=
ãå«ã¾ãã¾ãã
TTL=
ãå«ã¾ãã¦ããå ´åã¯ãPing OKã§ãå«ã¾ããªãå ´åã¯Ping NGã¨ãã¦åãæ±ãã¾ãã
>ping -n 2 -w 1000 127.0.0.1 127.0.0.1 ã« ping ãéä¿¡ãã¦ãã¾ã 32 ãã¤ãã®ãã¼ã¿: 127.0.0.1 ããã®å¿ç: ãã¤ãæ° =32 æé <1ms TTL=128 127.0.0.1 ããã®å¿ç: ãã¤ãæ° =32 æé <1ms TTL=128 127.0.0.1 ã® ping çµ±è¨: ãã±ããæ°: éä¿¡ = 2ãåä¿¡ = 2ãæ失 = 0 (0% ã®æ失)ã ã©ã¦ã³ã ããªããã®æ¦ç®æé (ããªç§): æå° = 0msãæ大 = 0msãå¹³å = 0ms
ããã°ã©ã ï¼ping0_test.py
subprocess
ã©ã¤ãã©ãªã§ãping.exe
ã®å®è¡çµæãæ£ãã解éã§ããããä¸è¨ã®ãããªãµã³ãã«ããã°ã©ã ãä½æãã¾ããã
subprocess.run
ã§ãping.exe -n 2 -w 1000 192.168.10.1
ã¨ping.exe -n 2 -w 1000 192.168.10.2
ãå®è¡ãã
ping.exe
ã®æ»ãå¤ï¼return codeï¼ã¨æ¨æºåºåãããããã表示ãã¾ãã
import subprocess print("=" * 60) print("PING OKã®å ´å") print("=" * 60) commands = ["ping", "-n", "2", "-w", "1000", "192.168.10.1"] print(" ".join(commands)) proc = subprocess.run( commands, stdout=subprocess.PIPE, # æ¨æºåºåã¯ä¿å stderr=subprocess.DEVNULL # æ¨æºã¨ã©ã¼ã¯æ¨ã¦ã ) print(f"return code : {proc.returncode}") result = proc.stdout.decode("cp932") print(result) print() print("=" * 60) print("PING NGã®å ´å") print("=" * 60) commands = ["ping", "-n", "2", "-w", "1000", "192.168.10.2"] print(" ".join(commands)) proc = subprocess.run( commands, stdout=subprocess.PIPE, # æ¨æºåºåã¯ä¿å stderr=subprocess.DEVNULL # æ¨æºã¨ã©ã¼ã¯æ¨ã¦ã ) print(f"return code : {proc.returncode}") result = proc.stdout.decode("cp932") print(result) print()
å®è¡çµæï¼ping0_test.py
ä¸è¨ã®å®è¡çµæãããPing OKã¨Ping NGã®å ´åãæ»ãå¤ï¼return codeï¼ã0
ã§ãããã¨ã確èªã§ãã¾ãã
ãã®ãããå¤å®æ¡ä»¶ã¯ä¸è¨ã®ã¨ããã¨ãªãã¾ãã
ç¶æ | å¤å®æ¡ä»¶ |
---|---|
Ping OK | æ¨æºåºåproc.stdout.decode("cp932") ã«TTL= ãå«ã¾ãã |
Ping NG | æ¨æºåºåproc.stdout.decode("cp932") ã«TTL= ãå«ã¾ããªã |
> python ping0_test.py ============================================================ PING OKã®å ´å ============================================================ ping -n 2 -w 1000 192.168.10.1 return code : 0 192.168.10.1 ã« ping ãéä¿¡ãã¦ãã¾ã 32 ãã¤ãã®ãã¼ã¿: 192.168.10.1 ããã®å¿ç: ãã¤ãæ° =32 æé =3ms TTL=255 192.168.10.1 ããã®å¿ç: ãã¤ãæ° =32 æé =3ms TTL=255 192.168.10.1 ã® ping çµ±è¨: ãã±ããæ°: éä¿¡ = 2ãåä¿¡ = 2ãæ失 = 0 (0% ã®æ失)ã ã©ã¦ã³ã ããªããã®æ¦ç®æé (ããªç§): æå° = 3msãæ大 = 3msãå¹³å = 3ms ============================================================ PING NGã®å ´å ============================================================ ping -n 2 -w 1000 192.168.10.2 return code : 0 192.168.10.2 ã« ping ãéä¿¡ãã¦ãã¾ã 32 ãã¤ãã®ãã¼ã¿: è¦æ±ãã¿ã¤ã ã¢ã¦ããã¾ããã 192.168.10.111 ããã®å¿ç: å®å ãã¹ãã«å°éã§ãã¾ããã 192.168.10.2 ã® ping çµ±è¨: ãã±ããæ°: éä¿¡ = 2ãåä¿¡ = 1ãæ失 = 1 (50% ã®æ失)ã
pingã®å®å ãªã¹ãï¼CSVï¼ãä½æ
次ã«ãPingã®å®å
ãªã¹ããä½æãã¾ãã
ä»åã¯ã192.168.10.1
ï½192.168.10.9
ã¾ã§ã®IPã¢ãã¬ã¹ãªã¹ããä½æãã¾ãã
IPã¢ãã¬ã¹ä»¥å¤ã«ãé£ç¶æ§ãããå ´åã¯ããã¹ãåã«é£çªãã¤ãã¦ãä½æãã¦ãè¯ãã¨æãã¾ãã
ãã¡ã¤ã«ã¯ç·¨éããããããã«CSVå½¢å¼ã§ä¿åãã¾ãã CSVå½¢å¼ã¯ä¸è¨ã®ãããª2ã¤ã®ã«ã©ã ï¼åï¼ãå®ç¾©ãã¾ããã
ã«ã©ã å | 詳細 |
---|---|
description | ã«ã¼ã¿ãèå¥ããååãæ称ãªã© |
target | Pingã®å®å ãIPã¢ãã¬ã¹ããã¹ãåãæå® |
ããã°ã©ã ï¼generate_csv.py
å®è¡ããã¨ãtarget
ã¨ãã¦ã192.168.10.1
ï½192.168.10.9
ã¾ã§ã®ãªã¹ããCSVã¨ãã¦ã
ping_targets.csv
ãã¡ã¤ã«ã«ä¿åãã¾ãã
ãã®ã¨ããdescription
ã«ã¯ãhost01
ï½host09
ãåæã«ã¤ãããã¾ãã
import csv CSV_COLUMNS = ["description", "target"] OUTPUT_CSV = "ping_targets.csv" with open(OUTPUT_CSV, "w", encoding="cp932", newline="") as f: writer = csv.DictWriter(f, fieldnames=CSV_COLUMNS) writer.writeheader() # 192.168.10.1ï½192.168.10.9ã¾ã§ãçæãã for i in range(1, 10): description = f"host{i:02}" target = f"192.168.10.{i}" row = { "description": description, "target": target } writer.writerow(row) print(row)
å®è¡çµæï¼generate_csv.py
å®è¡çµæã¯ä¸è¨ã®ã¨ããã§ããå®å
ã9ååºåããã¦ãã¾ãã
åæã«CSVãã¡ã¤ã«ping_targets.csv
ã«ãä¿åããã¦ãã¾ãã
>python generate_targets.py {'description': 'host01', 'target': '192.168.10.1'} {'description': 'host02', 'target': '192.168.10.2'} {'description': 'host03', 'target': '192.168.10.3'} {'description': 'host04', 'target': '192.168.10.4'} {'description': 'host05', 'target': '192.168.10.5'} {'description': 'host06', 'target': '192.168.10.6'} {'description': 'host07', 'target': '192.168.10.7'} {'description': 'host08', 'target': '192.168.10.8'} {'description': 'host09', 'target': '192.168.10.9'}
åºåçµæï¼ping_targets.csv
ä¸è¨ã®ããã«ãå®å ãªã¹ããCSVã§åºåããã¾ãã
description,target host01,192.168.10.1 host02,192.168.10.2 host03,192.168.10.3 host04,192.168.10.4 host05,192.168.10.5 host06,192.168.10.6 host07,192.168.10.7 host08,192.168.10.8 host09,192.168.10.9
å®å ãªã¹ãã«pingããï¼é次å®è¡ãããã¿ã¼ã³ï¼
ãããããå®å ãªã¹ãã«pingãã¾ãã ã¾ãã¯ããã«ãå®å ãªã¹ããã1è¡ãã¤åãåºãã¦ãpingããçµæãCSVã«ä¿åãã¾ãã
ããã°ã©ã ï¼ping1_singlethread.py
ping
é¢æ°ã§ãping.exe
ãå®è¡ãã¾ãã
å¼æ°ã«ã¯å®å
ãªã¹ãã®CSVè¡ãã¼ã¿ã§ããrow
ã渡ãã¦ãã¾ãã
row["target"]
ãå«ã¾ãã¦ãããã¨ãæå¾
ããrow["target"]
å®ã«pingãã¾ãã
å®è¡çµæã¯row["result"]
ã«OK
ã¾ãã¯NG
ã¨ãã¦ä¿åãã¾ãã
import subprocess import csv import time CSV_COLUMNS = ["description", "target", "result"] INPUT_CSV = "ping_targets.csv" OUTPUT_CSV = "ping_results.csv" def ping(row): # windowsã®pingã³ãã³ããå®è¡ãã # ICMP Echo Requestã2åéåº "-n 2" # ã¿ã¤ã ã¢ã¦ãã¯1000ããªç§ "-w 1000" # targetå®ã«éä¿¡ # ping -n 2 -w 1000 target proc = subprocess.run( ["ping", "-n", "2", "-w", "1000", row["target"]], stdout=subprocess.PIPE, # æ¨æºåºåã¯å¤æã®ããä¿å stderr=subprocess.DEVNULL # æ¨æºã¨ã©ã¼ã¯æ¨ã¦ã ) # pingã³ãã³ãã®å®è¡çµæï¼æ¨æºåºåï¼ã«ãTTL=ãã®æååãããã°ãPING OKã¨å¤æ succeed = proc.stdout.decode("cp932").find("TTL=") > 0 row["result"] = "OK" if succeed else "NG" return row def main(): start = time.time() # å®è¡æéè¨æ¸¬ç¨ with open(INPUT_CSV, "r", encoding="cp932", newline="") as fin: with open(OUTPUT_CSV, "w", encoding="cp932", newline="") as fout: reader = csv.DictReader(fin) writer = csv.DictWriter(fout, fieldnames=CSV_COLUMNS) writer.writeheader() for row in reader: row = ping(row) writer.writerow(row) print(row) print(f"å®è¡æé {time.time() - start:,.2f} ç§") # å®è¡æéè¨æ¸¬ç¨ if __name__ == "__main__": main()
å®è¡çµæï¼ping1_singlethread.py
å®è¡çµæã¯ãä¸è¨ã®ã¨ããã§ããå®å 9åã®ãã¡ã2åãOKã§ããã®ä»ã¯NGã¨ãªã£ã¦ãã¾ãã ãã®ã¨ãã®å®è¡æéã¯ã22ç§ã¨å®è¡ã«æéãããã£ã¦ãã¾ãã ããã¯ãPing NGãå¤ããã¿ã¤ã ã¢ã¦ããå¾ ã£ã¦ããããã§ãã
>python ping1_singlethread.py OrderedDict([('description', 'host01'), ('target', '192.168.10.1'), ('result', 'OK')]) OrderedDict([('description', 'host02'), ('target', '192.168.10.2'), ('result', 'NG')]) OrderedDict([('description', 'host03'), ('target', '192.168.10.3'), ('result', 'NG')]) OrderedDict([('description', 'host04'), ('target', '192.168.10.4'), ('result', 'OK')]) OrderedDict([('description', 'host05'), ('target', '192.168.10.5'), ('result', 'NG')]) OrderedDict([('description', 'host06'), ('target', '192.168.10.6'), ('result', 'NG')]) OrderedDict([('description', 'host07'), ('target', '192.168.10.7'), ('result', 'NG')]) OrderedDict([('description', 'host08'), ('target', '192.168.10.8'), ('result', 'NG')]) OrderedDict([('description', 'host09'), ('target', '192.168.10.9'), ('result', 'NG')]) å®è¡æé 22.87 ç§
åºåçµæï¼ping_results.csv
ping_targets.csv
ã«result
ã«ã©ã ã追å ããã
Ping OKããPing NGããããããã«ãªãã¾ããã
description,target,result host01,192.168.10.1,OK host02,192.168.10.2,NG host03,192.168.10.3,NG host04,192.168.10.4,OK host05,192.168.10.5,NG host06,192.168.10.6,NG host07,192.168.10.7,NG host08,192.168.10.8,NG host09,192.168.10.9,NG
å®å ãªã¹ãã«pingããï¼ä¸¦è¡å®è¡ãããã¿ã¼ã³ï¼
é次å®è¡ã®å ´åãã¿ã¤ã ã¢ã¦ããçºçããã¨ãå®è¡æéãããªããããããã«ãªãã¾ãã
æ°åç§ç¨åº¦ã§ããã°ãå¾
ã¦ã¾ããã対象ãå¤ããªããPing NGãå¤çºããã¨ç¾å®çã§ã¯ããã¾ããã
ãã®ãããping.exe
ã並åå®è¡ããããã«å¤æ´ãã¾ããã
ããã°ã©ã ï¼ping2_multithread.py
åæå®è¡ã®ããã«ã
concurrent.futures.ThreadPoolExecutor
ãå©ç¨ãã¾ããã
THREAD_MAX_WORKER = 30
ã§ã30åã®å®å
ã«åæã«pingãã¾ãã
大ã¾ããªåãã¨ãã¦ã CSVã®å®å ãªã¹ããèªã¿è¾¼ã¿ãpingãå®è¡ããã¹ã¬ãããã¼ã«ã«ã¸ã§ãï¼pingå®å ï¼ãç»é²ãããã¹ã¦ã®ã¸ã§ããå®äºãããCSVã«çµæãåºåãã¾ãã
import subprocess import csv import time from concurrent.futures import ThreadPoolExecutor CSV_COLUMNS = ["description", "target", "result"] INPUT_CSV = "ping_targets.csv" # ã«ã©ã åã«descriptionãtargetãæå¾ ãtargetã«å¯¾ãã¦ping OUTPUT_CSV = "ping_results.csv" # ã«ã©ã åã¯CSV_COLUMNS THREAD_MAX_WORKER = 30 def ping(row): # windowsã®pingã³ãã³ããå®è¡ãã # ICMP Echo Requestã2åéåº "-n 2" # ã¿ã¤ã ã¢ã¦ãã¯1000ããªç§ "-w 1000" # targetå®ã«éä¿¡ # ping -n 2 -w 1000 target proc = subprocess.run( ["ping", "-n", "2", "-w", "1000", row["target"]], stdout=subprocess.PIPE, # æ¨æºåºåã¯å¤æã®ããä¿å stderr=subprocess.DEVNULL # æ¨æºã¨ã©ã¼ã¯æ¨ã¦ã ) # pingã³ãã³ãã®å®è¡çµæï¼æ¨æºåºåï¼ã«ãTTL=ãã®æååãããã°ãPING OKã¨å¤æ succeed = proc.stdout.decode("cp932").find("TTL=") > 0 row["result"] = "OK" if succeed else "NG" return row def main(): start = time.time() # å®è¡æéè¨æ¸¬ç¨ # THREAD_MAX_WORKERåã®ã¹ã¬ãããã¼ã«ãèµ·åãã¦pingã³ãã³ããå®è¡ãã with ThreadPoolExecutor(max_workers=THREAD_MAX_WORKER) as executor: # CSVãèªã¿è¾¼ã¿ãã¹ã¬ãããã¼ã«ã«ãã¥ã¼ã¤ã³ã°ãã with open(INPUT_CSV, "r", encoding="cp932", newline="") as fin: reader = csv.DictReader(fin) # CSVã®1è¡ãã¤pingé¢æ°ã§å®è¡ results = executor.map(ping, reader) # ã¹ã¬ãããã¼ã«ã®å®è¡çµæããCSVã«æ¸ãè¾¼ã with open(OUTPUT_CSV, "w", encoding="cp932", newline="") as fout: writer = csv.DictWriter(fout, fieldnames=CSV_COLUMNS) writer.writeheader() for result in results: row = result writer.writerow(row) print(row) print(f"å®è¡æé {time.time() - start:,.2f} ç§") # å®è¡æéè¨æ¸¬ç¨ if __name__ == "__main__": main()
å®è¡çµæï¼ping2_multithread.py
é次å®è¡ã¨æ¯ã¹ãã¨ãå®è¡æéã7åæ©ããªã£ã¦ãããã¨ã確èªã§ãã¾ãã
>python ping2_multithread.py OrderedDict([('description', 'host01'), ('target', '192.168.10.1'), ('result', 'OK')]) OrderedDict([('description', 'host02'), ('target', '192.168.10.2'), ('result', 'NG')]) OrderedDict([('description', 'host03'), ('target', '192.168.10.3'), ('result', 'NG')]) OrderedDict([('description', 'host04'), ('target', '192.168.10.4'), ('result', 'OK')]) OrderedDict([('description', 'host05'), ('target', '192.168.10.5'), ('result', 'NG')]) OrderedDict([('description', 'host06'), ('target', '192.168.10.6'), ('result', 'NG')]) OrderedDict([('description', 'host07'), ('target', '192.168.10.7'), ('result', 'NG')]) OrderedDict([('description', 'host08'), ('target', '192.168.10.8'), ('result', 'NG')]) OrderedDict([('description', 'host09'), ('target', '192.168.10.9'), ('result', 'NG')]) å®è¡æé 3.08 ç§
åºåçµæï¼ping_results.csv
åºåçµæã¯ãé次å®è¡ã¨åãå 容ã¨ãªãã¾ãã
description,target,result host01,192.168.10.1,OK host02,192.168.10.2,NG host03,192.168.10.3,NG host04,192.168.10.4,OK host05,192.168.10.5,NG host06,192.168.10.6,NG host07,192.168.10.7,NG host08,192.168.10.8,NG host09,192.168.10.9,NG
SNMP Exporterç¨ã®YAMLãã¡ã¤ã«ãä½æ
æå¾ã«ãPrometheusã®SNMP Exporterç¨ã®YAMLãã¡ã¤ã«ãä½æãã¾ãã
Pingçµæãè¨é²ãããping_results.csv
ãèªã¿è¾¼ã¿ãPing OKã®è¡ã®ã¿ãsnmp_targets.yaml
ã«åºåãã¾ãã
ããã°ã©ã ï¼generate_snmp_targets.py
ä»åãYAMLã¯åç´ãªåæã ãã§ãã£ããããã©ã¤ãã©ãªã使ãããç´æ¥åºåãã¾ããã
import csv INPUT_CSV = "ping_results.csv" OUTPUT_YAML = "snmp_targets.yaml" with open(INPUT_CSV, "r", encoding="cp932", newline="") as fin: with open(OUTPUT_YAML, "w", encoding="utf-8", newline="") as fout: reader = csv.DictReader(fin) fout.write("---\n") fout.write("- targets:\n") for row in reader: if row["result"] == "OK": print(row) fout.write(f' - {row["target"]}\n') fout.write(" labels:\n") fout.write(" group: tokyo-routers\n")
å®è¡çµæï¼generate_snmp_targets.py
ä¸è¨ã®éããPing OKã§ãã£ãå®å ã®ã¿ãåºåããã¦ãã¾ãã
>python generate_snmp_targets.py OrderedDict([('description', 'host01'), ('target', '192.168.10.1'), ('result', 'OK')]) OrderedDict([('description', 'host04'), ('target', '192.168.10.4'), ('result', 'OK')])
åºåçµæï¼snmp_targets.yaml
ä¸è¨ã®éããPing OKã§ãã£ãå®å
ãtargets
ã«è¨è¼ãã¾ããã
--- - targets: - 192.168.10.1 - 192.168.10.4 labels: group: tokyo-routers
ãããã«
æ°åå°ãªããæä½æ¥ã§YAMLãã¡ã¤ã«ãä½æããã»ãããæ©ãã§ããã¨æãã¾ãã ãã ããåç´ä½æ¥ã§æ¥½ãããªãã§ãã
ä»åã®ããã«åç´ãªä½æ¥ããå¾ã ã«èªååãã¦ãã©ãã©ã楽ããã¦ããã¾ãããã ä¸åº¦ãèªååã®ä»çµã¿ãä½ãã°ãæ1åã®æ£å¸ããããæ¯æ¥ã®æ£å¸ããã1æéã«ä¸åã®æ£å¸ããã§ããããã«ãªãã¾ãã ã¾ãããã£ã¨ä½ãè¾¼ãã°ãç£è¦ç»é²ã®èªååãã§ãã¾ãã ç£è¦ç»é²æ¼ãã«ãããé大äºæ ãé²ãããã«ããçæ§ãç©æ¥µçã«èªååãã¦ããã¾ãããã