Un Electron Libre...

Aller au contenu | Aller au menu | Aller à la recherche

samedi 16 août 2008

Vrac de rentrée

Django 1.0 Alpha 2 puis Beta 1 sont sorties, au programme :

  • (alpha 2) Intégration de l'application de système d'information géographique GeoDjango
  • (alpha 2) Extensibilité des types Fichiers (FileField) et Images (ImageField) pour permettre une manipulation plus souple de ces types d'éléments
  • (alpha 2) Compatibilité avec Jython (qui permet de faire fonctionner du code python dans une application Java pour faire simple)
  • (beta 1) Les relations génériques sont maintenant supportées dans l'interface d'admin et dans les formulaires
  • (beta 1) Amélioration de la flexibilité de l'interface d'administration pour tout ce qui est antérieur ou postérieur à la sauvegarde d'un élément (cf doc)
  • (beta 1) La distinction entre un INSERT et un UPDATE au niveau de la méthode save() est améliorée (comprendre, on peut la gérer soit même)
  • (beta 1) Le middleware du cache a été éclaté en 3 - CacheMiddleWare continue à exister en tant que tel et est constuit sur la base de deux nouvelles classes (une pour créer le cache, l'autre pour le lire) (cf doc)
  • (beta 1) Les fonctionnalités obsolètes et maintenues jusqu'alors sont supprimées (il faut donc renommer vos django.newforms en django.forms par ex).

Pour ceux qui veulent avoir un aperçu des progrès réalisés par Django en deux ans, ils peuvent lire JeffCroft.com: Top ten things that suck about Django, revisited.

Pour rester dans Python, Smile se pose la question Faut-il avoir peur de Python, ça m'a rappelé ce billet sur l'adoption (ou pas) des nouvelles techo / langages ayant le vent en poupe. Serais-je un tantinet médium ? ;-)

Pour sortir un peu de python & django, un petit point sur la compatibilité des sites avec les navigateurs avec une série d'astuces utiles. Dans la même veine, un billet pour rendre vos newsletter en html lisibles sous vos webmails & clients mails.

Un petit état des lieux sur eZ Publish 4.0 et ses bugs - ça me promet une rentrée épique ça :-(

Prochain billet : revue de lecture sur Practical django projects de James Bennet ; il me reste les deux derniers chapitres à finir...

Conventions de codage (si tant est que j'en ai...)

Quand j'ai vu cette chaine sur les conventions de codage se diffuser sur le web avant l'été (ici ou encore ), je me disais "enfin une qui va me passer à coté, je peux dormir tranquille", ne me considérant pas comme un développeur (ou alors un du dimanche ;-) ) et n'étant pas non plus développeur de formation... Et bien non, Nicolas Hoizey a décidé de me refiler cette chaine.

Pour les projets réalisés dans un cadre professionnel, pour tout ce qui a été en html/css/php et autres boucles SPIP, j'ai par le passé tenté de bêtement copier ce que faisaient mes petits camarades. Cela se justifiait principalement par le fait que j'intervenais ponctuellement sur le code et ne souhaitait pas les perturber plus que nécessaire.

Pour les projets réalisés dans un cadre professionnel et dont je suis à l'origine ou pour mes projets perso, je n'ai pas de règle précise, je vise surtout une logique de lisibilté.

Cela donnera par ex pour un script bash dont l'objectif est de packager des fichiers par ex :

#
## Get relevant information for the packaging
#
 
# Do we need to send file on the front server ?
... some code ...
 
# Do we need to send file on the database server ?
... some code ...
 
#
## Let's build the package
#
 
# Package files for front server
... some code ...
 
# Package files for database server
... some code ...

Je prends souvent ce schéma pour tout ce qui a trait à l'administration système et pour les CSS (en adaptant les caractères de commentaires bien sur...).

Pour continuer sur les CSS, mon ordre de fabrication de mon fichier va être le suivant :

  • Eléments globaux / génériques
  • Section des plus "grandes" vers les plus "petites" (body > left > sidebar)
  • Au sein de chaque section, en premier lieux les éléments de positionnement puis ceux de mise en forme (pour reprendre une logique du plus grand au plus petit)

L'idée étant de regrouper le code en des sous-ensemble logiques.

Cela pourrait donner qqc comme :

/********************************
*  Elements généraux/generiques
********************************/
 
body {
}
 
h1 {
}
 
a {
}
 
/********************************
* Zone gauche
********************************/
 
#left {
}
 
/* Menu gauche */
 
#left #menu {
}
 
#left #menu a{
}

Par contre, là où j'ai toujours eu un souci avec PHP par ex, c'est sur la convention à suivre sur la gestion des accolades (qui en plus suivant l'IDE, l'interpréation peut changer) :

Ex :

if ($toto == "toto")
    {
    ... some code ...
    }

ou

if ($toto == "toto")
{
    ... some code ...
}

ou :

if ($toto == "toto") {
    ... some code ...
    }

ou :

if ($toto == "toto") {
    ... some code ...
}

Ou surement encore plein d'autres choses faisant que mon code au final se trouvait mal indenté (ou pas toujours de la même façon, ne parvenant pas à décider de ce qui était le plus lisible), surtout si les choses avaient tendance à s'imbriquer.

Je pense d'ailleurs que c'est une des raisons pour lesquelles j'aime python. L'indentation que l'on doit respecter permet de donner une bonne lisibilité du code. En plus, la charte de bonne conduite est clairement définie, même si je ne la suis pas encore dans son intégralité...

"""
Profile
 
This object is used to provide some common information regarding the profile of a user.
"""
 
class Profile(models.Model):
    CIVILITY_CHOICES = (
         ('single', _('Single')),
         ('taken', _('Taken')),
    )
    who = models.ForeignKey(User, unique=True, verbose_name=_('Person'),)
    photo = models.ImageField(height_field="80", width_field="80", upload_to="photos", blank=True)
    street = models.CharField(_('Address 1'), max_length=100)
    street_bis = models.CharField(_('Address 2'), max_length=100, blank=True)
    zipcode = models.IntegerField(_('Zip code'), max_length=5)
    city = models.CharField(_('City'), max_length=100)
    country = models.CharField(_('Country'), max_length=100)
    phone = models.CharField(_('Phone'), max_length=20)
    mobile = models.CharField(_('Mobile'), max_length=20, blank=True)
    civility = models.CharField(_('Status'), max_length=20, choices=CIVILITY_CHOICES)
    birthdate = models.DateField(_('Birth date'))
    children = models.IntegerField(_('Children'), blank=True, null=True)
 
    def __unicode__(self):
        return self.who.get_full_name()
 
    class Admin:
        list_display = ('who',)
        list_filter = ['who',]
        search_fields = ['who',]
 
    class Meta:
        verbose_name = _('Civil state')
        verbose_name_plural = _('Civil states')

Pour le débat indentation vs espace, j'avoue avoir préféré les espaces. Etant feinéant, je profitais aussi de la fonction de nombreux IDE qui transforment la tabulation en 4 espaces (ce qui permettait de continuer à utiliser la touche tab pour indenter son code...)

En tous cas, si je devais donner une conclusion à cet essai, que pour adopter une convention de codage, il faut :

  • Regarder si une convention n'est pas définie au niveau du language, si oui, alors l'adopter.
  • Regarder si une convention n'est pas définie au niveau du programme que vous utilisez, si oui, alors l'adopter (et si elle entre en conflit avec celle du langue, tant pis pour le langage, il est plus logique d'avoir un code cohérent)
  • Si aucune des deux n'est définie, voir pour trouver une convention qui vous va bien à vous et le cas échéant à vos coéquipiers (à ce titre, mieux vaut en discuter avant le début du code qu'après, ça évitera de vous marcher dessus ensuite...)
  • Adopter une terminologie anglaise (penser que votre code et commentaires peuvent être lus/utilisés par un prestataire indien - que feriez vous si vous deviez reprendre un code dont les commentaires sont en chinois par ex ?)

dimanche 29 juin 2008

Déplacement des tutoriels de wiki.unelectronlibre.info vers www.unelectronlibre.info/tutoriels/

Je pourrais me limiter à un "tout est dans le titre" mais ce serait pas bien...

J'initialise (enfin) la première phase de ce qui devrait être un grand chamboulement à la fin :-)

Les tutoriels se déplacent donc d'un vieillissant dokuwki vers l'espace "Tutoriels" basé sur le jeune projet de documentation Sphinx (NDLR, il sert notamment pour la future documentation de Python et Django).

Sphinx est basé sur la syntaxe ReStructured Text, incorpore la coloration syntaxique, gère des niveaux d'arborescence et est en mesure de sortir votre documentation sous plusieurs formats (HTML, LaTeX, PDF). Il est fait pour gérer de la documentation et il le fait plutôt bien.

Certains pourraient dire qu'un wiki est plus sympa car plus ouvert mais bon vu le nombre d'apports externes que j'ai eu depuis son lancement, je risque pas grand chose. Merci quand même aux quelques contributeurs :-)

Il me reste encore à :

  • Mettre les sources sur un dépot mercurial accessible de tous FAIT
  • Annoncer la licence CC qui va bien : NC-BY-SA FAIT
  • Rediriger wiki.unelectronlibre.info vers ce nouvel espace FAIT

J'ai profité de l'occasion pour faire le ménage, certains tutoriels ne seront donc plus disponibles une fois la migration des urls effectives. J'en ai également profité pour mettre à jour certains (remplacement de apt-get par aptitude, php4 par php5, corrections de fautes/typo, etc).

Je peux donc oublier la syntaxe Dokuwiki maintenant (me reste encore celle de SPIP, Dotclear, Textile (Redmine) et reStructured Text (Doc Django, Projets Django, Tutoriels)). Elle me génait énormément quand je jouais simultanément avec Trac (car elles sont quasiment opposées dans leur principe, notamment pour les titres).

Edit du 30/06 : Redirection OK, Licence OK, Source OK - J'ai même crée un projet tutoriels sur mon Chaudron pour toute remarque sur les tutoriels ;-)

lundi 23 juin 2008

Futilité de passage...

  • Le Chaudron, à défaut d'être complet est à jour coté Redmine - cf Annonce de Redmine 0.7.2
  • Ce blog, ainsi que celui de mon fils continuent de suivre le SVN de dotclear et sont donc sous Dotclear 2.0 RC2
  • Jungle Disk 2.0 est sorti
  • Le paramétrage du serveur est quasi fini, faut que j'injecte d'une facon ou d'une autre le backup des bases postgresql dans backup-manager
  • Mon nombre de flux RSS suivis est passé de 100+ à une 30aine (et ça pourrait encore diminuer) - que de bruit en moins et de temps de gagné. Déjà que j'arrive pas à faire le quart de la moitié de ce que je voudrais faire... et ça m'inspire aussi que la veille / course au hype en SSII consomme un temps monstrueux pour un intérêt qui me parait aujourd'hui bien relatif...
  • Intéressant de voir les projets depuis un client final. C'est là où on voit que les phases d'intégration, tests et documentation sont raremement à jamais appliquées en SSII, voir pas intégrées dans le process de développement pour des bonnes et mauvaises raisons - j'y reviendrais plus tard, ainsi que sur ce document qu'est le "cahier de tests". Pour éviter toute mauvaise interprétation : moi aussi jusqu'à peu encore, j'ai aussi mal fait quand j'étais en SSII... c'est d'ailleurs assez rigolo de prédire quasiment à coup sur ce qui a été fait/pas fait par une SSII et trouver à coup quasi certains les points de manque sur une livraison...
  • Diigo, c'est bientot fini car je trouve leur barre insupportable, la suggestion des tags est à chier et l'intrusion dans le menu en click droit est abusive. Pire que tout dans ce fameux menu, on ne peut pas faire juste "Bookmark" mais forcément "Bookmark & higlight", chose pour lequel je n'ai trouvé aucun intérêt pour le moment. Retour sur del.icio.us sous peu... (juste après la publication de ce billet en fait...)
  • Il a été vu ceci sur mon PC - il parait que je me serais remis à faire du code (à défaut de trouver un éditeur qui me convienne)
django-admin.py startproject atome
django-admin.py startapp journal
django-admin.py startapp links

mais un bug lié à la version SVN de Django et de django-tagging (dont j'ai trouvé la doc un peu limité sur l'intégration dans les modèles) m'a vite bloqué :-( -

Suite au prochain épisode...

Edit 1 : Pour django-tagging, faudrait lire la doc qui va bien aussi...

Edit 2 : Ajout de la sortie de Jungle Disk 2.0

vendredi 2 mai 2008

Des bonnes nouvelles d'un peu partout...

mercredi 16 avril 2008

Nginx, wouhaou :-)

Juste pour dire que j'ai installé en quelques heures vendredi soir, Steinmetz.fr sur une part Gandi avec l'infrastructure nginx, postgresql et python 2.5 (en lieu et place de Apache2/mod_wsgi, MySQL et Python 2.4).

Pour le moment cela marche du tonerre sur une configuration en plus assez équivalente que celle que j'ai chez Sivit (sauf que la part Gandi est moins chargée en sites pour le moment).

La procédure de migration d'un site django est assez simple :

  • Backup du site + bdd
  • Transfert du site
  • Installation de nginx & postgresql
  • Configuration de nginx en reprenant ce fichier de configuration (par contre la regexp sur les fichiers css & co ne fonctionne pas dans mon cas)
  • Ajustement des paramètres de mon projet django (sur les chemins vers les templates et fichiers statiques)
  • Lancement de mon application en mode fcgi
  • Lancement de nginx
  • Et on apprécie le résultat.

Pour être honnête, cela a été un peu plus compliqué ;-)

Je ferais surement un article un peu plus détaillé & étendu plus tard pour ceux que cela peut intéresser...

jeudi 27 mars 2008

En vrac (très teinté django quand même)

  • Le changset 7370 permet de générer une doc au format HTML notamment via Sphinx et le rendu est assez sympatique. C'est assez simple à faire :
cd django/django-svn/docs
make html

Le résultat est dans un sous répertoire _build et la jolie table des matières est disponible /_build/html/index.html

Pour le reste, c'est dans mon flux del.icio.us ;-)

Edit du 31 : Le programme de Pycon FR est disponible.

mardi 25 mars 2008

Lecture : Programmation Python

Je viens de terminer la lecture de "Programmation Python", qui possède d'ailleurs son |propre site dédié au livre|http://programmation-python.org/sections/blog|fr].

J'ai trouvé le livre très intéressant et très complet. J'ai compris beaucoup de choses vu ici et là dans des bouts de code python. Autant "Apprendre à programmer en python m'avait permis d'appréhender python et son modèle objet mais sans forcément me donner toutes les clés, autant là, j'ai l'impression d'avoir une bonne bible sous la main et d'avoir fait un grand pas (quitte à avoir trop de clés dans ma besace ;-) ).

A sa décharge et au vu de mon niveau actuel en python, y a des pans du livre qui me sont passés au dessus de la tête / que j'ai survolé, estimant que j'y reviendrais surement plus tard.

Autre petit point négatif mais inhérant à sa date de publication, c'est qu'il ne couvre que la version 2.4 de Python.Sur ce point précis, j'avais hésité avec l'achat de "Au coeur de Python" (Tome 1 et Tome 2) qui couvre python 2.5. Toutefois, en parcourant ce dernier livre, j'ai eu l'impression de parcourir un peu la documentation à la php.net où on assiste à un listing exhaustif des fonctions disponibles mais sans plus. Je trouve "Programmation Python" pour le coup plus pédagogique et mieux enrobé quitte pour certains points à ne donner que l'essentiel (et un peu plus) et des pointeurs si nécessaire.

Pour finir sur un point positif, l'aspect méthodologie (test, doctest, design pattern, etc) est très bien documentée et sera complétée dans le livre Petit guide à l'usage du développeur agile.

Bref, un livre à lire tant pour des débutants (qui se focaliseront sur la première partie du livre) ou des développeurs plus expérimentés qui se focaliseront sur la seconde partie.

Il me reste juste à trouver un éditeur de code python qui me va bien pour aller plus loin... (je veux un textmate-like pour Linux)

mardi 19 février 2008

SPE (Stani's Python Editor) 0.8.4.c dispo sous Archlinux

Archlinux disposant d'une fort vieille version de SPE, je me suis décidé à mettre à jour le fichier PKGBUILD existant en partant de ce qui existait originellement et aussi du paquet spe-svn (paquet orphelin, tout comme spe jusqu'à ce soir).

Cela donne donc SPE 0.8.4.c pour Archlinux.

Pour l'installer :

yaourt -S spe

Par contre, sous Debian Testing, spe ne fonctionne pas suite à un problème de dépendances sur wxpython :-(

dimanche 18 novembre 2007

Pygments et ReST (partie 2 sur je-sais-pas-combien-encore)

Suite de mon aventure sur Pygments et ReST :

En lisant la documentation rapide (QuickStart) de Pygments, on trouve comment récupérer la feuille de style fournit par défaut :

pygmentize -S default -f html > style.css

Ensuite, lors de la transformation Rest vers HTML, il suffit de faire :

rst2html.py source.txt cible.html --stylesheet-path=style.css

Il y a surement plus propre mais bon, ça marche... Cela veut aussi et surtout dire que pour produire un site à partir de document s au format ReST, il faut construire sa feuille de style CSS en incluant celle de pygments notamment.

Et voilà le résultat :

ReST et Pygments

Voir la capture d'écran

- page 1 de 3