<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Jonathan Petitcolas</title>
	<atom:link href="http://www.jonathan-petitcolas.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jonathan-petitcolas.com</link>
	<description>Geek, développeur Web, passionné de high-tech</description>
	<lastBuildDate>Sat, 21 Aug 2010 14:47:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Symfony : modèle de données et module</title>
		<link>http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/</link>
		<comments>http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/#comments</comments>
		<pubDate>Sat, 21 Aug 2010 08:55:02 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[yaml]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/fr/?p=2897</guid>
		<description><![CDATA[Après avoir vu dans un précédent billet comment initialiser un projet Symfony, voyons à présent comment créer un module et notre modèle de base de données afin de créer rapidement une première interface d'administration pour notre gestionnaire de tâches.]]></description>
			<content:encoded><![CDATA[<p>Maintenant que nous venons d'<a href="http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/">initialiser notre projet Symfony</a>, nous pouvons à présent passer à la première étape de la création de notre application de gestion de tâches <em>Toudoo</em>, à savoir la création d'un module.</p>
<h3>Définition du modèle de données</h3>
<p>Pour commencer, nous allons définir notre modèle de données. Sous Symfony, bien plus qu'en développement PHP standard (comprendre : sans framework), il est très important de bien concevoir au début sa base de données. Passez donc un peu plus de temps que d'habitude pour bien réfléchir à toutes les relations entre vos différentes tables. Toute la partie rébarbative sera réalisée toute seule par ce merveilleux framework. ;)</p>
<p>Pour notre application de tâches, celle-ci sera relativement basique. Nous aurons donc deux tables : une table <em>member</em> et une table <em>task</em>. Avec un bout de papier et un crayon (ou, dans mon cas, avec <a href="http://www.getpaint.net/">Paint.Net</a>), voici le modèle que nous pouvons générer.</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/modele-donnees.png" alt="Modèle de données Toudoo" title="Modèle de données Toudoo" width="400" height="196" class="aligncenter size-full wp-image-2915" /></p>
<p>On remarquera au passage mes talents extraordinaires de graphiste. Je me suis trompé de voie visiblement... :p</p>
<h3>Utilisation de Doctrine</h3>
<p>On peut donc le traduire en YAML. Il s'agit d'un langage (de type clefs/valeurs) permettant de décrire sous une forme humainement compréhensible un modèle de données. Symfony utilisera les fichiers YAML pour construire la base de données et éventuellement la remplir, comme nous allons le voir dans peu de temps.</p>
<p>Petite remarque importante avant de commencer : ne mettez <span style="text-decoration: underline;">jamais</span> de tabulations dans vos fichiers YAML. Sinon, ceux-ci ne seront pas valides. ;)</p>
<p>On traduit donc notre schéma en langage YAML, en éditant le fichier <em>/config/doctrine/schema.yml</em>.</p>
<pre>member:
    actAs: { Timestampable: ~ }
    columns:
        firstName: { type: string(255), notnull: true }
        lastName: { type: string(255), notnull: true }
        email: { type: string(255), notnull: true, unique: true }
        password: { type: string(255), notnull: true }

task:
    column:
        member_id: { type: integer, notnull: true }
        task: { type: string(255), notnull: true }
        expires_at: { type: timestamp }
    relations:
        member: { onDelete: CASCADE, local: member_id, foreign: id }</pre>
<p>La première instruction de chaque bloc sera le nom de la table correspondante. Par convention, on nommera ces tables au singulier.</p>
<p>Dans la table <em>member</em>, on remarque la première ligne, avec <em>actAs</em>. Il s'agit ici d'un comportement particulier. Ainsi, la table <em>member</em> implémentera le comportement <em>Timestampable</em>, qui ajoutera (et gérera) automatiquement les champs <em>created_at</em> et <em>updated_at</em>. Cela explique notamment pourquoi on ne les retrouve pas dans la description de chacune des colonnes, situées sous le label <em>columns</em>.</p>
<p>Dans celui-ci, on retrouve le type des colonnes (ici, que des chaînes de caractères), ainsi que l'interdiction pour celles-ci d'être nulles. C'est important, dans la mesure où Symfony s'en servira lors de la génération automatique des formulaires pour la validation : si l'utilisateur oublie de remplir un champ marqué <em>notnull</em> (donc obligatoire), alors un message d'erreur apparaîtra. Enfin, on spécifie également l'unicité de l'adresse e-mail (afin d'éviter qu'un même membre se réinscrive par mégarde) grâce à l'option <em>unique</em>.</p>
<p>On remarque également que nous n'avons pas mis l'id dans les descriptions des colonnes. Celui-ci sera automatiquement inséré.</p>
<p>Enfin, l'attribut <em>relations</em> permet de mettre en place la contrainte de clef étrangère (la flèche bleue de notre schéma). On lie donc la table <em>task</em> à la table <em>member</em>, dont la clef étrangère <em>member_id</em> (clef <em>local</em>) référencie la clef primaire <em>id</em> (clef <em>foreign</em>). Enfin, si on supprime un membre, on supprime également toutes les tâches qui lui sont associés, ce qui est indiqué par <em>onDelete: CASCADE</em>.</p>
<p>Nous pouvons donc à présent faire appel à Doctrine. Doctrine est un ORM (Object Relational Mapping). Un ORM permet de manipuler des bases de données grâce à des objets. Ainsi, dans ce cas, Doctrine créera des classes PHP pour interagir avec nos tables MySQL.</p>
<p>Pour ce faire, commençons par configurer les accès à notre base de données :</p>
<blockquote><p>php symfony configure:database "mysql:host=localhost;dbname=toudoo" root root</p></blockquote>
<p>L'ordre des arguments de <em>configure:database</em> est la chaîne de connexion à la base de données (ici, on se sert de MySQL pour se connecter en local à la base <em>toudoo</em>), le nom d'utilisateur et le mot de passe. Si tout se passe bien, vous devriez retrouver ces réglages dans le fichier <em>/config/databases.yml</em> :</p>
<pre>all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:host=localhost;dbname=toudoo'
      username: root
      password: root</pre>
<p>Une fois ceci configuré, nous pouvons demander à Doctrine de créer les tables dans notre base ainsi que les fichiers modèles qui nous permettront d'interagir facilement avec la base. Doctrine créera également les formulaires et les filtres de formulaires, sur lesquels nous reviendrons plus tard.</p>
<blockquote><p>php symfony doctrine:build --all --no-confirmation</p></blockquote>
<p>Si tout se passe bien, vous devriez voir une sortie semblable à :</p>
<pre>>> doctrine  Dropping "doctrine" database
>> doctrine  Creating "dev" environment "doctrine" database
>> doctrine  generating model classes
>> file+     C:\Users\Jonathan Petitcolas\Ap...\Temp/doctrine_schema_54820.yml
>> tokens    D:/Sites/toudoo/lib/model/doctrine/base/Basemember.class.php
>> tokens    D:/Sites/toudoo/lib/model/doctrine/base/Basemembers.class.php
>> tokens    D:/Sites/toudoo/lib/model/doctrine/base/Basetask.class.php
>> tokens    D:/Sites/toudoo/lib/model/doctrine/base/Basetasks.class.php
>> autoload  Resetting application autoloaders
>> file-     D:/Sites/toudoo/cache/frontend/.../config/config_autoload.yml.php
>> doctrine  generating form classes
>> tokens    D:/Sites/toudoo/lib/form/BaseForm.class.php
>> tokens    D:/Sites/toudoo/lib/form/doctrine/base/BasememberForm.class.php
>> tokens    D:/Sites/toudoo/lib/form/doctrine/base/BasemembersForm.class.php
>> tokens    D:/Sites/toudoo/lib/form/doctrine/base/BasetaskForm.class.php
>> tokens    D:/Sites/toudoo/lib/form/doctrine/base/BasetasksForm.class.php
>> tokens    D:/Sites/toudoo/lib/form/doctrine/BaseFormDoctrine.class.php
>> tokens    D:/Sites/toudoo/lib/form/doctrine/memberForm.class.php
>> tokens    D:/Sites/toudoo/lib/form/doctrine/membersForm.class.php
>> tokens    D:/Sites/toudoo/lib/form/doctrine/taskForm.class.php
>> tokens    D:/Sites/toudoo/lib/form/doctrine/tasksForm.class.php
>> autoload  Resetting application autoloaders
>> file-     D:/Sites/toudoo/cache/frontend/.../config/config_autoload.yml.php
>> doctrine  generating filter form classes
>> tokens    D:/Sites/toudoo/lib/filter/doct.../BasememberFormFilter.class.php
>> tokens    D:/Sites/toudoo/lib/filter/doct...BasemembersFormFilter.class.php
>> tokens    D:/Sites/toudoo/lib/filter/doct...se/BasetaskFormFilter.class.php
>> tokens    D:/Sites/toudoo/lib/filter/doct...e/BasetasksFormFilter.class.php
>> tokens    D:/Sites/toudoo/lib/filter/doct...aseFormFilterDoctrine.class.php
>> tokens    D:/Sites/toudoo/lib/filter/doctrine/memberFormFilter.class.php
>> tokens    D:/Sites/toudoo/lib/filter/doctrine/membersFormFilter.class.php
>> tokens    D:/Sites/toudoo/lib/filter/doctrine/taskFormFilter.class.php
>> tokens    D:/Sites/toudoo/lib/filter/doctrine/tasksFormFilter.class.php
>> autoload  Resetting application autoloaders
>> file-     D:/Sites/toudoo/cache/frontend/.../config/config_autoload.yml.php
>> doctrine  generating sql for models
>> doctrine  Generated SQL successfully for models
>> doctrine  creating tables
>> doctrine  created tables successfully</pre>
<p>On peut ainsi voir que Doctrine crée les modèles dans le dossier <em>/lib/model/doctrine</em>, les formulaires dans <em>/lib/form/doctrine</em>, les filtres de formulaires dans <em>/lib/filter/doctrine/</em> et les instructions SQL optimisées pour le serveur sous-jacent dans <em>/data/sql/</em>.</p>
<p>Tant que nous y sommes, nous pouvons jeter un oeil dans notre base de données, afin de s'assurer que tout y a bien été créé.</p>
<p class="center"><a href="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/databases.png"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/databases-600x77.png" alt="Base de données Toudoo" title="Base de données Toudoo" width="600" height="77" class="aligncenter size-medium wp-image-2901" /></a></p>
<p>Dans le but d'avoir un aperçu rapide du fonctionnement de notre application, nous allons déjà peupler la base de données de quelques enregistrements. On utilisera encore un fichier YAML. Les données à insérer sont dans le dossier <em>/data/fixtures/</em>. </p>
<p>On crée un premier fichier pour les membres, <em>members.yml</em>.</p>
<pre>member:
    Jonathan:
        firstName: Jonathan
        lastName: Petitcolas
        email: contact@jonathan-petitcolas.com
        password: password
    Tim:
        firstName: Tim
        lastName: Speek
        email: tim.speek@skype.com
        password: voipIsgr3aT</pre>
<p>Puis, dans le fichier <em>tasks.yml</em> :</p>
<pre>task:
    world:
        member: Jonathan
        task: Conquer the World!
    wealth:
        member: Jonathan
        task: Become rich and famous. Arf... I've forgotten I was already! :p
    boobs:
        member: Tim
        task: Put words "boobs", "ass", "sex" and "pussy" to improve SEO.</pre>
<p>On remarque que chaque enregistrement dispose d'une étiquette. Celle-ci, obligatoire (pour bien différencier chaque enregistrement), permet également de simplifier l'utilisation des clefs étrangères. Ainsi, la tâche <em>boobs</em> est associé à Tim.</p>
<p>A présent, remplissons notre base de données avec ces enregistrements grâce à la commande suivante :</p>
<blockquote><p>php symfony doctrine:data-load</p></blockquote>
<p>On pourra s'assurer du bon fonctionnement de celle-ci avec le retour suivant :</p>
<pre>>> doctrine  Loading data fixtures from "D:\Sites\toudoo\data/fixtures"
>> doctrine  Data was successfully loaded</pre>
<p>Pour les plus maniaques (dont je fais partie... :$), vous pouvez supprimer le fichier <em>fixtures.yml</em>, qui n'est là qu'à titre d'exemple et n'a donc aucune utilité.</p>
<p>Si on jette un coup d'oeil sur nos tables, on s'aperçoit qu'elles sont à dorénavant remplies.</p>
<p class="center"><a href="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/members.png"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/members-600x52.png" alt="Table members" title="Table members" width="600" height="52" class="aligncenter size-medium wp-image-2903" /></a></p>
<p>Maintenant que tout cela est fait, créons les modules correspondant à nos deux entités.</p>
<h3>Définition d'un module</h3>
<p>Qu'est-ce qu'un module ? Afin de mieux comprendre, reprenons depuis le début, du plus général au plus précis.</p>
<p>Tout d'abord, nous avons notre projet. Celui-ci est définit (pour faire simple) par une conception particulière, un but final général. Par exemple, un gestionnaire de tâches. </p>
<p>Puis, nous avons les applications. Les applications ne partagent entre elles que les modèles de données. Elles s'appuieront donc toutes sur les mêmes données, mais c'est tout. Rien d'autre ne leur sera commun. Ainsi, dans notre cas, nous aurons la partie <em>frontend</em> (qui sera visible par les utilisateurs) et la partie <em>backend</em>, qui elle ne sera visible que par les administrateurs. Mais nous verrons cela bien plus tard. ;)</p>
<p>Au niveau en-dessous des applications, on trouve les modules. Ceux-ci représentent une partie majeure de l'application. On découpe en fait en morceaux l'application, ces morceaux étant appelés modules. Ainsi, dans notre cas, on aura un module <em>members</em> pour gérer nos utilisateurs et un module <em>tasks</em> pour gérer les tâches.</p>
<p>Enfin, si nous voulons vraiment peaufiner, nous avons les actions. Les actions sont simplement les briques unitaires de notre module. On peut citer pour l'exemple les actions par défaut d'un module : l'ajout, la suppression, le listing ou encore l'édition.</p>
<p>Si ce n'est pas très clair, pas de panique. Cela viendra petit à petit avec votre utilisation de Symfony. :)</p>
<h3>Création du module <em>member</em></h3>
<p>Nous allons commencer par le commencement, à savoir par la création du module des membres. Retournez à votre ligne de commande, et exécutez l'instruction suivante :</p>
<blockquote><p>php symfony doctrine:generate-module --with-show --non-verbose-templates frontend members member</p></blockquote>
<p>On génère un module comme vous pourrez le constater. Mais également quelques arguments, dont voici la signification :</p>
<ul>
<li><strong>--with-show :</strong> donne une méthode de visualisation de l'entité,</li>
<li><strong>--non-verbose-templates :</strong> permet une manipulation plus orientée objet des formulaires... Nous y reviendrons plus tard.</li>
<li><strong>frontend :</strong> application dans laquelle le module devra se trouver,</li>
<li><strong>members :</strong> nom du module,</li>
<li><strong>member :</strong> nom de la table associée.</li>
</ul>
<p>Nous avons une sortie à laquelle nous commençons à être habitués :</p>
<pre>>> dir+      D:\Sites\toudoo\apps\frontend\modules/members\actions
>> file+     D:\Sites\toudoo\apps\frontend\m...mbers\actions/actions.class.php
>> dir+      D:\Sites\toudoo\apps\frontend\modules/members\templates
>> file+     D:\Sites\toudoo\apps\frontend\m...mbers\templates/editSuccess.php
>> file+     D:\Sites\toudoo\apps\frontend\m...bers\templates/indexSuccess.php
>> file+     D:\Sites\toudoo\apps\frontend\m...embers\templates/newSuccess.php
>> file+     D:\Sites\toudoo\apps\frontend\m...mbers\templates/showSuccess.php
>> file+     D:\Sites\toudoo\apps\frontend\m...les/members\templates/_form.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...mbers/actions/actions.class.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...mbers/templates/editSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...bers/templates/indexSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...embers/templates/newSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...mbers/templates/showSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...les/members/templates/_form.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...mbers/actions/actions.class.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...mbers/templates/editSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...bers/templates/indexSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...embers/templates/newSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...mbers/templates/showSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...les/members/templates/_form.php
>> file+     D:\Sites\toudoo\test\functional\frontend\membersActionsTest.php
>> tokens    D:\Sites\toudoo\test\functional\frontend\membersActionsTest.php
>> file-     D:/Sites/toudoo/cache/tmp/87952...autoMembers/templates/_form.php
>> file-     D:/Sites/toudoo/cache/tmp/87952...mbers/templates/showSuccess.php
>> file-     D:/Sites/toudoo/cache/tmp/87952...embers/templates/newSuccess.php
>> file-     D:/Sites/toudoo/cache/tmp/87952...bers/templates/indexSuccess.php
>> file-     D:/Sites/toudoo/cache/tmp/87952...mbers/templates/editSuccess.php
>> dir-      D:/Sites/toudoo/cache/tmp/87952...eda40aa36/autoMembers/templates
>> file-     D:/Sites/toudoo/cache/tmp/87952...mbers/actions/actions.class.php
>> dir-      D:/Sites/toudoo/cache/tmp/87952...caeda40aa36/autoMembers/actions
>> dir-      D:/Sites/toudoo/cache/tmp/87952...6c250993caeda40aa36/autoMembers</pre>
<p>Essentiellement, cette ligne de commande a généré différents templates et actions dans notre application <em>frontend</em>, dans le dossier de <em>modules</em> <em>members</em>.</p>
<p>Nous avons fini pour la mise en place du module de membres. Vous pouvez à présent vous connecter à l'adresse du module, en environnement de développement (celui-ci n'est en effet pas encore accessible en production) : <em>http://toudoo/frontend_dev.php/members</em>.</p>
<p>On remarque alors que plusieurs pages ont été créées, permettant la visualisation, l'édition, l'ajout et la suppression de tous les enregistrements des membres. Magique, non ? :)</p>
<p class="center"><a href="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/members-list.png"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/members-list-600x131.png" alt="Members list - Symfony" title="Members list - Symfony" width="600" height="131" class="aligncenter size-medium wp-image-2908" /></a></p>
<p>Comme on peut le constater, il n'y a pas de CSS. C'est tout à fait normal : nous verrons comment personnaliser l'affichage de notre site dans le billet suivant.</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/edit-member.png" alt="Edit member - Symfony" title="Edit member - Symfony" width="330" height="252" class="aligncenter size-full wp-image-2909" /></p>
<p>Quelque chose peut choquer : la saisie manuelle des champs <em>created_at</em> et <em>updated_at</em>. Rassurez-vous, nous verrons, lors de l'étude des formulaires Symfony, comment faire disparaître ceux-ci.</p>
<p>Après s'être amusé avec les membres, nous allons créer le module des tâches.</p>
<blockquote><p>php symfony doctrine:generate-module --with-show --non-verbose-templates frontend tasks task</p></blockquote>
<p>Ce qui donne, encore et toujours :</p>
<pre>>> dir+      D:\Sites\toudoo\apps\frontend\modules/tasks\actions
>> file+     D:\Sites\toudoo\apps\frontend\m...tasks\actions/actions.class.php
>> dir+      D:\Sites\toudoo\apps\frontend\modules/tasks\templates
>> file+     D:\Sites\toudoo\apps\frontend\m...tasks\templates/editSuccess.php
>> file+     D:\Sites\toudoo\apps\frontend\m...asks\templates/indexSuccess.php
>> file+     D:\Sites\toudoo\apps\frontend\m.../tasks\templates/newSuccess.php
>> file+     D:\Sites\toudoo\apps\frontend\m...tasks\templates/showSuccess.php
>> file+     D:\Sites\toudoo\apps\frontend\modules/tasks\templates/_form.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...tasks/actions/actions.class.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...tasks/templates/editSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...asks/templates/indexSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m.../tasks/templates/newSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...tasks/templates/showSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/modules/tasks/templates/_form.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...tasks/actions/actions.class.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...tasks/templates/editSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...asks/templates/indexSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m.../tasks/templates/newSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/m...tasks/templates/showSuccess.php
>> tokens    D:/Sites/toudoo/apps/frontend/modules/tasks/templates/_form.php
>> file+     D:\Sites\toudoo\test\functional\frontend\tasksActionsTest.php
>> tokens    D:\Sites\toudoo\test\functional\frontend\tasksActionsTest.php
>> file-     D:/Sites/toudoo/cache/tmp/a1c6e...9/autoTasks/templates/_form.php
>> file-     D:/Sites/toudoo/cache/tmp/a1c6e...Tasks/templates/showSuccess.php
>> file-     D:/Sites/toudoo/cache/tmp/a1c6e...oTasks/templates/newSuccess.php
>> file-     D:/Sites/toudoo/cache/tmp/a1c6e...asks/templates/indexSuccess.php
>> file-     D:/Sites/toudoo/cache/tmp/a1c6e...Tasks/templates/editSuccess.php
>> dir-      D:/Sites/toudoo/cache/tmp/a1c6e...2410b844369/autoTasks/templates
>> file-     D:/Sites/toudoo/cache/tmp/a1c6e...Tasks/actions/actions.class.php
>> dir-      D:/Sites/toudoo/cache/tmp/a1c6e...e82410b844369/autoTasks/actions
>> dir-      D:/Sites/toudoo/cache/tmp/a1c6e...4bc2964fe82410b844369/autoTasks</pre>
<p>Comme nous pouvons le voir, Symfony nous simplifie énormément la vie. Enfin, presque. Car, il y a un petit défaut avec les membres...</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/new-task-1.png" alt="New Task - Member id - Symfony" title="New Task - Member id - Symfony" width="334" height="176" class="aligncenter size-full wp-image-2910" /></p>
<p>D'après ce formulaire, nous devrions connaître par coeur les identifiants de tous les membres. Imaginez si notre base contient plusieurs milliers de membres... Heureusement, il est possible de modifier ce comportement par défaut (la colonne <em>member_id</em> étant numérique) grâce à la méthode <em>__toString()</em> du modèle <em>Member</em>.</p>
<p>On modifie donc comme suit la classe modèle de notre membre, <em>/lib/model/doctrine/member.class.php</em> :</p>
<pre class="php">public function __toString()
{
	return $this->getFirstName().' '.$this->getLastName();
}</pre>
<p>On récupère donc le prénom et le nom, grâce aux accesseurs de Symfony. Ce qui donnera donc, dans notre nouveau formulaire :</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/new-task-2.png" alt="New task - Version finale - Symfony" title="New task - Version finale - Symfony" width="328" height="168" class="aligncenter size-full wp-image-2911" /></p>
<p>C'est sur cette magie que nous allons nous laisser sur ce deuxième tutorial. Au final, nous n'avons fait qu'appeler quelques commandes et écrire une ligne PHP, et nous avons une application particulièrement importante, qui aurait demandé quelques heures de développement sans un tel framework. Et je vous assure : ce n'est pas fini. :)</p>
<p>Dans le prochain article, nous verrons comment gérer l'aspect graphique de notre site, avec les CSS, les layouts et les slots.</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge">
<ul class="socials">
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/&amp;t=Symfony+%3A+mod%C3%A8le+de+donn%C3%A9es+et+module" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Jonathan+Petitcolas+%3A+Symfony+%3A+mod%C3%A8le+de+donn%C3%A9es+et+module+-+http://tinyurl.com/2anlnnw&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="shr-netvibes">
			<a href="http://www.netvibes.com/share?title=Symfony+%3A+mod%C3%A8le+de+donn%C3%A9es+et+module&amp;url=http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/" rel="nofollow" class="external" title="Submit this to Netvibes">Submit this to Netvibes</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/&amp;title=Symfony+%3A+mod%C3%A8le+de+donn%C3%A9es+et+module&amp;summary=Apr%C3%A8s%20avoir%20vu%20dans%20un%20pr%C3%A9c%C3%A9dent%20billet%20comment%20initialiser%20un%20projet%20Symfony%2C%20voyons%20%C3%A0%20pr%C3%A9sent%20comment%20cr%C3%A9er%20un%20module%20et%20notre%20mod%C3%A8le%20de%20base%20de%20donn%C3%A9es%20afin%20de%20cr%C3%A9er%20rapidement%20une%20premi%C3%A8re%20interface%20d%27administration%20pour%20notre%20gestionnaire%20de%20t%C3%A2ches.&amp;source=Blog de Jonathan Petitcolas" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/&amp;title=Symfony+%3A+mod%C3%A8le+de+donn%C3%A9es+et+module&amp;srcUrl=http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/&amp;srcTitle=Symfony+%3A+mod%C3%A8le+de+donn%C3%A9es+et+module&amp;snippet=Apr%C3%A8s%20avoir%20vu%20dans%20un%20pr%C3%A9c%C3%A9dent%20billet%20comment%20initialiser%20un%20projet%20Symfony%2C%20voyons%20%C3%A0%20pr%C3%A9sent%20comment%20cr%C3%A9er%20un%20module%20et%20notre%20mod%C3%A8le%20de%20base%20de%20donn%C3%A9es%20afin%20de%20cr%C3%A9er%20rapidement%20une%20premi%C3%A8re%20interface%20d%27administration%20pour%20notre%20gestionnaire%20de%20t%C3%A2ches." rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/&amp;title=Symfony+%3A+mod%C3%A8le+de+donn%C3%A9es+et+module" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/&amp;title=Symfony+%3A+mod%C3%A8le+de+donn%C3%A9es+et+module" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/symfony-modele-de-donnees-et-module/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bande-annonce de Twitter, le film</title>
		<link>http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/</link>
		<comments>http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 10:36:08 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
				<category><![CDATA[Détente]]></category>
		<category><![CDATA[bande-annonce]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=3027</guid>
		<description><![CDATA[Voici une (fausse) bande-annonce sur l'un des services auquel je suis le plus <em>addicted</em>, à savoir Twitter. Je vous laisse apprécier cette parodie du film "Facebook, the story".]]></description>
			<content:encoded><![CDATA[<p>Voici une (fausse) bande-annonce sur l'un des services auquel je suis le plus <em>addicted</em>, à savoir <a href="http://www.twitter.com/sethpolma">Twitter</a>. Je vous laisse apprécier cette parodie du film <a href="http://www.korben.info/facebook-le-film.html">Facebook, the story</a>.</p>
<div class="video"><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/putQn89TQzc&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xd0d0d0&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/putQn89TQzc&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xd0d0d0&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385"></embed></object></div>
<p>&nbsp;</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge">
<ul class="socials">
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/&amp;t=Bande-annonce+de+Twitter%2C+le+film" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Jonathan+Petitcolas+%3A+Bande-annonce+de+Twitter%2C+le+film+-+http://tinyurl.com/269eqna&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="shr-netvibes">
			<a href="http://www.netvibes.com/share?title=Bande-annonce+de+Twitter%2C+le+film&amp;url=http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/" rel="nofollow" class="external" title="Submit this to Netvibes">Submit this to Netvibes</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/&amp;title=Bande-annonce+de+Twitter%2C+le+film&amp;summary=Voici%20une%20%28fausse%29%20bande-annonce%20sur%20l%27un%20des%20services%20auquel%20je%20suis%20le%20plus%20addicted%2C%20%C3%A0%20savoir%20Twitter.%20Je%20vous%20laisse%20appr%C3%A9cier%20cette%20parodie%20du%20film%20%22Facebook%2C%20the%20story%22.&amp;source=Blog de Jonathan Petitcolas" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/&amp;title=Bande-annonce+de+Twitter%2C+le+film&amp;srcUrl=http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/&amp;srcTitle=Bande-annonce+de+Twitter%2C+le+film&amp;snippet=Voici%20une%20%28fausse%29%20bande-annonce%20sur%20l%27un%20des%20services%20auquel%20je%20suis%20le%20plus%20addicted%2C%20%C3%A0%20savoir%20Twitter.%20Je%20vous%20laisse%20appr%C3%A9cier%20cette%20parodie%20du%20film%20%22Facebook%2C%20the%20story%22." rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/&amp;title=Bande-annonce+de+Twitter%2C+le+film" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/&amp;title=Bande-annonce+de+Twitter%2C+le+film" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/bande-annonce-de-twitter-le-film/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A ceux qui blâment les mathématiques !</title>
		<link>http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/</link>
		<comments>http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 18:39:34 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
				<category><![CDATA[Sciences]]></category>
		<category><![CDATA[Jacques Peletier du Mans]]></category>
		<category><![CDATA[mathématiques]]></category>
		<category><![CDATA[poésie]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=3010</guid>
		<description><![CDATA[Voici un poème de Jacques Peletier du Mans, mathématicien du XVIème siècle, dans lequel celui-ci fait l'éloge de la Mathématique, cette science que j'apprécie particulièrement ! :)]]></description>
			<content:encoded><![CDATA[<p>Ceux qui me connaissent savent que je porte une importance particulière aux Mathématiques, science de toutes les sciences. Je suis tombé par hasard sur un poème de Jacques Peletier du Mans, mathématicien du XVIème siècle, dont le nom se suffit à lui même, à savoir <em>"A ceux qui blâment les mathématiques"</em>.</p>
<p>Attention, ce n'est pas très simple à lire, étant rédigé en vieux français. </p>
<blockquote><p>Tant plus je voy que vous blamez<br />
Si noble discipline,<br />
Plus à l'aimer vous enflammez<br />
Ma volonté encline.<br />
Car ce qui a moins de suivans<br />
D'autant plus il est rare,<br />
Et est la chose entre vivans<br />
Dont on est plus avare.<br />
Il n'est pas en nostre puissance<br />
Qu'y soyez addonnez :<br />
Car le ciel dès vostre naissance<br />
Vous en a destournez :<br />
Ou ayant persuasion<br />
Que tant la peine en couste,<br />
Est la meilleure occasion<br />
Qui tant nous en desgouste.<br />
Le Ciel orné de tels flambeaux<br />
N'est-il point admirable ?<br />
La notice de corps si beaux<br />
N'est-elle désirable ?<br />
Du céleste ouvrage l'obget<br />
Si vray et régulier ?<br />
N'est-il sur tout autre suget<br />
Beau, noble et singulier ?<br />
N'est-ce rien d'avoir peu prévoir<br />
Par les cours ordinaires<br />
L'Eclipse que doit recevoir<br />
L'un des deux Luminaires ?<br />
D'avoir seu par vrayes pratticques<br />
Les aspectz calculer ?<br />
Et congnoistre les Erraticques<br />
Marcher ou reculler ?<br />
Touteffois il n'est ja besoing<br />
Que tant fort je la loue,<br />
Veu que je n'ay vouloir ni soing<br />
Que de ce l'on m'avoue ;<br />
Car que chaut-il à qui l'honore<br />
Qu'elle soit contennée ?<br />
Science de cil qui l'ignore<br />
Est toujours condannée,<br />
Assez regarde l'indocte homme<br />
Du Ciel rond la ceinture,<br />
Mais il s'y congnoit ainsi comme<br />
L'aveugle en la peinture.<br />
Celuy qui a l'ame ravie<br />
Par les cieux va et passe<br />
Et souvent voit durant sa vie<br />
D'en hault la terre basse.<br />
Ceste science l'homme cueille<br />
Alors qu'il imagine<br />
La facture et grande merveille<br />
De la ronde machine.<br />
C'est celle par qui mieux s'apprenne<br />
L'immense Déité,<br />
Et qui des Athées reprenne<br />
L'erreur et vanité.</p></blockquote>
<p>Bref, malgré un apprentissage parfois difficile (car, oui, je l'avoue, certains aspects sont particulièrement abstraits...), la Mathématique fournit toujours une grande satisfaction aux esprits logiques. :)</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge">
<ul class="socials">
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/&amp;t=A+ceux+qui+bl%C3%A2ment+les+math%C3%A9matiques+%21" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Jonathan+Petitcolas+%3A+A+ceux+qui+bl%C3%A2ment+les+math%C3%A9matiques+%21+-+http://tinyurl.com/23ygglv&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="shr-netvibes">
			<a href="http://www.netvibes.com/share?title=A+ceux+qui+bl%C3%A2ment+les+math%C3%A9matiques+%21&amp;url=http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/" rel="nofollow" class="external" title="Submit this to Netvibes">Submit this to Netvibes</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/&amp;title=A+ceux+qui+bl%C3%A2ment+les+math%C3%A9matiques+%21&amp;summary=Voici%20un%20po%C3%A8me%20de%20Jacques%20Peletier%20du%20Mans%2C%20math%C3%A9maticien%20du%20XVI%C3%A8me%20si%C3%A8cle%2C%20dans%20lequel%20celui-ci%20fait%20l%27%C3%A9loge%20de%20la%20Math%C3%A9matique%2C%20cette%20science%20que%20j%27appr%C3%A9cie%20particuli%C3%A8rement%20%21%20%3A%29&amp;source=Blog de Jonathan Petitcolas" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/&amp;title=A+ceux+qui+bl%C3%A2ment+les+math%C3%A9matiques+%21&amp;srcUrl=http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/&amp;srcTitle=A+ceux+qui+bl%C3%A2ment+les+math%C3%A9matiques+%21&amp;snippet=Voici%20un%20po%C3%A8me%20de%20Jacques%20Peletier%20du%20Mans%2C%20math%C3%A9maticien%20du%20XVI%C3%A8me%20si%C3%A8cle%2C%20dans%20lequel%20celui-ci%20fait%20l%27%C3%A9loge%20de%20la%20Math%C3%A9matique%2C%20cette%20science%20que%20j%27appr%C3%A9cie%20particuli%C3%A8rement%20%21%20%3A%29" rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/&amp;title=A+ceux+qui+bl%C3%A2ment+les+math%C3%A9matiques+%21" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/&amp;title=A+ceux+qui+bl%C3%A2ment+les+math%C3%A9matiques+%21" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/a-ceux-qui-blament-les-mathematiques/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Récupérer un paramètre $_GET en Javascript</title>
		<link>http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/</link>
		<comments>http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 18:11:20 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=2935</guid>
		<description><![CDATA[Comment récupérer une variable $_GET en Javascript ? La réponse dans ce post. Concernant l'image de cet article, je l'ai trouvé en tapant "Javascript" sur Google Images. Ne me demandez donc pas le rapport. :p]]></description>
			<content:encoded><![CDATA[<p>Parfois, il peut-être utile de récupérer un paramètre $_GET directement en Javascript. Bien que dans la majeure partie des cas, initialiser une variable grâce au langage côté serveur (PHP, ASP, etc.) puisse être bien plus simple, cela n'est pas toujours possible. Voici donc une petite fonction accomplissant cette mission.</p>
<pre class="brush: jscript;">function getUrlParameter(name) {

    var searchString = location.search.substring(1).split('&amp;');

    for (var i = 0; i &lt; searchString.length; i++) {

        var parameter = searchString[i].split('=');
        if(name == parameter[0])    return parameter[1];

    }

    return false;
}
</pre>
<p>Cette fonction récupère la chaîne de caractères <em>location.search</em> qui représente, pour l'appel à la page <em>index.php?page=members&#038;action=show</em>, la chaîne <em>?page=members&#038;action=show</em>. Le <em>substring</em> permet de retirer le point d'interrogation et le <em>split</em> de couper la chaîne aux emplacements des esperluettes (le vrai nom de ce symbole &#038;). </p>
<p>Puis, on parcourt le tableau obtenu à la recherche du paramètre $_GET dont le nom a été passé en argument de la fonction.</p>
<p>Rien de bien compliqué... Encore faut-il connaître la variable <em>location.search</em>. :)</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge">
<ul class="socials">
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/&amp;t=R%C3%A9cup%C3%A9rer+un+param%C3%A8tre+%24_GET+en+Javascript" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Jonathan+Petitcolas+%3A+R%C3%A9cup%C3%A9rer+un+param%C3%A8tre+%24_GET+en+Javascript+-+http://tinyurl.com/2anzndh&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="shr-netvibes">
			<a href="http://www.netvibes.com/share?title=R%C3%A9cup%C3%A9rer+un+param%C3%A8tre+%24_GET+en+Javascript&amp;url=http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/" rel="nofollow" class="external" title="Submit this to Netvibes">Submit this to Netvibes</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/&amp;title=R%C3%A9cup%C3%A9rer+un+param%C3%A8tre+%24_GET+en+Javascript&amp;summary=Comment%20r%C3%A9cup%C3%A9rer%20une%20variable%20%24_GET%20en%20Javascript%20%3F%20La%20r%C3%A9ponse%20dans%20ce%20post.%20Concernant%20l%27image%20de%20cet%20article%2C%20je%20l%27ai%20trouv%C3%A9%20en%20tapant%20%22Javascript%22%20sur%20Google%20Images.%20Ne%20me%20demandez%20donc%20pas%20le%20rapport.%20%3Ap&amp;source=Blog de Jonathan Petitcolas" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/&amp;title=R%C3%A9cup%C3%A9rer+un+param%C3%A8tre+%24_GET+en+Javascript&amp;srcUrl=http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/&amp;srcTitle=R%C3%A9cup%C3%A9rer+un+param%C3%A8tre+%24_GET+en+Javascript&amp;snippet=Comment%20r%C3%A9cup%C3%A9rer%20une%20variable%20%24_GET%20en%20Javascript%20%3F%20La%20r%C3%A9ponse%20dans%20ce%20post.%20Concernant%20l%27image%20de%20cet%20article%2C%20je%20l%27ai%20trouv%C3%A9%20en%20tapant%20%22Javascript%22%20sur%20Google%20Images.%20Ne%20me%20demandez%20donc%20pas%20le%20rapport.%20%3Ap" rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/&amp;title=R%C3%A9cup%C3%A9rer+un+param%C3%A8tre+%24_GET+en+Javascript" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/&amp;title=R%C3%A9cup%C3%A9rer+un+param%C3%A8tre+%24_GET+en+Javascript" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/recuperer-un-parametre-_get-en-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Installer PHP 5.3 sur Debian Lenny</title>
		<link>http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/</link>
		<comments>http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 18:33:22 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Systèmes]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[lenny]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/?p=2930</guid>
		<description><![CDATA[PHP 5.3 est sorti il y a quelques temps déjà, mais Debian Lenny (5.0) n'a par défaut que PHP 5.2. Afin de ne pas se priver des espaces de noms (<em>namespace</em>), fonctionnalité majeure de cette version, voici la procédure (très simple) pour installer cette nouvelle version de PHP.]]></description>
			<content:encoded><![CDATA[<p>PHP 5.3 est sorti il y a quelques temps déjà, mais Debian Lenny (5.0) n'a par défaut que PHP 5.2. Afin de ne pas se priver des espaces de noms (<em>namespace</em>), fonctionnalité majeure de cette version, voici la procédure (très simple) pour installer cette nouvelle version de PHP.</p>
<p>Tout d'abord, on ajoute un nouveau dépôt, qui nous permettra de le récupérer facilement. Editons donc le fichier <em>/etc/apt/sources.list</em> :</p>
<blockquote><p># nano /etc/apt/sources.list</p></blockquote>
<p>Et ajoutons à la fin le nouveau dépôt grâce aux deux lignes suivantes :</p>
<blockquote><p># PHP 5.3<br />
deb http://php53.dotdeb.org lenny all<br />
deb-src http://php53.dotdeb.org lenny all</p></blockquote>
<p>Pour que ce dépôt soit pris en compte avec Aptitude, nous devons ajouter sa clef GPG, garante de son intégrité.</p>
<blockquote><p># gpg --keyserver keys.gnupg.net --recv-key 89DF5277<br />
# gpg -a --export 89DF5277 | sudo apt-key add -</p></blockquote>
<p>Enfin, mettons à jour Aptitude, et téléchargeons notre nouvelle version de PHP 5.3.</p>
<blockquote><p># apt-get update<br />
# apt-get upgrade<br />
# apt-get install libapache2-mod-php5 php5-cli</p></blockquote>
<p>Et vous voilà à présent avec une installation pleinement opérationnelle de PHP 5.3. Pour vous en convaincre, un petit <em>phpinfo</em> :</p>
<pre class="brush: php;">&lt;?php phpinfo(); ?&gt;</pre>
<p>Encore une victoire du développeur face au système ! :)</p>
<p class="center"><a href="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/08/php-5.3.png"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/08/php-5.3.png" alt="PHP 5.3 sur Debian Lenny" title="PHP 5.3 sur Debian Lenny" width="620" height="703" class="alignnone size-full wp-image-2931" /></a></p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge">
<ul class="socials">
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/&amp;t=Installer+PHP+5.3+sur+Debian+Lenny" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Jonathan+Petitcolas+%3A+Installer+PHP+5.3+sur+Debian+Lenny+-+http://tinyurl.com/37dbl4f&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="shr-netvibes">
			<a href="http://www.netvibes.com/share?title=Installer+PHP+5.3+sur+Debian+Lenny&amp;url=http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/" rel="nofollow" class="external" title="Submit this to Netvibes">Submit this to Netvibes</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/&amp;title=Installer+PHP+5.3+sur+Debian+Lenny&amp;summary=PHP%205.3%20est%20sorti%20il%20y%20a%20quelques%20temps%20d%C3%A9j%C3%A0%2C%20mais%20Debian%20Lenny%20%285.0%29%20n%27a%20par%20d%C3%A9faut%20que%20PHP%205.2.%20Afin%20de%20ne%20pas%20se%20priver%20des%20espaces%20de%20noms%20%28namespace%29%2C%20fonctionnalit%C3%A9%20majeure%20de%20cette%20version%2C%20voici%20la%20proc%C3%A9dure%20%28tr%C3%A8s%20simple%29%20pour%20installer%20cette%20nouvelle%20version%20de%20PHP.&amp;source=Blog de Jonathan Petitcolas" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/&amp;title=Installer+PHP+5.3+sur+Debian+Lenny&amp;srcUrl=http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/&amp;srcTitle=Installer+PHP+5.3+sur+Debian+Lenny&amp;snippet=PHP%205.3%20est%20sorti%20il%20y%20a%20quelques%20temps%20d%C3%A9j%C3%A0%2C%20mais%20Debian%20Lenny%20%285.0%29%20n%27a%20par%20d%C3%A9faut%20que%20PHP%205.2.%20Afin%20de%20ne%20pas%20se%20priver%20des%20espaces%20de%20noms%20%28namespace%29%2C%20fonctionnalit%C3%A9%20majeure%20de%20cette%20version%2C%20voici%20la%20proc%C3%A9dure%20%28tr%C3%A8s%20simple%29%20pour%20installer%20cette%20nouvelle%20version%20de%20PHP." rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/&amp;title=Installer+PHP+5.3+sur+Debian+Lenny" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/&amp;title=Installer+PHP+5.3+sur+Debian+Lenny" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/installer-php-5-3-sur-debian-lenny/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Offre d&#039;emploi : CDI développeur PHP 5 sur Paris</title>
		<link>http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/</link>
		<comments>http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 16:09:00 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[offre d'emploi]]></category>
		<category><![CDATA[TL Conseil]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/fr/?p=2889</guid>
		<description><![CDATA[Un billet "petite annonce" vous proposant un CDI en développement PHP 5 chez TL Conseil, avec une plutôt bonne rémunération (36k€ + prime). Dépêchez-vous, il n'y en aura pas pour tout le monde ! ;)]]></description>
			<content:encoded><![CDATA[<p>Un billet "petite annonce" vous proposant un <strong>CDI en développement PHP 5</strong> chez <a href="http://www.tlconseil.com">TL Conseil</a>, avec une plutôt bonne rémunération (<strong>36k€ + prime</strong>). En effet, ayant accepté une mission pour TF1, je cède ma place urgemment (place à pourvoir dès que possible, mon remplacement me permettant d'écourter mon préavis). </p>
<p>Voici le descriptif de l'offre (honteusement placée sur de nombreux sites ! :p) :</p>
<h3>Présentation de la société</h3>
<p class="center"><a href="http://www.tlconseil.com"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/tlconseil.png" alt="TL Conseil" title="TL Conseil" width="600" height="202" class="aligncenter size-full wp-image-2890" /></a></p>
<p><a href="http://www.tlconseil.com">TL Conseil</a> est une société qui intervient dans le conseil en stratégie, le lobbying et la communication d’influence. Elle a été créée 2003 par Thomas Legrain, diplômé de l’ESSEC et ancien du Boston Consulting Group.</p>
<p>Nos clients sont des grands groupes, des PME leaders de leur secteur, des institutionnels ou des collectivités locales. Actuellement, nous travaillons notamment pour le Conseil du Commerce de France, le Conseil Supérieur de l’Ordre des Experts-comptables, la Compagnie régionale des Commissaires aux Comptes de Paris, la Fédération des Centres de Gestion Agréés, Groupama ou encore la SEITA – Groupe Imperial Tobacco.</p>
<h3>Poste :</h3>
<p>Nous proposons un poste de développeur web spécialisé en PHP 5 objet pour des missions de développement tant pour la société TL Conseil que pour ses clients dans le domaine de la communication d’influence.</p>
<p>Ce poste nécessite de la rigueur dans la gestion de projets, une grande motivation, de l’autonomie et la capacité d’intervenir sur différents projets avec des contraintes de temps. Des compétences en gestion d’équipes sont également recommandées.</p>
<p>Les orientations techniques des futurs développements seront sous l’entière responsabilité du titulaire du poste.</p>
<h3>Profil recherché :</h3>
<ul>
<li>Programmation PHP 5 orientée objet</li>
<li>Utilisation d’un framework propriétaire (documentation en cours de rédaction)</li>
<li>Connaissance d’XHTML et CSS</li>
<li>Utilisation de MooTools</li>
<li>Administration Linux liée aux serveurs Web (Apache2 sous Debian)</li>
<li>Veille technologique</li>
</ul>
<h3>En pratique :</h3>
<p><strong>Lieu de travail :</strong> 6 avenue Rachel – 75018 Paris – métro Place de Clichy, Blanche.<br />
<strong>Disponibilité :</strong> dès que possible.<br />
<strong>Rémunération :</strong> 36 k€ brut annuel + prime sur chiffre d’affaires réalisé</p>
<h3>Contact :</h3>
<p>Jonathan Petitcolas – 01.42.94.93.14 – jpetitcolas@tlconseil.com</p>
<p>Vous pouvez également laisser un commentaire sur cet article.</p>
<p>Dépêchez-vous, il n'y a qu'une seule place ! ;)</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge">
<ul class="socials">
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/&amp;t=Offre+d%27emploi+%3A+CDI+d%C3%A9veloppeur+PHP+5+sur+Paris" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Jonathan+Petitcolas+%3A+Offre+d%27emploi+%3A+CDI+d%C3%A9veloppeur+PHP+5+sur+Paris+-+http://tinyurl.com/2uh2ktu&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="shr-netvibes">
			<a href="http://www.netvibes.com/share?title=Offre+d%27emploi+%3A+CDI+d%C3%A9veloppeur+PHP+5+sur+Paris&amp;url=http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/" rel="nofollow" class="external" title="Submit this to Netvibes">Submit this to Netvibes</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/&amp;title=Offre+d%27emploi+%3A+CDI+d%C3%A9veloppeur+PHP+5+sur+Paris&amp;summary=Un%20billet%20%22petite%20annonce%22%20vous%20proposant%20un%20CDI%20en%20d%C3%A9veloppement%20PHP%205%20chez%20TL%20Conseil%2C%20avec%20une%20plut%C3%B4t%20bonne%20r%C3%A9mun%C3%A9ration%20%2836k%E2%82%AC%20%2B%20prime%29.%20D%C3%A9p%C3%AAchez-vous%2C%20il%20n%27y%20en%20aura%20pas%20pour%20tout%20le%20monde%20%21%20%3B%29&amp;source=Blog de Jonathan Petitcolas" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/&amp;title=Offre+d%27emploi+%3A+CDI+d%C3%A9veloppeur+PHP+5+sur+Paris&amp;srcUrl=http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/&amp;srcTitle=Offre+d%27emploi+%3A+CDI+d%C3%A9veloppeur+PHP+5+sur+Paris&amp;snippet=Un%20billet%20%22petite%20annonce%22%20vous%20proposant%20un%20CDI%20en%20d%C3%A9veloppement%20PHP%205%20chez%20TL%20Conseil%2C%20avec%20une%20plut%C3%B4t%20bonne%20r%C3%A9mun%C3%A9ration%20%2836k%E2%82%AC%20%2B%20prime%29.%20D%C3%A9p%C3%AAchez-vous%2C%20il%20n%27y%20en%20aura%20pas%20pour%20tout%20le%20monde%20%21%20%3B%29" rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/&amp;title=Offre+d%27emploi+%3A+CDI+d%C3%A9veloppeur+PHP+5+sur+Paris" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/&amp;title=Offre+d%27emploi+%3A+CDI+d%C3%A9veloppeur+PHP+5+sur+Paris" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/offre-demploi-cdi-developpeur-php-5-sur-paris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer un nouveau projet sous Symfony</title>
		<link>http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/</link>
		<comments>http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 07:44:12 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[variable d'environnement]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/fr/?p=2865</guid>
		<description><![CDATA[Comment déployer le framework Symfony dans un projet PHP ? La solution dans ce billet. A noter qu'on se sert ici de Windows, mais qu'il est facilement transposable sous Linux. :)]]></description>
			<content:encoded><![CDATA[<p>Devant explorer de près le <a href="http://www.symfony-project.org/">framework Symfony</a>, j'ai suivi différents tutoriaux, dont l'excellent <a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/en/">Practical Symfony</a>, que je suis en train de terminer petit à petit. Cependant, celui-ci traîne peut-être un peu en longueur par moment, et je trouve l'application peut-être légèrement complexe pour un apprentissage aisé. C'est pourquoi je vous propose une alternative qui sera, ne nous le cachons pas, inspiré de ce premier.</p>
<p>Le but de cette série de billets sera de vous faire partager mon expérience naissante sur ce framework PHP en créant une application de ToDo-List. Celle-ci comprendra un espace membres basique (afin que chacun ne voit que les tâches qui lui sont attribuées) et également quelques autres petites fonctionnalités.</p>
<p><em>[Note : ce tutoriel est réalisé sous Windows mais est facilement transposable sous Linux. Seule la partie de modification de la variable d'environnement Path n'a pas lieue d'être avec le pingouin.]</em></p>
<h3>Installation de Symfony</h3>
<p>Pour installer Symfony, rien de plus simple. Je suppose tout d'abord que le lecteur sait configurer un VirtualHost avec la solution qu'il utilise habituellement (étant sous Windows pour jouer à WoW essentiellement - je sais, c'est le mal ! - j'utilise <a href="http://www.uwamp.com/">UwAmp</a>, que je trouve plus pratique que <a href="http://www.wampserver.com/">Wamp</a>). Nous nommerons ce projet <em>Toudoo</em> par la suite.</p>
<h4>Test de la configuration (1/2)</h4>
<p>Tout d'abord, vérifions que les paramètres requis par Symfony sont bien configurés sur votre machine. Pour ce faire, il existe un script récupérable à l'adresse :</p>
<p><a href="http://sf-to.org/1.4/check.php">http://sf-to.org/1.4/check.php</a></p>
<p>Téléchargez-le, et placez-le dans votre <em>DocumentRoot</em>.</p>
<p>Nous allons à présent devoir l'exécuter en deux temps. Une première fois en ligne de commandes, et une seconde fois à travers votre navigateur. Pourquoi tester deux fois ? Car la configuration en CLI (ligne de commandes) n'est pas la même que celle pour les navigateurs. C'est d'ailleurs une source d'erreurs assez fréquente lorsque l'on commence à utiliser l'interface console. </p>
<p>Commençons par le plus facile : le test à travers le navigateur. Ouvrez donc ce fichier en vous servant du VirtualHost configuré précédemment.</p>
<pre>********************************
*                              *
*  symfony requirements check  *
*                              *
********************************

php.ini used by PHP: C:\UwAmp\apache\php.ini

** Mandatory requirements **

  OK        PHP version is at least 5.2.4 (5.2.13)

** Optional checks **

  OK        PDO is installed
  OK        PDO has some drivers installed: mysql, sqlite, sqlite2
  OK        PHP-XML module is installed
  OK        XSL module is installed
  OK        The token_get_all() function is available
  OK        The mb_strlen() function is available
  OK        The iconv() function is available
  OK        The utf8_decode() is available
[[WARNING]] The posix_isatty() is available: FAILED
            *** Install and enable the php_posix extension (used to colorized the CLI output) ***
[[WARNING]] A PHP accelerator is installed: FAILED
            *** Install a PHP accelerator like APC (highly recommended) ***
  OK        php.ini has short_open_tag set to off
  OK        php.ini has magic_quotes_gpc set to off
  OK        php.ini has register_globals set to off
  OK        php.ini has session.auto_start set to off
  OK        PHP version is not 5.2.9
</pre>
<p>Comme nous pouvons le constater, nous avons deux avertissements. Ceux-ci ne sont pas dramatiques et n'empêchent en rien le bon fonctionnement du framework. L'absence de <em>posix_isatty</em> ne coloriera pas les retours en mode console (et n'est de toute façon pas disponible sous Windows), et l'accélérateur PHP n'a que peu d'importance en développement (mais s'avère vital pour gérer une bonne montée en charge en environnement de production). Nous ne nous attarderons donc pas dessus. On peut donc considérer que tout est opérationnel.</p>
<h4>Modification de la variable d'environnement Path</h4>
<p>Testons à présent en mode console. Tout d'abord, et afin d'éviter d'avoir à écrire de trop longues commandes (oui, le geek est fainéant à la base, ne l'oublions pas !), nous allons modifier la variable d'environnement <em>Path</em> qui contient les dossiers à partir desquels nous pouvons appeler directement un exécutable. Pour ce faire : <em>Menu Démarrer &gt; Clic-droit sur Ordinateur &gt; Propriétés &gt; Paramètres systèmes avancés &gt; Variables d'environnement</em>.</p>
<p>[troll]Vive la simplicité de Windows ![/troll]</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/path.png" alt="Variable d&#039;environnement PATH" title="Variable d&#039;environnement PATH" width="394" height="436" class="aligncenter size-full wp-image-2869" /></p>
<p>Dans le fenêtre (enfin) ouverte, recherchez la variable <em>Path</em>, et ajoutez le dossier contenant le binaire <em>php.exe</em>. Sous UwAmp, on rajoutera à la fin de la liste de dossiers (séparés par des points virgules) le dossier <em>C:\UwAmp\apache\php_5.3.2</em>.</p>
<p>Démarrons donc une invite de commandes (touche Windows + R ; tapez <em>cmd</em>). Grâce à notre changement de variable d'environnement, nous pourrons appeler l'interpréteur PHP directement grâce à la ligne de commande :</p>
<blockquote><p>php</p></blockquote>
<p>Sans, il aurait fallu écrire :</p>
<blockquote><p>C:\UwAmp\apache\php_5.3.2\php</p></blockquote>
<p>Vous comprenez à présent pourquoi cette modification est importante ! :)</p>
<h4>Test de la configuration (2/2)</h4>
<p>Plaçons nous donc dans notre dossier et exécutons le même script (à savoir <em>check_configuration.php</em>). Bien entendu, il faudra changer le nom de dossier par le votre. ;)</p>
<blockquote><p>D:<br />
cd D:\Sites\toudoo\<br />
php check_configuration.php</p></blockquote>
<p>On obtient alors davantage d'avertissements (par défaut) :</p>
<pre>********************************
*                              *
*  symfony requirements check  *
*                              *
********************************

php.ini used by PHP: WARNING: not using a php.ini file

** WARNING **
*  The PHP CLI can use a different php.ini file
*  than the one used with your web server.
*  (especially on the Windows platform)
*  If this is the case, please launch this
*  utility from your web server.
** WARNING **

** Mandatory requirements **

  OK        PHP version is at least 5.2.4 (5.3.2)

** Optional checks **

  OK        PDO is installed
[[WARNING]] PDO has some drivers installed: : FAILED
            *** Install PDO drivers (mandatory for Propel and Doctrine) ***
  OK        PHP-XML module is installed
[[WARNING]] XSL module is installed: FAILED
            *** Install and enable the XSL module (recommended for Propel) ***
  OK        The token_get_all() function is available
[[WARNING]] The mb_strlen() function is available: FAILED
            *** Install and enable the mbstring extension ***
  OK        The iconv() function is available
  OK        The utf8_decode() is available
[[WARNING]] The posix_isatty() is available: FAILED
            *** Install and enable the php_posix extension (used to colorized the CLI output) ***
[[WARNING]] A PHP accelerator is installed: FAILED
            *** Install a PHP accelerator like APC (highly recommended) ***
[[WARNING]] php.ini has short_open_tag set to off: FAILED
            *** Set it to off in php.ini ***
[[WARNING]] php.ini has magic_quotes_gpc set to off: FAILED
            *** Set it to off in php.ini ***
  OK        php.ini has register_globals set to off
  OK        php.ini has session.auto_start set to off
  OK        PHP version is not 5.2.9</pre>
<p>On voit bien que le fichier de configuration utilisé n'est pas le même. La solution ? Utiliser le même. ;)</p>
<p>Pour ce faire, copiez le fichier <em>C:\UwAmp\apache\php.ini</em> dans <em>C:\UwAmp\apache\php_5.3.2\php.ini</em>. Si le fichier n'existe pas, créez le. Puis, redémarrez votre serveur Apache, et réessayez. Le test devrait à présent être concluant (malgré l'appartion de deux messages d'erreurs chez moi indiquant que les fichiers <em>php_exif.dll</em> et <em>php_mbstring.dll</em> sont manquants... ce qui n'a pas l'air d'influer sur la suite).</p>
<p>Une fois que la configuration est opérationnelle, on supprime le fichier <em>check_configuration.php</em>. Fichier avec un nom standard, il pourrait révéler certaines choses à un pirate potentiel. Jouons donc la carte de la sécurité. ;)</p>
<h3>Déploiement du framework</h3>
<p>Après tant de vérification et de configuration ô combien pas très passionante, nous pouvons enfin <a href="http://www.symfony-project.org/installation">téléchargez Symfony</a>. Nous prendrons la dernière version stable (ici, la 1.4) afin de profiter des dernières nouveautés du framework. </p>
<p>Décompressez-là dans un dossier (par convention) <em>lib/vendor/</em> de votre <em>DocumentRoot</em>. Il est important de respecter toutes les conventions de nommage utilisées lors de l'utilisation d'un framework. Et encore plus pour Symfony, qui utilise tout un ensemble de scripts de génération automatique qui nous feront gagner un temps précieux.</p>
<p>Retournons donc en ligne de commande, et exécutons le script suivant :</p>
<blockquote><p>php lib\vendor\data\bin\symfony generate:project toudoo</p></blockquote>
<p>La sortie de ce script est assez impressionante. Mais rien de bien extraordinaire, si ce n'est la création de toute l'arborescence de dossiers du projet. </p>
<pre>
>> dir+      D:\Sites\toudoo\apps
>> dir+      D:\Sites\toudoo\cache
>> dir+      D:\Sites\toudoo\config
>> file+     D:\Sites\toudoo\config/ProjectConfiguration.class.php
>> file+     D:\Sites\toudoo\config/properties.ini
>> file+     D:\Sites\toudoo\config/rsync_exclude.txt
>> dir+      D:\Sites\toudoo\data
>> dir+      D:\Sites\toudoo\data/fixtures
>> file+     D:\Sites\toudoo\data/fixtures/fixtures.yml
>> dir+      D:\Sites\toudoo\lib/form
>> file+     D:\Sites\toudoo\lib/form/BaseForm.class.php
>> dir+      D:\Sites\toudoo\log
>> dir+      D:\Sites\toudoo\plugins
>> file+     D:\Sites\toudoo\symfony
>> dir+      D:\Sites\toudoo\test
>> dir+      D:\Sites\toudoo\test/bootstrap
>> file+     D:\Sites\toudoo\test/bootstrap/functional.php
>> file+     D:\Sites\toudoo\test/bootstrap/unit.php
>> dir+      D:\Sites\toudoo\test/functional
>> dir+      D:\Sites\toudoo\test/unit
>> dir+      D:\Sites\toudoo\web
>> file+     D:\Sites\toudoo\web/.htaccess
>> dir+      D:\Sites\toudoo\web/css
>> file+     D:\Sites\toudoo\web/css/main.css
>> dir+      D:\Sites\toudoo\web/images
>> dir+      D:\Sites\toudoo\web/js
>> file+     D:\Sites\toudoo\web/robots.txt
>> dir+      D:\Sites\toudoo\web/uploads
>> dir+      D:\Sites\toudoo\web/uploads/assets
>> tokens    D:/Sites/toudoo/config/ProjectConfiguration.class.php
>> tokens    D:/Sites/toudoo/config/properties.ini
>> tokens    D:/Sites/toudoo/config/rsync_exclude.txt
>> tokens    D:/Sites/toudoo/config/ProjectConfiguration.class.php
>> tokens    D:/Sites/toudoo/config/properties.ini
>> tokens    D:/Sites/toudoo/config/rsync_exclude.txt
>> tokens    D:/Sites/toudoo/lib/form/BaseForm.class.php
>> file+     D:\Sites\toudoo\config/databases.yml
>> dir+      D:\Sites\toudoo\config/doctrine
>> file+     D:\Sites\toudoo\config/doctrine/schema.yml
>> chmod 777 D:\Sites\toudoo\web\uploads
>> chmod 777 D:\Sites\toudoo\cache
>> chmod 777 D:\Sites\toudoo\log
>> chmod 777 D:\Sites\toudoo/symfony
>> chmod 777 D:/Sites/toudoo/web/uploads/assets
>> tokens    D:/Sites/toudoo/config/databases.yml
>> tokens    D:/Sites/toudoo/config/doctrine/schema.yml
>> tokens    D:/Sites/toudoo/config/ProjectConfiguration.class.php
>> tokens    D:/Sites/toudoo/config/properties.ini
>> tokens    D:/Sites/toudoo/config/rsync_exclude.txt
>> tokens    D:/Sites/toudoo/lib/form/BaseForm.class.php</pre>
<p>Je ne m'étendrais pas davantage sur l'utilité de tel ou tel dossier. Nous verrons cela progressivement.</p>
<p>On remarquera simplement la création d'un fichier <em>symfony</em> à la racine de notre dossier, qui est simplement un lien vers le fichier <em>/lib/vendor/data/bin/symfony</em>. Encore une fois, on évitera ainsi de trop se fatiguer en écrivant du texte inutile. ;)</p>
<p>Il est temps à présent de créer une application. En gros, une application sera simplement un ensemble de fichiers qui s'appuiera sur les mêmes données d'un site. Nous allons générer la partie utilisateur (<em>frontend</em>). Soit :</p>
<blockquote><p>php symfony generate:app frontend</p></blockquote>
<p>Encore une fois, pas mal de blablas en sortie :</p>
<pre>>> dir+      D:\Sites\toudoo\apps/frontend\config
>> file+     D:\Sites\toudoo\apps/frontend\config/app.yml
>> file+     D:\Sites\toudoo\apps/frontend\c...licationConfiguration.class.php
>> file+     D:\Sites\toudoo\apps/frontend\config/cache.yml
>> file+     D:\Sites\toudoo\apps/frontend\config/factories.yml
>> file+     D:\Sites\toudoo\apps/frontend\config/filters.yml
>> file+     D:\Sites\toudoo\apps/frontend\config/routing.yml
>> file+     D:\Sites\toudoo\apps/frontend\config/security.yml
>> file+     D:\Sites\toudoo\apps/frontend\config/settings.yml
>> file+     D:\Sites\toudoo\apps/frontend\config/view.yml
>> dir+      D:\Sites\toudoo\apps/frontend\i18n
>> dir+      D:\Sites\toudoo\apps/frontend\lib
>> file+     D:\Sites\toudoo\apps/frontend\lib/myUser.class.php
>> dir+      D:\Sites\toudoo\apps/frontend\modules
>> dir+      D:\Sites\toudoo\apps/frontend\templates
>> file+     D:\Sites\toudoo\apps/frontend\templates/layout.php
>> tokens    D:/Sites/toudoo/apps/frontend/config/settings.yml
>> file+     D:\Sites\toudoo\web/index.php
>> file+     D:\Sites\toudoo\web/frontend_dev.php
>> tokens    D:\Sites\toudoo\web/index.php
>> tokens    D:\Sites\toudoo\web/frontend_dev.php
>> rename    D:\Sites\toudoo\apps/frontend/c...frontendConfiguration.class.php
>> tokens    D:\Sites\toudoo\apps/frontend/c...frontendConfiguration.class.php
>> chmod 777 D:\Sites\toudoo\web\uploads
>> chmod 777 D:\Sites\toudoo\cache
>> chmod 777 D:\Sites\toudoo\log
>> chmod 777 D:\Sites\toudoo/symfony
>> chmod 777 D:/Sites/toudoo/web/uploads/assets
>> dir+      D:\Sites\toudoo\test/functional/frontend</pre>
<p>Il est temps de changer légèrement la configuration de notre serveur Web, maintenant que le projet est configuré. On remarque la présence d'un dossier <em>web</em>. C'est en fait le <em>DocumentRoot</em> de notre projet. Cela nous assurera que l'internaute ne pourra farfouiller gaiement dans le fichier de configuration des accès à la  base de données par exemple, qui lui est situé à l'extérieur (dans <em>config</em>). On modifie donc le <em>DocumentRoot</em>.</p>
<p>Puis, ouvrez votre projet dans votre navigateur, pour voir ce que ça donne.</p>
<p class="center"><a href="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/symfony-sans-css1.png"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/symfony-sans-css1-600x337.png" alt="Symfony sans CSS" title="Symfony sans CSS" width="600" height="337" class="aligncenter size-medium wp-image-2879" /></a></p>
<p>Ca a l'air de marcher, mais c'est plutôt hideux, non ? Et pour cause : aucun CSS n'est chargé. En regardant dans le code source, on remarque l'appel à une feuille de style située à l'adresse <em>/sf/sf_default/css/screen.css</em>. Problème, aucun dossier <em>sf</em> n'est présent dans le dossier <em>web/</em>. Que faire ? Simplement mettre en place le bon alias dans votre fichier de configuration, dans la partie correspondante à votre VirtualHost. Vous pouvez également le faire graphiquement avec UwAmp, ce qui est plus simple et plus rapide (je trouve).</p>
<blockquote><p>Alias /sf "D:\Sites\toudoo\lib\vendor\data\web\sf"</p></blockquote>
<p>Redémarrez votre serveur Apache pour qu'il prenne en compte vos modifications, et réessayez de visualiser votre site.</p>
<p class="center"><a href="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/symfony.png"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/07/symfony-600x403.png" alt="Symfony - Page par défaut" title="Symfony - Page par défaut" width="600" height="403" class="aligncenter size-medium wp-image-2877" /></a></p>
<p>Félicitations ! Vous venez de déployer le framework Symfony sur votre premier projet ! Vous avez également déployé un environnement de développement, volontairement éclipsé (comme l'IDE :p) dans ce billet, car il se verra attribué un article à lui tout seul.</p>
<p>N'hésitez pas à faire part de vos remarques. Grand débutant en Symfony, je n'ai sans doute pas tous les réflexes des codeurs les plus aguerris en la matière ! ;)</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge">
<ul class="socials">
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/&amp;t=Cr%C3%A9er+un+nouveau+projet+sous+Symfony" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Jonathan+Petitcolas+%3A+Cr%C3%A9er+un+nouveau+projet+sous+Symfony+-+http://tinyurl.com/34ce83m&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="shr-netvibes">
			<a href="http://www.netvibes.com/share?title=Cr%C3%A9er+un+nouveau+projet+sous+Symfony&amp;url=http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/" rel="nofollow" class="external" title="Submit this to Netvibes">Submit this to Netvibes</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/&amp;title=Cr%C3%A9er+un+nouveau+projet+sous+Symfony&amp;summary=Comment%20d%C3%A9ployer%20le%20framework%20Symfony%20dans%20un%20projet%20PHP%20%3F%20La%20solution%20dans%20ce%20billet.%20A%20noter%20qu%27on%20se%20sert%20ici%20de%20Windows%2C%20mais%20qu%27il%20est%20facilement%20transposable%20sous%20Linux.%20%3A%29&amp;source=Blog de Jonathan Petitcolas" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/&amp;title=Cr%C3%A9er+un+nouveau+projet+sous+Symfony&amp;srcUrl=http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/&amp;srcTitle=Cr%C3%A9er+un+nouveau+projet+sous+Symfony&amp;snippet=Comment%20d%C3%A9ployer%20le%20framework%20Symfony%20dans%20un%20projet%20PHP%20%3F%20La%20solution%20dans%20ce%20billet.%20A%20noter%20qu%27on%20se%20sert%20ici%20de%20Windows%2C%20mais%20qu%27il%20est%20facilement%20transposable%20sous%20Linux.%20%3A%29" rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/&amp;title=Cr%C3%A9er+un+nouveau+projet+sous+Symfony" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/&amp;title=Cr%C3%A9er+un+nouveau+projet+sous+Symfony" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/creer-un-nouveau-projet-sous-symfony/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Calculer une clef RIB</title>
		<link>http://www.jonathan-petitcolas.com/calculer-une-clef-rib/</link>
		<comments>http://www.jonathan-petitcolas.com/calculer-une-clef-rib/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 06:17:02 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[clef RIB]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mathématiques]]></category>
		<category><![CDATA[modulo]]></category>
		<category><![CDATA[RIB]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/fr/?p=2812</guid>
		<description><![CDATA[Comment calculer une clef RIB étant donné le code banque, le code guichet et le numéro de compte ? Explication théorique et mise en pratique en Javascript.]]></description>
			<content:encoded><![CDATA[<p>Les RIB... Ces documents que l'on nous demande souvent sans jamais en avoir sous la main au moment opportun... Quelle galère ! Pour ma part, je garde toujours dans mon portefeuille une preuve de dépôt de chèques. Problème, il n'y a pas la clef RIB dessus. Heureusement, il est facile de la calculer, cette valeur permettant simplement de vérifier la validité du numéro de compte.</p>
<h3>Définition de la clef RIB</h3>
<p>La clef RIB est, par définition, le reste de la division euclidienne du nombre correspondant au code banque, au code guichet et au numéro de compte. Ce nombre, noté R, peut se décomposer comme suit :</p>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=R%20%3D%20B.10%5E%7B18%7D%20%2B%20G.10%5E%7B13%7D%20%2B%20C.10%5E2%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='R = B.10^{18} + G.10^{13} + C.10^2 ' title='R = B.10^{18} + G.10^{13} + C.10^2 ' class='latex' /></p>
<p>Où :</p>
<ul>
<li>B est le code banque, sur 5 chiffres,</li>
<li>G est le code guichet, sur 5 chiffres,</li>
<li>C est le compte banque, sur 11 chiffres</li>
</ul>
<p>On démarre directement par les centaines (dix puissance deux) car la clef RIB tient sur deux chiffres (un modulo 97 ne peut être supérieur ou égal à 97).</p>
<p>La formule de calcul d'une clef RIB est donc :</p>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=K%20%3D%2097%20-%20%28%20B.10%5E%7B18%7D%20%2B%20G.10%5E%7B13%7D%20%2B%20C.10%5E2%20%29%20%5Bmod%5C%2097%5D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='K = 97 - ( B.10^{18} + G.10^{13} + C.10^2 ) [mod\ 97]' title='K = 97 - ( B.10^{18} + G.10^{13} + C.10^2 ) [mod\ 97]' class='latex' /></p>
<p>Un numéro de compte peut comporter des lettres. Dans ce cas, il faut appliquer la correspondance suivante :</p>
<table>
<thead>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
</thead>
<tbody>
<tr>
<td class="center">A</td>
<td class="center">B</td>
<td class="center">C</td>
<td class="center">D</td>
<td class="center">E</td>
<td class="center">F</td>
<td class="center">G</td>
<td class="center">H</td>
<td class="center">I</td>
</tr>
<tr>
<td class="center">J</td>
<td class="center">K</td>
<td class="center">L</td>
<td class="center">M</td>
<td class="center">N</td>
<td class="center">O</td>
<td class="center">P</td>
<td class="center">Q</td>
<td class="center">R</td>
</tr>
<tr>
<td class="center"></td>
<td class="center">S</td>
<td class="center">T</td>
<td class="center">U</td>
<td class="center">V</td>
<td class="center">W</td>
<td class="center">X</td>
<td class="center">Y</td>
<td class="center">Z</td>
</tr>
</tbody>
</table>
<h3>Calcul de la clef RIB</h3>
<p>Si on veut calculer cette clef par programmation (la calculer à la main étant impensable, à moins d'avoir quelques tendances masochistes), il nous faudra modifier cette formule. En effet, le premier terme de cette somme est en puissance 18, ce qui dépasse amplement la taille maximum d'une entier (même non signé) codé sur 32 bits.</p>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=2%5E%7B32%7D%20%3D%204294967296%20%5Capprox%204.10%5E%7B9%7D%20%3C%20%3C%2010%5E%7B18%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='2^{32} = 4294967296 \approx 4.10^{9} &lt; &lt; 10^{18}' title='2^{32} = 4294967296 \approx 4.10^{9} &lt; &lt; 10^{18}' class='latex' /></p>
<p>La solution ? Appliquer déjà le modulo sur les puissances de 10, et après seulement faire le calcul. Pour ce faire, il est utile de rappeler deux propriétés des modulos :</p>
<ol>
<li>Le modulo d'une somme est égal au modulo de la somme des modulos.</li>
<li>Le modulo d'un produit est égal au modulo du produit des modulos.</li>
</ol>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=a%20%2A%20b%20%5Bn%5D%20%3D%20%28%20a%5Bn%5D%20%2A%20b%5Bn%5D%20%29%20%5Bn%5D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='a * b [n] = ( a[n] * b[n] ) [n]' title='a * b [n] = ( a[n] * b[n] ) [n]' class='latex' /></p>
<p>On applique cette formule dans notre cas :</p>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=B.10%5E%7B18%7D%20%3D%20%28B%5B97%5D%20%2A%2010%5E%7B18%7D%5B97%5D%29%5B97%5D%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='B.10^{18} = (B[97] * 10^{18}[97])[97] ' title='B.10^{18} = (B[97] * 10^{18}[97])[97] ' class='latex' /></p>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=B.10%5E%7B18%7D%20%3D%20%28B%5B97%5D%20%2A%2089%29%20%5B97%5D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='B.10^{18} = (B[97] * 89) [97]' title='B.10^{18} = (B[97] * 89) [97]' class='latex' /></p>
<p>En procédant de même pour les autres termes de l'addition, on obtient :</p>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=G.10%5E%7B13%7D%20%3D%20%28G%5B97%5D%20%2A%2015%29%20%5B97%5D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='G.10^{13} = (G[97] * 15) [97]' title='G.10^{13} = (G[97] * 15) [97]' class='latex' /></p>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=C.10%5E%7B7%7D%20%3D%20%28C%5B97%5D%20%2A%203%29%5B97%5D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C.10^{7} = (C[97] * 3)[97]' title='C.10^{7} = (C[97] * 3)[97]' class='latex' /></p>
<p>On en déduit donc la nouvelle formule de calcul de notre clef RIB :</p>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=K%20%3D%2097%20-%20%28%20B.10%5E%7B18%7D%20%2B%20G.10%5E%7B13%7D%20%2B%20C.10%5E2%20%29%20%5B97%5D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='K = 97 - ( B.10^{18} + G.10^{13} + C.10^2 ) [97]' title='K = 97 - ( B.10^{18} + G.10^{13} + C.10^2 ) [97]' class='latex' /></p>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=K%20%3D%2097%20-%20%28%2089%20%2A%20B%5B97%5D%20%2B%2015%20%2A%20G%5B97%5D%20%2B%203%20%2A%20C%20%5B97%5D%20%29%20%5B97%5D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='K = 97 - ( 89 * B[97] + 15 * G[97] + 3 * C [97] ) [97]' title='K = 97 - ( 89 * B[97] + 15 * G[97] + 3 * C [97] ) [97]' class='latex' /></p>
<p>Or, si on applique la propriété de la somme des modulos de nouveau, on a bien :</p>
<p class="center"><img src='http://s.wordpress.com/latex.php?latex=K%20%3D%2097%20-%20%2889B%20%2B%2015G%20%2B%203C%29%5B97%5D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='K = 97 - (89B + 15G + 3C)[97]' title='K = 97 - (89B + 15G + 3C)[97]' class='latex' /></p>
<p>Ce qui se calcule à présent très aisément, que ce soit en Javascript ou dans tout autre langage. Voir même à la calculatrice. :)</p>
<table>
<tr>
<th style="width: 130px;">Code banque (B)</th>
<th style="width: 130px;">Code guichet (G)</th>
<th>Numéro de compte (C)</th>
<th style="width: 100px;">Clef RIB (K)</th>
</tr>
<tr>
<td class="center">
<input class="input center" type="text" name="B" id="B" maxlength="5" length="5" style="width: 100px;" /></td>
<td class="center">
<input class="input center" type="text" name="G" id="G" maxlength="5" length="5" style="width: 100px;" /></td>
<td class="center">
<input class="input center" type="text" name="C" id="C" maxlength="11" length="11" style="width: 180px;"  /></td>
<td class="center"><span id="rib"></span></td>
</tr>
</table>
<p><!--[inline]--><script type="text/javascript">
$each($$('.input'), function(item){
	item.addEvent('change', function(e){
		var key = 89 * $('B').value + 15 * $('G').value + 3 * $('C').value;
		key = key % 97;
		key = 97 - key;
		$('rib').set('text', key);
	});
});
</script><!--[/inline]--></p>
<p>Pour les plus curieux d'entre vous, le code correspondant est (en MooTools) :</p>
<pre class="brush: jscript;">$each($$('.input'), function(item){
	item.addEvent('change', function(e){

		var key = 89 * $('B').value + 15 * $('G').value + 3 * $('C').value;
		key = key % 97;
		key = 97 - key;

		$('rib').set('text', key);
	});
});</pre>
<p>Tout simplement. Sachant que seuls les éléments de mon formulaire de calcul de clef RIB ont la classe <em>input</em>.</p>
<p>Libre à vous de l'implémenter dans vos propres programmes. :)</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge">
<ul class="socials">
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.jonathan-petitcolas.com/calculer-une-clef-rib/&amp;t=Calculer+une+clef+RIB" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Jonathan+Petitcolas+%3A+Calculer+une+clef+RIB+-+http://tinyurl.com/2uo5yv5&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="shr-netvibes">
			<a href="http://www.netvibes.com/share?title=Calculer+une+clef+RIB&amp;url=http://www.jonathan-petitcolas.com/calculer-une-clef-rib/" rel="nofollow" class="external" title="Submit this to Netvibes">Submit this to Netvibes</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.jonathan-petitcolas.com/calculer-une-clef-rib/&amp;title=Calculer+une+clef+RIB&amp;summary=Comment%20calculer%20une%20clef%20RIB%20%C3%A9tant%20donn%C3%A9%20le%20code%20banque%2C%20le%20code%20guichet%20et%20le%20num%C3%A9ro%20de%20compte%20%3F%20Explication%20th%C3%A9orique%20et%20mise%20en%20pratique%20en%20Javascript.&amp;source=Blog de Jonathan Petitcolas" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.jonathan-petitcolas.com/calculer-une-clef-rib/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.jonathan-petitcolas.com/calculer-une-clef-rib/&amp;title=Calculer+une+clef+RIB&amp;srcUrl=http://www.jonathan-petitcolas.com/calculer-une-clef-rib/&amp;srcTitle=Calculer+une+clef+RIB&amp;snippet=Comment%20calculer%20une%20clef%20RIB%20%C3%A9tant%20donn%C3%A9%20le%20code%20banque%2C%20le%20code%20guichet%20et%20le%20num%C3%A9ro%20de%20compte%20%3F%20Explication%20th%C3%A9orique%20et%20mise%20en%20pratique%20en%20Javascript." rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.jonathan-petitcolas.com/calculer-une-clef-rib/&amp;title=Calculer+une+clef+RIB" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.jonathan-petitcolas.com/calculer-une-clef-rib/&amp;title=Calculer+une+clef+RIB" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.jonathan-petitcolas.com/calculer-une-clef-rib/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/calculer-une-clef-rib/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Guadeloupe : une colonie française ?</title>
		<link>http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/</link>
		<comments>http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 09:18:16 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
				<category><![CDATA[colonisation]]></category>
		<category><![CDATA[Guadeloupe]]></category>
		<category><![CDATA[TéléLibre]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/fr/?p=2778</guid>
		<description><![CDATA[Voici un reportage au titre provocateur sur la Guadeloupe, contrée éloignée au passé tumultueux et au présent chargé de souvenirs esclavagistes. Merci à La Télé Libre pour la réalisation de ce documentaire fort intéressant. :) Share this on Facebook Tweet This! Submit this to Netvibes Share this on LinkedIn Post on Google Buzz Add this [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un reportage au titre provocateur sur la Guadeloupe, contrée éloignée au passé tumultueux et au présent chargé de souvenirs esclavagistes.</p>
<div class="center"><object width="600" height="338"><param name="movie" value="http://www.dailymotion.com/swf/video/xdmg2c_guadeloupe-une-colonie-francaise-y_news"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed type="application/x-shockwave-flash" src="http://www.dailymotion.com/swf/video/xdmg2c_guadeloupe-une-colonie-francaise-y_news" width="600" height="338" allowfullscreen="true" allowscriptaccess="always"></embed></object></div>
<p>Merci à <a href="http://latelelibre.fr/">La Télé Libre</a> pour la réalisation de ce documentaire fort intéressant. :)</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge">
<ul class="socials">
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/&amp;t=Guadeloupe+%3A+une+colonie+fran%C3%A7aise+%3F" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Jonathan+Petitcolas+%3A+Guadeloupe+%3A+une+colonie+fran%C3%A7aise+%3F+-+http://tinyurl.com/2vbg55s&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="shr-netvibes">
			<a href="http://www.netvibes.com/share?title=Guadeloupe+%3A+une+colonie+fran%C3%A7aise+%3F&amp;url=http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/" rel="nofollow" class="external" title="Submit this to Netvibes">Submit this to Netvibes</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/&amp;title=Guadeloupe+%3A+une+colonie+fran%C3%A7aise+%3F&amp;summary=Voici%20un%20reportage%20au%20titre%20provocateur%20sur%20la%20Guadeloupe%2C%20contr%C3%A9e%20%C3%A9loign%C3%A9e%20au%20pass%C3%A9%20tumultueux%20et%20au%20pr%C3%A9sent%20charg%C3%A9%20de%20souvenirs%20esclavagistes.%0D%0A%0D%0A%0D%0A%0D%0AMerci%20%C3%A0%20La%20T%C3%A9l%C3%A9%20Libre%20pour%20la%20r%C3%A9alisation%20de%20ce%20documentaire%20fort%20int%C3%A9ressant.%20%3A%29&amp;source=Blog de Jonathan Petitcolas" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/&amp;title=Guadeloupe+%3A+une+colonie+fran%C3%A7aise+%3F&amp;srcUrl=http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/&amp;srcTitle=Guadeloupe+%3A+une+colonie+fran%C3%A7aise+%3F&amp;snippet=Voici%20un%20reportage%20au%20titre%20provocateur%20sur%20la%20Guadeloupe%2C%20contr%C3%A9e%20%C3%A9loign%C3%A9e%20au%20pass%C3%A9%20tumultueux%20et%20au%20pr%C3%A9sent%20charg%C3%A9%20de%20souvenirs%20esclavagistes.%0D%0A%0D%0A%0D%0A%0D%0AMerci%20%C3%A0%20La%20T%C3%A9l%C3%A9%20Libre%20pour%20la%20r%C3%A9alisation%20de%20ce%20documentaire%20fort%20int%C3%A9ressant.%20%3A%29" rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/&amp;title=Guadeloupe+%3A+une+colonie+fran%C3%A7aise+%3F" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/&amp;title=Guadeloupe+%3A+une+colonie+fran%C3%A7aise+%3F" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/guadeloupe-une-colonie-francaise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installation d&#039;un environnement de développement Android</title>
		<link>http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/</link>
		<comments>http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 08:33:14 +0000</pubDate>
		<dc:creator>Jonathan Petitcolas</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[adt]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[avd]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://www.jonathan-petitcolas.com/fr/?p=2771</guid>
		<description><![CDATA[Alors qu'Android augmente ses parts de marchés de manière singulière, voici un premier article décrivant l'installation de l'environnement de développement Android.]]></description>
			<content:encoded><![CDATA[<p>Alors qu'Android augmente ses parts de marchés de manière singulière, je vous propose une série de billets vous permettant d'apprendre à développer sous ce système embarqué. Ce premier article ne sera pas bien palpitant, puisque nous verrons uniquement l'installation d'un environnement de développement propice à la création d'applications Android.</p>
<h3>Téléchargement du SDK</h3>
<p>Dans un premier temps, il nous faudra télécharger le SDK (Software Developpment Kit) qui contiendra toutes les briques logicielles nous permettant de développer facilement des applications complexes. Pour ce faire, il suffit de se rendre sur le <a href="http://developer.android.com/sdk/index.html">site officiel</a> et de télécharger la version correspondante à votre système d'exploitation.</p>
<p>Le fichier téléchargé se présente sous la forme d'une archive. Décompressez la dans un dossier de votre choix. </p>
<p>Le SDK est à présent installé. </p>
<h3>Installation et configuration d'Eclipse</h3>
<p>Pour développer, nous allons utiliser l'excellent IDE <a href="http://www.eclipse.org/downloads/">Eclipse</a>, accompagné du plug-in ADT.</p>
<p>Tout d'abord, si ce n'est déjà fait, installez <a href="http://www.eclipse.org/downloads/">Eclipse</a>. A noter que si vous utilisez déjà une version d'Eclipse (par exemple, dans mon cas, Eclipse PDT All-in-one, spécialisée dans le développement PHP), vous pouvez utilisez cette version et n'êtes donc pas obligés de réinstaller une seconde fois ce logiciel.</p>
<p>A présent, nous allons installer le plug-in ADT, qui nous permettra de développer pour Android. Pour ce faire, il suffit de se rendre dans le menu <em>Help &gt; Install new software...</em>. Puis, cliquez sur <em>Add site</em>. Spécifiez alors l'adresse de téléchargement d'ADT, à savoir : <a href="https://dl-ssl.google.com/android/eclipse/">https://dl-ssl.google.com/android/eclipse/</a>.</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/06/adt-site.png" alt="Site d&#039;installation du plug-in Eclipse ADT" title="Site d&#039;installation du plug-in Eclipse ADT" width="489" height="188" class="aligncenter size-full wp-image-2761" /></p>
<p>A présent, sélectionnez le site récemment ajouté, et cochez la case <em>Developper Tools</em>. Il ne vous reste plus qu'à faire suivant suivant suivant, et d'accepter les licences éventuelles.</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/06/Sans-titre.png" alt="Installation du plug-in Eclipse ADT" title="Installation du plug-in Eclipse ADT" width="599" height="534" class="aligncenter size-full wp-image-2763" /></p>
<p>Redémarrez alors Eclipse comme conseillé. </p>
<p>On configure de suite le compilateur afin qu'il puisse retrouver le chemin du SDK. Dans <em>Windows &gt; Preferences &gt; Android</em>, spécifiez le chemin de votre SDK. </p>
<p class="center"><a href="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/06/adt-select-sdk.png"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/06/adt-select-sdk-600x347.png" alt="Sélection du chemin du SDK - Plug-in Eclipse ADT" title="Sélection du chemin du SDK - Plug-in Eclipse ADT" width="600" height="347" class="aligncenter size-medium wp-image-2764" /></a></p>
<p>A présent, le plug-in est installé. Nous allons cependant récupérer quelques packages complémentaires, propres à Android, afin notamment de spécifier la cible de notre compilation (à savoir, pour quelle version d'Android nous allons compiler notre programme). On se rend donc dans <em>Window &gt; Android SDK and AVD Manager</em>. </p>
<p class="center"><a href="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/06/package-adt.png"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/06/package-adt-600x210.png" alt="Installation des autres packages ADT" title="Installation des autres packages ADT" width="600" height="210" class="aligncenter size-medium wp-image-2766" /></a></p>
<p>Sélectionnez la seule case qui devrait être disponible, et installez tous les packages disponibles.</p>
<p>Nous voilà à présent prêt pour tester notre installation.</p>
<h3>Test de l'émulateur Android</h3>
<p>Créons donc un nouveau projet : <em>File &gt; New &gt; Project</em>.</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/06/configuration-projet-android.png" alt="Configuration d&#039;un nouveau projet Android" title="Configuration d&#039;un nouveau projet Android" width="536" height="847" class="aligncenter size-full wp-image-2768" /></p>
<p>Votre projet doit normalement être créé, et contenir une arborescence relativement complexe.</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/06/architecture-android.png" alt="Architecture d&#039;un projet Android" title="Architecture d&#039;un projet Android" width="445" height="310" class="aligncenter size-full wp-image-2769" /></p>
<p>Je ne m'étendrai pas sur cette architecture pour l'instant. L'étude de celle-ci interviendra dans un prochain billet. </p>
<p>Maintenant, nous allons configurer un terminal virtuel, afin de pouvoir tester sur votre PC directement votre application. On retourne donc dans <em>Window &gt; Android SDK and AVD Manager</em>, et dans la section <em>Virtual devices</em>, on ajoute un nouvel émulateur. Donnez-lui un nom, et une cible. Pour ma part, possédant un Samsung Galaxy tournant sous Android 1.5, je choisis la cible correspondante. Les autres paramètres peuvent être laissés par défaut.</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/06/create-new-android-virtual-device.png" alt="Création d&#039;un AVD - Android" title="Création d&#039;un AVD - Android" width="410" height="566" class="aligncenter size-full wp-image-2770" /></p>
<p>Il ne nous reste plus qu'à tester notre projet. Lancez donc la compilation de votre projet. Dans le fenêtre vous demandant sur quel périphérique le lancer, sélectionnez l'AVD (Android Virtual Device) fraîchement créé. Un terminal devrait alors apparaître. Patientez pendant que le système s'initialise. C'est lent, très lent, je vous l'accorde.</p>
<p>Vous devriez alors finalement voir, si tout fonctionne correctement, un joli <em>Hello World!</em>.</p>
<p class="center"><img src="http://www.jonathan-petitcolas.com/wp-content/uploads/2010/06/hello-world.png" alt="Hello World!" title="Hello World!" width="318" height="463" class="aligncenter size-full wp-image-2772" /></p>
<p>Par la suite, ne fermez surtout pas la fenêtre de l'émulateur. Vous pouvez faire des modifications sur le code source et recompiler. L'émulateur n'aura alors pas à redémarrer, et vous gagnerez donc pas mal de temps. :)</p>
<p>Enfin, dernière petite remarque : si le projet ne compile pas, supprimez tous les fichiers <em>*.xml.out</em> et faîtes un nettoyage (<em>Clean</em>) de votre projet. Android a l'air très capricieux sur ce point. :)</p>
<p>Dans un prochain billet, nous étudierons un peu plus en détails l'architecture d'un projet Android.</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-knowledge">
<ul class="socials">
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/&amp;t=Installation+d%27un+environnement+de+d%C3%A9veloppement+Android" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Jonathan+Petitcolas+%3A+Installation+d%27un+environnement+de+d%C3%A9veloppement+Android+-+http://tinyurl.com/2wsx4ez&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="shr-netvibes">
			<a href="http://www.netvibes.com/share?title=Installation+d%27un+environnement+de+d%C3%A9veloppement+Android&amp;url=http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/" rel="nofollow" class="external" title="Submit this to Netvibes">Submit this to Netvibes</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/&amp;title=Installation+d%27un+environnement+de+d%C3%A9veloppement+Android&amp;summary=Alors%20qu%27Android%20augmente%20ses%20parts%20de%20march%C3%A9s%20de%20mani%C3%A8re%20singuli%C3%A8re%2C%20voici%20un%20premier%20article%20d%C3%A9crivant%20l%27installation%20de%20l%27environnement%20de%20d%C3%A9veloppement%20Android.&amp;source=Blog de Jonathan Petitcolas" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/&amp;title=Installation+d%27un+environnement+de+d%C3%A9veloppement+Android&amp;srcUrl=http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/&amp;srcTitle=Installation+d%27un+environnement+de+d%C3%A9veloppement+Android&amp;snippet=Alors%20qu%27Android%20augmente%20ses%20parts%20de%20march%C3%A9s%20de%20mani%C3%A8re%20singuli%C3%A8re%2C%20voici%20un%20premier%20article%20d%C3%A9crivant%20l%27installation%20de%20l%27environnement%20de%20d%C3%A9veloppement%20Android." rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/&amp;title=Installation+d%27un+environnement+de+d%C3%A9veloppement+Android" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/&amp;title=Installation+d%27un+environnement+de+d%C3%A9veloppement+Android" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.jonathan-petitcolas.com/installation-dun-environnement-de-developpement-android/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
