Warning: parse_url(http://"+ar[3]+":"+ar[4) [function.parse-url]: Unable to parse URL in /home/hercwphd/public_html/wp-content/plugins/jetpack/_inc/lib/class.media-extractor.php on line 209

Warning: parse_url(http://"+ar[3]+":"+ar[4) [function.parse-url]: Unable to parse URL in /home/hercwphd/public_html/wp-content/plugins/jetpack/_inc/lib/class.media-extractor.php on line 209

Warning: parse_url(http://"+ar[3]+":"+ar[4) [function.parse-url]: Unable to parse URL in /home/hercwphd/public_html/wp-content/plugins/jetpack/_inc/lib/class.media-extractor.php on line 209

Warning: parse_url(http://"+ar[3]+":"+ar[4) [function.parse-url]: Unable to parse URL in /home/hercwphd/public_html/wp-content/plugins/jetpack/_inc/lib/class.media-extractor.php on line 209

TinyP2P, un programa P2P en 15 líneas de código

TinyP2P es el programa de Peer 2 Peer más pequeño del mundo. Con sólo 15 líneas en Python, su autor, Ed Felten lo creó para ilustrar lo sencillo y simple que puede resultar un programa P2P, y por lo tanto, la dificultad con la que se encontrará cualquier organismo o mafia de los derechos de autor (cough, cough) al intentar regularlo.

# tinyp2p.py 1.0 (documentation at http://freedom-to-tinker.com/tinyp2p.html)
import sys, os, SimpleXMLRPCServer, xmlrpclib, re, hmac # (C) 2004, E.W. Felten
ar,pw,res = (sys.argv,lambda u:hmac.new(sys.argv[1],u).hexdigest(),re.search)
pxy,xs = (xmlrpclib.ServerProxy,SimpleXMLRPCServer.SimpleXMLRPCServer)
def ls(p=""):return filter(lambda n: (p=="")or res(p,n),os.listdir(os.getcwd()))
if ar[2]!="client": # license: http://creativecommons.org/licenses/by-nc-sa/2.0
myU,prs,srv = ("http://"+ar[3]+":"+ar[4], ar[5:],lambda x: x.serve_forever())
def pr(x=[]): return ([(y in prs) or prs.append(y) for y in x] or 1) and prs
def c(n): return ((lambda f: (f.read(), f.close()))(file(n)))[0]
f=lambda p,n,a: (p==pw(myU))and(((n==0)and pr(a))or((n==1)and [ls(a)])or c(a))
def aug(u): return ((u==myU) and pr()) or pr(pxy(u).f(pw(u),0,pr([myU])))
pr() and [aug(s) for s in aug(pr()[0])]
(lambda sv:sv.register_function(f,"f") or srv(sv))(xs((ar[3],int(ar[4]))))
for url in pxy(ar[3]).f(pw(ar[3]),0,[]):
for fn in filter(lambda n:not n in ls(), (pxy(url).f(pw(url),1,ar[4]))[0]):
(lambda fi:fi.write(pxy(url).f(pw(url),2,fn)) or fi.close())(file(fn,"wc"))

Comentarios
  1. Tan sencillo… que no me entero de nada!

    Responder

  2. Si funciona ya me sirve 😛 xD

    Responder

  3. David

    No he programado nunca en python…pero que bonitas son esas lineas… (aunque no entienda nada ^^ ).

    Me quedo con lo que comomentaba Tuxiradical…

    Responder

  4. a mi tampoco me mireis xD yo soy más bien de perl. miré un poco python para hacer cositas para karamba y superkaramba pero en cuanto me aburrí volví a perl. aunque python está bastante bien, pero cuando pillas la costumbre…

    a ver si aprendo algo de ruby

    Responder

  5. Cuando mire ruby, no se me parecio muy parecido a python (quizas delirios mios).

    :uch: Perl… interesante 😛

    Responder

  6. y no lo será. solo lo decía porque son los 3 lenguajes de script por excelencia, no porque tengan nada que ver

    Responder

  7. Y el chisme funciona?

    Responder

  8. ya te digo que funciona 😛

    Responder

  9. Sorprendente…

    Habría estado bien, que el autor publicara la versión también sin ofuscar y en (25 lineas?). Así nos enteraríamos un poquillo.

    Al igual que vosotros tampoco soy un maestro de Python.

    Responder

  10. Eso ya lo comente yo hace un tiempo y te puedo asegurar que NO es el mas pequeño del mundo 😉

    En “El tamaño si importa” lo comente sacandolo de una nota de Kriptopolis:

    Curioso duelo intelectual el que mantienen lectores de Freedom to Tinker y que se comenta en Slashdot…

    Un lector decidió escribir un programa P2P lo más pequeño posible pero totalmente operativo, a fin de ilustrar lo difícil que resulta censurar la tecnología.

    El resultado fue TinyP2P, cuyo código ocupa 15 líneas en Python. Sin embargo, otro lector se sintió estimulado por el reto e ideó MoleSter, que emplea solamente ¡9 líneas en Perl!.

    Y como ya dije en su día: Si todos los programadores se picaran asi, me pregunto cuantos miles de mhz de potencia bruta nos sobrarian en los procesadores…

    Responder

  11. parece ser que molester ya ocupa solo 6 líneas xD pero hay ciertas informaciones que indican que podría no ser el más pequeño tampoco 😛 porque cuando molester ocupaba 9, Florian Gross creó uno en ruby en 6 líneas

    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)

    Responder

  12. y aquí el código de molester para quien se aburra y quiera echarle un vistazo:

    $/=$_;$,=shift;$w=$a=shift;$k{+shift}=1;socket S,2,1,6;bind S,&a;for(listen
    S,5;$SIG{ALRM}=&i;m! (S+) ([e-i])([^/]*)/!s&&($k{$w=$1}=$,eq$`)&&&$2){alarm
    3;(accept(C,S),alarm 0)?read C,$_,1e6: ($_="$, $a f".shift)}sub i{}sub t{socket
    C,2,1,6;$k{$w}&&=(connect C,&a)?print C"$, ".pop:0;close C}sub h{t"$_ i/"for
    keys%k}sub a{$w=~/:/;pack'CxnC4x8',2,$',split'.',$`}sub f{$w=$_,t"$1 $3/"for
    keys%k}sub e{open C,'>',$3;print C $'}sub g{open(C,'< ',$3)&&t"$a e$3/".;&h}

    Responder

  13. aaaaaaaa

    me falla en línea7, en el if

    if ar[2]!=”client”:
    IndexError: list index out of range

    Responder

Deja un comentario