/dev/blah

things i want to remember, things i want to share

Entries tagged “python”

quand mv et rename ne suffisent pas... python

written by tshirtman, on 11/28/11 5:49 PM.

Ayant pris une trentaine de screenshots, pour avoir un backup de mes slides pour une présentation (ce soir à la cantine, à paris, pour parler de kivy oui je prévient vachement à l’avance). j’étais un peu embété par le format de nommage par défaut de gnome, indiquant “Capture du … xx:xx:xx.png”.

J’ai réfléchis à une utilisation de rename, mais à part retirer la partie commune, je n’avançais pas beaucoup, car bien sur, je voulais en conserver l’ordre. Du coup, python à la rescousse!

# chopper toutes les images dans une variable
a = filter(lambda x: x.endswith('.png'), os.listdir('.'))
# s'assurer qu'elles sont bien dans l'ordre alphabétique (contenant l'heure, et donc, dans le bon ordre)
a.sort()
import shutil
for i, nom in enumerate(a):
    shutil.move(nom, str(i)+'.png')

 

Et voilà, les images ont un nom tout propre, et sont toujours dans l’ordre.

zine img_upload

written by tshirtman, on 10/24/11 9:20 AM.

Un autre petit plugin zine, tout simple, mais qui simplifie la vie, pour envoyer des images sur le blog pendant qu’on écrit un article.

Le fonctionnement est simple, un bouton javascript “click to upload image” est ajouté entre le formulaire de titre et de texte:

cliquer sur ce lien permet de choisir un fichier sur son disque, une fois validé, le lien vers l’image apparait en dessous du bouton javascript, y’a plus qu’a copier/coller :). Si une image du même nom existait, des caractères aléatoires sont ajoutés avant l’extension jusqu’à trouver un nom disponible, afin de ne pas écraser les images existantes.


Un panneau de configuration simple est disponible, pour configurer les deux paramètres essentiels:

  • Le dossier ou stocker les images, ce dossier dois exister, il n’y a pas de gestion d’erreurs pour l’instant, si c’est mal configuré, vous ne verrez juste pas de lien apparaitre :).
  • L’url pour accéder à ce dossier pour les clients, soit vous configurez votre hébergement pour avoir un dossier pour les fichiers statiques, soit vous vous débrouillez pour poser ce dossier dans la partie statique de zine, et vous donnez l’url correspondante.

Le code est dispo sur github: https://github.com/tshirtman/zine_upload_images.

image proxifier

written by tshirtman, on 9/11/11 4:42 PM.

Juste pour signaler un petit outil que j’ai réalisé pour dépanner une connaissance, celle ci ayant parfois “besoins” d’accéder as des images sur des domaines bloqués dans son entreprise, et qui donne l’occasion de montrer un peu de code flask. C’est ici, tout simple, ça ne marche que pour les contenus simples (image/vidéo), pas les pages complêtes, y’a sans doute moyen de faire mieux, mais c’était pour dépanner :).

zine_social

written by tshirtman, on 7/22/11 1:11 AM.

Juste pour annoncer un petit plugin zine que j’ai codé, permettant d’ajouter une barre de réseau sociaux en bas des posts de blogs, seuls google +1, le tweet this et le like de facebook sont géré pour l’instant, mais toute contribution est bienvenue, c’est vraiment juste ajouter le code du bouton avec la variable “url” à la bonne place, et zou…

Le code est dispo sur github, et vous pouvez normalement voir le résultat en dessous de ce post :)

usage de pylint

written by tshirtman, on 7/4/11 3:31 AM.

Pylint

J’ai utilisé pas mal pylint ces dernières semaines, pour me rendre compte de l’état général d’USF, et j’avoue, que c’était pas trop brillant, vu qu’il m’offrait une note généreuse de 2.5/10 environ… pour mes 11000 lignes de codes, ça promettait du boulot.

Et ben oui, d’où le “ces dernières semaines” mais je suis pas mécontent du résultat, beaucoup de namespaces ont été nettoyés, des logiques ont été simplifiées un peu partout, beaucoup de choses ont été documentés, et même certains refactoring conséquents ont été entrepris, et assez bien aboutis

Comment?

Et bien en lançant

pylint usf
à la racine du projet, bien sur (vu que le plus gros de mon code est dans le module usf), voir des cibles plus précises quand on sait qu’on a beaucoup de boulot sur un endroit.

Mais… il y a un mais, en effet, on peut, et on est en droit de ne pas être d’accord avec les opinions de pylint, sur ce qui est bon ou pas, si je suis d’accord sur le fait qu’il applique la pep8 aussi fortement que possible, le voir dénigrer map/filter/reduce, sous prétexte que Guido préfère écrire

[ x for x in S if P(x) ]
plutôt que
filter(P,S)
(parait que c’est “plus simple et plus lisible”…).
ou m’engueuler par ce que mon “i” dans
for i in items:
    i.update()
est une variable d’une lettre, je ne suis pas d’accord, il y a des endroit ou ça fais sens, et même
class Entity(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
Avoir des attributs d’une longueur de 1 caractère n’est pas un crime non plus…

Heureusement, pylint est fortement configurable, et on peut fortement influencer ses messages remontés, ainsi que sa note (héhé) en lui faisant utiliser une configuration alternative… le plus simple pour cela, est de lui faire cracher sa configuration actuelle, de la sauvegarder, et de la modifier:

pylint --generate-rcfile > pylintrc
vim pylintrc # oui, bon, le meilleur éditeur que vous avez sous la main quoi ;)
Le nommer ainsi permet à pylint de le détecter automatiquement s’il est dans le dossier courant, on peut aussi le placer dans son dossier ~/ et le nommer “.pylintrc” si on veux que ce soit le fichier de configuration par défaut.

Qu’est ce que je change (moi, vous c’est vous qui voyez à l’usage ;) ?

disable=W0201
(Warning 0201) Oui, ma classe n’est pas toujours complète au sortir du __init__, c’est notamment le cas pour toutes les classes d’un module, du fait de sa construction particulière, c’est vrai que plus d’utilisation de super() pourrait sans doute éviter ça… on verra si je réactive ce message un de ces 4, dans certains cas, cependant, c’est bien agréable de profiter du dynamisme de notre langage…
include-ids=yes
Je veux voir l’identifiant des erreurs remontées, pour pouvoir les black-lister si je ne suis pas d’accord ;) ou les comprendre en cherchant sur google, si le message n’est pas assez clair (ça n’arrive pas souvent :)).
attr-rgx=[a-z_][a-z0-9_]{0,30}$

argument-rgx=[a-z_][a-z0-9_]{0,30}$

variable-rgx=[a-z_][a-z0-9_]{0,30}$
la regex qui valide les noms de variables locale, d’attribut ou d’argument passé à un callable, afin d’autoriser les noms d’une lettre, comme dit plus haut (à noter que connaître un peu les regexp, ça sert trèèèès souvent… ;))
bad-functions=apply,input,exec,eval
par ce que la prog fonctionnelle (filter/map/reduce) je ne vois pas de raisons de m’en priver…

Voilà, je change pas grand chose en fait, c’est plutôt bon signe :).

Conclusion?

ma note actuelle? ;)

[SNIP]


Report
======
3763 statements analysed.

Messages by category
--------------------

+-----------+-------+---------+-----------+
|type       |number |previous |difference |
+===========+=======+=========+===========+
|convention |103    |103      |=          |
+-----------+-------+---------+-----------+
|refactor   |55     |55       |=          |
+-----------+-------+---------+-----------+
|warning    |58     |58       |=          |
+-----------+-------+---------+-----------+
|error      |6      |6        |=          |
+-----------+-------+---------+-----------+

[SNIP]


Global evaluation
-----------------
Your code has been rated at 9.35/10 (previous run: 9.35/10)

[SNIP]
Et oui, il manque encore des docstrings, notamment en entête de fichiers, mais ça progresse…

usf 0.1.6

written by tshirtman, on 5/8/11 7:27 PM.

L’équipe de développement d’ultimate-smash-friends, a la joie et le bonheur d’annoncer une nouvelle version du projet, apportant son lot d’améliorations :), et enfin depuis longtemps, une nouvelle version synchronisé entre les différentes plateformes supportées (Linux/Windows/MacOsX).

Pour récapituler les changements depuis la dernière version, on pourras noter une sensible améliorations de l’intelligence artificielle (qui commence à me donner des difficulter pour gagner les parties, c’est bon signe :)), la correction d’un bug bloquant sous windows vista/seven (mauvaise placement du fichier de log), et un meilleur installeur pour windows (propose en option les installation de python/pygame/numpy, qui sont nécessaire pour jouer.

Sans plus attendre, les liens vers les différents packages!

Bien sur, les rapports de bugs sont toujours les bienvenues ici: https://bugs.launchpad.net/ultimate-smash-friends

Mise à jours: Correction du fichier tar.gz, correction de l’installeur windows, les raccourcis n’étaient pas fonctionnels.

zine_ad_sense

written by tshirtman, on 4/22/11 12:05 AM.

Juste par ce que je suis pas mécontent, je viens de coder un plugin ad_sense pour zine, et qu’il marche pas trop mal :) et ça ne m’a prit que la soirée, lol.
Donc c’est , et ça me rendra surement pas riche, mais ça peut pas franchement faire de mal :), et peut être que ça intéressera d’autres personnes

Pour installer, c’est facile, aller dans “parts/zine/lib/zine/plugins/” et

git clone git://github.com/tshirtman/zine_ad_sense.git
Relancer zine, vous devriez le trouver dans les plugins et pouvoir l’activer, ce qui fera apparaitre un onglet “Ad sense” dans la barre de menu des options, et vous permettra de donner les paramètres d’une bannière ad sense, précédemment créée, qui apparaitra alors sous environ 50% de vos postes (c’est aléatoire).

recaptcha

written by tshirtman, on 4/15/11 2:14 PM.

Pourquoi j’en viens à embéter mes rares commentateurs avec des mots difficiles à lire…

Ce blog recevant actuellement beaucoup plus de spams que de commentaires réels, je m’étais codé un petit plugin permettant de placer automatiquement en spam, les messages y ressemblant, avec une grosse liste de mot clés, un systeme de points, bref, ça choppait environ 99% du spam, mais il entrait en base quand même, celle ci étant un tinysql, il valait donc mieux la vider régulièrement et bon, ça restait du boulot.

Du coup, j’ai finit par chercher et trouver, un plugin recaptcha pour zine, et à l’installer, manque de bol, par défaut, il ne marchait pas, vu qu’il dépends d’un patch remonté (par l’auteur du plugin recaptcha, comme c’est bizarre :]), qui corrige un bug tout bête.

donc, en se plaçant dans “parts/zine/lib/zine”

patch -p1 < before-comment-created-2.patch
bon, un chunk du patch échoue, mais c’est pas trop grave, on ajoute à la main
from itertools import chain
dans “zine/forms.py”

Donc, pour installer zine-recaptcha

C’est assez simple, je me suis placé dans “parts/zine/lib/zine/plugins” et j’ai fait un simple:

hg clone https://bitbucket.org/arteme/zine-recaptcha

redémarrer zine, activer le plugin, aller chercher une clée d’API sur recaptcha.net, et dire au plugin d’afficher une erreur si echec de validation du captcha (pour ne pas encombrer la base).

Et ce coup ci, je crois qu’ils s’en remettrons pas, les spams :D, bon, je laisse mon filtre borg en place, au cas ou, mais ça va mieux là :D

multi.py

written by tshirtman, on 4/11/11 6:02 PM.

Juste un petit script réalisé aujourd’hui pour une demande, permet d’executer une commande dans tous les sous dossiers d’un dossier…

#!/usr/bin/env python
import sys
import os
import commands

def usage():
    print "usage:"
    print sys.argv[0], "command"
    print """
    will execute the command in every direct subdirectory of the current
    directory, and print the result
    """

def main(command):
    for i in os.listdir('.'):
        if os.path.isdir(i):
            os.chdir(i)
            print commands.getoutput(' '.join(command))
            os.chdir('..')

if __name__ == '__main__':
    if len(sys.argv) < 2 or sys.argv[1] in ('-h', '--help'):
        usage()
    else:
        main(sys.argv[1:])

Ça peut servir, j’avais un alias zsh pour faire ça, mais y’a toujours des cas un peu foireux, sh c’est un peu juste pour ce genre de choses, donc bon, autant sortir python et faire un truc propre. Et puis bon, ça peut servir d’exemple d’utilisation de commands, et des fonctions d’os.

usf 0.1.4

written by tshirtman, on 4/10/11 9:19 PM.

Je viens de soumettre ultimate-smash-friends à pypi (mais l’archive, trop grosse, à été rejeté, on peut donc la trouver ), et de créer un deb pour ubuntu, dans les nouveautés, on peut noter principalement de grosses optimisations, et une grosse amélioration de l’AI (qui devient enfin intéressante à affronter).

Bon, c’est toujours de l’alpha, mais, je pense que mon boulot sur l’ai va sérieusement simplifier le boulot pour le mode réseau, mais je promet pas que ça sera rapide, une IA correcte à quand même attendu 2ans pour voir le jour…

Voilà, si ça intéresse des gens de tester, et de faire des retours, c’est tout à fait bienvenu, en espérant que ça vous plaise.