要約

この仕様では、JSON形式を使って、潜在的なアクティビティと完了したアクティビティを表現するためのモデルについて詳しく説明する。これは、アクティビティの構造を詳細に記述し、特定の型のアクティビティを定義する語彙とともに使うを目的とする。

著者のメモ

この節は非規範的である。

この草稿は、Martin Atkins、Will Norris、Chris Messina、Monica Wilkinson、Rob Dolin、James Snellの共著によるJSON Activity Streams 1.0仕様の影響を強く受けている。著者は彼らの多大な貢献に非常に感謝しており、喜んで彼らの肩の上に立っている。この文書では、Activity Streams 1.0の原文の一部を使用している。

この文書の状態

この節は、発行時点でのこの文書の状態を説明している。他の文書がこの文書に取って代わることがある。現在の W3C による発行物と この技術報告の最新版は https://www.w3.org/TR/ の W3C technical reports index にある。

この文書は Social Web Working Group によって 勧告として発行された。この文書に関するコメントを歓迎する。public-socialweb@w3.org(購読,アーカイブ)に送ってほしい。

Working Group の implementation report を参照のこと。

この文書は、W3Cメンバー、ソフトウェア開発者、およびその他のW3Cグループと関係者によってレビューされ、W3C勧告としてディレクターによって承認されています。これは安定した文書であり、参考資料として使用したり、他の文書から引用したりすることができる。この勧告を作成する上でのW3Cの役割は、仕様に注意を喚起し、その広範な展開を促進することである。これは、Webの機能性と相互運用性を向上させる。

この文書は、5 February 2004 W3C Patent Policyの下で活動しているグループによって作成された。W3Cは、グループの成果物に関連して作成された特許開示の公開リストを保守しており、そのページには特許を開示するための手順も含まれている。Essential Claim(s)を含むと信じる特許について実際の知識を有する者は、W3C Patent Policy第6条に従って情報を開示しなければならない。

この文書は、1 March 2017 W3C Process Documentに準拠する。

1. 概要

最も基本的な感覚では 「アクティビティ」(Activity) は行動の意味論的な 記述である。この仕様のゴールは、アクティビティについて、 リッチで人間に優しいけれども、機械で処理可能かつ拡張可能な形で メタデータを記述するのに十分な JSON ベースの文法を提供することである。これには、アクティビティに関する自然言語記述やビジュアル表現の構築、 様々な型のオブジェクトと行動可能な情報の関連付け、 アクティビティログの通信や記録、 可能性のある行動の他のアプリケーションへの委譲を含む。

この文書における次の各キーワード「しなければならない(MUST)」、 「してはならない(MUST NOT)」、 「要求されている(REQUIRED)」、 「することになる(SHALL)」、 「することはない(SHALL NOT)」、 「する必要がある(SHOULD)」、 「しないほうがよい(SHOULD NOT)」、 「推奨される(RECOMMENDED)」、 「してもよい(MAY)」、 「選択できる(OPTIONAL)」は、 [RFC2119] で述べられているように解釈されるべきものである。

1.1 他のソーシャル標準との関係

この節は非規範的である。

Activity Streams 2.0 はソーシャルデータ文法に適している。これは [SWP] スイートの一部を形成する。

1.2 JSON Activity Streams 1.0 との関係

この節は非規範的である。

JSON Activity Streams 1.0 [AS1] 仕様は 2011 年 5 月に発行され、 完全なアクティビティの表現のための、基準となる拡張可能な文法を提供した。この仕様は、広範な実装、コミュニティのフィードバック、および他のさまざまなコミュニティからの関連する進行中の作業を通じて学んだ教訓を組み込むことによって、その初期の基盤の上に構築されている。

特に Activity Streams 1.0 から Activity Streams 2.0 への進化の動機となった 問題は次のようなものである:

displayName, verb, title, objectType という用語は 予約語として扱われるべきであり、 Activity Streams 2.0 文書の中で使われるべきではない(SHOULD NOT)。Activity Streams 2.0 文書でこれらに遭遇した場合、B. Deprecated Activity Streams 1.0 Syntaxに上げられているガイドラインに従って 処理されるべきである(SHOULD)。

2. 直列化

この仕様は、[JSON-LD] 制限の部分集合に準拠するが JSON-LD 処理を要求しない Activity Vocabulary のための JSON [RFC7159] ベースの直列化を記述する。他の直列化形式も可能であるが、そのような選択肢はこの文書では議論しない。

直列化されるとき、値の無い属性は、 (a) 属性の値を null に設定するか、 (b) 属性宣言自体を省略するかで表現され、 これは発行者の選択である。これらの表現は意味論的に等価である。属性が配列を持つ場合、その配列に値が無い場合は、 属性全体を省略するか値に null を設定することで表現しなければならない(MUST)。省略されたか明示的な null 値の適切な解釈は、 値が設定されなかったか、与えられた値が空または nil であったかということである。

Activity Streams 文書 とは、ルート値が (Collection を含む)任意の型の Activity Streams Object で、 MIME メディアタイプが "application/activity+json" である JSON 文書である。

Activity Streams 2.0 文書は UTF-8 文字エンコーディングを使って 直列化しなければならない(MUST)。

2.1 JSON-LD

Activity Streams 2.0 文書の直列化された JSON 形式は、 少なくとも、ここ で提供されている規定の JSON-LD @context 定義を使って、 標準の JSON-LD 1.0 Processing Algorithms と API [JSON-LD-API] Compaction Algorithm で生成されるものと矛盾しないものでなければならない(MUST)。実装は提供された @context を追加の @context で増加させてもよい(MAY)が、 規範的なコンテキストを上書きしたり変更してはならない (MUST NOT)。実装はまた、標準の JSON-LD アルゴリズムを使う消費者実装から 無視されるであろうことを理解した上で、JSON-LD @context に定義されていない 追加の属性と値を使ってもよい(MAY)。Activity Streams 2.0 文書の中での拡張の扱いに関するさらなる情報については Extensibility 節を参照のこと。

JSON-LD は processing context を 定義するために特別な @context 属性を使う。@context 属性の値は [JSON-LD] 仕様で定義されている。Activity Streams 2.0 文書を生成する実装は、 URL "https://www.w3.org/ns/activitystreams" を使って 標準の Activity Streams 2.0 JSON-LD @context 定義 への参照を含む値を @context 属性に 指定するべきである(SHOULD)。実装は代わりに代替URL "http://www.w3.org/ns/activitystreams" を 使うことができる(MAY)。これは文字列、オブジェクト、配列を使って行える。

2.1.1 文字列のコンテキスト

Figure 1 コンテキストを文字列として提供している文書:
Example 1
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "A note",
  "type": "Note",
  "content": "My dog has fleas."
}

2.1.2 オブジェクトのコンテキスト

Figure 2 拡張用語のために @vocab キーワードと接頭辞を使ったオブジェクトで コンテキストを提供している文書:
Example 2
{
  "@context": {
     "@vocab": "https://www.w3.org/ns/activitystreams",
     "ext": "https://canine-extension.example/terms/",
     "@language": "en"
  },
  "summary": "A note",
  "type": "Note",
  "content": "My dog has fleas.",
  "ext:nose": 0,
  "ext:smell": "terrible"
}

2.1.3 配列のコンテキスト

Figure 3 追加の用語のための別名を含む配列としてコンテキストを提供している文書:
Example 3
{
  "@context": [
     "https://www.w3.org/ns/activitystreams",
     {
      "css": "http://www.w3.org/ns/oa#styledBy"
     }
  ],
  "summary": "A note",
  "type": "Note",
  "content": "My dog has fleas.",
  "css": "http://www.csszengarden.com/217/217.css?v=8may2013"
}

JSON-LD を有効にした Activity Streams 2.0 実装が "application/activity+json" MIME メディアタイプを使って 識別された JSON ドキュメントに遭遇し、 そのドキュメントに標準的な Activity Streams 2.0 JSON-LD @context definition を参照する値を持つ @context 属性がない場合、 実装はそれでも標準的な @context 定義があるものと仮定しなければならない(MUST)。

2.2 IRI と URL

この仕様は IRI [RFC3987] を 使っている。全ての URI [RFC3986] は IRI でもあるので、IRI という名前が付いているところでは URL を使うことが出来る。特別に考慮することが二つある: (1) URI ではない IRI が逆参照として与えられた場合、 [RFC3987] の 3.1 節のステップを使って URI にマッピングしなければならず(MUST)、 (2) IRI が "id" 値として提供された場合、そのようにマッピングしてはならない(MUST NOT)。

相対 IRI (及び URL) 参照は Activity Streams 2.0 文書の中で 使うべきではない(SHOULD NOT); 多くの JSON パーサ実装は、相対参照を適切に解決するために必要な 基底コンテキストを確実に保存する能力を持たないからである。

2.3 日付と時刻

全ての日付と時刻の属性は [RFC3339] の "date-time" 生成に従わなければならない(MUST); 但し例外として秒は省略しても良い(MAY)。日付と時刻を分けるために大文字の "T" を使わなければならず(MUST)、 タイムゾーンオフセット値がない場合は大文字の "Z" を 使わなければならない(MUST)。

これは以下の [ABNF] 文法記述を使って指定される。"time-hour", "time-minute", "time-second", "time-secfrac", "time-offset", "full-date" 構造は [RFC3339] で定義される。

as2-partial-time = time-hour ":" time-minute [":" time-second]
                   [time-secfrac]
as2-full-time    = as2-partial-time time-offset
as2-date-time    = full-date "T" as2-full-time

`time-offset` 要素はタイムゾーンとは関係なく、 `time-offset` 要素を含む時刻はタイムスタンプとして上手く動作するが、 追加の情報と処理なしにこれとローカルの「壁時計時間」とを確実に変換することは できないということに注意することは重要である。

3.

この節は非規範的である。

次に、様々な詳細度を持つ三つのアクティビティの例を挙げる。

それぞれの例は、この仕様で定義されてい標準 JSON 直列化を使って示している。

3.1 最小限のアクティビティ

Figure 4 'http://www.test.example/martin' が 'http://example.org/foo.jpg' を作ったという声明を表現する。追加の詳細はなし:
Example 4
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Martin created an image",
  "type": "Create",
  "actor": "http://www.test.example/martin",
  "object": "http://example.org/foo.jpg"
}

3.2 追加の詳細付きの基本的なアクティビティ

Figure 5 「Martin Smith が2015年2月10日の午後3:04(UTC)にブログ'Martin's Blog'に 記事を追加した」ことを表現する。Activity Streams 2.0 Vocabulary によって定義された属性を使って、 記事、アクター、ターゲットに関するいくつかの追加の詳細が与えられている:
Example 5
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Martin added an article to his blog",
  "type": "Add",
  "published": "2015-02-10T15:04:55Z",
  "actor": {
   "type": "Person",
   "id": "http://www.test.example/martin",
   "name": "Martin Smith",
   "url": "http://example.org/martin",
   "image": {
     "type": "Link",
     "href": "http://example.org/martin/image.jpg",
     "mediaType": "image/jpeg"
   }
  },
  "object" : {
   "id": "http://www.test.example/blog/abc123/xyz",
   "type": "Article",
   "url": "http://example.org/blog/2011/02/entry",
   "name": "Why I love Activity Streams"
  },
  "target" : {
   "id": "http://example.org/blog/",
   "type": "OrderedCollection",
   "name": "Martin's Blog"
  }
}

3.3 拡張したアクティビティ

Figure 6 より広範な、単一のエントリの "Activity Stream":
Example 6
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Martin's recent activities",
  "type": "Collection",
  "totalItems": 1,
  "items" : [
    {
      "type": "Add",
      "published": "2011-02-10T15:04:55Z",
      "generator": "http://example.org/activities-app",
      "nameMap": {
        "en": "Martin added a new image to his album.",
        "ga": "Martin phost le fisean nua a albam."
      },
      "actor": {
        "type": "Person",
        "id": "http://www.test.example/martin",
        "name": "Martin Smith",
        "url": "http://example.org/martin",
        "image": {
          "type": "Link",
          "href": "http://example.org/martin/image",
          "mediaType": "image/jpeg",
          "width": 250,
          "height": 250
        }
      },
      "object" : {
        "name": "My fluffy cat",
        "type": "Image",
        "id": "http://example.org/album/máiréad.jpg",
        "preview": {
          "type": "Link",
          "href": "http://example.org/album/máiréad.jpg",
          "mediaType": "image/jpeg"
        },
        "url": [
          {
            "type": "Link",
            "href": "http://example.org/album/máiréad.jpg",
            "mediaType": "image/jpeg"
          },
          {
            "type": "Link",
            "href": "http://example.org/album/máiréad.png",
            "mediaType": "image/png"
          }
        ]
      },
      "target": {
        "type": "Collection",
        "id": "http://example.org/album/",
        "nameMap": {
          "en": "Martin's Photo Album",
          "ga": "Grianghraif Mairtin"
        },
        "image": {
          "type": "Link",
          "href": "http://example.org/album/thumbnail.jpg",
          "mediaType": "image/jpeg"
        }
      }
    }
  ]
}

4. モデル

Activity Vocabulary は Activity Streams 2.0 のためのコアオブジェクトと属性を形式的に定義している。

語彙によって定義されたオブジェクト型は、八つのコア型と、 多くのソーシャル Web アプリケーションで共通に使われる Activity 型と Object 型の拡張集合に分けられる。コア型は以下のものである:

Activity Streams 2.0 で定義されている全ての JSON オブジェクトは、 ObjectLink である。Activity Vocabulary に定義されているそれ以外の型は、全ての拡張型を含めて、 これら二つの基底型の派生である。

Activity Streams 2.0 文書の中の JSON オブジェクトは、次のどちらかの場合に Linkである:(a) 値が "Link" である type 属性を持つオブジェクト、 または (b) type 属性の値が、Link の拡張として定義されている型 (例えば、 Mention を参照のこと); さもなければこの JSON オブジェクトは Object の実体または 拡張である。

4.1 Object

Objectは Activity Streams vocabulary の基本基底クラスである。

(id 属性を使った絶対 IRI で記述された)グローバル修飾子と(type 属性を使って記述された)「オブジェクト型」に加えて、 Object 型の全ての実体は、 Activity Vocabulary で規定的に定義された属性の一般的な集合を共有する。これは次のものである: attachment | attributedTo | audience | content | context | contentMap | name | nameMap | endTime | generator | icon | image | inReplyTo | location | preview | published | replies | startTime | summary | summaryMap | tag | updated | url | to | bto | cc | bcc | mediaType | duration

(idtype を含めて) 全ての属性は オプションである。

Figure 7 グローバルな識別子とオブジェクト型を表現するために idtype 属性を使った Object の例。
Example 7
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "id": "http://example.org/foo",
  "type": "Note",
  "name": "My favourite stew recipe",
  "attributedTo": {
    "id": "http://joe.website.example/",
    "type": "Person",
    "name": "Joe Smith"
  },
  "published": "2014-08-21T12:34:56Z"
}

Activity Vocabulary は 多くのソーシャル Web アプリケーションで一般的である、幅広い Object 型を定義する。この仕様は、これらのアクティビティのほとんどについて特定の属性を 意味論的に定義するには至っていない。外部語彙は Activity Vocabulary で触れられていない 追加の詳細を記述するために使われる。

さらに、実装はActivity Vocabularyによって定義されたものを超えた新しい型ののObjectを自由に導入することができるが、アプリケーションが他の実装によって認識されない拡張型に依存しすぎると、相互運用性の問題が発生する可能性がある。既存のObject型と過度に重なったり、重複したりしないように注意するべきである。

実装がコア語彙型と重複する拡張型を使用する場合、実装はコア語彙型も指定しなければならない(MUST)。例えば、いくつかの語彙(例えば、The Good Relations Vocabulary)は、位置を記述するための独自の型を定義する。例えば、http://purl.org/goodrelations/v1#Locationをオブジェクト型として使用したい実装は、以下に示すように、そのオブジェクトをPlaceとしても識別しなければならない。

Figure 8 Placegr:Location の両方があるObject:
Example 8
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "gr": "http://purl.org/goodrelations/v1#"
    }
  ],
  "type": ["Place", "gr:Location"],
  "name": "Sally's Restaurant",
  "longitude": 12.34,
  "latitude": 56.78,
  "gr:category": "restaurants/french_restaurants"
}

外部語彙で定義されている属性は、 Activity Vocabulary で定義されている属性と重複および複製できる。そのような重なりが存在する場所では、一貫した相互運用性のために、 Activity Vocabulary て定義されている属性の仕様を 優先しなければならない(MUST)。

4.1.1 オブジェクト型のテキスト表現

Activity Streams 消費者はしばしば、 例えば Web ブラウザやコンソールインターフェースに表示するために、 Activity Streams オブジェクトのテキスト表現を必要とする。

name 属性は 作成者または他のユーザーによる入力から生成されるべきである(SHOULD)。

summary 属性は、おそらく発行者によって自動的に生成される、 フォールバックテキスト表現として使われるべきである(SHOULD)。name 属性がない場合、 summary 属性はマークアップを含むべきではなく(SHOULD NOT)、 オブジェクトの妥当なテキスト表現として使われるのに 十分短いものであるべきである(SHOULD)。

Figure 9 作者によって定義された名前を持つメモ
例9
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Note",
  "id": "http://example.org/note/123",
  "name": "Our Weather Is Fine",
  "content": "I feel that the weather is appropriate to our season and location."
}
Figure 10 自動生成された概要を持つメモ
例10
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Note",
  "id": "http://example.org/note/124",
  "summary": "A note by Sally",
  "content": "Everything is OK here."
}

namesummary はなくてもよく(MAY)、 エンドユーザーの現在の言語での明示的な値がなくてもよく(MAY)、 現在の言語コンテキストでの Object のテキスト表現として使うのに 適切でないぐらい長くてもよい(MAY)。消費者実装はこれらの場合の Object のテキスト表現に対する フォールバック戦略を持つべきである(SHOULD)。

4.3 Actor

Actor オブジェクトは、 Activity を実行する能力を持つ実体を表現する、基底 Object 型の特化である。Activity Vocabulary は Actor の 5 種類の特定の型の規定定義を提供する: Application | Group | Organization | Person | Service.

この仕様書は意図的に Actor を最も一般的な形でのみ定義し、 それぞれについて意味論的に特定の属性を定義することまではしない。全ての Actor オブジェクトは Object の特化であり、 全ての Object に共通の全てのコア属性を継承する。外部語彙は Activity Vocabulary で触れられていない 追加の詳細を記述するために使われる。Person, Group, Organization 実体の 追加メタデータとして提供するために VCard [[vcard-rdf]] が使われるべきである(SHOULD)。

Figure 15 VCard属性で拡張したPersonアクターのActivity:
例15
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {"vcard": "http://www.w3.org/2006/vcard/ns#"}
  ],
  "summary": "Sally created a note",
  "type": "Create",
  "actor": {
    "type": ["Person", "vcard:Individual"],
    "id": "http://sally.example.org",
    "name": "Sally Smith",
    "vcard:given-name": "Sally",
    "vcard:family-name": "Smith"
  },
  "object": {
    "type": "Note",
    "content": "This is a simple note"
  }
}

実装は、Activity Vocabularyによって定義されたものを超えて新しいタイプのアクターを自由に導入することができるが、アプリケーションが他の実装によって認識されない拡張タイプに過度に依存する場合、相互運用性の問題が生じる可能性がある。既存のアクター型と過度に重なったり、複製したりしないように注意すること。

実装がコア語彙型と重複する拡張型を使用する場合、実装はコア語彙型も指定しなければならない(MUST)。例えば、いくつかの語彙(例えばVCard)は、人を記述するために独自の型を定義する。例えば、vcard:Individualをアクターとして使いたい実装は、前の例で説明したように、そのアクターをPersonとしても識別しなければならない。

4.4 Activity

Activity オブジェクトは、既に起きた、今起きている途中、 将来起きるかもしれないアクションに関する情報を提供する、 基底 Object 型の特化である。

全ての Object の実体で対応している一般的な属性に加えて、 Activity オブジェクトは Vocabulary で 定義されている次の追加の属性に対応している: actor | object | target | origin | result | instrument

type 属性は Activity Statement が表現するアクションの型を 識別するために使われる。

Figure 16 単純なActivityを示す例:
例16
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Joe liked a note",
  "type": "Like",
  "id": "http://www.test.example/activity/1",
  "actor": "http://example.org/profiles/joe",
  "object": "http://example.com/notes/1",
  "published": "2014-09-30T12:34:56Z"
}

Activity Vocabulary は 多くのソーシャル Web アプリケーションで一般的である、少数の Activity 型を定義する。この仕様は、これらのアクティビティのほとんどについて特定の属性を 意味論的に定義するには至っていない。外部語彙は Activity Vocabulary で触れられていない 追加の詳細を記述するために使われる。

実装は、Activity Vocabularyによって定義されたものを超えた新しい型のActivityを自由に導入することができるが、アプリケーションが他の実装によって認識されない拡張型に過度に依存する場合、相互運用性の問題が生じる可能性がある。既存のアクティビティ型と過度に重なったり、複製したりしないように注意すること。

実装がコア語彙型と重複する拡張型を使用する場合、実装はコア語彙型も指定しなければならない(MUST)。For instance, some vocabularies (e.g.Schema.org) define their own types for describing actions. An implementation that wishes, for example, to use http://schema.org/LikeAction as an Activity MUST also identify that Object as being a Like as illustrated in the following:

Figure 17 Likehttp://schema.org/LikeActionの両方であるActivity:
例17
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Joe liked a note",
  "type": ["Like", "http://schema.org/LikeAction"],
  "id": "http://www.test.example/activity/1",
  "actor": "http://example.org/profiles/joe",
  "object": "http://example.com/notes/1",
  "published": "2014-09-30T12:34:56Z"
}

Implementations are free to use Activity objects in both passive and imperative operations. In the passive sense, the Activity is used to record that an activity has or is occurring. In the imperative sense, the Activity can be used as a form of command, instructing an application to modify state in some manner consistent with the action being described. However, because this specification does not define a normative processing model that constrains how applications make use of the format, the distinction about whether an Activity statement is to be interpreted as a passive notification or as an imperative command can vary across implementations.

4.5 IntransitiveActivity

IntransitiveActivity オブジェクトは、自動的なアクションを表現する Activity 型の特化である。IntransitiveActivity オブジェクトは object 特性を持たない。

4.6 Collection

Collection オブジェクトは、 他の ObjectLink の コンテナとして動作する基底 Object の特化である。

Collection 型は、 Objects から全て継承された 基底属性に加えて、追加の属性を含む: items | totalItems | first | last | current

Collection の中のアイテムは順序が ある場合とない場合がある。OrderedCollection 型は、 アイテムに常に順序がある Collection であることを識別するために使っても良い (MAY)。JSON シリアル化において、Collection の順序のないアイテムは items 属性を使って表現される一方、 順序のあるアイテムは orderedItems 属性を使って表現される。

Figure 18 単純な順序のないコレクション:
例18
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Object history",
  "type": "Collection",
  "totalItems": 2,
  "items": [
    {
      "type": "Create",
      "actor": "http://www.test.example/sally",
      "object": "http://example.org/foo"
    },
    {
      "type": "Like",
      "actor": "http://www.test.example/joe",
      "object": "http://example.org/foo"
    }
  ]
}
Figure 19 単純な順序のあるコレクション:
例19
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Object history",
  "type": "OrderedCollection",
  "totalItems": 2,
  "orderedItems": [
    {
      "type": "Create",
      "actor": "http://www.test.example/sally",
      "object": "http://example.org/foo"
    },
    {
      "type": "Like",
      "actor": "http://www.test.example/joe",
      "object": "http://example.org/foo"
    }
  ]
}

4.6.1 コレクションのページング

Collection は大量のアイテムを含むことができる。しばしば、 items (または orderedItems) 属性だけを使って Collection に含まれている全てのアイテムをシリアル化するのは 実装上非実用的になる。このような場合、Collection に含まれているアイテムは 相異なる部分集合、つまり「ページ」に分割できる。ページは CollectionPage 型を使って識別される。

CollectionPage 型は基底 Collection 型から拡張され、 その全ての属性を継承する。以下の追加の属性も定義されている: partOf | next | prev |

partOf 属性は、 CollectionPage に含まれているアイテムが属する Collection を識別する。

first, next, prev, last, current 属性は、 親コレクションからのアイテムの追加の部分集合を含む、他の CollectionPage 実体を参照するために使われる。

Collection オブジェクトと同様、 CollectionPage の中のアイテムは順序ありと順序なしの場合がある。OrderedCollectionPage 型は アイテムが順序ありのもののページを識別するために使われる。

OrderedCollectionPage 型は CollectionPage OrderedCollection の両方を拡張する。これらから継承した属性に加えて、 OrderedCollectionPage は追加の startIndex 属性を持つ; この値は、このページが示す OrderedCollection の中で、ページに含まれている最初のアイテムの相対インデックス位置を示す。

Figure 20 Collection, OrderedCollection, CollectionPage, OrderedCollectionPage の関係の図:
Collection型のモデル

順序付きでも順序なしでも、 Collection のページは 並びに配置される (シングルリンクリストかダブルリンクリスト)。first 属性はこの並びの最初のページを識別するために使われ、 一方 last 属性は並びの最後のページを識別するのに使われる。prevnext 属性はそれぞれ直前と直後のページを 識別する。

Figure 21 Collection ページングモデルの図:
ページングのモデル

current 属性は、Collection の中で、 最も最近に作成または更新されたアイテムの部分集合を含むページを識別する。

first, last, next, prev, current 属性は 単一の CollectionPage、 または CollectionPage を含む別のリソースを参照する Link である。

Figure 22 単純な、ページング付きの順序のないコレクション:
例20
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "Sally's recent activities",
  "type": "Collection",
  "id": "http://example.org/foo",
  "totalItems": 10,
  "first": {
    "type": "CollectionPage",
    "id": "http://example.org/foo?page=1",
    "partOf": "http://example.org/foo",
    "next": "http://example.org/foo?page=2",
    "items": [
      {
        "type": "Create",
        "actor": "http://www.test.example/sally",
        "object": "http://example.org/foo"
      }
    ]
  }
}

OrderedCollection のページングはトリッキーな場合がある; 実装がページの並びを何らかの推測可能な順序で処理することが 保証されないからである。論理的なコレクションのメンバアイテムを適切で完全な順序に再構築したい実装は、 並びの最初(または最後)のページに移動して、それから全てのページを処理するまで next (または prev) リンクを再帰的に 辿るべきである。ある OrderedCollection のページは OrderedCollectionPage の実体であるべきである(SHOULD)。OrderedCollection のページが OrderedCollectionPage の実体でない場合、 消費者はアイテムの適切な順序を再構築するために信頼性のある手段はない。

4.7 自然言語値

Vocabulary で定義されている属性のいくつかは自然言語値を持つと定義されている。これは、複数の言語を使った人間可読の文字列である。JSON シリアル化の中で、これらは以下のどちらかで表現される: (1) 単一の JSON 文字列、または (2) 同じ文字列値の地域化された等価な翻訳への整形された [BCP47] Language-Tags にマッピングされたJSONオブジェクト。シリアル化された JSON において、これら二つの型式は単純な属性命名規則によって 区別される; 例えば: "name" は name 属性の JSON 文字列形式を識別し、 一方 "nameMap" はオブジェクト形式を表現する。

Figure 23 言語情報のない単一の name String 値:
例21
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Object",
  "name": "This is the title"
}
Figure 24 複数の、言語指定された値:
例22
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Object",
  "nameMap": {
    "en": "This is the title",
    "fr": "C'est le titre",
    "es": "Este es el título"
  }
}

オブジェクト形式の全てのキーは整形された [BCP47] Language-Tag でなければならない(MUST)。関連付けられた値は文字列でなければならない(MUST)。

Activity Vocabulary は 自然言語値を使う三つの属性を定義している: name, summary, content. それぞれ、JSON シリアル化では " name", "summary", and "content" は JSON 文字列形式を表現する; "nameMap", "summaryMap", "contentMap" は オブジェクト形式を表現する。

特別な言語タグ "und" は、 言語が不明または未定義の値を明示的に識別するために オブジェクト形式の中で使用できる。

25 "und"言語タグの使用:
Example 23
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Object",
  "nameMap": {
    "und": "This is the title"
  }
}

4.7.1 デフォルト言語コンテキスト

Activity Streams 2.0 文書を生成または処理するのに [JSON-LD] 機構を使う場合、 デフォルト言語を識別するために @context の中で @language 属性を使っても良い(MAY)。この機構は、JSON-LD を使って Activity Streams 2.0 文書を処理することを 選ばなかった実装によっては理解されないかもしれない。

Figure 26 JSON-LDの@contextの中でデフォルトの"@language"を指定する:
Example 24
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "@language": "en"
    }],
  "type": "Object",
  "name": "This is the title"
}

4.7.2 双方向テキスト

Activity Streams 2.0文書内の自然言語値は、双方向テキストを含んでもよい(MAY)。Activity Streams 2.0 文書のデフォルト基本方向は左から右である。個々の自然言語値の基本方向は後述のようにして修正してもよい(MAY)。

When specifying bidirectional text for a natural language value, and the base direction of the text cannot be correctly identified by the first strong directional character of that text, publishers SHOULD explicitly identify the default direction either by prefixing the value with an appropriate Unicode bidirectional control character, or by using HTML directional markup where permitted.

Consumers of Activity Streams 2.0 documents that contain bidirectional text SHOULD identify the base direction of any given natural language value by either scanning the text for the first strong directional character not contained within a markup tag; or by utilizing directional markup where provided. Once the base direction has been identified, consumers MUST determine the appropriate rendering and display of natural language values, according to the Unicode Bidirectional Algorithm [BIDI]. This may necessitate wrapping additional control characters or markup around the string prior to display, in order to apply the base direction.

属性 方向 手法
name "פעילות הבינאום, W3C" Right-to-Left First strong directional character
name "The document was titled, '\u2067פעילות הבינאום, W3C\u2069'" Left-to-Right First strong directional character
name "\u200FHTML היא שפת סימון" Right-to-Left Bidi Control Character
name "\u200E'سلام' is hello in Persian." Left-to-Right Bidi Control Character
summary <p dir=\"rtl\">HTML היא שפת סימון>/p> Right-to-Left HTML Markup
summary <p>פעילות הבינאום, W3C</p> Right-to-Left First strong directional character (ignoring markup)
summary <p title="سلام">Hello</p> Left-to-Right First strong directional character (ignoring markup)

4.8 言語のマークアップ

Activity Streams 2.0 発行者は、分かっている場合には、map 属性か デフォルト言語タグを使って、自然言語属性の言語を明示的に マークアップするべきである(SHOULD)。

: 例

この仕様のすべての例が、自然言語属性の言語を明示的に示しているわけではない。これは意図的である。著者とワーキンググループは、実装者が新しい文書のテンプレートとして明示的な言語マークアップを持つ文書から例をカットアンドペーストし、その結果、不正確な言語マークアップが含まれることになることを避けたいと望んだ。

5 拡張性

Activity Streams 2.0では、「拡張」は、Activity Vocabularyによって定義されていない任意の属性、アクティビティ、アクター、またはオブジェクト型である。未知の拡張に遭遇した消費実装は、処理を停止したりエラーを通知したりしてはならず(MUST NOT)、それらの属性が存在しないかのようにアイテムの処理を継続しなければならない(MUST)。拡張の対応は実装によって異なる可能性があり、拡張の標準的な処理モデルは定義されていないことに注意すること。したがって、拡張の使用に過度に依存する実装は、他の実装との相互運用性の低下を経験する可能性がある。

拡張については、拡張を定義し、明確にするための主要な機構として[JSON-LD]が使われる。拡張を完全にサポートしたい実装は、[JSON-LD]機構を使用すべきである。

いくつかの一般的な拡張機能は、Activity Streams 2.0名前空間文書に含まれており、https://www.w3.org/ns/activitystreams#extensionsで確認できる。Social Web Incubator Community Groupは、Activity Streams Extensionsのwikiページを保守している。

JSON-LD Processing Algorithms[JSON-LD-API]は、現在定義されているように、JSON-LD @contextで定義されていない属性を暗黙に無視することに注意することは重要である。拡張属性を含むActivity Streams 2.0文書を公開する実装は、すべての拡張に対して@context定義を提供すべきである(SHOULD)。

また、JSON-LD文書内では使用できない、妥当なJSON構造体があることに注意することも重要である。例として、JSON-LDは、例えば一般的なGeoJSON仕様で使用されている「配列の配列」を禁止している。実装はActivity Streams 2.0文書内の拡張としてこのような構造体を自由に使用できるが、標準のJSON-LD処理アルゴリズムを使用する消費者は、JSON-LDアルゴリズムを適用する前に、このような拡張を無視するか、互換性のある別の構造体にマッピングする必要がある。例えば、単純なGeoJSONポイントはPlaceオブジェクトにマップすることができ、より複雑なジオメトリはGeoSparqlの"Well-Known Text"表現に変換できる。

Figure 27 GeoJSONの位置座標:
Example 25
{
  "type": "Point",
  "coordinates": [36.74, -119.77]
}
Figure 28 等価なPlaceの代替物:
Example 26
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "name": "Fresno, California",
  "type": "Place",
  "latitude": 36.74,
  "longitude": -119.77
}
Figure 29 GeoJSONの多角形座標:
Example 27
{
  "type": "Polygon",
  "coordinates": [
    [
      [100.0, 0.0],
      [101.0, 0.0],
      [101.0, 1.0],
      [100.0, 1.0],
      [100.0, 0.0]
    ]
  ]
}
Figure 30 等価なGeoSparqlのWell-Known-Textの代替物:
Example 28
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {"gsp": "http://www.opengis.net/ont/geosparql"}
  ],
  "summary": "A polygon",
  "type": "gsp:Geometry",
  "gsp:asWKT": "Polygon((100.0, 0.0, 101.0, 0.0, 101.0, 1.0, 100.0, 1.0, 100.0, 0.0))"
}

5.1 Compact URI対応

JSON-LD文法は、"Compact URI"に対応している。"Compact URI"は、直列化を単純化するために定義された接頭辞を使用するURIの代替エンコーディングである。例えば、URIhttp://example.org/termは、ex:接頭辞にhttp://example.org/の値を割り当てることで、ex:termとして表すことができる。

JSON-LD内では、Compact URI接頭辞はJSON-LD@context定義内で定義される。例:

Figure 31 あるJSON-LD Compact URI定義
Example 29
{
"@context": {
"ex": "http://example.org/",
"term": {
  "@type": "id",
  "@id": "ex:term"
}
},
"term": "ex:Foo"
}

この例では、属性名termと値ex:Fooの両方がCompact URIである。属性名termhttp://example.org/termに展開され、値ex:Foohttp://example.org/Fooに展開される。

JSON-LDでは、valuesのCompact URI展開は@context定義の中で"type": "id"として明示的に定義された属性に適用される。特に、Compact URIはIRI(またはURI)値が想定されるどこでも使われる可能性がある。

拡張に完全に対応することを望むActivity Streams 2.0実装は、JSON-LD仕様で定義されているCompact URI展開に対応しなければならない(MUST)。このような展開は、JSON-LDの@contextで@id型として明示的に定義されている全ての属性名および属性値に適用される。

Compact URI形式に過度に依存することは、実装間の曖昧さと相互運用性の問題を引き起こす可能性がある。従って、Compact URIの使用は、属性名とtype属性の値以外の全ての場合で避けるべきである(SHOULD)。

5.2 拡張の再直列化

パースにJSON-LD機構を使い、それから拡張属性を含むActivity Streams 2.0文書を再直列化する実装は、元の文書にある拡張属性が保存され、適切に直列化されるように十分な注意をするべきである(SHOULD)。

例えば次の、架空のfoobar拡張属性を含む単純なActivity Streamを考える。foo拡張はJSON-LD @contextの中で定義されているが、bar拡張属性は定義されていない。

Figure 32 単純な、拡張されたObject
Example 30
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {"foo": "http://example.org/foo"}
  ],
  "type": "Note",
  "content": "This is a simple note",
  "foo": 123,
  "bar": 321
}

An implementation that receives this Note object can choose to parse the object as an ordinary JSON object or it can use the standard JSON-LD Expansion algorithm.

If the implementation chooses to parse the object as ordinary JSON and then reserializes the object (e.g. for storage or redistribution), then it would simply preserve the values of the @context, foo and bar properties as they are and include those in the reserialized output.

However, if the implementation chooses to use the JSON-LD expansion algorithm, the @context will be removed from the expanded result and the bar property will be mapped to the "blank node" _:bar. If this document is then reserialized using the normative Activity Streams 2.0 context, the JSON-LD compacted form would be:

Figure 33 再直列化されたコンパクト化形式:
Example 31
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Note",
  "content": "This is a simple note",
  "http://example.org/foo": 123,
  "bar": 321
}

これはオリジナルに近いが、foo属性に完全に展開されたURIラベルを使用するのは同一ではない。To ensure that the reserialized object is serialized correctly, implementations that perform JSON-LD expansion of received documents SHOULD preserve the original @context used when performing the JSON-LD expansion, then reuse that when reserializing the object into the JSON-LD compacted form.

6. プライバシー上の考慮事項

Activity Streams 2.0 documents can (and likely will) contain potentially sensitive personal information such as identity, contact information, physical location, physical characteristics, and so forth. Furthermore, Activity data, in general, can be analyzed to generate profiles of the behavior of individual or groups of Actors.

Implementations that produce or consume Activity Streams 2.0 documents MUST take steps to openly and publicly document and communicate to all potential users: (a) the kinds of potentially sensitive personal information published, consumed or collected by the implementation, (b) the reasons for publishing, consuming and collecting that information, (c) the manner in which that information is being used, (d) the identity of any other party with whom that information is being shared, and (e) the reason the information is being shared with other parties.

Implementations that publish Activity Streams 2.0 documents SHOULD assume a default position of limiting both the kind and amount of sensitive personal information included in the document unless users have "opted in" to sharing additional detail.

Implementations that consume Activity Streams 2.0 documents SHOULD NOT, by default, store or share sensitive personal information included within consumed documents unless users have "opted in" to allowing that information to be stored or shared.

In this context, "opting in" does not necessarily require explicit action on the part of the user. If, for instance, the use of certain sensitive personal information is clearly implicit in the use of an implementation (a location tracking service, for example), then any use of that implementation can be considered an implicit acknowledgement that the sensitive personal information will be used and shared so long as the documentation guidelines listed above are followed.

7. セキュリティ上の考慮事項

Publishers or Consumers implementing Activity Streams as a stream of public data may also want to consider the potential for unsolicited commercial or malicious content and should take preventative measures to recognize such content and either identify it or not include it in their implementations.

Publishers should take reasonable measures to ensure potentially malicious user input such as cross-site scripting attacks are not included in the Activity Streams data they publish.

Consumers that re-emit ingested content to end-users MUST take reasonable measures if emitting ingested content to make sure potentially malicious ingested input is not re-emitted.

Consumers that re-emit ingested content for crawling by search engines should take reasonable measures to limit any use of their site as a Search Engine Optimization loophole. This may include converting untrusted hyperlinks to text or including a rel="nofollow" attribute.

Consumers should be aware of the potential for spoofing attacks where the attacker publishes activities or objects with falsified property values with the intent of injecting malicious content, hiding or corrupting legitimate content, or misleading users.

Activity StreamsはJSON文書であり、[RFC7159]で説明されているのと同じセキュリティ上の考慮事項に従う。

Activity Streamsの実装はURIを扱う。[RFC3986]の7章を参照のこと。

Activity Streamsの実装はIRIを扱う。[RFC3987]の8章を参照のこと。

8. IANAの考慮事項

8.1 application/activity+json メディア型

この仕様は、Activity Streams 2.0 型式に準拠した文書を識別するために application/activity+json MIME Media Type を 登録する。

Type name: application
Subtype name: activity+json
Required parameters: None
Optional parameters: profile: application/activity+json メディアタイプの profile 引数は 一つ以上のプロファイル URI を指定できる。これらのプロファイル URI は [RFC6906] で定義された意味論を持つ。"profile" メディアタイプ引数はクォートされなければならない(MUST)。これは空白で区切られた URI (プロファイル URI) の空でないリストである。
profile-param = "profile=" profile-value
profile-value = <"> profile-URI 0*( 1*SP profile-URI ) <">
profile-URI   = URI
上記の文法での "URI" は [RFC3986] の Section 3 で定義される "URI" を参照する。
Encoding considerations: "application/activity+json"メディア型を使用するリソースは、"application/json"メディア型のすべての要件に準拠する必要があるため、[RFC7159]の11章で指定されているのと同じエンコーディングの考慮事項に従う。
Security considerations: この仕様で定義している通り。
Contact: James M Snell <jasnell@gmail.com>

Activity Streams 2.0 型式は JSON-LD 仕様を使う一方、 この特定のメディアタイプの使用を正当化する Activity Streams 2.0 実装のためには、多くの制限と追加の要求があることに 注意すること。

Activity Streams 2.0 は JSON-LD の制限されたプロファイルと考えることも 出来るため、実装は `application/ld+json; profile="https://www.w3.org/ns/activitystreams"` メディアタイプを `application/activity+json` と等価なものとして 扱うべきである(SHOULD)。

9. 適合性

この仕様における、非規範的とされている節および、全ての図、例、注記は非規範的である。この仕様におけるその他の全ては規範的である。

9.1文書

適合文書とは、文書のすべての適合基準に適合する文書である。For readability, some of these conformance requirements are phrased as conformance requirements on publishers; such requirements are implicitly requirements on documents: by definition, all documents are assumed to have a publisher.

Conforming documents must not include deprecated or obsolete syntax from Activity Streams 1.0. Conforming documents must include properties and types from the Activity Vocabulary. Conforming documents that use other vocabularies must also include equivalent Activity Vocabulary properties and types as illustrated in Section C. Conforming documents must not use features of JSON-LD or other serialization features disallowed in this specification, as in Section 2. Conforming documents that include types or properties beyond those defined in the Activity Streams 2.0 Vocabulary must use the extensibility features defined in section 5.

文書の例の非網羅的なリストには、以下が含まれる:

9.2 実装

Conforming implementations are software that publish, store, analyze, consume or otherwise process conforming documents. The two main kinds of implementations are publishers and consumers.

9.2.1 発行者

Conforming publishers are implementations that create and publish conforming documents. Conforming publishers must make conforming documents available according to the serialization requirements of section 2. Conforming publishers must consider privacy as described in section 6. Conforming publishers must consider security as described in section 7.

発行者の例の非網羅的なリストには、以下が含まれる:

  • ソーシャルネットワーク
  • 個人的なwebサイト
  • 文書発行システム
  • 非適合ソーシャルネットワークからのブリッジ
  • RSSやAtomのような似たような文書型からの文書コンバータ

9.2.2 消費者

Conforming consumers are implementations that read and analyze conforming documents. Conforming consumers must tolerate deprecated or obsolete properties or types from Activity Streams 1.0. Conforming consumers must ignore properties or types that are not applicable to their application domain.

Conforming consumers may re-publish conforming documents in other other data formats. Conforming consumers may present conforming documents to a user on screen, in print, in audio format, or using other presentation mechanisms. Conforming consumers must faithfully translate the information represented in conforming documents into these other formats or media. Conforming consumers that re-publish conforming documents must consider privacy as described in section 6 and security as described in section 7.

消費者の例の非網羅的なリストには、以下が含まれる:

  • ソーシャルネットワーク
  • 検索エンジン
  • フィードリーダ
  • 文書バリデータ
  • フィードアグリゲータ
  • 静的アナライザ

A. 謝辞

Activity Streams 2.0仕様は、W3CSocial Web Working Groupの成果物である。編集者は、現在の仕様を形成するのに役立った会話、問題、テストに貢献したすべてのワーキンググループメンバーに感謝する。

編集者はまた、W3CSocial Web Working Groupへの貢献として仕様が取り上げられる前にActivity Streamsに貢献したすべての人々に感謝したい。Activity Streams 1.0はコミュニティ主導の活動であり、次の方々を含む(しかしそれに限定されない)コミュニティからの初期の貢献がなければ、仕様は現在のような形にはならなかった: Abdul Qabiz, Adina Levin, Adrian Chan, Adriana Javier, Alan Hoffman, Alex Kessinger, Alexander Ovchinnikov, Alexander Zhuravlev, Alexandre Loureiro Solleiro, Amy Walgenbach, Andres Vidal, Angel Robert Marquez, Ari Steinberg, Arjan Scherpenisse, Arne Roomann-Kurrik, Beau Lebens, Ben Hedrington, Ben Metcalfe, Ben Werdmuller, Benjamin Goering, Bill de hOra, Bo Xing, Bob Aman, Bob Wyman, Brett Slatkin, Brian Walsh, Brynn Evans, Charlie Cauthen, Chris Chabot, Chris Messina, Chris Toomey, Christian Crumlish, Dan Brickley, Dan Scott, Daniel Chapman, Danny Ayers, Dare Obasanjo, Darren Bounds, David Cramer, David Nelson, David Recordon, DeWitt Clinton, Douglas Pearce, Ed Summers, Elias Bizannes, Elisabeth Norris, Eric Marcoullier, Eric Woods, Evan Prodromou, Gee-Hsien Chuang, Greg Biggers, Gregory Foster, Henry Saputra, Hillary Madsen, Howard Liptzin, Hung Tran, Ian Kennedy, Ian Mulvany, Ivan Pulleyn, Jacob Kim, James Falkner, James Pike, James Walker, Jason Kahn, Jason Kantz, Jeff Kunins, Jeff Martin, Jian Lin, Johannes Ernst, John Panzer, Jon Lebkowsky, Jon Paul Davies, Jonathan Coffman, Jonathan Dugan, Joseph Boyle, Joseph Holsten, Joseph Smarr, Josh Brewer, Jud Valeski, Julien Chaumond, Julien Genestoux, Jyri Engestroem, Kaliya Hamlin, Kevin Marks, Laurent Eschenauer, Laurie Voss, Leah Culver, Libby Miller, Manu Mukerji, Mark Weitzel, Marko Degenkolb, Marshall Kirkpatrick, Martin Atkins, Martin Svensson, Marty Alchin, Mary Hoder, Matt Leventi, Matt Wilkinson, Matthias Mueller-Prove, Max Engel, Max Wegmueller, Melvin Carvalho, Michael Buckbee, Michael Chan, Michael Richardson, Michael Sullivan, Mike Macgirvin, Mislav Marohnić, Mo Jangda, Monica Wilkinson, Nate Benes, NeilFred Picciotto, Nick Howard, Nick Lothian, Nissan Dookeran, Nitya Narasimhan, Pablo Martin, Padraic Brady, Pat Cappelaere, Patrick Aljord, Peter Ferne, Peter Reiser, Peter Saint-Andre, Phil Wolff, Philip (flip) Kromer, Richard Cunningham, Richard Zhao, Rick Severson, Robert Hall, Robert Langbert, Robert Dolin, Robin Cover, Ryan Boyd, Sam Sethi, Scott Raymond, Scott Seely, Simon Grant, Simon Wistow, Stephen Garcia, Stephen Sisk, Stephen Paul Weber, Steve Ivy, Steve Midgley, Steven Livingstone-Perez, Sylvain Carle, Sylvain Hellegouarch, Tantek Çelik, Tatu Saloranta, Tim Moore, Timothy Young, Todd Barnard, Tosh Meston, Tyler Gillies, Will Norris, Zach Copley, Laurent-Walter Goix, Matthew Marum, Andy Smith, Zach Shepherd。

B. 廃止されたActivity Streams 1.0文法

この節は非規範的である。

注意: この付録は非規範的であるが、MUSTのような規範的用語を使う。Where used, the meaning is to indicate what would be required to properly implement the Activity Streams 1.0 backwards compatibility model described in this appendix if an implementer chose to do so.

While the syntax defined by this specification diverges from that defined by JSON Activity Streams 1.0, the fundamental model defined by that original specification remains intact. Specific processing rules are defined by this specification that allow existing Activity Streams 1.0 documents to be mapped to and processed as an Activity Streams 2.0 document.

The JSON syntax defined by this specification differs somewhat from that defined in the original JSON Activity Streams 1.0 [ AS1] specification in ways that are not backwards compatible. Implementations can choose to continue supporting the JSON Activity Streams 1.0 syntax but ought consider it to be deprecated. This means that while implementations can continue to consume the 1.0 syntax, they should not output the 1.0 syntax unless specifically interacting with older non-2.0 compliant implementations.

Specifically:

  1. Implementations can use the "application/stream+json" MIME media type when producing a JSON serialization using the Activity Streams 1.0 syntax, and "application/activity+json" when producing a serialization conforming to the 2.0 syntax.
  2. Implementations that process serializations identified using either the "application/stream+json" or the more generic "application/json" MIME media type MUST follow the syntax and processing rules set by [AS1]. The 2.0 syntax and processing rules apply only when handling serializations using the "application/activity+json" media type.
  3. When processing Activity Streams 1.0 documents using a JSON-LD processing model, implementations can use the special AS 1.0 to AS 2.0 expansion @context definition provided here to produce the JSON-LD expanded representation. Refer to the JSON-LD Processing Algorithms and API for details.
  4. When processing Activity Streams 1.0 documents and converting those to 2.0, implementations ought to treat id as an alias for the JSON-LD @id key word; and the objectType and verb properties as aliases for the JSON-LD @type keyword.
  5. Activity Streams 1.0 uses the displayName property which has been renamed to name in Activity Streams 2.0. Implementations ought to treat displayName as an alias for name.
  6. Activity Streams 1.0 uses the title property which has been dropped from Activity Streams 2.0. Implementations processing Activity Streams 1.0 documents as Activity Streams 2.0 ought to treat instances of the title property as an extension.
  7. This document redefines the content and summary properties as natural language values which means their values can be expressed as either a string or an object mapping language tags to string values. In the 1.0 syntax, these are expressed solely as String values. Because the 1.0 values are a valid subset allowed by this specification, implementations are not required to take any specific action to continue supporting those values.
  8. This document redefines a large number of common properties defined originally as Objects in 1.0 as either Objects or Links. The JSON-LD serialization allows such property values to be expressed as either an IRI String, an JSON object, or an Array of IRI Strings and JSON objects. Because the 1.0 values are a valid subset allowed by this specification, existing implementations are not required to take any specific action to continue supporting those values.
  9. This specification deprecates the upstreamDuplicates and downstreamDuplicates properties defined by Activity Streams 1.0 and does not provide a replacement. This is due largely to lack of any reasonable implementation evidence. While the upstreamDuplicates and downstreamDuplicates properties MAY continue to be used, implementations SHOULD avoid them.
  10. In Activity Streams 1.0, the "post" verb was defined to describe the action of both creating an object and "posting" or uploading it to a service. This specification replaces the "post" verb with separate Create and Add Activity types. When processing Activity Streams 1.0 documents and converting those into 2.0, implementations SHOULD treat instances of the " post" verb as equivalent to Create if there is no target property specified; and equivalent to Add if there is a target property specified.

By following these guidelines, all JSON Activity Streams 1.0 serializations can be processed successfully by 2.0 implementations.

C. 複数の語彙を使った例

この節は非規範的である。

It is possible use multiple vocabularies to cover particular characteristics of the activities like data provenance and annotations, which can compliment the Activity Vocabulary. For example: Eric writes a short note to be shared with his followers. After posting the note, he notices a spelling error. He edits the note and re-posts it. Later, Eric decides that the information in the note is incorrect. He deletes the note.

Figure 34 A series of activities; creating, editing, and deleting a note.
Example 32
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "oa": "http://www.w3.org/ns/oa#",
      "prov": "http://www.w3.org/ns/prov#",
      "dcterms": "http://purl.org/dc/terms/",
      "dcterms:created": {
        "@id": "dcterms:created",
        "@type": "xsd:dateTime"
      }
    }
  ],
  "summary": "Editing history of a note",
  "type": "Collection",
  "items": [
    {
      "id": "http://example.org/activity/20150101000000",
      "type": [ "Create", "prov:Activity" ],
      "actor": {
        "id": "http://example.org/#eric",
        "name": "Eric"
      },
      "summary": "Eric wrote a note.",
      "object": {
        "id": "http://example.org/entry/20150101000000",
        "type": [ "Note", "prov:Entity" ],
        "attributedTo": "http://example.org/#eric",
        "content": "Remember... all I'm offering is the trooth. Nothing more."
      },
      "published": "2015-01-01T00:00:00Z"
    },
    {
      "id": "http://example.org/activity/20150101000059",
      "type": [ "Update", "prov:Activity", "oa:Annotation" ],
      "summary": "Eric edited a note.",
      "dcterms:created": "2015-01-01T00:00:59Z",
      "dcterms:creator": { "@id": "http://example.org/#eric" },
      "oa:hasBody": {
        "id": "http://example.org/entry/20150101000059",
        "type": [ "Note", "prov:Entity" ],
        "content": "Remember... all I'm offering is the truth. Nothing more.",
        "prov:wasAttributedTo": { "@id": "http://example.org/#eric" },
        "prov:wasRevisionOf": { "@id": "http://example.org/entry/20150101000000" }
      },
      "oa:hasTarget": { "@id": "http://example.org/entry/20150101000000" },
      "oa:motivatedBy": { "@id": "oa:editing" },
      "prov:generated": { "@id": "http://example.org/entry/20150101000059" },
      "prov:wasInformedBy": { "@id": "http://example.org/activity/20150101000000" }
    },
    {
      "id": "http://example.org/activity/20150101010101",
      "type": [ "Delete", "prov:Activity" ],
      "actor": "http://example.org/#eric",
      "summary": "Eric deleted a note.",
      "object": "http://example.org/entry/20150101000059",
      "published": "2015-01-01T01:01:01Z"
    }
  ]
}

D. 変更履歴

この節は非規範的である。

前回の候補勧告2016-12-15以降、以下の注目すべき変更が本文書に加えられた。

E. 図の一覧

F. 参考文献

F.1 引用規格

[BCP47]
Tags for Identifying Languages. A. Phillips; M. Davis. IETF. September 2009. IETF Best Current Practice. URL: https://tools.ietf.org/html/bcp47
[BIDI]
Unicode Bidirectional Algorithm. Mark Davis; Aharon Lanin; Andrew Glass. Unicode Consortium. 18 May 2016. Unicode Standard Annex #9. URL: http://www.unicode.org/reports/tr9/tr9-35.html
[HTML5]
HTML5. Ian Hickson; Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Theresa O'Connor; Silvia Pfeiffer. W3C. 28 October 2014. W3C Recommendation. URL: https://www.w3.org/TR/html5/
[JSON-LD]
JSON-LD 1.0. Manu Sporny; Gregg Kellogg; Markus Lanthaler. W3C. 16 January 2014. W3C Recommendation. URL: https://www.w3.org/TR/json-ld/
[JSON-LD-API]
JSON-LD 1.0 Processing Algorithms and API. Markus Lanthaler; Gregg Kellogg; Manu Sporny. W3C. 16 January 2014. W3C Recommendation. URL: https://www.w3.org/TR/json-ld-api/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[RFC3339]
Date and Time on the Internet: Timestamps. G. Klyne; C. Newman. IETF. July 2002. Proposed Standard. URL: https://tools.ietf.org/html/rfc3339
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. January 2005. Internet Standard. URL: https://tools.ietf.org/html/rfc3986
[RFC3987]
Internationalized Resource Identifiers (IRIs). M. Duerst; M. Suignard. IETF. January 2005. Proposed Standard. URL: https://tools.ietf.org/html/rfc3987
[RFC5988]
Web Linking. M. Nottingham. IETF. October 2010. Proposed Standard. URL: https://tools.ietf.org/html/rfc5988
[RFC6906]
The 'profile' Link Relation Type. E. Wilde. IETF. March 2013. Informational. URL: https://tools.ietf.org/html/rfc6906
[RFC7159]
The JavaScript Object Notation (JSON) Data Interchange Format. T. Bray, Ed.. IETF. March 2014. Proposed Standard. URL: https://tools.ietf.org/html/rfc7159

F.2 参考規格

[ABNF]
Augmented BNF for Syntax Specifications: ABNF. D. Crocker, Ed.; P. Overell. IETF. January 2008. Internet Standard. URL: https://tools.ietf.org/html/rfc5234
[AS1]
JSON Activity Streams 1.0. J. Snell; M. Atkins; W. Norris; C. Messina; M. Wilkinson; R. Dolin. http://activitystrea.ms. unofficial. URL: http://activitystrea.ms/specs/json/1.0/
[SWP]
Social Web Protocols. A. Guy.URL: https://www.w3.org/TR/social-web-protocols/
[vcard-rdf]
vCard Ontology - for describing People and Organizations. Renato Iannella; James McKinney. W3C. 22 May 2014. W3C Note. URL: https://www.w3.org/TR/vcard-rdf/