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

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

このコミットは、doc/effective_go.html ファイル内のエスケープされていない小なり記号 (<) を修正するものです。具体的には、HTMLエンティティである &lt; に置き換えることで、HTMLの構文エラーを防ぎ、ブラウザでの正しい表示を保証します。

コミット

commit 7f168f9ccf716183ea849f6d86250aecd5d4d0b4
Author: Rob Pike <r@golang.org>
Date:   Fri Oct 11 16:39:40 2013 -0700

    doc/effective_go.html: fix unescaped less-than character
    Why doesn't tidy complain about these?
    Found by manlio.perillo.
    Fixes #6571
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/14608044

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

https://github.com/golang/go/commit/7f168f9ccf716183ea849f6d86250aecd5d4d0b4

元コミット内容

doc/effective_go.html: fix unescaped less-than character Why doesn't tidy complain about these? Found by manlio.perillo. Fixes #6571

R=golang-dev, adg CC=golang-dev https://golang.org/cl/14608044

変更の背景

このコミットは、Go言語の公式ドキュメントの一つである Effective Go のHTML版 (doc/effective_go.html) に含まれていた、エスケープされていない小なり記号 (<) を修正するために行われました。HTMLでは、<body> タグ内などで直接 < 記号を使用すると、ブラウザがそれをHTMLタグの開始と誤解し、予期せぬ表示崩れや構文エラーを引き起こす可能性があります。特に、コード例を表示する際に、比較演算子や型パラメータなどで < が頻繁に使用されるため、このような問題が発生しやすくなります。

コミットメッセージには「Why doesn't tidy complain about these? (なぜtidyはこれらについて文句を言わないのか?)」という記述があり、これはHTMLバリデーターツールである tidy がこの問題を検出できなかったことに対する疑問を呈しています。これは、HTMLの構文チェックツールが常にすべての潜在的な問題を捉えられるわけではないことを示唆しています。

この問題は manlio.perillo によって発見され、GoのIssueトラッカーである Fixes #6571 にて報告されていました。このコミットは、その報告された問題を解決するためのものです。

前提知識の解説

HTMLエンティティ

HTML(HyperText Markup Language)は、ウェブページの構造を定義するためのマークアップ言語です。HTMLでは、特定の文字が特別な意味を持つため、それらの文字をテキストとして表示したい場合には、HTMLエンティティと呼ばれる特殊な表記を使用する必要があります。

例えば、< (小なり記号) はHTMLタグの開始を示すために使用されます。もし、コンテンツ内で < をそのまま記述すると、ブラウザはそれをタグの一部と解釈しようとします。これを避けるために、<&lt; というHTMLエンティティに変換されます。同様に、> (大なり記号) は &gt;& (アンパサンド) は &amp; と記述されます。

Effective Go

Effective Go は、Go言語の公式ドキュメントの一つで、Go言語を効果的に記述するためのヒントやイディオム、ベストプラクティスをまとめたものです。Go言語の設計思想や、Goらしいコードの書き方を学ぶ上で非常に重要なドキュメントであり、多くのGoプログラマーに読まれています。このドキュメントは、Go言語のウェブサイト上でHTML形式で公開されています。

HTMLバリデーター (例: HTML Tidy)

HTMLバリデーターは、HTMLドキュメントがW3C(World Wide Web Consortium)などの標準に準拠しているかどうかをチェックするツールです。構文エラー、非推奨の要素、アクセシビリティの問題などを検出するのに役立ちます。コミットメッセージで言及されている tidy は、そのようなツールの1つです。しかし、このコミットの背景にあるように、すべてのバリデーターがすべての潜在的な問題を検出できるわけではありません。特に、文脈に依存するような微妙な構文エラーは、見過ごされることがあります。

技術的詳細

このコミットの技術的な詳細は、HTMLドキュメントにおける文字エンコーディングとパースの挙動に集約されます。

HTMLパーサーは、ドキュメントを読み込む際に、< などの特殊文字をHTMLタグの開始として解釈します。もし、これらの文字がテキストとして表示されるべき場所でエスケープされていない場合、パーサーは予期せぬタグの開始と判断し、その後のコンテンツを誤って解釈する可能性があります。これにより、以下のような問題が発生します。

  1. 表示崩れ: ブラウザがHTMLを正しくレンダリングできず、レイアウトが崩れたり、一部のテキストが表示されなくなったりします。
  2. セキュリティリスク: 特定の状況下では、エスケープされていない特殊文字が悪意のあるスクリプトの挿入(クロスサイトスクリプティング: XSS)につながる可能性があります。ただし、このコミットのケースは表示上の問題が主であり、直接的なセキュリティ脆弱性ではありません。
  3. バリデーションエラー: HTML標準に準拠していないため、バリデーターツールがエラーを報告する可能性があります。今回のケースでは tidy が報告しなかったとありますが、これはツールの限界を示すものです。

このコミットでは、Go言語のコード例の一部としてHTML内に埋め込まれていた for i := 0; i < MaxOutstanding; i++ { という行が問題となっていました。この行の < 記号がエスケープされていなかったため、HTMLパーサーがこれをタグの開始と誤解していました。

修正は、この < をHTMLエンティティである &lt; に置き換えることで行われました。&lt; はブラウザによって < として正しく表示されるため、HTMLの構文を壊すことなく、意図した通りのコード例を表示できるようになります。

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

変更は doc/effective_go.html ファイルの1箇所のみです。

--- a/doc/effective_go.html
+++ b/doc/effective_go.html
@@ -2953,7 +2953,7 @@ func handle(r *Request) {
 }
 
 func init() {
-    for i := 0; i < MaxOutstanding; i++ {
+    for i := 0; i &lt; MaxOutstanding; i++ {
         sem &lt;- 1
     }
 }

コアとなるコードの解説

変更された行は、Go言語の init 関数内の for ループの条件式です。

  • 変更前: for i := 0; i < MaxOutstanding; i++ {

    • この行では、比較演算子である < がそのまま記述されています。HTMLの文脈では、これはタグの開始と解釈される可能性がありました。
  • 変更後: for i := 0; i &lt; MaxOutstanding; i++ {

    • < がHTMLエンティティの &lt; に置き換えられています。これにより、ブラウザは &lt; を単なるテキストとしての < と認識し、HTMLの構文を壊すことなく、コード例を正しく表示します。

この修正は非常に小さく見えますが、ウェブドキュメントの正確な表示と、HTMLの標準準拠を維持するためには不可欠な変更です。特に、技術ドキュメントにおいては、コード例が正しく表示されることが読者の理解に直結するため、このような細かな修正も重要となります。

関連リンク

参考にした情報源リンク

このコミットは、doc/effective_go.html ファイル内のエスケープされていない小なり記号 (<) を修正するものです。具体的には、HTMLエンティティである &lt; に置き換えることで、HTMLの構文エラーを防ぎ、ブラウザでの正しい表示を保証します。

コミット

commit 7f168f9ccf716183ea849f6d86250aecd5d4d0b4
Author: Rob Pike <r@golang.org>
Date:   Fri Oct 11 16:39:40 2013 -0700

    doc/effective_go.html: fix unescaped less-than character
    Why doesn't tidy complain about these?
    Found by manlio.perillo.
    Fixes #6571
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/14608044

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

https://github.com/golang/go/commit/7f168f9ccf71618ea849f6d86250aecd5d4d0b4

元コミット内容

doc/effective_go.html: fix unescaped less-than character Why doesn't tidy complain about these? Found by manlio.perillo. Fixes #6571

R=golang-dev, adg CC=golang-dev https://golang.org/cl/14608044

変更の背景

このコミットは、Go言語の公式ドキュメントの一つである Effective Go のHTML版 (doc/effective_go.html) に含まれていた、エスケープされていない小なり記号 (<) を修正するために行われました。HTMLでは、<body> タグ内などで直接 < 記号を使用すると、ブラウザがそれをHTMLタグの開始と誤解し、予期せぬ表示崩れや構文エラーを引き起こす可能性があります。特に、コード例を表示する際に、比較演算子や型パラメータなどで < が頻繁に使用されるため、このような問題が発生しやすくなります。

コミットメッセージには「Why doesn't tidy complain about these? (なぜtidyはこれらについて文句を言わないのか?)」という記述があり、これはHTMLバリデーターツールである tidy がこの問題を検出できなかったことに対する疑問を呈しています。これは、HTMLの構文チェックツールが常にすべての潜在的な問題を捉えられるわけではないことを示唆しています。

この問題は manlio.perillo によって発見され、GoのIssueトラッカーである Fixes #6571 にて報告されていました。このコミットは、その報告された問題を解決するためのものです。

前提知識の解説

HTMLエンティティ

HTML(HyperText Markup Language)は、ウェブページの構造を定義するためのマークアップ言語です。HTMLでは、特定の文字が特別な意味を持つため、それらの文字をテキストとして表示したい場合には、HTMLエンティティと呼ばれる特殊な表記を使用する必要があります。

例えば、< (小なり記号) はHTMLタグの開始を示すために使用されます。もし、コンテンツ内で < をそのまま記述すると、ブラウザはそれをタグの一部と解釈しようとします。これを避けるために、<&lt; というHTMLエンティティに変換されます。同様に、> (大なり記号) は &gt;& (アンパサンド) は &amp; と記述されます。

Effective Go

Effective Go は、Go言語の公式ドキュメントの一つで、Go言語を効果的に記述するためのヒントやイディオム、ベストプラクティスをまとめたものです。Go言語の設計思想や、Goらしいコードの書き方を学ぶ上で非常に重要なドキュメントであり、多くのGoプログラマーに読まれています。このドキュメントは、Go言語のウェブサイト上でHTML形式で公開されています。

HTMLバリデーター (例: HTML Tidy)

HTMLバリデーターは、HTMLドキュメントがW3C(World Wide Web Consortium)などの標準に準拠しているかどうかをチェックするツールです。構文エラー、非推奨の要素、アクセシビリティの問題などを検出するのに役立ちます。コミットメッセージで言及されている tidy は、そのようなツールの1つです。しかし、このコミットの背景にあるように、すべてのバリデーターがすべての潜在的な問題を検出できるわけではありません。特に、文脈に依存するような微妙な構文エラーは、見過ごされることがあります。

技術的詳細

このコミットの技術的な詳細は、HTMLドキュメントにおける文字エンコーディングとパースの挙動に集約されます。

HTMLパーサーは、ドキュメントを読み込む際に、< などの特殊文字をHTMLタグの開始として解釈します。もし、これらの文字がテキストとして表示されるべき場所でエスケープされていない場合、パーサーは予期せぬタグの開始と判断し、その後のコンテンツを誤って解釈する可能性があります。これにより、以下のような問題が発生します。

  1. 表示崩れ: ブラウザがHTMLを正しくレンダリングできず、レイアウトが崩れたり、一部のテキストが表示されなくなったりします。
  2. セキュリティリスク: 特定の状況下では、エスケープされていない特殊文字が悪意のあるスクリプトの挿入(クロスサイトスクリプティング: XSS)につながる可能性があります。ただし、このコミットのケースは表示上の問題が主であり、直接的なセキュリティ脆弱性ではありません。
  3. バリデーションエラー: HTML標準に準拠していないため、バリデーターツールがエラーを報告する可能性があります。今回のケースでは tidy が報告しなかったとありますが、これはツールの限界を示すものです。

このコミットでは、Go言語のコード例の一部としてHTML内に埋め込まれていた for i := 0; i < MaxOutstanding; i++ { という行が問題となっていました。この行の < 記号がエスケープされていなかったため、HTMLパーサーがこれをタグの開始と誤解していました。

修正は、この < をHTMLエンティティである &lt; に置き換えることで行われました。&lt; はブラウザによって < として正しく表示されるため、HTMLの構文を壊すことなく、意図した通りのコード例を表示できるようになります。

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

変更は doc/effective_go.html ファイルの1箇所のみです。

--- a/doc/effective_go.html
+++ b/doc/effective_go.html
@@ -2953,7 +2953,7 @@ func handle(r *Request) {
 }
 
 func init() {
-    for i := 0; i < MaxOutstanding; i++ {
+    for i := 0; i &lt; MaxOutstanding; i++ {
         sem &lt;- 1
     }
 }

コアとなるコードの解説

変更された行は、Go言語の init 関数内の for ループの条件式です。

  • 変更前: for i := 0; i < MaxOutstanding; i++ {

    • この行では、比較演算子である < がそのまま記述されています。HTMLの文脈では、これはタグの開始と解釈される可能性がありました。
  • 変更後: for i := 0; i &lt; MaxOutstanding; i++ {

    • < がHTMLエンティティの &lt; に置き換えられています。これにより、ブラウザは &lt; を単なるテキストとしての < と認識し、HTMLの構文を壊すことなく、コード例を正しく表示します。

この修正は非常に小さく見えますが、ウェブドキュメントの正確な表示と、HTMLの標準準拠を維持するためには不可欠な変更です。特に、技術ドキュメントにおいては、コード例が正しく表示されることが読者の理解に直結するため、このような細かな修正も重要となります。

関連リンク

参考にした情報源リンク