mardi 15 décembre 2009

emacs et django : color-theme

Django et emacs ... Configuration



Emacs est très probablement l'interface de programmation la plus puissante sur GNU/LINUX. Pendant longtemps pourtant, je suis resté avec Gedit configuré au petits oignons.(j'en parlerais sans doute une autre fois). Aujourd'hui, je me décide à passer à la vitesse supérieure. J'en profite donc pour vous donner quelques astuces pour configurer emacs aux petits oignons.

le theme Django



pour bien commencer avec emacs, commençons par le rendre un peu plus attrayant !
j'ai choisis d'utiliser le thème oswald qui est ttrès certainement le plus proche d'un thème Django. J'ai donc dans mon .emacs :

(require 'color-theme)
(color-theme-oswald)

ce qui à pour effet de charger le thème oswald. C'est un thème qui à tendance à mieux rendre sur gnome-terminal que sur x .

Si vous voulez un bon résultat sur X, je vous conseil le thème gnome2 :

(require 'color-theme)
(color-theme-gnome2)

Les Polices



Bon, ok, les polices sont plutôt moches, on va donc configurer ça.
Seulement voila, pour avoir de belles policees lissées et tout, il nous faut la version d'emacs actuellement en développement :


sudo apt-get install emacs-snapshot-gtk


ouvrez votre emacs ( c'est le moment où jamais de s'y mettre non ? ) et créez le fichier ~/.Xdefaults écrivez y ceci :

Emacs.font: Monospace-10

enfin, dans votre terminal, tappez :

xrdb -merge ~/.Xdefaults

vous pouvez alors redémarrer emacs, et voila :


Script pour envoyer des e-mails en masse avec Django

J'ai eu besoin, lors d'un récent projet,(http://www.christelle-pothier.fr) d'envoyer des e-mails en masse. Nous allons voir aujourd'hui comment le faire simplement avec Django.

Le settings.py



Dans un premier temps, vous devez configurer le settings.py de votre projet en renseignant les champs :
EMAIL_HOST = "votre site" si par exemple votre site est http://www.exemple.com, le champ sera donc exxemple.com
EMAIL_HOST_USER = suivant votre fournisseur d'email, le nom d'utilisateur sera seulement votre login ou votre adresse e-mail complète : moi@exemple.com
EMAIL_HOST_PASSWORD votre mot de passe à votre service de mail

Et voila, c'est pas plus compliqué que cela, votre compte de messagerie est configuré pour Django.

Premiers tests



Pour tester vos règlages, le mieux reste d'envoyer un mail:
ouvrez donc une console et lancez le shell django :

>>> python manage.py shell
Python 2.6.4 (r264:75706, Nov  2 2009, 14:44:17)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.mail import send_mail

cette première ligne va donc importeer la fonction d'envoie de mail.
envoyons donc réellement un mail :

>>>send_mail('un sujet','le message','expediteur@domaine.com',['destinataire@domaine.com'], fail_silently=False)

je ne commenterais pas la fonction tellement c'est simple. sachez simplement que la variable fail_silently permet de savoir tout de suitte si le mail est bien parti. Vous pourrez bien sur supprimer cette ligne en production.

 

Envoi en masse

Donc votre compte en correctement configuré, vous avez testé l'envoi de quelques e-mails, il nous faut maintenant tester l'envoi en masse. Commme vous vous en êtes peut être apperçu lors de notre test, le destinataire est inséré dans une liste. Ceela va nous permettre d'envoyer notre mail à plusieurs destinataires :

>>>
send_mail('un sujet','le message','expediteur@domaine.com',['destinataire@domaine.com', 'destinataire2@domaine.com], fail_silently=False)

donc vous avez une liste de destinataires a qui vous voulez envoyer le même e-mail. Vous pouvez donc créer un fichier envoi.py :

# -*- coding: utf-8 -*-

from django.core.mail import send_mail
subject = u"votre  sujet"
message = u"Votre message"
sender = "expéditeur@domaine.com"
recipients =["la liste des destinataire"]

for recipient in recipients:
    recipient =[recipient]
    send_mail(subject, message, sender, recipient)

Mais pourquoi une boucle for me direz-vous ? N'aurions nous pas put tout simplement envoyer le message comme d'habitude ?
Si nous aurions pu mais l'avantage de cette méthode, c'est que nous allons envoyer un message unique à chaque destinataire et nous pas un message envoyé à plusieurs destinataires.

lundi 5 octobre 2009

dive into python (1)

Je me suis décider à relire ce merveilleux ouvrage qu'est "dive into python" . Heureusement, il est disponible en français ici Je vais donc tenter de vous décrire une page par post. C'est une bonne façon pour moi de me remettre à ce langage. Pour vous, c'est certainement une bonne façon d'entrer en douceur dans ce langage d'une élégance rare.

le code du jour

<span class="pykeyword">def</span> buildConnectionString(params):
<span class="pystring">"""Build a connection string from a dictionary of parameters.

Returns string."""</span>
<span class="pykeyword">return</span> <span class="pystring">";"</span>.join([<span class="pystring">"%s=%s"</span> % (k, v) <span class="pykeyword">for</span> k, v <span class="pykeyword">in</span> params.items()])

<span class="pykeyword">if</span> __name__ == <span class="pystring">"__main__"</span>:
myParams = {<span class="pystring">"server"</span>:<span class="pystring">"mpilgrim"</span>, \
<span class="pystring">"database"</span>:<span class="pystring">"master"</span>, \
<span class="pystring">"uid"</span>:<span class="pystring">"sa"</span>, \
<span class="pystring">"pwd"</span>:<span class="pystring">"secret"</span> \
}
<span class="pykeyword">print</span> buildConnectionString(myParams)
La première ligne crée la fonction buildConnectionString. Cette fonction accepte en parametres 'params'. En général, il est déconseillé de nommer les variables attendu de manière si 'lache' puisque ici le mot 'params' ne nous informe que très peut sur la nature des parametres attendus. Tout au plus, nous savons qu'on attend une liste, un dictionnaire ou un tuple.

La ligne suivante commençant par trois guillement est la documentation de la fonction . Cette ligne est capitale pour la suite, il faudra penser à ne jamais l'ommettre quand vous créez une fonction . En effet, divers outils vous permettent de relire cette documentation pour toutes les fonctions d'un programe. C'est un embryon de DDD ( Develloppement Dirigé par la Documentation).

ensuite viens le coeur de la fonction qui a été intégrée a la valeur de retour (return). Cette façon de faire, si elle est très concise et montre bien comment écrire de façon pythoniste est malgré tout assez dense. Décortiquons un peu.

les lettres k et v se réfèrent aux clés du dictionnaire (keys) et v aux valeurs (values).
params.items() fait référence aux éléments du dictionnaire ( les couples clé:valeurs )
on aurait donc put écrire :
for k, v in params.items :
    la suite du programe.

";".join(variable) est une méthode de chaine de caractère (string). la chaine de caractère ici est donc ";" qui va donc etre concaténé a sa variable.
pour finir, l'écriture suivante :
"%s=%s % (k, v)
on remplace le symbole %s par la première valeur derière le dernier % et le second symbole par la seconde valeurs.
plus simplement :
"%s est sympa" % (paul) retourne : "paul est sympa"
donc
"%s et %s sont amis" %(paul, virginie) retourne : "paul et virginie sont amis"

reste à expliquer
<span class="pykeyword">if</span> __name__ == <span class="pystring">"__main__"</span>:
il s'agit ici d'une astuce extrêmement utilisée en python qui va permettre de n'executer le bout de code suivant seulement et seulement si le programme qui est lancé corespond au fichier dans lequel se ttrouve la fonction. C'est gééralement très utile pour déboguer une partie de code avant de l'insérer dans un ensemble plus grand.

giggle un frontend pour git

Voici un frontend en GTK pour git. Il vous permet de gérer vos dépots git en ligne de manière graphique.



L'interface est classique et complète. Les possibilités sont larges. Il est facile de naviguer entre ses projets, on peut directement commiter depuis l'interface, ce qui n'est pas possible avec gitk qui est livré de base avec git ( et qui au passage est super moche tk n'étant pas un super toolkit)

Il va me faloir chercher maintenant la même chose pour mercurial. En effet mes besoins en terme de gestionnaire de version sontt assez basique. Je code modérément et ma principale activité reste le graphisme. Je n'ai pas encore trouver un getionnaire de version qui puisse versionner mes travaux. en revanche , un retour vers la version n-1, cela git et mercurial me le propose facilement.