dbのversionを返すAPI

守岡知彦 / MORIOKA Tomohiko tomo @ kanji.zinbun.kyoto-u.ac.jp
2003年 10月 21日 (火) 20:45:14 JST


>>>>> In [chise-ja : No.00253] 
>>>>>	"師さん" = Shigeki Moro <s-moro @ hanazono.ac.jp> wrote:

師さん> 今日、Perl の CHISE 的正規表現拡張モジュールがあまりにとろいの
師さん> で、一回 db から引っ張ってきた結果をキャッシュしておく仕組みを
師さん> 作っていたりしたのですが、そこでふと思ったことがあります。

師さん> db が成長していくことを考えると、このようなキャッシュは折に触
師さん> れてクリアされていくことが望ましいわけですが、そのタイミングを
師さん> 何で判断するかが問題です。Berkeley DB の各ファイルのタイムスタ
師さん> ンプを憶えておいて…というやり方でもとりあえずはいいんですが、
師さん> libchise があるご時世にそれはあまりにも泥臭い (^_^;; 気がしま
師さん> す。

師さん> と言うことで、文字素性 db の全体あるいは部分のバージョンやらタ
師さん> イムスタンプやらを調べてくれる API なり何なりがあると、将来的
師さん> にうれしい気がします(libchise にはまだないですよね? すでに
師さん> あったらすいません)。もっとも問題は実装よりも、何を以て db 全
師さん> 体のバージョンとするか、とか、どういう表現にするか、とかいうよ
師さん> うな面倒そうな点にあるような気がするので、とりあえず今は問題提
師さん> 起ということにしたいと思います。

問題提起ありがとうございます。

自転車操業に拍車がかかっていて進展してないのですが、libchise の中期目
標(うう、いやな単語(意味不明))としては、multi data source 化 +
multi backend 化を考えてます。今は単一の data source しかないのですが、
これを複数化すると共に、Berkeley DB 以外の DB 形式をサポートしたいとい
うことです。

例えば、(a) /usr/local/libexec/chise/ にシステム標準 DB があり、(b)
/usr/local/var/chise/ にサイト共有 DB があり、(c) ~/.chise/ に個人用 
DB があり、(d) http://wiki.chise.org/data/ に世界中から共有可能な DB 
があったとします。

この時、(a) はバージョンを定義可能な気がしますが、他のは多分バージョン
という概念ではうまくいかない気がします。

そして、キャッシュの同期の問題なんですが、(a)〜(d) を含む一般的な状況
で同期を取るのは諦めるしかないかなと思います。ただ、実用的にこの問題を
解決する手段は考える必要があります(うーむ、分散 DB 屋さんや分散 OS 屋
さんの助けが欲しい所、というか自分で勉強しろというか(でも、貧乏暇無し))。

とりあえず思い付く方法としては、(1) data source(あるいは素性)毎に書
き換え頻度が違うだろうから、次に書き変わるかも知れない時刻を設定ないし
は予測して、フェッチをかけるとか (2) データを書き換えると libchise が 
commit message を発行し、アプリケーションはそれを受ける call back を
設定可能にするというようなものがあります。(1) は WWW 日記アンテナみた
いなものですから、world wide な DB にも適用可能でしょう。(2) は実用的
には local なものに限定されるでしょう。


ところで、キャッシュをどうとらえるかという問題もあります。例えば、
XEmacs CHISE には on memory DB があって、これがキャッシュの役割を果た
してます。ただ、これは陽に reset-char-attribute-table をかけないとキャッ
シュがクリアされません。これはキャッシュと考えるといまいちなんですが、
Emacsen の buffer とか cvs の working directory のようなものだと考える
と、これで良いような気もします。

ところで、libchise に現在の XEmacs CHISE の on memory DB のようなもの
を入れたらどうかという気がしてるんですが、この場合、on memory DB を
BerkeleyDB とは違う DS-type の data source として扱うのが奇麗かなと思っ
てます。そして、2つの data sources を関連づける一般的な機構を入れれば、
on memory DB をキャッシュにするだけでなく、(b) や (c) ような local DB
を (d) のような world wide な DB のキャッシュのように扱うことができる
気がします。

また、cvs のアナロジーでいえば、conflict をどうとらえるかという問題が
あると思います。on memory DB をキャッシュと考えると、外部 DB が正しい
訳ですから、conflict した時には on memory DB を消すことになる訳ですが、
一般にはポリシーに依存すると思います。そのため、cvs のように複数の 
data source 間の compare をかけるような機能がいるなあと思ってます。た
だ、通常は優先順位を付けるのが良いかなと思います。今考えてるのは、UNIX 
の mount のように上にかぶせてくモデルで、これを現在導入中の domain と
関連づけたいと思ってます。

思うに、手元のデータを信用して、なかったら遠くのデータを見に行くという
のが自然かなと思うので、この点でいえば、原則として近いものを消さないと
いう風にデザインするのが良いかなと思います。その上で、不審なデータを発
見したら他のデータと compare をかけるという感じになるのではないかと思
います。あとは、貴重なデータじゃなければ記憶領域を圧迫する場合にお好み
でクリアするという感じでどうでしょうか。


師さん> # 最近、次の Java には依拠する Unicode のバージョンを返す API 
師さん> # がつくらしい、という話を耳にしたので。

なるほど。

ちなみに、Unicode のバージョンは CHISE 的には domain で扱うのが良いで
しょうか。また、その場合、バージョンの情報は domain に対するメタデータ
(例:@unicode-4_0*sources)になるのかな。

-- 
===『幾千億の分子に分かれても ========================================
     決して忘れない。    
     この宇宙が終るまで』              守岡 知彦 (MORIOKA Tomohiko)
====================== Email: <tomo @ kanji.zinbun.kyoto-u.ac.jp> ======




More information about the CHISE-ja mailing list