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

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

このコミットは、Go言語の公式ウェブサイト(golang.org)のフロントページにおけるブログ記事の表示方法を更新するものです。具体的には、Google Feeds APIの使用を廃止し、Goブログが提供する新しいJSONフィードを利用して、特集記事を動的に取得・表示するように変更されています。これにより、外部APIへの依存を減らし、より直接的かつ効率的な方法でブログコンテンツを統合しています。

コミット

commit f0c3d264731afe8c252acae89013ee1865656cbe
Author: Andrew Gerrand <adg@golang.org>
Date:   Wed May 8 09:23:50 2013 -0700

    doc: pull front page featured articles using new blog JSON feed
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/9288045
---
 doc/root.html | 41 +++++++++++++++++++++--------------------\n 1 file changed, 21 insertions(+), 20 deletions(-)\n\ndiff --git a/doc/root.html b/doc/root.html
index 34915c025d..81792671b6 100644
--- a/doc/root.html
+++ b/doc/root.html
@@ -84,41 +84,38 @@ Linux, Mac OS X, Windows, and more.\n \n <div style=\"clear: both;\"></div>\n \n-<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script>\n <script type=\"text/javascript\">\n-google.load(\"feeds\", \"1\");\n+\n+function readableTime(t) {\n+\tvar m = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\",\n+\t\t\"August\", \"September\", \"October\", \"November\", \"December\"];\n+\tvar p = t.substring(0, t.indexOf(\"T\")).split(\"-\");\n+\tvar d = new Date(p[0], p[1]-1, p[2]);\n+\treturn d.getDate() + \" \" + m[d.getMonth()] + \" \" + d.getFullYear();\n+}\n \n function feedLoaded(result) {\n-\tif (result.error) {\n-\t\tconsole.log(result.error);\n-\t\treturn;\n-\t}\n \tvar blog = document.getElementById(\"blog\");\n \tvar read = blog.getElementsByClassName(\"read\")[0];\n-\tfor (var i = 0; i < result.feed.entries.length && i < 2; i++) {\n-\t\tvar entry = result.feed.entries[i];\n+\tfor (var i = 0; i < result.length && i < 2; i++) {\n+\t\tvar entry = result[i];\n \t\tvar title = document.createElement(\"a\");\n \t\ttitle.className = \"title\";\n-\t\ttitle.href = entry.link;\n-\t\ttitle.innerHTML = entry.title;\n+\t\ttitle.href = entry.Link;\n+\t\ttitle.innerHTML = entry.Title;\n \t\tblog.insertBefore(title, read);\n \t\tvar extract = document.createElement(\"div\");\n \t\textract.className = \"extract\";\n-\t\textract.innerHTML = entry.contentSnippet;\n+\t\textract.innerHTML = entry.Summary;\n \t\tblog.insertBefore(extract, read);\n \t\tvar when = document.createElement(\"div\");\n \t\twhen.className = \"when\";\n-\t\tvar pub = entry.publishedDate.split(\" \").slice(1,3).join(\" \");\n-\t\twhen.innerHTML = \"Published \" + pub\n+\t\twhen.innerHTML = \"Published \" + readableTime(entry.Time);\n \t\tblog.insertBefore(when, read);\n \t}\n }\n \n-function init() {\n-\t// Load blog feed.\n-\tvar feed = new google.feeds.Feed(\"http://blog.golang.org/feeds/posts/default\");\n-\tfeed.load(feedLoaded);\n-\n+$(function() {\n \t// Set up playground.\n \tplayground({\n \t\t\"codeEl\":        \"#learn .code\",\n@@ -128,7 +125,11 @@ function init() {\n \t\t\"shareRedirect\": \"http://play.golang.org/p/\",\n \t\t\"toysEl\":        \"#learn .toys select\"\n \t});\n-}\n \n-google.setOnLoadCallback(init);\n+\t// Load blog feed.\n+\t$(\'<script/>\').attr(\'text\', \'text/javascript\')\n+\t\t.attr(\'src\', \'http://blog.golang.org/.json?jsonp=feedLoaded\')\n+\t\t.appendTo(\'body\');\n+});\n+\n </script>\n```

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

[https://github.com/golang/go/commit/f0c3d264731afe8c252acae89013ee1865656cbe](https://github.com/golang/go/commit/f0c3d264731afe8c252acae89013ee1865656cbe)

## 元コミット内容

このコミットの目的は、Go言語の公式ウェブサイトのフロントページに表示されるブログ記事の取得方法を変更することです。以前はGoogle Feeds APIを使用してブログのRSS/Atomフィードを解析していましたが、このコミットではGoブログが直接提供する新しいJSON形式のフィードを利用するように切り替えます。これにより、外部サービスへの依存を減らし、コンテンツの取得と表示をより効率的に行うことを目指しています。

## 変更の背景

この変更の背景には、いくつかの要因が考えられます。

1.  **Google Feeds APIの非推奨化または機能変更**: Google Feeds APIは、ウェブサイトにRSS/Atomフィードを簡単に組み込むための便利なツールでしたが、GoogleのAPI戦略の変更により、非推奨になったり、機能が制限されたりする可能性があります。このような外部APIへの依存は、将来的なメンテナンスコストや予期せぬサービス停止のリスクを伴います。
2.  **パフォーマンスの向上**: Google Feeds APIを介してデータを取得するよりも、Goブログが直接提供する最適化されたJSONフィードを直接利用する方が、ネットワークレイテンシや処理オーバーヘッドが削減され、ページのロード時間が短縮される可能性があります。
3.  **柔軟性の向上**: 独自のJSONフィードを使用することで、Goブログ側で提供するデータの形式や内容をより細かく制御できるようになります。これにより、ウェブサイトの表示要件に合わせて、必要な情報のみを効率的に提供することが可能になります。例えば、Google Feeds APIが提供しない特定のメタデータを含めることができるようになります。
4.  **依存関係の削減**: 外部のサードパーティAPIへの依存を減らすことは、セキュリティ、信頼性、および長期的な保守性の観点から望ましいプラクティスです。

## 前提知識の解説

このコミットを理解するためには、以下の技術的な概念について知っておく必要があります。

1.  **Google Feeds API**: Googleが提供していたJavaScriptライブラリで、ウェブページ上でRSSやAtomフィードを簡単に解析し、表示するためのものでした。`google.load("feeds", "1");` や `new google.feeds.Feed(...)` といったAPIを通じて利用されました。しかし、このAPIは後に非推奨となり、最終的にシャットダウンされました。
2.  **JSON (JavaScript Object Notation)**: 軽量なデータ交換フォーマットです。人間にとっても読み書きしやすく、機械にとっても解析しやすい構造を持っています。ウェブAPIでデータをやり取りする際の標準的なフォーマットとして広く利用されています。
3.  **JSONP (JSON with Padding)**: クロスドメイン通信(異なるドメイン間でデータをやり取りすること)を可能にするための技術の一つです。通常のXMLHttpRequest(Ajax)はセキュリティ上の理由から異なるドメインへのリクエストを制限しますが、JSONPは`<script>`タグがドメイン制限を受けないことを利用します。サーバーはJSONデータをJavaScriptの関数呼び出しでラップして返し、クライアント側ではその関数を定義しておくことで、コールバック関数としてデータを受け取ります。このコミットでは、`http://blog.golang.org/.json?jsonp=feedLoaded` のように、クエリパラメータ `jsonp=feedLoaded` を指定して、`feedLoaded` という関数名でJSONデータがラップされて返されることを期待しています。
4.  **jQuery**: JavaScriptライブラリの一つで、HTMLドキュメントのトラバーサル、操作、イベント処理、アニメーション、Ajaxなどを簡素化します。このコミットでは、`$(function() { ... });` というjQueryの記法が使用されており、これはDOMが完全にロードされた後に実行されるコードを定義するためのショートハンドです。
5.  **DOM操作**: Document Object Modelの略で、HTMLやXMLドキュメントの構造をオブジェクトとして表現し、JavaScriptなどのスクリプト言語からその構造や内容、スタイルを動的に変更するためのAPIです。このコミットでは、`document.createElement`, `blog.insertBefore`, `element.className`, `element.href`, `element.innerHTML` などを用いて、ブログ記事のタイトル、抜粋、公開日などの要素を動的に生成し、HTMLドッキュメントに挿入しています。

## 技術的詳細

このコミットの技術的な変更点は、主に以下の3つの側面に集約されます。

1.  **Google Feeds APIからの脱却**:
    *   `doc/root.html` から `<script type="text/javascript" src="https://www.google.com/jsapi"></script>` の読み込みが削除されました。
    *   JavaScriptコード内の `google.load("feeds", "1");` および `var feed = new google.feeds.Feed(...)`、`feed.load(feedLoaded);` といったGoogle Feeds API関連の呼び出しがすべて削除されました。
    *   これにより、GoウェブサイトはGoogle Feeds APIへの外部依存を完全に解消しました。

2.  **新しいJSONPベースのフィード取得メカニズム**:
    *   ブログフィードの読み込み方法が、jQueryの `$(function() { ... });` ブロック内に移動しました。
    *   `$('<script/>').attr('text', 'text/javascript').attr('src', 'http://blog.golang.org/.json?jsonp=feedLoaded').appendTo('body');` というコードが追加されました。これは、動的に新しい `<script>` タグを作成し、その `src` 属性にGoブログのJSONPエンドポイント(`http://blog.golang.org/.json?jsonp=feedLoaded`)を設定し、それをHTMLの `<body>` に追加することで、JSONPリクエストを送信しています。
    *   `jsonp=feedLoaded` クエリパラメータは、サーバーに対して、返されるJSONデータを `feedLoaded` というJavaScript関数でラップするように指示しています。これにより、スクリプトがロードされると同時に `feedLoaded` 関数が呼び出され、JSONデータが引数として渡されます。

3.  **JSONデータ構造への適応と表示ロジックの変更**:
    *   `feedLoaded` 関数は、Google Feeds APIが返す `result.feed.entries` のようなネストされた構造ではなく、直接JSONデータの配列を受け取るように変更されました (`for (var i = 0; i < result.length && i < 2; i++)`)。
    *   ブログ記事の各エントリのプロパティ名が変更されました。
        *   リンク: `entry.link` から `entry.Link` (大文字の 'L')
        *   タイトル: `entry.title` から `entry.Title` (大文字の 'T')
        *   抜粋: `entry.contentSnippet` から `entry.Summary`
        *   公開日: `entry.publishedDate` から `entry.Time`
    *   公開日の表示形式を整形するための新しいヘルパー関数 `readableTime(t)` が導入されました。この関数は、ISO 8601形式(例: `2013-05-08T...`)のタイムスタンプ文字列を受け取り、"8 May 2013" のような読みやすい形式に変換します。これは、新しいJSONフィードが提供する `entry.Time` の形式に対応するためです。

これらの変更により、Goウェブサイトはブログコンテンツの取得において、より自律的で効率的なメカニズムに移行しました。

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

```diff
--- a/doc/root.html
+++ b/doc/root.html
@@ -84,41 +84,38 @@ Linux, Mac OS X, Windows, and more.\n \n <div style=\"clear: both;\"></div>\n \n-<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script>\n <script type=\"text/javascript\">\n-google.load(\"feeds\", \"1\");\n+\n+function readableTime(t) {\n+\tvar m = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\",\n+\t\t\"August\", \"September\", \"October\", \"November\", \"December\"];\n+\tvar p = t.substring(0, t.indexOf(\"T\")).split(\"-\");\n+\tvar d = new Date(p[0], p[1]-1, p[2]);\n+\treturn d.getDate() + \" \" + m[d.getMonth()] + \" \" + d.getFullYear();\n+}\n \n function feedLoaded(result) {\n-\tif (result.error) {\n-\t\tconsole.log(result.error);\n-\t\treturn;\n-\t}\n \tvar blog = document.getElementById(\"blog\");\n \tvar read = blog.getElementsByClassName(\"read\")[0];\n-\tfor (var i = 0; i < result.feed.entries.length && i < 2; i++) {\n-\t\tvar entry = result.feed.entries[i];\n+\tfor (var i = 0; i < result.length && i < 2; i++) {\n+\t\tvar entry = result[i];\n \t\tvar title = document.createElement(\"a\");\n \t\ttitle.className = \"title\";\n-\t\ttitle.href = entry.link;\n-\t\ttitle.innerHTML = entry.title;\n+\t\ttitle.href = entry.Link;\n+\t\ttitle.innerHTML = entry.Title;\n \t\tblog.insertBefore(title, read);\n \t\tvar extract = document.createElement(\"div\");\n \t\textract.className = \"extract\";\n-\t\textract.innerHTML = entry.contentSnippet;\n+\t\textract.innerHTML = entry.Summary;\n \t\tblog.insertBefore(extract, read);\n \t\tvar when = document.createElement(\"div\");\n \t\twhen.className = \"when\";\n-\t\tvar pub = entry.publishedDate.split(\" \").slice(1,3).join(\" \");\n-\t\twhen.innerHTML = \"Published \" + pub\n+\t\twhen.innerHTML = \"Published \" + readableTime(entry.Time);\n \t\tblog.insertBefore(when, read);\n \t}\n }\n \n-function init() {\n-\t// Load blog feed.\n-\tvar feed = new google.feeds.Feed(\"http://blog.golang.org/feeds/posts/default\");\n-\tfeed.load(feedLoaded);\n-\n+$(function() {\n \t// Set up playground.\n \tplayground({\n \t\t\"codeEl\":        \"#learn .code\",\n@@ -128,7 +125,11 @@ function init() {\n \t\t\"shareRedirect\": \"http://play.golang.org/p/\",\n \t\t\"toysEl\":        \"#learn .toys select\"\n \t});\n-}\n \n-google.setOnLoadCallback(init);\n+\t// Load blog feed.\n+\t$(\'<script/>\').attr(\'text\', \'text/javascript\')\n+\t\t.attr(\'src\', \'http://blog.golang.org/.json?jsonp=feedLoaded\')\n+\t\t.appendTo(\'body\');\n+});\n+\n </script>\n```

## コアとなるコードの解説

1.  **`readableTime` 関数の追加**:
    *   この関数は、新しいJSONフィードから取得される日付文字列(例: "2013-05-08T...")を、より人間が読みやすい形式(例: "8 May 2013")に変換するために導入されました。
    *   月の名前の配列 `m` を定義し、入力された日付文字列から年、月、日を抽出し、`Date` オブジェクトを作成して整形しています。
    *   これは、Google Feeds APIが提供していた日付形式と、新しいJSONフィードが提供する日付形式の違いを吸収するためのアダプターの役割を果たします。

2.  **`feedLoaded` 関数の変更**:
    *   **エラーハンドリングの削除**: Google Feeds APIのエラーチェック (`if (result.error) { ... }`) が削除されました。これは、新しいJSONPアプローチではエラーが異なる方法で処理されるか、この特定のコンテキストでは不要と判断されたためです。
    *   **データ構造の変更への対応**:
        *   ループの条件が `result.feed.entries.length` から `result.length` に変更されました。これは、新しいJSONフィードがブログ記事の配列を直接 `result` として返すことを示しています。
        *   各エントリのプロパティへのアクセス方法が変更されました。`entry.link` は `entry.Link` に、`entry.title` は `entry.Title` に、`entry.contentSnippet` は `entry.Summary` に、`entry.publishedDate` は `entry.Time` にそれぞれ変更されています。これは、GoブログのJSONフィードが使用するキー名が、Google Feeds APIのそれとは異なるためです。Go言語の慣習として、構造体のフィールド名が大文字で始まるのはエクスポート可能(外部からアクセス可能)であることを意味するため、JSONのキー名もそれに合わせて大文字で始まっている可能性が高いです。
        *   公開日の表示に `readableTime(entry.Time)` が使用されるようになりました。これにより、新しい日付形式が適切に整形されて表示されます。

3.  **フィード読み込みロジックの変更**:
    *   `init` 関数が削除され、その中のブログフィード読み込みロジックがjQueryの `$(function() { ... });` ブロック内に移動しました。これは、DOMが完全にロードされた後にコードを実行するための標準的なjQueryの方法です。
    *   `google.setOnLoadCallback(init);` の呼び出しが削除されました。
    *   新しいフィード読み込み方法として、動的に `<script>` タグを作成し、その `src` 属性に `http://blog.golang.org/.json?jsonp=feedLoaded` を設定して `<body>` に追加する方式が採用されました。これはJSONPの典型的な実装パターンであり、クロスドメインでJSONデータを取得するために使用されます。スクリプトがロードされると、`feedLoaded` 関数がコールバックとして呼び出され、ブログデータが渡されます。

これらの変更は、Goウェブサイトが外部のGoogle Feeds APIに依存することなく、Goブログから直接コンテンツを取得し、表示できるようにするための重要なステップです。

## 関連リンク

*   Go言語公式ブログ: [https://blog.golang.org/](https://blog.golang.org/)
*   Go言語公式ウェブサイト: [https://golang.org/](https://golang.org/)

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

*   JSONPに関する一般的な情報源 (例: MDN Web Docs, Wikipedia)
*   jQueryの `$(function() { ... });` に関するドキュメント
*   Google Feeds APIの非推奨化に関する情報 (もしあれば)
*   Go言語のJSONエンコーディング/デコーディングに関するドキュメント (Goの構造体とJSONキー名の関連性を理解するため)# [インデックス 16281] ファイルの概要

このコミットは、Go言語の公式ウェブサイト(golang.org)のフロントページにおけるブログ記事の表示方法を更新するものです。具体的には、Google Feeds APIの使用を廃止し、Goブログが提供する新しいJSONフィードを利用して、特集記事を動的に取得・表示するように変更されています。これにより、外部APIへの依存を減らし、より直接的かつ効率的な方法でブログコンテンツを統合しています。

## コミット

commit f0c3d264731afe8c252acae89013ee1865656cbe Author: Andrew Gerrand adg@golang.org Date: Wed May 8 09:23:50 2013 -0700

doc: pull front page featured articles using new blog JSON feed

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/9288045

doc/root.html | 41 +++++++++++++++++++++--------------------\n 1 file changed, 21 insertions(+), 20 deletions(-)\n\ndiff --git a/doc/root.html b/doc/root.html index 34915c025d..81792671b6 100644 --- a/doc/root.html +++ b/doc/root.html @@ -84,41 +84,38 @@ Linux, Mac OS X, Windows, and more.\n \n <div style="clear: both;">

\n \n-<script type="text/javascript" src="https://www.google.com/jsapi">\n <script type="text/javascript">\n-google.load("feeds", "1");\n+\n+function readableTime(t) {\n+\tvar m = ["January", "February", "March", "April", "May", "June", "July",\n+\t\t"August", "September", "October", "November", "December"];\n+\tvar p = t.substring(0, t.indexOf("T")).split("-");\n+\tvar d = new Date(p[0], p[1]-1, p[2]);\n+\treturn d.getDate() + " " + m[d.getMonth()] + " " + d.getFullYear();\n+}\n \n function feedLoaded(result) {\n-\tif (result.error) {\n-\t\tconsole.log(result.error);\n-\t\treturn;\n-\t}\n \tvar blog = document.getElementById("blog");\n \tvar read = blog.getElementsByClassName("read")[0];\n-\tfor (var i = 0; i < result.feed.entries.length && i < 2; i++) {\n-\t\tvar entry = result.feed.entries[i];\n+\tfor (var i = 0; i < result.length && i < 2; i++) {\n+\t\tvar entry = result[i];\n \t\tvar title = document.createElement("a");\n \t\ttitle.className = "title";\n-\t\ttitle.href = entry.link;\n-\t\ttitle.innerHTML = entry.title;\n+\t\ttitle.href = entry.Link;\n+\t\ttitle.innerHTML = entry.Title;\n \t\tblog.insertBefore(title, read);\n \t\tvar extract = document.createElement("div");\n \t\textract.className = "extract";\n-\t\textract.innerHTML = entry.contentSnippet;\n+\t\textract.innerHTML = entry.Summary;\n \t\tblog.insertBefore(extract, read);\n \t\tvar when = document.createElement("div");\n \t\twhen.className = "when";\n-\t\tvar pub = entry.publishedDate.split(" ").slice(1,3).join(" ");\n-\t\twhen.innerHTML = "Published " + pub\n+\t\twhen.innerHTML = "Published " + readableTime(entry.Time);\n \t\tblog.insertBefore(when, read);\n \t}\n }\n \n-function init() {\n-\t// Load blog feed.\n-\tvar feed = new google.feeds.Feed("http://blog.golang.org/feeds/posts/default");\n-\tfeed.load(feedLoaded);\n-\n+$(function() {\n \t// Set up playground.\n \tplayground({\n \t\t"codeEl": "#learn .code",\n@@ -128,7 +125,11 @@ function init() {\n \t\t"shareRedirect": "http://play.golang.org/p/",\n \t\t"toysEl": "#learn .toys select"\n \t});\n-}\n \n-google.setOnLoadCallback(init);\n+\t// Load blog feed.\n+\t$('\n```

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

https://github.com/golang/go/commit/f0c3d264731afe8c252acae89013ee1865656cbe

元コミット内容

このコミットの目的は、Go言語の公式ウェブサイトのフロントページに表示されるブログ記事の取得方法を変更することです。以前はGoogle Feeds APIを使用してブログのRSS/Atomフィードを解析していましたが、このコミットではGoブログが直接提供する新しいJSON形式のフィードを利用するように切り替えます。これにより、外部サービスへの依存を減らし、コンテンツの取得と表示をより効率的に行うことを目指しています。

変更の背景

この変更の背景には、いくつかの要因が考えられます。

  1. Google Feeds APIの非推奨化または機能変更: Google Feeds APIは、ウェブサイトにRSS/Atomフィードを簡単に組み込むための便利なツールでしたが、GoogleのAPI戦略の変更により、非推奨になったり、機能が制限されたりする可能性があります。このような外部APIへの依存は、将来的なメンテナンスコストや予期せぬサービス停止のリスクを伴います。
  2. パフォーマンスの向上: Google Feeds APIを介してデータを取得するよりも、Goブログが直接提供する最適化されたJSONフィードを直接利用する方が、ネットワークレイテンシや処理オーバーヘッドが削減され、ページのロード時間が短縮される可能性があります。
  3. 柔軟性の向上: 独自のJSONフィードを使用することで、Goブログ側で提供するデータの形式や内容をより細かく制御できるようになります。これにより、ウェブサイトの表示要件に合わせて、必要な情報のみを効率的に提供することが可能になります。例えば、Google Feeds APIが提供しない特定のメタデータを含めることができるようになります。
  4. 依存関係の削減: 外部のサードパーティAPIへの依存を減らすことは、セキュリティ、信頼性、および長期的な保守性の観点から望ましいプラクティスです。

前提知識の解説

このコミットを理解するためには、以下の技術的な概念について知っておく必要があります。

  1. Google Feeds API: Googleが提供していたJavaScriptライブラリで、ウェブページ上でRSSやAtomフィードを簡単に解析し、表示するためのものでした。google.load("feeds", "1");new google.feeds.Feed(...) といったAPIを通じて利用されました。しかし、このAPIは後に非推奨となり、最終的にシャットダウンされました。
  2. JSON (JavaScript Object Notation): 軽量なデータ交換フォーマットです。人間にとっても読み書きしやすく、機械にとっても解析しやすい構造を持っています。ウェブAPIでデータをやり取りする際の標準的なフォーマットとして広く利用されています。
  3. JSONP (JSON with Padding): クロスドメイン通信(異なるドメイン間でデータをやり取りすること)を可能にするための技術の一つです。通常のXMLHttpRequest(Ajax)はセキュリティ上の理由から異なるドメインへのリクエストを制限しますが、JSONPは<script>タグがドメイン制限を受けないことを利用します。サーバーはJSONデータをJavaScriptの関数呼び出しでラップして返し、クライアント側ではその関数を定義しておくことで、コールバック関数としてデータを受け取ります。このコミットでは、http://blog.golang.org/.json?jsonp=feedLoaded のように、クエリパラメータ jsonp=feedLoaded を指定して、feedLoaded という関数名でJSONデータがラップされて返されることを期待しています。
  4. jQuery: JavaScriptライブラリの一つで、HTMLドキュメントのトラバーサル、操作、イベント処理、アニメーション、Ajaxなどを簡素化します。このコミットでは、$(function() { ... }); というjQueryの記法が使用されており、これはDOMが完全にロードされた後に実行されるコードを定義するためのショートハンドです。
  5. DOM操作: Document Object Modelの略で、HTMLやXMLドキュメントの構造をオブジェクトとして表現し、JavaScriptなどのスクリプト言語からその構造や内容、スタイルを動的に変更するためのAPIです。このコミットでは、document.createElement, blog.insertBefore, element.className, element.href, element.innerHTML などを用いて、ブログ記事のタイトル、抜粋、公開日などの要素を動的に生成し、HTMLドッキュメントに挿入しています。

技術的詳細

このコミットの技術的な変更点は、主に以下の3つの側面に集約されます。

  1. Google Feeds APIからの脱却:

    • doc/root.html から <script type="text/javascript" src="https://www.google.com/jsapi"></script> の読み込みが削除されました。
    • JavaScriptコード内の google.load("feeds", "1"); および var feed = new google.feeds.Feed(...)feed.load(feedLoaded); といったGoogle Feeds API関連の呼び出しがすべて削除されました。
    • これにより、GoウェブサイトはGoogle Feeds APIへの外部依存を完全に解消しました。
  2. 新しいJSONPベースのフィード取得メカニズム:

    • ブログフィードの読み込み方法が、jQueryの $(function() { ... }); ブロック内に移動しました。
    • $('<script/>').attr('text', 'text/javascript').attr('src', 'http://blog.golang.org/.json?jsonp=feedLoaded').appendTo('body'); というコードが追加されました。これは、動的に新しい <script> タグを作成し、その src 属性にGoブログのJSONPエンドポイント(http://blog.golang.org/.json?jsonp=feedLoaded)を設定し、それをHTMLの <body> に追加することで、JSONPリクエストを送信しています。
    • jsonp=feedLoaded クエリパラメータは、サーバーに対して、返されるJSONデータを feedLoaded というJavaScript関数でラップするように指示しています。これにより、スクリプトがロードされると同時に feedLoaded 関数が呼び出され、JSONデータが引数として渡されます。
  3. JSONデータ構造への適応と表示ロジックの変更:

    • feedLoaded 関数は、Google Feeds APIが返す result.feed.entries のようなネストされた構造ではなく、直接JSONデータの配列を受け取るように変更されました (for (var i = 0; i < result.length && i < 2; i++))。
    • ブログ記事の各エントリのプロパティ名が変更されました。
      • リンク: entry.link から entry.Link (大文字の 'L')
      • タイトル: entry.title から entry.Title (大文字の 'T')
      • 抜粋: entry.contentSnippet から entry.Summary
      • 公開日: entry.publishedDate から entry.Time
    • 公開日の表示形式を整形するための新しいヘルパー関数 readableTime(t) が導入されました。この関数は、ISO 8601形式(例: 2013-05-08T...)のタイムスタンプ文字列を受け取り、"8 May 2013" のような読みやすい形式に変換します。これは、新しいJSONフィードが提供する entry.Time の形式に対応するためです。

これらの変更により、Goウェブサイトはブログコンテンツの取得において、より自律的で効率的なメカニズムに移行しました。

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

--- a/doc/root.html
+++ b/doc/root.html
@@ -84,41 +84,38 @@ Linux, Mac OS X, Windows, and more.\n \n <div style=\"clear: both;\"></div>\n \n-<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script>\n <script type=\"text/javascript\">\n-google.load(\"feeds\", \"1\");\n+\n+function readableTime(t) {\n+\tvar m = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\",\n+\t\t\"August\", \"September\", \"October\", \"November\", \"December\"];\n+\tvar p = t.substring(0, t.indexOf(\"T\")).split(\"-\");\n+\tvar d = new Date(p[0], p[1]-1, p[2]);\n+\treturn d.getDate() + \" \" + m[d.getMonth()] + \" \" + d.getFullYear();\n+}\n \n function feedLoaded(result) {\n-\tif (result.error) {\n-\t\tconsole.log(result.error);\n-\t\treturn;\n-\t}\n \tvar blog = document.getElementById(\"blog\");\n \tvar read = blog.getElementsByClassName(\"read\")[0];\n-\tfor (var i = 0; i < result.feed.entries.length && i < 2; i++) {\n-\t\tvar entry = result.feed.entries[i];\n+\tfor (var i = 0; i < result.length && i < 2; i++) {\n+\t\tvar entry = result[i];\n \t\tvar title = document.createElement(\"a\");\n \t\ttitle.className = \"title\";\n-\t\ttitle.href = entry.link;\n-\t\ttitle.innerHTML = entry.title;\n+\t\ttitle.href = entry.Link;\n+\t\ttitle.innerHTML = entry.Title;\n \t\tblog.insertBefore(title, read);\n \t\tvar extract = document.createElement(\"div\");\n \t\textract.className = \"extract\";\n-\t\textract.innerHTML = entry.contentSnippet;\n+\t\textract.innerHTML = entry.Summary;\n \t\tblog.insertBefore(extract, read);\n \t\tvar when = document.createElement(\"div\");\n \t\twhen.className = \"when\";\n-\t\tvar pub = entry.publishedDate.split(\" \").slice(1,3).join(\" \");\n-\t\twhen.innerHTML = \"Published \" + pub\n+\t\twhen.innerHTML = \"Published \" + readableTime(entry.Time);\n \t\tblog.insertBefore(when, read);\n \t}\n }\n \n-function init() {\n-\t// Load blog feed.\n-\tvar feed = new google.feeds.Feed(\"http://blog.golang.org/feeds/posts/default\");\n-\tfeed.load(feedLoaded);\n-\n+$(function() {\n \t// Set up playground.\n \tplayground({\n \t\t\"codeEl\":        \"#learn .code\",\n@@ -128,7 +125,11 @@ function init() {\n \t\t\"shareRedirect\": \"http://play.golang.org/p/\",\n \t\t\"toysEl\":        \"#learn .toys select\"\n \t});\n-}\n \n-google.setOnLoadCallback(init);\n+\t// Load blog feed.\n+\t$(\'<script/>\').attr(\'text\', \'text/javascript\')\n+\t\t.attr(\'src\', \'http://blog.golang.org/.json?jsonp=feedLoaded\')\n+\t\t.appendTo(\'body\');\n+});\n+\n </script>\n```

## コアとなるコードの解説

1.  **`readableTime` 関数の追加**:
    *   この関数は、新しいJSONフィードから取得される日付文字列(例: "2013-05-08T...")を、より人間が読みやすい形式(例: "8 May 2013")に変換するために導入されました。
    *   月の名前の配列 `m` を定義し、入力された日付文字列から年、月、日を抽出し、`Date` オブジェクトを作成して整形しています。
    *   これは、Google Feeds APIが提供していた日付形式と、新しいJSONフィードが提供する日付形式の違いを吸収するためのアダプターの役割を果たします。

2.  **`feedLoaded` 関数の変更**:
    *   **エラーハンドリングの削除**: Google Feeds APIのエラーチェック (`if (result.error) { ... }`) が削除されました。これは、新しいJSONPアプローチではエラーが異なる方法で処理されるか、この特定のコンテキストでは不要と判断されたためです。
    *   **データ構造の変更への対応**:
        *   ループの条件が `result.feed.entries.length` から `result.length` に変更されました。これは、新しいJSONフィードがブログ記事の配列を直接 `result` として返すことを示しています。
        *   各エントリのプロパティへのアクセス方法が変更されました。`entry.link` は `entry.Link` に、`entry.title` は `entry.Title` に、`entry.contentSnippet` は `entry.Summary` に、`entry.publishedDate` は `entry.Time` にそれぞれ変更されています。これは、GoブログのJSONフィードが使用するキー名が、Google Feeds APIのそれとは異なるためです。Go言語の慣習として、構造体のフィールド名が大文字で始まるのはエクスポート可能(外部からアクセス可能)であることを意味するため、JSONのキー名もそれに合わせて大文字で始まっている可能性が高いです。
        *   公開日の表示に `readableTime(entry.Time)` が使用されるようになりました。これにより、新しい日付形式が適切に整形されて表示されます。

3.  **フィード読み込みロジックの変更**:
    *   `init` 関数が削除され、その中のブログフィード読み込みロジックがjQueryの `$(function() { ... });` ブロック内に移動しました。これは、DOMが完全にロードされた後にコードを実行するための標準的なjQueryの方法です。
    *   `google.setOnLoadCallback(init);` の呼び出しが削除されました。
    *   新しいフィード読み込み方法として、動的に `<script>` タグを作成し、その `src` 属性に `http://blog.golang.org/.json?jsonp=feedLoaded` を設定して `<body>` に追加する方式が採用されました。これはJSONPの典型的な実装パターンであり、クロスドメインでJSONデータを取得するために使用されます。スクリプトがロードされると、`feedLoaded` 関数がコールバックとして呼び出され、ブログデータが渡されます。

これらの変更は、Goウェブサイトが外部のGoogle Feeds APIに依存することなく、Goブログから直接コンテンツを取得し、表示できるようにするための重要なステップです。

## 関連リンク

*   Go言語公式ブログ: [https://blog.golang.org/](https://blog.golang.org/)
*   Go言語公式ウェブサイト: [https://golang.org/](https://golang.org/)

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

*   JSONPに関する一般的な情報源 (例: MDN Web Docs, Wikipedia)
*   jQueryの `$(function() { ... });` に関するドキュメント
*   Google Feeds APIの非推奨化に関する情報 (もしあれば)
*   Go言語のJSONエンコーディング/デコーディングに関するドキュメント (Goの構造体とJSONキー名の関連性を理解するため)