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

13 comentarios en «TinyP2P, un programa P2P en 15 líneas de código»

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

    Me quedo con lo que comomentaba Tuxiradical…

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

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

  4. 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…

  5. 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)

  6. 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 a Jose P. Cancelar respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.