メむンコンテンツぞスキップ
芋出し画像

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,status

    post_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.csv

    OK 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.sha256

    OK 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-good

    destination 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のあるフォルダから始めおください。


     
     
    AIを䜿った副業準備ずSNS発信を、ひず぀ず぀実践。投皿サンプル・䌁画・文章づくりに圹立぀シヌトず具䜓䟋を届けたす。実瞟を盛らず、小さく䜜っお詊したい人ぞ。

    あなたぞのおすすめ