アノテーションの保存について
こんがらがってきた。
前提
対象、ユーザー、内容はその時に分かる
バックエンドのストレージにHTTPとかで保存
データのフォーマット
まあJSONでいいでしょう。
WebSocketとかの場合はその限りでない、てかJavaScriptオブジェクトになる。
が、ブラウザー以外のクライアントで操作することを考えるとHTTPに乗せられるフォーマットがいい
スキーマはとりあえずはこれに従っていいとは思うが、フォーマットとしてJSON-LDにするとめんどそう
データのスキーマ
グラフにするかどうか
ある人がしたアノテーション一覧とかある本のアノテーション一覧とか
普通に考えてこれはむしろ得意なのでは
多段ホップのパフォーマンスが気になる
集約、集計するかどうか
アノテーションがいつでも特定の種類について行われるなら
その対象から親を遡ることで関係演算ができる
例:まんがへのコメント
いつもコマについてコメントするなら
コマ
そのコマへのコメント一覧
->ページ
そのページへのコメント一覧
それらのコメントをしているユーザー一覧
->エピソード
そのエピソードへのコメント一覧
それらのコメントをしているユーザー一覧
->本
その本へのコメント一覧
それらのコメントをしているユーザー一覧
アノテーションへのアノテーションはどうか
検索必須
アノテーションの種類
登場人物
他人にも見えるコメント
自分だけのメモ
再編集用ラベル
~編とか
別のものとの紐付け
他のまんが
他の記事
自分のメモ
ユースケース
読んでいて、思ったことをメモる
登場人物をタグ付けしておいて、あとで一括で見る
例:「ブギーが出てるコマを一覧で見たい」
メカとか武器とか施設とかも同様
「〜〜編」とかダイジェスト版を作るために使う
「〜〜編コレクションまたはマニフェスト(IIIFの用語で)」を用意し、そこにページをぽんぽん放り込んでいく 元の本は横断する
保存の要件
要ログイン
access-control-allow-origin: *をすると、サイト側でJavaScriptで変なアノテーションを保存できるようになる
まあいいと言えばいいが
CORS用の許可オリジンを一つ一つ追加できるようにする?
OAuth2みたいなことになりそう
ブラウザー拡張ならいけるのか?
保存時に自動でユーザー情報も付与される
検索ができるデータベースに入れる
Firebaseはここが辛い
スケールしてほしい
取得するグラフの深さをクエリー時に指定できる
GraphQLみたいに
細かくリクエストを繰り返すんじゃなくてバルクで取りたいということ
可視性を設定できる
本当はないほうがいい
プライベートとパブリックがあった時、人はパブリックは選ばない
プライベートという選択肢がある時にわざわざ他人に見せる選択をするのは、奥ゆかしさが足りない、と考えてしまう人が多いだろうから(未検証)
自分メモとパブリックなコメントはどうしても必要だろうから、仕方なく導入
自分メモと(人に見える)コメントは入力欄とかを別々にしてプライベートに流れるバイアスを緩和したい
グループみたいな、特定の他者のみに見える、というのも考えられるけど、一先ずなし。
取得
検索
キーワードでボディを全文検索
検索対象は一先ずキャンバス
検索結果には、キャンバス、それを含むシーケンス、それを含むマニフェスト、が含まれてほしい
参照だけあってリンクを辿れば全情報が手に入る、ではなく、辿らずにすむように一回のレスポンスに全部含まれてほしい
可視性に配慮
登場人物でフィルタリング•検索
~編タグでフィルタリング•検索
試案
ストレージはGroonga
ローカルかHTTPか
ドリルダウンで、グラフのエッジを辿るようなことができるはず
フロントはactix-webとか
ログインのところ簡単だといいな
URI
POST /annotations ... アノテーション作成
GET /annotations ... アノテーション一覧取得
GET /annotations/{id} ... アノテーション取得
GET /annotations?manifest=... ... フィルタリング
と思ったけど、IIIF検索の場合、検索対象の範囲がよく分からない
この仕様の範囲は、マニフェスト(Manifest)、範囲(Range)、コレクション(Collection)などの、1つのIIIF資源内のアノテーション・コンテンツの検索です。
まんがのタイトルみたいな、何らかの名前空間をつけられるようにしたほうがいいのか?
/annotations/{manifestId, collectionId, rangeId, ...}
横断検索の時にめんどくなりそうだが・・・
例)ある巻に関心があってアノテーションする場合がある。全巻横断で検索したいことがある
「まんがタイトル」「ある巻」「一話」「〜編」で別々のマニフェストを作って、それぞれのIDでフィルタリングできるようにする?
検索する時に、検索範囲を「この巻」「見つからなければ全巻」と動かしていく時に、そこを簡単にしたい。
マニフェストURLを覚えておくとかは無理なので。
それぞれの関連を辿れるようにしておく必要がある
アノテーションサービスと iiif サービスとのアイデンティティの関係
auth APIは、どうも、極端な話リソースごとに変えられる?
「子リソースは親リソースのauthサービス使う」みたいな決まりはなさそうだけど、子供はどうする?