Dev Study
← コードの外の約束 — 個人情報・ライセンス・生成物の権利
レッスン 7 / 10·約 9 分·第23期 コードの外の約束

GPL の条件は、コピーを渡したときに効きはじめる

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理今ここ
  7. DB保存

義務はコードそのものではなく、それで何をしたかに付いてきます。今回は GPL の条件がどの行為で動きはじめるかを、ライセンス本文の定義から読みます。

まず結論

GPLv3 の本文は、実行と私的な改変を propagate(伝播)の定義から外し、convey しない作成・実行・伝播をライセンスが有効な限り条件なしとして、convey(他者がコピーを作れる・受け取れるようにする)を本文の条件の下に置いています。サーバの中で動かすだけなら convey ではなく、ブラウザへ配る JavaScript はコピーを渡している、という区別がここから出てきます。

本回は一次ソースが何を書いているかの紹介で、個別の事案の適否は判断しません。

? 読む前に予測

改変した GPLv3 のプログラムを自社サーバで動かし、利用者はブラウザから画面を操作するだけです。GPLv3 の本文はこの「操作させるだけ」をどう扱っているでしょうか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

条件はどの行為に掛かっているか

既存クイズ「Chromiumとは(ふつう)」は、「ライセンスの条件を守れば、改変版を作って配布したり製品の土台にしたりできる」を正解にしています。ではその条件は、いつ効きはじめるのか。GPLv3 の本文は、行為を定義で切り分けて答えています(Chromium のライセンス自体は本回では扱いません)。

まず propagate(伝播)です。

To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy.

実行と、私的なコピーの改変は、最初から外されています。 次に convey です。

To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

convey は propagate の一部で、他者の手元にコピーが生じるものです。ネットワーク越しにやりとりするだけでは当たらない、と本文自身が書いています。

そして §2 が、条件をどこに掛けるかを定めます。

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force.

Conveying under any other circumstances is permitted solely under the conditions stated below.

直前の文が、自分のためだけに改変・実行させる相手へ渡す場合を別に扱っており、「それ以外の convey」という意味です。

GPLv3 §0・§2 の定義で見た、行為と条件の関係
実行する・私的なコピーを改変するpropagate の定義から除外
許諾なしなら侵害になる行為
propagate(伝播)複製・配布・公衆への提供など
そのうち、他者がコピーを作れる・受け取れるもの
convey本文の条件の下でだけ許される(§2)
  • ・convey しない作成・実行・伝播は、ライセンスが有効な限り条件なし(§2)
  • ・コピーを渡さないネットワーク越しのやりとりは convey ではない(§0)

「GPL を使ったら全部公開」は、この構造と合いません。義務の入口は「使った」ではなく「渡した」です。

具体実物

サーバの中で動く改変版と、AGPL の §13

改変した GPL のプログラムを自社サーバで動かし、利用者はブラウザから結果を受け取るだけ、という構成を考えます。本文の定義では、利用者の手元にそのプログラムのコピーは生じていません。

FSF の GPL FAQ も同じ向きで答えます。#GPLRequireSourcePostedPublic は an organization can make a modified version and use it internally without ever releasing it outside the organization. とし、続けて But if you release the modified version to the public in some way, the GPL requires you to make the modified source code available と書きます(原文は if を強調)。#UnreleasedMods は Web サイトで改変版を動かす会社について the company does not have to release the modified sources. と答えます。

では「サーバで動かすだけなら無関係」と一般化できるか。同じ FAQ 項目は The situation is different when the modified program is licensed under the terms of the GNU Affero GPL. と続けます。AGPLv3 の §0 には GPLv3 と同じ Mere interaction ... is not conveying. がありますが、§13 が別の義務を足しています。

Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version ...

AGPL は convey の定義を広げたのではなく、改変したときに、ネットワーク越しの利用者へのソース提供を義務として足しています。文言上の条件は if you modify the Program です。

✓ ここまでの確認

AGPLv3 の §13(ネットワーク越しの利用者へのソース提供)について、原文の文言に合う説明はどれですか。

抽象原理

渡したとき、どこまでが1つのプログラムか

convey した後の範囲は、何と何が1つのプログラムかで変わります。本文 §5 は、独立した別作品を同じ媒体にまとめただけのものを aggregate と呼びます。

Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

ただし本文は、どこからが combined with it such as to form a larger program なのかの判定方法を書いていません。FSF の FAQ #MereAggregation は、まずこう断ります。

Where's the line between two separate programs, and one program with two parts? This is a legal question, which ultimately judges will decide.

そのうえで FSF の見解として、通信の仕組みと、やりとりの中身の両方で見るとします。同じ実行ファイルなら definitely combined、共有アドレス空間でリンクして動かすなら almost surely。パイプ・ソケット・コマンドライン引数なら normally are separate programs ですが、But if the semantics of the communication are intimate enough, exchanging complex internal data structures なら1つとみなす根拠になり得る、と続けます。

第1期「仮想メモリ」で見たとおり、変換表はプロセスごとに別々です。しかし FSF の基準は、プロセスが分かれているかだけでは決まりません。「別プロセスなら必ず別プログラム」も「1つ入れたら全部に及ぶ」も、FAQ の限定(normally・almost surely)を落とした単純化です。

具体実物

ブラウザへ配る JavaScript

ブラウザへ届く JavaScript は、利用者の端末にコピーが届きます。FAQ #UnreleasedMods は、先ほどの答えに続けてこう対比します。

Compare this to a situation where the web site contains or links to separate GPLed programs that are distributed to the user when they visit the web site (often written in JavaScript, but other languages are used as well). In this situation the source code for the programs being distributed must be released to the user under the terms of the GPL.

サーバ側の改変版は公開不要、ブラウザへ配られる GPL のプログラムはソースを利用者に渡す必要がある——同じサイトの中で、FSF の答えがコピーの行き先で分かれています。

FAQ がここで書いているのは distributed to the user when they visit the web site までです。CDN から直接読み込ませる場合や、縮小済みのファイルでどんな形のソースを添えるかは、本回では確かめていません。

✓ ここまでの確認

同じ Web サイトで、改変した GPL のプログラムがサーバで動き、別の GPL の JavaScript がブラウザへ配られています。FSF の GPL FAQ はこの2つをどう答えていますか。

⇄ 2つを見比べる
具体例 A

サーバで動く、改変した GPL のプログラム

利用者はネットワーク越しに結果を受け取るだけで、プログラムのコピーは渡っていません。本文 §0 はこれを convey ではないと定義し、FAQ は改変ソースの公開は不要と答えます。AGPL なら改変時に §13 の文言が関係します。

何が起きているか表
行為 該当する定義
サーバで実行 propagate から除外(§0)
結果を画面に返す convey ではない(§0)
FAQ の答え 改変ソースの公開は不要(GPL の場合)
具体例 B

ブラウザへ配る GPL の JavaScript

サイトを訪れた利用者の端末に、プログラムのコピーが届きます。FAQ はこれを配布される場合として、ソースを GPL の条件で利用者に渡す必要があると答えます。

何が起きているか表
行為 該当する定義
端末へ JS を送る 他者がコピーを受け取る = convey(§0)
FAQ の答え ソースを利用者に渡す必要がある

同じサイト・同じライセンスなのに、FAQ の答えが分かれるのはなぜでしょうか。

「利用者の手元に、何が残るか」を両方で比べてください。

ここから先は法務へ

(a) エンジニアが気づける信号

  • 依存に GPL・AGPL・LGPL の名前を含むものが増えた
  • そのコードがブラウザ向けのバンドルや、顧客に渡す配布物に入る
  • AGPL のプログラムを改変してサーバで動かしている
  • 別プロセスでも、複雑な内部データ構造をやりとりしている

(b) 法務に持っていく材料

  • パッケージ名・版・ライセンスの文字列
  • 改変の有無と、どこで動くか(サーバ/ブラウザ/配布物)
  • 自社コードとの通信の仕組みと、やりとりする情報の種類

(c) この回が言っていないこと

  • 自社の構成が convey に当たるか、結合か別プログラムか(FAQ 自身が、境目は裁判官が決めると書いています)
  • convey するときにソースをどの方法で提供するか(§6 は本回で精読していません)
  • LGPL の条件と、GPLv3 以外の版の扱い

この章のまとめ

  • GPLv3 §0 は 実行と私的な改変を propagate から外し、convey を「他者がコピーを作れる・受け取れる」に絞る。
  • §2 は convey しない作成・実行・伝播を、ライセンスが有効な限り条件なしとする。「使ったら全部公開」は本文と合わない。
  • コピーを渡さないネットワーク越しのやりとりは convey ではない。ただし AGPL は改変時に §13 の義務を足す。
  • ブラウザへ配る JavaScript は利用者にコピーが届く。FAQ は ソースを渡す必要がある と答える。
  • 1つのプログラムの境目は、FAQ 自身が 裁判官が決める と書く。プロセスの分け方だけでは決まらない。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 3正解: 0

「2つのプログラムか、2つの部分を持つ1つのプログラムかの境目は、最終的に裁判官が決める」という文は、どこに書かれていますか。

用語集(3語)
propagate(伝播)
GPLv3 §0 の定義語。許諾なしに行えば著作権侵害の責を負う行為のうち、コンピュータでの実行と私的なコピーの改変を除いたもの。複製・配布・公衆への提供を含む。
convey
GPLv3 §0 の定義語。propagate のうち、他者がコピーを作れる・受け取れるようにするもの。コピーを渡さないネットワーク越しのやりとりは含まない。
aggregate
GPLv3 §5 の定義語。性質上の拡張でも結合でもない独立した作品を、同じ記憶・配布媒体にまとめたもの。(まとめたことで利用者の権利を個々の作品が許す以上に制限しない場合に限る)含めても他の部分にライセンスは及ばない。