<?xml 
version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
>

<channel xml:lang="fr">
	<title>Octopuce</title>
	<link>http://www.octopuce.fr/</link>
	
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>




<item xml:lang="fr">
		<title>Optimisation SQL, EXPLAIN et les fonctions dans WHERE</title>
		<link>http://www.octopuce.fr/Optimisation-SQL-EXPLAIN-et-les</link>
		<guid isPermaLink="true">http://www.octopuce.fr/Optimisation-SQL-EXPLAIN-et-les</guid>
		<dc:date>2013-03-27T13:04:37Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Benjamin Sonntag</dc:creator>



		<description>Chez Octopuce, en tant qu'h&#233;bergeur &#224; forte valeur ajout&#233;, nous aidons souvent nos client &#224; optimiser leur MySQL, leur Apache, leur PHP, ou d'autres services du m&#234;me genre. Nous tombons parfois, pour nos clients les plus gros, sur des probl&#232;me qui peuvent aller jusqu'&#224; mettre &#224; mal leur performance, et nos comp&#233;tences purement syst&#232;me ne suffisent plus. Aujourd'hui, je vous propose un exemple simple : comment optimiser une requ&#234;te MySQL complexe et gagner &#233;norm&#233;ment de temps &#224; la g&#233;n&#233;ration d'une page (...)

-
&lt;a href="http://www.octopuce.fr/-OctoBlog-" rel="directory"&gt;70. OctoBlog&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Chez Octopuce, en tant qu'h&#233;bergeur &#224; forte valeur ajout&#233;, nous aidons souvent nos client &#224; optimiser leur MySQL, leur Apache, leur PHP, ou d'autres services du m&#234;me genre.&lt;/p&gt; &lt;p&gt;Nous tombons parfois, pour nos clients les plus gros, sur des probl&#232;me qui peuvent aller jusqu'&#224; mettre &#224; mal leur performance, et nos comp&#233;tences purement syst&#232;me ne suffisent plus.&lt;/p&gt; &lt;p&gt;Aujourd'hui, je vous propose un exemple simple : comment optimiser une requ&#234;te MySQL complexe et gagner &#233;norm&#233;ment de temps &#224; la g&#233;n&#233;ration d'une page web.&lt;/p&gt; &lt;p&gt;Pour cela, on utilise classiquement la directive EXPLAIN de MySQL, qui permet de demander &#224; MySQL ce qu'il fera quand il ex&#233;cutera une telle requ&#234;te. On l'utilise en ajoutant le mot clef EXPLAIN avant un SELECT.&lt;/p&gt; &lt;p&gt;Prenons un exemple r&#233;el (l&#233;g&#232;rement modifi&#233; pour anonymiser le client) :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;SELECT DISTINCT(F.ref),F.date_creation, CONCAT(P.nom,' ',P.prenom)&lt;br /&gt; FROM client P, formulaire F, suivi S&lt;br /&gt; WHERE P.ref = F.ref&lt;br /&gt; AND F.ref = S.ref&lt;br /&gt; AND S.etat = 1&lt;br /&gt; AND NOW()&gt;=DATE_ADD(F.date_creation, INTERVAL 5 MINUTE)&lt;br /&gt; AND NOW()&lt;=DATE_ADD(F.date_creation,INTERVAL 1 DAY);&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;On remarque que cette requ&#234;te effectue une jointure sur 3 tables, avec un filtrage (WHERE) complexe et un DISTINCT() pour couronner le tout ...&lt;/p&gt; &lt;p&gt;Savoir si cette requ&#234;te utilisera bien les index pr&#233;sents dans la table est complexe. Pour rappel, on met les index d'une table d&#232;s qu'on a l'intention de faire une requ&#234;te utilisant ce champ dans la clause WHERE.&lt;/p&gt; &lt;p&gt;En ajoutant EXPLAIN, on obtient :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;EXPLAIN SELECT DISTINCT(F.ref),F.date_creation, CONCAT(P.nom,' ',P.prenom)&lt;br /&gt; FROM client P, formulaire F, suivi S&lt;br /&gt; WHERE P.ref = F.ref&lt;br /&gt; AND F.ref = S.ref&lt;br /&gt; AND S.etat = 1&lt;br /&gt; AND NOW()&gt;=DATE_ADD(F.date_creation, INTERVAL 5 MINUTE)&lt;br /&gt; AND NOW()&lt;=DATE_ADD(F.date_creation,INTERVAL 1 DAY);&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_113 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.octopuce.fr/local/cache-vignettes/L480xH66/cap1-13e2c.png' width='480' height='66' alt=&quot;&quot; style='height:66px;width:480px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;MySQL nous dit ainsi, pour chaque &#233;l&#233;ment du WHERE (ou le distinct ici) quel index il pourrait utiliser (possible_keys) et quels index il utilise effectivement (key).
Ce faisant, il nous d&#233;duit (dans rows) le nombre de ligne qu'il devra scanner pour cette requ&#234;te est de 500 000 !
Le temps d'une telle requ&#234;te est, sur un serveur optimis&#233;, de 2.3 secondes...&lt;/p&gt; &lt;p&gt;On voit donc une chose int&#233;ressante : dans cette partie du WHERE :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;AND NOW()&gt;=DATE_ADD(F.date_creation, INTERVAL 5 MINUTE)&lt;br /&gt; AND NOW()&lt;=DATE_ADD(F.date_creation,INTERVAL 1 DAY);&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;nous utilisons le champ F.date_creation. Or ce champs a bien un index comme nous le montre&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;SHOW CREATE TABLE formulaire;&lt;br /&gt; ...&lt;br /&gt; PRIMARY KEY (`ref`),&lt;br /&gt; KEY `date_creation` (`date_creation`),&lt;br /&gt; ...&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Alors pourquoi MySQL n'utilise pas cet index ? Tout simplement parce que dans la requ&#234;te, on passe ce champ &#224; travers une fonction (ici DATE_ADD), l'index ne peut donc pas &#234;tre utilis&#233;, puisqu'on ne cherche pas une valeur ou un plage de valeur pr&#233;cise de ce champ !&lt;/p&gt; &lt;p&gt;On peut donc essayer de permettre &#224; MySQL d'utiliser cet index en inversant la condition :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;AND NOW()&gt;=DATE_ADD(F.date_creation, INTERVAL 5 MINUTE)&lt;br /&gt; AND NOW()&lt;=DATE_ADD(F.date_creation,INTERVAL 1 DAY);&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;devient alors&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;AND DATE_SUB(NOW(), INTERVAL 5 MINUTE)&gt;=F.date_creation &lt;br /&gt; AND DATE_SUB(NOW(),INTERVAL 1 DAY)&lt;=F.date_creation;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;et EXPLAIN de notre SELECT nous retourne d&#233;sormais :&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_114 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.octopuce.fr/local/cache-vignettes/L480xH61/cap2-7d758.png' width='480' height='61' alt=&quot;&quot; style='height:61px;width:480px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Et la dur&#233;e de la requ&#234;te tombe &#224; 0.02 secondes !&lt;/p&gt; &lt;p&gt;La r&#232;gle &#224; suivre est donc :&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Dans la mesure du possible, toujours &#233;viter les appels de fonctions portant sur un champ, si on peut mettre l'appel de fonction de l'autre c&#244;t&#233; du test&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Par ailleurs, il est parfois utile d'inverser l'appel de fonction m&#234;me si on a un champ des deux c&#244;t&#233;s :&lt;/p&gt; &lt;p&gt;si on a un&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt; DATE_SUB(t1.date_creation, INTERVAL 7 DAY) &lt;= t2.date_creation&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;on peut essayer de le remplacer par&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt; t1.date_creation &lt;= DATE_ADD(t2.date_creation, INTERVAL 7 DAY)&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Cela peut s'av&#233;rer utile si la cr&#233;ation d'un index sur t1.date_creation serait trop co&#251;teuse (grosse table, ou table souvent modifi&#233;e) ou si un index existe d&#233;j&#224; pour t2.date_creation, ou encore si la cardinalit&#233; de t1 est plus forte que celle de t2 !&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Javascript : le futur du web ?</title>
		<link>http://www.octopuce.fr/Javascript-le-futur-du-web</link>
		<guid isPermaLink="true">http://www.octopuce.fr/Javascript-le-futur-du-web</guid>
		<dc:date>2012-12-06T16:22:54Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Alban Crommer</dc:creator>



		<description>&lt;p&gt;Aper&#231;u des solutions javascript modernes permettant de r&#233;aliser des applications web.&lt;/p&gt;

-
&lt;a href="http://www.octopuce.fr/-OctoBlog-" rel="directory"&gt;70. OctoBlog&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;h2&gt;Javascript est le langage de programmation dominant en 2012&lt;/h2&gt;
&lt;a href=&quot;http://crommer.fr/wp-content/uploads/2012/11/github-langages-2012.png&quot;&gt;
&lt;span class='spip_document_112 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.octopuce.fr/local/cache-vignettes/L500xH203/github-langages-2012-398c1.png' width='500' height='203' alt=&quot;&quot; style='height:203px;width:500px;' /&gt;&lt;/span&gt;
Ce graphique est une copie des &lt;a href=&quot;https://github.com/languages/ &quot;&gt;stats&lt;/a&gt; de Github concernant les projets h&#233;berg&#233;s. Tous les projets ne sont pas int&#233;gralement bas&#233;s sur Javascript et Github n'est qu'une partie infime de l'informatique r&#233;ellement d&#233;ploy&#233;e. Mais. C'est le sympt&#244;me d'une &#233;volution certaine. DHTML, AJAX, WEB 2.0, jQuery et maintenant NodeJS. Aussi trollesque que soit mon accroche, Javascript sera un &#233;l&#233;ment majeur de la prochaine g&#233;n&#233;ration de logiciels.
&lt;p&gt;L'autre jour &lt;a href=&quot;http://benjamin.sonntag.fr/&quot;&gt;on&lt;/a&gt; comparait PHP et JS. M&#234;me mauvaise r&#233;putation aupr&#232;s des vrais programmeurs mais malgr&#233; &lt;a href=&quot;http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/&quot;&gt;des&lt;/a&gt; &lt;a href=&quot;http://webonastick.com/php.html&quot;&gt;d&#233;fauts&lt;/a&gt; &lt;a href=&quot;http://www.codinghorror.com/blog/2012/06/the-php-singularity.html&quot;&gt;reconnus&lt;/a&gt; PHP est devenu le langage web le plus r&#233;pandu. Il est pass&#233; du script de template &#224; un langage de frameworks MVC &quot;s&#233;rieux&quot; (Zend, CodeIgniter, Symfony), un facteur de r&#233;ussite parmi d'autres dont l'existence d'une aide fournissant une abondance de snippets &#224; copier/coller ; sa symbiose avec Apache HTTPD et MySQL appr&#233;ci&#233;s par les administrateurs syst&#232;me ; une gestion des modules assez limit&#233;e qui &#233;vite de partir dans un mod&#232;le diffus &#224; la CPAN ; et il faut bien le dire une instance centrale contr&#244;lant le d&#233;veloppement du langage.&lt;/p&gt; &lt;p&gt;Tandis que de l'autre c&#244;t&#233; JS n'avait pas d'aide centralis&#233;e, &#233;tait d&#233;pendant des impl&#233;mentations des diff&#233;rents &#233;diteurs de navigateurs, avec des m&#233;thodes pourries pour faire marcher le m&#234;me code partout, sans parler des lenteurs. D'o&#249; longtemps un truc pas excitant. Et avec des &lt;a&gt;d&#233;fauts structurels &#233;vidents&lt;/a&gt; toujours &lt;a href=&quot;http://wtfjs.com/&quot;&gt; renouvel&#233;s&lt;/a&gt;. Aujourd'hui, une interface sans JS, c'est d&#233;pass&#233;, on fait tout en AJAX, et du coup on se retrouve &#224; devoir impl&#233;menter les m&#234;mes mod&#232;les en JS et en PHP (ou autre). Ce qui est idiot parce qu'on &#233;crit tout en double et que les bugs ne peuvent que se multiplier.&lt;/p&gt;
&lt;h2&gt;Javascript un langage &quot;s&#233;rieux&quot; c&#244;t&#233; serveur ?&lt;/h2&gt;
La premi&#232;re fois que j'ai entendu parler de NodeJS, j'ai eu du mal &#224; croire qu'on veuille faire tourner du Javascript c&#244;t&#233; serveur. Je suis vraiment devenu un vieux con s&#233;rieux, non ? Le plus serait en dehors de la r&#233;duction du code que &#231;a mette les donn&#233;es au centre de l'application avec une forme d'ORM et de synchro automatique. Mais &#231;a n'a de sens qu'&#224; condition de disposer de frameworks permettant de conserver les b&#233;n&#233;fices actuels.
&lt;p&gt;&lt;strong&gt;S&#233;curit&#233;&lt;/strong&gt; Filtrage des donn&#233;es, S&#233;curisation des acc&#232;s, Gestion des ACLs&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Stabilit&#233;&lt;/strong&gt; Application serveur robuste, pas de DOS, des scripts interd&#233;pendants sans compilation&lt;/p&gt; &lt;p&gt;&lt;strong&gt;D&#233;ployabilit&#233; &lt;/strong&gt;Simplicit&#233; d'installation, Interd&#233;pendance des applications au sein d'un serveur&lt;/p&gt; &lt;p&gt;Qu'en est-il ? Wikipedia fait une &lt;a href=&quot;http://en.wikipedia.org/wiki/Comparison_of_server-side_JavaScript_solutions&quot;&gt;comparaison&lt;/a&gt; de solutions existantes et j'ai de mon c&#244;t&#233; relev&#233; celles-ci en attendant de les tester&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://nodejs.org/&quot;&gt;NodeJS&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Nodejs&quot;&gt;(Sa fiche sur Wikipedia&lt;/a&gt;)
Node est un serveur (et pas un framework) encore jeune et &#233;voluant rapidement. Du point de vue s&#233;curit&#233;, si je crains le &lt;a href=&quot;http://bishankochher.blogspot.fr/2011/12/nodejs-security-good-bad-and-ugly.html&quot;&gt;pire&lt;/a&gt;, les buffer overflows sont pour tout le monde ;). Pour la stabilit&#233; il faut relancer chaque application &#224; la main en cas de plantage du serveur, donc m&#233;diocre. Et sur l'aspect d&#233;ploiement il semble que ce soit plus infernal qu'autre chose &#224; l'heure actuelle c&#244;t&#233; serveur pour l'administrateur Linux. L'argument de Node est d'&#234;tre plus rapide et plus &quot;scalable&quot;. &lt;a href=&quot;http://blog.nelhage.com/2012/03/why-node-js-is-cool/&quot;&gt;A voir&lt;/a&gt;. Une fois Node install&#233;, il faut choisir ses outils de d&#233;veloppement, et l&#224; &#231;a se complique.&lt;/p&gt;
&lt;h3&gt;Quelques frameworks Node&lt;/h3&gt;
&lt;a href=&quot;http://geddyjs.org/&quot;&gt;Geddy&lt;/a&gt;, &lt;a href=&quot;http://expressjs.com/&quot;&gt;Express&lt;/a&gt; et son parent &lt;a href=&quot;http://www.senchalabs.org/connect/&quot;&gt;Connect,&lt;/a&gt; &lt;a href=&quot;http://flatironjs.org/&quot;&gt;Flatiron&lt;/a&gt; ... il est clair les &lt;a href=&quot;http://webdevrefinery.com/forums/topic/7867-the-simple-guide-to-nodejs-frameworks-and-libraries/&quot;&gt;Frameworks Node&lt;/a&gt; &lt;a href=&quot;http://ocdevel.com/blog/nodejs-frameworks-comparison&quot;&gt;ne manquent pas&lt;/a&gt;, sans compter les modules du &lt;a href=&quot;https://npmjs.org/&quot;&gt;NPM&lt;/a&gt; qui permettent de recomposer son propre stack en fonction de ses besoins. Aper&#231;u de quelques .
&lt;p&gt;&lt;strong&gt;Connect&lt;/strong&gt; est le premier framework Node ayant &quot;d&#233;coll&#233;&quot;. Il met &#224; disposition un grand nombre de fonctionnalit&#233;s essentielles et dispose de nombreux &lt;a href=&quot;https://github.com/senchalabs/connect/wiki&quot;&gt;composants additionnels&lt;/a&gt;. Au niveau s&#233;curit&#233;, il met &#224; disposition un nombre minimal d'objets ( csrf par exemple ) mais la validation requiert des &#233;l&#233;ments suppl&#233;mentaires.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Express&lt;/strong&gt; : bas&#233; sur Connect, Express offre une gestion facilit&#233;e en MVC. Au niveau s&#233;curit&#233; des entr&#233;es / sorties il am&#233;liore certes Express mais pas tant que &#231;a.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Geddy&lt;/strong&gt; : est une version plus compl&#232;te, avec une s&#233;curit&#233; am&#233;lior&#233;e, une gestion du scaffolding en ligne de commande et de l'ORM. &#201;galement bas&#233; sur Express il adopte le mod&#232;le MVC avec validateurs et gestion des vues. Il peut travailler avec plusieurs backends SQL &amp; noSQL. Il semble que &lt;a href=&quot;http://railwayjs.com/&quot;&gt;RailwayJS&lt;/a&gt; qui a pour objectif d'introduire les id&#233;es de Rails dans Node soit assez proche et bien pens&#233;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Flatiron&lt;/strong&gt; est (encore) une autre solution qui combine plusieurs modules pour fournir les services de base attendus d'un framework MVC comme le routage, les logs, la gestion du backend et des vues. Son argument est identique &#224; celui des autres projets : simple, &quot;non-obstrusif&quot;, l&#233;ger.&lt;/p&gt; &lt;p&gt;D'autres solutions existent pour Node (&lt;a href=&quot;http://obvious.github.com/matador/&quot;&gt;Matador&lt;/a&gt;, &lt;a href=&quot;https://github.com/runexec/Monorail.js&quot;&gt;Monorail&lt;/a&gt;, &lt;a href=&quot;https://github.com/tuxychandru/grasshopper&quot;&gt;Grasshoper&lt;/a&gt; ... ) qui se fondent toutes sur ces m&#234;mes arguments et il faut bien l'avouer, de loin ont un air de ressemblance assez marqu&#233; ;).&lt;/p&gt;
&lt;h2&gt;Et en dehors de Node ? Backbone &amp; co.&lt;/h2&gt;
NodeJS appara&#238;t comme une bo&#238;te &#224; outils avec un gestionnaire npm &lt;a href=&quot;http://blog.izs.me/post/1675072029/10-cool-things-you-probably-didnt-realize-npm-could-do&quot;&gt;int&#233;ressant&lt;/a&gt; mais d'autres approches existent, dont un certain nombre ex&#233;cutent le routage de l'application c&#244;t&#233; client, en gros en limitant au maximum les &#233;changes entre le serveur et l'application &#224; des appels d'API sans html. Ce qui entre autre laisse entrevoir des possibilit&#233;s importantes concernant l'utilisation offline et le &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_Storage&quot;&gt;stockage en local&lt;/a&gt;.
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://backbonejs.org/&quot;&gt;BackboneJS&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;http://en.wikipedia.org/wiki/Backbonejs&quot;&gt;page wikipedia&lt;/a&gt;) est une r&#233;f&#233;rence autant que Node peut l'&#234;tre. Comment marche Backbone ? Dit simplement, il met &#224; disposition du navigateur tout ce qui est n&#233;cessaire pour transformer les donn&#233;es brutes re&#231;ues du serveur, les modifier et les renvoyer. Il s'appuie notamment sur la dimension prototypique de javascript pour les objets autorisant leur modification &#224; chaud (ie.&lt;a href=&quot;http://en.wikipedia.org/wiki/Monkey_patch&quot;&gt; Monkey Patching&lt;/a&gt; et &lt;a href=&quot;http://en.wikipedia.org/wiki/Duck_typing&quot;&gt;Duck Typing&lt;/a&gt;). Backbone est notamment r&#233;put&#233; pour son efficacit&#233; en tant que client mobile universel : &#224; la fois l&#233;ger en terme de code et d'&#233;changes r&#233;seau, il s'adapte bien &#224; tous les syst&#232;mes. Exemple : &lt;a href=&quot;http://backstage.soundcloud.com/2012/06/building-the-next-soundcloud/&quot;&gt;Soundcloud&lt;/a&gt; l'a utilis&#233; pour son client mobile et d&#233;sormais va l'utiliser &lt;a href=&quot;http://next.soundcloud.com/&quot;&gt;partout&lt;/a&gt;. Une fois encore, l'argument de l&#233;g&#232;ret&#233;, d'interd&#233;pendance et de simplicit&#233; est r&#233;current : Backbone n'a qu'une seule d&#233;pendance (&lt;a href=&quot;http://underscorejs.org/&quot;&gt;UnderscoreJS&lt;/a&gt;) et laisse le choix des outils de template par exemple.&lt;/p&gt; &lt;p&gt;Et alors, c&#244;t&#233; serveur ? Pour en revenir aux crit&#232;res de d&#233;part, la s&#233;curit&#233; par validation est limit&#233;e et bon nombre de choses ne sont pas fournies. La stabilit&#233; est plut&#244;t bonne avec un minimum de ressources c&#244;t&#233; serveur . Backbone &#233;changeant directement des objects en JSON, la solution &quot;naturelle&quot; consiste &#224; stocker les donn&#233;es dans une base NoSQL comme MongoDB en utilisant les m&#234;mes objets pour la validation. Mais on pourrait aussi faire un backend dans un autre langage (genre &lt;a href=&quot;http://stackoverflow.com/questions/6854252/sync-backbone-js-to-php-mysql&quot;&gt;PHP MyQL&lt;/a&gt;). Idem pour le d&#233;ploiement, il peut &#234;tre de fait minimal.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://emberjs.com/&quot;&gt;EmberJS&lt;/a&gt; &lt;/strong&gt;est une solution plus r&#233;cente qui se base sur le mod&#232;le de Backbone en ajoutant notamment une automatisation des changements d'apparence reli&#233;e aux flux de donn&#233;es. Si elle offre plus de fonctionnalit&#233;s c'est au &lt;a href=&quot;http://lostechies.com/derickbailey/2012/02/21/emberjs-initial-impressions-compared-to-backbone/&quot;&gt;d&#233;triment de la simplicit&#233;&lt;/a&gt;. &lt;a href=&quot;http://smus.com/backbone-and-ember/&quot;&gt;http://smus.com/backbone-and-ember/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://spinejs.com/&quot;&gt;SpineJS&lt;/a&gt;&lt;/strong&gt; dans cette lign&#233;e est tr&#232;s complet : MVC, ORM, &#233;changes asynchrone, relation directe entre affichage et donn&#233;es, stockage navigateur, version Mobile : pas grand-chose &#224; demander de plus. C'est un framework encore jeune mais prometteur.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sencha.com/extjs&quot;&gt;ExtJS&lt;/a&gt;&lt;/strong&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Extjs&quot;&gt;page wiki&lt;/a&gt; a connu plusieurs it&#233;rations. Il se pr&#233;sente comme une solution plus lourde offrant traditionellement une palette de composants. Il offre d&#233;sormais en plus du MVC, une interface RestFul et des m&#233;thodes de g&#233;n&#233;rations de graphiques. Dans l'ensemble orient&#233; vers l'application &quot;Desktop&quot; il manque certaines fonctionnalit&#233;s importantes comme la validation de donn&#233;es. De m&#234;me &lt;a href=&quot;http://extjs-orm.svn.sourceforge.net/&quot;&gt;l'ORM&lt;/a&gt; est disponible mais sous forme de plugin externe.&lt;/p&gt; &lt;p&gt;Il y en a d'autres, cette &lt;a href=&quot;http://codebrief.com/2012/01/the-top-10-javascript-mvc-frameworks-reviewed/&quot;&gt;liste&lt;/a&gt; (en anglais) donne les avantages et inconv&#233;nients. Un point int&#233;ressant concerne notamment la simplicit&#233; du &quot;data binding&quot;, en d'autres mots la mise en relation entre &#233;l&#233;ments de l'interface et sources de donn&#233;es dans les vues pour parvenir &#224; des mises &#224; jour automatiques. En l'occurence si certaines formes sont un peu laborieuses comme dans &lt;a href=&quot;http://knockoutjs.com/&quot;&gt;Knockout&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class='spip_code' dir='ltr'&gt;&lt;p&gt;First name: &lt;strong data-bind=&quot;text: firstName&quot;&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
Dans Ember en revanche on d&#233;clare les bindings directement dans l'objet
&lt;pre&gt;&lt;code class='spip_code' dir='ltr'&gt;... &lt;/code&gt;attributeBindings : ['data','value','format','readonly','type','size'], ...&lt;/pre&gt;
Ce qui est effectivement beaucoup plus l&#233;ger et centralis&#233;.
&lt;h3&gt;Automatisation des relations entre donn&#233;es et objets&lt;/h3&gt;
Un des principes directeurs des diff&#233;rentes solutions &#233;voqu&#233;es, en tout cas parmi les plus avanc&#233;es, consiste &#224; simplifier au maximum le travail du d&#233;veloppeur gr&#226;ce &#224; une d&#233;finition des objets permettant &#224; la fois leur manipulation, leur affichage, leur validation et leur stockage. Soit &#224; mon sens une continuation des m&#233;thodes d'ORM/scaffolding utilis&#233;es notamment par Django ou Rails. C'est &#224; mon sens une direction int&#233;ressante ; la derni&#232;re application PHP que j'ai test&#233; dans ce domaine est &lt;a href=&quot;http://www.pimcore.org/&quot;&gt;PimCore&lt;/a&gt; qui s'appuie sur ExtJS pour proposer une ORM qui g&#233;n&#232;re des fichiers de classes modifiables et des tables de bases de donn&#233;es tout en pr&#233;sentant graphiquement les champs comme des composants de formulaire, avec la possibilit&#233; de modifier son mod&#232;le en fonction des besoins. Pour la plupart des interfaces de gestion c'est une solution int&#233;ressante, rapide et souple.
&lt;p&gt;Autre paradigme int&#233;ressant, l'&#233;change direct d'objets s&#233;rialis&#233;s entre frontend et backend, qui justifie pleinement l'emploi de bases de donn&#233;es orient&#233;es document pour y stocker les objets json. Les probl&#232;mes d'indexation que connaissent ces bases sont connus mais &#224; l'avenir ce genre de technique devrait largement justifier leur utilisation.&lt;/p&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
Premi&#232;re conclusion &#233;vidente, il y a une diversit&#233; de solutions qui r&#233;pondent &#224; des moyens et des besoins (taille du projet, temps de d&#233;ploiement) diff&#233;rents. En l'&#233;tat il n'y a pas de solution qui se d&#233;gage absolument mais un paysage contrast&#233; et &#233;voluant rapidement.
&lt;p&gt;Les b&#233;n&#233;fices potentiels qu'apportent les nouvelles solutions, dont il faut bien observer qu'elles reviennent &#224; faire du Flash en HTML5, vont par n&#233;cessit&#233; devenir la norme des applications webs haut de gamme et &#233;volu&#233;es, tant elles peuvent avoir des attraits importants pour les utilisateurs en terme de confort et de portabilit&#233;.&lt;/p&gt; &lt;p&gt;Ensuite, il appara&#238;t que certaines sont relativement faciles &#224; d&#233;ployer dans un environnement Linux du fait de leur ex&#233;cution c&#244;t&#233; client, bien qu'&#224; terme pouvoir ex&#233;cuter du code JS c&#244;t&#233; serveur soit d&#233;terminant dans l'optique de &lt;a href=&quot;http://blog.nodejitsu.com/scaling-isomorphic-javascript-code&quot;&gt;l'isomorphisme&lt;/a&gt; du code (ie. mod&#232;les identiques des deux c&#244;t&#233;s), permettant de b&#233;n&#233;ficier au maximum de javascript.&lt;/p&gt; &lt;p&gt;Dans la mesure o&#249; l'on peut utiliser des backends solides on peut tout &#224; fait utiliser ces techniques pour r&#233;aliser des applications web de gestion &quot;s&#233;rieuses&quot; qui resteront n&#233;anmoins co&#251;teuses &#224; produire.&lt;/p&gt; &lt;p&gt;Il appara&#238;t aussi que NodeJS et nombre de ces solutions soient utilis&#233;s pour des applications &#224; forte demande. Ce qui est assez amusant tant l'&#233;vocation de cette id&#233;e tend &#224; faire fuir imm&#233;diatement un administrateur syst&#232;me traditionnel :)&lt;/p&gt;
&lt;h2&gt;TL ;DR&lt;/h2&gt;
&lt;strong&gt;Wooh !&lt;/strong&gt; new JS code is awesome ! But... Hey guys did you know... that ummm... Your apps ? They need to deploy everywhere and be safe !&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Octopuce &#224; Metz (Libre et Entreprises)</title>
		<link>http://www.octopuce.fr/Octopuce-a-Metz-Libre-et</link>
		<guid isPermaLink="true">http://www.octopuce.fr/Octopuce-a-Metz-Libre-et</guid>
		<dc:date>2011-10-23T08:18:47Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Chantal Bernard-Putz</dc:creator>



		<description>&lt;p&gt;Octopuce sera pr&#233;sent &#224; la journ&#233;e &quot;Entreprises et Logiciels Libres&quot; organis&#233;e par Moselle Num&#233;rique, le 28 octobre 2011.&lt;/p&gt;

-
&lt;a href="http://www.octopuce.fr/-OctoBlog-" rel="directory"&gt;70. OctoBlog&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Octopuce sera pr&#233;sent &#224; la journ&#233;e &quot;Entreprises et Logiciels Libres&quot; organis&#233;e par Moselle Num&#233;rique, le 28 octobre 2011.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Notre entreprise &lt;strong&gt;Octopuce&lt;/strong&gt; sera pr&#233;sente &#224; la journ&#233;e &quot;&lt;strong&gt;Entreprises et Logiciels Libres&lt;/strong&gt;&quot; organis&#233;e &#224; &lt;strong&gt;Metz&lt;/strong&gt; par &lt;a href=&quot;http://www.espacemosellenumerique.fr/joomla1.5/index.php?option=com_seminar&amp;Itemid=9&quot; class='spip_out' rel='external'&gt;Moselle Num&#233;rique&lt;/a&gt;, le 28 octobre 2011.&lt;/p&gt; &lt;p&gt;Chantal Bernard-Putz animera &lt;strong&gt;deux &#233;change&lt;/strong&gt;s :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; Les logiciels libres : leur place (quels domaines ? quels usages ?) dans les entreprises. Leurs avantages dans un environnement professionnel. Pourquoi, &#224; qualit&#233; &#233;gale opter pour le libre ?&lt;/li&gt;&lt;li&gt; Comment et o&#249; puis-je trouver de l'information sur le libre et me faire aider pour le d&#233;ploiement dans mon entreprise (en collaboration avec les acteurs du Libre de &lt;a href=&quot;Http://www.lorlibre.org/&quot; class='spip_out'&gt;Lorlibre&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Elle animera &#233;galement &lt;strong&gt;un atelier&lt;/strong&gt; :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; Authentifier et chiffrer ses &#233;changes sur internet avec des outils libres et l&#233;gaux&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Et pr&#233;sentera nos offres sur un stand, toute la journ&#233;e.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://www.octopuce.fr/IMG/pdf/ProgrammeJourneeLL.pdf&quot; class='spip_in' type='application/pdf'&gt;T&#233;l&#233;charger le programme de la journ&#233;e&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_110 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.octopuce.fr/local/cache-vignettes/L480xH121/moselle-bdade.jpg' width='480' height='121' alt=&quot;&quot; style='height:121px;width:480px;' /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="http://www.octopuce.fr/IMG/pdf/ProgrammeJourneeLL.pdf" length="159649" type="application/pdf" />
		

	</item>
<item xml:lang="fr">
		<title>Comment utiliser les hooks de GIT pour mettre &#224; jour automatiquement un site de d&#233;veloppement</title>
		<link>http://www.octopuce.fr/Comment-utiliser-les-hooks-de-GIT-pour-mettre-a-jour</link>
		<guid isPermaLink="true">http://www.octopuce.fr/Comment-utiliser-les-hooks-de-GIT-pour-mettre-a-jour</guid>
		<dc:date>2011-01-19T17:50:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Benjamin Sonntag</dc:creator>



		<description>Apr&#232;s avoir vu comment utiliser Gitosis sur un serveur pour y centraliser ses d&#233;p&#244;ts de source pour vos projets, nous allons voir comment mettre &#224; jour automatiquement votre serveur de d&#233;veloppement via les hooks de Git. En effet, il nous est souvent demand&#233; de pouvoir mettre &#224; jour automatiquement les sources de la version de d&#233;veloppement &#224; chaque push d'un d&#233;veloppeur. Pour cela, nous allons utiliser 2 outils tr&#232;s utiles : sudo (qui permet &#224; Git de se faire passer pour votre compte web) et les (...)

-
&lt;a href="http://www.octopuce.fr/-OctoBlog-" rel="directory"&gt;70. OctoBlog&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Apr&#232;s avoir vu comment &lt;a href=&quot;http://www.octopuce.fr/Hebergement-de-depots-GIT-sur-un-serveur-via-Gitosis&quot; class='spip_in'&gt;utiliser Gitosis sur un serveur pour y centraliser ses d&#233;p&#244;ts de source&lt;/a&gt; pour vos projets, nous allons voir comment mettre &#224; jour automatiquement votre serveur de d&#233;veloppement via les hooks de Git.&lt;/p&gt; &lt;p&gt;En effet, il nous est souvent demand&#233; de pouvoir mettre &#224; jour automatiquement les sources de la version de d&#233;veloppement &#224; chaque push d'un d&#233;veloppeur. Pour cela, nous allons utiliser 2 outils tr&#232;s utiles : &lt;strong&gt;sudo&lt;/strong&gt; (qui permet &#224; Git de se faire passer pour votre compte web) et les &lt;strong&gt;hooks&lt;/strong&gt; de Git (qui permettent de d&#233;clencher une action &#224; chaque push.)&lt;/p&gt; &lt;p&gt;Pour cela, on proc&#232;de ainsi :&lt;/p&gt; &lt;p&gt;Cr&#233;er un script /usr/local/bin/pullhere comme suit :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;#!/bin/sh&lt;br /&gt; cd &quot;$1&quot; &lt;br /&gt; git pull&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;rendez-le ex&#233;cutable via&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;chmod a+x /usr/local/bin/pullhere&lt;/code&gt;&lt;/p&gt; &lt;p&gt;modifier sudo pour permettre &#224; l'utilisateur de gitosis d'utiliser cette commande en tant que www-data.&lt;/p&gt; &lt;p&gt;Pour cela, en lan&#231;ant &quot;visudo&quot; ajoutez la ligne :&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;git ALL = (www-data) NOPASSWD: /usr/local/bin/pullhere&lt;/code&gt;&lt;/p&gt; &lt;p&gt;ensuite, dans chaque d&#233;pot o&#249; cela est n&#233;cessaire, ajoutez le hook suivant dans un fichier post-receive :&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;sudo -u www-data /usr/local/bin/pullhere /html/u/user/here&lt;/code&gt;&lt;/p&gt; &lt;p&gt;par exemple : dans /home/git/repositories/projet1.git/hooks/post-receive&lt;/p&gt; &lt;p&gt;&lt;strong&gt;attention :&lt;/strong&gt;&lt;i&gt; ce dossier (hooks) contient un exemple nomm&#233; &quot;post-receive.sample&quot; ce n'est pas ici qu'il faut cr&#233;er votre ligne sudo, mais bien dans post-receive tout court (cr&#233;ez-le si besoin)&lt;/i&gt;&lt;/p&gt; &lt;p&gt;Enfin, rendez ce fichier ex&#233;cutable comme suit :&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;chmod a+x /home/git/repositories/projet1.git/hooks/post-receive&lt;/code&gt;&lt;/p&gt; &lt;p&gt;ainsi, &#224; chaque fois qu'un utilisateur effectuera un push sur ce d&#233;p&#244;t git dans gitosis, un pull sera automatiquement effectu&#233; dans le dossier web de votre site de d&#233;veloppement.&lt;/p&gt; &lt;p&gt;Derni&#232;re &#233;tape, il faut effectuer le clonage de votre git &#224; l'endroit du site de d&#233;veloppement (ici /html/u/user/here) pour cela, on proc&#232;de ainsi :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;cd /html/u/user/here&lt;br /&gt; git clone /home/git/repositories/projet1.git&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>H&#233;bergement de d&#233;p&#244;ts GIT sur un serveur via Gitosis</title>
		<link>http://www.octopuce.fr/Hebergement-de-depots-GIT-sur-un-serveur-via-Gitosis</link>
		<guid isPermaLink="true">http://www.octopuce.fr/Hebergement-de-depots-GIT-sur-un-serveur-via-Gitosis</guid>
		<dc:date>2011-01-18T10:48:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Benjamin Sonntag</dc:creator>



		<description>Octopuce h&#233;bergeant de nombreuses agences web, leurs clients et les projets de d&#233;veloppement de tout ce petit monde, il nous est souvent demand&#233; d'installer des syst&#232;mes de contr&#244;le de version. Nous utilisions jusque l&#224; subversion (svn) mais certains de nos clients utilisent maintenant GIT, le nouveau syst&#232;me de gestion de source distribu&#233;, visiblement plus l&#233;ger et rapide que svn. Nous avons donc d&#251; nous poser la question de l'h&#233;bergement de ces d&#233;p&#244;ts GIT. Rapidement, nous sommes tomb&#233;s sur le (...)

-
&lt;a href="http://www.octopuce.fr/-OctoBlog-" rel="directory"&gt;70. OctoBlog&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Octopuce h&#233;bergeant de nombreuses agences web, leurs clients et les projets de d&#233;veloppement de tout ce petit monde, il nous est souvent demand&#233; d'installer des syst&#232;mes de contr&#244;le de version.&lt;/p&gt; &lt;p&gt;Nous utilisions jusque l&#224; subversion (svn) mais certains de nos clients utilisent maintenant GIT, le nouveau syst&#232;me de gestion de source distribu&#233;, visiblement plus l&#233;ger et rapide que svn.&lt;/p&gt; &lt;p&gt;Nous avons donc d&#251; nous poser la question de l'h&#233;bergement de ces d&#233;p&#244;ts GIT. Rapidement, nous sommes tomb&#233;s sur le logiciel &lt;a href=&quot;http://eagain.net/gitweb/?p=gitosis.git&quot; class='spip_out' rel='external'&gt;Gitosis&lt;/a&gt;, qui permet de g&#233;rer facilement ses d&#233;p&#244;ts git avec un acc&#232;s SSH, mais sans n&#233;cessit&#233; de disposer d'un acc&#232;s shell au serveur !&lt;/p&gt; &lt;p&gt;Voici donc comment utiliser gitosis sous Debian pour cr&#233;er des d&#233;p&#244;ts&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;Gitosis, mode d'emploi&lt;/h3&gt;
&lt;p&gt;gitosis est facile &#224; utiliser notamment par le fait qu'un package pour Debian existe, qui nous pose les 3 questions n&#233;cessaires au bon fonctionnement de gitosis : le nom du compte de gitosis (je conseille &quot;git&quot;, court est explicite), le chemin dans lequel on stockera les sources (je conseille /home/git) et la premi&#232;re cl&#233; qui sera autoris&#233;e &#224; utiliser le d&#233;p&#244;t principal. Donc pour l'installer, il faut lancer sur le serveur de sources :&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;aptitude install gitosis git-core&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Un d&#233;p&#244;t &quot;principal&quot;, nomm&#233; &quot;gitosis-admin.git&quot;, permet d'administrer les droits d'acc&#232;s aux d&#233;p&#244;ts sur le serveur. En effet, c'est via un d&#233;p&#244;t GIT que Gitosis g&#232;re la liste des cl&#233;s autoris&#233;es et la liste des autorisations d'acc&#232;s en lecture ou en &#233;criture aux d&#233;p&#244;ts.&lt;/p&gt; &lt;p&gt;Une fois gitosis install&#233; (avec votre cl&#233; ssh personnelle) utilisez la commande suivante pour obtenir une copie locale du d&#233;p&#244;t gitosis-admin :&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;git clone git@votreserveur.fr:gitosis-admin.git&lt;/code&gt;&lt;/p&gt; &lt;p&gt;vous obtiendrez un dossier gitosis-admin/ contenant un fichier gitosis.conf (dans lequel on d&#233;finit les droits d'acc&#232;s aux d&#233;p&#244;ts pour chaque liste d'utilisateur) et un dossier keydir/ dans lequel on cr&#233;era un fichier au nom d'un utilisateur contenant la cl&#233; SSH publique de cet utilisateur.&lt;/p&gt; &lt;p&gt;Une fois cela fait, on envoie ces nouveaux fichiers sur le serveur gitosis via&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;git add . &lt;br /&gt; git commit -a -m &quot;ajout clefs et projets&quot;&lt;br /&gt; git push&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Par exemple, j'ai cr&#233;&#233; un groupe &quot;octopuce&quot; dans mon gitosis.conf, dans lequel les utilisateurs (list&#233;s dans la directive &quot;members&quot;) ont droit d'acc&#232;s en &#233;criture (via la directive &quot;writable&quot;) &#224; des d&#233;p&#244;ts particuliers :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;[gitosis]&lt;br /&gt; &lt;br /&gt; [gitosis-octopuce]&lt;br /&gt; writable = gitosis-admin projet1 projet2&lt;br /&gt; members = benjamin said&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;ainsi, dans keydir, j'aurais cr&#233;&#233; les fichiers &quot;benjamin&quot; et &quot;said&quot; contenant les cl&#233;s de Sa&#239;d et Benjamin.&lt;/p&gt; &lt;p&gt;Une fois cela fait, on peut cr&#233;er le d&#233;p&#244;t, par exemple pour le projet1. pour cr&#233;er le d&#233;p&#244;t, sur votre ordinateur, cr&#233;ez vos premiers fichiers source, et tapez :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;# On cr&#233;e le d&#233;p&#244;t local quelque part sur sa station de travail : &lt;br /&gt; mkdir projet1&lt;br /&gt; cd projet1&lt;br /&gt; git init&lt;br /&gt; # On signale &#224; git qu'il sera envoy&#233; sur le serveur :&lt;br /&gt; git remote add origin git@votreserveur.fr:projet1.git&lt;br /&gt; # On lui ajoute les premiers fichiers : &lt;br /&gt; touch README&lt;br /&gt; echo &quot;Premier fichier d'initialisation&quot; &gt; README&lt;br /&gt; git add . &lt;br /&gt; # Que l'on valide : &lt;br /&gt; git commit -am &quot;initialisation du projet1&quot;&lt;br /&gt; # Enfin, on envoie tout cela sur le serveur.&lt;br /&gt; git push origin master:refs/heads/master&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Et voil&#224;, votre premier d&#233;p&#244;t a &#233;t&#233; cr&#233;&#233; sur git.&lt;/p&gt; &lt;p&gt;Dans l'article suivant, nous verrons &lt;a href=&quot;http://www.octopuce.fr/Comment-utiliser-les-hooks-de-GIT-pour-mettre-a-jour&quot; class='spip_in'&gt;comment utiliser les hooks de git pour mettre &#224; jour automatiquement un site de d&#233;veloppement&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>112. Mondomix</title>
		<link>http://www.octopuce.fr/Mondomix</link>
		<guid isPermaLink="true">http://www.octopuce.fr/Mondomix</guid>
		<dc:date>2011-01-11T16:08:42Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Sa&#239;d Boua&#239;ssi</dc:creator>



		<description>Mondomix est un media num&#233;rique d&#233;di&#233; &#224; l'actualit&#233; et &#224; la d&#233;couverte des cultures et musiques du monde entier. Octopuce g&#232;re l'infrastructure d'h&#233;bergement web de ses sites propres (dont le magazine des cultures du monde) et des cr&#233;ations de l'Atelier 144.

-
&lt;a href="http://www.octopuce.fr/-References-" rel="directory"&gt;30. R&#233;f&#233;rences&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.octopuce.fr/local/cache-vignettes/L150xH150/arton71-a2757.jpg&quot; width='150' height='150' style='height:150px;width:150px;' /&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Mondomix est un media num&#233;rique d&#233;di&#233; &#224; l'actualit&#233; et &#224; la d&#233;couverte des cultures et musiques du monde entier. Octopuce g&#232;re l'infrastructure d'h&#233;bergement web de ses sites propres (dont &lt;a href=&quot;http://www.mondomix.com/&quot; class='spip_out' rel='external'&gt;le magazine des cultures du monde&lt;/a&gt;) et des cr&#233;ations de &lt;a href=&quot;http://www.atelier144.com/&quot; class='spip_out' rel='external'&gt;l'Atelier 144&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://www.mondomix.com" class="spip_out"&gt;http://www.mondomix.com&lt;/a&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>110. Price Water House Coopers France</title>
		<link>http://www.octopuce.fr/Price-Water-House-Coopers-France</link>
		<guid isPermaLink="true">http://www.octopuce.fr/Price-Water-House-Coopers-France</guid>
		<dc:date>2011-01-11T15:52:56Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Sa&#239;d Boua&#239;ssi</dc:creator>



		<description>PricewaterhouseCoopers (&#171; PwC &#187;) d&#233;veloppe en France des missions d'audit, d'expertise comptable et de conseil pour des entreprises de toutes tailles, publiques et priv&#233;es. Octopuce est en charge de l'administration syst&#232;me des serveurs Linux de PWC France.

-
&lt;a href="http://www.octopuce.fr/-References-" rel="directory"&gt;30. R&#233;f&#233;rences&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src=&quot;http://www.octopuce.fr/local/cache-vignettes/L150xH27/arton70-e8c28.png&quot; width='150' height='27' style='height:27px;width:150px;' /&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;PricewaterhouseCoopers (&#171; PwC &#187;) d&#233;veloppe en France des missions d'audit, d'expertise comptable et de conseil pour des entreprises de toutes tailles, publiques et priv&#233;es. Octopuce est en charge de l'administration syst&#232;me des serveurs Linux de PWC France.&lt;/p&gt;&lt;/div&gt;
		&lt;div class="hyperlien"&gt;Voir en ligne : &lt;a href="http://www.pwc.fr" class="spip_out"&gt;http://www.pwc.fr&lt;/a&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="en">
		<title>apt-mirror : BADSIG on security.debian.org (with solution)</title>
		<link>http://www.octopuce.fr/apt-mirror-BADSIG-on-security-debian-org-with-solution</link>
		<guid isPermaLink="true">http://www.octopuce.fr/apt-mirror-BADSIG-on-security-debian-org-with-solution</guid>
		<dc:date>2010-11-26T11:08:18Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>en</dc:language>
		<dc:creator>Benjamin Sonntag</dc:creator>



		<description>At Octopuce, we are Debian professional and are using Debian everywhere we can. For one of our customers, we maintained a mirror of Debian repositories, which are used by internal Linux servers. This mirror is using apt-mirror since we cannot access the Internet by rsync or ftp protocol : we have to use http to mirror the repositories. A few days ago, I saw the following error message on a Linux Debian server using this internal mirror : W: GPG error: http://fr-debianmirror (...)

-
&lt;a href="http://www.octopuce.fr/-OctoBlog-" rel="directory"&gt;70. OctoBlog&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;At Octopuce, we are Debian professional and are using Debian everywhere we can. For one of our customers, we maintained a mirror of Debian repositories, which are used by internal Linux servers.&lt;/p&gt; &lt;p&gt;This mirror is using apt-mirror since we cannot access the Internet by rsync or ftp protocol : we have to use http to mirror the repositories.&lt;/p&gt; &lt;p&gt;A few days ago, I saw the following error message on a Linux Debian server using this internal mirror :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt; W: GPG error: http://fr-debianmirror lenny/updates Release: The following signatures were invalid: BADSIG 9AA38DCD55BE302B Debian Archive Automatic Signing Key (5.0/lenny) &lt;ftpmaster@debian.org&gt;&lt;br /&gt; W: You may want to run apt-get update to correct these problems&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;This issue was critical : the GPG signature of debian security repository was incorrect !! There were 3 places were this could happen :&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.octopuce.fr/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; At the Debian repository security.debian.org : I don't think so, or google would have told me ;)
&lt;br /&gt;&lt;img src=&quot;http://www.octopuce.fr/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; During the mirroring process : maybe ...
&lt;br /&gt;&lt;img src=&quot;http://www.octopuce.fr/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; At the final server location : each Debian machine have a GPG keyring of allowed keys for repository signature. The apt-key tool is used to manage this keyring, located at /etc/apt/trusted.gpg and /etc/apt/trustdb.gpg&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;chack apt-key configuration&lt;/h3&gt;
&lt;p&gt;First, check if the command &quot;apt-key list&quot; tell you that the faulty key is allowed. If it is not, you may add it by installing the proper debian package, for example :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt; aptitude install debian-archive-keyring&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;some people in the Internet tell you to use gpg &#8212;keyserver keyserver.fr &#8212;recv-key 0x9AA38DCD55BE302B | apt-key add -&lt;/p&gt; &lt;p&gt;but using the debian package should work &quot;the right way&quot; :)&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;Check the mirror&lt;/h3&gt;
&lt;p&gt;Of course, our Debian servers where properly installed, so we already had the ftpmaster Debian archive GPG key in our servers.&lt;/p&gt; &lt;p&gt;Next step: I checked the faulty file : it was located at /var/spool/apt-mirror/mirror/security.debian.org/debian-security/dists/lenny/updates/Release.gpg&lt;/p&gt; &lt;p&gt;This file should be a GPG signature of the Release file, located in the same directory.&lt;/p&gt; &lt;p&gt;There, I saw this :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;.../debian-security/dists/lenny/updates/$ ls -l&lt;br /&gt; -rw-r--r-- 1 apt-mirror 835 2010-10-20 10:13 Release.gpg&lt;br /&gt; -rw-r--r-- 1 apt-mirror 40K 2010-11-22 21:12 Release&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;And here it looks obvious to me we have a problem: a signature cannot be older than the file it is signing !&lt;/p&gt; &lt;p&gt;In fact, our apt-mirror (which is using wget to download files) is using a proxy server to connect to the officials Debian mirrors. As such, I put the following in /etc/wgetrc :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt; http_proxy = http://10.42.12.12:8080/&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;and here is the problem: this proxy is unable to detect when the release.gpg file has been modified, and as such, he often returns an old version of this file !&lt;/p&gt; &lt;p&gt;To check this theory, I used wget with -S to see the HTTP headers returned by the server and the proxy :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;fr-debianmirror:/tmp# wget http://security.debian.org/debian-security/dists/lenny/updates/Release.gpg -S&lt;br /&gt; --2010-11-26 12:08:43-- http://security.debian.org/debian-security/dists/lenny/updates/Release.gpg&lt;br /&gt; Connecting to 10.42.12.12:8080... connected.&lt;br /&gt; Proxy request sent, awaiting response...&lt;br /&gt; HTTP/1.1 200 OK&lt;br /&gt; Date: Fri, 26 Nov 2010 10:57:06 GMT&lt;br /&gt; Server: Apache&lt;br /&gt; &lt;b&gt;Last-Modified: Mon, 20 Oct 2010 10:13:36 GMT&lt;/b&gt;&lt;br /&gt; ETag: &quot;343-e08fc449a1532&quot;&lt;br /&gt; Accept-Ranges: bytes&lt;br /&gt; Content-Type: text/plain&lt;br /&gt; Content-Length: 835&lt;br /&gt; Connection: close&lt;br /&gt; &lt;b&gt;Age: 855&lt;/b&gt;&lt;br /&gt; Length: 835 [text/plain]&lt;br /&gt; &lt;/code&gt;&lt;/div&gt; &lt;p&gt;the lines in bold are the guilty one : the last modified date is not the right one, and the Age header tells us how old in the proxy cache is this entry.&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;Our solution&lt;/h3&gt;
&lt;p&gt;So, the solution was to tell wget to ask the proxy for a fresh version by using the &#8212;no-cache directive. A better way to use this is to add this line to /etc/wgetrc :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt; cache = off&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;and here we are :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;wget http://security.debian.org/debian-security/dists/lenny/updates/Release.gpg -S&lt;br /&gt; --2010-11-26 12:17:39-- http://security.debian.org/debian-security/dists/lenny/updates/Release.gpg&lt;br /&gt; Connecting to 10.42.12.12:8080... connected.&lt;br /&gt; Proxy request sent, awaiting response...&lt;br /&gt; HTTP/1.1 200 OK&lt;br /&gt; Date: Fri, 26 Nov 2010 11:05:58 GMT&lt;br /&gt; Server: Apache&lt;br /&gt; Last-Modified: Mon, 22 Nov 2010 20:12:36 GMT&lt;br /&gt; ETag: &quot;343-495a9e08a1500&quot;&lt;br /&gt; Accept-Ranges: bytes&lt;br /&gt; Content-Type: text/plain&lt;br /&gt; Content-Length: 835&lt;br /&gt; Connection: close&lt;br /&gt; Age: 0&lt;br /&gt; Length: 835 [text/plain]&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SFTP pour Openssh : comment logguer qui a fait quoi ?</title>
		<link>http://www.octopuce.fr/SFTP-pour-Openssh-comment-logguer-qui-a-fait-quoi</link>
		<guid isPermaLink="true">http://www.octopuce.fr/SFTP-pour-Openssh-comment-logguer-qui-a-fait-quoi</guid>
		<dc:date>2010-08-27T13:49:04Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Benjamin Sonntag</dc:creator>



		<description>Dans la s&#233;rie truc &amp; astuces, nous avons du r&#233;cemment ouvrir des acc&#232;s SFTP &#224; certains de nos clients ou partenaires. &#201;tant tr&#232;s pointilleux sur la s&#233;curit&#233; de nos infrastructures et celle de nos clients, nous avons souhait&#233; pouvoir logguer qui effectuait quel transfert en SFTP sur le serveur correspondant (en plus d'y mettre un chroot...) Or, par d&#233;faut, openssh et son serveur sftp-server ne loggue pas qui transf&#232;re (en lecture, &#233;criture ou effacement) quel fichier. Cependant, depuis la version (...)

-
&lt;a href="http://www.octopuce.fr/-OctoBlog-" rel="directory"&gt;70. OctoBlog&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Dans la s&#233;rie truc &amp; astuces, nous avons du r&#233;cemment ouvrir des acc&#232;s SFTP &#224; certains de nos clients ou partenaires.&lt;/p&gt; &lt;p&gt;&#201;tant tr&#232;s pointilleux sur la s&#233;curit&#233; de nos infrastructures et celle de nos clients, nous avons souhait&#233; pouvoir logguer qui effectuait quel transfert en SFTP sur le serveur correspondant (en plus d'y mettre un chroot...)&lt;/p&gt; &lt;p&gt;Or, par d&#233;faut, openssh et son serveur sftp-server ne loggue pas qui transf&#232;re (en lecture, &#233;criture ou effacement) quel fichier.&lt;/p&gt; &lt;p&gt;Cependant, depuis la version 4.2, sfp-server sait logguer ce type d'action. Pour cela, il suffit de configurer votre sshd comme suit :&lt;/p&gt; &lt;p&gt;La ligne du sftp:&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;Subsystem sftp /usr/lib/openssh/sftp-server &lt;/code&gt;&lt;/div&gt;
&lt;p&gt;doit &#234;tre remplac&#233;e par la ligne ci-dessous :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;Subsystem sftp /usr/lib/openssh/sftp-server -l INFO -f LOCAL0&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Apr&#232;s red&#233;marrage de ssh par /etc/init.d/ssh restart, on obtient, dans /var/log/syslog :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;Aug 27 15:29:15 mg sftp-server[12]: session opened for local user admin from [91.194.61.194]&lt;br /&gt; Aug 27 15:29:15 mg sftp-server[12]: opendir &quot;/home/admin&quot;&lt;br /&gt; Aug 27 15:29:15 mg sftp-server[12]: closedir &quot;/home/admin&quot;&lt;br /&gt; Aug 27 15:29:24 mg sftp-server[12]: open &quot;/home/admin/test.txt&quot; flags READ mode 0666&lt;br /&gt; Aug 27 15:29:24 mg sftp-server[12]: close &quot;/home/admin/test.txt&quot; bytes read 5069 written 0&lt;br /&gt; Aug 27 15:29:31 mg sftp-server[12]: open &quot;/home/admin/test.txt&quot; flags WRITE,CREATE,TRUNCATE,EXCL mode 0666&lt;br /&gt; Aug 27 15:29:31 mg sftp-server[12]: close &quot;/home/admin/test.txt&quot; bytes read 0 written 184&lt;br /&gt; Aug 27 15:29:31 mg sftp-server[12]: set &quot;/home/admin/test.txt&quot; modtime 20100528-12:11:29&lt;br /&gt; Aug 27 15:29:31 mg sftp-server[12]: opendir &quot;/home/admin&quot;&lt;br /&gt; Aug 27 15:29:31 mg sftp-server[12]: closedir &quot;/home/admin&quot;&lt;br /&gt; Aug 27 15:29:34 mg sftp-server[12]: remove name &quot;/home/admin/test.txt&quot;&lt;br /&gt; Aug 27 15:29:34 mg sftp-server[12]: opendir &quot;/home/admin&quot;&lt;br /&gt; Aug 27 15:29:34 mg sftp-server[12]: closedir &quot;/home/admin&quot;&lt;br /&gt; Aug 27 15:29:39 mg sftp-server[12]: session closed for local user admin from [91.194.61.194]&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>IPv6 &#224; Octopuce, une r&#233;alit&#233;</title>
		<link>http://www.octopuce.fr/IPv6-a-Octopuce-une-realite</link>
		<guid isPermaLink="true">http://www.octopuce.fr/IPv6-a-Octopuce-une-realite</guid>
		<dc:date>2010-07-27T06:21:50Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Benjamin Sonntag</dc:creator>



		<description>Apr&#232;s pr&#232;s de un an &#224; y r&#233;fl&#233;chir et &#224; voir comment int&#233;grer une dual stack (le m&#233;lange de IPv4 et IPv6 au sein de nos serveurs) et &#224; tester diverses configurations, Octopuce a enfin obtenu et commence &#224; d&#233;ployer des adresses IPv6 sur son backbone d'h&#233;bergement ! Nous avons, le 14 juillet dernier, obtenu de l'autorit&#233; europ&#233;enne de r&#233;gulation de l'Internet (le RIPE, pour &quot;R&#233;seau IP Europ&#233;en&quot;) un bloc d'IPv6 destin&#233; &#224; Octopuce, appell&#233; bloc PI (pour Provider Independent) qui a pour joli pr&#233;fixe 2001:67c:288 (...)

-
&lt;a href="http://www.octopuce.fr/-OctoBlog-" rel="directory"&gt;70. OctoBlog&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Apr&#232;s pr&#232;s de un an &#224; y r&#233;fl&#233;chir et &#224; voir comment int&#233;grer une dual stack (le m&#233;lange de IPv4 et IPv6 au sein de nos serveurs) et &#224; tester diverses configurations, Octopuce a enfin obtenu et commence &#224; d&#233;ployer des adresses IPv6 sur son backbone d'h&#233;bergement !&lt;/p&gt; &lt;p&gt;Nous avons, le 14 juillet dernier, obtenu de l'autorit&#233; europ&#233;enne de r&#233;gulation de l'Internet (le RIPE, pour &quot;R&#233;seau IP Europ&#233;en&quot;) un bloc d'IPv6 destin&#233; &#224; Octopuce, appell&#233; bloc PI (pour Provider Independent) qui a pour joli pr&#233;fixe 2001:67c:288 ::/48.&lt;/p&gt; &lt;p&gt;Nous disposons donc de la bagatelle de 1 208 925 819 614 629 174 706 176 adresses IPv6 disponibles pour nos h&#233;berg&#233;s.&lt;/p&gt; &lt;p&gt;Les premiers serveurs utilisant &#224; la fois IPv4 et IPv6 sont install&#233;s et commencent &#224; servir les pages web ou email indiff&#233;remment en v4 ou v6.&lt;/p&gt; &lt;p&gt;Si vous &#234;tes un de nos clients et que vous souhaitez disposer de ces nouvelles possibilit&#233;s, n'h&#233;sitez pas &#224; nous contacter, nous nous ferons un plaisir de vous aider dans votre d&#233;ploiement IPv6 sur vos infrastructures !&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
