[8] [DFN[[RUBYB[[[実現値操作]]]@en[instance manipulation]]]]は、[[実現値]]に対する種々の操作を表します。

* 仕様書

[REFS[
- [3] [CITE@en[RFC 3229 - Delta encoding in HTTP]] ([TIME[2014-10-26 21:15:25 +09:00]] 版) <http://tools.ietf.org/html/rfc3229#page-8>
- [9] [CITE@en[RFC 3229 - Delta encoding in HTTP]] ([TIME[2014-10-26 21:15:25 +09:00]] 版) <http://tools.ietf.org/html/rfc3229#section-4.1>
- [16] [CITE@en[RFC 3229 - Delta encoding in HTTP]] ([TIME[2014-10-26 21:15:25 +09:00]] 版) <http://tools.ietf.org/html/rfc3229#section-10.1>
- [36] [CITE@en[RFC 3229 - Delta encoding in HTTP]] ([TIME[2014-10-26 21:15:25 +09:00]] 版) <http://tools.ietf.org/html/rfc3229#section-10.5.3>
- [42] [CITE@en[RFC 3230 - Instance Digests in HTTP]] ([TIME[2014-08-31 18:57:37 +09:00]] 版) <http://tools.ietf.org/html/rfc3230#page-6>
- [17] [CITE[Instance Manipulation Values]] ([TIME[2014-01-31 02:45:13 +09:00]] 版) <http://www.iana.org/assignments/inst-man-values/inst-man-values.xhtml>
]REFS]

* 意味

[4] [[実現値操作]]は、1つ以上の[[実現値]]に対する操作であって、
結果としてある[[実現値]]が部分部分で、あるいは複数の[[応答]]として[[鯖]]から[[クライアント]]へと伝搬されることとなるであろうものをいいます [SRC[>>3, >>42]]。

[27] 具体的には、[[差分符号化]]、[[圧縮]]、[[範囲]]選択が含まれています。

[35] [[差分符号化]]は、2入力の[[実現値操作]]です。
[[圧縮]]や[[範囲]]選択は、1入力の[[実現値操作]]です。 [SRC[>>36]]

;; [43] むやみに[[圧縮]]すると危険かもしれません。[[内容符号化]]の[[圧縮]]の項や
[[BREACH攻撃]]を参照。

* 構文

[21] [[実現値操作]]は、名前と0個以上の[[引数]] [SRC[>>16]] によって識別できます。
[[引数]]の前には [CODE(HTTP)[[[;]]]] が必要です [SRC[>>16]]。

;; [22] 仕様書上では0個か1個の[[引数]]になっていますが、
誤りのように見えます。

;; [23] 仕様書の時代的に構文上[[空白]]が明記されていませんが、
[CODE(HTTP)[[[;]]]] の前後に [[OWS]] が挿入できると思われます。

[24] [[実現値操作]]の名前は、[[字句]]です [SRC[>>16]]。
[[大文字・小文字不区別]]と思われます。

[FIG(railroad)[
= [[字句]]
= *
== [[OWS]]
== [CODE(HTTP)[[[;]]]]
== [[OWS]]
== [[引数]]
]FIG]

[28] [[引数]]は、名前か、名前と [CODE(HTTP)[[[=]]]] と値のいずれかです [SRC[>>16]]。

[29] [[引数]]の名前は、[[字句]]です [SRC[>>16]]。
[[大文字・小文字不区別]]と思われます。

[30] [[引数]]の値は[[字句]]または[[引用文字列]]です [SRC[>>16]]。

[FIG(railroad)[
= [[字句]]
= ?
== [CODE(HTTP)[[[=]]]]
== |
=== [[字句]]
=== [[引用文字列]]
]FIG]

[31] [[引数]]の名前は、[[q値]]と区別するため、 [CODE(HTTP)[[[q]]]]
であっては[['''なりません''']] [SRC[>>16]]。

* 文脈

[2] [[実現値操作]]の指定の構文は、 [CODE(HTTP)@en[[[IM:]]]] [[ヘッダー]]や
[CODE(HTTP)@en[[[A-IM:]]]] [[ヘッダー]]で使います。

* 適用順序

[11] [[範囲]]を選択してから[[差分]]を得たいこととと[[差分]]の[[範囲]]を得たいこと、
あるいは[[差分]]を[[圧縮]]したいことや[[圧縮]]状態の[[差分]]を得たいことがあるなど、
各種操作の適用順序は状況に依存することから、 
[CODE(HTTP)@en[[[A-IM:]]]]/[CODE(HTTP)@en[[[IM:]]]]
[[ヘッダー]]によって操作の適用順序を記述できます [SRC[>>9]]。

;; [12] [[範囲]]の選択は、 [[HTTP]] の標準の[[範囲要求]]の機能を適用するタイミングを指定するものとなります。
[[圧縮]]は既に[[内容符号化]]にも ([[転送符号化]]にも) 組み込まれていますが、
それとは別に[[実現値操作]]としても指定できることになっています。

;; [1] [CODE(HTTP)@en[[[IM:]]]], [CODE(HTTP)@en[[[A-IM:]]]] も参照。

[34] [[範囲]] ([CODE(HTTP)@en[[[range]]]]) の後に他の[[実現値操作]]を適用することも認められています。
[CODE(MIME)@en[[[multipart/byteranges]]]] で複数に分かれた後に適用される可能性もあります。

* 処理モデル

[38] 適用する[[実現値操作]]の決定については、 [CODE(HTTP)@en[[[A-IM:]]]] を参照。

[37] [[キャッシュ]]における処理については、[CODE(HTTP)[[[226]]]] を参照。

[39] 個々の[[実現値操作]]の処理については、[[差分符号化]]を参照。

* 実現値操作の一覧

[13] 次の[[実現値操作]]の名前があります。
[FIG(short list)[
- [CODE(HTTP)@en[[[vcdiff]]]]
- [CODE(HTTP)@en[[[diffe]]]]
- [CODE(HTTP)@en[[[gdiff]]]]
- [CODE(HTTP)@en[[[gzip]]]]
- [CODE(HTTP)@en[[[deflate]]]]
- [CODE(HTTP)@en[[[range]]]]
- [CODE(HTTP)@en[[[identity]]]]
- [CODE(HTTP)@en[[[feed]]]]
- [CODE(HTTP)@en[[[f-range]]]]
- [CODE(HTTP)@en[[[items]]]]
- [CODE(HTTP)@en[[[channel]]]]
]FIG]

[19] [[IANA登録簿]] [SRC[>>17]] があります [SRC[>>16]]。

;; [20] が、 [[RFC 3229]] のもの以外は登録されていません。 [TIME[2014-11-19T15:11:06.500Z]]

[15] 名前に「diff」が入った3つは特に[[差分符号化]]と呼ばれています [SRC[>>16]]。

* 歴史

** RFC 3229

[FIG(quote)[
[FIGCAPTION[
[5] RFC 3229 (差分符号化) 用語定義より抜粋
]FIGCAPTION]

>
:instance manipulation:
An operation on one or more instances which may
result in an instance being conveyed from server to
client in parts, or in more than one response
message.  For example, a range selection or a delta
encoding.  Instance manipulations are end-to-end, and
often involve the use of a cache at the client.

:実現値操作:
一つ以上の[[実現値]]についての演算であり、
結果として一つの実現値が[[鯖]]から[[クライアント]]に部分的に、または複数の[[要求メッセージ]]によって運ばれてくることになるかもしれない。
例えば、範囲選択や[[差分符号化]]である。
実現値操作は[[末端対末端]]であり、しばしばクライアントでの[[キャッシュ]]の使用を伴う。

> For reasons that will become clear later on, it is convenient to
think about subrange selection as a form of instance manipulation.
In some contexts, compression might also be treated as an instance
manipulation, rather than as a content-coding or transfer-coding.

後々明らかになってくる理由から、部分範囲選択を実現値操作の一形式と考えると便利です。
文脈によっては、圧縮もまた[[内容符号化]]や[[転送符号化]]ではなく実現値操作として扱われるかもしれません。
]FIG]

[FIG(quote)[
[FIGCAPTION[
[7] RFC 3229 (差分符号化) 10.1 Protocol parameter specifications
]FIGCAPTION]

> This specification defines a new HTTP parameter type, an instance-manipulation:

この仕様書は新しい HTTP 引数型 [CODE(ABNF)[instance-manipulation]]
を定義します。

>
- instance-manipulation = token [imparams]
>
- imparams = ";" imparam-name [ "=" ( token | quoted-string ) ]
- imparam-name = token

> Note that the imparam-name MUST NOT be "q", to avoid ambiguity with
the use of qvalues (see [10]).

[CODE(ABNF)[imparam-name]] は [CODE(ABNF)[[[qvalue]]]] の使用時の曖昧性を避けるために [CODE(HTTP)[[[q]]]] であっては'''ならない'''ことに注意して下さい。

> The set of instance-manipulation values is initially:
:-  vcdiff:
A delta using the "vcdiff" encoding format [19, 20].
:-  diffe:
The output of the UNIX "diff -e" command [26].
:-  gdiff:
The GDIFF encoding format [14].
:-  gzip:
Same definition as the HTTP "gzip" content-coding.
:-  deflate:
Same definition as the HTTP "deflate" content-coding.
:-  range:
A token indicating that the result is partial content, as the
result of a range selection.
:-  identity:
A token used only in the A-IM header (not in the IM header), to
indicate whether or not the identity instance-manipulation is acceptable.

最初の実現値操作の集合は:
:[CODE(HTTP)[[[vcdiff]]]]:[CODE[vcdiff]] 符号化書式を用いた差分。
:[CODE(HTTP)[[[diffe]]]]:[[UNIX]] [KBD[[[diff]] -e]] 命令の出力。
:[CODE(HTTP)[[[gdiff]]]]:[[GDIFF]] 符号化書式。
:[CODE(HTTP)[[[gzip]]]]:[[HTTP]] [CODE(HTTP)[gzip]] 内容符号化と同じ定義。
:[CODE(HTTP)[[[deflate]]]]:HTTP [CODE(HTTP)[deflate]] 内容符号化と同じ定義。
:[CODE(HTTP)[[[range]]]]:結果が範囲選択の結果である部分内容であることを示す字句。
:[CODE(HTTP)[[[identity]]]]:[CODE(HTTP)[[[A-IM]]]] 頭でのみ使用する
([CODE(HTTP)[[[IM]]]] 頭では使用しない) 字句で、
[[同一]]実現値操作を受入れるかどうかを示すために使用する。

> For convenience in the rest of this specification, we define a subset
of instance-manipulation values as delta-coding values:

この仕様書の後の部分での便宜のために、実現値操作の部分集合を
[DFN[[CODE(ABNF)[delta-coding]] ([[差分符号化]]) 値]]として定義します。

>
- delta-coding = "vcdiff" | "diffe" | "gdiff" | token

> Future instance-manipulation values might also be included in this list.

将来の実現値操作値もこの並びに含められるかもしれません。
]FIG]

[FIG(quote)[
[FIGCAPTION[
[6] RFC 3229 (差分符号化) 10.2 IANA Considerations
]FIGCAPTION]

> The Internet Assigned Numbers Authority (IANA) administers the name
space for instance-manipulation values.  Values and their meaning
must be documented in an RFC or other peer-reviewed, permanent, and
readily available reference, in sufficient detail so that
interoperability between independent implementations is possible.
Subject to these constraints, name assignments are First Come, First
Served (see RFC 2434 [25]).

インターネット割当て番号事務局 ([[IANA]])
は実現値操作値の名前空間を管理します。
値とその意味は、 [[RFC]] または他のよく評価された、持続的で、
既に入手可能な参照物で、独立な実装が相互運用可能である程度十分詳細に文書化されていなければなりません。
この制約の元、名前割り当ては[[先来先給]]とします
([[RFC 2434]] を参照)。

> This specification also inserts a new value in the IANA HTTP Status
Code Registry (see RFC 2817 [18]).  See section 10.4.1 for the
specification of this code.

この仕様書は IANA HTTP 状態符号登録簿 ([[RFC 2817]] 参照)
にも新しい値を挿入します。この符号の仕様は10.4.1節を参照。
]FIG]

** その後の利用

[32] [CITE[Re: RFC3229 w/ feeds ''''''[''''''was: Paging, Feed History, etc.'''''']'''''']]
( ([TIME[2006-06-09 20:12:53 +09:00]] 版))
<http://www.imc.org/atom-syntax/mail-archive/msg18576.html>

[33] [CITE[Does an implementation of RFC 3229 (Delta encoding for HTTP) exist? - Stack Overflow]]
( ([TIME[2014-11-20 01:39:50 +09:00]] 版))
<http://stackoverflow.com/questions/3264457/does-an-implementation-of-rfc-3229-delta-encoding-for-http-exist>

[40] [[DUL]] は[[実現値操作]]として使われることも想定していました [SRC[>>41]]。

[REFS[
- [41] [CITE@en[draft-mouat-xml-patch-00 - A delta format for XML documents]] ([TIME[2014-10-17 16:07:55 +09:00]] 版) <https://tools.ietf.org/html/draft-mouat-xml-patch-00#section-7.1>
]REFS]

[44] いずれも結局ほとんど使われませんでした。
