Comparaison des performances de Python 2.7 et 3.3 avec Ackermann

$ time python ackermann.py 3 12 32765 real 2m33.121s user 2m32.518s sys 0m0.088s $ time python ackermann.py 3 12 32765 real 2m57.908s user 2m57.316s sys 0m0.068s $ time python3.3 ackermann.py 3 12 32765 real 4m6.365s user 3m18.204s sys 0m47.452s Tests effectués avec, dans l’ordre, Python 2.7.3, 2.7.4 et 3.3.1 sur cet algorithme. Nous voyons que malgré le fait que Python 3.* s’améliore (voir ce billet), Python 2.7 est toujours bien plus rapide. Ce test n’utilise pas d’itérateurs ou objets/structures complexes. Il s’agit simplement de l’implémentation naïve de la fonction d’Ackermann. Nous avions déjà fait quelques comparaisons entre différents langages.

Extraire les mots de passe de Firefox

#!/usr/bin/env python # # ffpwdcracker - Crack the passwords stored using Firefox browser. The script currently works only on Linux. # # usage: ffpwdcracker [paths_to_location_of_files] # Run it with no paramters to extract the standard Passwords from all Profiles of the current # logged in User. # Required files: # + key3.db # + signongs.sqlite # + cert8.db # are used and needed to collect the passwords. from ctypes import * import struct import sys import os import glob import re import time import base64 class SECItem(Structure): _fields_ = [('type', c_uint),('data', c_void_p),('len', c_uint)] class secuPWData(Structure): _fields_ = [('source', c_ubyte),('data', c_char_p)] (SECWouldBlock, SECFailure, SECSuccess) = (-2, -1, 0) (PW_NONE, PW_FROMFILE, PW_PLAINTEXT, PW_EXTERNAL) = (0, 1, 2, 3) def errorlog(row,path): print("----[-]Error while Decoding! writting error.log:") print(libnss.PORT_GetError()) try: f = open('error.log','a') f.write("-------------------\n") f.write("#ERROR in: %s at %s\n" %(path,time.ctime())) f.write("Site: %s\n"%row[1]) f.write("Username: %s\n"%row[6]) f.write("Password: %s\n"%row[7]) f.write("-------------------\n") f.close() except IOError: print("Error while writing logfile - No log created!") # reads the signons.sqlite which is a sqlite3 Database (>Firefox 3) def readsignonDB(userpath,dbname): if libnss.NSS_Init(userpath)!=0: print("""Error Initalizing NSS_Init,\n propably no usefull results""") print("Dirname: %s" % os.path.split(userpath)[-1]) import sqlite3 conn = sqlite3.connect(userpath + os.sep + dbname) c = conn.cursor() c.execute("SELECT * FROM moz_logins;") for row in c: print("Site: %s" % row[1]) uname.data = cast(c_char_p(base64.b64decode(row[6])), c_void_p) uname.len = len(base64.b64decode(row[6])) passwd.data = cast(c_char_p(base64.b64decode(row[7])), c_void_p) passwd.len = len(base64.b64decode(row[7])) if libnss.PK11SDR_Decrypt(byref(uname), byref(dectext), byref(pwdata)) == -1: errorlog(row, userpath + os.sep + dbname) print("Username: %s" % string_at(dectext.data, dectext.len)) if libnss.PK11SDR_Decrypt(byref(passwd), byref(dectext), byref(pwdata)) == -1: errorlog(row, userpath + os.sep + dbname) print("Password: %s" % string_at(dectext.data, dectext.len)) print("") c.close() conn.close() libnss.NSS_Shutdown() if __name__ == "__main__": # Point of entry in execution mode. ordner = sys.argv[1:] #Load the libnss3 linked file libnss = CDLL("libnss3.so") pwdata = secuPWData() pwdata.source = PW_NONE pwdata.data=0 uname = SECItem() passwd = SECItem() dectext = SECItem() for user in ordner: signonfiles = glob.glob(user+os.sep+"signons*.*") for signonfile in signonfiles: (filepath,filename) = os.path.split(signonfile) filetype = re.findall('\.(.*)',filename)[0] if filetype.lower() == "sqlite": readsignonDB(filepath,filename) else: print("Unhandled Signons File: %s" % filename) print("Skipping") J’ai trouvé ce script sur Internet et je n’ai pas modifié grand chose. Il est pratique si vous voulez récupérer vos mots de passe rapidement. Certaines personnes reposent uniquement sur la fonctionalité denregistrement de mots de passe de Firefox, ce qui peut vite devenir embêtant avec un grand nombre didentifiants si par mégarde vous perdez le fichier signongs.sqlite. De plus comme on peut le voir ici, il n’est pas très compliqué de récupérer ces informations.

L’effet Streisand

Un exemple.

Installation propre de pyAggr3g470r avec Python 3.3.1

Le script ci-dessous permet dinstaller pyAggr3g470r avec Python 3.3.1 et pip de la manière la plus propre possible. Il faudra juste penser à avoir déjà installé MongoDB sur votre distribution GNU/Linux.

Performances de Python 3.*

Bonne nouvelle, il semble que les performances de Python 3 saméliorent significativement. Nous sommes nombreux à avoir constaté un effondrement des performances surtout lors de l’utilisation ditérateurs. J’avais évoqué ce problème en comparant les temps de construction d’un arbre binaire à partir de données récupérées depuis une base MongoDB (avec pymongo). Pour mémoire le chargement de 50.563 articles dans le graphe prenait environ 0,9 secondes avec Python 2.7.3 et 12,9 secondes avec Python 3.2.3. La différence est énorme.

RFC 6901: Pointeur JSON

J’ai découvert ce RFC sur le blog de Stéphane Bortzmeyer. Un RFC plutôt intéressant qui spécifie une syntaxe afin d’accéder à un élément JSON depuis lextérieur (une URI par exemple).

Stegano fonctionne maintenant avec Pillow

La série de billets sur la stéganographie n’est pas encore terminée, une chance pour vous. Aujourd’hui nous allons découvrir le message caché de Selena Gomez. Ceci en utilisant comme toujours Stegano que j’ai porté ce soir sous Python 3. Pillow le fork amical de PIL est dorénavant usité. Globalement le portage sest fait facilement avec 2to3 et quelques modifications effectuées manuellement. Il y a encore des petits tests à réaliser (notamment à cause du changement de lopérateur division avec Python 3).

TED de Amy Purdy: Living Beyond Limits

Préparez le mouchoir.

Itérateurs: Python 2.7 vs Python 3.2

Voulant tester les performances d’une structure de donnée basée sur un arbre binaire ordonné pour pyAggr3g470r, je maperçois que les opérations sur les itérateurs sont drôlement plus lentes avec Python 3.2.3 qu’avec Python 2.7.3. Je le soupçonnais déjà, mais pas à ce point.

Trovebox

Le projet OpenPhoto se nomme dorénavant Trovebox. J’ai déjà parlé de ce projet dans le passé. La version hébergée a été mise à jour avec le nouveau thème “fabrizio1.0” qui est vraiment plus abouti que les anciennes versions. Il faut vraiment tester!