Le TwiBlog

The one with Twidi

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

mardi 18 octobre 2011

Django 1.3 et postgresql (problème lié à pysocopg sous ubuntu oneiric)

Vous utilisez django ? En version <= 1.3.1 ?

Vous utilisez postgresql ? (qui utiliserait encore mysql...)

Vous venez de mettre à jour votre (k)unbutu en oneiric ?

Jusque là, tout va bien.

mais d'un coup soudain votre navigateur vous affichera un méchant message au lieu de votre belle page :

 Exception Value: current transaction is aborted, commands ignored until end of transaction block

Ou alors (car ce n'est pas systématique) un jour vous allez lancer un test de votre application django.

Et là c'est le drame :

 psycopg2.ProgrammingError: autocommit cannot be used inside a transaction

MAIS !!??

Le coupable est identifié : psycopg2 qui, en version 2.4.2, casse plus ou moins django.

Le bug est référencé sur le tracker django : https://code.djangoproject.com/ticket/16250

Il est "fixé" mais comme indiqué dans le dernier commentaire, le fix n'est pas dans django 1.3.1 et ne sera donc disponible qu'à partir de django 1.4.

Comment faire ?

Simple.

Il faut donc utiliser psycopg 2.4.1 au lieu de psycopg 2.4.2 fourni avec la dernière ubuntu. Malheureusement le paquet n'est pas disponible.

Pas grave, nous allons le faire à la main !

Avant tout cela vous voudrez peut-être supprimer la version 2.4.2 de psycopg de votre système, dans ce cas :

 sudo apt-get --purge remove python-psycopg2

Puis on commence par installer dans le système les paquets nécessaires à la compilation (n'ayez pas peur) de psycopg2 :

 sudo apt-get build-dep python-psycopg2

Et enfin on va installer la version voulue via pip (mettez sudo si vous n'êtes pas dans un virtualenv) :

 pip install psycopg2==2.4.1

Et voilà tout remarche comme avant !

VIM : effectuer une action à l'enregistrement SAUF dans un répertoire

J'utilise vim pour coder, ce depuis des années.

Comme je n'aime pas les espaces inutiles, j'ai une petite ligne de configuration dans mon .vimrc qui supprime les espaces (ou caractères équivalents) en fin de ligne :

autocmd BufWritePre * %s/\s\+$//e

Sur un projet où je travaille, on m'a demandé explicitement de ne pas le faire. J'ai donc cherché comment ignorer les fichiers dans le répertoire du projet (et sous-répertoires) et après maintes recherches, j'ai fini par trouver :

 autocmd BufWritePre * if expand("%:p") !~ "rep_a_ignorer" | %s/\s\+$//e | endif

Je commence par récupérer le chemin complet du fichier courant, que je compare à une expression rationnelle, et si ça ne correspond pas, je fais mon remplacement.

samedi 11 décembre 2010

Transform a linear git repository into a one adapted to a workflow named git-flow

For a few months now, i develop "GRead", a Google Reader client written in python + Qt, for use on the Nokia n900, but with the help of PyQt, works also on any desktop.

It's my first complete project, open-source, and managed by Git, on GitHub.

But i come from Subversion and although i know that git is really powerful and that i can easily manage branches with it, i used to have the same workflow than with Subversion : a linear one.

I mainly work in the master branch, with some developments done in a specific branch but finally merged in the master without nothing in the master during this time.

It was a "subversion applied to git" way of doing things.

And then i saw a git presentation in Paris and the orator spoked about "git-flow".

I was interested in this and i read some stuff about git-flow and decided to apply it to all of my future projects. And on my current main one, GRead

I won't tell you why and how git-flow is great. Just how to transform an linear flow to a git-flow one.

Here is the graph of my repository before :

And after :

For transform my graph i wrote a bash script (it took me lot of hours, i just started too learn git !) which will do everything. It will create master and develop branches, and a branch for each feature or hotfix you specify in the script, and for each tag you want, a release branch.

Launch the script it locally, in the directory of a clone of your repository, and all the magic will apply. It can takes a long time to finish. For me it was 150 commits. The more branches and the more commits you have, the longer it will take to run.

Be careful, some times the script will ask your attention, in several cases :

  • a cherry-pick cannot be applied. Simply ignore it if it's from a merge (read the message just above the alert)
  • an existing branch will be duplicated, you should answer "Y" to continue for this branch (else the branch is ignored)

You can find the script "linear-git-to-git-flow.sh", on GitHub, heavily commented. Just read comments in the first part to know how to use it.

PS : i know that this script can surely be better. But notice that i just started to really use Git... i you have any suggestion i will be happy to enhance this script with your help

Duplicate a Git repository

Imagine you have a repository on GitHub. And you want to play with objects in the Git internal key value store. For example to create a branch for past commits, rearrange branches, etc, etc.

But it can be preferable to have a test repository to do this if you do not want to lost things...

For me it was to adapt the linear development of an application (GRead) to a workflow i discovered at a Git presentation : Git-flow. I'll explain this in the next post on this blog.

The first thing to do for me was to find a way of duplicate my repository on GitHub on which i can work as it was the original one, with same data.

The solution is easy if you know a little of the Git internal, but for me it was not the case (i just did some pull/commit/push by this time)

So thanks to Thomas Mango for giving me the solution :

0. Some variables

  • $myproject is your project name on github and the name of the directory in which the project was cloned.
  • $myotherproject is the name of the duplicate.
  • $meandmyself if your username on GitHub

1. Create a new repository on GitHub, but don't follow steps after that. Just create it.

You now have https://github.com/$meandmyself/$myotherproject

Duplicate your local copy of the repository :

 cp -a $myproject $myotherproject

Change the origin of the copy :

 cd $myotherproject
 git remote rm origin
 git remote add origin git@github.com:$meandmyself/$myotherproject.git

And then push your copy online :

 git push origin master

It's done !

If you want to copy branch too, note that they are already in your local copy. You just have to do this : (work for each local branch) :

 for branch in $(git branch | sed -e s/\*//g); do if  "$branch" != "master" ; then
   git checkout $branch
   git push origin $branch
   git checkout master
   git branch -f $branch origin/$branch
 fi; done

mardi 3 juin 2008

Javascript et IE : création de boutons radio en javascript

Il y a deux ans et demi j'avais déjà soulevé un problème lors de la création d'éléments de formulaire en javascript sous internet explorer.

Je viens aujourd'hui d'en trouver un autre, auquel j'ai trouvé une solution, en anglais, que je précise ici (je ne précise que la solution qui marche partout)

Le problème est le suivant : quand on créé un bouton radio dans internet explorer, en javascript, via document.createElement('input')........ le bouton est bien créé mais on ne peut le cocher.

La solution, la seule, l'unique, est... de ne pas utiliser le dom pour cela, malheureusement. Il faut le créer en html :

<input type="radio" name="truc" id="bidule" value="chose" />

La solution qui semble le mieux fonctionner dans les différents navigateurs est, sans faire de test de navigateur :

elementParent.innerHTML += '<input type="radio" name="truc" id="bidule" value="chose" />'

C'est moche, mais c'est tout ce qui marche.

Autre point, il ne faut pas, pour IE, spécifier ici l'état "checked" car si un radio du même groupe (même attribut "name") est déjà coché, on se retrouvera avec deux boutons radio cochés...

Il faut, une fois nos inserts terminés, faire par exemple :

document.getElementById(input_id).checked = true

mercredi 20 février 2008

Ignorer automatiquement certaines extensions dans subversion (.pyc de python, .*.swp de vim...)

A chaque svn status il n'est pas rare de voir un certains nombres de fichiers "temporaires" qui ne nous intéressent pas, et que nous aimerions bien voir disparaître définitivement.

Alors il existe bien sur la commande svn propset svn:ignore "*.pyc" le_rep mais il faut non seulement le faire pour chaque projet, mais en plus pour chaque répertoire.

Une solution plus simple, et globale, consiste à dire à svn de toujours ignorer les fichiers qui ne nous intéressent pas, ce dans notre fichier de configuration $HOME/.subversion/config (dans la section miscellany) :

global-ignores = *.pyc .*.swp

mardi 18 décembre 2007

J'aime le PHP

Voilà pourquoi j'adore (qui a dit que j'étais ironique ?) le php.

Voici trois fonctions pour connaître l'état d'une variable :

  • is_null (bon là, ok)
  • isset (absence d'underscore)
  • empty (sur ce coup là on a même pas le is)

Sans cohérence. Euh je voulais dire : Sans commentaire.

samedi 8 avril 2006

AllHTML passe aux Standards !

Pendant longtemps AllHTML était, comme pour beaucoup, ma référence de l'html. J'y ai appris tout ce qu'il y avait à savoir sur les balises.

Mais c'était il y a longtemps, un autre temps.

Alors que le net évoluait, que les techniques des webmasters changeaient radicalement, AllHTML s'était lentement transformé en boite à pub. De la pub partout, et même leur rares mailings, c'était de la pub.

Mais aujourd'hui un réveil semble avoir eu lieu, AllHTML passe aux standards !

Site entièrement refait en xhtml strict, au design, formes et couleurs à la mode, bref, le résultat est très prometteur.

Pourquoi je me contente d'un "prometteur" ? Car le contenu n'est pas encore au rendez-vous (beaucoup de vieux articles, pour certains largement dépassés), et le site sans adblock est une catastrophe : trois pubs en flash.... en haut, à droite, à gauche... STOOOPPPPPPP laissez respirez ce nouveau site, donnez-lui toutes ses chances !

Mais ne leur jetons pas la pierre trop tot, attendons de voir, le travail déjà effectué vaut le coup ;))

Bon courage à toute l'équipe.

Source : AllHTML passe aux Standards ! - Blog Alsacréations : XHTML, CSS et Standards web

jeudi 23 mars 2006

JavaScript Kit- DOM (Document Object Model) Reference

Quelque soit votre niveau en javascript, il y a des fois ou vous avez juste besoin d'une bonne documentation, de qualité. Malheureusement, la plupart de ce que l'on peut trouver à ce sujet sur le net est souvent incomplet, en fouilli, inexact, et j'en passe. Bref, de quoi ne pas s'y retrouver.

Heureusement, notre espoir vient sous la forme d'une petite série de pages sur javascriptKit.com. Elles référencent les différents éléments, attributs et style que vous pouvez utiliser en javascript, le tout réparti en quelques simples catégories :

  • Window
  • Objet Document
  • Objet Element
  • Objet Event
  • Style

Certains éléments incluent également du code HTML/Javascript en guise d'exemple d'utilisation. De plus la page de l'objet Event inclue des colonnes IE/NS afin d'aider le développeur cross-browser.

La page tant attendue : http://www.javascriptkit.com/domref/

vendredi 9 décembre 2005

Javascript, input.value et onchange

Il n'est pas rare lors du traitement d'un formulaire de vouloir renseigner par script les champs qui le composent.

Un exemple typique : l'ouverture d'ue calendrier en popup qui, lors de la sélection d'une date, remplira les champs de la fenêtre appelante.

Un truc à savoir c'est que quand on modifie un champ en script, l'évenement onchange du champ n'est pas appelé !

Par exemple, si sur votre champ date vous avez un onchange qui vérifie que la date n'est pas dans le passé, et bien via le calendrier vous pourrez quand même choisir une telle date.

Ce qu'il faut faire, c'est, lors de la modification du champs, appeler juste après la methode onchange du champs

Exemple :

 monchamps.value = mavaleur;
 if (monchamps.onchange) { monchamps.onchange(); }

Ainsi, l'évènement sera appelé s'il existe.

PS : la bonne façon d'accéder à un champs est

 document.forms['name_du_formulaire'].elements['name_du_champ']

et non pas

 documents.name_du_formulaire.name_du_champs

mardi 15 novembre 2005

Javascript et IE : document.createElement('input') et document.forms['the_form'].elements['the_input']

J'ai découvert un petit bug dans IE6 (celui qui dit "un de plus"... ben il le dit... ).

Sur un site développé pour un client (celui dont je parlais il y a peu), j'ai une partie en javascript. On peut, en cliquant sur un bouton, ajouter des lignes de formulaire.

Voici une partie du code :

var input_mail = document.createElement('input');
input_mail.setAttribute('name', 'mail2');
input_mail.setAttribute('id', 'step3_mail2');
input_mail.className = 'step3_mail_input';
...
a_div_in_the_form.appendChild(input_mail);

Donc ajout classique d'un élément via le DOM.

Plus tard, j'ai un onsubmit sur le formulaire dans lequel j'effectue une validation.

Je veux donc pouvoir accéder au nouveau champs pour tester son contenu

Je fais donc, très logiquement

var input = documents.forms['the_form'].elements['mail2'];

Et bien pour IE6, impossible, l'élément n'existe pas. Pourtant quand on parcoure le tableau avec des index numériques, on trouve bien l'élément avec name = 'mail2'. J'ai aussi essayé avec l'id plutôt que le name, mais rien à faire. La création de l'élément n'a pas correctement mis à jour le tableau elements.

Pour éviter de refaire tout mon code, j'ai créé une petite fonction qui renvoie une table de hashage qui, pour chaque nom du tableau, me donne son index.

function el_id_by_name(el) {
	var els = new Array();
	for (i=0;i<el.length;i++) {
		if (el[i].name) {
			els[el[i].name] = i;
		}
	}
	return els;
}

Et mon code précédent devient

var els = el_id_by_name(document.forms['the_form'].elements);
var input = document.forms['the_form'].elements[els['mail2']];

Notez le remplacement de elements['mail2'] par elements[els['mail2']]

Voilà ;)

lundi 14 novembre 2005

gettext et php : choses à savoir

J'ai développé pour un client un site multi-langues. La bonne façon de faire est bien sûr d'utiliser gettext. Or, sans parler du fait que c'était pour moi la première fois que je touchais à cet utilitaire, j'ai du batailler pour arriver à un résultat correct avec PHP.

Donc au final j'ai noté deux points importants pour le bon fonctionnement de gettext+php

  • il faut que les locales de chaque langue utilisée soient installées (par exemple sous debian via dpkg-reconfigure locales
  • il faut redémarrer apache après chaque génération du fichier .mo

Ca n'a peut-être l'air de rien comme çà, mais j'ai passé des heures à comprendre pourquoi ça ne marchait pas...

Lien : un article facile d'accès (mais en anglais) pour commencer avec gettext et php

lundi 26 septembre 2005

Developer Toolbar pour IE sous Wine

Vous connaissez tous l'extension "Web Developer" de firefox, indispensable pour tout développeur web...

Et bien Microsoft a sorti la sienne pour IE et je vous propose de l'installer pour votre IE sous Wine

Pour l'installer, c'est simple.

Vous téléchargez le .msi sur la page pré-citée (je n'ai pas réussi avec ie sous wine, j'ai donc utilisé fx)

Vous installez, si ce n'est déjà fait MS Installer :

"msi" = "native, builtin"
"msiexec.exe" = "native, builtin"

Une fois MS Installer installé, utilisez la ligne de commande suivante pour installer votre barre d'outil au format .msi :

wine msiexec /i msifile.msi

vendredi 23 septembre 2005

Javascript : getElementsBy.... CSS selector !

Les connaisseurs sauront combien peuvent être utiles les deux fonctions que sont

  • getElementById : récupérer un élément du DOM par son ID
  • get ElementsByTagName : récupérer un tableau d'éléments définis par un tag

Et bien voici quelques chose de très utile : récupérer un tableau d'éléments par un sélecteur CSS !

Deux scripts pour ça :

Je n'évoquerai pas les nombreuses possibilités offertes par ces scripts, mais néanmoins sachez que des outils tel que "csshover.htc" sont développés dans le même esprit (csshover.htc possède d'ailleurs une fonction GetElementsBySelect)

Il devient facile avec ce genre d'outil de développer ses propres htc ou équivalent, qui répondront à un besoin précis, plutôt que charger à chaque fois les htc qui peuvent ralentir le chargement de la page en l'analysant au démarrage.

mercredi 21 septembre 2005

Utiliser les sélecteurs CSS pour ajouter des évènements javascript

Même si mon titre n'est pas forcément très clair, c'est un outil fabuleux que je viens de découvrir : Behaviour : Using CSS selectors to apply Javascript behaviours

Cet outil permet, en utilisant des sélecteurs css comme descripteur, d'ajouter des évènements javascript à tout objet contenu dans une page, sans avoir à modifier le code xhtml de la page.

Le plus simple est de voir l'exemple exposé sur le site de l'auteur : http://bennolan.com/behaviour/