<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Greg&#039;s Devblog</title>
	<atom:link href="http://blog.molluskgames.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.molluskgames.com</link>
	<description>Par un développeur, pour les développeurs</description>
	<lastBuildDate>Thu, 06 Jan 2011 05:52:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Android 3.0 enfin présenté !</title>
		<link>http://blog.molluskgames.com/2011/01/06/android-3-0-enfin-presente/</link>
		<comments>http://blog.molluskgames.com/2011/01/06/android-3-0-enfin-presente/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 05:52:41 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Blabla]]></category>
		<category><![CDATA[Android 3.0]]></category>
		<category><![CDATA[Honeycomb]]></category>
		<category><![CDATA[tablettes]]></category>

		<guid isPermaLink="false">http://blog.molluskgames.com/?p=566</guid>
		<description><![CDATA[Ca fait longtemps qu'on l'attendait, à tel point qu'hier au boulot on se disant ne pas comprendre la stratégie de Google sur Android, avec un système pas du tout adapté aux tablettes et une relative opacité dans le développement (pour un projet OpenSource). Et bien voilà, ce matin est arrivée une belle vidéo illustrant ce [...]]]></description>
			<content:encoded><![CDATA[<p>Ca fait longtemps qu'on l'attendait, à tel point qu'hier au boulot on se disant ne pas comprendre la stratégie de Google sur Android, avec un système pas du tout adapté aux tablettes et une relative opacité dans le développement (pour un projet OpenSource).</p>
<p>Et bien voilà, ce matin est arrivée une belle vidéo illustrant ce que sera Android 3.0 (Honeycomb), et je dois avouer que contrairement à ce que je pensais, je ne suis pas déçu, bien au contraire ! Les fameuses 4 touches d'Android (parfois 3), à savoir Back, Menu, Home, et Search ne seront effectivement plus obligatoires, car intégrées directement dans l'interface. L'iPad n'a qu'à se tenir !</p>
<p>Sans plus attendre, je vous laisse découvrir la vidéo :</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="390" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/1fm9sSj4jKQ&amp;hl=en_US&amp;feature=player_embedded&amp;version=3" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="390" src="http://www.youtube.com/v/1fm9sSj4jKQ&amp;hl=en_US&amp;feature=player_embedded&amp;version=3" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Et vous, vous en pensez quoi ?</p>
<p style="text-align: right;"><a href="http://googlesystem.blogspot.com/">Via googlesystem.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.molluskgames.com/2011/01/06/android-3-0-enfin-presente/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Algorithme du lièvre et de la tortue</title>
		<link>http://blog.molluskgames.com/2010/12/30/algorithme-du-lievre-et-de-la-tortue/</link>
		<comments>http://blog.molluskgames.com/2010/12/30/algorithme-du-lievre-et-de-la-tortue/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 06:49:54 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Algo]]></category>
		<category><![CDATA[algo]]></category>
		<category><![CDATA[cycle]]></category>
		<category><![CDATA[Floyd]]></category>

		<guid isPermaLink="false">http://blog.molluskgames.com/?p=554</guid>
		<description><![CDATA[En cours il y a quelques temps un prof nous a demandé si on savait comment détecter des cycles en utilisant un espace mémoire en O(1). Pour illustrer pourquoi on peut avoir envie de ça, imaginons que l'on cherche à trouver 2 valeurs qui vont avoir le même hashé (avec la méthode de votre choix). [...]]]></description>
			<content:encoded><![CDATA[<p>En cours il y a quelques temps un prof nous a demandé si on savait comment détecter des cycles en utilisant un espace mémoire en O(1). Pour illustrer pourquoi on peut avoir envie de ça, imaginons que l'on cherche à trouver 2 valeurs qui vont avoir le même hashé (avec la méthode de votre choix).</p>
<p>On peut alors s'amuser à prendre 1 valeur au hasard, trouver son hashé, et ensuite utiliser cette nouvelle valeur comme valeur de départ, prendre son haché, etc... Là, on est sûr de trouver, au bout d'un temps potentiellement très long, une boucle (ou un cycle), comme sur l'image suivante (prise de wikipedia) :</p>
<p><a href="http://blog.molluskgames.com/wp-content/uploads/2010/12/200px-CycleFindingNew.png"><img class="aligncenter size-full wp-image-560" title="200px-CycleFindingNew" src="http://blog.molluskgames.com/wp-content/uploads/2010/12/200px-CycleFindingNew.png" alt="" width="200" height="224" /></a></p>
<p>La façon naïve de faire va être de stocker chacune des valeurs, et de comparer la nouvelle valeur avec toutes les valeurs précédentes. Si on veut éviter d'exploser en temps, on peut utiliser des énormes tables de hash. Sauf que voilà, il faut stocker toutes les valeurs, et on est donc en O(n) pour l'espace mémoire, n étant le nombre de valeurs avant qu'on ne cycle.</p>
<p>Je repose donc la question : comment peut-on effectuer le même traitement en O(1) pour l'espace mémoire ?<br />
Pas forcément intuitive, l'algorithme est au final particulièrement simple et élégant. Il a été défini par Floyd, et on le connait sous le nom d'algorithme du lièvre et de la tortue.</p>
<p>On peut écrire les opérations que l'on fait pour avancer sur la chaine sous la forme a<sub>i+1</sub> = f(a<sub>i</sub>), f étant la fonction qu'on utilise (fonction de hash dans l'exemple que j'ai donné). Mais au lieu d'itérer une seule fois sur la chaine, on va en fait lancer 2 itérations en parallèle :</p>
<ul>
<li>La tortue avance lentement, donc à chaque itération elle fait a<sub>i+1</sub> = f(a<sub>i</sub>)</li>
<li>Le lièvre est très rapide, il va donc avancer 2 par 2, avec b<sub>i+1</sub> = f(f(b<sub>1</sub>))</li>
</ul>
<p>De façon évidente, le lièvre va arriver dans le cycle avant la tortue, et va se retrouver à tourner dedans en attendant que la tortue n'arrive... Une fois que la tortue est dans le cycle, on a la garantie qu'elle va arriver à la même valeur que le lièvre au bout d'un temps donné, puisque qu'en fait le lièvre rattrape la tortue d'1 étape à chaque itération. Quel que soit l'écart entre les 2, une fois que la tortue arrive dans le cycle le lièvre sera sur le même noeud en au plus L itérations (L étant la taille du cycle).</p>
<p>Et du coup, on n'a besoin d'aucune mémoire supplémentaire pour savoir où est le cycle !<br />
Le pseudo-code, pris de wikipedia, est le suivant :<br />
<code>mu := 0;<br />
répéter<br />
&nbsp;&nbsp;mu := mu+1;<br />
&nbsp;&nbsp;x := f(x);<br />
&nbsp;&nbsp;y := f(f(y));<br />
tant que x &lt;&gt; y</code><br />
On peut difficilement faire plus simple...</p>
<p>Le seul défaut de cette méthode est la complexité : on reste en O(n), mais on va tout de même appeler 3*n fois la fonction f. Mais cette constante reste relativement faible par rapport au gain en mémoire (on passe de O(n) à O(1)...).</p>
<p>Plus d'informations sur <a href="http://fr.wikipedia.org/wiki/Algorithme_du_li%C3%A8vre_et_de_la_tortue">wikipedia</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.molluskgames.com/2010/12/30/algorithme-du-lievre-et-de-la-tortue/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Interrupted System Call</title>
		<link>http://blog.molluskgames.com/2010/12/18/interrupted-system-call/</link>
		<comments>http://blog.molluskgames.com/2010/12/18/interrupted-system-call/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 21:58:38 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[/dev/dsp]]></category>
		<category><![CDATA[fwrite]]></category>
		<category><![CDATA[system call]]></category>

		<guid isPermaLink="false">http://blog.molluskgames.com/?p=551</guid>
		<description><![CDATA[Hier j'essayais de terminer un petit player mp3 sur nos appareils eInk, mais au démarrage du mp3 ça quittait toujours brusquement. Le code récupéré des taiwanais utilise libmad, et pour faire simple, le principe est le suivi : On ouvre un flux sur "/dev/dsp" On le configure Libmad décompresse le mp3 petit à petit, et [...]]]></description>
			<content:encoded><![CDATA[<p>Hier j'essayais de terminer un petit player mp3 sur nos appareils eInk, mais au démarrage du mp3 ça quittait toujours brusquement. Le code récupéré des taiwanais utilise libmad, et pour faire simple, le principe est le suivi :</p>
<ul>
<li>On ouvre un flux sur "/dev/dsp"</li>
<li>On le configure</li>
<li>Libmad décompresse le mp3 petit à petit, et à chaque morceau décompressé on le balance dans /dev/dsp</li>
<li>On referme le flux quand on a fini...</li>
</ul>
<p>Parfois ça quittait dès le départ, et parfois on avait genre 1/4 de seconde du mp3 avant que ça ne quitte... On a rapidement repéré à quel endroit ça quittait : au moment d'écrire dans /dev/dsp (par blocs de 8192 octets), ça s'arrêtait très rapidement avec un message d'erreur : "Interrupted System Call".</p>
<p>Alors, à quoi correspond ce message ? En fait c'est tout simple : on a fait un appel système (ici, l'écriture dans /dev/dsp) qui a été interrompu par un signal... L'écriture dans /dev/dsp n'est en fait pas une opération atomique, donc on n'a aucune garantie qu'elle puisse se dérouler complètement en une seule fois.</p>
<p>La solution a mettre en place est assez basique : au lieu de quitter à la moindre interruption, on note combien d'octets ont déjà été écrits, on incrémente le pointeur d'autant, on décrémente la taille à écrire, et on relance le fwrite... Et ça marche !</p>
<p>Merci au site suivant pour la petite explication claire et précise : <a href="http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/0201433079/ch10lev1sec5.html">http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/0201433079/ch10lev1sec5.html</a></p>
<p>Note au passage : c'est marrant de voir comment tout est flux sur Unix... Du coup, pour jouer un son, c'est aussi un simple flux dans lequel on envoie les données du son à jouer. On peut même faire un "cat toto.wav &gt; /dev/dsp" et entendre son wav :p</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.molluskgames.com/2010/12/18/interrupted-system-call/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Temps des différents accès</title>
		<link>http://blog.molluskgames.com/2010/12/18/temps-des-differents-acces/</link>
		<comments>http://blog.molluskgames.com/2010/12/18/temps-des-differents-acces/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 19:29:39 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Blabla]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[vitesse]]></category>

		<guid isPermaLink="false">http://blog.molluskgames.com/?p=548</guid>
		<description><![CDATA[L'année dernière, en "Compilation Avancée", on a vu différentes méthodes permettant de réduire les défauts de cache, ce qui permet de gagner un bon gros facteur en terme de performances. Alors certes, pourquoi pas, mais on se rend compte qu'en règle général on a du mal à imaginer les écarts de temps... Un accès à [...]]]></description>
			<content:encoded><![CDATA[<p>L'année dernière, en "Compilation Avancée", on a vu différentes méthodes permettant de réduire les défauts de cache, ce qui permet de gagner un bon gros facteur en terme de performances.</p>
<p>Alors certes, pourquoi pas, mais on se rend compte qu'en règle général on a du mal à imaginer les écarts de temps... Un accès à une valeur du cache L2, est-ce vraiment beaucoup plus lent que pour le cache L1 ? Et que pour un accès en RAM ? Il existe donc un petit tableau "comparatif", histoire que tout programmeur puisse se faire une idée de l'importance de ce genre d'optimisations...<br />
Je ne l'ai pas traduit car de toute façon c'est relativement simple à comprendre, je vous laisse donc vous instruire <img src='http://blog.molluskgames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<table>
<tbody>
<tr>
<td>L1 cache reference</td>
<td align="right">0.5 ns</td>
</tr>
<tr>
<td>Branch mispredict</td>
<td align="right">5 ns</td>
</tr>
<tr>
<td>L2 cache reference</td>
<td align="right">7 ns</td>
</tr>
<tr>
<td>Mutex lock/unlock</td>
<td align="right">25 ns</td>
</tr>
<tr>
<td>Main memory reference</td>
<td align="right">100 ns</td>
</tr>
<tr>
<td>Compress 1K bytes w/ cheap algorithm</td>
<td align="right">3,000 ns</td>
</tr>
<tr>
<td>Send 2K bytes over 1 Gbps network</td>
<td align="right">20,000 ns</td>
</tr>
<tr>
<td>Read 1 MB sequentially from memory</td>
<td align="right">250,000 ns</td>
</tr>
<tr>
<td>Round trip within same datacenter</td>
<td align="right">500,000 ns</td>
</tr>
<tr>
<td>Disk seek</td>
<td align="right">10,000,000 ns</td>
</tr>
<tr>
<td>Read 1 MB sequentially from disk</td>
<td align="right">20,000,000 ns</td>
</tr>
<tr>
<td>Send packet CA-&gt;Netherlands-&gt;CA</td>
<td align="right">150,000,000 ns</td>
</tr>
</tbody>
</table>
<p style="text-align: left;">Un petit commentaire ? A la louche, un facteur 14 entre les accès au cache L1 et les accès au cache L2, et à nouveau un facteur de cet ordre pour un accès en mémoire principale. Comme quoi ça coûte vraiment cher !</p>
<p style="text-align: right;">Source : <a href="http://axisofeval.blogspot.com/2010/11/numbers-everybody-should-know.html">The Axis of Eval</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.molluskgames.com/2010/12/18/temps-des-differents-acces/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Comment reconnait-on un programmeur ?</title>
		<link>http://blog.molluskgames.com/2010/12/18/comment-reconnait-on-un-programmeur/</link>
		<comments>http://blog.molluskgames.com/2010/12/18/comment-reconnait-on-un-programmeur/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 10:01:34 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Blabla]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[programmeur]]></category>

		<guid isPermaLink="false">http://blog.molluskgames.com/?p=545</guid>
		<description><![CDATA[L'autre jour sur stackoverflow quelqu'un a posé une question assez marrante : comment reconnait-on un programmeur (ie, sans connaître la personne, juste à partir de petites manies/habitudes). J'ai regardé les réponses par curiosité, et je dois avouer que certaines me correspondent bien. J'ai testé avec ma copine, et dans l'ensemble elle approuve (avec une mention [...]]]></description>
			<content:encoded><![CDATA[<p>L'autre jour sur <a href="http://stackoverflow.com/questions/895296/how-can-you-tell-if-a-person-is-a-programmer">stackoverflow</a> quelqu'un a posé une question assez marrante : comment reconnait-on un programmeur (ie, sans connaître la personne, juste à partir de petites manies/habitudes).</p>
<p>J'ai regardé les réponses par curiosité, et je dois avouer que certaines me correspondent bien. J'ai testé avec ma copine, et dans l'ensemble elle approuve (avec une mention spéciale pour une réponse en particulier). Voici donc un petit panel rapide et non exhaustif :</p>
<ul>
<li>Utilisation des parenthèses imbriquées (je dois admettre que je le fais assez souvent (et même dans ce billet !))</li>
<li>Temps de latence anormalement long pour répondre à des questions pourtant très simples, du style "tu veux du thé ?". Ma copine râle beaucoup à propos de ça... Certains disent que c'est parce qu'il faut le temps de faire le pre-processing, l'analyse lexicale et syntaxique, et l'optimisation de la réponse, mais pour ma part je dirai que c'est juste que quand je suis concentré sur du code (ou un domaine relatif à la programmation) je suis un peu dans un mode de particulier (logique et proche de la machine, on va dire), et que du coup, effectivement, ça interrompt un peu le fil de ma pensée et il me faut un temps pour me "reconnecter". D'ailleurs, dans ma tête, souvent je suis en train de taper du code, et là ça fait "tiens, on me parle"... je continue à taper un peu, et puis au bout d'un même je switch sur le mode "social" et je réponds. Mais ça énerve ma copine d'attendre plus d'1 seconde pour ça.</li>
<li>Numérotation qui commence à 0. Je ne comprends d'ailleurs toujours pas pourquoi dans les éditeurs de code on numérote à partir de 1...</li>
<li>Pour un programmeur, 256 est un chiffre rond. Là je ne dirai que ce n'est pas forcément vrai pour tous les programmeurs, mais en tout cas pour ceux qui font pas mal de C/C++. En Java, je le vois beaucoup moins.</li>
<li>Le fait de revenir en arrière dans la call stack de la conversation. Ca j'ai tendance à le faire et c'est vrai que les gens n'aiment pas beaucoup, dans l'ensemble. Du style si je pensais à quelque chose à dire à un moment donné et qu'entre temps quelqu'un a parlé et que la conversation à avancé, dans ma tête c'est toujours présent, et à tout moment s'il y a un blanc je vais avoir tendance à revenir en arrière dans la conversation pour repartir de là où j'avais quelque chose à dire.</li>
</ul>
<p>Il y a pas mal d'autres réponses sympas sur le site, donc si vous avez un peu de temps à perdre, je vous invite à aller voir ça <img src='http://blog.molluskgames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.molluskgames.com/2010/12/18/comment-reconnait-on-un-programmeur/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Call Stack en C/C++</title>
		<link>http://blog.molluskgames.com/2010/12/18/call-stack-en-cc/</link>
		<comments>http://blog.molluskgames.com/2010/12/18/call-stack-en-cc/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 09:28:31 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Utils]]></category>
		<category><![CDATA[call stack]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[FBReader]]></category>

		<guid isPermaLink="false">http://blog.molluskgames.com/?p=541</guid>
		<description><![CDATA[Ces derniers temps je me suis attaché au portage d'FBReader sur différentes plateformes, et comme c'est un code assez conséquent et où j'avais besoin de voir un peu quel appel de fonction arrivait d'où (autrement que par le "find reference" d'Eclipse), j'ai cherché rapidement s'il n'y avait pas un moyen en C d'afficher des stack [...]]]></description>
			<content:encoded><![CDATA[<p>Ces derniers temps je me suis attaché au portage d'<a href="http://www.fbreader.org/">FBReader</a> sur différentes plateformes, et comme c'est un code assez conséquent et où j'avais besoin de voir un peu quel appel de fonction arrivait d'où (autrement que par le "find reference" d'Eclipse), j'ai cherché rapidement s'il n'y avait pas un moyen en C d'afficher des stack trace. A ma grande surprise, c'est possible !</p>
<p>Voici donc une petite fonction qui peut se révéler utile lorsqu'on fait du debug <img src='http://blog.molluskgames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="brush: cpp;">#include &lt;execinfo.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

/* Obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
  void *array[10];
  size_t size;
  char **strings;
  size_t i;

  size = backtrace (array, 10);
  strings = backtrace_symbols (array, size);

  printf (&quot;Obtained %zd stack frames.\n&quot;, size);

  for (i = 0; i &lt; size; i++)
     printf (&quot;%s\n&quot;, strings[i]);

  free (strings);
}</pre>
<p>Ca m'a bien dépanné, et même si je ne m'en suis pas tellement servi au final (juste une fois), je pense que ça fait parti des petits bouts de code toujours utiles à avoir sous le coude...</p>
<p>Pour plus de détails, je vous invite à vous rendre sur le <a href="http://www.gnu.org/software/libc/manual/html_node/Backtraces.html">site de GNU</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.molluskgames.com/2010/12/18/call-stack-en-cc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Taiwanais : comeback !</title>
		<link>http://blog.molluskgames.com/2010/12/13/code-taiwanais-comeback/</link>
		<comments>http://blog.molluskgames.com/2010/12/13/code-taiwanais-comeback/#comments</comments>
		<pubDate>Sun, 12 Dec 2010 23:00:45 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Blabla]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[taiwanais]]></category>

		<guid isPermaLink="false">http://blog.molluskgames.com/?p=536</guid>
		<description><![CDATA[Ca faisait assez longtemps que je n'avais pas eu à jouer avec du code fait à l'étranger, et là je suis tombé sur quelques éléments intéressants à nous. Je vais commencer par ce qui me parait être le plus sympa, alors voilà, les magic number dans toute leur splendeur... On est dans une classe "Image", [...]]]></description>
			<content:encoded><![CDATA[<p>Ca faisait assez longtemps que je n'avais pas eu à jouer avec du code fait à l'étranger, et là je suis tombé sur quelques éléments intéressants à nous.</p>
<p>Je vais commencer par ce qui me parait être le plus sympa, alors voilà, les magic number dans toute leur splendeur... On est dans une classe "Image", qui possède des getters pour largeur et hauteur :</p>
<pre class="brush: cpp;">// fix for null images
width(){
	if (myWidth &gt; 2000)
		return 39;

	return myWidth;
}</pre>
<p>Je vous épargne le reste du code, on a exactement la même chose pour la hauteur <img src='http://blog.molluskgames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   Pourquoi cette limite à 2000 ? Et pourquoi retourner 39 dans ce cas ? Aucune idée ! J'aime beaucoup le commentaire, par contre :p</p>
<p>Dans un registre un peu moins grave, une partie du code qui est copiée/collée un peu partout, et qui sert à convertir une valeur sur 8 bits (de 0 à 255, pour un niveau de gris) en 4 valeurs (0x00, 0x40, 0x80, et 0xC0) :</p>
<pre class="brush: cpp;">if (pixel &lt; 64)
	pixel = 0x00;
else if (pixel &lt; 128)
	pixel = 0x40;
else if (pixel &lt; 192)
	pixel = 0x80;
else
	pixel = 0xC0;
	</pre>
<p>Alors, cette fois-ci au moins on comprend le code, à quoi il sert. Par contre, ça fait 8 lignes copiées/collées à une dizaine d'endroits différents, ce n'est pas terrible, d'autant plus que ça revient juste à retirer les bits de poids faible :</p>
<pre class="brush: cpp;">pixel &amp;= ~63;</pre>
<p>Je me demande si GCC est capable d'optimiser ça, d'ailleurs.</p>
<p>Un petit dernier pour la route, mais cette fois-ci, ce n'était pas du code taiwanais, c'était du beau code de la fac :p. Vu dans une méthode :</p>
<pre class="brush: cpp;">if (this == null){
	doSomething();
} else {
	doSomethingElse();
}</pre>
<p>Un avis ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.molluskgames.com/2010/12/13/code-taiwanais-comeback/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Chrome Easter Egg</title>
		<link>http://blog.molluskgames.com/2010/12/10/chrome-easter-egg/</link>
		<comments>http://blog.molluskgames.com/2010/12/10/chrome-easter-egg/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 21:30:56 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Blabla]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[easter egg]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://blog.molluskgames.com/?p=529</guid>
		<description><![CDATA[Si vous suivez un minimum l'actualité, vous avez du voir que ça bouge du côté de Google et de Chrome OS : les testeurs ont reçu les premières machines, on commence à voir tourner la bête, et une vidéo de promotion est sortie. Jusque là, rien d'anormale... Certes... Sauf qu'en fait, au milieu de la [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous suivez un minimum l'actualité, vous avez du voir que ça bouge du côté de Google et de Chrome OS : les testeurs ont reçu les premières machines, on commence à voir tourner la bête, et<a href="http://www.youtube.com/watch?v=lm-Vnx58UYo"> une vidéo de promotion est sortie</a>.</p>
<p>Jusque là, rien d'anormale... Certes... Sauf qu'en fait, au milieu de la vidéo on voit sur un tableau une équation à la con, et du coup <a href="http://blog.jamendo.com/2010/12/10/jamendo-geeks-solve-the-hidden-chrome-os-equation/">des personnes de chez Jamendo se sont amusées à la résoudre</a>... Je vais vous laisser lire la suite sur leur blog, mais pour faire simple, on obtient une fraction qui peut être convertie en URL, et en allant sur cette URL... Un portable sous Chrome OS est offert ! Bon, c'est trop tard, c'était uniquement pour le premier venu, mais je trouve ça sympa d'avoir mis un easter egg en plein milieu de la vidéo.</p>
<p>Bravo à Google, et puis surtout bravo à ceux qui ont trouvé la réponse, il fallait le faire !</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/lm-Vnx58UYo?fs=1&amp;hl=fr_FR" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/lm-Vnx58UYo?fs=1&amp;hl=fr_FR" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.molluskgames.com/2010/12/10/chrome-easter-egg/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Algorithmes génétiques : petite voiture</title>
		<link>http://blog.molluskgames.com/2010/11/29/algorithmes-genetiques-petite-voiture/</link>
		<comments>http://blog.molluskgames.com/2010/11/29/algorithmes-genetiques-petite-voiture/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 12:02:26 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Blabla]]></category>
		<category><![CDATA[algorithmes génétiques]]></category>
		<category><![CDATA[voiture]]></category>

		<guid isPermaLink="false">http://blog.molluskgames.com/?p=522</guid>
		<description><![CDATA[Voici un petit programme flash qui montre la puissance des algorithmes génétiques : http://www.qubit.devisland.net/ga/index.html C'est sympa car très visuel, en fait, on voit la progression au fur et à mesure, avec le petit graph pour montrer ce que ça donne. Premier essai... Quand je suis tombé dessus ce matin, je me suis dit que j'allais [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un petit programme flash qui montre la puissance des algorithmes génétiques : <a href="http://www.qubit.devisland.net/ga/index.html">http://www.qubit.devisland.net/ga/index.html</a></p>
<p><a href="http://www.qubit.devisland.net/ga/index.html"><img class="aligncenter size-full wp-image-523" title="ga_cyclo" src="http://blog.molluskgames.com/wp-content/uploads/2010/11/ga_cyclo.png" alt="" width="508" height="411" /></a></p>
<p>C'est sympa car très visuel, en fait, on voit la progression au fur et à mesure, avec le petit graph pour montrer ce que ça donne.</p>
<h3>Premier essai...</h3>
<p>Quand je suis tombé dessus ce matin, je me suis dit que j'allais laisser tourner le programme quelques heures histoire que ça évolue bien et que ça donne une voiture super efficace. J'ai regardé de temps en temps, et voici ce que j'ai pu voir :</p>
<ul>
<li>Premières générations super aléatoires, car les roues ne sont pas forcément en bas !</li>
<li>Après 2-3 générations, la majorité des voitures générées ont au moins 1 roue en bas</li>
<li>Après une dizaine de générations, les voitures comment à pas mal avancer, mais l'évolution a été bizarre : elles ont toutes une roue en bas, et les poids sont mis de façon à équilibrer la voiture pour rouler ainsi. Du coup ça n'avance pas super loin car s'il y a trop de relief ça tombe</li>
<li>A un moment est apparue la première voiture avec 2 roues en bas, qui est allée 2 fois plus loin que les autres ! Mais les mutations à la génération suivante ont fait que les 2 roues du bas étaient très mal placées, du coup elle est allée moins loin que les voitures à 1 roue et a disparu...</li>
<li>Après quelques dizaines d'évolutions, les voitures à 2 roues ont remplacé les voitures à 1 roue, en gardant une disposition des poids similaires à celle des voitures à 1 roue</li>
<li>Après un peu de temps, une voiture beaucoup plus large que les autres est apparue, elle est beaucoup plus apte a franchir les obstacles, et a imposé son génome en 2-3 générations.</li>
</ul>
<p>Et en gros à partir de là, très peu d'évolution. Toutes les voitures sont sensiblement identiques, dès qu'une voiture un peu différente est générée, elle est moins bonne. Au final, j'étais déçu car aucune ne parvenait à passer le creux qu'on voit sur l'image au-dessus : elles se retournaient toutes.</p>
<h3>On peut faire mieux ?</h3>
<p>J'ai fini par me dire que ça pourrait être sympa de recommencer pour voir si l'évolution peut faire mieux. Et là, radicalement différent :</p>
<ul>
<li>Première génération, une voiture à 2 roues en bas qui avance un peu</li>
<li>Deuxième génération, plusieurs voitures à 2 roues assez efficaces, le génome se répand rapidement !</li>
<li>Cinquième génération, les voitures arrivent aussi loin que celles d'avant après une centaine de générations (...)</li>
<li>Huitième génération (à la louche), les voitures passent le creux et vont plus loin ! (comme on le voit sur l'image ci-dessus)</li>
</ul>
<p>C'est allé super vite ! En fait, du fait que les bonnes mutations soient arrivées très tôt, l'ensemble des voitures était encore composé de voitures très différentes, et le brassage a donc fait évoluer les choses très rapidement. Dans le cas précédent, tout avait évolué lentement, menant à des générations beaucoup trop homogène. C'est donc bien de la différence et de la diversité que vient la force des algorithmes génétiques.</p>
<p>Une fois qu'une génération est arrivée dans un optimum local, il devient très difficile d'en sortir, car toutes voiture qui est différente est potentiellement moins bonne, et donc va être oubliée... C'est d'ailleurs ce que je voyais sur le graph de progression : l'évolution se faisait par "breakthrough", comme on dit, avec de grands pas d'évolution d'un coup. Il faut qu'une voiture apporte une énorme amélioration sur les autres pour qu'elle soit gardée et que son génome soit passé à tout le monde au bout de quelques générations...</p>
<p>A l'occasion je m'attaquerai un peu à ce genre de programmation, je trouve ça très sympa, pas forcément difficile à faire (plus difficile à tweaker pour trouver la bonne taille de population, le bon taux de mutation, etc.), et puis visuellement c'est sympa à regarder (ça ferait un bon screensaver d'ailleurs).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.molluskgames.com/2010/11/29/algorithmes-genetiques-petite-voiture/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>1337 code : un blog très instructif</title>
		<link>http://blog.molluskgames.com/2010/11/29/1337-code-un-blog-tres-instructif/</link>
		<comments>http://blog.molluskgames.com/2010/11/29/1337-code-un-blog-tres-instructif/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 08:15:27 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Blabla]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[problèmes]]></category>

		<guid isPermaLink="false">http://blog.molluskgames.com/?p=519</guid>
		<description><![CDATA[Ce matin, au lieu de travailler (...) je farouillais encore un peu partout et je suis tombé sur un blog qui me parait très intéressant : http://www.ihas1337code.com Ce qu'il a d'intéressant, ce qu'il y a expose des problèmes avec des énoncés très courts, qui sont en fait globalement des problèmes d'algorithmique simple que l'on peut [...]]]></description>
			<content:encoded><![CDATA[<p>Ce matin, au lieu de travailler (...) je farouillais encore un peu partout et je suis tombé sur un blog qui me parait très intéressant : <a href="http://www.ihas1337code.com/">http://www.ihas1337code.com</a></p>
<p>Ce qu'il a d'intéressant, ce qu'il y a expose des problèmes avec des énoncés très courts, qui sont en fait globalement des problèmes d'algorithmique simple que l'on peut avoir en entretien d'embauche. Bon, moi les entretiens je m'en fous, mais les problèmes sont tous de mini-casse-têtes, intéressants à résoudre, et il y apporte des solutions souvent originales, et parfois des discussions annexes intéressantes.</p>
<p>Je vais surement reprendre ici certain des problèmes dans les semaines à venir. Et si jamais je suis très motivé je ferai les codes correspondants en Caml !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.molluskgames.com/2010/11/29/1337-code-un-blog-tres-instructif/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

