<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.puupuu.org/dotclear/index.php?feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Mokona Guu Center</title>
  <link>http://www.puupuu.org/dotclear/index.php?</link>
  <atom:link href="http://www.puupuu.org/dotclear/index.php?feed/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Fri, 03 Sep 2010 17:42:14 +0200</pubDate>
  <copyright>(c) Sylvain Glaize sauf mention contraire.</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Outils de production, outils de consommation</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/08/22/Outils-de-production%2C-outils-de-consommation</link>
    <guid isPermaLink="false">urn:md5:395a830a6605f858ef589a4e22fccdf1</guid>
    <pubDate>Tue, 24 Aug 2010 16:00:00 +0200</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
        <category>android</category><category>informatique</category><category>linux</category><category>programmation</category><category>société</category>    
    <description>&lt;p&gt;Lorsque Mickaël me demande lors d'un &lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/07/26/G%C3%A9n%C3%A9rations-d-assistants-%C3%A9lectroniques&quot;&gt;billet précédent&lt;/a&gt; ce qui m'a poussé vers Android comme plateforme pour mon téléphone, je me dis que la réponse est assez complexe car le résultat d'une série de considérations et un vécu personnel au contact de l'outil informatique.&lt;/p&gt;    &lt;p&gt;Et l'on va pour cela commencer par remonter quelques trente années. À ce moment là, l'ordinateur est bien éloigné de ce qu'il est à présent. Pourtant, il sert aux même choses&amp;nbsp;: aide au travail (calcul, traitement de texte), enseignement, communication, jeux. Il y a beaucoup de machines de types différents, peu de normes, l'informatique se détache tout juste de l'électronique et il y a une chose qui est certaine&amp;nbsp;: programmer fait partie de l'utilisation de l'ordinateur. Ce n'est pas une obligation, l'outil peut être utilisé sans, mais tout magazine informatique contient sa partie programmation et tous les ordinateurs (ou peu s'en faut) sont livrés avec un moyen d'être programmé.&lt;/p&gt;


&lt;p&gt;Cet ordinateur, lorsqu'il est personnel, est un outil que l'on peut utiliser et bricoler dans son intégralité. Construire le sien était un hobby accessible &lt;sup&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/08/22/Outils-de-production%2C-outils-de-consommation#pnote-209-1&quot; id=&quot;rev-pnote-209-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;La première machine que j'ai eu livrée sans moyen d'être programmée était un Atari STe. Une incompréhension pour moi à l'époque, qui avait fait qu'en même temps que la machine, j'avais acheté le GFA Basic.&lt;/p&gt;


&lt;p&gt;Puis, progressivement, le nombre de systèmes a diminué et le principal qui commence alors à s'imposer, Windows 3.1, ne fourni pas de moyen d'être programmé. Le BASIC livré avec le DOS (Windows est alors une surcouche du DOS) disparaît tout à coup.&lt;/p&gt;


&lt;p&gt;C'est à ce moment là que j'entends parler de Linux. J'avais découvert les systèmes Unix entre temps, un Unix à installer chez soi, ça me semblait plutôt pas mal. Et FreeBSD, vers la même époque, demandait trop à mon PC. Ne pas pouvoir me servir pleinement de ma machine me rebute, je vire Windows 3.1 et j'installe un Linux. Double bonheur, je peux exploiter mon ordinateur comme je l'entends et le système de base l'exploite mieux.&lt;/p&gt;


&lt;p&gt;Arrive Windows 95. Pas de possibilité de programmation livré avec, des performances catastrophiques sur une machine qu'un copain me prête, des capacités en réseau proche du néant. J'ai l'impression que, sous couverture d'être simple pour l'utilisateur, la machine échappe à l'utilisateur qui veut s'approprier son outil. En parallèle, j'ai l'occasion de donner quelques cours d'informatiques qui me montrent que pour le moment, aucun des systèmes ne se met réellement à la hauteur d'un utilisateur néophyte. Les distributions Linux n'essaient pas vraiment, et Windows ne fait que le clamer sur les dépliant publicitaires. Mes élèves ont déjà assez de mal avec le concept de pointeur souris. Je ne vois donc pas d'intérêt à lâcher ma liberté d'utilisation de mon PC pour la promesse d'une utilisation plus facile.&lt;/p&gt;


&lt;p&gt;Cette notion continuera à se fortifier au fil des années&amp;nbsp;: j'ai un outil qui me sert à produire des choses, qui m'aide dans mon travail ou qui me fourni des loisirs. Je tiens à garder le contrôle de cet outil, je ne veux pas que l'on m'en ferme des parties arbitrairement et, si je choisis d'utiliser un logiciel qui me cache ce qu'il fait, je veux que cela soit mon propre choix en fonction de la confiance que j'accorde au fournisseur.&lt;/p&gt;


&lt;p&gt;De nos jours, beaucoup de fournisseurs de services ou de logiciels voudraient fermer le fonctionnement de la machine à leur utilisateur. En façade, la raison est la facilité d'utilisation ou chez les plus retords, l'assurance d'une «&amp;nbsp;expérience de qualité&amp;nbsp;» &lt;sup&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/08/22/Outils-de-production%2C-outils-de-consommation#pnote-209-2&quot; id=&quot;rev-pnote-209-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;Chez Windows, il n'y a toujours pas possibilité de programmation avec l'ordinateur seul. En fait, jusqu'aux versions les plus récentes, il n'y avait pas beaucoup de possibilités. Heureusement, le développement d'Internet permet, via des sites spécialisés, d'équiper rapidement, facilement et librement sa machine de programmes en fonction des besoins.&lt;/p&gt;


&lt;p&gt;Chez Apple côté bureau avec MacOS-X, le système est installé avec Python et des outils de développement sont fournis et installables. Ce n'est pas écrit en gros sur la plaquette, mais pas en petit non plus. Apple vend un système qui se programme. Certaines parties sont restent fermées.&lt;/p&gt;


&lt;p&gt;Chez les différents revendeur/packageur de Linux, programmer ou même modifier son système sont des utilisations permises, documentées et naturelles. Elles ne sont pas mises en avant dans les grandes distributions (Ubuntu par exemple), mais elles sont là. L'utilisateur peut, s'il le souhaite, faire ce qu'il veut de son système. Et s'il ne le veut pas, ce n'est pas nécessaire non plus. Il a acheté son PC, il y a installé un système&amp;nbsp;: il est libre de faire ce qu'il veut de son outil.&lt;/p&gt;


&lt;p&gt;Puisque les ordinateurs personnels semblent pouvoir échapper à des enfermements de l'utilisateur et puisque les utilisateurs se tournent de plus en plus vers des solutions mobiles (Smartphones et Tablets) pour leur utilisations courantes, c'est sur ce terrain que se joue à présent la bataille qui oppose, grossièrement, d'un côté ceux qui veulent garder un contrôle sur le logiciel et le matériel, au dépend de l'utilisateur mais en lui présentant ce système comme un avantage et de l'autre ceux qui considère qu'un outil aussi versatile que les outils informatiques ne doit pas être limité arbitrairement.&lt;/p&gt;


&lt;p&gt;Dans le camp fermé, il est difficile de programmer son propre matériel (il est nécessaire d'obtenir un sésame, payant, pour devenir développeur). Il est parfois interdit d'y installer ce que l'on veut sans passer par une plateforme centralisée. Pour contre balancer cette forte limitation, le fournisseur du matériel (qui est aussi le contrôleur/censeur du logiciel qui pourra être installé) va tabler sur une grosse logithèque. Côté développeurs, ils promettent une rétribution (potentielle) qui rentabilisera rapidement le coût d'entrée pour attirer un maximum d'entre eux. Côté utilisateur, ils promettent que l'application dont ils auront besoin sera forcément disponible. À vrai dire, il y en aura probablement trop, ce qui permettra à la plateforme centralisée de jouer sur la visibilité des applications pour en avantager certaines.&lt;/p&gt;


&lt;p&gt;Dans le camp ouvert, ce système est incompréhensible. Si je suis moi même développeur et que je fais une application pour mes propres besoins, pourquoi irai-je payer une société tierce pour installer mon programme sur mon matériel&amp;nbsp;? Et que je sois ou non développeur et que je veux installer telle application, sans que celle-ci passe par le filtre d'une société tierce, car je considère qu'elle n'a pas à savoir ce que je fais de ma machine, ni même qu'elle me donne son avis sur cette utilisation, pourquoi en serais-je empêché&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;C'est là que je fais la différence entre un outil de consommation, qui met en avant l'intérêt de l'outil par le catalogue disponible à l'achat, très étoffé mais qui par ses diverses restrictions entrave la liberté de l'utilisateur (et donc sa liberté à produire quelque chose), et l'outil de production, qui ne met pas d'entrave à l'utilisation de l'outil, laissant l'utilisateur décider de ce qu'il en fera.&lt;/p&gt;


&lt;p&gt;C'est tout cela qui m'a amené à choisir Android comme système pour mon smartphone. À un bouton prêt dans la configuration, le système permet d'être utilisé en mode de développement. À un autre bouton prêt, l'utilisateur signal au système qu'il l'autorise à installer des applications qui ne passe pas par la plateforme officielle. Notez bien&amp;nbsp;: l'utilisateur autorise le système à effectuer une opération&amp;nbsp;! Et non pas le contraire (le système autorise l'utilisateur), comme il est d'usage dans les systèmes fermés.&lt;/p&gt;


&lt;p&gt;Il y a une petite ombre au tableau cependant&amp;nbsp;: les smartphones ne sont généralement pas complètement ouverts. Lorsqu'ils sont livrés par un opérateur téléphonique, cet opérateur ne donne pas l'accès au cœur du système. Généralement, cette limitation peut être levée, mais pas officiellement. Chez certains constructeurs, comme Motorola, quelques smartphone ont des parties chiffrées qui empêchent cet accès au cœur du système.&lt;/p&gt;


&lt;p&gt;Il reste donc un peu de chemin à parcourir, dans le sens de l'ouverture, bien entendu.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/08/22/Outils-de-production%2C-outils-de-consommation#rev-pnote-209-1&quot; id=&quot;pnote-209-1&quot;&gt;1&lt;/a&gt;] cette pratique existe toujours (voir &lt;a href=&quot;http://gawgle.net/blog/?p=141&quot;&gt;là&lt;/a&gt; par exemple), mais plus sous la forme de défis personnels ou de projets étudiants.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/08/22/Outils-de-production%2C-outils-de-consommation#rev-pnote-209-2&quot; id=&quot;pnote-209-2&quot;&gt;2&lt;/a&gt;] autre façon de dire : ne venez pas nous ennuyer avec vos problèmes en SAV.&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://www.puupuu.org/dotclear/index.php?post/2010/08/22/Outils-de-production%2C-outils-de-consommation#comment-form</comments>
      <wfw:comment>http://www.puupuu.org/dotclear/index.php?post/2010/08/22/Outils-de-production%2C-outils-de-consommation#comment-form</wfw:comment>
      <wfw:commentRss>http://www.puupuu.org/dotclear/index.php?feed/atom/comments/209</wfw:commentRss>
      </item>
    
  <item>
    <title>Cadavre Exquis Creajol / Le Dixième Art</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/08/05/Cadavre-Exquis-Creajol-/-Le-Dixi%C3%A8me-Art</link>
    <guid isPermaLink="false">urn:md5:5e3bc9409cca8f829c1b3d2d6087b1ab</guid>
    <pubDate>Thu, 05 Aug 2010 18:00:00 +0200</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Image</category>
        <category>dessin</category><category>infographie</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://creajol.jeuxonline.info/&quot;&gt;Creajol&lt;/a&gt; et &lt;a href=&quot;http://www.facebook.com/LeDixiemeArt&quot;&gt;Le Dixième Art&lt;/a&gt; ont organisé il y a peu une animation basée sur le principe du &lt;a href=&quot;http://fr.wikipedia.org/wiki/Cadavre_Exquis&quot;&gt;Cadavre Exquis&lt;/a&gt;. Lors de l'annonce de cette animation, je savais que j'allais avoir un peu de temps à y consacrer et j'ai demandé si je pouvais participer.&lt;/p&gt;


&lt;p&gt;Je ne suis pas graphiste, je n'étais pas certain d'avoir ma place dans l'animation mais je n'étais apparemment pas le seul dans ce cas. Et puis, si ça ne donnait rien, on pouvait toujours annuler ma participation, je n'y aurais pas vu d'inconvénient. Ma participation était aussi un prétexte pour moi à me lancer dans quelque chose qui n'est pas vraiment de mon domaine, même si je n'y suis pas complètement étranger.&lt;/p&gt;


&lt;p&gt;J'ai donc reçu mon petit bout d'image à compléter. Par chance, ce petit bout d'image m'a fait visualiser immédiatement ce que je voulais mettre à la suite. Dans les grandes lignes du moins, car le dessin au final n'est pas tout à fait tel que je l'avais imaginé. Le temps et surtout mes capacités ont joué sur ce que je pouvais livrer dans le temps imparti.&lt;/p&gt;


&lt;p&gt;Au final, trois posters ont été crées. Ils ont été publiés hier. L'&lt;a href=&quot;http://creajol.jeuxonline.info/actualite/27944/animation-resultats-cadavre-exquis-graphique&quot;&gt;un sur Creajol&lt;/a&gt; que je trouve vraiment bien, les transitions se passent bien, l'impression d'ensemble est bonne et le thème est là.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.facebook.com/LeDixiemeArt#!/album.php?aid=203194&amp;amp;id=252174402259&quot;&gt;Deux autres&lt;/a&gt; sont sur Le Dixième Art. Là, c'est un peu plus compliqué, un premier poster est séparé en deux images avec un lien dans la description vers l'image en entier. Le dernier poster est caché dans un lien dans la description du poster précédent, ainsi que dans certains commentaires. J'ai mis personnellement du temps avoir de le trouver.&lt;/p&gt;


&lt;p&gt;Mais j'y tenais un peu, vu que c'est sur ce dernier que se trouve ma contribution.&lt;/p&gt;


&lt;p&gt;Je trouve le premier poster un peu moins bon que celui de Creajol&amp;nbsp;: les transitions se font parfois moins bien, mais c'est le risque de l'exercice et l'impression d'ensemble est plus fouillis. Tout le passe de la main et du bras ressort du reste&amp;nbsp;: je trouve ce passage plus soigné.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/dessin/2010/201008-CreaJol-CadavresExquis-Poster2-small.png&quot; alt=&quot;Apperçu du deuxième poster Cadavre Exquis Le Dixième Art&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; title=&quot;Apperçu du deuxième poster Cadavre Exquis Le Dixième Art, août 2010&quot; /&gt;&lt;/p&gt;


&lt;p&gt;À droite, j'ai inclus un aperçu du poster auquel j'ai participé. Pour le voir en grand, allez sur le site &lt;a href=&quot;http://www.facebook.com/LeDixiemeArt#!/album.php?aid=203194&amp;amp;id=252174402259&quot;&gt;Le Dixième Art&lt;/a&gt;. La partie que j'ai dessinée est le passage au niveau de la lanterne japonaise.&lt;/p&gt;


&lt;p&gt;L'image que j'ai reçu pour la continuité était constituée des deux coulures rouges juste au dessus du grand œil et des cheveux au même niveau. Je ne savais pas qu'il s'agissait de larmes de sang ni qu'il s'agissait de cheveux. Il est amusant de voir que je suis reparti sur des cheveux.&lt;/p&gt;


&lt;p&gt;Ma contribution est donc une allusion à la série de jeux vidéo Project Zero. On y trouve un personnage inspiré par les fantômes que l'on y trouve, une lanterne japonaise pour évoquer les décors dans lesquels on se déplace dans le jeu et le cercle magique de l'appareil photographique.&lt;/p&gt;


&lt;p&gt;Les larmes se transforment en espèce d'éclairs rose chair. Je trouvais ça menaçant et contribuant à l'atmosphère. Cela peuplait aussi l'arrière qui contenait à la base dans mon esprit un bâtiment japonais, finalement abandonné par manque de temps et d'inspiration sur comment le placer correctement.&lt;/p&gt;


&lt;p&gt;Au final, je trouve ma contribution correcte même si un peu brouillonne. Quelque chose de propre m'aurait demandé encore pas mal d'efforts. Mais je suis content car en faisant cet exercice, j'ai appris des choses.&lt;/p&gt;


&lt;p&gt;Le poster, dans son ensemble, a un côté malsain qui me plait, au moins sur les deux tiers haut, même s'il y a quelque chose au niveau des couleurs qui me gêne. Mais bon, c'est toujours le risque avec l'exercice des Cadavres Exquis. C'est aussi ce qui est intéressant.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Générations d'assistants électroniques</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/07/26/G%C3%A9n%C3%A9rations-d-assistants-%C3%A9lectroniques</link>
    <guid isPermaLink="false">urn:md5:1d7cb3f558028a27e27febdade173586</guid>
    <pubDate>Mon, 26 Jul 2010 22:00:00 +0200</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
            
    <description>&lt;p&gt;Pendant un nettoyage de printemps, j'ai eu l'idée de faire la photo des différents assistants électroniques qui m'ont suivi ces vingt dernières années.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/informatique/materiel/.20100721-PDA-Generations_m.jpg&quot; alt=&quot;Générations d&amp;#039;assistants électroniques&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Générations d&amp;#039;assistants électroniques, juil. 2010&quot; /&gt;&lt;/p&gt;    &lt;p&gt;De gauche à droite&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://mycalcdb.free.fr/main.php?l=1&amp;amp;id=424&quot;&gt;Casio fx-8500G&lt;/a&gt;. Certes, c'est avant tout une calculatrice, mais à cette époque, la mémoire transportable se trouve principalement là. Calculatrice scientifique programmable, elle possède aussi un mode «&amp;nbsp;fichiers&amp;nbsp;» qui permet de stocker du texte. Mieux vaut taper avec des abréviations, la mémoire est très limitée.&lt;/li&gt;
&lt;li&gt;kb-1106 Digital Diary 2KB&amp;nbsp;: c'est la meilleure référence que j'ai pu trouver. Visiblement, ça peut toujours se commander comme cadeau d'entreprise. Ça date un peu quand même. J'avais eu cet appareil en cadeau avec un abonnement de magazine. Ça valait ce que ça valait, mais il y avait un clavier et quelques fonctions d'agenda et de stockage de texte. J'ai utilisé cet appareil environ 3 ans je crois. Là encore, il fallait jouer avec la mémoire limitée. L'appareil me servait surtout à noter rapidement des idées pour les recopier plus tard sur mon ordinateur personnel.&lt;/li&gt;
&lt;li&gt;Pas sur la photo&amp;nbsp;: un calepin. À vrai dire, depuis longtemps, c'est un calepin en bête papier qui me suit. Pas de problèmes de piles, mais souvent des problèmes de stylo. Une mémoire de stockage importante et la possibilité d'écrire et de faire des dessins facilement.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Pocket_LOOX&quot;&gt;Pocket LOOX N520&lt;/a&gt;&amp;nbsp;: c'est en 2004 que l'on m'offre ce PDA qui va me sortir pendant 6 ans. Wifi, extensible par SD Card, un très bon appareil. Le calepin va en prendre un coup, tout en restant dans le coin, car un calepin n'a pas besoin de recharger sa batterie et taper du texte avec un stylet n'est pas toujours le plus optimal.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Motorola_CLIQ&quot;&gt;Motorola Dext&lt;/a&gt;. Alors que mon téléphone et mon PDA montrent tous les deux des signes de faiblesse dus à leur âge, c'est l'occasion de passer au Smartphone. Jusqu'à présent, rien ne m'avait bien tenté et mon matériel fonctionnait bien. L'arrivée d'Android sur des appareils aux capacités intéressantes finissent de me convaincre.&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Horreur à Arkham</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/07/13/Horreur-%C3%A0-Arkham</link>
    <guid isPermaLink="false">urn:md5:464818eb7be76a334bde997632ad75ab</guid>
    <pubDate>Tue, 13 Jul 2010 13:00:00 +0200</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Jeux</category>
        <category>jeu de plateau</category><category>présentation de jeu</category>    
    <description>&lt;p&gt;Shub-Niggurath, Nyarlathotep, Cthulhu,... si ces noms vous évoquent de bon souvenirs de lecture ou de parties de jeux de rôle et que vous aimez les jeux de plateau coopératifs et de longue durée, alors Horreur à Arkham est fait pour vous.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/jeux/plateau/.HorreurArkham-Plateau_m.jpg&quot; alt=&quot;HorreurArkham-Plateau.jpeg&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;HorreurArkham-Plateau.jpeg, juil. 2009&quot; /&gt;&lt;/p&gt;    &lt;p&gt;Horreur à Arkham fait partie des jeux classés sous l'anglicisme &quot;monster games&quot;&amp;nbsp;: beaucoup de matériel, un livret de règles de plus de vingt pages, la nécessité d'avoir une grande table pour jouer et une durée de jeu qui se compte en heures. Ne vous fiez pas à la durée indiquée, entre deux et quatre heures. Je n'ai jamais fait une partie de moins de trois heures beaucoup plus souvent tâté les cinq heures de jeux.&lt;/p&gt;


&lt;p&gt;Cinq heures de jeux&amp;nbsp;! À l'heure des jeux vidéo sur le web pliés en deux minutes, cela laisse songeur. On est plus près du temps consacré à une partie de jeux de rôles. Pourtant, Horreur à Arkham n'est pas le seul &quot;monster game&quot; dans le paysage ludique actuel, preuve que cela peut toujours plaire.&lt;/p&gt;


&lt;h2&gt;Mais que fait-on dans ce jeu&amp;nbsp;?&lt;/h2&gt;


&lt;p&gt;Dans Horreur à Arkham, chaque joueur joue (au moins) un personnage investigateur&lt;sup&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/07/13/Horreur-%C3%A0-Arkham#pnote-206-1&quot; id=&quot;rev-pnote-206-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; qui doit parcourir la ville imaginaire d'Arkham et fermer des portails donnant sur des mondes extérieurs pour repousser l'arrivée d'une créature qui ne présage rien de bon pour l'avenir de l'humanité.&lt;/p&gt;


&lt;p&gt;En d'autres termes, il va vous falloir sauver le monde&amp;nbsp;! Et comme il est difficile de sauver le monde seul, c'est en coopération avec les autres joueurs que vous allez vous lancer dans cette folle entreprise.&lt;/p&gt;


&lt;p&gt;À chaque tour de jeu, un personnage va pouvoir se déplacer dans Arkham, combattre les monstres qui s'insinuent dans la ville, faire des rencontres dans des lieux spécifiques. Si le personnage est passé par un portail, il fera un petit tour par un monde extérieur avant de revenir à Arkham et, fort de cette expérience, pouvoir fermer le portail.&lt;/p&gt;


&lt;p&gt;Mais à chaque fin de tour, les forces horrifiques s'emparent du plateau&amp;nbsp;: ouverture potentielle d'un portail, libération de monstres dans la ville, phénomènes étranges qui modifient légèrement les règles du jeu, fuite des alliés potentiels et fermeture des magasins, approche du moment fatidique où le monstre final débarque. La fin du tour est rarement annonciateur de bonnes nouvelles.&lt;/p&gt;


&lt;p&gt;Et c'est ce qui fait le croustillant de ce jeu qui tourne vraiment bien. Les personnages partent avec peu de connaissances, peu de matériel et immédiatement, ils sont confrontés à des choses qui les dépasse. Dès le premier tour, la course contre le jeu démarre. Il ne faut pas perdre de temps, se coordonner entre joueurs pour savoir qui va chercher les indices nécessaires à la fermeture définitive des portails, qui va s'occuper des monstres qui gênent le mouvement, qui va acheter du matériel. Une stratégie se met en place, mais est souvent mise à mal par les évènements dictés par les cartes tirées. Il faut alors choisir autre chose.&lt;/p&gt;


&lt;p&gt;Comme dans le jeu de rôle l'Appel de Cthulhu, les investigateurs à Horreur à Arkham ne sont pas des héros, ils n'ont pas le dessus. Ils font au mieux. Et le jeu est assez bien réglé pour qu'une victoire ne s'obtienne la plupart du temps que sur le fil... quand il y a victoire.&lt;/p&gt;


&lt;h2&gt;J'en veux encore plus&amp;nbsp;!&lt;/h2&gt;


&lt;p&gt;Le jeu de base contient 16 investigateurs aux capacités et caractéristiques variées ainsi que 8 Grands Anciens. De quoi faire quelques parties avant de faire le tour du jeu de base, qui lui même se renouvelle de lui-même grâce aux cartes de Mythe (les cartes évènements tirés à chaque fin de tour).&lt;/p&gt;


&lt;p&gt;Mais qu'à cela ne tienne, ce jeu est augmenté de quelques extensions qui modifient la difficulté du jeu (je vous laisse deviner dans quel sens) et ajoute quelques règles intéressantes. Il y a deux types d'extension, le type petite boite, qui contient des cartes et quelques pions, et le type grande boite, qui contient en plus un plateau et du matériel en plus qui augmentera votre temps de préparation de jeu, la place nécessaire sur votre table de jeu et... votre plaisir de jeu.&lt;/p&gt;


&lt;p&gt;Je n'ai joué qu'à deux d'entre  elles&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La Malédiction du Pharaon Noir&amp;nbsp;: une exposition se déroule à Arkham et ajoute de nouveaux évènements. Le but du jeu ne change pas, mais les investigateurs devront en plus résoudre les problèmes posés par la présence de l'exposition. L'extension ajoute de nouvelles rencontres, un nouveau concept de bénéfice/désavantage qui affecte les investigateurs, de nouveaux objets, dont ceux de l'exposition,... L'extension ajoute une bonne dose de difficulté, les objets de l'exposition compensant légèrement cette difficulté.&lt;/li&gt;
&lt;li&gt;L'Horreur de Dunwich&amp;nbsp;: ici, c'est une extension de type grosse boite à laquelle nous avons affaire. Le plateau principal se voit adjoindre un nouveau plateau, beaucoup plus petit, qui représente une autre ville, Dunwich. Cette ville vient avec son problème&amp;nbsp;: une expérience qui libère l'Horreur de Dunwich, un monstre particulièrement difficile à battre. L'extension apporte aussi une règle de blessures et de folies intéressante qui permet à un investigateur de subir une affliction plutôt que de passer par la règle de base lorsqu'il perd tous ses points de vie ou de santé mentale. L'extension apporte aussi son lot de nouveaux investigateurs, alliés, objets et Grands Anciens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;À l'heure actuelle, il y a trois extensions supplémentaires en français et une en plus en anglais. Le jeu a une base de joueurs assez active, ce qui a donné lieu à des créations amateurs par-dessus le jeu. Faites un petit tour du côté du &lt;a href=&quot;http://wiki.horreuraarkham.fr/index.php?title=Accueil&quot;&gt;Wiki sur le jeu&lt;/a&gt; pour un aperçu de tout cela.&lt;/p&gt;


&lt;p&gt;Nul doute que ce jeu sortira encore de nombreuses fois lors des longues soirées jeux.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/07/13/Horreur-%C3%A0-Arkham#rev-pnote-206-1&quot; id=&quot;pnote-206-1&quot;&gt;1&lt;/a&gt;] dans les jeux basés sur le &lt;a href=&quot;http://fr.wikipedia.org/wiki/Mythe_de_Cthulhu&quot;&gt;Mythe de Cthulhu&lt;/a&gt;, le personnage aventurier confronté à l'horreur est classiquement nommé l'investigateur.&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
      </item>
    
  <item>
    <title>B81500 en Charentes</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/07/02/B81500-en-Charentes</link>
    <guid isPermaLink="false">urn:md5:881fde68d015a34b687c6306c4421552</guid>
    <pubDate>Sat, 03 Jul 2010 00:54:00 +0200</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Transports</category>
        <category>ter</category><category>train</category>    
    <description>    &lt;p&gt;Sur la ligne Angoulême - Royan, où l'on pouvait voir passer il y a encore deux ou trois ans des compositions éclectiques, un coup de balai a limité la variété.&lt;/p&gt;


&lt;p&gt;À la place, beaucoup de matériel neuf et quelques X2200 (ou peut-être une seule rame que j'ai vue plusieurs fois). C'est du matériel récent que j'ai pris en photo ici. La B81701, automotrice bi-mode diesel électrique, sans le pelliculage régional. En regardant un peu sur Internet, je vois cette rame, avec la B81702, photographiée sur une autre ligne. Peut-être une nouvelle arrivée donc.&lt;/p&gt;


&lt;p&gt;La photo est malheureusement un peu floue.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.puupuu.org/dotclear/public/trains/2010/20100621-B81701-Charentes-edit.jpeg&quot; title=&quot;B81701 sur la ligne Royan-Angoulème&quot;&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/trains/2010/.20100621-B81701-Charentes-edit_m.jpg&quot; alt=&quot;B81701 sur la ligne Royan-Angoulème&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;B81701 sur la ligne Royan-Angoulème, juin 2010&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>La saison des projets d'été</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/05/29/La-saison-des-projets-d-%C3%A9t%C3%A9</link>
    <guid isPermaLink="false">urn:md5:c9998a120ef975c2e21d347a0db724bc</guid>
    <pubDate>Sun, 30 May 2010 20:00:00 +0200</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Jeux</category>
        <category>jeu vidéo</category><category>programmation</category>    
    <description>&lt;p&gt;L'été arrive, et avec, ses longues vacances scolaires. La fin d'année étudiante se fait sentir et les idées de projets commencent à fleurir sur les différents forums de discussion. Tout ce temps libre jusqu'à la reprise semble ouvrir des horizons infinis. Enfin, les idées qui trottaient dans la tête alors qu'il fallait s'occuper de révisions vont pouvoir s'exprimer, être réalisées.&lt;/p&gt;


&lt;p&gt;Vous êtes de ces personnes là&amp;nbsp;? Excellent. Je ne peux que vous encourager.&lt;/p&gt;


&lt;p&gt;Dans cet article je fais quelques constatations suite à une dizaine d'étés à voir des projets venir et s'en aller. Faites-en ce que vous voulez.&lt;/p&gt;    &lt;p&gt;Les vacances d'été, il y a plusieurs manières d'en profiter. On peut aller se couvrir de coups de soleil à la plage, se rendre sourd en boite, faire le tour des fêtes de village, faire un boulot d'été,... ou encore développer l'idée de jeu vidéo qui nous trotte dans la tête depuis quelques mois.&lt;/p&gt;


&lt;p&gt;Et vous auriez tort de ne pas en profiter.&lt;/p&gt;


&lt;p&gt;Deux mois (un peu plus pour certains, un peu moins pour d'autres), c'est beaucoup. Et lorsque les vacances commencent, cela parait être une période suffisante pour changer le monde. À vrai dire, ça passe très vite. D'autant plus que cette période, faite pour décompresser, n'est pas propice à la concentration. Mais ce sont des vacances, et c'est fait pour ça.&lt;/p&gt;


&lt;p&gt;Au début des vacances, on peut avoir l'impression qu'une période indéfinie de liberté s'ouvre devant nous. En vérité, la fin de cette période est extrêmement bien définie&amp;nbsp;: elle s'arrêtera avec la reprise. Tous les ans, les projets que je vois démarrer en début ou milieu d'été sont faits avec le fervent espoir qu'avec l'inertie acquise pendant l'été, il sera facile de continuer en parallèle des cours.&lt;/p&gt;


&lt;p&gt;En pratique, c'est faux&amp;nbsp;: les projets s'arrêtent à l'instant de la reprise des cours. Les gens disparaissent des forums. Certains reviennent le temps de vacances d'automne ou d'hiver. La plupart pour se contenter de dire qu'ils n'ont plus de temps. Vous pensez que vous n'êtes pas dans ce cas, et que vous pourrez concilier études et projet personnel&amp;nbsp;? Tous ceux qui se sont arrêtés le pensaient aussi.&lt;/p&gt;


&lt;p&gt;Ce qu'il faut comprendre, c'est que les vacances scolaires commencent dans un état d'esprit très particulier&amp;nbsp;: on vient de quitter le rythme scolaire, un rythme demandeur en ressources de concentration, de temps passé. Et on arrive dans une période relativement libre de contraintes avec cet esprit. De l'énergie, du temps, de la motivation. L'idéal&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Mais rapidement, le rythme scolaire s'estompe. Les vacances, ce sont les vacances. On décompresse. Et puis il y a probablement d'autres projets qui trainent et finalement, aller prendre quelques coups de soleil à la plage, ce n'est pas si mal. Rapidement, on reporte à demain les activités liées au projet. L'esprit a besoin de se reposer. Et puis il y a le temps. Et le temps passe.&lt;/p&gt;


&lt;p&gt;En résumé&amp;nbsp;: l'implication dans le projet, que l'on peut croire indéfectible, de fer, inépuisable en début de vacances, va baisser avec le temps. Il va falloir une bonne discipline pour garder le rythme d'avancé du projet.&lt;/p&gt;


&lt;p&gt;N'attendez pas non plus de réunir une équipe autour de vous, d'avoir les graphismes du jeu fini avant de démarrer, ou tout autre excuse pour ne pas démarrer. C'est le meilleur moyen de ne rien faire. L'année dernière, lors d'un des ateliers du &lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2009/12/07/Gamecamp-Paris-1&quot;&gt;GameCamp Paris&lt;/a&gt; avec pour thème les projets personnels, l'une des constatations était que la grande majorité des projets amateurs qui réussissaient étaient porté par une personne qui aurait pu faire 80% à 100% du boulot tout seul.&lt;/p&gt;


&lt;p&gt;Il y a plusieurs problèmes à constituer une équipe pour votre projet personnel d'été. Le premier est dans l'énoncé&amp;nbsp;: votre projet est personnel. Ce sont vos idées, vous y tenez. Vous allez convaincre d'autres personnes sur des généralités et celles-ci ne seront probablement pas la même motivation que la votre. De plus, ces personnes n'ont généralement pas le même planning ni les mêmes priorités que vous.&lt;/p&gt;


&lt;p&gt;Beaucoup de projets d'été se retrouvent donc avec des personnes très motivées dans les premiers jours mais qui doivent partir en voyage, qui ont un boulot d'été, qui finalement préfèrent monter un groupe de musique, qui trouvent l'âme sœur,...&lt;/p&gt;


&lt;p&gt;La cohésion du groupe va baisser encore plus vite et être un chef de projet demande beaucoup d'efforts. Vous risquez donc de passer l'été à coordonner des personnes qui n'oseront jamais vous dire que finalement, elles ne tiennent pas tant à vos idées que ça. Pire, qui promettent qu'elles seront disponibles dès la fin de l'été. Ce qui, on l'a vu au-dessus, est absolument impossible, même si le mensonge est par ignorance. Ce temps sera du temps perdu pour votre projet.&lt;/p&gt;


&lt;p&gt;Si vous devez partir sur un projet en équipe, que ce soit une petite équipe, que ce soit une ou deux personnes que vous connaissez, avec qui vous avez déjà discuté, avec qui vous avez déjà échangé des petits travaux, des projets. Des gens de confiance. Pas rencontrés ou recrutés au détour d'un forum ou d'un canal de discussion. L'équipe doit être déjà formée et prête dès le début des vacances.&lt;/p&gt;


&lt;p&gt;Sinon, allez-y seul&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Vous lisez toujours, vous êtes toujours motivés, mais vous n'avez pas encore ignoré d'un geste de la main le contenu de l'article jusqu'ici&amp;nbsp;? Alors continuons.&lt;/p&gt;


&lt;p&gt;Une chose importante à définir dès le début est le but de votre projet. Voulez-vous tâtonner dans divers domaines pour vous faire de l'expérience&amp;nbsp;? Voulez-vous utiliser vos connaissance pour avoir un jeu abouti&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Ces deux buts sont difficilement conciliables. Il est très difficile d'apprendre et de produire simultanément. Si vous avez un projet de jeu fini mais considérez n'avoir pas les connaissances nécessaires, séparez votre projet en deux. Apprenez dans un premier temps ce qui vous semble nécessaire. Rassemblez les informations, affutez vos compétences. Ensuite, lancez vous dans la production du jeu en elle-même.&lt;/p&gt;


&lt;p&gt;Mener un projet de jeu complet demande des compétences diverses&amp;nbsp;: programmation ou utilisation d'un logiciel de «&amp;nbsp;game making », game design, graphismes, son,... N'espérez pas, pour les raisons évoquée au-dessus, trouver les compétences qui vous manquent chez d'autres. Sachez tout faire (même mal) tout seul. Ne vous laissez pas bloquer pour la raison que vous ne savez pas dessiner&amp;nbsp;: faite avec des graphismes du pauvre, moches, ou essayez de vous améliorer sur ce point. Si vous attendez après un graphiste pour vous motiver à avancer, c'est que vous n'êtes pas assez motivé.&lt;/p&gt;


&lt;p&gt;À quoi va ressembler votre jeu fini&amp;nbsp;? Je ne sais pas. Mais si vous tenez à ce qu'il soit terminé, soyez humble. On ne fait pas un MMORPG en deux mois, même avec la meilleur volonté du monde. Et pourtant, chaque année, ce sont des dizaines de projets de MMORPG qui sont postées dans les forums. Tous ces MMORPGs ont les meilleurs idées du monde, sont originaux, font ce que les autres ne font pas. Vous comprendrez si vous avez bien tout lu jusque là que ce n'est pas un projet adéquat à une période d'été.&lt;/p&gt;


&lt;p&gt;Non, soyez humble.&lt;/p&gt;


&lt;p&gt;Un projet humble permet d'avoir en fin d'été, si ce n'est un projet terminé, au moins un projet bien avancé. Un projet bien avancé peut se reprendre aux vacances suivantes.&lt;/p&gt;


&lt;p&gt;Un projet bien avancé peut aussi prétendre enfin à intéresser d'autres personnes constituant une équipe.&lt;/p&gt;


&lt;p&gt;La première chose à faire, donc, est de mettre vos idées à plat, de considérer ce que vous pouvez et faire ou non et démarrer&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Et venez relire ce billet à la fin des vacances.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Jeux sous Linux, est-ce si difficile ?</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile</link>
    <guid isPermaLink="false">urn:md5:68c9cdfd797356a3328e9930e06f8eec</guid>
    <pubDate>Wed, 26 May 2010 21:00:00 +0200</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
        <category>jeu</category><category>jeu vidéo</category><category>linux</category><category>programmation</category>    
    <description>&lt;p&gt;Parfois, au détour d'un article sur le jeu vidéo, je lis des phrases du type les «&amp;nbsp;développeurs font très peu de jeux sous Linux car la plateforme est difficile à programmer ». Comme ça, sans se perdre dans les détails de la difficulté. Et parfois même dans des magazines ou des sites de bonne qualité... quand ils parlent jeu. La raison du manque de jeux natifs sous Linux semble donc être d'ordre technique. Voyons ça de plus près.&lt;/p&gt;    &lt;p&gt;Définissons un peu le contexte&amp;nbsp;: nous parlons ici de jeux natifs, c'est-à-dire que l'on installe sur le disque dur et qu'on lance localement et non des jeux de technologies web, comme les jeux Flash &lt;sup&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile#pnote-203-1&quot; id=&quot;rev-pnote-203-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;Je vais passer en revue différents domaines de la création d'un jeu, d'un point de vue technique, pour voir où cela pourrait coincer.&lt;/p&gt;


&lt;h2&gt;Le hardware&lt;/h2&gt;


&lt;p&gt;Mentionner Linux est assez vague, Linux est techniquement le nom d'un noyau de système d'exploitation qui peut se lancer sur de nombreuses plateformes, avec du hardware très différent. Cependant, lorsque l'on mentionne Linux dans un contexte d'ordinateur personnel, et encore plus lorsque l'on parle de jeux, il y a abus de langage. Lorsque ces articles parlent de Linux, ils parlent en fait des systèmes d'exploitation basées sur le noyau Linux (on appelle ça des distributions) utilisées sur un ordinateur personne de type &quot;PC&quot;.&lt;/p&gt;


&lt;p&gt;Autrement dit, on parle ici de Linux tournant sur du hardware qui pourrait faire tourner Windows.&lt;/p&gt;


&lt;p&gt;Même si ces deux systèmes d'exploitation ont une manière de voir leur environnement différente, il reste que, derrière, ce sont donc les mêmes périphériques avec les mêmes normes techniques, les mêmes processeurs, les mêmes cartes graphique et mêmes cartes son.&lt;/p&gt;


&lt;p&gt;Du fait du peu de support de certains constructeurs au niveau des drivers, il y a même moins de périphériques compatibles Linux que compatibles Windows. On verra plus loin que c'est un avantage du point de vue du développeur.&lt;/p&gt;


&lt;h3&gt;Accéder au hardware&lt;/h3&gt;


&lt;p&gt;Si le hardware est sensiblement le même sous un PC sous Windows ou Linux, cela peut être la manière d'y accéder qui gêne. En effet, il n'y a par exemple pas DirectX(R) sous Linux, du moins pas nativement. Sous MacOS-X ou Playstation 3 non plus. Ce qui ne gêne pas certains développeurs de développer des jeux sur ces plateformes.&lt;/p&gt;


&lt;p&gt;Forcément, un développeur qui choisi une solution technique fortement ancrée pour une plateforme spécifique va avoir une certaine difficulté à faire tourner son jeu sur une autre plateforme. Mais c'est un choix, qui peut d'ailleurs être tout à fait judicieux, pas une obligation.&lt;/p&gt;


&lt;p&gt;On pourrait alors arguer qu'il est plus difficile de programmer un jeu sous Linux car les environnements dédiés jeu sont plus nombreux et plus facile à mettre en œuvre sous Windows. C'est un argument recevable pour les petites productions qui vont développer sur du XNA ou du Unity3d. Si je doute que XNA permette de faire un jour des jeux sous Linux, cela ne doit poser aucun soucis technique à Unity3d, qui cible déjà des plateformes bien plus variées qu'un simple changement d'OS sur un même matériel.&lt;/p&gt;


&lt;p&gt;D'autres plateformes, comme Unreal, ciblent déjà Linux.&lt;/p&gt;


&lt;h3&gt;Les assets&lt;/h3&gt;


&lt;p&gt;On pourra noter aussi que, puisque seul la couche logicielle change, deux versions Linux et Windows d'un même jeu peut partager ses assets (textures, meshs, sons,...). Les performances seront similaires et il est de toute façon d'usage dans le monde du jeu PC de permettre à l'utilisateur de régler le niveau de détail du jeu, sachant qu'il tournera sur des machines à des puissances très différentes.&lt;/p&gt;


&lt;p&gt;C'est à comparer avec un jeu commun entre une console de salon et un PC, voire entre deux consoles de salon, où il n'est pas rare de devoir adapter les assets pour tirer le meilleur parti des différences de plateforme.&lt;/p&gt;


&lt;h3&gt;Conclusion sur le hardware&lt;/h3&gt;


&lt;p&gt;Si un jeu Linux est plus difficile à programmer qu'un jeu Windows, on vient de voir que cela ne venait pas du hardware. Programmer un jeu sous console, et encore plus multi-plateforme PC/Console, est bien plus complexe. Et de nombreux développeurs le font quand même.&lt;/p&gt;


&lt;p&gt;Cherchons ailleurs.&lt;/p&gt;


&lt;h2&gt;Compétences logiciel&lt;/h2&gt;


&lt;p&gt;Puisque le matériel n'est pas en cause, regardons du côté logiciel. Il y a bien sûr de quoi programmer le hardware sous Linux&amp;nbsp;: des jeux existent, même s'ils sont peu nombreux. Peut-être s'agit-il de manque de compétences pour programmer la plateforme&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Là encore, je dis non. D'abord car les API disponibles sous Linux sont souvent déjà connues des développeurs (OpenGL ou FMOD par exemple) et qu'ensuite, encore une fois, des développeurs qui sont capables de réapprendre à chaque nouvelle génération de console un matériel et des API nouvelles peuvent très bien apprendre à programmer sous Linux.&lt;/p&gt;


&lt;p&gt;Je n'ai pas de chiffres, mais quelque chose me dit qu'il y a bien plus de programmeurs au fait des technologies utilisées sous Linux que de programmeurs sur console.&lt;/p&gt;


&lt;h2&gt;Autres raisons&lt;/h2&gt;


&lt;h3&gt;Le temps&lt;/h3&gt;


&lt;p&gt;On ne peut pas le nier&amp;nbsp;: développer pour une plateforme en plus, en considérant que la version maitresse est la version Windows, prend du temps. Il y a deux manières de faire une version multi-plateforme&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;développer les versions simultanément&amp;nbsp;: beaucoup plus facile car les problèmes sont détectés sur le moment, la méthode demande cependant plus d'investissement.&lt;/li&gt;
&lt;li&gt;développer une version, puis l'autre&amp;nbsp;: cela peut amener la seconde version à hériter de bugs cachés dans la première version et demander un peu plus de travail&amp;nbsp;; l'avantage étant que l'investissement est décalé par rapport au développement de la première version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le temps de développement supplémentaire est-il si gros&amp;nbsp;? Rappelons encore que nous sommes là sur une même machine. Seule la couche logicielle change. Si les bons choix architecturaux et technologiques sont fait dans la version initiale en prévision de son portage, alors le temps d'adaptation à l'autre plateforme n'est pas si énorme.&lt;/p&gt;


&lt;p&gt;À titre d'exemple, j'ai adapté pour Linux un jeu Windows. Je n'ai pas vraiment compté le temps que j'y ai passé, mais cela n'a pas dépassé 10 heures (j'évalue plutôt à 7 heures, temps de tests compris). Ce jeu était déjà adapté au multi-plateforme et l'adaptation consistait à implémenter quelques fonctions et recompiler le tout. Quelques bugs sont apparus (méthode numéros deux ci-dessus) et ont fait que cela a pris un peu de temps. L'adaptation n'est pas parfaite&amp;nbsp;: il resterait à faire un package avec gestion de dépendances, méthode préférée sous les distributions Linux au simple .zip que j'ai livré. Il reste aussi quelques soucis qualitatifs à l'installation.&lt;/p&gt;


&lt;p&gt;Il reste probablement 2 ou 3 heures à passer dessus.&lt;/p&gt;


&lt;p&gt;10 heures... 10 heures pour un programmeur seul. Ce n'est pas un gros programme, mais cela donne une idée du peu de travail nécessaire.&lt;/p&gt;


&lt;p&gt;En fait, et cela se ressent dans les problème qualitatifs que j'ai mentionné, ce qui a manqué est principalement du test&amp;nbsp;: j'ai testé le jeu sur deux ordinateurs, il a été testé par quelques personnes qui ont bien voulu faire un retour. Cependant, il manquait une vraie phase de tests sur différents matériels et différentes distributions.&lt;/p&gt;


&lt;p&gt;Et c'est cela qui prendrait du temps pour une adaptation complète. Et le test sur ordinateur personnel est long car il nécessite beaucoup de tests matériel, ce qui n'est pas le cas sur console.&lt;/p&gt;


&lt;p&gt;En cela, oui, adapter un jeu sous Linux est plus long qu'adapter un jeu sur console. À balancer avec le temps de développement, qui lui, est plus court.&lt;/p&gt;


&lt;p&gt;Et c'est là, je l'évoquais tout à l'heure, que le matériel plus restreint supporté par les distributions Linux est un avantage. Moins de matériel à tester.&lt;sup&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile#pnote-203-2&quot; id=&quot;rev-pnote-203-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;


&lt;h3&gt;Diversité des distributions&lt;/h3&gt;


&lt;p&gt;Comme je l'évoquais au début, Linux est un abus de langage pour désigner de nombreux systèmes d'exploitation ayant pour base commune le noyau Linux. Cependant, cet abus de langage est assez limité&amp;nbsp;: on ne désigne pas Android sous le nom de Linux, pourtant, s'en est un. Le noyau Linux est présent dans de nombreux matériels sans que leurs utilisateurs soient au courant.&lt;/p&gt;


&lt;p&gt;Finalement, sont appelés Linux un nombre restreint de produits. Restreint mais nombreux tout de même&amp;nbsp;: Debian, Red Hat, Ubuntu, Suse, Slakware,... La &lt;a href=&quot;http://fr.wikipedia.org/wiki/Distribution_Linux&quot;&gt;page sur Wikipedia&lt;/a&gt; présente même un arbre généalogique des différentes distributions.&lt;/p&gt;


&lt;p&gt;Cela fait peur&amp;nbsp;: est-ce que le programme tournera de la même manière sur toutes les distributions&amp;nbsp;? Il y a des solutions techniques, plus ou moins élégantes, mais dans les grandes lignes, cela ne pose pas vraiment de problèmes. La difficulté se situe à nouveau dans le test, qui sera multiplié par le nombre de distributions supportées. Elle se situera aussi éventuellement dans l'intégration naturelle à une distribution, l'histoire de package que je citais au début.&lt;/p&gt;


&lt;p&gt;À noter que dans le monde Windows, le problème de disparité des versions existe aussi&amp;nbsp;: toutes les versions de Windows ne se comportent pas de la même manière. Le monde Windows a réglé le problème&amp;nbsp;: à une époque donné, un jeu n'est généralement compatible qu'avec la dernière version grand public et sa précédente.&lt;sup&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile#pnote-203-3&quot; id=&quot;rev-pnote-203-3&quot;&gt;3&lt;/a&gt;]&lt;/sup&gt; Peut-être qu'il tournera avec d'autres versions. Cela n'est juste pas garanti.&lt;/p&gt;


&lt;p&gt;On peut imaginer la même chose dans le monde Linux&amp;nbsp;: un développeur peut garantir le fonctionnement pour Ubuntu et toucher ainsi la grande majorité des utilisateurs grand public, éventuellement une autre grande distribution. Sur le reste... et bien cela fonctionnera peut-être.&lt;/p&gt;


&lt;p&gt;D'autres plateforme ont des éclatements bien pire&amp;nbsp;: dans les téléphones portables, il faut à peu près faire une version du jeu par modèle de téléphone. Même sur des plateforme concentrées comme iPhone ou Android, les divers matériels et les diverses versions obligent à gérer la diversité des plateformes.&lt;/p&gt;


&lt;p&gt;Là encore, finalement, tout n'est question que de temps, de volonté de faire. Il n'y a pas d'obstacle technique insurmontable, et aucun qu'on ne trouve déjà ailleurs.&lt;/p&gt;


&lt;h2&gt;Les outils&lt;/h2&gt;


&lt;p&gt;Le sujet est un peu annexe, car lorsque l'on programme pour console, on ne programme pas &lt;em&gt;sur&lt;/em&gt; console. Et il n'est pas obligatoire lorsque l'on programme pour Linux de programmer &lt;em&gt;sur&lt;/em&gt; Linux.&lt;/p&gt;


&lt;p&gt;Mais cela serait dommage de s'en passer.&lt;/p&gt;


&lt;p&gt;Cependant, lorsque je parle de programmer sur Linux à certains programmeurs, j'ai parfois droit à des yeux ronds. Particulièrement chez les plus anciens qui ont gardé des souvenirs visiblement douloureux de leurs études à programmer avec des outils vus comme rustiques.&lt;/p&gt;


&lt;p&gt;Autrement dit&amp;nbsp;: il n'y a pas Visual Studio sous Linux, comment on va faire&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Heureusement, sur Linux sont disponibles de nombreux outils de développement. Si l'on veut quelque chose d'aussi peu pratique que Visual Studio &lt;sup&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile#pnote-203-4&quot; id=&quot;rev-pnote-203-4&quot;&gt;4&lt;/a&gt;]&lt;/sup&gt;, on peut retrouver une sorte de clone avec Code::Blocks. Mais on peut aussi aller vers Eclipse, pour citer un autre environnement bien connu, ainsi que des solutions libres ou propriétaires de différents types. Il y en a pour tous les goûts.&lt;/p&gt;


&lt;p&gt;Et non, vous n'êtes pas obligés d'utiliser gdb en ligne de commande pour débugger.&lt;/p&gt;


&lt;h2&gt;Mais alors&amp;nbsp;?&lt;/h2&gt;


&lt;p&gt;Si tout à l'air si simple et si rose dans le développement de jeux sous Linux, pourquoi y en a-t-il si peu&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Cet article, qui est écrit en réaction à la phrase «&amp;nbsp;la plateforme est difficile à programmer », a tenté de montrer brièvement que la technique n'était pas en cause. Les programmeurs de jeux vidéo ont l'habitude de résoudre de problèmes et de programmer sous des plateformes bien plus complexes qu'un simple changement de couche logicielle sur une plateforme PC.&lt;/p&gt;


&lt;p&gt;C'est ailleurs qu'il faut chercher l'absence de gros titres sur Linux. Alors qu'on y trouve de plus en plus d'indépendants.&lt;/p&gt;


&lt;p&gt;Tout simplement, le retour sur investissement n'est pas évident. Il n'est même probablement pas calculé par la plupart des éditeurs. La plateforme Windows est une plateforme très piratée et je pense qu'il y a une crainte que, pour une même plateforme matérielle, la situation soit la même sous Linux.&lt;/p&gt;


&lt;p&gt;Les joueurs étant peu nombreux sous Linux (puisqu'il y a peu de jeu&amp;nbsp;; problème de l'œuf et de la poule), ce marché de niche est délicat à négocier, particulièrement si le développement conjoint ou le portage du jeu coûte cher.&lt;/p&gt;


&lt;p&gt;Pourtant, les sorties de World of Goo l'année dernière et du Humble Indie Bundle cette année ont montré deux choses&amp;nbsp;: il y a un public joueur et demandeur qui utilise Linux d'une part et ce public est près à payer d'autre part. En effet, quand World of Goo est passé en &quot;Payez ce que vous voulez&quot;, les statistiques ont montré que les joueurs Linux avaient en moyenne dépensé plus pour le titre. La même chose a été constatée sur l'Humbel Indie Bundle.&lt;/p&gt;


&lt;p&gt;On pourra penser que la rareté du jeu sous Linux provoque ce paiement plus fort. Peut-être. Mais on voit surtout qu'il y a un marché qui ne demande qu'à s'emballer.&lt;/p&gt;


&lt;p&gt;Qui fera le premier pas&amp;nbsp;? Des tentatives d'éditions ont été faites pour les jeux sous Linux. Quelques gros jeux, comme Unreal ou Quake, ont été sortis dessus&lt;sup&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile#pnote-203-5&quot; id=&quot;rev-pnote-203-5&quot;&gt;5&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;Ce qu'il manque, à mon avis, et qui pourrait rassurer les éditeurs sur les risques de piratage sur un marché de niche, c'est une plateforme de vente online. Steam sous Linux par exemple&amp;nbsp;? Après tout, Steam est à présent disponible sur MacOS-X, une autre plateforme traditionnellement pauvre en jeu vidéo.&lt;/p&gt;


&lt;p&gt;Même si j'aimerais qu'un concurrent sérieux à Steam apparaisse, pour éviter les risques de monopole qui seraient dommageables, je verrai l'arrivée de Steam sous Linux d'un très bon œil. C'est le genre de choses qui me feraient jouer à nouveau sur PC.&lt;/p&gt;


&lt;p&gt;Messieurs les éditeurs, à vous&amp;nbsp;! Ne vous inquiétez pas, les studios de production sauront faire.&lt;/p&gt;


&lt;p&gt;En guise de continuité, je vous propose d'écouter le podcast &lt;a href=&quot;http://www.creative-patterns.com/2010/05/19/du-pain-et-des-jeux-episode-01/&quot;&gt;Du pain et des jeux&lt;/a&gt; épisode 1 où l'on retrouvera un passage sur Steam sur Mac avec une évocation d'un éventuel Steam sur Linux.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile#rev-pnote-203-1&quot; id=&quot;pnote-203-1&quot;&gt;1&lt;/a&gt;] Ces derniers sont à présent bien supportés sous Linux, pour peu que l'on installe le plugin Flash officiel&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile#rev-pnote-203-2&quot; id=&quot;pnote-203-2&quot;&gt;2&lt;/a&gt;] Tout ce que l'on peut espérer, finalement, c'est un cercle vertueux où des joueurs supplémentaires sous Linux incitent les constructeurs à livrer des drivers pour plus de matériel.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile#rev-pnote-203-3&quot; id=&quot;pnote-203-3&quot;&gt;3&lt;/a&gt;] À une certaine époque, Windows Me a tout simplement été boudé et n'était pas supporté par la plupart des jeux, alors que c'était la dernière version.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile#rev-pnote-203-4&quot; id=&quot;pnote-203-4&quot;&gt;4&lt;/a&gt;] j'ai longtemps hésité à laisser ça dans l'article, mais finalement...&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/26/Jeux-sous-Linux%2C-est-ce-si-difficile#rev-pnote-203-5&quot; id=&quot;pnote-203-5&quot;&gt;5&lt;/a&gt;] Qui sont aussi des vitrines technologiques dans ces deux cas&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
      </item>
    
  <item>
    <title>Frein à la programmation : l'ajout de fichier</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/05/05/Frein-%C3%A0-la-programmation-%3A-l-ajout-de-fichier</link>
    <guid isPermaLink="false">urn:md5:20471ee64e8c35440aa597746041e93d</guid>
    <pubDate>Wed, 05 May 2010 22:00:00 +0200</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
        <category>informatique</category><category>programmation</category>    
    <description>&lt;p&gt;Lorsque l'on regarde l'ensemble des actions que doit effectuer un programmeur pour faire son travail et que l'on réfléchi à ce qui pourrait être amélioré pour lui faciliter la vie, on tombe sur des petites choses qui n'ont l'air de rien et qui pourtant ont de grosses répercussions.&lt;/p&gt;


&lt;p&gt;L'ajout d'un fichier à un projet en est une.&lt;/p&gt;    &lt;p&gt;Lorsqu'un programmeur ajoute un fichier à un projet auquel il participe, voici généralement ce qui doit être fait&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;créer le fichier sur le disque,&lt;/li&gt;
&lt;li&gt;l'ajouter à la solution,&lt;/li&gt;
&lt;li&gt;l'ajouter au gestionnaire de version,&lt;/li&gt;
&lt;li&gt;l'ouvrir et en écrire le squelette.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces actions peuvent être regroupées. L'idéal est qu'elles le soient. L'idéal serait d'utiliser un éditeur qui ajoutera le fichier dans la solution, l'écrira _au bon endroit_ sur le disque, l'ajoutera au gestionnaire de version et écrira un squelette.&lt;/p&gt;


&lt;p&gt;C'est le cas lorsque j'utilise &lt;a href=&quot;http://www.eclipse.org/&quot;&gt;Eclipse&lt;/a&gt; sur un &lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/01/07/Android-%3A-premiers-pas&quot; hreflang=&quot;fr&quot;&gt;petit projet personnel&lt;/a&gt; en Java. Les manipulations restent un peu trop nombreuses à mon goût, mais on s'approche de l'idéal.&lt;/p&gt;


&lt;p&gt;Cependant, dans la quasi totalité des projets auxquels j'ai pu participer ou que j'ai pu voir en action, on est loin de l'idéal&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;la création depuis l'IDE d'un fichier n'est pas reflété correctement sur le disque, ce qui oblige à créer le fichier puis à l'intégrer dans le projet (à ce propos, voir &lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2009/10/23/Compilation-et-notion-de-projet&quot;&gt;mon article sur le sujet&lt;/a&gt;)&amp;nbsp;;&lt;/li&gt;
&lt;li&gt;le connecteur entre l'IDE et le gestionnaire de version ne fonctionne pas très bien&amp;nbsp;: cela implique que les programmeurs se battent contre le plugins et ne l'utilisent pas à 100%&amp;nbsp;;&lt;/li&gt;
&lt;li&gt;la création de squelettes de fichiers se fait généralement par copier/coller, ce qui induit parfois (et trop souvent) des erreurs de nommages ou, en C++, des erreurs de gardes d'inclusions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En C++, le travail de création d'un fichier est au moins doublé (entêtes et sources) voire triplé (fichier séparé pour les inlines).&lt;/p&gt;


&lt;p&gt;Si vous pratiquez le &lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2008/12/04/117-avoir-confiance-en-son-code-et-en-celui-des-autres&quot;&gt;TDD&lt;/a&gt;, alors il faudra aussi créer le fichier de tests associé.&lt;/p&gt;


&lt;p&gt;Quels sont les problèmes que cela entraîne&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Si une de ces étapes est manquée, le projet ne compile plus&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;la création du ou des fichiers, bien entendu, est obligatoire.&lt;/li&gt;
&lt;li&gt;oublier de l'ajouter à la solution ne fera pas prendre en compte le fichier&amp;nbsp;: j'ai déjà eu l'occasion de voir des fichiers compilés à part, utilisés depuis le reste du programme, archivés... sans avoir compilé le projet en entier. Cela est particulièrement vrai si un même fichier est utilisé par plusieurs projets.&lt;/li&gt;
&lt;li&gt;oublier de l'ajouter au dépôt&amp;nbsp;: tout se passera bien jusqu'à ce que la machine de build ou un collègue reprenne le code. À noter une version voisine&amp;nbsp;: les fichiers sont bien archivés, mais pas le projet modifié, erreur classique lorsque l'IDE utilisé nécessite une action supplémentaire explicite pour sauver la nouvelle version du projet.&lt;/li&gt;
&lt;li&gt;bien évidemment, ne rien mettre dans les fichiers n'avancera pas à grand chose. À noter qu'au moins, il n'y aura pas de soucis. Ici, le problème viendra plutôt d'un copier/coller malencontreux qui ne posera pas de problème sur la machine du programmeur mais qui pourra en poser lors du passage sur la machine (ordre de compilation différent, projet utilisé dans un autre contexte).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Toutes ces étapes prennent du temps et les risques d'erreurs sont nombreux.&lt;/p&gt;


&lt;p&gt;Puisqu'un programmeur veut généralement développer en un minimum de temps, ces actions sont considérées comme un frein et la tentation est grande de les éviter. Mon expérience me montre que beaucoup (trop) de programmeurs se laissent aller à cette tentation.&lt;/p&gt;


&lt;p&gt;Dans les faits, éviter de créer un nouveau fichier entraîne des conséquences en cascade&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;puisque ajouter un fichier est long et source d'erreur, s'il y a le choix de ne pas en ajouter, ne pas l'ajouter,&lt;/li&gt;
&lt;li&gt;de nouvelles fonctionnalités qui ont besoin d'une nouvelle classe se voient insérées dans un fichier dont la classe est connexe,&lt;/li&gt;
&lt;li&gt;puisque les fonctionnalités sont dans le même fichier, l'étape d'après est de s'insérer directement dans une classe existante.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Au final, moins de classes, des fichiers plus gros, des problèmes de dépendances entre système, une architecture qui s'écroule&lt;sup&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/05/Frein-%C3%A0-la-programmation-%3A-l-ajout-de-fichier#pnote-202-1&quot; id=&quot;rev-pnote-202-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;Tout cela à cause d'une simple petite chose&amp;nbsp;: la création d'un fichier dans un projet n'est pas simple&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;C'est un point à ne pas négliger si vous mettez en place un projet ou que vous en maintenez un. Pensez à tout ce qui peut aider un programmeur à ajouter un nouveau fichier dans le projet.&lt;/p&gt;


&lt;p&gt;Quelle est la solution idéale&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;J'en ai soufflé en mot au début. L'idéal est bien entendu que le programmeur ait un moyen très simple (une boite de dialogue et un bouton de validation) d'ajouter un fichier dans le projet. Eclipse en mode Java s'en approche, il ne me manquerait pas grand chose&lt;sup&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/05/Frein-%C3%A0-la-programmation-%3A-l-ajout-de-fichier#pnote-202-2&quot; id=&quot;rev-pnote-202-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;La boite de dialogue, à partir des renseignements donnés, doit pouvoir&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;créer le ou les fichiers au bon endroit en respectant l'architecture physique du projet.&lt;/li&gt;
&lt;li&gt;remplir les fichiers avec le minimum&amp;nbsp;: entêtes légales si vous en avez, inclusion de l'entête correspondant au source et inclusion éventuelle de pre-compiled header en C++, écriture des espaces de noms, d'un squelette de classe en fonction des choix de la boite de dialogue.&lt;/li&gt;
&lt;li&gt;ajouter les fichiers dans la solution&amp;nbsp;; bien entendu, si votre solution est dynamiquement générée depuis le contenu du disque, cette action est gratuite. Avec un IDE, ce n'est pas forcément évident, sauf si la méthode de création est intégrée à l'IDE, au prix d'une dépendance forte avec l'utilisation de cet IDE.&lt;/li&gt;
&lt;li&gt;ajouter les fichiers au gestionnaire de version&amp;nbsp;; si votre gestionnaire de version scan les nouveautés automatiquement (subversion, bazaar, git,...) cela ne demande pas d'effort, dans d'autres cas (Perforce,...) cela est une étape obligatoire pour palier aux défaillances de certains connecteurs d'IDE.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J'ai eu l'occasion de mettre en place un tel système pour un projet personnel, j'ai aussi mis en place une partie de ce système (pas d'intégration avec l'IDE utilisé) sur un projet professionnel.&lt;/p&gt;


&lt;p&gt;Dans mon cas, le gain de temps m'a aidé à me concentrer sur l'écriture du programme plutôt que sur l'écriture des détails (et certains langages, comme le C++, sont bavards et demandent beaucoup d'à côté avant de pouvoir écrire une première ligne qui fait réellement quelque chose).&lt;/p&gt;


&lt;p&gt;Dans le cas du projet professionnel, j'ai eu des retours positifs des utilisateurs et j'ai pu constater une chute des erreurs de copier/coller dans les en-têtes ainsi que moins de réluctance à créer un fichier par classe et au bon endroit de surcroit.&lt;/p&gt;


&lt;p&gt;Je vous conseille donc de vous attacher à cette petite chose dans la vie d'un programmeur qu'est la création d'un nouveau fichier.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/05/Frein-%C3%A0-la-programmation-%3A-l-ajout-de-fichier#rev-pnote-202-1&quot; id=&quot;pnote-202-1&quot;&gt;1&lt;/a&gt;] pour le cas où une architecture était en place.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.puupuu.org/dotclear/index.php?post/2010/05/05/Frein-%C3%A0-la-programmation-%3A-l-ajout-de-fichier#rev-pnote-202-2&quot; id=&quot;pnote-202-2&quot;&gt;2&lt;/a&gt;] la boite de dialogue par défaut est un peu trop touffue et la création automatique du fichier de tests ne correspond pas par défaut à mon architecture physique, ce qui m'oblige à éditer plusieurs champs toujours de la même manière&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
      </item>
    
  <item>
    <title>Pommes, Manchots et Allumettes</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/04/26/Pommes%2C-Manchots-et-Allumettes</link>
    <guid isPermaLink="false">urn:md5:5e93ef12b3e7089dec19daa212202d34</guid>
    <pubDate>Mon, 26 Apr 2010 23:55:00 +0200</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Jeux</category>
        <category>jeu</category><category>jeu de plateau</category><category>présentation de jeu</category>    
    <description>&lt;p&gt;Le &lt;a href=&quot;http://fr.wikipedia.org/wiki/Jeu_de_Nim&quot; hreflang=&quot;fr&quot;&gt;jeu de nim&lt;/a&gt; fait partie de ces jeux simples dont les mécanismes forment les bases de bon nombres d'autres jeu. Il peut se jouer de plusieurs manières différentes, mais le mécanismes est celui-ci&amp;nbsp;: deux joueurs alternativement prennent d'un ensemble d'objet 1 à 3 éléments, celui qui joue le dernier coup (plus d'éléments restant) est le gagnant (ou le perdant, suivant la variante).&lt;/p&gt;


&lt;p&gt;Ayant découvert le jeu avec des ensembles d'allumettes, le jeu reste pour moi le «&amp;nbsp;jeu des allumettes ». Je ne dois pas être le seul car lorsque je parle du jeu de Nim avec quelqu'un et que je ne le vois pas comprendre, je parle alors du jeu des allumettes et je suis compris.&lt;/p&gt;


&lt;p&gt;Le mécanisme du jeu de nim faisant partie des bases, on le retrouve sous diverses formes dans les jeux. Et deux parties de deux jeux jouées hier me font écrire ce billet.&lt;/p&gt;    &lt;h2&gt;22 pommes&lt;/h2&gt;


&lt;p&gt;Dans &lt;a href=&quot;http://trictrac.net/index.php3?id=jeux&amp;amp;rub=ludotheque&amp;amp;inf=cat&amp;amp;image2.x=&amp;amp;image2.y=&amp;amp;choix=22+pommes&quot; hreflang=&quot;fr&quot;&gt;22 pommes&lt;/a&gt;, chacun des deux joueurs doit ramasser exactement 22 pommes (d'où le nom). Mais pas n'importe comment&amp;nbsp;: 11 pommes rouges et 11 pommes vertes exactement.&lt;/p&gt;


&lt;p&gt;Le principe du jeu de nim se retrouve assez facilement&amp;nbsp;: les deux joueurs se partagent le même fermier et à son tour, un joueur est obligé de prendre des pommes. 1, 2, 3 ou 5. Si la prise amène un joueur a 11 pommes de chaque couleur, il gagne la partie. Si la prise amène un joueur a plus de 11 pommes d'une même couleur, il ne pourra pas gagner, il a donc perdu. Tout comme au jeu de nim, il n'y a pas d'égalité possible.&lt;/p&gt;


&lt;p&gt;Là où 22 pommes s'éloigne du jeu de base, c'est dans le mécanisme de prise. En effet, le jeu de nim n'est pas très intéressant lorsque l'on connait le truc. Si les deux joueurs connaissent le truc, alors le premier à jouer détermine qui va gagner et perdre (voir l'article Wikipedia à ce sujet).&lt;/p&gt;


&lt;p&gt;Dans 22 pommes, on ne choisit pas directement le nombre de pommes prises&amp;nbsp;: le choix est limité par le déplacement du fermier, qui ne peut se déplacer qu'horizontalement ou verticalement dans un verger de 5 par 5 arbres (jetons) et est obligé de s'arrêter sur un jeton, que le joueur prend.&lt;/p&gt;


&lt;p&gt;Comme les deux joueurs se partagent le même fermier, chacun d'eux doit prévoir son déplacement non seulement en fonction des pommes dont il a besoin, mais aussi pour limiter les choix de l'autre joueur et l'obliger à dépasser les 11 pommes d'une couleur.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.puupuu.org/dotclear/public/jeux/plateau/aperitif/22Pommes.jpeg&quot; title=&quot;22 Pommes&quot;&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/jeux/plateau/aperitif/.22Pommes_m.jpg&quot; alt=&quot;22 Pommes&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;22 Pommes, avr. 2010&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;22 pommes est un petit jeu fun. Les règles s'expliquent en deux minutes, une partie ne dure pas longtemps, on y réfléchi, mais pas trop et ça tient dans une petite toute petite boite. Et pour le même prix, il y a dedans une variante pour corser la difficulté, une recette de cuisine et quelques informations sur les pommes.&lt;/p&gt;


&lt;h2&gt;Des manchots et des poissons&lt;/h2&gt;


&lt;p&gt;En variant encore le principe, on arrive à «&amp;nbsp;&lt;a href=&quot;http://trictrac.net/index.php3?id=jeux&amp;amp;rub=detail&amp;amp;inf=detail&amp;amp;jeu=10729&quot; hreflang=&quot;fr&quot;&gt;Pingouins&lt;/a&gt;&amp;nbsp;» ou encore «&amp;nbsp;That's my fish&amp;nbsp;» ou «&amp;nbsp;Packeis am Pol&amp;nbsp;» suivant la version que vous trouvez. Preuve que dans le jeu de société comme au cinéma, un nom peut changer du tout au tout pour le même contenu.&lt;/p&gt;


&lt;p&gt;Dans Pingouins, la ressource qui se raréfie est double&amp;nbsp;: les poissons, dont le nombre donnera le score final, mais aussi la banquise, qui va disparaitre sous les pattes des manchots affamés.&lt;/p&gt;


&lt;p&gt;Chaque joueur, qui peut aller de 2 à 4, contrôle de 4 à 2 manchots placés sur une banquise formée d'éléments hexagonaux. À son tour, un joueur déplace l'un de ses oiseaux en ligne droite de la distance qu'il souhaite. Il doit cependant arrêté par les autres manchots ainsi que par l'absence de banquise. L'élément quitté par le pion est pris par le joueur et gardé comme score.&lt;/p&gt;


&lt;p&gt;On s'éloigne un peu du jeu de nim&amp;nbsp;: chaque joueur influe sur les éléments à prendre grâce à ses propres pions, il peut y avoir des égalités.&lt;/p&gt;


&lt;p&gt;Mais pas tant que ça&amp;nbsp;: le nombre de poissons pouvant être pris va de 1 à 3 (même si ça n'a pas la même influence qu'au jeu de nim, la ressource qui disparait est avant tout la banquise), un élément devient de plus en plus rare, il est possible de bloquer ses adversaires dans des situations désavantageuses en les forçant à prendre la dernière pièce.&lt;/p&gt;


&lt;p&gt;En effet, comme à 22 pommes, le but d'un joueur est à la fois de maximiser son nombre de points, mais aussi de se déplacer de façon à interdire aux autres joueurs des déplacements avantageux.&lt;/p&gt;


&lt;p&gt;Autre petite particularité par rapport au jeu de nim&amp;nbsp;: il est possible de créer des sous-jeux (des morceaux de banquises indépendants). C'est ce qui arrive à peu près tout le temps à partir du milieu de partie. Cette sous-partie peut être catastrophique pour le ou les pions qui s'y trouvent (pas assez de place, plus beaucoup de déplacements possibles). Mais c'est aussi un moyen de se réserver un bout de banquise en isolant l'un de ses manchots qui ne sera alors plus gêné par le déplacement des autres.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.puupuu.org/dotclear/public/jeux/plateau/aperitif/PackeisAmPol.jpeg&quot; title=&quot;Packeis Am Pol&quot;&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/jeux/plateau/aperitif/.PackeisAmPol_m.jpg&quot; alt=&quot;Packeis Am Pol&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Packeis Am Pol, avr. 2010&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;«&amp;nbsp;Pingouins&amp;nbsp;» est un peu plus long que 22 pommes. La mise en place (construire la banquise est plus long que construire le verger), le nombre de joueurs, la taille du terrain de jeu qui font que les premiers coups demandent plus de réflexion. Et à moins de mettre les éléments de jeu dans une boite à vous, moins transportable&amp;nbsp;: la boite de jeu est démesurément grande par rapport à son contenu (un moyen d'être visible sur les étagères d'un magasin).&lt;/p&gt;


&lt;p&gt;Cependant, le jeu permet de réunir quatre personnes autour d'une table. Le principe s'explique en deux minutes et les manchots sont plus amusants que le fermier. Un bon petit jeu de réflexion pas trop prise de tête.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>La Grille</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/01/22/La-Grille</link>
    <guid isPermaLink="false">urn:md5:17a11acc111acfc1ef49cce66c8e76a5</guid>
    <pubDate>Sun, 24 Jan 2010 12:00:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
        <category>informatique</category><category>programmation</category>    
    <description>    &lt;p&gt;À l'origine de «&amp;nbsp;&lt;a href=&quot;http://lagrille.puupuu.org&quot;&gt;La Grille&lt;/a&gt; », il y a un atelier du &lt;a href=&quot;http://www.games-creators.org/wiki/Accueil&quot;&gt;Games Creators Network&lt;/a&gt; sur la création automatique de grilles de mots.&lt;/p&gt;


&lt;p&gt;J'y travaille de temps en temps, et j'ai décidé de faire de ma contribution à l'atelier un site dans lequel j'explique ma démarche de développement lors d'optimisations et d'ajouts de fonctionnalités.&lt;/p&gt;


&lt;p&gt;Le site a débuté début janvier 2010, il n'y a pas encore beaucoup d'articles, mais déjà pas mal de choses à lire.&lt;/p&gt;


&lt;p&gt;Rendez-vous sur «&amp;nbsp;&lt;a href=&quot;http://lagrille.puupuu.org&quot;&gt;La Grille&lt;/a&gt; ».&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Divers modélisme et figurines</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/01/20/Divers-mod%C3%A9lisme-et-figurines</link>
    <guid isPermaLink="false">urn:md5:18e28cfdcb3ca4f46dc7eaf12b2e176f</guid>
    <pubDate>Wed, 20 Jan 2010 20:00:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Modélisme</category>
        <category>décors</category><category>fantasy</category><category>figurines</category>    
    <description>    &lt;p&gt;En triant un peu les images que j'avais mises sur le site avec probablement l'idée d'en faire un article sur le moment, j'en retrouve certaines qui n'ont jamais eu cet honneur.&lt;/p&gt;


&lt;p&gt;Voici donc, avec du retard, quelques travaux personnels&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/modelisme/2008/20080828-DecorsCD.jpeg&quot; alt=&quot;20080828-DecorsCD.jpeg&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Décors CD, ruine&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Cela date d'août 2008. Le principe est de faire tenir un élément de décors pour jeu de figurine sur un CD-Rom sacrifié pour l'occasion. Très probablement en ancien CD publicitaire, ou bien une gravure échouée.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.puupuu.org/dotclear/public/modelisme/2008/20081216-NainFenryll.jpeg&quot; title=&quot;20081216-NainFenryll.jpeg&quot;&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/modelisme/2008/.20081216-NainFenryll_m.jpg&quot; alt=&quot;20081216-NainFenryll.jpeg&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Nain Fenryll&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Un nain de chez &lt;a href=&quot;http://www.fenryll.fr&quot;&gt;Fenryll&lt;/a&gt;. J'ai du mettre 5 ans à peindre ce Nain... Pas en continue, bien entendu. La photo a été prise en décembre 2008. Le décors dessous est du &lt;a href=&quot;http://www.fatdragongames.com/&quot;&gt;Fat Dragon&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.puupuu.org/dotclear/public/modelisme/20050205-Junker-Zone.jpg&quot; title=&quot;20050205-Junker-Zone.jpg&quot;&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/modelisme/.20050205-Junker-Zone_m.jpg&quot; alt=&quot;20050205-Junker-Zone.jpg&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;20050205-Junker-Zone.jpg, mai 2009&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Plus vieux, ce décors a été fait pour un petit concours organisé en début 2005 par &lt;a href=&quot;http://urbanzone.fr&quot;&gt;Urban Zone&lt;/a&gt;, autour du jeu Urban War.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Android : affichage et profiling à tatons</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/01/12/Android-%3A-techniqued-affichage</link>
    <guid isPermaLink="false">urn:md5:ed74e0cbf4e0e72b88df6d70a8c76aa4</guid>
    <pubDate>Thu, 14 Jan 2010 20:00:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
        <category>android</category><category>informatique</category><category>programmation</category>    
    <description>&lt;p&gt;En regardant la documentation, les exemples et les codes sources disponibles sur Android, on s'aperçoit qu'il y a beaucoup de manières différentes de mettre à jour un affichage. Je vais devoir en choisir un et ne pas me fermer la porte aux autres.&lt;/p&gt;    &lt;h2&gt;Affichage&lt;/h2&gt;


&lt;p&gt;En effet, j'ai à présent un serpent qui bouge, il faut donc que je mette à jour l'affichage de l'état du jeu. J'ai déjà fait une interface dans le programme avec dans l'idée que je pourrais un jour passer d'une méthode à une autre, mais sans connaître la plateforme dans les détails, je ne suis pas certain d'avoir tout prévu.&lt;/p&gt;


&lt;p&gt;Pour le moment, j'affiche en passant par un Canvas qui m'est envoyé dans le &lt;code&gt;onDraw()&lt;/code&gt; de ma &lt;code&gt;View&lt;/code&gt;. C'est une des méthodes les plus simples. Est-elle adaptée, je n'en sais rien.&lt;/p&gt;


&lt;p&gt;Dans un premier temps, je me contente d'invalider la surface dès que j'ai terminé mon affichage&amp;nbsp;: à la fin du &lt;code&gt;onDraw()&lt;/code&gt;, j'appelle &lt;code&gt;invalidate()&lt;/code&gt;. J'ai le sentiment que ce n'est pas une méthode terriblement bonne. Que se passe-t-il quand j'appelle &lt;code&gt;invalidate()&lt;/code&gt;&amp;nbsp;? Est-ce que je ne risque pas de tirer un peu trop sur les ressources de la machine&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Je vois un autre soucis&amp;nbsp;: puisque le contrôle du jeu se fait depuis le &lt;code&gt;onDraw()&lt;/code&gt; de la &lt;code&gt;View&lt;/code&gt;, je suis dans un contexte d'affichage. D'après les informations que j'ai pu glaner, j'ai plutôt intérêt à ne pas trop bloquer dans cette méthode et à rendre la main au système «&amp;nbsp;rapidement ».&lt;/p&gt;


&lt;p&gt;On sent venir le thread séparé qui va s'occuper de la mise à jour du jeu...&lt;/p&gt;


&lt;p&gt;Comme j'ai besoin que cela bouge à l'écran et que je n'ai pas forcément envie de jouer une séquence à chaque fois, j'implémente rapidement une petite IA de serpent qui suit les bords de la grille.&lt;/p&gt;


&lt;h2&gt;Profiling&lt;/h2&gt;


&lt;p&gt;J'ai donc besoin de savoir ce qu'il se passe sur la machine. Pour cela, le SDK propose plusieurs choses&amp;nbsp;: DDMS, qui se charge de se connecter à la machine (l'émulateur dans mon cas) pour aller y récupérer des informations sur la mémoire, les threads&amp;nbsp;; un outil de profiling, TraceView&amp;nbsp;; une possibilité de dump HPROF.&lt;/p&gt;


&lt;p&gt;Pour le moment, je ne fais pas assez de choses dans le jeu pour que la mémoire ait une importance. Cela alloue quand même déjà 3 Mo, probablement le système.&lt;/p&gt;


&lt;p&gt;Je commence par m'assurer de quelque chose&amp;nbsp;: est-ce que la méthode du &lt;code&gt;invalidate()&lt;/code&gt; dans le &lt;code&gt;onDraw()&lt;/code&gt; génère beaucoup trop d'appels. Pour cela, je mesure le temps entre deux appels à &lt;code&gt;onDraw&lt;/code&gt; à l'aide de &lt;code&gt;SystemClock.uptimeMillis()&lt;/code&gt;. J'obtiens une moyenne de 1/60ième de seconde avec des périodes stables et quelques pics à 1/30ième et quelques fois à 1/20ième. Mais c'est assez stable.&lt;/p&gt;


&lt;p&gt;je ne sais pas si le rafraichissement au 1/60ième de seconde est une constante sur les différents téléphone, mais en tout cas, je vois que l'OS met l'invalidation de la surface dans une fil d'attente pour la frame suivante. C'est une bonne chose, cela signifie que même cette méthode basique ne va pas faire écrouler les ressources du téléphone.&lt;/p&gt;


&lt;p&gt;Un petit coup de HPROF me montre quelque chose&amp;nbsp;: je ne consomme rien en mémoire par rapport aux objets Android que je consomme. Il y a un poids de base pour une application Android qui n'est pas à négliger.&lt;/p&gt;


&lt;p&gt;Passons à Traceview. J'encadre le code de &lt;code&gt;onDraw()&lt;/code&gt; avec les fonctions de démarrage et d'arrêt de profiling. Première constatation, ça ralenti pas mal l'exécution. Seconde constatation, ma fonction de déplacement gère le «&amp;nbsp;delta t&amp;nbsp;» sans borne maximale. Du coup, je me trouve avec des consommation aberrantes dans la mise à jour des déplacements.&lt;/p&gt;


&lt;p&gt;Petite modification donc&amp;nbsp;: je limite le «&amp;nbsp;delta t&amp;nbsp;» maximum.&lt;/p&gt;


&lt;p&gt;Que me dit alors le profiler&amp;nbsp;: que je passe la moitié du temps à afficher la grille de debug...&lt;/p&gt;


&lt;p&gt;Je profile alors entre &lt;code&gt;onStart()&lt;/code&gt; et &lt;code&gt;onStop()&lt;/code&gt; pour avoir une vue d'ensemble de l'application. Le résultat est que 50% du temps de l'application est passée dans le framework Android, et le reste dans mon application. Sur émulateur, j'ai calculé que mon temps de mise à jour du jeu était en peu en dessous de 2ms. Ce qui donne un poids côté Android de 2ms.&lt;/p&gt;


&lt;p&gt;On me souffle cependant qu'un vrai téléphone est plus rapide que l'émulateur.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Android : deuxième pas</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/01/08/Android-%3A-deuxi%C3%A8me-pas</link>
    <guid isPermaLink="false">urn:md5:ae0f8678ed3409845300235df2333a30</guid>
    <pubDate>Mon, 11 Jan 2010 20:00:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
        <category>android</category><category>informatique</category><category>programmation</category>    
    <description>&lt;p&gt;Je continue mon petit jeu sous Android.&lt;/p&gt;    &lt;p&gt;Après un peu de refactoring sur mon affichage de grille et quelques petits ajouts pour la placer correctement sur l'écran et que les cases soient carrées, je me lance dans l'affichage du serpent puisque mon jeu est un «&amp;nbsp;snake ».&lt;/p&gt;


&lt;p&gt;Je m'aperçois alors qu'il n'y a pas spécialement de classe pour gérer des vecteurs au sens mathématique. Or je préfère travailler avec des objets contenant des coordonnées plutôt que le couple (X,Y). Qu'à cela ne tienne, ce n'est pas bien compliqué à implémenter. J'ai cherché un peu sur le net et je n'ai pas trouvé de classe toute faite et simple à intégrer. Je n'ai pas non plus cherché très longtemps. Si j'ai besoin de plus d'outils de ce style, il faudra probablement que je cherche mieux. Cependant, un «&amp;nbsp;snake&amp;nbsp;» a des besoins mathématiques très modestes.&lt;/p&gt;


&lt;p&gt;Pas de soucis pour implémenter la notion de «&amp;nbsp;snake », c'est du Java pur, pas besoin de toucher à Android.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/informatique/android/2010/.20100111-SnakeGrid_s.jpg&quot; alt=&quot;Une grille de Snake dans l&amp;#039;émulateur Anroid&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; title=&quot;Une grille de Snake dans l&amp;#039;émulateur Anroid, janv. 2010&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Petite surprise au niveau de la classe View, qui ne possède pas dans son constructeur ses information de hauteur et de largeur. Ce n'est pas extraordinaire, les vues sont probablement arrangées après le &lt;code&gt;setContentView()&lt;/code&gt;. D'autant plus que ces valeurs peuvent changer en fonction de l'orientation de l'écran.&lt;/p&gt;


&lt;p&gt;Mis à part ça, pas de surprise, et en affichage de debug, voici l'état d'un serpent de taille 4 ayant fait les mouvements «&amp;nbsp;bas », «&amp;nbsp;droite&amp;nbsp;» puis «&amp;nbsp;bas ».&lt;/p&gt;


&lt;p&gt;Pour le moment, toute l'instanciation du jeu ainsi que les trois mouvements du serpent, sont fait à la main, de même que l'envoi à l'affichage.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Android : premiers pas</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/01/07/Android-%3A-premiers-pas</link>
    <guid isPermaLink="false">urn:md5:b8b7cd39ee763f3590c0b5c7a1ac5ec2</guid>
    <pubDate>Thu, 07 Jan 2010 20:30:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
        <category>android</category><category>informatique</category><category>programmation</category>    
    <description>&lt;p&gt;Après avoir un peu lu les &lt;a href=&quot;http://developer.android.com/index.html&quot;&gt;pages pour développeur Android&lt;/a&gt; et pas mal discuté avec &lt;a href=&quot;http://androidblogger.blogspot.com/&quot;&gt;un collègue&lt;/a&gt;, j'ai décidé de découvrir un peu l'univers Android côté programmeur.&lt;/p&gt;    &lt;p&gt;Un SDK qui se charge et s'installe sans soucis, avec des étapes bien documentées. Un émulateur de téléphone qui se configure et se lance depuis Eclipse comme un charme. Voilà qui change de mes essais de programmation sous Windows Mobile.&lt;/p&gt;


&lt;p&gt;Le site d'Android côté développeur présente les concepts généraux d'une application sur téléphone Android et propose quelques exercices pour découvrir l'environnement. C'est plutôt bien fait et assez facile à suivre si vous connaissez déjà Java et Eclipse. Rapidement, vous avez vos premières applications qui tournent.&lt;/p&gt;


&lt;p&gt;Après un petit tour des exemples et quelques essais seul, je décide de me lancer dans une application complète. Il n'y a que comme ça que l'on peut comprendre plus profondément. J'écris donc un mini game design&amp;nbsp;: cela sera un jeu style «&amp;nbsp;snake ». Rien de bien original, l'intérêt n'est pas là.&lt;/p&gt;


&lt;h2&gt;Tests&amp;nbsp;!&lt;/h2&gt;


&lt;p&gt;Si vous lisez les billets Informatique de ce blog, vous avez déjà du comprendre que je suis un adepte des tests et du TDD. Il me faut donc mettre en place un projet de tests. Cela tombe bien, à la création d'un projet Android par Eclipse, l'aide à la création demande si l'on veut aussi créer un projet de test. Ce que je fais. C'est du jUnit3 et le système avec un projet complètement séparé ne me plait pas forcément. J'aurais préféré jUnit4 et un seul projet avec les tests justes séparés dans un autre package.&lt;/p&gt;


&lt;p&gt;Mais comme je ne connais pas encore bien le framework, je vais laisser comme ça pour le moment.&lt;/p&gt;


&lt;p&gt;J'écris mes premiers tests et... ah oui, il me faut un framework de mock aussi.&lt;/p&gt;


&lt;p&gt;Sur le net et via mon collègue, je trouve quelques pistes sur le blog de &lt;a href=&quot;http://dtmilano.blogspot.com/2009/07/android-testing-on-android-platform_7528.html&quot;&gt;Diego Torres Milano&lt;/a&gt; ainsi que sur celui de &lt;a href=&quot;http://sberka.blogspot.com/2009/12/mocking-objects-to-unit-test-android-os.html&quot;&gt;stanb&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Je choisi EasyMock. Sa syntaxe à l'air simple et ses capacités correctes. J'avoue, c'est un peu au feeling, ma connaissance des frameworks de mock en Java est assez limité.&lt;/p&gt;


&lt;h2&gt;C'est parti&lt;/h2&gt;


&lt;p&gt;De mon game design, je déduis quelques tâches simples avec un résultat visible. La première, avoir une grille de debug à l'écran (le jeu se passera sur une grille) va me permettre de mettre en place l'architecture de base. Je lutte un peu avec EasyMock car je dois apprendre son fonctionnement en même temps, mais ça se passe bien.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/informatique/android/2010/.20100107-SnakeGrid_s.jpg&quot; alt=&quot;Une grille dans l&amp;#039;émulateur Anroid&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; title=&quot;Une grille dans l&amp;#039;émulateur Anroid, janv. 2010&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Après un petit moment, me voici avec une View que je peux contrôler et qui affiche une grille à l'écran. Ça n'a l'air de rien, mais cela m'a permit d'avoir une structure de base d'un renderer d'objet. On est loin d'un moteur d'affichage complet, ce n'est pas le but de l'exercice, mais j'ai les bases pour afficher des objets à l'écran, c'est ce que je voulais.&lt;/p&gt;


&lt;p&gt;Rien de bien excitant, mais au passage, j'ai aussi appris à me servir du &lt;em&gt;debugueur&lt;/em&gt; (en partie, il y a des choses comme le &lt;em&gt;profiler&lt;/em&gt; de mémoire que je n'ai fait qu'explorer).&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Debug : un état d'esprit</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2010/01/02/Debug-%3A-un-%C3%A9tat-d-esprit</link>
    <guid isPermaLink="false">urn:md5:285ec0e905ae89d553f75df345f4b38e</guid>
    <pubDate>Sat, 02 Jan 2010 23:30:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
        <category>informatique</category><category>programmation</category>    
    <description>&lt;p&gt;Il y a peu, un chef de projet demandait à l'équipe informatique&amp;nbsp;: «&amp;nbsp;comment vous faites pour trouver des bugs&amp;nbsp;? ». La question m'a surprise et ma réponse fut quelque chose du genre «&amp;nbsp;si tu as quelques jours devant toi, je t'explique ». À vrai dire, je n'avais pas vraiment de réponse à donner et l'ampleur de la réponse me semblait importante.&lt;/p&gt;


&lt;p&gt;Cependant, cela m'a fait réfléchir à la question, car il y a effectivement un apprentissage du debug (déverminage en français... ce sera la dernière fois de l'article que j'utiliserai ce mot) et tous les programmeurs ne sont pas forcément à l'aise avec cette partie du développement.&lt;/p&gt;    &lt;p&gt;C'est d'ailleurs le première chose qui m'est venu à l'esprit&amp;nbsp;: il y a des débutants qui se lancent dans du debug efficace et des programmeurs de longues dates qui ne s'en sortent qu'avec difficultés. Je me suis donc dit qu'il y avait quelque chose de plus que l'expérience, qui compte néanmoins, pour aborder un debug avec efficacité.&lt;/p&gt;


&lt;p&gt;Le debug commence par une constatation&amp;nbsp;: il y a un bug. Le programmeur peut être confronté à ce bug directement ou indirectement, via un rapport de testeurs ou d'utilisateurs. Cette première phase est importante car elle nécessite une lecture de ce bug. S'il est souvent facile de comprendre un bug lorsqu'il se produit juste après un développement, il est beaucoup moins facile à interpréter lorsqu'il intervient plus tard, voire lorsqu'il intervient beaucoup plus tard chez un utilisateur qui n'est pas forcément en mesure de reproduire les étapes d'utilisation du logiciel qui l'ont amené à ce bug.&lt;/p&gt;


&lt;p&gt;Ici, avoir des testeurs aide grandement&amp;nbsp;: ils sont capables, généralement, d'isoler le bug et de trouver un chemin minimum permettant de le reproduire. Ils peuvent ensuite rédiger un rapport sur les étapes à effectuer et les résultats.&lt;/p&gt;


&lt;p&gt;Le programmeur n'est cependant pas sorti d'affaire avec sa lecture du bug&amp;nbsp;: ce qu'un testeur ou un utilisateur peut reporter est une suite d'actions et un résultat perçu. Ce résultat étant perçu (l'affichage s'arrête, le programme plante, le son se met à boucler, un pad n'est plus reconnu, un personnage du jeu se met à faire n'importe quoi, un message à l'écran est mauvais), il ne reflète pas forcément le domaine du programme dans lequel le bug est présent.&lt;/p&gt;


&lt;p&gt;Dans un jeu vidéo, il est très possible qu'un bug de simulation mécanique soit causée par un problème dans le gestionnaire de temps qui lui même est perturbé par la gestion de la pause du jeu. Un testeur risque de relever alors&amp;nbsp;: après avoir fait une pause, choisi telle option puis être revenu dans le jeu, les voitures foncent dans les murs. Le rapport de bug mentionne les voitures et la pause, mais ne mentionne pas la cause du bug, qui se trouve dans le gestionnaire du temps.&lt;/p&gt;


&lt;p&gt;J'en viens donc au titre de cet article&amp;nbsp;: l'état d'esprit.&lt;/p&gt;


&lt;p&gt;Afin de corriger un bug efficacement, ce qui signifie préalablement dentifier sa cause, il faut avoir, ou se mettre dans, un certain état d'esprit. Je le pense fondé sur une base&amp;nbsp;: l'absence de préjugé.&lt;/p&gt;


&lt;h2&gt;L'absence de préjugé&lt;/h2&gt;


&lt;p&gt;J'entends souvent à la lecture d'un bug&amp;nbsp;: «&amp;nbsp;ah oui, je sais d'où ça vient&amp;nbsp;! »&lt;/p&gt;


&lt;p&gt;J'entends aussi, mais en tendant l'oreille car c'est dit sur un ton plus confidentiel&amp;nbsp;: «&amp;nbsp;mouais, ça doit être machin qui a archivé une bétise&amp;nbsp;! »&lt;/p&gt;


&lt;p&gt;D'expérience, ces deux préjugés font perdre du temps. Il est &lt;strong&gt;possible&lt;/strong&gt; que le programmeur ait une intuition de la provenance du bug, il est même &lt;strong&gt;possible&lt;/strong&gt; que la correction soit évidente. Il est aussi &lt;strong&gt;possible&lt;/strong&gt; que ce soit machin qui soit à l'origine du problème.&lt;/p&gt;


&lt;p&gt;Mais ignorer ces préjugés est une bien meilleure réaction.&lt;/p&gt;


&lt;h3&gt;Je sais d'où ça vient&amp;nbsp;!&lt;/h3&gt;


&lt;p&gt;Ce préjugé entraine une correction rapide, un archivage plein de confiance et... un autre bug. Oh, pas tout le temps&amp;nbsp;! Mais assez souvent pour que cela mérite l'attention.&lt;/p&gt;


&lt;p&gt;S'il y a une erreur dans le programme, c'est que quelque chose s'est mal passé. Si ce quelque chose s'est mal passé, c'est que le programmeur qui a révélé le bug avec ses ajouts n'a pas été cohérent avec l'existant. Comme ce n'est pas forcément le code ajouté qui introduit le bug, mais qui le révèle, corriger ce que l'on pense être la source du bug peut avoir pour résultat de &lt;strong&gt;dissimuler l'erreur&lt;/strong&gt; et non la corriger.&lt;/p&gt;


&lt;p&gt;L'exemple classique est la ligne que l'on ajoute et qui fait planter le programme. On l'enlève, ça ne plante plus, on l'ajoute, ça plante. Le programmeur essai alors de modifier cette ligne pour avoir toujours le même effet sans le plantage (qui est souvent incompris, même pas analysé). Ça ne plante plus... jusqu'à plus tard. À vrai dire, la ligne ajoutée bougeait un peu le comportement du système, et l'erreur venait d'à côté.&lt;/p&gt;


&lt;p&gt;Un exemple concret en C/C++ est le classique débordement de tableau stocké en variable automatique. Le débordement est inoffensif jusqu'au moment où, lors d'une modification du code source, il écrase une valeur importante. On peut modifier le code jusqu'à ce que le débordement soit à nouveau inoffensif, mais la vraie correction est celle qui corrige le débordement.&lt;/p&gt;


&lt;p&gt;Parfois, la précipitation dans la correction du bug fait que l'on ne cerne pas bien le système et que la correction révèle un autre bug. Dans les pires cas, qui ne sont pas si rares, cela peut entraîner des révélations de bugs en cascade sur plusieurs heures, voire plusieurs jours. J'ai cette image lorsque cela arrive d'une coque de navire que l'on rafistole avec des planches et des clous, mais qui se casse à un autre endroit à cause des coups de marteaux.&lt;/p&gt;


&lt;h3&gt;Je sais qui c'est&amp;nbsp;!&lt;/h3&gt;


&lt;p&gt;Cette réaction est gênante car souvent répétée, elle amène dans une équipe une méfiance entre les programmeurs (ou bien, puisque les données aussi peuvent provoquer des bugs, entre les programmeurs et les utilisateurs). Cette réaction a tendance à désigner les «&amp;nbsp;mauvais programmeurs », ceux qui introduisent fatalement des bugs dans la base. Du coup, plutôt que de chercher à corriger le bug, le correcteur va d'abord chercher à savoir ce qu'à fait ce ou ces «&amp;nbsp;mauvais programmeurs&amp;nbsp;» (qui peuvent être différent suivant les membres de l'équipe d'ailleurs).&lt;/p&gt;


&lt;p&gt;C'est une perte de temps&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;D'abord car cela peut laisser le correcteur sur une fausse piste pendant plus longtemps que nécessaire. Et ensuite car, si effectivement l'archivage en question a révélé le bug, ce n'est peut-être, comme au paragraphe précédent, qu'un révélateur. J'ai vu plus d'une fois quelqu'un commencer sur cette voie, annoncer que tel archivage d'untel avait créé introduit le bug et se faire tout petit quelques temps après lorsque le bug est enfin trouvé... parfois dans du code du correcteur.&lt;/p&gt;


&lt;p&gt;Le programme est une œuvre collective et lorsqu'un bug apparaît, il est inutile de savoir &lt;strong&gt;qui&lt;/strong&gt; en est à l'origine. Le plus souvent, il s'agit d'une mauvaise conceptualisation du système par l'ensemble de l'équipe&amp;nbsp;: certains pensent qu'il fonctionne d'une certaine façon, d'autres d'une autre façon.&lt;/p&gt;


&lt;p&gt;Un bug doit être corrigé vite, car sa présence coûte au projet (temps de correction, mais aussi temps d'indisponibilité de la fonctionnalité). Il ne faut pas perdre du temps à savoir qui, ni même à partir sur une piste à partir d'une présomption. L'évaluation des membres de l'équipe fait partie du travail de management, pas de debug.&lt;/p&gt;


&lt;h2&gt;La piste à suivre...&lt;/h2&gt;


&lt;p&gt;Je pense que l'absence de préjugé nécessaire à un bon debug est ce qui fait qu'un débutant peut très bien être plus efficace que certains programmeurs d'expérience. Un débutant n'a pas de préjugé&amp;nbsp;: ni sur le code, car il n'a pas l'historique nécessaire, ni sur les personnes, car il ne connait pas encore le fonctionnement d'une équipe. La bonne chose à faire, qui est aussi la difficulté, est de garder cette absence de préjugé tout en gagnant de l'expérience. Ce n'est pas simple et il faut parfois s'y contraindre. Mais je sais que depuis que je m'applique cette discipline, j'ai gagné en efficacité lors d'une correction de bug. Débarrassé des préjugés, je peux me concentrer sur le suivi de la piste du bug.&lt;/p&gt;


&lt;p&gt;Suivre une piste de bug est autre sujet passionnant, mais cet article ce termine ici.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Un piège n'est qu'un piège</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2009/12/29/Un-pi%C3%A8ge-n-est-qu-un-pi%C3%A8ge</link>
    <guid isPermaLink="false">urn:md5:f142b768ea749c2caa7eca773bdf81a4</guid>
    <pubDate>Tue, 29 Dec 2009 23:59:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
        <category>informatique</category><category>programmation</category>    
    <description>&lt;p&gt;C'est chez &lt;a href=&quot;http://www.antipatterns.fr/archive/2009/12/18/pitfalls-of-oop-par-tony-albrecht.html&quot;&gt;Daz&lt;/a&gt; que j'ai vu en premier la présentation «&amp;nbsp;Pitfalls of OOP », puis je l'ai reçue de diverses sources dans les jours qui ont suivi, je l'ai vu sur d'autres sites. Souvent, les commentaires incluaient quelque chose comme&amp;nbsp;: il faut éviter la programmation orientée objet dans les jeux vidéo.&lt;/p&gt;


&lt;p&gt;Ce commentaire à l'emporte pièce (la programmation dans le jeux vidéo couvre divers domaines avec des besoins différents) m'a immédiatement agacé pour deux raisons. Le première est que ce n'est absolument pas le sujet de la présentation, qui parle de certains pièges et de comment les éviter, la seconde est que les solutions pour éviter ces pièges peut très bien passer par de la programmation objet.&lt;/p&gt;    &lt;p&gt;Le sujet de la présentation est tout à fait juste. Pas récent, mais comme à chaque fois que quelqu'un sort une présentation sur la gestion mémoire, une grande partie de la population des programmeurs découvre que gérer sa mémoire n'est pas simple et est extrêmement important dans les jeux vidéos (ceux qui ont besoin de performances en tout cas).&lt;/p&gt;


&lt;p&gt;Je n'ai pas grand chose à dire sur la présentation. Elle est bien faite, je trouve les explications claires et les conclusions sont justes. À un bémol prêt (Optimize for Data first, then Code)&amp;nbsp;: s'il est important de prévoir de ne pas faire n'importe quoi avec sa mémoire dès le début d'un développement, il est fort peu probable qu'une équipe ait toute l'expérience nécessaire sur console de jeu pour trouver le meilleur modèle du premier coup. Et justement, une programmation objet peut fortement aider&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;C'est sur les commentaires sur la présentation que j'ai des commentaires à faire&amp;nbsp;: à vrai dire, je pense qu'elle a été mal lue, ou mal comprise. Peut-être est-ce tout simplement le terme de «&amp;nbsp;Data Oriented Design&amp;nbsp;» qui a brouillé les pistes. En voyant ce terme, certains lecteurs se sont visiblement dit que cela &lt;strong&gt;remplaçait&lt;/strong&gt; la «&amp;nbsp;Programmation Orientée Objet ».&lt;/p&gt;


&lt;p&gt;Cependant, ces deux concepts sont orthogonaux&amp;nbsp;! La «&amp;nbsp;Programmation Orientée Objet&amp;nbsp;» implique des paradigmes de programmation qui peuvent être utilisés de diverses manières. Et une utilisation d'une certaine manière est un design, une architecture. Le «&amp;nbsp;Data Oriented Design&amp;nbsp;» que je traduirais par «&amp;nbsp;Architecture Orientée Données&amp;nbsp;» n'est donc qu'une manière d'agencer son programme, ses objets dans le cas de la POO.&lt;/p&gt;


&lt;p&gt;La POO n'implique pas une architecture précise, il n'y a qu'à regarder deux ou trois programmes venant de personnes ou entreprises différentes pour voir que les choix d'architectures peuvent être nombreux. Un exemple classique est celui de l'architecture de moteur de jeu à hiérarchie profonde contre celle à composant (une &lt;a href=&quot;http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/&quot; hreflang=&quot;en&quot;&gt;piste par ici&lt;/a&gt;).&lt;/p&gt;


&lt;p&gt;Là où la présentation tend le bâton pour se faire battre, c'est qu'elle commence par un exemple d'architecture extrêmement simple, naïve, pour montrer l'impact négatif sur la mémoire. L'ennui étant que cette architecture naïve est très souvent utilisée, par les débutants bien sûr, mais pas qu'eux... Dans cette architecture, on utilise une encapsulation très forte&amp;nbsp;: un objet a la propriété de tous ses éléments.&lt;/p&gt;


&lt;p&gt;La suite de la présentation s'attache à comment agencer sa mémoire, mais ne donne plus d'exemple complet. C'est normal, adapter l'architecture à la POO n'est &lt;strong&gt;pas&lt;/strong&gt; le sujet de la présentation.&lt;/p&gt;


&lt;p&gt;Et cela donne le raccourci&amp;nbsp;: l'exemple POO au début est mauvais, la solution de l'agencement mémoire à la fin est bonne, donc la POO est mauvaise. Pas de chance, la conclusion n'est pas la bonne, la conclusion est&amp;nbsp;: donc l'agencement mémoire du début est mauvais.&lt;/p&gt;


&lt;h2&gt;Un exemple&lt;/h2&gt;


&lt;p&gt;Prenons un exemple un peu bateau pour voir comment on peut changer la façon dont des données sont stockées en mémoire tout en gardant une programmation objet.&lt;/p&gt;


&lt;p&gt;Attention&amp;nbsp;: moi, je ne parlerai pas de cache miss, je vais juste montrer sur un exemple que l'on peut changer de structure de stockage en mémoire tout en restant dans de la programmation objet.&lt;/p&gt;


&lt;p&gt;Les exemples seront simples, pour donner une idée, l'architecture sera loin d'être aussi bien qu'elle pourrait l'être, et chaque exemple sera dans un fichier (autant pour l'architecture physique d'un projet). Chaque propos en son temps :)&lt;/p&gt;


&lt;p&gt;L'énoncé de l'exemple est simple&amp;nbsp;: j'ai une classe People qui stocke un nom, chaque instance représente donc une personne avec son nom.&lt;/p&gt;


&lt;p&gt;Dans un système, je vais avoir plusieurs personnes (People) et je veux connaître le nombre d'utilisation pour chaque prénom.&lt;/p&gt;


&lt;p&gt;L'exemple est très simplifiée donc, mais on a plusieurs concepts&amp;nbsp;: une classe, une liste d'instance de cette classe, et une fonction de comptage.&lt;/p&gt;


&lt;h3&gt;Niveau 0&amp;nbsp;: naïf que je suis&lt;/h3&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;list&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;map&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; People
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
            name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; name;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; name;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NameCounter
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; people &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
                &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;count.&lt;span style=&quot;color: #00eeff;&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;people&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
                &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                    count.&lt;span style=&quot;color: #00eeff;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;pair&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;people&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
                &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;count&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;people&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Print&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; count.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; count.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;pair&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; entry &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
&amp;nbsp;
                std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;cout&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Name : &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; entry.&lt;span style=&quot;color: #00eeff;&quot;&gt;first&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot; with count : &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; entry.&lt;span style=&quot;color: #00eeff;&quot;&gt;second&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; count;
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; CleanList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #0000dd;&quot;&gt;delete&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
        &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; main&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;argv&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; peopleList;
&amp;nbsp;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Paul&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Jean&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Paul&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; i &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;; i &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;1000&lt;/span&gt;; &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;i&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Luc&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        NameCounter counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;Print&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    CleanList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Dans cette première version, j'utilise une structure de données très simple pour People. Puisque chaque personne a un nom, People stocke le nom directement, il a la propriété de l'objet &lt;code&gt;std::string&lt;/code&gt;. J'initialise ma liste (une bête &lt;code&gt;std::list&lt;/code&gt;) avec le résultat de &lt;code&gt;new&lt;/code&gt; (qui pourraient venir d'ailleurs). Pour le comptage, je parcours toute la liste et je stocke dans une &lt;code&gt;std::map&lt;/code&gt; une paire (nom, occurrences).&lt;/p&gt;


&lt;p&gt;J'affiche ensuite 1000 fois le résultat en ajoutant une personne à chaque fois, histoire de mettre un peu de dynamisme à l'exemple.&lt;/p&gt;


&lt;p&gt;Ce niveau est globalement ce que l'on trouve le plus souvent. Du point de vu de cet article, il y a deux soucis&amp;nbsp;: tout n'est pas encapsulé (&lt;code&gt;new&lt;/code&gt; est un détail d'implémentation de la création des objets, la destruction explicite de &lt;code&gt;CleanList&lt;/code&gt; n'a rien à faire dans &lt;code&gt;main&lt;/code&gt;, l'utilisation de &lt;code&gt;std::list&lt;/code&gt; ne devrait pas être visible) et les données sont dispersées en mémoire.&lt;/p&gt;


&lt;h3&gt;Encapsulons&amp;nbsp;!&lt;/h3&gt;


&lt;p&gt;Première étape pour nous permettre de modifier tranquillement les structures de données sans modifier le code client&amp;nbsp;: encapsuler&amp;nbsp;! Il faudrait ajouter&amp;nbsp;: bien définir ses interfaces, nous nous en passerons ici, ce n'est pas le sujet.&lt;/p&gt;


&lt;p&gt;J'ajoute donc un &lt;code&gt;PeopleList&lt;/code&gt; qui contiendra une liste de personnes. On peut ajouter un élément à cette liste et obtenir la liste interne. Les éléments sont ajoutés via un nom, la construction de l'objet étant interne. Sur ce point, une exemple plus complet ferait probablement différemment, mais restons simple. L'obtention de la liste interne doit par contre attirer le regard&amp;nbsp;: elle brise l'encapsulation en donnant accès à des détails interne.&lt;/p&gt;


&lt;p&gt;Ce n'est pas très grave car c'est temporaire et non utilisé par le code client (ici, &lt;code&gt;main&lt;/code&gt;).&lt;/p&gt;


&lt;p&gt;Il faut bien entendu apporter quelques modifications à &lt;code&gt;NameCounter&lt;/code&gt; pour recevoir une &lt;code&gt;PeopleList&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;À partir de maintenant, le code client ne bougera plus. Cependant, nous pourrons bouger les structures de données interne au système sans changer son fonctionnement (en fait, en l'accélérant beaucoup).&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;list&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;map&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; People
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
            name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; name;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; name;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; PeopleList
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        PeopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        ~PeopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            CleanList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Add&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; GetList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; peopleList;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; peopleList;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; CleanList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                &lt;span style=&quot;color: #0000dd;&quot;&gt;delete&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NameCounter
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; PeopleList &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; internalList &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;GetList&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; internalList.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; internalList.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; people &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
                &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;count.&lt;span style=&quot;color: #00eeff;&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;people&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
                &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                    count.&lt;span style=&quot;color: #00eeff;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;pair&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;people&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
                &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;count&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;people&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Print&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; count.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; count.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;pair&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; entry &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
&amp;nbsp;
                std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;cout&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Name : &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; entry.&lt;span style=&quot;color: #00eeff;&quot;&gt;first&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot; with count : &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; entry.&lt;span style=&quot;color: #00eeff;&quot;&gt;second&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; count;
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; main&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;argv&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    PeopleList peopleList;
&amp;nbsp;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Paul&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Jean&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; i &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;; i &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;1000&lt;/span&gt;; &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;i&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Luc&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        NameCounter counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;Print&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;Premier mouvement&lt;/h3&gt;


&lt;p&gt;Dans le premier design, People avait la propriété du nom. L'énoncé de l'exemple donnait un indice sur le fait que cela n'était pas la meilleure idée&amp;nbsp;: il va y avoir des doublons&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Ainsi, dans les programmes précédents, il y a 1000 fois une chaîne &quot;Luc&quot; en mémoire, alors même que le champ &lt;code&gt;name&lt;/code&gt; de People est constant (People est une classe non mutable&amp;nbsp;: une fois qu'elle est créée, ses valeurs ne changent pas).&lt;/p&gt;


&lt;p&gt;Plutôt que de stocker un nom dans chaque instance de &lt;code&gt;People&lt;/code&gt;, je crée donc un dictionnaire de nom dont &lt;code&gt;PeopleList&lt;/code&gt; a une instance. Lors de la création d'une instance de &lt;code&gt;People&lt;/code&gt;, le nom est tout d'abord ajouté au dictionnaire s'il n'est pas déjà présent, puis l'instance de &lt;code&gt;People&lt;/code&gt; est créée avec pour nom une référence vers l'entrée du dictionnaire.&lt;/p&gt;


&lt;p&gt;On y gagne en place utilisée (un peu plus de 80ko pour la version précédente pour environ 64ko maintenant). Forcément, plus un même prénom est utilisé, plus cette structure est rentable.&lt;/p&gt;


&lt;p&gt;Mais elle est de toute façon flexible, la seule contrainte est que le stockage des noms dans le dictionnaire soit stable. Comme People a une référence vers une entrée de dictionnaire, cette entrée ne doit pas changer en mémoire. C'est pour cette raison que dans cette implémentation, j'utilise une &lt;code&gt;std::list&lt;/code&gt;. Si le nombre de prénom maximum était connu, un tableau ferait l'affaire. Évidemment, d'un point de vue cache, le &lt;code&gt;std::list&lt;/code&gt; n'est pas un très bon choix. Mais comme le dictionnaire n'expose pas ses détails d'implémentation, ceux-ci pourraient être modifiés pour une meilleure disposition en mémoire sans rien changer au reste du programme.&lt;/p&gt;


&lt;p&gt;À partir de maintenant, la classe &lt;code&gt;People&lt;/code&gt; ne bougera plus. On notera que l'on peut toujours l'utiliser comme un objet normal. Simplement, ses données étant encapsulées, le client n'a pas à se soucier de leur stockage. À noter d'ailleurs que mis à part un changement de nom pour le paramètre du constructeur, l'interface de &lt;code&gt;People&lt;/code&gt; n'a pas changé. Du code client écrit utilisant &lt;code&gt;People&lt;/code&gt; n'aurait pas à être réécrit alors que, en-dessous, nous avons remanié grandement le stockage de ses données&amp;nbsp;!&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;list&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;map&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;algorithm&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; People
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
            name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; name;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NameDictionary
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; SetAndGetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;iterator&lt;/span&gt; found &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;found &lt;span style=&quot;color: #000080;&quot;&gt;==&lt;/span&gt; allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
                found &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;found;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; allNames;
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; PeopleList
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        PeopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        ~PeopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            CleanList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Add&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; nameInDictionary &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; dictionary.&lt;span style=&quot;color: #00eeff;&quot;&gt;SetAndGetName&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; GetList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; peopleList;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameDictionary dictionary;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; peopleList;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; CleanList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                &lt;span style=&quot;color: #0000dd;&quot;&gt;delete&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NameCounter
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; PeopleList &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; internalList &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;GetList&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; internalList.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; internalList.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; people &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
                &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;count.&lt;span style=&quot;color: #00eeff;&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;people&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
                &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                    count.&lt;span style=&quot;color: #00eeff;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;pair&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;people&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
                &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;count&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;people&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Print&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; count.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; count.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;pair&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; entry &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
&amp;nbsp;
                std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;cout&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Name : &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; entry.&lt;span style=&quot;color: #00eeff;&quot;&gt;first&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot; with count : &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; entry.&lt;span style=&quot;color: #00eeff;&quot;&gt;second&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; count;
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; main&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;argv&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    PeopleList peopleList;
&amp;nbsp;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Paul&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Jean&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; i &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;; i &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;1000&lt;/span&gt;; &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;i&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Luc&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        NameCounter counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;Print&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;Changeons les calculs&lt;/h3&gt;


&lt;p&gt;Dans cette nouvelle étape, je m'attaque au &lt;code&gt;NameCounter&lt;/code&gt;. Celui-ci a en effet un gros problème&amp;nbsp;: à chaque fois que l'on veut obtenir le nombre d'occurrences de chaque prénom, l'objet refait les calculs et en profite pour allouer une structure gourmande en mémoire (le &lt;code&gt;std::map&lt;/code&gt;). L'avantage est que cette mémoire n'est utilisée que lors du besoin de comptage. L'inconvénient est que cela prend vraiment beaucoup de mémoire et de temps.&lt;/p&gt;


&lt;p&gt;L'idée est donc de garder la statistique qui nous intéresse quelque part et de la calculer au fur et à mesure de l'ajout de personnes à l'instance de &lt;code&gt;PeopleList&lt;/code&gt;. C'est facile, car il n'y a qu'un seul moyen d'ajouter des personnes. Défense cependant d'ajouter le comptage directement à &lt;code&gt;PeopleList&lt;/code&gt;, je vais utiliser un objet spécialisé dans ce comptage.&lt;/p&gt;


&lt;p&gt;Il y a un autre choix à faire&amp;nbsp;: est-ce que le nombre d'occurrence est à stocker dans le dictionnaire de noms ou pas. Je choisi que non. Au final, la mémoire utilisée sera légèrement plus importante, mais on conserve une flexibilité intéressante&amp;nbsp;: pas besoin de changer le dictionnaire lorsque l'on ne veut pas compter les occurrences.&lt;/p&gt;


&lt;p&gt;La classe ajoutée est &lt;code&gt;NameUsageCounter&lt;/code&gt;. À chaque ajout de personne à la liste, on lui signal le prénom utilisé. L'objet enregistre une référence vers le dictionnaire et augmente une compteur.&lt;/p&gt;


&lt;p&gt;L'usage de cette classe permet de se passer du &lt;code&gt;GetList()&lt;/code&gt; de &lt;code&gt;PeopleList&lt;/code&gt; qui cassait l'encapsulation en le remplaçant par &lt;code&gt;GetCounter()&lt;/code&gt;. On pourra objecter que l'on expose toujours des détails internes. Dans une certaine mesure, oui, et on pourrait pousser le design pour éviter cela, mais il faut mettre une limite à cet article.&lt;/p&gt;


&lt;p&gt;&lt;code&gt;NameCounter&lt;/code&gt; profite grandement de &lt;code&gt;NameUsageCounter&lt;/code&gt; et se contente d'aller y piocher les informations à afficher.&lt;/p&gt;


&lt;p&gt;C'est beaucoup plus rapide, et ça prend beaucoup moins de place (un peak de moins de 40ko).&lt;/p&gt;


&lt;p&gt;&lt;code&gt;NameUsageCounter&lt;/code&gt; utiliser un &lt;code&gt;std::vector&lt;/code&gt; en interne. Là encore, ce n'est pas une structure bien stable en mémoire, même si pour le faible nombre de prénoms de mon exemple, cela a peu d'influence. Connaître le nombre maximum de prénom permettrait une structure plus fixe et plus gentille avec les accès mémoire.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;list&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;map&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;vector&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;algorithm&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; People
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
            name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; name;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NameDictionary
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; SetAndGetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;iterator&lt;/span&gt; found &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;found &lt;span style=&quot;color: #000080;&quot;&gt;==&lt;/span&gt; allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
                found &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;found;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; allNames;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NameUsageCounter
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;struct&lt;/span&gt; Entry
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            Entry&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; nameForEntry&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
                name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;nameForEntry&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;,
                count&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; name;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; count;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;typedef&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;Entry&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; EntryCollection;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameUsageCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; AddUsage&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; counter &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; FindCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                counter &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; CreateCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
            &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;Entry&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; GetEntries&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; counters;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        EntryCollection counters;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; FindCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; counterCount &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; counters.&lt;span style=&quot;color: #00eeff;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; index &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;; index &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt; counterCount; &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;index&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;counters&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;index&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;name&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
                &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;counters&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;index&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;count&lt;/span&gt;;
                &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; CreateCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            counters.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;Entry&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;counters.&lt;span style=&quot;color: #00eeff;&quot;&gt;back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;ostream&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; operator &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;ostream&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; out, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; NameUsageCounter&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;Entry&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; entry&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    out &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Name : &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;entry.&lt;span style=&quot;color: #00eeff;&quot;&gt;name&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot; with count : &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; entry.&lt;span style=&quot;color: #00eeff;&quot;&gt;count&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; out;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; PeopleList
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        PeopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        ~PeopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            CleanList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Add&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; nameInDictionary &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; dictionary.&lt;span style=&quot;color: #00eeff;&quot;&gt;SetAndGetName&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;AddUsage&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; NameUsageCounter &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; GetCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; counter;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameDictionary dictionary;
        NameUsageCounter counter;
&amp;nbsp;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; peopleList;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; CleanList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                &lt;span style=&quot;color: #0000dd;&quot;&gt;delete&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NameCounter
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; PeopleList &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
            counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;GetCounter&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Print&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            NameUsageCounter&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;EntryCollection&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;GetEntries&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            NameUsageCounter&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;EntryCollection&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;GetEntries&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;cout&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; NameUsageCounter &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; counter;
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; main&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;argv&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    PeopleList peopleList;
&amp;nbsp;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Paul&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Jean&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; i &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;; i &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;1000&lt;/span&gt;; &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;i&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Luc&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        NameCounter counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;Print&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;h3&gt;Une dernière modification mémoire&lt;/h3&gt;


&lt;p&gt;Le programme est donc bien «&amp;nbsp;orienté objet », il y a même plus de classes qu'au début, avec une encapsulation correcte sans être académiquement parfaite.&lt;/p&gt;


&lt;p&gt;Je donne un dernier petit exemple de modification de structure de données pour montrer à quel point l'architecture orientée données est orthogonale, et même facilitée, par une programmation objet.&lt;/p&gt;


&lt;p&gt;Imaginons que lors de notre profiling, nous découvrions que l'indirection dans &lt;code&gt;NameUsageCounter::Entry&lt;/code&gt; pour afficher le nom soit coûteuse (le programme n'est pas assez complexe et la plupart des performances sont de toute façons impactées par l'utilisation de &lt;code&gt;std::string&lt;/code&gt; et de &lt;code&gt;std::ostream&lt;/code&gt;...). Nous aimerions avoir dans Entry une copie de la donnée prénom.&lt;/p&gt;


&lt;p&gt;Voyons comme les modifications sont minimes. Une taille maximum de chaine est nécessaire pour que &lt;code&gt;Entry&lt;/code&gt; puisse être accédée directement. &lt;code&gt;Entry&lt;/code&gt; gagne un tableau de caractères local. &lt;code&gt;NameUsageEntry&lt;/code&gt; gagne un std::vector de références vers les entrées du dictionnaire nécessaire à &lt;code&gt;FindCounter()&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Et voilà, &lt;code&gt;Entry&lt;/code&gt; est prête pour des traitements de longs tableaux contigus en mémoire. Seul du code de &lt;code&gt;NameUsageCounter&lt;/code&gt; (et l'operator &amp;lt;&amp;lt; associé) a du être modifié.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;cstring&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;list&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;map&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;vector&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;algorithm&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; People
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
            name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; GetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; name;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NameDictionary
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; SetAndGetName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;iterator&lt;/span&gt; found &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;found &lt;span style=&quot;color: #000080;&quot;&gt;==&lt;/span&gt; allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
                found &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, allNames.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;found;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; allNames;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; MAX_NAME_SIZE &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;7&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NameUsageCounter
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;struct&lt;/span&gt; Entry
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            Entry&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; nameForEntry&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
                count&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;strncpy&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;localName, nameForEntry.&lt;span style=&quot;color: #00eeff;&quot;&gt;c_str&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;, MAX_NAME_SIZE&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
                localName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;MAX_NAME_SIZE&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;'&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\0&lt;/span&gt;'&lt;/span&gt;;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; localName&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;MAX_NAME_SIZE&lt;span style=&quot;color: #0000dd;&quot;&gt;+1&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; count;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;typedef&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;Entry&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; EntryCollection;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameUsageCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; AddUsage&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; counter &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; FindCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                counter &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; CreateCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
            &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;Entry&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; GetEntries&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; counters;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        EntryCollection counters;
&amp;nbsp;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; names;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; FindCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; counterCount &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; counters.&lt;span style=&quot;color: #00eeff;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; index &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;; index &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt; counterCount; &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;index&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;names&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;index&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
                &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;counters&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;index&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;count&lt;/span&gt;;
                &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;NULL&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; CreateCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            counters.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;Entry&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            names.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;counters.&lt;span style=&quot;color: #00eeff;&quot;&gt;back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;ostream&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; operator &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;ostream&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; out, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; NameUsageCounter&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;Entry&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; entry&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    out &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Name : &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; entry.&lt;span style=&quot;color: #00eeff;&quot;&gt;localName&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot; with count : &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; entry.&lt;span style=&quot;color: #00eeff;&quot;&gt;count&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; out;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; PeopleList
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        PeopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        ~PeopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            CleanList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Add&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;string&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; nameInDictionary &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; dictionary.&lt;span style=&quot;color: #00eeff;&quot;&gt;SetAndGetName&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; People&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;AddUsage&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;nameInDictionary&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; NameUsageCounter &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; GetCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; counter;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameDictionary dictionary;
        NameUsageCounter counter;
&amp;nbsp;
        std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; peopleList;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; CleanList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;People &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                &lt;span style=&quot;color: #0000dd;&quot;&gt;delete&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NameCounter
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        NameCounter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; PeopleList &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
            counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;GetCounter&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Print&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
            NameUsageCounter&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;EntryCollection&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; it &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;GetEntries&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
            NameUsageCounter&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;EntryCollection&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #00eeff;&quot;&gt;const_iterator&lt;/span&gt; itEnd &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;GetEntries&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
            &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;it &lt;span style=&quot;color: #000040;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; itEnd&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
                std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;cout&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;it;
                &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;it;
            &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; NameUsageCounter &lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt; counter;
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; main&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;argv&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    PeopleList peopleList;
&amp;nbsp;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Paul&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Jean&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; i &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;; i &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;1000&lt;/span&gt;; &lt;span style=&quot;color: #000040;&quot;&gt;++&lt;/span&gt;i&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        peopleList.&lt;span style=&quot;color: #00eeff;&quot;&gt;Add&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&amp;quot;Luc&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        NameCounter counter&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;peopleList&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        counter.&lt;span style=&quot;color: #00eeff;&quot;&gt;Print&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;h2&gt;Et donc&amp;nbsp;?&lt;/h2&gt;


&lt;p&gt;J'espère avoir montré, malheureusement sur un petit exemple seulement, que la programmation orientée objet et l'architecture orientée données ne se marchent pas sur les pieds, mais concourent ensemble pour le meilleur.&lt;/p&gt;


&lt;p&gt;Je n'ai pas traité le cas de classes virtuelles, cela m'aurait pris quelques heures de plus pour finalement pas grand chose&amp;nbsp;: vous avez du comprendre que l'on pourrait avoir plusieurs types de &lt;code&gt;People&lt;/code&gt; virtuels qui pourraient être utilisés comme tels, tout en utilisant des structures de données internes calibrées pour les traitements nécessaires au programme.&lt;/p&gt;


&lt;p&gt;Oui, il y a des pièges à la POO. Tout outil mal utilisé peut présenter des pièges.&lt;/p&gt;


&lt;p&gt;La présentation dont il est question initialement montre comment éviter l'un des pièges, mais il ne montre pas qu'il faut murer l'entrée amenant à ce piège.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Gamecamp Paris #1</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2009/12/07/Gamecamp-Paris-1</link>
    <guid isPermaLink="false">urn:md5:c50c495f1abe9aca5cc9462d3f36b4c6</guid>
    <pubDate>Tue, 15 Dec 2009 08:00:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Informatique</category>
        <category>informatique</category><category>jeu vidéo</category>    
    <description>&lt;p&gt;Samedi 5 décembre 2009 a eu lieu le premier Gamecamp à Paris. Il s'agissait d'un &lt;a href=&quot;http://fr.wikipedia.org/wiki/Barcamp&quot;&gt;Barcamp&lt;/a&gt; ayant pour thème la création de jeux vidéo.&lt;/p&gt;    &lt;p&gt;L'idée avait commencé à germer dans des commentaires de blogs et twitter. Cela faisait quelques temps que &lt;a href=&quot;http://www.bretzelsandgames.com/&quot;&gt;Whirly&lt;/a&gt; parlait du format Barcamp et du fait que cela n'avait pas été fait en France sur le thème de la création de jeux vidéo.&lt;/p&gt;


&lt;p&gt;Quelques personnes, dont &lt;a href=&quot;http://www.antipatterns.fr/&quot;&gt;Daz&lt;/a&gt; et &lt;a href=&quot;http://www.uacari.com&quot;&gt;Pedro&lt;/a&gt; ont pris le sujet à bras le corps et, d'un coup (2 semaines !), tout a pris forme&amp;nbsp;: le (ou la ?) Gamecamp Paris avait pris forme. Date, lieu, organisation, t-shirts,...&lt;/p&gt;


&lt;p&gt;Pas évident de dégager tout à coup un samedi aussi rapidement pour moi, et je remercie &lt;a href=&quot;http://au-pays-des-chonchons.blogspot.com/&quot;&gt;ma femme&lt;/a&gt; d'avoir pris sur elle pour que je puisse me rendre à cet évènement.&lt;/p&gt;


&lt;h2&gt;Arrivée&lt;/h2&gt;


&lt;p&gt;À 9h10, j'arrive chez &lt;a href=&quot;http://playall.wordpress.com/&quot;&gt;PlayAll&lt;/a&gt;, qui prête ses locaux gracieusement. Il n'y a pas encore grand monde, mais ça arrive a un rythme soutenu. Tout le monde discute en attendant le démarrage des sessions.&lt;/p&gt;


&lt;p&gt;Puis, à 9h30, Daz et Whirly font un petit discours de bienvenu et d'introduction du principe de la journée. Dans un Barcamp, il n'y a pas de programme, il y a un grand tableau croisé entre salles disponibles et horaires (une heure par session) et, sur la même base que le fait d'être venu, la volonté, chacun peut remplir une case avec un thème. À l'heure dite, il se rend alors dans la bonne salle et voit qui vient.&lt;/p&gt;


&lt;p&gt;Cela a tendance à gêner les habitués de la sur-planification, de même que le format d'une heure semble gêner les bavards.&lt;/p&gt;


&lt;p&gt;Pour la planification&amp;nbsp;: on est ici dans l'«&amp;nbsp;agile », beau buzzword qui sert surtout à décrire un fonctionnement où l'on s'adapte au fil de l'eau. Pas besoin de programme&amp;nbsp;: les gens qui sont venus, un samedi, hors boulot, sont a priori des gens qui ont envie de faire quelque chose de cette journée. Ils ne sont pas là en touriste. On peut donc leur faire confiance.&lt;/p&gt;


&lt;p&gt;Sur le second point&amp;nbsp;: une heure, c'est très bien. S'il reste des choses à dire, des sujets annexes qui sont apparus, pas de soucis, il suffit de noter un nouveau créneau sur le tableau. Il faut cependant veiller à garder le cap de la discussion pendant l'heure qui lui est consacrée.&lt;/p&gt;


&lt;p&gt;Un autre point qui a été soulevé est celui du mélange des métiers&amp;nbsp;: je trouve au contraire que c'est une bonne chose si le sujet s'y prête. Pour filtrer un métier, ce n'est pas compliqué, il suffit d'intituler une session de manière précise. Lorsque j'ai proposé le thème un peu technique des bases de code décentralisé (voire plus loin) j'étais à peu près certain de n'y retrouver que des métiers techniques.&lt;/p&gt;


&lt;p&gt;J'attends de voir deux premiers thèmes inscrits, je jette un coup d'œil à mes notes, et j'inscris à mon tour deux thèmes en faisant attention que cela ne chevauche pas un thème qui m'intéresse.&lt;/p&gt;


&lt;p&gt;Puis à 10h, débute la première session.&lt;/p&gt;


&lt;h2&gt;1. Méthodes agiles&lt;/h2&gt;


&lt;p&gt;Un sujet assez vaste et qui draine pas mal de monde. Dans le groupe, il y a des gens qui ne connaissent pas et sont venus pour découvrir, un petit rappel de quelques principes de méthodes agiles est donc fait.&lt;/p&gt;


&lt;p&gt;Une méthode agile est un ensemble de processus pour une gestion de projet qui puisse réagir rapidement aux changements&amp;nbsp;; c'est un ensemble d'outils pour une planification flexible et les métriques qui vont avec.&lt;/p&gt;


&lt;h3&gt;Expérience de Creative Patterns&lt;/h3&gt;


&lt;p&gt;Whirly (patron de &lt;a href=&quot;http://www.creative-patterns.com/&quot;&gt;Creative Patterns&lt;/a&gt;) expose brièvement sa mise en place de méthodes agiles, d'abord avec XP (eXtreme Programming) en 2001 puis Scrum (ces deux méthodes ne s'occupent pas exactement des mêmes choses et leurs principes sont compatibles).&lt;/p&gt;


&lt;p&gt;Les discussions vont ensuite flotter, mais Whirly va régulièrement donner des retours d'expérience tout au long de la session. Je regroupe le tout&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creative Patterns utilise Scrum avec le designer en tant que client des programmeurs.&lt;/li&gt;
&lt;li&gt;Pour les estimations, ils utilisent un story point en tant qu'une heure de Perfect Engineering (une heure consacrée entièrement à la tâche, sans interruption et avec toutes les ressources nécessaires disponibles&amp;nbsp;: une heure idéale).&lt;/li&gt;
&lt;li&gt;Après un suivi avec des cartons sur un tableau, l'équipe utilise &lt;a href=&quot;http://trac.edgewall.org/&quot;&gt;Trac&lt;/a&gt; pour la gestion des stories.&lt;/li&gt;
&lt;li&gt;Au début, ils testaient absolument tout, jusqu'à des tests d'interface utilisateurs. Maintenant, ils implémentent les tests &quot;gratuits&quot; (ceux qui ne demandent pas d'effort particulier et sont faits en parallèle du développement). Pour les tests plus complexe, une évaluation de l'intérêt du test par rapport à sa complexité et surtout, sa future maintenance, est faite avant de l'implémenter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Comme il y avait beaucoup de monde, que prendre la parole était assez difficile lors de cette session et que mon argument n'aurait pas avancé à grand chose sur place, je l'ajoute ici&amp;nbsp;: j'ai le même constat à propos des tests. Globalement, plus on s'enfonce dans les couches basses dans du code qui ne va pas changer, plus il est intéressant de faire du test. Plus on monte vers du code gameplay sensible aux modifications design, moins il est intéressant de faire du test automatique.&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Il donne aussi des conseils sur l'application de méthodes agiles lorsque d'autres intervenants avec des expériences malheureuses les rapportent&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;il est important que l'équipe de production soit protégée de l'éditeur/client. Cela fait partie de la conduite d'un projet que de filtrer les demandes externes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note personnelle&amp;nbsp;: je suis absolument d'accord, mais je précise qu'il ne faut pas traduire &quot;filtrage&quot; par &quot;mentir à l'équipe&quot;. Certains chefs de projet font cette erreur.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lors d'une réunion hebdomadaire de suivi de projet, la première question posée à chaque membre de l'équipe est&amp;nbsp;: &quot;comment te sens-tu ?&quot; Pendant la réponse, il n'est permit aucune interruption de parole et aucun jugement ne doit être porté sur la réponse. Après des premières semaines méfiantes où personne ne va oser se lancer, cette question devient une soupape de sécurité qui aide à faire remonter les problèmes le plus rapidement possible.&lt;/li&gt;
&lt;li&gt;mettre en place une méthode agile ne s'impose pas. C'est une méthode qui doit venir de l'équipe, qui pourra avoir besoin d'un temps d'adaptation. Pour cela, le mieux est d'avoir dans l'équipe au moins une personne (et éventuellement un noyau) à l'aise avec ces concepts. Le changement se fait alors par contamination, naturellement, lorsque les réfractaires se rendent compte des bénéfices qu'ils gagnent avec ces méthodes.&lt;/li&gt;
&lt;li&gt;il conseille aussi de segmenter l'équipe complète en cellules entre lesquels ont détermine des point de communication. Ces points de communication sont des membres d'équipe qui s'assurent que l'information passe&amp;nbsp;; cela ne signifie donc pas que toute information ou demande doit passer par eux.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Ces conseils se retrouvent généralement sous une forme ou une autre dans les livres ou articles à propos des méthodes agiles. Avoir quelqu'un qui raconte son expérience en face (ou presque) de soi est cependant un plus car il peut réagir aux mésaventures de ceux qui ont vécu de mauvaises expériences dans ce domaine.&lt;/em&gt;&lt;/p&gt;


&lt;h3&gt;Autres expériences&lt;/h3&gt;


&lt;p&gt;Des intervenants, la plupart des autres rapportaient de mauvaises expériences avec les méthodes agiles. Ou plus précisément avec Scrum. Ils étaient tous du même studio et s'étaient vu imposer Scrum par leur éditeur... sans mode d'emploi.&lt;/p&gt;


&lt;p&gt;Vu l'ampleur du changement, l'absence de compétence Scrum dans les équipes, la rigidité du fonctionnement qui transparaissait des témoignages et la taille des équipes de Scrum (jusqu'à 35 !), l'échec était assuré.&lt;/p&gt;


&lt;p&gt;Des exemples d'interventions directes du client/éditeur dans l'équipe ont été aussi rapportées.&lt;/p&gt;


&lt;p&gt;Pour un employé d'un autre studio, Scrum était vu dans son environnement pour quelque chose de trop raffiné.&lt;/p&gt;


&lt;h3&gt;Ma conclusion&lt;/h3&gt;


&lt;p&gt;Beaucoup de monde à cette session a empêché d'approfondir les choses. La majorité avait eu une mauvaise expérience avec Scrum. J'espère que cela ne les a pas empêcher d'écouter les très bonnes pistes de Whirly. Du fait du dialogue qui s'est instauré entre ces deux expériences, pratiquement aucune place n'a été laissé au reste.&lt;/p&gt;


&lt;p&gt;Cependant, la session a ouvert une autre session sur Scrum en particulier. Je ne l'ai pas suivie, mais d'après les retours que j'ai vu, il s'agissait d'expliquer un peu Scrum.&lt;/p&gt;


&lt;p&gt;C'est un avantage du fonctionnement par sessions d'une heure&amp;nbsp;: pour l'approfondissement d'un sujet, il suffit de proposer une nouvelle session sur le projet.&lt;/p&gt;


&lt;h2&gt;2. Perforce vs. Git&lt;/h2&gt;


&lt;p&gt;C'est une session que j'ai proposée, avec en sous-titre&amp;nbsp;: intérêt et mise en œuvre des bases décentralisées. Comme on peut le voir sur la photo du whiteboard, j'ai ajouté SVN sous Perforce et Bzr sous Git&amp;nbsp;; c'était suite à des commentaires derrière moi lorsque j'écrivais le sujet.&lt;/p&gt;


&lt;p&gt;Une erreur&amp;nbsp;: mieux vaut un titre clair. La session s'auto-régule par la suite.&lt;/p&gt;


&lt;p&gt;Un sujet un peu plus technique donc, à laquelle je ne m'attendais pas à voir grand monde... mais peut-être un peu plus quand même. Nous avons commencé à 3 et terminé à 5. L'avantage étant qu'avec ce format là, nous avons pu creuser un peu plus en profondeur.&lt;/p&gt;


&lt;p&gt;J'ouvre la session. Nous sommes deux à avoir utilisé Git ou un autre système décentralisé. On discute donc un peu de l'intérêt d'une solution ou d'une autre. L'accord est vite trouvé&amp;nbsp;: Git intéresse surtout les programmeurs, qui y gagnent en flexibilité de contrôle de révisions (branches gratuites, pas de blocage en cas de fermeture temporaire de base en vue de milestone, possibilité de travailler sur la même fichier dans deux «&amp;nbsp;changelist&amp;nbsp;» différentes,...).&lt;/p&gt;


&lt;p&gt;Il y a aussi consensus sur le fait qu'à moins d'outils pour cacher le fonctionnement, imposer Git à d'autres corps de métier n'est pas une bonne chose. De plus, ces autres métiers ont très souvent besoin de locker des fichiers binaires sur la base, ce que ne permet pas Git seul.&lt;/p&gt;


&lt;p&gt;Des essais ont été fait. On évoque une base de 17 Go a un historique de près de 230 Go. Git stockant l'historique sur chaque poste, cela peut poser des problèmes de place disque. Surtout si l'on travaille sur plusieurs projets. Chez un studio qui fait du jeu pour téléphone, les volumes sont de l'ordre de cent fois plus petit. Pour ces volumes, une solution Git complète (en gardant à l'esprit les commentaires sur les utilisateurs non programmeurs) peut être envisageable.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://sam.zoy.org/&quot;&gt;Sam&lt;/a&gt; propose alors une piste qu'il creuse lui-même en ce moment, à base d'un mélange de Perforce comme base centrale et de Git pour les programmeurs qui le veulent. Il utilise pour cela git-p4, qui permet de migrer les historiques entre les deux systèmes. Grâce à un jeu de Workspace (pour perforce), les données restent gérées par Perforce et seules les sources sont gérées par Git.&lt;/p&gt;


&lt;p&gt;Il mentionne aussi une version patchée de Git de son cru, git-bigfiles, qui a de meilleures performances sur les gros fichiers (voir son site).&lt;/p&gt;


&lt;p&gt;&lt;em&gt;La solution de Sam me plait. Je pense creuser dans cette direction dès que j'en ai le temps.&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Autres choses notées à cette session&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;une remarque de Daz, qui était à cette session&amp;nbsp;: on a des process de plus en plus long dans le jeu vidéo et il faut trouver les bon outils qui peuvent nous aider. Question base, à peu près tous les studios se greffent sur une solution Perforce ou Subversion, sans se poser trop de questions.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;d'un point de vue stockage, Nicolas L. fait remarquer que stocker des formats compressé n'est pas efficace avec Subversion (et probablement les autres). Les révisions étant stockées sous forme de &lt;em&gt;diff&lt;/em&gt; compressés, cela fonctionne mieux sur des formats de fichier où une petite modification entraine un petit changement dans le fichier. Ce n'est pas le cas des fichiers déjà compressés.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Pause déjeuner&lt;/h2&gt;


&lt;p&gt;C'est aussi un moment de discussion.&lt;/p&gt;


&lt;h2&gt;3. Outils libres dans la production&lt;/h2&gt;


&lt;p&gt;C'est le second thème que j'ai proposé. Une dizaine de personnes autour de la table, le plus gros des troupes étant parti sur les sessions sur Unreal et le piratage sur mobiles.&lt;/p&gt;


&lt;p&gt;Rapidement, on sépare deux grandes utilisations du libres&amp;nbsp;: bibliothèques intégrées à un jeu et outils utilisés de production.&lt;/p&gt;


&lt;p&gt;Un des premiers soucis de l'utilisation du libre dans une entreprise est la mauvaise connaissance de leurs licences par les départements légaux. Il y a souvent de la méfiance et une réaction qui consiste à refuser l'utilisation du libre car il n'est pas compris. Certaines entreprises n'aiment pas non plus n'avoir personne contre qui se retourner en cas de problème.&lt;/p&gt;


&lt;p&gt;À cela, les intervenants de la session partagent sur des pistes&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;communiquer sur les licences, les expliquer. Il faut aussi les expliquer aux employés pour éviter de retrouver du code GPL dans un jeu au code propriétaire par exemple. Lever la confusion entre libre et gratuit.&lt;/li&gt;
&lt;li&gt;montrer qu'avoir un éditeur contre qui se retourner n'est pas une garantie car 1/ des données perdues sont perdues, faire un procès n'arrange pas grand chose 2/ l'éditeur se retranchera à coup sûr derrière une mauvaise utilisation du produit par l'utilisateur 3/ l'éditeur peut tout simplement disparaitre, laissant l'utilisateur avec un produit non soutenu et un coût de migration obligatoire vers une autre solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour ce dernier exemple, autour de la table, nombreux sont ceux à avoir connu l'épisode du rachat de RenderWare par EA. C'est un bon exemple à montrer à quelqu'un qui voit dans l'existence d'un éditeur une garantie forte.&lt;/p&gt;


&lt;p&gt;Les intervenants sont aussi d'accord sur un point&amp;nbsp;: il faut être pragmatique. Si un outil correspond à un besoin, libre ou propriétaire n'est qu'une des variables permettant de choisir son utilisation ou non.&lt;/p&gt;


&lt;p&gt;D'après Whirly, il manque au secteur une vraie success story autour du libre, une entreprise qui communique sur le gain que lui a apporté le libre.&lt;/p&gt;


&lt;p&gt;Suivent les notes que j'ai pu prendre sur divers points, sans trop de mise en forme&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;la publication des modifications&amp;nbsp;: c'est une évidence pour quiconque a une sensibilité au logiciel libre, ça ne l'est pas forcément pour une entreprise qui n'utilise pas.&lt;/li&gt;
&lt;li&gt;le management confond souvent libre et gratuit. Une solution à base de logiciel libre ne doit surtout pas être présentée comme gratuite, ce qui est de toute façon faux.&lt;/li&gt;
&lt;li&gt;le coût du logiciel libre correspond en gros à la ressource qu'il faudra allouer localement à la maîtrise du produit, aux temps de merge du code, à la maintenance,...&lt;/li&gt;
&lt;li&gt;ce coût n'est pas inexistant pour du logiciel propriétaire&amp;nbsp;: ce n'est pas parce qu'il y a du support que tout est gratuit pour une équipe. Autour de la table, tout le monde est bien conscient que pour une solution propriétaire, il faut aussi une ressource locale allouée pour la maîtrise du produit, du temps pour le merge, de la maintenance,...&lt;/li&gt;
&lt;li&gt;ces coûts doivent être intégrés à la méthode de développement. Par exemple, un coût en story points pour une méthode agile.&lt;/li&gt;
&lt;li&gt;le libre présente un avantage d'indépendance par rapport à une entreprise tierce (qui peut-être rachetée par un concurrent ou  déposer le bilan).&lt;/li&gt;
&lt;li&gt;des pistes pour présenter l'intérêt d'une entreprise à contribuer au code libre&amp;nbsp;: il y a un intérêt à ce que plusieurs personnes réussissent au même endroit, c'est une sphère de prospérité&amp;nbsp;; tout le monde gagne à ne pas perdre du temps sur des outils dont tout le monde à besoin.&lt;/li&gt;
&lt;li&gt;il y a beaucoup d'outils de base (voire d'outils &quot;jouets&quot;) dans le libre concernant le jeu vidéo. Il manque au-dessus de ces projets des outils plus avancés. C'est là que devrait se concentrer l'effort d'entreprises intéressées par le libre, plutôt que sur une énième version d'outil déjà existant.&lt;/li&gt;
&lt;li&gt;il y a peu de temps, le middleware propriétaire était mal vu des entreprises, son utilisation et les bénéfices que cela apporte est à présent un fait bien intégré. Ce n'est pas encore le cas pour le libre.&lt;/li&gt;
&lt;li&gt;un soucis qui est relevé par le management est parfois de se dire que si on revend le produit contenant des modifications à des licences forçant la redistribution, du code confidentiel risque d'être rendu public. Cette question est tout à fait hypothétique. Autour de la table, personne n'a vu le cas se présenter. De plus, toutes les licences ne forcent pas la divulgation de l'intégralité du code attaché. On rejoint là l'un des premiers points&amp;nbsp;: former au libre.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Ma conclusion&lt;/h3&gt;


&lt;p&gt;Comment conclure sur ce sujet&amp;nbsp;? Je ne m'y risquerai pas. Je peux conclure sur la session&amp;nbsp;: une bonne session qui a montré une véritable envie de partager, au moins sur des points qui font perdre du temps aux productions. Nous avons tous des exemples d'outils ou des parties d'un moteur refait sur plusieurs projets différents de la même façon.&lt;/p&gt;


&lt;p&gt;Éduquer sur le sujet du libre sera un véritable gain pour les entreprises de jeu vidéo.&lt;/p&gt;


&lt;h2&gt;4. Partager les modifications custom aux moteurs et middleware&lt;/h2&gt;


&lt;p&gt;Une sorte de suite logique à la précédente question, proposée par Sam. Beaucoup de participants pendant cette heure étaient sur la session &quot;Prototypage&quot; juste à côté.&lt;/p&gt;


&lt;p&gt;Le constat de base de cette session est un de ceux faits lors de la sessions précédentes&amp;nbsp;: beaucoup de studios font les mêmes modifications, les même bugs fixs, aux mêmes moteurs et middleware. Cependant, ces modifications ne sont pas partagées, même dans les rares cas où le fournisseur du produit offre un espace de partage ou encourage aux retours pour intégration dans leur produit.&lt;/p&gt;


&lt;p&gt;Les participants à la session étant déçu de ce fait et certains acteurs dans le logiciel libre, nous avons essayé de comprendre pourquoi ce qui fonctionne bien dans le libre ne fonctionne pas dans ce cas.&lt;/p&gt;


&lt;p&gt;Voici quelques pistes&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Volonté de garder les ressources pour soi&amp;nbsp;: les studios passent du temps à corriger des produits qui ne sont pas à eux. L'intérêt immédiat est de pouvoir avancer dans sa production. Étant donné que l'on paye déjà pour le produit, donner le résultat des corrections est souvent vu comme un cadeau au fournisseur, sans intérêt.&lt;/li&gt;
&lt;li&gt;Manque de ressources à allouer à la gestion et communication sur le sujet&amp;nbsp;: remonter des patchs au fournisseur est un travail complexe car ces produits sont généralement lourds dans leur processus. De plus, les branches locales des productions peuvent avoir beaucoup divergées et la production du patch en est aussi lourde (il faut le rendre publiable, exempt de code confidentiel, ce qui n'est pas toujours évident suivant la qualité du produit).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cependant, un avantage évident à partager son code est à noter&amp;nbsp;: remonter un patch et le voir intégrer dans la version officielle du produit, c'est s'éviter un coût de merge lors de l'intégration d'une nouvelle version du produit. Ainsi, on paye une fois pour la production du patch, mais on ne paye plus à chaque intégration. Cela peut être très avantageux.&lt;/p&gt;


&lt;p&gt;Un autre obstacle au partage de modification à du middleware ou moteur est tout simplement le fournisseur&amp;nbsp;: il peut ne pas avoir mis en place un processus facile de remontée de patch, il peut n'avoir pas envie de voir ses clients communiquer, il peut y avoir quelques obstacles contractuels sur la propriété du code,...&lt;/p&gt;


&lt;h3&gt;Ma conclusion&lt;/h3&gt;


&lt;p&gt;Cette session est vite arrivée à une conclusion&amp;nbsp;: le partage de code dans du middleware propriétaire, pour être efficace, doit être encouragé et facilité par le fournisseur. Contrairement à un logiciel libre ou les différents clients/contributeurs sont libres (!) de ce qu'ils font, le code propriétaire nécessite que le fournisseur joue le jeu. En sachant qu'il y gagnera aussi.&lt;/p&gt;


&lt;h2&gt;5. Bosser sur des projets persos, chez soi&lt;/h2&gt;


&lt;p&gt;Au début de cette session, nous étions moins d'une dizaine. Personne ne semblait avoir lancé l'idée de la session, c'est donc Christophe de DK-Games qui se charge d'animer et l'on commence un tour de table.&lt;/p&gt;


&lt;p&gt;Et tout à coup, il semble que la moitié des participants à l'évènement vient nous rejoindre, sans trop de considération pour le fait que la session a déjà commencé. Petit bémol sur ce coup-là. Le début des sessions a lentement glissé le long de la journée, mais essayer d'arriver au début de la session et se faire discret lorsqu'on est en retard me semble une bonne chose.&lt;/p&gt;


&lt;p&gt;Du coup, le périmètre de la discussion a sensiblement varié. D'un départ a peu de personnes où nous allions parler de nos expériences précises, nous passons à beaucoup de personnes avec beaucoup de vues différentes. Comme je le disais au début, ce n'est pas forcément un mal, cela permet de donner des pistes sur des réflexions ultérieures plus précises.&lt;/p&gt;


&lt;h3&gt;Motivations&lt;/h3&gt;


&lt;p&gt;En début de la session, les participants essaient de savoir pourquoi il y a ce besoin d'avoir des projets personnels. Ce qui en ressort est que pour la plupart, il s'agit de faire quelque chose d'autre que ce que l'on fait au boulot, le plus souvent sans finalité de vente. Les projets avec finalité de transformation en projet professionnel sont minoritaires.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;'J'ajoute un cas, non évoqué pendant la session&amp;nbsp;: celui de la formation personnelle continue, sans finalité de produit fini.&lt;/em&gt;'&lt;/p&gt;


&lt;p&gt;Au niveau des moyens, tout le monde autour de la table connait les outils dont il a besoin, ou presque. Ceux qui ont des projets de game design utilisent des plateforme (moteurs ou mod), ceux qui font de la programmation utilisent du middleware,...&lt;/p&gt;


&lt;h3&gt;Motivation et temps&lt;/h3&gt;


&lt;p&gt;Reste le principal problème&amp;nbsp;: le temps à y consacrer et la motivation que l'on a.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;'On se rend compte sur cette partie que les professionnels chez eux ont strictement les mêmes problématiques que les amateurs. La différence se situe essentiellement dans la conscience de ces problèmes.&lt;/em&gt;'&lt;/p&gt;


&lt;p&gt;Question motivation, tout le monde est d'accord&amp;nbsp;: il est très difficile de la garder sur le long terme. Six ou sept mois en continu sur un projet semble être une limite pour la majorité. Les moyens de conserver sa motivation varient cependant beaucoup d'une personne à l'autre.&lt;/p&gt;


&lt;p&gt;Certains préfèrent avoir plusieurs projets de front pour pouvoir changer de projet et revenir plus tard. L'avantage est de ne pas abandonner ses idées, l'inconvénient est que cela rallonge la durée d'un projet au point d'en être dégouté, une sorte de perte de motivation de second niveau.&lt;/p&gt;


&lt;p&gt;Une autre manière de garder sa motivation est de viser un projet de taille raisonnable. Raisonnable s'entend en fonction de ses capacités mais aussi et surtout du temps que l'on peut consacrer au projet chez soi. Éventuellement, un projet de plus longue haleine peut être découpé en tâches modestes avec à la fin de chaque tâche, un produit fini. Une sorte de &quot;Scrum personnel&quot;. Pour aider dans cette méthode, utilisée par quelques participants, il est noté qu'un bug tracker, gestionnaire de tickets ou tout simplement un fichier de tâches est utilisé.&lt;/p&gt;


&lt;p&gt;Niveau gestion du temps, il y a presque autant de réponses que de participants prenant la parole: certains préfèrent s'imposer des horaires fixes, d'autre un nombre de tâches par jour, d'autres ne veulent pas de contraintes horaires,... À chacun de trouver ses méthodes.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;'Note&amp;nbsp;: les participants ayant des motivations et métiers différents, cela n'aidait pas aux discussions sur la gestion des tâches et du temps. Difficile de prendre des cas précis.&lt;/em&gt;'&lt;/p&gt;


&lt;h4&gt;Motivation de groupe&amp;nbsp;?&lt;/h4&gt;


&lt;p&gt;Pour certains, la motivation passe par le groupe&amp;nbsp;: à plusieurs, il est possible d'aller plus loin. Le recoupement des expériences montre que c'est cependant pas magique. La raison principale avancée comme explication à l'échec d'une équipe est que, tout simplement, il est difficile de travailler pour les idées des autres. Comme l'indique l'intitulé de la session, chez soi, on fait des projets personnels.&lt;/p&gt;


&lt;p&gt;Les cas d'équipe qui fonctionnent semble être ceux dans lesquels le projet est porté initialement par une seule personne qui fait plus de la moitié du travail et qui est capable de tout faire. Avoir un bon contact et passer du temps en communication aide en plus à fédérer des gens autour de son projet. Cependant, il ne faut pas chercher à garder ces contributeurs comme des employés, mieux vaut les considérer comme des contributeurs occasionnels.&lt;/p&gt;


&lt;h2&gt;6. Fédérer la communauté indy, partage technologique et autres&lt;/h2&gt;


&lt;p&gt;Dans cette session, c'est la partie partage qui m'intéressait. Je ne suis pas indépendant. Cependant, cela a du se voir dans les différentes sessions que j'ai suivi, je suis persuadé que le partage fait progresser tout le monde, tout en laissant à chacun de quoi se différencier dans ses projets. Nos métiers concerne le jeu, les moyens de faire des jeux, de bon jeux si possible. Et perdre du temps est un obstacle à la qualité.&lt;/p&gt;


&lt;p&gt;Cette session commence par essayer de savoir ce qu'est un indépendant. Ce n'est pas évident. Il n'y a pas eu de réponse claire, et ce n'est pas le sujet qui m'intéresse.&lt;/p&gt;


&lt;p&gt;Ce qui m'intéresse est&amp;nbsp;: comment partager&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Deux des sessions précédentes donnent des pistes, forcément. L'utilisation du logiciel libre est probablement un bon moyen. Whirly ajoute même&amp;nbsp;: une assurance. Une assurance qu'on ai accès à la ressource, que celle-ci ne disparaitra pas avec une entité (association, entreprise ou personne).&lt;/p&gt;


&lt;p&gt;La peur du libre est que certains soient des mauvais joueurs, qu'ils prendront sans donner. Le risque est très élevé, le monde du libre nous l'apprend, mais ce qu'il nous apprend aussi, c'est que l'impact est faible, ceux qui contribuent sont gagnants par rapport à ceux qui ne sont que clients.&lt;/p&gt;


&lt;p&gt;Un exemple simple, pour un petit studio qui a beaucoup participé à une technologie, voire qui en est le moteur, est qu'elle a ensuite la possibilité de vendre du service sur cette technologie.&lt;/p&gt;


&lt;p&gt;Il est évoqué que les outils sont souvent très adaptés aux besoins des studios. À cela, une solution semble se trouver dans les bases décentralisées (comme Git&amp;nbsp;; comme quoi, les sessions que j'ai suivi dans cette journée se recoupent).&lt;/p&gt;


&lt;p&gt;Le libre demande cependant une gestion de communauté. Là-dessus, la session n'a pas trouvé de solution claire, cela nécessite d'être fouillé car les possibilités sont nombreuses. L'exemple de boost et son comité de sélection a cependant été cité.&lt;/p&gt;


&lt;p&gt;Attention au phénomène de vide grenier&amp;nbsp;: mieux vaut pour cette hypothétique communauté travailler sur des outils ayant de la valeur ajoutée. Un exemple&amp;nbsp;: Ogre3d manque cruellement d'outils autour du moteur. Un autre exemple&amp;nbsp;: fournir des modules pour Unity3d.&lt;/p&gt;


&lt;p&gt;À plus long terme, une telle communauté pourrait s'intéresser au CIR et inversement.&lt;/p&gt;


&lt;p&gt;La session s'est beaucoup attachée au partage technologique, mais il n'y avait pas que des informaticiens autour de la table. Il serait possible de partager sur de la gestion de projet, du game design. Un GameCamp est d'ailleurs un bon exemple de partage. Une idée de gestion documentaire électronique est lancée, mais il s'agirait de ne pas copier l'existant (Gamasutra par exemple).&lt;/p&gt;


&lt;p&gt;Une autre idée de partage est lancée&amp;nbsp;: le peer review. Les petits studios n'ont pas la possibilité de payer des boites de play tests. Une communauté indépendante pourrait se faire tester ses jeux par les différents studios.&lt;/p&gt;


&lt;h2&gt;Fin&amp;nbsp;!&lt;/h2&gt;


&lt;p&gt;La journée arrive déjà à sa fin. Whirly nous avait prévenu&amp;nbsp;: une seule journée pour un BarCamp se termine généralement par de la frustration. Encore tant de choses à dire, à partager.&lt;/p&gt;


&lt;p&gt;Daz et Whirly font un petit debrief de la journée, sur le vif, en posant quelques questions. À première vue, tout le monde est satisfait.&lt;/p&gt;


&lt;p&gt;Le temps de dire au revoir, je rentre chez moi.&lt;/p&gt;


&lt;p&gt;Vraiment une bonne journée. Merci à tous.&lt;/p&gt;


&lt;h2&gt;Autres articles sur le GameCamp&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nicolas.hognon.com/blog/?p=99&quot; title=&quot;http://nicolas.hognon.com/blog/?p=99&quot;&gt;http://nicolas.hognon.com/blog/?p=9...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://yumenokaze.org/Jeu/GameCamp-premiere-edition&quot; title=&quot;http://yumenokaze.org/Jeu/GameCamp-premiere-edition&quot;&gt;http://yumenokaze.org/Jeu/GameCamp-...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bretzelsandgames.com/2009/12/09/and-then-there-was-a-gamecamp/&quot; title=&quot;http://www.bretzelsandgames.com/2009/12/09/and-then-there-was-a-gamecamp/&quot;&gt;http://www.bretzelsandgames.com/200...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.antipatterns.fr/archive/2009/12/25/gamecamp-2009-voila-c-est-fini.html&quot; title=&quot;http://www.antipatterns.fr/archive/2009/12/25/gamecamp-2009-voila-c-est-fini.html&quot;&gt;http://www.antipatterns.fr/archive/...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blogs.wefrag.com/channie/2009/12/06/gamecamp-paris/&quot; title=&quot;http://blogs.wefrag.com/channie/2009/12/06/gamecamp-paris/&quot;&gt;http://blogs.wefrag.com/channie/200...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href=&quot;http://www.puupuu.org/dotclear/public/jeux/video/2009/gamecamp/200912-Whiteboard.jpeg&quot; title=&quot;Whiteboard Gamecamp décembre 2009&quot;&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/jeux/video/2009/gamecamp/.200912-Whiteboard_m.jpg&quot; alt=&quot;Whiteboard Gamecamp décembre 2009&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Whiteboard Gamecamp décembre 2009, déc. 2009&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Vous faites quoi le 13 décembre ?</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2009/12/06/Vous-faites-quoi-le-13-d%C3%A9cembre</link>
    <guid isPermaLink="false">urn:md5:807a511af2073e2991554ccb55d92c92</guid>
    <pubDate>Sun, 06 Dec 2009 21:20:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Transports</category>
        <category>train</category><category>transilien</category>    
    <description>    &lt;p&gt;Grande campagne d'affichage en ce moment sur le réseau transilien pour l'arrivée de la nouvelle rame nommée «&amp;nbsp;le Francilien ». J'ai cru voir passer qu'il y avait eu des places offertes pour y monter dès le 12 décembre.&lt;/p&gt;


&lt;p&gt;Mon emploi du temps de fin d'année étant extrêmement chargé, je n'irai cependant pas le 13 décembre voir les premières rames rouler Gare du Nord.&lt;/p&gt;


&lt;p&gt;Pour plus de renseignements, allez voir sur &lt;a href=&quot;http://www.metro-pole.net/actu/article842.html&quot;&gt;Métro-pole&lt;/a&gt; par exemple.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/trains/2009/.20091205-NouveauTransilien_m.jpg&quot; alt=&quot;Nouveau Transilien&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Nouveau Transilien, déc. 2009&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Pourquoi les maths ? Pour Layton bien sûr !</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2009/12/03/Pourquoi-les-maths-Pour-Layton-bien-s%C3%BBr-%21</link>
    <guid isPermaLink="false">urn:md5:0b31b3881952b16386e3e79520291f5d</guid>
    <pubDate>Thu, 03 Dec 2009 08:00:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Général</category>
        <category>jeu</category>    
    <description>    &lt;p&gt;C'est au collège que j'ai entendu pour la première fois cette question d'élève&amp;nbsp;: à quoi servent les maths&amp;nbsp;? Il est vrai qu'après une étude très pratique des outils mathématiques dans le primaire, le collège enseigne des outils plus abstraits et que si certains enseignants arrivent à ancrer ces outils dans la pratique, certains oublient complètement cet aspect.&lt;/p&gt;


&lt;p&gt;J'ai entendu ensuite cette question plusieurs fois par ans et ce jusqu'au lycée. Les réponses des enseignants variaient et souvent n'étaient pas satisfaisantes, même pour moi qui me plaisait dans la manipulation des outils mathématiques.&lt;/p&gt;


&lt;p&gt;Depuis que les jeux vidéo de la série Professeur Layton sont sortis, une réponse est simple&amp;nbsp;: pourquoi les mathématiques&amp;nbsp;? Mais pour jouer à Layton bien sûr&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Dans le Professeur Layton (deux jeux sortis à ce jour en France), le joueur est amené à résoudre des énigmes&amp;nbsp;: logique, calcul, observation,... Il est aussi essentiel d'être attentif à l'énoncé du problème, quelques pièges y étant glissés.&lt;/p&gt;


&lt;p&gt;Les mathématiques de Layton, s'ils sont artificiels par rapport à l'histoire qui se déroule dans le jeu, sont néanmoins graphiques et tangibles dans la plupart des cas. On peut manipuler des objets, essayer des choses à tâtons. Quelques types d'énigmes reviennent, chaque fois dans une forme un peu plus complexe, et le joueur peut profiter de ce qu'il a appris des formes plus simples pour résoudre le problème plus directement. Des explications sur la résolution et sur les probables errements du joueur sont donnés à la fin d'une énigme ou avec des indices que l'on peut demander (en échange d'une perte de points).&lt;/p&gt;


&lt;p&gt;Peut-être que Layton peut faire aimer les maths à quelqu'un qui se pose la question de leur utilité.&lt;/p&gt;


&lt;p&gt;Puis l'on pourra introduire le fait que, plus que de résoudre les énigmes de Layton, les mathématiques servent à construire ces énigmes. Avis aux futurs créateurs de jeu...&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Table de jeu Golgotik</title>
    <link>http://www.puupuu.org/dotclear/index.php?post/2009/11/04/Table-de-jeu-Golgotik</link>
    <guid isPermaLink="false">urn:md5:7135255c3615548d5003de4b9c5dd4a9</guid>
    <pubDate>Wed, 04 Nov 2009 23:40:00 +0100</pubDate>
    <dc:creator>Sylvain Glaize</dc:creator>
        <category>Modélisme</category>
        <category>décors</category><category>fantasy</category><category>figurines</category><category>jeu</category>    
    <description>    &lt;p&gt;Pour les détails sur ce projet de table de jeu, je vous invite à aller voir &lt;a href=&quot;http://jedisjeux.blogspot.com/2009/11/golgothic-ca-prend-forme.html&quot;&gt;chez&lt;/a&gt; les &lt;a href=&quot;http://le-bligor.blogspot.com/2009/11/le-manoir-golgothik-2.html&quot;&gt;participants&lt;/a&gt; au projet. Je me suis contenté de prendre des photos.&lt;/p&gt;


&lt;p&gt;Suivant les écrans sur lequel je regarde ces montages, c'est plus ou moins sombre, au point de l'être trop. J'espère que c'est bon pour vous. Je ne pense pas prendre le temps de retravailler les couleurs.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.puupuu.org/dotclear/public/modelisme/2009/200910-Golgotik-montage_1.jpeg&quot; title=&quot;Golgotik 1&quot;&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/modelisme/2009/.200910-Golgotik-montage_1_m.jpg&quot; alt=&quot;Golgotik 1&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Golgotik 1, nov. 2009&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.puupuu.org/dotclear/public/modelisme/2009/200910-Golgotik-montage_2.jpeg&quot; title=&quot;Golgotik 2&quot;&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/modelisme/2009/.200910-Golgotik-montage_2_m.jpg&quot; alt=&quot;Golgotik 2&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Golgotik 2, nov. 2009&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.puupuu.org/dotclear/public/modelisme/2009/200910-Golgotik-montage_3.jpeg&quot; title=&quot;Golgotik 3&quot;&gt;&lt;img src=&quot;http://www.puupuu.org/dotclear/public/modelisme/2009/.200910-Golgotik-montage_3_m.jpg&quot; alt=&quot;Golgotik 3&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Golgotik 3, nov. 2009&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>