Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Matzにっき(2004-12-16)
[go: Go Back, main page]

«前の日記(2004-12-15) 最新 次の日記(2004-12-17)» 編集

Matzにっき

<< 2004/12/ 1 1. ペア・プログラミング
2 1. 日本におけるOSSの幻想-OSS界のガラパゴス諸島、ニッポン
3 1. なぜグローバルか、私の場合
4 1. Linux Magazine 2月号
2. バグレポート指南
5 1. 命名
6 1. Linux Magazine 2月号(その2)
2. 言語設計者とヒゲ
3. ガラパゴス
7 1. Traitsについて再び
8 1. matz氏とoswayについて話す
2. 米IBM、PC事業をLenovoに売却
3. Linux Magazine休刊
9 1. Linux Magazine 1月号
2. サンダーバード
10 1. Dynamic Java
2. MS対Eolas、ブラウザ特許訴訟控訴審で再び対決
3. Facets of Ruby
4. 山陰中央新報『特集 しまねIT新時代』
11 1. 体調
2. 「白血球不一致の父から骨髄移植」
12 1. 岡山
13 1. 「IBMとの訴訟が決着するのは来年末」、米SCOのマクブライドCEO語る
14 1. 誤解
2. The Complete History of the Internet
15 1. TraitsとMix-in
2. 『ウルトラマン』@てれびくん
16 1. 小さなP2P
17 1. るび…ま?
2. japan.linux.comにて「JLC Diary」の正式運用開始
18 1. 買い物
19 1. 出雲
20 1. IPAヒアリング
21 1. 豆蔵
22 1. 年賀状
2. 忘年会
23 1. クリスマス会
24 1. 『今年もキミは来ないのね−聖夜にかけるIT戦士かく闘えり
2. 年賀状
25 1. クリスマスの朝
2. クリスマス・リリース
3. 『「メリークリスマス」は時代遅れ 宗教からみ米で議論
26 1. 松江
2. 年賀状
3. イエス・キリストの誕生日
27 1. The Aikido Scripting Language System
2. The Spry Computer Language
3. 企業システムにおけるPHP5の可能性
28 1. 仕事納め
29 1. 片付け・来客
2. A crisis of faith
30 1. 年賀状
2. 同じスクリプト言語
3. 散髪
31 1. 10大ニュース
>>
Dr.Web 予測するアンチウイルス 販売開始一周年!
ユーザ・サーバ数が無制限のライセンスも低価格でご利用いただけます。

2004-12-16 [長年日記]

_ 小さなP2P

発端は「TinyP2P」。 Pythonで書かれたわずか15行でのP2Pアプリケーションである。 もちろん実用的ではなく「基本はこんなに簡単」ということを示すためのもの。

これに対してMoleSterなる Perlによる9行の実装が登場。 こちらは、さらに以下のような制約を加えているところがすごい。

  • 明らかなセキュリティホールはないこと
  • なんらかの認証手段をもつこと
  • TCP以上のプロトコル抽象化ライブラリを使わない(これは大きい)
  • 言語処理系標準添付以外のライブラリを使わない

実装は以下のようになる。

$/=$_;$,=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の制約は満たしていない。

本日のツッコミ(全1件) [ツッコミを入れる]
_ 還暦の男 (2004-12-23 15:51)

うむ、Ruby版はかすかなバグ(まあ顕在化しにくいけど)
がありますな。

お名前:
E-mail:
コメント:
本日のリンク元
検索


RSS feed meter for http://www.rubyist.net/~matz/ Creative Commons License This work is licensed under a Creative Commons License.