<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">

<channel>
	<title>DEVBLOG :: Le blog d'Alexandre BALMES, jeune chef de projet</title>
	
	<link>http://dev.pockyworld.com</link>
	<description>Enfin j'essaie</description>
	<lastBuildDate>Wed, 01 Dec 2010 22:24:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/juniorduweb" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="juniorduweb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>Enfin j'essaie</itunes:subtitle><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">juniorduweb</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>peanut rencontre la blackroom</title>
		<link>http://dev.pockyworld.com/projets/peanut-rencontre-la-blackroom.html</link>
		<comments>http://dev.pockyworld.com/projets/peanut-rencontre-la-blackroom.html#comments</comments>
		<pubDate>Wed, 01 Dec 2010 22:24:39 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Projets]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[blackroom]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=293</guid>
		<description><![CDATA[Bonsoir, Peu de nouvelles ces derniers temps car beaucoup de travail de mon coté. Les méthodes agiles sont entrain de s&#8217;ancrer dans la plupart de mes devis et je suis donc passé à un apprentissage d&#8217;UML dans sa version 2 pour pouvoir estimer de la meilleure façon les demandes des clients. Et franchement, j&#8217;adore ça. [...]]]></description>
			<content:encoded><![CDATA[<p>Bonsoir,</p>

<p>Peu de nouvelles ces derniers temps car beaucoup de travail de mon coté. Les méthodes agiles sont entrain de s&#8217;ancrer dans la plupart de mes devis et je suis donc passé à un apprentissage d&#8217;UML dans sa version 2 pour pouvoir estimer de la meilleure façon les demandes des clients. Et franchement, j&#8217;adore ça.</p>

<p>Revenons aux dernières réflexions autour de <a href="https://github.com/pocky/peanut2" title="Le repository Github">peanut v2</a>. Nombreux sont les cas dans lesquels le vieux sage développeur qui croisera votre chemin vous conseillera de mettre quelque chose de &laquo;&nbsp;concret&nbsp;&raquo;. En intégration, on vous conseillera de mettre du vrai texte plutôt que du faux-texte (lorem ipsum dolor&#8230;), dans le cas du test d&#8217;une application web on vous conseillera de mettre de la &laquo;&nbsp;vraie&nbsp;&raquo; donnée et pas un &laquo;&nbsp;fdsfdsfe&nbsp;&raquo; comme en avait l&#8217;habitude mon ancien stagiaire par exemple, etc. Etc.</p>

<p>Etant donné que le projet est orienté pro, je me suis donc dis que créer une fausse société pourrait  être sympa. Un nom de domaine plus tard, la création de la fausse société est faite avec une simple landing page (à l&#8217;ancienne). Ceux qui me connaissent depuis un long moment ne seront pas dépaysés puisque <a href="http://www.lablackroom.com" title="Le site de la blackroom">La Blackroom</a> a déjà eu ses heures de gloires (et m&#8217;a valu quelque unfollow sur twitter :p).</p>

<p>Cela me permettra de créer un vrai/faux site Internet avec de faux salariés et d&#8217;ouvrir les inscriptions à toutes les personnes le souhaitant afin de créer quelque chose de sympa et surtout concret.</p>

<h2>(première) Présentation de la société</h2>

<p>La blackroom est une agence fictive de communication web composée d&#8217;une vingtaine de personne amoureux d&#8217;Internet. La société est spécialisée dans le numérique et l&#8217;utilisation des nouvelles technologies. Le coeur sur la main, la blackroom créer des applications web professionnelles et a choisi de les diffuser au plus grand nombre afin de se faire connaitre.</p>

<p>Chacun des services à des besoins différents et chacun de ses besoins est traité par le service informatique de la société. Une fois un besoin analysé et jugé intéressant par l&#8217;ensemble des membres de la société, il donne lieu à un projet estimé par le service informatique et créé. Les besoins peuvent donc être multiple et évolutifs ce qui oblige le SI à travailler autour d&#8217;une base commune et avec une méthodologie agile.</p>

<p>Pour plus d&#8217;informations, vous pouvez retrouver le dirigeant sur <a href="http://twitter.com/lablackroom">le compte twitter de la société</a> (toujours fictive).</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/projets/peanut-rencontre-la-blackroom.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>peanut : Les grandes lignes (techniques) de la v2</title>
		<link>http://dev.pockyworld.com/projets/peanut/peanut-les-grandes-lignes-techniques-de-la-v2.html</link>
		<comments>http://dev.pockyworld.com/projets/peanut/peanut-les-grandes-lignes-techniques-de-la-v2.html#comments</comments>
		<pubDate>Thu, 11 Nov 2010 22:43:33 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[UML]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[uml]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=274</guid>
		<description><![CDATA[Suite à la définition du projet et la mise en place de la première brique d&#8217;industrialisation, il est maintenant temps de passer aux choses sérieuses, les bases techniques. Le pourquoi de cette nouvelle version Pour comprendre cette orientation CMF, je pense qu&#8217;il est important de vous situer mon expérience professionnelle : 2002 : Electricien dans [...]]]></description>
			<content:encoded><![CDATA[<p>Suite à la <a href="http://dev.pockyworld.com/projets/peanut/peanut-retour-dexperiences-et-nouvelle-roadmap.html" title="Lire l'article">définition du projet</a> et la mise en place de <a href="http://dev.pockyworld.com/projets/integration-continue/hudson-gitgithub-et-iptables-sont-sur-un-bateau.html" title="Lire l'article">la première brique d&#8217;industrialisation</a>, il est maintenant temps de passer aux choses sérieuses, les bases techniques.</p>

<h3>Le pourquoi de cette nouvelle version</h3>

<p>Pour comprendre cette orientation CMF, je pense qu&#8217;il est important de vous situer mon expérience professionnelle :</p>

<ul>
<li>2002 : Electricien dans le bâtiment en contrat d&#8217;apprentissage</li>
<li>2004 : Un peu d&#8217;événementiel dans le jeu vidéo (multitude de CDD, contrat à la sauvette et j&#8217;en passe)</li>
<li>2006 : Retour à l&#8217;informatique pour une année de Technicien d&#8217;Assistance Informatique. Accessoirement, découverte du web 2.0 aka &laquo;&nbsp;OH MON DIEU, JE SUIS UNE PUTE DU WEB&nbsp;&raquo;</li>
<li>2007 : Contrat de professionnalisation de TSSI mais surtout, premiers pas sur le web en tant qu&#8217;intégrateur avec un peu (en fait beaucoup) de wordpress</li>
<li>2008 : Début d&#8217;un projet web avec deux amis. Projet abandonné et op, un poste de webmaster chez geekspirit/mageekstore</li>
<li>Fin 2008 : Chef de projet multimédia pour une société de communication opérationnelle (ce qui veux dire : on fait de tout pour les grands comptes et agences)</li>
</ul>

<p>Résultat des courses, je pense connaitre le monde professionnel à travers ses différents aspects et donc différentes problématiques. Pour moi, le monde de l&#8217;entreprise (notamment chez les grand compte) est vraiment quelque chose de fascinant et les possibilités pour le web sont presque infinies.</p>

<p>Le déclencheur est quant à lui une convention, puis une autre, et encore une autre, dans lesquelles j&#8217;ai pu entendre en tant que prestataire sur l&#8217;événement des demandes de salariés à une direction bloquée par un service informatique lui-même bloqué par une infrastructure difficile à remettre en question (ne jettons pas directement la pierre sur nos amis les DSI) ou tout simplement pour un manque de moyen humain.</p>

<p>Et dans tout ça, avec mon petit vécu professionnel, il se passe des choses dans ma tête pour finalement se dire qu&#8217;il y a quelque chose à faire.</p>

<h3>Les problématiques entreprises (et grand-comptes)</h3>

<p>Revenons à nos moutons, les entreprises. Tous les développeurs web ayant pu côtoyer ce monde connaissent les principales problématiques :</p>

<ul>
<li>Une architecture réseau/informatique pas toujours à jour (bonjour IE6)</li>
<li>Des utilisateurs avec une demande mais peu de compétences informatique</li>
<li>Un SI omniprésent et verrouillant le maximum d&#8217;éléments vis à vis des prestataires externes (sauf quelques rares cas)</li>
</ul>

<p>Coté humain :</p>

<ul>
<li>Des services avec des demandes différentes</li>
<li>Des services ne fonctionnant pas ensemble</li>
<li>Des personnes (le manager en bout de chaine avec son responsable, son RH site, son RH groupe, sa comm&#8217; site, sa comm&#8217; groupe etc etc) qui ne demandent qu&#8217;à évoluer dans de bonnes conditions </li>
</ul>

<p>Rajoutons à cela les problématiques multinationale :</p>

<ul>
<li>L&#8217;échange d&#8217;informations et la communication</li>
</ul>

<p>Heureusement pour nous, il existe un grand nombre de solutions. J&#8217;ai cependant isolé deux problèmes fondamentaux et omniprésents :</p>

<ul>
<li>Le language : Dans les groupes, affronter les problématiques i18n et l10n est un vrai fardeau à cause du manque de connaissance et des moyens en place</li>
<li>L&#8217;échange d&#8217;informations utilisateurs : le fameux serveur Activ&#8217;Directory capable de faire tant de choses mais si peu utilisés. Pensons un peu plus loin et ramenons ça à une problématique de type LDAP</li>
</ul>

<p>Le reste n&#8217;est que &laquo;&nbsp;de la routine&nbsp;&raquo; vis à vis des développements web conséquents : gestion des droits d&#8217;accès (permissions), multitude de site (sous domaines) et de besoins (op le réseau social interne, op le wiki&#8230;) Etc, etc.</p>

<p>On peut donc commencer à réfléchir.</p>

<h3>Définir un socle technique</h3>

<p>Une fois une partie des problématiques identifiées, nous pouvons définir le socle technique du projet. Arriver du jour au lendemain dans ce genre de structure pour dire &laquo;&nbsp;En 2011, on passe tout en PHP. Et puis en 2012, on passera tous sur Django et après tout en Java !&nbsp;&raquo; est un peu stupide. Il faut arriver à penser sur une période un peu plus longue. On a donc concrètement cette problématique de language à prendre en compte mais aussi à essayer d&#8217;anticiper les besoins utilisateurs.</p>

<p><strong>Le langage</strong>
Forcément, sujet délicat. Je vais personnellement opter pour PHP (si vous ne l&#8217;aviez toujours pas compris). J&#8217;aurais pu en profiter pour me mettre à regarder tranquillement du coté de Django mais je ne préfère pas pour le projet. La première raison à ce choix est la (bonne) tournure que prends PHP. Un langage mature, disposant de framework orientés professionnels (symfony/zend), des méthodologies de travail, une industrialisation possible, une compatibilité avec la pluspart des technologies naissantes et surtout un bon vivier de développeurs à se mettre sous la dent. Bref, du tout bon pour notre SI qui ne demande qu&#8217;à pérenniser. Le choix de PHP permet également de plus petites entreprises de s&#8217;équiper avec un minimum de connaissances techniques (il est très facile de trouver une personne capable de mettre en place un serveur PHP) et les coûts sont faibles. Encore un bon point.</p>

<p>Ceci dit et je vous l&#8217;accorde volontier, il est difficile de savoir comment faire la différence entre les développeurs PHP. Le bon, la brute et le méchant version numérique.</p>

<p><strong>Le framework</strong>
PHP est une chose, un framework en est une autre. Le fait même de mettre en place un framework permet de faire un pas vers les bonnes pratiques web dans le sens large du terme. Les conventions de code, le modèle MVC et l&#8217;approche objets ne sont que quelques unes des bonnes raisons. Sur ce point, je reste avec symfony dans l&#8217;optique d&#8217;évoluer vers symfony2 (ce choix a déjà été expliqué) avec une implémentation de certains composants du Zend Framework.</p>

<p><strong>Coté client : xHTML, HTML, CSS 1, 2,3, javascript, jquery, moofx&#8230;</strong>
Op, un autre débat. Coupons cours direct et optons pour HTML5, CSS3 (à travers LESS) et jQuery malgré les problématiques liées à IE6. Pourquoi ? Dans un premier temps parce que les services informatiques vont forcément évoluer. IE6 représente de moins en moins de machine et n&#8217;est finalement la plus que pour une raison liées au système (Windows 2000, Windows XP) ou à une problématique web liées aux outils existants. A partir du moment où l&#8217;on remet l&#8217;un ou l&#8217;autre de ses éléments en cause, il faut évoluer. Le web ne doit pas être tiré vers le bas même dans le contexte entreprise. A l&#8217;opposé, il faut prendre en compte toutes ces problématiques et proposer quelque chose d&#8217;acceptable pour les personnes sous IE6. Enfin, pensons un peu aux terminaux mobiles.</p>

<p><strong>Sémantique et accessibilité à l&#8217;information</strong>
Toutes entreprise de plus de 50 salariés (si ma mémoire est bonne) se doit de respecter un &laquo;&nbsp;quota&nbsp;&raquo; de travailleurs avec un handicap (quel qu&#8217;il soit). Penser sémantique et accessibilité, c&#8217;est non-seulement pousser une application vers l&#8217;interopérabilité mais aussi en faciliter l&#8217;accès sur le long terme. Une entreprise dont la taille exige un certains nombres de travailleurs handicapés se doit d&#8217;être accessible pour la totalité de ses sites Internet.</p>

<p><strong>L&#8217;industrialisation et les méthodes agiles</strong>
Garantir la pérennité d&#8217;un projet sur le long terme passe par une industrialisation complète de la chaine de développement. Le produit de base peut avoir une durée de vie de 5 à 10 ans (si l&#8217;on prends le cas IE6), le nombre de personnes impliquées sur le projet n&#8217;est pas quantifiable et il faut donc fixer une méthode de travail efficace dès le début.</p>

<h3>Conclusion</h3>

<p>La réflexion ci-dessus correspond finalement à une expression initiale de besoins et est la première étape de l&#8217;utilisation de méthodes agiles (Scrum, XP&#8230;) ou encore en UML. On peut être d&#8217;accord ou non avec les informations ci-dessus mais les grandes lignes du projet sont définies. Nous allons enfin pouvoir commencer à travailler sérieusement <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/projets/peanut/peanut-les-grandes-lignes-techniques-de-la-v2.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hudson, GIT/Github et iptables sont sur un bateau</title>
		<link>http://dev.pockyworld.com/projets/integration-continue/hudson-gitgithub-et-iptables-sont-sur-un-bateau.html</link>
		<comments>http://dev.pockyworld.com/projets/integration-continue/hudson-gitgithub-et-iptables-sont-sur-un-bateau.html#comments</comments>
		<pubDate>Tue, 26 Oct 2010 14:43:04 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Intégration continue]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=257</guid>
		<description><![CDATA[Comme annoncé dans le précédent billet, je vais avoir à installer différentes &#171;&#160;choses&#160;&#187; pour mon nouveau projet. Sens du partage oblige, voici quelques trucs et astuces (d&#8217;autres devraient arriver). Ayant décidé d&#8217;assurer l&#8217;intégration continue avec Hudson, je me suis attelé à l&#8217;installation de ce dernier sur un serveur dédié Ubuntu chez OVH. Le serveur étant [...]]]></description>
			<content:encoded><![CDATA[<p>Comme annoncé dans le précédent billet, je vais avoir à installer différentes &laquo;&nbsp;choses&nbsp;&raquo; pour mon nouveau projet. Sens du partage oblige, voici quelques trucs et astuces (d&#8217;autres devraient arriver).</p>

<p>Ayant décidé d&#8217;assurer l&#8217;intégration continue avec Hudson, je me suis attelé à l&#8217;installation de ce dernier sur un serveur dédié Ubuntu chez OVH. Le serveur étant déjà en production et sécurisé avec iptables, j&#8217;ai du affronter quelques problèmes. Ne vous attendez pas à une installation step-by-step comme cela à été le cas pour le MAMP, mon époque réseau est révolue (Gentoo &lt;3), je découvre beaucoup de choses d&#8217;un coup et un tuto d&#8217;installation ne serait pas forcément pertinent.</p>

<p><strong>Etape 1 : l&#8217;installation d&#8217;Hudson</strong></p>

<p>J&#8217;ai essayé d&#8217;installer Hudson de deux façons différentes : la première en utilisant la version hudson avec un &laquo;&nbsp;apt-get install hudson&nbsp;&raquo; et la second à travers un serveur tomcat6 et l&#8217;ajout du fichier hudson.war</p>

<p>Rien de spécial à ce niveau, contentez-vous de suivre les procédures classiques d&#8217;installation. Il faudra cependant autoriser le serveur Hudson à parler avec l&#8217;extérieur en ajoutant une entrée dans iptables :</p>

<pre><code>$ sudo iptables -A INPUT -p tcp -i eth0 -s &lt;votre ip publique&gt; --dport 8080 -j ACCEPT
</code></pre>

<p><strong>Etape 2 : Premier problème avec Hudson</strong></p>

<p>Une fois votre serveur lancé &laquo;&nbsp;sudo /etc/init.d/hudson start&nbsp;&raquo; votre serveur devrait théoriquement vous afficher quelque chose comme &laquo;&nbsp;Merci d&#8217;attendre que Hudson soit prêt&#8230;&nbsp;&raquo; Vous pouvez attendre un petit peu ou trois heures comme moi.</p>

<pre><code>- Toc Toc!
- Qui est la ?
...
...
...
...
Java !
</code></pre>

<p>Le problème découle directement du fait que les version de Hudson à partir de la build 1.359 utilise le multicast. Il faut donc l&#8217;activer sur iptables :</p>

<pre><code>$ sudo iptables -A INPUT -p igmp  -j ACCEPT
$ sudo iptables -A OUTPUT -p igmp  -j ACCEPT
</code></pre>

<p>Et si ça ne fonctionne pas (comme chez moi en fait), descendez à la build 1.358 &#8211; parce que oui, la je suis vaincu.</p>

<p><strong>Etape 3 : Git</strong></p>

<p>Donc votre serveur Hudson tourne et vous accédez au dashboard. Installer les plugins GIT via la gestion des plugins à savoir le &laquo;&nbsp;Hudson Git plugin&nbsp;&raquo; et le &laquo;&nbsp;Github Plugin&nbsp;&raquo;. Une fois installé, une configuration de GIT est nécessaire.</p>

<p>Dans la configuration générale du système, ajouter une installation GIT baptisée &laquo;&nbsp;default&nbsp;&raquo; avec comme path pour l&#8217;executable &laquo;&nbsp;git&nbsp;&raquo; puis enregistrer.</p>

<p>Dans la configuration du projet, cela se complique un peu suivant ce que vous voulez faire à savoir dans mon cas :</p>

<ol>
<li>le développeur push vers un repository local &laquo;&nbsp;git bare&nbsp;&raquo; dans un répertoire /var/git/NomDuProjet.git</li>
<li>hudson lance sa compilation et fais ses tests</li>
<li>hudson push sur un repository github</li>
</ol>

<p>Iptables oblige, il va encore falloir ajouter une entrée pour échanger sur le port utilisé par Git.</p>

<pre><code>$ sudo iptables -A OUTPUT -p tcp --dport 9418 -j ACCEPT
</code></pre>

<p>Hudson étant plutôt capricieux vis à vis de GIT, il faut ensuite configurer le user.email et le user.name par projet. Normal.</p>

<pre><code>$ git config user.email "some@email.com"
$ git config user.name "hudson"
</code></pre>

<p>Cela permettra d&#8217;éviter de se faire jeter parce que monsieur Hudson chercher à s&#8217;authentifier comme anonyme.</p>

<p>Concernant la configuration maintenant, dans votre projet. Ajouter deux repositories pour GIT en nommant le repository comme si vous ajoutiez un remote (pour plus de facilité). Ce qui donne dans mon cas :</p>

<pre><code>URL of repository : git@github.com:pocky/test.git
Name of repository (blank to create default) : github
Refspec (blank to create default) : +refs/heads/*:refs/remotes/origin1/*

URL of repository : /var/git/test.git
Name of repository (blank to create default) : origin
Refspec (blank to create default) : +refs/heads/*:refs/remotes/origin1/*

Branch Specifier (blank for default): master
</code></pre>

<p>Ensuite configurer le Git Publisher (en bas de page) dans la partie Branches :</p>

<pre><code>Branch to push : master
Target remote name : github 
</code></pre>

<p>Ce qu&#8217;il va se passer : Lors d&#8217;un build, Hudson va d&#8217;abord chercher à rapatrier toutes les changements depuis les différents repositories puis va lancer son build et en cas de réussite faire un push vers github. Pour un meilleur échange lors du premier build, je vous conseil de créer un fichier sur votre ordinateur puis de push vers votre remote de preprod (le serveur hudson) et votre remote github. Cela évitera à Hudson de vous renvoyer un message d&#8217;erreur lors du fetch.</p>

<p>Pour tester la connexion vers github après la configuration complète, rien de bien compliqué :</p>

<pre><code>$ sudo su - hudson
$ ssh git@github.com
</code></pre>

<p>Vous saurez tout de suite si il existe un problème ou non. Si un problème de connexion vis à vis de git survient, cela provient sûrement de vos clés ssh. Il faut les rajouter dans le repertoire home de hudson dans un repertoire .ssh (qu&#8217;il faudra créer) via la procédure standard de création de clé ssh (ssh-keygen et tutiquanti). Il faudra ensuite faire prendre en compte les modifications en redémarrant la session utilisateur Hudson ou en redémarrant le serveur.</p>

<p>Et la on pourrait croire que c&#8217;est terminé. Mais non.</p>

<p>Lorsque vous allez essayer de build, Hudson va vous claquer entre les doigts à cause des submodules (malgré le fait que la connexion soit bonne). Le problème vient apparemment du fait d&#8217;utiliser &laquo;&nbsp;git://&nbsp;&raquo;. Il va falloir aller dans le fichier &laquo;&nbsp;.git/config&nbsp;&raquo; et changer tous vos &laquo;&nbsp;git://&nbsp;&raquo; par &laquo;&nbsp;http://&nbsp;&raquo; et tant que vous y êtes dans le fichier &laquo;&nbsp;.gitmodules&nbsp;&raquo;. Bien entendu, si cela a été fait en amont, c&#8217;est bon.</p>

<p>Vous n&#8217;avez plus qu&#8217;à relancer, ça fonctionne, c&#8217;est magique et vous aurez économisé une trentaine de build en échec. Merci qui ? Merci bibi !</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/projets/integration-continue/hudson-gitgithub-et-iptables-sont-sur-un-bateau.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>peanut : retour d’expériences et nouvelle roadmap</title>
		<link>http://dev.pockyworld.com/projets/peanut/peanut-retour-dexperiences-et-nouvelle-roadmap.html</link>
		<comments>http://dev.pockyworld.com/projets/peanut/peanut-retour-dexperiences-et-nouvelle-roadmap.html#comments</comments>
		<pubDate>Mon, 18 Oct 2010 21:32:38 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[peanut]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=250</guid>
		<description><![CDATA[Bonsoir à tous, Au programme ce soir et malgré le manque de nouvelles, un petit récapitulatif de l&#8217;évolution de ce modeste CMS qu&#8217;est peanut. Commençons par les chiffres, depuis le début du projet jusqu&#8217;à ce jour (soit sept mois) : 12 sites en production utilisent le moteur dans sa dernière version Le site le plus [...]]]></description>
			<content:encoded><![CDATA[<p>Bonsoir à tous,</p>

<p>Au programme ce soir et malgré le manque de nouvelles, un petit récapitulatif de l&#8217;évolution de ce modeste CMS qu&#8217;est peanut. Commençons par les chiffres, depuis le début du projet jusqu&#8217;à ce jour (soit sept mois) :</p>

<ul>
    <li>12 sites en production utilisent le moteur dans sa dernière version</li>
    <li>Le site le plus rapidement créé (5 pages, un formulaire de contact) l&#8217;a été en une demie-journée (intégration comprise) &#8211; oui, il y a vraiment une charte graphique. Et avec du CSS3 svp.</li>
    <li>Le projet le plus long s&#8217;étale sur 20 jours/homme et est basé sur l&#8217;ensemble des plugins auxquels il ajoute un certain nombre de fonctionnalités</li>
    <li>12 plugins (pas tous publiés) ont été créés pour notamment recréer l&#8217;ensemble des fonctionnalités (ou presque) de wordpress</li>
    <li>et&#8230; deux gros bugs clairement identifiés : gestion des nestedSet dans peanutPage, un problème de génération du sitemap sur le plugin peanutSeo du aux relations many-to-many</li>
</ul>

<p>Et bien sur son lot d&#8217;imperfections dignes des plus grand CMS &#8211; ou pas.</p>

<h3>Bilan</h3>

<p>Côté humain, ces sept mois de développement m&#8217;ont vraiment permis de continuer à gravir cette montagne qu&#8217;est PHP et tout ce qui gravite autour. Cette évolution se ressent un peu sur symfony mais surtout sur les autres moteurs. J&#8217;arrive beaucoup plus facilement à comprendre/assimiler/développer sur des frameworks et faire un peu de Zend, Magento ou même Code Igniter et ils ne me font plus du tout peur. Et je ne vous parle même pas de mon dernier thème wordpress, réalisé pour des besoins pro dont l&#8217;approche est complètement différente pour moi.</p>

<p>Depuis environ un mois, l&#8217;idée de faire évoluer peanut afin de lui faire prendre une nouvelle orientation me travaille vraiment et de récents retours professionnel ont fini de me convaincre : il faut s&#8217;orienter vers une solution CMF, adaptée pour des besoins sans cesse grandissants et couvrant un réél besoin &#8211; notamment au niveau professionnel. Cette notion (j&#8217;ai un peu honte la) d&#8217;entreprise 2.0 m&#8217;a toujours fascinée et c&#8217;est vraiment la chose la plus attirante pour moi. Couvrir la multitude de besoins professionnels, c&#8217;est s&#8217;ouvrir à un monde dont l&#8217;exigence est haute, aussi bien au niveau technique qu&#8217;au niveau ergonomique ou fonctionnelle.</p>

<p>Je pense donc créer une nouvelle branche de peanut n&#8217;ayant pas du tout pour but bannir la précédente mais tout simplement de l&#8217;industrialiser. peanut ne sera plus une suite de modules dans une (ou plusieurs applications) afin de couvrir un besoin mais bel et bien une application couvrant un besoin évolutif à travers différents modules -vous pouvez relire deux fois la phrase.</p>

<p>Et la on se dit &laquo;&nbsp;mon dieu, il va faire du Symfony 2.0 !&nbsp;&raquo;</p>

<p>Perdu.</p>

<p>Perdu parce que dans un premier temps, je ne me sens techniquement pas prêt à pratiquer Symfony dans sa version 2.0. Symfony est vraiment sexy sur le papier mais également trop technique pour moi -tout le monde n&#8217;est pas autodidacte comme N1k0. Je préfère donc me concentrer dans un premier temps sur quelque chose d&#8217;accessible, autour d&#8217;une communauté pouvant répondre à des questions me permettant encore d&#8217;évoluer jusqu&#8217;à me sentir techniquement prêt pour quitter symfony et faire du Symfony. À contrario, cette démarche sous-entends que je souhaite réellement me préparer à Symfony et qu&#8217;il faut donc que je m&#8217;impose des process et une industrialisation forte afin de fournir le meilleur de moi-même dans un respect total des bonnes pratiques en général.</p>

<h3>Un peu de technique maintenant</h3>

<p>Voici ce que j&#8217;aimerais utiliser pour la suite du projet.</p>

<p><strong>Suivi du projet</strong></p>

<ul>
    <li>Bug tracker : Mantis</li>
    <li>Intégration continue : Hudson</li>
    <li>Controle de code : Checkstyle</li>
    <li>Analyseur de code : Pdepend / DRY</li>
    <li>Documentation : PHPDoc</li>
    <li>Versionning de fichier : Git</li>
</ul>

<p><strong>Logiciels</strong></p>

<ul>
    <li>IDE de développement : Netbeans</li>
    <li>Suivi de version : Gitti</li>
    <li>Gestion de base de données : Sequel Pro</li>
</ul>

<p><strong>Développement</strong></p>

<ul>
    <li>Framework PHP : symfony</li>
    <li>BDD : Doctrine</li>
    <li>Framework JS : jQuery</li>
    <li>Framework CSS : bic CSS + LESS</li>
    <li>Utilisation de HTML5/CSS3</li>
</ul>

<p><strong>Divers</strong></p>

<ul>
    <li>Convention de code : symfony</li>
    <li>Intégration de tests unitaires</li>
    <li>Intégration de tests fonctionnels</li>
    <li>Modélisation : UML2</li>
    <li>Une application symfony est un sous-domaine</li>
    <li>Plus d&#8217;utilisation de l&#8217;admin-generator</li>
    <li>Chaque application possède son API</li>
    <li>Le projet est orienté utilisateur sous la forme d&#8217;un CMF</li>
</ul>

<p>La grosse interrogation pour moi est la mise en place d&#8217;Hudson et des différents plugins ainsi que l&#8217;utilisation au quotidien de l&#8217;outil. Mon macbook pro va t-il me suffire (théoriquement oui) mais est-ce forcément la meilleure solution ou ne vaux t-il mieux pas passer à une solution web hébergée sur un autre serveur (Intranet/Extranet/Internet) ? Si vous avez une idée sur la question, je suis preneur.</p>

<p>Pour le reste, il faudra attendre un peu. Je pense faire une présentation (plus parlante que de longues explications) du projet avec de bons vieux slides !</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/projets/peanut/peanut-retour-dexperiences-et-nouvelle-roadmap.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>sfDoctrineActAsSeoablePlugin et peanutSeoPlugin disponibles sur Github</title>
		<link>http://dev.pockyworld.com/projets/sfdoctrineactasseoableplugin-et-peanutseoplugin-disponibles-sur-github.html</link>
		<comments>http://dev.pockyworld.com/projets/sfdoctrineactasseoableplugin-et-peanutseoplugin-disponibles-sur-github.html#comments</comments>
		<pubDate>Tue, 03 Aug 2010 09:26:46 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Projets]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[behavior]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=246</guid>
		<description><![CDATA[Bonjour, Nouveau billet aujourd&#8217;hui pour vous annoncer la première version de peanutSeo sous la forme d&#8217;un plugin symfony. Le plugin a été divisé en deux parties. Première partie : un behavior + un helper disponible en standalone sur leur propre repository Seconde partie : le plugin pour peanut, ajoutant un module seo au frontend afin [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour,</p>

<p>Nouveau billet aujourd&#8217;hui pour vous annoncer la première version de peanutSeo sous la forme d&#8217;un plugin symfony. Le plugin a été divisé en deux parties.</p>

<p><strong>Première partie :</strong> <a href="http://github.com/pocky/sfDoctrineActAsSeoablePlugin">un behavior + un helper</a> disponible en standalone sur leur propre repository<br />
<strong>Seconde partie :</strong> <a href="http://github.com/pocky/peanutSeoPlugin">le plugin pour peanut</a>, ajoutant un module seo au frontend afin de proposer un sitemap à la racine.</p>

<p>Je vais également créer un repo pour la version de dev contenant tous les différents modules/plugins afin d&#8217;avoir quelque chose de complet disponible en téléchargement.</p>

<p><strong>La todolist pour cette partie est la suivante :</strong></p>

<ul>
<li>Refactoring du helper</li>
<li>Ajout de tests unitaires pour le behavior</li>
<li>Ajout de tests unitaires pour le module seo</li>
<li>Améliorer la gestion du sitemap (proposer une archive tar.gz, ping des serveurs google/bing/&#8230;)</li>
<li>Ajout de JS dans le module SEO afin de proposer un compteur de caractères</li>
</ul>

<p>Si cette partie m&#8217;a permise de comprendre comment fonctionnent des behaviors/helpers, la prochaine me permettra de découvrir en utilisation concret les relations many-to-many.</p>

<p>Pour finir et si tout se passe comme prévu, la première refactorisation de l&#8217;ensemble du projet pourra commencer dès la semaine prochaine !</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/projets/sfdoctrineactasseoableplugin-et-peanutseoplugin-disponibles-sur-github.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Peanut Semaine… peanutPosts disponible en téléchargement !</title>
		<link>http://dev.pockyworld.com/developpement/php/peanut-semaine-peanutposts-disponible-en-telechargement.html</link>
		<comments>http://dev.pockyworld.com/developpement/php/peanut-semaine-peanutposts-disponible-en-telechargement.html#comments</comments>
		<pubDate>Fri, 30 Jul 2010 10:37:43 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[projet]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=243</guid>
		<description><![CDATA[Et non le projet n&#8217;est pas mort Ceux qui me suivent sur Twitter ont pu voir que les choses c&#8217;étaient un peu compliqués ces derniers temps même si tout est revenu dans l&#8217;ordre pour le moment. Le plugin peanutPosts a été ajouté à son propre repository Git et est utilisable en l&#8217;état. Au passage, un [...]]]></description>
			<content:encoded><![CDATA[<p>Et non le projet n&#8217;est pas mort <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p>Ceux qui me suivent sur Twitter ont pu voir que les choses c&#8217;étaient un peu compliqués ces derniers temps même si tout est revenu dans l&#8217;ordre pour le moment. Le plugin peanutPosts a été ajouté <a href="http://github.com/pocky/peanutPostsPlugin">à son propre repository Git</a> et est utilisable en l&#8217;état.</p>

<p>Au passage, un grand nettoyage a été effectué <a href="http://github.com/pocky/peanut">sur le repository principal</a> au niveau des branches et le readme a été mis à jour (avec des fautes d&#8217;orthographes).</p>

<p>A noter que vous pouvez utiliser ce plugin indépendamment de peanut sans aucun problème puisqu&#8217;il n&#8217;a que deux pré-requis : <a href="http://github.com/pocky/sfDoctrineGuardPlugin">sfDoctrineGuardPlugin</a> (<a href="http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin">version officielle</a>) et <a href="http://www.symfony-project.org/plugins/sfDoctrineActAsTaggablePlugin">sfDoctrineActAsTaggablePlugin</a>.</p>

<p>Le validateur du formulaire de contact <a href="http://github.com/pocky/sfValidatorSimpleCaptcha">sfValidatorSimpleCaptcha</a> a également son repository et sera prochainement remplacé sur le formulaire de contact par un autre validateur sfValidatorHiddenCaptcha.</p>

<p>Et pour finir, parce que je ne le dirait jamais assez, Symfony est un régal à pratiquer !
A bientôt !</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/developpement/php/peanut-semaine-peanutposts-disponible-en-telechargement.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Peanut : Semaine 7 – peanutPosts</title>
		<link>http://dev.pockyworld.com/developpement/php/peanut-semaine-7-peanutposts.html</link>
		<comments>http://dev.pockyworld.com/developpement/php/peanut-semaine-7-peanutposts.html#comments</comments>
		<pubDate>Mon, 31 May 2010 21:22:48 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[projet]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=236</guid>
		<description><![CDATA[Bonsoir ! Itération 7 cette semaine avec la création de la branche peanutPosts. Cette branche contient non pas un mais trois modules qui sont en cours de préparation : Le module peanutCategories : gestion des catégories Le module peanutPosts : gestion des articles dynamiques Le module tag : via le behavior Taggable Il y a [...]]]></description>
			<content:encoded><![CDATA[<p>Bonsoir !</p>

<p>Itération 7 cette semaine avec la création de <a href="http://github.com/pocky/peanut">la branche peanutPosts</a>. Cette branche contient non pas un mais trois modules qui sont en cours de préparation :</p>

<ul>
<li>Le module peanutCategories : gestion des catégories</li>
<li>Le module peanutPosts : gestion des articles dynamiques</li>
<li>Le module tag : via le behavior Taggable</li>
</ul>

<p>Il y a donc pas mal de travail à faire et tout avance au fur et à mesure dans l&#8217;ordre précédent. La création de ce module m&#8217;a également permit de découvrir le behavior Doctrine nestedSet permettant de gérer un arbre et ainsi éviter beaucoup de problèmes de récursivité (avec une gestion des catégories plus classique). Je compte d&#8217;ailleurs bien utiliser ce behavior sur le module peanutPage lors de sa refactorisation</p>

<p>Cette itération a également connue un petit bug avec le module Doctrine sfGuardForgotPassword alors vous pouvez remercier tight qui a apporté une réponse au <a href="http://github.com/pocky/peanut/issues/closed#issue/1">ticket de bug</a>.</p>

<p>La semaine dernière, un site de présentation a été mis en ligne à l&#8217;adresse suivante <a href="http://www.peanut.fr">http://www.peanut.fr</a>. Une personne c&#8217;est déjà amusée avec le formulaire de contact et vous pouvez faire de même. Vous n&#8217;aurez cependant pas accès au backoffice pour le moment, je l&#8217;ouvrirais un peu plus tard sur un site de demo. Ce site sera bien entendu amené à évoluer avec les différents modules.</p>

<p>Et pour conclure, je suis toujours aussi motivé par ce projet alors n&#8217;hésitez pas à me faire part de vos bugs ou envie, j&#8217;essaierai de faire le plus d&#8217;heureux possible !</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/developpement/php/peanut-semaine-7-peanutposts.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Peanut : Semaine 6 – peanutPage (fin et bonus)</title>
		<link>http://dev.pockyworld.com/developpement/php/peanut-semaine-6-peanutpage-fin-et-bonus.html</link>
		<comments>http://dev.pockyworld.com/developpement/php/peanut-semaine-6-peanutpage-fin-et-bonus.html#comments</comments>
		<pubDate>Tue, 25 May 2010 20:40:02 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[contact]]></category>
		<category><![CDATA[page]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=232</guid>
		<description><![CDATA[Bonjour à tous, Pour cette sixième semaine, la fin de la version 1.0 du module peanutPage. Ce module est donc fonctionnel et vous pouvez d&#8217;ors et déjà l&#8217;utiliser. Un petit passage en intégration (sur un vrai-faux site) m&#8217;à même permis d&#8217;ajouter quelques fonctions bien utiles pour le commun des mortels. Avec ce module, le plugin [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>

<p>Pour cette sixième semaine, la fin de la version 1.0 du module peanutPage. Ce module est donc fonctionnel et vous pouvez d&#8217;ors et déjà l&#8217;utiliser. Un petit passage en intégration (sur un vrai-faux site) m&#8217;à même permis d&#8217;ajouter quelques fonctions bien utiles pour le commun des mortels.</p>

<p>Avec ce module, le plugin <a href="http://www.symfony-project.org/plugins/csDoctrineActAsSortablePlugin">csDoctrineActAsSortable</a> a été ajouté ainsi que le plugin <a href="http://www.symfony-project.org/plugins/sfCKEditorPlugin">sfCKEditorPlugin</a>.</p>

<p>Quelques ajouts xHTML/CSS ont été faits afin d&#8217;améliorer un peu le tout au niveau graphique et rendre le backend un peu plus sexy.</p>

<p>Bonus, le module contact a également été ajouté. Rien de bien exceptionnel à ce niveau puisque le formulaire de contact met tout simplement en place le <a href="http://www.symfony-project.org/forms/1_4/fr/">tutoriel symfony forms in action</a>. J&#8217;ai tout de même créé un petit validateur au passage baptisé sfValidatorSimpleCaptcha permettant de valider un captcha simple (sur la base d&#8217;un addition avec deux opérateurs).</p>

<p>Le module contact est donc également en version 1.0</p>

<p>Le plus important étant que maintenant, vous pouvez utiliser peanut pour créer un site simple de quelques pages même si cela reviendra à utiliser une grosse berline pour aller acheter votre pain.</p>

<h3>Le wiki</h3>

<p>J&#8217;ai ajouté quelques pages au <a href="http://wiki.github.com/pocky/peanut/">wiki</a> github afin de vous donner quelques informations sur la suite et le programme en perspective. Si vous repérez des bugs mais que vous ne voulez pas forcément proposer une solution, n&#8217;hésitez pas à utiliser <a href="http://github.com/pocky/peanut/issues">la gestion de ticket github</a>. Tout est bon à prendre pour moi avec ce projet.</p>

<h3>Modification de l&#8217;utilisation de Git</h3>

<p>J&#8217;ai décidé d&#8217;utiliser <a href="http://book.git-scm.com/5_submodules.html">les submodules git</a> afin de gérer les plugins dans le projet. Les submodules Git sont un peu l&#8217;équivalent des externals de SVN. Concrètement cela permet d&#8217;ajouter des projets git à l&#8217;intérieur même d&#8217;un superprojet git et donc de pouvoir faciliter les updates.</p>

<p>Dans notre cas, cela permettra de gérer les plugins du projet en offrant à tous la possibilité de télécharger directement le plugin (ou proposer des modifications) sur le repository associé.</p>

<p>Deux submodules ont été ajoutés pour le moment, <a href="http://github.com/vjousse/symfony-1.4">symfony</a> et mon fork de <a href="http://github.com/pocky/sfDoctrineGuardPlugin">sfDoctrineGuardPlugin</a>.</p>

<h3>Oups!</h3>

<p>J&#8217;ai fait une &laquo;&nbsp;petite&nbsp;&raquo; erreur de manipulation avec mes branches Git suite à l&#8217;utilisation des submodules. Git a en effet quelques problèmes pour gérer l&#8217;ajout de submodule sur une branche lors d&#8217;un checkout sur une branche sans submodules (d&#8217;après ce que j&#8217;ai compris). Résultat des courses, une fausse manip en essayant de faire fonctionner le tout et ma branche master disparait. Il m&#8217;a donc fallu la recréer et&#8230; Il faut forger pour être forgeron <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<p>Un cours de Git m&#8217;attends vendredi soir pour régler les petits problèmes associés à cette erreur (rien de méchant). J&#8217;aurais donc tendance à vous conseiller d&#8217;attendre samedi pour faire une mise à jour (ou alors de ne pas oublier de créer un répertoire &laquo;&nbsp;cache&nbsp;&raquo; à la racine du projet. Au passage, peanut sera tagué en version 1 et un site demo sera mis en ligne dans la semaine.</p>

<h3>Modification de la roadmap</h3>

<p>Etant donné que j&#8217;ai besoin d&#8217;utiliser peanut pour un projet, je vais un peu modifier la roadmap annoncé la semaine dernière.  Le projet va donc évoluer de la façon suivante :</p>

<ul>
<li>Création du module peanutCategories</li>
<li>Création du module peanutPosts</li>
<li>Création du plugin peanutPosts</li>
<li>Création du module peanutComments</li>
<li>Création du plugin peanutComments</li>
<li>Création du module peanutSEO</li>
<li>Création du plugin peanutSEO</li>
</ul>

<p>Si tout se passe bien, le tout devrait prendre de 3 à 4 itérations pour les v1 de ses modules/plugins.</p>

<p>Je passerais ensuite au refactoring/amélioration/debug de l&#8217;ensemble des modules. Chacun de ses modules (à travers leurs plugins) auront leurs propres repository Git et seront intégrés sous la forme de submodules dans le projet principal. Cela permettra au passage de pouvoir profiter d&#8217;un ou plusieurs plugins de son choix sans utiliser la base (même si certains plugins comme le module peanutSEO seront dépendants d&#8217;autres plugins).</p>

<p>Ce sera tout pour cette semaine !
A la semaine prochaine <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p>Et pour rappel, vous pouvez récupérer le projet <a href="http://github.com/pocky/peanut">sur Github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/developpement/php/peanut-semaine-6-peanutpage-fin-et-bonus.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Peanut : Semaine 5 – peanutPage (1ere partie)</title>
		<link>http://dev.pockyworld.com/projets/peanut-semaine-5-peanutpage.html</link>
		<comments>http://dev.pockyworld.com/projets/peanut-semaine-5-peanutpage.html#comments</comments>
		<pubDate>Mon, 17 May 2010 21:34:54 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Projets]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=224</guid>
		<description><![CDATA[Bonjour à tous, Cette semaine a permis d&#8217;assurer la création du premier &#171;&#160;vrai&#160;&#187; module pour peanut à savoir le module peanutPage. Ce module a été pour moi l&#8217;occasion de me mettre aux tests unitaires. Je dois dire que j&#8217;ai vraiment trouvé ça intéressant non-seulement pour les avantages &#171;&#160;connus&#160;&#187; des tests unitaires mais aussi d&#8217;un point [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>

<p>Cette semaine a permis d&#8217;assurer la création du premier &laquo;&nbsp;vrai&nbsp;&raquo; module pour peanut à savoir le module <a href="http://github.com/pocky/peanut/tree/PeanutPage">peanutPage</a>. Ce module a été pour moi l&#8217;occasion de me mettre aux tests unitaires. Je dois dire que j&#8217;ai vraiment trouvé ça intéressant non-seulement pour les avantages &laquo;&nbsp;connus&nbsp;&raquo; des tests unitaires mais aussi d&#8217;un point de vue intellectuel. Mes tests ne sont pas forcément les plus complets pour le moment mais je pense que tout cela s&#8217;améliorera avec mon niveau.</p>

<p>Comme j&#8217;aborde le sujet, sachez que je vous encourage à vous lancer dans ce genre de projet. J&#8217;ai vraiment appris en 5 semaines un nombre conséquent de nouvelles &laquo;&nbsp;choses&nbsp;&raquo; et pourtant cela ne va pas encore très loin au niveau des fonctionnalités. Mais voila, cette espèce d&#8217;obligation de ne pas livrer à tous le monde quelque chose d&#8217;innutilisable aide forcément à faire de son mieux et à respecter les bonnes pratiques dans leur ensemble. Je ne vous parle même pas de l&#8217;auto-formation et de la documentation relative à tous ce travail même si cela ne se reflête pas de façon flagrante pour le moment dans le projet. Par contre, c&#8217;est une autre histoire au niveau professionnel avec des projets interne techniquement plus solide et abouti (notamment à travers un projet d&#8217;extranet dont je suis entrain de créer les bases).</p>

<p>Et je me demande vraiment pourquoi j&#8217;ai autant attendu pour me mettre à dev&#8230; <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p>Ceci dit, revenons à nos moutons. Pour l&#8217;instant le module page est complet au niveau du backoffice (avec la personnalisation des formulaires) et des fonctions ont été créées dans le model (on dit merci au TDD). Un module frontend a été créé mais n&#8217;est pas du tout adapté au besoin. Cela viendra dans la prochaine itération.</p>

<p>J&#8217;ai un peu affiné mes itérations, un module devrait être livré en deux à trois itérations au minimum (mon emploi du temps profesionnel l&#8217;oblige). C&#8217;est en tout cas ce qui me parait le plus sage à l&#8217;heure actuelle car je mange vraiment beaucoup de documentation en ce moment (petite pensée pour les tests fonctionnels qui arrivent). Cela devrait donc donner quelque chose dans le genre :</p>

<ul>
<li>Semaine 1 : Création du module, des fonctions de bases et de la partie administration</li>
<li>Semaine 2 : Création du frontend et si besoin, ajout de fonctions dans le model</li>
<li>Semaine 3 : Création du plugin correspondant au module</li>
</ul>

<p>Au niveau des modules, je part à priori la dessus :</p>

<ul>
<li>Création du module page</li>
<li>Création d&#8217;un module contact (avec un formulaire de contact type)</li>
<li>Création du module post (aka articles/catégories)</li>
<li>Création du module SEO</li>
</ul>

<p>Une fois ces modules créés :</p>

<ul>
<li>Refactorisation du model et des différentes fonctions afin d&#8217;optimiser le tout au niveau technique</li>
<li>Ajout de fonctionnalités type AJAX pour le backoffice</li>
</ul>

<p>Et enfin, création de nouveaux modules selon le même principe : commentaires, FAQ&#8230; Le projet sera ouvert à ce niveau. Il sera bien évidemment possible de créer son propre plugin pour améliorer peanut. Il faudra également que l&#8217;on parle à un moment de la tournure du projet au niveaux des fonctionnalités, il y aura une question ouverte <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>

<p>Nous pourrons donc considérer que peanut sera d&#8217;ici deux semaines utilisable en tant que CMS lite (par exemple 5 pages et un formulaire de contact) même si cela reviendra à sortir la grosse artillerie pour un petit besoin. Une fois les modules post/SEO créé, je m&#8217;occuperais de faire tourner mon blog sur peanut histoire d&#8217;avoir une démo &laquo;&nbsp;live&nbsp;&raquo;.</p>

<p>Pour terminer, un petit lien vers un article du blog de <a href="http://prendreuncafe.com/blog/post/2010/02/17/User-Dependant-Forms-with-Symfony">n1k0</a> qui m&#8217;a été utile pour ne pas utiliser getInstance dans la gestion I18n des formulaires du backoffice. Un blog incontournable à ajouter à ses flux RSS.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/projets/peanut-semaine-5-peanutpage.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Peanut : Semaine 4 – sfDoctrineGuardPlugin</title>
		<link>http://dev.pockyworld.com/developpement/php/peanut-semaine-4-sfdoctrineguardplugin.html</link>
		<comments>http://dev.pockyworld.com/developpement/php/peanut-semaine-4-sfdoctrineguardplugin.html#comments</comments>
		<pubDate>Sun, 09 May 2010 19:57:50 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[projet]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=216</guid>
		<description><![CDATA[Il c&#8217;est passé un peu de temps depuis le dernier article et je continue tranquillement à avancer au rythmefixé (au moins un lot de fonctionnalités par semaine) mais j&#8217;ai eu énormément de travail ces derniers temps et donc&#8230; Aucune nouvelle. Semaine 3 &#8211; template, template, template La semaine dernière a essentiellement servie à créer le [...]]]></description>
			<content:encoded><![CDATA[<p>Il c&#8217;est passé un peu de temps depuis le dernier article et je continue tranquillement à avancer au rythmefixé (au moins un lot de fonctionnalités par semaine) mais j&#8217;ai eu énormément de travail ces derniers temps et donc&#8230; Aucune nouvelle.</p>

<h3>Semaine 3 &#8211; template, template, template</h3>

<p>La semaine dernière a essentiellement servie à créer le layout du backend. Pas grand chose à dire à ce niveau, j&#8217;ai essayé de me faire un peu plaisir avec un peu de CSS3, un peu de jQuery et du xHTML (et oui, pas de HTML5 pour le backend). Je n&#8217;ai par contre pas encore pris le temps de valider les pages. Il peut donc y avoir quelques erreurs d&#8217;intégration. Le backoffice n&#8217;a également pas été testé sur la famille Internet Explorer mais je m&#8217;en occuperais dans quelques itérations au maximum car inutile de vous le cacher, mon prochain blog tournera bel et bien sur peanut (quitte à devoir évoluer avec).</p>

<h3>Semaine 4 &#8211; spéciale sfDoctrineGuardPlugin</h3>

<p>Comme je l&#8217;avais dis au début du projet, je comptais bien modifier sfDoctrineGuardPlugin. Lors de la création du projet, je suis parti sur la base du <a href="http://svn.symfony-project.com/plugins/sfDoctrineGuardPlugin/trunk/">trunk de sfDoctrineGuardPlugin</a> qui ajoute certaines fonctionnalités avec deux modules : sfGuardForgotPassword et sfGuardRegister permettant respectivement de récupérer son mot de passe et de se créer un compte.</p>

<p>Malheureusement, les process utilisés lors de ces étapes ne sont pas &laquo;&nbsp;corrects&nbsp;&raquo; dans le sens ou si effectivement ils fonctionnent, ils ne font pas forcément les choses correctement. Je me suis donc efforcé de modifier ces éléments afin de corriger un peu le tir, tout du moins à mon sens. Rassurez-vous, les modifications ne sont pas nombreuses mais en voici quelques unes.</p>

<p><strong>sfGuardAuth</strong></p>

<ul>
<li>Possibilité via le fichier app.yml d&#8217;autoriser ou non la connection via le nom d&#8217;utilisateur et le mot de passe</li>
</ul>

<p><strong>sfGuardUser</strong></p>

<ul>
<li>Modification du fichier schema.yml afin qu&#8217;un utilisateur ne soit pas actif par défaut</li>
</ul>

<p><strong>sfGuardRegister</strong></p>

<ul>
<li>Modification de la route afin de pouvoir gérer le process d&#8217;inscription</li>
<li>Lors de la création de compte, un email est envoyé à l&#8217;utilisateur afin de confirmer la création du compte</li>
<li>Modification du process d&#8217;inscription qui va se charger de vérifier certains points importants avant d&#8217;activer le compte</li>
</ul>

<p><strong>sfGuardForgotPassword</strong></p>

<ul>
<li>L&#8217;email envoyé par défaut indique un délai de 24H pour valider son compte mais le code n&#8217;imposait pas de limite et n&#8217;enregistrait même pas la limite correctement</li>
<li>Ajout d&#8217;une tache permettant via cronjob de supprimer tous les utilisateurs n&#8217;ayant pas validé leur compte</li>
</ul>

<p><strong>De façon générale</strong>
- Ajout de traductions (uniquement en français)</p>

<h4>Parce qu&#8217;il faut tout de même le dire</h4>

<p>Ce qui est actuellement en place est bien entendu perfectible. Le process d&#8217;inscription par exemple va générer une chaine sha1 basée sur le nom d&#8217;utilisateur, son adresse email et le csrf token de l&#8217;application et comme vous pouvez vous en douter&#8230; Il y a mieux (mais il y a aussi largement pire).</p>

<p>Pour moi, il faudrait créer une nouvelle table permettant de stocker les utlisateurs en cours d&#8217;inscription avec une clé unique en base de donnée afin de vraiment garantir la sécurité à ce niveau. L&#8217;autre option pourrait être de générer le sha1 sur la base du timestamp de création du compte qui pourrait ainsi (puisque stocké en bdd via created_at) servir de base un peu plus fiable. Autre solution, enregistrer l&#8217;utilisateur, récupérer l&#8217;objet utilisateur et générer quelque chose d&#8217;unique basé sur le salt par exemple.</p>

<p>Ceci dit je préfère attendre quelqu&#8217;uns de vos retours et mettre tout ça dans ma todolist pour un (éventuel et certains) refactoring dans le futur.</p>

<p>Autre chose, l&#8217;ensemble de ce travail a directement été fait dans le plugin sfDoctrineGuard car cela fais vraiment parti pour moi des fonctions à assurer au minimum et non à rajouter à la volée suivant les besoins de chaques projets (contrairement à la personnalisation des templates par exemple). Vous pouvez donc très bien surcharger ce qui est fait mais par défaut, une personne s&#8217;inscrit, reçoit un email de confirmation puis confirme son compte et cela tiens quand même plus la route qu&#8217;une inscription directe sans plus de vérification que ça.</p>

<p>Enfin, les tests unitaires ne sont pas complets et il faut vraiment que je m&#8217;y mette. Cela me dépasse encore un peu pour le moment. Je vois bien le principe mais je ne sais pas si c&#8217;est parce que j&#8217;ai l&#8217;habitude de chercher à faire tout de suite compliqué mais la&#8230; Je ne serais pas contre un petit cours à l&#8217;oral avec démo et questions connes en direct.</p>

<p>Ceci dit et si jamais j&#8217;arrive (ou nous arrivons via vos éventuelles contributions) à améliorer le plugin sfDoctrineGuard, j&#8217;aimerais le proposer afin qu&#8217;il soit intégré aux plugins (voir remplacer la version actuelle). Certaines conversations lues sur IRC me font dire que ce ne serait pas une mauvaise chose.</p>

<p>Petit détail d&#8217;importance, il faut que vous sachiez que mon anglais est encore moins bon que mon français à l&#8217;écrit en ce moment. Si jamais vous voulez modifier ça parce que&#8230; Hum&#8230; Okay mais bon il y a mieux, n&#8217;hésitez pas. Il faudrait également s&#8217;occuper de la traduction espagnole (puisqu&#8217;il y en a une pour le plugin) pour ne pas faire de malheureux mais la&#8230; Je vous laisse faire.</p>

<h4>A quoi peut servir peanut actuellement ?</h4>

<p>Si jamais vous vous posez la question, peanut peut vous servir (dans l&#8217;état actuel) à tout et à rien puisqu&#8217;il n&#8217;assure rien d&#8217;autre que la gestion de vos utilisateurs, groupes et permissions. Il est donc envisageable de faire n&#8217;importe quoi autour de ça : Réseau social, trombinoscope, intranet, extranet&#8230; Et j&#8217;en passe.</p>

<p>J&#8217;essaierai de vous donner ce genre d&#8217;exemples à chaque itération.</p>

<h4>Le débat de la semaine</h4>

<p>Le débat de la semaine porte sur la traduction i18n pour les setFlash(). <a href="http://gist.github.com/395109">Un gist</a> a donc été créé et de la même façon que lors de la précédente question ouverte, je vous invite à l&#8217;enrichir via vos différentes méthodes afin de trouver les différentes façons de faire. Vous en trouverez actuellement trois, plus ou moins sexy mais qui fonctionnent toutes.</p>

<h4>A venir</h4>

<p>Le premier module du CMS permettant tout simplement de créer des &laquo;&nbsp;pages&nbsp;&raquo; (comprendre pages dynamiques peu modifiées du type CGU/CGV/&#8230;) pour votre site Internet.</p>

<h4>Et pour finir</h4>

<p>J&#8217;ai activé le système de donation sur le projet. A défaut d&#8217;aller directement dans mes poches, tout sera stocké sur un compte paypal dédié dans le but de m&#8217;offrir certaines formations dispensées par <a href="http://trainings.sensiolabs.com/fr">SensioLabs Trainings</a> qui seraient à priori :</p>

<ul>
<li>PHP niveau 1 : bases</li>
<li>PHP niveau 2 : POO</li>
<li>Symfony 1.4 + Doctrine</li>
<li>Symfony et REST</li>
<li>Doctrine</li>
</ul>

<p>Bien entendu, cela pourra évoluer (je l&#8217;espère bien) avec ce projet puisque le but pour moi est de pratiquer encore et encore  afin de m&#8217;améliorer jusqu&#8217;au moment où je pourrais trashtalk sur PHP <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>

<p>Et pour rappel, <a href="http://github.com/pocky/peanut">un lien vers le projet</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/developpement/php/peanut-semaine-4-sfdoctrineguardplugin.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	<media:rating>nonadult</media:rating></channel>
</rss>
