<?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>De geek à directeur techniqueDe geek à directeur technique</title>
	<atom:link href="http://www.geek-directeur-technique.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.geek-directeur-technique.com</link>
	<description>Le blog d&#039;un geek devenu directeur technique</description>
	<lastBuildDate>Thu, 10 May 2012 10:36:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Langage de programmation et langage naturel</title>
		<link>http://www.geek-directeur-technique.com/2012/05/05/langage-de-programmation-et-langage-naturel</link>
		<comments>http://www.geek-directeur-technique.com/2012/05/05/langage-de-programmation-et-langage-naturel#comments</comments>
		<pubDate>Sat, 05 May 2012 20:16:18 +0000</pubDate>
		<dc:creator>Amaury</dc:creator>
				<category><![CDATA[Questions techniques]]></category>
		<category><![CDATA[Cobol]]></category>
		<category><![CDATA[culte du cargo]]></category>
		<category><![CDATA[Hypertalk]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.geek-directeur-technique.com/?p=1171</guid>
		<description><![CDATA[Il y a plusieurs langages de programmation qui mettent en avant leur capacité à être lu et écrit comme du langage naturel. Par exemple, Hypertalk&#160;: set the location of card button x to pos add 15 to item 1 of pos Ou encore Perl&#160;: move $this from =&#62; $here, to =&#62; $there; print $message if [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a plusieurs langages de programmation qui mettent en avant leur capacité à être lu et écrit comme du langage naturel.</p>
<p>Par exemple, <a title="Wikipedia" href="http://en.wikipedia.org/wiki/HyperTalk" target="_blank">Hypertalk</a>&nbsp;:</p>
<pre>set the location of card button x to pos
add 15 to item 1 of pos</pre>
<p>Ou encore <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Perl_(langage)" target="_blank">Perl</a>&nbsp;:</p>
<pre>move $this from =&gt; $here, to =&gt; $there;
print $message if $name eq "Bob" and $age &gt; 10;</pre>
<p><a href="http://supernova.sourceforge.net/" target="_blank">Supernova</a>&nbsp;:</p>
<pre>I want window and the window title is Hello World.</pre>
<h3>Pourquoi faire&nbsp;?</h3>
<p>Le but de ces langages est, de manière évidente, de faciliter les développements. En réduisant l&#8217;effort cognitif nécessaire pour écrire un programme, on peut raisonnablement penser qu&#8217;ils deviendront plus faciles et rapides à écrire.</p>
<p>En fait, c&#8217;est surtout en terme d&#8217;apprentissage que cette approche montre une quelconque valeur&nbsp;: une personne n&#8217;ayant jamais utilisé le moindre langage de programmation sera moins rebutée si elle a l&#8217;impression de parler à la machine pour lui dire quoi faire, plutôt que de devoir apprendre les codes cabalistiques que la machine lui impose.</p>
<p>C&#8217;est l&#8217;une des raisons du succès remporté par <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/HyperCard" target="_blank">Hypercard</a> à la fin des années 80 et au début des années 90. Non seulement il proposait de créer des interfaces graphiques à la souris, mais il permettait ensuite de les contrôler d&#8217;une manière plus simple que tout ce qui était connu jusqu&#8217;alors. Dans une certaine mesure, le succès du <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Visual_Basic" target="_blank">Visual Basic</a> repose sur les mêmes fondamentaux (en remplaçant le langage pseudo-naturel par le langage informatique désigné comme étant le plus simple).</p>
<h3>Le culte du cargo</h3>
<p>Ça faisait un bout de temps que je voulais parler du <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Culte_du_cargo" target="_blank">culte du cargo</a>. À la base, il s&#8217;agit du fait que certaines peuplades du Pacifique, voyant des avions-cargo larguer des vivres après que les soldats américains l&#8217;aient demandé à la radio, se sont mis à construire de fausses cabines-radio (voire même de fausses pistes d’atterrissage), espérant pouvoir ainsi faire venir de nouveaux parachutages après le départ des troupes à la fin de la deuxième guerre mondiale.</p>
<p>Par extension, on parle du culte du cargo lorsque quelqu&#8217;un observe une chose et tente de la reproduire, sans la comprendre, en espérant que cela générera les mêmes effets.</p>
<p>J&#8217;en profite pour en parler, car l&#8217;article Wikipédia parle notamment des concepteurs de langages informatiques (en citant le <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Cobol" target="_blank">Cobol</a> comme exemple) qui essaient d&#8217;imiter l&#8217;anglais sans pour autant maîtriser sa construction, et sans l&#8217;adapter correctement aux spécificités des langages informatiques.</p>
<h3>Verbosité versus concision</h3>
<p>Le problème fondamental et évident avec le langage naturel, c&#8217;est qu&#8217;il manque de concision. Il a été conçu (si je puis dire) pour véhiculer des informations mais aussi des émotions, de la nuance. Ajoutez à cela qu&#8217;un langage réel évolue au fil des siècles, ce qui lui apporte toute sa richesse&nbsp;; c&#8217;est d&#8217;ailleurs l&#8217;une des choses qui − du point de vue des linguistes − différenciera toujours les langues naturelles des langues construites (<a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Esperanto" target="_blank">espéranto</a>, <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Volap%C3%BCk" target="_blank">volapük</a>, <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Interlingua_(IALA)" target="_blank">interlingua</a>, <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Occidental_%28langue%29" target="_blank">interlingue</a>, <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Idiom_Neutral" target="_blank">idiom neutral</a>, &#8230;).</p>
<p>Il faut aussi prendre en compte un aspect important&nbsp;: l&#8217;héritage mathématique.<br />
On apprend assez jeune, au collège, les concepts de variables et de fonctions. Et même si je pense les avoir découvert grâce aux langages de programmation plusieurs années avant de les apprendre en cours de math, la logique de cette enseignement est indéniable.</p>
<p>Il faut toutefois différencier ces deux concepts, qui sont au cœur de tous les langages de programmation.<br />
Les variables sont faciles à comprendre et à manipuler. Il est donc inutile de vouloir écrire&nbsp;:</p>
<pre>mettre la valeur 27 dans la variable toto</pre>
<p>Alors qu&#8217;on peut écrire simplement&nbsp;:</p>
<pre>toto = 27</pre>
<p>Par contre, pour les fonctions (ou les méthodes), c&#8217;est un peu différent. Si on y réfléchit bien, elles reflètent un comportement naturel. Un <em>comportement</em>, pas un langage.</p>
<p>Je m&#8217;explique. Tous les jours, à tous moments, nous employons des termes qui synthétisent nos idées&nbsp;; nous utilisons des synonymes qui regroupent plusieurs idées à la fois.<br />
Quand on dit &laquo;&nbsp;Monte dans la voiture&nbsp;&raquo;, on utilise une expression qui est un résumé signifiant &laquo;&nbsp;<em>Va jusqu&#8217;à la voiture, ouvre la portière, entre dans la voiture, assois-toi sur la banquette, ferme la portière, attache ta ceinture</em>&laquo;&nbsp;. Même &laquo;&nbsp;attache ta ceinture&nbsp;&raquo; peut être décomposé en &laquo;&nbsp;<em>lève le bras, attrape la ceinture, descend le bras, fait entrer la boucle dans l&#8217;attache, pousse jusqu&#8217;à entendre un “clic”, lâche la boucle</em>&laquo;&nbsp;.</p>
<p>Quand on y pense, cela est très similaire avec la manière dont on utilise les fonctions et les méthodes. On cache une complexité en lui donnant un nom identifiable, avec une profondeur infinie. Et quand on n&#8217;a besoin que de manipuler des concepts globaux, on se s&#8217;embarrasse pas à vouloir comprendre ce qu&#8217;ils renferment.</p>
<h3>Conclusion</h3>
<p>Je me rend compte que cet article ne sert pas à grand-chose.&nbsp; :-)</p>
<p>C&#8217;est juste que j&#8217;entends régulièrement parler d&#8217;efforts de simplification de la programmation. Et quand ces efforts tentent de singer des concepts naturels (le langage naturel en est un exemple, mais il faudrait aussi que je vous parle de la <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Visual_programming_language" target="_blank">programmation visuelle</a> un de ces jours), on sait d&#8217;avance que le résultat ne sera jamais à la hauteur des ambitions &laquo;&nbsp;révolutionnaires&nbsp;&raquo; qui sont annoncées&#8230;</p>
<p>L&#8217;essence même de l&#8217;informatique implique quelle nous fasse manipuler des notions qui ne sont pas naturelles. Ce qui importe, c&#8217;est de pouvoir utiliser l&#8217;outil informatique pour créer des choses plus avancées, et cela plus rapidement.<br />
N&#8217;importe quel enfant de 3 ans est capable de dire ce qu&#8217;il veut. C&#8217;est une bonne chose d&#8217;offrir à ces enfants la possibilité de se frotter à la programmation. Par contre, il n&#8217;est pas nécessaire que les outils de programmation que nous utilisons au quotidien soient ceux que nos enfants pourraient aussi utiliser.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geek-directeur-technique.com/2012/05/05/langage-de-programmation-et-langage-naturel/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Niko-niko mensuel</title>
		<link>http://www.geek-directeur-technique.com/2012/05/03/niko-niko-mensuel</link>
		<comments>http://www.geek-directeur-technique.com/2012/05/03/niko-niko-mensuel#comments</comments>
		<pubDate>Thu, 03 May 2012 08:10:52 +0000</pubDate>
		<dc:creator>Amaury</dc:creator>
				<category><![CDATA[Organisation d'équipe]]></category>
		<category><![CDATA[niko-niko]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.geek-directeur-technique.com/?p=1183</guid>
		<description><![CDATA[Comme je l&#8217;ai déjà expliqué, j&#8217;ai mis en place une organisation spéciale dans mon entreprise&#160;: dérivée de la méthode agile Scrum, elle repose sur des cycles mensuels de développements, comprenant 2 (ou 3) sprints d&#8217;une semaine de développement, un sprint de &#171;&#160;stabilisation&#160;&#187; (tests, débugs, refactorings, écriture de tests), et un sprint de mise en production [...]]]></description>
			<content:encoded><![CDATA[<p>Comme je l&#8217;ai <a title="Application concrète des méthodes agiles" href="http://www.geek-directeur-technique.com/2011/05/12/application-concrete-des-methodes-agiles">déjà expliqué</a>, j&#8217;ai mis en place une organisation spéciale dans mon entreprise&nbsp;: dérivée de la <a title="Les méthodes agiles" href="http://www.geek-directeur-technique.com/2009/02/12/les-methodes-agiles">méthode agile</a> <a title="Scrum&nbsp;: introduction" href="http://www.geek-directeur-technique.com/2009/05/19/scrum-introduction">Scrum</a>, elle repose sur des cycles mensuels de développements, comprenant 2 (ou 3) sprints d&#8217;une semaine de développement, un sprint de &laquo;&nbsp;stabilisation&nbsp;&raquo; (tests, débugs, refactorings, écriture de tests), et un sprint de mise en production (mise en pré-production, validation, débugs éventuels, mise en prod, recette).</p>
<p>La semaine dernière était donc la semaine de MEP du mois d&#8217;avril. Jusqu&#8217;ici, on terminait chaque itération en faisant une analyse rapide des problèmes rencontrés. Mais cette fois-ci, j&#8217;ai pris le temps d&#8217;organiser une vraie réunion avec toute l&#8217;équipe.</p>
<p>Faire simplement un tour de table, en demandant à chacun de dire ce qu&#8217;il a apprécié ou regretté durant le mois, aurait pu ne pas être efficace. Certains n&#8217;auraient pas osé parler, et d&#8217;autres auraient peut-être lancé des sujets polémiques.<br />
Pour introduire les choses, j&#8217;ai donc démarré la réunion sous forme de <a href="http://emmanuelchenu.blogspot.fr/2009/02/niko-niko.html" target="_blank">niko-niko</a>. J&#8217;ai distribué des petits post-it sur lesquels j&#8217;avais dessiné des visages. Chaque personne avait en main 5 visages, du plus souriant au plus grimaçant, mais ne pouvait en utiliser qu&#8217;un pour exprimer son niveau de satisfaction par rapport au déroulement du mois.</p>
<p><a href="http://www.geek-directeur-technique.com/wp-content/uploads/2012/05/2012-05-02-14.25.56.jpg"><img class="alignnone size-medium wp-image-1189" title="Niko-niko - smileys" src="http://www.geek-directeur-technique.com/wp-content/uploads/2012/05/2012-05-02-14.25.56-225x300.jpg" alt="" width="225" height="300" /></a></p>
<p>Le choix des visages s&#8217;est fait anonymement, et j&#8217;ai fait le décompte sur un tableau blanc. Ainsi tout le monde avait une vision du ressenti global de l&#8217;équipe.<br />
Ensuite, nous avons fait un tour de table, chacun expliquant le choix qu&#8217;il avait fait.</p>
<p>Ce fut vraiment intéressant. Nous avons pu identifier certaines différences d&#8217;interprétation, des problèmes de communication, ou encore des éclaircissements à fournir sur les priorités. Le but n&#8217;était pas de lancer des réflexions sur comment résoudre les problèmes ou comment améliorer les process, mais juste de lister ce qu&#8217;on pouvait améliorer.<br />
À notre charge maintenant d&#8217;organiser les réunions nécessaires pour avancer sur les points qui ont été soulevés.</p>
<p>Je sais qu&#8217;habituellement le niko-niko est un exercice plus fréquent. Soit tous les jours, soit à la fin de chaque sprint. J&#8217;ai préféré une approche mensuelle, mais cela changera peut-être au fil du temps. Là j&#8217;ai utilisé le niveau de contentement des uns et de autres comme introduction, comme support à la discussion qui a suivi.<br />
D&#8217;ailleurs, la discussion a été enrichissante parce que nous avions une vision sur l&#8217;ensemble du mois. Nous avons pu réfléchir à l&#8217;amélioration de nos méthodes de travail dans leur ensemble, pas simplement à tel ou tel point de détail ponctuel.</p>
<p>Je ne dis pas qu&#8217;il n&#8217;y a aucun intérêt à &laquo;&nbsp;prendre le pouls&nbsp;&raquo; de l&#8217;équipe au jour le jour. Je dis juste qu&#8217;il faut faire les choses dans l&#8217;ordre&nbsp;; dégrossir avant d&#8217;affiner.<br />
Ce qui est certain, c&#8217;est que nous allons renouveler l&#8217;expérience tous les mois désormais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geek-directeur-technique.com/2012/05/03/niko-niko-mensuel/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Contre les extrémismes coûteux (le retour)</title>
		<link>http://www.geek-directeur-technique.com/2012/04/26/contre-les-extremismes-couteux-le-retour</link>
		<comments>http://www.geek-directeur-technique.com/2012/04/26/contre-les-extremismes-couteux-le-retour#comments</comments>
		<pubDate>Thu, 26 Apr 2012 09:43:14 +0000</pubDate>
		<dc:creator>Amaury</dc:creator>
				<category><![CDATA[Organisation d'équipe]]></category>
		<category><![CDATA[David Heinemeier Hansson]]></category>
		<category><![CDATA[Ken Beck]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[tests unitaires]]></category>

		<guid isPermaLink="false">http://www.geek-directeur-technique.com/?p=1175</guid>
		<description><![CDATA[Il y a un peu plus d&#8217;un an, j&#8217;ai écrit un article dans lequel je dénonçais les coûts générés par les intégristes des tests unitaires. Le but de cet article n&#8217;était pas de dire que les tests unitaires ne servent à rien − loin de là − mais de pointer le fait qu&#8217;une approche pragmatique est [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a un peu plus d&#8217;un an, j&#8217;ai écrit <a title="Contre les extrémismes coûteux" href="http://www.geek-directeur-technique.com/2011/02/11/contre-les-extremismes-couteux">un article</a> dans lequel je dénonçais les coûts générés par les intégristes des tests unitaires. Le but de cet article n&#8217;était pas de dire que les tests unitaires ne servent à rien − loin de là − mais de pointer le fait qu&#8217;une approche pragmatique est préférable à une approche systématique.</p>
<p>Il avait suscité quelques commentaires plutôt positifs, et <a href="http://blog.mageekbox.net/?post/2011/02/18/Les-tests%2C-%C3%A7a-co%C3%BBte-cher%2C-c-est-de-la-poudre-au-yeux-et-c-est-pour-les-fain%C3%A9ants-%21-Vraiment" target="_blank">une réaction</a> très véhémente (avec l&#8217;emploi du mot &laquo;&nbsp;bullshit&nbsp;&raquo; difficile à digérer).</p>
<p>J&#8217;en reparle aujourd&#8217;hui pour pointer <a title="Signal vs. Noise" href="http://37signals.com/svn/posts/3159-testing-like-the-tsa" target="_blank">un article intéressant</a>, écrit par <a href="http://david.heinemeierhansson.com/" target="_blank">David Heinemeier Hansson</a> (créateur de <a href="http://rubyonrails.org/" target="_blank">RubyOnRails</a>) et publié sur le blog de <a href="http://37signals.com/" target="_blank">37signals</a>.</p>
<p>Son propos est assez similaire au mien&nbsp;: les <a title="Tests unitaires et intégration continue" href="http://www.geek-directeur-technique.com/2009/03/18/tests-unitaires-et-integration-continue">tests unitaires</a>, c&#8217;est <strong>bien</strong>&nbsp;; le <a title="Test Driven Development" href="http://www.geek-directeur-technique.com/2009/04/08/test-driven-development">test driven development</a>, c&#8217;est <strong>pratique</strong>&nbsp;; mais chercher à couvrir 100% du code est <strong>inutile</strong> et <strong>coûteux</strong>.</p>
<p>Il dresse une liste de sept raisons pour lesquelles il faut se retenir de tester (de son propre aveux, sa liste manque de nuance, mais c&#8217;est pour la clarté de son propos)&nbsp;:</p>
<ul>
<li>Ne pas chercher à couvrir 100% du code.</li>
<li>Si votre ratio code/test est de 1:2, ça ne sent pas bon&nbsp;; s&#8217;il est de 1:3, ça pue carrément.</li>
<li>Si vos tests vous prennent plus d&#8217;un tiers de votre temps, vous vous y prenez sûrement mal. Si ça vous prend plus de la moitié de votre temps, vous êtes certain de mal vous y prendre.</li>
<li>Ne testez pas le comportement normal de votre ORM.</li>
<li>Gardez les tests d&#8217;intégration pour valider les éléments séparés (ne pas faire de tests d&#8217;intégration sur des éléments qui peuvent être testés unitairement).</li>
<li>N&#8217;utilisez pas Cucumber à moins de vivre dans le royaume merveilleux des tests-écrits-par-des-non-programmeurs (et envoyez-moi une bouteille de poussière de fée si vous y êtes).</li>
<li>Ne vous forcez pas à faire du TDD sur tous vos contrôleurs, tous vos modèles et toutes vos vues (mon ratio est typiquement de 20% de code testé avant d&#8217;être écrit, 80% testé après avoir été écrit).</li>
</ul>
<p>Il cite ensuite une remarque faite par Ken Beck (inventeur de l&#8217;<a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Extreme_programming" target="_blank">extrem programming</a> et auteur référent en TDD) en réponse à <a href="http://stackoverflow.com/questions/153234/how-deep-are-your-unit-tests/153565#153565" target="_blank">une question</a> sur le site StackOverflow&nbsp;:</p>
<blockquote><p>Je suis payé pour faire du code qui fonctionne, pas pour faire des tests, donc ma philosophie est d&#8217;écrire aussi peu de tests que nécessaire pour atteindre un certain niveau de confiance (je suspecte que ce niveau est élevé par rapport aux standards industriels, mais ce n&#8217;est peut-être que de la fierté mal placée). S&#8217;il y a un type d&#8217;erreur que je ne fais habituellement pas (comme remplir les mauvaises variables dans un constructeur), je ne le teste pas.</p></blockquote>
<p>(je vous conseille de lire le fil complet sur StackOverflow)</p>
<p>Au final, mon but n&#8217;est pas de fanfaronner (l&#8217;avis de David H. Hansson ne vaut pas forcément plus que l&#8217;avis d&#8217;un autre), mais juste de répéter ce que j&#8217;ai toujours dit&nbsp;: Même le meilleur pattern peut devenir un anti-pattern quand il est mal utilisé ou quand il est utilisé à outrance. La réponse est rarement dans les extrêmes ; on vit dans un monde nuancé.<br />
Et il est illusoire de ne pas prendre en compte les coûts induits par les tests − tout comme il est illusoire de ne pas prendre en compte les coûts de maintenance provenant de code non testé.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geek-directeur-technique.com/2012/04/26/contre-les-extremismes-couteux-le-retour/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Ma conférence au Forum PHP 2012 : Démons en PHP, de inetd à ZeroMQ</title>
		<link>http://www.geek-directeur-technique.com/2012/04/19/ma-conference-au-forum-php-2012-demons-en-php-de-inetd-a-zeromq</link>
		<comments>http://www.geek-directeur-technique.com/2012/04/19/ma-conference-au-forum-php-2012-demons-en-php-de-inetd-a-zeromq#comments</comments>
		<pubDate>Thu, 19 Apr 2012 15:53:53 +0000</pubDate>
		<dc:creator>Amaury</dc:creator>
				<category><![CDATA[Événements]]></category>
		<category><![CDATA[AFUP]]></category>
		<category><![CDATA[démon]]></category>
		<category><![CDATA[Forum PHP]]></category>
		<category><![CDATA[inetd]]></category>
		<category><![CDATA[zeromq]]></category>

		<guid isPermaLink="false">http://www.geek-directeur-technique.com/?p=1164</guid>
		<description><![CDATA[J&#8217;en parlais rapidement dans mon précédent post&#160;; le Forum PHP est une importante manifestation informatique parisienne. Pendant deux jours, des invités prestigieux donnent des conférences techniques autour des technologies du web et de PHP. Cette année, le Forum PHP se tiendra les 5 et 6 juin à la Cité Universitaire Internationale. J&#8217;ai proposé une conférence [...]]]></description>
			<content:encoded><![CDATA[<p>J&#8217;en parlais rapidement dans mon <a title="Création de l’antenne parisienne de l’AFUP" href="http://www.geek-directeur-technique.com/2012/04/13/creation-de-lantenne-parisienne-de-lafup">précédent post</a>&nbsp;; le <a href="http://afup.org/pages/forumphp2012" target="_blank">Forum PHP</a> est une importante manifestation informatique parisienne. Pendant deux jours, des invités prestigieux donnent des conférences techniques autour des technologies du web et de PHP.</p>
<p>Cette année, le Forum PHP se tiendra les 5 et 6 juin à la <a href="http://afup.org/pages/forumphp2012/acces.php" target="_blank">Cité Universitaire Internationale</a>.</p>
<p>J&#8217;ai proposé une conférence qui a été retenue, et que je présenterai le <strong>mercredi 6 juin</strong>, de 14h00 à 14h45. Voici le texte de présentation de cette conférence&nbsp;:</p>
<blockquote><p>Durant cette présentation, nous passerons en revue les différentes techniques servant à créer des démons en PHP, c&#8217;est-à-dire des serveurs logiciels destinés à recevoir des connexions réseau et gérer des communications client-serveur.<br />
Nous verrons les techniques les plus simples, permettant de prototyper rapidement un démon. Ensuite nous nous intéresserons aux contraintes qui s&#8217;appliquent à ce type de développement, et les impacts que cela implique sur les choix de design logiciel. Nous aborderons alors les différentes techniques de création de démons autonomes en PHP.<br />
Pour terminer, nous verrons comment utiliser la bibliothèque ZeroMQ pour faire communiquer des programmes en utilisant des paradigmes différents du client-serveur traditionnel.</p></blockquote>
<p><strong>Programme</strong></p>
<ol>
<li>Rappel client-serveur</li>
<li>Démons basés sur (x)inetd</li>
<li>Démons multi-processus</li>
<li>Démons mono-processus</li>
<li>ZéroMQ</li>
<ol>
<li>Présentation</li>
<li>Différents types de communications</li>
<li>Load-balancing</li>
<li>Polling</li>
</ol>
</ol>
<p>Ce sera la première conférence que je donnerai en dehors du milieu académique. J&#8217;ai quand même donné près d&#8217;une quinzaine de conférences dans des universités et des écoles d&#8217;ingénieurs, mais là je serai face à des personnes dont certaines sont bien plus expérimentées que moi.</p>
<p>Mais ça devrait bien se passer. J&#8217;ai proposé un sujet que je pense maîtriser assez bien. Le projet <a title="FineFS, système de fichiers redondé" href="http://www.geek-directeur-technique.com/2009/08/09/finefs-systeme-de-fichiers-redonde">FineFS</a> est un exemple pointu de développement client-serveur en PHP, et je vous ai déjà parlé plusieurs fois de <a title="ZeroMQ, la super bibliothèque réseau" href="http://www.geek-directeur-technique.com/2011/09/21/zeromq-la-super-bibliotheque-reseau">ZeroMQ</a>.</p>
<p><a href="http://afup.org/pages/forumphp2012/inscription.php" target="_blank">Venez nombreux</a> !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geek-directeur-technique.com/2012/04/19/ma-conference-au-forum-php-2012-demons-en-php-de-inetd-a-zeromq/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Création de l&#8217;antenne parisienne de l&#8217;AFUP</title>
		<link>http://www.geek-directeur-technique.com/2012/04/13/creation-de-lantenne-parisienne-de-lafup</link>
		<comments>http://www.geek-directeur-technique.com/2012/04/13/creation-de-lantenne-parisienne-de-lafup#comments</comments>
		<pubDate>Fri, 13 Apr 2012 15:42:16 +0000</pubDate>
		<dc:creator>Amaury</dc:creator>
				<category><![CDATA[Événements]]></category>
		<category><![CDATA[AFUP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.geek-directeur-technique.com/?p=1154</guid>
		<description><![CDATA[Peut-être connaissez-vous l&#8217;AFUP, l&#8217;association française des utilisateurs de PHP. Cette association œuvre à la promotion du langage PHP et des technologies afférentes auprès des professionnels et des entreprises. L&#8217;AFUP organise deux grands rendez-vous, le Forum PHP et le PHP Tour, qui sont l&#8217;occasion d&#8217;assister à des conférences données par des personnages reconnus de la communauté [...]]]></description>
			<content:encoded><![CDATA[<p>Peut-être connaissez-vous l&#8217;<a href="http://www.afup.org/" target="_blank">AFUP</a>, l&#8217;association française des utilisateurs de PHP. Cette association œuvre à la promotion du langage PHP et des technologies afférentes auprès des professionnels et des entreprises.</p>
<p>L&#8217;AFUP organise deux grands rendez-vous, le <a href="http://afup.org/pages/forumphp2012/" target="_blank">Forum PHP</a> et le <a href="http://afup.org/pages/phptourlille2011/" target="_blank">PHP Tour</a>, qui sont l&#8217;occasion d&#8217;assister à des conférences données par des personnages reconnus de la communauté technique internationale (<a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Michael_Widenius" target="_blank">Monty</a>, <a href="http://toys.lerdorf.com/" target="_blank">Rasmus</a>, &#8230;) et française (<a href="http://www.jmfontaine.net/blog/" target="_blank">Jean-Marc</a>, <a href="http://hoa-project.net/" target="_blank">Ivan</a>, <a href="http://pa.tchwork.com/wiki/Accueil" target="_blank">Nicolas</a>, <a href="http://fabien.potencier.org/" target="_blank">Fabien</a>, <a href="http://dotheweb.posterous.com/" target="_blank">François</a>, <a href="http://blog.mageekbox.net/" target="_blank">Frédéric</a>, &#8230;) − oui, je me la pète en les appelant par leurs prénoms&nbsp; :-)<br />
L&#8217;AFUP organise aussi des &laquo;&nbsp;rendez-vous&nbsp;&raquo;, c&#8217;est-à-dire des conférences à thème qui se déroulent sur une soirée. Et elle offre un cadre à des <a href="http://www.aperophp.net/" target="_blank">apéritifs</a> spontanés.</p>
<p>Depuis quelques temps, l&#8217;association cherche à dissocier les activités nationales (Forum PHP et PHP Tour) des activités locales. C&#8217;est ainsi que des antennes locales se sont ouvertes à Lille, Lyon, Orléans et Nantes. Bizarrement, aucune antenne locale n&#8217;avait été créée sur Paris. La raison est que les membres du bureau organisaient les Rendez-Vous parisiens, mais cela finissait par poser divers problèmes, dont le résultat final est qu&#8217;il n&#8217;y a eu que deux Rendez-Vous et un apéro sur Paris en 2011.</p>
<p>Cette semaine, nous avons donc créé l&#8217;antenne parisienne. Je vais occuper le poste de &laquo;&nbsp;coordinateur&nbsp;&raquo;. Je ferai équipe avec <a title="Twitter" href="https://twitter.com/#!/rapha_86" target="_blank">Raphaëlle Simonney</a> qui tiendra le rôle de &laquo;&nbsp;modératrice&nbsp;&raquo;, et <a href="http://blog.hello-design.fr/" target="_blank">Christophe Villeneuve</a> qui a été désigné comme suppléant.</p>
<p>Les étiquettes importent peu au final. Nous allons essayer de redonner un peu de dynamisme aux évènements PHP parisiens. Je suis certain qu&#8217;il suffit de peu pour y arriver, parce qu&#8217;il y a sur Paris à la fois les compétences et la volonté d&#8217;y arriver, et que nous bénéficions de l&#8217;énorme travail effectué par l&#8217;AFUP depuis plusieurs années.<br />
Raphaëlle est pleine d&#8217;énergie (et d&#8217;humour&nbsp;!)&nbsp;; Christophe a une grande expérience et un carnet d&#8217;adresse bien rempli, ainsi qu&#8217;un enthousiasme quasi-juvénile. Ça fait plaisir de se lancer avec eux.</p>
<p>Pour le moment, j&#8217;ai en tête de tenter un rapprochement avec les nombreuses autres communautés techniques qui organisent des conférences sur des sujets extrêmement proches&nbsp;; on devrait pouvoir faire en sorte que ces mondes puissent se croiser de temps en temps. On verra bien.</p>
<p>Mais c&#8217;est aussi la possibilité d&#8217;organiser n&#8217;importe quel type d’évènement intéressant autour de PHP. L&#8217;exemple donné par <a href="http://lacot.org/" target="_blank">Xavier Lacot</a>, le président de l&#8217;AFUP, c&#8217;est que si on pense pouvoir apporter quelque chose à la communauté PHP en organisant une distribution de stickers, pas de soucis, l&#8217;AFUP nous soutiendra.</p>
<p><strong>Alors n&#8217;hésitez pas à me partager vos idées et vos envies&nbsp;!</strong> Qu&#8217;est-ce qu&#8217;une association comme l&#8217;AFUP pourrait faire qui soit utile&nbsp;? Ou marrant (mais quand même un peu utile)&nbsp;?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geek-directeur-technique.com/2012/04/13/creation-de-lantenne-parisienne-de-lafup/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Rachat par une grosse entreprise</title>
		<link>http://www.geek-directeur-technique.com/2012/04/11/rachat-par-une-grosse-entreprise</link>
		<comments>http://www.geek-directeur-technique.com/2012/04/11/rachat-par-une-grosse-entreprise#comments</comments>
		<pubDate>Wed, 11 Apr 2012 15:14:04 +0000</pubDate>
		<dc:creator>Amaury</dc:creator>
				<category><![CDATA[Création d'entreprise]]></category>
		<category><![CDATA[implication]]></category>
		<category><![CDATA[organisation]]></category>
		<category><![CDATA[rachat]]></category>
		<category><![CDATA[vocabulaire]]></category>

		<guid isPermaLink="false">http://www.geek-directeur-technique.com/?p=1093</guid>
		<description><![CDATA[L&#8217;entreprise dans laquelle je travaille, que j&#8217;ai participé à créer il y a près de 5 ans, a été rachetée l&#8217;été dernier par un grand groupe français. Je me suis souvent demandé comment je pouvais en parler sur ce blog de manière intéressante. Je me lance. Le passé C&#8217;est en fait la troisième fois que [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;entreprise dans laquelle je travaille, que j&#8217;ai participé à créer il y a près de 5 ans, a été rachetée l&#8217;été dernier par un grand groupe français. Je me suis souvent demandé comment je pouvais en parler sur ce blog de manière intéressante. Je me lance.</p>
<h3>Le passé</h3>
<p>C&#8217;est en fait la troisième fois que je vis un rachat de l&#8217;intérieur.</p>
<p>La première fois, j&#8217;étais dans une petite boîte qui s&#8217;est fait rachetée par une société de taille équivalente, mais filiale d&#8217;un plus grand groupe. Les choses ne se sont pas très bien passées&nbsp;; nous avions été absorbés, nous avons emménagés dans leurs locaux, dans l&#8217;idée de tout migrer de notre plate-forme technique vers la leur (ce qui se justifiait pour certains projets, mais pas pour tous). Je pense qu&#8217;en fait, c&#8217;est notre porte-feuille clients qui les intéressait, et éventuellement le positionnement de certains de nos sites mobiles. Par contre, les hommes et la technologie ne semblaient pas peser lourd dans la balance, à part deux des trois créateurs de la boîte.</p>
<p>La deuxième fois, j&#8217;étais dans une entreprise de taille plus importante, qui s&#8217;est fait racheter par le plus grand cabinet de conseil au monde. Nous étions leader sur le marché de la musique numérique sur mobile. Le repreneur n&#8217;avait pas pour habitude de racheter des entreprises &laquo;&nbsp;média&nbsp;&raquo;, mais nous avions d&#8217;importants projets avec les plus grandes majors, ce qui lui permettait de prendre pied dans cet univers. Nous gardions notre indépendance théorique, mais au moment où je suis parti (pour créer mon entreprise actuelle), les employés commençaient tout juste à ressentir l&#8217;invasion des décideurs/chefs de projets externes. La technologie était gardée, c&#8217;était un actif fondamental. Par contre, je n&#8217;ai pas eu l&#8217;impression que les ressources humaines valorisaient le personnel en place.</p>
<h3>Le présent</h3>
<p>Donc, ma boîte a été rachetée. Il y a des choses que je ne peux évidemment pas raconter ici. Soit parce que je n&#8217;en ai pas le droit (on a été racheté par une société cotée en bourse), soit parce que je n&#8217;en ai pas envie.</p>
<p>Commençons par détendre l&#8217;atmosphère&nbsp;: Non, je n&#8217;ai malheureusement pas fait fortune. J&#8217;ai participé à la création de ma boîte, mais elle ne m&#8217;appartenait pas. Mes quelques stock-options m&#8217;ont permis d&#8217;obtenir une prime qui ne change pas ma vie (je ne peux pas arrêter de travailler, je ne peux pas rembourser mon prêt immobilier). Ça fait juste de l&#8217;argent sur un compte, qui m&#8217;aidera un jour à payer une partie des études de ma fille&nbsp;; c&#8217;est déjà ça.</p>
<p>Je n&#8217;ai pas participé aux discussions qui ont amené au rachat, ni au négociations concernant la valorisation de notre entreprise. Je ne peux malheureusement pas en parler (sinon je raconterais de conneries). Tout ce que je peux dire, c&#8217;est que les premières rencontres avaient pour but de réfléchir à des partenariats commerciaux&nbsp;; de fil en aiguille, on s&#8217;est rendu compte qu&#8217;un partenariat &laquo;&nbsp;avancé&nbsp;&raquo; aurait du sens.</p>
<p>Contrairement aux précédents rachats que j&#8217;ai connu, les choses se sont passées (et se passent encore) de manière intelligente et sensée. Nous n&#8217;avons pas été absorbés, nous sommes une filiale indépendante, avec toujours nos propres projets, nos propres objectifs, notre propre équipe, notre propre budget.<br />
Évidemment, nous avons des nouveaux projets, menés en collaboration avec notre &laquo;&nbsp;maison mère&nbsp;&raquo; (ça fait bizarre à dire quand a toujours baigné dans la culture start-up). Il faut bien comprendre et prendre en compte que nous avons été racheté pour de bonnes raisons, et que cela peut impliquer de mettre en place des passerelles techniques entre les plate-formes. Dans notre cas, nous fournissons des contenus à travers des webservices, et nous utilisons des applications fournies de l&#8217;autre côté, là encore à travers des webservices.</p>
<h3>Les observations</h3>
<p>Quand une grosse boîte en rachète une petite, il y a forcément une période d&#8217;adaptation. Je pense que nous n&#8217;avons pas encore fini d&#8217;apprendre et de comprendre comment ils fonctionnent.</p>
<p><span id="more-1093"></span>La première chose à laquelle il faut s&#8217;habituer, c&#8217;est la différence des cycles de décision et de développement. Chez nous, <a title="Application concrète des méthodes agiles" href="http://www.geek-directeur-technique.com/2011/05/12/application-concrete-des-methodes-agiles">les cycles sont mensuels</a>, avec une mise en production à la fin de chaque mois. Chez eux, les cycles sont de 6 mois, avec un overlap de 3 mois (c&#8217;est-à-dire que les cycles durent 6 mois, mais qu&#8217;il y a une livraison tous les 3 mois, avec toujours deux cycles en parallèle). Pour de bonnes raisons, mais aussi quelques mauvaises, cela s&#8217;explique. Mais ça fait quand même bizarre.<br />
Le plus gênant, à nos yeux extérieurs, est la &laquo;&nbsp;danse de la négociation technique&nbsp;&raquo;. Quand un projet doit être évalué, les équipes techniques semblent multiplier les durées par 2 ou 3, ce qui génère énervement et frustration. Pourtant, on ne peut pas leur en vouloir&nbsp;: à chaque fois, on leur demande d&#8217;évaluer un projet qui n&#8217;est pas spécifié complètement&nbsp;; à force de se faire avoir, ils se couvrent maintenant systématiquement&#8230;</p>
<p>La deuxième chose à laquelle il faut s&#8217;acclimater, ce sont toutes les différences de vocabulaire. Les termes fonctionnels et business sont différents, et les premières semaines sont truffées de moments où les visages s&#8217;éclairent au fur et à mesure que les gens comprennent ce que les autres veulent dire.<br />
Mais cela se cache même dans le moindre détail&nbsp;: Quand j&#8217;ai rencontré un gars qui se présentait comme faisant partie de la &laquo;&nbsp;direction technique&nbsp;&raquo;, j&#8217;ai pensé que c&#8217;était l&#8217;un des directeurs techniques de l&#8217;entreprise. Et au bout du sixième directeur technique, j&#8217;ai réalisé qu&#8217;ils font partie de la direction technique ou de la direction marketing, de la même manière que nous faisons partie de l&#8217;équipe technique ou de l&#8217;équipe rédactionnelle.<br />
Ah, et un point de détail&nbsp;: Pour moi, le <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Marketing" target="_blank">marketing</a> était principalement une activité en rapport avec la promotion d&#8217;un produit et l&#8217;adéquation de son offre avec son marché. J&#8217;ai découvert que le &laquo;&nbsp;marketing produit&nbsp;&raquo; pouvait consister à penser les fonctionnalités d&#8217;un site web. Nous, on appelle ça &laquo;&nbsp;le fonctionnel&nbsp;&raquo;, mais c&#8217;est globalement la même chose.</p>
<p>La troisième chose notable, c&#8217;est le retour aux jeux politiques. J&#8217;en avais été globalement épargné durant ma carrière, principalement parce que j&#8217;ai toujours privilégié les petites entreprises. Mais là, il faut bien se rendre compte qu&#8217;une entreprise qui compte plusieurs milliers de salariés nécessite une hiérarchisation plus rigide, et un découpage des équipes. Mais à force de bâtir des silos, on finit par devoir mettre en place des &laquo;&nbsp;équipes transverses&nbsp;&raquo;, dont le travail est de favoriser la communication entre les silos.<br />
Vous avez alors la porte ouverte à des conflits de pouvoir, simplement parce que vous avez plusieurs personnes qui font des choses similaires&nbsp;; et chacun veut être libre de ses mouvement.<br />
Le problème, c&#8217;est que les gens qui vivent ça au quotidien finissent par intégrer ce mode de fonctionnement. Et fonctionnent parfois de la même manière dans leurs intégrations avec nous.</p>
<h3>Le vrai soucis</h3>
<p>Mais j&#8217;ai remarqué un problème bien plus important, qui résulte un peu des différents points précédents. Dans une grosse entreprise, le grand patron a des milliards de choses à gérer. Aussi, il est normal qu&#8217;il délègue les évolutions du service/produit à ses directeurs. Eux-mêmes ont beaucoup de choses à gérer, chacune déléguée à une ou plusieurs personnes. Et ainsi de suite sur au moins 3 ou 4 niveaux hiérarchiques.</p>
<p>J&#8217;ai ainsi assisté à des réunions dont le but était de parler de l&#8217;avancement de spécifications fonctionnelles, concernant l&#8217;évolution du service de la maison mère. Lors de la réunion qui devait servir à simplement entériner les maquettes, nous nous sommes retrouvés à poser des questions fondamentales sur les choix qu&#8217;ils avaient fait, parce que certains points ne nous semblaient pas optimaux (au mieux) voire pas réfléchis du tout (au pire).<br />
A ce moment-là, j&#8217;ai vu le big boss se tourner vers son directeur marketing (souvenez-vous, marketing == fonctionnel). Celui-ci, incapable de répondre aux questions, s&#8217;est tourné vers sa chef de produit. Et celle-ci a simplement répondu qu&#8217;elle ne savait pas, que nos remarques étaient bonnes et qu&#8217;ils allaient modifier la maquette.</p>
<p>Le problème, dans une telle organisation, c&#8217;est que vous pouvez avoir plusieurs niveaux hiérarchiques, où chaque personne essaye d&#8217;avoir une réflexion globale sans jamais s&#8217;attacher aux points de détail. Vous pouvez ainsi vous retrouver avec un site web qui offre une mauvaise ergonomie, simplement parce que certains détails n&#8217;ont pas été précisés, et donc le stagiaire qui a fait la maquette a placé les éléments comme il le sentait.<br />
Vous voyez le truc. Et quand le travail remonte les couches hiérarchique, chacun vérifie que ça correspond à ce qu&#8217;il avait exprimé.</p>
<p>Nous, ça nous fait halluciner. Parce que tout le monde est sensibilisé au fait de reconsidérer chaque détail, pour tenter de converger vers le meilleur produit possible. Du PDG à l&#8217;intégrateur HTML, tout le monde participe à cela.<br />
D&#8217;un autre côté, virer de cap rapidement est forcément plus facile quand on pilote un jet-ski que lorsqu&#8217;on est à la barre d&#8217;un paquebot.</p>
<h3>Le futur</h3>
<p>Cela fait maintenant 8 mois que nous avons été rachetés. Nous avons accompli quelques beaux projets en collaboration, et nous en avons d&#8217;autres dans les tuyaux.</p>
<p>J&#8217;ai personnellement la satisfaction d&#8217;avoir des interlocuteurs techniques de haute qualité, avec qui il est agréable de travailler&nbsp;; on parle le même langage, on a la même recherche de l&#8217;efficacité. C&#8217;est loin des personnes avec qui j&#8217;ai pu travailler par le passé dans des conditions similaires, qui étaient plus proches de &laquo;&nbsp;technico-commerciaux&nbsp;&raquo; que de vrais informaticiens compétents.</p>
<p>J&#8217;ai aussi la chance de pouvoir faire appel à tout un panel d&#8217;expertises, me permettant d&#8217;accélérer la montée en expérience de ma propre équipe technique. Inversement, mes alter ego ont l&#8217;intelligence de faire appel à moi quand on aborde des domaines sur lesquels j&#8217;ai une expertise plus pointue que la leur. C&#8217;est important pour se sentir intégré à un grand groupe, qui sinon pourrait sembler complètement impersonnel.</p>
<h3>Mon avis</h3>
<p>Le rachat d&#8217;une entreprise est toujours un moment très anxiogène. Il est notamment très important de rassurer ses collègues, car tout le monde se met naturellement à craindre pour son emploi, son autonomie, ses responsabilités&#8230; Il est assez facile de devenir un peu irrationnel, il faut y faire attention.</p>
<p>Un rachat est idéalement une bonne nouvelle pour les investisseurs et le propriétaire de l&#8217;entreprise. Mais personne ne veut acheter une boîte qui risque de se vider de ses compétences (à moins de vouloir racheter une techno sans ses techniciens, une base clients sans les commerciaux qui y sont attachés, etc.). Un bon rachat nécessite donc un travail intelligent de préparation et d&#8217;accompagnement des salariés.</p>
<p>Les quelques points importants en cas de rachat&nbsp;:</p>
<ul>
<li>Ne vous mettez pas dans une position &laquo;&nbsp;nous contre eux&nbsp;&raquo;. Tout le monde s&#8217;en rend compte, c&#8217;est improductif, ça vous dessert.</li>
<li>Essayez d&#8217;apprendre rapidement le vocabulaire et le jargon propres à vos nouveaux collègues. Cela réduira grandement les frictions. Mais il faut aussi leur expliquer votre propre jargon, leur faire comprendre qu&#8217;ils doivent l&#8217;intégrer s&#8217;ils veulent comprendre votre métier.</li>
<li>Distinguez au plus tôt les quelques interlocuteurs-clés avec qui vous allez travailler. Tentez d&#8217;en trouver quelques-uns à des postes très différents, qui vous semblent sympas&nbsp;; vous pourrez les contacter pour qu&#8217;ils vous aiguillent vers la bonne personne, quand vous ne saurez pas qui appeler pour avoir la bonne information. Ça, c&#8217;est sans prix.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.geek-directeur-technique.com/2012/04/11/rachat-par-une-grosse-entreprise/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mes projets sur GitHub</title>
		<link>http://www.geek-directeur-technique.com/2012/03/18/mes-projets-sur-github</link>
		<comments>http://www.geek-directeur-technique.com/2012/03/18/mes-projets-sur-github#comments</comments>
		<pubDate>Sun, 18 Mar 2012 14:35:58 +0000</pubDate>
		<dc:creator>Amaury</dc:creator>
				<category><![CDATA[Questions techniques]]></category>
		<category><![CDATA[Carta Genius]]></category>
		<category><![CDATA[FineBase]]></category>
		<category><![CDATA[FineFS]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[HeaderBrowser]]></category>
		<category><![CDATA[temma]]></category>
		<category><![CDATA[Ylib]]></category>

		<guid isPermaLink="false">http://www.geek-directeur-technique.com/?p=1131</guid>
		<description><![CDATA[J&#8217;ai migré sur GitHub un certain nombre de projets dont je mène le développement. L&#8217;URL est simple&#160;: https://github.com/Amaury Voici une rapide présentation des projets en question. Temma Le framework que j&#8217;ai développé au sein de mon entreprise. C&#8217;est un framework MVC écrit en PHP, qui accélère les développements par son fonctionnement très facile à appréhender. [...]]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai migré sur GitHub un certain nombre de projets dont je mène le développement.</p>
<p>L&#8217;URL est simple&nbsp;: <a title="GitHub" href="https://github.com/Amaury" target="_blank">https://github.com/Amaury</a></p>
<p>Voici une rapide présentation des projets en question.</p>
<h3>Temma</h3>
<p>Le framework que j&#8217;ai développé au sein de mon entreprise. C&#8217;est un framework MVC écrit en PHP, qui accélère les développements par son fonctionnement très facile à appréhender.</p>
<p>Toute la documentation est disponible sur <a title="Temma" href="http://www.temma.net" target="_blank">http://www.temma.net</a></p>
<h3>FineFS</h3>
<p>C&#8217;est le système de fichier redondé utilisé là aussi dans mon entreprise. Son principe est de permettre l&#8217;accès à des fichiers depuis plusieurs machines d&#8217;un même cluster, avec un fonctionnement à la fois synchrone et asynchrone. Il est codé en PHP.</p>
<p>En attendant que toute la documentation soit migrée sur GitHub, elle est toujours visible sur GoogleCode&nbsp;: <a title="FineFS" href="http://finefs.googlecode.com" target="_blank">http://finefs.googlecode.com</a></p>
<h3>FineBase</h3>
<p>Il s&#8217;agit d&#8217;une bibliothèque de fonctionnalités basiques, écrite en PHP. C&#8217;est la brique de base sur laquelle Temma et FineFS sont fondés. Les fonctionnalités offertes sont&nbsp;:</p>
<ul>
<li>Système de lock, pour empêcher plusieurs exécutions concurrentes d&#8217;un même programme ou plusieurs accès simultanés à une même ressource.</li>
<li>Système de log, pour écrire des messages qui vont être publiés (dans un fichier, sur la sortie d&#8217;erreur, via syslog, ou transmis à des handlers) en fonction de leur criticité et des seuils de criticité minimale définis pour chaque couche logicielle. Cela permet par exemple d&#8217;avoir un programme pour lequel on verra les erreurs des couches les plus basses, et tous les messages de débuggage pour les couches les plus hautes.</li>
<li>Un objet de gestion unifiée des sessions, un autre pour la base de données, un autre pour l&#8217;accès au cache (utilisant Memcache).</li>
<li>Un wrapper sur HTML Tidy pour nettoyer du code HTML généré par WYSIWYG.</li>
<li>Une file de messages stockée en base de données.</li>
<li>Une extension au SoapClient de PHP, pour supporter l&#8217;authentification WSSecurity.</li>
<li>Un chronomètre de temps d&#8217;exécution.</li>
<li>Un objet de registre, un objet d&#8217;écriture ANSI sur la ligne de commande, quelques objets d&#8217;exception, &#8230;</li>
</ul>
<h3>HeaderBrowser</h3>
<p>C&#8217;est un outil de génération de documentation à partir de code source en C ou en C++. Dans l&#8217;idée, il est assez similaire à JavaDoc ou PHPdoc, se basant sur des commentaires contenant des marquages spéciaux. Par contre, la documentation générées est affichée d&#8217;une manière qui facilite grandement la navigation&nbsp;; vous pouvez en trouver un exemple pour la bibliothèque Ylib (voir plus bas).</p>
<p><span id="more-1131"></span>Écrit en C++, cet outil est maintenant un peu ancien.</p>
<p>Plus d&#8217;information sur le site <a title="HeaderBrowser" href="http://www.headerbrowser.org" target="_blank">http://www.headerbrowser.org</a></p>
<h3>Ylib</h3>
<p>Ce projet propose une bibliothèque de fonctions, écrite en C. Il y a pas mal de choses à l&#8217;intérieur&nbsp;:</p>
<ul>
<li>Calcul de CRC, encodage/décodage en Base64 et quoted-printable.</li>
<li>Quelques helpers sur la gestion de la mémoire (malloc/free).</li>
<li>Gestion du lock et du log.</li>
<li>Chronomètre de temps d&#8217;exécution.</li>
<li>Décodage d&#8217;URL.</li>
<li>Chaîne de caractère bufferisée, vecteurs bufferisés.</li>
<li>Gestion simplifiée de scripts CGI.</li>
<li>Parseurs XML, SAX et DOM, et interprétation XPath.</li>
<li>Wrapper de connexion réseau, helper de création de démon.</li>
<li>&#8230;</li>
</ul>
<p>La documentation, générée avec HeaderBrowser&nbsp;: <a href="http://ylib.amaury.net/hbresult-html/">http://ylib.amaury.net/hbresult-html/</a></p>
<h3>Carta Genius</h3>
<p>Là il s&#8217;agit d&#8217;un logiciel servant à créer des documents PDF de qualité professionnelle. Je l&#8217;avais créé au début pour faire des planches de cartes de jeu, que je faisais imprimer par des imprimeurs numériques professionnels. Cela demandait un certain nombre de fonctionnalités particulières&nbsp;: réutilisation d&#8217;images, transparence, traits de coupe (pour que l&#8217;imprimeur sache où couper, sans que les traits n&#8217;apparaissent sur les cartes), fond perdu, imposition (faire correspondre le recto et le verso), etc.</p>
<p>Par la suite, j&#8217;y ai ajouté pas mal de possibilités, qui permettent de l&#8217;utiliser pour générer tout type de PDF. J&#8217;y ai notamment ajouté un interpréteur, qui permet de faire des écritures assez poussées.</p>
<h3>En conclusion</h3>
<p>Je ne suis pas encore opérationnel à 100% avec Git. J&#8217;ai tellement l&#8217;habitude de <a href="http://subversion.apache.org/" target="_blank">Subversion</a> que plusieurs choses me semblent inutilement complexes avec Git. Mais il faut reconnaître que c&#8217;est très pratique pour faciliter les contributions sur un projet open-source.</p>
<p>N&#8217;hésitez pas à cloner les projets et à faire des &laquo;&nbsp;pull requests&nbsp;&raquo; pour me proposer vos améliorations. J&#8217;y apporterai toute l&#8217;attention nécessaire.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geek-directeur-technique.com/2012/03/18/mes-projets-sur-github/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Le manifeste &#171;&#160;micro PHP&#160;&#187;</title>
		<link>http://www.geek-directeur-technique.com/2012/03/09/le-manifeste-micro-php</link>
		<comments>http://www.geek-directeur-technique.com/2012/03/09/le-manifeste-micro-php#comments</comments>
		<pubDate>Fri, 09 Mar 2012 11:44:55 +0000</pubDate>
		<dc:creator>Amaury</dc:creator>
				<category><![CDATA[Questions techniques]]></category>
		<category><![CDATA[manifeste]]></category>
		<category><![CDATA[Micro PHP]]></category>
		<category><![CDATA[micro-framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[temma]]></category>

		<guid isPermaLink="false">http://www.geek-directeur-technique.com/?p=1114</guid>
		<description><![CDATA[Je suis tombé récemment sur le manifeste micro PHP. Le manifeste Plutôt que de faire un copier-coller bête et méchant de la version originale, voici une traduction approximative&#160;: Je suis un développeur PHP Je ne suis pas un développeur Zend Framework ou Symphony ou CakePHP. Je pense que PHP est déjà suffisamment compliqué. J&#8217;aime créer [...]]]></description>
			<content:encoded><![CDATA[<p>Je suis tombé récemment sur <a href="http://microphp.org/" target="_blank">le manifeste micro PHP</a>.</p>
<h3>Le manifeste</h3>
<p>Plutôt que de faire un copier-coller bête et méchant de la version originale, voici une traduction approximative&nbsp;:</p>
<p><strong>Je suis un développeur PHP</strong><br />
Je ne suis pas un développeur Zend Framework ou Symphony ou CakePHP.<br />
Je pense que PHP est déjà suffisamment compliqué.</p>
<p><strong>J&#8217;aime créer des choses simples</strong><br />
J&#8217;aime créer des choses simples avec des objectifs simples.<br />
J&#8217;aime créer des choses qui résolvent des problèmes.<br />
J&#8217;aime créer des choses simples qui, mises ensemble, résolvent des problèmes complexes.</p>
<p><strong>Je veux moins de code, pas plus</strong><br />
Je veux écrire moins de code, pas plus.<br />
Je veux gérer moins de code, pas plus.<br />
Je veux maintenir moins de code, pas plus.<br />
Chaque morceau de code que j&#8217;ajoute à un projet doit être justifié.</p>
<p><strong>J&#8217;aime le code simple et lisible</strong><br />
Je veux écrire du code qui se comprend facilement.<br />
Je veux du code qui se teste facilement.</p>
<h3>Le détail</h3>
<p>Le créateur de ce manifeste explique sa pensée plus en détail sur son blog. Dans <a href="http://funkatron.com/posts/the-microphp-manifesto.html" target="_blank">un premier post</a>, il donne sa vision d&#8217;ensemble. Mettons de côté sa comparaison musicale (il compare l&#8217;installation de deux batteurs, pour dire qu&#8217;il se voit comme un codeur punk, et non pas comme un codeur rock-progressif&#8230; mais on s&#8217;en fout un peu).</p>
<p>Ce qui est intéressant, c&#8217;est lorsqu&#8217;il donne un exemple de code, censé être typique des applications Zend Framework&nbsp;:</p>
<p><span id="more-1114"></span></p>
<pre>&lt;?php
chdir(dirname(__DIR__));
require_once (getenv('ZF2_PATH')&nbsp;?: 'vendor/ZendFramework/library') . '/Zend/Loader/AutoloaderFactory.php';
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' =&gt; array()));

$appConfig = include 'config/application.config.php';

$listenerOptions = new Zend\Module\Listener\ListenerOptions($appConfig['module_listener_options']);
$defaultListeners = new Zend\Module\Listener\DefaultListenerAggregate($listenerOptions);
$defaultListeners-&gt;getConfigListener()-&gt;addConfigGlobPath('config/autoload/*.config.php');

$moduleManager = new Zend\Module\Manager($appConfig['modules']);
$moduleManager-&gt;events()-&gt;attachAggregate($defaultListeners);
$moduleManager-&gt;loadModules();

// Create application, bootstrap, and run
$bootstrap = new Zend\Mvc\Bootstrap($defaultListeners-&gt;getConfigListener()-&gt;getMergedConfig());
$application = new Zend\Mvc\Application;
$bootstrap-&gt;bootstrap($application);
$application-&gt;run()-&gt;send();</pre>
<p>Et là, je le rejoins complètement. C&#8217;est une chose que j&#8217;ai déjà rabâchée à plusieurs reprises. À mon sens, un framework doit simplifier le développement, le rendre plus rapide et plus lisible. C&#8217;est une évidence pour tout le monde, mais le moyen d&#8217;y arriver ne semble pas être commun à tous.</p>
<p>À mes yeux, le code d&#8217;une application doit être limpide. Évidemment, on s&#8217;attend à avoir un &laquo;&nbsp;socle de base&nbsp;&raquo;, un &laquo;&nbsp;moteur&nbsp;&raquo; sous-jacent qui est là pour simplifier les choses. L&#8217;exemple de code ci-dessus est sans appel. Moi non plus, je ne veux pas avoir à coder des trucs comme ça.</p>
<p>Je peux comprendre qu&#8217;il puisse y avoir à choisir entre complexité du code d&#8217;un côté, et complexité de la configuration de l&#8217;autre. Si un framework rend le code simple, mais au prix d&#8217;une configuration plus complexe, cela peut s&#8217;expliquer. Ensuite, tout dépend de là où on souhaite mettre le curseur. Une configuration plus simple aura sûrement pour effet de complexifier le code.<br />
Le problème, c&#8217;est qu&#8217;on se retrouve parfois à avoir du code complexe ET des fichiers de configuration illisibles.</p>
<h3>Les micro-frameworks et les micro-bibliothèques</h3>
<p>L&#8217;auteur du manifeste prend ensuite le parti de dire qu&#8217;il existe des micro-frameworks qui font très bien le boulot. Prenant l&#8217;exemple de <a href="http://www.slimframework.com/" target="_blank">Slim</a>, <a href="https://github.com/jmathai/epiphany" target="_blank">Epiphany</a>, <a href="https://github.com/whatthejeff/breeze" target="_blank">Breeze</a> et <a href="http://limonade-php.github.com/" target="_blank">Limonade</a>, il part du principe qu&#8217;il sont largement suffisant pour la plupart des besoins, et que son approche est de les enrichir grâce à des bibliothèques de fonctions, plutôt que de vouloir utiliser un framework &laquo;&nbsp;full-stack&nbsp;&raquo;.</p>
<p>Pour rappel, les micro-frameworks fonctionnent quasiment tous sur le même modèle. Pour illustrer la chose, voici l&#8217;exemple de code fourni par Slim&nbsp;:</p>
<pre>&lt;?php
require 'Slim/Slim.php';
$app = new Slim();
$app-&gt;get('/hello/:name', function ($name) {
    echo "Hello, $name!";
});
$app-&gt;run();
?&gt;</pre>
<p>Pour finir, l&#8217;auteur du manifeste tient à jour <a href="http://microphp.org/code.html" target="_blank">une liste de projets</a>, qui sont tous censés être simples à utiliser, qui remplissent une seule fonctionnalité (ou un groupe de fonctionnalités connexes). L&#8217;idée est sympa, même si le nombre de projets similaires réduit son utilité.</p>
<h3>Mon avis</h3>
<p>Je suis complètement d&#8217;accord avec ce manifeste. Le code doit être simple&nbsp;; rapide à écrire, facile à lire, facile à modifier. Je pense que personne ne dira le contraire.</p>
<p>Le seul point sur lequel je suis un peu plus circonspect, c&#8217;est en ce qui concerne les micro-frameworks. Je m&#8217;y suis intéressé un peu à une époque, et j&#8217;ai joué avec <a href="http://silex.sensiolabs.org/" target="_blank">Silex</a>, notamment. Et je n&#8217;ai pas trouvé que cette approche simplifiait réellement l&#8217;écriture de <em>vrais</em> sites.</p>
<p>Je suis peut-être trop formaté par l&#8217;approche à laquelle je suis habitué, mais je ne pense pas que la manière dont le routage est imbriqué dans le code soit l&#8217;idéal pour avoir du code simple à lire et à maintenir. Et plus le site sera important, plus ce sera vrai.</p>
<p>Cela m&#8217;amène à parler un peu du framework <a title="Temma.net" href="http://www.temma.net/" target="_blank">Temma</a>.<br />
Comme présenté sur le site du projet, l&#8217;idée générale est très simple&nbsp;:</p>
<ul>
<li>Pour une URL du type <strong>/article/show/123/title</strong></li>
<li>le framework exécute<strong> ArticleController::execShow(123, &#8216;title&#8217;);</strong></li>
<li>et transmet les données au template <strong>article/show.tpl</strong></li>
</ul>
<p>Et, à part une configuration très succincte (paramétrage de l&#8217;accès à la base de données), tout ce qu&#8217;on se retrouve à écrire comme code, ce sont simplement des objets dont les méthodes vont répondre aux URL. Nous sommes d&#8217;accord qu&#8217;il n&#8217;y a rien de fondamentalement novateur là-dedans, cette approche est partagée par de nombreux frameworks. Mais le code applicatif n&#8217;est pas pollué par le framework.</p>
<p>L&#8217;idée générale de Temma est de proposer quelques fonctionnalités de base (il y a quand même un embryon de routage, une gestion des sessions et du cache, de la base de données, &#8230;), qui sont extensibles à l&#8217;aide de plugins. On en parlait récemment <a href="http://groups.google.com/group/finemedia-oss/browse_thread/thread/7bfefe9d7b0857ee" target="_blank">sur le forum</a> de discussion qui lui est consacré. Si vous avez besoin d&#8217;un routage élaboré, il suffit d&#8217;ajouter un plugin&nbsp;; si vous voulez gérer un site multilingue, encore un plugin&nbsp;; et ainsi de suite.<br />
Ça permet de garder un cœur simple à comprendre et à assimiler, tout en gardant la souplesse d&#8217;en faire ce qu&#8217;on veut en fonction de nos besoins.</p>
<p>Pour en revenir au manifeste micro PHP, je pense qu&#8217;il s&#8217;agit surtout d&#8217;un rappel d&#8217;un principe fondamental du développement. Quand on développe, on sépare le code en entités séparées les unes des autres. La programmation orientée objet facilite cette approche en fournissant la brique de base de ce concept&nbsp;; mais au-dessus de l&#8217;objet, il y a les bibliothèques qui regroupent plusieurs objets.</p>
<p>Ces différentes entités s&#8217;appellent entre elles pour profiter des fonctionnalités qu&#8217;elles offrent. Ce qui fait la différence entre un bonne bibliothèque et une mauvaise, c&#8217;est entre autre à quel point elle encapsule sa complexité et réussit à présenter une interface simple et facile à utiliser. Si une bibliothèque impose d&#8217;écrire des dizaines de lignes de code pour simplement y faire appel, ou si son API est tellement obscure qu&#8217;il faut faire plusieurs appels pour réaliser la moindre action simple, c&#8217;est qu&#8217;il y a un soucis.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geek-directeur-technique.com/2012/03/09/le-manifeste-micro-php/feed</wfw:commentRss>
		<slash:comments>50</slash:comments>
		</item>
		<item>
		<title>Traiter les emails entrants (Exim + SpamAssassin + PHP)</title>
		<link>http://www.geek-directeur-technique.com/2012/03/02/traiter-les-emails-entrants-exim-spamassassin-php</link>
		<comments>http://www.geek-directeur-technique.com/2012/03/02/traiter-les-emails-entrants-exim-spamassassin-php#comments</comments>
		<pubDate>Fri, 02 Mar 2012 13:12:07 +0000</pubDate>
		<dc:creator>Amaury</dc:creator>
				<category><![CDATA[Questions techniques]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[Exim]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[pipe]]></category>
		<category><![CDATA[SpamAssassin]]></category>

		<guid isPermaLink="false">http://www.geek-directeur-technique.com/?p=1097</guid>
		<description><![CDATA[Il y a quelque temps, j&#8217;ai passé en revue plusieurs services servant à envoyer et recevoir des emails dans un mode SaaS. Je reste persuadé que, la plupart du temps, ces services permettent de gagner du temps. On crée un compte, on écrit un bout de code pour s&#8217;y connecter, et c&#8217;est prêt. Malgré tout, [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a quelque temps, j&#8217;ai <a title="API d’envoi et de réception d’emails" href="http://www.geek-directeur-technique.com/2011/11/24/api-denvoi-et-de-reception-demails">passé en revue</a> plusieurs services servant à envoyer et recevoir des emails dans un mode <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Logiciel_en_tant_que_service" target="_blank">SaaS</a>. Je reste persuadé que, la plupart du temps, ces services permettent de gagner du temps. On crée un compte, on écrit un bout de code pour s&#8217;y connecter, et c&#8217;est prêt.</p>
<p>Malgré tout, il y a des cas où ça coince fonctionnellement. Et quand on a besoin de souplesse, il n&#8217;y a rien de mieux que de le faire soi-même.<br />
En plus, <a href="http://www.ze-technology.com/" target="_blank">Adrien</a> semblait dire en <a href="http://www.geek-directeur-technique.com/2011/11/24/api-denvoi-et-de-reception-demails#comment-5009">commentaire</a> que c&#8217;est quelque chose d&#8217;assez facile à faire, alors j&#8217;ai voulu expérimenter la chose.</p>
<p>Pour l&#8217;environnement technique, je suis parti d&#8217;un serveur sous Linux, en utilisant la distribution <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Ubuntu" target="_blank">Ubuntu</a> version 11.04. J&#8217;ai utilisé le serveur mail <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Exim" target="_blank">Exim</a>, car c&#8217;est celui sur lequel j&#8217;ai le plus d&#8217;expérience&nbsp;; il y a quelques années, c&#8217;était le seul <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Mail_Transfer_Agent" target="_blank">MTA</a> qui proposait une intégration poussée avec le filtre anti-spam <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/SpamAssassin" target="_blank">SpamAssassin</a> (du moins dans les paquets fournis par Debian/Ubuntu).<br />
Enfin, j&#8217;ai fait en sorte que les emails reçus soient traités par un script écrit en PHP (je ne vais pas <a title="Les langages de programmation – Partie 1&nbsp;: Ce que je connais" href="http://www.geek-directeur-technique.com/2012/01/06/les-langages-de-programmation-partie-1-ce-que-je-connais">revenir là-dessus</a>).</p>
<p>Je vais vous expliquer comment j&#8217;ai procédé. Pour l&#8217;exemple, on va dire que le serveur n&#8217;est utilisé que pour le seul domaine <strong>toto.com</strong>, et que tous les messages reçu sont envoyés au même script PHP, quelle que soit l&#8217;adresse email du destinataire (c&#8217;est donc un &laquo;&nbsp;<a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Catch-all" target="_blank">catch-all</a>&nbsp;&raquo; sur le domaine toto.com).</p>
<h3>Installation</h3>
<p>Pour commencer, j&#8217;ai installé PHP en mode ligne de commande&nbsp;:</p>
<pre>$ sudo apt-get install php5-cli</pre>
<p>Puis Exim et SpamAssassin&nbsp;:</p>
<pre>$ sudo apt-get install exim4-daemon-heavy sa-exim spamassassin</pre>
<p>Nous allons maintenant voir la configuration d&#8217;Exim et de SpamAssassin. Je ne vais pas parler de la configuration de PHP (ce sera peut-être pour un autre article).</p>
<h3>Configuration de SpamAssassin</h3>
<p>Éditer le fichier <span style="color: #0000ff;">/etc/default/spamassassin</span>&nbsp;:</p>
<pre>ENABLED=1
CRON=1</pre>
<p><span id="more-1097"></span>Cela lui indique de s&#8217;activer, et de mettre ses filtres à jour en utilisant la crontab.</p>
<p>Démarrer de démon spamd&nbsp;:</p>
<pre>$ sudo /etc/init.d/spamassassin start</pre>
<p>Mise-à-jour des règles de spam&nbsp;:</p>
<pre>$ sudo spamassassin -D --lint
$ sudo sa-update
$ sudo sa-compile
$ sudo sa-update -D channel,dns
$ sudo spamassassin -D --lint</pre>
<p>Éditer le fichier <span style="color: #0000ff;">/etc/spamassassin/local.cf</span>&nbsp;:</p>
<pre>report_safe 1
use_bayes 1
bayes_auto_learn 1
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status</pre>
<p>Pour activer la détection basique de virus intégrée à SpamAssassin, il faut éditer le fichier <span style="color: #0000ff;">/etc/spamassassin/v310.pre</span> et décommenter la ligne suivante&nbsp;:</p>
<pre>loadplugin Mail::SpamAssassin::Plugin::AntiVirus</pre>
<p>Enfin, redémarrer SpamAssassin&nbsp;:</p>
<pre>$ sudo /etc/init.d/spamassassin restart</pre>
<h3>Configuration d&#8217;Exim</h3>
<p>Pour que Exim écarte automatiquement les spams, il faut lui dire d&#8217;utiliser SpamAssassin. Éditer le fichier <span style="color: #0000ff;">/etc/exim4/sa-exim.conf</span> et commenter la ligne suivante&nbsp;:</p>
<pre>SAEximRunCond: 0</pre>
<p>Éditer le fichier <span style="color: #0000ff;">/etc/exim4/update-exim4.conf.conf</span> pour indiquer le nom de domaine local&nbsp;:</p>
<pre>dc_other_hostnames='toto.com'</pre>
<p>Comme un bourrin, je lui dis d&#8217;écouter sur toutes les interfaces réseau, sur le port 25. Il faut éditer le fichier <span style="color: #0000ff;">/etc/exim4/conf.d/main/01_exim4-config_listmacrodefs</span>&nbsp;:</p>
<pre>local_interfaces = 0.0.0.0.25</pre>
<p>Un petit détail qui a son importance, il faut dire à Exim de ne pas essayer de chercher l&#8217;<a title="Wikipedia" href="http://en.wikipedia.org/wiki/Ident" target="_blank">identité</a> de l&#8217;expéditeur. C&#8217;est un truc inutile, qui risque de générer un timeout qui ralenti le traitement de tous les messages reçu. Il faut donc éditer le fichier <span style="color: #0000ff;">/etc/exim4/conf.d/main/02_exim4-config_options</span>&nbsp;:</p>
<pre>rfc1413_query_timeout = 0s</pre>
<p>On va maintenant créer une route qui prendra en compte les messages reçus. On va créer le fichier <span style="color: #0000ff;">/etc/exim4/conf.d/router/999_exim4-config_toto</span>&nbsp;:</p>
<pre>toto:
  debug_print = "R: toto for $local_part@$domain"
  driver = accept
  domains = +local_domains
  transport = toto_pipe</pre>
<p>Il faut ensuite créer une méthode de transport, qui va exécuter la commande spécifiée, ouvrir un &laquo;&nbsp;pipe&nbsp;&raquo; vers ce programme et y envoyer le contenu du message reçu. On va créer le fichier <span style="color: #0000ff;">/etc/exim4/conf.d/transport/999_exim4-config_toto_pipe</span>&nbsp;:</p>
<pre>toto_pipe:
  debug_print = "T: toto_pipe for $local_part@$domain"
  driver = pipe
  path = "/bin:/usr/bin:/usr/local/bin"
  <strong>command = "/chemin/vers/mon/script.php"</strong>
  return_path_add
  delivery_date_add
  envelope_to_add</pre>
<p>J&#8217;ai mis en gras la partie qui nous intéresse le plus, celle qui détermine le programme qui sera exécuté, et à qui Exim transmettra le contenu de chaque message reçu.</p>
<p>On n&#8217;a plus qu&#8217;à redémarrer Exim&nbsp;:</p>
<pre>$ sudo /etc/init.d/exim4 restart</pre>
<h3>Programme PHP</h3>
<p>Le programme qui va traiter les messages doit simplement lire sur son entrée standard pour récupérer le contenu brut du message.</p>
<p>Voici une première version simpliste qui se contente d&#8217;enregistrer le contenu du message dans un fichier&nbsp;:</p>
<pre>#!/usr/bin/php
&lt;?php

$email = file_get_contents('php://stdin');
$filename = tempnam('/tmp', 'mail-');
file_put_contents($filename, $email);

?&gt;</pre>
<p>J&#8217;ai essayé d&#8217;envoyer des emails, et j&#8217;ai bien récupéré les fichiers correspondant. J&#8217;ai même pu vérifier que le filtre anti-spam fonctionnait&nbsp;: J&#8217;ai envoyé des emails en mettant comme adresse d&#8217;expéditeur un nom de domaine dont le champ <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Sender_Policy_Framework" target="_blank">SPF</a> indiquait une adresse IP différente de celle que j&#8217;utilisais pour envoyer le message (vous avez suivi&nbsp;? sinon dites-le moi en commentaire, j&#8217;expliquerai plus longuement), et le message a directement été refusé par Exim, sans même le transmettre au script PHP.</p>
<p>Pour aller plus loin, il faudrait décoder les parties <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions" target="_blank">MIME</a> du message, pour en extraire les différentes informations. Il existe suffisamment de tutoriaux sur ce sujet pour pouvoir s&#8217;arrêter là.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geek-directeur-technique.com/2012/03/02/traiter-les-emails-entrants-exim-spamassassin-php/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Les langages de programmation &#8211; Partie 4 : simplicité et syntaxe</title>
		<link>http://www.geek-directeur-technique.com/2012/01/26/les-langages-de-programmation-partie-4-simplicite-et-syntaxe</link>
		<comments>http://www.geek-directeur-technique.com/2012/01/26/les-langages-de-programmation-partie-4-simplicite-et-syntaxe#comments</comments>
		<pubDate>Thu, 26 Jan 2012 09:24:05 +0000</pubDate>
		<dc:creator>Amaury</dc:creator>
				<category><![CDATA[Questions techniques]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Pascal]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.geek-directeur-technique.com/?p=1064</guid>
		<description><![CDATA[Dans la suite de mes trois précédents articles consacrés à ce sujet, j&#8217;ai commencé à écrire un très long article dans lequel je décortique point par point les différentes caractéristiques des langages de programmation. L&#8217;écriture de l&#8217;article m&#8217;a obligée à structurer mes idées, et m&#8217;a aidée à réaliser un certain nombre de choses. Par contre, [...]]]></description>
			<content:encoded><![CDATA[<p>Dans la suite de mes trois précédents articles consacrés à ce sujet, j&#8217;ai commencé à écrire un très long article dans lequel je décortique point par point les différentes caractéristiques des langages de programmation. L&#8217;écriture de l&#8217;article m&#8217;a obligée à structurer mes idées, et m&#8217;a aidée à réaliser un certain nombre de choses. Par contre, l&#8217;article lui-même est devenu un long truc un peu indigeste, alors j&#8217;ai décidé de le mettre à la poubelle.</p>
<p>Pour le moment, je vais juste reprendre une partie de ce que j&#8217;avais écrit, concernant la syntaxe des langages.</p>
<p>Une des caractéristiques essentielles d&#8217;un langage de programmation, c&#8217;est d&#8217;être facile à lire et à relire. On doit pouvoir lire du code source comme un linguiste peut lire un texte écrit dans une langue étrangère.<br />
Cela passe notamment par un syntaxe légère, qui ne se mette pas en travers de la lecture, qui ne soit pas inutilement verbeuse et qui reste sans ambiguïté.</p>
<h3>Blocs, labels, accolades et indentation</h3>
<p>Pour illustrer mon propos, je vais vous montrer comment on code la <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Factorielle" target="_blank">factorielle</a> récursive dans plusieurs langages procéduraux. Tout d&#8217;abord en <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Pascal_(langage)" target="_blank">Pascal</a> :</p>
<pre>FUNCTION factorielle (n: shortint)&nbsp;: integer;
BEGIN
 &nbsp;  IF n &lt;= 1 THEN
        BEGIN
            WRITELN('End of loop');
 &nbsp; &nbsp; &nbsp;      factorielle&nbsp;:= 1
        END
 &nbsp;  ELSE
        BEGIN
            WRITELN('Loop');
 &nbsp; &nbsp; &nbsp;      factorielle&nbsp;:= n * factorielle (n - 1)
        END;
END;</pre>
<p>Ensuite en <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/BASIC" target="_blank">BASIC</a> (<a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Visual_Basic_.NET" target="_blank">VB.net</a>, inspiré par le site <a title="Developpez.com" href="http://plasserre.developpez.com/ve1-2.htm" target="_blank">Developpez.com</a>,&nbsp;© Philippe Laserre)&nbsp;:</p>
<pre>Function Factorielle (ByVal N as Long) As Long
 &nbsp;  If N=1 Then
 &nbsp; &nbsp; &nbsp;  Console.WriteLine("End of loop")
 &nbsp; &nbsp; &nbsp;  Return 1
 &nbsp;  End If
 &nbsp;  Console.WriteLine("Loop")
 &nbsp;  Return N * Factorielle(N - 1)
End Function</pre>
<p>Et voici le code équivalent en <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/C_(langage)" target="_blank">C</a> :</p>
<pre>int factorielle(int n)
{
 &nbsp;  if (n &lt;= 1)
    {
        printf("End of loop\n");
 &nbsp; &nbsp; &nbsp;  return 1;
    }
    printf("Loop\n");
 &nbsp;  return n * factorielle(n - 1);
}</pre>
<div>
<p>Pour terminer cette démonstration, voici la même fonction factorielle en <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Python_(langage)#Syntaxe" target="_blank">Python</a> :</p>
<pre>def factorielle(x):
 &nbsp;  if x &lt;= 1:
 &nbsp; &nbsp; &nbsp;  print("End of loop\n")
 &nbsp; &nbsp; &nbsp;  return 1
 &nbsp;  print("Loop\n")
 &nbsp;  return x * factorielle(x - 1)</pre>
<p>Je vous laisse voir le code équivalent en <a title="Ruby France" href="http://www.rubyfrance.org/documentations/les-bases/le-guide-de-lutilisateur/des-exemples-simples/" target="_blank">Ruby</a>, qui conjugue syntaxe légères et <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Type_(informatique)#Typage" target="_blank">typage dynamique</a> comme le Python.</p>
<p>Je crois que j&#8217;ai déjà cité mon prof de C en prépa, qui parlait des différences entre les langages créés par des mathématiciens suisses (cf. le Pascal) et ceux créés par des hippies californiens (cf. le C). Et encore, l&#8217;exemple serait plus criant si il fallait déclarer des variables&nbsp;; en Pascal c&#8217;est vraiment marrant.</p>
<p>Je vous rappelle que le BASIC est né en 1963, le Pascal en 1970, le C en 1972, le Python en 1990 et le Ruby en 1995. Il y a forcément une notion de modernisme dans la simplification de la syntaxe des langages.</p>
<p>Je ne parle pas de la compacité d&#8217;un code par rapport à l&#8217;autre, mais bien de sa lisibilité intrinsèque. Le C utilise des accolades, là où le Pascal et le BASIC utilisent du texte (BEGIN, END, End If, End Function). Savoir où placer les point-virgules en fin de ligne n&#8217;est pas forcément naturel au premier abord en Pascal, alors qu&#8217;en C le comportement est consistant&nbsp;; le BASIC et le Python se suppriment quant à eux complètement cette contrainte. Pour finir, la déclaration de la fonction avec son type de retour et son paramètre, est assez similaire entre le Pascal et le BASIC&nbsp;; le C est bien moins verbeux. En Python, il n&#8217;y a pas de déclaration du type des fonctions et des variables, c&#8217;est encore plus simple à lire (mais moins rigoureux diront certains).</p>
<p>Sur un exemple comme celui-ci, mon avis est assez évident. Le fait d&#8217;utiliser des termes textuels peut sembler plus facile à appréhender pour les débutants, mais j&#8217;y apporte deux objections&nbsp;: Premièrement, même si on ne vous explique pas le rôle des accolades, le code en C ci-dessus est très facilement compréhensible, et on devine sans peine à quoi elles servent. Deuxièmement, les éléments de syntaxe basique sont intégrés très rapidement par les codeurs débutants&nbsp;; obliger les développeurs à affronter la pollution visuelle des BEGIN/END pendant tout le reste de leur vie me semble être un mauvais calcul.</p>
<p><span id="more-1064"></span>Je ne veux pas tant montrer que je préfère la syntaxe du C que de pointer le genre de détails qui font qu&#8217;un langage peut − ou non − mettre des bâtons dans les roues des développeurs qui l&#8217;utilisent.</p>
<p>On peut remarquer que le Python va encore plus loin en supprimant même les accolades. C&#8217;est l&#8217;indentation qui détermine les blocs de code. Les experts du langage trouvent ça très positif&nbsp;: le code est plus simple car il ne nécessite plus aucune indication de début et fin de bloc, et cela unifie le formatage du code. Même si je suis sensible à ces arguments, j&#8217;y vois personnellement 3 inconvénients&nbsp;: le mélange d&#8217;espaces et de tabulations peut générer des bugs indémerdables, à plus forte raison quand plusieurs développeurs interviennent en utilisant des éditeurs de texte différents&nbsp;; il n&#8217;y a rien pour “fermer” les blocs, on a l&#8217;impression que les fonctions flottent dans le vide (c&#8217;est une question d&#8217;habitude, je sais). Mais surtout, dans certains cas, on se retrouve à quand même utiliser des symboles de début et fin de bloc, et à ce moment-là l&#8217;indentation arrête d&#8217;être significative&nbsp;; par exemple, quand on construit une liste, le code suivant est fonctionnel, complètement logique, mais brise l&#8217;indentation habituelle en Python&nbsp;:</p>
<pre>ma_liste = [
 &nbsp; &nbsp; &nbsp; "aaa",
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "bbb",
  "ccc"
]</pre>
<h3>Dollars et points-virgules</h3>
<p>Les deux autres notions basiques sont l&#8217;utilisation du caractère dollar ($) devant les noms de variables et les points-virgules en fin d&#8217;expression.</p>
<p>Historiquement, le dollar était inutile dans les langages compilés (Pascal, C), mais traditionnel dans les langages de script (shell, Perl). C&#8217;est assez amusant, quand je code en C je me passe très bien des dollars, alors qu&#8217;en PHP je trouve ça naturel. C&#8217;est clairement une question d&#8217;habitude. J&#8217;ai tendance à trouver les dollars pratiques pour différencier d&#8217;un seul coup d&#8217;œil les variables des autres constructions du langage, comme les namespaces, ce qui peut s&#8217;avérer utile au fur et à mesure de l&#8217;ajout de fonctionnalités dans les langages modernes.</p>
<p>Les points-virgules en fin d&#8217;expression m&#8217;ont toujours semblés tout aussi naturels. Ils permettent de savoir où se termine l&#8217;expression. La plupart du temps il n&#8217;y en a pas besoin, car les expressions sont courtes et faciles à lire. Mais parfois − pas si rarement que ça, en fait − on écrit des expressions sur plusieurs lignes, et mon œil cherche instinctivement le point-virgule pour savoir où est la fin.<br />
On peut remarquer que le <a href="http://golang.org" target="_blank">Go</a> (nouveau langage de Google) n&#8217;a pas besoin de point-virgule en fin de ligne&nbsp;; mais, pour éviter les ambiguïtés, il impose que les accolades ouvrantes soient sur la même ligne que l&#8217;instruction <em>if</em> qui précède (cf. <a href="http://golang.org/doc/go_tutorial.html#tmp_33" target="_blank">documentation</a>). On en arrive donc à une situation très étrange, où pour simplifier l&#8217;écriture on se retrouve à la contraindre&#8230;</p>
<p>Un dernier point de détail concernant la syntaxe&nbsp;: L&#8217;utilisation des parenthèses.<br />
Plusieurs langages n&#8217;obligent pas de mettre des parenthèses autour des paramètres d&#8217;une fonction. Moi, ça me gêne. Depuis le collège, on est habitué à écrire des fonctions mathématiques&nbsp;; quand on écrit <em>f(x)</em>, on ne se pose aucune question, on sait que <em>f</em> est une fonction et qu&#8217;elle prend un paramètre nommé <em>x</em>.</p>
<h3>Parenthèses</h3>
<p>Idem pour les parenthèses autour de la condition d&#8217;un <em>if</em> ou d&#8217;un <em>while</em>. Je trouve que ça donne une délimitation visuelle claire. Si on regarde l&#8217;exemple suivant (tiré de la documentation du Go)&nbsp;:</p>
<pre>for i:= 0; i &lt; flag.NArg(); i++ {
 &nbsp;  if i &gt; 0 {
 &nbsp; &nbsp; &nbsp;  s+= space
 &nbsp;  }
 &nbsp;  s+= flag.Arg(i)
}</pre>
<p>Je le trouve moins lisible que s&#8217;il s&#8217;écrivait&nbsp;:</p>
<pre>for (i = 0; i &lt; flag.NArg(); i++) {
 &nbsp;  if (i &gt; 0)
 &nbsp; &nbsp; &nbsp;  s += space;
 &nbsp;  s += flag.Arg(i);
}</pre>
<p>Mais c&#8217;est sûrement encore une question d&#8217;habitude.</p>
<h3>Conclusion</h3>
<p>Bon&#8230; Encore un article qui ne sert pas à grand-chose&#8230;<br />
Tout ça pour dire que je suis habitué à un style de syntaxe auquel tout le monde est habitué, qui constitue les bases du C, du C++, du Perl, du Javascript, du PHP, &#8230;</p>
<p>J&#8217;ai un peu l&#8217;impression qu&#8217;après une période durant laquelle l&#8217;informatique s&#8217;est rapidement complexifiée avec l&#8217;arrivée des premiers gros ordinateurs, la syntaxe des langages a été simplifiée (merci <a title="Wikipédia" href="http://fr.wikipedia.org/wiki/Dennis_Ritchie" target="_blank">Dennis Ritchie</a>). Sur un cycle de re-complexification, on a abouti au C++, qui est quand même un monument à ce niveau. On a re-simplifié par la suite de différentes manières, plus ou moins réussies (Python, Lua, Java, Ruby, PHP, &#8230;).</p>
<p>Les être humains répétant régulièrement leurs erreurs, je pense que nous sommes actuellement dans un nouveau cycle de complexification. Il parait important d&#8217;ajouter des fonctionnalités aux langages, alors que ces mêmes fonctionnalités pourraient rester dans des bibliothèques externes&nbsp;; il semble nécessaire de farcir les frameworks de capacités supplémentaires, alors que les systèmes de plugins qui sont là pour ça. On ajoute plein de choses dans les systèmes d&#8217;exploitation, pour finalement <a title="PC Inpact" href="http://www.pcinpact.com/news/65434-windows-8-metro-interface-bureau.htm" target="_blank">leur donner la simplicité des OS mobiles</a>&#8230;</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.geek-directeur-technique.com/2012/01/26/les-langages-de-programmation-partie-4-simplicite-et-syntaxe/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

