pySecret

you@debian:~$ hg clone http://bitbucket.org/cedricbonhomme/pysecret
you@debian:~$ ipython
In [1]: from pysecret import permutation
In [2]: permutation.encrypt("Python est un très bon language!", [2,4,0,1,3])
Out[2]: 'toPyhetn snt u \xa8 r\xc3snlbo gaanu!XgeX'
In [3]: print permutation.decrypt(permutation.encrypt("Python est un très bon language!", [2,4,0,1,3]), [2,4,0,1,3])
Python est un très bon language!XX
In [4]: from pysecret import rsa
In [5]: rsa_cipher = rsa.RSA()
In [6]: rsa_cipher.decrypt_text("eJwNjrsRw1AMw3pPksonUqQ+O3gJ9ymyf5VXEzjw8/3hehgloJwwmO0eAxFFbW8oc7MrpyowuWLk\nmZVuzn
AstTCUcppNL1yaQcoQNx1NxbSPq8YUaCzqEO6UVMsk4mSb54lI1kmsn+u9/9cOIaE=")
Out[6]: 'Il reste encore beaucoup de travail!'
In [7]: exit()
Do you really want to exit ([y]/n)? y
you@debian:~$ ls -l pysecret/
total 140
-rwx------ 1 you you  1356 2010-09-26 18:23 afine.py
-rwx------ 1 you you   883 2010-09-26 18:24 autokeycipher.py
-rwx------ 1 you you   774 2010-09-26 18:06 cesar.py
-rwx------ 1 you you 35146 2010-04-29 22:32 COPYING
-rwx------ 1 you you  1921 2010-09-26 18:19 elgamal.py
-rwx------ 1 you you  1299 2010-09-26 18:21 hill.py
-rwx------ 1 you you     2 2010-09-26 18:14 __init__.py
-rwx------ 1 you you  1629 2010-09-26 18:26 permutation.py
-rwx------ 1 you you  1704 2010-09-26 18:26 rabin.py
-rwx------ 1 you you  6402 2010-09-26 18:07 rsa_gui.py
-rwx------ 1 you you  3824 2010-09-26 18:26 rsa.py
-rwx------ 1 you you   908 2010-09-26 18:28 substitution.py
-rwx------ 1 you you 10420 2010-09-26 18:28 utils.py
-rwx------ 1 you you  2234 2009-02-26 22:06 vigenere.py

Sauvegarder les données de valeurs

Le billet précédent expliquait de manière simplifiée comment j’ai lâchement abandonné Mandriva. Grossièrement je disais qu’il a suffit de:

  • taper sudo rm -Rf ~/.*;
  • formater ma racine (de 8 Go);
  • installer KUbuntu.

Évidemment avant de supprimer mes fichiers de configurations j’ai du me préparer un minimum. Mais tout de même, sur ce coup j’ai été bourrin. Les seuls fichiers auxquels j’ai fais attention sont:

  • mes clés GPGs;
  • mes mails;
  • mes flux de nouvelles;
  • mes contacts.

C’est tout.

Vincent a raison. Cependant comme je l’explique, les données de configurations ne m’intéressent pas vraiment.

Et ce que je constate, malheureusement, c’est que le même problème se pose toujours à moi: je n’ai ni NAS, ni disque dur en réseau.

Je produis de plus en plus de données. Voyez avec les photos (et je ne parle pas des videos, musiques, même codes sources et autres fichiers de valeur):

  • 1973: 1 photo;
  • 1980: 7 photos;
  • 1985: 14 photos;
  • 1999: 35 photos;
  • 2005: 249 photos;
  • 2008: 822 photos;
  • 2010: 2500 photos exactement.

Quasiment exponentiel. Ça peut paraître drôle mais c’est un vrai problème pour moi. Je pense qu’un NAS serait une bonne solution. Mon problème principal: le prix. Ensuite il y a la place et éventuellement le bruit.

Ma question, cher lecteur, comment sauvegardes tu les centaines de Go de données que tu produis chaque années ?

S’il te plaît, ne me propose pas de services en ligne. J’aimerai maîtriser au plus mes données à long terme. Est-ce être “démodé“?

“Bye bye Mandriva! let me know when it’s fixed”

Mandriva Linux pour moi c’est:

  • une distribution GNU/Linux;
  • une distribution de qualité (avec drakxtools);
  • une bonne intégration de KDE;
  • déjà une longue histoire.

Mandriva pour moi c’est:

  • une société française avec un blog où on ne fait que se voiler la face;
  • une société où il faut faire un rapport de bug pour avoir des nouvelles de la direction;
  • du marketing à deux sous;
  • un manque de transparance.

Résultat:

  • un avenir incertain;
  • sudo rm -Rf ~/.* et ré-installation de la racine, hier soir.

Gestion chronologique des nouvelles

Vous rappelez vous du billet qui présentait comme il est simple de générer des nuages de tags avec Python?

Je viens de modifier un petit peu la fonction tag_cloud(). Les changements (pas grand chose):

Ce que cela apporte à pyAggr3g470r:

Il est donc maintenant possible de parcourir les articles par années et par mois. D’autres nouvelles captures.

Je suis content de la fonction tag_cloud() car elle génère trois types de nuages de tags:

  • triés sur les années (chronologiquement) pour l’historique;
  • triés sur les mois (chronologiquement) pour l’historique;
  • triés sur les mots (alphabétiquement) pour la page management.

La détection des erreurs URL est en cours d’introduction. pyAggr3g470r 2.0 arrive ;-)

Voilà. Une nouvelle fonctionnalité. Peu de nouvelles lignes de code. On voit avec Java?

Erreurs URL

Lorsque l’on développe une application utilisant des ressources Web il est agréable de pouvoir tester la disponibilité de ces dernières.
Dans le cas d’un agrégateur ne pas tester les codes erreurs du module urllib2 peut faire perdre du temps au lecteur. En effet il arrive que l’adresse d’un blog/flux change. Il peut aussi s’écouler un certain temps avant que le lecteur constate que l’agrégateur n’apporte plus de nouvelles provenant d’un site (parmi quelques centaines peut être). Et là le lecteur pourrait devoir rattraper plusieurs semaines de nouvelles. Le pauvre.
Aussi cela aurait pour effet de laisser des threads utiliser des ressources inutilement, appeler le parser inutilement, tenter de créer une connexion inutilement, etc.
Un agrégateur (le mien en tout cas) demande beaucoup de bande passante (bien que ponctuellement).

Les bons agrégateurs comme aKregator testent cela et préviennent l’utilisateur (via une petite icône pour chaque flux). Ainsi pyAggr3g470r va bientôt permettre au lecteur de consulter à sa demande les sites ne répondants plus (et pour qu’elle raison). Un test sera aussi effectué avant d’appeler le module feedparser et un message avertira clairement qu’un ou plusieurs flux n’a pas été récupéré.
Ceci grâce à cette fonction (sera certainement utilisée dans la version 2.0):

def detect_url_errors(list_of_urls):
    """
    Detect URL errors.
    """
    errors = []
    for url in list_of_urls:
        req = urllib2.Request(url)
        try:
            urllib2.urlopen(req)
        except urllib2.HTTPError, e:
            # server couldn't fulfill the request
           errors.append((url, e.code, \
                BaseHTTPServer.BaseHTTPRequestHandler.responses[e.code][1]))
        except urllib2.URLError, e:
            # failed to reach the server
            errors.append((url, e.reason.errno ,e.reason.strerror))
    return errors

En passant la version 1.9 de pyAggr3g470r vient de sortir, l’annonce. La récupération du contenu des articles se fait de manière plus intelligente. Voir ce commit (si vous voulez des explications détaillées…). Ma base SQLite d’environ 10Mo contient près de 5000 articles exportables en texte brut ou HTML. Tout va bien ;-)