<?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=50&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>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>MagicMirror&#178;, configuration script&#233;e</title>
		<link>https://www.preprod.teddypayet.com/MagicMirror2-configuration-scriptee</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/MagicMirror2-configuration-scriptee</guid>
		<dc:date>2018-07-16T06:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


		<dc:subject>Lignes de commandes</dc:subject>
		<dc:subject>MagicMirror</dc:subject>
		<dc:subject>Domotique</dc:subject>

		<description>
&lt;p&gt;Toujours dans l'optique d'am&#233;liorer mon installation de MagicMirror&#178;, j'ai mis en place une mise en place automatique de mes modules. Prenez un caf&#233; ou th&#233; et voyons cela en d&#233;tail. &lt;br class='autobr' /&gt; Pour rappel, MagicMirror&#178; est install&#233; sur un Raspberry Pi 3 avec un Debian 9, Stretch. Cette installation permet donc pas mal de choses tr&#232;s sympathiques dont les crontab, la connection ssh et les scripts bash. &lt;br class='autobr' /&gt;
Pr&#233;ambule Pour des raisons de stabilit&#233;, je ne mets pas &#224; jour MagicMirror&#178; avec la derni&#232;re (&#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/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/arton156-f63be.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;Toujours dans l'optique d'am&#233;liorer mon installation de MagicMirror&#178;, j'ai mis en place une mise en place automatique de mes modules. Prenez un caf&#233; ou th&#233; et voyons cela en d&#233;tail.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Pour rappel, MagicMirror&#178; est install&#233; sur un Raspberry Pi 3 avec un Debian 9, Stretch. Cette installation permet donc pas mal de choses tr&#232;s sympathiques dont les &lt;a href=&#034;https://fr.wikipedia.org/wiki/Cron#crontab&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;crontab&lt;/a&gt;, la connection &lt;a href=&#034;https://fr.wikipedia.org/wiki/Secure_Shell&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ssh&lt;/a&gt; et les scripts &lt;a href=&#034;https://en.wikipedia.org/wiki/Bash_(Unix_shell)&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;bash&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;ambule&lt;/h2&gt;
&lt;p&gt;Pour des raisons de stabilit&#233;, je ne mets pas &#224; jour MagicMirror&#178; avec la derni&#232;re version en ligne. De m&#234;me, les modules tiers ne seront pas mis &#224; jour automatiquement. Je ne d&#233;sire pas casser mon installation avec des versions que je n'aurais pas test&#233; au pr&#233;alable. Ces derniers points seront donc mis &#224; jour manuellement pour avoir une meilleure maitrise de &#034;mon&#034; logiciel.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Versionner sa configuration&lt;/h2&gt;
&lt;p&gt;Comme vous commencez &#224; le savoir, MagicMirror&#178; a besoin d'un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config/&lt;/code&gt; pour fonctionner correctement et surtout pour avoir votre personnalisation.&lt;br class='autobr' /&gt;
Au lieu de faire des copier-coller d'une machine &#224; une autre, j'ai mis en place un d&#233;p&#244;t (priv&#233;) sur mon compte gitlab.com. J'ai clon&#233; ce d&#233;p&#244;t sur mon Raspberry. Puis, j'ai cr&#233;&#233; un lien symbolique dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/config/&lt;/code&gt; vers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/magicmirror_config/config.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;De m&#234;me, pour personnaliser la mise en page sur certains points, j'ai cr&#233;&#233; un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;custom.css&lt;/code&gt; dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/magicmirror_config/&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; est &#233;galement pr&#233;sent.&lt;br class='autobr' /&gt;
Le concept de lien symbolique est mis en place sans difficult&#233;. Voyons maintenant les scripts bash.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Bash, une installation script&#233;e&lt;/h2&gt;
&lt;p&gt;Il n'y a rien de crypter, mais tout est script&#233;, rien de sorcier. :-)&lt;/p&gt;
&lt;p&gt;Ma philosophie dans tous mes d&#233;veloppements est d'automatiser (scripter) les actions r&#233;p&#233;titives. Ici vous &#234;tes dans un cas typique d'&#233;cole : le d&#233;ploiement de codes.&lt;/p&gt;
&lt;p&gt;Je teste sur ma machine locale (mon mac) certains modules tiers (voir des versions de modules que j'aurais fait &#233;voluer).&lt;br class='autobr' /&gt;
Dans mon r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/magicmirror_config/&lt;/code&gt;, j'ai cr&#233;&#233; un fichier bash &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;update_files_config.sh&lt;/code&gt;. &lt;br class='autobr' /&gt;
Le chemin vers mes r&#233;pertoires &lt;i&gt;MagicMirror&lt;/i&gt; et &lt;i&gt;magicmirror_config&lt;/i&gt; change selon la plateforme. Au lieu de changer le chemin vers ces r&#233;pertoires &#224; chaque fois, je vais cr&#233;er 2 variables dans mon profil bash :&lt;br class='autobr' /&gt;
Sur le Raspberry Pi, dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.bashrc&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;export MM_CFG_HOME=/home/pi/magicmirror_config/ export MM_HOME=/home/pi/MagicMirror/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sur mon Mac, dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.bash_profile&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;export MM_CFG_HOME=~/Sites/magicmirror_config/ export MM_HOME=~/Sites/MagicMirror/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui vous permettra d'appeler ces variables dans notre fichier bash sans sourciller :&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/env bash _MM_CFG_HOME=$MM_CFG_HOME _MM_HOME=$MM_HOME&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Un script classique affichera du texte de la couleur par d&#233;faut que vous aurez choisit dans votre Terminal. J'ai envie de rendre cela un peu plus lisible. Pour cela, je vais utiliser du texte &lt;a href=&#034;https://stackoverflow.com/a/20983251&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;bold&lt;/a&gt; et de la &lt;a href=&#034;https://stackoverflow.com/a/5947802&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;couleur&lt;/a&gt;.&lt;br class='autobr' /&gt;
Voici ce que cela donne comme variable :&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;txt_bold=$(tput bold) txt_normal=$(tput sgr0) txt_red='\033[0;31m' txt_green='\033[0;32m' txt_nc='\033[0m' # No Color&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Les param&#232;tres de personnalisation &#034;graphique&#034; sont en place. Cool. On les utilisera en temps voulu.&lt;/p&gt;
&lt;p&gt;M&#234;me si vous avez bien export&#233; votre variables d'environnement, il est pr&#233;f&#233;rable de &lt;strong&gt;mettre une petite s&#233;curit&#233;&lt;/strong&gt; (toujours la s&#233;curit&#233; !) :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='bash spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;if [ -z ${_MM_CFG_HOME} ]; then _MM_CFG_HOME=/home/pi/magicmirror_config/ fi if [ -z ${_MM_HOME} ]; then _MM_HOME=/home/pi/MagicMirror/ fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En gros, si votre variable d'environnement est &#034;vide&#034; pour X raisons, le script va leur donner une valeur par d&#233;faut.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Bash, liens symboliques, bis&lt;/h2&gt;
&lt;p&gt;Comme expliqu&#233; au d&#233;but de cet article, MagicMirror a besoin d'un fichier config.js. De ce fait, le script v&#233;rifie sa pr&#233;sence dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/config/&lt;/code&gt;. Et si il n'existe pas, il cr&#233;e un lien symbolique vers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/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;if [ ! -f ${_MM_HOME}config/config.js ]; then ln -s ${_MM_CFG_HOME}config.js ${_MM_HOME}config/config.js fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans mon &lt;a href='https://www.preprod.teddypayet.com/MagicMirror2-ma-configuration-personnalisee' class=&#034;spip_in&#034;&gt;pr&#233;c&#233;dent article&lt;/a&gt;, j'ai indiqu&#233; que j'utilisais le module MMM-AlarmClock avec des fichiers mp3 personnalis&#233;s. Pour que le module prenne en compte ces fichiers mp3, ils doivent &#234;tre pr&#233;sents dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/MMM-AlarmClock/sounds&lt;/code&gt;.&lt;br class='autobr' /&gt;
J'ai une carte SD de 16Go, ce qui assez confortable. Mais je ne veux pas surcharger inutilement la carte m&#233;moire. Pour se faire, les liens symboliques sont &#233;galement une tr&#232;s bonne solution.&lt;/p&gt;
&lt;p&gt;Dans mon d&#233;p&#244;t &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/magicmirror_config/&lt;/code&gt;, j'ai cr&#233;&#233; un r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sounds/&lt;/code&gt; qui contiendra tous mes fichiers mp3.&lt;/p&gt;
&lt;p&gt;Pour mon besoin de fichiers mp3, voici le code pr&#233;sent :&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;if [ -d ${_MM_HOME}modules/MMM-AlarmClock ]; then #ls ${_MM_CFG_HOME}sounds/ | grep &#034;.mp3&#034; list_mp3=$(ls ${_MM_CFG_HOME}sounds/ | grep &#034;.mp3&#034;) for mp3_file in $list_mp3; do if [[ -f ${_MM_HOME}modules/MMM-AlarmClock/sounds/$mp3_file ]]; then echo &#034;Le fichier ${txt_bold}$mp3_file${txt_normal} existe dans ${_MM_HOME}modules/MMM-AlarmClock/sounds&#034;; else echo &#034;Le fichier ${txt_bold}$mp3_file${txt_normal} n'existe pas dans ${_MM_HOME}modules/MMM-AlarmClock/sounds. On cr&#233;e le lien symbolique.&#034;; ln -s ${_MM_CFG_HOME}sounds/$mp3_file ${_MM_HOME}modules/MMM-AlarmClock/sounds/$mp3_file; fi done fi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Bash, des fonctions : importer un module&lt;/h2&gt;
&lt;p&gt;Le but principal du script &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;update_files_config.sh&lt;/code&gt; est d'importer un module qui est n&#233;cessaire au fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt; pour notre MagicMirror. J'utilise plus d'un module tiers. Certainement, cela sera &#233;galement votre cas.&lt;br class='autobr' /&gt;
Au lieu de r&#233;p&#233;ter X fois le m&#234;me code, vous allez cr&#233;er &lt;a href=&#034;https://fr.wikibooks.org/wiki/Programmation_Bash/Fonctions&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;une fonction&lt;/a&gt;. Appelons la &lt;i&gt;&#034;import_module&#034;&lt;/i&gt; (module au singulier).&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;import_module () { if [[ ! -z ${1} ]]; then cd ${_MM_HOME}modules/ repository=$(basename -s .git &#034;$1&#034;) echo &#034;&#034; printf &#034;${txt_green}${txt_bold}${repository}${txt_normal}${txt_nc}\n&#034; if [[ -d ${_MM_HOME}modules/${repository} ]]; then echo &#034;** ${_MM_HOME}modules/${repository} existe d&#233;j&#224;&#034; else echo &#034;** R&#233;cup&#233;ration du r&#233;pertoire ${1}&#034; git clone ${1} fi cd ${_MM_HOME}modules/${repository} if [[ -f $(ls | grep 'package.json') &amp;&amp; ! -d $(ls | grep 'node_modules') ]]; then echo &#034;** Installation des modules npm de ${repository}&#034; npm install npm audit fix else if [[ ! -f $(ls | grep 'package.json') ]]; then echo &#034;** Il n'y a pas de modules npm &#224; installer pour ${txt_bold}${repository}${txt_normal}&#034; else echo &#034;** Les modules npm de ${txt_bold}${repository}${txt_normal} sont d&#233;j&#224; install&#233;s&#034; fi fi cd ${_MM_HOME}modules/ else printf &#034;\n${txt_red}Vous avez oubli&#233; d'indiquer un d&#233;p&#244;t git en param&#232;tre${txt_nc}\n&#034; fi }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction permet d'importer un module &#224; partir de son url git. Pour cela, vous devez indiquer l'url du git en param&#232;tre de cette fa&#231;on :&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;import_module https://github.com/Ybbet/MMM-AlarmClock.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si vous ne donnez aucune url, vous aurez un message vous indiquant que l'information est manquante.&lt;/p&gt;
&lt;p&gt;Cool&#8230; Mais ce n'est pas tout. Un module a souvent besoin d'une installation de modules pour son bon fonctionnement. Pour le savoir, autrement que de lire la documentation, le script v&#233;rifie la pr&#233;sence d'un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;package.json&lt;/code&gt; mais &#233;galement l'absence du r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;node_modules&lt;/code&gt;. En effet, l'absence de ce r&#233;pertoire indique que l'installation n'a pas encore &#233;t&#233; r&#233;alis&#233;e. Le script lancera un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;npm install &amp;&amp; npm audit fix&lt;/code&gt; dans son r&#233;pertoire local.&lt;/p&gt;
&lt;p&gt;Pas mal non ? :-)&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Bash, des fonctions : effacer les modules inutiles&lt;/h2&gt;
&lt;p&gt;Vous aurez test&#233; des modules, rejet&#233; des modules et garder des modules. Pour que le script reconnaisse votre choix, il y a une solution tr&#232;s tr&#232;s simple : le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;config.js&lt;/code&gt;&lt;br class='autobr' /&gt;
En effet, quand vous utilisez un module, vous indiquez dans votre fichier la mention &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;module: &#034;MMM-AlarmClock&#034;&lt;/code&gt; (remplacez &#034;MMM-AlarmClock&#034; par votre nom de module). Ce nom de module correspond au nom du d&#233;p&#244;t git d&#233;sir&#233; et donc du r&#233;pertoire t&#233;l&#233;charg&#233; (merci &lt;i&gt;import_module&lt;/i&gt;).&lt;br class='autobr' /&gt;
Vous l'appellerez &#034;delete_modules&#034; (modules avec un &#034;s&#034; cette fois-ci car on s'occupe de tous les modules sans distinction)&lt;/p&gt;
&lt;p&gt;Donc, il suffit de v&#233;rifier la pr&#233;sence de cette chaine de caract&#232;res dans le 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;delete_modules () { # Stocker l'ensemble des r&#233;pertoires pr&#233;sents /home/pi/MagicMirror/modules/ modules_list=$(ls ${_MM_HOME}/modules/) # Ne pas prendre en compte certains fichiers et r&#233;pertoires propres &#224; MagicMirror modules_list=${modules_list[@]//default/} modules_list=${modules_list[@]//README.md/} modules_list=${modules_list[@]//node_modules/} # lan&#231;ons une boucle pour s'occuper de chaque module. for module in ${modules_list[@]} do # Si le module n'est pas utilis&#233; dans config.js if grep -Fq &#034;module: \&#034;${module}\&#034;&#034; ${_MM_HOME}/config/config.js then echo &#034;${module} existe dans config.js&#034; else echo &#034;${module} n'existe pas dans config.js&#034; rm -rf ${_MM_HOME}/modules/${module} fi done }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Bash, oui mais dans l'ordre&lt;/h2&gt;
&lt;p&gt;Si vous n'avez pas &#233;t&#233; trop perdu, vous vous rendez compte que je parle de liens symboliques avant m&#234;me d'avoir install&#233; les modules. :-D&lt;br class='autobr' /&gt;
Ben, ouais, c'&#233;tait un petit pi&#232;ge. Ce n'est pas logique de lancer la cr&#233;ation de liens symboliques (cf. MMM-AlarmClock/sounds) dans un r&#233;pertoire si son installation n'a pas &#233;t&#233; faite d'abord. Cet ordre est surtout important lorsque vous lancez pour la premi&#232;re fois le script et/ou si vous revenez &#224; plusieurs reprises sur le choix d'un module. J'en ai fait l'exp&#233;rience avec MMM-AlarmClock. J'ai test&#233; MMM-TTS (pour avoir directement le texte prononc&#233; par la machine sans passer par un fichier mp3, sauf que le fran&#231;ais n'est pas pris en compte), cr&#233;&#233; un module MMM-Google-tts (pas tout &#224; fait convaincant sur le Raspberry Pi). Donc, voici l'ordre dans lequel le code doit &#234;tre plac&#233; (et donc ex&#233;cut&#233;) :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Bash, une installation script&#233;e ;&lt;/li&gt;&lt;li&gt; Bash, liens symboliques, bis (la partie config.js uniquement) ;&lt;/li&gt;&lt;li&gt; Bash, des fonctions : importer un module ;&lt;/li&gt;&lt;li&gt; Bash, des fonctions : effacer les modules inutiles ;&lt;/li&gt;&lt;li&gt; Bash, liens symboliques, bis (la partie sounds ici).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;En gros, tous vos param&#232;tres d'environnement du fichier bash doivent se trouver en d&#233;but de script. Puis :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; lancer les petites s&#233;curit&#233;s sur la pr&#233;sence de fichier et r&#233;pertoire propres &#224; MagicMirror ;&lt;/li&gt;&lt;li&gt; cr&#233;er les fonctions ;&lt;/li&gt;&lt;li&gt; lancer l'importation des modules, un module par ligne pour faciliter la relecture ;&lt;/li&gt;&lt;li&gt; lancer la suppression des modules inutiles (cf. delete_modules)&lt;/li&gt;&lt;li&gt; lancer vos actions dans les r&#233;pertoires (liens symboliques par exemple) &#224; la fin du fichier car l&#224;, vous serez s&#251;r de la pr&#233;sence de ces modules dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/pi/MagicMirror/modules/&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Voil&#224; ! C'est tout pour aujourd'hui. Je laisse un peu pour un nouvel article : &lt;strong&gt;la 2&#232;me partie&lt;/strong&gt;&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;em&gt;MagicMirror&#178;, configuration script&#233;e&lt;/em&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;
		&lt;div class='rss_ps'&gt;&lt;p&gt;&lt;strong&gt;Visuel :&lt;/strong&gt; Photo by Annie Spratt on Unsplash&lt;/p&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>MAMP, PHP-cs-fixer, PHPDoc&#8230;</title>
		<link>https://www.preprod.teddypayet.com/MAMP-PHP-cs-fixer-PHPDoc</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/MAMP-PHP-cs-fixer-PHPDoc</guid>
		<dc:date>2015-05-06T13:10:36Z</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>PHP</dc:subject>
		<dc:subject>Lignes de commandes</dc:subject>
		<dc:subject>Mac OS</dc:subject>

		<description>
&lt;p&gt;Pour faire suite au pr&#233;c&#233;dent article, je vais vous indiquer, tr&#232;s rapidement, l'installation de PHP-cs-fixer et de PHPDoc qui peuvent &#234;tre &#224; minima compl&#233;mentaires voir tr&#232;s utiles dans nos d&#233;veloppements. &lt;br class='autobr' /&gt; PHP-CS-fixer Source : https://github.com/FriendsOfPHP/PHP-CS-Fixer L'outil &#034;PHP Coding Standards Fixer&#034; corrige la plupart des probl&#232;mes dans votre code lorsque vous souhaitez suivre les normes de codage PHP d&#233;finies dans les documents PSR-1 et PSR-2. &lt;br class='autobr' /&gt;
Sous Mac, allez dans le (&#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/PHP" rel="tag"&gt;PHP&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/arton134-cba0f.png?1724428394' class='spip_logo spip_logo_right' width='150' height='100' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Pour faire suite au &lt;a href='https://www.preprod.teddypayet.com/MAMP-PHP-Pear-PHP-Code-Sniffer-sont-dans-un-meme-bateau' class=&#034;spip_in&#034;&gt;pr&#233;c&#233;dent article&lt;/a&gt;, je vais vous indiquer, tr&#232;s rapidement, l'installation de PHP-cs-fixer et de PHPDoc qui peuvent &#234;tre &#224; minima compl&#233;mentaires voir tr&#232;s utiles dans nos d&#233;veloppements.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;PHP-CS-fixer&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt; &lt;i&gt;Source :&lt;/i&gt; &lt;/strong&gt; &lt;a href=&#034;https://github.com/FriendsOfPHP/PHP-CS-Fixer&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/FriendsOfPHP/PHP-CS-Fixer&lt;/a&gt;&lt;br class='autobr' /&gt;
L'outil &#034;PHP Coding Standards Fixer&#034; corrige la plupart des probl&#232;mes dans votre code lorsque vous souhaitez suivre les normes de codage PHP d&#233;finies dans les documents PSR-1 et PSR-2.&lt;/p&gt;
&lt;p&gt;Sous Mac, allez dans le Terminal et tapez 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;$ cd /Applications/MAMP/bin/php/php5.5.18/bin/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis, comme indiqu&#233; sur la page officielle, tapez le curl (le wget ne fonctionnera pas nativement sous MacOSX) :&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;$ curl http://get.sensiolabs.org/php-cs-fixer.phar -o php-cs-fixer&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ET maintenant, on donne les bonnes autorisations d'ex&#233;cution :&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 chmod a+x php-cs-fixer&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Gr&#226;ce &#224; ces lignes de commande, MAMP saura de quoi on parle quand un IDE en aura besoin&#8230; Mais pas encore MacOSX. Rien de plus simple, on fait comme d'habitude :&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 /Applications/MAMP/bin/php/php5.5.18/bin/php-cs-fixer /usr/bin/php-cs-fixer&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;On est ok normalement avec PHP-CS-Fixer&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;PHPDoc&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt; &lt;i&gt;Source :&lt;/i&gt; &lt;/strong&gt; &lt;a href=&#034;http://www.phpdoc.org/docs/latest/getting-started/installing.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://www.phpdoc.org/docs/latest/getting-started/installing.html&lt;/a&gt;&lt;br class='autobr' /&gt;
On ne le pr&#233;sente plus&#8230; &lt;a href=&#034;http://www.phpdoc.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;PHPDocumentor&lt;/a&gt; devrait &#234;tre connu de tous au moins de nom :-)&lt;br class='autobr' /&gt;
Pour l'installer en tant qu'extension de PHP, il faut passer par PEAR :&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;$ pear channel-discover pear.phpdoc.org Adding Channel &#034;pear.phpdoc.org&#034; succeeded
Discovery of channel &#034;pear.phpdoc.org&#034; succeeded&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant, on peut installer phpDocumentor en utilisant 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;$ pear install phpdoc/phpDocumentor downloading phpDocumentor-2.8.2.tgz ...
Starting to download phpDocumentor-2.8.2.tgz (16,246,834 bytes)
............................................................................................................................................................................................................................................................................done: 16,246,834 bytes
install ok: channel://pear.phpdoc.org/phpDocumentor-2.8.2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et maintenant au tour de Mac OS X de comprendre ce qui se passe :&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 /Applications/MAMP/bin/php/php5.5.18/bin/phpdoc /usr/bin/phpdoc&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Et voil&#224; ! Vous voyez ? C'est rapide !&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>MAMP, PHP, Pear, PHP Code Sniffer sont dans un m&#234;me bateau</title>
		<link>https://www.preprod.teddypayet.com/MAMP-PHP-Pear-PHP-Code-Sniffer-sont-dans-un-meme-bateau</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/MAMP-PHP-Pear-PHP-Code-Sniffer-sont-dans-un-meme-bateau</guid>
		<dc:date>2015-01-27T17:06:32Z</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>PHP</dc:subject>
		<dc:subject>Lignes de commandes</dc:subject>
		<dc:subject>Mac OS</dc:subject>

		<description>
&lt;p&gt;Cela fait un moment que je n'avais pas &#233;cris de billet sur mon blog. Mais &#231;a fait aussi longtemps que je me dis qu'il faut que j'&#233;crive un tutoriel complet sur comment installer PHP Code Sniffer sur un MAMP. &lt;br class='autobr' /&gt; En soit, vous pouvez retrouver toutes ces informations sur le net mais un peu &#233;parpill&#233;es&#8230; Je dois &#034;&#224; chaque fois&#034; jouer avec google pour retrouver ces diff&#233;rents articles. De ce fait, je vais les regrouper sur une m&#234;me page et, dans la mesure du possible, remettre les sources du code (&#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/PHP" rel="tag"&gt;PHP&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/L150xH90/arton132-32123.png?1724428394' class='spip_logo spip_logo_right' width='150' height='90' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Cela fait un moment que je n'avais pas &#233;cris de billet sur mon blog. Mais &#231;a fait aussi longtemps que je me dis qu'il faut que j'&#233;crive un tutoriel complet sur comment installer PHP Code Sniffer sur un MAMP.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;En soit, vous pouvez retrouver toutes ces informations sur le net mais un peu &#233;parpill&#233;es&#8230; Je dois &#034;&#224; chaque fois&#034; jouer avec google pour retrouver ces diff&#233;rents articles.&lt;br class='autobr' /&gt;
De ce fait, je vais les regrouper sur une m&#234;me page et, dans la mesure du possible, remettre les sources du code que je mettrai.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Besoins&lt;/h2&gt;
&lt;p&gt;En codant sous Mac OS X (Yosemite, l&#224; de suite), on utilise souvent MAMP pour d&#233;velopper nos diff&#233;rents sites en local. Et mine de rien, respecter les normes PHP, &#231;a fait du bien. Et pour cela, on a besoin d'installer PHP Code Sniffer pour que nos IDEs puissent utiliser la norme PSR2 (dans mon cas).&lt;br class='autobr' /&gt;
Donc, ma configuration lors de ce pas &#224; pas :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Mac OSX 10.10.1 (dit Yosemite) ;&lt;/li&gt;&lt;li&gt; MAMP 3.0.7.3 ;&lt;/li&gt;&lt;li&gt; PHP 5.5.18 (fournit dans MAMP, et PHP 5.5.14 dans Yosemite).&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Configuration de l'installation&lt;/h2&gt;
&lt;p&gt;Pour que nos lignes de commandes php et pear soient reconnues, il faut dire au syst&#232;me o&#249; regarder.&lt;br class='autobr' /&gt;
Pour cela, je vous invite &#224; ouvrir le Terminal car c'est quasiment que par lui que nous allons utiliser pour configurer notre Mac.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;PHP&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt; &lt;i&gt;Source&lt;/i&gt; &lt;/strong&gt; : &lt;a href=&#034;http://stackoverflow.com/a/17240373&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://stackoverflow.com/a/17240373&lt;/a&gt;&lt;br class='autobr' /&gt;
A partir de l&#224;, je vous invite &#224; taper la commande suivante :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# which php&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui devrait vous donner 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;/usr/bin/php&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;V&#233;rifions la version :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# php -v&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cela devrait vous dire que vous avez une version PHP 5.5.14. Ce qui ne correspond pas &#224; notre version fournit avec MAMP. Nous devons alors dire &#224; notre Mac qu'on veut la version de MAMP.&lt;br class='autobr' /&gt;
Taper ceci pour faire une sauvegarde de notre version de php en renommant le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;php&lt;/code&gt; en &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;php.bak&lt;/code&gt;. :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# sudo mv /usr/bin/php /usr/bin/php.bak&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notre Mac ne reconnaitra plus temporairement les commandes PHP. On cr&#233;e maintenant un lien symbolique de php vers notre version de MAMP :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# sudo ln -s /Applications/MAMP/bin/php/php5.5.18/bin/php /usr/bin/php&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Regarder votre version de PHP maintenant :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# php -v&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;On est ok normalement avec PHP&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;PEAR&lt;/h2&gt;
&lt;p&gt;Cette fois-ci, on va r&#233;gler &lt;a href=&#034;https://fr.wikipedia.org/wiki/PEAR&#034; class=&#034;spip_glossaire&#034; rel=&#034;external&#034;&gt;PEAR&lt;/a&gt; qui va nous permettre d'installer PHP Code Sniffer sur notre installation MAMP. Pour faire simple, on reprend la m&#234;me d&#233;marche que pr&#233;c&#233;demment.&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;# which pear&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L&#224;, si vous n'avez jamais configur&#233; votre Mac, rien ne s'affichera. Vous serez redirig&#233; vers la ligne de saisie de commandes. La commande suivante normalement nous donne le num&#233;ro de version de PEAR (attention &#224; la majuscule du &#034;V&#034;).&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# pear -V&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mais comme dit pr&#233;c&#233;demment, la commande PEAR n'est pas reconnue. On va dire alors &#224; notre Mac qu'il faut qu'il aille voir dans MAMP :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# sudo ln -s /Applications/MAMP/bin/php/php5.5.18/bin/pear /usr/bin/pear&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Refaites la commande de version de PEAR. MAMP fournit la version 1.9.5 pour PEAR.&lt;br class='autobr' /&gt;
&lt;strong&gt;On est ok normalement avec PEAR&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;PHP Code Sniffer&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt; &lt;i&gt;Source :&lt;/i&gt; &lt;/strong&gt; : &lt;a href=&#034;https://github.com/Islandora/islandora/wiki/Installing-and-configuring-codesniffer&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/Islandora/islandora/wiki/Installing-and-configuring-codesniffer&lt;/a&gt;&lt;br class='autobr' /&gt;
Pour installer PHP Code Sniffer, il faut passer par PEAR. Comme on l'a d&#233;j&#224; install&#233;, il nous suffit de renseigner la commande suivante :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# pear install PHP_CodeSniffer&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je n'ai pas rencontr&#233; de probl&#232;me &#224; ce stade. Si on va dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/Applications/MAMP/bin/php/php5.5.18/bin/&lt;/code&gt; on peut voir un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcs&lt;/code&gt;. Mais dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/usr/bin/&lt;/code&gt;, on ne trouve pas de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcs&lt;/code&gt;. Ce qui a pour effet, l&#224; de suite, que si on tape une commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcs&lt;/code&gt;, on aura une erreur. Pour r&#233;gler &#231;a, rien de miraculeux, une ligne de commande mettra notre Mac dans le droit chemin :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# sudo ln -s /Applications/MAMP/bin/php/php5.5.18/bin/phpcs /usr/bin/phpcs&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On v&#233;rifie tout &#231;a :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# phpcs --version&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Soit pour moi : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;PHP_CodeSniffer version 2.2.0 (stable) by Squiz (http://www.squiz.net)&lt;/code&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;PHP Mess Detector&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt; &lt;i&gt;Source :&lt;/i&gt; &lt;/strong&gt; &lt;a href=&#034;http://pear.phpmd.org/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://pear.phpmd.org/&lt;/a&gt; &lt;br class='autobr' /&gt;
On installe souvent avec PHPcs la librairie PHP Mess Detector (PHPmd). Pour cela, il faut ajouter un channel sp&#233;cifique &#224; PEAR.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# pear channel-discover pear.phpmd.org&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On regarde les packages disponibles :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# pear remote-list -c phpmd&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='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;Channel phpmd Available packages:
=================================
Package Version
PHP_PMD 1.5.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La ligne de commande suivante va poser probl&#232;me :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# pear install phpmd/PHP_PMD
# Unknown remote channel: pear.pdepend.org
# phpmd/PHP_PMD requires package &#034;channel://pear.pdepend.org/PHP_Depend&#034; (version &gt;= 1.1.1)
# No valid packages found
# install failed&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il faut rajouter le channel &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;pear.pdepend.org&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# pear channel-discover pear.pdepend.org&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et maintenant, on fait ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# pear install --alldeps phpmd/PHP_PMD&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'option &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--alldeps&lt;/code&gt; va installer toutes les d&#233;pendances n&#233;cessaires pour PHPmd avant d'installer PHPmd.&lt;br class='autobr' /&gt;
Ok, on cr&#233;e les liens symboliques pour notre Mac :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# sudo ln -s /Applications/MAMP/bin/php/php5.5.18/bin/phpmd /usr/bin/phpmd
# sudo ln -s /Applications/MAMP/bin/php/php5.5.18/bin/pdepend /usr/bin/pdepend&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Petit test :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# phpmd --version
# pdepend --version&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Et voil&#224; ! C'est fini ! Vous pouvez vous amuser maintenant !&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Bonus : PHPUnit&lt;/h2&gt;
&lt;p&gt;Pour PHPcs, on n'a pas besoin de PHPUnit&#8230; Qu'on se le dise. Mais, je me dis que cela peut servir &#224; certains. Alors voici la m&#233;thode.&lt;br class='autobr' /&gt;
Comme on peut le lire sur &lt;a href=&#034;https://github.com/sebastianbergmann/phpunit/wiki/End-of-Life-for-PEAR-Installation-Method&#034; class=&#034;spip_url spip_out&#034; rel=&#034;external&#034;&gt;https://github.com/sebastianbergman...&lt;/a&gt;, on ne passe plus par PEAR pour installer PHPUnit mais par un fichier phar.&lt;br class='autobr' /&gt;
&lt;a href=&#034;https://github.com/sebastianbergmann/phpunit/blob/master/README.md&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Sur la doc&lt;/a&gt;, on passe par des lignes de commandes aussi pour faire tout cela&#8230; Ok&#8230; Mais il y a un probl&#232;me. Sur le Mac, la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;wget&lt;/code&gt; ne fonctionnera pas. On va passer par la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;curl&lt;/code&gt; pour r&#233;cup&#233;rer le fichier.&lt;/p&gt;
&lt;p&gt;D'abord, on va sur le bureau (par exemple)&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# cd ~/Desktop/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et l&#224;, on va pouvoir travailler ainsi :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# curl -o phpunit.phar https://phar.phpunit.de/phpunit.phar
# chmod +x phpunit.phar
# sudo mv phpunit.phar /usr/bin/phpunit&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#199;a vous dit de v&#233;rifier ? Simple, m&#234;me astuce que tout &#224; l'heure :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='php spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# phpunit --version
# PHPUnit 4.4.5 by Sebastian Bergmann.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et voil&#224; ! J'en ai fini avec ce pas &#224; pas. ;-)&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Comment mettre un nouveau plugin sur la zone de SPIP</title>
		<link>https://www.preprod.teddypayet.com/Comment-mettre-un-nouveau-plugin-sur-la-zone-de-SPIP</link>
		<guid isPermaLink="true">https://www.preprod.teddypayet.com/Comment-mettre-un-nouveau-plugin-sur-la-zone-de-SPIP</guid>
		<dc:date>2013-02-16T13:57:40Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Teddy Payet</dc:creator>


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

		<description>
&lt;p&gt;Il y a quelques temps, j'ai &#233;cris un petit article sur &#034;Comment faire des commit sur la zone de SPIP&#034;. Je vais reprendre un peu le m&#234;me tutoriel mais mettre en avant la cr&#233;ation d'un plugin et non une mise &#224; jour d'un existant. Il me sert aussi de feuille de route pour l'avenir &lt;br class='autobr' /&gt; Pr&#233;ambule Le but ici n'est pas de vous expliquer comment r&#233;aliser un plugin mais comment d&#233;poser le plugin que vous avez cr&#233;&#233; au pr&#233;alable. Je vais prendre pour exemple le plugin &#034;Partenaires&#034; que j'ai cr&#233;&#233; par (&#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/SPIP" rel="tag"&gt;SPIP&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;

		</description>


 <content:encoded>&lt;img src='https://www.preprod.teddypayet.com/local/cache-vignettes/L150xH96/arton109-002ef.png?1724428492' class='spip_logo spip_logo_right' width='150' height='96' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Il y a quelques temps, j'ai &#233;cris un petit article sur &#034;&lt;a href='https://www.preprod.teddypayet.com/Comment-faire-des-commit-sur-la-zone-de-SPIP' class=&#034;spip_in&#034;&gt;Comment faire des commit sur la zone de SPIP&lt;/a&gt;&#034;. Je vais reprendre un peu le m&#234;me tutoriel mais mettre en avant la cr&#233;ation d'un plugin et non une mise &#224; jour d'un existant.&lt;br class='manualbr' /&gt;Il me sert aussi de feuille de route pour l'avenir&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;Le but ici n'est pas de vous expliquer comment r&#233;aliser un plugin mais comment d&#233;poser le plugin que vous avez cr&#233;&#233; au pr&#233;alable.&lt;br class='manualbr' /&gt;Je vais prendre pour exemple le plugin &#034;Partenaires&#034; que j'ai cr&#233;&#233; par plus tard que ce matin.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Mise en place&lt;/h2&gt;
&lt;p&gt;Il faut d'abord cr&#233;er un r&#233;pertoire qui va r&#233;ceptionner tous nos plugins en devenir. J'ai cr&#233;er dans mon r&#233;pertoire &#034;Document&#034; un dossier &#034;svn_repositories&#034; contenant la structure suivante :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt;_galaxie_&lt;/li&gt;&lt;li&gt; _graphismes_&lt;/li&gt;&lt;li&gt; _plugins_&lt;/li&gt;&lt;li&gt; _squelettes_&lt;/li&gt;&lt;li&gt; _themes_&lt;/li&gt;&lt;li&gt; archivelist&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cela prend dans les grandes lignes la structure des r&#233;pertoires de la zone &#224; voir &lt;a href=&#034;http://zone.spip.org/trac/spip-zone/browser&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ici&lt;/a&gt;. Cela permet d'&#234;tre coh&#233;rent et de s'y retrouver plus facilement si on reprend le d&#233;veloppement de plugins plusieurs semaines ou mois plus tard.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;etape01&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;&#201;tape 1&lt;/h2&gt;
&lt;p&gt;On va dans panneau de ligne de commande (Terminal sous MacOSX) pour commencer &#224; taper nos commandes svn.&lt;br class='manualbr' /&gt;Premi&#232;re chose, se positionner dans le r&#233;pertoire &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Documents/svn_repositories/_plugins_&lt;/code&gt;&#034; :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenums spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn cd Documents/svn_repositories/_plugins_&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Attention de bien rester dans ce r&#233;pertoire pour pouvoir faire un &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;checkout&lt;/code&gt;&#034;. Cette derni&#232;re commande cr&#233;era le r&#233;pertoire de plugin venant de la zone&#8230;&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;etape02&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;&#201;tape 2&lt;/h2&gt;
&lt;p&gt;On cr&#233;e le r&#233;pertoire de notre plugin sur la zone :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenums spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn mkdir svn://zone.spip.org/spip-zone/_plugins_/partenaires/ -m &#034;D&#233;p&#244;t initial du plugin Partenaires&#034;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;cf. &lt;a href=&#034;http://zone.spip.org/trac/spip-zone/changeset/69939&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;69939&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;etape03&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;&#201;tape 03&lt;/h2&gt;
&lt;p&gt;On lance un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;checkout&lt;/code&gt; pour avoir une bonne version svn de notre r&#233;pertoire :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenums spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn checkout svn://zone.spip.org/spip-zone/_plugins_/partenaires/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cela aura cr&#233;&#233; un r&#233;pertoire &#034;partenaires&#034;. Il faut se positionner depuis le Terminal dans ce r&#233;pertoire pour en faire les commits plus tard :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenums spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd partenaires&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant, on copie dans notre r&#233;pertoire &lt;strong&gt;local&lt;/strong&gt; les r&#233;pertoires et fichiers du plugin que nous avons cr&#233;&#233;. Pour ma part, avec &#034;Partenaires&#034;, j'ai 2 r&#233;pertoires contenant mes fichiers et sous-r&#233;pertoires :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; branches&lt;/li&gt;&lt;li&gt; trunk&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cela fait, on passe &#224; l'&#233;tape 4.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;etape04&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;&#201;tape 04&lt;/h2&gt;
&lt;p&gt;On tape la commande suivante :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenums spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn st&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cela nous indiquera ce qui est ajout&#233; par rapport au r&#233;pertoire de d&#233;p&#244;t. Cela vous donnera quelque chose comme &#231;a :&lt;/p&gt; &lt;textarea readonly='readonly' cols='40' rows='2' class='spip_cadre spip_cadre_block' dir='ltr'&gt;? branches ? trunk&lt;/textarea&gt;
&lt;p&gt;Le point d'interrogation indique que nous devons indiqu&#233; &#224; svn ce que nous devons faire de ces r&#233;pertoires. Eh bien, on va les ajouter un par un :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenums spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn add branches svn add trunk&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cela fait, on peut enfin passer &#224; l'&#233;tape 5, l'&#233;tape finale.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;etape05&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;&#201;tape 05&lt;/h2&gt;
&lt;p&gt;On va enfin commiter nos fichiers sur la zone :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='prettyprint linenums spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;svn commit -m &#034;D&#233;p&#244;t complet de plugin Partenaires qui permet de r&#233;f&#233;rencer la liste compl&#232;te de nos partenaires et le type de partenaires (Exemple: officiel, fourniture, alimentaire, etc.) On peut renseigner pour le partenaire les infos suivantes : - Son nom ; - Un descriptif ; - et l'url de son site. Pour le type de partenaires : - Le titre ; - un descriptif. Ces 2 nouveaux objets &#233;ditoriaux peuvent avoir un logo. Pour le type de partenaire, en g&#233;n&#233;ral, le logo n'est pas n&#233;cessaire mais je garde pour le moment cette possibilit&#233;. La documentation est bient&#244;t &#224; venir sur Contrib.&#034;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;cf. &lt;a href=&#034;http://zone.spip.org/trac/spip-zone/changeset/69943&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;69943&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ET voil&#224;, c'est fini.&lt;/p&gt;
&lt;p&gt;Amusez vous &#224; cr&#233;er de nouveaux plugins pour la communaut&#233; &lt;a href=&#034;http://www.spip.net/fr&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;SPIP&lt;/a&gt;. On vous sera reconnaissant ! ;-)&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
