Je me suis mis depuis quelques mois à Python. Il y a énormément de choses très appréciables dans le langage et sa logique. À vrai dire, plus le temps passe, et moins je lui trouve de points faibles. Sûrement le début d’une longue série d’articles, de tous niveaux.

Mais en attendant, je vais ici relater mon premier bout de code un petit peu « tricky ». Python propose un lot de méthodes pour accéder aux répertoires/fichiers : os.listdir, walk… Mais ces méthodes ont le défaut de retourner une liste construite des éléments. Du coup, lorsque le temps de traitement devient critique, on aimerait bien pouvoir itérer directement sur les descripteurs de fichiers sans attendre une liste de potentiellement 10 000 éléments. Bref, la possibilité d’accéder aux fonctions Posix opendir() et readdir().

Le soucis ? Python ne propose pas ces fonctions. Mais il y a la possibilité d’accéder à des API du langage C, et dans un environnement Unix, on y retrouve nos chères fonctions si convoitées ! Après avoir étudié cette piste, voilà un snippet fort utile :

#!/usr/bin/python
from ctypes import CDLL, c_char_p, c_int, c_long, c_ushort, c_byte, c_char
from ctypes import Structure, POINTER
from ctypes.util import find_library

class c_dir(Structure):
    """ Defined C struct DIR """
    pass

class c_dirent(Structure):
    """ Directory entry structure equivalent """
    _fields_ = (
        ('d_ino', c_long),  # inode number
        ('d_off', c_long),  # offset to the next dirent
        ('d_reclen', c_ushort), # length of this record
        ('d_type', c_byte),  # type of files; os specific
        ('d_name', c_char * 4096) # filename
        )

c_dirent_p = POINTER(c_dirent)
c_dir_p = POINTER(c_dir)
c_lib = CDLL(find_library("c"))

opendir = c_lib.opendir
opendir.argtypes = [c_char_p]
opendir.restype = c_dir_p

readdir = c_lib.readdir_r
readdir.argtypes = [c_dir_p]
readdir.restype = c_dirent_p

closedir = c_lib.closedir
closedir.argtypes = [c_dir_p]
closedir.restype = c_int

def listdir(path):
    """
    A generator to return the names of files in the directory passed in
    """
    dir_p = opendir(".")
    try:
        while True:
            p = readdir(dir_p)
            if not p:
                break
            yield p.contents.d_name
    finally:
        closedir(dir_p)

Attention, listdir() retournera les répertoires « . » et « .. » ! Notez l’utilisation du yield pour définir ici un générateur (sujet d’un autre article). De ce fait, notre fonction s’utilise comme cela :

if __name__ == "__main__":
    for name in listdir("."):
        print name

En espérant que ça puisse servir à quelqu’un d’autre…

Développer plus efficacement

Comme promis, je vous fais part sur Ze-Technology d’un article que j’ai eu l’occasion d’écrire il y a un an de ça, paru dans le magazine PHP Solutions. Cet article est lié à l’utilisation de la bibliothèque XDebug afin de développer plus efficacement en PHP.

Au programme : configuration de l’IDE, debugging, profiling. Pour ceux qui utilisent encore des echo à tout bout de champs…

Télécharger un document

Et oui, encore et toujours du symfony. Que voulez-vous, ce framework déjà bien avancé et encore très prometteur possède une bonne actualité.

Les slides présentés sont disponibles, une bonne occasion pour les absents comme pour les absents de retracer ce qui a été abordé. Au programme, pas mal de sujets, dont les tests unitaires et fonctionnels, déjà abordés au sein de ZT. On y retrouve également l’avenir avec symfony 2 (qui s’écrit dorénavant avec une majuscule), des bonnes pratiques, ou le retour d’expérience très formatteur de Dailymotion. Et ce n’est pas tout, je vous invite à vous  rendre directement sur les liens ci-dessus pour profiter de ces précieuses ressources.

Il peut être utile de proposer au sein d’une application web des petites bulles d’aides permettant de donner des indications à l’utilisateur, sans forcément surcharger inutilement la page. J’ai disposé quelques tooltips au sein de Piwam, pour venir expliquer le fonctionnement de certains champs de formulaire.


Il y a plein de manières de faire, avec du Javascript plus ou moins complexe, avec les frameworks / bibliothèques Ajax dernier cris… Mais la plupart du temps, inutile de se compliquer la vie.BoxOver fonctionne avec un seul fichier Javascript (12 ko) à inclure, et un poil de CSS. L’exploitation de BoxOver est on ne peut plus simpliste et se fait en HTML simple :

Pour afficher un point d’interrogation avec une bulle d’aide qui apparaît lorsque la souris passe dessus, cela nous donne :

<a href="#" title="header=[titre de la bulle d'aide] body=[le contenu de la bulle d'aide]">?</a>

Facile n’est-ce pas ? Ce choix fait suite à un essai d’une grande liste de solutions du genre. Je l’ai adopté et adapté pour en faire un helper sous symfony qui me permet de les disposer dans mes vues. BoxOver vous permet d’afficher des tooltips sur tout type d’élément. Le site de BoxOver.

Voici un nouveau concept qui m’aidera tant bien que mal à tenir ZT un minimum à jour. Chaque semaine, un site web sera mis en avant. Pour ses services, pour sa conception, sa nullité, sa marantitude, son graphisme, son contenu…. En essayant de ne pas tomber dans les sites ultra-connus qui n’ont nullement besoin de se faire connaître davantage. Cette semaine, faisons si vous les voulez bien le tour d’Abduzeedo.


Un site web qu’il est bien pour les graphistes, les webdesigners, et dans une moindre mesure les photographes. On y retrouve 2 ressources fondamentales – et qui font tout le succès du site :

  • Des tutoriaux d’une prodigieuse qualité. Photoshop, Fireworks, Illustrator, photographie, techniques générales, vidéos… tout y passe, avec des rendus de très haute qualité.

  • Une rubrique daily inspiration. Chaque jour, on a le droit a un cocktail de ressources (comprenez : site web, affiche, produit de consommation, photo…) potentiellement source d’inspiration. De quoi ne jamais tomber en manque de ressources !

L’adresse de ce site au nom inretenable ? http://abduzeedo.com.