<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://www.momh.fr/spip.php?page=backend.xslt" ?>
<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>momh</title>
	<link>https://momh.fr/</link>
	<description>My Own Memory Hole se veut une sorte de &#171;&#160;vitrine&#160;&#187; de mon parcours et de mon exp&#233;rience mais aussi de mes centres d'int&#233;r&#234;t et constitue donc en quelque sorte ma m&#233;moire en ligne, m&#233;moire virtuelle d&#233;localis&#233;e mais ordonn&#233;e et index&#233;e&#8230;</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://www.momh.fr/spip.php?id_auteur=1&amp;page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="fr">
		<title>Eclipse&#160;: bulles contextuelles hors de l'&#233;cran</title>
		<link>https://www.momh.fr/eclipse-bulles-contextuelles-hors-de-l-ecran</link>
		<guid isPermaLink="true">https://www.momh.fr/eclipse-bulles-contextuelles-hors-de-l-ecran</guid>
		<dc:date>2022-10-12T12:13:35Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>

		<description>
&lt;p&gt;Sous Gnome Shell dans sa version 42, sous Wayland, les bulles contextuelles d'Eclipse affichant la JavaDoc associ&#233;e aux m&#233;thodes sugg&#233;r&#233;es lors de la saisie d&#233;passent de l'&#233;cran... &lt;br class='autobr' /&gt; La chose n'est pas extr&#234;mement simple &#224; d&#233;crire et les recherches sont de fait relativement d&#233;licates &#224; mener... Plut&#244;t qu'un long discours, voici une capture d'&#233;cran pr&#233;sentant le souci&#160;: &lt;br class='autobr' /&gt;
Retrouver un Eclipse utilisable &lt;br class='autobr' /&gt;
Je ne saurais expliquer trop pr&#233;cis&#233;ment mais la solution consiste &#224; lancer Eclipse en&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Sous Gnome Shell dans sa version 42, sous Wayland, les bulles contextuelles d'Eclipse affichant la JavaDoc associ&#233;e aux m&#233;thodes sugg&#233;r&#233;es lors de la saisie d&#233;passent de l'&#233;cran...&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;La chose n'est pas extr&#234;mement simple &#224; d&#233;crire et les recherches sont de fait relativement d&#233;licates &#224; mener... Plut&#244;t qu'un long discours, voici une capture d'&#233;cran pr&#233;sentant le souci&#160;:&lt;/p&gt;
&lt;div class='spip_document_116 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;22&#034; data-legende-lenx=&#034;&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.momh.fr/IMG/png/eclipse_wayland.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.momh.fr/local/cache-vignettes/L500xH269/eclipse_wayland-6a06e.png?1724080837' width='500' height='269' alt='La bulle de JavaDoc d'Eclipse sous Wayland d&#233;borde de l'&#233;cran.' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre '&gt;&lt;strong&gt;Eclipse sous Wayland
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Retrouver un Eclipse utilisable&lt;/h2&gt;
&lt;p&gt;Je ne saurais expliquer trop pr&#233;cis&#233;ment mais la solution consiste &#224; lancer Eclipse en utilisant X11 comme backend&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; dans un terminal, il suffit de lancer la commande suivante&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;export GDK_BACKEND=x11; eclipse &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et vous devriez alors non seulement retrouver vos bulles contextuelles correctement positionn&#233;es mais aussi pouvoir utiliser v&#233;ritablement les fen&#234;tres de cr&#233;ation de projet, de g&#233;n&#233;ration de constructeurs ou d'accesseurs... puisqu'elles prennent alors toute la hauteur de l'&#233;cran et n'en d&#233;bordent pas. Ce qu'illustrent les deux captures ci-dessous.&lt;/p&gt;
&lt;div class='spip_document_115 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;32&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.momh.fr/IMG/png/eclipse_x11.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.momh.fr/local/cache-vignettes/L500xH281/eclipse_x11-940e9.png?1724080838' width='500' height='281' alt='Les bulles contextuelles sont alors correctement positionn&#233;es dans la fen&#234;tre et ne d&#233;bordent plus de l'&#233;cran.' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre '&gt;&lt;strong&gt;Eclipse avec X11 comme backend
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&#8203;&lt;/p&gt;
&lt;div class='spip_document_117 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;44&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.momh.fr/IMG/png/eclipse_project.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.momh.fr/local/cache-vignettes/L500xH281/eclipse_project-6d7cc.png?1724080838' width='500' height='281' alt='Avec le backend GTK X11, la fen&#234;tre appara&#238;t dans toute sa hauteur, les boutons d'actions sont visibles et utilisables.' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre '&gt;&lt;strong&gt;Fen&#234;tre de cr&#233;ation de projet sous Eclipse
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Lanceur&lt;/h2&gt;
&lt;p&gt;&#8203;&lt;br class='autobr' /&gt;
J'avais install&#233; Eclipse via Snap&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; pour modifier le lanceur, il convient tout d'abord de copier le lanceur original dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.local/share/applications&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo cp /var/lib/snapd/desktop/applications/eclipse_eclipse.desktop ~/.local/share/applications &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et de modifier la ligne Exec de ce nouveau fichier, afin qu'il ressemble au final &#224; ceci&#160;:&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;[Desktop Entry] X-SnapInstanceName=eclipse Version=1.0 Type=Application Name=Eclipse (X11) Icon=/snap/eclipse/61/icon.xpm Exec=env GDK_BACKEND=x11 /snap/bin/eclipse %f Comment=Eclipse IDE Categories=Development;IDE; Terminal=false StartupWMClass=eclipse &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8203;&lt;br class='autobr' /&gt;
Il se peut que vous ayez &#224; fermer et r&#233;ouvrir votre session pour que le lanceur soit mis &#224; jour.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Installer Microsoft SQL Server sur Ubuntu 22.04</title>
		<link>https://www.momh.fr/installer-microsoft-sql-server-sur-ubuntu-22-04</link>
		<guid isPermaLink="true">https://www.momh.fr/installer-microsoft-sql-server-sur-ubuntu-22-04</guid>
		<dc:date>2022-09-23T09:42:49Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Ubuntu</dc:subject>

		<description>
&lt;p&gt;Dans le cadre de ma formation de Concepteur d&#233;veloppeur d'application aupr&#232;s de &lt;span class=&#034;caps&#034;&gt;ENI&lt;/span&gt; &#201;cole, je vais &#234;te amen&#233; &#224; &#233;tudier le &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; et &#224; le mettre en pratique sous Microsoft &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server. &lt;br class='autobr' /&gt; Microsoft fournit un paquet mssql-server pour Ubuntu 20.04 ainsi qu'une documentation bien faite concernant son installation et les premiers pas sous &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server. Cependant, l'installation sous Ubuntu 22.04 se heurte &#224; diff&#233;rents soucis... &lt;br class='autobr' /&gt; Signature du d&#233;p&#244;t &lt;br class='autobr' /&gt;
Pour &#233;viter d'avoir un avertissement concernant&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/ubuntu" rel="tag"&gt;Ubuntu&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Dans le cadre de ma formation de Concepteur d&#233;veloppeur d'application aupr&#232;s de &lt;span class=&#034;caps&#034;&gt;ENI&lt;/span&gt; &#201;cole, je vais &#234;te amen&#233; &#224; &#233;tudier le &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; et &#224; le mettre en pratique sous Microsoft &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Microsoft fournit un paquet &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mssql-server&lt;/code&gt; pour Ubuntu 20.04 ainsi qu'&lt;a href=&#034;https://learn.microsoft.com/fr-fr/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver15&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;une documentation&lt;/a&gt; bien faite concernant son installation et les premiers pas sous &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server. Cependant, l'installation sous Ubuntu 22.04 se heurte &#224; diff&#233;rents soucis...&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt; Signature du d&#233;p&#244;t &lt;/h2&gt;
&lt;p&gt;Pour &#233;viter d'avoir un avertissement concernant l'utilisation de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;apt-key&lt;/code&gt;, il convient de proc&#233;der diff&#233;remment pour importer la cl&#233; du d&#233;p&#244;t. On commence par t&#233;l&#233;charger la cl&#233; fournie, avant de la convertir et de la conserver dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/usr/share/keyrings/&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;wget https://packages.microsoft.com/keys/microsoft.asc gpg --dearmor microsoft.asc mv microsoft.asc.gpg /usr/share/keyrings/microsoft.gpg rm microsoft.asc &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, la d&#233;claration du d&#233;p&#244;t diff&#232;re quelque peu&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; dans un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/apt/sources.list.d/mssql-20_04.list&lt;/code&gt;, il convient de lui pr&#233;ciser la cl&#233; &#224; utiliser&#160;:&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;deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-mssql.gpg] https://packages.microsoft.com/ubuntu/20.04/mssql-server-2019 focal main &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;libldap&lt;/h2&gt;
&lt;p&gt;Le premier souci provient d'une d&#233;pendance &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;libldap&lt;/code&gt; dans sa version 2.4, alors qu'Ubuntu 22.04 ne propose plus que la version 2.5.&lt;/p&gt;
&lt;p&gt;La solution est alors de t&#233;l&#233;charger le paquet d'une version d'Ubuntu pr&#233;c&#233;dente depuis le site &lt;a href=&#034;https://packages.ubuntu.com/focal/libldap-2.4-2&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ubuntu packages&lt;/a&gt; puis de l'installer (la commande ci-dessous peut &#234;tre diff&#233;rente, notamment en cas d'architecture autre que amd64)&#160;:&lt;br class='autobr' /&gt;
&#8203;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt install ./T&#233;l&#233;chargements/libldap-2.4-2_2.4.49+dfsg-2ubuntu1.9_amd64.deb &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le paquet &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mssql-server&lt;/code&gt; devrait d&#233;sormais s'installer sans autre probl&#232;me.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;libcrypto.so &amp; libssl.so&lt;/h2&gt;
&lt;p&gt;Lors de l'installation &#224; proprement parler de &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server avec la commande&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo /opt/mssql/bin/mssql-conf setup &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8203;on se heurte &#224; une erreur puisqu'il ne trouve pas ces deux biblioth&#232;ques &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;libcrypto.so&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;libssl.so&lt;/code&gt; dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/opt/mssql/lib/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La solution que j'ai retenue dans mon cas, parmi celles propos&#233;es sur &lt;a href=&#034;https://learn.microsoft.com/en-us/answers/questions/849599/microsoft-sql-is-not-working-on-ubuntu-2204.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ce sujet du forum de learn.microsoft.com&lt;/a&gt;, est d'utiliser celles fournies par les Snap &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;core20&lt;/code&gt; et de cr&#233;er des liens symboliques&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; dans mon cas&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo ln -s /snap/core20/1587/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 libcrypto.so sudo ln -s /snap/core20/1587/usr/lib/x86_64-linux-gnu/libssl.so.1.1 libssl.so &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il suffit de relancer alors l'installation&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo /opt/mssql/bin/mssql-conf setup &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et ce devrait &#234;tre bon&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;!&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Outils en ligne de commande&lt;/h2&gt;
&lt;p&gt;Microsoft propose deux outils en ligne de commande pour interagir avec &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server&#160;: &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sqlcmd&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;bcp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour les installer, il convient de d&#233;finir un nouveau d&#233;p&#244;t, mettons dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/apt/sources.list.d/msprod.list&lt;/code&gt;&#160;:&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;deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-mssql.gpg] https://packages.microsoft.com/ubuntu/20.04/prod focal main &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt update sudo apt install mssql-tools unixodbc-dev &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plut&#244;t que d'ajouter le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/opt/mssql-tools/bin&lt;/code&gt; &#224; mon $&lt;span class=&#034;caps&#034;&gt;PATH&lt;/span&gt;, j'ai choisi de me cr&#233;er deux alias.&lt;/p&gt;
&lt;p&gt;Mais l'on peut aussi utiliser l'outil &lt;a href=&#034;https://learn.microsoft.com/en-us/sql/azure-data-studio/download-azure-data-studio?view=sql-server-ver15&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Azure Data Studio&lt;/a&gt; disponible &#233;galement sous Ubuntu.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIP-Cli sur serveur mutualis&#233;</title>
		<link>https://www.momh.fr/spip-cli-sur-serveur-mutualise</link>
		<guid isPermaLink="true">https://www.momh.fr/spip-cli-sur-serveur-mutualise</guid>
		<dc:date>2022-04-27T16:24:45Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;</dc:subject>
		<dc:subject>webdev</dc:subject>

		<description>
&lt;p&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli est &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;une interface en ligne de commande pour &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187;. Sa documentation nous guide parfaitement pour une installation avec un acc&#232;s root ou sudo. Sur un h&#233;bergement mutualis&#233;, avec a minima un acc&#232;s &lt;span class=&#034;caps&#034;&gt;SSH&lt;/span&gt; relativement ouvert, il faut adapter la proc&#233;dure. &lt;br class='autobr' /&gt; Une fois connect&#233; via &lt;span class=&#034;caps&#034;&gt;SSH&lt;/span&gt; &#224; votre serveur, il convient tout d'abord de cr&#233;er un r&#233;pertoire&#160;/.local/bin&#160;: mkdir -p&#160;/.local/bin &lt;br class='autobr' /&gt;
Ensuite, dans ce r&#233;pertoire, on clone le d&#233;p&#244;t de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli et on lance l'installation avec composer&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/spip" rel="tag"&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli est &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&lt;i&gt;une interface en ligne de commande pour &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;&lt;/i&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187;. Sa &lt;a href=&#034;https://contrib.spip.net/SPIP-Cli&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;documentation&lt;/a&gt; nous guide parfaitement pour une installation avec un acc&#232;s root ou sudo. Sur un h&#233;bergement mutualis&#233;, avec a minima un acc&#232;s &lt;span class=&#034;caps&#034;&gt;SSH&lt;/span&gt; relativement ouvert, il faut adapter la proc&#233;dure.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Une fois connect&#233; via &lt;span class=&#034;caps&#034;&gt;SSH&lt;/span&gt; &#224; votre serveur, il convient tout d'abord de cr&#233;er un r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.local/bin&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mkdir -p ~/.local/bin &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, dans ce r&#233;pertoire, on clone le d&#233;p&#244;t de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli et on lance l'installation avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;composer&lt;/code&gt; (chez alwaysdata, il faut utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;composer2&lt;/code&gt;)&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~/.local/bin/ git clone https://git.spip.net/spip-contrib-outils/spip-cli.git cd spip-cli/ composer install &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, ne nous reste plus qu'&#224; cr&#233;er un lien symbolique afin de faciliter l'usage de la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;ln -s /home/$USER/.local/bin/spip-cli/bin/spip /home/$USER/.local/bin/ &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour ce qui est de l'autocompl&#233;tion, il suffit d'&#233;diter le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.profile&lt;/code&gt; ainsi&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;source ~/.local/bin/spip-cli/bin/spip_console_autocomplete &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois Bash relanc&#233;, la commande devrait &#234;tre disponible et l'autompl&#233;tion de ses options fonctionner.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Installer &#171;&#160;globalement&#160;&#187; PHP_CodeSniffer </title>
		<link>https://www.momh.fr/installer-globalement-php_codesniffer</link>
		<guid isPermaLink="true">https://www.momh.fr/installer-globalement-php_codesniffer</guid>
		<dc:date>2022-04-26T20:05:01Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>webdev</dc:subject>

		<description>
&lt;p&gt;PHP_CodeSniffer est un outil de contr&#244;le de votre code &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; afin d'en garantir la conformit&#233; au standard de votre choix. Plut&#244;t que de l'installer dans chacun de vos projets, il est possible de l'installer &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;globalement&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; et de le configurer pour permettre d'autres standards que ceux fournis de base, ceux de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; par exemple. &lt;br class='autobr' /&gt; Pr&#233;alables &lt;br class='autobr' /&gt;
Si vous n'avez pas de r&#233;pertoire&#160;/bin/ dans votre /home, on commence par le cr&#233;er&#160;: bash mkdir&#160;/bin &lt;br class='autobr' /&gt;
Puis, on installe composer de fa&#231;on &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;globale&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187;&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;PHP_CodeSniffer est un outil de contr&#244;le de votre code &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; afin d'en garantir la conformit&#233; au standard de votre choix.&lt;br class='autobr' /&gt;
Plut&#244;t que de l'installer dans chacun de vos projets, il est possible de l'installer &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;globalement&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; et de le configurer pour permettre d'autres standards que ceux fournis de base, ceux de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; par exemple.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;alables&lt;/h2&gt;
&lt;p&gt;Si vous n'avez pas de r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/bin/&lt;/code&gt; dans votre /home, on commence par le cr&#233;er&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mkdir ~/bin &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis, on installe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;composer&lt;/code&gt; de fa&#231;on &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;globale&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; dans ce r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/bin&lt;/code&gt; qui se trouve dans notre $&lt;span class=&#034;caps&#034;&gt;PATH&lt;/span&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; on commence par suivre les instructions de la documentation de &lt;a href=&#034;https://getcomposer.org/download/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Composer&lt;/a&gt; mais la troisi&#232;me commande devient&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;php composer-setup.php --install-dir=~/bin --filename=composer &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Installation de PHP_CodeSniffer&lt;/h2&gt;
&lt;p&gt;Une fois cela fait, on peut installer &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;globalement&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; PHP_CodeSniffer&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;composer global require squizlabs/php_codesniffer composer global require spip/coding-standards &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Par d&#233;faut, chez moi, on retrouve les packages dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.config/composer/vendor/&lt;/code&gt; et les ex&#233;cutables dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.config/composer/vendor/bin/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ne nous reste plus qu'&#224; cr&#233;er des liens symboliques dans notre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/bin/&lt;/code&gt; des ex&#233;cutables de PHP_CodeSniffer&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;ln -s ~/.config/composer/vendor/bin/phpcs ~/bin ln -s ~/.config/composer/vendor/bin/phpcbf ~/bin &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On relance Bash et on peut alors d&#233;clarer le r&#233;pertoire des standards &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; &#224; PHP_CodeSniffer&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;phpcs --config-set installed_paths /home/$USER/.config/composer/vendor/spip/coding-standards/src/,/home/$USER/.config/composer/vendor/phpcompatibility/php-compatibility &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vous pouvez v&#233;rifier que la configuration est bien correcte en &#233;ditant le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.config/composer/vendor/squizlabs/php_codesniffer/CodeSniffer.conf&lt;/code&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Utilisation&lt;/h2&gt;
&lt;p&gt;Il est alors possible de lancer les commandes &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcs&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcbf&lt;/code&gt; o&#249; que vous soyez.&lt;br class='autobr' /&gt;
Il peut alors &#234;tre int&#233;ressant de profiter d'une configuration locale, propre &#224; votre projet&#160;: cela se passe dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcs.xml&lt;/code&gt; plac&#233; &#224; la racine de votre projet&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;xml&#034; class='spip_code spip_code_block language-xml' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;?xml version=&#034;1.0&#034;?&gt; &lt;ruleset&gt; &lt;file&gt;./&lt;/file&gt; &lt;exclude-pattern&gt;**/*.js&lt;/exclude-pattern&gt; &lt;exclude-pattern&gt;**/*.css&lt;/exclude-pattern&gt; &lt;exclude-pattern&gt;**/*.scss&lt;/exclude-pattern&gt; &lt;exclude-pattern&gt;node_modules/*&lt;/exclude-pattern&gt; &lt;exclude-pattern&gt;vendor/*&lt;/exclude-pattern&gt; &lt;arg name=&#034;colors&#034;/&gt; &lt;rule ref=&#034;SPIP40&#034;/&gt; &lt;/ruleset&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour d&#233;couvrir plus pr&#233;cis&#233;ment les possibilit&#233;s de configuration, je vous laisse consulter le fichier &lt;a href=&#034;https://github.com/squizlabs/PHP_CodeSniffer/blob/master/phpcs.xml.dist&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcs.xml.dist&lt;/code&gt;&lt;/a&gt; de PHP_CodeSniffer.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Optimisation des images sous SPIP</title>
		<link>https://www.momh.fr/optimisation-des-images-sous-spip</link>
		<guid isPermaLink="true">https://www.momh.fr/optimisation-des-images-sous-spip</guid>
		<dc:date>2022-04-01T08:20:50Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;</dc:subject>

		<description>
&lt;p&gt;Travaillant sur divers sites pr&#233;sentant de nombreux visuels bien souvent extr&#234;mement lourds, je cherchais un moyen d'optimiser ces images afin d'am&#233;liorer les &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;performances&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de ces sites. &lt;br class='autobr' /&gt; Apr&#232;s une recherche rapide sur contrib.spip.net et sur plugins.spip.net, je n'ai pas trouv&#233; mon bonheur et ai donc d&#233;velopp&#233; un petit plugin, Images optimis&#233;es (optimages), en me basant sur le package image-optimizer propos&#233; par Spatie. &lt;br class='autobr' /&gt;
Le plugin Images optimis&#233;es est installable via &lt;span class=&#034;caps&#034;&gt;SVP&lt;/span&gt; puisque&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/spip" rel="tag"&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Travaillant sur divers sites pr&#233;sentant de nombreux visuels bien souvent extr&#234;mement lourds, je cherchais un moyen d'optimiser ces images afin d'am&#233;liorer les &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;performances&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de ces sites.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Apr&#232;s une recherche rapide sur &lt;a href=&#034;https://contrib.spip.net/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;contrib.spip.net&lt;/a&gt; et sur &lt;a href=&#034;https://plugins.spip.net/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;plugins.spip.net&lt;/a&gt;, je n'ai pas trouv&#233; mon bonheur&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;Il s'av&#232;re qu'il existe le plugin SmushIt au fonctionnement quelque peu (&#8230;)&#034; id=&#034;nh1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt; et ai donc d&#233;velopp&#233; un petit plugin, Images optimis&#233;es (optimages), en me basant sur le &lt;a href=&#034;https://github.com/spatie/image-optimizer&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;package image-optimizer propos&#233; par Spatie&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le plugin Images optimis&#233;es est installable via &lt;span class=&#034;caps&#034;&gt;SVP&lt;/span&gt; puisque disponible sur &lt;a href=&#034;https://plugins.spip.net/optimages.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;plugins.spip.net&lt;/a&gt; ou via &lt;a href=&#034;https://git.spip.net/spip-contrib-extensions/optimages.git&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Git&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le fonctionnement de ce plugin se veut tr&#232;s simple&#160;: si leur format est compatible (en l'&#233;tat &lt;span class=&#034;caps&#034;&gt;JPEG&lt;/span&gt;, &lt;span class=&#034;caps&#034;&gt;PNG&lt;/span&gt; et &lt;span class=&#034;caps&#034;&gt;GIF&lt;/span&gt; bien que la librairie prenne &#233;galement en charge les &lt;span class=&#034;caps&#034;&gt;SVG&lt;/span&gt; ou &lt;span class=&#034;caps&#034;&gt;WEBP&lt;/span&gt;), les images sont compress&#233;es d&#232;s leur t&#233;l&#233;versement gr&#226;ce aux utilitaires &lt;i&gt;jpegoptim&lt;/i&gt;, &lt;i&gt;pngquant&lt;/i&gt; et &lt;i&gt;optipng&lt;/i&gt;, ou enfin &lt;i&gt;gifsicle&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Le plugin fournit une interface de configuration permettant de modifier, s'il d&#233;tecte les binaires de ces utilitaires, les arguments pass&#233;s &#224; ceux-ci (par d&#233;faut, ce sont les valeurs utilis&#233;es par la librairie image-optimizer).&lt;/p&gt;
&lt;p&gt;En l'&#233;tat, sur un &#233;chantillon loin d'&#234;tre repr&#233;sentatif, nous obtenons des r&#233;sultats de l'ordre de 60% de r&#233;duction du poids des &lt;span class=&#034;caps&#034;&gt;PNG&lt;/span&gt; et de 40 &#224; 50% pour les &lt;span class=&#034;caps&#034;&gt;JPEG&lt;/span&gt;.&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;Il s'av&#232;re qu'il existe le plugin SmushIt au fonctionnement quelque peu diff&#233;rent, puisqu'il n'agit pas sur les images lors de leur t&#233;l&#233;verserment mais seulement lors de leur affichage.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Faire cohabiter plusieurs versions de PHP sous Debian</title>
		<link>https://www.momh.fr/faire-cohabiter-plusieurs-versions-de-php-sous-debian</link>
		<guid isPermaLink="true">https://www.momh.fr/faire-cohabiter-plusieurs-versions-de-php-sous-debian</guid>
		<dc:date>2022-03-12T17:58:39Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>
		<dc:subject>webdev</dc:subject>

		<description>
&lt;p&gt;Surtout par curiosit&#233;, je me suis pench&#233; sur la possibilit&#233; de faire cohabiter plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; sur ma Debian Bullseye et surtout sur la fa&#231;on de basculer ais&#233;ment de l'une &#224; l'autre. &lt;br class='autobr' /&gt; Installation &lt;br class='autobr' /&gt;
Pour installer plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; conjointement, il faut ajouter le d&#233;p&#244;t Sury&#160;: bash sudo apt update sudo apt -y install apt-transport-https lsb-release ca-certificates curl sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg sudo sh&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Surtout par curiosit&#233;, je me suis pench&#233; sur la possibilit&#233; de faire cohabiter plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; sur ma Debian Bullseye et surtout sur la fa&#231;on de basculer ais&#233;ment de l'une &#224; l'autre.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Installation&lt;/h2&gt;
&lt;p&gt;Pour installer plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; conjointement, il faut ajouter &lt;a href=&#034;https://deb.sury.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;le d&#233;p&#244;t Sury&lt;/a&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt update sudo apt -y install apt-transport-https lsb-release ca-certificates curl sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg sudo sh -c 'echo &#034;deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main&#034; &gt; /etc/apt/sources.list.d/php.list' sudo apt update &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;De l&#224;, il est possible d'installer diverses versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; et de ses modules&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; ainsi, sous Bullseye, je me vois proposer les versions 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0 et 8.1&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;apt search php | grep &#034;php[0-9]\.[0-9]/&#034; [...] php5.6/bullseye 5.6.40-57+0~20211119.60+debian11~1.gbp8a9bd1 all php7.0/bullseye 7.0.33-57+0~20211119.61+debian11~1.gbp5d8ba5 all php7.1/bullseye 7.1.33-44+0~20211119.61+debian11~1.gbp448fbe all php7.2/bullseye 7.2.34-28+0~20211119.67+debian11~1.gbpf24e81 all php7.3/bullseye 7.3.33-1+0~20211119.91+debian11~1.gbp618351 all php7.4/stable-security,now 7.4.28-1+deb11u1 all [install&#233;, pouvant &#234;tre supprim&#233; automatiquement] php8.0/bullseye 8.0.16-1+0~20220221.30+debian11~1.gbp8b91a5 all php8.1/bullseye,now 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 all [install&#233;, automatique] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Changer facilement de version de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Afin de faciliter le basculement d'une version &#224; une autre, j'ai compil&#233; diff&#233;rentes sources pour finalement produire un petit script, tr&#232;s certainement imparfait, qui permet de choisir de mani&#232;re interactive parmi les versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; install&#233;es celle &#224; utiliser.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;touch ~/bin/php-switch chmod +x ~/bin/php-switch nano ~/bin/php-switch &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#!/bin/bash # based on https://askubuntu.com/a/883140 # and on https://stackoverflow.com/a/68905711 # D&#233;terminer la version de PHP actuellement utilis&#233;e par Apache VAR=$(ls /etc/apache2/mods-enabled/php*) IFS=' ' read -r -a array &lt;&lt;&lt; &#034;$VAR&#034; array[0]=${array[0]#*php} array[0]=${array[0]%.conf} OLDVERSION=${array[0]} echo &#034;La version de PHP actuellement utilis&#233;e est la&#034; $OLDVERSION. echo &#034;Liste des versions de PHP disponibles :&#034; # Lister les versions de PHP install&#233;es RAWPOSSIBILITIES=$(update-alternatives --list php | sed 's/.*\(...\)/\1/') POSSIBILITIES=($RAWPOSSIBILITIES) # Demander la version de PHP &#224; activer PS3='Choisissez la version de PHP &#224; activer : ' select opt in &#034;${POSSIBILITIES[@]}&#034; &#034;Annuler&#034;; do case &#034;$REPLY&#034; in $((${#POSSIBILITIES[@]}+1))) echo &#034;Salut!&#034;; exit;; esac [ $REPLY -gt $((${#POSSIBILITIES[@]}+1)) -o $REPLY -lt 1 ] &amp;&amp; echo &#034;Choix invalide&#034; || break done echo &#034;Activer la version ${POSSIBILITIES[(($REPLY-1))]} ? Entr&#233;e pour valider, Ctrl-C pour annuler.&#034; read x # On reconfigure Apache sudo a2dismod php${OLDVERSION} sudo a2enmod php${POSSIBILITIES[(($REPLY-1))]} # On met &#224; jour la version par d&#233;faut sudo update-alternatives --set php /usr/bin/php${POSSIBILITIES[(($REPLY-1))]} sudo update-alternatives --set phar /usr/bin/phar${POSSIBILITIES[(($REPLY-1))]} sudo update-alternatives --set phar.phar /usr/bin/phar.phar${POSSIBILITIES[(($REPLY-1))]} # On relance le service Apache sudo systemctl restart apache2 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8203;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Node.js et autocompl&#233;tion avec Tmux</title>
		<link>https://www.momh.fr/node-js-et-autocompletion-avec-tmux</link>
		<guid isPermaLink="true">https://www.momh.fr/node-js-et-autocompletion-avec-tmux</guid>
		<dc:date>2022-02-22T21:12:10Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>webdev</dc:subject>
		<dc:subject>Linux</dc:subject>

		<description>
&lt;p&gt;Si je b&#233;n&#233;ficiais parfaitement de l'autocompl&#233;tion des commandes fournies par node.js dans mon terminal classique, celle-ci ne fonctionnait plus sous Tmux&#160;: une sombre histoire de diff&#233;rence entre interactive shell et login shell. &lt;br class='autobr' /&gt; Mon .bashrc contenait pourtant bien le code n&#233;cessaire mais, au-del&#224; de l'autocompl&#233;tion de node.js, il ne semblait pas du tout &#234;tre lu, puisque m&#234;me mon invite de commande ne correspondait pas &#224; celle configur&#233;e... &lt;br class='autobr' /&gt;
Cependant, mes recherches se focalisaient&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Si je b&#233;n&#233;ficiais parfaitement de l'autocompl&#233;tion des commandes fournies par node.js dans mon terminal classique, celle-ci ne fonctionnait plus sous Tmux&#160;: une sombre histoire de diff&#233;rence entre &lt;i&gt;interactive&lt;/i&gt; shell et &lt;i&gt;login&lt;/i&gt; shell.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Mon &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.bashrc&lt;/code&gt; contenait pourtant bien le code n&#233;cessaire mais, au-del&#224; de l'autocompl&#233;tion de node.js, il ne semblait pas du tout &#234;tre lu, puisque m&#234;me mon invite de commande ne correspondait pas &#224; celle configur&#233;e...&lt;/p&gt;
&lt;p&gt;Cependant, mes recherches se focalisaient sur le probl&#232;me de l'autocompl&#233;tion de node.js et ne me fournissaient gu&#232;re de solution... C'est en changeant de perspective que je suis tomb&#233; sur &lt;a href=&#034;https://unix.stackexchange.com/questions/320465/new-tmux-sessions-do-not-source-bashrc-file&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;le sujet &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;New tmux sessions do not source bashrc file&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; sur Stack Exchange&lt;/a&gt; et surtout sur &lt;a href=&#034;https://unix.stackexchange.com/a/541352&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la r&#233;ponse tr&#232;s compl&#232;te de Simba&lt;/a&gt; qui pr&#233;sente donc la diff&#233;rence entre les &lt;i&gt;interactiven non-login shells&lt;/i&gt; &#8212; qui sourcent le fichier .bashrc &#8212; et les &lt;i&gt;login shells&lt;/i&gt; &#8212; qui sourcent quant &#224; eux les fichiers .profile et .bash_profile notamment.&lt;/p&gt;
&lt;p&gt;Deux solutions sont alors possibles&#160;:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; soit on &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;source&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; le fichier .bashrc depuis l'un de ces deux derniers fichiers &#8212; cette solution &#233;tant celle que recommande Simba justement&#160;:
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# if running bash if [ -n &#034;$BASH_VERSION&#034; ]; then # include .bashrc if it exists if [ -f &#034;$HOME/.bashrc&#034; ]; then . &#034;$HOME/.bashrc&#034; fi fi &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; soit on &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;int&#232;gre&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; l'autocompl&#233;tion de node.js dans le fichier .profile avec la simple commande&#160;:
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;npm completion &gt;&gt; ~/.profile &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Raspbian Bullseye Lite sur NAS Argon Eon</title>
		<link>https://www.momh.fr/raspbian-bullseye-lite-sur-nas-argon-eon</link>
		<guid isPermaLink="true">https://www.momh.fr/raspbian-bullseye-lite-sur-nas-argon-eon</guid>
		<dc:date>2022-01-27T16:59:15Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Raspberry Pi</dc:subject>
		<dc:subject>&lt;span class=&#034;caps&#034;&gt;NAS&lt;/span&gt;</dc:subject>
		<dc:subject>mpd</dc:subject>
		<dc:subject>torrent</dc:subject>

		<description>
&lt;p&gt;On choisit pour notre nouveau &lt;span class=&#034;caps&#034;&gt;NAS&lt;/span&gt; Argon Eon &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;propuls&#233;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; par un Raspberry Pi de se passer d'interface graphique et on opte donc pour la distribution Raspbian Bullseye Lite. &lt;br class='autobr' /&gt; Une fois notre carte microSD cr&#233;&#233;e (merci &#224; l'utilitaire rpi-imager) et les premi&#232;res configurations r&#233;alis&#233;es gr&#226;ce &#224; l'outil raspi-config (changement de mot de passe, localisation, clavier...), on peut passer &#224; sa pr&#233;paration&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; au programme&#160;: alsa et bluetooth, partage de fichiers, mpd, transmission-daemon, flexget,&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/raspberry-pi" rel="tag"&gt;Raspberry Pi&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/nas" rel="tag"&gt;&lt;span class=&#034;caps&#034;&gt;NAS&lt;/span&gt;&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/mpd" rel="tag"&gt;mpd&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/torrent" rel="tag"&gt;torrent&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;On choisit pour notre nouveau &lt;span class=&#034;caps&#034;&gt;NAS&lt;/span&gt; Argon Eon &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;propuls&#233;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; par un Raspberry Pi de se passer d'interface graphique et on opte donc pour la distribution Raspbian Bullseye Lite.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Une fois notre carte microSD cr&#233;&#233;e (merci &#224; l'utilitaire &lt;a href=&#034;https://www.raspberrypi.com/software/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;rpi-imager&lt;/a&gt;) et les premi&#232;res configurations r&#233;alis&#233;es gr&#226;ce &#224; l'outil &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;raspi-config&lt;/code&gt; (changement de mot de passe, localisation, clavier...), on peut passer &#224; sa pr&#233;paration&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; au programme&#160;: alsa et bluetooth, partage de fichiers, mpd, transmission-daemon, flexget, Spotify Connect...&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Maintenance et configuration&lt;/h2&gt;
&lt;p&gt;On commence par r&#233;aliser une mise &#224; jour du syst&#232;me&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt update &amp;&amp; sudo apt upgrade &amp;&amp; sudo reboot &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis on installe l'utilitaire de gestion du &lt;span class=&#034;caps&#034;&gt;NAS&lt;/span&gt; Argon Eon, qui g&#232;re notamment la vitesse de ventilation&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;curl https://download.argon40.com/argoneon.sh | bash &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Wi-Fi et &lt;span class=&#034;caps&#034;&gt;IP&lt;/span&gt; fixe&lt;/h2&gt;
&lt;p&gt;Pour se connecter &#224; un r&#233;seau Wi-Fi, il suffit d'utiliser l'utilitaire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;raspi-config&lt;/code&gt; et d'initier le premier choix, &lt;i&gt;Wireless Lan&lt;/i&gt;, du premier menu, &lt;i&gt;System Options&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Les informations de connexion devrait alors se retrouver dans le fichier &lt;i&gt;/etc/wpa_supplicant/wpa_supplicant.conf&lt;/i&gt;&#160;:&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;ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=FR network={ ssid=&#034;SSID&#034; psk=&#034;PASSWORD&#034; } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour attribuer une &lt;span class=&#034;caps&#034;&gt;IP&lt;/span&gt; fixe &#224; votre Raspberry, il convient tout d'abord d'identifier l'interface r&#233;seau Wi-Fi, a priori &lt;i&gt;wlan0&lt;/i&gt;, gr&#226;ce &#224; la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ifconfig&lt;/code&gt;. Ensuite, il faut &#233;diter le fichier &lt;i&gt;/etc/dhcpcd.conf&lt;/i&gt; et ajouter une nouvelle interface&#160;:&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;interface wlan0 static ip_address=192.168.1.56 static routers=192.168.1.1 static domain_name_servers=80.67.169.12 80.67.169.40 2001:910:800::12 2001:910:800::40 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La derni&#232;re ligne permet d'utiliser &lt;a href=&#034;https://www.fdn.fr/actions/dns/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;les serveurs &lt;span class=&#034;caps&#034;&gt;DNS&lt;/span&gt; de French Data Network&lt;/a&gt; et de ne plus subir certaines restrictions, notamment celles limitant l'acc&#232;s &#224; des sites de torrents (cf. infra).&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Alsa et bluetooth&#160;: bluealsa&lt;/h2&gt;
&lt;p&gt;Il semble que le paquet bluealsa ne soit plus disponible dans la branche stable de Debian et ne se trouve que dans unstable...&lt;br class='autobr' /&gt;
Plut&#244;t que de le compiler depuis &lt;a href=&#034;https://github.com/Arkq/bluez-alsa&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ses sources&lt;/a&gt;, j'ai r&#233;cup&#233;r&#233; les paquets n&#233;cessaires dans &lt;a href=&#034;https://packages.debian.org/source/sid/bluez-alsa&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;les d&#233;p&#244;ts Debian&lt;/a&gt; et les ai simplement install&#233; avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;apt&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;wget http://ftp.fr.debian.org/debian/pool/main/b/bluez-alsa/libasound2-plugin-bluez_3.0.0-2_armhf.deb wget http://ftp.fr.debian.org/debian/pool/main/b/bluez-alsa/bluez-alsa-utils_3.0.0-2_armhf.deb sudo apt install ./libasound2-plugin-bluez_3.0.0-2_armhf.deb sudo apt install ./bluez-alsa-utils_3.0.0-2_armhf.deb &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On cr&#233;e ensuite un service systemd pour bluealsa, en reprenant celui propos&#233; par &lt;a href=&#034;https://github.com/bablokb/pi-btaudio/blob/master/files/etc/systemd/system/bluealsa.service&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;bablokb/pi-btaudio&lt;/a&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nano /etc/systemd/system/bluealsa.service &lt;/code&gt;&lt;/pre&gt;&lt;/div&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;# -------------------------------------------------------------------------- # Modified version of bluealsa.service unit definition # (replaced WantedBy=graphical.target with WantedBy=bluetooth.target) # # Author: Bernhard Bablok # License: GPL3 # # Website: https://github.com/bablokb/pi-btaudio # # -------------------------------------------------------------------------- [Unit] Description=BluezALSA proxy Requires=bluetooth.service After=bluetooth.service [Service] Type=simple User=root ExecStart=/usr/bin/bluealsa [Install] WantedBy=bluetooth.target &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On lance ensuite le service&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo systemctl enable bluealsa.service sudo service bluealsa start &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On &#233;dite ensuite le fichier &lt;i&gt;/etc/asound.conf&lt;/i&gt; en suivant l&#224; encore ce que propose &lt;a href=&#034;https://github.com/bablokb/pi-btaudio/blob/master/files/etc/asound.conf&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;bablokb/pi-btaudio&lt;/a&gt;&#160;:&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;pcm.!default &#034;bluealsa&#034; ctl.!default &#034;bluealsa&#034; defaults.bluealsa.interface &#034;hci0&#034; defaults.bluealsa.device &#034;FC:58:FA:14:27:BC&#034; defaults.bluealsa.profile &#034;a2dp&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans notre cas, nous ajoutons une sortie pour notre ampli bluetooth Tangent Ampster&#160;:&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;pcm.tangent { type plug slave { pcm { type bluealsa device FC:58:FA:14:27:BC profile &#034;a2dp&#034; } } hint { show on description &#034;Tangent Ampster BT&#034; } } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Partages &lt;span class=&#034;caps&#034;&gt;SAMBA&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Une fois install&#233;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt install samba &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut configurer nos partages en &#233;ditant le fichier &lt;i&gt;/etc/samba/smb.conf&lt;/i&gt;. &lt;br class='autobr' /&gt;
Ainsi danse mon cas, j'ajoute cette section &#224; la toute fin du fichier, le r&#233;pertoire /home/pi/shares/ contenant l'ensemble des points de montage des disques du &lt;span class=&#034;caps&#034;&gt;NAS&lt;/span&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;[shares] comment = Argon Eon NAS Shares path = /home/pi/shares read only = no browsable = yes writable = yes valid users = pi &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois le fichier enregistr&#233;, il convient d'attribuer un mot de passe &#224; votre utilisateur (dans mon cas, pi)&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo smbpasswd -a pi &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;puis de red&#233;marrer le service&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo service smbd restart &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, sur le client&#160;: on commence par cr&#233;er un fichier contenant les informations de connexion&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;touch ~/.nascredentials chmod 600 ~/.nascredentials nano ~/.nascredentials &lt;/code&gt;&lt;/pre&gt;&lt;/div&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;user=pi password= &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis on &#233;dite le fichier &lt;i&gt;/etc/fstab&lt;/i&gt; pour monter au d&#233;marrage&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;//192.168.1.56/shares /home/bbrice/NAS cifs defaults,credentials=/home/bbrice/.nascredentials,uid=1000,gid=1000,file_mode=0755,dir_mode=0755 0 0 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Librespot&#160;: un client Spotify Connect&lt;/h2&gt;
&lt;p&gt;On commence par installer &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;rust&lt;/code&gt; et ses utilitaires n&#233;cessaires &#224; la compilation ainsi que les d&#233;pendances, avant de cloner le d&#233;p&#244;t et de lancer la compilation&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh sudo apt install build-essential libpulse-dev git clone https://github.com/librespot-org/librespot.git cd librespot cargo build --release --no-default-features --features &#034;alsa-backend&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On cr&#233;e ensuite un service systemd&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mkdir -p ~/.config/systemd/user/ nano ~/.config/systemd/user/librespot.service &lt;/code&gt;&lt;/pre&gt;&lt;/div&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;[Unit] Description=Librespot (an open source Spotify client) Documentation=https://github.com/librespot-org/librespot Documentation=https://github.com/librespot-org/librespot/wiki/Options Wants=network.target sound.target After=network.target sound.target [Service] Restart=always RestartSec=10 ExecStart=/usr/bin/librespot --name &#034;%u@%H&#034; --device bluealsa [Install] WantedBy=default.target &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et on le lance&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;systemctl --user enable librespot.service systemctl --user start librespot.service &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;T&#233;l&#233;chargements automatis&#233;s&#160;: Flexget et transmission-daemon&lt;/h2&gt;
&lt;p&gt;Pour ce qui est de l'installation et la configuration de Flexget, il suffit de se reporter &#224; cet article&#160;: &lt;a href='https://www.momh.fr/telecharger-ses-series-avec-flexget' class=&#034;spip_in&#034;&gt;T&#233;l&#233;charger ses s&#233;ries avec Flexget&lt;/a&gt;&lt;br class='autobr' /&gt;
Il convient de veiller &#224; utiliser un &lt;span class=&#034;caps&#034;&gt;DNS&lt;/span&gt; neutre afin de pouvoir acc&#233;der au flux d'&lt;span class=&#034;caps&#034;&gt;EZTV&lt;/span&gt;... Pour ce faire, comme &lt;a href='https://www.momh.fr/changer-ses-dns-sous-raspbian-buster' class=&#034;spip_in&#034;&gt;sous Raspbian Buster&lt;/a&gt;, il suffit d'&#233;diter le fichier &lt;i&gt;/etc/dhcpcd.conf&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Pour ce qui est de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;transmission-daemon&lt;/code&gt;, la t&#226;che est un peu plus ardue mais &lt;a href=&#034;https://pimylifeup.com/raspberry-pi-transmission/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;pimylifeup.com&lt;/a&gt; nous apporte une solution qui fonctionne parfaitement.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;&lt;span class=&#034;caps&#034;&gt;MPD&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Pour ce qui est de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mpd&lt;/code&gt;, rien de bien complexe, il suffit juste de se replonger dans &lt;a href='https://www.momh.fr/mpd' class=&#034;spip_in&#034;&gt;mes anciens articles&lt;/a&gt;... le point essentiel &#233;tant d'utiliser notre ampli Tangent Ampster connect&#233; en bluetooth comme sortie&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; il suffit d'ajouter cette section (en la modifiant en fonction de la configuration vue ci-dessus dans &lt;i&gt;/etc/asound.conf&lt;/i&gt;) dans le fichier &lt;i&gt;/etc/mpd.conf&lt;/i&gt;&#160;:&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;audio_output { type &#034;alsa&#034; name &#034;Tangent Ampster BT - ALSA Bluetooth&#034; device &#034;tangent&#034; mixer_type &#034;software&#034; format &#034;44100:16:2&#034; } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;puis de relancer le service&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo service mpd restart &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8203;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Spotify Connect et PulseAudio sous Raspbian Bullseye</title>
		<link>https://www.momh.fr/spotify-connect-et-pulseaudio-sous-raspbian-bullseye</link>
		<guid isPermaLink="true">https://www.momh.fr/spotify-connect-et-pulseaudio-sous-raspbian-bullseye</guid>
		<dc:date>2022-01-19T21:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>bluetooth</dc:subject>
		<dc:subject>Raspberry Pi</dc:subject>
		<dc:subject>Spotify</dc:subject>
		<dc:subject>PulseAudio</dc:subject>

		<description>
&lt;p&gt;Si raspotify m'a donn&#233; pleinement satisfaction pendant quelques ann&#233;es comme client Spotify Connect sur mon Raspberry Pi, il n'en va plus de m&#234;me depuis une importante mise &#224; jour du logiciel&#160;: impossible de le combiner avec PulseAudio et de diriger le son vers mon ampli connect&#233; via Bluetooth. Du coup on se tourne directement vers la librairie librespot. &lt;br class='autobr' /&gt; Si l'on peut installer librespot tout simplement via le gestionnaire de paquet Rust cargo, l'on a pr&#233;f&#233;r&#233; directement le compiler avec&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/bluetooth" rel="tag"&gt;bluetooth&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/raspberry-pi" rel="tag"&gt;Raspberry Pi&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/spotify" rel="tag"&gt;Spotify&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/pulseaudio" rel="tag"&gt;PulseAudio&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Si &lt;a href='https://www.momh.fr/raspbian-spotify-et-pulseaudio' class=&#034;spip_in&#034;&gt;raspotify&lt;/a&gt; m'a donn&#233; pleinement satisfaction pendant quelques ann&#233;es comme client Spotify Connect sur mon Raspberry Pi, il n'en va plus de m&#234;me depuis une importante mise &#224; jour du logiciel&#160;: impossible de le combiner avec PulseAudio et de diriger le son vers mon ampli connect&#233; via Bluetooth.&lt;br class='autobr' /&gt;
Du coup on se tourne directement vers la librairie &lt;a href=&#034;https://github.com/librespot-org/librespot&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;librespot&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Si l'on peut installer librespot tout simplement via le gestionnaire de paquet Rust &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;cargo&lt;/code&gt;, l'on a pr&#233;f&#233;r&#233; directement le compiler avec le support du backend PulseAudio... en suivant scrupuleusement &lt;a href=&#034;https://github.com/librespot-org/librespot/blob/master/COMPILING.md&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation de Rust et des d&#233;pendances&lt;/h2&gt;
&lt;p&gt;Il faut donc commencer par installer Rust et l'on proc&#232;de comme recommand&#233; gr&#226;ce &#224; l'utilitaire &lt;a href=&#034;https://rustup.rs/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;rustup&lt;/a&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois cela fait, on installe plus prosa&#239;quement les d&#233;pendances n&#233;cessaires &#224; la compilation&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt install build-essential libpulse-dev &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Compilation&lt;/h2&gt;
&lt;p&gt;On commence par r&#233;cup&#233;rer les sources via Git&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;git clone https://github.com/librespot-org/librespot.git &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis, dans le dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;librespot&lt;/code&gt;, on lance la compilation&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd librespot ~/.cargo/bin/cargo build --no-default-features --features &#034;pulseaudio-backend&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Premier test et lancement au d&#233;marage&lt;/h2&gt;
&lt;p&gt;Pour lancer le client Spotify Connect, il suffit alors de lancer la commande suivante&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;.~/librespot/target/debug/librespot &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et vous devriez pouvoir vous connecter depuis votre application Spotify.&lt;/p&gt;
&lt;p&gt;Si tout fonctionne, on peut alors copier l'ex&#233;cutable&#160;/librespot/target/debug/librespot dans le $&lt;span class=&#034;caps&#034;&gt;PATH&lt;/span&gt; et cr&#233;er le service systemd.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo cp ~/librespot/target/debug/librespot /usr/bin/ mkdir -p ~/.config/systemd/user cp ~/librespot/contrib/librespot.user.service ~/.config/systemd/user/ systemctl --user enable librespot.user.service &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8203;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Tailwind CSS, PostCSS et SCSS</title>
		<link>https://www.momh.fr/tailwind-css-postcss-et-scss</link>
		<guid isPermaLink="true">https://www.momh.fr/tailwind-css-postcss-et-scss</guid>
		<dc:date>2021-12-22T20:39:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>webdev</dc:subject>

		<description>
&lt;p&gt;&#192; l'occasion de la &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;collection automne 2021&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de momh.fr, je me suis essay&#233; &#224; Tailwind &lt;span class=&#034;caps&#034;&gt;CSS&lt;/span&gt;, le framework &lt;span class=&#034;caps&#034;&gt;CSS&lt;/span&gt; qui renverse l'habituel mantra du &lt;span class=&#034;caps&#034;&gt;CSS&lt;/span&gt; des classes s&#233;mantiques. Il m'a fallu un peu de temps avant de trouver une configuration satisfaisante, d&#233;couvrant &#224; cette occasion le postprocesseur &lt;span class=&#034;caps&#034;&gt;CSS&lt;/span&gt; PostCSS. &lt;br class='autobr' /&gt; Il faut commencer par installer nodejs et son gestionnaire de paquets npm&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; plut&#244;t que de passer par les d&#233;p&#244;ts Debian, on utilise les paquets propos&#233;s par NodeSource comme&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;&#192; l'occasion de la &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;collection automne 2021&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de momh.fr, je me suis essay&#233; &#224; Tailwind &lt;span class=&#034;caps&#034;&gt;CSS&lt;/span&gt;, le framework &lt;span class=&#034;caps&#034;&gt;CSS&lt;/span&gt; qui renverse l'habituel mantra du &lt;span class=&#034;caps&#034;&gt;CSS&lt;/span&gt; des classes s&#233;mantiques. Il m'a fallu un peu de temps avant de trouver une configuration satisfaisante, d&#233;couvrant &#224; cette occasion le postprocesseur &lt;span class=&#034;caps&#034;&gt;CSS&lt;/span&gt; PostCSS.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Il faut commencer par installer &lt;i&gt;nodejs&lt;/i&gt; et son gestionnaire de paquets &lt;i&gt;npm&lt;/i&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; plut&#244;t que de passer par les d&#233;p&#244;ts Debian, on utilise les paquets propos&#233;s par &lt;a href=&#034;https://github.com/nodesource/distributions/blob/master/README.md&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;NodeSource&lt;/a&gt; comme recommand&#233; par &lt;a href=&#034;https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la documentation de Node.js&lt;/a&gt;. Ainsi&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;curl -fsSL https://deb.nodesource.com/setup_17.x | sudo -E bash - sudo apt-get install -y nodejs npm &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;on peut commencer par initier un projet avec la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;npm init&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ensuite, il faut installer les paquets n&#233;cessaires&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;npm install -D tailwindcss postcss postcss-cli postcss-easy-import autoprefixer cssnano watch &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On g&#233;n&#232;re ensuite automatiquement les fichiers de configuration minimalistes de PostCSS et de Tailwind &lt;span class=&#034;caps&#034;&gt;CSS&lt;/span&gt; avec la commande suivante&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;npx tailwindcss init -p &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut ensuite &#233;diter les fichiers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;tailwind.config.js&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;postcss.config.js&lt;/code&gt;, &#233;tant donn&#233; une arborescence comme celle qui suit&#160;:&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;|_ content |_ truc.html |_ machin.html |_ css |_ src |_ _base.scss |_ _cards.scss |_ tailwind.scss |_ tailwind.css |_ inclure |_ inclusion.html |_ script.js |_ index.html &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On commence par peaufiner la configuration de PostCSS&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;nano postcss.config.js &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;js&#034; class='spip_code spip_code_block language-js' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;module.exports = { plugins: { 'postcss-easy-import': { path: ['./css/src'], prefix: '_', extensions: ['.css', '.scss'] }, 'tailwindcss/nesting': {}, tailwindcss: {}, autoprefixer: {}, ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}) } } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis on s'attelle &#224; la configuration de Tailwind &lt;span class=&#034;caps&#034;&gt;CSS&lt;/span&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;nano tailwind.config.js&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;js&#034; class='spip_code spip_code_block language-js' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;const defaultTheme = require('tailwindcss/defaultTheme') module.exports = { content: [ &#034;./*.{html,js}&#034;, &#034;./content/*.{html,js}&#034;, &#034;./inclure/*.{html,js}&#034;, ], theme: { screens: { 'xs': '480px', ...defaultTheme.screens, }, extend: { fontFamily: { 'cursive': ['Life Savers', 'cursive'], }, }, }, plugins: [], } &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut ensuite modifier la section &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;script&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; du fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;package.json&lt;/code&gt; avec les commandes permettant de compiler nos styles gr&#226;ce &#224; la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;npm run-script XXX&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;json&#034; class='spip_code spip_code_block language-json' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; &#034;scripts&#034;: { &#034;styles:dev&#034;: &#034;postcss css/src/tailwind.scss -o css/tailwind.css&#034;, &#034;styles:prod&#034;: &#034;NODE_ENV=production postcss css/src/tailwind.scss -o css/tailwind.css&#034;, &#034;styles:watch&#034;: &#034;watch 'npm run dev:scss' ../squelettes/&#034;, }, &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
