読書研修ーWebを支える技術　第12章Atom


## Atomとは
Atom Syndication Formatは、Atom(RFC 4287)はプログなどの更新情報を配信するためのフィードとして知られていますが、実際には幅広い分野での応用が可能な汎用XMLフォーマツトです。通常はAtomと略して呼ばれます。Atomはプログだけでなく検索エンジンや写真管理などさまざまなWeb サービスのWeb APIとして利用できます。
## Atomのリソースモデル
Atomの論理モデルは、メンバリソ-ス(Member Resource)と、メンバリソースを複数含むコレクションリソース(Collection Resource)の2つに大きくは分かれます。
### メンバリソース
Atomにおける最小のリソ-ス単位がメンバリソースです。
メンバリソースはXMLで表現できるエントリリソ-ス(EntryResource)と、それ以外のメディアリソース(Media Resource)に分かれます。
#### エントリリソース
プログ記事の本文と、それに対応するメタデータ(タイトル、日時、著者など)がまとまった、テキストやXMLで表現するリソースです。エントリリソースは<entry>要素で表現し、この表現のことを「エントリ」(Entry)と呼びます。
#### メディアリソース
画像や映像などテキストでは表現できないリソースです。
メディアリソースのメタデータはメディアリンクエントリ(Media Link Entry)という特別なエントリで表現します。
### コレクションリソース
コレクションリソースは複数のメンバリソースを含むリソースです。
コレクションリソースが别のコレクションリソースを含むことはありません。

### メディアタイプ
Atomのメディアタイプは「application/atom+xm」です。エントリやフィードを明示したいときはtypeパラメータで「entry」「feed」を指定します。

エントリ:`Content-Type:application/atom+xml;type=entry`

### 拡張子
Atom には「.atom」という拡張子を用いることが推奨されています。

### 名前空間
Atomの名前空間は`http://www.w3.org/2005/Atom` です。

## エントリ----Atomの最小単位
```
<entry xmlns="http://www.w3.org/2005/Atom">
    <id>tag:example.jp,2010-08-24:entry:1234</id>
    <title>テスト日記</title>
    <updated>2010-08-24T13:11:54Z</updated>
    <link href="http://example.jp/1234"/>
    <content>テストです。</content>
</entry>
```

### メタデータ
エントリはメタデータを持ちます。
必須の要素のうち、ID(<id>)、タイトル(<title>)、著者(<author>)、更新日時(<updated>)はです。 
#### ID
`<id>`要素の内容は、このエントリを一意に示すURI形式のIDです。httpスキームのURIも利用できますが、AtomではHTTPとは独立したtagスキーム(RFC4151)のURIがよく用いられています。
tagスキームは`tag:{DNS名またはメ-ルアドレス}，{日付}:{任意の文字列}`という構造を持ちます。

#### タイトルと概要
エントリには、そのエントリの題名を表現する`<title>`要素が必須です。また、エントリの概要を示す`<summary>`要素もあります。

#### 著者と貢献者
エントリには著者を示す`<author>`要素が必須です。また、貢献者を示す`<contributor>`要素もあります。
`<author>`要素と`<contributor>`要素は次の3つの要素を持ちます。
* <name>要素自然言語で記述した名前。必須
* <uri>要素人に関連付けられたURI。任意
* <email>要素人のメ-ルアドレス。任意
#### 公開日時と更新日時
エントリには更新日時を示す`<updated>`要素が必須です。また、エントリの公開日時を示す`<published>`要素もあります。
#### カテゴリ
`<category>` 要素はそのエントリの属するカテゴリを表現します。カテゴリとは、ソーシャルプブックマークでいうところのタグのことです。scheme属性はそのタグを識別するためのURI です。label属性にはアプリケーションが表示するためのラベルを指定します。
#### リンク
Atomではリンクを`<link>`要素で表現します。
| Atomのリンク関係 | 意味 |
|:-:|:-:|
|  alternate |  このエントリノフィ-ドの別表現(たとえばXHTML表現)へのリンク。リンク関係のデフオルト値|
|  self |  このエントリノフィ-ド自身のURI |
| enclosure  | ポッドキャストなどで用いる添付フアイルへのリンク  |
|  related |  関連するリソースへのリンク |
|  via | 情報元リソースへのリンク	  |
						
### エントリの内容
Atom ではエントリの内容に多彩なフォーマットを含められるようになっています。
* <strong>組込みで定義されている内容 -- プレーンテキスト、エスケープ済みHTML、XHTML</strong>
* <strong>XMLの内容</strong>
    * メディアタイプがapplication/xml、text/xml、またはサプタイプが「+xmljで終わる場合、<content>要素は直接そのXML要素を含むことができます。
* <strong>テキストの内容</strong>
    * エントリリソースはXML以外のテキストも持てます。メディアタイプのタイプがtext であれば、直接<content>要素に埋め込めます。
* <strong>テキスト以外の内容</strong>
    * 一般的な Web サービスは、テキスト以外の内容、たとえば画像を扱えます。
## フィード　ーー　エントリの集合
メンバリソースを複数持つコレクションリソースの表現がフィードです。
エントリと共通のメタデータ`<feed>`要素はエントリと同じメタデータを持てます。必須要素もエントリと同じで、フィード独自のメタデータフィードはエントリと共通のメタデータ以外に、必須ではない4つのメタデータを持ちます：

### サプタイトル
`<subtitle>`要素にはタイトルで説明しきれない説明を記述します。
### 生成プログラム
`<generator>`要素はフィードを生成したプログラムの情報を表現します。`<generator> `要素の内容はプログラムの名称です。
uri属性には、そのプログラムに関連のあるURIを指定します。
version属性には、そのプログラムのバージョンを指定します。
### アイコン
`<icon>` 要素には、いわゆるfaviconを指定します。要素の内容はfaviconのURIになります。`<icon>http://blog.example.jp/image/favicon.ico</icon>`
### ロゴ
`<logo>`要素には、このフィードを象徵する画像を指定します。`<icon>`要素と同様に、内容には画像のURIを指定します。
`<logo>http://blog.example.jp/image/logo.png</logo>`
## Atomの拡張
Atom はその拡張性の高さから、プログ以外のさまさまなシステムで応用されています。
```
<feed xmlns="http://www.w3.org/2005/Atomxmlns:os="http://a9.com/-/spec/opensearch/1.1/">
    <title> 「REST」の検索結果</title>
    <id>http://example.jp/search?q=REST</id>
    <author><name>Example Co.，Ltd.</name></author>
    <os:totalResults>3392</os:totalResults>
    <os:startIndex>21</os:startIndex>
    <os:itemsPerPage>10</os:itemsPerPage>
    <entry>
        <title>REST入門</title>
        <id>http://yohei-y.blogspot.com/2005/04/rest_23.html</id>
        <link href="http://yohei-y.blogspot.com/2005/04/rest_23.html"/>
    </entry>
...
</feed>
```
拡張要素はすべてГоｓ」という接頭辞力示すOpenSearch名前空間に属しています。OpenSearchは検索結果の標準フオーマットとして、Atomとはまったく別に標準化されている仕様です。
### Atom Threading Extensions-スレッドを表現する
フィ-ド形式のデ-タは、プログだけでなく掲示板やフオ-ラム、メ-リングリストログのような、複数投稿者によるコンテンツにも適しています。タイトル(title)、著者(author)、更新日時(updated)、内容(content)など、Atm が用意している要素をそのまま利用できるからです。ただし、このようなコンテンツはプログにはない特徵を持っています。それはある人が投稿したコンテンツに対して、ほかの人が次々と返答を行い一つの流れを作るという、いわゆるスレッド機能です。
| スレッド機能 | 説明 |
|:-|:-|
|  名前空間 |  「thr」という接頭辞は、この名前空間に結ひ付いている |
|  `<thr:in-reply-to>`要素  | 4つの属性を持ちます<br>①[必須]ref属性：`<thr:in-reply-to>`要素があるエントリが参照しているエントリ(親エントリ)のID。<br>②[任意]href属性:このエントリの表現を取得するためのURI。<br>③[任意]type属性:href属性で参照するリソ-スのメディアタイプ。<br>④[任意]source属性:ref属性で参照するエントリを含むフィ-ドのURI<br>`<thr:in-reply-to>`要素は1つのエントリに複数出現できます。<br>  |
| repliesリンク関係とthr:count属性/thr:updated属性  | 親エントリの側から子エントリを参照するときに使うのが repliesリンク関係です<br> repliesリンク関係には次の5つの属性:<br>①[必須]rel属性：repliesという值。<br>②[必須]href属性：このエントリへの返答があるリソ-スのURI。<br>③[任意]type属性:hrefで参照するリソ-スのメディアタイプ。省略時のデフオルトは application/atom+xmlになる。<br>④[任意]thr:count属性:hrefで参照するリソ-スの返答総数(正の整数)。R<br>５[任意]thr:updated属性:このエントリへの返答が最後に更新された時刻。 |
| `<thr:total>`要素  |  このエントリへの返答総数を表現します |

### Atom License Extension -ライセンス情報を表現する
この仕様の目的はフィ-ドやエントリのライセンス情報を表現することです。
#### 名前空間
rel-licenseはrel属性の値だけを定義した仕様です。したがってrel-licenseには名前空間はありません。
#### 複数ライセンス
`<entry>`要素や`<feed>`要素はライセンスリンクを複数持てます。この場合は複数のライセンスから選択可能であることを示します。
#### ライセンスを指定しない場合
特定のライセンスを指定しないことを明示したい場合は、unspecifiedリンクを指定します。
これはフィードやエントリの権利情報を記述する要素です。ライセンスリンクはプログラムでのライセンス処理を目的に、`<rights>`要素は人間か読んで理解することを目的にしています。

### Feed Paging and Archiving-フィードを分割する
RFC 5005 という覚えやすい番号で定義しているのがFeed Paging and ArchivingというAtomの拡張仕様です。
これらのように「検索結果」や「プログ」といった1つのコレクションか、複数のフィードに分かれていることを表現するのFeed Paging and Archivingです。 
#### 名前空間
「fh」という接頭辞は、この名前空間に結ひ付いていることとします。 
#### フィードの種類Feed Paging and Archivingでは、フィ-ドを次の3つに分類しています。
* 完全フィード(Complete Feed)：すべてのエントリを1つの文書に含んでいる
* ページ化フィード(Paged Feed)：エントリを複数の一時的な文書に分割している
* アーカイプ済みフィード(Archived Feed)：エントリを複数の恒久的な文書に分割している

#### ページ化フィードと比べると、アーカイプ済みフィードの特徵
* フィードに含まれるエントリの内容が比較的固定されている(完全フィードになる可能性もある)
* フィードごとに含まれるエントリの個数にバラつきがある(ページ化フィードは、10件ずつなどエントリ数が一定である)

### OpenSearch-検索結果を表現する
OpenSearch は検索エンジンの Web APIのベースとなる仕様で、さまさまな検索サービスか活用しています。OpenSearchは大きく分けると次の4つのパートに分かれます。
* Description Document
    * 検索エンジンが提供する検素機能をプログラムから理解可能な形式で記述する XML形式
* URL Template Syntax
    * 検素結果リソ-スを表現するURLの検素クエリ部分をバラメ-タ化する仕様
* Query Element
    * URL Template Syntaxで使用する検索パラメ-タを記述するXML要素。 
    * Description Documentと検索結果の両方で利用する
* Response Element
    * 検素結果をAtomやRSS 20などのフィード形式で表現するための拡張要素


OpenSearch 1.1 はResponse Elementとして4つの要素を定義しており、すべて<feed>要素の直下に配置します。
* 名前空間は「оs」という接頭辞でこの名前空間に結び付いていることとします。
* `<os:totalResults>`要素：検索結果総数を表現する正の整数です。
* `<os:startlndex>`要素：このフィードに入っている検索結果の最初のエントリのインデックスを示します。
* `<os:itemsPerPage>`要素：1フィードに入る最大の検索結果エントリ数を示します。
* `<os:Query> `要素：検索クエリを示します。
* リンク関係OpenSearch では、リンク関係を使って検索結果をページ化できます。

| リンク関係 | 意味 |
|:-:|:-:|
| first  | 最初のページへのリンク  |
|  last |  最後のページへのリンク  |
|  previous |  前のページへのリンク  |
|  next | 次のページへのリンク   |
| current  |  現在のページへのリンク  |