[インデックス 17281] ファイルの概要
このコミットは、Go言語の標準ライブラリである image
パッケージのデコード例 (decode_example_test.go
) を、Go Playgroundで実行可能にするための変更です。具体的には、外部ファイルから画像を読み込む代わりに、画像をBase64エンコードされた文字列としてコード内に直接埋め込むことで、ファイルシステムへのアクセスが制限されている環境でも例が動作するようにしています。
コミット
commit 205329aaf2ec9aff13c4052f6dfa552e65760ea9
Author: Dimitri Tcaciuc <dtcaciuc@gmail.com>
Date: Fri Aug 16 11:43:43 2013 +1000
image: Inline example image data to make it runnable on playground.
Use more compressed image to reduce source clutter.
Fixes #5983.
R=nigeltao, adg
CC=golang-dev
https://golang.org/cl/12513044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/205329aaf2ec9aff13c4052f6dfa552e65760ea9
元コミット内容
このコミットの元の内容は以下の通りです。
image: Inline example image data to make it runnable on playground.
Use more compressed image to reduce source clutter.
Fixes #5983.
R=nigeltao, adg
CC=golang-dev
https://golang.org/cl/12513044
変更の背景
この変更の主な背景は、Go Playgroundでのコード例の実行可能性を向上させることです。Go Playgroundは、Go言語のコードをブラウザ上で簡単に試せる便利なツールですが、セキュリティ上の理由からファイルシステムへのアクセスが制限されています。
src/pkg/image/decode_example_test.go
に含まれる Example()
関数は、元々 testdata/video-001.jpeg
というローカルファイルから画像を読み込んでいました。このため、Go Playgroundのようなファイルシステムにアクセスできない環境では、この例を実行してもエラーが発生し、期待される出力を確認することができませんでした。
コミットメッセージにある Fixes #5983
は、この問題に対応するためのものです。Issue 5983は、Go Playgroundで image
パッケージの例が動作しないという報告であり、このコミットはその問題を解決するために作成されました。
また、「Use more compressed image to reduce source clutter.」という記述から、埋め込む画像データがソースコードの可読性を損なわないよう、より圧縮された(データサイズの小さい)画像が選ばれたことが伺えます。これにより、コードの肥大化を防ぎつつ、必要な機能を提供しています。
前提知識の解説
このコミットを理解するためには、以下の前提知識が役立ちます。
Go Playground
Go Playgroundは、Go言語の公式ウェブサイトで提供されているオンラインツールです。ユーザーはGoのコードを記述し、サーバーサイドでコンパイル・実行し、その結果をブラウザで確認できます。これは、Go言語の学習、コードの共有、簡単なプロトタイピングに非常に便利です。 しかし、Go Playgroundにはいくつかの制約があります。
- ファイルシステムへのアクセス制限: セキュリティとサンドボックス化のため、Go Playgroundで実行されるコードはローカルファイルシステムにアクセスできません。これは、
os.Open
のようなファイル操作関数が通常動作しないことを意味します。 - ネットワークアクセス制限: 外部ネットワークへのアクセスも制限されています。
- 実行時間とメモリの制限: 無限ループや過剰なリソース消費を防ぐため、実行時間やメモリ使用量に制限があります。
Go言語の image
パッケージ
image
パッケージは、Go言語の標準ライブラリの一部であり、画像データの基本的な操作(デコード、エンコード、画像フォーマットの識別など)を提供します。
image.Decode(r io.Reader)
: この関数は、io.Reader
インターフェースを実装する任意のデータソースから画像データを読み込み、image.Image
インターフェースを実装する画像オブジェクトと、その画像フォーマットの文字列を返します。この柔軟性により、ファイル、ネットワークストリーム、メモリ上のデータなど、様々なソースから画像をデコードできます。image/jpeg
,image/png
,image/gif
などのサブパッケージは、特定の画像フォーマットのデコーダとエンコーダを提供します。これらのパッケージは、通常、その初期化サイドエフェクト(init
関数)によってimage.Decode
が対応するフォーマットを認識できるようにするためにインポートされます。
Base64エンコーディング
Base64は、バイナリデータをASCII文字列の形式に変換するエンコーディングスキームです。これは、バイナリデータをテキストベースのプロトコル(例: 電子メール、HTTP)や、テキストファイル(例: ソースコード)に埋め込む必要がある場合に特に有用です。
- Base64エンコードされたデータは、元のバイナリデータよりも約33%大きくなります。
- Go言語では、
encoding/base64
パッケージがBase64エンコーディングとデコーディングの機能を提供します。 base64.NewDecoder(base64.Encoding, io.Reader)
: Base64エンコードされたデータを読み込むためのio.Reader
を返します。
io.Reader
インターフェース
Go言語の io
パッケージは、I/O操作のための基本的なインターフェースを提供します。io.Reader
インターフェースは、データを読み込むための単一の Read
メソッドを定義しています。
type Reader interface {
Read(p []byte) (n int, err error)
}
このインターフェースのおかげで、image.Decode
のような関数は、データのソースがファイルであっても、ネットワーク接続であっても、メモリ上のバイトスライスであっても、同じ方法でデータを処理できます。
strings.NewReader
strings.NewReader
関数は、与えられた文字列から io.Reader
を作成します。これは、メモリ上の文字列データをファイルのように読み込みたい場合に便利です。
技術的詳細
このコミットの技術的な核心は、Go Playgroundの制約を回避しつつ、image.Decode
関数の柔軟性を活用することにあります。
-
ファイル読み込みからインメモリデータへの移行: 元のコードでは
os.Open("testdata/video-001.jpeg")
を使用してファイルから画像データを読み込んでいました。これはGo Playgroundでは動作しません。 変更後のコードでは、const data
という文字列定数にBase64エンコードされた画像データを直接埋め込んでいます。 -
Base64デコーダの利用: 埋め込まれたBase64文字列はそのままでは画像データとして扱えません。そこで、
encoding/base64
パッケージのbase64.NewDecoder
を使用します。base64.NewDecoder(base64.StdEncoding, strings.NewReader(data))
は、以下のステップで動作します。strings.NewReader(data)
: まず、Base64エンコードされた画像データを含む文字列data
からio.Reader
を作成します。これにより、文字列がまるでファイルのように読み取り可能になります。base64.NewDecoder(base64.StdEncoding, ...)
: 次に、このio.Reader
をbase64.NewDecoder
に渡します。base64.NewDecoder
は、入力ストリームからBase64エンコードされたデータを読み込み、それをデコードして元のバイナリデータとして出力する新しいio.Reader
を返します。
-
image.Decode
とio.Reader
の連携: 最終的に、image.Decode
関数には、base64.NewDecoder
が返したio.Reader
が渡されます。image.Decode
は、このリーダーからデコードされたバイナリ画像データを読み取り、画像オブジェクトを生成します。これにより、ファイルシステムにアクセスすることなく、画像デコードの例を完全にインメモリで実行できるようになります。 -
出力の調整: 画像データが変更されたため、
Example()
関数の期待される出力も更新されています。これは、テストが正しく機能し、新しい画像データに対応していることを保証するために重要です。
このアプローチにより、Go Playgroundのサンドボックス環境内で、ファイルシステムに依存しない形で画像デコードの例を実演することが可能になりました。これは、Go Playgroundの有用性を高め、ユーザーが image
パッケージの機能をより手軽に試せるようにするための重要な改善です。
コアとなるコードの変更箇所
変更されたファイルは src/pkg/image/decode_example_test.go
です。
--- a/src/pkg/image/decode_example_test.go
+++ b/src/pkg/image/decode_example_test.go
@@ -6,10 +6,11 @@
package image_test
import (
+ "encoding/base64"
"fmt"
"image"
"log"
- "os"
+ "strings"
// Package image/jpeg is not used explicitly in the code below,
// but is imported for its initialization side-effect, which allows
@@ -21,15 +22,15 @@ import (
)
func Example() {
- // Open the file.
- file, err := os.Open("testdata/video-001.jpeg")
- if err != nil {
- log.Fatal(err)
- }
- defer file.Close()
-
- // Decode the image.
- m, _, err := image.Decode(file)
+ // Decode the JPEG data. If reading from file, create a reader with
+ //
+ // reader, err := os.Open("testdata/video-001.q50.420.jpeg")
+ // if err != nil {
+ // log.Fatal(err)
+ // }
+ // defer reader.Close()\n+\treader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data))
+\tm, _, err := image.Decode(reader)
if err != nil {
log.Fatal(err)
}
@@ -60,20 +61,80 @@ func Example() {
}
// Output:\n \t// bin red green blue alpha
- // 0x0000-0x0fff: 471 819 7596 0
- // 0x1000-0x1fff: 576 2892 726 0
- // 0x2000-0x2fff: 1038 2330 943 0
- // 0x3000-0x3fff: 883 2321 1014 0
- // 0x4000-0x4fff: 501 1295 525 0
- // 0x5000-0x5fff: 302 962 242 0
- // 0x6000-0x6fff: 219 358 150 0
- // 0x7000-0x7fff: 352 281 192 0
- // 0x8000-0x8fff: 3688 216 246 0
- // 0x9000-0x9fff: 2277 237 283 0
- // 0xa000-0xafff: 971 254 357 0
- // 0xb000-0xbfff: 317 306 429 0
- // 0xc000-0xcfff: 203 402 401 0
- // 0xd000-0xdfff: 256 394 241 0
- // 0xe000-0xefff: 378 343 173 0
- // 0xf000-0xffff: 3018 2040 1932 15450
+ // 0x0000-0x0fff: 353 759 7228 0
+ // 0x1000-0x1fff: 629 2944 1036 0
+ // 0x2000-0x2fff: 1075 2319 984 0
+ // 0x3000-0x3fff: 838 2291 988 0
+ // 0x4000-0x4fff: 540 1302 542 0
+ // 0x5000-0x5fff: 319 971 263 0
+ // 0x6000-0x6fff: 316 377 178 0
+ // 0x7000-0x7fff: 581 280 216 0
+ // 0x8000-0x8fff: 3457 228 274 0
+ // 0x9000-0x9fff: 2294 237 334 0
+ // 0xa000-0xafff: 938 283 370 0
+ // 0xb000-0xbfff: 322 338 401 0
+ // 0xc000-0xcfff: 229 386 295 0
+ // 0xd000-0xdfff: 263 416 281 0
+ // 0xe000-0xefff: 538 433 312 0
+ // 0xf000-0xffff: 2758 1886 1748 15450
}\n+\n+const data = `\n+/9j/4AAQSkZJRgABAQIAHAAcAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdA\n+SFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2Nj\n+Y2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wzARCABnAJYDASIAAhEBAxEB/8QA\n+HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh\n+MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW\n+V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG\n+x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF\n+BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV\n+YnLRChYkNOEl8RcYGRomJygpKjU1Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE\n+hYaHiImKkpOUlZaXl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG+MnK0tPU1dbX2Nna4uPk5ebn6Onq\n+8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDlwKMD0pwzSiuK57QzGDxS7D6in8Y5ximnAPUfSlcq4m3ilUYp\n+2OKXHvRcVxnTtS7c07HNFK4DQPakC4PNOA+tOx70XAjK/So5gBGP94fzqfvUVx/qxx/EP51UXqRP4WSE\n+cmgjilP3jSEZqS0IO/NGDnpUiocDg/McDjvV6HTPOdVWYgsM5KcfzzQ2JySM2jp6VYu7SWzmMUwG4cgj\n+kMPUVBjjtTGtRu0Zopw+lFFxhinrGzuqqMsxAA9yaXFSRv5cqSEcIwYj6GpuZ30O30fSLKzhUpbpNMv3\n+5XGTn29BV28jt7pPLuIVljPBBFVreYx+VbqAjycgt3x14zRcNOxGyVFHQkIc/wA61exyKLbuzjdZ046d\n+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\n+`\n```
## コアとなるコードの解説
このコミットのコアとなる変更は、`Example()` 関数内での画像データの読み込み方法の根本的な変更と、それに伴う必要なパッケージのインポート、そして埋め込みデータの追加です。
1. **インポートの変更**:
* `- "os"`: `os` パッケージはファイルシステム操作(`os.Open` など)に必要ですが、インメモリデータに移行するため不要になり削除されました。
* `+ "encoding/base64"`: Base64エンコードされた文字列をデコードするために、`encoding/base64` パッケージが新しくインポートされました。
* `+ "strings"`: 文字列から `io.Reader` を作成するために、`strings` パッケージが新しくインポートされました。
2. **画像データ読み込みロジックの変更**:
元のコード:
```go
// Open the file.
file, err := os.Open("testdata/video-001.jpeg")
if err != nil {
log.Fatal(err)
}
defer file.Close()
// Decode the image.
m, _, err := image.Decode(file)
```
この部分は、`testdata/video-001.jpeg` というファイルを開き、そのファイルディスクリプタ(`io.Reader` を実装)を `image.Decode` に渡していました。
変更後のコード:
```go
// Decode the JPEG data. If reading from file, create a reader with
//
// reader, err := os.Open("testdata/video-001.q50.420.jpeg")
// if err != nil {
// log.Fatal(err)
// }
// defer reader.Close()
reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data))
m, _, err := image.Decode(reader)
```
この新しいロジックでは、以下の手順で画像データを `image.Decode` に渡しています。
* `strings.NewReader(data)`: まず、後述する `data` 定数に格納されたBase64文字列から `io.Reader` を作成します。これにより、文字列がバイトストリームとして扱えるようになります。
* `base64.NewDecoder(base64.StdEncoding, strings.NewReader(data))`: 次に、この文字列リーダーを `base64.NewDecoder` に渡します。`base64.NewDecoder` は、Base64エンコードされた入力ストリームをデコードし、元のバイナリデータを提供する新しい `io.Reader` を返します。
* `image.Decode(reader)`: 最終的に、このBase64デコーダが返す `io.Reader` が `image.Decode` に渡され、画像がデコードされます。
コメントアウトされた部分は、ファイルから読み込む場合の元のコードの例として残されています。
3. **`data` 定数の追加**:
ファイルの末尾に `const data` という新しい文字列定数が追加されました。
```go
const data = `
/9j/4AAQSkZJRgABAQIAHAAcAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdA
+SFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2Nj
+Y2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wARCABnAJYDASIAAhEBAxEB/8QA
... (中略) ...
+UVcTKW5s2jZtY/QDaOKKKK8ip8bPRj8KP/9k=
`
```
この定数には、Base64エンコードされたJPEG画像データが格納されています。このデータが、Go Playgroundのようなファイルシステムにアクセスできない環境でも画像デコードの例を実行可能にする鍵となります。
4. **期待される出力の更新**:
`Example()` 関数のコメントにある `// Output:` のセクションが更新されました。これは、埋め込まれた画像データが元の画像とは異なるため、デコード結果のピクセル値の分布(ヒストグラムのようなもの)も変わるためです。テストが正しくパスするためには、この出力も新しい画像データに合わせて更新される必要があります。
これらの変更により、`image` パッケージのデコード例は、Go Playgroundのような制約のある環境でも自己完結型で実行可能となり、ユーザーがより簡単にGoの画像処理機能を試せるようになりました。
## 関連リンク
* Go Playground: [https://go.dev/play/](https://go.dev/play/)
* Go言語 `image` パッケージのドキュメント: [https://pkg.go.dev/image](https://pkg.go.dev/image)
* Go言語 `encoding/base64` パッケージのドキュメント: [https://pkg.go.dev/encoding/base64](https://pkg.go.dev/encoding/base64)
* Go言語 `strings` パッケージのドキュメント: [https://pkg.go.dev/strings](https://pkg.go.dev/strings)
* Go言語 `io` パッケージのドキュメント: [https://pkg.go.dev/io](https://pkg.go.dev/io)
## 参考にした情報源リンク
* Go Playground Issue 5983: [https://github.com/golang/go/issues/5983](https://github.com/golang/go/issues/5983)
* Go CL 12513044: [https://golang.org/cl/12513044](https://golang.org/cl/12513044) (これはコミットメッセージに記載されているGoのコードレビューシステムへのリンクです)
* Base64 - Wikipedia: [https://ja.wikipedia.org/wiki/Base64](https://ja.wikipedia.org/wiki/Base64)
* Go by Example: Base64 Encoding: [https://gobyexample.com/base64-encoding](https://gobyexample.com/base64-encoding) (Base64エンコーディングのGoでの実装例)
* Go: The `io.Reader` Interface: [https://www.calhoun.io/what-is-an-io-reader/](https://www.calhoun.io/what-is-an-io-reader/) (Goの `io.Reader` インターフェースに関する解説)