<?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>Bux Blog</title>
	<atom:link href="http://blog.bux.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bux.fr</link>
	<description>code, systems, geek and life</description>
	<lastBuildDate>Tue, 09 Apr 2013 09:45:01 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Initiation à l&#8217;algorithmie sur fond d&#8217;arithmétique</title>
		<link>http://blog.bux.fr/initiation-a-l-algorithmie-sur-fond-darithmetique/</link>
		<comments>http://blog.bux.fr/initiation-a-l-algorithmie-sur-fond-darithmetique/#comments</comments>
		<pubDate>Fri, 05 Apr 2013 10:51:44 +0000</pubDate>
		<dc:creator>bux</dc:creator>
				<category><![CDATA[Articles personnels]]></category>
		<category><![CDATA[Articles professionnels]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[algorithmie]]></category>
		<category><![CDATA[arithmétique]]></category>

		<guid isPermaLink="false">http://blog.bux.fr/?p=316</guid>
		<description><![CDATA[Voici un petit exemple d&#8217;algorithmie appliqué a une situation ou l&#8217;on doit jouer avec les nombres. J&#8217;espère que cette présentation permettra à quelque-uns de mieux comprendre le fonctionnement des logiciels, voir même donner des envies à d&#8217;autres ! Définition du &#8230; <a href="http://blog.bux.fr/initiation-a-l-algorithmie-sur-fond-darithmetique/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Voici un petit exemple d&rsquo;algorithmie appliqué a une situation ou l&rsquo;on doit jouer avec les nombres. J&rsquo;espère que cette présentation permettra à quelque-uns de mieux comprendre le fonctionnement des logiciels, voir même donner des envies à d&rsquo;autres !</p>
<h2><strong>Définition du problème </strong></h2>
<p>Dans un jeux de société, nous avons 3 paquets de cartes (un <span style="color: #3366ff;">bleu</span>, un <span style="color: #ffff00;">jaune</span> et un <span style="color: #ff0000;">rouge</span>). Lorsque un joueurs tombe sur une certaine case du jeux (imaginez un monopoly) il doit recevoir une carte parmi les trois paquets. Cependant nous souhaitons qu&rsquo;il pioche sa carte d&rsquo;un des trois paquets selon des probabilités:</p>
<ul>
<li>10% de chances de recevoir une carte venant du paquet <span style="color: #3366ff;">bleu</span></li>
<li>25% de chances de recevoir une carte venant du paquet <span style="color: #ffff00;">jaune</span></li>
<li>65% de chances de recevoir une carte venant du paquet <span style="color: #ff0000;">rouge</span></li>
</ul>
<p>Pour savoir dans quel paquet le joueur devra piocher, nous devons insérer une part de hasard: imaginons donc que nous avons un dès a 100 faces. Nous établissons a l&rsquo;avance ces plages de nombres afin de savoir dans quel paquet piocher quand nous aurons lancé le dé:</p>
<ul>
<li>de 1 à 10: paquet <span style="color: #3366ff;">bleu</span></li>
<li>de 11 à 35: paquet <span style="color: #ffff00;">jaune</span></li>
<li>de 36 à 100: paquet <span style="color: #ff0000;">rouge</span></li>
</ul>
<p>Le défis va être d&rsquo;écrire un algorithme capable de simuler ce jet de dés permettant le choix du paquet de carte.</p>
<h2><strong>Visualiser nos chiffres </strong></h2>
<p>Pour mieux visualiser ces plages de nombres, imaginez une règle de 100 graduations:</p>
<ul>
<li>Les 10 premières graduations, de 1 à 10, représentes les 10%.</li>
<li>Les 25 prochaines graduations, de 11 à 35, représentes les 25%</li>
<li>Les 65 prochaines graduations, de 36 à 100, représentes les 65%</li>
</ul>
<p>En fonction du nombre donné par le dé a 100 faces et selon la graduation, nous savons quel paquet de carte choisir tout en restant fidèle aux probabilités de 10, 25 et 65%. Nous allons désormais représenter ces plages de nombres comme ceci:</p>
<p style="text-align: center;">10%   |   25%   |   65%</p>
<p style="text-align: center;"><strong><span style="color: #3366ff;">[</span>1 → 10<span style="color: #3366ff;">]</span> <span style="color: #ffff00;">[</span>11 → 35<span style="color: #ffff00;">]</span> <span style="color: #ff0000;">[</span>36 → 100<span style="color: #ff0000;">]</span></strong></p>
<h2><strong>Le modèle logique </strong></h2>
<p>Nous allons maintenant essayer de trouver un modèle logique la dedans. Un modèle qui, quelque soit le nombre de paquets de cartes et quelque soit les probabilités que nous avons, puisse toujours s&rsquo;appliquer. Dans un soucis de lecture nous allons appeler les 10% &laquo;&nbsp;<strong>A</strong>&laquo;&nbsp;, les 25% &laquo;&nbsp;<strong>B</strong>&nbsp;&raquo; et les 65% &laquo;&nbsp;<strong>C</strong>&laquo;&nbsp;. On constate en premier lieux ce modèle:</p>
<p style="text-align: center;"><strong><span style="color: #3366ff;">[</span>1 → 10<span style="color: #3366ff;">]</span> <span style="color: #ffff00;">[</span>10+1 → 10+25<span style="color: #ffff00;">]</span> <span style="color: #ff0000;">[</span>10+25+1 → 10+25+65<span style="color: #ff0000;">]</span></strong></p>
<p style="text-align: center;"><strong><span style="color: #3366ff;">[</span>1 → A<span style="color: #3366ff;">]</span> <span style="color: #ffff00;">[</span>A+1 → A+B<span style="color: #ffff00;">]</span> <span style="color: #ff0000;">[</span>A+B+1 → A+B+C<span style="color: #ff0000;">]</span></strong></p>
<p style="text-align: left;">Si nous rajoutions des paquets de cartes et modifions les probabilités, ce modèle fonctionnerais toujours. Vous pouvez essayez chez vous, succès garantis.</p>
<h2><strong>Le modèle logique: 2ème étape </strong></h2>
<p style="text-align: left;">Nous allons maintenant vouloir appliquer ce modèle à un algorithme informatique. Pour pouvoir le traiter de manière informatique il faut aller un peu plus loin: Nous devons trouver le modèle logique de chaque plage de nombre (<strong>[ ]</strong>) car notre algorithme devra répéter ce modèle pour chaque paquets de cartes (pourcentages). Car en effet un algorithme est une suite d&rsquo;instructions qui ne dévira pas de ce pour quoi elle a été programmé. On doit donc trouver un modèle logique, c&rsquo;est a dire comment trouver les nombres a l&rsquo;intérieur d&rsquo;une plage de nombres (<strong>[ ]</strong>), qui fonctionne a tout les coups.</p>
<p style="text-align: left;">Voici le modèle logique que nous cherchons:</p>
<p style="text-align: center;"><strong>[ Probabilités précédentes + 1 <strong>→</strong> Probabilités précédentes+Probabilité en cours ]</strong></p>
<p style="text-align: left;">Pour mieux comprendre, rien de vaut une <strong>mise en pratique</strong>! Nous avons trois paquets de cartes: nous allons donc effectuer le &laquo;&nbsp;calcul&nbsp;&raquo; trois fois. La première fois pour la première plage de dates correspondant aux 10% (<strong><span style="color: #3366ff;">[</span>1 → 10<span style="color: #3366ff;">]</span></strong> [11 → 35] [36 → 100])</p>
<ul>
<li>Modèle: <strong>[ Prob. préc. + 1 <strong>→</strong> Prob. préc. + Prob. en cours ]</strong></li>
<li><strong> Probabilités en cours: 10</strong></li>
<li><strong>Probabilités précédentes: 0</strong></li>
<li><strong><span style="color: #3366ff;">[</span>0+1 → 0+10<span style="color: #3366ff;">] </span></strong>[ ] [ ]<strong> </strong></li>
<li>soit <strong><span style="color: #3366ff;">[</span>1 → 10<span style="color: #3366ff;">] </span></strong>[ ] [ ]<strong><strong> </strong></strong></li>
</ul>
<p>La deuxième fois pour la deuxième plage de dates correspondant aux 25% ([1 → 10] <strong><span style="color: #ffff00;">[</span>11 → 35<span style="color: #ffff00;">]</span></strong> [36 → 100])</p>
<ul>
<li>Modèle: <strong>[ Prob. préc. + 1 <strong>→</strong> Prob. préc. + Prob. en cours ]</strong><strong> </strong></li>
<li><strong>Probabilités en cours: 25</strong></li>
<li><strong>Probabilités précédentes: 10</strong></li>
<li>[ ] <strong><span style="color: #ffff00;">[</span>10+1 → 10+25<span style="color: #ffff00;">]</span></strong> [ ]</li>
<li>soit [ ] <strong><span style="color: #ffff00;">[</span>11 → 35<span style="color: #ffff00;">]</span></strong> [ ]</li>
</ul>
<p>La troisième fois pour la troisième plage de dates correspondant aux 65% ([1 → 10] [11 → 35] <strong><span style="color: #ff0000;">[</span>36 → 100<span style="color: #ff0000;">]</span></strong>)</p>
<ul>
<li>Modèle: <strong>[ Prob. préc. + 1 <strong>→</strong> Prob. préc. + Prob. en cours ]</strong><strong> </strong></li>
<li><strong>Probabilités en cours: 65</strong></li>
<li><strong>Probabilités précédentes: 10 + 25 </strong></li>
<li>[ ] [ ] <strong><span style="color: #ff0000;">[</span>10+25+1 → 10+25+65<span style="color: #ff0000;">]</span></strong></li>
<li>soit [ ] [ ] <strong><span style="color: #ff0000;">[</span>36 → 100<span style="color: #ff0000;">]</span></strong></li>
</ul>
<p>Et voilà, nous constatons avec cette mise en pratique que le modèle logique fonctionne. Vous pouvez vérifier chez vous en ajoutant des paquets de cartes et probabilités si vous voulez.</p>
<h2><strong>L&rsquo;algorithme de génération des plages de nombres </strong></h2>
<p>Tout ceci nous permet maintenant d&rsquo;écrire notre premier algorithme ! Il s&rsquo;agit ici de transformer le modèle logique vu précédemment en un algorithme &laquo;&nbsp;textuel&nbsp;&raquo;, c&rsquo;est à dire lisible par n&rsquo;importe qui et respectant le modèle d&rsquo;un programme informatique: Sa lecture se fait de gauche à droite et de haut en bas: comme pour la lecture !</p>
<pre>"probabilités" contient 10%, 25% et 65%
"somme_probabilités_précédentes" vaut 0
"plages_de_nombres" est vide
pour chaque "probabilité_en_cours" dans les "probabilités":
  ajouter la plage ["somme_probabilités_précédentes"+1 → "somme_probabilités_précédentes"+"probabilité_en_cours"] aux "plages_de_nombres"
  "somme_probabilités_précédentes" vaut maintenant "somme_probabilités_précédentes" + "probabilité_en_cours"</pre>
<p>Comprenez que pour les lignes avec un alinéa (dans le &laquo;&nbsp;pour&nbsp;&raquo;) il est effectué le processus autant de fois qu&rsquo;il y a de probabilités (10%, 25%, 65%) de la même façon que nous l&rsquo;avons mis en pratique dans la section &laquo;&nbsp;Le modèle logique: 2ème étape&nbsp;&raquo;. Voici la décomposition du code pour mieux comprendre ce qu&rsquo;il se passe: Lors de la première passe:</p>
<pre>pour chaque "probabilité_en_cours" dans les "probabilités":
  #note: Premier coup c'est la probabilité de 10%
  #note: et somme_probabilités_précédentes vaut 0
  ajouter la plage [<strong>0</strong>+1 → <strong>0</strong>+<strong>10</strong>] aux "plages_de_nombres"
  "somme_probabilités_précédentes" vaut maintenant <strong>0</strong> + <strong>10</strong></pre>
<p>Deuxième passe:</p>
<pre>pour chaque "probabilité_en_cours" dans les "probabilités":
  #note: Deuxième coup c'est la probabilité de 25%
  #note: et somme_probabilités_précédentes vaut actuellement 10
  ajouter la plage [<strong>10</strong>+1 → <strong>10</strong>+<strong>25</strong>] aux "plages_de_nombres"
  "somme_probabilités_précédentes" vaut maintenant <strong>10</strong> + <strong>25</strong></pre>
<p>Troisième et dernière passe:</p>
<pre>pour chaque "probabilité_en_cours" dans les "probabilités":
  #note: Troisième coup c'est la probabilité de 65%
  #note: et somme_probabilités_précédentes vaut actuellement 35
  ajouter la plage [<strong>35</strong>+1 → <strong>35</strong>+<strong>65</strong>] aux "plages_de_nombres"
  "somme_probabilités_précédentes" vaut maintenant <strong>35</strong> + <strong>65</strong></pre>
<p>Après avoir effectué les 3 passes nous avons bien nos plages de nombres:</p>
<p style="text-align: center;"><span style="color: #3366ff;">[</span> 0 +1 <strong><strong>→</strong></strong> 0 + 10 <span style="color: #3366ff;">]</span> <span style="color: #ffff00;">[</span> 10 + 1 <strong><strong>→</strong></strong> 10 + 25 <span style="color: #ffff00;">]</span> <span style="color: #ff0000;">[</span> 35 + 1 <strong><strong>→</strong></strong> 35 + 65 <span style="color: #ff0000;">]</span></p>
<p style="text-align: center;">soit <span style="color: #3366ff;">[</span>1 → 10<span style="color: #3366ff;">]</span> <span style="color: #ffff00;">[</span>11 → 35<span style="color: #ffff00;">]</span> <span style="color: #ff0000;">[</span>36 → 100<span style="color: #ff0000;">]</span></p>
<h2>Code python</h2>
<p>Nous pouvons maintenant rédiger notre premier script, c&rsquo;est a dire notre premier &laquo;&nbsp;logiciel&nbsp;&raquo;. Nous allons rédiger ce code en <a href="https://fr.wikipedia.org/wiki/Python_%28langage%29" target="_blank">python</a>: C&rsquo;est un langage de programmation propre et facilement lisible, donc bien adapté a ce petit cours. L&rsquo;algorithme &laquo;&nbsp;textuel&nbsp;&raquo; vu précédemment devient:</p>
<pre>probabilites = [10, 25, 65]
somme_probabilites_precedentes = 0
plages_de_nombres = []
for probabilite_en_cours in probabilites:
  plages_de_nombres.append([somme_probabilites_precedentes+1, somme_probabilites_precedentes+probabilite_en_cours]) 
  somme_probabilites_precedentes = somme_probabilites_precedentes + probabilite_en_cours</pre>
<p>Et voilà! Ce code peut être compris par un ordinateur comprenant le langage python: pour une démonstration <a title="Démonstration dans un invite de commande" href="http://ascii.io/a/2692" target="_blank">cliquez ici</a>. Lorsque l’algorithme arrive a sa fin &laquo;&nbsp;<strong>plages_de_nombres</strong>&nbsp;&raquo; contient bien nos plages de nombres!</p>
<p style="text-align: center;"><strong><span style="color: #000000;">[</span> <span style="color: #0000ff;">[</span>1, 10<span style="color: #0000ff;">]</span>, <span style="color: #ffff00;">[</span>11, 35<span style="color: #ffff00;">]</span>, <span style="color: #ff0000;">[</span>36, 100<span style="color: #ff0000;">]</span> <span style="color: #000000;">]</span></strong></p>
<h2>Code python: simuler l’ensemble</h2>
<p>Il nous faut maintenant ajouter du code pour simuler le jet du dés et le choix du paquet de carte dans lequel le joueur devra piocher. Cette ligne permet d&rsquo;obtenir un nombre au hasard entre 1 et 100:</p>
<pre>jet = random.randint(1, 100)</pre>
<p>Pour savoir a quel paquet de carte correspond le jet de dés, nous allons, pour chaque plages de dates, voir si le nombre obtenu au dés s&rsquo;y trouve. Si il s&rsquo;y trouve, c&rsquo;est le paquet de cartes, correspondant a cette plage de dates qui sera notre résultat. Commençons avec l&rsquo;algorithme &laquo;&nbsp;textuel&nbsp;&raquo; (rappelons nous que &laquo;&nbsp;plages_de_nombres&nbsp;&raquo; contient &laquo;&nbsp;[[1,10] [11,35] [36,100]]&nbsp;&raquo;):</p>
<pre>pour chaque plage_de_nombre dans les plages_de_nombres:
  Si le jet est supérieur ou égal au premier nombre de cette plage_de_nombres 
  ET si le jet est inférieur ou égal aux deuxième nombre de cette plage_de_nombres:
    c'est cette plage_de_nombre a laquelle correspond le jet</pre>
<p>Illustrons cet algorithme &laquo;&nbsp;textuel&nbsp;&raquo; dans un cas pratique comme nous l&rsquo;avons déjà fait la fois précédente. Imaginons que notre jet de dés à fait <strong>49</strong>. Nous faisons trois fois ce qui est écrit dans le &laquo;&nbsp;pour&nbsp;&raquo; (puisque nous avons 3 &laquo;&nbsp;plages_de_nombres&nbsp;&raquo;):</p>
<pre>pour chaque plage_de_nombre dans les plages_de_nombres:
  #note: Premier coup c'est la plage [1, 10]
  Si <strong>49</strong> est supérieur ou égal à<strong> 1</strong> 
  ET si <strong>49</strong> est inférieur ou égal à <strong>10</strong>:
    c'est cette plage_de_nombre a laquelle correspond <strong>49</strong></pre>
<p>Les conditions de la phrase &laquo;&nbsp;Si&nbsp;&raquo; ne sont pas remplis, on passe à la suivante:</p>
<pre>pour chaque plage_de_nombre dans les plages_de_nombres:
  #note: Deuxième coup c'est la plage [11, 35]
  Si <strong>49</strong> est supérieur ou égal à<strong> 11</strong> 
  ET si <strong>49</strong> est inférieur ou égal à <strong>35</strong>:
    c'est cette plage_de_nombre a laquelle correspond <strong>49</strong></pre>
<p>Les conditions de la phrase &laquo;&nbsp;Si&nbsp;&raquo; ne sont toujours pas remplis, on passe à la suivante:</p>
<pre>pour chaque plage_de_nombre dans les plages_de_nombres:
  #note: Troisème coup c'est la plage [36, 100]
  Si <strong>49</strong> est supérieur ou égal à<strong> 36</strong> 
  ET si <strong>49</strong> est inférieur ou égal à <strong>100</strong>:
    c'est cette plage_de_nombre a laquelle correspond <strong>49</strong></pre>
<p>A la troisième passe les conditions du &laquo;&nbsp;Si&nbsp;&raquo; sont remplis, c&rsquo;est donc bien la plage de nombres du paquet de cartes rouges qui correspond à 49 ! Le code adapté au langage python est le suivant :</p>
<pre>jet = random.randint(1, 100)
plage_de_nombre_correspondant = None
for plage_de_nombre in plages_de_nombres:
  if jet &gt;= plage_de_nombre[0] and jet &lt;= plage_de_nombre[1]:
    plage_de_nombre_correspondant = plage_de_nombre</pre>
<p>Une fois les deux portions de code associés, cela nous donne:</p>
<pre>import random

probabilites = [10, 25, 65]
somme_probabilites_precedentes = 0
plages_de_nombres = []
for probabilite_en_cours in probabilites:
  plages_de_nombres.append([somme_probabilites_precedentes+1, somme_probabilites_precedentes+probabilite_en_cours]) 
  somme_probabilites_precedentes = somme_probabilites_precedentes + probabilite_en_cours

jet = random.randint(1, 100)
plage_de_nombre_correspondant = None
for plage_de_nombre in plages_de_nombres:
  if jet &gt;= plage_de_nombre[0] and jet &lt;= plage_de_nombre[1]:
    plage_de_nombre_correspondant = plage_de_nombre</pre>
<p>Ne prêtez pas attention la ligne &laquo;&nbsp;import random&nbsp;&raquo;, elle est juste nécessaire pour pouvoir utiliser random.randint. A la fin de l’exécution de ces lignes &laquo;&nbsp;plage_de_nombre_correspondant&nbsp;&raquo; contiendra la page de nombre correspondant au jet du dé. Pour voir le code s’exécuter, <a title="Visualiser le code" href="http://ascii.io/a/2695" target="_blank">cliquez ici</a>.</p>
<h2>Code python final</h2>
<p>Pour que le logiciel est un intérêt supplémentaire, nous devrions l&rsquo;améliorer de sorte à ce que nous puissions rapidement et facilement lancer la procédure à plusieurs reprises. Comme ceci ne concerne plus de l&rsquo;initiation a l&rsquo;algorithmie mais plutôt de la simple programmation logicielle je ne m’attarderais pas sur comment à été construit le code suivant. Cependant il intéressera les plus curieux <img src='http://blog.bux.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<pre>import random

def generer_les_plages_de_nombres(probabilites):
  somme_probabilites_precedentes = 0
  plages_de_nombres = []
  for probabilite_en_cours in probabilites:
    plages_de_nombres.append([somme_probabilites_precedentes+1, somme_probabilites_precedentes+probabilite_en_cours]) 
    somme_probabilites_precedentes = somme_probabilites_precedentes + probabilite_en_cours
  return plages_de_nombres

def trouver_plage_de_nombres_correspondantte_au_jet(jet, plages_de_nombres):
  plage_de_nombre_correspondant = None
  for plage_de_nombre in plages_de_nombres:
    if jet &gt;= plage_de_nombre[0] and jet &lt;= plage_de_nombre[1]:
      return plage_de_nombre

def trouver_cle(plage_de_nombres_trouve, plages_de_nombres):
  if plage_de_nombres_trouve in plages_de_nombres:
    return plages_de_nombres.index(plage_de_nombres_trouve)

def lancer_simulation(probabilites, paquets_de_cartes):
  jet = random.randint(1, 100)
  plages_de_nombres = generer_les_plages_de_nombres(probabilites)
  plage_de_nombre_correspondant_au_jet = trouver_plage_de_nombres_correspondantte_au_jet(jet, plages_de_nombres)
  cle = trouver_cle(plage_de_nombre_correspondant_au_jet, plages_de_nombres)
  print "pour le jet "+str(jet)+" c'est dans le paquet "+paquets_de_cartes[cle]+" que le joueur doit piocher"

paquets_de_cartes = ['Bleu', 'Jaune', 'Rouge']
probabilites = [10, 25, 65]
lancer_simulation(probabilites, paquets_de_cartes)</pre>
<p>Pour une démonstration, <a title="Démonstration avec le code complet" href="http://ascii.io/a/2696" target="_blank">cliquez ici</a>.</p>
<h2>Conclusion</h2>
<p>La programmation logicielle consiste a cela: Répondre a un problème et synthétiser sa solution en adaptant de contextes réels des modèles logiques de manière a ce qu&rsquo;ils soient compréhensible par une machine. Vos ordinateurs, les appareils électroniques et même des système uniquement mécaniques (voir par exemple le <a href="https://fr.wikipedia.org/wiki/M%C3%A9tier_Jacquard" target="_blank">métier à tisser Jacquard</a>) sont constitués de quelques ou de millions voir milliards de morceaux de logiques comme celui que nous venons de voir. Complexe, mais pas sorcier !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bux.fr/initiation-a-l-algorithmie-sur-fond-darithmetique/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>L&#8217;espèce humaine évolue-t-elle encore ?</title>
		<link>http://blog.bux.fr/lespece-humaine-evolue-t-elle-encore/</link>
		<comments>http://blog.bux.fr/lespece-humaine-evolue-t-elle-encore/#comments</comments>
		<pubDate>Wed, 24 Oct 2012 20:16:31 +0000</pubDate>
		<dc:creator>bux</dc:creator>
				<category><![CDATA[Articles personnels]]></category>
		<category><![CDATA[évolution]]></category>
		<category><![CDATA[génétique]]></category>
		<category><![CDATA[science]]></category>

		<guid isPermaLink="false">http://blog.bux.fr/?p=303</guid>
		<description><![CDATA[Je viens de regarder le documentaire &#171;&#160;L&#8217;espèce humaine évolue-t-elle encore ?&#160;&#187; diffusé sur arte ce mois-ci. Voici un petit résumé pour les personne qui s’intéresse au sujet: Avec les nouvelles technologies lié a la génétique ont comprend de mieux en &#8230; <a href="http://blog.bux.fr/lespece-humaine-evolue-t-elle-encore/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Je viens de regarder le documentaire &laquo;&nbsp;<a title="L'espèce humaine évolue-t-elle encore ?" href="http://videos.arte.tv/fr/videos/l-espece-humaine-evolue-t-elle-encore--6978134.html" target="_blank">L&rsquo;espèce humaine évolue-t-elle encore ?</a>&nbsp;&raquo; diffusé sur arte ce mois-ci. Voici un petit résumé pour les personne qui s’intéresse au sujet:</p>
<p>Avec les nouvelles technologies lié a la génétique ont comprend de mieux en mieux évolution de l&rsquo;espèce humaine. Les récent progrès nous permettent surtout de pouvoir constater scientifiquement les évolutions des derniers millénaires (exemple avec les Sherpas qui ont évolué pour supporter le manque d&rsquo;oxygène).</p>
<p>Jusqu&rsquo;à ce jour on a pas constaté d&rsquo;évolution autrement du qu&rsquo;a la sélection naturelle. C&rsquo;est a dire que l&rsquo;évolution serait uniquement du aux variations génétiques aléatoire des organismes qui se retrouve plus souvent dans les sujet arrivant le mieux jusqu&rsquo;à la procréation.</p>
<p>On peut sérieusement se poser cette question a propos de l&rsquo;évolution de l&rsquo;espèce humaine: Jusqu&rsquo;au 20ème siècle, la sélection naturelle était bien présente: Grande vague de maladie, beaucoup de mortalité infantile etc. Pour exemple, en Angleterre a l&rsquo;époque de la naissance de Darwin un enfant sur deux arrivait jusqu&rsquo;à l&rsquo;age de 21 ans. De nos jours (toujours en Angleterre comme référence), 99% atteigne ces 21 ans. On peux donc supposer que plus nous repousseront la mort des humains après l&rsquo;age de procréer plus la sélection naturelle et donc l&rsquo;évolution va diminuer.</p>
<p>Cependant deux choses vienne contrer cette conclusion: Premièrement tout le monde ne fait pas forcément des enfants, il y a une sélection naturelle du aux comportements sociaux. Cependant cet argument n&rsquo;est rien face a la simple logique qui veut que tôt ou tard notre espèce devra subir de nouvelles épidémies (d&rsquo;autant que tous les continents sont désormais reliés par des transports très rapides et que les virus ne se gênes pas pour surfer sur la vague des pratiques industrielle de l&rsquo;élevage pour muter). Épidémies qui relanceront drastiquement la sélection naturelle.</p>
<p>Dernier point du reportage et non du moindre: L&rsquo;eugénisme. Nous somme déjà capable à ce jours d&rsquo;observer le code génétique des embryons et donc de connaître certaines caractéristique a l&rsquo;avance: sexe, prédisposition a des maladies, couleur de cheveux etc&#8230; On peux donc et cela ce fait déjà aux États-Unis choisir parmi les embryons. Il est donc probable que dans le futur nous soyons de plus en plus capable de pouvoir sélectionner selon un grand nombres de critères les progénitures qui naîtrons. Ce qui ferait de notre espèce la seule ayant un contrôle sur son avenir génétique, contrairement aux autres devant subir les lois de la sélection naturelle.</p>
<p>Pour conclure, un petit rappel: ~99,5% des espèces ont déjà disparu de la terre, ne vous faites pas d’inquiétude la dessus nous disparaîtrons nous aussi tôt ou tard.</p>
<p>Je vous conseil de regarder ce documentaire très bien réalisé et certainement mieux que mon petit résumé !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bux.fr/lespece-humaine-evolue-t-elle-encore/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Configurer un domaine sur un serveur (bind9, apache2)</title>
		<link>http://blog.bux.fr/configurer-un-domaine-sur-un-serveur-bind9-apache2/</link>
		<comments>http://blog.bux.fr/configurer-un-domaine-sur-un-serveur-bind9-apache2/#comments</comments>
		<pubDate>Mon, 24 Sep 2012 14:58:15 +0000</pubDate>
		<dc:creator>bux</dc:creator>
				<category><![CDATA[Articles professionnels]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[bind9]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[tutoriel]]></category>

		<guid isPermaLink="false">http://blog.bux.fr/?p=295</guid>
		<description><![CDATA[Je viens de rédiger un tutoriel sur la procédure a suivre afin de configurer un domaine sur son serveur DNS afin de le faire pointer sur un serveur web. Disponible en Français uniquement, vous pouvez toute fois proposer un traduction &#8230; <a href="http://blog.bux.fr/configurer-un-domaine-sur-un-serveur-bind9-apache2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Je viens de rédiger un tutoriel sur la procédure a suivre afin de configurer un domaine sur son serveur DNS afin de le faire pointer sur un serveur web. Disponible en Français uniquement, vous pouvez toute fois proposer un traduction si vous le souhaitez.</p>
<p style="text-align: center;"><a title="Configurer un domaine sur un serveur (bind9, apache2)" href="http://work.bux.fr/projects/pubdoc/wiki/Admin_sys_configure_domain_on_server">Lire le tutoriel</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bux.fr/configurer-un-domaine-sur-un-serveur-bind9-apache2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Could not open command file &#8216;/usr/local/nagios/var/rw/nagios.cmd&#8217; for update!</title>
		<link>http://blog.bux.fr/could-not-open-command-file-usrlocalnagiosvarrwnagios-cmd-for-update/</link>
		<comments>http://blog.bux.fr/could-not-open-command-file-usrlocalnagiosvarrwnagios-cmd-for-update/#comments</comments>
		<pubDate>Tue, 11 Sep 2012 12:46:39 +0000</pubDate>
		<dc:creator>bux</dc:creator>
				<category><![CDATA[Articles professionnels]]></category>
		<category><![CDATA[nagios]]></category>

		<guid isPermaLink="false">http://blog.bux.fr/?p=289</guid>
		<description><![CDATA[Si vous utilisez nagios et que vous êtes confrontés a cette erreur lorsque vous souhaitez effectuer une opération a partir de l&#8217;interface web de nagios, cela est du aux droits du fichier. Si on regarde d&#8217;un peu plus près: /usr/local/nagios/var/rw# &#8230; <a href="http://blog.bux.fr/could-not-open-command-file-usrlocalnagiosvarrwnagios-cmd-for-update/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Si vous utilisez nagios et que vous êtes confrontés a cette erreur lorsque vous souhaitez effectuer une opération a partir de l&rsquo;interface web de nagios, cela est du aux droits du fichier. Si on regarde d&rsquo;un peu plus près:</p>
<pre>/usr/local/nagios/var/rw# ls -l
total 0
prw-rw---- 1 nagios nagios 0 11 sept. 14:32 nagios.cmd</pre>
<p>On constate que le fichier ne peut être manipulé que pas l&rsquo;utilisateur nagios. Or lorsque l&rsquo;on utilise l&rsquo;interface web, c&rsquo;est l&rsquo;utilisateur www-data qui est utilisé. Il faut donc mettre a jours les droits sur le fichier. Le problème c&rsquo;est que ce fichier est recréé a chaque démarrage de nagios. On modifie donc le fichier <strong>/etc/init.d/nagios</strong> de façon a changer les droits sur le fichier lors de sa création:</p>
<pre>
[...]

case "$1" in

        start)
                echo -n "Starting nagios:"
                $NagiosBin -v $NagiosCfgFile > /dev/null 2>&#038;1;
                if [ $? -eq 0 ]; then
                        su - $NagiosUser -c "touch $NagiosVarDir/nagios.log $NagiosRetentionFile"
                        rm -f $NagiosCommandFile
                        touch $NagiosRunFile
                        chown $NagiosUser:$NagiosGroup $NagiosRunFile
                        $NagiosBin -d $NagiosCfgFile
                        if [ -d $NagiosLockDir ]; then touch $NagiosLockDir/$NagiosLockFile; fi

                        # added by bux
                        chmod 770 $NagiosCommandFile
                        chown nagios:www-data $NagiosCommandFile
                        # end added by bux

                        echo " done."
                        exit 0
                else
                        echo "CONFIG ERROR!  Start aborted.  Check your Nagios configuration."
                        exit 1
                fi
                ;;


[...]
</pre>
<p>Et voilà !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bux.fr/could-not-open-command-file-usrlocalnagiosvarrwnagios-cmd-for-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mozilla arrête le développement de Thunderbird</title>
		<link>http://blog.bux.fr/mozilla-arrete-le-developpement-de-thunderbird/</link>
		<comments>http://blog.bux.fr/mozilla-arrete-le-developpement-de-thunderbird/#comments</comments>
		<pubDate>Wed, 22 Aug 2012 09:34:19 +0000</pubDate>
		<dc:creator>bux</dc:creator>
				<category><![CDATA[Articles personnels]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[information]]></category>
		<category><![CDATA[réfléxion]]></category>
		<category><![CDATA[thunderbird]]></category>

		<guid isPermaLink="false">http://blog.bux.fr/?p=268</guid>
		<description><![CDATA[Voilà un exemple typique d&#8217;une information biaisé qui se répand comme une traîné de poudre: Mozilla arrête le développement de Thunderbird ! Je suis en train de lire les flux RSS que j&#8217;ai mis de coté pendant ces vacances et &#8230; <a href="http://blog.bux.fr/mozilla-arrete-le-developpement-de-thunderbird/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Voilà un exemple typique d&rsquo;une information biaisé qui se répand comme une traîné de poudre: <strong>Mozilla arrête le développement de Thunderbird</strong> ! Je suis en train de lire les flux RSS que j&rsquo;ai mis de coté pendant ces vacances et je tombe sur cette annonce a la limite du choquant, que l&rsquo;on retrouve a tout les recoins de la toile. Un drame se produit dans le monde du logiciel libre &#8230;</p>
<p>Ceci dit, en avançant dans mes flux je constate ce qui se passe très souvent (mais dont on ne peut pas toujours se rendre compte): Une information biaisé et relativement transformé au fur et a mesure de sa propagation. D&rsquo;après les lectures qui suivent l&rsquo;information viendrais d&rsquo;un <a href="http://techcrunch.com/2012/07/06/so-thats-it-for-thunderbird/" target="_blank">email privée</a> (qui ne le fut d&rsquo;ailleurs plus) a propos d&rsquo;un changement dans le modèle de développement de Thunderbird par Mozilla a propos de l&rsquo;arrêt du développement de nouvelles fonctionnalités au sein du logiciel et non d&rsquo;un arrêt total. Un <a href="https://blog.mozilla.org/thunderbird/2012/07/adjusting-the-way-thunderbird-is-managed/" target="_blank">article officiel</a> confirmera d&rsquo;ailleurs tout cela en expliquant que le logiciel est suffisamment fournis en fonctionnalités et qu&rsquo;ils préfèrent se focaliser sur la sécurité et la stabilité. Ce qui après tout n&rsquo;est pas idiot puisque la fonction première d&rsquo;un client de messagerie est de lire et envoyer ses mails.</p>
<p>Donc encore une fois il ne faut jamais s’arrêter a la première information qui nous tombe sous le nez (pourtant on le fait tous de temps en temps hein) car autant sur internet, dans nos discussions, dans les journaux, a la télé (et oui, la télé aussi héhé) c&rsquo;est le même principe: on vous relais souvent de l’information sans vous servir avec le travail de recherche et d&rsquo;enquête qu&rsquo;il, si il y a surtout, eu lieu. Mais vous ne saurez pas non plus si une information semblant plus sure n&rsquo;est pas issue d&rsquo;un travail trop subjectif, ou carrément dans un but de vous convaincre sans tout fois être réellement honnête. En somme nous ne pouvons être sur de rien, tant nous somme limité  par nos moyens de compréhension, d&rsquo;accès aux informations et j&rsquo;en passe (d&rsquo;ailleurs qui est réellement sur de ses propres points de vues). Bon, après m&rsquo;être autant emporté sur le sujet avec Thunderbird comme excuse n&rsquo;oubliez pas le sujet principal de cet article: la fiabilité d&rsquo;une information viens de plusieurs critères dont il vaut mieux s&rsquo;assurer avant de la considérer comme un fait.</p>
<p><em style="font-size: 90%">D&rsquo;ailleurs vous ne devriez pas trop faire confiance a ce que je vous raconte et vous faire votre propre point de vue ^^</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bux.fr/mozilla-arrete-le-developpement-de-thunderbird/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Configurer thunderbird pour google app (email)</title>
		<link>http://blog.bux.fr/configurer-thunderbird-pour-google-app-email/</link>
		<comments>http://blog.bux.fr/configurer-thunderbird-pour-google-app-email/#comments</comments>
		<pubDate>Sat, 18 Aug 2012 17:51:16 +0000</pubDate>
		<dc:creator>bux</dc:creator>
				<category><![CDATA[Articles professionnels]]></category>
		<category><![CDATA[thunderbirdn google app]]></category>

		<guid isPermaLink="false">http://blog.bux.fr/?p=265</guid>
		<description><![CDATA[Je teste actuellement le service de google app permettant d&#8217;utiliser les serveurs mail de google  comme serveur mx et il y a une petite configuration a connaître lorsque l&#8217;on souhaite utiliser thunderbird pour cette boite mail. Lors de l&#8217;ajout d&#8217;un &#8230; <a href="http://blog.bux.fr/configurer-thunderbird-pour-google-app-email/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Je teste actuellement le service de google app permettant d&rsquo;utiliser les serveurs mail de google  comme serveur mx et il y a une petite configuration a connaître lorsque l&rsquo;on souhaite utiliser thunderbird pour cette boite mail. Lors de l&rsquo;ajout d&rsquo;un compte de courrier vous devez saisir votre login sans le @domaine.tdl dans cette partie, sinon thunderbird ne pourra pas se connecter:</p>
<p><a href="http://blog.bux.fr/wp-content/uploads/2012/08/ggapp_confthunderbird.png"><img class="aligncenter size-medium wp-image-266" title="ggapp_confthunderbird" src="http://blog.bux.fr/wp-content/uploads/2012/08/ggapp_confthunderbird-300x138.png" alt="" width="300" height="138" /></a>Info qui peut toujours servir !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bux.fr/configurer-thunderbird-pour-google-app-email/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pourquoi je ne suis sur aucun réseau social ?</title>
		<link>http://blog.bux.fr/pourquoi-je-ne-suis-sur-aucun-reseau-social/</link>
		<comments>http://blog.bux.fr/pourquoi-je-ne-suis-sur-aucun-reseau-social/#comments</comments>
		<pubDate>Sat, 18 Aug 2012 06:34:31 +0000</pubDate>
		<dc:creator>bux</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.bux.fr/?p=263</guid>
		<description><![CDATA[Dalz publie un article dans lequel j&#8217;ai un peu participé, je vous invite a le lire si la question des réseaux sociaux vous intéressent: pourquoi je ne suis sur aucun réseau social ?]]></description>
				<content:encoded><![CDATA[<p>Dalz publie un article dans lequel j&rsquo;ai un peu participé, je vous invite a le lire si la question des réseaux sociaux vous intéressent: <a href="http://pdalzotto.fr/2012/08/pourquoi-je-ne-suis-sur-aucun-reseau-social/">pourquoi je ne suis sur aucun réseau social ?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bux.fr/pourquoi-je-ne-suis-sur-aucun-reseau-social/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Documentation publique</title>
		<link>http://blog.bux.fr/documentation-publique/</link>
		<comments>http://blog.bux.fr/documentation-publique/#comments</comments>
		<pubDate>Thu, 28 Jun 2012 11:05:58 +0000</pubDate>
		<dc:creator>bux</dc:creator>
				<category><![CDATA[Articles personnels]]></category>
		<category><![CDATA[doc]]></category>
		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://blog.bux.fr/?p=254</guid>
		<description><![CDATA[Je viens d&#8217;ouvrir l&#8217;accès à ma documentation personnelle afin qu&#8217;elle puisse profiter. Elle est essentiellement composé de liens externes, de penses bêtes techniques et de notes. Vous pouvez y apporter contribution ou utiliser le wiki pour vos propres notes si &#8230; <a href="http://blog.bux.fr/documentation-publique/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Je viens d&rsquo;ouvrir l&rsquo;accès à <a href="http://work.bux.fr/projects/pubdoc/wiki/Doc">ma documentation personnelle</a> afin qu&rsquo;elle puisse profiter. Elle est essentiellement composé de liens externes, de penses bêtes techniques et de notes. Vous pouvez y apporter contribution ou utiliser le wiki pour vos propres notes si vous le désirez, il vous suffit de vous <a href="http://work.bux.fr/account/register">inscrire</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bux.fr/documentation-publique/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TEDx Conférences</title>
		<link>http://blog.bux.fr/tedx-conferences/</link>
		<comments>http://blog.bux.fr/tedx-conferences/#comments</comments>
		<pubDate>Mon, 25 Jun 2012 08:01:27 +0000</pubDate>
		<dc:creator>bux</dc:creator>
				<category><![CDATA[Articles personnels]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[tedx]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.bux.fr/?p=243</guid>
		<description><![CDATA[TED est une rencontre annuelle qui met a disposition publiquement sur son site internet des conférences traitant d&#8217;un large éventail de sujets. TEDx ce sont les branches indépendantes a travers le monde. Il y a aujourd&#8217;hui un grande quantités de &#8230; <a href="http://blog.bux.fr/tedx-conferences/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>TED est une rencontre annuelle qui met a disposition publiquement sur son site internet des conférences traitant d&rsquo;un large éventail de sujets. TEDx ce sont les branches indépendantes a travers le monde. Il y a aujourd&rsquo;hui un grande quantités de conférences disponibles et parmi elles quelques unes qui vous plairons très sûrement.</p>
<p>En voici un petite sélection rapide parmi celles que j&rsquo;ai visionné récemment:</p>
<ul>
<li><a href="http://www.ted.com/talks/lang/fr/drew_curtis_how_i_beat_a_patent_troll.html" target="_blank">Drew Curtis: Comment j&rsquo;ai battu un chasseur de brevets</a></li>
<li><a href="http://www.ted.com/talks/lang/fr/frans_de_waal_do_animals_have_morals.html" target="_blank">Frans de Waal : Le comportement moral des animaux</a></li>
<li><a href="http://www.ted.com/talks/lang/fr/frank_warren_half_a_million_secrets.html" target="_blank">Frank Warren : Un demi-million de secrets</a></li>
<li><a href="http://www.ted.com/talks/lang/fr/donald_sadoway_the_missing_link_to_renewable_energy.html" target="_blank">Donald Sadoway : le chaînon manquant de l&rsquo;énergie renouvelable</a></li>
</ul>
<p>Vous pouvez retrouver les conférences traduites en français à <a href="http://www.ted.com/translate/languages/fr" target="_blank">cette adresse</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bux.fr/tedx-conferences/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Isoler les tests fonctionnels et unitaires dans symfony2</title>
		<link>http://blog.bux.fr/isoler-les-tests-fonctionels-et-unitaires-dans-symfony2/</link>
		<comments>http://blog.bux.fr/isoler-les-tests-fonctionels-et-unitaires-dans-symfony2/#comments</comments>
		<pubDate>Tue, 12 Jun 2012 10:01:35 +0000</pubDate>
		<dc:creator>bux</dc:creator>
				<category><![CDATA[Articles professionnels]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://blog.bux.fr/?p=214</guid>
		<description><![CDATA[Edit: Voir le commentaire de Bidule pour une solution plus simple Il est très pratique d&#8217;isoler ses tests du reste de l&#8217;application. Il est donc nécessaire de faire en sorte que la base de donnée utilisé lors des tests soit &#8230; <a href="http://blog.bux.fr/isoler-les-tests-fonctionels-et-unitaires-dans-symfony2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><strong>Edit</strong>: Voir le commentaire de Bidule pour une solution plus simple </p>
<p>Il est très pratique d&rsquo;isoler ses tests du reste de l&rsquo;application. Il est donc nécessaire de faire en sorte que la base de donnée utilisé lors des tests soit indépendante de la base utilisé lors du développement.  Cela évite de fausser ses tests si des données ont été modifier pendant le développement ainsi que d&rsquo;utiliser une base fidèle aux fixtures entre chaque tests.</p>
<p>Cet article est issue de la combinaison des deux articles suivants:</p>
<ul>
<li><a href="http://haulynjason.net/weblog/2012/01/fully-isolated-tests-in-symfony2/">http://haulynjason.net/weblog/2012/01/fully-isolated-tests-in-symfony2/</a></li>
<li><a href="http://haulynjason.net/weblog/2012/01/fully-isolated-tests-in-symfony2/">http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests</a></li>
</ul>
<p>Dans mon cas, l&rsquo;article de haulynjason.net seul ne me permettait pas d’exécuter mes tests fonctionnels sur la même base que les tests unitaires. J&rsquo;ai du utiliser l&rsquo;astuce de l&rsquo;article d&rsquo;alexamdre-salome.fr.</p>
<p>Premièrement nous configurons de quoi éxécuter les tests dans une base sqlite, de façon a ce qu&rsquo;elle soit isolé de la base de développement.</p>
<p><strong>config_test.yml</strong>:</p>
<div class="codecolorer-container yaml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="yaml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007F45;">doctrine</span>:<span style="color: #007F45;"><br />
dbal</span>:<span style="color: green;"><br />
driver</span><span style="font-weight: bold; color: brown;">: </span>pdo_sqlite<span style="color: green;"><br />
path</span><span style="font-weight: bold; color: brown;">: </span><span style="color: #CF00CF;">&quot;:memory:&quot;</span><span style="color: green;"><br />
memory</span><span style="font-weight: bold; color: brown;">: </span>true<span style="color: #007F45;"><br />
orm</span>:<span style="color: green;"><br />
auto_generate_proxy_classes</span><span style="font-weight: bold; color: brown;">: </span>true<span style="color: green;"><br />
auto_mapping</span><span style="font-weight: bold; color: brown;">: </span>true</div></div>
<p>Nous créons la classe ModelTestCase a partir de laquelle seront étendus nos classes de tests (<a title="ModelTestCase on git" href="https://gist.github.com/2911431">git</a>):</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">&lt;!--</span>?php <span style="color: #666666; font-style: italic;">/* &nbsp;* Adapt to your AppKernel.php path &nbsp;*/</span> <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span>__DIR__ <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;../../../../../../app/AppKernel.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009933; font-style: italic;">/** &nbsp;* @see http://haulynjason.net/weblog/2012/01/fully-isolated-tests-in-symfony2/ &nbsp;*/</span> <span style="color: #000000; font-weight: bold;">class</span> ModelTestCase <span style="color: #000000; font-weight: bold;">extends</span> \PHPUnit_Framework_TestCase <span style="color: #009900;">&#123;</span> &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_kernel</span><span style="color: #339933;">;</span> &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_application</span><span style="color: #339933;">;</span> &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_container</span><span style="color: #339933;">;</span> &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> &nbsp; <span style="color: #009900;">&#123;</span> &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">---&gt;</span>_kernel <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> \AppKernel<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;test&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>_kernel<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>boot<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>_container <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>_kernel<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>getContainer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$service</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>_container<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$service</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>_application <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> \Symfony\Bundle\FrameworkBundle\Console\Application<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>_kernel<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>_application<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>setAutoExit<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>runConsole<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;doctrine:schema:drop&quot;</span><span style="color: #339933;">,</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;--force&quot;</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>runConsole<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;doctrine:schema:create&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>runConsole<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;cache:warmup&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>runConsole<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;doctrine:fixtures:load&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> runConsole<span style="color: #009900;">&#40;</span><span style="color: #000088;">$command</span><span style="color: #339933;">,</span> <a href="http://www.php.net/array"><span style="color: #990000;">Array</span></a> <span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;-e&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;test&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;-q&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array_merge"><span style="color: #990000;">array_merge</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #339933;">,</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'command'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$command</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>_application<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>run<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> \Symfony\Component\Console\Input\ArrayInput<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>A partir d&rsquo;ici vos classes de tests unitaires étendus de cette classes utiliserons la base sqlite pour exécuter ses tests. Passons maintenant aux tests fonctionnels: définissons le paramètre <strong>test.client.class</strong> afin d&rsquo;écrire notre propre classe Client:</p>
<p><strong>config.yml</strong>:</p>
<div class="codecolorer-container yaml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="yaml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007F45;">parameters</span>:<span style="color: green;"><br />
test.client.class</span><span style="font-weight: bold; color: brown;">: </span>MyApp\CoreBundle\lib\Test\Client</div></div>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">&lt;!--</span>?php <span style="color: #000000; font-weight: bold;">namespace</span> MyApp\CoreBundle\lib\Test<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">use</span> Symfony\Bundle\FrameworkBundle\Client <span style="color: #b1b100;">as</span> BaseClient<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">class</span> Client <span style="color: #000000; font-weight: bold;">extends</span> BaseClient <span style="color: #009900;">&#123;</span> &nbsp; static <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$connection</span><span style="color: #339933;">;</span> &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$requested</span><span style="color: #339933;">;</span> &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> doRequest<span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span> &nbsp; <span style="color: #009900;">&#123;</span> &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">---&gt;</span><span style="color: #004000;">requested</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>kernel<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>shutdown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>kernel<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>boot<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>injectConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>requested <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>kernel<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>handle<span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> injectConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span> <span style="color: #339933;">===</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$connection</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$connection</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>getContainer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'doctrine.dbal.default_connection'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>requested<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$connection</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>rollback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>getContainer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>set<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'doctrine.dbal.default_connection'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$connection</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>requested<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$connection</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>beginTransaction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Nous écrivons la classe <strong>WebTestCase</strong> a partir de laquelle nous étendrons nos classe de test fonctionnels:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">&lt;!--</span>?php <span style="color: #000000; font-weight: bold;">namespace</span> MyApp\CoreBundle\lib\Test<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">use</span> MyApp\CoreBundle\lib\Test\ModelTestCase<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">class</span> WebTestCase <span style="color: #000000; font-weight: bold;">extends</span> ModelTestCase <span style="color: #009900;">&#123;</span> &nbsp; &nbsp; &nbsp;<span style="color: #009933; font-style: italic;">/** &nbsp; &nbsp;* &nbsp; &nbsp;* @param array $server &nbsp; &nbsp;* @return Symfony\Bundle\FrameworkBundle\Client &nbsp; &nbsp; */</span> &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> createClient<span style="color: #009900;">&#40;</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a> <span style="color: #000088;">$server</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> &nbsp; <span style="color: #009900;">&#123;</span> &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$client</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">---&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test.client'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$client</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>setServerParameters<span style="color: #009900;">&#40;</span><span style="color: #000088;">$server</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$client</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Et voilà, nos tests fonctionnels seront étendu de <strong>WebTestCase</strong>, nos tests unitaires seront eux étendus de <strong>ModelTestCase</strong> et ils seront totalement isolé de la base de dév puisque ils travailleront avec une base indépendante. Les performances de vos tests seront affectés puisque avec cette méthode chaque test (fichier, pas fonction) effectue une rechargement de la base.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bux.fr/isoler-les-tests-fonctionels-et-unitaires-dans-symfony2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
