
AIãæžããèªååã³ãŒããã忬ã§è©Šããªãïœæçš¿CSVã§åŠã¶ãå°ããªèªååã®æ€æ»
ãã¡ã€ã«ãã§ããããšã©ãŒãåºãªãã£ããããã§ããå€æãæ£ãããšã¯éããŸããã
æçš¿çªå·ã®ã0007ããã7ãã«ãªã£ãŠããããäºè¡ã«åããæç« ãäžè¡ã«ã€ãªãã£ãŠããããããç»é¢ã«ãå®äºããšåºãã ãã§ã¯ãæ®ãããã£ããã®ãæ®ã£ãããŸã§ã¯ããããŸããã
AIã«å°ããªã³ãŒããæžããŠããããããã«ãªããšãäœãåããã䜿ã£ãŠãããæ±ºãããšããã§è¿·ããŸããã³ãŒããå šéšèªããªããŸãŸè©Šãã®ã¯äžå®ãã§ããæ°ãã€ããŠç¢ºèªãããã ãã§ã¯ãäœãèŠãã°ããã®ããææ§ã§ãã
ãã®èšäºã§ã¯ã確èªããæ¡ä»¶ãå ã«æžããå®éã®ãã¡ã€ã«ã§çãåãããããŸããæ¶ç©ºã®æçš¿CSVãã確èªçšJSONãäœããå°ããªææãçšæããŸãããæå³çã«ééãã倿ãä¿®æ£çãåºåãå£ãç·Žç¿ãéããŠããåããããšãæ¡ä»¶ãæºãããããåããŸãã
GitHubã®AIçæã³ãŒããã¬ãã¥ãŒããããã®æ¡å ã§ããèŠä»¶ãšã®äžèŽããã¹ãã人ã«ãã確èªãæ±ãããŠããŸãããã®è³æã¯æ¬ææã®å¹æãå®å šæ§ãä¿èšŒãããã®ã§ã¯ãããŸãããããã§ã¯ããã®èãæ¹ãäžã€ã®åºå®ãããå°ããªåŠçã§ç·Žç¿ããŸãã
æåŸã«ãèªåã§äœã£ãæ¶ç©ºã®äžä»¶ã远å ããåãæ€æ»ãããçŽããŸããç®æšã¯ãæªç¥ã®ããã°ã©ã ãå®å šãšèšãåããããšã§ã¯ãªãããäœãæ®ããäœãæåŠããäœãšç §åããããããã®çµæãæ¡çšããã®ãããäžä»¶ã§èª¬æã§ããããšã§ãã
ç·Žç¿ZIPïŒ26ãã¡ã€ã«ã»èšå ¥ã·ãŒãä»ãïŒã¯ãèšäºæ«å°Ÿã®æ·»ä»ããç¡æã§ååŸã§ããŸããå±éåŸãREADME.mdãšguard.pyã®ãããã©ã«ãããå§ããŠãã ããã
å§ããåã«ã察象ãšéçãæ±ºãã
察象ã¯ããã§ã«Pythonãå®è¡ã§ããç°å¢ãããããã©ã«ããéããŠçãã³ãã³ããäžè¡ãã€å®è¡ã§ãã人ã§ããã³ãŒããæžãçµéšã¯å€ããªããŠãæ§ããŸããããPythonã®å°å ¥ã端æ«ã®åºæ¬æäœã¯æ±ããŸããã
èªãæéãå«ããŠ35ã60åã»ã©ã®ç·Žç¿ãæ³å®ããŠããŸããããã¯èšèšäžã®ç®å®ã§ãäžè¬èªè ã®æèŠæéãæž¬å®ããçµæã§ã¯ãããŸãããææã¯Pythonæšæºã©ã€ãã©ãªã ãã䜿ãã远å ããã±ãŒãžãå€éšAIãAPIããŒãææå¥çŽã¯äžèŠã§ãã
å¶äœæã®å®è¡æ€æ»ã¯Linuxã»Python 3.12.14ã§è¡ã£ãŠããŸããWindowsãmacOSãå¥ããŒãžã§ã³ã§ã®åäœã宿ž¬ããããã§ã¯ãããŸããã端æ«ã§ã®Pythonã®åŒã³åºãæ¹ãéãå Žåã¯ã以äžã®ãpythonããèªåã®ç°å¢ã§ç¢ºèªæžã¿ã®åŒã³åºãæ¹ã«çœ®ãæããŠãã ããã
æåã«å®ãããšã¯åã€ã§ãã
- 䜿ãã®ã¯å梱ã®å®å
šæ¶ç©ºããŒã¿ã ãã顧客ã売äžãå®åšã®æçš¿äºå®ãç§å¯æ
å ±ã¯å
¥ããªãã
- ææãå±éããç·Žç¿çšãã©ã«ãã§äœæ¥ããã管çè
æš©éãä»ãããããããªããšã©ãŒãæš©éæ¡å€§ã§è§£æ¶ããªãã
- çµæã¯ç¢ºèªçšã®JSONãSNSãžã®æçš¿ãäºçŽãå€éšãµãŒãã¹ãžã®åã蟌ã¿ã«ã¯äœ¿ããªãã
- å¥ãã©ã«ãã¯å®å
šãªéé¢ç°å¢ã§ã¯ãªãããã®ç·Žç¿ã«éã£ãããšãçç±ã«ãåºæãåäœãããããªãã³ãŒããä»äºçšPCã§å®è¡ããªãã
ããã°ã©ã ã®å®è¡ãèªããããŠããªã端æ«ãªããæ åœè ã«ç¢ºèªãããšããã§æ¢ããŠãã ãããå®ããŒã¿ããã§ã«å€ãã£ãå Žåã®åŸ©æ§ãããã®ææã®ç¯å²å€ã§ããäžæžããåå®è¡ãéãããçµç¹ã®æ åœè ãå©çšãµãŒãã¹ã®çªå£ãžçžè«ããŸãã
仿¥æ±ãã®ã¯ãæ¶ç©ºã®æå ·åºã®äºä»¶
ææã®åºèãäœçœãšç·ããæçš¿æãçªå·ãç»ååã¯ããã¹ãŠãã®ç·Žç¿ã®ããã«äœã£ãæ¶ç©ºã®ãã®ã§ããå®åšã®äŸé ŒãæåäºäŸã§ã¯ãããŸãããæå³çãªæ¬ é¥ãææçšã«äœæãããã®ã§ãå®éã«ç¹å®ã®AIãåºãã誀ãã®èšé²ã§ã¯ãããŸããã
å ¥å㯠fixtures/posts.csvãåã¯ã次ã®é çªã§åã€ã§ãã
post_id,caption,asset_name,statuspost_id ã¯æçš¿ãèŠåããæååãcaption ã¯æ¬æãasset_name ã¯ç»ååã®æååãstatus 㯠draft ãŸã㯠ready ã§ããç»åãã¡ã€ã«ãéãæ©èœã¯ãããŸãããready ã§ãæçš¿ã¯å®è¡ãããŸããã
äºä»¶ã«ã¯ãå é ãŒããåè§ã«ã³ããåŒçšç¬Šãæ¬æã®éäžã®æ¹è¡ãååŸã®ç©ºçœãå«ããŠãããŸããåçŽãªäžè¡ã ãã§è©ŠããšèŠèœãšãéãããèªåã§èŠã€ããããã§ãã
ãã®ææãåãä»ããã®ã¯ãBOMãªãUTF-8ãååã®ååãšé çªãäžèŽããã1ã100ä»¶ããã¡ã€ã«å šäœã64KiB以äžã®CSVã§ããIDã¯åè§æ°å1ã12æåã§éè€ãªããæ¬æã¯ç©ºçœã ãã§ã¯ãªã1ã1,000æåãç»ååã¯ç©ºçœã ãã§ã¯ãªã1ã100æåããã®ä»ã®å¶éã¯å梱ã®ä»æ§æžã«ãŸãšããŠããŸãã
ããã¯äžã®äžã®CSVå šéšã«åœãŠã¯ãŸãèŠåã§ã¯ãããŸãããããšãã°BOMä»ãUTF-8ã䜿ãã¢ããªããããŸãããæ¬ææã§ã¯å€æãåæã«æšæž¬ããæåŠããŸãã
Pythonã®CSVå ¬åŒè³æã¯ãCSVã®åºåããåŒçšã®éãã説æããéåžžã®èªã¿åãã§ã¯åé ç®ãæååãšããŠè¿ããšããŠããŸãããæ°åã«èŠããããæ°å€ã«ããããšæ±ºããã®ã¯ãCSVã®å¿ é åäœã§ã¯ãããŸãããä»åãçªå·ãå€ããªãã®ã¯ãç§ãã¡ãå ã«æ±ºããæ¡ä»¶ã§ãã
1ïŒå®è¡ããåã«ãåæ Œæ¡ä»¶ãæžã
ãŸã ã³ãŒãã¯åããããæ¬¡ã®äºé ç®ãã¡ã¢ããŸããæå ã®ãã§ãã¯ã·ãŒãã«ãåãæ¬ããããŸãã
1. å
¥åãã¡ã€ã«ã®äžèº«ãå€ããªãã
2. äºä»¶ã®é çªãšåé
ç®ã®å€ãå€ããªããçªå·ã®å
é ãŒããæ¬æã®æ¹è¡ã空çœãæ®ãã
3. 確èªçšã®æ°ãããã©ã«ããäœããæ¢åã®çµæãäžæžãããªãã
4. åäžè¶³ãçªå·éè€ãäžæãªç¶æ
ãªã©ã¯ãæšæž¬ããŠè£ããæ¢ããã
5. å®äºè¡šç€ºã ãã§ãªããå
¥åãšå®éã®åºåãç
§åããã
å ¥åãå€ããªãããšãšãå ¥åã©ããã®åºåãäœãããšã¯ãå¥ã®æ¡ä»¶ã§ããããå ¥åãšåºåãäžç·ã«å€ããã°ãäºã€ãæ¯èŒããã ãã§ã¯èŠéããŸããã ãããå®è¡åã®å ¥åã®ç¶æ ãæ®ããŸãã
ææãã©ã«ãã«ç§»åããå®è¡åã®SHA-256ãä¿åããŠãã ããã
python -B source_hash.py save fixtures/posts.csv original.sha256æ¢åã®ä¿åå ã¯æåŠãããŸãããã®åºæºãåŠçã®åŸã«äœãçŽããªãã§ãã ãããSHA-256ã¯ãã¡ã€ã«ã®å 容ããèšç®ããå€ã§ããååŸã®å€ãéãã°ãå°ãªããšãåããã€ãåã§ã¯ãããŸããããã ããããã ãã§äžèº«ã®æ£ãããã³ãŒãã®å®å šæ§ã蚌æãããããã§ã¯ãããŸãããåºæºãã¡ã€ã«ãŸã§å€æŽãããå Žåããæåããå ¥åã誀ã£ãŠããå ŽåãèŠåããããŸããã
次ã«ãå ¥åã®åœ¢åŒã確èªããŸãã
python -B guard.py check fixtures/posts.csvOK check records=5 ã«ç¶ããŠããã·ã¥ã衚瀺ãããŸãããã®æ®µéã§ã¯çµæãã©ã«ããäœããŸããã
ããã§ OK ã«ãªã£ãã®ã¯ãä»åã®å ¥åæ¡ä»¶ã«åã£ããšããããšã ãã§ããå®åšããæç« ã®æ£ç¢ºããæçš¿ã®èš±å¯ãç»åã®æš©å©ãŸã§ç¢ºèªãã衚瀺ã§ã¯ãããŸããã
å°ããªå®äºæ¡ä»¶ã¯ããäœãæ®ãããäºã€æžããäºä»¶ãšããŠèªãããšç¢ºèªãããã§ãã
2ïŒãã¡ã€ã«ã¯ã§ããã®ã«ãäžåæ Œã«ããŠã¿ã
æåã«äœ¿ã authored_fault.py ã¯ãäºã€ã®æ¬ é¥ãæå³çã«å ¥ããç·Žç¿çšã§ããå ¥åãã¡ã€ã«ãäžæžãããããã°ã©ã ã§ã¯ãããŸãããæ°ãããã©ã«ãã«ãæ¡ä»¶ãæºãããªãçµæãäœããŸãã
run-01-fault ãšãããã©ã«ãããŸã ãªãããšã確èªããŠãããäžè¡ãã€å®è¡ããŸãã
python -B authored_fault.py fixtures/posts.csv run-01-fault
python -B guard.py verify fixtures/posts.csv run-01-faultäžã€ç®ã¯ãæ¬ é¥å ¥ãã®çµæãäœã£ããšãã衚瀺ã§çµãããŸããäºã€ç®ã¯ FAIL validation ãšãªããpost_id mismatch ã caption mismatch ãå«ãå·®åãè¿ãã®ãæ£ããåäœã§ãã
ããã§ã倱æããã®ã§å ãžé²ããªãããšæããªããŠå€§äžå€«ã§ããä»åã¯ãéããŠã¯ãããªããã®ãæ¢ããããããšãææã§ãã
run-01-fault/review.json ãããã¹ããšãã£ã¿ã§éããŸããæåã®çªå·ã¯ãæååã® "0007" ã§ã¯ãªãæ°å€ã® 7 ã«ãªã£ãŠããŸãããŸããäžä»¶ç®ã®æ¬æã¯éäžã®æ¹è¡ã倱ã£ãŠããŸãã
CSVã®äžä»¶ç®ã¯ãç©ççãªãã¡ã€ã«ã®äžè¡ç®ãšã¯éããŸãããåŒçšç¬Šã®äžã«æ¹è¡ãå«ãããã§ããæ€æ»ã® record 3 ã¯ãèŠåºããé€ãäžä»¶ç®ã®ããŒã¿ãæããŸãã
次ã®ããã«ãå·®ãšæ¡ä»¶ãçµã³ä»ããŠã¡ã¢ããŠãã ããã
- çªå·ïŒæååã§æ®ãçŽæãªã®ã«æ°å€ã«ãªããå
é ãŒãã倱ã£ãã
- æ¬æïŒæåããã®ãŸãŸæ®ãçŽæãªã®ã«ãæ¹è¡ã空çœãžçœ®ãæãã£ãã
- å€å®ïŒçµæãã¡ã€ã«ã¯ååšããããæ¡çšããªãã
æ€æ»åšã®è¡šç€ºãåãã ãã§ãªããå CSVãšJSONã®è©²åœç®æãäžåºŠèŠæ¯ã¹ãã®ããã®æ®µéã®ä»äºã§ããæåŸã«åæ¬ããã·ã¥ãåç §åããŸãã
python -B source_hash.py verify fixtures/posts.csv original.sha256OK source-hash verify ãªãä»åã®ååŸæ¯èŒã¯äžèŽã§ãã以åŸããååŠçã®åŸã«ãã®ã³ãã³ãã䜿ããŸãã
3ïŒä¿®æ£çã§ãå¥ã®çµæãäœãçŽã
æ¬ é¥å ¥ããã©ã«ããæ¶ãå¿ èŠã¯ãããŸãããæ°ããååã䜿ããŸãã
python -B guard.py build fixtures/posts.csv run-02-good
python -B guard.py verify fixtures/posts.csv run-02-goodäž¡æ¹ã OK ã«ãªã£ãããrun-02-good/review.json ãš summary.txt ãéããŸãã
確èªããã®ã¯æ¬¡ã®ç¹ã§ãã
- ä»¶æ°ã¯5ãé çªã¯ 0007ã0012ã0100ã0101ã0200ã
- IDã¯åŒçšç¬Šã§å²ãŸããæååã§ãå
é ãŒããæ®ã£ãŠããã
- äžä»¶ç®ã®æ¬æã«æ¹è¡ãæ®ã£ãŠãããJSONã§ã¯æ¹è¡ã \n ãšè¡šç€ºãããããšãããã
- äºä»¶ç®ã®ã«ã³ããåä»¶ç®ã®åŒçšç¬Šãäºä»¶ç®ã®ååŸã®ç©ºçœãæ®ã£ãŠããã
- éèšã¯ draft: 2ãready: 3ãããã¯ç¢ºèªçšã®ä»¶æ°ã§ãæçš¿å®è¡æ°ã§ã¯ãªãã
JSONã§åŒçšç¬Šã \"ãæ¹è¡ã \n ãšè¡šçŸãããããšãšãæ¬æèªäœãå€ããŠããŸãããšã¯éããŸããæ€æ»åšã¯JSONãèªã¿æ»ããå€ãå ¥åãšæ¯èŒããŸããããã¹ãã®èŠãç®ã ãã§ãšã¹ã±ãŒã衚çŸãåããªãã§ãã ããã
build ã¯äœæåŸã«èªã¿æ»ããŠæ€æ»ããŸããç¶ã㊠verify ãå®è¡ããã®ã¯ãä¿åããããã¡ã€ã«ãã®ãã®ãæ¹ããŠç §åããããã§ããsummary.txt ã«ããããã·ã¥ãä»¶æ°ã ããä¿¡çšããŠçµããèšèšã«ã¯ããŠããŸããã
ãã ããäœæãšæ€æ»ã¯äžéšã®åŠçãå ±æããŠããŸããæ€æ»åšã«ãééãã¯ããåŸãŸããããã§ãå ã®å€ã人ãèŠã確èªãšã次ã®ãæ€æ»åšã詊ããæ®µéãéããŸãã
ããã§ãå®è¡åã®åæ¬ããã·ã¥ãšç §åããŸããå°ããªå®äºæ¡ä»¶ã¯ããåæ Œè¡šç€ºãèŠããã§ã¯ãªãããå ã®äºæ¡ä»¶ã«å¯ŸããŠãä¿åãããçµæãšåæ¬ä¿æã確ããããã§ãã
4ïŒåæ Œããã³ããŒãå£ããæ€æ»åšã詊ã
åæ ŒããããŒã¿ããéããŠããªãæ€æ»ã§ã¯ãäœã§ã OK ã«ããèŠãããã®æ€æ»ãšåºå¥ã§ããŸããã
ããã§ãåæ Œçµæãæ®ãããŸãŸãæ¬æäžãæãå€ããæ°ããã³ããŒãäœããŸãã
python -B corrupt_copy.py run-02-good run-03-corrupt
python -B guard.py verify fixtures/posts.csv run-03-corruptäžã€ç®ã¯ãã³ããŒåŽã®äžä»¶ç®ã®æ¬æã ãããç·Žç¿çšã®å¥ã®æã«çœ®ãæããŸããå ã®çµæãã©ã«ãã¯å€æŽããŸãããäºã€ç®ã¯ record 1: caption mismatch ãå«ã FAIL validation ã§æ¢ãŸãã¯ãã§ãã
ãã®ã³ããŒã«ã¯ãå ã®ä»¶æ°ãããã·ã¥ãèšããæ å ±ãæ®ã£ãŠããŸããããã§ãæ¬æã®äžäžèŽãæ€åºã§ãããã詊ããŠããŸãããããã·ã¥æ¬ãããããåæ Œããšããã ãã§ã¯è¶³ããªãããšãèŠããŸãã
æåŸã«ãæ®ããŠãããæ£åžžãªçµæã忀æ»ããŸãã
python -B guard.py verify fixtures/posts.csv run-02-goodãã¡ã㯠OKãå£ããã³ããŒã¯ FAILããã®éããèªåã§ç¢ºèªã§ããããæ€æ»åšãå°ãªããšãä»åã®æ¬æå€æŽãæåŠããããšã確ãããããŸããã
å šçš®é¡ã®æ¬ é¥ãæ€åºãã蚌æã§ã¯ãããŸãããããšãã°èªåãæ¡ä»¶ã«å ¥ããªãã£ã誀ãã¯ããã®æ€æ»ã ãã§ã¯æ¢ããããŸãããäœãæ€æ»ããŠãäœã¯èŠãŠããªãããèšé²ããŸãã
5ïŒæ¢ãŸã£ããšããå€ãçµæãæåæ±ãããªã
次ã¯åãæ£åžžãªåºåå ã§ããäžåºŠå®è¡ããŸãã
python -B guard.py build fixtures/posts.csv run-02-gooddestination already exists ã§æåŠãããŸãã空ã®ãã©ã«ãã§ãåå©çšããªã仿§ã§ããæ¢åã®çµæãä¿æãããããªã®ã§ãåé€ããŠç¡çã«éãã®ã§ã¯ãªããå¿ èŠãªãæ°ããååã䜿ããŸãã
å ¥åãã®ãã®ãæ¡ä»¶ãæºãããªãå Žåã詊ããŸãã
python -B guard.py build fixtures/duplicate_id.csv run-04-rejectedçªå·ã®éè€ã§æ¢ãŸãããã®å ¥åæ€æ»ã®å€±æã§ã¯æ°ããçµæãã©ã«ããäœããŸãããå¥ã®ç·Žç¿ãã¡ã€ã«ã«ã¯ãåäžè¶³ãäžæãªç¶æ ã空ã®ã¬ã³ãŒãããããŸãã詳ããæåŸ çµæã¯READMEã§ç¢ºèªã§ããŸãã
ãšã©ãŒã®èªã¿æ¹ã¯äžã€ã«åããŸãã
- FAIL validationïŒå
¥åãåºåãåºå®ä»æ§ã«åããªããã©ã®æ¡ä»¶ãã確ãããããŒã¿ã䜿ã£ããã¡ã€ã«ãèŠçŽãã
- FAIL I/OïŒèªã¿æžããå®äºããŠããªãããã¹ãå©çšæš©éã確èªãããèªåã§å€æã§ããªãæš©é倿Žã¯ããªãã
- æ£åžžçµäºïŒãã®ã³ãã³ããå®ããåŠçãçµãããæ¬ é¥äœæã³ãã³ãã®æ£åžžçµäºãããã®ã§ããçµäºãããã ããå質å€å®ã«äœ¿ããªãã
æ€æ»éåã®çµäºã³ãŒãã¯2ãèªã¿æžãã®åé¡ã¯3ã§ããã³ãã³ãã®äœ¿ãæ¹ã®èª€ãã§ã2ã«ãªããããæ°åã ãã§ãªã衚瀺ãèªã¿ãŸããéäžã®æžã蟌ã¿ã倱æããå Žåã¯ãæ°èŠãã©ã«ãã®äžéšã ããæ®ãå¯èœæ§ããããŸãããããæåæ±ãããããååã®æ£åžžãã©ã«ããä»åã®ææã ãšæã£ããããªãã§ãã ããã
äžè¡ãã€å®è¡ããæåŸ ããçµæãšéãã°ããã§æ¢ããŸããæ°ããååã§å詊è¡ããã®ã¯ãæ¢ãŸã£ãçç±ã説æã§ããŠããã§ãã
6ïŒçãã®ãªãäžä»¶ããèªåã§è¿œå ãã
ãããŸã§ã®ã³ãã³ããéãã ãã§ã¯ãææã®æé ãåçŸããæ®µéã§ããæåŸã¯ãäºæ³ããçµæãèªåã§æ±ºããŠãã詊ããŸãã
fixtures/new_record.csv ã¯ãåãæ¶ç©ºã®åºã®å ä»¶ç®ã远å ããèŠæ¬ã§ããèŠæ¬ã®ãŸãŸåããã ãã§çµãããããã¹ããšãã£ã¿ã§å¥åã® my-posts.csv ãšããŠä¿åããå ä»¶ç®ãäœãçŽããŠãã ãããUTF-8ã»BOMãªããéžã³ã衚èšç®ãœããã®èªåçãªæ°å€å€æã«ã¯ä»»ããŸããã
倿Žããã®ã¯ã次ã®åã€ã§ãã
1. å
é ãŒããå«ããæ¢åãšéãªããªãæ°ããIDãæ±ºããã
2. èªåã§èããæ¶ç©ºã®æçš¿æ¬æãæžããåè§ã«ã³ããæ¹è¡ãäžã€å«ããã
3. å®åšã®ç»åãåç
§ããªããæ¶ç©ºã®ç»ååã«ããã
4. draft ãš ready ã®ã©ã¡ãããèªåã§éžã¶ã
æ¬æã«ã«ã³ããæ¹è¡ãå«ããå Žåã¯ããã£ãŒã«ããäºéåŒçšç¬Šã§å²ã¿ãŸããæ¬æäžã®äºéåŒçšç¬Šã¯äºã€éããŸããæ¢åã®è¡ãèŠæ¬ã«ããŠæ§ããŸããããå£ããå Žåã«å ã®ãã¡ã€ã«ãŸã§çŽãããšããªãã§ãã ããã
å®è¡åã«çŽãžãå ä»¶ã®IDã®é çªãæ°ããæ¬æã®ã©ããæ®ãããããdraft ãš ready ã®äºæ³ä»¶æ°ãæžããŸããå ä»¶ç®ã draft ã«ãããªã3察3ãready ã«ãããªã2察4ã§ãã
æ°ãããã¡ã€ã«ã«ã€ããŠããå®è¡åããã·ã¥ãå¥åã§ä¿åããŠããé²ã¿ãŸãã
python -B source_hash.py save my-posts.csv my-original.sha256
python -B guard.py check my-posts.csv
python -B guard.py build my-posts.csv run-05-mine
python -B guard.py verify my-posts.csv run-05-mine
python -B source_hash.py verify my-posts.csv my-original.sha256åæ ŒããããåºåãéããŠèªåã®äºæ³ãšç §åãã忬ããã·ã¥ãå確èªããŸããæ°ããçªå·ãæååã®åãæ¬æã®ã«ã³ããæ¹è¡ãé çªãç¶æ ãšä»¶æ°ãå šéšäžèŽããŠããã§ããããã
éã£ãå Žåã¯ã次ã®é çªã§æ»ããŸãã
1. å
ã®èŠæ¬ã§ã¯ãªããèªåãä¿åãã my-posts.csv ãæå®ãããã
2. äºæ³ã¡ã¢ãšå
¥åãäžèŽããŠãããã
3. å
¥åã®æžåŒãæ¡ä»¶ãæºãããŠãããã
4. æå®ããçµæãã©ã«ããä»åã®ãã®ãã
ãã®æŒç¿ã§ã¯ãèªåã®å ¥åã«åãããŠãæ€æ»åšã®æ¡ä»¶ãç·©ããå¿ èŠã¯ãããŸããã仿§ãå€ããä»äºã¯ãå¥ã®èšèšã𿀿»ãå¿ èŠã§ãã
æåŸã«ããã®äžä»¶ã§ã¯ãäœã確ãããããæ¡çšã§ããã®ãããäºãäžæã§æžããŸããããšãã°ãåã«ãOKã ã£ããã§ã¯ãªããã远å ããIDãæååã®ãŸãŸä¿æããæ¬æã®æ¹è¡ãšå ä»¶ã®é çªãå ¥åãšç §åãããå®è¡ååŸã®å ¥åããã·ã¥ãäžèŽãããä»åã¯ç¢ºèªçšJSONãŸã§ã§ãSNSã«ã¯æž¡ããŠããªãããšèª¬æããŸããèªåã®çµæã«åãå å®¹ãžæžãæããŠãã ããã
次ã®å°ããªèªååã«ãæã£ãŠããã¡ã¢
空æ¬ã®ã·ãŒããåãããšãã¯ãä»åã®èšå ¥äŸã暪ã«çœ®ããŸãã
ç®çïŒæçš¿CSVãã確èªçšJSONã«ãã
å
¥åïŒæ¶ç©º5ä»¶ãUTF-8ã»BOMãªããåºå®4å
å€ããŠãããã®ïŒCSVããJSONãžã®è¡šçŸåœ¢åŒ
æ®ããã®ïŒ4é
ç®ã®å€ã»åã»é åºãå
¥åãã¡ã€ã«
æåŠãããã®ïŒåéããéè€IDãäžæãªç¶æ
ãæ¢ååºåå
äºæ³ïŒ5ä»¶ãdraft 2 / ready 3ãå
é ID "0007"
å®è¡åïŒåæ¬ããã·ã¥ãå¥ãã¡ã€ã«ã«ä¿å
å®è¡åŸïŒå€ã®æ¯èŒã忬ããã·ã¥ç
§åãçµæãã©ã«ã確èª
æ€æ»åšã®è©ŠéšïŒæ¬æãå€ããã³ããŒãæåŠããã
æ¡çšããªãæ¡ä»¶ïŒäžäžèŽãäžæãªçµäºãéäžã®åºå
ä»åèŠãŠããªããã®ïŒæçš¿èš±å¯ãç»åæš©å©ãå€éšå蟌ãä»»æã³ãŒãã®å®å
šæ§
次ã®è¡åïŒæ¡ä»¶ã«åã確èªçµæãæ®ããå®éçšã¯å¥é倿ãã忢±ã®åå ¥ãã¹ããå®è¡ã§ããŸãã
python -B -m unittest discover -s tests -vãã ãããã¹ãæ°ã®å€ãã ãã§å®å¿ããªãã§ãã ãããçšæããå ¥åãšæ¡ä»¶ã«ã€ããŠã®çµæã§ããæ¬åœã®æ¥åãããããCSVãæªç¥ã®ããã°ã©ã ãç¶²çŸ ããŠã¯ããŸããã
ãŸããPythonã®å®è¡å ¥å£ã«é¢ããå ¬åŒè³æã«ã¯ãçŽæ¥å®è¡ããå Žåã ãåããåŠçã if __name__ == "__main__": ã®äžãžçœ®ãæ¹æ³ããããŸãããã ãããã®å²ã¿ã®å€ãèªã¿èŸŒãå¥ã¢ãžã¥ãŒã«ã®åŠçãŸã§æ¢ããä»çµã¿ã§ã¯ãããŸããããimportãªãèªãã ãããmainãããããå®å šããšããå€å®ã¯ããªãã§ãã ããã
ä»åã§ããããã«ãããã®ã¯ãã³ãŒããçãç¶ããããšã§ã¯ãããŸããã詊ãåã«æ¡ä»¶ã決ããæ®ãã忬ãšå®éã®çµæãèŠãŠãæ¡çšãããæ¢ããããæ±ºããããšã§ãã
æåããä»äºã®å šäœãèªååããªããŠæ§ããŸãããäžã€ã®å°ããªåŠçã«ã€ããŠãå€ããŠã¯ãããªããã®ãšã確ãããç¯å²ãèšããããã®äžä»¶ãæã£ãŠã次ãžé²ã¿ãŸãããã
ç·Žç¿ãã¡ã€ã«ïŒç¡æïŒ
26ãã¡ã€ã«ãåé²ããŠããŸããå±éåŸãREADME.mdãšguard.pyã®ãããã©ã«ãããå§ããŠãã ããã