0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIが書いたそのコード、"著作権的に"会社で使って大丈夫ですか? — AI生成コードのライセンス地雷をCIで止める実践ガイド(来歴・スニペット照合・SBOM・ゲートの4段)

0
Posted at

はじめに:その「動くコード」、"使っていいか"は誰か確認しましたか

AIにコードを書いてもらう。もう、当たり前になりましたよね。

正直に言いましょう。僕らはAIが出したコードに対して、だいたい2つのことを確認しています。ひとつは 「ちゃんと動くか」 。もうひとつは、意識が高い現場なら 「安全か(脆弱性はないか)」 。ここまでは、テストを書いたりレビューしたりで、だんだん文化になってきました。

でも、3つ目の問いが、すっぽり抜け落ちてる気がするんです。

それが 「このコード、"ライセンス的に"会社で使っていいの?」 という問いです。

考えてみてください。AIが提案してくれたその20行、実は世界のどこかのGPLライセンスのリポジトリにある実装、ほぼそのままだったら? そのコードをあなたのプロダクトに入れて、お客さんに納品したり、有償SaaSとして売ったりした瞬間、「このプロダクト全体のソースコードを公開してください」という義務が、あとから降ってくるかもしれない。しかも、元のライセンス表示(誰が書いた、どのライセンスか)は、AIの出力からはきれいに剥がれていて、誰も気づかない。

こわいのは、「動く」し「安全」でも、この問題は起きるということなんです。テストは全部グリーン。脆弱性スキャンもクリーン。それでも、由来(来歴)がアウトなら、使っちゃいけない。検証している"軸"が、そもそも違うんですよね。

この記事は、その第3の軸 ―― 「使っていいか(ライセンス)」を、気合いや目視じゃなくて"仕組み"で検証する ための実践ガイドです。無料のツールから始められる4段のパイプラインを、CIに組み込むところまで持っていきます。

この記事の守備範囲(先に線引きしておきます)

  • これは 「動くが危険なコード(SQLインジェクションやXSSなどの脆弱性)」の話ではありません 。それは別軸の検証で、以前に書きました。
  • これは 「AIが存在しないパッケージ名をでっち上げる(パッケージ幻覚・slopsquatting)」の話でもありません 。それも別問題です。
  • この記事が扱うのは、「実在するOSSのコードが、ライセンス表示なしにあなたのコードへ静かに混ざり込む」 という、来歴とライセンスの問題です。

なぜAIの書いたコードに、ライセンスの地雷が埋まるのか

まず「なんでそんなことが起きるの?」を、構造として理解しておきましょう。ここが腑に落ちないと、対策が"お守り"になってしまうので。

理由はシンプルです。大規模言語モデル(LLM)は、大量の公開ソースコードを学習して作られている から。GitHubをはじめとする世界中のOSSが、学習データに含まれています。その中には、自由に使える寛容なライセンスのコードもあれば、GPLやAGPLのような「コピーレフト」 ―― つまり「これを使うなら、あなたのコードも同じ条件で公開してね」という強い条件つきのコードも、当然たくさんある。

AIは、学習したパターンを再構成して出力します。ほとんどの場合はオリジナルに近い"新しい"コードですが、ときどき、学習元のコードと"striking similarity(際立った類似性)"を持つ断片 を吐き出すことがある。この「striking similarity」というのは法律の世界の言葉で、「偶然ここまで似ることはあり得ない=実質コピーとみなせる」というレベルの類似を指します。

しかもタチが悪いのは、AIの出力からは、元コードの「ライセンス表示」や「著作者名」が消えている こと。この著作権表示・著者名・ライセンス条項といった情報を、専門用語で CMI(Copyright Management Information/著作権管理情報) と呼びます。人が普通にコピペするなら、まだヘッダーコメントに // Copyright ... が残っていて気づけるんですが、AIは中身のロジックだけを再構成するので、CMIがきれいに落ちる。この現象は 「license laundering(ライセンス・ロンダリング)」 ―― ライセンスの洗浄、と呼ばれたりします。地味だけど、けっこう本質を突いた表現だなと思います。

数字で見ると、どのくらいの頻度なのか

「そんなの、めったに起きないでしょ」と思うかもしれません。ここは煽らず、正確に見ておきましょう。

LiCoEval という研究(arXiv:2408.02487)が、14種類のLLMを評価しています。そこでの報告がわかりやすいので引用します。

  • 最も優秀なモデルでも、生成コードの 0.88%〜2.01% が、既存のOSS実装と「striking similarity」を持っていた。
  • そして、ほとんどのLLMは、その類似コードについて正しいライセンス情報を申告できなかった 。特にコピーレフトなライセンスで顕著だった。

この数字、どう受け止めますか。「たった1〜2%か」とも読めるし、「50〜100回に1回は地雷を踏みうる」とも読める。僕は後者で捉えるべきだと思っています。というのも、これは 典型的な"低確率×高影響"の非対称リスク だから。ほとんどは無害。でも、1回でもコピーレフトのコードを製品に取り込んで、それが表沙汰になれば、影響は「プロダクト全体のソース公開」や「取引先との契約トラブル」まで一気に跳ねる。頻度は低くても、期待値としては無視できないんですよね。

法律の世界でも、まだ答えは出ていない

参考までに、業界の空気感も。GitHub Copilotをめぐっては、OSS開発者らが起こした訴訟(Doe v. GitHub、2022年11月提訴)が続いています。多くの請求は2024年までに退けられましたが、「AIの出力からCMIを剥がすことがDMCA(デジタルミレニアム著作権法)§1202(b)違反にあたるか」 という論点が残り、2026年2月に米連邦第9巡回控訴裁判所で口頭弁論が行われました。この記事を書いている時点では、まだ判決は出ていません (筆者は法律の専門家ではないので、ここでは「係争中で決着していない」という現在地だけをお伝えします。判決の予測はしません)。

大事なのは、判決の行方そのものより、「ライセンス表示や来歴(provenance)を保つことは、それだけ重く見られている論点なんだ」 という感覚を持っておくことです。だからこそ、僕ら実装側は「AIが消してしまう来歴を、自分たちの仕組みで取り戻す」姿勢が要る、というわけです。


用語を、ぜんぶ"借り物"のたとえで整理する

ここで一回、専門用語をやさしく揃えておきましょう。AIコードのライセンス問題は、要は 「借り物かもしれないコードを、黙って自分のものとして使っていないか」 の話です。この比喩で全部つながります。

  • ライセンス … コードという貸し出し品についてくる「借用のルール」。返さなくていいけど、使い方に条件がつく。
  • permissive(寛容)ライセンス(MIT / Apache-2.0 / BSD など) … 「著作権表示さえ残してくれれば、あとは自由。商用もOK、改変もOK」という、ゆるい貸出条件。基本、味方。
  • copyleft(コピーレフト)ライセンス(GPL / AGPL / LGPL など) … 「使ってもいいけど、これを含む"あなたの成果物"も同じ条件で公開してね」という、強い条件つきの貸出。これが混ざると、プロダクト全体に条件が"伝染"しうる のが怖いポイント。「感染」とよく比喩されます。
  • CMI(著作権管理情報) … 貸出品に貼られた「持ち主の名札」。著作者名・著作権表示・ライセンス条項など。AIはこれを剥がしがち。
  • SPDX … ライセンスに世界共通の"型番"をつけた識別子。MITGPL-3.0-onlyApache-2.0 みたいに機械が読める形で書ける。
  • SCA(Software Composition Analysis) … 「あなたのプロダクトに、どこの誰の借り物が、いくつ入っているか」を棚卸しする作業・ツール。
  • スニペット照合(snippet scanning) … 借り物リスト(依存パッケージ)だけでなく、"ソースコードの断片そのもの"が既知のOSSと一致していないか を照合する、もう一段深い検査。AIコード対策ではここが効く。
  • SBOM(Software Bill of Materials) … 「ソフトウェアの部品表(成分表)」。何が・どのバージョンで・どのライセンスで入っているかの一覧。食品の原材料表示みたいなものです。標準フォーマットに CycloneDX(OWASP由来)や SPDX があります。

この地図さえ頭にあれば、これから出てくるコマンドが「あ、名札を確認してるのね」「成分表を作ってるのね」と読めるようになります。


大前提:どこを人間が決めて、どこをAI・ツールに任せるか

手を動かす前に、役割分担を固定します。ここを最初に決めておかないと、「ツールが緑だから出荷OK」みたいな、判断の丸投げ が起きます。ライセンスは最終的に"事業の判断"なので、機械に決めさせてはいけない領域があるんです。

工程 誰がやる 中身
どのライセンスを許可/禁止するか(ポリシー策定) 人間 MIT/Apacheは許可、GPL/AGPLは要審査、など会社の方針として決める
コードの由来・ライセンスの調査(スキャン) AI・ツール ScanCodeやSCAで機械的に検出
依存やスニペットの一致検出 ツール 決定的に照合できる部分
コピーレフト混入時に「使う/避ける/書き直す」の判断 人間 事業リスクとして受容するか決める
部品表(SBOM)の生成 ツール CIで自動生成
最終的な「出荷してよい」の承認 人間 不可逆な行為の最終ゲート

覚え方はいつもの通りです。「What(何を許すか)とWhy(なぜ)は人間、How(どう検出するか)はAI・ツール」 。検出は機械が速くて正確。でも「このリスクを背負って出荷するか」は、人間にしか決められません。


4段の検証パイプラインを組む

ここから本題。AIコードのライセンスを"仕組み"で守る、4段のパイプラインを作ります。いきなり全部やろうとすると重いので、上から順に、できるところから で大丈夫です。まず1段目だけでも、今日入ります。

段① 依存パッケージのライセンスを allowlist で縛る(いちばん軽い最初の一歩)

まずは足元から。AIが pip installnpm install を提案してくるたびに、その依存パッケージのライセンスが「うちで許可してるやつか」を機械的にチェックします。これは既存の無料ツールで一発です。

Node.js(license-checker)の例:

# 依存のライセンス一覧を出す
npx license-checker --summary

# 許可リスト以外が混ざっていたら失敗させる(CIで使える)
npx license-checker \
  --onlyAllow "MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC" \
  --excludePrivatePackages \
  || { echo "許可外ライセンスの依存が見つかりました"; exit 1; }

Python(pip-licenses)の例:

pip install pip-licenses

# ライセンス別に一覧化
pip-licenses --format=markdown --order=license

# 禁止ライセンスが含まれていたら落とす
pip-licenses --allow-only="MIT License;Apache Software License;BSD License;ISC License (ISCL)" \
  || { echo "許可外ライセンスの依存が見つかりました"; exit 1; }

ポイントは、「許可リスト(allowlist)方式」にすること 。「これはダメ」を列挙する禁止リストだと、知らないライセンスがすり抜けます。「これだけOK、それ以外は全部止めて人間が見る」のほうが、圧倒的に安全なんです。ここは、以前セキュリティの記事で書いた「default deny(迷ったら止める)」と同じ発想ですね。

段② ソースコードの断片そのものをスキャンする(AIコード対策の本丸)

段①は「宣言された依存」しか見られません。でも、AIが埋め込むコードは 依存パッケージじゃなくて、あなたのソースに直接コピーされた断片 です。ここを捕まえるには、ソースレベルのスキャン が要る。無料で定番なのが ScanCode Toolkit(AboutCodeプロジェクト)です。ライセンス・著作権・コードの由来を、ソースから直接検出してくれます。

# インストール(pipで入ります)
pip install scancode-toolkit

# src/ 配下をスキャンして、ライセンス・著作権・URLを検出し、JSONで出力
scancode \
  --license \
  --copyright \
  --url \
  --json-pp scancode-report.json \
  src/

# 出力の中身を軽く確認(検出されたライセンス識別子を拾う)
cat scancode-report.json | python -c "
import json, sys
data = json.load(sys.stdin)
found = set()
for f in data.get('files', []):
    for d in f.get('license_detections', []):
        found.add(d.get('license_expression'))
print('検出ライセンス:', sorted(x for x in found if x))
"

ScanCodeはSPDX形式の識別子で結果を返してくれるので、gpl-3.0agpl-3.0 みたいなコピーレフトが検出されたら、そこを人間が精査する、という運用に落とせます。「AIが書いたはずのファイルから、なぜかGPLの痕跡が出た」―― これが見えるだけで、事故率がぐっと下がります。

補足:ScanCodeのようなOSSツールは「ライセンステキストや既知パターンの照合」が主戦場です。もっと踏み込んで "世界中のOSSスニペットのデータベースと断片単位で突き合わせる" ところまでやりたい場合は、Black Duck・FOSSA・FossID といった商用のスニペット照合が強い領域です。まずは無料のScanCodeで土台を作り、規模が大きくなったら商用の段を足す、という順番がいいと思います。

段③ 部品表(SBOM)を自動生成して、成分を可視化する

検出できたら、次は 「うちのプロダクトには、こういう成分が入っています」を一覧化した部品表(SBOM)を残す 。これは監査・納品・脆弱性対応でも効いてくる、いわば"成分表示ラベル"です。OWASPの CycloneDX が軽量で、ライセンス情報もSPDXで持てます。

# 例: Node.js プロジェクトの SBOM を CycloneDX 形式で生成
npx @cyclonedx/cyclonedx-npm --output-file sbom.cdx.json

# 例: Python プロジェクトの SBOM を生成
pip install cyclonedx-bom
cyclonedx-py environment --output-format json --outfile sbom.cdx.json

生成したSBOMには各コンポーネントの licenses フィールドが入るので、ここを機械的に走査すれば「禁止ライセンスが成分に含まれていないか」を後段のゲートで判定できます。部品表は、未来の自分(や監査担当)への申し送り なんですよね。「このリリース時点で、何が入っていたか」を後から証明できる。これがあると、いざ問い合わせが来たときに、青ざめずに済みます。

段④ CIで「ライセンスゲート」を作り、コピーレフト混入を止める

最後に、①〜③を 人の善意に頼らず、パイプラインで強制 します。GitHub Actions で、プルリクのたびに走らせる例です。ここでの設計思想は、「決定的に真っ黒なもの(既知の禁止ライセンス)はblockで止める。グレー(未知・判定不能)はwarningにして人間に回す」 。全部blockにすると現場が回らなくなるので、濃淡をつけます。

# .github/workflows/license-gate.yml
name: license-gate

on:
  pull_request:

jobs:
  license-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Install scanners
        run: pip install scancode-toolkit

      - name: Scan source for licenses
        run: |
          scancode --license --copyright \
            --json-pp scancode-report.json src/

      - name: Enforce license policy
        run: python scripts/check_license_policy.py scancode-report.json

判定スクリプトはこんな感じ。禁止(コピーレフト)は即失敗、未知ライセンスは警告して人間の目に載せる ようにしています。

# scripts/check_license_policy.py
import json
import sys

# 会社ポリシーとして人間が決める(What/Why は人間の仕事)
ALLOWED = {"mit", "apache-2.0", "bsd-2-clause", "bsd-3-clause", "isc"}
FORBIDDEN = {"gpl-2.0", "gpl-3.0", "agpl-3.0", "lgpl-3.0"}  # コピーレフト = 要注意

def main(report_path: str) -> int:
    with open(report_path, encoding="utf-8") as f:
        report = json.load(f)

    forbidden_hits = []
    unknown_hits = []

    for file in report.get("files", []):
        path = file.get("path", "")
        for det in file.get("license_detections", []):
            expr = (det.get("license_expression") or "").lower()
            if not expr:
                continue
            # 禁止ライセンスの痕跡 = 決定的にブロック
            if any(bad in expr for bad in FORBIDDEN):
                forbidden_hits.append((path, expr))
            # 許可リストにも禁止にも無い = 未知。人間が見る
            elif not any(ok in expr for ok in ALLOWED):
                unknown_hits.append((path, expr))

    for path, expr in unknown_hits:
        print(f"::warning file={path}::未知のライセンス '{expr}' を検出。人間の確認が必要です")

    if forbidden_hits:
        for path, expr in forbidden_hits:
            print(f"::error file={path}::禁止ライセンス '{expr}' を検出。出荷前に必ず対処してください")
        return 1  # CI を失敗させる = マージをブロック

    print("ライセンスチェック: 禁止ライセンスの混入なし")
    return 0

if __name__ == "__main__":
    sys.exit(main(sys.argv[1]))

これで、「AIが書いたコードにGPLの痕跡が混ざったまま、こっそりマージされる」という事故を、仕組みとして 止められます。人間がうっかりしても、パイプラインは寝てても働いてくれる。ここが"気合い"と"仕組み"の決定的な差なんですよね。


そもそも、入口を絞る(生成の段階でやれること)

出てきたものを検査するだけじゃなく、「そもそも似すぎたコードを出させない/出たら気づける」 入口の工夫もあります。両論、正直に紹介します。

たとえば GitHub Copilotには「Suggestions matching public code(複製検出フィルタ)」 という設定があります。これは、AIの提案コードと周辺の 約150文字(おおよそ65レキシム以上) を、GitHub上の公開コードのインデックスと照合して、一致・近似が見つかったら ブロックする(Blockモード) か、一致した公開リポジトリとそのライセンスを表示する(Allowモード+code referencing) 機能です。組織単位でBlockに倒しておけば、"あからさまなコピー"はかなり減らせます。

ただし、正直に言っておくべき限界もあります。この手のフィルタは 「ほぼ完全一致」に近いものを捕まえるのが得意 で、少し変形されたコードや、ロジックだけ同じで書き方が違うケースまでは拾いきれません。だから、入口のフィルタ(ベンダー側の緩和策)と、出口のスキャン(自分たちの検査)は、両方あって初めて意味がある 。どちらか一方に寄りかからないのがコツです。


プロンプト例:AIを「来歴の調査係」として働かせる

ライセンスの最終判断は人間の仕事ですが、調査と整理はAIがめちゃくちゃ得意 です。ここでAIに任せるのは"判断"じゃなくて"下ごしらえ"。3本、そのまま使えるプロンプトを置いておきます。

プロンプト1:生成時に「来歴の自己申告」を義務づける

あなたはコードを生成するアシスタントです。以下のタスクのコードを書いてください。
ただし出力の最後に必ず「来歴セルフチェック」を付けてください:

- この実装は、特定の有名OSS実装と際立って似ている可能性があるか(Yes/No/わからない)
- 似ている可能性がある場合、想定される元プロジェクトとライセンス(推測でよいが「推測」と明記)
- コピーレフト(GPL/AGPL系)に由来する可能性の有無

注意: あなたの申告は「主張」であって「保証」ではありません。
最終判断のため、私が別途スキャン(ScanCode等)で必ず裏取りします。

これは魔法ではありません。研究(LiCoEval)でも、多くのモデルは正しいライセンスを申告できない と分かっています。だからこの申告を 信じてはいけない 。あくまで「怪しい所に人間の目線を寄せる、注意喚起の付箋」として使うのが正解です。

プロンプト2:ライセンス互換性のトリアージ

以下は、あるプロジェクトで検出されたライセンスの一覧です:
(scancode-report.json / SBOM から抽出したライセンス識別子を貼る)

このプロジェクトを「商用の閉じたソース(proprietary)」として配布する前提で、
各ライセンスを次の3段階に仕分けし、根拠を1行ずつ添えてください:
1. そのまま配布可(permissive: MIT/Apache 等、表示義務は残る)
2. 要注意・条件つき(copyleft や特殊条項。何が求められるかを明記)
3. 判定不能(情報不足。何が分かれば判定できるかを明記)

最終判断は人間(法務・責任者)が行います。あなたは分類の下書きに徹してください。
不確実なものを「たぶん大丈夫」と丸めないでください。

プロンプト3:コンプライアンス・レポートの初稿づくり

以下のスキャン結果とSBOMをもとに、経営・法務にも読める
「OSSライセンス・コンプライアンス報告」の初稿を作ってください。
- 検出されたライセンスの内訳(permissive / copyleft / 未知の件数)
- 特に注意すべきファイルとその理由(file:line で示す)
- 推奨アクション(書き直し / 代替ライブラリ / 表示追加 / 人間の審査)
- 未確認・情報不足の項目を「未検証」として明示

事実は貼った資料の範囲だけで書き、資料にない断定はしないでください。

3本に共通するのは、AIに「調べさせて・並べさせて・草案を書かせる」けれど、「決めさせない」 という姿勢です。判断の主語は、最後まで人間に置いておく。


安全に運用するための、外してはいけない4つ

仕組みを入れても、運用を間違えると意味がなくなります。ここは独立して回収しておきます。

  1. コピーレフト混入は「低確率×高影響」。頻度で油断しない。 GPL/AGPLの断片が1つ入るだけで、最悪はプロダクト全体のソース公開義務に波及しうる。「1〜2%だから」ではなく「当たると重い」で身構える。逆に、permissive(MIT/Apache)は表示義務さえ守れば怖くないので、過剰に恐れて開発が止まるのも避けたい。濃淡をつけて怖がる のが正解です。

  2. AIのライセンス申告を、最終判定に使わない。 前述の通り、研究上も多くのモデルは正しいライセンスを申告できません。AIの「これはMITだと思います」は、便利な付箋であって、証拠ではない。必ずScanCode等の決定的なスキャンで裏取り してください。

  3. 社内コードや秘密を、外部のスキャンSaaSに無断でアップロードしない。 ライセンススキャンをクラウドサービスに投げるとき、それは「自社の非公開ソースを外に出す」行為でもあります。AIやSaaSに渡す=外に出る 。契約・データ取り扱いを確認し、機密性の高いコードはローカルで完結するツール(ScanCodeはローカル実行できます)を選ぶ。ここは以前から何度も書いている鉄則ですね。

  4. 不可逆な行為(出荷・納品・OSS公開)は、人間の承認ゲートを必ず通す。 CIのライセンスゲートは"門番"であって"最終決裁者"ではありません。グレーが残ったまま、機械の緑だけで世に出さない。世に出したコードは、取り消せない 。取り消せないことは、人間が最後にうなずいてから。

つまずきポイント early warning

つまずき 何が起きる 対策
禁止リスト方式にする 知らないライセンスがすり抜ける 許可リスト(default deny)に倒す
依存スキャンだけで満足 ソースに直接埋まった断片を見逃す ScanCode等でソースレベルも見る
AIの申告を鵜呑み 誤ったライセンス判定で出荷 決定的スキャンで裏取り
全部をblockにする 現場が回らずゲートが形骸化 真っ黒はblock/グレーはwarningで人間へ
SBOMを作らない 後から成分を証明できない CIで毎ビルド自動生成

撤退ライン(無理をしない線)

  • コピーレフトの断片が製品コアに深く食い込んでいる … その場で判断せず、書き直し・代替ライブラリ・法務相談へ切り替える。
  • ツールが「判定不能」を大量に返す … スキャン設定や対象範囲を見直す。緑にするために基準を甘くしない。
  • 由来がまったく追えないコードが混ざっている … 出荷を止めて、その部分をクリーンルームで書き直す判断も含めて検討する。

おわりに:30秒のスキャンは、明日の自分への「あざっす」

ここまで、AIコードの「使っていいか(ライセンス)」を仕組みで守る話をしてきました。最後に、少しだけ肩の力を抜いて。

僕がこの話を大事だと思うのは、これが 「過去の自分を責めない技術」 だからなんです。

半年後、監査や取引先から「このコード、由来は大丈夫ですか?」と聞かれたとき。SBOMもスキャンログも何もなかったら、当時の自分を責めながら、真っ青な顔で調査に何日も溶かすことになる。でも、今日CIにライセンスゲートを1本入れておけば、そのとき未来の自分は、部品表を一枚出して「はい、確認済みです」と、涼しい顔で答えられる。

これって、「明日の自分が"あざっす"って言ってくれる仕込み」 なんですよね。誰かを責めるためのチェックじゃなくて、未来の自分と、一緒に働く仲間を守るための思いやり。30秒〜数分のスキャンが、そういう装置になってくれる。

そして、こうやって積み上げた「安全に、堂々と出荷できる状態」は、消えない資産になります。動くコードは一瞬で価値を失うこともあるけど、"由来がクリーンで、いつでも証明できる"という信頼 は、あなたのプロダクトの土台として、ずっと積み上がっていく。コードそのものだけじゃなく、それを安心して世に出せる仕組みも含めて、資産(Capital)なんだと思います。

今日の最初の一歩は、たった1つでいい。あなたのリポジトリで license-checkerpip-licenses を1回走らせて、許可リストを書いてみる。 それだけで、第3の軸の入口に立てます。

一緒に、AIと気持ちよく、そして胸を張って作っていきましょう。


生成AI活用エンジニア&3児のパパ。AI×開発の実践知を毎日発信しています → X: @akira_papa_AI


参考リンク(一次情報・事実照合先)

(注記: 本記事のコードは説明用の最小例です。license-checker / pip-licenses / scancode / GitHub Actions の各コマンド・オプションは公式ドキュメントに基づいて記載していますが、実行はお使いの環境・バージョンで確認してください。Pythonの判定スクリプトはロジックの雛形であり、実データでの動作は各自でご確認ください=動作未確認の雛形として扱ってください。法的判断については、必ず自組織の法務・専門家にご相談ください。筆者は法律の専門家ではありません。)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?