Blog // Exirel.me

Multi-Db avec Zend

Dans Technique par Florian Strzelecki - 18:20 - 07.10.2011

Tags : Framework, Web, Documentation, Programmation, PHP, SQL, loldev, Zend Framework

Depuis que je travaille avec le Zend Framework (et ce n'est définitivement pas par passion ni envie), je ne passe pas une semaine sans avoir besoin d'aller voir dans le code source du framework pour comprendre ce qu'il fait, pourquoi, comment, et en quel honneur.

Et généralement, je me marre - enfin pas vraiment, mais faites comme si.

Cette semaine pour le #loldev du vendredi, c'est la documentation qui m'a donné l'info qui me manquait pour résoudre un problème qui n'est pas trivial à l'origine, mais qui devrait l'être avec un framework web digne de ce nom : comment gérer une application qui doit se connecter à différentes bases de données ?

En voilà une question intéressante... voici ma réponse.

Pages and pages of source code.

Image : Pages and pages of source code. - Neil Crosby (http://www.flickr.com/photos/thevoicewithin/) - Creative-Common By-NC-SA

Lire la suite - 1 commentaire

Dédoublonner un tableau de tableau en php

Dans Technique par Florian Strzelecki - 14:01 - 30.09.2011

Tags : Documentation, Programmation, PHP, Optimisation, loldev

Halala... le array_unique est définitivement une fonction trompeuse de php. Pourquoi ? Parce que son mode de dédoublonnage par défaut est SORT_STRING, et pas SORT_REGULAR. D'ailleurs, c'est d'autant plus un problème que ce fut le cas en PHP 5.2.9, puis retour arrière en PHP 5.2.10.

Note : documentation php de array_unique.

Le #loldev du vendredi nous vient donc de cette petite fonction. En voici l'exemple :

$res = array(
        array('id' => 2),
        array('id' => 3907),
        array('id' => 7814),
        array('id' => 2),
    );
$unique = array_unique($res);
var_dump($unique);

// Résultat :
// array(0 => array('id' => 2));

Ce qui est un problème, puisque le but, c'est seulement de virer la deuxième ligne, comme il a été fait dans l'exemple suivant :

$id = array();
foreach ($res as $idRes) {
    $id[] = $idRes['id'];
}
$id = array_values(array_unique($id));

Donc, oui, cela fonctionne et on obtient bien un tableau dédoublonné par la valeur de la clé 'id' de chaque tableau. Heureusement, il y a mieux aujourd'hui.

Ce code provient d'une application pré-5.2.9, où le flag "SORT..." n'existait tout simplement pas. Ce n'est donc pas la faute du pauvre développeur qui a dû trouver à l'époque une solution qui fonctionne ! Je n'aurais pas aimer être à sa place.

Car aujourd'hui, il suffit d'écrire ceci :

$res = array_unique($res, SORT_REGULAR);

Pour dédoublonner le tableau. Simple, efficace. Mais il aura fallu attendre PHP 5.2.9 pour pouvoir le faire !

Remarque : suite à des remarques, voici le pourquoi du comment SORT_STRING pose problème :

Par défaut array_unique transforme en string le contenu de chaque élément du tableau, donc (string) array(...) ça donne "Array". Donc il trouve que le tableau de tableau, c'est un array de 'Array', 'Array', 'Array', ... qui sont donc des éléments identiques, et ne retourne que le premier élément.

Logique, imparable, mais particulièrement pénible.

Lien permanent - 4 commentaires

Svn Id dans un template

Dans Technique par Florian Strzelecki - 11:11 - 19.08.2011

Tags : Web, Documentation, Programmation, Bonne pratique

Parfois j'y pense (et parfois j'oublie) : utiliser la propriété svn "svn:keywords" sur les fichiers, en utilisant tout particulièrement Id, et de temps en temps Author et Date (mais cela dépend du projet et des conventions de l'équipe).

Pour ceux qui ne connaissent pas, il s'agit d'une propriété que l'on peut mettre sur un fichier versionné avec svn (et pas un répertoire), de cette façon là :

svn propset svn:keywords "Id" fichier

Ensuite, dans le fichier, n'importe où (de préférence en entête du fichier, dans les commentaires), il suffit d'écrire ceci :

$Id$

Au commit du fichier, ceci sera remplacé par quelque chose comme :

$Id: Fichier 7814 2011-08-19 07:49:47Z Exirel $

En général, je pense à le mettre sur des fichiers de code, mais pratiquement jamais sur mes templates. Pourtant, c'est tout aussi pratique, surtout lorsque le template a plus d'importance que la façon de récupérer les données (ce qui est parfois une opération tout à fait triviale).

Du coup, au début de tous mes fichiers de template avec php, je mets ceci :

<?php /* @version $Id$ */ ?>

Avec smarty, je mets ceci :

{* @version $Id$ *}

Et avec django, je mets ceci :

{% comment %}
(...)
  - Version : $Id$
(...)
{% endcomment %}

Parfois, je me demande encore comment je peux oublier ça. Peut-être parce que je devrais l'automatiser, et plus le faire à la main ? Je dois être trop nostalgique de la ligne de commande...

Lien permanent - Commentez l'article

perl: warning: Setting locale failed.

Dans Technique par Florian Strzelecki - 16:25 - 03.07.2011

Tags : Documentation, Ordinateur, Charset

En plein dans une installation d'un serveur sous Ubuntu 10.04 LTS (32 bits), j'ai eu cette erreur, qui m'était déjà arrivée il y a bien longtemps sur une Ubuntu 9.04 :

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LANG = "fr_FR.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

Pour la résoudre, deux choses :

  1. Installer le paquet "language-pack-fr"
  2. Lancer la commande sudo dpkg-reconfigure locales

Et c'est tout, ni plus, ni moins. Faut juste y penser, et je me le note là autant pour le partager que pour m'en souvenir.

Edit : Pour info, l'install s'est très bien passée.

Lien permanent - Commentez l'article

data.decode('UTF8')

Dans Technique par Florian Strzelecki - 16:00 - 19.05.2011

Tags : Python, Documentation, Programmation, Bonne pratique

Gérer du texte est parfois (souvent) un véritable casse-tête quand des problèmes d'encodage de caractères pointent le bout de leur nez. Alors, pour avoir perdu bien trop de temps, je m'écris un article "marque-page" pour me rappeler que, bordel, voilà comment récupérer les données d'un fichier en UTF-8, les traiter avec Markdown, puis écrire le tout dans un fichier.

import markdown

f = open('fichier.txt', 'r')
data = f.read()
f.close()

html = markdown.markdown(data.decode('UTF8'))

h = open('fichier.html', 'w')
h.write(html.encode('UTF8'))
h.close()

L'idée, c'est de "décoder" la chaîne qui est à l'origine en UTF-8 vers de l'Unicode, puis la traiter comme je le souhaite (ici avec Markdown), puis de l'encoder en UTF-8 pour l'écrire dans un fichier. Voilà.

Simple, efficace, mais il faut y faire scrupuleusement attention, sous peine de se prendre ce genre d'erreur :

UnicodeEncodeError: 'ascii' codec can't encode character

Lien permanent - Commentez l'article

Je mets à jour mon wordpress avec python-fabric.

Dans Technique par Florian Strzelecki - 13:32 - 15.03.2011

Tags : Python, Documentation, Wordpress, Fabric

Comme tout bon informaticien qui se respecte, j'ai tendance à chercher le moyen le plus simple, le plus rapide, et le moins pénible pour moi, de faire les choses. Surtout lorsque ces choses sont des tâches répétitives, et/ou, facile à automatiser.

Parlons peu mais parlons bien, voici quel était mon problème :

  • Un blog wordpress à mettre à jour fréquemment (avec des versions majeures et mineures)
  • Une méthode de MAJ automatique proposée par WP qui ne me plait pas du tout (à savoir, permettre à l'utilisateur web d'écrire n'importe où dans le répertoire de mon wordpress)
  • Un refus catégorique de passer 15 à 20min à chaque fois que je dois mettre ce fichu wordpress à jour pour le faire à la main, alors que c'est toujours la même procédure

Partant de ça, je suis allé piocher dans mes connaissances quels outils pourraient m'être utile. Et c'est ainsi que j'ai choisi Fabric : j'ai créé un petit script, je le partage aujourd'hui avec qui le souhaite, sans restriction d'usage.

Petit tour technique...

Lire la suite - 1 commentaire

Intégrer un Captcha aux formulaires de Django-Comment

Dans Technique par Florian Strzelecki - 14:28 - 21.10.2010

Tags : Django, Python, Framework, Web, J'aime, Documentation, Programmation, Poney

Un billet technique dans lequel j'aborde une solution simple à un problème concret : comment utiliser un captcha avec l'application django-comment fournie de base par le framework Django ?

Je me suis posé cette question lorsque je me suis rendu compte de deux choses :

  • le honeypot de django-comment est totalement inutile
  • bannir des IPs contre le spam est voué à l'échec

Le mieux était donc d'améliorer la sécurité des formulaires de saisie des commentaires. Oui, mais comment ?

C'est ce que nous allons voir dans la suite de l'article !

Jail with a view on Isola Asinara

Image : Jail with a view on Isola Asinara - Dirk Hartung (http://www.flickr.com/photos/dirkhartung/) - Creative Common by-sa

Lire la suite - 1 commentaire

Documenter ses applications

Dans Technique par Florian Strzelecki - 18:18 - 23.11.2009

Tags : Documentation, Programmation, Bonne pratique

Le pouvoir de la documentation est immense, et mésestimé par beaucoup trop de monde, parfois même par ceux à qui elle serait le plus utile, les développeurs.

Une documentation peut faire gagner du temps aux développeurs, mais c'est bien plus que ça. Le fait de documenter ses applications va au-delà du fait de gagner du temps, ou de gagner en compréhension : c'est un signe de qualité.

Pour ma part, je considère que documenter mes applications est un devoir, et un gage de qualité. Avec une bonne documentation, je montre que mon application a été pensée et imaginée dans le bon sens.

Une bonne documentation, évidement, car une mauvaise est peut-être pire que tout finalement.

La documentation de Django

Image : La documentation de Django

Lire la suite - 2 commentaires

RSS