P2P application in 15 lines of Python posted on slashdot

Discussion in 'Ruby' started by slonik AZ, Dec 15, 2004.

  1. slonik AZ

    slonik AZ Guest

    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--
     
    slonik AZ, Dec 15, 2004
    #1
    1. Advertising

  2. I was going to post the same message :)
    Good rubyists unite! (I'm not good :( ). Let's write a short more
    understandable program!
     
    Giovanni Intini, Dec 15, 2004
    #2
    1. Advertising

  3. On Thu, 16 Dec 2004 08:53:49 +0900, Giovanni Intini <> wrote:
    > Let's write a short more understandable program!

    Actually, someone answered with a web server written in only 3 lines of codes.
    More info here: http://tinyurl.com/6lxpa
     
    Purple Meteor, Dec 16, 2004
    #3
  4. 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!

    On Thu, 16 Dec 2004 10:11:15 +0900, Purple Meteor
    <> wrote:
    > On Thu, 16 Dec 2004 08:53:49 +0900, Giovanni Intini <> wrote:
    > > Let's write a short more understandable program!

    > Actually, someone answered with a web server written in only 3 lines of codes.
    > More info here: http://tinyurl.com/6lxpa
    >
    >
     
    Michael DeHaan, Dec 16, 2004
    #4
  5. 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 :)
     
    gabriele renzi, Dec 16, 2004
    #5
  6. * gabriele renzi <> [Dec 16, 2004 10:30]:
    > 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 :)


    How about

    def qs(l)
    l.sort!
    end

    ;-),
    nikolai

    --
    ::: name: Nikolai Weibull :: aliases: pcp / lone-star / aka :::
    ::: born: Chicago, IL USA :: loc atm: Gothenburg, Sweden :::
    ::: page: www.pcppopper.org :: fun atm: gf,lps,ruby,lisp,war3 :::
    main(){printf(&linux["\021%six\012\0"],(linux)["have"]+"fun"-97);}
     
    Nikolai Weibull, Dec 16, 2004
    #6
  7. slonik AZ wrote:

    > 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)
     
    Florian Gross, Dec 16, 2004
    #7
  8. On Thu, 16 Dec 2004 18:51:38 +0900
    Nikolai Weibull <> wrote:

    > * gabriele renzi <> [Dec 16, 2004 10:30]:
    > > 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 :)

    >
    > How about
    >
    > def qs(l)
    > l.sort!
    > end
    >
    > ;-),
    > nikolai
    >


    I hope sort is not implemented as quicksort ;)

    Regards,

    Brian


    --
    Brian Schröder
    http://www.brian-schroeder.de/
     
    Brian Schröder, Dec 16, 2004
    #8
  9. * Brian Schröder <> [Dec 16, 2004 13:10]:
    > > How about


    > > def qs(l)
    > > l.sort!
    > > end


    > 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

    --
    ::: name: Nikolai Weibull :: aliases: pcp / lone-star / aka :::
    ::: born: Chicago, IL USA :: loc atm: Gothenburg, Sweden :::
    ::: page: www.pcppopper.org :: fun atm: gf,lps,ruby,lisp,war3 :::
    main(){printf(&linux["\021%six\012\0"],(linux)["have"]+"fun"-97);}
     
    Nikolai Weibull, Dec 16, 2004
    #9
  10. slonik AZ

    ts Guest

    >>>>> "N" == Nikolai Weibull <> writes:

    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
     
    ts, Dec 16, 2004
    #10
  11. Florian Gross wrote:

    > slonik AZ wrote:
    >
    >> 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.


    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)
     
    Florian Gross, Dec 16, 2004
    #11
  12. * ts <> [Dec 16, 2004 14:30]:
    > > 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)


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

    --
    ::: name: Nikolai Weibull :: aliases: pcp / lone-star / aka :::
    ::: born: Chicago, IL USA :: loc atm: Gothenburg, Sweden :::
    ::: page: www.pcppopper.org :: fun atm: gf,lps,ruby,lisp,war3 :::
    main(){printf(&linux["\021%six\012\0"],(linux)["have"]+"fun"-97);}
     
    Nikolai Weibull, Dec 16, 2004
    #12
  13. On Thu, 16 Dec 2004 23:09:43 +0900
    Nikolai Weibull <> wrote:

    > * ts <> [Dec 16, 2004 14:30]:
    > > > 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)

    >
    > 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


    --
    Brian Schröder
    http://www.brian-schroeder.de/
     
    Brian Schröder, Dec 16, 2004
    #13
  14. slonik AZ wrote:

    >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
     
    why the lucky stiff, Dec 16, 2004
    #14
  15. * Brian Schröder <> [Dec 16, 2004 16:30]:
    > 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

    --
    ::: name: Nikolai Weibull :: aliases: pcp / lone-star / aka :::
    ::: born: Chicago, IL USA :: loc atm: Gothenburg, Sweden :::
    ::: page: www.pcppopper.org :: fun atm: gf,lps,ruby,lisp,war3 :::
    main(){printf(&linux["\021%six\012\0"],(linux)["have"]+"fun"-97);}
     
    Nikolai Weibull, Dec 16, 2004
    #15
  16. On Thu, Dec 16, 2004 at 10:37:13PM +0900, Florian Gross scribed:
    > >
    > >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!


    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

    --
    work: me:
    MIT Laboratory for Computer Science http://www.angio.net/
     
    David G. Andersen, Dec 16, 2004
    #16
  17. > _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
     
    Kaspar Schiess, Dec 17, 2004
    #17
  18. Florian Gross wrote:

    > 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)}}
     
    Florian Gross, Dec 17, 2004
    #18
  19. slonik AZ

    Guest

    , Sep 10, 2012
    #19
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Joe Francia
    Replies:
    0
    Views:
    301
    Joe Francia
    Jul 8, 2003
  2. Guyon Morée
    Replies:
    4
    Views:
    326
    Irmen de Jong
    Jul 30, 2003
  3. relisoft
    Replies:
    1
    Views:
    396
    red floyd
    Jul 11, 2006
  4. Roberto

    P2P Application

    Roberto, Sep 28, 2007, in forum: C Programming
    Replies:
    6
    Views:
    299
    Roberto
    Sep 30, 2007
  5. J. D.
    Replies:
    1
    Views:
    118
    J. D.
    Dec 16, 2004
Loading...

Share This Page