Ah, je viens de réussir à le faire passer à 511 octets, je suis sous la barre des 512 octets, je suis joie.
Je mettrai le code à jour ce soir.
Ah, je viens de réussir à le faire passer à 511 octets, je suis sous la barre des 512 octets, je suis joie.
Je mettrai le code à jour ce soir.
Dans le print( content type ) avec des fstrings tu gagnes un car
J’en gagne même 3 j’ai l’impression ! Merci
dépôt à jour : 507 octets
dépôt à jour : 469 octets
Super! pour ceux qui ne connaissent pas les incantations necessaires, il faut
/cgi-bin/rikiki.py
python -m http.server --bind localhost --cgi 8000
a la ligne de commandeComme le dis la PEP 8, la lisibilité ça compte de temps en temps
Du coup, @Mindiell tu peux gagner une espace avant les deux for et le if vu qu’ils sont précédés de crochet ou parenthèse.
J’ai fait une tentative en utilisant http.server
, ce qui permet de se passer d’un conteneur CGI (obsolète) pour exécuter le wiki.
Ma première version fait 657 octets, mais je pense qu’on peut améliorer les choses (il est 4h du matin, mon cerveau ne réfléchit plus assez bien), n’hésitez pas à apporter votre contribution.
Les problèmes que j’ai recontré (et potentiellement résolus au prix de plus de code) sont :
http.server
est assez “bas niveau” et ne gère que des bytes, obligé d’utiliser .decode()
à la sortie et .encode()
à la saisie, ainsi que de devoir préciser une balise <meta charset=utf-8>
.urllib.parse
pour parser les données du formulaire, comme c’est encore une fois assez “bas niveau” je reçois les données sous forme d’un query string que je ne peux pas enregistrer et/ou restituer tel quel._
contenant {}
à la racine du script. J’ai essayé de réfléchir pour créer ET lire le fichier à l’entrée, mais à moins d’utiliser des try/except
ou d’avoir recours à os.path.exists()
, je n’ai pas trouvé de solution satisfaisante.Voici le code minifié :
import re as r
import json as j
import http.server as h
import urllib.parse as u
d=j.load(open("_"));c="Content-"
def g(s):
s.send_response(200);s.send_header(c+"Type","text/html");s.end_headers();t=d.get(s.path,"");v=r.sub(r"/(\w+)",r"<a href=/\1>\1</a>",r.sub(r"\n","<br>",t,r.M),r.M);s.wfile.write(f"<meta charset=utf-8><p>{v}</p><form method=POST><textarea name=t>{t}</textarea><input type=submit></form>".encode())
def p(s):
d[s.path]=u.parse_qs(s.rfile.read(int(s.headers[c+"Length"])).decode())["t"][0];j.dump(d,open("_","w"));g(s)
H=type("",(h.BaseHTTPRequestHandler,),{"do_GET":g,"do_POST":p})
h.HTTPServer(("0.0.0.0",8000),H).serve_forever()
EDIT: Cerise sur le gâteau, on a même le droit à un logging embarqué sans effort supplémentaire.
J’avais même pas vu cette feature, je vais voir pour faire ce week end.
Je prends un peu plus de plomb dans l’aile avec les backlinks, je tombe à 724 octets.
Qui peut améliorer mon truc ?
import re as r
import json as j
import http.server as h
import urllib.parse as u
d=j.load(open("_"));c="Content-";a=r"/(\w+)";b=r"<a href=/\1>\1</a>"
def g(s):i=s.path;s.send_response(200);s.send_header(c+"Type","text/html");s.end_headers();t=d.get(i,"");v=r.sub(a,b,r.sub(r"\n","<br>",t,r.M),r.M);l="<br>".join(r.sub(a,b,k) for k in d if i in d[k]);s.wfile.write(f"<meta charset=utf-8><p>{v}</p><form method=POST><textarea name=t>{t}</textarea><input type=submit></form>{l}".encode())
def p(s):d[s.path]=u.parse_qs(s.rfile.read(int(s.headers[c+"Length"])).decode())["t"][0];j.dump(d,open("_","w"));g(s)
H=type("",(h.BaseHTTPRequestHandler,),{"do_GET":g,"do_POST":p})
h.HTTPServer(("0.0.0.0",8000),H).serve_forever()
tu peux gagner qq bytes sur les imports:
import re as r,json as j,http.server as h,urllib.parse as u
Bien vu, on tombe à 700 octets tout rond.
import re as r,json as j,http.server as h,urllib.parse as u
d=j.load(open("_"));c="Content-";a=r"/(\w+)";b=r"<a href=/\1>\1</a>"
def g(s):i=s.path;s.send_response(200);s.send_header(c+"Type","text/html");s.end_headers();t=d.get(i,"");v=r.sub(a,b,r.sub(r"\n","<br>",t,r.M),r.M);l="<br>".join(r.sub(a,b,k) for k in d if i in d[k]);s.wfile.write(f"<meta charset=utf-8><p>{v}</p><form method=POST><textarea name=t>{t}</textarea><input type=submit></form>{l}".encode())
def p(s):d[s.path]=u.parse_qs(s.rfile.read(int(s.headers[c+"Length"])).decode())["t"][0];j.dump(d,open("_","w"));g(s)
H=type("",(h.BaseHTTPRequestHandler,),{"do_GET":g,"do_POST":p})
h.HTTPServer(("0.0.0.0",8000),H).serve_forever()
641 octets:
type()
for
.import re as r,json as j,http.server as h,urllib.parse as u
d=j.load(open("_"))
c="Content-"
a=r"/(\w+)"
b=r"<a href=/\1>\1</a>"
def g(s):i=s.path;s.send_response(200);s.send_header(c+"Type","text/html");s.end_headers();t=d.get(i,"");v=r.sub(a,b,r.sub(r"\n","<br>",t,r.M),r.M);l="<br>".join(r.sub(a,b,k)for k in d if i in d[k]);s.wfile.write(f"<meta charset=utf-8><p>{v}</p><form method=POST><textarea name=t>{t}</textarea><input type=submit>{l}".encode())
def p(s):d[s.path]=u.parse_qs(s.rfile.read(int(s.headers[c+"Length"])).decode())["t"][0];j.dump(d,open("_","w"));g(s)
class H(h.BaseHTTPRequestHandler):
do_GET=g
do_POST=p
h.test(H)
637 octets si ça ne gêne personne que le fichier de donnée s’appelle “Content-”:
import re as r,json as j,http.server as h,urllib.parse as u
c="Content-"
d=j.load(open(c))
a=r"/(\w+)"
b=r"<a href=/\1>\1</a>"
def g(s):i=s.path;s.send_response(200);s.send_header(c+"Type","text/html");s.end_headers();t=d.get(i,"");v=r.sub(a,b,r.sub(r"\n","<br>",t,r.M),r.M);l="<br>".join(r.sub(a,b,k)for k in d if i in d[k]);s.wfile.write(f"<meta charset=utf-8><p>{v}</p><form method=POST><textarea name=t>{t}</textarea><input type=submit>{l}".encode())
def p(s):d[s.path]=u.parse_qs(s.rfile.read(int(s.headers[c+"Length"])).decode())["t"][0];j.dump(d,open(c,"w"));g(s)
class H(h.BaseHTTPRequestHandler):
do_GET=g
do_POST=p
h.test(H)
Et au maximum de la minification, ça donne ça :
import re as r,json as j,http.server as h,urllib.parse as u
d=j.load(open("_"));c="Content-";a=r"/(\w+)";b=r"<a href=/\1>\1</a>"
def g(s):i=s.path;s.send_response(200);s.send_header(c+"Type","text/html");s.end_headers();t=d.get(i,"");v=r.sub(a,b,r.sub(r"\n","<br>",t,r.M),r.M);l="<br>".join(r.sub(a,b,k)for k in d if i in d[k]);s.wfile.write(f"<meta charset=utf-8><p>{v}</p><form method=POST><textarea name=t>{t}</textarea><input type=submit>{l}".encode())
def p(s):d[s.path]=u.parse_qs(s.rfile.read(int(s.headers[c+"Length"])).decode())["t"][0];j.dump(d,open("_","w"));g(s)
class H(h.BaseHTTPRequestHandler):do_GET=g;do_POST=p
h.test(H)
En vrai, c’est presque élégant.
569:
import re as r,json as j,http.server as h,urllib.parse as u
c="Content-"
d=j.load(open(c))
a=r"/(\w+)"
b=r"<a href=/\1>\1</a>"
def g(s):i=s.path;s.send_response(200);s.send_header(c+"Type","text/html");s.end_headers();t=d.get(i,"");v=r.sub(a,b,t);l=[r.sub(a,b,k)for k in d if i in d[k]];s.wfile.write(f"<pre>{l}<p>{v}</p><form method=POST><input type=submit><textarea name=t>{t}".encode())
def p(s):d[s.path]=u.parse_qs(s.rfile.read(int(s.headers[c+"Length"])).decode())["t"][0];j.dump(d,open(c,"w"));g(s)
class H(h.BaseHTTPRequestHandler):do_GET=g;do_POST=p
h.test(H)
On perd le support de l’UTF-8 dans cette version.
Comment ça en 2023 un navigateur à jour privilégie latin-1 à UTF-8 ? Tristesse.
Bon bah 496 octets :
import re,json as j,http.server as h
d=j.load(open("_"))
a=r"/(\w+)",r"<a href=/\1>\1</a>"
def g(s):i=s.path;t=d.get(i,"");v=re.sub(*a,t);l=[re.sub(*a,k)for k in d if i in d[k]];s.error_message_format=f"<pre>{l}<p>{v}</p><form method=POST><input type=submit><textarea name=t>{t}";s.send_error(200)
def p(s):d[s.path]=h.urllib.parse.parse_qs(s.rfile.read(int(s.headers["Content-Length"])).decode())["t"][0];j.dump(d,open("_","w"));g(s)
class H(h.test.__defaults__[0]):do_GET=g;do_POST=p
h.test(H)
Hum, qui osera :
class H(getattr(h,dir(h)[0])):
pour gagner 2 caractères ?
You did.