要約

この仕様書は、JSONフォーマットを用いて潜在的および完了したアクティビティを表現するためのモデルを詳細に述べています。アクティビティの構造を詳細にし、特定のアクティビティタイプを定義するボキャブラリーと組み合わせて使用されることを意図しています。

著者ノート

このセクションは規範的ではありません。

このドラフトは、Martin Atkins、Will Norris、Chris Messina、Monica Wilkinson、Rob Dolin、James Snellが共著したJSON Activity Streams 1.0仕様から強い影響を受けています。著者は彼らの多大な貢献に深く感謝するとともに、その成果の恩恵を受けています。一部のActivity Streams 1.0原本文は本ドキュメント内で使用されています。

この文書の位置付け

このセクションは本ドキュメントの公開時点における位置付けを説明します。他の文書がこの文書に取って代わる場合があります。現在のW3C公開文書およびこの技術レポートの最新版はW3C技術レポートインデックス(https://www.w3.org/TR/)で確認できます。

この文書はSocial Web Working Groupによって勧告として公開されました。この文書に関するコメントは歓迎しています。ご意見は public-socialweb@w3.org購読アーカイブ)までお送りください。

ワーキンググループの実装レポートもご参照ください。

本文書はW3Cメンバー、ソフトウェア開発者、他のW3Cグループおよび関係者によってレビューされ、またディレクターによりW3C勧告として承認されています。これは安定した文書であり、リファレンスマテリアルや他文書からの引用に使用できます。W3Cの勧告発行の役割は、この仕様へ注目を集め、その広範な導入を推進することにあります。これによりウェブの機能性と相互運用性が高まります。

この文書は、 2004年2月5日 W3C特許ポリシーのもとで運用されるグループにより作成されました。 W3Cは、本グループの成果物に関連してなされた特許開示の公開リストを管理しています。特許の開示方法もそのページでご案内しています。実際に必須特許だと考えられる特許情報を有する個人は、その情報をW3C特許ポリシー第6節に従って開示する必要があります。

本ドキュメントは2017年3月1日 W3Cプロセス文書に従って管理されています。

1. 導入

最も基本的な意味において、「アクティビティ」とは動作のセマンティックな記述です。本仕様の目的は、アクティビティに関するメタデータをリッチで人に優しく、かつ機械的に処理可能かつ拡張可能な方法で表現するのに十分な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 2.0がActivity Streams 1.0から進化するきっかけとなった課題には、次のようなものがあります:

displayName, verb, title, objectType の用語は、Activity Streams 2.0ドキュメント内では予約語として使用しない方がよいものとみなしてください。もしActivity Streams 2.0ドキュメント内で使用されている場合は、 ガイドラインに従い処理してください。 B. 非推奨となったActivity Streams 1.0構文 を参照してください。

2. シリアライズ

本仕様は、[RFC7159]に基づき、[JSON-LD]構文制約のサブセットに準拠しながら、JSON-LD処理を必須としない Activity Vocabulary のためのJSONベースのシリアライズ構文を規定します。他のシリアライズ形式も可能ですが、本ドキュメントではそれらについては扱いません。

シリアライズ時、プロパティの値が存在しない場合、(a) 値をnullに設定する、または (b)プロパティ自体を省略するという2つの方法で表現できます。どちらも意味的には同一です。もし配列プロパティの値が配列で項目が存在しない場合、その配列のプロパティを省略またはnullにする必要があります。省略または明示的なnull値は、「値が空・nilである」ではなく「値が割り当てられていない」と解釈されます。

Activity Streams ドキュメント とは、ルート値が任意の型のActivity Streams ObjectCollection を含む)であり、MIMEメディアタイプが " application/activity+json" であるJSONドキュメントを指します。

Activity Streams 2.0ドキュメントはUTF-8文字エンコーディングでシリアライズされなければなりません。

2.1 JSON-LD

シリアライズされたActivity Streams 2.0ドキュメントのJSON形式は、標準のJSON-LD 1.0 Processing AlgorithmsおよびAPI [JSON-LD-API] のCompaction Algorithmによって、少なくとも 規範的なJSON-LD @context定義 を使用した場合と同じ結果になる必要があります。実装は@contextに追加の定義を加えても規範コンテキストの上書き・変更はしてはなりません。標準JSON-LDアルゴリズムを利用する実装でサポートされない追加プロパティや値も利用可能ですが、その場合それらプロパティは無視される可能性が高いです。拡張の扱いについては拡張性セクションを参照してください。

JSON-LDは@contextプロパティを使ってプロセッシングコンテキストを定義します。@contextプロパティの値は [JSON-LD] 仕様に従って与えられます。Activity Streams 2.0ドキュメントを生成する実装は、@contextプロパティに Activity Streams 2.0 JSON-LD @context定義 への参照を含めるべきです(値は " https://www.w3.org/ns/activitystreams")。"http://www.w3.org/ns/activitystreams" を使っても構いません。文字列・オブジェクト・配列のいずれでも指定できます。

2.1.1 文字列によるcontext

1 文字列でcontextを提供するドキュメント例
例1
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "summary": "A note",
  "type": "Note",
  "content": "My dog has fleas."
}

2.1.2 オブジェクトによるcontext

2 @vocab キーワードおよび拡張用プレフィックスを使い、オブジェクトとしてcontextを提供するドキュメント例
例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 配列によるcontext

3 contextを配列で指定し、拡張用語のエイリアスを含めたドキュメント例
例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実装で、MIMEタイプが" application/activity+json"で識別されるJSONドキュメントに@contextプロパティがなく、かつ値に規範的な@context定義への参照が含まれない場合でも、規範@context定義が適用されるものとみなさなければなりません

2.2 IRIおよびURL

本仕様ではIRIs([RFC3987])を使用します。全てのURI([RFC3986])はIRIでもあるため、IRIが求められる箇所ではURIも使えます。特に留意すべき2点:(1)デリファレンス用にIRIが指定されてURIでない場合は、[RFC3987] 3.1節の手順でURIに変換しなければならない、(2)IRIが"id"値として用いられる場合はそのような変換をしてはならない

相対IRI(およびURL)参照は、多くのJSONパーサ実装がベースコンテキストを正しく維持できず、相対参照の解決が信頼できないため、Activity Streams 2.0ドキュメント内で使用しないことを推奨します

2.3 日付と時刻

日付および時刻値を持つ全てのプロパティは、[RFC3339] の"date-time"構文規則に準拠しなければなりません。ただし秒部分は省略可能です。日付と時刻の区切りには大文字"T"、数値タイムゾーンオフセットがない場合は大文字"Z"を使うこと

これは、次の [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` コンポーネントはタイムゾーンとは一致しないことに注意してください。この部分を含む時刻はタイムスタンプ用には適しますが、ローカル時刻への変換には追加情報や処理が必要です。

3.

このセクションは規範的ではありません。

以下は詳細レベルの異なる3つのアクティビティ例です。

各例では、本仕様で定義された標準的なJSONシリアライズ形式を用いて示しています。

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

4 'http://www.test.example/martin' が 'http://example.org/foo.jpg' を作成しました という内容を表す。追加詳細はありません。
例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 追加情報を含む基本的なアクティビティ

5 「Martin Smithが2015年2月10日15:04 UTCにブログ『Martin's Blog』へ記事を追加した」という内容を表現。記事・アクター・ターゲットブログについての追加詳細はActivity Streams 2.0 Vocabularyのプロパティで記述。
例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 拡張されたアクティビティ

6 より詳細なシングルエントリーの「Activity Stream」例。
例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 Streams 2.0のコアオブジェクトタイプとプロパティを規範的に定義しています。

この語彙で定義されるオブジェクトタイプは、8つのコアタイプのセットと、多くのソーシャルWebアプリケーションで共通して使われるActivityおよびObjectの拡張セットに分割されています。コアタイプには以下が含まれます:

Activity Streams 2.0 ドキュメント内のすべてのJSONオブジェクトは、 Object または Link です。その他の語彙で定義された型や拡張型は、これら2つのベース型から派生しています。

Activity Streams 2.0 ドキュメントのJSONオブジェクトは、 (a) type プロパティの値として"Link"を含む場合、または(b) type プロパティ値に含まれる型のいずれかが Link の拡張であると定義されている場合(例: Mention 参照)、それは Link となります。それ以外の場合、そのJSONオブジェクトは Object のインスタンスまたは拡張とみなします。

4.1 Object

Object はActivity Streams語彙の主たるベース型です。

全ての Object 型はグローバル識別子(id プロパティで絶対IRIとして示す)および"オブジェクト型"(type プロパティで示す)に加え、アクティビティ語彙で規範的に定義される共通のプロパティ群を持ちます。これには次が含まれます: 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も含む)。

7 以下は、グローバル識別子とオブジェクト型を表すために id および type プロパティを使用したObjectの例です:
例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"
}

アクティビティ語彙では、多くのソーシャルWebアプリケーションで共通して使用される Object 型が定義されています。本仕様は、これらオブジェクトの意味論的に特定なプロパティまでは定義しません。Activity Vocabularyでカバーされない詳細な情報は外部語彙を用いて表現できます。

また、実装はActivity Vocabularyで定義されていない新しい型のObjectを導入することができますが、他の実装で認識されない拡張型に過度に依存すると互換性の問題が発生する可能性があります。既存Object型との無用な重複やオーバーラップを避けるよう留意してください。

拡張型がコア語彙型と重複する場合、実装は必ずコア語彙型も指定しなければなりません。たとえば、いくつかの語彙(例:The Good Relations Vocabulary)は独自の場所型を定義しています。たとえば http://purl.org/goodrelations/v1#Location 型をオブジェクト型として使用したい場合、必ず Place も指定しなければならないことを、次の例で示します:

8 Placegr:Location の両方であるObjectの例:
例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定義のプロパティを優先して使う必要があります。

4.1.1 Object型のテキスト表現

Activity Streamsの利用者は、Webブラウザやコンソールインタフェースでの表示など、Activity Streamsオブジェクトのテキスト表現を必要とする場合がよくあります。

name プロパティは、作成者または他のユーザーによる入力から派生するべきです。

summary プロパティは、フォールバックテキスト表現として使うべきであり、発行者によって自動生成される場合もあります。name プロパティがない場合、summary プロパティにはマークアップを含めるべきではなく、テキスト表現として適切な短さであるべきです。

9 著者が定義したnameを持つノートの例
例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."
}
10 自動生成されたsummaryを持つノートの例
例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 はどちらも存在しないことがあり、エンドユーザーの現在の言語に明示的な値がない場合や、テキスト表現としては長すぎる場合もあります。これらの場合、利用側の実装ではフォールバック戦略を持つべきです。

4.3 アクター

アクターオブジェクトは、アクティビティを実行できるエンティティを表す基本型Objectの特殊化です。アクティビティ語彙は、5種類のアクター型を規範的に定義しています: Application | Group | Organization | Person | Service

本仕様はアクターを非常に一般的な方法でのみ定義し、それぞれに意味的に特定なプロパティは定義しません。全てのアクターオブジェクトはObjectの特殊化であり、全Object共通のコアプロパティを継承します。アクティビティ語彙でカバーされない追加情報は外部の語彙で表現可能です。VCard [ vcard-rdf] は PersonGroupOrganization インスタンスへの追加メタデータ提供に推奨されます。

15 VCardプロパティを拡張したPersonアクターを持つアクティビティの例:
例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"
  }
}

実装はアクティビティ語彙で定義されていない新しいアクター型を導入できますが、他の実装で認識されない拡張型に頼りすぎると相互運用性の問題が生じます。既存アクター型との重複や過剰なオーバーラップは避けるべきです。

拡張型がコア語彙型と重複する場合、実装は必ずコア語彙型も指定しなければなりません。例えば一部の語彙(例:VCard)は人物表現用の独自型を定義しています。たとえばvcard:Individualをアクターとして用いる場合、必ず Person もそのアクターとして指定する必要があります(前述例参照)。

4.4 アクティビティ

アクティビティオブジェクトは、すでに発生した、進行中、または将来発生する可能性のあるアクションに関する情報を提供する基本型Objectの特殊化です。

Objectインスタンスが持つ共通プロパティに加え、Activityオブジェクトは 語彙で定義された次の追加プロパティをサポートします: actor | object | target | origin | result | instrument

typeプロパティは、そのアクティビティステートメントが表現するアクションの種類を識別するために使用されます。

16 次の例は単純なアクティビティを示します:
例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"
}

アクティビティ語彙は、多くのソーシャルWebアプリケーションで共通して使われる少数のActivity型を定義しています。本仕様はこれらアクティビティの意味的に特定なプロパティまでは定義しません。アクティビティ語彙でカバーされない詳細な情報は外部語彙で表現可能です。

実装はアクティビティ語彙で定義されていない新しいアクティビティ型を導入できますが、他実装で認識されない拡張型に頼りすぎると相互運用性の問題が生じます。既存アクティビティ型との重複や過剰なオーバーラップは避けるべきです。

拡張型がコア語彙型と重複する場合、実装は必ずコア語彙型も指定しなければなりません。例えば一部語彙(例:Schema.org)はアクション表現の独自型を定義しています。たとえばhttp://schema.org/LikeActionをアクティビティとして使いたい場合、必ず Like も指定しなければならないことは次の例の通りです。

17 Likehttp://schema.org/LikeAction の両方であるアクティビティ例:
例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"
}

実装はアクティビティオブジェクトを受動的にも命令的にも利用できます。受動的な意味では、アクティビティはすでに発生したまたは発生中の行動を記録するものです。命令的な意味では、アクティビティはアプリケーションに対して状態をアクション内容に沿って変更するよう指示するコマンドの役割も担えます。ただし、本仕様はフォーマットの利用方法を制約する規範的な処理モデルを定義しないため、アクティビティステートメントを通知とみなすか命令とみなすかは実装ごとに異なる場合があります。

4.5 自動詞アクティビティ

自動詞アクティビティ(IntransitiveActivity)オブジェクトは、アクティビティ型の特殊化で、自動詞的なアクションを表現します。自動詞アクティビティオブジェクトは object プロパティを持ちません。

4.6 コレクション

Collectionオブジェクトは、他の ObjectまたはLink のコンテナとして機能する基本型Objectの特殊化です。

全ての Object から継承する基本プロパティに加え、 Collection型は 追加で次のプロパティを持ちます: items | totalItems | first | last | current

Collection 内の項目は順序付きでも順序なしでもかまいません。 OrderedCollection型は、中身が常に順序付けされるコレクションを識別するため利用できます。JSONシリアライズでは、順序なし項目はitemsプロパティ、順序あり項目はorderedItemsプロパティで表します。

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"
    }
  ]
}
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 コレクションページング

コレクションは大量の項目を含むことができます。多くの場合、items(またはorderedItems)プロパティのみですべての項目をシリアライズするのは非現実的です。そのような場合、コレクション内の項目を明確なサブセットまたは「ページ」に分割できます。ページは CollectionPage 型で識別されます。

CollectionPage 型は基本の Collection型を拡張し、そのすべてのプロパティを継承します。さらに以下のプロパティを指定できます: partOf | next | prev |

partOfプロパティは、そのCollectionPageが属する Collectionを識別します。

firstnextprevlastcurrentプロパティは、親コレクション内の項目の追加サブセットを含む他の CollectionPage インスタンスを参照するために使われます。

Collectionオブジェクトと同様に、CollectionPage内の項目も順序付きでも順序なしでもかまいません。OrderedCollectionPage型は項目が厳密に順序付けられるページとして利用できます

OrderedCollectionPage 型は CollectionPage および OrderedCollection の両方を拡張します。それらから継承したプロパティに加え、OrderedCollectionPageはページに含まれる最初の項目の相対インデックス位置を示すstartIndexプロパティを持つことができます。

20 CollectionOrderedCollectionCollectionPageOrderedCollectionPage間の関係図:
Collection type Model

順序付きか否かに関わらず、コレクションのページは通常シーケンス(単方向または双方向リンクリスト)で並びます。firstプロパティはこの順序の最初のページ、lastは最後のページ、prevnextはそれぞれ直前・直後のページを識別します。

21 コレクションページングモデルの図示:
The Paging Model

currentプロパティは、Collection内で最近作成または更新された項目のサブセットを含むページを識別します。

firstlastnextprevcurrentプロパティの値は、単一の CollectionPage または Link(コレクションページを含む別リソース参照)となります。

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のインスタンスであるべきです。もしそうでない場合、利用側は項目の正しい順序を復元する手段を持ちません。

4.7 自然言語値

語彙で定義されているいくつかのプロパティは、「自然言語値」を持つものとして定義されています。これらは一つ以上の言語を用いる人間が読める文字列です。JSONシリアライズでは、(1)単一のJSON文字列、または(2)整形式な [BCP47] 言語タグをキーとしてローカライズされた同値の翻訳文字列にマッピングしたJSONオブジェクト、いずれかで表現されます。シリアライズされたJSON内で、この2つの形式は単純なプロパティ名の付け方の規則により区別されます。たとえば "name" は name プロパティのJSON文字列形式、"nameMap" はオブジェクト形式を表します。

23 言語情報なしの単一name文字列値:
例21
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Object",
  "name": "This is the title"
}
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] 言語タグである必要があります。関連する値は必ず文字列でなければなりません。

アクティビティ語彙は、自然言語値を使用する3つのプロパティを定義しています: namesummarycontent。 それに対応し、JSONシリアライズでは "name"、"summary"、"content" が文字列形式、"nameMap"、"summaryMap"、"contentMap" がオブジェクト形式を表します。

特別な言語タグ "und" は、その値の言語が不明または未決定であることを明示したい場合にオブジェクト形式で利用できます。

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

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

[JSON-LD] の仕組みを使ってActivity Streams 2.0ドキュメントを生成または消費する場合、@context内で @language プロパティを使ってデフォルト言語を識別することができます。この仕組みは、JSON-LDとしてのActivity Streams 2.0ドキュメントの処理を選択しない実装では理解されない場合があります。

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

4.7.2 双方向テキスト

Activity Streams 2.0ドキュメント内の自然言語値は、双方向テキストを含む場合があります。Activity Streams 2.0 ドキュメント全体の基本方向はデフォルトで左から右です。個々の自然言語値の基本方向は、以下の方法で変更できます

自然言語値に双方向テキストを指定する際、テキストの最初の強い方向性文字で基準方向が正確に同定できない場合、発行者は適切なUnicode双方向制御文字で値の先頭を明示的に指定するか、許可されている場合はHTML方向マークアップを利用するべきです

双方向テキストを含むActivity Streams 2.0ドキュメントの利用者は、マークアップタグ外の最初の強い方向性文字をスキャンする、または方向マークアップがあればそれを利用するなどして、任意の自然言語値の基本方向を判別すべきです。基準方向が特定されたら、利用者はUnicode双方向アルゴリズム [BIDI] に従い自然言語値の適切なレンダリング・表示を行います。そのために、基準方向を適用するために表示前に追加で制御文字やマークアップで文字列を囲む必要がある場合もあります。

プロパティ 方向 方法
name "פעילות הבינאום, W3C" 右から左 最初の強い方向性文字
name "The document was titled, '\u2067פעילות הבינאום, W3C\u2069'" 左から右 最初の強い方向性文字
name "\u200FHTML היא שפת סימון" 右から左 双方向制御文字
name "\u200E'سلام' is hello in Persian." 左から右 双方向制御文字
summary <p dir="rtl">HTML היא שפת סימון>/p> 右から左 HTMLマークアップ
summary <p>פעילות הבינאום, W3C</p> 右から左 マークアップを無視した最初の強い方向性文字
summary <p title="سلام">Hello</p> 左から右 マークアップを無視した最初の強い方向性文字

4.8 言語のマークアップ

既知の場合、Activity Streams 2.0 の発行者は 明示的に自然言語プロパティの言語をマークアップすべきです。マッププロパティ、またはデフォルト言語タグを使うことができます。

: 例

本仕様の例のすべてが自然言語プロパティの言語を明示的にマークしているわけではありません。これは意図的なものです。著者およびワーキンググループは、実装者が明示的な言語タグ付きの例をそのまま新しいドキュメントのテンプレートとしてコピー&ペーストし、不正確な言語マークアップになることを避けたいためです。

5. 拡張性

Activity Streams 2.0 では、「拡張」とは アクティビティ語彙 で定義されていないプロパティ、アクティビティ、アクター、またはオブジェクト型すべてを指します。未知の拡張を見つけた場合でも、受信側実装は 処理を中断したりエラーを出したりしてはなりませんそれらのプロパティが存在しないかのように、処理を継続しなければなりません。拡張のサポート状況は実装ごとに異なり、拡張に関する規範的な処理モデルは存在しません。そのため、拡張への過度な依存は、他実装との相互運用性低下を招く場合があります。

拡張の定義や曖昧性排除の主要な仕組みとして [JSON-LD] が用いられます。拡張を完全にサポートしたい実装は、[JSON-LD] の仕組みを 利用すべきです

Activity Streams 2.0 の名前空間文書にはいくつかメジャーな拡張も含まれており、https://www.w3.org/ns/activitystreams#extensions で確認できます。Social Web Incubator Community GroupActivity Streams extensions についてのWikiを運営しています。

JSON-LD Processing Algorithms [ JSON-LD-API] は、@contextで定義されていない任意のプロパティを静かに無視することに注意が必要です。拡張プロパティを含むActivity Streams 2.0 ドキュメントを発行する実装は、すべての拡張に対して @context 定義を用意 すべきです

また、JSON-LD ドキュメント内で使用できない正当な JSON 構造体が存在することにも注意が必要です。たとえば、GeoJSON 仕様などで用いられる「配列の配列」は JSON-LD では禁じられています。このような構造は Activity Streams 2.0 ドキュメントの拡張として自由に使えますが、標準の JSON-LD Processing Algorithms を利用する実装は、そうした拡張を無視するか、JSON-LD アルゴリズム適用前に互換可能な構造へマッピングしなければなりません。単純なGeoJSONのポイントは Place オブジェクトへ、より高度なジオメトリは GeoSparql の Well-Known Text へ変換可能です(非規範的な例を下記に示します)。

27 GeoJSON ポイント座標:
例25
{
  "type": "Point",
  "coordinates": [36.74, -119.77]
}
28 等価な Place への変換例:
例26
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "name": "Fresno, California",
  "type": "Place",
  "latitude": 36.74,
  "longitude": -119.77
}
29 GeoJSON ポリゴン座標:
例27
{
  "type": "Polygon",
  "coordinates": [
    [
      [100.0, 0.0],
      [101.0, 0.0],
      [101.0, 1.0],
      [100.0, 1.0],
      [100.0, 0.0]
    ]
  ]
}
30 等価な GeoSparql Well-Known-Text 例:
例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 コンパクトURIのサポート

JSON-LD構文は「コンパクトURI」の利用をサポートしています。コンパクトURIとは、定義されたプレフィックスを利用しシリアライズを簡素化するためのURIの別形式です。例えば、URI http://example.org/termex:http://example.org/ に割り当てれば ex:term と表せます。

JSON-LD内でのコンパクトURIプレフィックス定義は @context 定義内に記述されます。例:

31 JSON-LDのコンパクトURI定義例
例29
{
"@context": {
"ex": "http://example.org/",
"term": {
  "@type": "id",
  "@id": "ex:term"
}
},
"term": "ex:Foo"
}

この例では、プロパティ名 term も値 ex:Foo もコンパクトURIです。プロパティ名 termhttp://example.org/term に、値 ex:Foohttp://example.org/Foo へ展開されます。

JSON-LDにおいて、値へのコンパクトURI展開は @context 定義内でプロパティが "type": "id" と明示的に定義されている場合に適用されます。具体的には、IRI(またはURI)値が期待される場所でコンパクトURIを使うことができます。

Activity Streams 2.0 の実装で拡張を完全にサポートしたい場合は、JSON-LD仕様で定めるコンパクトURI展開を必ずサポートしなければなりません。展開はすべてのプロパティ名および、JSON-LD @context で型 @id と定義されたすべてのプロパティ値に適用されます。

コンパクトURI形式への過度の依存は不明確さや実装間の相互運用性問題につながる恐れがあります。そのため、コンパクトURIはプロパティ名やtypeプロパティ値「以外」では極力避けるべきです

5.2 拡張の再シリアライズ

JSON-LDを利用して拡張プロパティを含むActivity Streams 2.0ドキュメントをパース・再シリアライズする場合、実装は拡張プロパティが元のドキュメント内で保存・適切にシリアライズされるよう十分に注意すべきです。

例えば次のように、仮の foo および bar 拡張プロパティを含むActivity Streamオブジェクトを考えます。foo拡張はJSON-LD @context で定義され、bar はされていません。

32 単純な拡張Object例
例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
}

このNoteオブジェクトを受信した実装は、普通のJSONオブジェクトとしてパースすることも、標準のJSON-LD拡張アルゴリズムを使うこともできます。

通常のJSONとしてパースし再シリアライズする場合(例えば保存や再配布)、@contextfoobar の各プロパティ値をそのまま保持すればOKです。

ただしJSON-LD拡張アルゴリズムを利用した場合、@context は展開結果から消え、bar プロパティは「ブランクノード」 _:bar にマッピングされます。その後、規範的なActivity Streams 2.0 contextで再シリアライズすると、JSON-LDのコンパクト化結果は以下のようになります:

33 再シリアライズされたコンパクト形式:
例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になってしまうのは理想的ではありません。受信文書のJSON-LD展開処理を行った場合、正しく再シリアライズできるように、実装は展開時の @context を保持し、それをJSON-LDコンパクト化の際に再利用 すべきです

6. プライバシーに関する考慮事項

Activity Streams 2.0 ドキュメントには、身元や連絡先情報、現在地、身体的特徴など、潜在的に機微な個人情報が含まれる(そして実際に含まれる可能性が高い)場合があります。さらに、アクティビティデータ自体も、個人やアクターの集団の行動プロファイルを生成するために分析され得ます。

Activity Streams 2.0 ドキュメントを生成・消費する実装は、(a) 実装によって公開・消費・収集される可能性のある機微な個人情報の種類、(b) その情報の公開・消費・収集理由、(c) その情報の利用方法、(d) その情報が共有される第三者の身元、(e) 他者と共有する理由について、すべての潜在的なユーザーに対しオープンかつ公開の形で記録し伝達しなければなりません

Activity Streams 2.0 ドキュメントを公開する実装は、ユーザーが追加情報の共有に「オプトイン」していない限り、文書に含まれる機微な個人情報の種類および量を制限することを標準とすべきです

Activity Streams 2.0 ドキュメントを消費する実装は、ユーザーがその情報の保存や共有に「オプトイン」していない限り、取り込んだドキュメントに含まれる機微な個人情報をデフォルトで保存したり共有すべきではありません

ここで「オプトイン」には、必ずしもユーザーによる明示的な操作が必要とは限りません。たとえば、特定の機微な個人情報の利用が実装の利用形態上明確に暗黙である場合(例:位置情報追跡サービスなど)、上記ドキュメント指針が守られているかぎり、その実装を利用すること自体が当該情報の利用と共有への黙示的な同意とみなされます。

7. セキュリティに関する考慮事項

Activity Streams を公共データストリームとして実装する発行者や消費者は、無関係な商業コンテンツや悪意のあるコンテンツが混入する可能性についても考慮し、そのようなコンテンツを識別・対処または実装に含めないよう未然に対策すべきです。

発行者は、クロスサイトスクリプティングなどの悪意あるユーザー入力が Activity Streams データに含まれないよう、合理的な対策を取るべきです。

取り込んだ内容をエンドユーザーに再出力する消費者は、取り込んだ悪意ある入力が再出力されないよう、合理的な対策を必ず講じてください

取り込んだコンテンツを検索エンジン用クロールに再出力する消費者は、自サイトが検索エンジン最適化抜け道にならないよう、合理的な対策をとるべきです(例:不審なハイパーリンクをテキスト化・rel="nofollow" 属性を付与する等)。

攻撃者がプロパティ値を詐称したアクティビティやオブジェクトを公開し、悪意ある内容の注入や正当内容の隠蔽・改ざん・ユーザー誤誘導を狙う「なりすまし攻撃」にも注意してください。

Activity Streams はJSONドキュメントであり、[RFC7159] で述べられているセキュリティ考慮事項も対象となります。

Activity Streams 実装は URI を扱います。詳細は [RFC3986] のセクション7を参照。

Activity Streams 実装は IRI も扱います。詳細は [RFC3987] のセクション8を参照。

8. IANAに関する事項

8.1 application/activity+json メディアタイプ

本仕様は application/activity+json MIMEメディアタイプを、Activity Streams 2.0 形式に準拠した文書識別専用として登録します。

型名: application
サブタイプ名: activity+json
必須パラメータ: なし
任意パラメータ: profile: application/activity+json メディアタイプの profile パラメータにより、1つ以上のプロファイルURIを指定できます。これらのURIの識別子の意味は [RFC6906] で定義されています。"profile"メディアタイプパラメータは必ず引用符で囲む必要があります。空でないスペース区切りURIリスト(プロファイルURI群)を含みます。
profile-param = "profile=" profile-value
profile-value = <"> profile-URI 0*( 1*SP profile-URI ) <">
profile-URI   = URI
上記の "URI" は [RFC3986] 第3節で定義される"URI"です。
エンコーディング考慮事項: "application/activity+json" メディアタイプを使うリソースは "application/json" メディアタイプのすべての要件に準拠することが求められ、よって [RFC7159] 第11節で規定されるエンコーディング考慮事項にも従う必要があります。
セキュリティ考慮事項: 本仕様で定義される通り。
連絡先: 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 と同等とみなすべきです

9. 適合性

本仕様中のすべての図・例・注記及び「非規範的」と明示されているすべてのセクションは非規範的です。それ以外の本仕様中のすべてが規範的です。

9.1 文書

適合文書とは、すべてのドキュメント向け適合条件に準拠する文書です。可読性のため、これら適合要件の一部は発行者への要件として記述されていますが、そのような要件は暗黙的に文書への要件となります。すべての文書には定義上必ず発行者が存在するとみなします。

適合文書は Activity Streams 1.0 の非推奨・廃止構文を一切含んではなりません。適合文書はアクティビティ語彙のプロパティや型を必ず含まなければなりません。他の語彙を使う適合文書もセクションCのように同等のアクティビティ語彙プロパティおよび型を含めなければなりません。適合文書はJSON-LDや本仕様で禁止された他のシリアライズ機能を使ってはなりません(セクション2参照)。アクティビティ語彙で定義されたもの以外の型やプロパティを含む適合文書は、セクション5で定義される拡張機能を使わなければなりません。

文書例(網羅的ではありません):

9.2 実装

適合実装は、適合文書を発行・保存・分析・消費・それ以外の方法で処理するソフトウェアです。主な実装の種類は発行者と消費者です。

9.2.1 発行者

適合発行者は、適合文書を生成および公開する実装です。適合発行者はセクション2のシリアライズ要件に従って適合文書を提供しなければなりません。適合発行者はセクション6で述べるプライバシーを考慮しなければなりません。適合発行者はセクション7で述べるセキュリティを考慮しなければなりません。

発行者例(網羅的ではありません):

  • ソーシャルネットワーク
  • パーソナルウェブサイト
  • 文書公開システム
  • 非適合ソーシャルネットワークとのブリッジ
  • RSSやAtom等の類似文書型からの文書変換ツール

9.2.2 消費者

適合消費者は、適合文書を読み取り・解析する実装です。Activity Streams 1.0 の非推奨または廃止プロパティや型も許容しなければなりません。アプリケーションドメインに無関係なプロパティや型は無視すべきです。

適合消費者は、適合文書を他のデータ形式に再公開することができます。適合消費者は、適合文書を画面上・印刷・音声・その他の方法でユーザーに提示できます。適合消費者は、適合文書に表現された情報を他形式・他メディアに忠実に変換しなければなりません。適合消費者が適合文書を再公開する場合は、セクション6のプライバシー、セクション7のセキュリティを考慮すべきです。

消費者例(網羅的ではありません):

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

A. 謝辞

Activity Streams 2.0仕様は W3C ソーシャルウェブワーキンググループの成果です。編集者は議論、課題、テストなどを通じて本仕様の形成に貢献してくださったワーキンググループの全メンバーに感謝します。

また、仕様が W3C ソーシャルウェブワーキンググループに寄稿される以前に 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, and Zach Shepherd.

B. 非推奨のActivity Streams 1.0構文

このセクションは規範的ではありません。

注意: この付録セクションは規範的ではありませんが、MUST など規範用語を使っています。ここで使用する場合は、実装者がこの付録で説明するActivity Streams 1.0の後方互換モデルを適切に実装するために必要とされる要件を意味するものとします。

本仕様で定義される構文は、JSON Activity Streams 1.0の定義と異なる部分もありますが、元の仕様で定義された基本モデル自体は維持されています。本仕様は、既存のActivity Streams 1.0ドキュメントをActivity Streams 2.0ドキュメントとしてマッピング・処理できるよう、特定の処理規則を定めています。

本仕様で定義されたJSON構文は、元のJSON Activity Streams 1.0 [ AS1] 仕様と異なっており、後方互換性がありません。実装はJSON Activity Streams 1.0構文のサポートを継続してもかまいませんが、1.0構文は非推奨とすべきです。つまり、実装は1.0構文の消費を継続してもよいですが、古い非2.0準拠の実装とのやり取りを除き、1.0構文の出力は避けるべきです。

特に以下の点に留意してください:

  1. 実装はActivity Streams 1.0構文でJSONシリアル化する場合は"application/stream+json" MIMEメディアタイプを、2.0構文準拠シリアル化の場合は"application/activity+json" を使うことができます。
  2. "application/stream+json" またはより一般的な "application/json" MIMEメディアタイプで識別されるシリアライズを処理する実装は、[AS1] に従った構文および処理規則に必ず従う必要があります。2.0構文および処理規則は、"application/activity+json"メディアタイプの際のみに適用されます。
  3. JSON-LD処理モデルでActivity Streams 1.0ドキュメントを処理する場合、特別なAS 1.0→2.0展開@context定義(こちら)を使い、JSON-LD展開表現を生成できます。詳細は JSON-LD Processing Algorithms and API を参照。
  4. Activity Streams 1.0ドキュメントを処理し2.0へ変換する場合、idはJSON-LD @idのエイリアス、objectTypeverbプロパティはJSON-LD @typeのエイリアスとして扱うべきです。
  5. Activity Streams 1.0 では displayName プロパティが使われていますが、2.0では name へ改名されています。実装では displayNamename のエイリアスとして扱うべきです。
  6. Activity Streams 1.0 の title プロパティは 2.0 では廃止されました。1.0ドキュメントを 2.0 として処理する場合、title プロパティ出現は拡張として扱うべきです。
  7. 本書は contentsummary プロパティを自然言語値として再定義しています。これにより値は文字列または言語タグから文字列へのマップいずれでも表現できます。1.0構文では値はString値でのみ記述されますが、1.0値はこの仕様でも許容される有効なサブセットなので、継続サポートのため特段の対応は不要です。
  8. 本書は1.0でObjectとして定義されていた多数の共通プロパティを、2.0では Object または Link のいずれかとして再定義しています。JSON-LDシリアライズでは、これらプロパティ値をIRI文字列・JSONオブジェクト、またはその配列で表現できます。1.0の値は本仕様でも有効サブセットであるため、既存実装も特段の対応なしでサポート可能です。
  9. 本仕様はActivity Streams 1.0で定義された upstreamDuplicates および downstreamDuplicates プロパティを廃止し、代替は提供しません。これは現実的な実装事例がほぼ見られないためです。両プロパティは継続利用してもよいですが、実装はなるべく避けるべきです
  10. Activity Streams 1.0 では "post" 動詞は、オブジェクトの作成および「投稿」やアップロード両方のアクションを表現していました。本仕様では "post" 動詞を Create および Add アクティビティ型に分離しました。1.0ドキュメントから2.0へ変換する場合、targetプロパティがなければCreateと、targetプロパティがあればAddと同等として扱うべきです

上記ガイドラインに従うことで、すべてのJSON Activity Streams 1.0シリアライズは2.0実装でも問題なく処理できます。

C. 複数語彙利用例

このセクションは規範的ではありません。

データ出典や注釈のようなアクティビティの特性に応じて複数の語彙を利用して、Activity Vocabularyを補完することができます。例えばEricが短いノートを書いてフォロワーと共有します。投稿後にスペルミスに気付き、ノートを編集し再投稿します。後に、そのノートの内容が誤りだったと判断し、削除します。

34 一連のアクティビティ(ノートの作成・編集・削除)
例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]
言語識別用タグ。A. Phillips; M. Davis. IETF. 2009年9月。IETF Best Current Practice。URL: https://tools.ietf.org/html/bcp47
[BIDI]
Unicode 双方向アルゴリズム。Mark Davis; Aharon Lanin; Andrew Glass。Unicode Consortium。2016年5月18日。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。2014年10月28日。W3C 勧告。URL: https://www.w3.org/TR/html5/
[JSON-LD]
JSON-LD 1.0。Manu Sporny; Gregg Kellogg; Markus Lanthaler。W3C。2014年1月16日。W3C 勧告。URL: https://www.w3.org/TR/json-ld/
[JSON-LD-API]
JSON-LD 1.0 処理アルゴリズムおよびAPI。Markus Lanthaler; Gregg Kellogg; Manu Sporny。W3C。2014年1月16日。W3C 勧告。URL: https://www.w3.org/TR/json-ld-api/
[RFC2119]
RFCで必須レベルを示すキーワード。S. Bradner。IETF。1997年3月。Best Current Practice。URL: https://tools.ietf.org/html/rfc2119
[RFC3339]
インターネットにおける日付と時刻:タイムスタンプ。G. Klyne; C. Newman。IETF。2002年7月。標準案。URL: https://tools.ietf.org/html/rfc3339
[RFC3986]
統一リソース識別子 (URI):一般構文。T. Berners-Lee; R. Fielding; L. Masinter。IETF。2005年1月。インターネット標準。URL: https://tools.ietf.org/html/rfc3986
[RFC3987]
国際化リソース識別子 (IRIs)。M. Duerst; M. Suignard。IETF。2005年1月。標準案。URL: https://tools.ietf.org/html/rfc3987
[RFC5988]
ウェブリンク。M. Nottingham。IETF。2010年10月。標準案。URL: https://tools.ietf.org/html/rfc5988
[RFC6906]
'profile' リンクリレーション型。E. Wilde。IETF。2013年3月。インフォメーション。URL: https://tools.ietf.org/html/rfc6906
[RFC7159]
JavaScriptオブジェクト表記(JSON)データ交換フォーマット。T. Bray, Ed.. IETF。2014年3月。標準案。URL: https://tools.ietf.org/html/rfc7159

F.2 参考情報

[ABNF]
BNF拡張構文仕様:ABNF。D. Crocker, Ed.; P. Overell。IETF。2008年1月。インターネット標準。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。公式ではない。URL: http://activitystrea.ms/specs/json/1.0/
[SWP]
ソーシャルウェブプロトコル。A. Guy。URL: https://www.w3.org/TR/social-web-protocols/
[vcard-rdf]
vCardオントロジー(人物・団体記述用)。Renato Iannella; James McKinney。W3C。2014年5月22日。W3Cノート。URL: https://www.w3.org/TR/vcard-rdf/