
ãæåã®éºç£LZHãå šèªåã§å¥ããæ¯é±ã®ããŒã¿æŽæ°ã§çµ¶æããªãïŒPythonÃ7-Zipã§çµãã 29ããŒãã«èªåä»åãã©ã€ã³!Alma Core Proéçºèš #5
ã©ãããã¢ã«ãã³ã¢ã§ãïŒ
æ¬æ¥ã¯å·¥å Žã®èªååæ©æ¢°ãã·ãŒã±ã³ãµãŒïŒPLCã»å¶åŸ¡ç€ïŒã®èšèšã«åãåã£ãŠãããçŸåœ¹ã®æ©æ¢°ãšã³ãžãã¢ã§ãã
ååã®ç¬¬4åã§ã¯ã競銬ããã¯ïŒKD3ïŒã®å š29ããŒãã«ã«3æ¬ã®ã¡ã€ã³ã·ã£ããïŒ5é£ã»6é£ã®è€åäž»ããŒãšè¡çµ±çªå·ïŒã貫éãããã³ã³ãæ°ç§ã§å šããŒã¿ãé£åãããSQLiteç·çµç«å³ïŒERå³ïŒãã®èšèšåãã話ãããŸããã
ããã£ããïŒ ããã§29åã®ã¹ããã«ãŒïŒããŒãã«ïŒãšæ¬éã©ã€ã³ïŒé ç·ã»JOINïŒã¯å®ç§ã«çµã¿äžãã£ããïŒã
âŠâŠãšãæ·±å€2æã«äžäººã¬ããããŒãºã決ããŠããç§ã§ãããæ¬¡ã«è¥²ãããã£ãŠããã®ã¯ãæ¯é±ãšã³ãã¬ã¹ã§äŸçµŠãããéšåïŒããŒã¿ãã¡ã€ã«ïŒã®å±±ããšããéé ·ãªçŸå®ã§ããã
1. æªéã®äºéå§çž®ãããªã§ãŒã·ã«
競銬ã®ããŒã¿ã¯ãäžåºŠããŒã¿ããŒã¹ãäœã£ãŠçµããã§ã¯ãããŸããã
æ¯é±ã»æ¯éå¬ããšã«ãåºéŠ¬è¡šã確å®ãªããºã調æçè©ããããŠææã«ã¯ç¢ºå®çé ãã©ããã¿ã€ã ãå ¥ã£ãæçžŸããŒã¿ãã競銬éOnLineã®ãµãŒããŒãããããããšèœã¡ãŠããŸãã
ãããããã®éãããŠããããŒã¿ã®å§¿ãèŠããšããç§ã¯æããç»é¢ãäºåºŠèŠããŸããã
ããŠã³ããŒããããã¡ã€ã«ïŒ kd3_latest_pack.zip
ââ è§£åãããšäžããâŠïŒ kd3_261011.lzh ïŒïŒïŒïŒ
ââ ããã«è§£åãããšâŠïŒ kol_den1.kd3, kol_den2.kd3, kol_kod.kd3 ...
ã.zip ã®äžãããæåã®éºç£ã.lzhããåºãŠããŠããããå¥ãããããããçããŒã¿ã.kd3ããåºãŠããããšâŠâŠïŒïŒã
ãŸãã«æªéã®ãããªã§ãŒã·ã«æ§é ã§ãã
æ·±å€2æã®ãã€ãã³ã·ã§ã³ãªç§ã®è³å ã§ã¯ããããªäžäººä¹ãããã³ããç¹°ãåºããããŠããŸããã
ãäœååããããã®äºéå§çž®ãã¡ã€ã«ããŸããæ¯é±æåã§è§£åããïŒã
ãããïŒ ããããïŒã
ããããã£ãŠã1ã€ãã€ç®å¥ããŠïŒã
ãé»åã¬ã³ãžã§ãããã³ãŠïŒã
ãã¢ãããŒãŒãŒããïŒïŒïŒã
ããããªãæ¯é±ãã£ãšã£ããæ»ãã§ãŸããïŒ äºæ³ããæéãªããªããïŒã
ãã»ãªåãæ©æ¢°å±ããïŒ ãã£ãããããå®å šèªååããããïŒã
æ¯é±åæ¥ã®ç«¶éЬåã«ãäœååãã®å§çž®ãã¡ã€ã«ãããããæåã§è§£åãããããã¯åºéŠ¬è¡šããããã£ã¡ãããã¯ãªããºããããã£ã¡âŠâŠããªããŠæäœæ¥ã§ä»åããŠããããã¡ã€ã³ã¬ãŒã¹ã®çºèµ°ã©ãããåææ¥ãçµãã£ãŠããŸããŸãïŒç¬ïŒã
æ©æ¢°èšèšå±ã®ãã©ã€ãã«ãããŠããæå®ãã©ã«ãã«æŸã蟌ãã ããç®ãããã29ããŒãã«ãžã®ä»åãã»ã€ã³ããŒããŸã§ãã¿ã³1ã€ã§å šèªåã§æµããæ¬éã©ã€ã³ããPythonã§çµãããšã決æããŸããïŒ
2. 什åã®Pythonã§æåã®ã.lzhããã©ãå®å šã«å¥ããïŒ
èªååã©ã€ã³ãäœãã«ããã£ãŠãæåã«ç«ã¡ã¯ã ãã£ãã®ãã什åã®ææ°ããã°ã©ãã³ã°ç°å¢ã§ãã©ããã£ãŠæåã®å§çž®åœ¢åŒ .lzh ãå¥ãã®ãïŒããšããåé¡ã§ããã
ä»ã®Pythonã«ã¯ã.zip ãæ±ãããã®æšæºã©ã€ãã©ãªïŒzipfileïŒã¯æåããçšæãããŠããŸãã
ããããæã®ããœã³ã³éä¿¡ãWindows 95ãXPæä»£ãæ¯ãã .lzhïŒLHAæžåº«ïŒãè§£åããæšæºæ©èœãªããŠãçŸä»£ã®Pythonã«ã¯åœ±ã圢ããããŸããã
ãæã¿ããã« unlha32.dll ãã·ã¹ãã ãã©ã«ãïŒSystem32ïŒã«ã¶ã¡èŸŒãã§ã32bitç°å¢ã®APIãå©ããâŠâŠïŒã
ããããããããªèšèšã¯çµ¶å¯Ÿã«ã¢ã«ã³ïŒ
䜿ãäººã«æªããDLLãã¡ã€ã«ãå¥ã§æåã€ã³ã¹ããŒã«ãããããOSã®ããŒãžã§ã³ã64bitç°å¢ã®éãã§åããªããªã£ãããããããªè»åŒ±ãªæ©æ§ã¯ãæ©æ¢°å±ãšããŠå ¬å·®Â±0ã®èšèšãšã¯åŒã¹ãŸããã
ããã§ç§ãæ¡çšããã®ãããã³ãã³ãã©ã€ã³ç 7-ZipïŒ7z.exeïŒããšã³ãžã³ã«æ®ããç°å¢ã«å¿ããŠå®å šã«ãã©ãŒã«ããã¯ããé«åæ§ã¢ã³ããã«ãŒæ©æ§ãã§ããã
Python
def extract_archive_7z(archive_path: str, dest_dir: str) -> bool:
# é
åžãã©ã«ãå
ãWindowsæšæºã®7-Zipãã¹ãèªåæ¢çŽ¢
seven_zip_paths = [
os.path.join(BASE_DIR, "7z.exe"),
os.path.join(BASE_DIR, "7-Zip", "7z.exe"),
r"C:\Program Files\7-Zip\7z.exe",
r"C:\Program Files (x86)\7-Zip\7z.exe",
]
for sz in seven_zip_paths:
if os.path.exists(sz):
# ãµãããã»ã¹ã§ãµã€ã¬ã³ãïŒããã¯ã°ã©ãŠã³ãïŒè§£åãå®è¡
res = subprocess.run(
[sz, "x", archive_path, f"-o{dest_dir}", "-y"],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL
)
return res.returncode == 0
# 7-ZipãèŠã€ãããªãå Žåã®æšæºzipãã©ãŒã«ããã¯
try:
with zipfile.ZipFile(archive_path, 'r') as zip_ref:
zip_ref.extractall(dest_dir)
return True
except Exception:
return False
ã¢ããªã«æå°æ§æã® 7z.exe ã忢±ããŠããã°ããŠãŒã¶ãŒã«é¢åãªç°å¢æ§ç¯ãäžåãããããšãªãã.zip ã .lzh ãããã¯ã°ã©ãŠã³ãïŒãµã€ã¬ã³ãã¢ãŒãïŒã§äžæè§£åã§ããŸãã
å·¥å Žã®ã©ã€ã³ã§èšãã°ããã©ããªåœ¢ç¶ã®æ¢±å ãã³ããŒã«ãæµããŠããŠããã»ã³ãµãŒãæ€ç¥ããŠèªåã§ã«ãã¿ãŒãå ¥ããŠäžèº«ãåãåºãäžèœé梱ããããããé 眮ããããã§ãïŒ
3. 3éè§£äœã«ãŒããšã29ããŒãã«èªåä»åãã³ã³ãã¢ã
鿢±ããããã®åãæ±ºãŸã£ãããæ¬¡ã¯ããããªã§ãŒã·ã«ã®é£ç¶è§£äœããšã29ããŒãã«ãžã®èªåæ¯ãåãã³ã³ãã¢ãã®æ§ç¯ã§ãã
èœã¡ãŠããããŒã¿ã®äžã«ã¯ã.zip ã®äžã« .lzh ããããããã«ãã®äžã«å¥ã®å§çž®ãã¡ã€ã«ãæœãã§ããã±ãŒã¹ããããŸãã
ããã§ãäžæäœæ¥ãã©ã«ãïŒTEMP_DIRïŒã®äžã§ãå§çž®ãã¡ã€ã«ãå®å šã«æ¶ãå»ããŸã§æå€§3åãŸã§ååž°çã«ç®ãå¥ãç¶ãããé£ç¶è§£äœã«ãŒãããä»èŸŒã¿ãŸããã
Python
# 1. ãŸãå€åŽã®LZH/ZIPãäžæãã©ã«ãã«è§£å
extract_archive_7z(lzh_path, TEMP_DIR)
# 2. äžããããã«zipãlzhãåºãŠããããæ¶ãããŸã§æå€§3åšé£ç¶ã§ç®ãå¥ãïŒ
for loop in range(3):
raw_subs = glob.glob(os.path.join(TEMP_DIR, "**", "*.zip"), recursive=True) + \
glob.glob(os.path.join(TEMP_DIR, "**", "*.lzh"), recursive=True)
sub_archives = list(set(os.path.normpath(f) for f in raw_subs))
if not sub_archives:
break
for sub_arc in sub_archives:
extract_archive_7z(sub_arc, TEMP_DIR)
os.remove(sub_arc) # å¥ããæãæ®»ã¯å³åº§ã«ã¹ã¯ã©ããïŒ
ããã§ãã©ããªã«æ·±ããããªã§ãŒã·ã«ã§ãã£ãŠããæçµçã«ã¯çŽåºŠ100%ã® .kd3 çãã¡ã€ã«ã ããã³ã³ãã¢ã®äžã«ç¶ºéºã«æŽåããŸãã
ãã¡ã€ã«åãããè¡ãå ããç¬æã«èŠæããã£ã¹ãããã£ïŒä»åãè£ çœ®ïŒ
æŽåãã .kd3 ãã¡ã€ã«ã¯ãååãèŠãã ãã§ã©ã®ããŒãã«ã«å ¥ãã¹ãããæ±ºãŸã£ãŠããŸãã
å·¥å Žã®ããŒããã£ãŒããŒïŒéžå¥æ¬éæ©ïŒã®ããã«ãPythonã®èŸæžã䜿ã£ãŠãã¡ã€ã«åãšããŒãµãŒé¢æ°ãçŽçµãããŸããã
Python
# 29ããŒãã«ã®è¡ãå
ãšããŒãµãŒïŒè§£æåšïŒã®å¯Ÿå¿ããã
TABLE_PARSERS = {
'kol_sei1': db_parser.parse_kol_sei1, # ç«¶èµ°æçžŸïŒèŠªïŒ
'kol_sei2': db_parser.parse_kol_sei2, # ç«¶èµ°æçžŸïŒéЬåäœã»çé ãã©ããïŒ
'kol_den1': db_parser.parse_kol_den1, # åºéŠ¬è¡šïŒèŠªïŒ
'kol_den2': db_parser.parse_kol_den2, # åºéŠ¬è¡šïŒéЬåäœã»çè©ãææ°ïŒ
'kol_kod': db_parser.parse_kol_kod, # ååã»è€åãªããº
'kol_com1': db_parser.parse_kol_com1, # ãã©ãã¯ãã³æ¬¡èµ°ã¡ã¢ã»å©èè«è©±
'kol_uma': db_parser.parse_kol_uma, # 競走銬ãã¹ã¿
# ...ïŒå
š29ããŒãã«ã«å¯Ÿå¿ïŒ
}
ãããŠãäžæãã©ã«ãã«çŸããçãã¡ã€ã«ãã«ãŒãã§èµ°æ»ããŸãã
Python
for kd3_path in kd3_files:
kd3_name = os.path.basename(kd3_path)
# ãã¡ã€ã«åãkol_sei1.kd3ãããããŒãã«åãkol_sei1ããç¬æã«æœåº
table_name = os.path.splitext(kd3_name)[0].lower()
# ç»é²ããã29ããŒãã«ã®ä»åãã©ã€ã³ãžå
šèªåæ¬éïŒ
if table_name in TABLE_PARSERS:
db_importer.import_table_data(
DB_PATH,
table_name,
kd3_path,
TABLE_PARSERS[table_name],
batch_size=5000
)
os.path.splitext ã§ãã¡ã€ã«åããæ¡åŒµåãåãé¢ãã
åãåºããæååïŒäŸïŒkol_sei2ïŒãç»é²ããŒãã«ã«ããã°ã察å¿ããè§£æé¢æ°ïŒããŒãµãŒïŒãã»ããããŠã€ã³ããŒããšã³ãžã³ãžæå ¥ããã
ãã®æ©æ§ã®ãããã§ã人éããããã¯åºéŠ¬è¡šã§âŠâŠããã¯ç¹å¥ç»é²ã§âŠâŠããªããŠèããå¿ èŠã¯1ããªããããŸããã
ã³ã³ãã¢ã«æµããŠããéšåã®å»å°ãã«ã¡ã©ã§èªã¿åã£ãŠããšã¢ã·ãªã³ããŒã§æ£ããã¹ããã«ãŒãžãã·ã¥ãïŒãšåŒŸãåããFAæ¬éã©ã€ã³ã®å®æã§ãïŒ
4. çŸå Žã®ãã ããïŒãšã©ãŒæã®ä¿å šãšãèªæµäœçšã
å·¥å Žã®èªååæ©æ¢°ã§äžçªãã£ã¡ããããªãã®ã¯ããéäžã§ãšã©ãŒãèµ·ãããšãã«ãäžéå端ã«éšåãåã¿èŸŒãã§ã©ã€ã³ãè©°ãŸãããšãã§ãã
ããŒã¿ããŒã¹ã®ã€ã³ããŒããå šãåãã§ãã
ãããäœååããããã¡ã€ã«ã®ãã¡1ã€ã ãããŠã³ããŒãã«å€±æããŠããããéäžã§PCã®é»æºãèœã¡ãããããšããããŒã¿ãäžéå端ã«åã蟌ãŸããŠå ã®ãã¡ã€ã«ãæ¶ããŠããŸã£ãã埩æ§ãå°çã«ãªããŸãã
ãã®ããããAlma Core Proãã®æ¬éã©ã€ã³ã«ã¯åŒ·åºãªãã€ã³ã¿ãŒããã¯ïŒä¿å šæ©èœïŒããçµã¿èŸŒã¿ãŸããã
Python
# å
šããŒãã«ãå®ç§ã«ã€ã³ããŒãã§ããå Žåã®ã¿ãå
ãã¡ã€ã«ãèªåç Žæ£ããŠå±¥æŽãå»ã
if file_imported > 0 and file_failed == 0 and os.path.exists(lzh_path):
os.remove(lzh_path) # åŠçæžã¿LZHãèªåæ¶å»ããŠå®¹éç¯çŽïŒ
self.mark_downloaded(lzh_name) # dl_historyããŒãã«ã«å»ãã§äºéå蟌ãå®å
šé²æ¢ïŒ
elif file_failed > 0:
# 1ä»¶ã§ã倱æããããåå ç©¶æã®ããã«å
ãã¡ã€ã«ã¯çµ¶å¯Ÿã«æšãŠãã«æ®ãïŒ
self.log(f"â ïž äžéšå蟌ã«å€±æããããLZHã¯ä¿æããŸã (æå: {file_imported} / 倱æ: {file_failed})")
æ£åžžã«åã蟌ã¿ãçµãã£ã .lzh ãã¡ã€ã«ïŒåœ¹ç®ãçµãããã³ããŒã«ç®±ãšããŠèªåã§ã·ã¥ã¬ãããŒïŒos.removeïŒãžéãããSSDãHDDã®å®¹éãå§è¿«ããŸããã
ã€ã³ããŒãå±¥æŽã®èšé²ïŒdl_history ãšããå°çšããŒãã«ã«ããã®ãã¡ã€ã«ã¯åŠçæžã¿ããšããã¿ã€ã ã¹ã¿ã³ããå»ã¿èŸŒã¿ãäºéå蟌ãå®å šé²æ¢ã
ç°åžžæ€ç¥æã®ãã§ã€ã«ã»ãŒãïŒäžãäžã1ããŒãã«ã§ãå蟌ãšã©ãŒãåºãå Žåã¯æ±ºããŠãã¡ã€ã«ãæ¶ããã«ã¹ãããããããã°ã«ãšã©ãŒç®æãæ£ç¢ºã«åãåºããŸãã
ãã®åŸ¹åºããèªæµäœçšãšã€ã³ã¿ãŒããã¯ããããããããäœå¹Žåã»äœäžä»¶ãšããèšå€§ãªããŒã¿ãæµã蟌ãã§ããã·ã¹ãã ã絶察ã«ã¯ã©ãã·ã¥ããåãç¶ããã®ã§ãïŒ
5. ãAlma Core Proããªããæ¯é±ã®ããŒã¿æŽæ°ããå®å šæŸçœ®ãã«ãªã
競銬ããã¯ïŒKD3ïŒã®çããŒã¿éçšã«æãã 競銬ãã¡ã³ããæ«æããæå€§ã®é¢éã
ããã¯ãããŒãã«ã®èšèšãã§ããããŸãããå®ã¯ãã以äžã«ãæ¯é±ã®è§£åã»æŽæ°äœæ¥ãããŸãã«ãé¢åãããããŠãéäžã§å¿ãæããŠæŸçœ®ããŠããŸãããšãã§ãã
æ¯é±æšæã«ç¹å¥ç»é²ãèœãšããéæã«åºéŠ¬è¡šãšäºæ³ãªããºãå¥ãã忥ã«ç¢ºå®ãªããºã远ããããææã«æçžŸãåã蟌ãâŠâŠã
ãããªäœæ¥ãæäœæ¥ã§ãã£ãŠãããã人éãªããŠããã®äžã«ããŸããïŒç¬ïŒã
ã ããããããAlma Core ProããšããããŒã«ã®ç骚é ããããŸãã
競銬éOnLineããèœã¡ãŠããäºéå§çž®ããã¯ïŒ.zip â .lzhïŒããããã¯ã°ã©ãŠã³ãã§å šèªåè§£äœã
29ããŒãã«ãžã®ä»åãããã€ãåãåºããSQLiteãžã®ãã«ã¯ã€ã³ãµãŒãããããŠåŠçæžã¿ãã¡ã€ã«ã®èªåãæé€ãŸã§ããã¹ãŠããã¿ã³ã1åããããšæŒãã ããã§å®å šæŸçœ®ã§å®çµããŸãïŒ
çããã¯ãæ¯é±ã®é¢åãªãç®å¥ãäœæ¥ãã«1ç§ãããšãæéã䜿ãå¿ èŠã¯ãããŸããã
ãã åºæ¥äžãã£ãæé«ç²ŸåºŠã®ããŒã¿ããŒã¹ãéããŠãã鱿«ã®ã¬ãŒã¹åæãšååçã¢ãããã ãã«ãã¹ãŠã®éäžåãæ³šã蟌ãããšãã§ããã®ã§ãïŒ
6. 次åäºåïŒ10äžè¡ã®ããŒã¿ãç¬æ®ºãããSQLiteéççªç Žãã®æ¥µæ
ãããããã§ãããªã§ãŒã·ã«ã®è§£äœãããããšã29ããŒãã«ãžã®èªåä»åãã³ã³ãã¢ïŒãã£ã¹ãããã£ïŒã皌åããŸããïŒ
âŠâŠããããããã§ã€ã³ããŒãåŠçã®ãçã®ã©ã¹ãã¹ããç«ã¡ã¯ã ãããŸãã
ãããïŒ ã³ã³ãã¢ãåãããããéå»10幎åã®æçžŸããŒã¿ïŒæ°çŸäžè¡ïŒãäžæ°ã«æµã蟌ãã§ã¿ããïŒã
ææ°æã ãšãã¹ããå®è¡ããç§ãããããç»é¢ã®ããã°ã¬ã¹ããŒã¯ããªåäœã§ããé²ãŸããCPUãã¡ã³ãåžããäžããSQLiteãžã®æžã蟌ã¿ã¯çµ¶æçãªé ãã§ããªãŒãºå¯žåã«âŠâŠïŒ
ãããããåããïŒïŒ 1è¡ã〠INSERT ããŠããã10幎åã®ã€ã³ããŒããçµããã®ã«äžž3æ¥ããããããïŒïŒã
å·¥å Žã®ã©ã€ã³ã§èšãã°ãæ¬éã³ã³ãã¢ã¯è¶ é«éãªã®ã«ãå å·¥æ©ã®ãã¬ã¹ã¹ããŒããé ãããŠè£œåãå±±ç©ã¿ã«ãªããå€§æžæ»ãèµ·ãããŠããç¶æ ã§ãã
次åã
ãAlma Core Proéçºèš NO.6ã1ã¯ãšãª5äžDCã®å£ãã¶ã¡ç ŽãïŒSQLiteãã©ã³ã¶ã¯ã·ã§ã³ãšè¶ é«éãã«ã¯ã€ã³ãµãŒãã§æ°çŸäžè¡ãç¬æ®ºããå€ã
ãªã1è¡ãã€ã®INSERTã¯é ãã®ãïŒ
PRAGMAèšå®ïŒWALã¢ãŒãïŒã5,000ä»¶åäœã®ã¡ã¢ãªãããã¡ïŒãã«ã¯ã€ã³ãµãŒãïŒããããŠPythonãšSQLiteã®ãã©ã³ã¶ã¯ã·ã§ã³ã極éãŸã§ãã¥ãŒãã³ã°ããŠãæ°çŸäžè¡ã®ããŒã¿ãã³ã³ãæ°ç§ã§åžã蟌ãŸãããçéåã®æ¥µæããã³ãŒãä»ãã§å€§å ¬éããŸãïŒ
ã©ãããæ¥œãã¿ã«ïŒ
â æåŸãŸã§èªãã§ããã ãããã³ãã«ããããšãããããŸããïŒ
ãäºéå§çž®ã®ç®ããèªååããã¡ããã¡ããããïŒç¬ïŒããå·¥å Žã®ä»åãã©ã€ã³ã®ããšãããªã¢ã«ãããŠé¢çœãïŒããšæã£ãŠããã ãããããã²ç»é¢äžã®ãã¹ãïŒããŒãããŒã¯ïŒããããã©ããŒããããããšæŒããŠããã ãããšãéçºãšå·çãç¶ããæé«ã®ã¬ãœãªã³ã«ãªããŸãïŒ
âïž åã®èšäºã¯ãã¡ã
ð ã第4åïŒå š29ããŒãã«ã®å šäœé ç·å³ïŒå·¥å Žã®å¶åŸ¡ç€å±ãçµãã è€åäž»ããŒèšèšææ³ã
ð ãå šè©±ã€ããèªã¿ãèªäœç«¶éЬãœããéçºèšãã¬ãžã³
ð [Alma Core Pro / MDI Pro éçºãã¬ãžã³ãéã]
ð¡ ããªãExcelã§ããµãŒããŒåDBã§ããªãSQLiteãªã®ãïŒãåç¹ã®ç¬¬1åã¯ãã¡ã
ð [éçºèš 第1åãèªã]
⩠次ã®ã話ã¯ãã¡ã
ð ã第6åïŒ1ã¯ãšãª5äžDCã®å£ãã¶ã¡ç ŽãïŒSQLiteãã«ã¯ã€ã³ãµãŒãã§æ°çŸäžè¡ãç¬æ®ºããå€ã
ð€ å·¥å Žã®PLCå±ãæ¬æ°ã§æžãïŒçå¿«ïŒéåãªèªäœWebå°èª¬ãé£èŒäž
ð [ã転çãããã€ãŒãã³ã»ãã¹ã¯ã倧統é ã ã£ãä»¶ïŒç¬ïŒã第1話ãž]
ð [æ¬æ Œã¯ã©ã€ã SFãµã¹ãã³ã¹ãã¢ããã¯ã·ã§ã³ã»ãããã³ã«ã第1話ãž]