P2P application in 15 lines of Python posted on slashdot

S

slonik AZ

Hi Everybody,
slashdot published an article on someone's
15 lines long Peer-2-Peer application
http://developers.slashdot.org/article.pl?sid=04/12/15/1953227

Another person followed up with a 9 line equivalent Perl code.

I wonder what an equivalent Ruby program would look like?

I do not care whether it 15 or 25 lines. Python program is not very readable.
Can Ruby variant be concise, yet more clear?

--Leo--
 
G

Giovanni Intini

I was going to post the same message :)
Good rubyists unite! (I'm not good :( ). Let's write a short more
understandable program!
 
M

Michael DeHaan

LOL. The Python example used quite a few core libraries, so I think
a one-line instantiation of WebBRICK would suffice for a web server
example :)

Seriously, these golf competitions don't do much for me. Show me
formatted code that applies some interesting algorithms instead.
That's how you spar with other languages!
 
G

gabriele renzi

Michael DeHaan ha scritto:
LOL. The Python example used quite a few core libraries, so I think
a one-line instantiation of WebBRICK would suffice for a web server
example :)

ruby -rwebrick -e 'WEBrick::HTTPServer.new:)DocumentRoot=>".").start'
but it is a oneliner in python too ;)
Seriously, these golf competitions don't do much for me. Show me
formatted code that applies some interesting algorithms instead.
That's how you spar with other languages!


def qs(l)
return [] if (x,*xs=*l).empty?
less, more = xs.partition{|y| y < x}
qs(less) + [x] + qs(more)
end

algoritm suggestions are welcome :)
 
F

Florian Gross

slonik said:
slashdot published an article on someone's
15 lines long Peer-2-Peer application
http://developers.slashdot.org/article.pl?sid=04/12/15/1953227

Another person followed up with a 9 line equivalent Perl code.

I wonder what an equivalent Ruby program would look like?

I did this 9.5 hours ago. Compared to the python one it is not
vulnerable to File stealing attacks (a client can request a file
.../foobar and ~/foobar from the python server and will get it back
AFAIK) and 6 lines long. It is however vulnerable to the DRb style
..instance_eval exploits. I will fix this shortly, but I might have to
use 7 lines then.

# 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,C,P,M,U,*O=File,Class,Dir,*ARGV;def s(p)F.split(p[/[^|].*/])[-1
]end;def c(u);DRbObject.new((),u)end;def x(u)[P,u].hash;end;M=="client"&&c(U).f(
x(U)).each{|n|p,c=x(n),c(n);(c.f(p,O[0],0).map{|f|s f}-D["*"]).each{|f|F.open(f,
"w"){|o|o<<c.f(p,f,1)}}}||(DRb.start_service U,C.new{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).each{|u|c(u).f(x(u),
p(U))rescue()};self;end;private;def p(x=[]);O.push(*x).uniq!;O;end}.new.y;sleep)
 
N

Nikolai Weibull

I hope sort is not implemented as quicksort ;)

array.c:

static VALUE
sort_internal(ary)
VALUE ary;
{
qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE),
rb_block_given_p()?sort_1:sort_2);
return ary;
}

rb_ary_sort_bang(ary)
VALUE ary;
{
rb_ary_modify(ary);
if (RARRAY(ary)->len > 1) {
FL_SET(ary, ARY_TMPLOCK); /* prohibit modification during sort */
rb_ensure(sort_internal, ary, sort_unlock, ary);
}
return ary;
}

Just hope your systems qsort() is any good,
nikolai
 
T

ts

N> Just hope your systems qsort() is any good,

uln% grep qsort util.h
void ruby_qsort _((void*, const int, const int, int (*)(), void*));
#define qsort(b,n,s,c,d) ruby_qsort(b,n,s,c,d)
uln%


Guy Decoux
 
F

Florian Gross

Florian said:
I did this 9.5 hours ago. Compared to the python one it is not
vulnerable to File stealing attacks (a client can request a file
../foobar and ~/foobar from the python server and will get it back
AFAIK) and 6 lines long. It is however vulnerable to the DRb style
.instance_eval exploits. I will fix this shortly, but I might have to
use 7 lines then.

Here we go. Thanks to Mauricio Fernández for helping out with cutting
off a few important characters!


#!/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)
 
N

Nikolai Weibull

uln% grep qsort util.h void ruby_qsort _((void*, const int, const int,
int (*)(), void*)); #define qsort(b,n,s,c,d) ruby_qsort(b,n,s,c,d)

Then hope Ruby's implementation of qsort is any good ;-),
nikolai
 
B

Brian Schröder

Then hope Ruby's implementation of qsort is any good ;-),
nikolai

So just out of interest, what kind of sort is ruby using?
(I could dig the sources, but I hope it will be an easy question for someone to
answer without spending too much time.)

Regards,

Brian
 
W

why the lucky stiff

slonik said:
Hi Everybody,
slashdot published an article on someone's
15 lines long Peer-2-Peer application
http://developers.slashdot.org/article.pl?sid=04/12/15/1953227
I am saddened that they failed to mention ducks. Ducks, or, more
particularly, images of ducks, are the only legitimate payload in
peer-to-peer networks these days. And, notice how I summarized this
point in less than 15 lines of text. Christmas miracles abound, folks.

_why
 
N

Nikolai Weibull

* Brian Schröder said:
So just out of interest, what kind of sort is ruby using? (I could
dig the sources, but I hope it will be an easy question for someone to
answer without spending too much time.)

Seems to be your standard memory-swap optimized quicksort, using its own
stack (i.e. no recursion), much like the one in glibc,
nikolai
 
D

David G. Andersen

Here we go. Thanks to Mauricio Fern?ndez for helping out with cutting
off a few important characters!

Nice use of drb.

I wonder how long the same program would be in ruby if it implemented
the "tinyp2p" protocol instead of using drb. ;)

-dave
 
K

Kaspar Schiess

_why

No matter how much you might be off topic, I always enjoy reading your
posts. Another miracle lurking in the dark, there.

yours,
kaspar
 
F

Florian Gross

Florian said:
Here we go. Thanks to Mauricio Fernández for helping out with cutting
off a few important characters!

Another new version, binary files can be transfered to and from Win32,
you can run servers from behind Routers and you can list all the files
on the specified network sorted by node and file name before downloading
them. Still six lines.

#!/usr/bin/ruby
# Server: ruby p2p.rb password server public-uri private-uri merge-servers
# Sample: ruby p2p.rb foobar server druby://123.123.123.123:1337
# druby://:1337 druby://foo.bar:1337
# Client: ruby p2p.rb password client server-uri download-pattern [list-only]
# Sample: ruby p2p.rb foobar client druby://localhost:1337 *.rb
################################################################################
require'drb';F=File;P,M,U,V,*O=ARGV;def c(u)DRbObject.new((),u)end;def x(u);[P,u
].hash;end;def s(p);F.basename p[/[^|]+/];end;M["s"]?(DRb.start_service V,Class.
new{def p(z=O)O.push(*z).uniq;end;new.methods.map{|m|m[/_[_t]/]||private(m)};def
y;(p(U)+p).map{|u|u!=U&&c(u).f(x(u),p(U))};self;end;def f(c,a=[],t=2)x(U)==c&&t<
1?Dir[s(a)]:t<2?[*open(s(a),"rb")]:p(a)end}.new.y;sleep):c(U).f(x(U)).map{|n|c(n
).f(x(n),V,0).map{|f|s f}.sort.map{|f|O[0]?p(f):eek:pen(f,"wb")<<c(n).f(x(n),f,1)}}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top