辞書共有サービス構想

個人辞書を複数の計算機間で共有するにはどうすればいいのかを考えています。おおまかな構成は以下の通り。

  • Google App Engine 上に辞書共有サービスを構築
  • 各計算機には同期クライアントが常駐し、定期的に辞書共有サービスと通信
  • 同期クライアントは各種 SKK 実装向けに、個人辞書インタフェースを提供

同期クライアントを用意した理由は、オフライン対応です。リクエストは以下のような感じで。

GET /skk-jisyo/かんじ
GET /skk-jisyo/おおk?okuri=き
COMPLETE /skk-jisyo/みだし
PUT /skk-jisyo/かんじ/漢字
PUT /skk-jisyo/おおk/大?okuri=き
DELETE /skk-jisyo/かんじ/漢字
DELETE /skk-jisyo/おおk/多?okuri=き

同期クライアントは受信したリクエストから登録と削除だけを抜き出してジャーナル化し、定期的に辞書共有サービスに差分を HTTP(S) で送信します。こちらも内容は単純です。

POST /update

+ かんじ 漢字
- おおkき 多
...

他の計算機から送信された更新を取り込むには、タイムスタンプをキーに差分を取得します。無指定なら全件取得。

GET /diff?timestamp=...

結果として返されるのは、SKK 辞書に類似したデータ形式です。

かんじ /漢字/監事/感じ/冠辞/
おおkき /大/
...

同期クライアントはこの内容をローカルの辞書に反映します。大体の動きはこれで良いとして、問題は辞書共有サービスでどうやってユーザーを特定するか、というところです。HTTP 認証を使うなら、ユーザー ID とパスワードのペアを同期クライアントに伝える必要があります。しかし、たかが辞書共有サービスごときに重要な認証情報を渡すのはさすがに抵抗感があります。

そこで、本物のユーザー ID に結び付いた疑似ユーザー ID と秘密鍵を事前に発行し、通信内容の MAC 値を算出して受信時に検証する方向で考えています。あとになってわかったことですが、疑似ユーザー ID と MAC 値によるアクセス制御は、Amazon S3 の REST 認証とおおむね同じ考え方のようです。

http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAuthentication.html

将来的には Google App Engine でも REST 認証基盤が整備され、利用できるようになるのかもしれませんね。

それはさておき、全体的なところはまとまってきた気がするので、ぼちぼち実験用のコードを書いてみるつもりです。これまでのところ、かなり単純になると踏んでますが、さて、どうなることやら。