<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><!-- generator="wordpress/2.2" --><rss 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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Friggeri.net</title>
	<link>http://www.friggeri.net</link>
	<description>Sucre Syntaxique - le blog d'Adrien Friggeri</description>
	<pubDate>Sun, 29 Jul 2007 00:01:09 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2</generator>
	<language>en</language>
			<creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-sa/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://www.friggeri.net/feed/" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fwww.friggeri.net%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fwww.friggeri.net%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fwww.friggeri.net%2Ffeed%2F" src="http://o.aolcdn.com/myfeeds/html/vis/myaol_cta1.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Fwww.friggeri.net%2Ffeed%2F" src="http://www.rojo.com/corporate/images/add-to-rojo.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://www.friggeri.net/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fwww.friggeri.net%2Ffeed%2F" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fwww.friggeri.net%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fwww.friggeri.net%2Ffeed%2F" src="http://meeting.aomonline.org/2007/images/rss/pageflakes.png">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Résultats du sondage</title>
		<link>http://feeds.feedburner.com/~r/friggeri/~3/138382813/resultats-du-sondage</link>
		<comments>http://www.friggeri.net/blog/2007/07/29/resultats-du-sondage#comments</comments>
		<pubDate>Sun, 29 Jul 2007 00:01:09 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[Modal WM]]></category>

		<category><![CDATA[Concepts]]></category>
<category>deplacement</category><category>modal wm</category><category>sondage</category><category>spatial navigation</category>
		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/29/resultats-du-sondage</guid>
		<description><![CDATA[
J&#8217;ai fermé le sondage que j&#8217;avais lancé ici il y a quelques jours, et je publie donc les résultats que j&#8217;ai obtenus. Pour rappel voici un lien vers l&#8217;image qui était présente dans le sondage.
Le principe était le suivant : chaque sondé devait répondre à six questions de la forme De la case x en [...]]]></description>
			<content:encoded><![CDATA[<div class="jLanguage box"><span class="flag"><a href="?lan=english"><img alt="english" src="http://www.friggeri.net/wp-content/plugins/jLanguage/icons/en.png" /></a></span><span class="flag"><a href="?lan=french"><img alt="french" src="http://www.friggeri.net/wp-content/plugins/jLanguage/icons/fr.png" /></a></span></div>
<p>J&#8217;ai fermé le sondage que j&#8217;avais lancé <a href="/blog/2007/07/22/sondage-deplacement-sur-une-grille">ici</a> il y a quelques jours, et je publie donc les résultats que j&#8217;ai obtenus. Pour rappel voici un lien vers l&#8217;<a href="/wp-content/test.png">image</a> qui était présente dans le sondage.</p>
<p>Le principe était le suivant : chaque sondé devait répondre à six questions de la forme <em>De la case <strong>x</strong> en allant vers <strong>une direction</strong> on arrive sur :</em>, plusieurs possibilités lui étant fournies. Le sondage au moment de sa clôture avait reçu 460 réponses, et je remercie les participants.</p>
<p>J&#8217;avoue qu&#8217;en lançant ce sondage j&#8217;avais quelques idées sur le comportement type (s&#8217;il existe) de l&#8217;utilisateur. De plus, vues certaines réponses sur les différents sites où je l&#8217;ai soumis, j&#8217;ai été certains que les hypothèses suivantes avaient leur importance : </p>
<ul>
<li> <strong>h1</strong> : la destination est la case qui a l&#8217;arête la plus longue en commun avec l&#8217;origine</li>
<li> <strong>h2</strong> : la destination est la case qui a la plus grande aire</li>
<li> <strong>h3</strong> : c&#8217;est la case la plus à gauche qui prévaut quand on se déplace verticalement, et la plus en haut lorsqu&#8217;on se déplace horizontalement</li>
</ul>
<h4 id="toc-resultats">Resultats</h4>
<div class="right"><img src="/wp-content/images/survey/qu1.png" />
<div class="leg">Question 1</div>
</div>
<p><strong>Q1. De la case 3, en allant vers le haut, on arrive sur :</strong></p>
<p>La première question aurait plutôt tendance à invalider l&#8217;hypothèse <strong>h2</strong> et à favoriser l&#8217;hypothèse <strong>h1</strong>. En effet, avec plus de 90% de réponses en faveur de la case 1, la majorité est extrêmement nette.</p>
<div class="left"><img src="/wp-content/images/survey/qu2.png" />
<div class="leg">Question 2</div>
</div>
<p><strong>Q2. De la case 7, en allant vers la gauche, on arrive sur :</strong></p>
<p>Là où on pourrait s&#8217;attendre à des résultats similaires à la question 1, les réponses sont beaucoup moins tranchées. Non seulement la case 5 est beaucoup plus grande que la 6, mais en plus c&#8217;est elle qui a le coté le plus long en commun avec l&#8217;origine. Il faut tout de même noter qu&#8217;en proportion, l&#8217;arête commune représente 60% du coté de la case de départ, alors que dans la question 1 il représentait près de 80%. Ceci me porte à croire que l&#8217;aire n&#8217;a rien à voir avec la destination, invalidant l&#8217;hypothèse <strong>h2</strong>.</p>
<div class="right"><img src="/wp-content/images/survey/qu3.png" />
<div class="leg">Question 3</div>
</div>
<p><strong>Q3. De la case 4, en allant vers le bas, on arrive sur :</strong></p>
<p>Cette question ne visait pas à apporter plus d&#8217;informations sur la manière de choisir la destination mais à voir quel était le comportement de l&#8217;utilisateur en présence non pas de deux mais de trois possibilités. On observe que les réponses se sont réparties suivant l&#8217;ordre des longeurs des cotés communs : la plus grande ayant le plus de réponse favorable, la plus petite le moins. Ceci soutient l&#8217;hypothèse <strong>h1</strong>.</p>
<div class="left"><img src="/wp-content/images/survey/qu4.png" />
<div class="leg">Question 4</div>
</div>
<p><strong>Q4. De la case 5, en allant vers la droite, on arrive sur :</strong></p>
<p>Le but de cette question ci était de voir quelle était la réaction face à deux possibilités qui ne pouvaient être départagée par le critère de l&#8217;hypothèse <strong>h1</strong>. On remarque que la destination 4, qui est au dessus, à un leger avantage, ce qui penche en faveur de l&#8217;hypothèse <strong>h3</strong>, mais la différence est suffisamment réduite pour que cette information soit à prendre avec des pincettes.</p>
<div class="right"><img src="/wp-content/images/survey/qu5.png" />
<div class="leg">Question 5</div>
</div>
<p><strong>Q5. De la case 2, en allant vers le bas, on arrive sur :</strong></p>
<p>De manière à tester l&#8217;hypothèse <strong>h3</strong>, il faut comparer les résultats de cette question avec celle de la toute première. En effet, la situation est relativement similaire : il y a deux possibilités pour la case de destination, l&#8217;une d&#8217;entre elle ayant un long coté en commun et la seconde ayant non seulement un court coté en commun, mais <em>dépassant</em> de beaucoup la case d&#8217;origine. Par rapport à la longueur de la case 2, le coté commun avec la case 3 est bien moindre que lorsqu&#8217;il est mis en rapport avec la longueur de cette même case. Or on a vu jusqu&#8217;à présent que les résultats semblaient être très liés à la proportion de longueur commune. On aurait donc pu s&#8217;attendre à avoir un pourcentage bien plus faible en faveur de la case 3. Il faut donc ici insister sur le fait que la case 3 est <em>à gauche</em> de la case 4 alors que la case 2 est <em>à droite</em> de la case 1 (expliquant peut être les 9% obtenus à la question 1). Ceci étaye l&#8217;hypothèse <strong>h1</strong>.</p>
<div class="left"><img src="/wp-content/images/survey/qu6.png" />
<div class="leg">Question 6</div>
</div>
<p><strong>Q6. De la case 4, en allant vers la gauche, on arrive sur :</strong></p>
<p>Cette question est à mettre en relation avec la question 2 dont elle est le symétrique. L&#8217;idée ici était de valider ou non l&#8217;hypothèse <strong>h3</strong> en regardant l&#8217;influence de l&#8217;ordre vertical des possibilités. Dans la question 2, la case possédant le plus petit coté en commun était en bas et n&#8217;a obtenu que 25% de réponses positives alors que dans cette question ci, la case possédant le plus petit coté en commun était en haut et a obtenu 37% de réponses positives. Je pense qu&#8217;on peut donc affirmer que ceci valide l&#8217;hypothèse <strong>h3</strong></p>
<h4 id="toc-conclusion">Conclusion</h4>
<p>Sur les trois hypothèses que j&#8217;avais formulées au départ, l&#8217;une d&#8217;elle m&#8217;a l&#8217;air d&#8217;être confirmée (<strong>h1</strong>), une autre invalidée (<strong>h2</strong>) et une dernière pourrait être vraie (<strong>h3</strong>). Je dis <em>pourrais</em> parce qu&#8217;on m&#8217;a fait une reflexion très intéressante à laquelle je n&#8217;avais pas pensé auparavant, à savoir que le sens de lecture pourrait avoir une influence. En effet, la plupart des participants sont des occidentaux qui lisent de gauche à droite, de haut en bas ce qui expliquerait l&#8217;hypothèse <strong>h3</strong> ; en revanche, on me dit que si je faisais le même sondage auprès d&#8217;une population asiatique ou arabe, ayant un sens de lecture de droite à gauche, j&#8217;obtiendrais des résultats tout à fait différents, ce que je suis près à croire.</p>
<p>En conclusion, ces hypothèses étant plus claires à mes yeux, je me rends compte qu&#8217;il n&#8217;est pas possible de capturer un comportement commun à la plupart des gens. En effet, ayant deux paramètres (dont un qui semble-t&#8217;il dépend d&#8217;un facteur culturel) à prendre en compte lors du déplacement, paramètres ayant un impact différent d&#8217;un utilisateur à l&#8217;autre, je ne vois pas comment dégager un système de navigation précis, pour lequel un utilisateur ne viendra pas me hurler dessus en me disant que <strong>c&#8217;est contre intuitif</strong>.</p>
<p>J&#8217;ajouterai pour finir qu&#8217;on m&#8217;a aussi signalé une autre chose, à laquelle j&#8217;avais pensé puis mise de coté histoire de ne pas avoir à trop réfléchir : une relation de déplacement doit être symétrique ; à savoir que <em>x est à droite de y</em> doit être équivalent à <em>y est à gauche de x</em>, sans quoi le monde pourrait s&#8217;écrouler.</p>
<p>Quoiqu&#8217;il en soit, je remercie encore une fois les 460 participants<sup><a href="#footnote-1-63" id="footnote-link-1-63" class="footnote-link footnote-identifier-link" title="&#8221;Je sers la science et c&#8217;est ma joie&#8221;">1</a></sup> du temps qu&#8217;ils m&#8217;ont accordé.</p>
<ol start="1" class="footnotes"><li id="footnote-1-63" class="footnote">&#8221;Je sers la science et c&#8217;est ma joie&#8221; [<a href="#footnote-link-1-63" class="footnote-link footnote-back-link">↩</a>]</li></ol><img src="http://feeds.feedburner.com/~r/friggeri/~4/138382813" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.friggeri.net/blog/2007/07/29/resultats-du-sondage/feed</wfw:commentRss>
		<feedburner:origLink>http://www.friggeri.net/blog/2007/07/29/resultats-du-sondage</feedburner:origLink></item>
		<item>
		<title>Ce blog devient bilingue</title>
		<link>http://feeds.feedburner.com/~r/friggeri/~3/138278903/ce-blog-devient-bilingue</link>
		<comments>http://www.friggeri.net/blog/2007/07/28/ce-blog-devient-bilingue#comments</comments>
		<pubDate>Sat, 28 Jul 2007 14:10:14 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[Brèves]]></category>
<category>bilingue</category><category>english</category><category>francais</category><category>traduction</category>
		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/28/ce-blog-devient-bilingue/</guid>
		<description><![CDATA[
Depuis un certain temps j&#8217;hésitais beaucoup quant à la langue que je devais utiliser. D&#8217;un coté, étant français, je préfère écrire dans ma langue maternelle, d&#8217;autant plus que l&#8217;on trouve beaucoup moins de blogs de ce genre en français. D&#8217;un autre coté, en tant que développeur ou même tout simplement en tant qu&#8217;individu désireux de [...]]]></description>
			<content:encoded><![CDATA[<div class="jLanguage box"><span class="flag"><a href="?lan=english"><img alt="english" src="http://www.friggeri.net/wp-content/plugins/jLanguage/icons/en.png" /></a></span><span class="flag"><a href="?lan=french"><img alt="french" src="http://www.friggeri.net/wp-content/plugins/jLanguage/icons/fr.png" /></a></span></div>
<p>Depuis un certain temps j&#8217;hésitais beaucoup quant à la langue que je devais utiliser. D&#8217;un coté, étant français, je préfère écrire dans ma langue maternelle, d&#8217;autant plus que l&#8217;on trouve beaucoup moins de blogs de <em>ce genre</em> en français. D&#8217;un autre coté, en tant que développeur ou même tout simplement en tant qu&#8217;individu désireux de toucher un large public, j&#8217;ai bien souvent voulu écrire en anglais, langue qui prédomine aujourd&#8217;hui sur internet.</p>
<p>J&#8217;ai choisi de ne pas choisir... Et donc d&#8217;écrire en français et en anglais ; dorénavant, pour les billets qui à mes yeux méritent d&#8217;apparaitre dans les deux langues, deux petits drapeaux seront affiché <em>en haut à droite</em> pour choisir la langue. Bien entendu cela entraine plus de travail de ma part, mais ce n&#8217;est pas pour autant que l&#8217;activité devrait baisser.</p>
<p>Une dernière chose : je suis trop flemmard pour traduire les anciens articles, désolé <img src='http://www.friggeri.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/friggeri/~4/138278903" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.friggeri.net/blog/2007/07/28/ce-blog-devient-bilingue/feed</wfw:commentRss>
		<feedburner:origLink>http://www.friggeri.net/blog/2007/07/28/ce-blog-devient-bilingue</feedburner:origLink></item>
		<item>
		<title>Bookmarker, un plugin pour WordPress</title>
		<link>http://feeds.feedburner.com/~r/friggeri/~3/138278904/bookmarker-un-plugin-pour-wordpress</link>
		<comments>http://www.friggeri.net/blog/2007/07/26/bookmarker-un-plugin-pour-wordpress#comments</comments>
		<pubDate>Thu, 26 Jul 2007 21:50:59 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[WordPress]]></category>

		<category><![CDATA[Release]]></category>
<category>bookmarker</category><category>plugin</category><category>wordpress</category>
		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/26/bookmarker-un-plugin-pour-wordpress/</guid>
		<description><![CDATA[On voit sur beaucoup de blogs des liens qui permettent aux utilisateurs d&#8217;ajouter certains articles à leur aggrégateurs de favoris préférés (del.icio.us et autres). J&#8217;adhère à ce concept, mais je trouve dommage que la plupart des solutions existantes soient des services proposés par des sites commerciaux1. C&#8217;est pourquoi j&#8217;ai décidé d&#8217;écrire ce petit plugin, qui [...]]]></description>
			<content:encoded><![CDATA[<p>On voit sur beaucoup de blogs des liens qui permettent aux utilisateurs d&#8217;ajouter certains articles à leur aggrégateurs de favoris préférés (<a href="http://del.icio.us">del.icio.us</a> et autres). J&#8217;adhère à ce concept, mais je trouve dommage que la plupart des solutions existantes soient des services proposés par des sites commerciaux<sup><a href="#footnote-1-61" id="footnote-link-1-61" class="footnote-link footnote-identifier-link" title="addthis, entre autres">1</a></sup>. C&#8217;est pourquoi j&#8217;ai décidé d&#8217;écrire ce petit plugin, qui permet d&#8217;ajouter des boutons pour certains sites sur chaque article.</p>
<p>Concrètement, comment l&#8217;utiliser ? Dans votre thème wordpress, il suffit d&#8217;ajouter dans <em>The Loop</em> le code suivant : </p>
<div class="ch_code_container" style="font-family: monospace;white-space: nowrap;height:100%;"><span style="color: #000000; font-weight: bold;">&lt;?</span> <br />
<span style="color: #808080; font-style: italic;">// affiche des boutons vers digg, del.icio.us et facebook</span><br />
<span style="color: #0000ff;">$wpbookmarker</span>-&gt;<span style="color: #006600;">print_links</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;digg,delicious,facebook&quot;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #000000; font-weight: bold;">?&gt;</span></p>
<p><span style="color: #000000; font-weight: bold;">&lt;?</span><br />
<span style="color: #808080; font-style: italic;">// affiche des boutons vers l&#8217;intégralité des sites référencés</span><br />
<span style="color: #0000ff;">$wpbookmarker</span>-&gt;<span style="color: #006600;">print_all</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #000000; font-weight: bold;">?&gt;</span></p>
</div>
<p>La première version permet de choisir les icones à afficher, la seconde les affiche toutes. Pour en avoir un aperçu, c&#8217;est en bas à droite ;).</p>
<p>Les noms à utiliser dans <code>print_links</code> sont <em>en gros</em> les noms des sites, tout en minuscules, sans points. Et de toute facon : <em>read the fucking source</em> <img src='http://www.friggeri.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Voici la liste des 26 sites actuellement référencés : </p>
<ul>
<li><a href="http://myjeeves.ask.com">Ask</a></li>
<li><a href="http://www.blinklist.com">Blinklist</a></li>
<li><a href="http://www.blogmarks.net">Blogmarks</a></li>
<li><a href="http://www.bluedot.com">Bluedot</a></li>
<li><a href="http://del.icio.us">del.icio.us</a></li>
<li><a href="http://digg.com">digg</a></li>
<li><a href="http://www.diigo.com">Diigo</a></li>
<li><a href="http://www.facebook.com">Facebook</a></li>
<li><a href="http://www.furl.net">Furl</a></li>
<li><a href="http://www.google.com/bookmarks/">Google Bookmarks</a></li>
<li><a href="http://favorites.live.com">Live Bookmarks</a></li>
<li><a href="http://ma.gnolia.com">Ma.Gnolia</a></li>
<li><a href="http://www.mister-wong.de">Mr Wong</a></li>
<li><a href="http://www.netscape.com">Netscape</a></li>
<li><a href="http://www.netvouz.com">Netvouz</a></li>
<li><a href="http://www.newsvine.com">Newsvine</a></li>
<li><a href="http://www.rawsugar.com">RawSugar</a></li>
<li><a href="http://reddit.com">Reddit</a></li>
<li><a href="http://www.shadows.com">Shadows</a></li>
<li><a href="http://www.simpy.com">Simpy</a></li>
<li><a href="http://slashdot.org">Slashdot</a></li>
<li><a href="http://www.spurl.net">Spurl</a></li>
<li><a href="http://www.stumbleupon.com">Stumble Upon</a></li>
<li><a href="http://www.technorati.com">Technorati</a></li>
<li><a href="http://www.wink.com">Wink</a></li>
<li><a href="http://www.yahoo.com">Yahoo</a></li>
</ul>
<p>J&#8217;ajoute que le plugin a été codé de manière à pouvoir lui ajouter très rapidement des sites et que chaque lien est contenu dans une <code>span</code> qui a pour classe <code>socbm</code>, donc vous pouvez très aisément les styler.</p>
<div class="download_box">  <span class="label">Fichier : </span>  <span class="value">bookmarker.tar.gz</span><br/>  <span class="label">T&eacute;l&eacute;charg&eacute; : </span>  <span class="value">8 fois</span><br/>  <span class="label">Taille : </span>  <span class="value">16.3 ko</span><br/>  <span class="dl">    <a href="http://www.friggeri.net/download/bookmarker.tar.gz">[t&eacute;l&eacute;charger]</a>  </span></div>
<div class="clear"></div>
<ol start="1" class="footnotes"><li id="footnote-1-61" class="footnote"><a href="http://www.addthis.com">addthis</a>, entre autres [<a href="#footnote-link-1-61" class="footnote-link footnote-back-link">↩</a>]</li></ol><img src="http://feeds.feedburner.com/~r/friggeri/~4/138278904" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.friggeri.net/blog/2007/07/26/bookmarker-un-plugin-pour-wordpress/feed</wfw:commentRss>
		<feedburner:origLink>http://www.friggeri.net/blog/2007/07/26/bookmarker-un-plugin-pour-wordpress</feedburner:origLink></item>
		<item>
		<title>Ce qu’il faudrait ajouter à la syntaxe OCaml</title>
		<link>http://feeds.feedburner.com/~r/friggeri/~3/138278905/ce-quil-faudrait-ajouter-a-la-syntaxe-ocaml</link>
		<comments>http://www.friggeri.net/blog/2007/07/24/ce-quil-faudrait-ajouter-a-la-syntaxe-ocaml#comments</comments>
		<pubDate>Tue, 24 Jul 2007 15:06:32 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[OCaml]]></category>

		<category><![CDATA[Brèves]]></category>
<category>amélioration</category><category>camlp4</category><category>ocaml</category><category>sucre syntaxique</category>
		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/24/ce-quil-faudrait-ajouter-a-la-syntaxe-ocaml/</guid>
		<description><![CDATA[Après m&#8217;être amusé rapidement ce matin avec camlp4, je me dis que pour écrire mon window manager, ça pourrait être très sympa de le faire dans un caml avec une syntaxe enrichie... Donc je suis en train de réfléchir à ce qu&#8217;il faudrait ajouter à caml comme sucre syntaxique1 pour le rendre encore mieux.
Une première [...]]]></description>
			<content:encoded><![CDATA[<p>Après m&#8217;être amusé rapidement ce <a href="http://www.friggeri.net/blog/2007/07/24/comprehension-de-listes-en-ocaml/">matin</a> avec <strong>camlp4</strong>, je me dis que pour écrire mon window manager, ça pourrait être très sympa de le faire dans un caml avec une syntaxe enrichie... Donc je suis en train de réfléchir à ce qu&#8217;il faudrait ajouter à caml comme <em>sucre syntaxique</em><sup><a href="#footnote-1-60" id="footnote-link-1-60" class="footnote-link footnote-identifier-link" title="où ça un jeu de mot ?  ">1</a></sup> pour le rendre encore mieux.</p>
<p>Une première idée, c&#8217;est de pouvoir utiliser des instructions <code>let .. where</code>. Les deux versions ci dessous sont équivalentes.</p>
<div class="ch_code_container" style="font-family: monospace;white-space: nowrap;height:100%;"><span style="color: #06c; font-weight: bold;">let</span> _ = <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALprint_endline"><span style="">print_endline</span></a> <span style="color: #6c6;">&#40;</span>s <span style="color: #c6c;">5</span><span style="color: #6c6;">&#41;</span> <br />
&nbsp; where <span style="color: #06c; font-weight: bold;">rec</span> s = <span style="color: #06c; font-weight: bold;">function</span> <span style="color: #c6c;">0</span> -&gt; <span style="color: #3cb371;">&quot;mou&quot;</span> | n -&gt; <span style="color: #6c6;">&#40;</span>s <span style="color: #6c6;">&#40;</span>n<span style="color: #c6c;">-1</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span>^<span style="color: #3cb371;">&quot;ha&quot;</span></p>
<p><span style="color: #06c; font-weight: bold;">let</span> _ = <br />
&nbsp; <span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> s = <span style="color: #06c; font-weight: bold;">function</span><br />
&nbsp; &nbsp; <span style="color: #c6c;">0</span> -&gt; <span style="color: #3cb371;">&quot;mou&quot;</span><br />
&nbsp; | n -&gt; <span style="color: #6c6;">&#40;</span>s <span style="color: #6c6;">&#40;</span>n<span style="color: #c6c;">-1</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span>^<span style="color: #3cb371;">&quot;ha&quot;</span><br />
&nbsp; <span style="color: #06c; font-weight: bold;">in</span><br />
&nbsp; <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALprint_endline"><span style="">print_endline</span></a> <span style="color: #6c6;">&#40;</span>s <span style="color: #c6c;">5</span><span style="color: #6c6;">&#41;</span></p>
</div>
<p>La seconde idée, c&#8217;est d&#8217;utiliser les compréhensions de listes dont je parlais tout à l&#8217;heure, avec en plus quelque chose du genre : </p>
<div class="ch_code_container" style="font-family: monospace;white-space: nowrap;height:100%;"><span style="color: #06c; font-weight: bold;">let</span> l<span style="color: #3cb371;">&#8216; = [+ x+y | x &lt;- [1;2;3] when (x mod 2) = 1 | y &lt;- [1;5;10] when y&gt;3]<br />
(* l&#8217;</span> = <span style="color: #6c6;">&#91;</span><span style="color: #c6c;">6</span>;<span style="color: #c6c;">8</span>;<span style="color: #c6c;">11</span>;<span style="color: #c6c;">13</span><span style="color: #6c6;">&#93;</span> *<span style="color: #6c6;">&#41;</span></p>
</div>
<p>La troisième : avoir un moyen plus simple d&#8217;utiliser des tables de hachages, comme par exemple <a href="http://www.bononia.it/~zack/stuff/hashtbl_ext.ml">ça</a></p>
<p>La quatrième, une utilisation plus humaine des expressions régulières, genre <a href="http://web.yl.is.s.u-tokyo.ac.jp/~oiwa/caml/#regexp-pp">ça</a>..</p>
<p>Et pour finir, mais c&#8217;est peut être plus génant en caml qu&#8217;autre chose, s&#8217;affranchir des blocs explicites pour utiliser quelque chose de plus <em>pythonesque</em> : <a href="http://people.csail.mit.edu/mikelin/ocaml+twt/">The Whitespace Thing</a>.</p>
<p>D&#8217;autres idées d&#8217;améliorations?</p>
<ol start="1" class="footnotes"><li id="footnote-1-60" class="footnote">où ça un jeu de mot ? <img src='http://www.friggeri.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  [<a href="#footnote-link-1-60" class="footnote-link footnote-back-link">↩</a>]</li></ol><img src="http://feeds.feedburner.com/~r/friggeri/~4/138278905" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.friggeri.net/blog/2007/07/24/ce-quil-faudrait-ajouter-a-la-syntaxe-ocaml/feed</wfw:commentRss>
		<feedburner:origLink>http://www.friggeri.net/blog/2007/07/24/ce-quil-faudrait-ajouter-a-la-syntaxe-ocaml</feedburner:origLink></item>
		<item>
		<title>Compréhension de listes en OCaml</title>
		<link>http://feeds.feedburner.com/~r/friggeri/~3/138278906/comprehension-de-listes-en-ocaml</link>
		<comments>http://www.friggeri.net/blog/2007/07/24/comprehension-de-listes-en-ocaml#comments</comments>
		<pubDate>Tue, 24 Jul 2007 09:32:52 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[OCaml]]></category>

		<category><![CDATA[Programmation]]></category>
<category>compréhension de liste</category><category>liste</category><category>ocaml</category><category>python</category>
		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/24/comprehension-de-listes-en-ocaml/</guid>
		<description><![CDATA[Quelque chose de vraiment utile quand on travaille avec des listes, c&#8217;est d&#8217;utiliser la compréhension de liste. C&#8217;est par exemple quelque chose de tout à fait naturel en python :
l1 = [(1,2),(2,3),(3,4),(4,5),(5,6),(6,7)]
# [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7)]
l2 = [2*x+y for (x,y) in l1]
# [4, 7, 10, 13, 16, [...]]]></description>
			<content:encoded><![CDATA[<p>Quelque chose de vraiment utile quand on travaille avec des listes, c&#8217;est d&#8217;utiliser la <em>compréhension de liste</em>. C&#8217;est par exemple quelque chose de tout à fait naturel en python :</p>
<div class="ch_code_container" style="font-family: monospace;white-space: nowrap;height:100%;">l1 = [(1,2),(2,3),(3,4),(4,5),(5,6),(6,7)]<br />
# [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7)]<br />
l2 = [2*x+y for (x,y) in l1]<br />
# [4, 7, 10, 13, 16, 19]<br />
l3 = [x for x in l2 if x &gt; 12]<br />
# [13, 16, 19]</p>
</div>
<p>C&#8217;est en revanche une fonctionnalité absente d&#8217;OCaml... On peut bien sur émuler ce comportement de la manière suivante : </p>
<div class="ch_code_container" style="font-family: monospace;white-space: nowrap;height:100%;"><span style="color: #06c; font-weight: bold;">let</span> l1 = <span style="color: #6c6;">&#91;</span><span style="color: #c6c;">1</span>,<span style="color: #c6c;">2</span>;<span style="color: #c6c;">2</span>,<span style="color: #c6c;">3</span>;<span style="color: #c6c;">3</span>,<span style="color: #c6c;">4</span>;<span style="color: #c6c;">4</span>,<span style="color: #c6c;">5</span>;<span style="color: #c6c;">5</span>,<span style="color: #c6c;">6</span>;<span style="color: #c6c;">6</span>,<span style="color: #c6c;">7</span><span style="color: #6c6;">&#93;</span>&nbsp; <span style="color: #06c; font-weight: bold;">in</span><br />
<span style="color: #06c; font-weight: bold;">let</span> l2 = <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> fmap l -&gt; <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="">List</span></a>.<span style="color: #060;">rev_map</span> fmap <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="">List</span></a>.<span style="color: #060;">rev</span> l<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span>x,y<span style="color: #6c6;">&#41;</span> -&gt; <span style="color: #c6c;">2</span>*x+y<span style="color: #6c6;">&#41;</span> l1 <span style="color: #06c; font-weight: bold;">in</span><br />
<span style="color: #06c; font-weight: bold;">let</span> l3 = <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> ffilt fmap l -&gt; <br />
&nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> rev_filter f l = <br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> aux d = <span style="color: #06c; font-weight: bold;">fun</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#91;</span>&nbsp; <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> -&gt; d<br />
&nbsp; &nbsp; &nbsp; | <span style="color: #6c6;">&#91;</span>t::q<span style="color: #6c6;">&#93;</span> -&gt; aux <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">if</span> f t <span style="color: #06c; font-weight: bold;">then</span> <span style="color: #6c6;">&#91;</span>t::d<span style="color: #6c6;">&#93;</span> <span style="color: #06c; font-weight: bold;">else</span> d<span style="color: #6c6;">&#41;</span> q<span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">in</span><br />
&nbsp; &nbsp; &nbsp; aux <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> l<br />
&nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">in</span><br />
&nbsp; &nbsp; <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="">List</span></a>.<span style="color: #060;">rev_map</span> fmap <span style="color: #6c6;">&#40;</span>rev_filter ffilt l<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x -&gt; x &gt; <span style="color: #c6c;">12</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x -&gt; x<span style="color: #6c6;">&#41;</span> l2 <br />
<span style="color: #06c; font-weight: bold;">in</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span></p>
</div>
<p>Mais il faut avouer que c&#8217;est un tantinet verbeux... Une petite note au passage, pourquoi utiliser <code>List.rev_map</code> et <code>List.rev</code> dans le premier cas ? Tout simplement parce que ces deux fonctions sont récursives terminales, et que sur des grosses grosses listes, ça évite de faire des stacks overflow. Dans le second cas, un <code>List.filter</code> suivi d&#8217;un <code>List.map</code> aurait la même complexité temporelle de toute façon, donc autant faire des choses propres.</p>
<p>Revenons à notre problème initial : la compréhension de liste. Il serait quand même très agréable de pouvoir écrire en caml quelque chose du genre </p>
<div class="ch_code_container" style="font-family: monospace;white-space: nowrap;height:100%;"><span style="color: #06c; font-weight: bold;">let</span> l1 = <span style="color: #6c6;">&#91;</span><span style="color: #c6c;">1</span>,<span style="color: #c6c;">2</span>;<span style="color: #c6c;">2</span>,<span style="color: #c6c;">3</span>;<span style="color: #c6c;">3</span>,<span style="color: #c6c;">4</span>;<span style="color: #c6c;">4</span>,<span style="color: #c6c;">5</span>;<span style="color: #c6c;">5</span>,<span style="color: #c6c;">6</span>;<span style="color: #c6c;">6</span>,<span style="color: #c6c;">7</span><span style="color: #6c6;">&#93;</span>&nbsp; <span style="color: #06c; font-weight: bold;">in</span><br />
<span style="color: #06c; font-weight: bold;">let</span> l2 = <span style="color: #6c6;">&#91;</span>+ <span style="color: #c6c;">2</span>*x+y | <span style="color: #6c6;">&#40;</span>x,y<span style="color: #6c6;">&#41;</span> &lt;- l1<span style="color: #6c6;">&#93;</span> <span style="color: #06c; font-weight: bold;">in</span><br />
<span style="color: #06c; font-weight: bold;">let</span> l3 = <span style="color: #6c6;">&#91;</span>+ x | x &lt;- l2 <span style="color: #06c; font-weight: bold;">when</span> x &gt; <span style="color: #c6c;">12</span><span style="color: #6c6;">&#93;</span> <span style="color: #06c; font-weight: bold;">in</span><br />
<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span></p>
</div>
<p>La syntaxe <code>[+ (* ... *)]</code> indiquant qu&#8217;on passe en mode compréhension de liste.<sup><a href="#footnote-1-59" id="footnote-link-1-59" class="footnote-link footnote-identifier-link" title="d&#8217;ailleurs, si quelqu&#8217;un sait comment faire pour pouvoir utiliser [ (*...*) ] à la place, sans que ça ne reconnaisse plus les listes, je suis preneur">1</a></sup></p>
<p>Et bien c&#8217;est possible en utilisant campl4 <img src='http://www.friggeri.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Vous trouverez dans l&#8217;archive jointe le fichier d&#8217;extension de syntaxe qui permet de faire ça, un Makefile qui est bêtement une suite d&#8217;instructions et une version qui fonctionne de l&#8217;exemple ci dessus !</p>
<div class="download_box">  <span class="label">Fichier : </span>  <span class="value">listcomp.tar.gz</span><br/>  <span class="label">T&eacute;l&eacute;charg&eacute; : </span>  <span class="value">14 fois</span><br/>  <span class="label">Taille : </span>  <span class="value">841 o</span><br/>  <span class="dl">    <a href="http://www.friggeri.net/download/listcomp.tar.gz">[t&eacute;l&eacute;charger]</a>  </span></div>
<div class="clear"></div>
<ol start="1" class="footnotes"><li id="footnote-1-59" class="footnote">d&#8217;ailleurs, si quelqu&#8217;un sait comment faire pour pouvoir utiliser <code>[ (*...*) ]</code> à la place, sans que ça ne reconnaisse plus les listes, je suis preneur [<a href="#footnote-link-1-59" class="footnote-link footnote-back-link">↩</a>]</li></ol><img src="http://feeds.feedburner.com/~r/friggeri/~4/138278906" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.friggeri.net/blog/2007/07/24/comprehension-de-listes-en-ocaml/feed</wfw:commentRss>
		<feedburner:origLink>http://www.friggeri.net/blog/2007/07/24/comprehension-de-listes-en-ocaml</feedburner:origLink></item>
		<item>
		<title>Ocaml et hexadécimal</title>
		<link>http://feeds.feedburner.com/~r/friggeri/~3/138278907/ocaml-et-hexadecimal</link>
		<comments>http://www.friggeri.net/blog/2007/07/23/ocaml-et-hexadecimal#comments</comments>
		<pubDate>Mon, 23 Jul 2007 14:12:38 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[OCaml]]></category>
<category>hexadecimal</category><category>ocaml</category><category>printf</category>
		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/23/ocaml-et-hexadecimal/</guid>
		<description><![CDATA[Je vois qu&#8217;il y a beaucoup de gens qui tombent sur mon blog en cherchant &#8220;ocaml hexadecimal&#8221;. Et ils doivent être décus de ne rien trouver... C&#8217;est pourquoi j&#8217;ai décidé d&#8217;écrire rapidement un petit quelque chose à ce sujet là.
Tout d&#8217;abord, il faut savoir qu&#8217;en caml, les choses suivantes sont équivalentes :
# 0xf;;
- : int [...]]]></description>
			<content:encoded><![CDATA[<p>Je vois qu&#8217;il y a beaucoup de gens qui tombent sur mon blog en cherchant &#8220;ocaml hexadecimal&#8221;. Et ils doivent être décus de ne rien trouver... C&#8217;est pourquoi j&#8217;ai décidé d&#8217;écrire rapidement un petit quelque chose à ce sujet là.</p>
<p>Tout d&#8217;abord, il faut savoir qu&#8217;en caml, les choses suivantes sont équivalentes :<br />
<code># 0xf;;<br />
- : int = 15<br />
# 0o17;;<br />
- : int = 15<br />
# 0b1111;;<br />
- : int = 15<br />
# 15;;<br />
- : int = 15</code><br />
Le premier est écrit en hexadécimal, le second en ocal, le troisième en binaire, et le dernier en décimal. Donc la gestion de l&#8217;hexadécimal en OCaml est native.</p>
<p>Une des utilisations courantes de l&#8217;hexadécimal est pour représenter les couleurs en 65536 couleurs. Pour convertir un entier en tuple r,g,b on peut utiliser la fonction suivante : </p>
<div class="ch_code_container" style="font-family: monospace;white-space: nowrap;height:100%;"><span style="color: #06c; font-weight: bold;">let</span> hex_to_rgb n =&nbsp; <span style="color: #6c6;">&#40;</span>n / 0&#215;10000, <span style="color: #6c6;">&#40;</span>n/0&#215;100<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">mod</span> 0&#215;100, n <span style="color: #06c; font-weight: bold;">mod</span> 0&#215;100<span style="color: #6c6;">&#41;</span></p>
</div>
<p>Dans l&#8217;autre sens, c&#8217;est un peu plus compliqué : en effet, en mémoire tous les entiers sont stockés de la même manière (int31 à la caml), et on s&#8217;en fiche de savoir sous quelle forme ils sont entrés. Mais ce n&#8217;est pas un drame ; effectivement, on a besoin d&#8217;avoir un entier sous forme hexadécimale principalement pour l&#8217;affichage, donc on utilise les fonctions du module Printf<sup><a href="#footnote-1-58" id="footnote-link-1-58" class="footnote-link footnote-identifier-link" title="C&#8217;est la seule exception à la règle ne jamais faire un open Module en début de fichier">1</a></sup> :</p>
<div class="ch_code_container" style="font-family: monospace;white-space: nowrap;height:100%;"><span style="color: #06c; font-weight: bold;">let</span> print_hexa = printf <span style="color: #3cb371;">&quot;0x%x&quot;</span></p>
</div>
<p>Je vous renvoie à la documentation du module <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Printf.html">Pervasives</a> pour plus de détails.</p>
<p>Espérons que maintenant ceux qui passeront ici en cherchant <em>ocaml hexadécimal</em> repartirons heureux <img src='http://www.friggeri.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
<ol start="1" class="footnotes"><li id="footnote-1-58" class="footnote">C&#8217;est la seule exception à la règle <em>ne jamais faire un <code>open Module</code> en début de fichier</em> [<a href="#footnote-link-1-58" class="footnote-link footnote-back-link">↩</a>]</li></ol><img src="http://feeds.feedburner.com/~r/friggeri/~4/138278907" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.friggeri.net/blog/2007/07/23/ocaml-et-hexadecimal/feed</wfw:commentRss>
		<feedburner:origLink>http://www.friggeri.net/blog/2007/07/23/ocaml-et-hexadecimal</feedburner:origLink></item>
		<item>
		<title>Sondage, déplacement sur une “grille”</title>
		<link>http://feeds.feedburner.com/~r/friggeri/~3/138278908/sondage-deplacement-sur-une-grille</link>
		<comments>http://www.friggeri.net/blog/2007/07/22/sondage-deplacement-sur-une-grille#comments</comments>
		<pubDate>Sun, 22 Jul 2007 21:25:28 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[Modal WM]]></category>

		<category><![CDATA[Brèves]]></category>
<category>déplacement</category><category>modal wm</category><category>sondage</category>
		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/22/sondage-deplacement-sur-une-grille/</guid>
		<description><![CDATA[Toujours en lien avec mon projet de window manager, je suis en train de m&#8217;interroger sur le sens qu&#8217;à le déplacement a partir d&#8217;une fenètre, dans une direction donnée (ce dont je parlais dans mon tout premier article). C&#8217;est pourquoi j&#8217;ai créé un sondage très rapide qui est disponible ici.
L&#8217;idée est simple : vous avez [...]]]></description>
			<content:encoded><![CDATA[<p>Toujours en lien avec mon projet de window manager, je suis en train de m&#8217;interroger sur le sens qu&#8217;à le déplacement <em>a partir d&#8217;une fenètre, dans une direction donnée</em> (ce dont je parlais dans mon tout premier article). C&#8217;est pourquoi j&#8217;ai créé un sondage très rapide qui est disponible <a href="http://eolsen.fr/survey/index.php?sid=1&#038;newtest=Y">ici</a>.</p>
<p>L&#8217;idée est simple : vous avez une image<sup><a href="#footnote-1-57" id="footnote-link-1-57" class="footnote-link footnote-identifier-link" title="aussi disponible ici">1</a></sup> en haut, avec des zones de couleurs qui sont numérotées. Les questions sont toutes de la forme <em>&#8220;De la case XX, en allant vers [direction], on arrive sur &#8220;</em> et la vous complétez ce qui selon vous est le comportement le plus &#8220;logique&#8221; et &#8220;intuitif&#8221;.</p>
<p>Dès que j&#8217;aurais assez de résultats je les mettrais en ligne, bien sur.</p>
<p>[edition : j&#8217;ai changé l&#8217;adresse du lien]</p>
<ol start="1" class="footnotes"><li id="footnote-1-57" class="footnote">aussi disponible <a href="/wp-content/test.png">ici</a> [<a href="#footnote-link-1-57" class="footnote-link footnote-back-link">↩</a>]</li></ol><img src="http://feeds.feedburner.com/~r/friggeri/~4/138278908" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.friggeri.net/blog/2007/07/22/sondage-deplacement-sur-une-grille/feed</wfw:commentRss>
		<feedburner:origLink>http://www.friggeri.net/blog/2007/07/22/sondage-deplacement-sur-une-grille</feedburner:origLink></item>
		<item>
		<title>Une démo du layout manager</title>
		<link>http://feeds.feedburner.com/~r/friggeri/~3/138278909/une-demo-du-layout-manager</link>
		<comments>http://www.friggeri.net/blog/2007/07/21/une-demo-du-layout-manager#comments</comments>
		<pubDate>Sat, 21 Jul 2007 15:06:15 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[Modal WM]]></category>

		<category><![CDATA[Concepts]]></category>

		<category><![CDATA[OCaml]]></category>

		<category><![CDATA[Programmation]]></category>

		<category><![CDATA[Brèves]]></category>
<category>demo</category><category>layout</category><category>modal wm</category>
		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/21/une-demo-du-layout-manager/</guid>
		<description><![CDATA[Une brève pour vous présenter une petite démo du layout manager. J&#8217;ai trouvé une structure de donnée (dont je parlerais plus dans un prochain article) qui semble convenir, modulo quelques ruses de sioux pour le redimensionnement. C&#8217;est écrit en ocaml, et ca ouvre une fenetre graphique, donc c&#8217;est vraiment une démo de la structure de [...]]]></description>
			<content:encoded><![CDATA[<p>Une brève pour vous présenter une petite démo du layout manager. J&#8217;ai trouvé une structure de donnée (dont je parlerais plus dans un prochain article) qui semble convenir, modulo quelques ruses de sioux pour le redimensionnement. C&#8217;est écrit en ocaml, et ca ouvre une fenetre graphique, donc c&#8217;est vraiment une démo de la structure de donnée...</p>
<p>Les bindings sont les suivants : </p>
<ul>
<li>j : gauche</li>
<li>l : droite</li>
<li>i : haut</li>
<li>k : bas</li>
<li>v : split vertical</li>
<li>h : split horizontal</li>
<li>m : fusion</li>
</ul>
<p>Je publierai bientôt une autre démo avec la gestion des tabsets.</p>
<div class="download_box">  <span class="label">Fichier : </span>  <span class="value">demo.tar.gz</span><br/>  <span class="label">T&eacute;l&eacute;charg&eacute; : </span>  <span class="value">9 fois</span><br/>  <span class="label">Taille : </span>  <span class="value">9.4 ko</span><br/>  <span class="dl">    <a href="http://www.friggeri.net/download/demo.tar.gz">[t&eacute;l&eacute;charger]</a>  </span></div>
<div class="clear"></div>
<img src="http://feeds.feedburner.com/~r/friggeri/~4/138278909" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.friggeri.net/blog/2007/07/21/une-demo-du-layout-manager/feed</wfw:commentRss>
		<feedburner:origLink>http://www.friggeri.net/blog/2007/07/21/une-demo-du-layout-manager</feedburner:origLink></item>
		<item>
		<title>Modal WM, architecture</title>
		<link>http://feeds.feedburner.com/~r/friggeri/~3/138278910/modal-wm-architecture</link>
		<comments>http://www.friggeri.net/blog/2007/07/19/modal-wm-architecture#comments</comments>
		<pubDate>Thu, 19 Jul 2007 21:24:45 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[Modal WM]]></category>

		<category><![CDATA[Brèves]]></category>
<category>architecture</category><category>modal wm</category><category>window manager</category>
		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/19/modal-wm-architecture/</guid>
		<description><![CDATA[Un brève pour publier l&#8217;architecture pour Modal WM1, elle est disponible ici
L&#8217;orientation est clairement mise sur la modularité. C&#8217;est en fait beaucoup plus une api pour un window manager qu&#8217;un window manager en lui même. Je m&#8217;explique : il y aura un système de gestion de layouts, un prompt de commande, et c&#8217;est à peu [...]]]></description>
			<content:encoded><![CDATA[<p>Un brève pour publier l&#8217;architecture pour <em>Modal WM</em><sup><a href="#footnote-1-55" id="footnote-link-1-55" class="footnote-link footnote-identifier-link" title="oui, c&#8217;est un nom temporaire...">1</a></sup>, elle est disponible <a href="/wp-content/archi.png">ici</a></p>
<p>L&#8217;orientation est clairement mise sur la modularité. C&#8217;est en fait beaucoup plus une api pour un window manager qu&#8217;un window manager en lui même. Je m&#8217;explique : il y aura un système de gestion de layouts, un <em>prompt</em> de commande, et c&#8217;est à peu près tout. Le <em>wm</em> lui même sera véritablement un ensemble de plugins (bindings, fonctions spéciales, etc.) qui sera rajouté par dessus.</p>
<p>Concernant les fonctionnalités apportées par les plugins de base, ça sera vraisemblablement un <em>tiling window manager</em> entièrement utilisable au clavier, modal. </p>
<p>Je travaille actuellement sur la structure de donnée la plus appropriée pour le layout<sup><a href="#footnote-2-55" id="footnote-link-2-55" class="footnote-link footnote-identifier-link" title="j&#8217;en parlais dans l&#8217;article précédent">2</a></sup>.</p>
<p>Stay tuned ;</p>
<ol start="1" class="footnotes"><li id="footnote-1-55" class="footnote">oui, c&#8217;est un nom temporaire... [<a href="#footnote-link-1-55" class="footnote-link footnote-back-link">↩</a>]</li><li id="footnote-2-55" class="footnote">j&#8217;en parlais dans l&#8217;article précédent [<a href="#footnote-link-2-55" class="footnote-link footnote-back-link">↩</a>]</li></ol><img src="http://feeds.feedburner.com/~r/friggeri/~4/138278910" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.friggeri.net/blog/2007/07/19/modal-wm-architecture/feed</wfw:commentRss>
		<feedburner:origLink>http://www.friggeri.net/blog/2007/07/19/modal-wm-architecture</feedburner:origLink></item>
		<item>
		<title>Une structure de donnée fonctionnelle pour un WM ?</title>
		<link>http://feeds.feedburner.com/~r/friggeri/~3/138278911/une-structure-de-donnee-fonctionnelle-pour-un-wm</link>
		<comments>http://www.friggeri.net/blog/2007/07/18/une-structure-de-donnee-fonctionnelle-pour-un-wm#comments</comments>
		<pubDate>Wed, 18 Jul 2007 11:52:07 +0000</pubDate>
		<dc:creator>Adrien Friggeri</dc:creator>
		
		<category><![CDATA[Modal WM]]></category>

		<category><![CDATA[Concepts]]></category>
<category>arbre</category><category>fonctionnel</category><category>gérard huet</category><category>layout</category><category>modal wm</category><category>structure de donnée</category><category>window manager</category><category>zipper</category>
		<guid isPermaLink="false">http://www.friggeri.net/blog/2007/07/18/une-structure-de-donnee-fonctionnelle-pour-un-wm/</guid>
		<description><![CDATA[J&#8217;en parlais dans ce billet, j&#8217;ai en tête une structure de donnée pour gérer un layout. La version de base est la suivante (dans une syntaxe OCaml) :
type window = (* quelque chose de complexe ... *)
type direction = Horizontal &#124; Vertical
type layout = 
&#160; &#160; Fullscreen of window
&#160; &#124; Tabset of window list
&#160; &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>J&#8217;en parlais dans ce <a href="http://www.friggeri.net/blog/2007/07/15/un-window-manager-modal/">billet</a>, j&#8217;ai en tête une structure de donnée pour gérer un <em>layout</em>. La version de base est la suivante (dans une syntaxe OCaml) :</p>
<div class="ch_code_container" style="font-family: monospace;white-space: nowrap;height:100%;"><span style="color: #06c; font-weight: bold;">type</span> window = <span style="color: #5d478b; font-style: italic;">(* quelque chose de complexe ... *)</span></p>
<p><span style="color: #06c; font-weight: bold;">type</span> direction = Horizontal | Vertical</p>
<p><span style="color: #06c; font-weight: bold;">type</span> layout = <br />
&nbsp; &nbsp; Fullscreen <span style="color: #06c; font-weight: bold;">of</span> window<br />
&nbsp; | Tabset <span style="color: #06c; font-weight: bold;">of</span> window list<br />
&nbsp; | Splitset <span style="color: #06c; font-weight: bold;">of</span> dir * int * layout * layout</p>
<p><span style="color: #06c; font-weight: bold;">type</span> workspace = layout list</p>
<p><span style="color: #06c; font-weight: bold;">type</span> screen = workspace list</p>
<p><span style="color: #06c; font-weight: bold;">type</span> root = screen list</p>
</div>
<p>En français : un <em>screen</em> est un ensemble de <em>workspaces</em> qui contiennent des <em>layouts</em> qui eux même sont ou bien des fenetres en <em>tab</em> ou alors des conteneurs de <em>layout</em>. Ceci permet d&#8217;avoir une vision d&#8217;ensemble, mais on s&#8217;apercoit vite que ne serait-ce que pour maintenir le focus sur un tab donné ça ne suffit pas.</p>
<p>On préférera donc utiliser un <em>zipper</em> de liste pour les tabs (on stocke d&#8217;un coté les tabs &#8220;avant&#8221;, et d&#8217;un autre le tab courant et les suivants, comme ca la seule opération &#8220;couteuse&#8221; est de passer du dernier tab au premier) :</p>
<div class="ch_code_container" style="font-family: monospace;white-space: nowrap;height:100%;"><span style="color: #06c; font-weight: bold;">type</span> layout = <br />
&nbsp; &nbsp; Fullscreen <span style="color: #06c; font-weight: bold;">of</span> window<br />
&nbsp; | Tabset <span style="color: #06c; font-weight: bold;">of</span> window list * window list<br />
&nbsp; | Splitset <span style="color: #06c; font-weight: bold;">of</span> dir * int * layout * layout</p>
</div>
<p>Mais ça ne suffit pas encore, cette structure de donnée nous dit en fait pour chaque <em>tabset</em> quel <em>tab</em> est selectionné, mais on ne sait pas du tout quel est le conteneur qui a le focus.  Pour ca, on pourrait utiliser un <em>zipper</em><sup><a href="#footnote-1-54" id="footnote-link-1-54" class="footnote-link footnote-identifier-link" title="The Zipper, Gérard Huet">1</a></sup>. Le problème serait alors qu&#8217;on aurait a disposition l&#8217;élément qui a le focus, mais qu&#8217;il faudrait reconstruire tout l&#8217;arbre à chaque fois pour l&#8217;affichage, ce qui est hors de question... J&#8217;ajoute au passage que l&#8217;on a avec ce type de structure le même problème que ce dont je parlais l&#8217;autre jour concernant ion3 et le &#8220;aller en haut à gauche&#8221;.</p>
<p>Donc.. Meme si la structure peut sembler adaptée à un window manager, elle apporte un certain nombre d&#8217;inconvénients non négligeables. Et puis je me demande sérieusement si on peut avoir une structure purement fonctionnelle, rapide, efficace, sans redondance qui permette à la fois de garder le focus et de tout afficher sans avoir à reconstruire l&#8217;arbre.</p>
<p>Avis aux amateurs, structure recherchée <img src='http://www.friggeri.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
<ol start="1" class="footnotes"><li id="footnote-1-54" class="footnote"><a href="http://www.st.cs.uni-sb.de/edu/seminare/2005/advanced-fp/docs/huet-zipper.pdf">The Zipper</a>, Gérard Huet [<a href="#footnote-link-1-54" class="footnote-link footnote-back-link">↩</a>]</li></ol><img src="http://feeds.feedburner.com/~r/friggeri/~4/138278911" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.friggeri.net/blog/2007/07/18/une-structure-de-donnee-fonctionnelle-pour-un-wm/feed</wfw:commentRss>
		<feedburner:origLink>http://www.friggeri.net/blog/2007/07/18/une-structure-de-donnee-fonctionnelle-pour-un-wm</feedburner:origLink></item>
	</channel>
</rss>
