<?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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Teddy Payet</title>
	<link>https://preprod.teddypayet.com/</link>
	
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://www.preprod.teddypayet.com/spip.php?id_mot=46&amp;page=backend" rel="self" type="application/rss+xml" />

	<image>
		<title>Teddy Payet</title>
		<url>https://www.preprod.teddypayet.com/local/cache-vignettes/L144xH162/siteon0-84dcb.png?1724344960</url>
		<link>https://preprod.teddypayet.com/</link>
		<height>162</height>
		<width>144</width>
	</image>

                   

<item xml:lang="fr">
		<title>Je suis pass&#233; &#224; SPIP 4.0</title>
		<link>https://www.preprod.teddypayet.com/Je-suis-passe-a-SPIP-4-0</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/Je-suis-passe-a-SPIP-4-0</guid>
		<dc:date>2021-09-14T06:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Traitement automatique des images</dc:subject>
		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>PHP</dc:subject>
		<dc:subject>Git</dc:subject>

		<description>
&lt;p&gt;&#199;a y est ! Je suis pass&#233; &#224; SPIP 4.0 ! Je ne sais pas si vous avez suivi, mais SPIP 4.0 est sorti cet &#233;t&#233; pour ses 20 ans. Il y a pas mal de petites nouveaut&#233;s, je vous laisse lire l'article sur le Blog de SPIP qui en parle tr&#232;s tr&#232;s bien. &lt;br class='autobr' /&gt; Introduction Je me suis d&#233;cid&#233; &#224; passer &#224; SPIP 4.0 en cette rentr&#233;e 2021. Pour &#234;tre honn&#234;te, j'avais un peu peur de ce passage car j'avais quitt&#233; un peu l'actualit&#233; de SPIP (ses d&#233;veloppements, son &#233;volution, etc.). Je ne savais pas o&#249; j'allais mettre (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.preprod.teddypayet.com/Traitement-automatique-des-images" rel="tag"&gt;Traitement automatique des images&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/PHP" rel="tag"&gt;PHP&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Git" rel="tag"&gt;Git&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH113/kulli-kittus-qyt0cpbyjjs-unsplash-eebe2.jpg?1724344962' class='spip_logo spip_logo_right' width='150' height='113' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;&#199;a y est ! Je suis pass&#233; &#224; SPIP 4.0 ! Je ne sais pas si vous avez suivi, mais SPIP 4.0 est sorti &lt;a href=&#034;https://blog.spip.net/SPIP-4-0-tout-simplement.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;cet &#233;t&#233; pour ses 20 ans&lt;/a&gt;. Il y a pas mal de petites nouveaut&#233;s, je vous laisse lire l'article sur le Blog de SPIP qui en parle tr&#232;s tr&#232;s bien.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Je me suis d&#233;cid&#233; &#224; passer &#224; SPIP 4.0 en cette rentr&#233;e 2021. Pour &#234;tre honn&#234;te, j'avais un peu peur de ce passage car j'avais quitt&#233; un peu l'actualit&#233; de SPIP (ses d&#233;veloppements, son &#233;volution, etc.). Je ne savais pas o&#249; j'allais mettre les pieds m&#234;me si j'ai toujours aim&#233; ce CMS. Je vais vous parler de mon chemin vers son adoption.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Par beau temps&lt;/h2&gt;
&lt;p&gt;Mon site &#233;tait sous SPIP 3.2.9. Et j'utilise Zcore avec un template maison bas&#233; sur Bootstrap. Jusque l&#224;, rien de bien m&#233;chant. J'ai d&#233;cid&#233; de profiter de cette mont&#233;e de version de SPIP pour revoir mon template et avoir &#233;galement la derni&#232;re version de bootstrap : 5.1.1&lt;/p&gt;
&lt;p&gt;J'ai d&#251; retravailler les diff&#233;rentes classes que j'avais. Pas trop m&#233;chant. J'ai fait les choses &#233;tape par &#233;tape. Avant de migrer pour SPIP 4.0, j'ai fait la mise &#224; jour de SPIP en 3.2.11 qui permet d'avoir la compatibilit&#233; PHP 7.4 (la version minimum pour SPIP 4.0 est PHP 7.3).&lt;/p&gt;
&lt;p&gt;Mon h&#233;bergeur, OVH pour ne pas le citer, prend en charge cette version de PHP. Ouf.&lt;/p&gt;
&lt;p&gt;D&#233;but septembre, j'ai mis en ligne mon template avec bootstrap 5.1.1 et SPIP 3.2.11. Cela me laissait le temps de tester en &#034;live&#034; la compatibilit&#233; avec PHP 7.4. Une lettre &#224; la poste par beau temps !&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Puis vint la pluie&#8230;&lt;/h2&gt;
&lt;p&gt;SPIP 3.2.11, PHP 7.4, Boostrap 5.1.1, c'&#233;tait trop beau pour &#234;tre vrai ! J'ai test&#233; en local le passage &#224; SPIP 4.0. Depuis le back-office, belle page avec la nouvelle interface de l'espace priv&#233;. Responsive, prenant toute la largeur de la fen&#234;tre, c'est beau ! Certains diront que l'espace priv&#233; n'a pas chang&#233; depuis sa cr&#233;ation, mais en fait tout a chang&#233; ! Il est plus light, plus agr&#233;able avec ces nouveaux jeux d'ic&#244;nes SVG.&lt;/p&gt;
&lt;p&gt;Puis, j'ai cliqu&#233; sur le bouton &#034;voir le site public&#034;&#8230; Et patatra ! La page met du temps &#224; se charger&#8230; Je me dis que ce n'est que le cache qui se recalcule&#8230; Et ben non, j'ai une belle erreur php me disant soit que je n'ai suffisamment de m&#233;moire allou&#233;e (mouais&#8230; 128Mo puis 256Mo&#8230;), soit qu'il ne trouvait pas une variable dans les scripts php&#8230;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Panique &#224; bord !&lt;/h2&gt;
&lt;p&gt;Je cherche&#8230; d&#233;sesp&#233;r&#233;ment&#8230; Je regarde mes scripts PHP maison en pensant trouver la bonne piste&#8230; Et non, rien y fait. J'y passe des heures sur le sujet, je change m&#234;me d'environnement : d'un raspberry Pi avec LAMP, je passe sous MAMP sur mon mac et m&#234;me en preprod sur mon espace d'h&#233;bergement. Rien y fait. Toujours ces erreurs al&#233;atoires. Pourtant, tout fonctionne sous SPIP 3.2.11 en PHP 7.4.&lt;/p&gt;
&lt;p&gt;Je sais que la gestion des documents et des logos a chang&#233; sous SPIP 4.0. Et j'utilise avec grand plaisir les filtres sur mes templates. Je d&#233;cide alors d'aller vers cette piste.&lt;/p&gt;
&lt;p&gt;Mes images sur mon site sont en moyenne &#224; 2500px de largeur. &#199;a me permet d'avoir des images de bonnes dimensions et de pouvoir les redimensionner selon mon design. Je d&#233;cide de venir &#224; une version plus all&#233;g&#233;e de mes filtres. Suppression des filtres &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;image_passe_partout&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;image_recadre&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;image_aplatir&lt;/code&gt; et j'en passe. Rien y fait !&lt;/p&gt;
&lt;p&gt;Je peste sur mon id&#233;e de passer &#224; SPIP 4.0 avec la &lt;a href=&#034;https://www.la-rache.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;m&#233;thode R.A.C.H.E&lt;/a&gt;. M&#234;me en sachant que SPIP 4.0 avait chang&#233; son approche pour les logos, je ne pensais pas que cela allait &#234;tre aussi compliqu&#233;.&lt;/p&gt;
&lt;p&gt;J'utilise un mod&#232;le nomm&#233; &#034;logo.html&#034;. Ce mod&#232;le me permet de ne pas dupliquer mes filtres pour les visuels de mes articles, rubriques et cie. Je d&#233;cide de l'ouvrir dans PHPStorm par raccourcis clavier &#034;Search everywhere&#034;. Je tape donc &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;modeles/logo.html&lt;/code&gt;. Et OH ! Surprise ! le plugin medias utilise un mod&#232;le logo en SPIP 4.0.&lt;/p&gt;
&lt;p&gt;Ah tiens&#8230; En fait, j'&#233;tais tellement subjugu&#233; par la nouvelle interface que je n'avais pas remarqu&#233; qu'aucun de mes logos d'articles ne s'affichait. J'ai regard&#233; en base de donn&#233;es dans la table &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip_documents&lt;/code&gt; comment SPIP indique les logos d'articles. Je pige le truc rapidement. J'adopte la m&#233;thode R.A.C.H.E&#8230; La migration des donn&#233;es par SPIP n'a pas bien ins&#233;r&#233;e les &#034;anciens&#034; logos dans la table de documents. Que cela ne tienne ! Je cr&#233;e un petite fonction PHP qui va ins&#233;rer dans la bdd mes logos d'article (de rubriques et de sites) en respectant les bons chemins (exemple : logo/arton-XX.png). &#199;a se fait rapidement.&lt;/p&gt;
&lt;p&gt;Je reviens au fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;modeles/logo.html&lt;/code&gt; du plugin &lt;i&gt;medias&lt;/i&gt;. Je consulte ce fichier et constate son extr&#234;me simplicit&#233; et efficacit&#233; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[&lt;a href=&#034;(#ENV{lien})&#034;&gt;]&lt;img src=&#034;#ENV{logo_on}&#034; class=&#034;spip_logo[ spip_logo_(#ENV{align})][(#ENV{logo_off}|oui)spip_logo_survol]&#034;[ width=&#034;(#ENV{width})&#034;][ height=&#034;(#ENV{height})&#034;] alt=&#034;&#034;[ data-src-hover=&#034;(#ENV{logo_off})&#034;]/&gt;[(#ENV{lien}|?{&lt;/a&gt;})]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je n'ai pas trouv&#233; exactement o&#249; &#233;tait appel&#233; ce fichier. Mais j'ai pour principe de ne jamais utiliser les m&#234;me noms que dans un framework. Cela &#233;vite les effets de bord ind&#233;sirables. Donc, je renomme mon mod&#232;le maison en &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;modeles/visuel.html&lt;/code&gt;. Cela colle bien &#224; son utilisation premi&#232;re.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Une &#238;le paradisiaque au loin&lt;/h2&gt;
&lt;p&gt;Suite &#224; ce renommage, je commence &#224; avoir de nouveau un d&#233;but de page sur mon espace public. Il y a encore quelques petits effets &#224; r&#233;gler. Des warnings plus compr&#233;hensibles. Je m'att&#232;le &#224; r&#233;gler &#231;a.&lt;/p&gt;
&lt;p&gt;J'adopte de fa&#231;on syst&#233;matique (pas comme les antibiotiques) l'utilisation de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;modeles/visuel.html&lt;/code&gt;, je vide les r&#233;pertoires &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;local&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;tmp/cache&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;tmp/logs/&lt;/code&gt; avant chaque grosse modification. Le site est &#224; nouveau op&#233;rationnel et je retrouve le m&#234;me template que j'utilisais en SPIP 3.2.21 en production en d&#233;but de mois de septembre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Je respire enfin.&lt;/strong&gt; L'espoir en moi renait.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Un avenir radieux&lt;/h2&gt;
&lt;p&gt;Je teste toujours sur mon propre site la derni&#232;re version de SPIP avant de la proposer &#224; mes clients. Ainsi, j'aurais d&#233;j&#224; essuy&#233; les pl&#226;tres. Il sera plus simple pour passer la peinture chez les clients.&lt;br class='autobr' /&gt;
L'erreur &#233;tait toute b&#234;te, mon mod&#232;le logo g&#234;nait SPIP dans sa nouvelle monture. Ma surcharge changeait le comportement attendu. Je suis incapable de dire exactement pourquoi cela faisait planter PHP. Je n'ai pas cherch&#233; &#224; le savoir non plus pour &#234;tre franc.&lt;/p&gt;
&lt;p&gt;Je constate surtout que SPIP est plus rapide. Merci PHP 7.4, merci &#224; la core team d'avoir rendu SPIP plus l&#233;ger et v&#233;loce. Je sais que si je passe &#224; PHP 8.0, cela sera encore plus rapide. Mais j'ai plusieurs sites sur mon h&#233;bergement OVH qui ne sont pas compatibles PHP 8.0.&lt;/p&gt;
&lt;p&gt;Vous pouvez consulter le r&#233;sultat de cette migration en lisant cet article. En effet, en ce mardi 14 septembre, mon site est officiellement sous SPIP 4.0 sous vos yeux &#233;bahis !&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Et la suite ?&lt;/h2&gt;
&lt;p&gt;J'ai commenc&#233; &#224; travailler sur mes plugins de la communaut&#233; pour une compatibilit&#233; avec SPIP 4.0 :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/info_spip.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Info SPIP&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/socicon.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Socicon&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/lister_constantes.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Lister les constantes PHP de SPIP&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/lister_config.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Lister les pages de configuration&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/lister_exec.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Lister les pages ?exec=xxx&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/lister_fonctions.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Lister les fonctions PHP de SPIP&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/lister_objets.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Lister les objets principaux de SPIP&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/lister_dossiers.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Lister les dossiers&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/rss_commits.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Commits de projet&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/jqvmap.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;jQuery Vector Maps&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/projets.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Projets&lt;/a&gt; (je ne fais que la maintenance de ce plugin, je n'en suis pas le cr&#233;ateur, je tiens &#224; le pr&#233;ciser)&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://plugins.spip.net/projets_sites.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Sites pour projets&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Il m'en reste quelques uns &#224; migrer dont le plus gros : InfoSites. Il est dans les bacs. Il est d&#233;pendant d'un plugin qui est en attente de mise en compatibilit&#233; avec SPIP 4.0. Plus qu'un pour pouvoir livrer la v2 de ce plugin qui me tient &#224; c&#339;ur.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Fin de vie pour&#8230;&lt;/h2&gt;
&lt;p&gt;La liste pr&#233;c&#233;dente est plut&#244;t longue. Mais il y aura des &#034;laiss&#233;s pour compte&#034; dans la course &#224; SPIP 4.0. En effet, selon ma vision, un plugin n'a plus lieu d'&#234;tre :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Agrandir la largeur de page (SPIP_hop pour les intimes) : l'interface de l'espace priv&#233; a &#233;t&#233; revu pour prendre toute la largeur de la fen&#234;tre et va m&#234;me plus loin que ce qu'offrait spip_hop. Je ne vois pas l'utilit&#233; de le maintenir pour SPIP 4.0&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pour le moment, je n'ai plus le temps/besoin pour certains autres plugins. Donc leur mise &#224; jour est repouss&#233;e &#224; une date ult&#233;rieure :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; D&#233;r&#233;f&#233;rencer les m&#233;dias ;&lt;/li&gt;&lt;li&gt; Nettoyer la m&#233;diath&#232;que.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Voil&#224; le p&#233;riple que j'ai connu avec SPIP 4.0. Je n'ai pas de regrets pour mon passage vers cette derni&#232;re version. Au contraire. :-)&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>La domotique et moi, 2&#232;me partie</title>
		<link>https://www.preprod.teddypayet.com/La-domotique-et-moi-2eme-partie</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/La-domotique-et-moi-2eme-partie</guid>
		<dc:date>2020-04-29T07:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Domotique</dc:subject>

		<description>
&lt;p&gt;Alors, avez-vous pu lire la 1&#232;re partie ? Si cela n'est pas fait, je vous invite &#224; le lire avant d'entamer la lecture du pr&#233;sent article. C'est fait ? Parfait. &lt;br class='autobr' /&gt;
Je vais continuer de vous exposer simplement et concr&#232;tement ma vision de la domotique, ce qui m'y int&#233;resse. Nous allons voir les points suivants : L'accessibilit&#233;, l'interface homme/machine Le contr&#244;le et l'automatisation L'open source &lt;br class='autobr' /&gt; L'accessibilit&#233;, l'interface homme/machine &lt;br class='autobr' /&gt;
De part mon exp&#233;rience professionnelle et au (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.preprod.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Domotique" rel="tag"&gt;Domotique&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH100/arton159-f65f3.jpg?1724416526' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Alors, avez-vous pu lire la &lt;a href='https://www.preprod.teddypayet.com/MagicMirror&#178;-planification-des-taches' class=&#034;spip_in&#034;&gt;1&#232;re partie&lt;/a&gt; ? Si cela n'est pas fait, je vous invite &#224; le lire avant d'entamer la lecture du pr&#233;sent article. C'est fait ? Parfait.&lt;/p&gt;
&lt;p&gt;Je vais continuer de vous exposer simplement et concr&#232;tement ma vision de la domotique, ce qui m'y int&#233;resse. Nous allons voir les points suivants :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; L'accessibilit&#233;, l'interface homme/machine&lt;/li&gt;&lt;li&gt; Le contr&#244;le et l'automatisation&lt;/li&gt;&lt;li&gt; L'open source&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;L'accessibilit&#233;, l'interface homme/machine&lt;/h2&gt;
&lt;p&gt;De part mon exp&#233;rience professionnelle et au fil de mes rencontres, j'ai acquis la conviction que &lt;strong&gt;l'utilisateur doit pouvoir prendre la main sur la machine&lt;/strong&gt; (Skynet ?). De ce fait, si je ne peux contr&#244;ler un produit manuellement sans passer par internet ou autre, alors c'est une mauvaise int&#233;gration du produit.&lt;/p&gt;
&lt;p&gt;Il en va de m&#234;me pour les solutions logicielles accompagnant ces produits qui doivent &#234;tre simples de prise en main. En effet, par exemple, ma femme doit &lt;strong&gt;pouvoir configurer/d&#233;sactiver une alarme sans devoir toucher &#224; une seule ligne de codes.&lt;/strong&gt; De m&#234;me, mes enfants doivent pouvoir commander une lumi&#232;re sans difficult&#233; particuli&#232;re.&lt;/p&gt;
&lt;p&gt;Un second volet de l'accessibilit&#233; est le code source de ce que j'utilise pour contr&#244;ler mes appareils connect&#233;s. J'utilise des produits de diff&#233;rentes marques, mais &lt;strong&gt;ils doivent pouvoir communiquer entre eux. Si une solution open source existe, j'irai vers cette solution.&lt;/strong&gt; Mais si une solution payante et abordable fait la m&#234;me chose en moins compliqu&#233;e et plus ergonomique, je testerai cette solution. &lt;strong&gt;Si elle s'av&#232;re fiable, je prendrais cette solution payante.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Encore une fois, quelque soit la solution, je dois pouvoir interagir avec elle depuis ma centrale, ma &#8220;box&#8221; domotique.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Le contr&#244;le et l'automatisation&lt;/h2&gt;
&lt;p&gt;Le nerf de la guerre ! &lt;strong&gt;Pouvoir contr&#244;ler et automatiser est essentiel dans la domotique.&lt;/strong&gt; Ici, ma philosophie de d&#233;veloppeur prend les devants : &lt;strong&gt;si je fais une action plus de 2 fois, alors c'est que je peux l'automatiser ou la simplifier.&lt;/strong&gt; Si je ne sais pas le faire, c'est que je n'ai pas la connaissance pour le moment de le faire.&lt;/p&gt;
&lt;p&gt;Gr&#226;ce &#224; cet &#233;tat d'esprit, en outre de pouvoir contr&#244;ler par la voix les lumi&#232;res, je r&#233;fl&#233;chis syst&#233;matiquement &#224; comment simplifier notre vie au quotidien.&lt;/p&gt;
&lt;p&gt;Tous les jours, &#224; 00h25, le mode nuit s'active &#224; la maison (extinction de toutes les lumi&#232;res, volume des GHM et d'Alexa &#224; 10%). A 6h30, le mode jour se met en place (volume des m&#233;dias players &#224; 60%). Ceux sont des actions tr&#232;s simples. Une autre automatisation est d'allumer la lumi&#232;re de la pi&#232;ce de vie si le soleil s'est couch&#233; et qu'il y a du monde &#224; la maison.&lt;/p&gt;
&lt;p&gt;Je pourrais automatiser encore des &#233;l&#233;ments dans l'appartement mais il me faut quelques capteurs de plus pour y arriver. &lt;strong&gt;Chaque chose en son temps.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Open source&lt;/h2&gt;
&lt;p&gt;Comme je l'ai d&#233;j&#224; abord&#233; pr&#233;c&#233;demment, &lt;strong&gt;je pr&#233;f&#232;re des solutions open source. &lt;/strong&gt; Malheureusement, ce n'est pas toujours possible, surtout dans un pays francophone. En effet, si je d&#233;sire avoir un contr&#244;le par la voix des mes produits, il existe pl&#233;thore de solutions open source d'assistants personnels virtuels (Mycroft, Kalliope, Stephanie, Open Assistant, Jasper, Jarvis, etc.) Si &lt;strong&gt;ces solutions ont le m&#233;rite d'exister, les voix sont anglaises.&lt;/strong&gt; Je ne suis pas contre, mais tout le monde n'est pas bilingue &#224; la maison. &lt;strong&gt;Si des solutions avec des voix fran&#231;aises existent, elles sont payantes&lt;/strong&gt;, avec licence.&lt;/p&gt;
&lt;p&gt;Ceci est un point important notamment pour mon choix de Google Home Mini. Google est tr&#232;s en avance sur le contr&#244;le par la voix dans plusieurs langues. De plus, Google a mis &#224; disposition &lt;strong&gt;des API qui permettent des interactions avec ses appareils.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Toutefois les Google Home Mini ne seront chez moi &lt;strong&gt;qu'une interface vers ma domotisation.&lt;/strong&gt; J'ai fait des recherches sur internet de solution de &#8220;syst&#232;me domotique&#8221; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; OpenHab&lt;/li&gt;&lt;li&gt; Home Assistant&lt;/li&gt;&lt;li&gt; Jeedom (Cocorico ! Une solution fran&#231;aise)&lt;/li&gt;&lt;li&gt; Domoticz&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Ceux sont les noms que j'entendais le plus parler sur la toile. Mon choix pour ces 4 solutions est bas&#233; sur &lt;strong&gt;plusieurs crit&#232;res :&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Rapide &#224; prendre en main ;&lt;/li&gt;&lt;li&gt; Compatible Raspberry Pi 3 ;&lt;/li&gt;&lt;li&gt; Flexible ;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Communaut&#233; importante et r&#233;active ;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt; Bien document&#233; ;&lt;/li&gt;&lt;li&gt; Pas de licences &#224; payer (ben oui, on est en open source l&#224;)&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Un maximum de compatibilit&#233;&lt;/strong&gt; avec des produits/API ;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;L'esth&#233;tique de l'interface.&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;La d&#233;cision finale s'est port&#233;e sur Home assistant.&lt;/strong&gt; Il est compatible avec beaucoup d'outils que j'utilise d&#233;j&#224;. Ce qui a fait pencher la balance est &#233;galement un des Youtubers que je suis : &lt;a href=&#034;https://www.youtube.com/channel/UC7G4tLa4Kt6A9e3hJ-HO8ng&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;DrZzs&lt;/a&gt;. Son discours dans les vid&#233;os de sa cha&#238;ne m'a conquis. De plus, &lt;strong&gt;Home Assistant a le vent en poupe en France.&lt;/strong&gt; Je ne m'&#233;terniserai pas plus sur ce choix car cela n'est pas le but du pr&#233;sent article. Mais une s&#233;rie d'articles appara&#238;tra prochainement sur le sujet.&lt;/p&gt;
&lt;p&gt;Quoiqu'il en soit, j'ai install&#233; Home Assistant sur mon Raspberry Pi 3+ sur une carte MiniSD de 32Go gr&#226;ce &#224; Hass.io. Apr&#232;s quelques configurations,&lt;strong&gt; il n'y a que Home Assistant&lt;/strong&gt; (Hass.io ou HA pour les intimes) &lt;strong&gt;qui sera connect&#233; &#224; des solutions propri&#233;taires telles que Google&lt;/strong&gt; (cf. Google Assistant). J'ai ajout&#233; &#224; HA une cl&#233; USB Conbee 2 qui me permet de contr&#244;ler des produits compatible avec le protocole Zigbee. Comme Google Assistant est connect&#233; &#224; mon compte Hass.io, il ne verra que du feu quelque soit le protocole que j'utiliserai sur HA. Magique. Un seul point d'entr&#233;e.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Voici ma vision de la domotique ou du moins ce qui m'int&#233;resse dans la domotique. Je n'ai pas abord&#233; tous les points de la domotique tels que la vid&#233;o-surveillance (cam&#233;ras) ou la s&#233;curit&#233; (les serrures connect&#233;es), j'en parlerai peut-&#234;tre plus tard. Tout le monde n'a pas la m&#234;me vision de la domotique ni les m&#234;me centres d'int&#233;r&#234;ts. Mon &#233;pouse n'aime pas &#234;tre envahie par les &#8220;robots&#8221; (encore toi Skynet ?), elle veut pouvoir d&#233;cider par elle-m&#234;me de ce qu'elle d&#233;sire faire (et elle a raison). Moi, j'aimerai aider mes enfants &#224; &#234;tre plus autonomes et &#233;galement pouvoir avoir un oeil protecteur sur eux (ils ont 5, 10 et 13 ans). A cela, j'aimerai me faciliter la vie (flemmard un d&#233;veloppeur ? &#8220;C'est pas faux&#8221;).&lt;/p&gt;
&lt;p&gt;Au fil du temps et de mes installations, &lt;strong&gt;je voudrais rendre plus discret la domotique et indispensable.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>La domotique et moi, 1&#232;re partie</title>
		<link>https://www.preprod.teddypayet.com/MagicMirror%C2%B2-planification-des-taches</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/MagicMirror%C2%B2-planification-des-taches</guid>
		<dc:date>2020-04-27T07:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Domotique</dc:subject>

		<description>
&lt;p&gt;Je voulais aborder ce sujet depuis un moment d&#233;j&#224; : ma vision de la domotique. Comme vous avez pu le lire sur mon blog, j'ai quelques articles qui tendent vers ce domaine ou plus exactement un assistant personnel. Le MagicMirror est un helper, une sorte de mini assistant personnel mais n'est pas de la &#8220;home automation&#8221;. Je vais essayer de partager avec vous ma vision. Je n'essaie pas de vous convaincre, j'essaie juste de poser sur le papier mon concept. Ce qui permettra de vous faire (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.preprod.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Domotique" rel="tag"&gt;Domotique&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH100/arton157-18172.jpg?1725013623' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Je voulais aborder ce sujet depuis un moment d&#233;j&#224; : ma vision de la domotique. Comme vous avez pu le lire sur mon blog, j'ai quelques articles qui tendent vers ce domaine ou plus exactement un assistant personnel. Le MagicMirror est un helper, une sorte de mini assistant personnel mais n'est pas de la &#8220;home automation&#8221;. Je vais essayer de partager avec vous ma vision. Je n'essaie pas de vous convaincre, j'essaie juste de poser sur le papier mon concept. Ce qui permettra de vous faire comprendre ma ligne &#233;ditoriale sur le sujet dans mes articles.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Mon profil avant tout&lt;/h2&gt;
&lt;p&gt;Avant de commencer de vous parler de la domotique pure et dure, je voudrais surtout me pr&#233;senter pour que vous puissiez comprendre mes possibilit&#233;s, mes comp&#233;tences mais aussi mes limites.&lt;/p&gt;
&lt;p&gt;Je suis de formation initiale graphiste ou &#8220;designer&#8221;. J'ai d&#233;couvert le monde du web et notamment du d&#233;veloppement de fa&#231;on autodidacte. Je suis aujourd'hui Lead Developer PHP. J'installe des VM linux pour mes d&#233;veloppements (merci vagrant). Donc, je n'ai pas vraiment peur de lire des lignes de code si besoin et d'en &#233;crire (si je connais ou comprends le langage de programmation de la solution domotique). Je suis curieux des nouvelles technologies en g&#233;n&#233;ral, de la SF (ne me demandez pas mon auteur favori, &#231;a ne servira &#224; rien, je n'en ai pas), de l'actualit&#233; en g&#233;n&#233;ral, de l'interaction homme-machine (mais la plus basique qui soit : le comportement d'un utilisateur lambda devant une technologie). Je regarde &#233;norm&#233;ment de Youtubers Makers, DIYers, etc.&lt;/p&gt;
&lt;p&gt;&#199;a, ceux sont mes points &#8220;forts&#8221;. Maintenant, mes lacunes :&lt;/p&gt;
&lt;p&gt;Quand on parle de domotique, souvent, on parle de &lt;strong&gt;DIY&lt;/strong&gt;&#8230; Oui, mais je ne fais &lt;i&gt;pas de soudure&lt;/i&gt;, &lt;i&gt;pas d'&#233;lectronique&lt;/i&gt; (mon dernier calcul de r&#233;sistance date d'il y a 25 ans au coll&#232;ge), &lt;i&gt;pas d'impression 3D&lt;/i&gt; (pas la place pour le moment). De ce fait, je pr&#233;f&#232;re &lt;strong&gt;des solutions ou des produits finis&lt;/strong&gt;. Je ne saurais pas brancher un ESP8266 avec un relay&#8230; Ni m&#234;me flasher ce m&#234;me ESP8266&#8230;&lt;/p&gt;
&lt;p&gt;Dernier point, ma famille et moi-m&#234;me vivons dans un appartement. Nous ne pouvons &lt;strong&gt;pas faire de grands travaux/bricolages&lt;/strong&gt; pour mettre en place la domotique.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Inspecteur gadget&lt;/h2&gt;
&lt;p&gt;Comme dirait ma femme, &#8220;c'est gadget !&#8221;. Oui, ce n'est pas faux de prime abord. Vous vous en doutez, au fil de la lecture de mon blog, vous avez pu voir que je suis un geek, un technophile. Mais j'ai une fibre de &#8220;designer&#8221;, d'exp&#233;rience utilisateur.&lt;/p&gt;
&lt;p&gt;J'ai d&#233;marr&#233; l'installation de ma &#8220;domotique&#8221; avec le MagicMirror pour avoir un tableau de bord. C'est un projet &#8220;gentillet&#8221; &lt;strong&gt;pour d&#233;marrer, pour me frotter &#224; cet univers.&lt;/strong&gt; Le syst&#232;me me paraissait accessible. Je ne me suis pas tromp&#233;. Tr&#232;s tr&#232;s rapidement, la deuxi&#232;me &#233;tape &#233;tait l'installation d'interrupteurs connect&#233;s, de la marque Sonoff. Peu cher et facile &#224; installer chez moi. Il y a un aspect financier qui m'int&#233;resse dans la domotique : acheter du &lt;strong&gt;mat&#233;riel abordable&lt;/strong&gt;. Mais qui dit abordable, ne dit pas de mauvaises qualit&#233;s.&lt;/p&gt;
&lt;p&gt;Par la suite, j'ai pu acheter 2 Google Home Mini pour le prix d'un.&lt;/p&gt;
&lt;p&gt;Mon &#233;cosyst&#232;me a commenc&#233; &#224; se mettre en place. Des interrupteurs connect&#233;s, des Google Home Mini et un Raspberry Pi (celui du Magic Mirror) pour les commander tous. Je ne saurais vous dire exactement combien j'ai d&#233;pens&#233; pour faire tout &#231;a, mais &lt;strong&gt;ce n'est pas excessif car &#233;tal&#233; sur 1 an environ.&lt;/strong&gt; Pour preuve, j'ai aujourd'hui cet &#233;quipement :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; 3 interrupteurs Sonoff Touch&lt;/li&gt;&lt;li&gt; 2 contr&#244;leurs Wifi monocouleur MagicHome&lt;/li&gt;&lt;li&gt; 1 prise Zigbee&lt;/li&gt;&lt;li&gt; 2 Raspberry Pi 3&lt;/li&gt;&lt;li&gt; Une cl&#233; Conbee2&lt;/li&gt;&lt;li&gt; 5 Google Home Mini&lt;/li&gt;&lt;li&gt; 1 Alexa Echo Dot&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;J'ai un Google Home Mini (GHM) par pi&#232;ce principale, j'en ai pay&#233; 3 sur 5 &#224; moiti&#233; prix lors de promo &#224; chaque fois. Certains, et je peux comprendre, pourront dire que j'offre mes donn&#233;es &#224; une grosse entreprise&#8230; Oui, certes. Mais on y reviendra plus tard sur ce sujet sp&#233;cifique. Les Google Home Mini me permettent de commander mes lumi&#232;res par la voix, entre autres.&lt;/p&gt;
&lt;p&gt;J'ai d'autres utilisations marrantes des GHM. Ce qui ne d&#233;pla&#238;t pas &#224; mes enfants.&lt;/p&gt;
&lt;p&gt;Entre autres, je cherche des &lt;strong&gt;produits/solutions ouvertes, au mieux open source&lt;/strong&gt;. Les Google Home Mini ne sont pas open source, elles sont d'un &#233;cosyst&#232;me propri&#233;taire mais Google permet d'interagir avec leurs produits &lt;strong&gt;gr&#226;ce &#224; des API/SDK gratuitement&lt;/strong&gt;. Donc, cela me va tr&#232;s bien.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;L'&#233;conomie financi&#232;re&lt;/h2&gt;
&lt;p&gt;Il n'y a pas &#224; dire sur le sujet, un des buts de la domotique est l'&#233;conomie financi&#232;re ! Si on met en place une domotique sur le chauffage (commande de la temp&#233;rature lorsque les personnes sont pr&#233;sentes ou pas &#224; la maison, ouverture des fen&#234;tres, etc.), on peut &lt;strong&gt;baisser sa consommation d'&#233;nergie&lt;/strong&gt;. En effet, s'il n'y a personne &#224; la maison, cela ne sert &#224; rien de chauffer &#224; 30&#176; ! Et si on a oubli&#233; de baisser la temp&#233;rature souhait&#233;e de la chaufferie alors qu'on est d&#233;j&#224; &#224; 100 bornes, &lt;strong&gt;il nous suffit de se connecter &#224; notre interface&lt;/strong&gt; pour soit couper le chauffage, soit de baisser la temp&#233;rature. &lt;strong&gt;Gain de temps, pas de d&#233;penses &#233;nerg&#233;tiques inutiles.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Autre exemple, on a oubli&#233; d'&#233;teindre une lumi&#232;re. Mon installation domotique remarque qu'une lumi&#232;re est allum&#233;e mais qu'aucune personne n'est pr&#233;sente (merci les d&#233;tecteurs de mouvements !). Alors, elle &#233;teint la lumi&#232;re pour ne pas &#233;clairer une pi&#232;ce pendant une semaine alors que vous avez les doigts de pieds en &#233;ventail &#224; la plage &#224; plusieurs centaines de bornes de chez vous !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;R&#233;ussir &#224; ma&#238;triser sa consommation &#233;nerg&#233;tique permet de r&#233;duire sa facture,&lt;/strong&gt; de moins d&#233;penser de p&#233;p&#232;tes, de pognon. Il y a bien d'autres sc&#233;narios possibles li&#233;s &#224; la consommation &#233;nerg&#233;tique. Si on se d&#233;brouille bien, on peut diviser par 2 certaines factures. A chacun son installation.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Cet aspect financier conclus la premi&#232;re partie de cet article. Il est assez long &#224; lire, je ne voulais pas vous assommez alors que l'id&#233;e est simple : s'approprier la domotique. La deuxi&#232;me partie sera en ligne dans 1 ou 2 jours. Elle abordera ma vision de l'accessibilit&#233;, le contr&#244;le, l'automatisation et l'open source dans le domaine de la domotique. Comme d'habitude, je suis preneur de vos retours sur le sujet.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Photo by Yassine Khalfalli on Unsplash&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>MagicMirror&#178;, configuration script&#233;e, 2&#232;me partie</title>
		<link>https://www.preprod.teddypayet.com/MagicMirror%C2%B2-configuration-scriptee-2eme-partie</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/MagicMirror%C2%B2-configuration-scriptee-2eme-partie</guid>
		<dc:date>2020-04-14T22:55:42Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Astuce</dc:subject>
		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Lignes de commandes</dc:subject>
		<dc:subject>MagicMirror</dc:subject>
		<dc:subject>Domotique</dc:subject>

		<description>
&lt;p&gt;Comme vous le savez tous, nous sommes en confinement depuis mi-mars. Pour m'occuper un peu en ch&#244;mage partiel, en plus de ma vie de famille, je me suis inscris &#224; une groupe d'entraide sur le MagicMirror sur Facebook. J'ai eu l'agr&#233;able surprise de voir qu'un article de mon blog &#233;tait cit&#233;. Merci de la confiance de ces utilisateurs ! Apr&#232;s quelques &#233;changes, j'ai propos&#233; d'expliquer plus en d&#233;tail mon installation script&#233;e et notamment ce &#224; quoi correspond mes diff&#233;rents principaux scripts. (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.preprod.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Lignes-de-commandes" rel="tag"&gt;Lignes de commandes&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/MagicMirror" rel="tag"&gt;MagicMirror&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Domotique" rel="tag"&gt;Domotique&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH100/arton158-32c60.jpg?1724428492' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Comme vous le savez tous, nous sommes en confinement depuis mi-mars. Pour m'occuper un peu en ch&#244;mage partiel, en plus de ma vie de famille, je me suis inscris &#224; une groupe &lt;a href=&#034;https://www.facebook.com/groups/2832574870153883/about/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;d'entraide sur le MagicMirror&lt;/a&gt; sur Facebook. J'ai eu l'agr&#233;able surprise de voir qu'un article de mon blog &#233;tait cit&#233;. Merci de la confiance de ces utilisateurs ! &lt;br class='autobr' /&gt;
Apr&#232;s quelques &#233;changes, j'ai propos&#233; d'expliquer plus en d&#233;tail mon installation script&#233;e et notamment ce &#224; quoi correspond mes diff&#233;rents principaux scripts.&lt;/p&gt;
&lt;p&gt;Tout a &#233;t&#233; d&#233;pos&#233; sur github (vous pourrez trouver le lien en bas de l'article). Je reprends ici plus ou moins le contenu du fichier Readme.&lt;/p&gt;
&lt;p&gt;Cet article est un &lt;strong&gt;exemple d'automatisation de la maintenance &lt;/strong&gt; de mon installation de MagicMirror. Le d&#233;p&#244;t github a pour but de montrer la possibilit&#233; d'automatiser la maintenance d'une installation d'un MagicMirror.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Le d&#233;p&#244;t s'appelle mm_config_automate. Son existence n'est que p&#233;dagogique. Il n'est en aucun cas un module de MagicMirror.&lt;/p&gt;
&lt;p&gt;De plus, je ne suis pas responsable d'une alt&#233;ration de vos donn&#233;es. Il vous faudra tester et adapter chaque script pour correspondre &#224; VOS attentes.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Liste des scripts&lt;/h2&gt;
&lt;p&gt;L'ensemble des scripts sont en bash. Ils restent simples &#224; comprendre et &#224; prendre en main avec un peu de patience et de lecture. Voici la liste des scripts :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; first_install.sh&lt;/li&gt;&lt;li&gt; mm_reset.sh&lt;/li&gt;&lt;li&gt; mm_update.sh&lt;/li&gt;&lt;li&gt; update_files_config.sh&lt;/li&gt;&lt;li&gt; disk_usage.sh&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;first_install.sh&lt;/h2&gt;
&lt;p&gt;Ce script permet &lt;strong&gt;d'installer l'ensemble des &#233;l&#233;ments de base pour qu'un MagicMirror puisse fonctionner.&lt;/strong&gt; Il est &#224; lancer sur une installation toute belle, toute neuve d'un Raspberry Pi 3. Je n'ai pas test&#233; sur un Raspberry Pi 4 pour le moment. Il prend en compte un Raspbian bas&#233; sur un Debian Buster (10) mis &#224; disposition des utilisateurs en f&#233;vrier 2020.&lt;/p&gt;
&lt;p&gt;Il fera dans l'ordre :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;i&gt;sudo apt update -y&lt;/i&gt; : R&#233;cup&#232;re la liste des mises &#224; jour disponibles&lt;/li&gt;&lt;li&gt; &lt;i&gt;sudo apt upgrade -y&lt;/i&gt; : Installe quelques mises &#224; jour, ne supprime pas les packages&lt;/li&gt;&lt;li&gt; &lt;i&gt;sudo apt autoremove -y&lt;/i&gt; : Supprime tous les anciens paquets qui ne sont plus n&#233;cessaires&lt;/li&gt;&lt;li&gt; &lt;i&gt;sudo apt clean -y&lt;/i&gt; : Cette commande de terminal lib&#232;re de l'espace disque en nettoyant les fichiers .deb t&#233;l&#233;charg&#233;s du r&#233;f&#233;rentiel local.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Puis :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; On active le son par le HDMI ;&lt;/li&gt;&lt;li&gt; Forcer le HDMI ;&lt;/li&gt;&lt;li&gt; Forcer l'affichage vertical de l'&#233;cran ;&lt;/li&gt;&lt;li&gt; Enlever des programmes inutiles ;&lt;/li&gt;&lt;li&gt; Installation de quelques packages ;&lt;/li&gt;&lt;li&gt; Installation de Nodejs et NPM selon la m&#233;thode indiqu&#233;e ici : &lt;a href=&#034;https://github.com/audstanley/NodeJs-Raspberry-Pi&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/audstanley/NodeJs-Raspberry-Pi&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Ajouter les binaires de node dans le PATH ;&lt;/li&gt;&lt;li&gt; Installation de PM2 ;&lt;/li&gt;&lt;li&gt; Enregistrer les variables d'environnement (le home de MagicMirror, ainsi que de PM2) ;&lt;/li&gt;&lt;li&gt; Cr&#233;ation du fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mm.sh&lt;/code&gt; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/&lt;/code&gt; ;&lt;/li&gt;&lt;li&gt; Ex&#233;cution du script d'installation du MagicMirror ;&lt;/li&gt;&lt;li&gt; Sauvegarder les r&#233;glages de pm2 et lancement des scripts au d&#233;marrage ;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Et enfin, on enregistre le contenu du fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;crontab.txt&lt;/code&gt; dans le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;crontab&lt;/code&gt; de l'utilisateur en cours.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;mm_reset.sh&lt;/h2&gt;
&lt;p&gt;Ce script installe MagicMirror &#224; partir du d&#233;p&#244;t github dudit projet. Il s'appelle &lt;i&gt;&#034;mm_reset&#034;&lt;/i&gt; au lieu de &lt;i&gt;&#034;mm_install&#034;&lt;/i&gt; car il supprime le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/&lt;/code&gt; s'il existe. Donc, il faut faire attention &#224; ce point si vous d&#233;sirez garder une pr&#233;c&#233;dente installation.&lt;/p&gt;
&lt;p&gt;A son tour, ce script va lancer une s&#233;rie de commandes :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Arr&#234;t de MM gr&#226;ce &#224; pm2 stop mm ;&lt;/li&gt;&lt;li&gt; Effacer le r&#233;pertoire de MagicMirror si existant ;&lt;/li&gt;&lt;li&gt; R&#233;cup&#233;ration du d&#233;p&#244;t de MagicMirror ;&lt;/li&gt;&lt;li&gt; Passer sur la branche develop de MagicMirror ;&lt;/li&gt;&lt;li&gt; Cr&#233;ation des liens symboliques dans MM (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;custom.css&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt;) ;&lt;/li&gt;&lt;li&gt; Installation des d&#233;pendances de MM gr&#226;ce &#224; npm ;&lt;/li&gt;&lt;li&gt; Lancement du script d'update des modules de MM (cf. &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;update_files_config.sh&lt;/code&gt;) ;&lt;/li&gt;&lt;li&gt; Relancer MM sur pm2.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Liens symboliques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dans le script &lt;i&gt;mm_reset.sh&lt;/i&gt;, il est pr&#233;sum&#233; que le fichier &lt;i&gt;&#034;config.js&#034;&lt;/i&gt; et le fichier de personnalisation de css vitaux &#224; MagicMirror soient pr&#233;sents dans votre r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/mm_config_automate/&lt;/code&gt;. Un lien symbolique dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/css/&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/config/&lt;/code&gt; sera fait pointant vers votre r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mm_config_automate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;MagicMirror n'y verra que du feu !&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;mm_update.sh&lt;/h2&gt;
&lt;p&gt;Ce script est plus rapide. Dans ce d&#233;p&#244;t d'exemple, il n'est pas utilis&#233; dans le crontab. Il est &#224; utiliser manuellement lorsque MM doit &#234;tre mis &#224; jour.&lt;/p&gt;
&lt;p&gt;Il arr&#234;te MM par pm2, puis va dans le r&#233;pertoire de MagicMirror. A partir de l&#224;, le d&#233;p&#244;t git est mis &#224; jour avec les derniers fichiers. Une installation et une mise &#224; jour des packages npm sont lanc&#233;es.&lt;/p&gt;
&lt;p&gt;Cela fait, on relance MM sur pm2.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;update_files_config.sh&lt;/h2&gt;
&lt;p&gt;Ce script bash est le nerf de la guerre. Crontab appellera dans notre exemple le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;update_files_config.sh&lt;/code&gt; tous les jours &#224; 00h15.&lt;/p&gt;
&lt;p&gt;Ce script contient 2 fonctions cl&#233;s :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;import_module&lt;/code&gt; ;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;delete_modules&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Apr&#232;s l'utilisation de ces fonctions, une boucle est lanc&#233;e pour v&#233;rifier l'existence du module MMM-AlarmClock. Ce dernier peut utiliser des fichiers mp3 comme sonnerie d'alarme.&lt;/p&gt;
&lt;p&gt;Si vous d&#233;sirez ajouter des fichiers mp3 &#224; votre convenance, il vous suffira de les copier dans le r&#233;pertoire sounds de votre d&#233;p&#244;t &lt;i&gt;&#034;mm_config_automate&#034;&lt;/i&gt;. Automatiquement, tous les soirs (selon le crontab mis en place), chaque fichier mp3 pr&#233;sent sera copi&#233; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/MMM-AlarmClock/sounds/&lt;/code&gt;. Vous n'aurez plus &#224; vous soucier d'autres choses que sa bonne utilisation dans votre fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;update_files_config.sh : fonction import_module&lt;/h2&gt;
&lt;p&gt;Cette fonction bash attend un param&#232;tre : l'url vers le d&#233;p&#244;t git du module que vous d&#233;sirez installer sur votre MagicMirror.&lt;/p&gt;
&lt;p&gt;Par exemple, si vous d&#233;sirez utiliser le module de pages de MM, vous devez indiquer dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;update_files_config.sh&lt;/code&gt; la commande suivante :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;import_module https://github.com/edward-shen/MMM-pages.git&lt;/textarea&gt;
&lt;p&gt;Elle ira dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/&lt;/code&gt;, v&#233;rifiera si le module existe d&#233;j&#224; (en gros l'existence du r&#233;pertoire &#034;MMM-pages&#034;) ou pas. S'il n'existe pas, elle clonera le r&#233;pertoire. Puis :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Acc&#233;der au r&#233;pertoire du module ;&lt;/li&gt;&lt;li&gt; Si un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;package.json &lt;/code&gt;existe, l'installation des packages &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;npm&lt;/code&gt; est lanc&#233;e.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Il faudra utiliser cette fonction autant de fois que de modules d&#233;sir&#233;s. Vous trouverez des exemples dans ledit fichier. &lt;br class='autobr' /&gt;
Cerise sur le gateau, si le module existe d&#233;j&#224;, il le mettra &#224; jour avec les derniers fichiers provenant du d&#233;p&#244;t que vous avez indiqu&#233; en param&#232;tre.&lt;/p&gt;
&lt;div style=&#034;width:100%;height:0;padding-bottom:92%;position:relative;&#034;&gt;&lt;iframe src=&#034;https://giphy.com/embed/12NUbkX6p4xOO4&#034; width=&#034;100%&#034; height=&#034;100%&#034; style=&#034;position:absolute&#034; frameBorder=&#034;0&#034; class=&#034;giphy-embed&#034; allowFullScreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;update_files_config.sh : fonction delete_modules&lt;/h2&gt;
&lt;p&gt;Cette fonction se lance apr&#232;s l'ensemble des appels &#224; &lt;i&gt;import_module&lt;/i&gt;. Elle a pour but de supprimer les modules pr&#233;sents dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/&lt;/code&gt; devenus obsol&#232;tes.&lt;/p&gt;
&lt;p&gt;Comme vous le savez, pour utiliser un module dans MagicMirror, nous devons l'avoir t&#233;l&#233;charg&#233; d'une part dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/&lt;/code&gt; mais d'autre part l'avoir indiqu&#233; dans notre fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/nom_repertoire/&lt;/code&gt; n'est pas indiqu&#233; dans ce fichier, le r&#233;pertoire sera consid&#233;r&#233; comme obsol&#232;te. Donc, qu'il peut &#234;tre supprim&#233;. La pr&#233;sente fonction v&#233;rifiera chaque r&#233;pertoire dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;modules/&lt;/code&gt; &#224; l'exclusion de :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;default/&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;node_modules/&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cela pr&#233;servera l'espace disque de votre Raspberry Pi et &#233;vitera des erreurs dans votre MagicMirror.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;disk_usage.sh&lt;/h2&gt;
&lt;p&gt;Ce script permet de savoir le pourcentage d'utilisation d'espace disque. Dans le pr&#233;sent exemple, si le taux d'utilisation arrive &#224; 90% de sa capacit&#233;, un email est envoy&#233; (je vous laisse le soin de configurer le serveur d'envoi d'emails).&lt;/p&gt;
&lt;p&gt;Il faut savoir que pm2 &#233;crit beaucoup d'information dans les logs (cela d&#233;pend surtout des applications lanc&#233;es sous pm2 mais c'est un autre sujet). En prenant cela en compte, si le taux d'utilisation exc&#232;de les 90%, le script lance en premier lieu la commande pm2 flush pour vider l'ensemble des fichiers logs de pm2. Puis v&#233;rifie &#224; nouveau le taux de remplissage. Si la commande n'a pas chang&#233; la donne, l'email est envoy&#233;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;crontab.txt&lt;/h2&gt;
&lt;p&gt;Ce petit bout de fichier vous permet d'indiquer l'heure &#224; laquelle vos routines doivent &#234;tre mises en place.&lt;/p&gt;
&lt;p&gt;Dans le pr&#233;sent exemple, voici les routines :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; A 0h00 : On v&#233;rifie d'abord l'espace disque&lt;/li&gt;&lt;li&gt; A 0h05 : On met &#224; jour les fichiers de mm_config_automate&lt;/li&gt;&lt;li&gt; A 0h10 : On importe le contenu du fichier crontab.txt dans le crontab &#224; 00h10&lt;/li&gt;&lt;li&gt; A 0h15 : On peut maintenant lancer les scripts de routine (update_files_config.sh)&lt;/li&gt;&lt;li&gt; A 0h20 : On relance MagicMirror pour prendre en compte la configuration &#224; jour.&lt;/li&gt;&lt;li&gt; Tous les mois, on red&#233;marre le Raspberry Pi&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Si vous &#234;tes parents et/ou assujetti &#224; des p&#233;riodes de vacances et un planning diff&#233;rents durant ces p&#233;riodes, il est possible de mettre en place un fichier de config d&#233;di&#233; &#224; cette p&#233;riode.&lt;/p&gt;
&lt;p&gt;Dans notre exemple, le contenu de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config_vac.js&lt;/code&gt; sont identiques. Le but est d'illustrer l'existence des fichiers selon la p&#233;riode. En ayant en t&#234;te les dates de vacances qui vous int&#233;ressent, vous pouvez ajouter une ligne d&#233;di&#233;e dans crontab pour que le lien symbolique de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/config/config.js&lt;/code&gt; pointe vers le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/mm_config_automate/config_vac.js&lt;/code&gt; au lieu de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/mm_config_automate/config.js&lt;/code&gt;. Le jour o&#249; vous devez revenir au travail (donc la fin de votre p&#233;riode de vacances) &#224; 00h30, il suffira de remettre le lien symbolique vers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/mm_config_automate/config.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Exemple pour les vacances de l'Ascension de la zone C :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='9' class='spip_cadre spip_cadre_block' dir='ltr'&gt;############### # Vacances Ascension : 20 mai 30 0 20 5 0 cd /home/pi/MagicMirror/config/; rm -rf config.js; ln -s /home/pi/mm_config_automate/config_vac.js config.js; pm2 restart mm # Rentr&#233;e : 25 mai 30 0 25 5 * cd /home/pi/MagicMirror/config/; rm -rf config.js; ln -s /home/pi/mm_config_automate/config.js config.js; pm2 restart mm&lt;/textarea&gt;
&lt;p&gt;Voil&#224;. A vous de prendre en main ce projet en le copiant dans un d&#233;p&#244;t personnel priv&#233; et de le faire vivre.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Le projet sur github&lt;/h2&gt;
&lt;p&gt;Comme indiqu&#233; en d&#233;but de cet article, les diff&#233;rents fichiers ont &#233;t&#233; d&#233;pos&#233; sur github. Ils ont pour but de vous aider &#224; mettre en place votre automatisation :&lt;br class='autobr' /&gt;
&lt;a href=&#034;https://github.com/Ybbet/mm_config_automate&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/Ybbet/mm_config_automate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Attention de ne pas mettre le projet en public si vous l'utiliser sur VOTRE installation. Pr&#233;servez votre vie... priv&#233;e.&lt;/p&gt;
&lt;div class=&#034;row&#034;&gt; &lt;div class=&#034;col-xs-12&#034;&gt; &lt;h2&gt;A lire aussi&lt;/h2&gt; &lt;ul class=&#034;spip spip-list&#034;&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-un-miroir-qui-vous-veut-du-bien'&gt;MagicMirror&#178;, un miroir qui vous veut du bien.&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-on-recommence-depuis-le-debut'&gt;MagicMirror&#178;, on recommence depuis le d&#233;but&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-un-socle-qui-lui-va-comme-un-gant'&gt;MagicMirror&#178;, un socle qui lui va comme un gant&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-un-Raspberry-Pi-un-ecran-et-cie-sont-dans-un-bateau'&gt;MagicMirror&#178;, un Raspberry Pi, un &#233;cran et cie sont dans un bateau&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-ma-configuration-personnalisee'&gt;MagicMirror&#178;, ma configuration personnalis&#233;e&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-configuration-scriptee'&gt;MagicMirror&#178;, configuration script&#233;e&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;em&gt;MagicMirror&#178;, configuration script&#233;e, 2&#232;me partie&lt;/em&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Des astuces et m&#233;mos pour SVN</title>
		<link>https://www.preprod.teddypayet.com/Des-astuces-et-memos-pour-SVN</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/Des-astuces-et-memos-pour-SVN</guid>
		<dc:date>2018-06-15T09:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Lignes de commandes</dc:subject>
		<dc:subject>SVN</dc:subject>
		<dc:subject>PHPStorm</dc:subject>

		<description>
&lt;p&gt;Je travaille encore tr&#232;s souvent sur des projets sous SVN avec grand plaisir. J'utilise des lignes de commandes pour aller plus vite. Il arrive parfois que je me creuse les m&#233;ninges pour certaines lignes de commandes. Alors, un petit article m&#233;mo ne fera pas de mal. &lt;br class='autobr' /&gt; body background-color:white ; &lt;br class='autobr' /&gt;
Lorsqu'on est sous SVN, il est parfois utile de voir la liste des &#233;l&#233;ments qui ne sont pas encore reconnus dans le d&#233;p&#244;t. svn st | grep ^ ? Et si on ne veut pas avoir le &#034; ?&#034; et les espaces (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.preprod.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Lignes-de-commandes" rel="tag"&gt;Lignes de commandes&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/SVN" rel="tag"&gt;SVN&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/PHPStorm" rel="tag"&gt;PHPStorm&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH100/arton153-88e97.jpg?1724428492' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Je travaille encore tr&#232;s souvent sur des projets sous SVN avec grand plaisir. J'utilise des lignes de commandes pour aller plus vite. Il arrive parfois que je me creuse les m&#233;ninges pour certaines lignes de commandes. Alors, un petit article m&#233;mo ne fera pas de mal.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;style&gt;body {background-color:white;}&lt;/style&gt;
&lt;p&gt;Lorsqu'on est sous SVN, il est parfois utile de voir la liste des &#233;l&#233;ments qui ne sont pas encore reconnus dans le d&#233;p&#244;t.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn st | grep ^?&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et si on ne veut pas avoir le &#034; ?&#034; et les espaces entre ce &#034; ?&#034; et le nom des &#233;l&#233;ments :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn st | grep ^? | cut -c9-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour lister tous les &#233;l&#233;ments qui ont &#233;t&#233; modifi&#233; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn st | grep ^M&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour lister tous les &#233;l&#233;ments qui ont &#233;t&#233; ajout&#233; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn st | grep ^A&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour lister tous les &#233;l&#233;ments qui sont introuvables :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn st | grep ^!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si vous d&#233;sirez afficher tous les &#233;l&#233;ments autres que modifi&#233;s ou ajout&#233;s :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn st | grep -v ^[AM]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Afficher tous les fichiers ayant &#233;t&#233; modifi&#233;, ou ajout&#233; ou qui ne sont pas reconnus par svn :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn st | grep ^[AMD\!?]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il arrive parfois qu'on ait besoin de d&#233;poser des fichiers (exemple : un dump d'une base de donn&#233;es) mais sans vouloir t&#233;l&#233;charger tout le r&#233;pertoire cible sur son local. Voici la commande ad&#233;quate :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn co http://example.org/url_depot/bdd_dump/ --depth empty&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cela permettra de faire un checkout sur son local sans t&#233;l&#233;charger tous les fichiers pr&#233;sents sur le d&#233;p&#244;t.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;R&#232;gle g&#233;n&#233;rique&lt;/h2&gt;
&lt;p&gt;De mani&#232;re g&#233;n&#233;rale, SVN en lignes de commande ajoute 9 caract&#232;res avant le nom de l'&#233;l&#233;ment affich&#233;. De ce fait, &#224; chaque fois que vous ne d&#233;sirez pas voir ces 9 caract&#232;res (ou 9 colonnes), il faut mettre &#224; la fin de votre commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;| cut -c9-&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;En bash, si on d&#233;sire exporter le r&#233;sultat de notre commande dans un fichier, il faut rajouter &#224; la fin de notre commande &lt;i&gt;&#034; &gt; nom_fichier.txt&#034;&lt;/i&gt;&lt;br class='autobr' /&gt;
Soit pour exemple, la liste des fichiers autres que modifi&#233;s et/ou ajout&#233;s :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn st | grep -v ^[AM] &gt; files.txt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Ajouter de nouveaux fichiers/r&#233;pertoires au d&#233;p&#244;t&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;for new_element in $(svn st | grep &#034;^?&#034; | cut -c9-); do svn add ${new_element}; done;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Supprimer des fichiers/r&#233;pertoires obsol&#232;tes au d&#233;p&#244;t&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;for delete_element in $(svn st | grep &#034;^\!&#034; | cut -c9-); do svn delete ${delete_element}; done;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Visuel : Photo by Moja Msanii on Unsplash&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>MagicMirror&#178;, on recommence depuis le d&#233;but</title>
		<link>https://www.preprod.teddypayet.com/MagicMirror2-on-recommence-depuis-le-debut</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/MagicMirror2-on-recommence-depuis-le-debut</guid>
		<dc:date>2018-06-08T05:30:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Lignes de commandes</dc:subject>
		<dc:subject>Javascript</dc:subject>
		<dc:subject>MagicMirror</dc:subject>
		<dc:subject>Domotique</dc:subject>

		<description>
&lt;p&gt;R&#233;cemment, j'ai &#233;crit un article pour installer mon MagicMirror&#178;. Ce tutoriel est tout &#224; fait fonctionnel. Malheureusement, pas dans mon cas car j'avais des versions de packages trop anciennes (cf. node.js). Je vais vous expliquer comment j'ai rem&#233;di&#233; &#224; cela. :-) &lt;br class='autobr' /&gt; body background-color : white ; &lt;br class='autobr' /&gt;
J'ai achet&#233; mon Raspberry Pi en juin 2016. J'en avais fait l'acquisition pour tester Gladys. A cette p&#233;riode, la version 2 de Gladys sortait des cartons et avaient peu de plugins pour (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.preprod.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Lignes-de-commandes" rel="tag"&gt;Lignes de commandes&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Javascript" rel="tag"&gt;Javascript&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/MagicMirror" rel="tag"&gt;MagicMirror&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Domotique" rel="tag"&gt;Domotique&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH100/arton151-862d6.jpg?1724428492' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;R&#233;cemment, j'ai &#233;crit un article pour installer mon MagicMirror&#178;. Ce tutoriel est tout &#224; fait fonctionnel. Malheureusement, pas dans mon cas car j'avais des versions de packages trop anciennes (cf. node.js). Je vais vous expliquer comment j'ai rem&#233;di&#233; &#224; cela. :-)&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;style&gt; body { background-color: white; } &lt;/style&gt;
&lt;p&gt;J'ai achet&#233; mon Raspberry Pi en juin 2016. J'en avais fait l'acquisition pour tester &lt;a href=&#034;https://gladysproject.com/fr/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Gladys&lt;/a&gt;. A cette p&#233;riode, la version 2 de Gladys sortait des cartons et avaient peu de plugins pour agr&#233;menter le tout.&lt;br class='autobr' /&gt;
Je l'ai donc laiss&#233; un peu de c&#244;t&#233; en attendant le bon moment pour r&#233;aliser mon deuxi&#232;me projet pour ce petit bijoux.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Incompatibilit&#233;&lt;/h2&gt;
&lt;p&gt;J'avais install&#233; toutes les librairies n&#233;cessaires pour Gladys et elle-m&#234;me &#233;galement. Or, ces versions sont conflictuelles avec ce que MagicMirror&#178; d&#233;sire. Je vais &#234;tre honn&#234;te, &#231;a me prendrait plus de temps de d&#233;sinstaller chaque composant plut&#244;t que de refaire la carte SD &#224; partir de l'image de Raspbian fourni par raspberry.org.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Recommen&#231;ons&lt;/h2&gt;
&lt;p&gt;Le premier point est de refaire la carte SD avec l'image &lt;i&gt;2018-04-18-raspbian-stretch&lt;/i&gt; issue du site officiel. Cela aura pour effet de repartir de z&#233;ro.&lt;/p&gt;
&lt;p&gt;Cela fait, on remet la carte SD dans le Raspberry PI pour un red&#233;marrage. Ce dernier point se passe quand m&#234;me rapidement. Il n'y a pratiquement rien &#224; faire. Les choses sont bien ficel&#233;es.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation de packages&lt;/h2&gt;
&lt;p&gt;Il est n&#233;cessaire d'installer quelques petits packages pour assurer leur disponibilit&#233; au moment voulu :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt-get install git zip unzip curl wget&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Oui, ce n'est pas vraiment n&#233;cessaire avec une installation fra&#238;che. Toutefois, cette action permettra de mettre tout le monde au m&#234;me niveau.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Mise &#224; jour des packages&lt;/h2&gt;
&lt;p&gt;Comme dans le pr&#233;c&#233;dent tutoriel, j'ai mis &#224; jour les packages et le firmware :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt-get update; sudo apt-get upgrade; sudo apt-get autoremove; sudo rpi-update; sudo apt-get clean&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A la fin de cette ligne, je vide le cache puis un red&#233;marrage : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo reboot&lt;/code&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation de Node et MagicMirror&#178;&lt;/h2&gt;
&lt;p&gt;Le red&#233;marrage &#233;tant fait, on va maintenant lancer les scripts initiaux :&lt;br class='autobr' /&gt;
&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;wget -O - https://raw.githubusercontent.com/audstanley/NodeJs-Raspberry-Pi/master/Install-Node.sh | sudo bash node -v&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;MagicMirror&#178;&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;bash -c &#034;$(curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/master/installers/raspberry.sh)&#034;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J'ai vu qu'une branche develop &#233;tait pr&#233;sente et des commits sur cette branche r&#233;glaient quelques bugs. Alors, je passe &#224; cette branche :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~/MagicMirror/ git checkout -b develop git pull&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Apr&#232;s cela, on peut lancer l'installation :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Tout s'est bien pass&#233; pour mon installation. Cool.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation des modules&lt;/h2&gt;
&lt;p&gt;Pour mes besoins actuels, j'utilise les modules suivants :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://github.com/tataille/MMM-FreeBox-Monitor&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;MMM-Freebox-Monitor&lt;/a&gt; ;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://github.com/spectroman/mmm-moon-phases&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;MMM-moon-phases&lt;/a&gt; ;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://github.com/edward-shen/MMM-page-indicator&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;MMM-page-indicator&lt;/a&gt; ;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://github.com/edward-shen/MMM-pages&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;MMM-pages&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Le principe d'installation est le m&#234;me pour tous les modules :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~/MagicMirror/modules/ git clone https://github.com/user/mmm-nom-module&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Soit :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~/MagicMirror/modules/ git clone https://github.com/tataille/MMM-FreeBox-Monitor.git git clone https://github.com/spectroman/mmm-moon-phases.git git clone https://github.com/edward-shen/MMM-page-indicator.git git clone https://github.com/edward-shen/MMM-pages.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour le reste, la configuration des modules se fait dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/MagicMirror/config/config.js&lt;/code&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Configuration du fichier config.js&lt;/h2&gt;
&lt;p&gt;Comme le demande la documentation de MagicMirror&#178;, on doit copier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/MagicMirror/config/config.js.sample&lt;/code&gt; vers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/MagicMirror/config/config.js&lt;/code&gt;&lt;br class='autobr' /&gt;
Cela dit&#8230; Je ne vais pas faire &#231;a. :-D&lt;/p&gt;
&lt;p&gt;En effet, je vais faire en sorte d'avoir une version du fichier config.js qui soit versionn&#233;e sur un git.&lt;br class='autobr' /&gt;
Comme tout projet git, il n'est pas possible de cibler sur un fichier purement et simplement (comme le ferait svn par exemple). De ce fait, j'ai cr&#233;&#233; sur &lt;a href=&#034;https://gitlab.com&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Gitlab.com&lt;/a&gt; un projet qui sera en mode priv&#233;.&lt;/p&gt;
&lt;p&gt;On peut nommer ce projet &#034;magicmirror_config&#034; pour faire simple.&lt;br class='autobr' /&gt;
Depuis le terminal, je tape les lignes suivantes :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~/ git clone https://gitlab.com/user/magicmirror_config.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant, je cr&#233;e un lien symbolique dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/MagicMirror/config/&lt;/code&gt; pointant vers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/magicmirror_config/config.js&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~/MagicMirror/config/ mv config.js config.js.old ln -s ~/magicmirror_config/config.js config.js&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Par la m&#234;me occasion, j'ai fait la m&#234;me chose avec le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/MagicMirror/css/custom.css&lt;/code&gt;. Pratique pour personnaliser son affichage graphiquement.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~/MagicMirror/css/ mv custom.css custom.css.old ln -s ~/magicmirror_config/custom.css custom.css&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;D&#233;marrage automatique de MagicMirror&#178;&lt;/h2&gt;
&lt;p&gt;Comme indiqu&#233; dans &lt;a href=&#034;https://github.com/MichMich/MagicMirror/wiki/Auto-Starting-MagicMirror&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/MichMich/MagicMirror/wiki/Auto-Starting-MagicMirror&lt;/a&gt;, il est possible de lancer automatiquement MagicMirror&#178; au d&#233;marrage. Pour cela, il est n&#233;cessaire d'installer PM2 sur la machine.&lt;br class='autobr' /&gt;
Le script d'installation de MagicMirror&#178; le fait. Mais j'ai eu un souci que je ne saurais identifier pour le moment. Je verrai cela plus tard.&lt;/p&gt;
&lt;p&gt;Le script a bien install&#233; pm2 mais n'a pas fait les liens symboliques pour ce stretch. Cela se trouve dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/opt/nodejs/bin/&lt;/code&gt;.&lt;br class='autobr' /&gt;
Sur stretch, on fait un lien vers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/alternatives/&lt;/code&gt; puis de l&#224;, un lien dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/usr/bin/&lt;/code&gt;.&lt;br class='autobr' /&gt;
Voici le code &#224; taper dans Terminal :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo ln -s /opt/nodejs/bin/pm2 /etc/alternatives/pm2 sudo ln -s /etc/alternatives/pm2 /usr/bin/pm2 sudo ln -s /opt/nodejs/bin/pm2-dev /etc/alternatives/pm2-dev sudo ln -s /etc/alternatives/pm2-dev /usr/bin/pm2-dev sudo ln -s /opt/nodejs/bin/pm2-docker /etc/alternatives/pm2-docker sudo ln -s /etc/alternatives/pm2-docker /usr/bin/pm2-docker sudo ln -s /opt/nodejs/bin/pm2-runtime /etc/alternatives/pm2-runtime sudo ln -s /etc/alternatives/pm2-runtime /usr/bin/pm2-runtime&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Cr&#233;er un fichier de d&#233;marrage de MagicMirror&#178;&lt;/strong&gt;&lt;br class='autobr' /&gt;
Pour nous simplifier la t&#226;che, il est conseill&#233; de cr&#233;er un fichier bash :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~ nano mm.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis d'ajouter les lignes suivantes :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~/MagicMirror DISPLAY=:0 npm start&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On enregistre le tout. Puis on le rend ex&#233;cutable.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;chmod +x mm.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;D&#233;marrer MagicMirror&#178; avec PM2&lt;/h2&gt;
&lt;p&gt;C'est vraiment tout simple :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;pm2 start mm.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Activer le d&#233;marrage du script&lt;/strong&gt;&lt;br class='autobr' /&gt;
On doit &#234;tre s&#251;r que le script soit lanc&#233; au d&#233;marrage. Pour cela, on sauvegarde les r&#233;glages actuels de PM2 :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;pm2 save&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Contr&#244;ler son MagicMirror&#178; via PM2&lt;/h2&gt;
&lt;p&gt;Avec MagicMirror fonctionnant via PM2, on dispose d'outils pratiques :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Red&#233;marrer MagicMirror&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;pm2 restart mm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Arr&#234;ter MagicMirror&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;pm2 stop mm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Afficher les logs MagicMirror&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;pm2 logs mm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Afficher les informations sur le processus MagicMirror&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;pm2 show mm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;row&#034;&gt; &lt;div class=&#034;col-xs-12&#034;&gt; &lt;h2&gt;A lire aussi&lt;/h2&gt; &lt;ul class=&#034;spip spip-list&#034;&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-un-miroir-qui-vous-veut-du-bien'&gt;MagicMirror&#178;, un miroir qui vous veut du bien.&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;em&gt;MagicMirror&#178;, on recommence depuis le d&#233;but&lt;/em&gt;&lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-un-socle-qui-lui-va-comme-un-gant'&gt;MagicMirror&#178;, un socle qui lui va comme un gant&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-un-Raspberry-Pi-un-ecran-et-cie-sont-dans-un-bateau'&gt;MagicMirror&#178;, un Raspberry Pi, un &#233;cran et cie sont dans un bateau&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-ma-configuration-personnalisee'&gt;MagicMirror&#178;, ma configuration personnalis&#233;e&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-configuration-scriptee'&gt;MagicMirror&#178;, configuration script&#233;e&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror%C2%B2-configuration-scriptee-2eme-partie'&gt;MagicMirror&#178;, configuration script&#233;e, 2&#232;me partie&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>MagicMirror&#178;, un miroir qui vous veut du bien.</title>
		<link>https://www.preprod.teddypayet.com/MagicMirror2-un-miroir-qui-vous-veut-du-bien</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/MagicMirror2-un-miroir-qui-vous-veut-du-bien</guid>
		<dc:date>2018-06-01T15:09:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Lignes de commandes</dc:subject>
		<dc:subject>Javascript</dc:subject>
		<dc:subject>Personnel</dc:subject>
		<dc:subject>MagicMirror</dc:subject>
		<dc:subject>Domotique</dc:subject>

		<description>
&lt;p&gt;Le &#8220;MagicMirror&#178;&#8221; est un projet open source qui a &#233;t&#233; mis &#224; disposition par son cr&#233;ateur : Michael Teeuw Pr&#233;sentation : &#8220;MagicMirror&#178; est une plate-forme modulaires open source de miroirs intelligents. Avec une liste croissante de modules installables, le MagicMirror&#178; vous permet de convertir votre couloir ou votre miroir de salle de bains en votre assistant personnel. MagicMirror&#178; est construit par le cr&#233;ateur du MagicMirror original avec l'aide incroyable d'une communaut&#233; croissante de (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.preprod.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Lignes-de-commandes" rel="tag"&gt;Lignes de commandes&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Javascript" rel="tag"&gt;Javascript&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Personnel" rel="tag"&gt;Personnel&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/MagicMirror" rel="tag"&gt;MagicMirror&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Domotique" rel="tag"&gt;Domotique&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH110/arton150-51e5b.png?1724428492' class='spip_logo spip_logo_right' width='150' height='110' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Le &#8220;&lt;a href=&#034;https://magicmirror.builders/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;MagicMirror&#178;&lt;/a&gt;&#8221; est un projet open source qui a &#233;t&#233; mis &#224; disposition par son cr&#233;ateur : &lt;a href=&#034;http://michaelteeuw.nl/post/142629029062/magicmirror2-a-huge-announcement&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Michael Teeuw&lt;/a&gt;&lt;br class='autobr' /&gt;
Pr&#233;sentation : &#8220;MagicMirror&#178; est une plate-forme modulaires open source de miroirs intelligents. Avec une liste croissante de modules installables, le MagicMirror&#178; vous permet de convertir votre couloir ou votre miroir de salle de bains en votre assistant personnel. MagicMirror&#178; est construit par le cr&#233;ateur du MagicMirror original avec l'aide incroyable d'une communaut&#233; croissante de contributeurs.&#8221;&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;style&gt; body { background-color: white; } .image_intro div.image { background-color: black; } &lt;/style&gt; &lt;iframe src=&#034;https://player.vimeo.com/video/171152845&#034; width=&#034;640&#034; height=&#034;360&#034; frameborder=&#034;0&#034; allowfullscreen&gt;&lt;/iframe&gt;&lt;h2 class=&#034;spip&#034;&gt;Le mat&#233;riel&lt;/h2&gt;
&lt;p&gt;Le mat&#233;riel n&#233;cessaire est le suivant :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Un Raspberry Pi 3 (ne pas oublier une source d'alimentation) ;&lt;/li&gt;&lt;li&gt; Une carte SD de 8Go (minimum) ;&lt;/li&gt;&lt;li&gt; Un clavier ;&lt;/li&gt;&lt;li&gt; Une souris ;&lt;/li&gt;&lt;li&gt; Un c&#226;ble HDMI ;&lt;/li&gt;&lt;li&gt; Un &#233;cran HDMI.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Je vous propose de voir comment installer MagicMirror&#178; (aka MM&#178;) sur votre Raspberry Pi 3. Bien entendu, le moment venu, vous brancherez tous les &#233;l&#233;ments les uns aux autres lorsque vous devrez vous connecter au Raspberry PI.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation du Raspberry Pi&lt;br/&gt;
Pr&#233;parer une carte SD.&lt;/h2&gt;
&lt;p&gt;Il est n&#233;cessaire d'installer Raspbian sur votre carte SD pour optimiser votre utilisation du Raspberry Pi et de MagicMirror&#178;. Cette op&#233;ration doit &#234;tre r&#233;alis&#233;e depuis un ordinateur (Windows, Mac, Linux)&lt;/p&gt;
&lt;p&gt;Aller sur l'url &lt;a href=&#034;https://www.raspberrypi.org/downloads/raspbian/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.raspberrypi.org/downloads/raspbian/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;T&#233;l&#233;charger la derni&#232;re version de Raspbian (en mai 2018, &lt;i&gt;Raspbian Stretch with desktop&lt;/i&gt;). Une fois t&#233;l&#233;charg&#233; sur votre ordinateur, veuillez d&#233;compresser le fichier.&lt;/p&gt;
&lt;p&gt;Avec le r&#233;pertoire extrait, vous pouvez pr&#233;parer la carte SD. Ins&#233;rez votre carte SD dans votre ordinateur. Ouvrez votre logiciel* de gestion de disques (SD Card Formatter, Win32 Disk Imager, Utilitaire de Disques, etc.). S&#233;lectionnez votre carte SD et lui donner un nom (de pr&#233;f&#233;rence sans espace ou accents pour simplifier les lignes de commandes). R&#233;f&#233;rez-vous &#224; la documentation propre &#224; votre logiciel pour toutes ces &#233;tapes.&lt;/p&gt;
&lt;p&gt;S&#233;lectionnez l'image de Raspbian fra&#238;chement extrait pour l'importer sur la carte SD. Lancez l'&#233;criture de cette image sur la carte.&lt;/p&gt;
&lt;p&gt;Cela fait, &#233;jectez la carte SD.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;D&#233;marrer et configurer le Raspberry Pi&lt;/h2&gt;
&lt;p&gt;Maintenant que la carte SD est pr&#234;te avec Raspbian, il est n&#233;cessaire de l'ins&#233;rer dans le Raspberry Pi.&lt;/p&gt;
&lt;p&gt;Connecter le c&#226;ble HDMI &#224; l'&#233;cran puis au Raspberry. Allumez votre &#233;cran. Branchez le clavier, la souris au Raspberry. Ne pas oublier maintenant de brancher la source d'alimentation du Raspberry.&lt;/p&gt;
&lt;p&gt;Au premier d&#233;marrage du Raspberry Pi, cela peut prendre un peu de temps. Vous serez invit&#233; &#224; renseigner le mot de passe pour l'utilisateur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;pi&lt;/code&gt; (soit par d&#233;faut : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;raspberry&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Depuis le terminal, entrez &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo raspi-config&lt;/code&gt; et validez. Cela lancera la configuration du Raspberry. Choisissez &#8220;&lt;i&gt;Expand Filesystem&lt;/i&gt;&#8221; en tapant sur la touche &#8220;&lt;i&gt;Entr&#233;e&lt;/i&gt;&#8221;. On utilisera ainsi tout l'espace de la carte SD.&lt;br class='autobr' /&gt;
Cela fait, on s&#233;lectionne &#8220;Internationalisation Options&#8221; pour choisir la langue d&#233;sir&#233;e. Le faire &#224; votre convenance : la langue, le timezone, le format du clavier, le protocole Wifi.&lt;/p&gt;
&lt;p&gt;Maintenant, on va choisir &#8220;&lt;i&gt;Advanced options&lt;/i&gt;&#8221;, puis &#8220;&lt;i&gt;Hostname&lt;/i&gt;&#8221;. Par d&#233;faut, on a &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;raspberrypi&lt;/code&gt;. Mais au vu du projet, on peut appeler &#231;a &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;magicpi&lt;/code&gt;. A votre convenance ici :-)&lt;/p&gt;
&lt;p&gt;Apr&#232;s cela, revenir sur &#8220;&lt;i&gt;Advanced options&lt;/i&gt;&#8221; et choisir &#8220;&lt;i&gt;SSH&lt;/i&gt;&#8221;. Il sera utile de pouvoir une connexion SSH pour acc&#233;der au Raspberry &#224; distance.&lt;/p&gt;
&lt;p&gt;On devrait &#234;tre bon maintenant. Revenir &#224; l'&#233;cran principal et utiliser la touche de tabulation pour mettre en surbrillance &#8220;&lt;i&gt;Finish&lt;/i&gt;&#8221; en bas de l'&#233;cran et cliquer sur &#8220;&lt;i&gt;Entr&#233;e&lt;/i&gt;&#8221;. A la demande de red&#233;marrage, cliquer sur &#8220;&lt;i&gt;Yes&lt;/i&gt;&#8221;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Configurer le Wifi du Raspberry Pi&lt;/h2&gt;
&lt;p&gt;Une particularit&#233; du Raspberry Pi 3 est d'avoir le wifi nativement. Il va falloir le configurer pour avoir acc&#232;s &#224; votre r&#233;seau internet.&lt;/p&gt;
&lt;p&gt;Apr&#232;s le red&#233;marrage, vous aurez un bureau graphique Linux. Lancez le Terminal, vous y configurez le wifi en &#233;ditant le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;wpa_supplicant.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nano /etc/wpa_supplicant/wpa_supplicant.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A la fin du fichier, renseignez vos informations de connexion :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;network={ ssid=&#034;votre_nom_de_reseau&#034; psk=&#034;votre_mot_de_passe_reseau&#034; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour enregistrer votre configuration, cliquer sur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;CTRL-X&lt;/code&gt; puis sur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Y&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Il faut red&#233;marrer votre raspberry : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo reboot&lt;/code&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Nettoyer et mettre &#224; jour le syst&#232;me&lt;/h2&gt;
&lt;p&gt;Bon, tout cela est sympa, mais il va falloir mettre tout ce petit monde &#224; jour et faire maigrir tout &#231;a.&lt;/p&gt;
&lt;p&gt;Depuis votre Terminal, taper &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;df -h&lt;/code&gt; pour avoir la capacit&#233; actuelle de votre Raspberry. Notez l'espace utilis&#233; pour le comparer.&lt;/p&gt;
&lt;p&gt;On va supprimer quelques packages inutiles pour le MM&#178; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt-get remove --purge idle3 java-common libreoffice* minecraft-pi scratch nuscratch penguinspuzzle python-minecraftpi python3-minecraftpi smartsim sonic-pi wolfram-engine&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt-get clean sudo apt-get autoremove&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cela va prendre un petit moment pour que ces op&#233;rations se terminent. Soyez patient et pas trop loin de votre &#233;cran pour valider certaines op&#233;rations. Faites &#224; nouveau &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;df -h&lt;/code&gt; dans votre terminal et remarquez le changement.&lt;/p&gt;
&lt;p&gt;Continuons. Il est temps de mettre &#224; jour vos packages :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt-get update ; sudo apt-get upgrade ; sudo rpi-update.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;&#8220;update&#8221;&lt;/strong&gt; met &#224; jour la liste des packages disponibles et leur version ;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&#8220;upgrade&#8221;&lt;/strong&gt; met &#224; jour les packages install&#233;es ;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;&#8220;rpi-update&#8221;&lt;/strong&gt; va quant &#224; lui mettre &#224; jour le firmware du Raspberry Pi.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Respirez &#224; nouveau et tapez &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sudo reboot&lt;/code&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation de MagicMirror&#178;&lt;/h2&gt;
&lt;p&gt;Le Raspberry est pr&#234;t. Alors, installons le temps attendu MagicMirror&#178;.&lt;/p&gt;
&lt;p&gt;Il existe un script qui permettra d'installer MM&#178; comme il se doit. Toutefois, il arrive que l'installation du package &#8220;node&#8221; pose un probl&#232;me. Le script installe une version NodeJS 9.x. La version de &lt;strong&gt;node test&#233;e par MM&#178;&lt;/strong&gt; est la &lt;strong&gt;5.1.0&lt;/strong&gt;. Si vous avec une version inf&#233;rieure, cela bloquera l'installation de composants node qui n&#233;cessitent eux un node 4.6.x minimum.&lt;br class='autobr' /&gt;
&lt;i&gt;Il faudra faire attention &#224; la version de NodeJS surtout si vous avez depuis un moment votre Raspberry Pi. Ce qui &#233;tait mon cas. J'avais un node v4.4.2 qui forc&#233;ment n'&#233;tait pas au go&#251;t de MM&#178;.&lt;/i&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation pr&#233;alable de NodeJS&lt;/h2&gt;
&lt;p&gt;Pour y rem&#233;dier, vous allez installer node en premier. Tapez ceci dans votre Terminal :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;wget -O - https://raw.githubusercontent.com/audstanley/NodeJs-Raspberry-Pi/master/Install-Node.sh | sudo bash node -v&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce script bash installera par d&#233;faut la version NodeJS 10.x. Il est possible de changer la version de NodeJS en tapant ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo node-install -v 9; # then you will get prompted with which # specific version of 9 you wish to install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mais on n'en est pas l&#224;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Ex&#233;cution du script pour MagicMirror&#178;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NodeJS &#233;tant install&#233;,&lt;/strong&gt; vous allez lancer le script d'installation de MagicMirror&#178; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;bash -c &#034;$(curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/master/installers/raspberry.sh)&#034;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cela lancera le processus d'installation pour vous. Ne partez pas trop loin du Raspberry car des validations seront &#224; faire au fil de l'eau.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention, le script d'installation de MM&#178; s'occupe d&#233;j&#224; d'installer un NodeJS&lt;/strong&gt; &lt;i&gt;(v9.x en mai 2018)&lt;/i&gt;. Donc, vous pourriez vous passer de l'&#233;tape pr&#233;c&#233;dente en r&#233;alit&#233;. Mais si vous d&#233;sirez tester sur d'autres versions de NodeJS, une installation manuelle, cit&#233;e pr&#233;c&#233;demment, vous facilitera grandement la t&#226;che.&lt;br class='autobr' /&gt;
&lt;strong&gt;Si le script de MM&#178; d&#233;tecte un node existant, il sautera cette &#233;tape et vous indiquera qu'il faudra mettre &#224; jour node si votre version est inf&#233;rieure &#224; la version test&#233;e.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Configuration compl&#233;mentaire&lt;/h2&gt;
&lt;p&gt;Le script s'est bien d&#233;roul&#233;. Vous devez configurer quelques points compl&#233;mentaires sp&#233;cifiques &#224; MM&#178;. Il faut par exemple indiquer que l'&#233;cran est &#224; la verticale. Tapez :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nano /boot/config.txt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et ajoutez &#224; la fin du fichier les lignes suivantes :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# Rotate display vertically display_rotate=1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Appuyez sur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;CTRL-X&lt;/code&gt; quand vous avez fini puis &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Y&lt;/code&gt; pour sauvegarder vos modifications.&lt;br class='autobr' /&gt;
Raspbian lance un &#233;cran de veille au bout d'un certain temps. De ce fait, nous allons d&#233;sactiver ceci en modifiant un fichier :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nano /etc/xdg/lxsession/LXDE-pi/autostart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ajoutez &#224; la fin du fichier ces lignes :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;@xset s noblank @xset s off @xset -dpms&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Modifiez le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;lightdm.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nano /etc/lightdm/lightdm.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Recherchez la ligne &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;xserver-command&lt;/code&gt; en descendant plus bas. Y renseigner ces valeurs :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;xserver-command=X -s 0 -dpms&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enlevez le &#171; # &#187; en d&#233;but de ligne si besoin. Enregistrez vos modifications &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;CTRL-X&lt;/code&gt; puis &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Y&lt;/code&gt; et entr&#233;e.&lt;/p&gt;
&lt;p&gt;Pour des soucis d'&#233;conomie d'&#233;nergie Raspberry d&#233;sactive certains composants dont le wifi. En modifiant un param&#232;tre dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/network/interfaces&lt;/code&gt;, cette fonctionnalit&#233; sera ineffective :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nano /etc/network/interfaces&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cherchez &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;wlan0&lt;/code&gt; et ajoutez, en-dessous, la ligne suivante :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;wireless-power off&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sauvegardez vos modifications et red&#233;marrez votre Raspberry Pi :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo reboot&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A ce stade, vous avez configur&#233; enti&#232;rement votre MM&#178;. Il vous faudra le personnaliser en &#233;ditant le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt; et/ou en ajoutant des modules suppl&#233;mentaires.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~/MagicMirror/config cp config.js.sample config.js&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et maintenant, vous pouvez l'essayer :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~$HOME/MagicMirror npm start&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Enjoy !&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Sources :&lt;/h2&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://magicmirror.builders/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://magicmirror.builders/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://github.com/MichMich/MagicMirror/wiki/Configuring-the-Raspberry-Pi&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://github.com/MichMich/MagicMirror/wiki/Configuring-the-Raspberry-Pi&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://github.com/audstanley/NodeJs-Raspberry-Pi&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://github.com/audstanley/NodeJs-Raspberry-Pi&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://raspbian-france.fr/creez-carte-sd-raspbian-raspberry-pi-windows/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://raspbian-france.fr/creez-carte-sd-raspbian-raspberry-pi-windows/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://forum.magicmirror.builders/topic/236/complete-setup-tutorial&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://forum.magicmirror.builders/topic/236/complete-setup-tutorial&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://www.raspberrypi.org/documentation/installation/installing-images/mac.md&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://www.raspberrypi.org/documentation/installation/installing-images/mac.md&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;row&#034;&gt; &lt;div class=&#034;col-xs-12&#034;&gt; &lt;h2&gt;A lire aussi&lt;/h2&gt; &lt;ul class=&#034;spip spip-list&#034;&gt; &lt;li class=&#034;item&#034;&gt;&lt;em&gt;MagicMirror&#178;, un miroir qui vous veut du bien.&lt;/em&gt;&lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-on-recommence-depuis-le-debut'&gt;MagicMirror&#178;, on recommence depuis le d&#233;but&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-un-socle-qui-lui-va-comme-un-gant'&gt;MagicMirror&#178;, un socle qui lui va comme un gant&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-un-Raspberry-Pi-un-ecran-et-cie-sont-dans-un-bateau'&gt;MagicMirror&#178;, un Raspberry Pi, un &#233;cran et cie sont dans un bateau&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-ma-configuration-personnalisee'&gt;MagicMirror&#178;, ma configuration personnalis&#233;e&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-configuration-scriptee'&gt;MagicMirror&#178;, configuration script&#233;e&lt;/a&gt; &lt;/li&gt; &lt;li class=&#034;item&#034;&gt;&lt;a href='https://www.preprod.teddypayet.com/MagicMirror%C2%B2-configuration-scriptee-2eme-partie'&gt;MagicMirror&#178;, configuration script&#233;e, 2&#232;me partie&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Installer Homebrew sur Mac OSX</title>
		<link>https://www.preprod.teddypayet.com/Installer-Homebrew-sur-Mac-OSX</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/Installer-Homebrew-sur-Mac-OSX</guid>
		<dc:date>2016-03-02T08:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Lignes de commandes</dc:subject>
		<dc:subject>Mac OS</dc:subject>

		<description>
&lt;p&gt;Il arrive souvent quand on d&#233;veloppe qu'il nous soit n&#233;cessaire d'installer certains outils pour mieux travailler. Il existe plusieurs solutions pour y arriver : faire le tout &#224; la main en compilant les sources de l'outil (pas simple pour tout le monde, m&#234;me pour moi) ; utiliser MacPorts pour installer les outils (je vous partagerai bient&#244;t un pas &#224; pas pour son installation) ; utiliser Homebrew pour installer les outils. &lt;br class='autobr' /&gt; Pr&#233;sentation de Homebrew Homebrew nous permet d'installer des (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.preprod.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Lignes-de-commandes" rel="tag"&gt;Lignes de commandes&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Mac-OS" rel="tag"&gt;Mac OS&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH100/arton144-101cb.jpg?1724428394' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Il arrive souvent quand on d&#233;veloppe qu'il nous soit n&#233;cessaire d'installer certains outils pour mieux travailler. Il existe plusieurs solutions pour y arriver :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; faire le tout &#224; la main en compilant les sources de l'outil (pas simple pour tout le monde, m&#234;me pour moi) ;&lt;/li&gt;&lt;li&gt; utiliser MacPorts pour installer les outils (je vous partagerai bient&#244;t un pas &#224; pas pour son installation) ;&lt;/li&gt;&lt;li&gt; utiliser Homebrew pour installer les outils.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;sentation de Homebrew&lt;/h2&gt;
&lt;p&gt;Homebrew nous permet d'installer des outils qu'Apple n'a pas install&#233; sur MacOS. G&#233;n&#233;ralement ceux sont des utilitaires accessibles par lignes de commande. Donc si vous y &#234;tes allergiques, passez votre chemin.&lt;br class='autobr' /&gt;
La communaut&#233; autour d'Homebrew est grande et r&#233;active. Ce qui a l'avantage de nous donner acc&#232;s &#224; un panel tr&#232;s large d'outils. Ces outils sont souvent issus de la communaut&#233; Linux (Ubuntu, Debian et cie).&lt;br class='autobr' /&gt;
&lt;strong&gt;Pour simplifier l'id&#233;e, c'est un gestionnaire de packages (cf. nos outils).&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation&lt;/h2&gt;
&lt;p&gt;Comme le dit la page d'accueil du &lt;a href=&#034;http://brew.sh&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;site d'Homebrew&lt;/a&gt; le moyen le plus simple est de taper cette ligne dans votre Terminal :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;/usr/bin/ruby -e &#034;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&#034;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le script va nous expliquer les actions qu'il va r&#233;aliser avant de les lancer. Il nous suffira de valider son message pour que l'installation puisse se lancer. Cela fait, nous pouvons lancer la ligne de commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;brew doctor&lt;/code&gt; pour savoir si tout est op&#233;rationnel pour Homebrew sur notre syst&#232;me d'exploitation. Suivre les indications de cet utilitaire le cas &#233;ch&#233;ant.&lt;/p&gt;
&lt;p&gt;Homebrew installe ses packages dans son r&#233;pertoire (cf. &lt;i&gt;&#034;Cellar&#034;&lt;/i&gt;) et cr&#233;era des alias dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/usr/local/&lt;/code&gt;. C'est un avantage pour reconnaitre ce qui a &#233;t&#233; install&#233; par Homebrew sans alt&#233;rer notre OS.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;exemple_gruntjs&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Exemple d'utilisation : GruntJS&lt;/h2&gt;
&lt;p&gt;Lorsqu'on r&#233;alise des sites (ce n'est qu'un exemple), nous r&#233;alisons des actions r&#233;p&#233;titives. Mais voil&#224;&#8230; le faire manuellement est chronophage. Pour &#233;viter cela, il existe &lt;a href=&#034;http://gruntjs.com&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;GruntJS&lt;/a&gt; (je vous invite &#224; lire &lt;a href=&#034;http://gruntjs.com/getting-started&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la documentation officielle&lt;/a&gt;). Pour installer GruntJS, on a besoin de &lt;a href=&#034;https://nodejs.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Node.js&lt;/a&gt; et de &lt;a href=&#034;https://www.npmjs.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;npm&lt;/a&gt;. Et c'est l&#224; qu'intervient Homebrew.&lt;/p&gt;
&lt;p&gt;Voici le code &#224; ex&#233;cuter pour installer &lt;i&gt;Node.js&lt;/i&gt; et &lt;i&gt;npm&lt;/i&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;brew install node npm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;npm install -g grunt-cli&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et voil&#224;, le tour est jou&#233;.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;exemple_wget&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Exemple d'installation : wget&lt;/h2&gt;
&lt;p&gt;Sous MacOS, on a acc&#232;s &#224; &lt;i&gt;curl&lt;/i&gt; en lignes de commande mais pas &#224; &lt;i&gt;wget&lt;/i&gt;. Les 2 sont similaires ou du moins peuvent servir aux m&#234;me t&#226;ches. Toutefois pour aspirer un site sur son ordinateur, il est plus ais&#233; d'utiliser la commande &lt;i&gt;wget&lt;/i&gt;. Il est tr&#232;s simple d'installer cette commande par l'interm&#233;diaire de Homebrew :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;brew install wget&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Mettre &#224; jour sa version d'Homebrew et ses packages&lt;/h2&gt;
&lt;p&gt;Comme indiqu&#233; dans la documentation officielle d'Homebrew, si on d&#233;sire mettre &#224; jour ce dernier, il suffit de saisir la ligne de commande suivante :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;brew update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Oui, mais est-ce que nous avons des packages qui ont besoin d'une mise &#224; jour ? Pour le v&#233;rifier, taper cette ligne de commande dans votre Terminal :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;brew outdated&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Homebrew nous indiquera donc la liste des mises &#224; jour disponibles pour nos packages. S'il nous dit que tout est &#224; jour, eh bien, tant mieux ! Sinon, il nous faut saisir cette ligne de commande :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;brew update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et tous nos packages se mettront &#224; jour.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Ce gestionnaire de package n'est pas encore dans une version &#034;1&#034; &#224; l'heure actuelle mais il est d&#233;j&#224; suffisamment robuste pour nous permettre de travailler sereinement.&lt;br class='autobr' /&gt;
De plus, si nous avons besoin de connaitre la liste des packages disponibles sous Homebrew, il existe un site d&#233;di&#233; : &lt;s&gt;http://brewformulas.org/&lt;/s&gt; &lt;a href=&#034;https://formulae.brew.sh&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://formulae.brew.sh&lt;/a&gt;&lt;br class='autobr' /&gt;
Un formulaire de recherche y est disponible, donc vous n'aurez pas d'excuses pour ne pas trouver le package qui vous va bien.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;&#169; Photo par &lt;a href=&#034;https://stock.tookapic.com/photos/27594&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Maciej Korsan&lt;/a&gt;&lt;br class='autobr' /&gt;
Le visuel de la bi&#232;re a &#233;t&#233; choisi en rapport avec l'histoire d'Homebrew. En effet, en anglais, &#034;brew&#034; veut dire &#034;breuvage&#034;. Et le cr&#233;ateur de ce projet avait choisi ce nom car il aimait beaucoup tout ce qui touchait &#224; la bi&#232;re, sans avoir consid&#233;r&#233; que son projet allait avoir tant d'influence. Quand il l'a r&#233;alis&#233;, c'&#233;tait d&#233;j&#224; trop tard. &lt;br class='autobr' /&gt;
&lt;i&gt;&lt;a href=&#034;https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/FAQ.md#homebrew-is-a-poor-name-it-is-generic-why-was-it-chosen&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;R&#233;f&#233;rence&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>R&#233;cup&#233;rer des fichiers d'un serveur &#224; un autre par SFTP</title>
		<link>https://www.preprod.teddypayet.com/Recuperer-des-fichiers-d-un-serveur-a-un-autre-par-SFTP</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/Recuperer-des-fichiers-d-un-serveur-a-un-autre-par-SFTP</guid>
		<dc:date>2015-09-30T08:29:25Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Lignes de commandes</dc:subject>

		<description>
&lt;p&gt;Lorsqu'on d&#233;veloppe des sites, nous avons une version de chaque site selon son statut : production, pr&#233;-production, d&#233;veloppement, etc. . Il est n&#233;cessaire d'avoir les derni&#232;res images et m&#233;dias du site de production sur les autres versions du site pour avoir quelque chose au plus proche de la r&#233;alit&#233;. Bien entendu, on prend le contexte ici d'am&#233;liorations d'un site, et pas une r&#233;-&#233;criture totale du site. &lt;br class='autobr' /&gt; Pr&#233;ambule &lt;br class='autobr' /&gt;
Nous avons prendre en compte 2 types de site : la production et la (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.preprod.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Lignes-de-commandes" rel="tag"&gt;Lignes de commandes&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH99/arton136-39221.jpg?1724428492' class='spip_logo spip_logo_right' width='150' height='99' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Lorsqu'on d&#233;veloppe des sites, nous avons une version de chaque site selon son statut : production, pr&#233;-production, d&#233;veloppement, etc.&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;D'ailleurs &#224; ce sujet, je vous invite &#224; lire la documentation du plugin &#171; (&#8230;)&#034; id=&#034;nh1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;. Il est n&#233;cessaire d'avoir les derni&#232;res images et m&#233;dias du site de production sur les autres versions du site pour avoir quelque chose au plus proche de la r&#233;alit&#233;.&lt;br class='autobr' /&gt;
Bien entendu, on prend le contexte ici d'am&#233;liorations d'un site, et pas une r&#233;-&#233;criture totale du site.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;ambule&lt;/h2&gt;
&lt;p&gt;Nous avons prendre en compte 2 types de site : la production et la recette. Nous pouvons acc&#233;der &#224; minima le site de production par &lt;i&gt;sftp&lt;/i&gt; et le site de recettes par &lt;i&gt;ssh&lt;/i&gt;. Ce n'est pas une g&#233;n&#233;ralit&#233; certes, mais c'est personnellement mon quotidien.&lt;br class='autobr' /&gt;
L'arborescence que nous allons d&#233;crire est celle d'un site sous &lt;i&gt;SPIP&lt;/i&gt;. Mais &lt;strong&gt;cela n'emp&#234;chera pas l'utilisation de cette m&#233;canique sur des sites g&#233;r&#233;s par un autre CMS ou un Framework.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Se connecter au serveur de recettes&lt;/h2&gt;
&lt;p&gt;Pour cela, nous allons ouvrir le &lt;i&gt;Terminal&lt;/i&gt; pour entrer les quelques lignes de commandes ad&#233;quates. En premier lieu, nous nous connectons au serveur :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;&gt; ssh teddy.payet@recettes.example.tld&lt;/textarea&gt;
&lt;p&gt;Nous renseignons le mot de passe &#224; l'invitation du Terminal. Puis nous regardons o&#249; nous nous trouvons sur le serveur en tapant :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;&gt; pwd
/home/teddy.payet/&lt;/textarea&gt;
&lt;p&gt;Nous allons nous placer dans le r&#233;pertoire recueillant les m&#233;dias de notre site internet :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;&gt; cd /var/www/IMG/&lt;/textarea&gt;
&lt;p&gt;Bien, cela fait, nous v&#233;rifions que nous avons bien &lt;i&gt;sftp&lt;/i&gt; accessible en ligne de commande. Pour cela nous saisissons ceci :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;&gt; which sftp
/usr/bin/sftp&lt;/textarea&gt;
&lt;p&gt;Parfait si nous avons cela. Sinon, il faut installer &lt;i&gt;&#171; sftp&#187;&lt;/i&gt; sur notre serveur.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;R&#233;cup&#233;rer les m&#233;dias sur le serveur de production&lt;/h2&gt;
&lt;p&gt;Apr&#232;s les actions pr&#233;c&#233;dentes, nous pouvons maintenant se connecter au serveur de production depuis le serveur de recettes. Il nous faut saisir la ligne suivante :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;&gt; sftp teddy.payet@example.tld&lt;/textarea&gt;
&lt;p&gt;Nous tapons le mot de passe maintenant. V&#233;rifions o&#249; nous nous trouvons sur le serveur de production :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;&gt; pwd
/&lt;/textarea&gt;
&lt;p&gt;Et par s&#233;curit&#233;, v&#233;rifions que le serveur de production et notamment &lt;i&gt;sftp&lt;/i&gt;, reconna&#238;t bien notre emplacement sur le serveur de recettes :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;&gt; lpwd
/var/www/IMG/&lt;/textarea&gt;
&lt;p&gt;Bien. Nous sommes presque pr&#234;ts &#224; r&#233;cup&#233;rer les m&#233;dias. Pour cela, on doit aussi se placer dans le r&#233;pertoire des m&#233;dias du site de production :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='3' class='spip_cadre spip_cadre_block' dir='ltr'&gt;&gt; cd /var/www/IMG/
&gt; pwd
/var/www/IMG/&lt;/textarea&gt;
&lt;p&gt;Maintenant, r&#233;cup&#233;rons tous les m&#233;dias de ce r&#233;pertoire et de ces sous-r&#233;pertoires :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;&gt; get -Pr .&lt;/textarea&gt;
&lt;p&gt;N'oublions pas de mettre le point &#224; la fin de la commande. Le &lt;i&gt;&#171; P &#187;&lt;/i&gt; dit &#224; &lt;i&gt;sftp&lt;/i&gt; de r&#233;cup&#233;rer tous les fichiers en gardant les propri&#233;t&#233;s des fichiers. Le &lt;i&gt;&#171; r &#187;&lt;/i&gt; indique &#224; &lt;i&gt;sftp&lt;/i&gt; de r&#233;cup&#233;rer les fichiers du r&#233;pertoires courant et de ses sous-r&#233;pertoires.&lt;br class='autobr' /&gt;
Nous verrons alors le terminal afficher chaque action et fichier r&#233;cup&#233;r&#233;s, avec le temps de chargement estim&#233; et le poids du fichier.&lt;/p&gt;
&lt;p&gt;Et voil&#224;. Rien de plus simple. Il suffit de patienter le temps que le serveur rapatrie tous les m&#233;dias du site de production vers le site de recettes.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id=&#034;nb1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh1&#034; class=&#034;spip_note&#034; title=&#034;Notes 1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;D'ailleurs &#224; ce sujet, je vous invite &#224; lire la documentation du plugin &lt;a href=&#034;http://contrib.spip.net/Plugin-Info-SPIP&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&#171; Info SPIP &#187;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Un petit clin d'&#339;il &#224; une super d&#233;veloppeuse front-end : &lt;a href=&#034;https://twitter.com/LaurieAmiot/status/649118243437846528&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;@LaurieAmiot&lt;/a&gt;&lt;br class='autobr' /&gt;
Image : &#169; &lt;a href=&#034;http://jaymantri.com/post/90704847823/download&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Jay Mantri&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Cr&#233;er un trunk sur la zone SPIP</title>
		<link>https://www.preprod.teddypayet.com/Creer-un-trunk-sur-la-zone-SPIP</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/Creer-un-trunk-sur-la-zone-SPIP</guid>
		<dc:date>2015-07-30T07:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Astuce</dc:subject>
		<dc:subject>Notes de d&#233;veloppement</dc:subject>
		<dc:subject>Mac OS</dc:subject>
		<dc:subject>SVN</dc:subject>

		<description>
&lt;p&gt;Il arrive parfois que lorsqu'on a cr&#233;&#233; un plugin sur SPIP-Zone (ou qu'on veuille reprendre le d&#233;veloppement d'un plugin sur SPIP-Zone) que ce plugin n'est pas sur la structure trunk/branches/tags. Pour reprendre ce plugin, il est conseill&#233; de mettre le r&#233;pertoire sous cette structure avant de commencer. &lt;br class='autobr' /&gt; Un script pour les commander tous ! Au lieu de faire cela ligne par ligne, commande par commande, vous pouvez lancer un script &#224; personnaliser selon le besoin. Les lignes de commande &#224; (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.preprod.teddypayet.com/Blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.preprod.teddypayet.com/Astuce" rel="tag"&gt;Astuce&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Notes-de-developpement" rel="tag"&gt;Notes de d&#233;veloppement&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/Mac-OS" rel="tag"&gt;Mac OS&lt;/a&gt;, 
&lt;a href="https://www.preprod.teddypayet.com/SVN" rel="tag"&gt;SVN&lt;/a&gt;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH100/arton135-764e1.jpg?1724428394' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Il arrive parfois que lorsqu'on a cr&#233;&#233; un plugin sur SPIP-Zone (ou qu'on veuille reprendre le d&#233;veloppement d'un plugin sur SPIP-Zone) que ce plugin n'est pas sur la structure &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;trunk/branches/tags&lt;/code&gt;. Pour reprendre ce plugin, il est conseill&#233; de mettre le r&#233;pertoire sous cette structure avant de commencer.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Un script pour les commander tous !&lt;/h2&gt;
&lt;p&gt;Au lieu de faire cela ligne par ligne, commande par commande, vous pouvez lancer un script &#224; personnaliser selon le besoin. Les lignes de commande &#224; taper ne sont pas forc&#233;ment tr&#232;s nombreuses mais elles sont r&#233;p&#233;titives. Je vais de ce fait vous montrer un script bash qui simplifiera cette migration. Mais qui dit &lt;i&gt;&#034;bash&#034;&lt;/i&gt;, dit &#234;tre donc sous un environnement UNIX : Linux, Mac OS.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Le script&lt;/h2&gt;
&lt;textarea readonly='readonly' cols='40' rows='23' class='spip_cadre spip_cadre_block' dir='ltr'&gt;#!/bin/bash
url_svn=svn://zone.spip.org/spip-zone/_plugins_/
plugin_nom=votreplugin
plugin_numero=0.9.0
svn mv ${url_svn}${plugin_nom} ${url_svn}${plugin_nom}_trunk -m &#034;On commence la migration du plugin ${plugin_nom} en trunk/branches/tags&#034;
svn mkdir ${url_svn}${plugin_nom} ${url_svn}${plugin_nom}/branches/ ${url_svn}${plugin_nom}/tags/ -m &#034;On recr&#233;e le nom du r&#233;pertoire ${plugin_nom} avec le r&#233;pertoire branches/ et tags/&#034;
svn cp ${url_svn}${plugin_nom}_trunk ${url_svn}${plugin_nom}/branches/v${plugin_numero:0:1} -m &#034;On copie les fichiers du plugin ${plugin_nom} dans sa branche v${plugin_numero:0:1}&#034;
svn cp ${url_svn}${plugin_nom}/branches/v${plugin_numero:0:1} ${url_svn}${plugin_nom}/tags/${plugin_numero} -m &#034;On pose le tag correspondant &#224; la version ${plugin_numero} du plugin ${plugin_nom}&#034;
svn mv ${url_svn}${plugin_nom}_trunk ${url_svn}${plugin_nom}/trunk -m &#034;On d&#233;place enfin le r&#233;pertoire initial vers le trunk pour le plugin ${plugin_nom} v${plugin_numero}&#034;&lt;/textarea&gt;&lt;h2 class=&#034;spip&#034;&gt;Personnalisation&lt;/h2&gt;
&lt;p&gt;Il faut copier-coller ces lignes de commande dans un fichier qui aura pour extension &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.sh&lt;/code&gt;. Pour votre plugin, vous devez changer 2 valeurs :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;i&gt;plugin_nom&lt;/i&gt; : le nom du r&#233;pertoire de votre plugin&lt;/li&gt;&lt;li&gt; &lt;i&gt;plugin_numero&lt;/i&gt; : le num&#233;ro du plugin (sous la forme &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;x.y.z&lt;/code&gt;) que vous trouverez dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;plugin.xml&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;paquet.xml&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Vous n'avez pas besoin de changer l'URL du serveur svn de la zone sauf si le plugin que vous d&#233;sirez reprendre le d&#233;veloppement n'est pas dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;_plugins_&lt;/code&gt;.&lt;br class='autobr' /&gt;
Ce script va faire &lt;strong&gt;5 commits&lt;/strong&gt; au final avec les commentaires qui vont bien avec. Pour cela, ouvrez votre terminal et lancer le script que vous avez cr&#233;&#233;.&lt;/p&gt;
&lt;p&gt;J'ai d&#233;j&#224; &#233;prouv&#233; ce script &#224; mon travail sur mes diff&#233;rents projets. &lt;strong&gt;Il est simple et efficace.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Explications&lt;/h2&gt;
&lt;p&gt;M&#234;me si le script est simple, on peut expliquer ce qui se passe et notamment l'&#233;criture particuli&#232;re de la syntaxe de bash.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Tout fichier bash commence par la ligne &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#!/bin/bash&lt;/code&gt;. Cela indique (en plus de l'extension &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.sh&lt;/code&gt;) que c'est bien un fichier&#8230; bash.&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;url_svn=&lt;/code&gt; : lorsque vous voyez un texte suivi d'un simple signe &#233;gal &lt;i&gt;&#034;=&#034;&lt;/i&gt;, c'est que vous cr&#233;ez une variable avec une valeur ;&lt;/li&gt;&lt;li&gt; Pour rappeler au besoin la variable, vous devez taper &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$&lt;/code&gt; puis le nom de la variable d&#233;sir&#233;e.&lt;/li&gt;&lt;li&gt; Pour pouvoir mettre du texte coll&#233; &#224; votre variable, il faut mettre le nom de la variable entre accolades. Exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;${plugin_nom}_trunk&lt;/code&gt; donnera &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;votreplugin_trunk&lt;/code&gt;&lt;/li&gt;&lt;li&gt; Si vous d&#233;sirez avoir les premiers caract&#232;res de votre variable, dans le rappel de votre variable, vous pouvez utiliser la forme &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;${nom_variable:debut:longueur}&lt;/code&gt; o&#249; :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;i&gt;nom_variable&lt;/i&gt; : le nom de votre variable ;&lt;/li&gt;&lt;li&gt; &lt;i&gt;debut&lt;/i&gt; : emplacement o&#249; commencer (0 &#233;tant le num&#233;ro du premier caract&#232;re) ;&lt;/li&gt;&lt;li&gt; &lt;i&gt;longueur&lt;/i&gt; : le nombre de caract&#232;res que vous d&#233;sirez r&#233;cup&#233;rer.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Plus de lecture&lt;/h2&gt;
&lt;p&gt;Le sujet du rangement sur la zone a &#233;t&#233; abord&#233; &#224; plusieurs reprises :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://contrib.spip.net/La-Zone-Facile&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://contrib.spip.net/La-Zone-Facile&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.weblog.eliaz.fr/article113.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://www.weblog.eliaz.fr/article113.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://plugins.spip.net/distribuer-une-contribution.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://plugins.spip.net/distribuer-une-contribution.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Image : &#169; &lt;a href=&#034;http://www.lifeofpix.com/gallery/squirrel/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;By Leroy&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>



</channel>

</rss>
