Lena

Lenna

La technique de stéganographie utilisée précédemment pour cacher un message dans une photo est très loin d’être parfaite, comme Christophe la justement fait remarquer. Elle consistait simplement à remplacer la composante rouge (un octet) de chaque pixel par la valeur ASCII d’un caractère du message à cacher. Ceci en partant du début du fichier. La transformation est la suivante:

Lenna

Lenna

Découvre le message de Lenna.

Besoin d’un indice?

import urllib
from PIL import Image

def decode_image(img):
  width, height = img.size
  msg = ""
  index = 0
  for row in range(height):
      for col in range(width):
          r, g, b = img.getpixel((col, row))
          if row == 0 and col == 0:
              msg_length = r
          elif index <= msg_length:
              msg += chr(r)
          index += 1
  return msg

urllib.urlretrieve("https://www.cedricbonhomme.org/images/blog/2014/08/Lenna_Simple_Method.png", "Lenna.png")
img = Image.open("Lenna.png")
print decode_image(img)

Google AI Challenge

Quand le challenge dIA de Google prouve par la pratique que Python est supérieur et que Java est inférieur.

pySecret

you@debian:~$ hg clone https://hg.sr.ht/~cedric/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

Planet Wars

Programmez votre bot et venez vous affronter au Google AI Challenge.

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:

“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:

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

Récemment

Quelques changements ces derniers temps. Différentes intéressantes activités.

  • après une bonne blague de deux amis (encore félicitation), j’ai enfin installé Froyo;
  • j’ai relu lexcellent article sur Xen du MISC numéro 42. Suite à cela j’ai commencé à mintéresser de plus près au sujet (enfin!);
  • si intéressant que je suis en train de lire The Book Of XEN. Excellent livre, pratique et ne se contente pas de survoler le sujet;
  • si vous jouez avec Xen, vous jouerez bien avec Qubes;
  • j’ai toujours eu un niveau de débutant avec HTML. On va s’améliorer pour HTML5. À ce qui paraît ce n’est pas dur. En plus il existe aussi de bons livres pour ça;
  • l’Irlande est un très beau pays (tiens à ce sujet je dois encore répondre à un mail ;-);
  • nouvelle fonctionnalité de pyAggr3g470r;
  • à partir de vendredi je reprends la piscine;
  • afin de conserver une certaine virginité j’ai décidé aujourd’hui de changer de nom à une fréquence d’environ cinq ans.

Petite comparaison des dernières versions de Firefox et Chrome

Environ six mois après lécriture de ce billet j’ai eu envie de faire une petite comparaison des navigateurs que j’utilise le plus souvent (à savoir Firefox et Chrome). Effectivement, ces derniers temps j’utilise divers navigateurs, de plus en plus nombreux et parfois en même temps (ce qui est embêtant pour avoir un historique et des marque-pages synchronisés).