Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

renamed

  • Loading branch information...
commit 0c0e22a544b377b100ec5b6a5a061370327dc743 1 parent 68cffc1
@seki authored
Showing with 52 additions and 52 deletions.
  1. +52 −52 drip.txt
View
104 drip.txt
@@ -593,16 +593,16 @@ $ cd Drip/sample/demo4book
@root = File.expand_path('~/Drip/')
||<
-以下のようにcrowl.rbを実行するとcrowlするごとにファイルの一覧が表示されます
+以下のようにcrawl.rbを実行するとcrawlするごとにファイルの一覧が表示されます
>||
-$ ruby crowl.rb
+$ ruby crawl.rb
["install.rb",
"lib/drip/version.rb",
"lib/drip.rb",
"lib/my_drip.rb",
"sample/copocopo.rb",
- "sample/demo4book/crowl.rb",
+ "sample/demo4book/crawl.rb",
"sample/demo4book/index.rb",
"sample/drip_s.rb",
"sample/drip_tw.rb",
@@ -620,7 +620,7 @@ $ ruby crowl.rb
>||
$ ruby index.rb
def
-["sample/demo4book/index.rb", "sample/demo4book/crowl.rb"]
+["sample/demo4book/index.rb", "sample/demo4book/crawl.rb"]
2
def
["sample/drip_s.rb",
@@ -628,7 +628,7 @@ def
"lib/my_drip.rb",
"sample/copocopo.rb",
"sample/demo4book/index.rb",
- "sample/demo4book/crowl.rb"]
+ "sample/demo4book/crawl.rb"]
6
||<
@@ -641,14 +641,14 @@ def
このシステムでDripに投入するオブジェクトとタグについて説明します。主に使用するのは「ファイル更新通知」です。
--ファイル更新通知 - ファイル名、内容、更新日の配列です。'rbcrowl'と'rbcrowl-fname=ファイル名'の二つのタグを持ちます。
+-ファイル更新通知 - ファイル名、内容、更新日の配列です。'rbcrawl'と'rbcrawl-fname=ファイル名'の二つのタグを持ちます。
クロウラは更新されたファイルを見つけるたびにこの情報をwriteします。これはファイル内容のアーカイブであると同時に、更新を通知するイベントになります。インデクサは更新通知を見つけるたびに索引を更新します。
補助的に利用するものもあります。
--クロウラの足跡 - ひとまとまりの処理のなかで更新したファイル名の一覧と、その時刻をメモします。'rbcrowl-footprint'というタグを持ちます。
--実験開始を示すアンカー - 'rbcrowl-begin'というタグを持ちます。何度か実験を繰り返しているうちにはじめからやり直したくなったらこのタグでなにかwriteしてください。
+-クロウラの足跡 - ひとまとまりの処理のなかで更新したファイル名の一覧と、その時刻をメモします。'rbcrawl-footprint'というタグを持ちます。
+-実験開始を示すアンカー - 'rbcrawl-begin'というタグを持ちます。何度か実験を繰り返しているうちにはじめからやり直したくなったらこのタグでなにかwriteしてください。
ではこれらのオブジェクトやタグがどのように使われているか見てみましょう
@@ -657,23 +657,23 @@ def
簡易クロウラの動作を説明します。
>|ruby|
-class Crowler
+class Crawler
include MonitorMixin
def initialize
super()
@root = File.expand_path('~/develop/git-repo/')
@drip = MyDrip
- k, = @drip.head(1, 'rbcrowl-begin')[0]
+ k, = @drip.head(1, 'rbcrawl-begin')[0]
@fence = k || 0
end
def last_mtime(fname)
- k, v, = @drip.head(1, 'rbcrowl-fname=' + fname)[0]
+ k, v, = @drip.head(1, 'rbcrawl-fname=' + fname)[0]
(v && k > @fence) ? v[1] : Time.at(1)
end
- def do_crowl
+ def do_crawl
synchronize do
ary = []
Dir.chdir(@root)
@@ -681,10 +681,10 @@ class Crowler
mtime = File.mtime(fname)
next if last_mtime(fname) >= mtime
@drip.write([fname, mtime, File.read(fname)],
- 'rbcrowl', 'rbcrowl-fname=' + fname)
+ 'rbcrawl', 'rbcrawl-fname=' + fname)
ary << fname
end
- @drip.write(ary, 'rbcrowl-footprint')
+ @drip.write(ary, 'rbcrawl-footprint')
ary
end
end
@@ -703,25 +703,25 @@ end
>|ruby|
@drip.write(
["sample/demo4book/index.rb", 2011-08-23 23:50:44 +0100, "ファイルの中身"],
- "rbcrowl", "rbcrowl-fname=sample/demo4book/index.rb"
+ "rbcrawl", "rbcrawl-fname=sample/demo4book/index.rb"
)
||<
値はファイル名、時刻、ファイルの中身からなる配列で、それに対して二つのタグがついています。
-クロウラは60秒置きに更新を調べるようになっています。標準入力からなにか入力すると、更新の合間を待ってから終了します。一回の処理で見つけたファイル名の配列を'rbcrowl-footprint'というタグをつけて覚えておきます。たとえば、以下のようなデータを書き込みます。
+クロウラは60秒置きに更新を調べるようになっています。標準入力からなにか入力すると、更新の合間を待ってから終了します。一回の処理で見つけたファイル名の配列を'rbcrawl-footprint'というタグをつけて覚えておきます。たとえば、以下のようなデータを書き込みます。
>|ruby|
-@drip.write(["sample/demo4book/index.rb"], 'rbcrowl-footprint')
+@drip.write(["sample/demo4book/index.rb"], 'rbcrawl-footprint')
||<
このバージョンのクロウラはファイルの削除を追いかけませんが、この足跡情報を使えば削除を知ることができるかもしれません。
更新されたか否かは、headメソッドで一つ前のバージョンを探し比較して検査します。
-'rbcrowl-fname=ファイル名'というタグでheadすることで、直前のバージョン(つまりDripに書かれている最新のバージョン)を調べることができます。
+'rbcrawl-fname=ファイル名'というタグでheadすることで、直前のバージョン(つまりDripに書かれている最新のバージョン)を調べることができます。
>|ruby|
-k, v = @drip.head(1, "rbcrowl-fname=sample/demo4book/index.rb")[0]
+k, v = @drip.head(1, "rbcrawl-fname=sample/demo4book/index.rb")[0]
||<
以下に完全なクロウラを載せます。
@@ -731,23 +731,23 @@ require 'pp'
require 'my_drip'
require 'monitor'
-class Crowler
+class Crawler
include MonitorMixin
def initialize
super()
@root = File.expand_path('~/develop/git-repo/')
@drip = MyDrip
- k, = @drip.head(1, 'rbcrowl-begin')[0]
+ k, = @drip.head(1, 'rbcrawl-begin')[0]
@fence = k || 0
end
def last_mtime(fname)
- k, v, = @drip.head(1, 'rbcrowl-fname=' + fname)[0]
+ k, v, = @drip.head(1, 'rbcrawl-fname=' + fname)[0]
(v && k > @fence) ? v[1] : Time.at(1)
end
- def do_crowl
+ def do_crawl
synchronize do
ary = []
Dir.chdir(@root)
@@ -755,10 +755,10 @@ class Crowler
mtime = File.mtime(fname)
next if last_mtime(fname) >= mtime
@drip.write([fname, mtime, File.read(fname)],
- 'rbcrowl', 'rbcrowl-fname=' + fname)
+ 'rbcrawl', 'rbcrawl-fname=' + fname)
ary << fname
end
- @drip.write(ary, 'rbcrowl-footprint')
+ @drip.write(ary, 'rbcrawl-footprint')
ary
end
end
@@ -770,16 +770,16 @@ class Crowler
end
end
-crowler = Crowler.new
+crawler = Crawler.new
Thread.new do
while true
- pp crowler.do_crowl
+ pp crawler.do_crawl
sleep 60
end
end
gets
-crowler.quit
+crawler.quit
||<
@@ -793,7 +793,7 @@ class Indexer
def initialize(cursor=0)
@drip = MyDrip
@dict = Dict.new
- k, = @drip.head(1, 'rbcrowl-begin')[0]
+ k, = @drip.head(1, 'rbcrawl-begin')[0]
@fence = k || 0
@cursor = [cursor, @fence].max
end
@@ -808,7 +808,7 @@ class Indexer
def each_document
while true
- ary = @drip.read_tag(@cursor, 'rbcrowl', 10, 1)
+ ary = @drip.read_tag(@cursor, 'rbcrawl', 10, 1)
ary.each do |k, v|
prev = prev_version(k, v[0])
yield(v, prev)
@@ -818,27 +818,27 @@ class Indexer
end
def prev_version(cursor, fname)
- k, v = @drip.older(cursor, 'rbcrowl-fname=' + fname)
+ k, v = @drip.older(cursor, 'rbcrawl-fname=' + fname)
(v && k > @fence) ? v : nil
end
end
||<
-インデクサはDripから'rbcrowl'タグのついたオブジェクトを取り出し、その都度、索引を更新します。
+インデクサはDripから'rbcrawl'タグのついたオブジェクトを取り出し、その都度、索引を更新します。
>|ruby|
-@drip.read_tag(@cursor, 'rbcrowl', 10, 1)
+@drip.read_tag(@cursor, 'rbcrawl', 10, 1)
||<
第4引数の「1」に注目して下さい。先ほど「keyより新しい要素の数がat_least個に満たない場合は、新しいデータが追加されるまでブロックします」と説明したのを覚えていますか?一度に10個ずつ、最低でも1個ずつ返せ、という指示ですから返せる要素が一つもないときにはブロックします。
-これによりクロウラが'rbcrowl'タグのデータを挿入するのをブロックしながら待ち合わせている事になります。
+これによりクロウラが'rbcrawl'タグのデータを挿入するのをブロックしながら待ち合わせている事になります。
-インデクサにとってrbcrowlタグのオブジェクトは更新イベントであると同時に文書でもあります。更新されたファイル名、更新時刻、内容がまとめて手に入ります。
+インデクサにとってrbcrawlタグのオブジェクトは更新イベントであると同時に文書でもあります。更新されたファイル名、更新時刻、内容がまとめて手に入ります。
また、DripはQueueとちがい、すでに読んだ要素を再び読むことが可能です。注目点の直前の要素を調べるolderなどで調べることが可能です。
>|ruby|
def prev_version(cursor, fname)
- k, v = @drip.older(cursor, 'rbcrowl-fname=' + fname)
+ k, v = @drip.older(cursor, 'rbcrawl-fname=' + fname)
(v && k > @fence) ? v : nil
end
||<
@@ -887,7 +887,7 @@ class Indexer
def initialize(cursor=0)
@drip = MyDrip
@dict = Dict.new
- k, = @drip.head(1, 'rbcrowl-begin')[0]
+ k, = @drip.head(1, 'rbcrawl-begin')[0]
@fence = k || 0
@cursor = [cursor, @fence].max
end
@@ -902,7 +902,7 @@ class Indexer
def each_document
while true
- ary = @drip.read_tag(@cursor, 'rbcrowl', 10, 1)
+ ary = @drip.read_tag(@cursor, 'rbcrawl', 10, 1)
ary.each do |k, v|
prev = prev_version(k, v[0])
yield(v, prev)
@@ -912,7 +912,7 @@ class Indexer
end
def prev_version(cursor, fname)
- k, v = @drip.older(cursor, 'rbcrowl-fname=' + fname)
+ k, v = @drip.older(cursor, 'rbcrawl-fname=' + fname)
(v && k > @fence) ? v : nil
end
end
@@ -986,11 +986,11 @@ Dripにおけるイベントの通知は、受動的ではありません。リ
***フェンスと足跡
実験を繰り返していると、最初の状態からやり直したくなることがあるでしょう。Dripのデータベースを作り直せばやりなおせますが、でもMyDripはこのアプリケーション以外からも雑多な情報をwriteされているでそれは抵抗がありますよね。
-そこでこのアプリケーションの始まりの点を閉めすオブジェクトを導入することに。'rbcrowl-begin'というタグを持つオブジェクトがあるときは、それよりも旧い情報を無視することで、それ以前のオブジェクトに影響されずに実験できます。@fenceはクロウラ、インデクサのどちらでも使っているので読んでみて下さい。
+そこでこのアプリケーションの始まりの点を閉めすオブジェクトを導入することに。'rbcrawl-begin'というタグを持つオブジェクトがあるときは、それよりも旧い情報を無視することで、それ以前のオブジェクトに影響されずに実験できます。@fenceはクロウラ、インデクサのどちらでも使っているので読んでみて下さい。
具体的にはolderやheadの際にそのキーをチェックして、@fenceよりも旧かったら無視することにします。
>||
-=> MyDrip.write('fence', 'rbcrowl-begin')
+=> MyDrip.write('fence', 'rbcrawl-begin')
>> 1313573767321913
||<
@@ -1114,22 +1114,22 @@ boundの場合、その範囲に入っている要素の数が大きいとき、
順序のあるデータ構造、RBTreeは、実はDripの内部でも使われています。基本となるのはDripのキー(整数のキー)をそのまま使う集合です。もう一つ、タグのための集合にもRBTreeを使っています。この集合は[タグ(String), キー(Integer)]という配列をキーにします。
>||
-['rbcrowl-begin', 100030]
-['rbcrowl-begin', 103030]
-['rbcrowl-fname=a.rb', 1000000]
-['rbcrowl-fname=a.rb', 1000020]
-['rbcrowl-fname=a.rb', 1000028]
-['rbcrowl-fname=a.rb', 1000100]
-['rbcrowl-fname=b.rb', 1000005]
-['rbcrowl-fname=b.rb', 1000019]
-['rbcrowl-fname=b.rb', 1000111]
+['rbcrawl-begin', 100030]
+['rbcrawl-begin', 103030]
+['rbcrawl-fname=a.rb', 1000000]
+['rbcrawl-fname=a.rb', 1000020]
+['rbcrawl-fname=a.rb', 1000028]
+['rbcrawl-fname=a.rb', 1000100]
+['rbcrawl-fname=b.rb', 1000005]
+['rbcrawl-fname=b.rb', 1000019]
+['rbcrawl-fname=b.rb', 1000111]
||<
-これなら、'rbcrowl-begin'をもつ最新のキーや、注目点直前の'rbcrowl-fname=a.rb'のキーなどが二分探索のコストで探せます。
+これなら、'rbcrawl-begin'をもつ最新のキーや、注目点直前の'rbcrawl-fname=a.rb'のキーなどが二分探索のコストで探せます。
Rindaの場合は強力なパターンマッチと引き換えに、Arrayを基本としたデータ構造を内部で使っていたため、データ量に比例して検索時間が増加する(O(N))という問題がありました。Dripの場合はRBTreeを使う事でtagやkeyの開始点まで比較的素早くブラウズが可能になっています。(O(log n))
-このデータ構造のおかげで「消えないキュー」「いらなくなったら'rbcrowl-begin'でリセット」といった、一見富豪的なデータストレージが可能になっています。
+このデータ構造のおかげで「消えないキュー」「いらなくなったら'rbcrawl-begin'でリセット」といった、一見富豪的なデータストレージが可能になっています。

0 comments on commit 0c0e22a

Please sign in to comment.
Something went wrong with that request. Please try again.