Dans Technique par Florian Strzelecki - 18:20 - 07.10.2011
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.
Image : Pages and pages of source code. - Neil Crosby (http://www.flickr.com/photos/thevoicewithin/) - Creative-Common By-NC-SA
Dans Technique par Florian Strzelecki - 14:01 - 30.09.2011
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.
Dans Technique par Florian Strzelecki - 11:11 - 19.08.2011
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...
Dans Technique par Florian Strzelecki - 16:25 - 03.07.2011
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 :
sudo dpkg-reconfigure localesEt 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.
Dans Technique par Florian Strzelecki - 16:00 - 19.05.2011
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
Dans Technique par Florian Strzelecki - 13:32 - 15.03.2011
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 :
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...
Dans Technique par Florian Strzelecki - 14:28 - 21.10.2010
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 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 !
Image : Jail with a view on Isola Asinara - Dirk Hartung (http://www.flickr.com/photos/dirkhartung/) - Creative Common by-sa
Dans Technique par Florian Strzelecki - 18:18 - 23.11.2009
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.
Image : La documentation de Django