Operational transformationについて、その1
鉄は熱いうちに打てってことで、
GoogleWaveでの並行編集処理の基本アルゴリズムであるOperational transformationの復習。
よく解らないモノは、書き出してみると良いってことで
以下、Operational transformation - WikipediaのBasics,OT Functionsを参考に
Rubyで基本アルゴリズムを実装。
class Operation attr_accessor :p attr_reader :c,:sid def initialize p,c,sid; @p,@c,@sid = p,c,sid; end end class InsOp < Operation attr_reader :op def initialize p,c,sid super(p,c,sid); @op = :ins end end class DelOp < Operation attr_reader :op def initialize p,c,sid super(p,c,sid); @op = :del end end class String def apply op case op.op when :ins insert op.p,op.c when :del raise "err" unless self[op.p,1] == op.c slice! op.p end end def T op1,op2 case when op2.nil? apply op1 when op1.p < op2.p apply op1 when (op1.p == op2.p and op1.sid < op2.sid) apply op1 else op1 = op1.clone op1.p += 1 apply op1 end end end o1 = InsOp.new(0,"x",0) o2 = DelOp.new(2,"c",1) server = "abc" server.T o1,nil server.T o2,o1 p server client = "abc" client.T o2,nil client.T o1,o2 p client
このアルゴリズムだけだと、serverとclientが結局交互に操作される前提でないと破綻するw;
まあ基本アルゴリズムなんで実際動作させるにはイロイロ足りてないでしょうね^^;
調べることいっぱい><