ネット共有辞書仕様書

Rev.1.0.1   2009.8.26 updated


概要

PDIC/Unicodeにあるネット共有辞書機能の通信に関するプロトコルを規定します。
(ネット共有辞書機能についてはこちらから
「PDIC用」とタイトルにありますが、プロトコル自体はPDICには依存しておらず、この仕様書に準じて作成すればどのようなクライアントアプリケーションであっても対応可能です。


履歴


2004.6.9 サーバーの検索を追加
2004.12.1 lock/unlock機能を追加
2005.7.30 memoryを追加
2008.12.1 0.60 Top Pageのpropertyにname, infourlを追加、version番号を0.2に変更。getkeyメソッドに匿名接続、versionパラメータ、versionエラーを追加。
2008.12.14 0.61 put/rename methodにlimit status追加、put methodにsubstatus追加。ServerListにwordcount, usercountを追加。
2009.1.25 匿名接続時のパスワードの扱いに矛盾があったのを修正。
2009.2.5 Top Pageに<notifyInfo>を追加
2009.2.11 delete/renameメソッドから lastidパラメータ(最終トランザクションID)を削除(恐らく誤記)
2009.2.21 addメソッドの追加、putにaddパラメータ追加、lockメソッドはoptionalに変更。
2009.2.23 仕様書のバージョンを1.00とし、正式リリース
2009.7.31 Rev.1.0.1 上書きモードオプションを用意
2009.8.26 登録項目のex,pron,level,memoryはM→Rに変更(規格の整合性により)
2017.2.x Rev.1.1検討中 - Downloadメソッドのmulti対応


基本原則


データ交換のフォーマットとして XML を用いる。
原則としてすべて大文字・小文字の区別。(XML規格に準拠)
XMLデータについては、<pdic></pdic>で囲まれたデータのみを扱う。従って、ここで述べているXMLデータについては、必ず<pdic></pdic>で囲まなければならない。
通信プロトコルは HTTP を推奨するが、この仕様ではプロトコルについては規定しない。(PDICはHTTPのみをサポート)
文字コードは UTF-8を使用する。(PDICがUTF-8のみサポートしているため)
改行コードは \nを推奨するが必須ではない。(TBD)

文体がバラバラ→そのうち
英語版→そのうち
RFC申請→そのうち(笑)


登録項目


id トランザクションID M 属性
word 見出語 M unique
trans 訳語 M
ex 用例 R
pron 発音記号 R
level 単語レベル R
memory 暗記必須 R
recdate 登録日 O YYYYMMDD
update 更新日 O YYYYMMDD
who 登録者ID O

M = Mandatory(必須)
R = Recommended(準必須)
O = Optional(選択可能)

トランザクションIDは1から 2,147,483,647 まで順番にカウントアップしていくものとする。最大値を越える場合はURLを変更するなど、サーバー側のメンテナンスによる対処が必要になる(そこまで達することは実際上ありえない)。 トランザクションIDが最も大きい数値である見出語が最も新しく更新された見出語である。
unique と表記されている項目は、重複が許されない。IDやwordで指定した場合、必ず唯一のデータを示すようにする。ただし、サーバー内でどのように記述するかは自由。例えば、一つの見出語(word)に複数の訳語が存在する場合、それらを別々の見出語と扱っても構わない。しかし、クライアントには一つのデータであるようにマージするなどの処理を行って一つに見せる。


Top Page


すべてこのページから始まる。Top PageはXMLで記述する。
<property> - 辞書サーバーの属性
<method> - メソッド名の定義

具体的な内容は次の通り。
<property>
  <name>このサーバーの名称</name>
  <description>この辞書サーバーの説明</description>
  <version>0.2</version>
  <infourl>http://〜辞書サーバーのURL</infourl>
  <notifyInfo>info-ID</notifyInfo>
  <authentication>T.B.D.</authentication>
  <dictionaryId>辞書ID</dictionaryId>
</property>
<method>
  <getcount>getcountメソッド名</getcount>
  <get>getメソッド名</get>
  <put>putメソッド名</put>
  <add>addメソッド名</add>
  <rename>renameメソッド名</rename>
  <delete>deleteメソッド名</delete>
  <download>downloadメソッド名</download>
  <getkey>getkeyメソッド名</getkey>
</method>

読取専用の(単語登録が不可能な)サーバーである場合は、put, deleteメソッドは記述しない。
メソッド名にパラメタ―を使用することが可能。例えば、put.pl?n=0 という記述ができる。

property

name このサーバーの名称。使用言語は対象者を想定してください。(日本人のみであれば日本語など)
description このサーバーの説明を記述します。使用言語は対象者を想定してください。(日本人のみであれば日本語など)
version プロトコルのバージョンを示します。(現在試作検討段階なので、0.2)形式は、メジャー番号+小数点+マイナー番号 とする。
infourl このサーバーのメインのURL。問い合わせ先の表示や、ID/Password入力時に参照されます。
notifyInfo [optional] ユーザーにお知らせがある場合に設定します。ここには更新したことを識別できる値を指定してください。
authentication このサーバーに認証が必要かどうかを示します。不要の場合はこのタグを省略または空欄にしてください。
dictionaryId [Rev.1.1] 辞書を識別するためのID。英数字とアンダースコアのみ使用可能。Downloadメソッドなどで使用します。

notifyInfo の補足

ここに指定する値は日付など、お知らせの更新があったことを識別できるような値にしてください。1から始まるシーケンス番号でも構いません。
クライアント側はこの値に変更があったときにユーザーへ喚起します。この際の参照先はinfourlで指定するURLになります。


メソッド


規定

全て大文字・小文字を区別する
メソッド名の右側に記述されている、(M/M)等 の記号について、左側は単語登録可能なサーバーの場合、右側は読取専用のサーバーの場合の実装条件を示す。
パラメータは、CGIのプレーンテキストでサーバー側のエンコードにあわせて送る。(簡単化のためXMLではない)現在はUTF-8のみ。

getcount (M/M)

パラメータ:
なし

戻り値:
<status>
ok
serrorサーバーのエラー
busy server busy
<count> 全登録有効見出語数
<lastid> サーバー側の最新トランザクションID

説明:
サーバーに登録されている有効な見出語数を返す。削除された見出語はカウントされない。

トランザクションIDについて:
サーバー上の単語が登録・更新されたかどうかクライアント(PDICなど)が知るために、トランザクションIDを識別子として利用します。新たに単語が登録された場合、最新のトランザクションIDを一つインクリメントしたものを付加します。登録単語の内容が変更された場合も、その単語に付加されているトランザクションIDを最新のトランザクションIDから1つインクリメントしたものに変更します。
これにより、他のクライアントにもその単語が更新されたかどうか知ることができます。
見出語が変更された場合は、更新前の見出語に対するトランザクションID と 更新後の見出語に対するトランザクションID、この2つのトランザクションIDが更新されるため、2つ増えます。

get (M/M)

パラメータ:
id 取得したいトランザクションID
word 取得したい見出語
userid ユーザーID(getkeyメソッドがある場合のみ)
authkey 暗号化された認証キー(getkeyメソッドがある場合のみ)

id か word のどちらか一方を指定する。両方指定された場合は、IDを優先。

戻り値:
<status>
ok 取得できた
none 指定した見出語は存在しない
deleted 指定した見出語は削除された
perror パラメータのエラー
serror サーバーのエラー
auth 権限エラー
busy server busy

<status>okの場合
<id>
<word> <status>がdeletedの場合は、削除された見出語を記述する
<trans>
<ex>
<pron>
<level>
<memory>
<recdate>
<update>
<who>
※登録項目で述べたとおり、すべてのデータが返されるわけではない。サーバーの実装に依存する。

<status>deletedの場合
<id>
<word> <status>がdeletedの場合は、削除された見出語を記述する

説明:
トランザクションIDまたはwordで指定した見出語のデータを取得する。wordは完全一致したものだけを返す。
idword の両方が指定された場合は、id を優先する。
idword 両方が省略された場合は perror を返す。
パラメータにidが指定された場合で、そのトランザクションIDに対する情報が削除されていた場合は、必ず deleted を返す。

put (M/-)

パラメータ:
lastid クライアントの最新トランザクションID(上書き更新の場合のみ必要)
word 見出語
trans
ex [optional]
pron [optional]
level [optional]
memory [optional]
userid ユーザーID(getkeyメソッドがある場合のみ)
authkey 暗号化された認証キー(getkeyメソッドがある場合のみ)
add 追加モード addメソッドと同様の動作

戻り値:
<status>
ok 登録完了
deleted 上書き更新しようとしたがすでに削除されている(user)
exist 新規に見出語を登録しようとしたが、すでに同じ見出語が登録されていた(user)
conflict 指定したトランザクションIDを更新しようとしたが、その間にほかのクライアントが更新を行っていた(user)
perror パラメータのエラー(retry/user)
serror サーバーのエラー(retry/user)
auth 権限エラー(user/retry)
busy server busy(retry)
full これ以上登録できない(user/retry)
limit word/trans/ex/pronのいずれかが長すぎて登録できない
<substatus>
<status>がlimitであった場合、長すぎた項目。(word, trans, ex, pronのいずれか。複数あった場合でもどれか一つ)
<id>
この更新処理のトランザクションID (statusがokのときのみ)

説明:
見出語をサーバーに登録する。サーバーに辞書の更新機能がある場合にこのメソッドを実装する。
パラメータの渡し方により、新規登録と上書き更新に分けられる。
最新トランザクションID(id)を指定した場合は、その見出語(word)の上書き更新とする。見出語が登録されていなかったまたは削除されていた場合は新規登録として扱う。
最新トランザクションID(id)の指定が無い場合は、新規見出語とする。すでに同一の見出語が登録されていた場合はエラー(exist)となる。

上書き更新処理の場合、更新しようとした見出語のトランザクションIDがすでに登録されているトランザクションIDより小さい場合は、<status>にconflictを返す。(すでに削除されている見出語であり、トランザクションIDが大きい場合はどうするか?→conflict or new record?)

サーバー側の動作:
既存の見出語の上書き更新処理であるとき、パラメータに指定されていない項目は更新されない。
<実装上のヒント>
例えば、ex登録項目に "example" というデータがすでに登録されている場合に、パラメータに ex が含まれていなかった場合は、更新後も "example" というデータはそのまま残る。これにより、クライアントがサポートしていない登録項目があっても、サーバー上のデータは消去されずに済む。
また、変更されていない項目もパラメータから外したほうが効率的になる。
</実装上のヒント>
putメソッドが正しく実行された場合は、サーバー側の最新トランザクションIDを1つ増やす。
上書き更新された後、更新前のトランザクションIDは削除されます。更新後、古いトランザクションIDでgetメソッドで取得しようとした場合、none が返されます。

addパラメータは後述するaddメソッドと同じ動作をします。addメソッドをサポートするサーバーは必ずこのaddパラメータもサポートしてください。逆にaddメソッドをサポートしていないサーバーはaddパラメータを指定された場合、パラメータエラー(perror)を返してください。
addパラメータの値は必ず1を指定してください。1以外の値を指定した場合はパラメータエラー(perror)を返します。

特殊ルールとして、addメソッドをサポートするサーバーは、putメソッド、deleteメソッド、renameメソッドを省略することが可能です。つまり、その場合は追加専用のサーバーになります。[optional]

add (O/-)

訳語等を追加で登録します。(オプション機能)

パラメータ:
word 見出語
trans
ex [optional]
pron [optional]
level [optional]
memory [optional]
userid ユーザーID(getkeyメソッドがある場合のみ)
authkey 暗号化された認証キー(getkeyメソッドがある場合のみ)

戻り値:
<status>
ok 登録完了
perror パラメータのエラー(retry/user)
serror サーバーのエラー(retry/user)
auth 権限エラー(user/retry)
busy server busy(retry)
full これ以上登録できない(user/retry)
limit word/trans/ex/pronのいずれかが長すぎて登録できない
<substatus>
<status>がlimitであった場合、長すぎた項目。(word, trans, ex, pronのいずれか。複数あった場合でもどれか一つ)
<id>
この更新処理のトランザクションID (statusがokのときのみ)

説明:
putメソッドの追加モードです。サーバー側に存在しない場合は新規登録され、すでに存在する場合は追加で登録します。従って、衝突等は発生しません。
訳語、用例、発音記号はパラメータで指定されたテキストがそのまま追加されます。追加される際の区切り文字はサーバー側の実装に依存します。(半角カンマを推奨)
level, memoryについてはパラメータが指定された場合、上書きすることを推奨しますが、この2つの項目に関してはサーバー側の実装に依存します。(この仕様書では規定しません)

上記以外についてはputメソッドと同様とします。
addメソッドをサポートするサーバーはputメソッドのaddパラメータもサポートしてください。ただし、putメソッドをサポートしないadd専用のサーバーの場合は必要ありません。

delete (M/-)

見出語を削除します。

パラメータ:
word 見出語
userid ユーザーID(getkeyメソッドがある場合のみ)
authkey 暗号化された認証キー(getkeyメソッドがある場合のみ)

戻り値:
<status>
ok 削除完了
none 存在しない
deleted すでに削除された
perror パラメータのエラー(retry/user)
serror サーバーのエラー(retry/user)
auth 権限エラー(user/retry)
busy server busy(retry)
full これ以上登録できない(user/retry)
<id>
トランザクションID (statusがokのときのみ)

説明:
指定した見出語(word)を削除します。
すでに削除されていた場合は、deleted を返します。
存在しない見出語(word)を削除しようとした場合は、none を返します。
正常に削除された場合、サーバー側のトランザクションIDは1つ増やします。

特殊ルールとして、addメソッドをサポートするサーバーは、putメソッド、deleteメソッド、renameメソッドを省略することが可能です。つまり、その場合は追加専用のサーバーになります。[optional]

rename (M/-)

見出語のみの変更を行います。

パラメータ:
word 変更したい見出語
newword 変更後の見出語
userid ユーザーID(getkeyメソッドがある場合のみ)
authkey 暗号化された認証キー(getkeyメソッドがある場合のみ)

戻り値:
<status>
ok 成功
none 見出語(word)は存在しない(user)
deleted 見出語(word)はすでに削除された(user)
exist 見出語(newword)はすでに登録されていた(user)
perror パラメタ―のエラー(retry/user)
serror サーバーのエラー(retry/user)
auth 権限エラー(user/retry)
busy サーバーbusy(retry/user)
full これ以上登録できない(retry/user)
limit newwordが長すぎて登録できない
<id>
この更新のトランザクションID(statusがokのときのみ)

説明:
すでに登録済みの見出語(word)を新しい見出語(newword)に変更します。
見出語(word)が存在しなかった場合は none、すでに削除されていた場合は deleted を返します。
パラメータ word newwordいずれかが指定されなかった場合は perror を返します。
必要であれば、登録項目の update を更新します。
正常に処理された場合、サーバー側のトランザクションIDは2つ増やす。renameは、削除と新規登録が行われたとみなします。downloadメソッドでも、renameはなく、deleteと新規登録の組み合わせになります。

サーバー側の処理:
renameで返された<id>でgetメソッドを呼んだ場合、見出語変更後の情報を返すようにしてください。

特殊ルールとして、addメソッドをサポートするサーバーは、putメソッド、deleteメソッド、renameメソッドを省略することが可能です。つまり、その場合は追加専用のサーバーになります。[optional]

download (M/M)

パラメータ:
lastid最終取得見出語ID(default=0)
count 最大取得単語数
userid ユーザーID(getkeyメソッドがある場合のみ)
authkey 暗号化された認証キー(getkeyメソッドがある場合のみ)
waittime [Rev.1.1] downloadメソッドを要求したとき、新規に登録された単語がない場合レスポンスを返さずコネクションを維持したままにする。新規登録単語がないまま、waittimeで指定した時間[msec]経過したらレスポンスを返す。(このパラメータはオプション)
multi [Rev.1.1] waittimeを指定したとき、複数の辞書のダウンロードを行う場合は、multiパラメータで複数の辞書IDを指定する。(HTTPは同時接続数の制限があるため)

戻り値:
<status>
ok 取得できた
perror パラメータのエラー
serror サーバーのエラー
auth 権限エラー
busy server busy

登録されている単語の場合:
<record>
<dictionaryId> ※1
<id>
<word>
<trans>
<ex>
<pron>
<level>
<memory>
<recdate>
<update>
<who>
<delete>
</record>

削除された単語の場合:
<record>
<dictionaryId> ※1
<id>
<delete>削除された見出語
</record>

※登録項目で述べたとおり、すべてのデータが返されるわけではありません。サーバーの実装に依存します。
※1 [Rev.1.1] multiパラメータを指定した場合、dictionaryIdが返される。

説明:
getメソッドと機能的には同じだが、複数の単語を取得する場合に時間がかかるため、downloadメソッドによって一気にダウンロードすることが可能になる。
戻り値の構造はgetと異なり、<record>によって一つの単語を区切り、複数の<record>を列挙することによって複数の単語を記述する。
返される単語は、lastid の次の単語から最新の更新された単語情報である。(lastidの単語は含まれない)まとめて返される単語数を count パラメータによって制限することも可能である。また、countパラメータ以上の語数がサーバー上にあっても、サーバー側の制限によりそれ以下にされる可能性がある。(サーバー負荷軽減のため)
削除された単語は登録されている単語とは異なり、<id><delete>のみを使用する。<delete> に削除された見出語を記述する。
もし、同一の見出語が複数回更新されていた場合、転送データを節約するために最新の情報のみを送ることが可能である。

getkey (R/R)

パラメータ:
userid ユーザーID
password 暗号化されたパスワード
version クライアントがサポートするバージョン番号で最大の値 (形式はメジャー番号+小数点+マイナー番号)

戻り値:
<status>
ok 取得できた
perror パラメータのエラー
serror サーバーのエラー
auth 権限エラー
busy server busy
version バージョンエラー
<challenge> チャレンジキー
<authkey> 認証用キー
<duration> 認証用キーの有効期限

説明:
<challenge>
サーバーから送られる<challenge> は 乱数+[乱数+パスワードのハッシュ値]のハッシュ値。
乱数は10進数8桁であり、”パスワードのハッシュ値”はパスワードをそのままMD5で求めたハッシュ値。
式であらわすと、
<challenge> = R + H(R+H(P))
R は10進数8桁の文字列
H(x) はMD5のハッシュ関数。MD5のハッシュ値は128bitのバイナリであるが、32桁の小文字の16進数表記の文字列で表す。
P はパスワード
+ は文字列の連結
※詳細はサーバーサンプルにある、getkey.pl を参照
ヒント
同一useridで同時に複数のセッションからchallenge keyを要求してくることを考慮する必要がある。challenge keyが要求の度に異なるため、それ以降の認証が正しく動作するために、例えば認証が完了するまでchallenge keyを保持するなど対策をする必要がある。

password
クライアントから送られる password は、乱数+[乱数+パスワードのハッシュ値]のハッシュ値。
乱数はサーバーから送られた<challenge>の先頭6桁を使用する。
式で表すと、
password = R' + H(R'+H(P))
R' はサーバーから送られた<challenge>の先頭6桁の文字列
H(x) はMD5のハッシュ関数。MD5のハッシュ値は128bitのバイナリであるが、32桁の小文字の16進数表記の文字列で表す。
P はパスワード
+ は文字列の連結

<authkey>
サーバーから送られる<authkey>は任意の文字列です。(サンプルプログラムでは乱数のハッシュ値)
ヒント:
同じユーザーIDで複数のユーザーからの同時アクセスを許す場合は注意が必要です。(guestユーザーなど)
同じユーザーIDでそれぞれのユーザーに異なる認証用キーを発行した場合、サーバーにrequestするたびにauthエラーが発生し、頻繁にgetkeyメソッドによる再度認証用キーの取得を行うことになってしまいます。
したがって、この場合の認証用キーはサーバーで管理するセッションIDを含むkeyにする必要があります。

<duration>
authkeyの有効期限秒単位で表す。
例えば、1時間の有効期限を持つ場合は、3600を返す。
※通信や処理の遅延があるため、あまり短い時間は指定しないように。(現在のPDICでは期限の残りが60秒以内の場合、再度getkeyを行うので、最低でも120秒はあったほうがいいでしょう。この数値は正式版までの間に変更になる可能性はあります)

以上により、パスワードは(簡単に)盗まれることはありませんし、万が一忘れてしまった場合は誰にもわかりません。(パスワードはハッシュ値で保存するのでサーバーの管理者でさえ簡単にはわかりません←管理者がそうすればの話ですが)
万が一、認証の手続きを盗聴されたとしても、challenge-response方式を使用しているので、盗聴されたパスワードを他人が利用することは簡単にはできません。また、偽のサーバーがあったとしても、パスワードを盗まれることもありません。
ただし、authkeyを盗まれた場合は、認証キーの有効期限までは他人が利用できてしまいます。

このPDIC Serverプロトコルでは、”簡単には”他人が利用できない(なりすまし)程度のセキュリティを考えています。したがって、辞書の登録内容の秘匿性確保や、先ほどの認証キーの盗難防止など、さらなるセキュリティを必要とする場合はほかのレイヤー(例えばSSL)での利用をお勧めします。このプロトコルで高いセキュリティを維持することは効率がよくありません。

version
クライアントが対応できる最大のバージョン番号をパラメータとして渡す。
サーバーは、クライアントがサポートするバージョン番号とサーバーがサポートする最低のバージョン番号とを比較し、サポートできないバージョンの場合は version エラーを返す。
※クライアント側はTopPagepropertyにあるversionで判断する。このバージョン番号がクライアントがサポートする最小のバージョンより小さい場合はエラーとする。

匿名接続 (optional)
パラメータのuseridを省略または空欄にした場合、匿名による接続とする。passwordは"anonymous"で固定とする。
匿名接続であっても、サーバーは<authkey><duration>を返す必要がある。
download, putなどパラメータとしてuseridを要求されるメソッドでは、useridを省略する。
匿名接続機能はオプション。サポートしないサーバーは、匿名接続を要求された場合、perror(パラメータエラー) を返す。

匿名のみの接続(option)
匿名のみの接続によるサービスを提供するサーバーは、getkeyメソッドを省略することによる対応も可能。
※省略したい場合は、TopPageのmethodからgetkeyメソッドを空欄またはタグを省略する。

lock (O/-)

Rev.0.50にて追加(2004.12.1時点では仕様のみ、実装検証はまだ)

パラメータ:
operation 操作内容 lock unlock
lockid operationがunlockであるときのみ必要。lock時に返されたIDを渡す。

戻り値:
<status>
ok 操作完了
busy server busy(retry) 他のclientがserverにlockをかけている
perror パラメータのエラー(retry/user) 、operation内容が間違っている、lockidがlock時のIDと異なっている。
serror サーバーのエラー(retry/user)
auth 権限エラー(user/retry)
<lockid>
operationがlockであり、かつstatusがokである場合にこの項目が返される。unlock時にこのIDを渡す。

説明:
一連のトランザクションをまとめて登録しなければならない場合にこのメソッドを用いる。
このメソッドを設けた理由は、あるアプリケーションによっては、一連のトランザクションが他のクライアントのトランザクションと混合される(同時に実行される)と、トランザクションに不整合が生じてしまう場合があるためである。
lockをしたクライアントはサーバーが定める一定期間内にunlockをしなければならない。
lockをしてunlockするまでは他のクライアントからの次のメソッドはエラーとなり、statusとしてbusyを返す。
put
delete
rename
lockをしたクライアントは、以上のメソッドにパラメターとして<lockid>を渡す必要がある。
lockidの具体的な値はサーバーの実装に依るが、極力同じ値が発生しないようにする。

lockされていない状態でunlockを行った場合は、statusにokを返す。

補足:
lockidに all を指定した場合は、無条件に現在lock中の状態をすべて解除することも可能とする。ただし、原則として管理者権限が必要。サーバーの実装はOptionalとする。
これを用いるよりは、サーバー側のタイムアウトを待つようにする。タイムアウトは連続するトランザクションがどれだけの量になるか、またネットワークのディレイをどれだけ見積もるかに依るが、長時間としない。分単位以上としない。


認証方法

Client Server
初期認証
userid:ユーザーID getkey method -->
<-- <challenge>チャレンジキー
userid:ユーザーID
password:パスワード
getkey method -->
<-- <authkey>認証用キー
<duration>キーの期限
トランザクション実行時の認証
userid:ユーザーID
auth:認証用キー
xxxx method --> 認証用キーが一致すればOK

上書きモード (optional, informative)

put/renameメソッドではデータの衝突を規定していますが、サーバー側の設定により、この衝突を発生しない上書きモードを提供することが可能です。

サーバー側の処理を次のように変更することで、上書きモードとして動作します。

putメソッド

exist 新規に見出語を登録しようとしたが、すでに同じ見出語が登録されていた(user)→上書きで登録する
conflict 指定したトランザクションIDを更新しようとしたが、その間にほかのクライアントが更新を行っていた(user)→上書きで登録する

renameメソッド

exist 見出語(newword)はすでに登録されていた(user)→上書きで登録する

※クライアント側はサーバーが上書きモードであるかどうか意識する必要はありません。
※ユーザーは上書きモードであるかどうか留意する必要があります。(大切なデータを上書きしないように)


サーバーの検索


サーバーリストの取得

サーバーを自動的に検索するための方法を記す。
非常に原始的な方法だが、辞書サーバーの増減は滅多に無いと考え、人手をかけたメンテナンスを前提としたものとする。

サーバーにサーバーリストを記したファイルを置く。このファイルはXMLで記述する。エンコードはUTF-8に限定する。

Format:

<server>
  <name>name</name>
  <url>URL</url>
  <url-info>URL</url-info>
  <type>type</type>
  <version>version</version>
  <description>description</description>
  <wordcount>word count</count>
  <usercount>user count</usercount>
  <guest-id>guest ID</guest-id>
  <guest-passwd>password</guest-passwd>
</server>

<name> 辞書サーバーの名前
<url> クライアントアプリケーションに設定する共有辞書URL
<url-info> 辞書サーバーの紹介ページ、ユーザー登録ページなどユーザーを誘導するためのページ
<type> 辞書サーバーの種別(TBD)
<version> 辞書サーバーのバージョン(対応できる最低のバージョン番号)
<description> 辞書サーバーの説明
<wordcount> 登録単語数(optional)
<usercount> 参加人数(optional)
<guest-id> ゲスト接続を許可する場合のユーザーID
<guest-passwd> ゲスト接続を許可する場合のパスワード

※PDICでは、サーバーの検索を行うと、<name><url><url-info><type><description>が表示され、詳細表示ですべてのタグの情報が表示されます。

他のサーバーリストへのリンク

他のサーバーにあるサーバーリストへのリンクを示すことも可能。これにより、サーバーリストの管理が集中せず、分散するため管理が楽になる。
循環リンクは可能。クライアント側で循環リンクしていることを検知して適切な処理を行うものとする。

Format:

<server-link>
  <url>URL</url>
  <url>URL</url>
  ...
</server-link>


現在の課題

URLの記録先。
LastIDが0x7FFFFFFFを越える場合の対処とからめて考えればうまくいくかも?
URLを変えただけではだめ。


参考URL

MSDN XML Developer Center
PerfectXML
Studying XML for beginners
XML First Step
RFC1321 MD5
Internet ExplorerとMSXML

参考文献
標準XML完全解説(上)改訂版

これを買うくらいなら上記の参考URLのほうがいいかも。


開発ノート

Transaction Merge - state transition

R U E NA' NB'
R # - X RB' #
U # - E N+UB' #
E U # - # =>
NA > > # # >
NB # NB+U EA NA->B' #
NA+U > # # # >
NB+U # - EA NA->B'+U #

R 新規登録
U 更新
E 削除
NA Rename to A (?)
NB Rename to B (?)

- 状態変更なし、そのトランザクションはマージされる
> 状態変更なし、そのトランザクションは無視
X トランザクション消滅
# ありえない
=> 即実行

補足
N+UB' = rename A'->B' + update B'