発端は「TinyP2P」。 Pythonで書かれたわずか15行でのP2Pアプリケーションである。 もちろん実用的ではなく「基本はこんなに簡単」ということを示すためのもの。
これに対してMoleSterなる Perlによる9行の実装が登場。 こちらは、さらに以下のような制約を加えているところがすごい。
実装は以下のようになる。
$/=$_;$,=shift;$w=$a=shift;sub g{open(F,'<',$4)&&t($2,$a,"e$4",<F>);close F}$k{+shift}=1;socket S,2,1,6;bind S,&a;sub e{open F,'>',$4;print F $';close F}sub h{t($2,$_,id)for keys%k}sub i{$k{$2}=1}sub f{t($_,$2,$4)for keys%k}sub a{$w=~/:/;pack'CxnC4x8',2,$',split'\.',$`}for(listen S,5;$SIG{ALRM}=sub{};m!^(.*?) (.*?) ([e-i])([^/]*)/!s&&$,eq$1&&&$3){alarm 9;(accept(C,S),alarm 0)?read C,$_,1e6:($_="$, $a f".shift);close C}sub t{socket X,2,1,6;$w=shift;$k{$w}=(connect X,&a)?print X"$, $_[0] $_[1]/".pop:$/;close X}
目がつぶれそうだ。
Rubyも負けていない。以下はFlorian Grossによる実装([ruby-talk:123789])。
#!/usr/bin/ruby # Server: ruby p2p.rb password server server-uri merge-servers # Sample: ruby p2p.rb foobar server druby://localhost:1337 druby://foo.bar:1337 # Client: ruby p2p.rb password client server-uri download-pattern # Sample: ruby p2p.rb foobar client druby://localhost:1337 *.rb require'drb';F,D,P,M,U,*O=File,Dir,*ARGV;def s(p)F.basename p[/\w.*/]end;def c u DRbObject.new((),u)end;def x(u);[P,u].hash;end;M["c"]?c(U).f(x(U)).map{|n|p=x(n) c=c(n);(c.f(p,O[0],0).map{|f|s f}-D["*"]).map{|f|open(f,"w")<<c.f(p,f,1)}}:(DRb. start_service U,Class.new{def p(z=O)O.push(*z).uniq!;O;end;new.methods.map{|m|m[ /_[_t]/]||private(m)};def f(c,a=[],t=2)c==x(U)&&(t==0?D[s(a)]:t==1?F.read(s(a)): p(a))end;def y;(p(U)+p).map{|u|c(u).f(x(u),p(U))rescue()};self;end}.new.y;sleep)
コメントを除けば6行。密度でも負けていない。
ただし、dRubyを使っているから「TCP以上のプロトコル抽象化ライブラリを使わない」というMoleSterの制約は満たしていない。