<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Metal3d.org</title><link>http://www.metal3d.org/</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Metal3dorg" /><description>Blog d'un presque geek :)</description><language>en</language><generator>Copix, module feed (http://www.copix.org)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Metal3dorg" /><feedburner:info uri="metal3dorg" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>45.617351</geo:lat><geo:long>5.158199</geo:long><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><item><title>Quand on nous interdit le test</title><link>http://feedproxy.google.com/~r/Metal3dorg/~3/i5_7wlUIAf0/Quand-on-nous-interdit-le-test</link><pubDate>Mon, 07 Nov 2011 06:43:45 PST</pubDate><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[

<p>
Quand vous décidez de prendre vos responsabilités, vous acceptez de devoir vous plier à certaines contraintes. C'est le lot de ceux qui font des choix pour leur propre intérêt. Jusque là, vous admettrez que je suis dans la position de celui qui va admettre qu'un outil ne fonctionne pas complètement comme prévu, mais que je le sais et surtout que j'accepte ça. Mais quand on vous interdit l'accès sans même pouvoir tester... ce n'est plus vous qui décidez, mais les autres... Voilà comment j'en suis venu à un petit coup de gueule contre: Google !
</p>

<p>
Pas question ici de parler de politique de vie privée, ce débat (à ce moment précis) ne m'intéresse pas. Non, il est question de technologie ici. Google a décidé depuis quelques temps de faire des choix pour vous, ou du moins pour une petit classe de personnes qui ont fait des choix technique.
</p>

<p>
Parlons donc de deux cas. Google+ et le WebGL dans Chromium (et Google Chrome).
</p>

<p>
D'abord, Google+ puisque j'aime ce service. Je vous en ai parlé, je travaille sur Xmonad, et pour des questions d'ergonomie j'utilise un navigateur basé sur WebKit nommé Uzbl (merci WillQ du canal fedora-fr sur irc). Ce navigateur, rapide, léger, propre, sans fioritures utilise donc le même moteur de rendu que Chromium et Google-Chrome. Mais si je vais sur la page de google+... on me refuse l'accès.
</p>

<p>
Comprenez bien, je n'ai rien contre le fait que la page ne fonctionne pas "comme prévue" et qu'on me prévienne... mais me dire "non, installe toi un autre navigateur" et refuser de m'afficher la page... moyen là !
</p>

<p>
L'interdiction est limite, vraiment... parce que en changeant mon "useragent" pour faire passer mon navigateur pour un google-chromme la page apparait parfaitement bien. Donc, plutôt que d'interdire l'accès, je préfèrerai simplement qu'on me dise "on connait pas votre navigateur, donc vous savez désormais que la page que vous allez voir ne marchera pas comme prévu". 
</p>

<p>
Bref, passons... 
</p>

<p>
Uzbl a du mal avec WebGL, ça me parait logique et je n'en veut à personne... j'utilise donc tout bêtement mon chromium (navigateur chrome libre). Et vas y que je vais voir une page qui utilise du WEBGL... et paf ! Erreur: "votre navigateur ne gère pas le WebGL". Ah bon ? attend mais j'ai bien une carte graphique (pas la meilleure je sais, mais bon elle fait de la 3D mon ATI) alors pourquoi ça marcherait pas ?
</p>

<p>
Vérifions... on ouvre la page "about:gpu" et que vois je avec stupeur ? Ma carte est "blacklistée"... Je fouille sur le net et j'apprends qu'on peut passer outre... via l'option au lancement "--ignore-gpu-blacklist". Réouverture de about:gpu et miracle la carte est bien gérée. Tout fonctionne bien... sauf ? Google Map en 3D... un test bizarre de la part de Google et je peux même pas voir si ça marche vraiment ou pas, Google m'interdit l'accès...
</p>

<p>
D'une part, on me blackliste ma carte ce qui ne permet pas de tester vraiment sans connaitre l'option de coupure de blacklist, mais en plus on ne me permet pas de regarder si une page WebGL spécifique fonctionne, on rejette direct... 
</p>

<p>
Comment peut on alors aider à trouver comment corriger une page WebGL si on ne nous autorise pas à la teste ? 
</p>

<p>
Voilà, je me pose donc la question... Google a décidé de se débrouiller tout seul pour les tests ? A-t-il oublié la communauté qui peut tester et remonter des corrections ? Serait-il en train de se détacher de ceux qui ont donné toute sa valeur, c'est à dire... les geeks ?
</p>

<p>
Dommage, j'ai pas d'animosité à leur égard, mais ce "comportement" commence à me gêner fortement...
</p>

<p><a href="http://feedads.g.doubleclick.net/~a/rThy2jy2PqP2gDTqWEtslxn_HJM/0/da"><img src="http://feedads.g.doubleclick.net/~a/rThy2jy2PqP2gDTqWEtslxn_HJM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rThy2jy2PqP2gDTqWEtslxn_HJM/1/da"><img src="http://feedads.g.doubleclick.net/~a/rThy2jy2PqP2gDTqWEtslxn_HJM/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=i5_7wlUIAf0:Sk7zSDHXLms:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=i5_7wlUIAf0:Sk7zSDHXLms:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=i5_7wlUIAf0:Sk7zSDHXLms:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=i5_7wlUIAf0:Sk7zSDHXLms:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=i5_7wlUIAf0:Sk7zSDHXLms:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=i5_7wlUIAf0:Sk7zSDHXLms:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=i5_7wlUIAf0:Sk7zSDHXLms:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=i5_7wlUIAf0:Sk7zSDHXLms:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=i5_7wlUIAf0:Sk7zSDHXLms:KwTdNBX3Jqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Metal3dorg/~4/i5_7wlUIAf0" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;
Quand vous décidez de prendre vos responsabilités, vous acceptez de devoir vous plier à certaines contraintes. C'est le lot de ceux qui font des choix pour leur propre intérêt. Jusque là, vous admettrez que je suis dans la position de celui ...&lt;/p&gt;</description><feedburner:origLink>http://metal3d.org/index.php/blog/ticket/2011/11/07/Quand-on-nous-interdit-le-test?heading=Informatique</feedburner:origLink></item><item><title>Git color graph</title><link>http://feedproxy.google.com/~r/Metal3dorg/~3/1OB9K1_sWus/Git-color-graph</link><pubDate>Mon, 26 Sep 2011 08:26:27 PDT</pubDate><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[

<p>
Suite à deux excellents billets proposés par <a href="http://www.croes.org/gerald/blog" title="Gérald" class="wiki_exists">Gérald</a> - <a href="http://www.croes.org/gerald/blog/introduction-a-git-12/607/" title="Introduction à Git Partie 1" class="wiki_exists">Introduction à Git Partie 1</a> - et <a href="http://www.croes.org/gerald/blog/git-modele-de-branche-efficace/649/" title="Partie 2" class="wiki_exists">Partie 2</a> je vais vous présenter quelques petits "trucs" que j'utilise sur Git. Aujourd'hui parlons l'affichage de votre dépôt, dans une console, mais en mode "pretty"
</p>

<p>
Je sais qu'il existe un outil bien sympathique nommé "tig" (git à l'envers) qui est une interface assez bien fichue pour avoir une vue assez "lisible" de votre dépôt. Mais sans avoir à installer un outils en plus, git permet déjà de voir un "graph" de vos commits, merges et branches, et ce de manière propre.
</p>

<p>
Je vous montre les étapes de tests que j'ai effectué, mais souvenez vous qu'à la fin de l'article il y a la manière "rapide" qui est ni plus ni moins que l'a création d'un alias de commande à git. Pour le moment, laissez moi vous montrer comment j'ai procédé.
</p>

<p>
En fait, tout va passer par la commande "git log" dont des options vont être ajoutées. Si vous tapez simplement "git log" dans votre console, vous aurez un log, certes lisible, mais pas très sexy. Passons par la première options que j'aime bien:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
git log --graph<br />
*&nbsp; &nbsp;commit 2a9910f060f7c75f93499307882e29977a3e8c57<br />
|\&nbsp; Merge: b760954 d50d7d9<br />
| | Author: Patrice FERLET <metal3d@gmail.com><br />
| | Date:&nbsp; &nbsp;Mon Sep 26 13:14:58 2011 +0200<br />
| | <br />
| |&nbsp; &nbsp; &nbsp;Merge branches 'developpement' and 'master'<br />
| |&nbsp; &nbsp;<br />
| * commit d50d7d980664a061dbde83ee3ef3d8931fde5c97<br />
| | Author: Patrice FERLET <metal3d@gmail.com><br />
| | Date:&nbsp; &nbsp;Mon Sep 26 13:09:14 2011 +0200<br />
| | <br />
| |&nbsp; &nbsp; &nbsp;Append those files to be integrated into pypi... and make some dist packages<br />
| |&nbsp; &nbsp;<br />
| * commit 8d775cb8fd1413f761404d423f9792a800a2e5ad<br />
| | Author: Patrice FERLET <metal3d@gmail.com><br />
| | Date:&nbsp; &nbsp;Mon Sep 26 13:08:42 2011 +0200<br />
| | <br />
| |&nbsp; &nbsp; &nbsp;This is an alpha release for now, not a beta<br />
| |&nbsp; &nbsp; &nbsp;Added Classifier section for pypi<br />
| |&nbsp; &nbsp;<br />
* | commit b760954c324262a2e84b5c85d83a2fd8aa41d50f<br />
|/&nbsp; Author: Patrice FERLET <metal3d@gmail.com><br />
|&nbsp; &nbsp;Date:&nbsp; &nbsp;Mon Sep 26 12:46:15 2011 +0200<br />
|&nbsp; &nbsp;<br />
|&nbsp; &nbsp; &nbsp; &nbsp;Merge branches 'developpement' and 'master'<br />
|&nbsp; <br />
* commit 5120b24072c31f5fe147a4b8ddc955594c613606<br />
| Author: Patrice FERLET <metal3d@gmail.com><br />
| Date:&nbsp; &nbsp;Mon Sep 26 12:45:48 2011 +0200<br />
...<br />
&nbsp;</div></div>

<p>
C'est déjà pas mal... nous avons ici une représentation des branches ainsi que le log de commit, l'auteur, etc... Bon admettez que c'est un peu "verbeux" et que certaines informations ne sont pas forcément "utiles". Ajoutons une seconde option "--pretty=oneline"
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
&nbsp;git log --graph --pretty=oneline<br />
&nbsp;*&nbsp; &nbsp;2a9910f060f7c75f93499307882e29977a3e8c57 Merge branches 'developpement' and 'master'<br />
&nbsp;|\&nbsp; <br />
&nbsp;| * d50d7d980664a061dbde83ee3ef3d8931fde5c97 Append those files to be integrated into pypi... and make some dist<br />
&nbsp;| * 8d775cb8fd1413f761404d423f9792a800a2e5ad This is an alpha release for now, not a beta Added Classifier secti<br />
&nbsp;* | b760954c324262a2e84b5c85d83a2fd8aa41d50f Merge branches 'developpement' and 'master'<br />
&nbsp;|/&nbsp; <br />
&nbsp;* 5120b24072c31f5fe147a4b8ddc955594c613606 What next section correction<br />
&nbsp;* e5fbc7c9401e5719e5954f280e3074138fe9daae Merge branches 'master' and 'developpement' into developpement<br />
&nbsp;* 413e236a5ee30895df7bd254f58dc00bee06c816 Changes english errors (excuse my english, I'm french...)<br />
&nbsp;*&nbsp; &nbsp;a4d8baa02d46a8e91b2458f58f9540c906fd5db4 Merge branches 'developpement' and 'master'<br />
&nbsp;|\&nbsp; <br />
&nbsp;| * 811c711b894bf929e720e4fa77dc9c887f3542b1 English errors correction (thanks vim spell :))<br />
&nbsp;| * dae1d7a4c2cc32b0703436383fe2a3c187c04bcc Excpetion declaration to raise proper errors<br />
&nbsp;| * 9f1569f85248e502473949cabd930b71048ac72d Cython allow to declare enum without given values. Values are taken<br />
&nbsp;* |&nbsp; &nbsp;fa56bdda9029f9f5e35e8fc3b25ecfe9dd7b1f2a Merge branches 'developpement' and 'master'<br />
&nbsp;|\ \&nbsp; <br />
&nbsp;| |/&nbsp; <br />
&nbsp;| * e8e732b94a307f78baa5384ad196b18792b98c47 Change example in code doc comment<br />
&nbsp;| * 4e5db330a9a5f30ad1986e64f12ba34b786b6abc Removed "Queue" in thread example<br />
&nbsp;| * e0163a32cd110e94e67cdc38f315b0652583e151 Better documentation<br />
&nbsp;| * adf50978af73c90b31066c6cb2fcdbb0ea7125bb Back to a Quvi classes, that allows to use several Quvi instances<br />
&nbsp;| * f9f9944b8e5348a6e026c9af14dcf33f4a4ebaaa Append additionnal information on setup<br />
&nbsp;* |&nbsp; &nbsp;2c9e704e021434e1b39d16c79225a687c5408fbc Merge branches 'developpement' and 'master'<br />
&nbsp;|\ \&nbsp; <br />
<br />
&nbsp;...<br />
&nbsp;</div></div>

<p>
Ah, là on avance, bon on va réduire le checksum de commit avec "--abbrev-commit":
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
&nbsp;git log --graph --pretty=oneline --abbrev-commit <br />
&nbsp;*&nbsp; &nbsp;2a9910f Merge branches 'developpement' and 'master'<br />
&nbsp;|\&nbsp; <br />
&nbsp;| * d50d7d9 Append those files to be integrated into pypi... and make some dist packages<br />
&nbsp;| * 8d775cb This is an alpha release for now, not a beta Added Classifier section for pypi<br />
&nbsp;* | b760954 Merge branches 'developpement' and 'master'<br />
&nbsp;|/&nbsp; <br />
&nbsp;* 5120b24 What next section correction<br />
&nbsp;* e5fbc7c Merge branches 'master' and 'developpement' into developpement<br />
&nbsp;* 413e236 Changes english errors (excuse my english, I'm french...)<br />
&nbsp;*&nbsp; &nbsp;a4d8baa Merge branches 'developpement' and 'master'<br />
&nbsp;|\&nbsp; <br />
&nbsp;| * 811c711 English errors correction (thanks vim spell :))<br />
&nbsp;| * dae1d7a Excpetion declaration to raise proper errors<br />
&nbsp;| * 9f1569f Cython allow to declare enum without given values. Values are taken from header. see: quvi.h<br />
&nbsp;* |&nbsp; &nbsp;fa56bdd Merge branches 'developpement' and 'master'<br />
&nbsp;|\ \&nbsp; <br />
&nbsp;| |/&nbsp; <br />
&nbsp;| * e8e732b Change example in code doc comment<br />
&nbsp;| * 4e5db33 Removed "Queue" in thread example<br />
&nbsp;| * e0163a3 Better documentation<br />
&nbsp;| * adf5097 Back to a Quvi classes, that allows to use several Quvi instances<br />
&nbsp;| * f9f9944 Append additionnal information on setup<br />
&nbsp;* |&nbsp; &nbsp;2c9e704 Merge branches 'developpement' and 'master'<br />
&nbsp;|\ \&nbsp; <br />
&nbsp;| |/&nbsp; <br />
&nbsp;| * f5e91bb change documentation<br />
&nbsp;| * 928d007 Mini changes on comments and doc<br />
&nbsp;* |&nbsp; &nbsp;cac294e Merge branches 'developpement' and 'master'<br />
&nbsp;|\ \&nbsp; <br />
<br />
&nbsp;</div></div>

<p>
Sympa ! Reste deux options, dont une qui peut s'avérer utile mais malheureusement pas très visible dans mon exemple, les option "--branches" et "--color". La première, comme je vous le disais, n'est pas visible ici, par contre, la couleur oui !:
</p>

<p>
<span style="display: inline"><img class="wiki_image" src="http://metal3d.org/captures/2011-09-26-164747_650x582_scrot.png" alt="captures/2011-09-26-164747_650x582_scrot.png" /></span>
</p>

<p>
Reste alors un petit souci... cette commande est un peu longue à taper. Qu'à cela ne tienne, ajoutons notre "alias" dans notre fichier ~/.gitconfig:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
[aliases]<br />
&nbsp; &nbsp; graph = log --color --graph --decorate --abbrev-commit --pretty=oneline<br />
&nbsp;</div></div>

<p>
Et de ce fait, les graphs sont directement utilisables de cette manière:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
git graph<br />
#ou<br />
git graph --all<br />
&nbsp;</div></div>

<p>
Notez que j'ai ajouté "--decorate" qui permet de voir les nom de branches, merges etc... en couleur. 
</p>

<p>
Un dernier point, "git log" utilise le mode de lecture de log avec less, ce qui permet:
</p>
<ul>
<li> la recherche avec la commande "/"</li>
<li> enregistrer le log avec la commande "s" &rarr; la couleur est aussi enregistrée dans le fichier.</li>
</ul>


<p>
D'ailleurs, en parlant de cela, un module perl vous permet de resortir du code ansi en HTML, voici comment installer le module:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
cpan i /HTML-FromANSI/<br />
&nbsp;</div></div>

<p>
Reste alors à faire cette manipulation:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
ansi2html <(git graph --all) > log.html<br />
&nbsp;</div></div>

<p>
Surtout n'oubliez pas: <strong>aucun espace entre le "<" et "(git graph --all"</strong>, cela à pour effet de créer un fichier "log.html".
</p>

<p>
Si vous ne voulez que le "corps" du fichier, pour l'injecter dans une page, utilisez la méthode ci-dessous:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
xmllint --html --xpath "//body/*" <( ansi2html <(git graph --all) ) > log-body.html<br />
&nbsp;</div></div>

<p>
Cela vous donnera ce résultat:
</p>


<tt><font face="fixedsys, lucida console, terminal, vga, monospace" style="line-height: 1; letter-spacing: 0; font-size: 12pt"><span style="color: gray; background: black; ">*&nbsp;&nbsp;&nbsp;</span><span style="color: #8b8b00; background: black; ">2a9910f&nbsp;(</span><span style="color: cyan; background: black; ">HEAD</span><span style="color: #8b8b00; background: black; ">,&nbsp;</span><span style="color: yellow; background: black; ">tag:&nbsp;0.0.1-alpha1</span><span style="color: #8b8b00; background: black; ">,&nbsp;</span><span style="color: red; background: black; ">origin/master</span><span style="color: #8b8b00; background: black; ">,&nbsp;</span><span style="color: green; background: black; ">master</span><span style="color: #8b8b00; background: black; ">)</span><span style="color: gray; background: black; ">&nbsp;Merge&nbsp;branches&nbsp;'developpement'&nbsp;and&nbsp;'master'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: darkred; background: black; ">|</span><span style="color: darkgreen; background: black; ">\</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: darkred; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">d50d7d9&nbsp;(</span><span style="color: red; background: black; ">origin/developpement</span><span style="color: #8b8b00; background: black; ">,&nbsp;</span><span style="color: green; background: black; ">developpement</span><span style="color: #8b8b00; background: black; ">)</span><span style="color: gray; background: black; ">&nbsp;Append&nbsp;those&nbsp;files&nbsp;to&nbsp;be&nbsp;integrated&nbsp;into&nbsp;pypi...&nbsp;and&nbsp;make&nbsp;some&nbsp;dist&nbsp;packages</span><span style="color: black; background: black; "><br></span><span style="color: darkred; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">8d775cb</span><span style="color: gray; background: black; ">&nbsp;This&nbsp;is&nbsp;an&nbsp;alpha&nbsp;release&nbsp;for&nbsp;now,&nbsp;not&nbsp;a&nbsp;beta&nbsp;Added&nbsp;Classifier&nbsp;section&nbsp;for&nbsp;pypi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: darkgreen; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;</span><span style="color: #8b8b00; background: black; ">b760954</span><span style="color: gray; background: black; ">&nbsp;Merge&nbsp;branches&nbsp;'developpement'&nbsp;and&nbsp;'master'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: darkgreen; background: black; ">|/</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: #8b8b00; background: black; ">5120b24</span><span style="color: gray; background: black; ">&nbsp;What&nbsp;next&nbsp;section&nbsp;correction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: #8b8b00; background: black; ">e5fbc7c</span><span style="color: gray; background: black; ">&nbsp;Merge&nbsp;branches&nbsp;'master'&nbsp;and&nbsp;'developpement'&nbsp;into&nbsp;developpement&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: #8b8b00; background: black; ">413e236</span><span style="color: gray; background: black; ">&nbsp;Changes&nbsp;english&nbsp;errors&nbsp;(excuse&nbsp;my&nbsp;english,&nbsp;I'm&nbsp;french...)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;&nbsp;&nbsp;</span><span style="color: #8b8b00; background: black; ">a4d8baa</span><span style="color: gray; background: black; ">&nbsp;Merge&nbsp;branches&nbsp;'developpement'&nbsp;and&nbsp;'master'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: #8b8b00; background: black; ">|</span><span style="color: darkblue; background: black; ">\</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: #8b8b00; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">811c711</span><span style="color: gray; background: black; ">&nbsp;English&nbsp;errors&nbsp;correction&nbsp;(thanks&nbsp;vim&nbsp;spell&nbsp;:))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: #8b8b00; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">dae1d7a</span><span style="color: gray; background: black; ">&nbsp;Excpetion&nbsp;declaration&nbsp;to&nbsp;raise&nbsp;proper&nbsp;errors&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: #8b8b00; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">9f1569f</span><span style="color: gray; background: black; ">&nbsp;Cython&nbsp;allow&nbsp;to&nbsp;declare&nbsp;enum&nbsp;without&nbsp;given&nbsp;values.&nbsp;Values&nbsp;are&nbsp;taken&nbsp;from&nbsp;header.&nbsp;see:&nbsp;quvi.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: darkblue; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #8b8b00; background: black; ">fa56bdd</span><span style="color: gray; background: black; ">&nbsp;Merge&nbsp;branches&nbsp;'developpement'&nbsp;and&nbsp;'master'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: darkmagenta; background: black; ">|</span><span style="color: darkblue; background: black; ">\</span><span style="color: gray; background: black; ">&nbsp;</span><span style="color: darkblue; background: black; ">\</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: darkmagenta; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;</span><span style="color: darkblue; background: black; ">|/</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: darkmagenta; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">e8e732b</span><span style="color: gray; background: black; ">&nbsp;Change&nbsp;example&nbsp;in&nbsp;code&nbsp;doc&nbsp;comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: darkmagenta; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">4e5db33</span><span style="color: gray; background: black; ">&nbsp;Removed&nbsp;"Queue"&nbsp;in&nbsp;thread&nbsp;example&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: darkmagenta; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">e0163a3</span><span style="color: gray; background: black; ">&nbsp;Better&nbsp;documentation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: darkmagenta; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">adf5097</span><span style="color: gray; background: black; ">&nbsp;Back&nbsp;to&nbsp;a&nbsp;Quvi&nbsp;classes,&nbsp;that&nbsp;allows&nbsp;to&nbsp;use&nbsp;several&nbsp;Quvi&nbsp;instances&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: darkmagenta; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">f9f9944</span><span style="color: gray; background: black; ">&nbsp;Append&nbsp;additionnal&nbsp;information&nbsp;on&nbsp;setup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: darkcyan; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #8b8b00; background: black; ">2c9e704</span><span style="color: gray; background: black; ">&nbsp;Merge&nbsp;branches&nbsp;'developpement'&nbsp;and&nbsp;'master'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: red; background: black; ">|</span><span style="color: darkcyan; background: black; ">\</span><span style="color: gray; background: black; ">&nbsp;</span><span style="color: darkcyan; background: black; ">\</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: red; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;</span><span style="color: darkcyan; background: black; ">|/</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: red; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">f5e91bb</span><span style="color: gray; background: black; ">&nbsp;change&nbsp;documentation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: red; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">928d007</span><span style="color: gray; background: black; ">&nbsp;Mini&nbsp;changes&nbsp;on&nbsp;comments&nbsp;and&nbsp;doc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: green; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #8b8b00; background: black; ">cac294e</span><span style="color: gray; background: black; ">&nbsp;Merge&nbsp;branches&nbsp;'developpement'&nbsp;and&nbsp;'master'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: yellow; background: black; ">|</span><span style="color: green; background: black; ">\</span><span style="color: gray; background: black; ">&nbsp;</span><span style="color: green; background: black; ">\</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: yellow; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;</span><span style="color: green; background: black; ">|/</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: yellow; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">6758b76</span><span style="color: gray; background: black; ">&nbsp;Append&nbsp;every&nbsp;properties&nbsp;on&nbsp;getproperties&nbsp;method&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: yellow; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">c37fd35</span><span style="color: gray; background: black; ">&nbsp;Change&nbsp;file&nbsp;structure,&nbsp;src&nbsp;directory&nbsp;to&nbsp;put&nbsp;sources,&nbsp;and&nbsp;change&nbsp;setup.py&nbsp;to&nbsp;map&nbsp;modification&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: yellow; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">ff68e10</span><span style="color: gray; background: black; ">&nbsp;Remove&nbsp;class,&nbsp;this&nbsp;is&nbsp;better&nbsp;to&nbsp;use&nbsp;it&nbsp;as&nbsp;a&nbsp;simple&nbsp;module&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: yellow; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">f5f7de9</span><span style="color: gray; background: black; ">&nbsp;Finnaly,&nbsp;I&nbsp;don't&nbsp;like&nbsp;this&nbsp;properties&nbsp;(in&nbsp;fact,&nbsp;I&nbsp;didn't&nbsp;found&nbsp;how&nbsp;to&nbsp;do...)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: yellow; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">f31783b</span><span style="color: gray; background: black; ">&nbsp;Some&nbsp;test&nbsp;for&nbsp;Version&nbsp;and&nbsp;Sources&nbsp;properties&nbsp;on&nbsp;git&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: yellow; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;*&nbsp;</span><span style="color: #8b8b00; background: black; ">971b344</span><span style="color: gray; background: black; ">&nbsp;Changes&nbsp;documentation&nbsp;comments&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: blue; background: black; ">|</span><span style="color: gray; background: black; ">&nbsp;</span><span style="color: #8b8b00; background: black; ">21c5b31</span><span style="color: gray; background: black; ">&nbsp;Merge&nbsp;branches&nbsp;'developpement'&nbsp;and&nbsp;'master'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: blue; background: black; ">|/</span><span style="color: gray; background: black; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: #8b8b00; background: black; ">1d4ae3b</span><span style="color: gray; background: black; ">&nbsp;Add&nbsp;quvi&nbsp;to&nbsp;C&nbsp;linker&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: #8b8b00; background: black; ">2ae25e0</span><span style="color: gray; background: black; ">&nbsp;the&nbsp;first&nbsp;code&nbsp;line&nbsp;was&nbsp;badly&nbsp;indented&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: #8b8b00; background: black; ">8aa4027</span><span style="color: gray; background: black; ">&nbsp;Change&nbsp;README&nbsp;to&nbsp;"md"&nbsp;file&nbsp;that&nbsp;allows&nbsp;a&nbsp;pretty&nbsp;display&nbsp;on&nbsp;github&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: #8b8b00; background: black; ">28f0c02</span><span style="color: gray; background: black; ">&nbsp;The&nbsp;first&nbsp;README&nbsp;release&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: #8b8b00; background: black; ">398424c</span><span style="color: gray; background: black; ">&nbsp;append&nbsp;the&nbsp;setup.py&nbsp;file&nbsp;that&nbsp;compiles&nbsp;quvi.so,&nbsp;and&nbsp;install&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span><span style="color: gray; background: black; ">*&nbsp;</span><span style="color: #8b8b00; background: black; ">b69371c</span><span style="color: gray; background: black; ">&nbsp;first&nbsp;commit,&nbsp;inster&nbsp;pxd&nbsp;and&nbsp;pyx&nbsp;files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; background: black; "><br></span></font></tt>

<p><a href="http://feedads.g.doubleclick.net/~a/7Dt_dURxLjFyZvdmxaHIew8wwZg/0/da"><img src="http://feedads.g.doubleclick.net/~a/7Dt_dURxLjFyZvdmxaHIew8wwZg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7Dt_dURxLjFyZvdmxaHIew8wwZg/1/da"><img src="http://feedads.g.doubleclick.net/~a/7Dt_dURxLjFyZvdmxaHIew8wwZg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=1OB9K1_sWus:gm59Fag4UUI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=1OB9K1_sWus:gm59Fag4UUI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=1OB9K1_sWus:gm59Fag4UUI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=1OB9K1_sWus:gm59Fag4UUI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=1OB9K1_sWus:gm59Fag4UUI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=1OB9K1_sWus:gm59Fag4UUI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=1OB9K1_sWus:gm59Fag4UUI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=1OB9K1_sWus:gm59Fag4UUI:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=1OB9K1_sWus:gm59Fag4UUI:KwTdNBX3Jqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Metal3dorg/~4/1OB9K1_sWus" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;
Suite à deux excellents billets proposés par &lt;a href="http://www.croes.org/gerald/blog" title="Gérald" class="wiki_exists"&gt;Gérald&lt;/a&gt; - &lt;a href="http://www.croes.org/gerald/blog/introduction-a-git-12/607/" title="Introduction à Git Partie 1" class="wiki_exists"&gt;Introduction à Git Partie 1&lt;/a&gt; - et &lt;a href="http://www.croes.org/gerald/blog/git-modele-de-branche-efficace/649/" title="Partie 2" class="wiki_exists"&gt;Partie 2&lt;/a&gt; je vais vous présenter quelques petits "trucs" que j'utilise sur Git. Aujourd'hui parlons l'affichage de votre dépôt, dans une console, mais en ...&lt;/p&gt;</description><feedburner:origLink>http://metal3d.org/index.php/blog/ticket/2011/09/26/Git-color-graph?heading=Developpement</feedburner:origLink></item><item><title>Python-Quvi</title><link>http://feedproxy.google.com/~r/Metal3dorg/~3/B0XbJVTRuFQ/Python--Quvi</link><pubDate>Sun, 25 Sep 2011 15:01:06 PDT</pubDate><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[

<p>
Vous connaissez peut-être les projets minitube, cclive ou clive qui sont des outils permettant
la récupération d'information de médias (vidéos, audio...) provenant de sites tels que Youtube, Dailymotion... Ces outils utilisent en fait la librairie "quvi", et un outil en ligne de commande permet d'utiliser cette dernière. La librairie est en C. J'ai donc décidé de créer le wrapper pour Python. <a href="http://github.com/metal3d/python_quvi" title="http://github.com/metal3d/python-quvi" class="wiki_exists">https://github.com/metal3d/python-quvi</a>
</p>

<p>
En relation avec l'auteur de la librairie <a href="http://quvi.sourceforge.net/" title="http://quvi.sourceforge.net/" class="wiki_exists">http://quvi.sourceforge.net/</a> la discussion s'est
d'abord orienté sur SWIG. Ce système permet assez facilement de créer une librairie python compilé depuis une librairie C. Or, après un test ou deux, j'ai trouvé assez compliqué de travailler avec ce système.
</p>

<p>
D'abord parce que SWIG (bien que très puissant et facile d'accès) me sort en fait les fonctions C telles quelles, sans vraiment s'adapter au langage visé, du moins pour python. Et secondo, parce que je connais bien Cython qui me permet de faire la même chose, mais en plus maîtrisable.
</p>

<p>
Si vous ne connaissez pas Cython, allez faire un tour sur mon blog fedora, j'ai écris ce billet pour proposer une introduction assez simple: <a href="http://blog.fedora-fr.org/metal3d/post/Cython-pour-optimis%C3%A9-Python" title="http://blog.fedora-fr.org/metal3d/post/Cython-pour-optimis%C3%A9-Python" class="wiki_exists">http://blog.fedora-fr.org/metal3d/post/Cython-pour-optimis%C3%A9-Python</a>
</p>

<p>
Le billet présente déjà comment compiler un "shared object" pour python, je me suis orienté
alors sur la page de documentation <a href="http://docs.cython.org/src/tutorial/clibraries.html" title="http://docs.cython.org/src/tutorial/clibraries.html" class="wiki_exists">http://docs.cython.org/src/tutorial/clibraries.html</a> qui m'a parut assez claire pour débuter le travail.
</p>

<p>
L'idée principale a été de lire le fichier "quvi.h" pour y remonter les déclarations dont j'avais besoin, puis de préparer une classe qui me permet de récupérer les type C, pour les passer en objet python.
</p>

<p>
Le résultat a été immédiat. D'abord un ".so" bien plus petit qu'avec SWIG, mais en plus
une classe que je pouvais mieux adapter au langage. Option qui ne m'a pas déplut, c'est qu'en plus j'ai un seul fichier "quvi.so" et non un "_quvi.so" et un "quvi.py" à utiliser.
</p>

<p>
Et enfin, la compilation se faisant via les "distutils" de python, la librairie est compilée et installé par un simple "setup.py".
</p>

<p>
Je vous invite donc à tester et me dire si la librairie fonctionne, non pas ici sur le blog mais sur la page du projet: <a href="http://github.com/metal3d/python-quvi" title="http://github.com/metal3d/python-quvi" class="wiki_exists">https://github.com/metal3d/python-quvi</a>
</p>

<p>
N'oubliez pas que sur github, il est préférable de forker le projet pour me proposer des
pull request plutôt que des patchs. Notes enfin que je développe dans la branche "developpement" et non dans le "master".
</p>

<p>
Voilà pour la news :)
</p>

<p><a href="http://feedads.g.doubleclick.net/~a/wNbvNdgGwkXzkY-MFA89eRymlsY/0/da"><img src="http://feedads.g.doubleclick.net/~a/wNbvNdgGwkXzkY-MFA89eRymlsY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/wNbvNdgGwkXzkY-MFA89eRymlsY/1/da"><img src="http://feedads.g.doubleclick.net/~a/wNbvNdgGwkXzkY-MFA89eRymlsY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=B0XbJVTRuFQ:RjnRJzbQHO0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=B0XbJVTRuFQ:RjnRJzbQHO0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=B0XbJVTRuFQ:RjnRJzbQHO0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=B0XbJVTRuFQ:RjnRJzbQHO0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=B0XbJVTRuFQ:RjnRJzbQHO0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=B0XbJVTRuFQ:RjnRJzbQHO0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=B0XbJVTRuFQ:RjnRJzbQHO0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=B0XbJVTRuFQ:RjnRJzbQHO0:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=B0XbJVTRuFQ:RjnRJzbQHO0:KwTdNBX3Jqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Metal3dorg/~4/B0XbJVTRuFQ" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;
Vous connaissez peut-être les projets minitube, cclive ou clive qui sont des outils permettant
la récupération d'information de médias (vidéos, audio...) provenant de sites tels que Youtube, Dailymotion... Ces outils utilisent en fait la ...&lt;/p&gt;</description><feedburner:origLink>http://metal3d.org/index.php/blog/ticket/2011/09/26/Python--Quvi?heading=Informatique</feedburner:origLink></item><item><title>Python map zip lambda et filter</title><link>http://feedproxy.google.com/~r/Metal3dorg/~3/oXLjuttpUsc/Python-map-zip-lambda-et-filter</link><pubDate>Thu, 18 Aug 2011 10:31:47 PDT</pubDate><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[

<p>
Python est un langage fort de principes de développement permettant la réduction conséquente de volume de code. Dans l'univers de capacités de langage, il existe des petites astuces qui deviennent véritablement des outils de développement pour permettre au développeur de ganger en efficacité. Le revers de la médaille étant de connaître assez bien Python pour avoir le reflexe qui permettra ce genre de manipulation. Parlons donc d'un ensemble de possibilités de Python qui va vous ouvrir les portes du code "court". Je parle des fonction zip, map, filter associés au fonctions lambda.
</p>

<p>
Partons d'un code python simple. Ce genre de code que vous tapez quand vous venez d'un autre langage. Ce code est évidamment juste et fonctionne. Je n'ai rien à redire à part que Python va vous permettre de le rendre plus court tout en restant optimal.
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> isIPLocal<span style="color: black;">&#40;</span>ip<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#coupe l'ip en jeu de 4 sequences</span><br />
&nbsp; &nbsp; ip =ip.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>==<span style="color: #483d8b;">"192"</span> <span style="color: #ff7700;font-weight:bold;">and</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>==<span style="color: #483d8b;">"168"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>==<span style="color: #483d8b;">"10"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>==<span style="color: #483d8b;">"172"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> < <span style="color: #ff4500;">32</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>><span style="color: #ff4500;">15</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span><br />
&nbsp;</div></div>

<p>
Bon, reprenons rapidement le fonctionnement de cette fonction. Si l'adresse ip commence par 192.168 alors on a une ip locale, on retourne donc True. Si elle commence par "10", idem, on retourne vrai... et enfin, 3 ième cas, l'ip comence par 172 et son deuxième élément se trouve entre 16 et 31, on retourne vraie... Pour les autres cas, on retourne False.
</p>

<p>
Le code est bon, il marche. Mais voilà, Python permet de faire un peu plus court.
</p>

<p>
Tout d'abord, nous testons des chaines de caractères... non pas que ça me dérange, mais passer par des entiers va permettre d'être un peu plus efficace, et en plus, pour le cas 3, cela évitera un double "int".
Mais voilà, on ne va certainemetn pas boucler sur nos élément d'ip... on va utiliser la fonction "map" qui prend en premier argument une fonction, et en second élément une liste.
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
...<br />
<span style="color: black;">ip</span> = <span style="color: #008000;">map</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span>, ip.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
...<br />
&nbsp;</div></div>

<p>
Cela va faire une chose simple comme tout: appliquer à chaque élément retourné par "split" la fonction "int(...)", donc ip est mainentant une liste d'entier. Voyons le code:
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> isIPLocal<span style="color: black;">&#40;</span>ip<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#coupe l'ip en jeu de 4 sequences</span><br />
&nbsp; &nbsp; ip = <span style="color: #008000;">map</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span>, ip.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>==<span style="color: #ff4500;">192</span> <span style="color: #ff7700;font-weight:bold;">and</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>==<span style="color: #ff4500;">168</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>==<span style="color: #ff4500;">10</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>==<span style="color: #ff4500;">172</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> < <span style="color: #ff4500;">32</span> <span style="color: #ff7700;font-weight:bold;">and</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>><span style="color: #ff4500;">15</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span><br />
&nbsp;</div></div>

<p>
Bien, une petite réduction de code supplémentaire: inutile de faire un "and" sur le 3ième cas, on peut utiliser xrange() pour vérifier si la valeur est dans ce rang. C'est pas plus efficace mais plus lisible:
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> isIPLocal<span style="color: black;">&#40;</span>ip<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#coupe l'ip en jeu de 4 sequences</span><br />
&nbsp; &nbsp; ip = <span style="color: #008000;">map</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span>, ip.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>==<span style="color: #ff4500;">192</span> <span style="color: #ff7700;font-weight:bold;">and</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>==<span style="color: #ff4500;">168</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>==<span style="color: #ff4500;">10</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>==<span style="color: #ff4500;">172</span> <span style="color: #ff7700;font-weight:bold;">and</span> ip<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">16</span>,<span style="color: #ff4500;">32</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span><br />
&nbsp;</div></div>

<p>
Voilà nous avons un code plus sympa. Passons à la suite.
</p>

<p>
Maintenant, on va tester notre fonction, mais en utilisant un lot d'ip:
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
<br />
ips = <span style="color: black;">&#91;</span><span style="color: #483d8b;">"192.168.0.2"</span>,<span style="color: #483d8b;">"88.23.45.155"</span>,<span style="color: #483d8b;">"10.0.0.1"</span>,<span style="color: #483d8b;">"172.32.10.10"</span>,<span style="color: #483d8b;">"1.2.3.4"</span><span style="color: black;">&#93;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">for</span> ip <span style="color: #ff7700;font-weight:bold;">in</span> ips:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> ip, isIPLocal<span style="color: black;">&#40;</span>ip<span style="color: black;">&#41;</span><br />
<br />
&nbsp;</div></div>

<p>
Oui ça marche... mais je veux avoir la liste des ip locales, avec l'ip contenu dans la liste...:
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
<br />
ips = <span style="color: black;">&#91;</span><span style="color: #483d8b;">"192.168.0.2"</span>,<span style="color: #483d8b;">"88.23.45.155"</span>,<span style="color: #483d8b;">"10.0.0.1"</span>,<span style="color: #483d8b;">"172.32.10.10"</span>,<span style="color: #483d8b;">"1.2.3.4"</span><span style="color: black;">&#93;</span><br />
<br />
localip = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
<span style="color: #ff7700;font-weight:bold;">for</span> ip <span style="color: #ff7700;font-weight:bold;">in</span> ips:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> isIPLocal<span style="color: black;">&#40;</span>ip<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; localip.<span style="color: black;">append</span><span style="color: black;">&#40;</span>ip<span style="color: black;">&#41;</span><br />
<br />
&nbsp;</div></div>

<p>
Voilà le cas exact et très intéressant en Python. Il est en fait inutile de faire une boucle, "filter" permet de travailler plus simplement:
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
<br />
ips = <span style="color: black;">&#91;</span><span style="color: #483d8b;">"192.168.0.2"</span>,<span style="color: #483d8b;">"88.23.45.155"</span>,<span style="color: #483d8b;">"10.0.0.1"</span>,<span style="color: #483d8b;">"172.32.10.10"</span>,<span style="color: #483d8b;">"1.2.3.4"</span><span style="color: black;">&#93;</span><br />
localip = <span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>isIPLocal, ips<span style="color: black;">&#41;</span><br />
<br />
&nbsp;</div></div>

<p>
Et voilà, une seule ligne qui remplace la boucle. "localip" est bien une liste d'adresse locales. Alors vous allez me dire "ok, mais pour avoir l'inverse? je dois refaire une fonction, ou encore pire, virer les doublons en mergant les tableaux de..." et ho... stop !
</p>

<p>
Non, on va utiliser une fonction lambda. Un fonction lambda est une fonction en une ligne, compilée directement dans le code, un peu comme une fonction inline en C. L'intérêt est qu'elle n'entre pas dans le dictionnaire de fonctions de votre code, elle ne va servir qu'au moment où on en a besoin, puis disparaitre. C'est bel et bien le principe de la fonction jetable.
</p>

<p>
Donc, clairement, pour avoir les fonctions d'adresses publiques, il faut simplement inverser isIPLocal.
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
<br />
ips = <span style="color: black;">&#91;</span><span style="color: #483d8b;">"192.168.0.2"</span>,<span style="color: #483d8b;">"88.23.45.155"</span>,<span style="color: #483d8b;">"10.0.0.1"</span>,<span style="color: #483d8b;">"172.32.10.10"</span>,<span style="color: #483d8b;">"1.2.3.4"</span><span style="color: black;">&#93;</span><br />
localip = <span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>isIPLocal, ips<span style="color: black;">&#41;</span><br />
privateip = <span style="color: #008000;">filter</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> x: <span style="color: #ff7700;font-weight:bold;">not</span> isIPLocal<span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span>, ips<span style="color: black;">&#41;</span><br />
&nbsp;</div></div>

<p>
Comprennez bien, 'lambda x:" signifie que "x" est l'argument de la fonction lambda. Arpès le ":" apparait la valeur de retour, sans mot clef "return"
</p>

<p>
Ici, j'inverse avec "not" le retour de la fonction isIPLocal. De ce fait, "privateip" contient que des adresses publiques.
</p>

<p>
L'intérêt ici, c'est que nous n'aurions pas put utiliser la génération de liste python avec un "[x for x in ... ]" car un test est nécessaire. Tout du moins, cela simplifie le travail.
</p>

<p>
Vous l'aurez compris, map, filter, lambda sont très intéressants. Voyons enfin "zip" qui va encore agrémenter votre développement d'un niveau.
</p>

<p>
"zip" permet de prendre deux tableaux (liste) et d'en faire une liste de tuple dont les éléments sont mappés dans l'ordre. Exemple:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
<br />
&nbsp;>>> a= ["foo","bar","baz"]<br />
&nbsp;>>> b = ["100","200","300"]<br />
&nbsp;>>> zip (a, b)<br />
&nbsp;[('foo', '100'), ('bar', '200'), ('baz', '300')]<br />
<br />
&nbsp;</div></div>

<p>
Cela va permettre de faire des manipulations très très intéressante en conjonction avec map, filter, et des lambda.
</p>

<p>
Prenons un exemple que j'ai eut à traiter. Deux tableaux de valeurs entières dont je devais récupérer les valeurs maximales en comparaison entre chaque index. Plus clairement:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
val1 = [12,45,22,15,78,41,10,2]<br />
val2 = [8 ,22,15,75,32, 5,48,9]<br />
&nbsp;</div></div>

<p>
Il me faut donc avoir la liste de valeurs telle avec max(val1[x], val2[x])... Donc on pourrait imaginer que je bouclerai sur les tableaux et que je testerai chaque valeur... mais non !
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
val1 = <span style="color: black;">&#91;</span><span style="color: #ff4500;">12</span>,<span style="color: #ff4500;">45</span>,<span style="color: #ff4500;">22</span>,<span style="color: #ff4500;">15</span>,<span style="color: #ff4500;">78</span>,<span style="color: #ff4500;">41</span>,<span style="color: #ff4500;">10</span>,<span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><br />
val2 = <span style="color: black;">&#91;</span><span style="color: #ff4500;">8</span> ,<span style="color: #ff4500;">22</span>,<span style="color: #ff4500;">15</span>,<span style="color: #ff4500;">75</span>,<span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">5</span>,<span style="color: #ff4500;">48</span>,<span style="color: #ff4500;">9</span><span style="color: black;">&#93;</span><br />
<br />
res = <span style="color: #008000;">map</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> x: <span style="color: #008000;">max</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>,x<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">zip</span><span style="color: black;">&#40;</span>val1, val2<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp;</div></div>

<p>
C'est tout !, res vaut bien "[12, 45, 22, 75, 78, 41, 48, 9]".
</p>

<p>
Oui, on aurait put faire:
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
res = <span style="color: black;">&#91;</span><span style="color: #008000;">max</span> <span style="color: black;">&#40;</span>x,y<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> x,y <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">zip</span><span style="color: black;">&#40;</span>val1, val2<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><br />
&nbsp;</div></div>

<p>
En fait, la méthode "map + lambda" est juste un peu plus claire (malgré tout) et surtout plus efficace. Pour faire simple, "map" permet de ne pas trop se casser la tête sur des cas complexe... comme par exemple mapper des fonction stoquée dans un tableau à appliquer à des valeurs...
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
fun = <span style="color: black;">&#91;</span><span style="color: #008000;">int</span>, <span style="color: #008000;">float</span>, <span style="color: #008000;">int</span>, <span style="color: #008000;">float</span><span style="color: black;">&#93;</span><br />
vals = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">2</span>,<span style="color: #ff4500;">3</span>,<span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span><br />
<span style="color: #008000;">map</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> x: x<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">zip</span><span style="color: black;">&#40;</span>fun, vals<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<span style="color: #808080; font-style: italic;">#retourne [1, 2.0, 3, 4.0]</span><br />
&nbsp;</div></div>

<p>
Ou encore, pour charger des modules en liste:
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
mods = <span style="color: black;">&#91;</span><span style="color: #483d8b;">'re'</span>,<span style="color: #483d8b;">'sys'</span>,<span style="color: #483d8b;">'os'</span><span style="color: black;">&#93;</span><br />
<br />
<span style="color: #808080; font-style: italic;">#mapping de fonctions</span><br />
<span style="color: #008000;">map</span><span style="color: black;">&#40;</span><span style="color: #008000;">__import__</span>, mods<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;">#plus joli que:</span><br />
<span style="color: #ff7700;font-weight:bold;">for</span> m <span style="color: #ff7700;font-weight:bold;">in</span> mods: <span style="color: #008000;">__import__</span><span style="color: black;">&#40;</span>m<span style="color: black;">&#41;</span><br />
&nbsp;</div></div>

<p>
Voilà, à vous de voir maintenant l'intérêt de ce genre de manipulation. Je vous montrerai ensuite un petit code en python qui sera en plus sujet à un défi: un code decryptage simple à casser. L'idée principale du code est de crypter des données, mais vous remarquerez l'utilisation à foison de map, de lambda, de filters...
</p>

<p>
Voilà, bon code à vous.
</p>

<p><a href="http://feedads.g.doubleclick.net/~a/CodOCvqsxFXWYPT4QyA-58MAx0o/0/da"><img src="http://feedads.g.doubleclick.net/~a/CodOCvqsxFXWYPT4QyA-58MAx0o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/CodOCvqsxFXWYPT4QyA-58MAx0o/1/da"><img src="http://feedads.g.doubleclick.net/~a/CodOCvqsxFXWYPT4QyA-58MAx0o/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=oXLjuttpUsc:H6NqKG8AQBQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=oXLjuttpUsc:H6NqKG8AQBQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=oXLjuttpUsc:H6NqKG8AQBQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=oXLjuttpUsc:H6NqKG8AQBQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=oXLjuttpUsc:H6NqKG8AQBQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=oXLjuttpUsc:H6NqKG8AQBQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=oXLjuttpUsc:H6NqKG8AQBQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=oXLjuttpUsc:H6NqKG8AQBQ:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=oXLjuttpUsc:H6NqKG8AQBQ:KwTdNBX3Jqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Metal3dorg/~4/oXLjuttpUsc" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;
Python est un langage fort de principes de développement permettant la réduction conséquente de volume de code. Dans l'univers de capacités de langage, il existe des petites astuces qui deviennent véritablement des outils de développement ...&lt;/p&gt;</description><feedburner:origLink>http://metal3d.org/index.php/blog/ticket/2011/08/18/Python-map-zip-lambda-et-filter?heading=Developpement</feedburner:origLink></item><item><title>Macgeneration dans mon colimateur</title><link>http://feedproxy.google.com/~r/Metal3dorg/~3/38KmQgPu9No/Macgeneration-dans-mon-colimateur</link><pubDate>Thu, 04 Aug 2011 12:15:49 PDT</pubDate><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[

<p>
Tiens j'ai une nouvelle tête de turc à critiquer... le site MacGeneration que j'ai visité un peu plus en profondeur. Je n'avais pas idée de certains articles qui pouvaient pousser là dessus. Je m'y suis retrouvé souvent par hasard, puis dernièrement c'est un utilisateur de Google+ qui m'a montré une page de ce site. Alors allons-y gaiement, j'ai eut comme un frisson en lisant ce site...
</p>

<p>
Bon, clairement, on parle d'un site de Apple Addicts, je sais très bien (oui je suis pas si idiot) que les site "pro linux" ont tendances à faire pareil, et idem pour les "pro-MS". Mais là... au fur et à mesure que les pages du site défilaient devant mes yeux, j'ai pris peur... Mais vous allez voir que j'ai quand même été rassuré à la fin. Laissez moi aller jusqu'au bout.
</p>

<p>
Outre les 50 pages que j'ai dut me taper en ayant des sourires en coin, cette page m'a fait flipper tellement elle démontre à quel point un adorateur de Mac ou Apple plus généralement peut être fourbe dans ses propos:
<a href="http://www.macgeneration.com/unes/voir/130002/android-et-les-brevets-une-lettre-ouverte-de-google-en-forme-d-ecran-de-fumee" title="http://www.macgeneration.com/unes/voir/130002/android-et-les-brevets-une-lettre-ouverte-de-google-en-forme-d-ecran-de-fumee" class="wiki_exists">http://www.macgeneration.com/unes/voir/130002/android-et-les-brevets-une-lettre-ouverte-de-google-en-forme-d-ecran-de-fumee</a>
</p>

<p>
Clairement ici, l'auteur y va à grand coup de délires. Il explique que d'une part Apple a un stock de propriété intellectuelle plus importante que Google (ha bon ? (ironie...)).
</p>

<p>
Oui... et ? justement... allo ? c'est pile poil le reproche que fait Google à Apple et consort là... le fait d'avoir un pack de brevet où on pourrait presque vous demander des royalties pour aller aux toilettes... Donc défendre la critique en appuyant sur le point noir... heu pas compris.
</p>

<p>
Bred, je continue. L'auteur dit 
</p>

<p>
"De par la nature même de son cœur de métier, Google n'a pas besoin de brevets — mieux, elle est à l'opposé de ce système. Son grand succès est en effet un algorithme mathématique à la base de son moteur de recherche et de son système de publicité ciblée — un algorithme secret, alors que le brevet est la publication d'une invention." 
</p>

<p>
Heu... rien ne vous choque ?
</p>

<p>
D'une par, Google n'a jamais dit qu'il a "besoin de brevet", il dit bien clairement qu'il veut que les concurrents arrêtent de brandir ce bout de papier pour empêcher les autres d'avancer dans la concurrence. Ensuite, seconde fourberie de l'auteur, l'algorithme de recherche de Google n'est pas secret...
</p>

<p>
Puis le fait que le brevet soit une publication d'un invention est un leurre qui cache le fait qu'il sert avant tout à empêcher les autres d'utiliser l'idée. 
</p>

<p>
Pire:
</p>

<p>
"... faire fabriquer un smartphone, c'est à un moment ou à un autre marcher sur les platebandes intellectuelles de quelqu'un d'autre."
</p>

<p>
Et donc ? si j'ai envie de manger un Hamburger je vais devoir obligatoirement reverser une partie de mon pognon à MacDonald ? Je pense pas que Quick ou Burger King reverse des droits pour ça... ou alors le monde est pire que je ne le pense...
</p>

<p>
Et là, le coup de grâce (parmis le reste d'inepsie dont je vous épargne..) est là:
</p>

<p>
"Google tient la position de la France : elle a une grande gueule mais n'a pas les moyens de ses ambitions, quelques bombes nucléaires mais rien comparé à l'arsenal d'en face et pas le manuel pour les utiliser."
</p>

<p>
Heu, les ambitions ne demandent pas d'arsenal. Google a le manuel justement, mais on va l'empêcher de l'exploiter pour des questions judiciaires. Rien de technologique là dedans.
</p>

<p>
Et allons-y pour maintenant critiquer un point de vue débile de l'auteur. Donc si on le suit, le mec qui a le plus de brevets et le dominant du sujet. Or, iPhon, iPad... qui a les brevets ? et bien non, c'est pas Apple, mais Samsung
</p>

<p>
Samsung qui se voit attaquer par Apple quand il a voulu sortir sa nouvelle galaxy tab pour des question de... brevets... 
</p>

<p>
J'adore, magnifique !
</p>

<p>
Outre les conneries que j'ai lu, je suis étonné de voir sur cette page une photo de "vieux google phone" pour donner une image bien ridicule de Android... alors que:
</p>
<ul>
<li> le galaxy S2 a de meilleures capacité techno que iPhone 4</li>
<li> il se vend plus de Android que de iPhone</li>
<li> iPhone a bénéficié d'avancés proposé par Android (par exemple pour la notification)</li>
</ul>


<p>
Bref, on voit bien là un article pro apple, sans cracher sur le principe de l'auteur qui sur un site "pro apple" ne va pas écraser son idole, j'avais envie de donner mon point de vue.
</p>

<p>
Chose qui m'a rassuré, je vous le disais en début de billet, c'est quand j'ai lut les commentaires sur les pages de ce site. Apparement beaucoup de lecteurs ne sont pas dupes et critiquent souvent ce que les auteurs expliquent. Ça me rassure beaucoup.
</p>

<p>
Bref, j'espère juste que le procès lancé par Google aura un temps soit peu de contenu propre: <a href="http://www.01net.com/editorial/536950/concurrence-google-vise-par-neuf-plaintes-a-bruxelles/" title="http://www.01net.com/editorial/536950/concurrence-google-vise-par-neuf-plaintes-a-bruxelles/" class="wiki_exists">http://www.01net.com/editorial/536950/concurrence-google-vise-par-neuf-plaintes-a-bruxelles/</a>
</p>

<p><a href="http://feedads.g.doubleclick.net/~a/7zZ7S7ZJ79qFSZaIwzZaRleT4TI/0/da"><img src="http://feedads.g.doubleclick.net/~a/7zZ7S7ZJ79qFSZaIwzZaRleT4TI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7zZ7S7ZJ79qFSZaIwzZaRleT4TI/1/da"><img src="http://feedads.g.doubleclick.net/~a/7zZ7S7ZJ79qFSZaIwzZaRleT4TI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=38KmQgPu9No:qnRGMF9si0U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=38KmQgPu9No:qnRGMF9si0U:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=38KmQgPu9No:qnRGMF9si0U:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=38KmQgPu9No:qnRGMF9si0U:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=38KmQgPu9No:qnRGMF9si0U:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=38KmQgPu9No:qnRGMF9si0U:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=38KmQgPu9No:qnRGMF9si0U:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=38KmQgPu9No:qnRGMF9si0U:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=38KmQgPu9No:qnRGMF9si0U:KwTdNBX3Jqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Metal3dorg/~4/38KmQgPu9No" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;
Tiens j'ai une nouvelle tête de turc à critiquer... le site MacGeneration que j'ai visité un peu plus en profondeur. Je n'avais pas idée de certains articles qui pouvaient pousser là dessus. Je m'y suis retrouvé souvent par hasard, puis ...&lt;/p&gt;</description><feedburner:origLink>http://metal3d.org/index.php/blog/ticket/2011/08/04/Macgeneration-dans-mon-colimateur?heading=Android</feedburner:origLink></item><item><title>Google il est gentil quand meme</title><link>http://feedproxy.google.com/~r/Metal3dorg/~3/A-TUV_c3quo/Google-il-est-gentil-quand-meme</link><pubDate>Tue, 02 Aug 2011 14:05:41 PDT</pubDate><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[

<p>
Indéniablement, Google aide le monde du libre et l'expansion des nouvelles technologies. On a beau le critiquer sur sa capacité à connaitre toute votre vie via vos mails, vos documents, vos photos... rien à faire, il a pour lui un avantage certain: de l'argent. Et cracher sur lui alors qu'on est linuxien, ou acteur du logiciel libre, revient à se tirer une balle dans le pied.
</p>

<p>
Je ne dis pas qu'il faut tout excuser, je ne suis pas d'accord sur l'intrusion possible d'une firme à connaitre tout de ma vie, mais sans Google je pense que beaucoup d'entre nous auraient laissé tomber pas mal de technologies et je pense même qu'on aurait pas mal de retard sur les capacités actuelles du Web.
</p>

<p>
Pourquoi je me fais avocat du diable... s'il en est un... ? Parce que j'ai fait un bilan de ce que m'a permi de voir Google.
</p>

<p>
Tout d'abord, les fameux GSOC (Google Summer Of Code) qui permettent à des étudiants doués de bosser 4 mois environ sur un projet libre pour lui apporter des choses nouvelles. Par exemple je m'intéresse ces temps-ci à Blender Tomato, une branche de Blender développé par Sergei qui permet de faire de la reconstruction 3D à partir d'une Vidéo. Jusque là, aucun logiciel libre ne permettaient de le faire correctement, et nous étions donc forcé d'utiliser voodoo cam tracker (franchement pas terrible), pftrack (très cher)... 
</p>

<p>
Ces GSOC donnent donc beaucoup à nous, développeurs et utilisateurs du libre. Mais ce n'est pas tout.
</p>

<p>
Android, basé sur un noyau Linux, me permet d'avoir enfin un téléphone branché, avec lequel je peux développer des applications sans avoir à me prendre la tête avec un PC spécifique et un langage imbuvable (vous voyez de qui je parle, faites pas les innocents)
</p>

<p>
Et dernièrement, indirectement, le fait que Adobe commence à se pencher vraiment sur HTML5 en sortant une préversion de Adobe Edge. A la longue, je suis certain qu'il va remplacer Flash...
</p>

<p>
Pourquoi indirectement ? clairement, depuis que Chrome est sorti, c'est fou le nombre de sites que je vois qui utilisent les capacité de HTML5. Vidéo, audio, 3D (webgl) ou utilisation de canvas... tout cela a vraiment explosé depuis que Google a pris le projet Chromium sous son aile.
</p>

<p>
Et ne parlons pas de Google+ qui eclatte doucement en s'opposant à Facebook (en ayant certainement un autre type d'utilisateur, mais justement il tape au bon endroit) ou encore VP8 qui est le codec vidéo qui signe doucement l'arrêt de mort de H.264 (sur le Web tout du moins...)
</p>

<p>
Google a certes beaucoup de choses à se reprocher, tout comme Apple ou MS... mais une chose est certaine, Google au moins présente des outils libre, gratuits pour la plupart, aide le développement du libre, propose du hosting de code... Cela peut un temps soit peu abaisser les critiques fortes et engagées que l'on porte à son égard.
</p>

<p>
Personnellement, j'ai presque toute ma vie sur Google: un profil Google+, mes vidéos sur Youtube, mes photos sur Picasa, j'utilise beaucoup Chromium, et je suis un vrai adorateur de Google Docs. Quand à mes mails, je les ai sur Gmail (et comme je suis connecté via Evolution, je ne vois pas de pub... je vous rapelle qu'à l'inverse de MS, Google propose un serveur IMAP...)
Je n'y vois pour le moment pas de problème, je suis sur Google depuis 2004 et je n'ai pas encore eut de souci... tout ce qui est vu de moi sur Google je l'ai bien voulu... rien de compomettant.
</p>

<p>
D'ailleurs, petite parenthèse, MS a sorti une vidéo très drôle anti-Gmail. 
</p>

<p>
<a href="http://www.youtube.com/watch?v=OrkAuwaoFGg" title="le GmailMan" class="wiki_exists">le GmailMan</a>
</p>

<p>
Elle est très réussit et vraiment marrante, mais il faut quand même être un peu réaliste: en général, une entreprise ne devrait pas aller sur le site Gmail mais utiliser un client lourd (Evolution, MS Office Outlook...) Donc bon... bref... 
</p>

<p>
Voilà donc selon moi Google est tout de même un acteur utile qui permet à bon nombre d'entre nous d'avoir de nouvelles technos utilisables sans attendre 10 ans que MS daigne les utiliser. C'est mon avis à moi.
</p>

<p><a href="http://feedads.g.doubleclick.net/~a/rYNTx6KSUJxghc1KYCrhKj3raLk/0/da"><img src="http://feedads.g.doubleclick.net/~a/rYNTx6KSUJxghc1KYCrhKj3raLk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rYNTx6KSUJxghc1KYCrhKj3raLk/1/da"><img src="http://feedads.g.doubleclick.net/~a/rYNTx6KSUJxghc1KYCrhKj3raLk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A-TUV_c3quo:ytp4zoQ18wQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A-TUV_c3quo:ytp4zoQ18wQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A-TUV_c3quo:ytp4zoQ18wQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A-TUV_c3quo:ytp4zoQ18wQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=A-TUV_c3quo:ytp4zoQ18wQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A-TUV_c3quo:ytp4zoQ18wQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=A-TUV_c3quo:ytp4zoQ18wQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A-TUV_c3quo:ytp4zoQ18wQ:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=A-TUV_c3quo:ytp4zoQ18wQ:KwTdNBX3Jqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Metal3dorg/~4/A-TUV_c3quo" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;
Indéniablement, Google aide le monde du libre et l'expansion des nouvelles technologies. On a beau le critiquer sur sa capacité à connaitre toute votre vie via vos mails, vos documents, vos photos... rien à faire, il a pour lui un avantage ...&lt;/p&gt;</description><feedburner:origLink>http://metal3d.org/index.php/blog/ticket/2011/08/02/Google-il-est-gentil-quand-meme?heading=Informatique</feedburner:origLink></item><item><title>Et si on regardait nodejs</title><link>http://feedproxy.google.com/~r/Metal3dorg/~3/mpPS-OJIyZk/Et-si-on-regardait-nodejs</link><pubDate>Thu, 21 Jul 2011 04:32:37 PDT</pubDate><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[

<p>
Quand j'entend beaucoup de développeurs (expérimentés qui plus est) cracher sur Javascript, je me dis qu'il y a un vrai souci avec l'image de ce langage... Car j'ai beau regarder, tester, Javascript reste pour moi l'un des meilleures langages à ce jour. Lorsque l'on voit Firefox codé en XUL (donc en partie en JS) ou encore les capacités extraodinaires de WebGL (voyez le projet <a href="http://ro.me" title="Ro.me" class="wiki_exists">Ro.me</a>), je me demande bien pourquoi on lui fait tellement de tort. Et c'est sans compter sur le pojet "<a href="http://nodejs.org" title="node.js" class="wiki_exists">node.js</a>" qui est en phase de faire poids devant les grand maîtres des langages web: PHP, Java et Python.
</p>

<p>
Cela fait en fait des mois que j'amuse avec node.js. J'ai beaucoup travaillé sur le coté "parallélisation" et intégration système. Je me suis monté un petit serveur HTTP complètement autonome, qui répond entre 5 et 400 fois plus vite que Apache (je vous montrerai ça quand j'aurais un peu plus avancé sur le projet).
</p>

<p>
Alors node.js c'est quoi ? c'est un système permettant de faire en Javascript, coté serveur, des applications serveurs. Il se base sur le moteur "V8" de Google (intégré dans Chromimum/Chrome) qui a l'avantage d'être très rapide. Mais vous allez me dire "quel avantage ?" car si c'est juste pour coder dans un autre langage, il n'y a aucun intérêt...
</p>

<p>
Et bien des avantages, on en trouve plein... je vais vous exposer les plus intéressantes, et surtout les plus impressionnantes. On va commencer par les performances, basiques, du simple calcul... Testons simplement une bonne vieille suite de Fibonacci en PHP, en Python et en Node/JS:
</p>

<p>
Pour le python:
</p>

<div class="wiki_code"><div class="python" style="font-family: monospace;"><br />
<span style="color: #ff7700;font-weight:bold;">def</span> fibo<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> n == <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">or</span> n == <span style="color: #ff4500;">1</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> n<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> fibo<span style="color: black;">&#40;</span>n<span style="color: #ff4500;">-2</span><span style="color: black;">&#41;</span> + fibo<span style="color: black;">&#40;</span>n<span style="color: #ff4500;">-1</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span> fibo<span style="color: black;">&#40;</span><span style="color: #ff4500;">32</span><span style="color: black;">&#41;</span><br />
&nbsp;</div></div>

<p>
Pour le PHP:
</p>

<div class="wiki_code"><div class="php" style="font-family: monospace;"><br />
<span style="color: #000000; font-weight: bold;"><?php</span><br />
<span style="color: #000000; font-weight: bold;">function</span> fibo<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$n</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$n</span> == <span style="color: #cc66cc;">0</span> || <span style="color: #0000ff;">$n</span> == <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$n</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> fibo<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$n</span><span style="color: #cc66cc;">-2</span><span style="color: #66cc66;">&#41;</span> + fibo<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$n</span><span style="color: #cc66cc;">-1</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span><br />
<a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> fibo<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span>; <a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">"<span style="color: #000099; font-weight: bold;">\n</span>"</span>;<br />
<span style="color: #000000; font-weight: bold;">?></span><br />
&nbsp;</div></div>

<p>
et enfin en node/js:
</p>

<div class="wiki_code"><div class="javascript" style="font-family: monospace;"><br />
<span style="color: #003366; font-weight: bold;">function</span> fib<span style="color: #66cc66;">&#40;</span>n<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>n==<span style="color: #CC0000;">0</span> || n==<span style="color: #CC0000;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> n;<br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> fib<span style="color: #66cc66;">&#40;</span>n<span style="color: #CC0000;">-2</span><span style="color: #66cc66;">&#41;</span> + fib<span style="color: #66cc66;">&#40;</span>n<span style="color: #CC0000;">-1</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span><br />
console.<span style="color: #006600;">log</span><span style="color: #66cc66;">&#40;</span>fib<span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">32</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp;</div></div>

<p>
Ok, donc on lance les tests:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
time php fibo.php <br />
2178309<br />
<br />
real&nbsp; &nbsp; 0m9.195s<br />
user&nbsp; &nbsp; 0m8.051s<br />
sys&nbsp; &nbsp; &nbsp;0m0.011s<br />
<br />
time python fibo.py <br />
2178309<br />
<br />
real&nbsp; &nbsp; 0m2.884s<br />
user&nbsp; &nbsp; 0m1.697s<br />
sys&nbsp; &nbsp; &nbsp;0m0.030s<br />
<br />
time node test1.js <br />
2178309<br />
<br />
real&nbsp; &nbsp; 0m0.214s<br />
user&nbsp; &nbsp; 0m0.200s<br />
sys&nbsp; &nbsp; &nbsp;0m0.012s<br />
<br />
&nbsp;</div></div>

<p>
Non vous ne rêvez pas... 200ms contre 9 secondes avec PHP et 2.8 secondes pour Python. 
</p>

<p>
Je ne suis pas là pour critiquer les performances des langages su-cités, mais pour montrer que Node.js est très rapide, contrairement aux préjugés qui disent que Javascript est lent. Rappelez vous que JS n'est qu'un langage, l'implémentation est la cause des preformances, pas le langage lui même.
</p>

<p>
Bref, passons au second avantage, et pas des moindres, node.js permet de coder des applications asynchrones, tirant parti du système d'exploitation qui fait tourner le projet. Je vais préciser un peu plus.
</p>

<p>
En fait, tout est asynchrone dans node.js. Lire un fichier, écrire un résultat, envoyer les données au client... tout ! Cela implique que la programmation sera évènementielle, et non pas purement procédurale. Cela entraine deux choses à bien assimiler quand nous codons sous node.js:
</p>
<ul>
<li> le code en parallèle peut devenir compliqué si vous ne maitrisez pas les technique asynchrone</li>
<li> il faut penser à traiter les évènements courants</li>
</ul>


<p>
Par exemple, la lecture d'un fichier se fera de la sorte:
</p>

<div class="wiki_code"><div class="javascript" style="font-family: monospace;"><br />
fs = require<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"fs"</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #009900; font-style: italic;">//instancie le module filesytem</span><br />
<br />
fs.<span style="color: #006600;">readFile</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'fichier.txt'</span>, <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span>err, data<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>err<span style="color: #66cc66;">&#41;</span> <span style="color: #000066; font-weight: bold;">throw</span> err;<br />
&nbsp; console.<span style="color: #006600;">log</span><span style="color: #66cc66;">&#40;</span>data<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
console.<span style="color: #006600;">log</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"end..."</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp;</div></div>

<p>
Contrairement à ce que l'on peut croire, "end..." apparaitra <strong>avant</strong> la lecture effective du fichier... et oui, car le callback est lancé après ouverture du fichier, si il a réussit. Cela peut arriver après un instant de latence, donc le code qui suit l'appel à readFile peut s'exécuter avant le callback.
</p>

<p>
Et j'en passe... il est possible de lancer une commande unix et d'envoyer en continue le flux de sortie au client:
</p>

<div class="wiki_code"><div class="javascript" style="font-family: monospace;"><br />
<span style="color: #003366; font-weight: bold;">var</span> fs = require<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'fs'</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; sys = require<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'sys'</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #009900; font-style: italic;">//ouverture</span><br />
<span style="color: #003366; font-weight: bold;">function</span> messages<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> spawn = require<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'child_process'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">spawn</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> messages = spawn<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"tail"</span>, <span style="color: #66cc66;">&#91;</span><span style="color: #3366CC;">'-f'</span>,<span style="color: #3366CC;">'./messages'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> messages;<br />
<span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #009900; font-style: italic;">//fonction de serveur http... on va envoyer un resultat de commande au client</span><br />
<span style="color: #003366; font-weight: bold;">function</span> server<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> http = require<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'http'</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; http.<span style="color: #006600;">createServer</span><span style="color: #66cc66;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span>req, res<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900; font-style: italic;">//entete http...</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.<span style="color: #006600;">writeHead</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">200</span>,<span style="color: #66cc66;">&#123;</span><span style="color: #3366CC;">'Content-Type'</span>: <span style="color: #3366CC;">'text/plain'</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900; font-style: italic;">//pour webkit qui demande un lot de donnee minimum... 1024 fait l'affaire</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> empty=<span style="color: #3366CC;">""</span>, i=<span style="color: #CC0000;">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #66cc66;">&#40;</span>i=<span style="color: #CC0000;">0</span>; i<<span style="color: #CC0000;">1024</span>;i++<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; empty+=<span style="color: #3366CC;">" "</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #66cc66;">&#40;</span>empty<span style="color: #66cc66;">&#41;</span>; <span style="color: #009900; font-style: italic;">//le lot de donnee vide</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900; font-style: italic;">//on regarde la sortie de la commande, et on l'ecrit au client</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900; font-style: italic;">//chaque fois que nous avons de nouvelles donnees</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; messages.<span style="color: #006600;">stdout</span>.<span style="color: #006600;">addListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'data'</span>,<span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>data<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sys.<span style="color: #006600;">puts</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"data "</span>+data<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #66cc66;">&#40;</span>data<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">listen</span><span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">8000</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #009900; font-style: italic;">//instancie la commande de messages...</span><br />
<span style="color: #003366; font-weight: bold;">var</span> messages = messages<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
server<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp;</div></div>

<p>
En se connectant avec un navigateur sur le port 8000 du serveur, on reste en attente de données... chaque fois que vous entrez des données dans le fichier "messages" il apparait dans le navigateur... Et l'intérêt dans tout ça ? Et bien ce système asynchrone peut répondre à des miliers de clients en simultanée.
</p>

<p>
En effet, node.js est prévu pour répondre à des requêtes en masse. Vous pourrez même travailler en grappe de serveurs, faire du long-polling ou encore travailler sur plusieurs ports... 
</p>

<p>
En gros, node.js est en phase de faire front à pas mal de middleware python ou à Apache/PHP... Je vous conseille de voir un peu la <a href="http://nodejs.org/docs/v0.4.10/api/" title="documentation de l'API" class="wiki_exists">documentation de l'API</a> et de tester un peu les possibilités de ce système.
</p>

<p>
Et enfin, pour vous donner un peu plus de lumières à l'aptitude de node.js, je vous conseille de l'utiliser pour répondre rapidement à des client réseau "limités", par exemple pour les Iphone et Android (en 3G) ou encore pour des réponses Ajax/Json en long-polling (comme le fait le projet <a href="http://www.ape-project.org/" title="APE" class="wiki_exists">APE</a>).
</p>

<p>
En ce qui concerne la gestion de site complet, il faudra encore bosser un peu pour avoir des frameworks... même si je suis plutôt porté sur le micro-framework et/ou l'implémentation directe.
</p>

<p>
Voilà pour la présentation.
</p>

<p><a href="http://feedads.g.doubleclick.net/~a/NRkyF3EMYxKCjYhIiFcvKHC8fDQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/NRkyF3EMYxKCjYhIiFcvKHC8fDQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/NRkyF3EMYxKCjYhIiFcvKHC8fDQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/NRkyF3EMYxKCjYhIiFcvKHC8fDQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=mpPS-OJIyZk:YZ4Sru3UpBI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=mpPS-OJIyZk:YZ4Sru3UpBI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=mpPS-OJIyZk:YZ4Sru3UpBI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=mpPS-OJIyZk:YZ4Sru3UpBI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=mpPS-OJIyZk:YZ4Sru3UpBI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=mpPS-OJIyZk:YZ4Sru3UpBI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=mpPS-OJIyZk:YZ4Sru3UpBI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=mpPS-OJIyZk:YZ4Sru3UpBI:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=mpPS-OJIyZk:YZ4Sru3UpBI:KwTdNBX3Jqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Metal3dorg/~4/mpPS-OJIyZk" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;
Quand j'entend beaucoup de développeurs (expérimentés qui plus est) cracher sur Javascript, je me dis qu'il y a un vrai souci avec l'image de ce langage... Car j'ai beau regarder, tester, Javascript reste pour moi l'un des meilleures langages à ...&lt;/p&gt;</description><feedburner:origLink>http://www.metal3d.org/index.php/blog/ticket/2011/07/21/Et-si-on-regardait-nodejs?heading=Developpement</feedburner:origLink></item><item><title>reflexion du net et des humains qui le dirrigent</title><link>http://feedproxy.google.com/~r/Metal3dorg/~3/3mNb_fTOvVc/reflexion-du-net-et-des-humains-qui-le-dirrigent</link><pubDate>Wed, 20 Jul 2011 07:22:49 PDT</pubDate><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[

<p>
Cela fait longtemps que nous parlons des réseaux sociaux, tout a commencé avec de simples newsgroup, des liste d'amis dans nos boites mails et finalement aujourd'hui nous utilisons ni plus ni moins que des dérivations de ces concepts. FaceBook, Twitter, et aujourd'hui Google+, ce ne sont finalement que des extensions à des simple concepts de création de groupes.
</p>

<p>
Je me suis posé des centaines de questions sur ces projets, notamment depuis les évènements judiciaires portant sur nos données privées. Et à force de suivre les nouvelles, de lire les commentaires ou encore de voir quelles impacts sont provoqués par ces sites... je me demande si nous ne nous trompons pas dans nos jugements.
</p>

<p>
Oui, vous me voyez venir, me voilà avocat du diable. Mais je pense avec conviction que l'erreur judiciaire est bien là. Je vais vous expliquer ma pensée et peut-être me suivrez vous dans cette optique. Ou alors, peut-être que je conforterai votre opinion. Dans tous les cas, le but n'est pas d'offencer ou de prendre les utilisateurs et détracteurs pour des idiots mais de donner un point de vue contraire, et bien réfléchis aussi, d'un regard qui se porte de l'autre coté de la barrière.
</p>

<p>
Parlons donc de l'incrimination très poussé de certains "géants" de ces systèmes, j'ai nommé: Marl Zuckerberg, jeune fondateur à la tête de Facebook. Facebook, vous le savez certainement, est un site qui permet à des personnes de constituer un réseau d'amis et de propager des inforamtions plus ou moins pertinantes à l'ensemble de son réseau. Photos, nouvelles, jeux, questions, sondage, ou simple remarques... tout est simple et possible. Ce site permet de tchater, faire de la visio conférence, avoir une boite mail, des groupes sur certains sujets... Finalement, il n'y a rien de mal à utiliser Facebook.
</p>

<p>
Pourquoi est-il dans le colimateur des détracteurs ? parce que la question des règles de vie de privée est baffouée sur certain points. Or voilà... l'utilisateur est (doit être) conscient du fait qu'il s'expose au monde. Soyons plus précis, si je décide de mettre des affiches dans la rue expliquant que je suis telle personne et que j'ai telle opinion, je suis conscient que les gens vont savoir des choses sur moi. Si je fais cela, je sais pertinament que certain vont mal comprendre, ou peuvent utiliser mon affiche pour se moquer de moi. Donc, comme pour ce blog ou je place pas mal de mes opinions, je sais que je suis soumis au regard des autres et à leur critiques.
</p>

<p>
C'est donc pour cela que je fais attention, je ne met pas n'importe quoi sur mon blog. Tout comme Google+, twitter ou Facebook.
</p>

<p>
Alors pourquoi s'attaquer à M.Zuckerberg ? Parce que ce jeune homme est le fondateur. Il aura beau faire ce qu'il peut, toute critique du site, toute utilisation détournée, toute profit que cela engendre est et sera dû à cet homme.
</p>

<p>
Mettez vous à sa place une minute. Vous avez créé un site qui permet à l'humain de communiquer sans trop de contrainte, puis en quelques années la vanité et la méchanceté de certain détruise le concept sympa pour le rendre néfaste. Et on vous dit "ton site est minable, tu vois un peu ce qu'on peut faire avec ? t'as vu comme notre vie peut être pollué ?"... Est-ce vraiment de la faute de Zuckerberg ? non, clairement non... 
</p>

<p>
M.Zuckerberg est devenu un homme d'affaire, posé sur le grill, il est certes devenu très riche, il n'en reste pas moins humain et doit se défendre contre l'image que nous, les utilisateurs, pouvons transposer de ce que nous faisons du système Facebook.
</p>

<p>
Google+ est arrivé, et encore une fois c'est M.Zuckerberg qui est pris pour cible pour continuer à attaquer les dérives de Facebook, puisque Google+ est un peu moins "ouvert" à l'utilisation de données personelles par les utilisateurs. 
</p>

<p>
Là où Google fait fort, c'est qu'ils ont éliminé depuis des lustres les cibles potentiels... Je vais être plus précis:
</p>
<ul>
<li> je vous dis "Apple" vous me répondez : Steve Jobs</li>
<li> je vous dis "Microsoft" vous me répondez : Bill Gates (pourtant à la retraite) ou Steve Ballmer pour les plus avertis</li>
<li> je vous dis "Facebook" et vous me répondez: Mark Zuckerberg</li>
</ul>


<p>
Mais les deux systèmes les moins critiqués sont Twitter et Google+... et là personne ne me donne de nom, ou du moins, très peu de gens connaissent les noms des dirrigeant, fondateurs... Pourtant, Larry Page ou Dick Costolo sont bien là, à prendre des décisions pour des gros systèmes qui engendrent beaucoup d'argent.
</p>

<p>
En fait, je me rend compte que nous sommes simplement en manque de cibles humaines. Tout ce que nous critiquons est pourtant bien une conséquence de l'utilisation des systèmes utilisés, et non pas des fondateurs.
</p>

<p>
Sitôt qu'un système commence à engendrer beaucoup d'argent et rameute beaucoup d'utilisateurs, il devient alors un système dangereux, imprécis, mal vu par la communauté intellectuelle qui connait très bien les risques encourus... mais ces risques sont exploités par ceux qui les connaissent.
</p>

<p>
Pour ma part, je me range du coté du pragmatisme désormais. Bien que je n'aime pas Facebook pour des raisons de fonctionnement, je me suis décidé à ranger un peu le sarcasme contre ce genre de système car j'estime que l'homme qui est derrière tout ça n'est pas forcément la cause de tout. Avant tout, celui qui peut fracturer un principe de site communautaire et social reste l'utilisateur lui même.
</p>

<p>
Mais j'ai tout de même une idée qui trotte dans mon esprit depuis bien longtemps. Je conçois parfaitement que tout à chacun imagine avoir le meilleur système de site social en son pouvoir, mais à l'arrivé on fait tous pareil: on envoit des photo et des news à nos amis. 
</p>

<p>
Le principe est le même pour tout les sites, alors si vraiment tout cela fonctionne de la même manière, du moins en terme de propagation, pourquoi ne pas avoir une spécification commune et l'utiliser là où bon nous semble ? Que j'envois la nouvelles "Je mange un paquet de gateau" sur Twitter, Facebook ou Google+ je le fais de la même manière... 
</p>

<p>
Oui, il existe des "hub" qui permettent de faire cela, mais cela reste marginal ou déporté... Je parle d'un vrai système basé sur OpenID et un format global... car finalement, le net se base sur des normes... pourquoi ne pas en avoir une pour ce qui est aujourd'hui l'un des vecteurs majeur de l'utilisation du net ?
</p>

<p>
Et pour finir, oui: finalement je comprend bien les problématique de tous les acteurs du grand monde comme le sont Ballmer ou S.Jobs... il est difficile pour eux pour changer de politique quand celle ci est imposé par des années de travail... Je ne vois pas Microsoft développer en libre Windows après 30 ans de travail fermé, ou Apple changer sa politique de matériel et de fermeture de code après tant de travail sur leur système sur ce modèle. 
</p>

<p>
Je ne me bats que contre une seule chose: la libre concurrence. L'affaire qui a opposé Google et Intel contre le consortium Apple, Microsoft, EMC, Ericsson, RIM et Sony me déçoit fortement. Le ponion emprisonne l'utilisateur et la libre concurrence. Des marchés peuvent se perdre non pas parce que la technologie est mauvaise, mais parce qu'elle dérange ceux qui ont une techno moins fiable mais qui a bien plus d'argent.
</p>

<p>
Bref, entre l'humain et sa politique, j'ai décidé de bien posé la démarquation.
</p>

<p><a href="http://feedads.g.doubleclick.net/~a/6imNml9TTCeCC7PhD3xd10QOvuc/0/da"><img src="http://feedads.g.doubleclick.net/~a/6imNml9TTCeCC7PhD3xd10QOvuc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/6imNml9TTCeCC7PhD3xd10QOvuc/1/da"><img src="http://feedads.g.doubleclick.net/~a/6imNml9TTCeCC7PhD3xd10QOvuc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=3mNb_fTOvVc:oyy2n5NvqRQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=3mNb_fTOvVc:oyy2n5NvqRQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=3mNb_fTOvVc:oyy2n5NvqRQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=3mNb_fTOvVc:oyy2n5NvqRQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=3mNb_fTOvVc:oyy2n5NvqRQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=3mNb_fTOvVc:oyy2n5NvqRQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=3mNb_fTOvVc:oyy2n5NvqRQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=3mNb_fTOvVc:oyy2n5NvqRQ:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=3mNb_fTOvVc:oyy2n5NvqRQ:KwTdNBX3Jqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Metal3dorg/~4/3mNb_fTOvVc" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;
Cela fait longtemps que nous parlons des réseaux sociaux, tout a commencé avec de simples newsgroup, des liste d'amis dans nos boites mails et finalement aujourd'hui nous utilisons ni plus ni moins que des dérivations de ces concepts. FaceBook, ...&lt;/p&gt;</description><feedburner:origLink>http://metal3d.org/index.php/blog/ticket/2011/07/20/reflexion-du-net-et-des-humains-qui-le-dirrigent?heading=Informatique</feedburner:origLink></item><item><title>Mootools 1.3</title><link>http://feedproxy.google.com/~r/Metal3dorg/~3/A4xoAjad3jg/Mootools-1.3</link><pubDate>Thu, 03 Mar 2011 21:55:17 PST</pubDate><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[

<p>
Ho je pense que vous le savez, je n'aime pas jQuery... c'est un fait, j'ai donné mes explications
dans un billet précédent, et plus ça va, plus mon idée se conforte. Pour ma part je
préfère Mootools, plus adapté pour le développement, plus proche des développeurs et moins 
"bricolo" à mon goût. Ce 25 Février 2011 est sorti la version 1.3 de Mootools. Au menu:
moins de bugs, plus de conflit avec les autres frameworks, et surtout la doc qui est enfin correctement corrigée.
</p>

<p>
Mootools est un framework très abordable et pensé pour être implémenté à la manière des projets de développement que nous connaissons tous: des setters, des getters, des accesseurs... mais au delà de ce concept existe une notion objet très bien implémenter pour créer des interfaces, des dérivations de classes etc... en bref, le fontionnement de mootools est une merveille pour tout développeur qui veut coder en Javascript proprement.
</p>

<p>
La dernière mouture permet de ne plus entrer en conflit avec d'autres frameworks. La solution est simple:
</p>

<div class="wiki_code"><div class="javascript" style="font-family: monospace;"><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>$<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #009900; font-style: italic;">//... votre code ici</span><br />
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>document.<span style="color: #006600;">id</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp;</div></div>

<p>
C'est la méthode abordée par tous les autres frameworks JS. L'intérêt et que la fonction "$"
est mappée dans document.id
</p>

<p>
Cette dernière version a aussi un mode de compatibilité ascendant et descendant bien conçut, bien mieux que le script de compatibilité qu'on a connu entre la version 1.1 et 1.2. De ce fait, 
vous allez pouvoir passer à mootools 1.3 sans modifier votre code...
</p>

<p>
Il existe de nouveau attributs et relais, comme par exemple le click:once ou des pseudos
évènements (pause, throttled...) que vous pouvez tester ici <a href="http://mootools.net/demos/?demo=Element.Event.Pseudos" title="http://mootools.net/demos/?demo=Element.Event.Pseudos" class="wiki_exists">http://mootools.net/demos/?demo=Element.Event.Pseudos</a>
</p>

<p>
A ce propos, une nouvelle page de démo <a href="http://mootools.net/demos/" title="http://mootools.net/demos/" class="wiki_exists">http://mootools.net/demos/</a> qui est très bien faite,
est enfin de retour. On note aussi améliorations en terme de performances... bref tout y est !
</p>

<p>
Je vous conseille de jetter un oeil dessus: <a href="http://www.mootools.net" title="http://www.mootools.net" class="wiki_exists">http://www.mootools.net</a> 
</p>

<p><a href="http://feedads.g.doubleclick.net/~a/OaDsOesf8q0zobsw7OLaPG0S9-o/0/da"><img src="http://feedads.g.doubleclick.net/~a/OaDsOesf8q0zobsw7OLaPG0S9-o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/OaDsOesf8q0zobsw7OLaPG0S9-o/1/da"><img src="http://feedads.g.doubleclick.net/~a/OaDsOesf8q0zobsw7OLaPG0S9-o/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A4xoAjad3jg:1C8rnoI-L2E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A4xoAjad3jg:1C8rnoI-L2E:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A4xoAjad3jg:1C8rnoI-L2E:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A4xoAjad3jg:1C8rnoI-L2E:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=A4xoAjad3jg:1C8rnoI-L2E:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A4xoAjad3jg:1C8rnoI-L2E:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=A4xoAjad3jg:1C8rnoI-L2E:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=A4xoAjad3jg:1C8rnoI-L2E:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=A4xoAjad3jg:1C8rnoI-L2E:KwTdNBX3Jqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Metal3dorg/~4/A4xoAjad3jg" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;
Ho je pense que vous le savez, je n'aime pas jQuery... c'est un fait, j'ai donné mes explications
dans un billet précédent, et plus ça va, plus mon idée se conforte. Pour ma part je
préfère Mootools, plus adapté pour le développement, plus ...&lt;/p&gt;</description><feedburner:origLink>http://metal3d.org/index.php/blog/ticket/2011/03/04/Mootools-1.3?heading=Developpement</feedburner:origLink></item><item><title>Encrypter un fichier facilement</title><link>http://feedproxy.google.com/~r/Metal3dorg/~3/-1W_-Odtgxw/Encrypter-un-fichier-facilement</link><pubDate>Tue, 01 Mar 2011 19:03:29 PST</pubDate><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[

<p>
On discutait sur le canal fedora-fr (IRC, sur freenode.net) quand une question anodine m'a fait jouer avec bash et gnome. La question était de savoir comment encrypter un fichier facilement sous Linux. Casper, un ami du net, parla alors de gpg, puis on a doucement dérivé sur openssl. Et je me suis amusé à faire un truc simple: une icone sur le bureau qui accèpte un fichier à déposer dessus et qui l'encrypte directement. C'est simple comme tout, à condition de connaitre un peu le bash.
</p>

<p>
Le cahier des charges est le suivant:
</p>
<ul>
<li> une icone simple, juste un drag and drop</li>
<li> encrypte ou décrypte le fichier selon le type</li>
<li> mot de passe demandé, écriture sur le bureau</li>
</ul>


<p>
C'est le second point qui m'a posé un petit souci mais je me suis rendu compte qu'on pouvait tricher. D'abord voyons comment on encrypte avec openssl (j'ai choisi un cryptage des3, assez fiable):
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
openssl des3 -salt -in fichier1 -out fichier2<br />
&nbsp;</div></div>

<p>
Ici, le fichier <code>fichier2</code> est le fichier encrypté, si je veux le décrupter:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
openssl des3&nbsp; -d -salt -in fichier2 -out fichier"<br />
&nbsp;</div></div>

<p>
le fichier <code>fichier3</code> est alors le résultat, c'est à dire le même fichier que <code>fichier1</code>
</p>

<p>
Pour savoir reconnaitre un fichier crypté, j'ai triché. Comme j'ai utilisé l'option <code>-salt</code> un <em>sel</em> est ajouté. Cela enrichi le fichier à sa première ligne d'un "Salted_" qui apparait... par contre le type de fichier est "data":
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
$ file -b fichier2<br />
data<br />
&nbsp;</div></div>

<p>
Voilà comment je sais si le fichier est encodé par ma méthode. Et bien faisons un script:
</p>

<div class="wiki_code"><div class="bash" style="font-family: monospace;"><br />
<span style="color: #808080; font-style: italic;">#!/bin/bash</span><br />
<br />
<span style="color: #0000ff;">IN=</span><span style="color: #ff0000;">"$@"</span><br />
<span style="color: #0000ff;">mime=</span>$<span style="color: #66cc66;">&#40;</span>file -b <span style="color: #ff0000;">"$IN"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #0000ff;">encrypted=</span><span style="color: #cc66cc;">1</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#91;</span> <span style="color: #ff0000;">"$mime"</span> == <span style="color: #ff0000;">"data"</span> <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>; <span style="color: #b1b100;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; head -n1 <span style="color: #ff0000;">"$IN"</span> | grep <span style="color: #ff0000;">"Salted"</span> > /dev/null<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">encrypted=</span>$?<br />
<span style="color: #b1b100;">fi</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#91;</span> <span style="color: #ff0000;">"$encrypted"</span> == <span style="color: #ff0000;">"1"</span> <span style="color: #66cc66;">&#93;</span>; <span style="color: #b1b100;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#openssl encryption</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">pass=</span>$<span style="color: #66cc66;">&#40;</span>zenity --entry --text <span style="color: #ff0000;">"Password to encrypt"</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; openssl des3 -salt -<span style="color: #b1b100;">in</span> <span style="color: #ff0000;">"$IN"</span> -out ~/Bureau/$<span style="color: #66cc66;">&#40;</span>basename <span style="color: #0000ff;">$IN</span><span style="color: #66cc66;">&#41;</span>.encrypted -pass pass:<span style="color: #0000ff;">$pass</span><br />
<span style="color: #b1b100;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#openssl decrypt</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">pass=</span>$<span style="color: #66cc66;">&#40;</span>zenity --entry --text <span style="color: #ff0000;">"Password to decrypt"</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#remove dirname and extension</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">out=</span>$<span style="color: #66cc66;">&#40;</span>basename <span style="color: #0000ff;">$IN</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">out=</span>$<span style="color: #66cc66;">&#123;</span>out%*.*<span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; openssl des3 -d -salt -<span style="color: #b1b100;">in</span> <span style="color: #ff0000;">"$IN"</span> -out ~/Bureau/<span style="color: #0000ff;">$out</span> -pass pass:<span style="color: #0000ff;">$pass</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#91;</span> <span style="color: #ff0000;">"$?"</span> != <span style="color: #ff0000;">"0"</span> <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>; <span style="color: #b1b100;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; zenity --error --text <span style="color: #ff0000;">"Incorrect Password"</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">fi</span><br />
<span style="color: #b1b100;">fi</span><br />
<br />
&nbsp;</div></div>

<p>
Ce script prend un fichier en argument et écrit le fichier résultant dans le bureau. Vous allez le sauver dans <code>$HOME/bin/encrypter.sh</code> et le rendre exécutable:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
chmod +x ~/bin/encrypter.sh<br />
&nbsp;</div></div>

<p>
Reste alors à faire un lanceur dans le bureau, tapez cette commande:
</p>

<div class="wiki_code"><div style="font-family: monospace;"><br />
cat >&nbsp; $HOME/Bureau/Encrypter.desktop <<EOF<br />
#!/usr/bin/env xdg-open<br />
<br />
[Desktop Entry]<br />
Version=1.0<br />
Type=Application<br />
Terminal=false<br />
Icon[fr_FR]=gnome-panel-launcher<br />
Exec=$HOME/bin/encrypter.sh<br />
Name[fr_FR]=Encrypter<br />
Name=MonTest<br />
Icon=/usr/share/icons/gnome/scalable/status/security-high-symbolic.svg<br />
EOF<br />
<br />
chmod +x $HOME/Bureau/Encrypter.desktop<br />
&nbsp;</div></div>

<p>
Dans le bureau apparait une icone nommé Encrypter, glisser un fichier (pas un répertoire) sur cette icone, on vous demande un mot de passe pour encrypter le fichier. Dans le bureau apparait alors un fichier suffixé par ".encrypted"
</p>

<p>
Reglissez ce fichier sur l'icone, on vous demande le mot de passe et si l'opération à marché vous voyez le fichier apparaitre.
</p>

<p>
Bref, c'est juste un bricolage là, mais c'est intéressant de voir à quel point on peut jouer avec Linux sur ce genre de travail.
</p>

<p><a href="http://feedads.g.doubleclick.net/~a/iDsFveZim5Sqt6Q27iek8n4yvsM/0/da"><img src="http://feedads.g.doubleclick.net/~a/iDsFveZim5Sqt6Q27iek8n4yvsM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/iDsFveZim5Sqt6Q27iek8n4yvsM/1/da"><img src="http://feedads.g.doubleclick.net/~a/iDsFveZim5Sqt6Q27iek8n4yvsM/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=-1W_-Odtgxw:Olb_eHQguUU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=-1W_-Odtgxw:Olb_eHQguUU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=-1W_-Odtgxw:Olb_eHQguUU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=-1W_-Odtgxw:Olb_eHQguUU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=-1W_-Odtgxw:Olb_eHQguUU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=-1W_-Odtgxw:Olb_eHQguUU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=-1W_-Odtgxw:Olb_eHQguUU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Metal3dorg?a=-1W_-Odtgxw:Olb_eHQguUU:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Metal3dorg?i=-1W_-Odtgxw:Olb_eHQguUU:KwTdNBX3Jqk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Metal3dorg/~4/-1W_-Odtgxw" height="1" width="1"/>]]></content:encoded><description>&lt;p&gt;
On discutait sur le canal fedora-fr (IRC, sur freenode.net) quand une question anodine m'a fait jouer avec bash et gnome. La question était de savoir comment encrypter un fichier facilement sous Linux. Casper, un ami du net, parla alors de gpg, ...&lt;/p&gt;</description><feedburner:origLink>http://metal3d.org/index.php/blog/ticket/2011/03/02/Encrypter-un-fichier-facilement?heading=Informatique</feedburner:origLink></item></channel></rss>

