Installer symfony sur ubuntu 8.04

Ne pas utiliser apt, la version qu’il installe va générer des erreurs.

PHP Fatal error: Uncaught Error: Call to undefined method Composer\Package\RootPackage::getConfig() in /home/manu/.config/composer/vendor/fxp/composer-asset-plugin/Config/ConfigBuilder.php:111
Stack trace:
#0 /home/manu/.config/composer/vendor/fxp/composer-asset-plugin/Config/ConfigBuilder.php(74): Fxp\Composer\AssetPlugin\Config\ConfigBuilder::getConfigBase(Object(Composer\Composer), Object(Composer\IO\ConsoleIO))
#1 /home/manu/.config/composer/vendor/fxp/composer-asset-plugin/FxpAssetPlugin.php(82): Fxp\Composer\AssetPlugin\Config\ConfigBuilder::build(Object(Composer\Composer), Object(Composer\IO\ConsoleIO))
#2 /usr/share/php/Composer/Plugin/PluginManager.php(215): Fxp\Composer\AssetPlugin\FxpAssetPlugin->activate(Object(Composer\Composer), Object(Composer\IO\ConsoleIO))
#3 /usr/share/php/Composer/Plugin/PluginManager.php(188): Composer\Plugin\PluginManager->addPlugin(Object(Fxp\Composer\AssetPlugin\FxpAssetPlugin))
#4 /usr/share/php/Composer/Plugin/PluginManager.php(240): Composer\Plugin\PluginManager->registerPackage(Obje in /home/manu/.config/composer/vendor/fxp/composer-asset-plugin/Config/ConfigBuilder.php on line 111

Si vous l’avez déjà installée, supprimez la avec

sudo apt-get remove composer

ensuite, tapez la commande suivante dans un terminal:

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/bin --filename=composer

Et ça fonctionne

Manipuler des PDF et JPG ou JPEG

Je scanne beaucoup de documents (pour tendre vers le zéro papier) et j’archive ensuite ceux ci dans des PDF une fois que je n’en ai plus besoin.

Je vous donne mes astuces pour ce faire. Il vous faudra avoir installé les programmes imagemagick et gs, disponibles sous le même nom avec Ubuntu.

Créer un PDF à partir d’images

Je scanne en niveaux de gris à 300 DPI vers jpeg, ce qui permet d’avoir une image nette et de réimprimer le document au besoin en ayant la même qualité qu’une photocopie classique.

Ensuite, je met ces images dans un même dossier, et je les convertis toutes en un seul PDF avec la commande suivante:

convert *.jpeg Factures_Avril09.PDF

Ce qui vous donne un PDF contenant une page par image, dans l’ordre alphabétique.

Cependant, le PDF est assez lourd, l’équivalent en poids du total des images. Si vous désirez envoyer ce PDF par mail (par exemple au comptable), il faut l’alléger car vous allez y gagner en poids et il n’a pas besoin d’avoir une qualité identique à la votre tant qu’il arrive à lire le contenu. Il suffit d’ajouter une compression et un niveau de qualité à la commande ainsi:

convert *.jpeg -compress jpeg -quality 30 Factures_Avril09.PDF

Avec une qualité réglée à 30, vous divisez par environs 2,5 le poids du PDF généré. Mais la qualité de l’image baisse (ce qui est normal, puisque c’est ce qui est demandé). A vous de faire varier ce chiffre entre 0 et 100 pour arriver à un compromis acceptable entre la qualité et le poids du résultat final.

Dans l’autre sens

Il est aussi possible de transformer un PDF en série d’images que vous pourrez ensuite traiter, avec la commande suivante:

convert fichier.pdf images.jpeg

Cela va vous produire images-0.jpeg, images-1.jpeg, images-2.jpeg, … Autant d’images que de pages dans le PDF.

Attention cependant, la qualité des images obtenues avec cette méthode laisse à désirer et j’ai eu des soucis avec des images: le format était bien en A4, mais le contenu de l’image était réduit sur la page. Sans doute un option manquante.

Mais ça reste lisible.

Modifier un fichier PPD

Il est parfois nécessaire de pouvoir modifier un driver d’imprimante pour ajuster son comportement. Ayant eu à le faire récemment, je vous livre mes observations pour vous éviter mes galères:

  • Le fichier utilisé pour contrôler l’imprimante se trouve dans /etc/cups/ppd
  • Il porte le nom que vous avez donné à l’imprimante lors de son installation (exemple: copieur.ppd si vous avez nommé votre imprimante copieur)
  • Lors de l’installation, ou en passant par le gestionnaire des imprimante (Système /Administration/ Impression ou system-config-printer), les options sélectionnées (bacs, format, couleur/gris, …) sont directement écrites dans le fichier ppd de l’imprimante
  • Après modification manuelle du fichier ppd, vous devez redémarrer cups (/etc/init.d/cupsys restart)
  • En cas d’erreur de syntaxe dans le fichier ppd, l’onglet correspondant à la section n’apparaît plus dans les options lors de l’impression
  • Si la commande est trop longue pour tenir sur une seule ligne, le reste de la commande est sur la ligne suivante, et la ligne suivante doit comporter *End pour clore la commande.
  • exemple:
    *OpenUI *Fold/Pliage: PickOne
    *OrderDependency: 3 AnySetup *Fold
    *DefaultFold: None
    *Fold None/Non:  "<< /FoldType (Off) >> /KMOptions /ProcSet findresource /setKMoptions get exec"
    *Fold Stitch/Pliage et Agrafage centre:  "<< /Collate true >> setpagedevice
     << /FoldType (CenterFoldIn) /StitchType true >> /KMOptions /ProcSet findresource /setKMoptions get exec"
    *End
    *Fold HalfFold/Pliage en deux:  "<< /Collate true >> setpagedevice
     << /FoldType (CenterFoldIn) /StitchType false >> /KMOptions /ProcSet findresource /setKMoptions get exec"
    *End
    *Fold Stapling/Agrafage au milieu:  "<< /Collate true >> setpagedevice
     << /Finish 1 >> /KMOptions /ProcSet findresource /setKMoptions get exec"
    *End
    *CloseUI: *Fold
  • Pour commenter une ligne, elle doit commencer par *%. Pour commenter une commande sur 2 lignes,  supprimer le saut de ligne et commenter la ligne.
  • Faire attention au codage du fichier (en particulier pour les accents dans les labels). Un mauvais codage et le ppd ne fonctionne plus! Il est normalement (si le ppd est bien écrit) déclaré en haut de fichier:*LanguageVersion: French et *LanguageEncoding: ISOLatin1
  • Toujours avoir une copie du ppd avant de le modifier. En cas d’erreur, il est parfois plus facile de tout recommencer au lieu de chercher quel caractère pose problème.
  • Éditez le code en root avec un éditeur de textes. Après enregistrement de vos modification, vous pourrez tester immédiatement un lancement d’impression pour aller vérifier les options que vous avez modifié.
  • Avancez étape par étape. En cas de problème, vous saurez que cela vient de votre dernière modification.

Grâce à cela, j’ai supprimé (mis en commentaire) les options qui apparaissaient dans les onglet lors de l’impression et qui perturbaient mes utilisateurs. J’ai aussi changé des labels pour les rendre plus explicites (1 face -> Recto, 2 Faces -> Recto Verso).

Une fois le ppd modifié et paramétré avec les options voulues par défaut, il suffit de le copier dans le dossier /etc/cups/ppd de chaque ordinateur en ayant besoin sous le nom de l’imprimante paramétrée et de relancer cups.

Utilisation de Bazaar

Bazaar est un gestionnaire de version. L’un de ses avantages est qu’il permet d’utiliser les protocoles ssh ou ftp, ce qui signifie qu’il n’est pas nécessaire de monter un « serveur » bazaar pour l’utiliser; il suffit d’un serveur où vous pouvez vous connecter en ssh.

Classement des dossiers

L’organisation des dossiers est laissée à votre goût, mais pour simplifier les explications, voici l’organisation que nous allons adopter sur le serveur:

  • Un dossier à la racine nommé bzr qui contiendra les divers projets à versionner
  • Un dossier par projet dans le dossier /bzr (projet1 et projet2 )
  • Les droits en lecture/écriture pour les membres du groupe projets sur le dossier /bzr (récursivement)
addgroup projets              # ajout d'un groupe projets
adduser manu projets        # ajout de l'utilisateur au groupe projets
mkdir -p /bzr/projet1         # création du dossier du premier projet
mkdir -p /bzr/projet2         # création du dossier du deuxième projet
chgrp -R projets /bzr         # attribution du groupe projet à tous les fichiers du répertoire /bzr
chmod -R g+rw /bzr          # attribution des droits en lecture/écriture à tous les fichiers pour les membres du groupe projets

Il n’est pas nécessaire d’installer bazaar sur le serveur, mais il est nécessaire que l’accès par ssh fonctionne, avec ou sans mot de passe.

Sur les clients

Mise en place du projet sur le serveur

Ce sont les clients (qui vont modifier le code des projets) qui doivent installer le logiciel bazaar

apt-get install bzr python-paramiko

Les préférences de bazaar (limitées) se trouvent dans Système/Préférences/Bazaar preferences

Ce sont eux, aussi, qui vont initier le versionning, à l’endroit qui leur va bien:

mkdir ~/projets
mv ~/Bureau/monprojet ~/projets # déplacement des fichiers du prototype dans les projets
cd ~/projets/monprojet
bzr init                        # initialisation du versionning du projet
bzr add *                    # ajout de tous les fichiers (récursif) au versionning
bzr commit -m "Création" # prise en compte des modifications avec le commentaire "Création"
bzr push sftp://manu@server/bzr/projet1 --use-existing-dir # envoi de la version du projet sur le serveur en utilisant les répertoires créés plus haut.

Récupération des fichiers sur un autre client

mkdir ~/beauprojet     # création du dossier qui va accueillir le projet
cd ~/beauprojet
bzr init                     # initialisation du dossier au versionning
bzr merge sftp://toto@server/bzr/projet1/  # intégration des fichiers de "monprojet" dans le dossier "beauprojet" dans lequel on se trouve

Chacun des clients possède maintenant les fichiers sur lesquels effectuer les développements

Codage!

Les clients vont effectuer les modifications sur les documents. Après chaque modification (enfin, chaque fin de bloc de modification) ou avant l’envoi des fichiers modifiés, il faudra effectuer la commande suivante (qu’ils aient décidé ou non d’envoyer les fichiers sur le serveur. Les commit peuvent être fait hors connexion.):

bzr commit -m "message"

qui permet de prendre en compte les modifications effectuées dans le versionning et, accessoirement, de revenir à une version antérieure.

Il suffit ensuite « d’assembler » les fichiers modifiés avec ceux du serveur, que ceux ci aient été modifiés ou non par une autre personne:

bzr merge sftp://toto@server/bzr/projet1/

Enfin, les fichiers « finaux » sont envoyés sur le serveur afin d’être disponibles pour tous les développeurs:

bzr push sftp://toto@server/bzr/projet1/

A retenir

  • Il ne suffit pas d’ajouter un fichier/dossier au répertoire du projet pour qu’il soit pris en compte. Il faut le faire manuellement avec bzr add lefichier
  • Pour supprimer un fichier, il faut utiliser bzr remove lefichier
  • la commande bzr status permet de savoir l’état des fichier (plus exactement, du versionning)
  • La commande bzr log permet de voir le log des changements avec les commentaires
  • la commande bzr conflicts affiche les versions de fichiers en conflits
  • La commande bzr resolve lefichier permet de résoudre les conflits dans le fichier lefichier
  • Le manuel de bzr donne plein d’informations et de commandes utilisables

Interface graphique

Il existe une interface graphique pour bazaar nommée olive (paquet bzr-gtk) que je n’ai pas réussi à utiliser: impossible de comprendre les messages d’erreur (pas parlant) et pas trouvé de configuration à effectuer (ni dans le programme, ni dans les fichiers de configuration).

Pas grave, je suis un adepte de la ligne de commande.

Autres sources:

http://bazaar-vcs.org/fr/IntroductionABzr

Envoyer un mail avec pièces jointes en python

Envoyer un mail avec pièces jointes avec python est simple en utilisant le code ci dessous.


import smtplib

import os
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encodersdef send_mail(send_from, send_to, subject, text, files=[], server="localhost"):

assert type(send_to)==list
assert type(files)==list
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = COMMASPACE.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach( MIMEText(text) )

for f in files:
part = MIMEBase('application', "octet-stream")
print f
part.set_payload( open(f,"rb").read())
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))

msg.attach(part)

smtp = smtplib.SMTP(server)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.close()

retour = "Une erreur s'est produite lors de l'envoi de mail"
files = [ 'monfichier1.zip', '/tmp/le_fichier.pdf' ] # les pièces jointes avec leur chemin
destinataires = [ 'moi@monsite.com', 'moncopain@chez.lui' ]

try:
send_mail('expediteur@monsite.com', destinataires , "Sujet du mail", "Texte du message",files , 'smtp.free.fr')
except:
send_mail('expediteur@monsite.com', [ 'adresse@secours.fr'] , " [ERROR ] Sujet du message", retour ,[] , 'smtp.free.fr')

C’est tout!

Ah, si!

  • N’utilisez pas ceci à tout va: il est facile de se faire blacklister avec l’étiquette « spammeur ». Et il est très difficile de se faire dé-blacklister.
  • Attention à la taille des pièces jointes. Si vous dépassez la taille limite de votre FAI (30Mo chez free), une erreur bloque le script avec un message du type:  smtplib.SMTPSenderRefused: (552, ‘Message size exceeds fixed limit’, ‘expediteur@monsite.com’)