<?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>Synoptic &#187; Non classé</title>
	<atom:link href="https://blog.developpez.com/walikworkshop/pcategory/non-classe/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/walikworkshop</link>
	<description></description>
	<lastBuildDate>Fri, 12 Dec 2014 17:16:00 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Collection d&#8217;algorithmes</title>
		<link>https://blog.developpez.com/walikworkshop/p12805/non-classe/collection-dalgorithmes</link>
		<comments>https://blog.developpez.com/walikworkshop/p12805/non-classe/collection-dalgorithmes#comments</comments>
		<pubDate>Fri, 12 Dec 2014 17:16:00 +0000</pubDate>
		<dc:creator><![CDATA[Walik]]></dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[algorithme]]></category>
		<category><![CDATA[algorithmique]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/walikworkshop/?p=62</guid>
		<description><![CDATA[Collectionner les timbres c&#8217;est mal, collectionner les algorithmes c&#8217;est bien : Trie à bulle procédure tri_bulle(tableau T, entier n) &#160; &#160; &#160; &#160; répéter &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; échange_effectué = faux &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; pour j de 0 à n - 2 &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; si T[j] &#38;gt; T[j + 1], alors &#160; &#160; &#160; &#160; &#160; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Collectionner les  timbres c&rsquo;est mal, collectionner les algorithmes c&rsquo;est bien :</p>
<p><strong>Trie à bulle</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">procédure tri_bulle(tableau T, entier n)<br />
&nbsp; &nbsp; &nbsp; &nbsp; répéter<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; échange_effectué = faux<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pour j de 0 à n - 2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; si T[j] &amp;gt; T[j + 1], alors<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; échanger T[j] et T[j + 1]<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; échange_effectué = vrai<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fin si<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fin pour<br />
&nbsp; &nbsp; &nbsp; &nbsp; tant que échange_effectué = vrai<br />
fin procédure</div></div>
<p><strong>Trie fusion</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fonction trier(p, n)<br />
&nbsp; &nbsp; Q:= n/2 (division entière)<br />
&nbsp; &nbsp; P:= n-Q<br />
&nbsp; &nbsp; si P &amp;gt;= 2<br />
&nbsp; &nbsp; &nbsp; &nbsp; q:= trier(p, P)<br />
&nbsp; &nbsp; &nbsp; &nbsp; si Q &amp;gt;= 2 trier(q, Q)<br />
&nbsp; &nbsp; sinon<br />
&nbsp; &nbsp; &nbsp; &nbsp; q:= p.suivant<br />
&nbsp; &nbsp; fin<br />
&nbsp; &nbsp; q:= fusionner(p, P, q, Q)<br />
&nbsp; &nbsp; renvoyer q<br />
fin<br />
<br />
fonction fusionner(p, P, q, Q)<br />
&nbsp; &nbsp; répéter indéfiniment<br />
&nbsp; &nbsp; &nbsp; &nbsp; si valeur(p.suivant) &amp;gt; valeur(q.suivant) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; déplacer le maillon q.suivant après le maillon p<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; si Q = 1 quitter la boucle<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Q:= Q-1<br />
&nbsp; &nbsp; &nbsp; &nbsp; sinon<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; si P = 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tant que Q &amp;gt;= 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; q:= q.suivant<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Q:= Q-1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fin<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; quitter la boucle<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fin<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; P:= P-1<br />
&nbsp; &nbsp; &nbsp; &nbsp; fin<br />
&nbsp; &nbsp; &nbsp; &nbsp; p:= p.suivant<br />
&nbsp; &nbsp; fin<br />
&nbsp; &nbsp; renvoyer q<br />
fin</div></div>
<p><strong>Trie rapide</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">partitionner(tableau T, premier, dernier, pivot)<br />
&nbsp; &nbsp; échanger T[pivot] et T[dernier]<br />
&nbsp; &nbsp; j := premier<br />
&nbsp; &nbsp; pour i de premier à dernier - 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; si T[i] &amp;lt;= T[dernier] alors<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; échanger T[i] et T[j]<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j := j + 1<br />
&nbsp; &nbsp; échanger T[dernier] et T[j]<br />
&nbsp; &nbsp; renvoyer j<br />
<br />
&nbsp;tri_rapide(tableau t, entier premier, entier dernier)<br />
&nbsp; &nbsp;début<br />
&nbsp; &nbsp; &nbsp;si premier &amp;lt; dernier alors<br />
&nbsp; &nbsp; &nbsp; &nbsp;pivot := choix_pivot(t,premier,dernier)<br />
&nbsp; &nbsp; &nbsp; &nbsp;pivot := partitionner(t,premier, dernier,pivot)<br />
&nbsp; &nbsp; &nbsp; &nbsp;tri_rapide(t,premier,pivot-1)<br />
&nbsp; &nbsp; &nbsp; &nbsp;tri_rapide(t,pivot+1,dernier)<br />
&nbsp; &nbsp; &nbsp;fin si<br />
&nbsp; &nbsp;fin</div></div>
<p><strong>Trie par tas</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fonction tamiser(arbre,nœud,n):<br />
{descend arbre[nœud] à sa place, sans dépasser l'indice n}<br />
&nbsp; k:=nœud<br />
&nbsp; j:=2k<br />
&nbsp; tant que j&amp;lt;=n<br />
&nbsp; &nbsp; si j&amp;lt;n et arbre[j]&amp;lt;arbre[j+1]<br />
&nbsp; &nbsp; &nbsp; j:=j+1<br />
&nbsp; &nbsp; fin si<br />
&nbsp; &nbsp; si arbre[k]&amp;lt;arbre[j]<br />
&nbsp; &nbsp; &nbsp; échanger arbre[k] et arbre[j]<br />
&nbsp; &nbsp; &nbsp; k:=j<br />
&nbsp; &nbsp; &nbsp; j:=2k<br />
&nbsp; &nbsp; sinon<br />
&nbsp; &nbsp; &nbsp; terminer<br />
&nbsp; &nbsp; fin si<br />
&nbsp; fin tant que<br />
fin fonction<br />
<br />
fonction tri_par_tas(arbre,longueur):<br />
&nbsp; pour i:=longueur/2 a 1<br />
&nbsp; &nbsp; tamiser(arbre,i,longueur)<br />
&nbsp; fin pour<br />
&nbsp; pour i:=longueur a 2<br />
&nbsp; &nbsp; échanger arbre[i] et arbre[1]<br />
&nbsp; &nbsp; tamiser(arbre,1,i-1)<br />
&nbsp; fin pour<br />
fin fonction</div></div>
<p><strong>Recherche séquentielle</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fonction recherche_seq(tableau T, entier n, r)<br />
&nbsp; &nbsp;d = faux<br />
&nbsp; &nbsp;pour i:=0 a n<br />
&nbsp; &nbsp; &nbsp; &nbsp;Si T[i] = r <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d = vrai<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;quitter la boucle<br />
&nbsp; &nbsp; &nbsp; &nbsp;fin si<br />
&nbsp; &nbsp;fin pour<br />
&nbsp; &nbsp;si d = vrai<br />
&nbsp; &nbsp; &nbsp; &nbsp;retourner i<br />
&nbsp; &nbsp;sinon <br />
&nbsp; &nbsp; &nbsp; &nbsp;retourner -1<br />
&nbsp; &nbsp;fin si<br />
fin fonction</div></div>
<p><strong>Recherche dichotomique</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fonction recherche_dic(tableau T, entier n, r)<br />
&nbsp; &nbsp;plage := n<br />
&nbsp; &nbsp;indice := 0<br />
&nbsp; &nbsp;t := -1<br />
&nbsp; &nbsp;tant que plage &amp;gt; 0<br />
&nbsp; &nbsp; &nbsp; si T[indice] = r<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t := indice<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;quitter boucle<br />
&nbsp; &nbsp; &nbsp; fin si<br />
&nbsp; &nbsp; &nbsp; si indice = 0 et T[indice] &amp;gt; r<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; quitter boucle<br />
&nbsp; &nbsp; &nbsp; fin si<br />
&nbsp; &nbsp; &nbsp; plage /= 2<br />
&nbsp; &nbsp; &nbsp; si T[indice] &amp;gt; r<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; indice +:= plage<br />
&nbsp; &nbsp; &nbsp; sinon<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; indice -:= plage<br />
&nbsp; &nbsp; &nbsp; fin si<br />
&nbsp; &nbsp;retourner t<br />
fin fonction</div></div>
<p><strong>Pagination</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fonction pagination(tableau T, entier numero_page, entier lignes_par_page)<br />
&nbsp; &nbsp; &nbsp;taille_tableau := taille(taille_tableau)<br />
&nbsp; &nbsp; &nbsp;nb_page := taille_tableau % lignes_par_page<br />
&nbsp; &nbsp; &nbsp;si numero_page &amp;gt; a nb_page<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;retourner erreur<br />
&nbsp; &nbsp; &nbsp;fin si<br />
&nbsp; &nbsp; &nbsp;si numero_page := nb_page<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;reste_lignes = taille_tableau - nb_page * ligne_par_page<br />
&nbsp; &nbsp; &nbsp;sinon <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;reste_lignes := lignes_par_page<br />
&nbsp; &nbsp; &nbsp;fin si<br />
&nbsp; &nbsp; &nbsp;debut := numero_page * lignes_par_page<br />
&nbsp; &nbsp; &nbsp;fin := debut + reste_lignes<br />
&nbsp; &nbsp; &nbsp;retourner sous_tableau(tableau, debut, fin)<br />
&nbsp; &nbsp; fin fonction</div></div>
<p><strong>Affichage d&rsquo;arborescense</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fonction affiche_arbo(entier id)<br />
entier id_fils = base_de_donnee(id)<br />
chaine nom = base_de_donnee(id)<br />
ecrire(nom)<br />
si id_fils != NULL<br />
affiche_arbo(id)<br />
fin si<br />
fin fonction</div></div>
<p><strong>Préférence</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fonction Lecture(chanson)<br />
&nbsp; &nbsp; playList[chanson] += 1<br />
fin fonction<br />
fonction preference()<br />
&nbsp; &nbsp; &nbsp;retourner tri_fusion(playList)<br />
fin fonction</div></div>
<p><strong>Analyse de performance matérielle</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">constante temps_reference = a<br />
constante repetition = b<br />
t1 = timestamp<br />
pour i:=0 a repetition<br />
&nbsp; &nbsp; tache()<br />
fin pour<br />
t2 = timestamp<br />
t = t2-t1<br />
ratio = 1 / t / temps_reference * 100<br />
ecrire ratio</div></div>
<p><strong>Range détection une seule comparaison</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fonction inRange(min, max, s)<br />
&nbsp; &nbsp; retourner (s-(max+1)) * (s-(min-1)) &amp;lt; 0<br />
fin fonction</div></div>
<p><strong>Un puzzle</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fonction creer_puzzle(tableau p)<br />
&nbsp; &nbsp; pour i:= 0 a taille(p)<br />
&nbsp; &nbsp; &nbsp; &nbsp; p[i][position_initiale] = i<br />
&nbsp; &nbsp; &nbsp; &nbsp; p[i][position_actuelle] = i<br />
&nbsp; &nbsp; fin pour<br />
&nbsp; &nbsp; retourner p<br />
fonction melange_puzzle(tableau p)<br />
&nbsp; &nbsp; t = taille(p)<br />
&nbsp; &nbsp; pour i:= 0 a t<br />
&nbsp; &nbsp; &nbsp; &nbsp; t_hasard[i] = i<br />
&nbsp; &nbsp; fin pour<br />
&nbsp; &nbsp; tt = t<br />
&nbsp; &nbsp; pour i:=0 a t<br />
&nbsp; &nbsp; &nbsp; &nbsp; h = hasard(tt)<br />
&nbsp; &nbsp; &nbsp; &nbsp; val = t_hasard[h]<br />
&nbsp; &nbsp; &nbsp; &nbsp; extraire(t_hasard[h])<br />
&nbsp; &nbsp; &nbsp; &nbsp;tt = tt - 1<br />
&nbsp; &nbsp; &nbsp; &nbsp;p[i][position_actuelle] = val<br />
&nbsp; &nbsp; fin pour<br />
&nbsp; &nbsp; desordre = t<br />
&nbsp; &nbsp; retourner p, desordre<br />
fin fonction<br />
fonction bouger(tableau p, entier indice, position, desordre)<br />
&nbsp; &nbsp; p[indice][postion_actuelle] = position<br />
&nbsp; &nbsp; si position == p[indice][position_initiale] alors desordre = desordre -1<br />
&nbsp; &nbsp; retourner p, desordre</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UML L&#8217;essentiel</title>
		<link>https://blog.developpez.com/walikworkshop/p12575/non-classe/uml-lessentiel</link>
		<comments>https://blog.developpez.com/walikworkshop/p12575/non-classe/uml-lessentiel#comments</comments>
		<pubDate>Fri, 11 Apr 2014 14:28:57 +0000</pubDate>
		<dc:creator><![CDATA[Walik]]></dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/walikworkshop/?p=57</guid>
		<description><![CDATA[UML est le langage canonique de tous les langages de programmation, il vous fournis le moyen de schématiser votre système et par conséquent de l&#8217;optimiser. Un système informatique possède plusieurs dimensions, UML fourni des outils pour les appréhender. La programmation orientée objet La programmation orientée objet est une simplification de la réalité, si on veut programmer une course de chevaux, les classes qui serviront à définir les chevaux se limiteront à la vitesse et l&#8217;endurance [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>UML est le langage canonique de tous les langages de programmation, il vous fournis le moyen de schématiser votre système et par conséquent de l&rsquo;optimiser.</p>
<p>Un système informatique possède plusieurs dimensions, UML fourni des outils pour les appréhender.</p>
<p><strong>La programmation orientée objet</strong></p>
<p>La programmation orientée objet est une simplification de la réalité, si on veut programmer une course de chevaux, les classes qui serviront à définir les chevaux se limiteront à la vitesse et l&rsquo;endurance tandis que si on voulait programmer une simulation de chevaux de trait alors cette définition porterait sur l&rsquo;endurance et la force.</p>
<p>D&rsquo;abord il y a les classes abstraites et concrètes, les interfaces, les variables statiques de classe, la données membres et les méthodes</p>
<p>Avant d&rsquo;aborder l&rsquo;héritage il faut savoir qu&rsquo;il est souvent mal employé, il est fortement recommandé d&rsquo;utiliser la composition faible (ou agrégation) et la composition forte selon les circonstances, par exemple une classe &laquo;&nbsp;corps de cheval&nbsp;&raquo; aura une composition forte avec une classe tête de cheval mais aura une composition faible avec une classe &laquo;&nbsp;scelle de cheval&nbsp;&raquo;</p>
<p>L&rsquo;héritage peut subir des contraintes de type &laquo;&nbsp;complete/disjoint&nbsp;&raquo; &#8211; Par exemple une classe poulin male héritant d&rsquo;une classe étalon et jument &#8211;  ou &laquo;&nbsp;incomplete/overlap&nbsp;&raquo;  &#8211; dans el cas d&rsquo;une classe mulet héritant d&rsquo;une classe cheval et d&rsquo;une classe âne.</p>
<p>La surcharge permet de définir plusieurs fois une même méthodes afin de prendre en charge des paramètres différents à l&rsquo;opposé du polymorphisme qui pour une même méthode redéfinit son corps mais pas ses paramètres changeant ainsi son comportement, la méthode &laquo;&nbsp;caresser&nbsp;&raquo; de la classe de mère cheval aura une réaction différente selon que la classe fille est &laquo;&nbsp;cheval sauvage&nbsp;&raquo; ou &laquo;&nbsp;cheval domestique&nbsp;&raquo;</p>
<p><a href="http://fr.wikipedia.org/wiki/Diagramme_de_classes" title="Diagramme de classes">Diagramme de classes</a></p>
<p>Une classe est composée d&rsquo;un nom, d&rsquo;attributs et de méthodes</p>
<p>Les attributs et méthodes ont une visibilité:</p>
<p># = protégeé</p>
<p>+ = publique</p>
<p>&#8211; = privée</p>
<p>Il existe aussi des méthodes et attributs dit de classe, qui existent en dehors des instances de la classes (appelée aussi méthodes statiques)</p>
<p> <a href="http://fr.wikipedia.org/wiki/Diagramme_des_cas_d'utilisation" title="Diagramme de cas d’utilisation">Diagramme de cas d&rsquo;utilisation</a></p>
<p>Les diagramme de cas d&rsquo;utilisation ou use cases en anglais servent à schématiser la partie fonctionnelle de votre application, soit le point de vue du client</p>
<p>Les éléments du schéma sont: l&rsquo;acteur, le système, les parties du système, et les dépendances entre les différentes parties du système soit par inclusion soit par extension (facultative), et les actions/interactions type appelle/réponse,  numérotées 1, 1.2, 2.1, 2.2 &#8230;</p>
<p>Lorsque vous discutez avec la cellule de test ou le personnel du produit, c&rsquo;est ce niveau de lecture qui est en jeu</p>
<p>De tout ceci découlera un tableau qui présente le système, les conditions nécessaire au fonctionnement du système, les actions/interactions ainsi que leurs conditions de réalisation, ce qui finalement constitue la base d&rsquo;un cahier des charges.</p>
<p><a href="http://fr.wikipedia.org/wiki/Diagramme_de_communication" title="Diagrammes de communication">Diagrammes de communication</a></p>
<p>Combine à la fois diagramme de classes, de séquence et de cas d&rsquo;utilisation</p>
<p><a href="http://fr.wikipedia.org/wiki/Diagramme_de_temps" title="Diagramme de timing">Diagramme de timing</a></p>
<p>Il s&rsquo;agit d&rsquo;une représentation graphique à deux dimensions action/temps</p>
<p><a href="http://fr.wikipedia.org/wiki/Diagramme_de_s%C3%A9quence" title="Diagramme de séquence">Diagramme de séquence</a></p>
<p>C&rsquo;est un diagramme qui représente les communications ordonnées dans le temps entre les différents objets du logicielle</p>
<p>C&rsquo;est une sorte de diagramme de cas d&rsquo;utilisations mais a un niveau de lecture développeur.</p>
<p>Grâce à lui on peut aller à la découverte des objets du système et de leur interractions</p>
<p>On pourrait schématiser une page web basique en définissant:</p>
<p>Un objet javascript qui communique en ajax asynchrone (flèche simple) avec un script php<br />
Le script php qui communique en synchrone avec un objet base de données (flèche noire)</p>
<p><a href="https://fr.wikipedia.org/wiki/Diagramme_de_classes" title="Diagramme d’associations/Relations">Diagramme d&rsquo;associations/Relations</a></p>
<p>Les diagrammes de relations permettent de montrer de façon simple le type et le nombre de relation qu&rsquo;on un ou plusieurs objets du système entre eux</p>
<p>Ici on parle de relation *, 1.1, 1.N, ou N.N</p>
<p>Les contraintes y sont aussi consignées en langage ocl</p>
<p><a href="http://fr.wikipedia.org/wiki/Diagramme_de_structure_composite" title="Diagramme de structure composite">Diagramme de structure composite</a></p>
<p>Les diagrammes de structure composite permet de visualiser la collaboration entre objets du système</p>
<p>Les éléments de ce diagramme sont</p>
<p>les parties, par exemple dans le cas d&rsquo;une voiture ça peut être volant, arbre gauche, arbre droit, et roues<br />
Les ports, représentés par des carrés, ce sont les points d&rsquo;interconnexion des différents connecteurs du système, par exemple dans le cas d&rsquo;une voiture la transmission<br />
Les connecteurs: Relies les parties entre elles via les ports<br />
Les compositions faibles ou agrégations sont représentées par un carré hachuré, les composition fortes par des carrés pleins</p>
<p>Ce type de diagramme permet de créer des pattern, comme le composite pattern qui schématise la structure arborescente d&rsquo;un système de fichier</p>
<p><a href="http://fr.wikipedia.org/wiki/Diagramme_%C3%A9tats-transitions" title="Diagrammes d’état transition">Diagrammes d&rsquo;état transition</a></p>
<p>Ce type de diagramme schématise toutes les étapes fonctionnelles de l&rsquo;application, depuis son début à sa fin</p>
<p>On peut y inclure des diagrammes de séquences qui se prête bien à l&rsquo;exercice pour détailler certaines parties</p>
<p>Des notions de couloir permettent de séparer deux entités précédemment lié, par exemple   pour une course de cheval pendant un saut, on peut séparé le comportement du cavalier et du cheval</p>
<p><a href="http://fr.wikipedia.org/wiki/Diagramme_de_composants" title="Diagrammes de composants">Diagrammes de composants</a></p>
<p>Un composant est une applications qui regroupe plusieurs classes et qui est accessible par des connecteurs d&rsquo;entrées et qui accède à d&rsquo;autre composant par des connecteurs en sortie</p>
<p><a href="http://fr.wikipedia.org/wiki/Diagramme_des_paquetages" title="Diagrammes de packages">Diagrammes de packages</a></p>
<p>Les package sont des librairies, des collections de classes, on y accède de deux manières:</p>
<p>par importation: le contenu est rapatrié en local avant d&rsquo;être utilisé, typiquement quand vous faites un include dans vos programme<br />
par accès: le contenu est accessible à distance, quand vous faites du soap ou du  REST par exemple</p>
<p><a href="http://fr.wikipedia.org/wiki/Diagramme_de_d%C3%A9ploiement" title="Diagrammes de déploiement">Diagrammes de déploiement</a></p>
<p>Ultime étape dans la finalisation d&rsquo;un logiciel, ce type de diagrammes décrit la répartition physique de l&rsquo;application sur les différents serveurs</p>
<p>Ce diagramme est composé de noeuds pouvant inclure des composants reliés entre eux par des relations de dépendances</p>
<p><strong> Conclusion</strong></p>
<p>Les différentes dimensions proposées par UML aident à maîtriser une application durant tout son cycle de vie, l&rsquo;abstraction fournie permet quant à elle une aide à la décision sur le choix de la technologie à utiliser, enfin le schématisation permet de visualiser les faiblesses du logiciel pour y apporter les optimisation nécessaires,</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell outil de prototypage rapide</title>
		<link>https://blog.developpez.com/walikworkshop/p12327/non-classe/haskell-outil-de-prototypage-rapide</link>
		<comments>https://blog.developpez.com/walikworkshop/p12327/non-classe/haskell-outil-de-prototypage-rapide#comments</comments>
		<pubDate>Fri, 15 Nov 2013 13:06:10 +0000</pubDate>
		<dc:creator><![CDATA[Walik]]></dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/walikworkshop/?p=45</guid>
		<description><![CDATA[En fin d&#8217;année dernière, Assan, un développeur très sympathique nous proposait un petit défit qui a suscité un grand intérêt chez moi car j&#8217;ai toujours été fasciné par les problèmes simples en apparence mais recelant une complexité moins évidente à saisir immédiatement. L&#8217;enjeu était le suivant: faire une fonction qui test si une variable est située entre deux bornes limites(range) en ayant le droit d&#8217;utiliser qu&#8217;un seul test. Bien évidemment Olivier fut le premier à [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>En fin d&rsquo;année dernière, Assan, un développeur très sympathique nous proposait un petit défit qui a suscité un grand intérêt chez moi car j&rsquo;ai toujours été fasciné par les problèmes simples en apparence mais recelant une complexité moins évidente à saisir immédiatement.</p>
<p>L&rsquo;enjeu était le suivant: faire une fonction qui test si une variable est située entre deux bornes limites(range) en  ayant le droit d&rsquo;utiliser qu&rsquo;un seul test.</p>
<p>Bien évidemment Olivier fut le premier à résoudre le problème avec une solution illisible par sa complexité syntaxique mais qui n&rsquo;utilisait aucun test, voilà, cette description à elle seule suffit pour dire que vous venez de faire la connaissance d&rsquo;Olivier.</p>
<p>Néanmoins, ce fut à moi que Assan serra la main et pour reprendre ses mots &laquo;&nbsp;Cette poignée  de main c&rsquo;est pour l&rsquo;élégance de ta solution&nbsp;&raquo;</p>
<p>Je crois que ce qui est intéressant ici c&rsquo;est que la syntaxe Haskell ainsi que l&rsquo;accessibilité offerte par l&rsquo;invite de ligne de commande prelud ont grandement facilité un prototypage rapide en m&rsquo;épargnant d&rsquo;avoir à mettre en place des tests unitaires.</p>
<p>Et donc trêve de bavardage, voici ma solution :</p>
<p><em><strong>fun :: Integer -&gt; Bool<br />
fun s min max = (s-(max+1)) * (s-(min-1)) &lt; 0</strong></em></p>
<p>Merci Haskell !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Refactoring</title>
		<link>https://blog.developpez.com/walikworkshop/p12134/non-classe/refactoring</link>
		<comments>https://blog.developpez.com/walikworkshop/p12134/non-classe/refactoring#comments</comments>
		<pubDate>Fri, 19 Jul 2013 14:41:56 +0000</pubDate>
		<dc:creator><![CDATA[Walik]]></dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/walikworkshop/?p=33</guid>
		<description><![CDATA[J&#8217;ai du résoudre le problème suivant dans l&#8217;ordre: Ecrire un premier programme qui exploite les données présentes dans weather.dat qui affiche le jour (colonne 1) de la plus basse température (colonne 3) Ecrire un second programme qui exploite les données présentes dans football.dat et qui affiche le plus petit différentiel de but entre les but encaissé (colonne A) et les buts marqués (colonne B) Ecrire un troisième programme qui factorise les deux programmes précédents Le [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;ai du résoudre le problème suivant dans l&rsquo;ordre:</p>
<ol>
<li>Ecrire un premier programme qui exploite les données présentes dans  <a href="http://blog.walikworkshop.com/wp-content/uploads/2012/12/weather.dat">weather.dat</a> qui affiche le jour (colonne 1) de la plus basse température (colonne 3)</li>
<li>Ecrire un second programme qui exploite les données présentes dans <a href="http://blog.walikworkshop.com/wp-content/uploads/2012/12/football.dat">football.dat</a> et qui affiche le plus petit différentiel de but entre les but encaissé (colonne A) et les buts marqués (colonne B)</li>
<li>Ecrire un troisième programme qui factorise les deux programmes précédents</li>
</ol>
<p>Le premier programme a été assez facile à développer, j’ai progréssé jusqu’à arriver à insérer chaque colonne dans un tableau.<br />
Le code du second programme est plus élégant, on peut noter l&rsquo;utilisation d&rsquo;un opérateur ternaire, et le remplacement d&rsquo;une variable incrémentale par un booléen. A noter que le même code de lecture et d&rsquo;itération a été conservé avec un ajout de contrainte sur l&rsquo;expression régulière.<br />
Partant de ce constat, j&rsquo;ai commencé le refactoring en prenant comme base la fonction football.<br />
Le premier élément factorisé est le nom du fichier et l’instruction de lecture du fichier.<br />
Ensuite, étonnamment, on constate que  l&rsquo;expression régulière de la fonction weather est finalement plus universelle et fonctionne dans les deux cas, pas celle de football.<br />
A ce stade, je suis passer à l&rsquo;itération, au départ j&rsquo;ai perdu de temps en cherchant à rendre le code le plus générique possible mais finalement je me suis résolu à faire cela le plus simplement possible pour me limiter au contexte du problème à résoudre.<br />
Puis je me suis réellement rendu compte que les deux fonctions avait plus de points en commun qu’il n’y paraissait au départ, en effet dans les deux cas ce qui est recherché c’est le minimum, qu&rsquo;il soit une valeur ou la différence entre deux valeurs ($diff et $min)<br />
J&rsquo;ai également supprimé une répétition inutile d&rsquo;insctruction, la fonction split dans les deux blocs if était identique<br />
Premier constat, le second programme possède un code syntaxiquement plus claire mais manifestement moins portable un exemple: l’introduction de contraintes dans l&rsquo;expression régulière<br />
<strong>On peut en déduire que:</strong><br />
Le factorisation a été facilité par l&rsquo;emploie de fonctions comme file_get_content, foreach et split<br />
Elle a été rendu difficile par les parties de code différentes comme l&rsquo;utilisation du booléen ou le nombre de colonnes et la nature des données à traiter<br />
Mais au final même si toutes les similarités ne sautaient pas immédiatement aux yeux, les deux programmes étaient quasi identiques<br />
L&rsquo;écriture du second programme était clairement influencé par le premier dans le sens ou j&rsquo;ai essayé d&rsquo;en améliorer les principes. Les points fort était l&rsquo;introduction d&rsquo;un booléen et l&rsquo;élimination de code dupliqué.  Le point faible était la modification inutile de l&rsquo;expression régulière.<br />
<strong>Conclusion:</strong><br />
La factorisation apporte simplification et réutilisabilité du code en revanche on perd en clarté car par exemple le nommage des variables devient plus abstrait. On perd également un peu en terme de sécurité car on est obligé d&rsquo;utiliser une expression régulière plus générale qui pourrait laisser passer des d&rsquo;erreurs de formatage de document.<br />
Le code gagne également en lisibilité et en maintenabilité puisque il peut être facilement étendu au traitement de plus de colonnes/opérations par exemple.</p>
<p>Et pour finir voici le code: <a href="http://blog.walikworkshop.com/wp-content/uploads/2012/12/refactoring.txt">weather-football-dry</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>13 conseils pour les sites à forte charge</title>
		<link>https://blog.developpez.com/walikworkshop/p12037/non-classe/13-conseils-pour-les-sites-a-forte-charge</link>
		<comments>https://blog.developpez.com/walikworkshop/p12037/non-classe/13-conseils-pour-les-sites-a-forte-charge#comments</comments>
		<pubDate>Tue, 11 Jun 2013 16:23:45 +0000</pubDate>
		<dc:creator><![CDATA[Walik]]></dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/walikworkshop/?p=28</guid>
		<description><![CDATA[Vous voulez développer des applications qui peuvent prétendre résister à de fortes charges ? Suivez ces 13 conseils déjà &#8230; Utiliser le prefork d&#8217;apache: Chaque utilisateur est servi par une instance du serveur web, l&#8217;instanciation prend du temps par conséquent l&#8217;anticiper revient à en gagner mais surtout à éviter une saturation trop rapide de la disponibilité des instances et donc du serveur web Utiliser apache mod_deflate: Il s&#8217;agit d&#8217;un module du serveur web apache qui [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Vous voulez développer des applications qui peuvent prétendre résister à de fortes charges ? Suivez ces 13 conseils déjà &#8230;</p>
<ol>
<li>Utiliser le prefork d&rsquo;apache: Chaque utilisateur est servi par une instance du serveur web, l&rsquo;instanciation prend du temps par conséquent l&rsquo;anticiper revient à en gagner mais surtout à éviter une saturation trop rapide de la disponibilité des instances et donc du serveur web</li>
<li>Utiliser apache mod_deflate: Il s&rsquo;agit d&rsquo;un module du serveur web apache qui sert à compresser les fichiers avant de les envoyer, des fichiers plus petits transitent plus vite</li>
<li>Apache mod_cache: Il s&rsquo;agit d&rsquo;un système de cache interne à apache, <a href="http://fr.wikipedia.org/wiki/Cache_web" title="Cache Web">qu&rsquo;est ce qu&rsquo;un cache ?</a> </li>
<li>Utiliser un proxy comme <a href="http://www.squid-cache.org/">squid</a></li>
<li>Utiliser la réplication Mysql, <a href="http://dev.mysql.com/doc/refman/5.0/fr/replication.html" title="Réplication Mysql">qu&rsquo;est ce que la réplication</a> ?</li>
<li><a href="http://www.vulgarisation-informatique.com/optimiser-php.php" title="Optimiser php">Optimisez votre code</a>, on ne le répétera jamais assez !</li>
<li>Utiliser PHP apc, <a href="http://php.net/manual/fr/book.apc.php" title="PHP APC">le cache d&rsquo;opcode de php</a></li>
<li>Utiliser des solutions de cache de données comme <a href="http://memcached.org/" title="memcached">memcached</a></li>
<li>Mettre en place du monitoring avec <a href="http://www.cacti.net/">cacti </a>ou <a href="http://www.nagios.org/">nagios</a> pour ne citer qu&rsquo;eux</li>
<li>Utiliser des solutions de load balancing comme <a href="http://www-igm.univ-mlv.fr/~dr/XPOSE2006/JEREMIE_LEGRAND_HAUTE_DOSPO/index.htm" title="HeartBeat">HeartBeat</a></li>
<li>Ajouter de la ram</li>
<li>Utiliser des disques durs ssd</li>
<li>Booster les processeurs</li>
</ol>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AGL Atelier de Génie Logiciel</title>
		<link>https://blog.developpez.com/walikworkshop/p12026/non-classe/agl-atelier-de-genie-logiciel</link>
		<comments>https://blog.developpez.com/walikworkshop/p12026/non-classe/agl-atelier-de-genie-logiciel#comments</comments>
		<pubDate>Fri, 07 Jun 2013 13:23:11 +0000</pubDate>
		<dc:creator><![CDATA[Walik]]></dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[agl]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[cis]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[edi]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[jira]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[mantis]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[trac]]></category>
		<category><![CDATA[vcs]]></category>
		<category><![CDATA[xunit]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/walikworkshop/?p=17</guid>
		<description><![CDATA[Le sens qui est donné ici à l&#8217;Atelier de Génie Logiciel ou AGL est l&#8217;ensemble des outils qui concours à la production de projets informatiques. Il s&#8217;agit d&#8217;un retour d&#8217;expérience personnelle par conséquent toute contribution à l&#8217;enrichissement de ce sujet est la bienvenue. Rentrons tout de suite dans le vif du sujet, les outils nécessaires sont les suivants : EDI Environnement de développement intégré C&#8217;est votre éditeur de code source, son choix est très important. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le sens qui est donné ici à l&rsquo;Atelier de Génie Logiciel ou AGL est l&rsquo;ensemble des outils qui concours à la production de projets informatiques.</p>
<p>Il s&rsquo;agit d&rsquo;un retour d&rsquo;expérience personnelle par conséquent toute contribution à l&rsquo;enrichissement de ce sujet est la bienvenue.</p>
<p>Rentrons tout de suite dans le vif du sujet, les outils nécessaires sont les suivants :</p>
<p><strong>EDI Environnement de développement intégré</strong></p>
<p>C&rsquo;est votre éditeur de code source, son choix est très important.<br />
Des choix intéressants seraient Eclipse et Netbeans pour les gratuits, il existe aussi des solutions payantes comme &laquo;&nbsp;PHP Storm&nbsp;&raquo; et là pas de secret, quand on paye c&rsquo;est mieux.<br />
En plus de gérer votre code source, un EDI vous rend pas mal de services par des options telles que :</p>
<ul>
<li>la complétion automatique d&rsquo;instructions</li>
<li>le formatage du code</li>
<li>la détection d&rsquo;erreur dans tout le projet</li>
<li>la recherche de mots clés, de fonctions, de méthodes, d&rsquo;appels de méthodes, de fichiers</li>
<li>L&rsquo;exploration hiérarchique de classes</li>
<li>la gestion du contrôle de version ou VCS (version control system comme svn, git)</li>
</ul>
<p><strong>Intégration continue CIS (Continous Integration System)</strong></p>
<p>L&rsquo;intégration continue regroupe un VCS, un outil de tests unitaires tel que phpUnit ou Junit, et enfin un outil d&rsquo;intégration continue tel que Jenkins.<br />
C&rsquo;est un genre de monitoring qui vous permet de vérifier la qualité du code de vos projets le plus fréquemment possible et en particulier avant une mise en production.<br />
Aujourd&rsquo;hui, dans les cycles de production modernes, un code passe par trois serveurs avant d&rsquo;être exploitable, le serveur de développement où le code est construit au départ, le serveur d&rsquo;intégration où se trouve Jenkins, le serveur de staging qui sert à la fois au tests fonctionnels et au déploiement c&rsquo;est une sorte de serveur de production caché et enfin le serveur de production à proprement parler.<br />
Une fois votre VCS configuré, vos tests unitaires en place, vous pouvez configurer votre CIS.<br />
L&rsquo;indicateur qui vous renseigne sur la qualité de votre code et que fourni un tel système s&rsquo;appele le code coverage</p>
<p><strong>Outils de modélisation</strong></p>
<p>Afin de concevoir un système le plus sain possible, il convient dans la phase préliminaire de le schématiser.<br />
Pour pouvoir l&rsquo;optimiser par la suite, il faut mettre à jour ce modèle.<br />
Que ce soit pour le code ou pour la base de données des outils existent pour cela, en voici quelques uns : Argo UML, Bouml, Visual Paradigmes, MysqlWorkbench, PowerAmc.<br />
Si vous vous posez encore des questions sur l’intérêt d&rsquo;utiliser de tels outils, <a href="http://blog.developpez.com/walikworkshop/p12025/non-classe/optimisations-mysql" title="Optimisations Mysql">un article précédent peut vous y aider</a>.</p>
<p><strong>Tracking</strong></p>
<p>Dans un milieux de développement collaboratif, pour que les projets soient bien menés, il convient d&rsquo;avoir un suivi efficace des taches réalisées, suspendues, interrompues.<br />
Des solutions de tracking comme Trac, Redmine et Mantis pour les gratuites, Jira pour les payantes existent pour vous permettre de mener à bien ce travail.<br />
Grâce à ces gestionnaires de taches, vous pouvez savoir à tout moment où vous en êtes de la réalisation de vos projets, quelles sont les taches accomplies, celles restantes à faire, vous pouvez recueillir des feedback d&rsquo;utilisateurs par le biais des commentaires et faire des statistiques sur la qualité de traitement des projets.</p>
<p><strong>Tests unitaires</strong></p>
<p>Afin de se protéger des régressions applicatives introduites dans les cycles de production logiciel il faut mettre en place des tests unitaires.<br />
Je ne vais pas faire un cours sur les tests unitaires car la documentation sur le sujet est très fournies et que l&rsquo;internet regorge de tutoriaux.<br />
La qualité de votre logicielle dépend directement de la qualité de vos tests unitaires.</p>
<p><strong>VCS, contrôle de version</strong></p>
<p>Dans un cycle de production de qualité il est impensable de travailler sans un outil de contrôle de version.<br />
A l&rsquo;origine existait RCS (pour revision contrôle system) qui permettait de gérer les différentes versions d&rsquo;un logiciel tout au long de son cycle de vie.<br />
Puis une dimension réseau fut introduite avec CVS.<br />
Enfin aujourd&rsquo;hui les deux outils qui se sont imposés sont SVN (subversion) et GIT.<br />
Sans rentrer dans le détail, la principale différence entre ces deux systèmes réside dans le fait que GIT exploite un dépôt dit décentralisé au contraire de SVN. Vous pouvez vous référer à l&rsquo;abondante documentation présente sur le net.<br />
Le choix de l&rsquo;un ou l&rsquo;autre de ces deux outils dépend essentiellement de la politique de l&rsquo;entreprise et du confort d&rsquo;utilisation qu&rsquo;y trouvent directement les différents groupes de développeurs.<br />
Un VCS vous permettra aussi de faire un rollback en cas de bug en production</p>
<p><strong>Méthodologie</strong></p>
<p>Enfin, dernier point important : la méthodologie.<br />
Malgré la présence de pléthore de méthodologies de développement logiciel telle que Crystal ou Lean, deux seulement ont retenu mon attention par leur coté complémentaire et efficace :<br />
Scrum et Extrem Programming (XP).<br />
Ces méthodes fournissent un cadre de travail, elles incluent des pratiques collaboratives, de programmation et de gestion de projet tel que : La responsabilité collective du code, les tests unitaires, le travail en binôme, le refactoring, la vélocité, les Burn Down Chart, le Poker planning, le daily stand up meeting.<br />
Bien que leur efficacité soit sujet à controverse, je laisse à chacun le soin de les expérimenter et de les adapter au besoin pour n&rsquo;en conserver que ce qui fonctionne réellement dans son contexte de travail.</p>
<p><strong>Le mot de la fin</strong></p>
<p>Voilà, j&rsquo;espère que cet article vous aura donné les clés qui aideront à l&rsquo;aboutissement de vos projets.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimisations Mysql</title>
		<link>https://blog.developpez.com/walikworkshop/p12025/non-classe/optimisations-mysql</link>
		<comments>https://blog.developpez.com/walikworkshop/p12025/non-classe/optimisations-mysql#comments</comments>
		<pubDate>Fri, 07 Jun 2013 12:49:30 +0000</pubDate>
		<dc:creator><![CDATA[Walik]]></dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[base de données]]></category>
		<category><![CDATA[merise]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/walikworkshop/?p=7</guid>
		<description><![CDATA[La première étape dans une optimisation logicielle est certainement l&#8217;optimisation de votre base de données SQL. Que vous vouliez optimiser votre application pour résister à la charge ou aux failles de sécurité, que ce soit un site internet ou une application de bureau, le principe reste le même. Dans ce domaine il faut s&#8217;assurer de la qualité d&#8217;un certains nombre d&#8217;aspects. Le modèle de donnée D&#8217;abord il faut que le modèle de votre base de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>La première étape dans une optimisation logicielle est certainement l&rsquo;optimisation de votre base de données SQL.</p>
<p>Que vous vouliez optimiser votre application pour résister à la charge ou aux failles de sécurité, que ce soit un site internet ou une application de bureau, le principe reste le même.</p>
<p>Dans ce domaine il faut s&rsquo;assurer de la qualité d&rsquo;un certains nombre d&rsquo;aspects.</p>
<p><strong>Le modèle de donnée</strong></p>
<p>D&rsquo;abord il faut que le modèle de votre base de données soit basé sur des méthodologies qui ont fait leur preuves comme <a href="http://fr.wikipedia.org/wiki/Merise_(informatique)" title="Merise">Merise</a>.</p>
<p>L&rsquo;application des principes d&rsquo;une telle méthodologie apportera un modèle saint et rapide,  elle évitera des effets de bords imprévisibles qui ne manqueront pas de planter votre application et/ou de corrompre vos données  à moyen-long terme engendrant des coûts en maintenance en termes d&rsquo;effort et d&rsquo;argent.</p>
<p>Par exemple l&rsquo;ajout de contraintes empêche la corruption des données. Des relations 1.1, 1.n ou n.n pertinentes diminuent le volume de données, des indexes bien placé augmentent la vitesse de recherche. Ainsi nous voyons ici trois aspects importants traités: La sécurité, le volume et la vitesse.</p>
<p><strong> La sécurité</strong></p>
<p>En terme de sécurité, il faut protéger votre application contre les <a href="http://fr.wikipedia.org/wiki/Injection_SQL" title="Injections SQL">injections sql</a>.<br />
Vous devez ensuite indiquer précisément les types des champs de votre table, un champ qui ne doit jamais être NULL doit être flagué &laquo;&nbsp;NOT NULL&nbsp;&raquo;, un champ qui n&rsquo;est jamais sensé être négatif devrait être &laquo;&nbsp;unsigned&nbsp;&raquo;.</p>
<p>Tous laxisme à ce niveau entraîne des failles difficile à détecter, on peut y avoir une analogie avec le typage dans les langages de programmation, il vaut mieux qu&rsquo;un programme plante à la compilation qu&rsquo;a l&rsquo;exécution.</p>
<p>Un de mes clients dont le site internet proposait un système de crédits à ces utilisateurs a pâtis d&rsquo;un manquement à ce niveau. Un utilisateur malin arrivait à passer des valeurs négatives lors des opérations de dé-crédit et par conséquent son solde grossissait perpétuellement au lieu de diminuer, il réussi ainsi a avoir des crédits illimités.</p>
<p> <strong>Volume de données</strong></p>
<p>Pensez à automatiser l&rsquo;archivage des données qui sont importantes mais inutiles au fonctionnement de votre système, par exemple les transactions ou les facturations qui ont plus de 6 mois.</p>
<p>Quant aux données temporaire il convient d&rsquo;automatiser leur suppression.</p>
<p>Utilisez également du <a href="http://fr.wikipedia.org/wiki/Round-robin_(informatique)" title="Round-Robin">round-robin</a> sur des types de données qui s&rsquo;y prête comme les données de monitoring.</p>
<p><strong>La vitesse</strong></p>
<p>Nous allons traiter ici de ce  sujet probablement le plus important et auquel on pense immédiatement.</p>
<p>Tous d&rsquo;abord avoir un <em>modèle de donnée</em> cohérent accéléra vos opération d&rsquo;archivage réduisant plus vite votre <em>volume de données</em>.</p>
<p>Ensuite il y a quelque règles de base à respecter si vous voulez accélérer vos requête:</p>
<p>N&rsquo;utilisez pas &laquo;&nbsp;SELECT  *&nbsp;&raquo;  mais nommé spécifiquement les champs que vous recherchez<br />
Effectuer autant que possible des recherche sur des champs de même type, text-text, int-int etc<br />
Mettez des indexes sur les champs les plus sollicités en recherche<br />
Ensuite il y a deux deux raisons qui font que vos requêtes sont lentes: Le verrouillage et l’exécution</p>
<p>Pour le déterminer vous pouvez analyser vos requetes avec des outils comme &laquo;&nbsp;show profile&nbsp;&raquo; ou &laquo;&nbsp;show status&nbsp;&raquo;</p>
<p><strong>Le vérrouillage</strong></p>
<p>Lorsque on accède a une ressouce mysql , en lecture ou en écriture, celle ci est vérrouillée le temps de l&rsquo;opération pour garantir l&rsquo;intégrité des informations retournées.</p>
<p>Si votre table sql est lente à cause des mécanismes de vérrouillage plusieurs solution peuvent être envisagées comme:</p>
<ul>
<li>Changer de moteur: Le moteur InnoDb effectue sont vérrouillage à un niveau lignes sur une table tandis que Myisam vérouille toute la table.</li>
<li>Sharding vertical: Plus la table est grosse plus il est difficile d&rsquo;y accéder, splitter vos données verticalement en externalisant vos champs les plus sollicité dans de multiples tables externes constitue une solution de choix dans ce cas.</li>
<li>Cache: Utiliser une solution de cache afin que les bases de données ne soit pas sollicité sur les données qui ne change que ponctuellement évitera a ces ressources d&rsquo;être inaccessible lors des requêtes.</li>
</ul>
<p><strong>L&rsquo;exécution</strong></p>
<p>Si vos requête sont lentes à l&rsquo;exécution vous pouvez:</p>
<ul>
<li>Supprimer les jointures et les remplacer par des sous requêtes</li>
<li>Restructurer les champs de vos tables pour économiser l&rsquo;espace, la ou un tiny int est suffisant inutile de mettre un int</li>
<li>Utiliser du Sharding horizontale: celà consiste à éclater une table une table en plusieurs table à la manière <a href="http://dev.mysql.com/doc/refman/5.0/fr/merge-storage-engine.html" title="Mysql Table assemblées MERGE">des table assemblées merge mysql</a>.</li>
<li>Mettre des indexes là ou c&rsquo;est nécessaire comme indiqué plus haut</li>
</ul>
<p><strong>Conclusion</strong></p>
<p>Voilà un assez bref petit tours d&rsquo;horizon bien que non exhaustif qui j&rsquo;espere apportera a certains une vision synthétique, une sensibilisation aux optimisation Mysql ou tout simplement des débuts de pistes à explorer</p>
<p>M.C</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
