<?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:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Ze Technology</title>
	
	<link>http://www.ze-technology.com</link>
	<description>Ze Blog qui parle de Ze Technology. Univers du libre, programmation, société, business...</description>
	<lastBuildDate>Sun, 10 Mar 2013 19:03:31 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/blogspot/zt" /><feedburner:info uri="blogspot/zt" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Something new, something fresh : borntosegfault.com !</title>
		<link>http://feedproxy.google.com/~r/blogspot/zt/~3/z57qqIIRH7A/</link>
		<comments>http://www.ze-technology.com/2013/03/10/something-new-something-fresh-borntosegfault-com/#comments</comments>
		<pubDate>Sun, 10 Mar 2013 19:03:31 +0000</pubDate>
		<dc:creator>Adrien Mogenet</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.ze-technology.com/?p=836</guid>
		<description><![CDATA[Le blog est mort, vive le blog ! En fait, je ne sais pas ce qu&#8217;il adviendra de CE blog. Autant j&#8217;ai énormément de sujets à aborder, autant je peine à développer des articles que je considère &#171;&#160;intéressants&#160;&#187;. Face à cette variété de sujets, j&#8217;ai décidé de créer Born to Segfault, un blog 1) en [...]]]></description>
			<content:encoded><![CDATA[<p>Le blog est mort, vive le blog ! En fait, je ne sais pas ce qu&rsquo;il adviendra de CE blog. Autant j&rsquo;ai énormément de sujets à aborder, autant je peine à développer des articles que je considère &laquo;&nbsp;intéressants&nbsp;&raquo;.</p>
<p>Face à cette variété de sujets, j&rsquo;ai décidé de créer <a href="http://www.borntosegfault.com/">Born to Segfault</a>, un blog 1) en anglais 2) qui ne parlera pas de 10000 choses différences 3) qui essaiera autant que possible de balancer du contenu intéressant.</p>
<p>Bref, à vos bookmarks,<br />
<center><br />
<h2><a href="http://www.borntosegfault.com/">Born To Segfault</a> !</h2>
<p></center></p>
<img src="http://feeds.feedburner.com/~r/blogspot/zt/~4/z57qqIIRH7A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ze-technology.com/2013/03/10/something-new-something-fresh-borntosegfault-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ze-technology.com/2013/03/10/something-new-something-fresh-borntosegfault-com/</feedburner:origLink></item>
		<item>
		<title>Fujifilm X10 ou « le compact dont je rêvais »</title>
		<link>http://feedproxy.google.com/~r/blogspot/zt/~3/BspL5MSSDU8/</link>
		<comments>http://www.ze-technology.com/2012/04/30/fujifilm-x10-ou-le-compact-dont-je-revais/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 06:44:02 +0000</pubDate>
		<dc:creator>Adrien Mogenet</dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Fujifilm]]></category>
		<category><![CDATA[X10]]></category>

		<guid isPermaLink="false">http://www.ze-technology.com/?p=818</guid>
		<description><![CDATA[Auparavant, je maintenais un blog entièrement dédié à la photographie et à mes projets. Dorénavant je rédigerai avec parcimonie quelques expériences ou retours d&#8217;expériences photographiques ici même. Un peu d&#8217;art et d&#8217;art numérique dans ce monde très binaire, ça ne peut pas faire de mal. Equipé depuis plusieurs années d&#8217;un réflexe, force est de constater [...]]]></description>
			<content:encoded><![CDATA[<p>Auparavant, je maintenais un blog entièrement dédié à la photographie et à mes projets. Dorénavant je rédigerai avec parcimonie quelques expériences ou retours d&rsquo;expériences photographiques ici même. Un peu d&rsquo;art et d&rsquo;art numérique dans ce monde très binaire, ça ne peut pas faire de mal.</p>
<p>Equipé depuis plusieurs années d&rsquo;un réflexe, force est de constater qu&rsquo;il m&rsquo;était impossible d&rsquo;emporter ce dernier partout avec moi. Quand bien même je suis un adepte de la focale fixe, notamment mon 28mm très peu encombrant, on sacrifie la compacité pour jouir d&rsquo;une qualité et réactivité accrue. Réalisant que je &laquo;&nbsp;manquais&nbsp;&raquo; beaucoup trop de photos juste parce que je n&rsquo;avais pas le bon outil au bon moment, j&rsquo;ai décidé de trouver mon compagnon photographique idéal.</p>
<p><img width="560px" src="http://www.anticboutik.com/blog/wp-content/uploads/2011/09/Fujifilm-FINEPIX-X10-06.jpg" alt="Fujifilm X10" /></p>
<p>Aux premières annonces du Fujifilm <a href="http://www.finepix-x100.com/fr">X100</a> &#8212; le grand frère du X10 &#8212; je sentais le vent tourner. Enfin un retour aux fondamentaux de la photographie ! De beaux boitiers, bien construits, avec des modes manuels. Quand Fujifilm a continué sur sa lancée pour sortir le X10, j&rsquo;étais conquis. Présentation rapide, pour les non initiés : il s&rsquo;agit d&rsquo;un compact haut de gamme, qui a pour lui un viseur optique exceptionnellement clair et large, un capteur d&rsquo;excellente facture qui, bien que plus petit que les réflex se montre 2 fois plus grand que ses concurrents, et propose de maîtriser le zoom manuellement, comme sur un objectif de réflex. Avec toutes ces spécifications, le Fujifilm X10 ne tient certes pas dans une poche, mais se trimballe facilement n&rsquo;importe où.</p>
<h3>Mon avis</h3>
<p>Les spécifications papier, c&rsquo;est bien, mais à quel point suis-je séduit en pratique ? Mes premières craintes se portaient sur <strong>l&rsquo;utilisation du viseur optique</strong>. Me voilà bien obligé de reconnaître que ce dernier est largement utilisable. Il n&rsquo;y a certes pas de correction des problèmes de parallaxe, et aucune information n&rsquo;est affichée en surimpression, mais sur des plans larges et des sujets éloignés, on peut parfaitement lui faire confiance. Et quel confort d&rsquo;en profiter ! Pour des sujets rapprochés, si on commence à s&rsquo;approcher des 112mm que couvre le zoom, le défaut de parallaxe est bien présent et il faut s&rsquo;y accoutumer, avec un peu de pratique.</p>
<p>Le second critère décisif pour moi était la <strong>réactivité</strong> de l&rsquo;appareil. J&rsquo;étais prêt à sacrifier une partie de la qualité des réflex (je ne suis pas un adepte des images parfaites au piqué absolu), mais certainement pas la réactivité ! Là encore, je suis tout sauf dérouté. L&rsquo;autofocus se montre faste comme peu d&rsquo;autres, et le déclenchement franchement réactif. A confirmer, mais je devrais pouvoir faire sans soucis de la photo de rue ou évènementiel avec un tel compact.</p>
<p>Bien évidemment, cela ne fait que quelques semaines que je vagabonde avec mon X10. Le temps me dira si cet appareil est robuste et aussi fiable qu&rsquo;il en a l&rsquo;air. Gageons que dans le pire des cas, la marque ait démontré qu&rsquo;il y a une véritable attente autour de ce créneau.</p>
<p>Lien : <a href="http://fujifilm-x.com/x10/fr/">Site officiel Fujifilm X10</a></p>
<img src="http://feeds.feedburner.com/~r/blogspot/zt/~4/BspL5MSSDU8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ze-technology.com/2012/04/30/fujifilm-x10-ou-le-compact-dont-je-revais/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ze-technology.com/2012/04/30/fujifilm-x10-ou-le-compact-dont-je-revais/</feedburner:origLink></item>
		<item>
		<title>Le mauvais côté de la programmation fonctionnelle ?</title>
		<link>http://feedproxy.google.com/~r/blogspot/zt/~3/tFKhns4A22E/</link>
		<comments>http://www.ze-technology.com/2012/04/20/le-mauvais-cote-de-la-programmation-fonctionnelle/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 21:35:24 +0000</pubDate>
		<dc:creator>Adrien Mogenet</dc:creator>
				<category><![CDATA[Bonnes Pratiques]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Méthode]]></category>
		<category><![CDATA[functional programming]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://www.ze-technology.com/?p=790</guid>
		<description><![CDATA[Image par Mogmi. Mon dernier article laissait penser que je reprenais goût pour la programmation fonctionnelle, ayant apprécié mes études à bases d&#8217;OCaml. Depuis, j&#8217;ai effectivement eu l&#8217;occasion de jouer avec Scala, avec Haskell. Je ne suis pas spécialement un pro-FP ou un anti-POO, ni même l&#8217;inverse. Ce qui m&#8217;intéresse, ce sont les enjeux derrière [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://hmm-la-bd.eu/images/210-recursivite.png" width="560px"/><br />
<span style="font-size: 11px; margin-left:50px">Image par <a href="http://hmm-la-bd.eu/">Mogmi</a>.</span></p>
<p>Mon dernier article laissait penser que je reprenais goût pour la programmation fonctionnelle, ayant apprécié mes études à bases d&rsquo;OCaml. Depuis, j&rsquo;ai effectivement eu l&rsquo;occasion de jouer avec Scala, avec Haskell. Je ne suis pas spécialement un pro-FP ou un anti-POO, ni même l&rsquo;inverse. Ce qui m&rsquo;intéresse, ce sont les enjeux derrière chaque paradigme. Que vais-je pouvoir tirer de telle ou telle techno ? Au fond, qu&rsquo;est-ce que je veux vraiment faire ?</p>
<p><a href="http://lukeplant.me.uk/blog/posts/why-learning-haskell-python-makes-you-a-worse-programmer/">Why learning Haskell/Python makes you a worse programmer ?</a></p>
<p>L&rsquo;auteur évoque ses difficultés de revenir à la réalité, à la réalité du Python, du C#, du Java ou du C++ (pour les plus chanceux). Je vais dans ce billet donner mon point de vue. De la philosophie de la programmation fonctionnelle, je retiens notamment la gestion des listes et structures récursives, le pattern matching, l&rsquo;immutabilité, les monades, la lazy-evaluation. J&rsquo;en oublie, mais ce sont là les éléments que j&rsquo;estime utiliser régulièrement, au naturel.</p>
<p>Sans prétention, la manipulation de ces concepts fait que le programmeur acquière une certaine gymnastique qui n&rsquo;est &#8212; à mon sens &#8212; que bénéfique. Gestion de la concurrence ? Modularité ? Travail en équipe avec d&rsquo;autres adeptes de la FP ? Du bonheur. Je ne parle pas spécialement de performances, mais seulement d&rsquo;architecture logicielle.</p>
<p>Seulement voilà, dans la vraie vie, difficile de débarquer, imposer une industrialisation de Haskell ou d&rsquo;OCaml. Difficile de dire à des développeurs ayant l&rsquo;habitude d&rsquo;imbriquer trois niveaux de boucles <span class="code">for</span> ou <span class="code">while</span> de réfléchir par récursion. Difficile de remettre en question les modélisations objets de projets industrialisés recoupant plusieurs dizaines ou centaines de développeurs, sous prétexte que de nombreux bugs pourraient être évités en appliquant des mécanismes d&rsquo;immutabilité.</p>
<p>C&rsquo;est bien là le problème. Renouer avec les fonctions impures à outrance (se dit des fonctions à effet de bord), les API approximatives de Java ou PHP n&rsquo;est pas synonyme de plaisir. L&rsquo;argument de la &laquo;&nbsp;démotivation&nbsp;&raquo; lancé par Luke sur son blog est réel. On écrit du code bizarre, rien n&rsquo;est séduisant. </p>
<p>En revanche, j&rsquo;estime que ça me force à comprendre comment le langage fonctionne, et à ne jamais faire confiance à son fonctionnement. En 2 mois de temps, j&rsquo;ai appris un nombre impressionnant de choses sur Java, notamment sur sa gestion de la concurrence (faut-il que je me sente honteux de tout juste découvrir que le langage propose des <span class="code">CountdownLatch</span> ?) En tout état de cause, c&rsquo;est mon arme contre la démotivation.</p>
<p>Un compromis intéressant me semble émaner de Scala. Son interopérabilité parfaite (?) avec Java lui donne l&rsquo;avantage instantané de participer à toutes les logiques d&rsquo;industrialisation.  Scala, pour rappel, est un langage multi-paradigme, qui aime la POO autant que la FP ou l&rsquo;AOP. Un méli-mélo, vous dîtes ? C&rsquo;est sans doute vrai. Et je n&rsquo;aime pas les mélanges incohérents, vraiment pas. Mais en pratique, force est de constater que, pour le moment, c&rsquo;est un moyen assez élégant de faire en sorte que chacun puisse y trouver son compte. Il m&rsquo;est arrivé, par exemple, de parcourir un graphe en Scala et d&rsquo;appliquer un traitement en une ligne de code, via le paradigme <span class="code">map/reduce</span> (mais pas distribué, cette fois-ci). Scala peut également obliger les développeurs à formaliser leurs types de retours en <span class="code">Option[Integer]</span> si la fonction peut retourner l&rsquo;équivalent de <span class="code">null</span> ; tout en conservant la possibilité d&rsquo;écrire des boucles itératives aux moments opportuns, ou de modéliser ses concepts sous formes de classes, sans rien changer &#8212; ou presque &#8212; des habitudes prises en Java.</p>
<p>Oh, et tant qu&rsquo;on en parle, je vous invite à lire le <a href="http://pragmatic-programming.blogspot.fr/2011/07/functional-programming.html">billet de Marwan</a> sur la FP. C&rsquo;est aussi un élément déclencheur de cet article.</p>
<img src="http://feeds.feedburner.com/~r/blogspot/zt/~4/tFKhns4A22E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ze-technology.com/2012/04/20/le-mauvais-cote-de-la-programmation-fonctionnelle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ze-technology.com/2012/04/20/le-mauvais-cote-de-la-programmation-fonctionnelle/</feedburner:origLink></item>
		<item>
		<title>À quoi pensent-ils ? La signature au dos de la carte-bleue</title>
		<link>http://feedproxy.google.com/~r/blogspot/zt/~3/g4Fq_NtpJFw/</link>
		<comments>http://www.ze-technology.com/2011/12/17/a-quoi-pensent-ils-la-signature-au-dos-de-la-carte-bleue/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 08:29:01 +0000</pubDate>
		<dc:creator>Adrien Mogenet</dc:creator>
				<category><![CDATA[Humour]]></category>
		<category><![CDATA[carte bleue]]></category>

		<guid isPermaLink="false">http://www.ze-technology.com/?p=786</guid>
		<description><![CDATA[Non mais sérieusement, vous trouvez ça pratique, vous, de signer au dos de la carte bleue ? Vous utilisez quoi comme stylo ? Je n&#8217;arrive jamais à trouver un stylo correct qui ne bave pas. C&#8217;est absolument inutilisable. Stylo à bille, gel, crayon de papier, stabilo rose&#8230; rien. On est en 2012, ne peut-on vraiment [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><img src="http://ze-technology.com/wp-content/uploads/2011/12/IMG029.jpg" alt="carte bleue" /></p>
<p>Non mais sérieusement, vous trouvez ça pratique, vous, de signer au dos de la carte bleue ? Vous utilisez quoi comme stylo ? Je n&rsquo;arrive jamais à trouver un stylo correct qui ne bave pas. C&rsquo;est absolument inutilisable. Stylo à bille, gel, crayon de papier, stabilo rose&#8230; rien.<br />
On est en 2012, ne peut-on vraiment pas faire mieux ?</p>
<img src="http://feeds.feedburner.com/~r/blogspot/zt/~4/g4Fq_NtpJFw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ze-technology.com/2011/12/17/a-quoi-pensent-ils-la-signature-au-dos-de-la-carte-bleue/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.ze-technology.com/2011/12/17/a-quoi-pensent-ils-la-signature-au-dos-de-la-carte-bleue/</feedburner:origLink></item>
		<item>
		<title>Message au père-noël : de la programmation fonctionnelle, STP !</title>
		<link>http://feedproxy.google.com/~r/blogspot/zt/~3/r2a1iUGBn58/</link>
		<comments>http://www.ze-technology.com/2011/12/11/functionnal-programming/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 12:59:35 +0000</pubDate>
		<dc:creator>Adrien Mogenet</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Livre]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[chaitin]]></category>
		<category><![CDATA[FP]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[ocaml]]></category>
		<category><![CDATA[omega]]></category>
		<category><![CDATA[programmation fonctionnelle]]></category>

		<guid isPermaLink="false">http://www.ze-technology.com/?p=742</guid>
		<description><![CDATA[.Une guise de petite entrée en matière, laissez moi vous faire compiler une ligne : factorielle n = product[1..n] Un tel snippet semblera peut-être quelque peu ambitieux pour ceux qui ne jurent que par la programmation impérative. PHP, Java, C++ et consort. C&#8217;est pourtant une ligne parfaitement valide en Haskell. Bienvenue dans l&#8217;univers de la [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color:#fff">.</span><br />Une guise de petite entrée en matière, laissez moi vous faire compiler une ligne :<br />
<code>factorielle n = product[1..n]</code></p>
<p>Un tel snippet semblera peut-être quelque peu ambitieux pour ceux qui ne jurent que par la programmation impérative. PHP, Java, C++ et consort. C&rsquo;est pourtant une ligne parfaitement valide en <span class="code">Haskell</span>. Bienvenue dans l&rsquo;univers de la programmation fonctionnelle. On ne gère plus des changements d&rsquo;états, mais des évaluations de fonctions.</p>
<h3>Des bouquins</h3>
<p>C&rsquo;est un univers que j&rsquo;avais découvert avec <span class="code">OCaml</span> durant mes classes prépa, et voilà que je replonge dedans. La &laquo;&nbsp;faute&nbsp;&raquo; à un excellent bouquin, <em>&laquo;&nbsp;Hasard et complexité en mathématiques&nbsp;&raquo;</em>, écrit par Grégory-J Chaitin, le découvreur du nombre oméga &laquo;&nbsp;Ω&nbsp;&raquo; &#8211; mon nombre préféré, mais ce n&rsquo;est pas le sujet ici.</p>
<p style="text-align: center"><img src="http://ecx.images-amazon.com/images/I/51dlBv4ii6L._SL500_AA300_.jpg" alt="Hasard et complexités en mathématiques" /></p>
<p>Dans son ouvrage, Grégory Chaitin avoue son amour sans nom à <span class="code">Lisp</span>, un des plus anciens langages apportant le paradigme de programmation fonctionnelle. Un amour qu&rsquo;il a ma foi su fort bien communiquer puisqu&rsquo;il ma donné envie de remettre en questions mes développements actuels.</p>
<p>J&rsquo;étais assez rebuté par la lisibilité du code en <span class="code">Lisp</span> et après pas mal de lectures auxiliaires, je découvre à quel point <span class="code">Haskell</span> est séduisant autant dans ses concepts que dans sa syntaxe. Gérer des ensembles infinis, ou des nombres à précision potentiellement infinie n&rsquo;est sans doute pas une situation que tous les développeurs rencontrent tous les jours, mais c&rsquo;est toujours source de nombreux problèmes dès que le cas fait surface. Ceux qui aiment les problématiques de typage seront ravis d&rsquo;apprendre que <span class="code">Haskell</span> est, parait-il, muni d&rsquo;un système de typage à toute épreuve. J&rsquo;aurai sans doute l&rsquo;occasion de vous en dire un peu plus une fois mon apprentissage approfondi. Toujours est-il que j&rsquo;ai commandé au monsieur tout-en-rouge le livre de la collection d&rsquo;O'Reilly :</p>
<p style="text-align: center"><img src="http://akamaicovers.oreilly.com/images/9780596514983/cat.gif" alt="Haskell Oreilly"><br /><a href="http://shop.oreilly.com/product/9780596514983.do">Voir sur O&rsquo;Reilly</a></p>
<p>Un autre langage, qui fait sans doute plus parler de lui : <span class="code">Scala</span>. Comme <span class="code">OCaml</span>, il est multi-paradigme. Utilisé notamment chez Twitter, LinkedIn, Foursquare ou d&rsquo;autres grands noms de la toile, on peut sûrement expliquer cette nouvelle popularité par son interopérabilité avec <span class="code">Java</span>. Le langage fonctionne en effet tout aussi bien sous forme de scripts que de <em>bytecode</em> compilé à destination de la JVM, et il est en ce sens possible &#8211; et aisé &#8211; d&rsquo;exécuter du code <span class="code">Java</span> depuis <span class="code">Scala</span>. Sans avoir encore trop farfouillé, j&rsquo;ai tout de même l&rsquo;impression que l&rsquo;approche est assez différente de ce qu&rsquo;on retrouve en <span class="code">Haskell</span> ; j&rsquo;ai ainsi constaté que beaucoup de codes ne pouvait s&rsquo;offrir le luxe de faire l&rsquo;impasse sur le cas des valeurs <span class="code">null</span>. Peut-être du travail à faire du côté des <a href="http://fr.wikipedia.org/wiki/Monade_(informatique)">monades</a> ? J&rsquo;en saurai sûrement davantage après une vraie découverte du langage et une lecture approfondie de cette autre idée cadeau :</p>
<p style="text-align: center"><img src="http://akamaicovers.oreilly.com/images/9780596155964/cat.gif" alt="Haskell Oreilly" /><br /><a href="http://shop.oreilly.com/product/9780596155964.do?sortby=publicationDate">Voir sur O&rsquo;Reilly</a></p>
<h3>Pourquoi quitter le monde impératif ?</h3>
<p>Pourquoi un attrait si soudain pour la programmation fonctionnelle ? Pourquoi devriez-vous essayer, à votre tour, de voir autrement vos suites de <span class="code">0</span> et de <span class="code">1</span> ? En ce qui me concerne, le livre de Grégory Chaitin fut le véritable élément déclencheur, mais c&rsquo;est aussi le désir de <em>remettre plein de choses en question</em>, de continuer à se <em>maintenir éveillé</em> sur ce qui se fait de nouveau (Scala), et peut-être de reprendre <em>davantage de plaisir</em> à développer en utilisant de nouvelles approches lorsque cela est nécessaire.</p>
<p>Je suis par exemple régulièrement amené à développer de nouveaux outils statistiques (des simples moyennes arithmétiques ou harmoniques aux matrices de covariance) et il n&rsquo;est pas rare d&rsquo;observer que le langage fait parfois partie integrante du problème que de la solution, pour reprendre l&rsquo;expression de certains auteurs : dépassement de capacité des types <span class="code">integer</span> et assimilés ; jonglage fréquent entre types signés, non signés, flottants ; impossibilité de redéfinir l&rsquo;opérateur &laquo;&nbsp;+&nbsp;&raquo; dans certains langages, etc.</p>
<p>Je ne sais pas vraiment ce que j&rsquo;attends de la programmation fonctionnelle dans mon usage quotidien, ou si <span class="code">Haskell</span> sera strictement supérieur à <span class="code">Scala</span> dans mon cas ou s&rsquo;il sera juste un complément pertinent. Des concepts tels que les <a href="http://en.wikipedia.org/wiki/Arrow_(computer_science)">flèches</a> me laissent penser que mes systèmes hautement concurrents pourraient s&rsquo;en retrouver un peu plus concis et formels qu&rsquo;avec les actuels langages impératifs. Alors, je vous donne rendez-vous pour de prochains billets  pour de nouvelles critiques !</p>
<img src="http://feeds.feedburner.com/~r/blogspot/zt/~4/r2a1iUGBn58" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ze-technology.com/2011/12/11/functionnal-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ze-technology.com/2011/12/11/functionnal-programming/</feedburner:origLink></item>
		<item>
		<title>Hadoop : mettons les choses au clair…</title>
		<link>http://feedproxy.google.com/~r/blogspot/zt/~3/FNI5mREuVvU/</link>
		<comments>http://www.ze-technology.com/2011/10/11/hadoop-mettons-les-choses-au-clair/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 19:23:44 +0000</pubDate>
		<dc:creator>Adrien Mogenet</dc:creator>
				<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[systèmes répartis]]></category>

		<guid isPermaLink="false">http://www.ze-technology.com/?p=727</guid>
		<description><![CDATA[Je n&#8217;écris plus beaucoup, et j&#8217;en suis le premier désolé. Frustré. J&#8217;aime écrire, mais le temps me manquait, les préoccupations étant ailleurs ces derniers temps. Mais certains commentaires m&#8217;ont re-motivé au plus haut point, alors je vais tenter de reprendre l&#8217;exercice, en douceur. Pour ce premier nouvel article, j&#8217;aimerais reprendre quelques points sur Hadoop, le [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.cyres.fr/wp-content/uploads/2011/06/hadoop+elephant_rgb.png" alt="Hadoop Logo" width="580" /></p>
<p>Je n&rsquo;écris plus beaucoup, et j&rsquo;en suis le premier désolé. Frustré. J&rsquo;aime écrire, mais le temps me manquait, les préoccupations étant ailleurs ces derniers temps. Mais certains commentaires m&rsquo;ont re-motivé au plus haut point, alors je vais tenter de reprendre l&rsquo;exercice, en douceur.</p>
<p>Pour ce premier nouvel article, j&rsquo;aimerais reprendre quelques points sur Hadoop, le géant des systèmes distribués, et adopter ici une nouvelle orientation, plus orientée &laquo;&nbsp;revue de presse&nbsp;&raquo;. Il y a de la littérature formidable sur Internet, et plutôt que chacun ne perde son temps à se perdre dans les dédales des blogs et e-magazines, je vous propose des rapides résumés et ressentis.</p>
<p><span style="font-size: 1.3em; margin-left:50px;">&laquo;&nbsp;<em>Hadoop Doesn’t Solve All Problems</em> (<a title="Hadoop" href="http://nosql.mypopescu.com/post/11148171524/hadoop-doesnt-solve-all-problems">lien</a>)&nbsp;&raquo;</span></p>
<p>est le nom de l&rsquo;article qui a suscité mon attention. Ces dernières semaines, à plusieurs reprises, j&rsquo;ai pu entendre LA question : &laquo;&nbsp;<em>est-ce qu&rsquo;Hadoop me permet de faire ceci, cela ?</em>&laquo;&nbsp;. La publication des exploits d&rsquo;<a href="http://www.ebaytechblog.com/2010/10/29/hadoop-the-power-of-the-elephant/" title="hadoop at ebay">eBay</a> et autres géants a certainement contribué au succès grandissant d&rsquo;Hadoop. Néanmoins, il ne faut pas oublier que l&rsquo;utilisation en production de la plate-forme libre de &laquo;&nbsp;<em>Big-Data</em>&nbsp;&raquo; au sein de ces entreprises se fait en connaissance de cause.</p>
<p>Tout d&rsquo;abord, Hadoop tout seul ne répond pas à tous les besoins, et la plus-value se situe sur l&rsquo;ensemble de l&rsquo;éco-système. Il faut penser la plate-forme dans son intégralité. Les motifs d&rsquo;accès aux données ou les calculs à effectuer peuvent influer sur la manière dont seront organisées les données et sur les outils environnants : faut-il stocker des résultats dans une grille analytique ? Dois-je privilégier une approche par flux ou par batch ?</p>
<p>Après Google, Hadoop a complètement démocratisé le <a href="http://fr.wikipedia.org/wiki/MapReduce" title="hadoop map/reduce">Map/Reduce</a>, ou comment effectuer de puissants calculs sur des <span class="code">petabytes</span> de données. Encore faut-il savoir écrire de tels calculs. J&rsquo;ai eu plusieurs fois l&rsquo;occasion d&rsquo;observer des jobs mal pensés, mal définis. La nature de Map/Reduce se prête mal à <a href="http://horicky.blogspot.com/2010/07/graph-processing-in-map-reduce.html">certains calculs sur des graphes géants</a> comme certains algorithmes de recommendations par exemple, comme mentionné dans l&rsquo;article (un petit tour du côté de Pregel s&rsquo;impose&#8230;). Mais la non-maîtrise du style fonctionnel de Map/Reduce n&rsquo;est pas seule la raison des lenteurs ou de le non-utilisabilité du cluster. La mauvaise maîtrise d&rsquo;Hadoop lui même peut mener à la catastrophe.</p>
<p>Celui qui n&rsquo;a pas compris que le <em>namenode</em> est source de <a href="http://fr.wikipedia.org/wiki/Point_individuel_de_d%C3%A9faillance">SPOF</a>, ou qu&rsquo;un <span class="code">Combiner</span> bien écrit est parfois utile pour limiter le I/O, se rendra vite compte que &laquo;&nbsp;Hadoop ne résout pas tous les problèmes&nbsp;&raquo;. De même, la connaissance des problèmes &laquo;&nbsp;de base&nbsp;&raquo; de l&rsquo;informatique répartie &#8212; coût des transmissions <em>vs.</em> coût des calculs, synchronisations, etc. &#8212; me semble inévitable pour concevoir une plate-forme pérenne. Maîtriser son architecture technique et chacune des briques me semble bien plus important qu&rsquo;arriver à écrire des jobs Java pour Hadoop.</p>
<img src="http://feeds.feedburner.com/~r/blogspot/zt/~4/FNI5mREuVvU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ze-technology.com/2011/10/11/hadoop-mettons-les-choses-au-clair/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.ze-technology.com/2011/10/11/hadoop-mettons-les-choses-au-clair/</feedburner:origLink></item>
		<item>
		<title>Lister des fichiers en python… avec les fonctions POSIX !</title>
		<link>http://feedproxy.google.com/~r/blogspot/zt/~3/PZc_Ka6Qg-M/</link>
		<comments>http://www.ze-technology.com/2010/12/17/lister-des-fichiers-en-python-avec-les-fonctions-posix/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 20:37:47 +0000</pubDate>
		<dc:creator>Adrien Mogenet</dc:creator>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutoriaux]]></category>

		<guid isPermaLink="false">http://www.ze-technology.com/?p=711</guid>
		<description><![CDATA[Je me suis mis depuis quelques mois à Python. Il y a énormément de choses très appréciables dans le langage et sa logique. À vrai dire, plus le temps passe, et moins je lui trouve de points faibles. Sûrement le début d&#8217;une longue série d&#8217;articles, de tous niveaux. Mais en attendant, je vais ici relater [...]]]></description>
			<content:encoded><![CDATA[<p>Je me suis mis depuis quelques mois à Python. Il y a énormément de choses très appréciables dans le langage et sa logique. À vrai dire, plus le temps passe, et moins je lui trouve de points faibles. Sûrement le début d&rsquo;une longue série d&rsquo;articles, de tous niveaux.</p>
<p>Mais en attendant, je vais ici relater mon premier bout de code un petit peu &laquo;&nbsp;tricky&nbsp;&raquo;. Python propose un lot de méthodes pour accéder aux répertoires/fichiers : os.listdir, walk&#8230;  Mais ces méthodes ont le défaut de retourner une liste construite des éléments. Du coup, lorsque le temps de traitement devient critique, on aimerait bien pouvoir itérer directement sur les descripteurs de fichiers sans attendre une liste de potentiellement 10 000 éléments. Bref, la possibilité d&rsquo;accéder aux fonctions Posix <span style="font-family: courier">opendir()</span> et <span style="font-family: courier">readdir()</span>.</p>
<p>Le soucis ? Python ne propose pas ces fonctions. Mais il y a la possibilité d&rsquo;accéder à des API du langage C, et dans un environnement Unix, on y retrouve nos chères fonctions si convoitées ! Après avoir étudié cette piste, voilà un snippet fort utile :</p>
<pre class="brush: python; title: ; notranslate">
#!/usr/bin/python
from ctypes import CDLL, c_char_p, c_int, c_long, c_ushort, c_byte, c_char
from ctypes import Structure, POINTER
from ctypes.util import find_library

class c_dir(Structure):
    &quot;&quot;&quot; Defined C struct DIR &quot;&quot;&quot;
    pass

class c_dirent(Structure):
    &quot;&quot;&quot; Directory entry structure equivalent &quot;&quot;&quot;
    _fields_ = (
        ('d_ino', c_long),  # inode number
        ('d_off', c_long),  # offset to the next dirent
        ('d_reclen', c_ushort), # length of this record
        ('d_type', c_byte),  # type of files; os specific
        ('d_name', c_char * 4096) # filename
        )

c_dirent_p = POINTER(c_dirent)
c_dir_p = POINTER(c_dir)
c_lib = CDLL(find_library(&quot;c&quot;))

opendir = c_lib.opendir
opendir.argtypes = [c_char_p]
opendir.restype = c_dir_p

readdir = c_lib.readdir_r
readdir.argtypes = [c_dir_p]
readdir.restype = c_dirent_p

closedir = c_lib.closedir
closedir.argtypes = [c_dir_p]
closedir.restype = c_int

def listdir(path):
    &quot;&quot;&quot;
    A generator to return the names of files in the directory passed in
    &quot;&quot;&quot;
    dir_p = opendir(&quot;.&quot;)
    try:
        while True:
            p = readdir(dir_p)
            if not p:
                break
            yield p.contents.d_name
    finally:
        closedir(dir_p)
</pre>
<p>Attention, <span style="font-family: courier">listdir()</span> retournera les répertoires &laquo;&nbsp;.&nbsp;&raquo; et &laquo;&nbsp;..&nbsp;&raquo; ! Notez l&rsquo;utilisation du <span style="font-family: courier">yield</span> pour définir ici un générateur (sujet d&rsquo;un autre article). De ce fait, notre fonction s&rsquo;utilise comme cela :</p>
<pre class="brush: python; title: ; notranslate">
if __name__ == &quot;__main__&quot;:
    for name in listdir(&quot;.&quot;):
        print name
</pre>
<p>En espérant que ça puisse servir à quelqu&rsquo;un d&rsquo;autre&#8230;</p>
<img src="http://feeds.feedburner.com/~r/blogspot/zt/~4/PZc_Ka6Qg-M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ze-technology.com/2010/12/17/lister-des-fichiers-en-python-avec-les-fonctions-posix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ze-technology.com/2010/12/17/lister-des-fichiers-en-python-avec-les-fonctions-posix/</feedburner:origLink></item>
		<item>
		<title>Adoption de bonnes pratiques QA, retour d’expérience</title>
		<link>http://feedproxy.google.com/~r/blogspot/zt/~3/dgusUhUj1UA/</link>
		<comments>http://www.ze-technology.com/2010/12/05/adoption-de-bonnes-pratiques-qa-retour-dexperience/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 21:52:43 +0000</pubDate>
		<dc:creator>Adrien Mogenet</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.ze-technology.com/?p=708</guid>
		<description><![CDATA[Cher lectorat, bonjour. Alors que l&#8217;on parle plus que jamais de casino en ligne, de paris sportif, poker ou des fameux &#171;&#160;bonus&#160;&#187; de casino sans dépôt, l&#8217;été dernier a été pour moi l&#8217;occasion de retourner de l&#8217;autre côté de la barrière. L&#8217;occasion de collaborer à nouveau avec mon ancien (excellent) employeur en matière de gambling. La [...]]]></description>
			<content:encoded><![CDATA[<p>Cher lectorat, bonjour.</p>
<p>Alors que l&rsquo;on parle plus que jamais de <a href="http://fr.casinotoplists.com/" target="_blank">casino en ligne</a>, de paris sportif, poker ou des fameux &laquo;&nbsp;bonus&nbsp;&raquo; de <a href="http://fr.casinotoplists.com/bonus-de-casino-sans-depot">casino sans dépôt</a>, l&rsquo;été dernier a été pour moi l&rsquo;occasion de retourner de l&rsquo;autre côté de la barrière. L&rsquo;occasion de collaborer à nouveau avec mon ancien (excellent) employeur en matière de gambling. La mission qui m&rsquo;était confiée était la suivante : partager mes expériences en matière de QA pour les projets PHP, et sensibiliser/développer tout un lot de bonnes pratiques auprès de l&rsquo;équipe technique en place.</p>
<p>Pour formaliser un peu le périmètre, ces 2 mois devaient permettre de dérouler un état de l&rsquo;art des tests unitaires, fonctionnels, de performances, sur l&rsquo;intégration continue et les bonnes pratiques de développement &laquo;&nbsp;modernes&nbsp;&raquo; appliquées au PHP.</p>
<p>Ma plus grosse crainte était résolument celle de voir ces pratiques rejetées, jugées &laquo;&nbsp;inutiles&nbsp;&raquo;, ou &laquo;&nbsp;trop lourdes&nbsp;&raquo; à appliquer au quotidien. Je savais que j&rsquo;avais alors 2 mois pour démontrer tout l&rsquo;intérêt de ces pratiques, pour prouver que les métriques de phpcs, phpcpd ou phpunit étaient bien plus que des simples chiffres.</p>
<h3>L&rsquo;approche</h3>
<p>Mon approche fût la suivante : adapter chaque point au cas précis des développeurs de l&rsquo;entreprise, et les impliquer le plus tôt possible dans un processus &laquo;&nbsp;d&rsquo;auto-formation&nbsp;&raquo;, pour assurer une pérennité à la politique qualité, une fois ces 2 mois &#8211; à mi temps &#8211; terminés. Craignant des rejets du type : &laquo;&nbsp;les tests, c&rsquo;est pas pour nous !&nbsp;&raquo;, je me suis efforcé de résoudre TOUS les problèmes qui pourraient m&rsquo;être posé. L&rsquo;exemple le plus concret concerne un refactoring de classes PHP. L&rsquo;une d&rsquo;entre elle mélangeait logique métier, logique d&rsquo;accès aux données, logique utilisateur&#8230; L&rsquo;argument avancé était que le code <strong>devait</strong> être comme cela, que ça avait été pensé et que finalement, ça marchait très bien.</p>
<p>Sans forcément rejeter cette idée (après tout, un code qui marche, c&rsquo;est déjà beaucoup de nos jours !) j&rsquo;ai accordé le temps qu&rsquo;il fallait au problème en décortiquant chaque ligne. Après avoir expliqué ma méthodologie (qui en est une à peu près standard parmi tant d&rsquo;autres), on obtenait un code iso-fonctionnel, mais :</p>
<ul>
<li>avec des portions beaucoup plus courtes</li>
<li>beaucoup plus facilement testable</li>
<li>plus ordonné par &laquo;&nbsp;logiques&nbsp;&raquo;, au lieu d&rsquo;emboîter des appels procéduraux</li>
<li>et donc, plus facilement maintenable</li>
</ul>
<p>Je pense que cet exemple concret a été le déclencheur sur la prise de conscience de la part de l&rsquo;équipe. L&rsquo;exemple qui a montré que le changement n&rsquo;est pas impossible, et, mieux encore, peut être pas si coûteux que  ça en temps s&rsquo;il est fait rigoureusement.</p>
<h3>Des acteurs impliqués</h3>
<p>Une fois la théorie abordée et l&rsquo;exemple donné, j&rsquo;avais dédié une partie à la &laquo;&nbsp;pratique&nbsp;&raquo; collaborative. Les mains dans le cambouis, comme on dit. Des micro-tâches étaient assignées entre les différents développeurs, afin qu&rsquo;ils s&rsquo;approprient les outils et différents outils, et intégrer les bons réflexes. Ajout d&rsquo;une nouvelle métrique à Hudson, modification d&rsquo;un test unitaire, relecture du code d&rsquo;autrui, consultation de la documentation&#8230; Autant de minutes dépensées à bon escient.</p>
<h3>La finalité</h3>
<p>J&rsquo;ai oublié de vous dire : c&rsquo;était ma première vraie expérience en &laquo;&nbsp;formation&nbsp;&raquo;. Je ne peux me targuer d&rsquo;avoir 10 ans d&rsquo;expérience en QA ou en pédagogie, mon but était d&rsquo;apporter mon regard et de partager ce que je savais. Le pari est apparemment réussi. Les 2 points clés (exemple concret autour des besoins réels et implication des acteurs) ont l&rsquo;air d&rsquo;avoir porté leurs fruits. La plate-forme d&rsquo;intégration continue fonctionne&#8230; en continue. Voilà 2 mois bien rentabilisés !</p>
<img src="http://feeds.feedburner.com/~r/blogspot/zt/~4/dgusUhUj1UA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ze-technology.com/2010/12/05/adoption-de-bonnes-pratiques-qa-retour-dexperience/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ze-technology.com/2010/12/05/adoption-de-bonnes-pratiques-qa-retour-dexperience/</feedburner:origLink></item>
		<item>
		<title>PHPUnit 3.5 : pas moins de $this !</title>
		<link>http://feedproxy.google.com/~r/blogspot/zt/~3/F04ni0wz1c4/</link>
		<comments>http://www.ze-technology.com/2010/08/18/phpunit-3-5-pas-moins-de-this/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 13:17:06 +0000</pubDate>
		<dc:creator>Adrien Mogenet</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.ze-technology.com/?p=704</guid>
		<description><![CDATA[C&#8217;est une nouvelle (?) que vient d&#8217;annoncer Sebastian Bergmann. Suite aux remarques de la communauté, il n&#8217;y aura pas moins de $this dans vos tests unitaires. Pour rappel,  Sebastian avait eu pas mal de plaintes d&#8217;utilisateurs réclamant la disparition du $this pour effectuer les différentes assertions. Source]]></description>
			<content:encoded><![CDATA[<p>C&rsquo;est une nouvelle (?) que vient d&rsquo;annoncer Sebastian Bergmann. Suite aux remarques de la communauté, il n&rsquo;y aura pas moins de $this dans vos tests unitaires.</p>
<p>Pour rappel,  Sebastian avait eu pas mal de plaintes d&rsquo;utilisateurs réclamant la disparition du $this pour effectuer les différentes assertions.</p>
<p><a href="http://sebastian-bergmann.de/archives/896-guid.html">Source</a></p>
<img src="http://feeds.feedburner.com/~r/blogspot/zt/~4/F04ni0wz1c4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ze-technology.com/2010/08/18/phpunit-3-5-pas-moins-de-this/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ze-technology.com/2010/08/18/phpunit-3-5-pas-moins-de-this/</feedburner:origLink></item>
		<item>
		<title>Retour d’expérience sur MongoDB partie 1 : présentation</title>
		<link>http://feedproxy.google.com/~r/blogspot/zt/~3/OX5vyD8u2vM/</link>
		<comments>http://www.ze-technology.com/2010/07/23/retour-dexperience-sur-mongodb/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 20:19:55 +0000</pubDate>
		<dc:creator>Adrien Mogenet</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.ze-technology.com/?p=691</guid>
		<description><![CDATA[Retour d&#8217;expérience sur MongoDB Cela fait maintenant quelques temps que je donne plus de nouvelles, plus un signe de technologie, de recherche. Et pourtant, de la recherche, il y en a eu ! Après avoir passé une longue période à essayer les différents outils de QA dédiés au web, j&#8217;ai passé ces derniers mois à [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Retour d&rsquo;expérience sur MongoDB</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Cela fait maintenant quelques temps que je donne plus de nouvelles,</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">plus un signe de technologie, de recherche. Et pourtant, de la</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">recherche, il y en a eu !</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Après avoir passé une longue période à essayer les différents outils</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">de QA dédiés au web, j&rsquo;ai passé ces derniers mois à essayer &#8211; et</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">exploiter &#8211; les NoSQL. La littérature est déjà bien large sur le sujet</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">dans ses généralités. Cassandra, HBase, Voldemort, Redis&#8230; tout y</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">passe, du plus ancien dépôt clé/valeur au plus évolué système orienté</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">graphe ou document. Je vais parler ici finalement de MongoDB, que j&rsquo;ai</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">pu torturer en long, en large et en travers, et qui appartient</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">justement à la catégorie des NoSQL orienté document.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Un NoSQL, pourquoi ?</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Certainement pas par effet de mode. Une prise de décision basée sur ce</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">critère ne serait que folie. Par besoin ? Il va être temps de définir</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ces besoins. Car on assiste à bon nombre de projets qui tendent à</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">délaisser ces bons vieux SGBDR au profit de leurs consins</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">non-relationnels. Or, la plupart de ces projets ont &#8211; selon moi -</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">surtout un problème de conception et non d&rsquo;outils. Si ces projets</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">reprochent à MySQL une certaine lenteur, ils feraient bien mieux</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">d&rsquo;apprendre à tirer profit d&rsquo;une configuration optimale, et d&rsquo;une</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">conception sérieuse du modèle de données, avec une stratégie</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">d&rsquo;indexation adaptée. On ne le dira jamais assez : des bases comme</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">MySQL, PostgreSQL ou autre ont perduré pendant des années. La</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">réplication est fonctionelle. Le partitionnement est possible. Les</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">plus gros l&rsquo;ont utilisé et continuent à l&rsquo;utiliser. Twitter avoue même</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">rester sur MySQL après avoir essayé timidement de mettre en place</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Cassandra. Non, pour moi, une des raison qui peut pousser à envisager</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">une solution NoSQL est ailleurs. La grosse plus value de ces solutions</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">reste toujours leur très bonne disposition à &laquo;&nbsp;scaler&nbsp;&raquo;. Autrement dit,</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">si on souhaite absorber un déluge de données croissant, on y trouvera</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">un allié puissant pour rapidement doubler, quadrupler la puissance de</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">stockage, sans se lancer dans une trop lourde configuration du</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">partitionnement et/ou de la réplication.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Orienté document, pourquoi ?</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Comme d&rsquo;habitude, nuançons ce point de vue par un autre apport, mais</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">celui-ci est propre au modèle de stockage choisi. On en dénombre 4 :</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- dépôts clé/valeur (Voldemort, Redis&#8230;)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- orientés colonne (Cassandra, HBase&#8230;)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- orientés documents (CouchDB, MongoDB&#8230;)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- orientés graphes (Neo4J&#8230;)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Chaque modèle répond à des problématiques et stratégies de stockage</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">différentes. MongoDB stocke des &laquo;&nbsp;documents&nbsp;&raquo;. Un document est un</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ensemble de paires clé/valeurs, ici décrites au format BSon. Ce format</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">est largement comparable au JSon, modulo quelques types additionnels.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">{</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">blog: http://www.zt.com,</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">authors: [adrien, robot],</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">comments:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">[</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>{ author: robert, age: 42 },</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>{ author: johanna, age: 25 }</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">]</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Volà donc typiquement ce qui peut être stocké dans une collection (=</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">table) MongoDB. Ce stockage est dit &laquo;&nbsp;schemaless&nbsp;&raquo;, traduire par &laquo;&nbsp;sans</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">schéma&nbsp;&raquo;. Les documents ne correspondent à aucune définition formelle</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">qui aurait été préalablement définie. Ainsi, on pourrait très bien</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">rajouter un autre document &laquo;&nbsp;blog&nbsp;&raquo; similaire à l&rsquo;exemple, mais sans</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">champs &laquo;&nbsp;authors&nbsp;&raquo; et avec une colonne &laquo;&nbsp;keywords&nbsp;&raquo;. le NewYorkTimes tire</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">partie de ce modèle avec MongoDB en permettant à ses contributeurs</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">d&rsquo;ajouter des méta-données à la volée pour chaque photo soumise. En</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">effet, on ne retrouve pas forcément les même méta-données entre une</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">photo de lieu et celle d&rsquo;une star. Certes, la chose reste largement</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">faisable avec les outils actuels. Le modèle document est juste</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">extrémement adapté à ce type de stockage, sans s&rsquo;occuper d&rsquo;un modèle</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">relationnel et ses multiples contraintes. Je sais, je viens de donner</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">un argument qui pourrait remettre en cause le premier : certains NoSQL</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ont un rôle qui dépasse de loin celui d&rsquo;un entrepôt extensible et redondé.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">MongoDB, pourquoi ?</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Voyons maintenant le cas particulier de MongoDB. C&rsquo;est un NoSQL</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">orienté documents, qui se qualifie par l&rsquo;acronyme &laquo;&nbsp;CP&nbsp;&raquo; du théorème de</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">CAP.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">1) Langage de requêtage intuitif</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Tout naturellement, lorsqu&rsquo;on essaye un système de stockage, nos</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">premiers essais se tournent vers l&rsquo;insertion et la récupération de</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">données. Pour l&rsquo;insertion, nous venons de voir qu&rsquo;elle s&rsquo;effectuait au</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">format BSon. Concretement, après avoir lancé le shell MongoDB, la</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">commande suivante effectuerait une insertion dans une collection</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&laquo;&nbsp;test&nbsp;&raquo; :</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">db.test.insert({&laquo;&nbsp;name&nbsp;&raquo;: &laquo;&nbsp;Adrien&nbsp;&raquo;});</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Et pour requêter nos collections, cela s&rsquo;effectue également tout</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">naturellement au format BSon ! MongoDB fournit un certain nombre</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">d&rsquo;opérateurs classiques : &gt;, &lt;, =, &gt;=, IN, NOT IN, etc. Quelques</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">exemples :</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># Tous les utilisateurs &laquo;&nbsp;toto&nbsp;&raquo;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">db.test.find({&laquo;&nbsp;name&nbsp;&raquo;: &laquo;&nbsp;toto&nbsp;&raquo;});</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># Les 3 premiers &laquo;&nbsp;Adrien&nbsp;&raquo;, ayant plus de 23 ans, triés</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">db.test.find({&laquo;&nbsp;name&nbsp;&raquo;: &laquo;&nbsp;Adrien&nbsp;&raquo;, &laquo;&nbsp;age&nbsp;&raquo;: {$gt: 23}}.sort({&laquo;&nbsp;age&nbsp;&raquo;: -1}).limit(3);</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">C&rsquo;est en général le premier point qui ressort de MongoDB par rapport à</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">la plupart de ses rivaux. Son système de requêtage séduisant permet</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">une prise en main extrémement rapide.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">2) Auto-sharding</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Venons en maintenant à ce qui fait normalement tout l&rsquo;attrait des</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">NoSQL : leur forte extensibilité et leur mécanisme de</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">réplication. MongoDB offre des possibilités de sharding</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">(partitionnement) afin de distribuer les données au sein de plusieurs</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&laquo;&nbsp;shards&nbsp;&raquo; (bloc venant constituer le cluster, et ne possédant qu&rsquo;une</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">partie des données). L&rsquo;auto-sharding reste aujourd&rsquo;hui (version 1.5.3)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">en version beta, mais il est possible tout de même de spécifier ses</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">propres pattern de sharding. Par exemple, on peut décider que le</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">champs &laquo;&nbsp;name&nbsp;&raquo; de nos exemple deviendra une clé de sharding. Il est</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">possible, à l&rsquo;instar des indexes, de spécifier des clés composées de</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">plusieurs champs. MongoDB calculera un hash de ces clés pour</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">déterminer sur quel shard envoyer tel ou tel document. La</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">configuration du cluster et toutes ses méta-données sont stockées au</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">sein de &laquo;&nbsp;serveurs de configuration&nbsp;&raquo;. En production, trois serveurs de</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ce type sont normalement configurés. Si un de ces serveurs tombe en</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">rade, le système continue de fonctionner normalement. Si deux de ces 3</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">serveurs montrent un dysfonctionnement, le dernier serveur de</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">configuration devient accessible en lecture seulement. Ceci n&rsquo;empêche</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">pas le cluster complet de fonctionner, mais empêche toute modification</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">de la configuration, et tout déplacement de &laquo;&nbsp;chunks&nbsp;&raquo; (position des</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">blocs de données, qui est elle aussi stockée dans ces serveurs de</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">configuration).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">3) Replica pair, replica sets</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Chaque shard peut actuellement être redondé par ce qu&rsquo;on appelle un système de</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&laquo;&nbsp;replica pair&nbsp;&raquo; : le shard est constitué d&rsquo;un master et d&rsquo;un slave. À</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">tout moment, si le master tombe en panne, le slave prend le relai. Les</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">données peuvent être répliquées instantanément ou avec une certaines</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">latence dans le cas d&rsquo;un système dit &laquo;&nbsp;finalement consistant&nbsp;&raquo;. Cette</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">paire est bien limitée actuellement en matière de fail-over et</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">laissera place aux &laquo;&nbsp;replica sets&nbsp;&raquo; avec MongoDB 1.6, qui laissera la</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">possibilité de plus de 2 serveurs de sauvegarde. Dans cette nouvelle</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">situation, en cas de panne du master, l&rsquo;élection du slave qui</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">deviendra master se fera par la résolution d&rsquo;un consensus basé sur la</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">disponibilité de chaque noeud, le nombre de serveurs vus par chacun, etc&#8230;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Conclusion</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">On attend les replica sets, l&rsquo;autosharding fonctionnel</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Liens à insérer :</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- &laquo;&nbsp;twitter avoue&nbsp;&raquo;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- &laquo;&nbsp;théoreme de CAP&nbsp;&raquo;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Article sur XOP</div>
<p>Cela fait maintenant quelques temps que je donne plus de nouvelles, plus un signe de technologie, de recherche. Et pourtant, de la recherche, il y en a eu ! Après avoir passé une longue période à essayer les différents outils de QA dédiés au web, j&rsquo;ai passé ces derniers mois à essayer &#8211; et exploiter &#8211; les NoSQL. La littérature est déjà bien large sur le sujet dans ses généralités. Cassandra, HBase, Voldemort, Redis&#8230; tout y passe, du plus ancien dépôt clé/valeur au plus évolué système orienté graphe ou document. Je vais parler ici finalement de MongoDB, que j&rsquo;ai pu torturer en long, en large et en travers, et qui appartient justement à la catégorie des NoSQL orienté document.</p>
<h3>Un NoSQL, pourquoi ?</h3>
<p>Certainement pas par effet de mode. Une prise de décision basée sur ce critère ne serait que folie. Par besoin ? Il va être temps de définir ces besoins. Car on assiste à bon nombre de projets qui tendent à délaisser ces bons vieux SGBDR au profit de leurs cousins non-relationnels. Or, la plupart de ces projets ont &#8211; selon moi - surtout un problème de conception et non d&rsquo;outils. Si ces projets reprochent à MySQL une certaine lenteur, ils feraient bien mieux d&rsquo;apprendre à tirer profit d&rsquo;une configuration optimale, et d&rsquo;une conception sérieuse du modèle de données, avec une stratégie d&rsquo;indexation adaptée. On ne le dira jamais assez : des bases comme MySQL, PostgreSQL ou autre ont perduré pendant des années. La réplication est fonctionelle. Le partitionnement est possible. Les plus gros l&rsquo;ont utilisé et continuent à l&rsquo;utiliser. Twitter <a href="http://engineering.twitter.com/2010/07/cassandra-at-twitter-today.html">avoue même rester sur MySQL</a> après avoir essayé timidement de mettre en place Cassandra. Non, pour moi, une des raison qui peut pousser à envisager une solution NoSQL est ailleurs. La grosse plus value de ces solutions reste toujours leur très bonne disposition à &laquo;&nbsp;scaler&nbsp;&raquo;. Autrement dit, si on souhaite absorber un déluge de données croissant, on y trouvera un allié puissant pour rapidement doubler, quadrupler la puissance de stockage, sans se lancer dans une trop lourde configuration du partitionnement et/ou de la réplication.</p>
<h3>Orienté document, pourquoi ?</h3>
<p>Comme d&rsquo;habitude, nuançons ce point de vue par un autre apport, mais celui-ci est propre au modèle de stockage choisi. On en dénombre 4 :</p>
<ul>
<li>dépôts clé/valeur (Voldemort, Redis&#8230;)</li>
<li>orientés colonne (Cassandra, HBase&#8230;)</li>
<li>orientés documents (CouchDB, MongoDB&#8230;)</li>
<li>orientés graphes (Neo4J&#8230;)</li>
</ul>
<p>Chaque modèle répond à des problématiques et stratégies de stockage différentes. MongoDB stocke des &laquo;&nbsp;documents&nbsp;&raquo;. Un document est un ensemble de paires clé/valeurs, ici décrites au format BSon. Ce format est largement comparable au JSon, modulo quelques types additionnels.</p>
<p><code>{<br />
blog: http://www.zt.com,<br />
authors: [adrien, robot],<br />
comments:<br />
[<br />
<span style="white-space: pre;"> </span>{ author: robert, age: 42 },<br />
<span style="white-space: pre;"> </span>{ author: johanna, age: 25 }<br />
]<br />
}<br />
</code></p>
<p>Voolà donc typiquement ce qui peut être stocké dans une collection (= table) MongoDB. Ce stockage est dit &laquo;&nbsp;schemaless&nbsp;&raquo;, traduire par &laquo;&nbsp;sans schéma&nbsp;&raquo;. Les documents ne correspondent à aucune définition formelle qui aurait été préalablement définie. Ainsi, on pourrait très bien rajouter un autre document &laquo;&nbsp;blog&nbsp;&raquo; similaire à l&rsquo;exemple, mais sans champs &laquo;&nbsp;authors&nbsp;&raquo; et avec une colonne &laquo;&nbsp;keywords&nbsp;&raquo;. le NewYorkTimes tire partie de ce modèle avec MongoDB en permettant à ses contributeurs d&rsquo;ajouter des méta-données à la volée pour chaque photo soumise. En effet, on ne retrouve pas forcément les même méta-données entre une photo de lieu et celle d&rsquo;une star. Certes, la chose reste largement faisable avec les outils actuels. Le modèle document est juste extrémement adapté à ce type de stockage, sans s&rsquo;occuper d&rsquo;un modèle relationnel et ses multiples contraintes. Je sais, je viens de donner un argument qui pourrait remettre en cause le premier : certains NoSQL ont un rôle qui dépasse de loin celui d&rsquo;un entrepôt extensible et redondé.</p>
<h3>MongoDB, pourquoi ?</h3>
<p>Voyons maintenant le cas particulier de MongoDB. C&rsquo;est un NoSQL orienté documents, qui se qualifie par l&rsquo;acronyme &laquo;&nbsp;CP&nbsp;&raquo; du <a href="http://en.wikipedia.org/wiki/CAP_theorem">théorème de CAP</a>.</p>
<h4>1) Langage de requêtage intuitif</h4>
<p>Tout naturellement, lorsqu&rsquo;on essaye un système de stockage, nos premiers essais se tournent vers l&rsquo;insertion et la récupération de données. Pour l&rsquo;insertion, nous venons de voir qu&rsquo;elle s&rsquo;effectuait au format BSon. Concretement, après avoir lancé le shell MongoDB, la commande suivante effectuerait une insertion dans une collection &nbsp;&raquo;test&nbsp;&raquo; :</p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre;">db.test.insert({&laquo;&nbsp;name&nbsp;&raquo;: &laquo;&nbsp;Adrien&nbsp;&raquo;});</span></p>
<p>Et pour requêter nos collections, cela s&rsquo;effectue également tout naturellement au format BSon ! MongoDB fournit un certain nombre d&rsquo;opérateurs classiques : &gt;, &lt;, =, &gt;=, IN, NOT IN, etc. Quelques exemples :</p>
<pre><code># Tous les utilisateurs "toto"
db.test.find({"name": "toto"});
</code></pre>
<p><code># Les 3 premiers "Adrien", ayant plus de 23 ans, triés<br />
db.test.find({"name": "Adrien", "age": {$gt: 23}}.sort({"age": -1}).limit(3);</code></p>
<p>C&rsquo;est en général le premier point qui ressort de MongoDB par rapport à la plupart de ses rivaux. Son système de requêtage séduisant permet une prise en main extrémement rapide.</p>
<h4>2) Auto-sharding</h4>
<p>Venons en maintenant à ce qui fait normalement tout l&rsquo;attrait des NoSQL : leur forte extensibilité et leur mécanisme de réplication. MongoDB offre des possibilités de sharding (partitionnement) afin de distribuer les données au sein de plusieurs &nbsp;&raquo;shards&nbsp;&raquo; (bloc venant constituer le cluster, et ne possédant qu&rsquo;une partie des données). L&rsquo;auto-sharding reste aujourd&rsquo;hui (version 1.5.3) en version beta, mais il est possible tout de même de spécifier ses propres pattern de sharding. Par exemple, on peut décider que le champs &laquo;&nbsp;name&nbsp;&raquo; de nos exemple deviendra une clé de sharding. Il est possible, à l&rsquo;instar des indexes, de spécifier des clés composées de plusieurs champs. MongoDB calculera un hash de ces clés pour déterminer sur quel shard envoyer tel ou tel document. La configuration du cluster et toutes ses méta-données sont stockées au sein de &laquo;&nbsp;serveurs de configuration&nbsp;&raquo;. En production, trois serveurs de ce type sont normalement configurés. Si un de ces serveurs tombe en rade, le système continue de fonctionner normalement. Si deux de ces 3 serveurs montrent un dysfonctionnement, le dernier serveur de configuration devient accessible en lecture seulement. Ceci n&rsquo;empêche pas le cluster complet de fonctionner, mais empêche toute modification de la configuration, et tout déplacement de &laquo;&nbsp;chunks&nbsp;&raquo; (position des blocs de données, qui est elle aussi stockée dans ces serveurs de configuration).</p>
<h4>3) Replica pair, replica sets</h4>
<p>Chaque shard peut actuellement être redondé par ce qu&rsquo;on appelle un système de &nbsp;&raquo;replica pair&nbsp;&raquo; : le shard est constitué d&rsquo;un master et d&rsquo;un slave. À tout moment, si le master tombe en panne, le slave prend le relai. Les données peuvent être répliquées instantanément ou avec une certaines latence dans le cas d&rsquo;un système dit &laquo;&nbsp;finalement consistant&nbsp;&raquo;. Cette paire est bien limitée actuellement en matière de fail-over et laissera place aux &laquo;&nbsp;replica sets&nbsp;&raquo; avec MongoDB 1.6, qui laissera la possibilité de plus de 2 serveurs de sauvegarde. Dans cette nouvelle situation, en cas de panne du master, l&rsquo;élection du slave qui deviendra master se fera par la résolution d&rsquo;un consensus basé sur la disponibilité de chaque noeud, le nombre de serveurs vus par chacun, etc&#8230;</p>
<h4>4) Map/Reduce</h4>
<p>L&rsquo;algorithme Map/Reduce a le vent en poupe depuis les papiers Google et l&rsquo;implémentation Hadoop. Et devinez quoi ? MongoDB, à l&rsquo;instar de CouchDB, offre des possibilités d&rsquo;interrogation en Map/Reduce. Dans un environnement &laquo;&nbsp;shardé&nbsp;&raquo;, les requêtes sont en effet ciblées ou globales (parallèles ou séquentielles). Pour effecter un certain nombre de calculs efficacement, MongoDB permet l&rsquo;écriture de fonctions map() et  reduce() &#8211; et finalize() &#8211; en javascript. Les résultats peuvent être stockées dans des collections temporaires pour conserver un cache des résultats.</p>
<h4>5) Autres fonctionnalités</h4>
<p>En fait, il y a trop de choses à raconter sur MongoDB. Je vais faire un bon petit lot de petits articles pour détailler chaque point, mais pour ce soir, il faudra se contenter d&rsquo;une découverte rapide :</p>
<ul>
<li>Un moteur d&rsquo;indexation géographique, que Foursquare utilise à outrance</li>
<li>Une indexation en background</li>
<li>Des capped-collections, collections de tailles fixes auto-gérées pour ne conserver que les X derniers éléments insérés (fonctionnement par TTL prévu pour les futures versions)</li>
<li>Profiling des requêtes</li>
<li>Interface REST</li>
</ul>
<h3>Conclusion</h3>
<p>MongoDB est la solution qui actuellement suscite le plus ma curiosité, et surtout mon intérêt, tant pour ses performances que pour sa conception et ses fonctionnalités. Son plus gros défaut actuel est sa grande jeunesse. Gageons qu&rsquo;une fois l&rsquo;auto-sharding et les replica-sets 100% fonctionnels, 10 Gen Confluence arrivera à mettre en place une architecture composée de 1000 shards, son objectif actuel.</p>
<img src="http://feeds.feedburner.com/~r/blogspot/zt/~4/OX5vyD8u2vM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ze-technology.com/2010/07/23/retour-dexperience-sur-mongodb/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.ze-technology.com/2010/07/23/retour-dexperience-sur-mongodb/</feedburner:origLink></item>
	</channel>
</rss>
