Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 18016] ファイルの概要

このコミットは、Go言語の標準ライブラリ内の複数のファイルに不足していた著作権表示を追加するものです。具体的には、src/pkg以下の様々なパッケージ(bytes, compress/flate, crypto/md5, image/color/palette, image/gif, os/signal, path/filepath, regexp, regexp/syntax, strconv, unicode, unicode/utf8)に、Go Authorsによる著作権表示とBSDスタイルのライセンス条項への参照が追加されています。

コミット

commit 64379b854f9e575bc88312225aab25cc7c244a4d
Author: ChaiShushan <chaishushan@gmail.com>
Date:   Tue Dec 17 06:52:32 2013 -0800

    all: add missing copyright
    
    R=golang-dev, iant
    CC=golang-dev
    https://golang.org/cl/43290043

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/64379b854f9e575bc88312225aab25cc7c244a4d

元コミット内容

all: add missing copyright

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/43290043

変更の背景

このコミットの背景には、オープンソースプロジェクトにおける著作権表示の重要性があります。Go言語はBSDライセンスの下で公開されており、これは非常に寛容なライセンスですが、その利用条件を明確にするためには、各ソースファイルに適切な著作権表示とライセンスへの参照を含めることが慣例であり、法的な観点からも推奨されます。

Goプロジェクトでは、通常、各ソースファイルの冒頭に以下の形式の著作権表示が記述されています。

// Copyright YYYY The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

このコミットは、Goプロジェクトの成長とコードベースの拡大に伴い、一部のファイルでこの標準的な著作権表示が漏れていたものを修正する目的で行われました。特に、自動生成されるファイルやテストファイルなど、通常の開発フローから外れたファイルで表示が漏れることがあったと考えられます。このような修正は、プロジェクト全体のライセンスの一貫性を保ち、将来的な法的な問題を未然に防ぐために重要です。

前提知識の解説

著作権とオープンソースライセンス

  • 著作権: 著作権は、文学、芸術、科学の分野における創作物(ソフトウェアコードを含む)の作者に与えられる法的権利です。これにより、作者は自身の作品の複製、配布、改変などを独占的に制御できます。
  • オープンソースライセンス: オープンソースライセンスは、ソフトウェアの利用、改変、配布に関する条件を定めたものです。これにより、著作権者は特定の条件下で他者が自身のソフトウェアを自由に使用することを許可します。
  • BSDライセンス: BSD(Berkeley Software Distribution)ライセンスは、非常に寛容なオープンソースライセンスの一つです。主な特徴は以下の通りです。
    • 自由な利用: 商用利用、非商用利用を問わず、自由にソフトウェアを利用できます。
    • 自由な改変: ソースコードを自由に改変し、派生作品を作成できます。
    • 自由な再配布: 改変の有無にかかわらず、自由にソフトウェアを再配布できます。
    • 帰属表示の義務: 再配布の際に、元の著作権表示とライセンス条項を含める必要があります。これが、このコミットで追加されている著作権表示の根拠となります。
    • 無保証: ソフトウェアは現状有姿で提供され、いかなる保証もありません。 Go言語は、このBSDライセンス(具体的には3条項BSDライセンス)を採用しており、そのコードベース全体でライセンスの一貫性を保つことが求められます。

Go言語の標準ライブラリ構造

Go言語のソースコードは、srcディレクトリ以下に整理されています。

  • src/cmd: Goコンパイラ、リンカ、その他のツールが含まれます。
  • src/pkg: Goの標準ライブラリのパッケージが含まれます。例えば、bytes, compress, crypto, image, os, path, regexp, strconv, unicodeなどがここにあります。 このコミットで変更されたファイルは、すべてsrc/pkg以下の標準ライブラリのファイルであり、Go言語の基本的な機能を提供する重要な部分です。

go generateと自動生成ファイル

Go言語には、go generateというコマンドがあります。これは、ソースコード内の特定のコメント(//go:generate)を解析し、それに続くコマンドを実行することで、コードを自動生成するための仕組みです。 このコミットで著作権表示が追加されたファイルの中には、src/pkg/compress/flate/fixedhuff.gosrc/pkg/regexp/syntax/perl_groups.goのように、「GENERATED BY」というコメントがあるファイルが含まれています。これは、これらのファイルが手動で書かれたものではなく、別のツールやスクリプトによって自動生成されたものであることを示しています。自動生成されるファイルの場合、生成スクリプト自体が著作権表示を埋め込むように修正されない限り、表示が漏れる可能性があります。このコミットでは、src/pkg/image/color/palette/gen.gosrc/pkg/strconv/makeisprint.gosrc/pkg/unicode/maketables.goといった、コードを生成する側のスクリプトにも修正が加えられており、生成されるファイルに著作権表示が含まれるように変更されています。

技術的詳細

このコミットの技術的な変更は非常にシンプルで、主にテキストの追加です。しかし、その影響範囲はGo言語の標準ライブラリの広範な部分に及びます。

変更のパターンは大きく分けて2種類あります。

  1. 既存のソースファイルの冒頭に著作権表示を追加: 多くのGoソースファイル(例: src/pkg/bytes/compare_test.go, src/pkg/image/gif/reader_test.goなど)では、ファイルの先頭に直接以下の4行が追加されています。

    // Copyright 2013 The Go Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style
    // license that can be found in the LICENSE file.
    

    これは、Goのコメント構文(//)を使用して、コードの実行には影響を与えない形で著作権情報を埋め込む標準的な方法です。

  2. コード生成スクリプトの修正: 自動生成されるファイル(例: src/pkg/crypto/md5/md5block.go, src/pkg/image/color/palette/palette.go, src/pkg/strconv/isprint.go, src/pkg/unicode/tables.go, src/pkg/regexp/syntax/perl_groups.go)の場合、そのファイルを生成するスクリプト自体が修正されています。

    • src/pkg/crypto/md5/gen.go: var programという文字列リテラルに著作権表示が直接埋め込まれています。これは、md5block.goを生成する際にこの文字列が書き出されるためです。
    • src/pkg/image/color/palette/gen.go: fmt.Printlnを使って著作権表示の文字列を出力するように変更されています。これにより、palette.goが生成される際に冒頭に著作権表示が追加されます。
    • src/pkg/strconv/makeisprint.go: 同様にfmt.Printfを使って著作権表示を出力するように変更されています。これにより、isprint.goが生成される際に冒頭に著作権表示が追加されます。
    • src/pkg/unicode/maketables.go: const progHeaderという文字列定数に著作権表示が追加されています。この定数は、tables.goなどのUnicode関連のテーブルファイルを生成する際のヘッダーとして使用されます。
    • src/pkg/regexp/syntax/make_perl_groups.pl: Perlスクリプト内で、print <<EOF;構文(ヒアドキュメント)を使って著作権表示を出力するように変更されています。これにより、perl_groups.goが生成される際に冒頭に著作権表示が追加されます。

これらの変更は、Goのコードだけでなく、Perlスクリプト(make_perl_groups.pl)にも及んでおり、Goプロジェクトが様々な言語のツールを使って構築されていることを示しています。

コアとなるコードの変更箇所

このコミットは、特定の「コア」となる機能の変更ではなく、コードベース全体にわたるメタデータ(著作権表示)の追加です。そのため、特定のアルゴリズムやデータ構造の変更はありません。

しかし、変更の性質上、以下のファイル群が主要な変更箇所として挙げられます。

  1. Goソースファイル(テストファイル含む)の冒頭:

    • src/pkg/bytes/compare_test.go
    • src/pkg/compress/flate/fixedhuff.go
    • src/pkg/crypto/md5/md5block.go
    • src/pkg/image/color/palette/palette.go
    • src/pkg/image/gif/reader_test.go
    • src/pkg/os/signal/example_test.go
    • src/pkg/path/filepath/path_windows_test.go
    • src/pkg/regexp/example_test.go
    • src/pkg/regexp/syntax/perl_groups.go
    • src/pkg/strconv/isprint.go
    • src/pkg/unicode/tables.go
    • src/pkg/unicode/utf8/example_test.go
  2. コード生成スクリプト:

    • src/pkg/crypto/md5/gen.go
    • src/pkg/image/color/palette/gen.go
    • src/pkg/regexp/syntax/make_perl_groups.pl
    • src/pkg/strconv/makeisprint.go
    • src/pkg/unicode/maketables.go

これらのファイルは、それぞれがGo標準ライブラリの異なる部分に属しており、このコミットが広範囲にわたる修正であることを示しています。

コアとなるコードの解説

各ファイルの変更は、基本的に以下のパターンに従っています。

Goソースファイルの場合

--- a/src/pkg/bytes/compare_test.go
+++ b/src/pkg/bytes/compare_test.go
@@ -1,3 +1,7 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
 package bytes_test
 
 import (

これは、ファイルの冒頭に著作権表示のコメントブロックを挿入する最も一般的な形式です。+で示されている行が追加された部分です。

コード生成スクリプトの場合(例: src/pkg/image/color/palette/gen.go

--- a/src/pkg/image/color/palette/gen.go
+++ b/src/pkg/image/color/palette/gen.go
@@ -14,6 +14,10 @@ import (
 )
 
 func main() {
+\tfmt.Println(`// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.`)\n+\tfmt.Println()\
  \tfmt.Println(\"// generated by go run gen.go; DO NOT EDIT\")
  \tfmt.Println()
  \tfmt.Println(\"// Package palette provides standard color palettes.\")

この例では、main関数内でfmt.Printlnを呼び出し、生成されるGoファイルの冒頭に著作権表示の文字列を出力するように変更されています。これにより、palette.goのような自動生成ファイルにも著作権表示が適切に付与されるようになります。

Perlスクリプトの場合(例: src/pkg/regexp/syntax/make_perl_groups.pl

--- a/src/pkg/regexp/syntax/make_perl_groups.pl
+++ b/src/pkg/regexp/syntax/make_perl_groups.pl
@@ -92,6 +92,10 @@ sub PrintClasses($@) {
 }
 
 print <<EOF;\n+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+\n // GENERATED BY make_perl_groups.pl; DO NOT EDIT.\n // make_perl_groups.pl >perl_groups.go\n \n```
ここでは、Perlのヒアドキュメント構文(`print <<EOF;`)を利用して、生成されるGoファイル(`perl_groups.go`)の冒頭に著作権表示を挿入しています。

これらの変更は、コードの機能には影響を与えませんが、プロジェクトの法務的な側面と、オープンソースとしての健全性を維持するために不可欠なものです。

## 関連リンク

*   Go言語の公式ウェブサイト: [https://golang.org/](https://golang.org/)
*   Go言語のBSDライセンスファイル: [https://golang.org/LICENSE](https://golang.org/LICENSE) (Goリポジトリ内のLICENSEファイル)
*   Go言語のコードレビューシステム (Gerrit): [https://go-review.googlesource.com/](https://go-review.googlesource.com/)
*   このコミットのGerritレビューページ: [https://golang.org/cl/43290043](https://golang.org/cl/43290043)

## 参考にした情報源リンク

*   Go言語のソースコードリポジトリ: [https://github.com/golang/go](https://github.com/golang/go)
*   BSDライセンスに関する情報 (Wikipediaなど): [https://ja.wikipedia.org/wiki/BSD%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9](https://ja.wikipedia.org/wiki/BSD%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9)
*   `go generate`コマンドに関するGoのドキュメント: [https://pkg.go.dev/cmd/go#hdr-Generate_Go_files_by_processing_source](https://pkg.go.dev/cmd/go#hdr-Generate_Go_files_by_processing_source)
*   Goのソースコードの慣例に関する情報 (Go Wikiなど): [https://go.dev/doc/effective_go#commentary](https://go.dev/doc/effective_go#commentary) (Effective Goのコメントに関するセクション)
*   Perlのヒアドキュメントに関する情報: [https://perldoc.perl.org/perlop#Quote-like-Operators](https://perldoc.perl.org/perlop#Quote-like-Operators)