AlexisLefebvre.com - Mot-clé - tutoriel2023-07-06T21:46:34+02:00Alexis Lefebvreurn:md5:27efdec687e5c5adcae3e56885c52e81DotclearQuelques commandes utiles avec giturn:md5:2746916a234f07b7015bf83e8a53d3ff2022-07-18T20:36:00+02:002022-08-30T11:49:24+02:00Alexis Lefebvregitshelltutoriel<p>Voici quelques commandes qui me sont très utiles et que j'utilise souvent.</p> <h3>Créer un commit basé sur le nom de la branche puis le modifier</h3>
<pre>
git commit --message $(git rev-parse --abbrev-ref HEAD | tr "-" " ") ; git commit --amend
</pre>
<h3>Mettre à jour la branche locale à partir du dépôt amont</h3>
<pre>
git pull upstream $(git rev-parse --abbrev-ref HEAD)
</pre>
<h3>Créer un commit pour corriger un commit précédent</h3>
<pre>
git commit --fixup HEAD~1
</pre>
<p><br /></p>
<p><code>HEAD~1</code> est une référence à l'avant-dernier commit.</p>
<p>On peut alors rebaser la branche et activer la fusion automatique via l'option <code>--autosquash</code> :</p>
<pre>
git rebase --interactive --autosquash \
origin/develop
</pre>
<h3>Définir la branche amont</h3>
<p>Quand <code>git</code> n'arrive pas à faire un <code>pull</code>:</p>
<pre>
git pull
Pas d'information de suivi distant pour la branche actuelle.
Veuillez spécifier une branche avec laquelle fusionner.
Référez-vous à git-pull(1) pour de plus amples détails.
git pull <distant> <branche>
</pre>
<p>Si la branche amont et locale ont le même nom, on peut les lier avec la commande suivante :</p>
<pre>
git branch --set-upstream-to=origin/$(git rev-parse --abbrev-ref HEAD)
</pre>
<p>Et <code>git pull</code> sera fonctionnel.</p>
<h3>Supprimer les branches locales qui ont déjà été fusionnées</h3>
<pre>
git branch -a \
| grep -v "remotes\|develop\|master\|main" \
| tr -d " " | xargs git branch -d
</pre>
<p><br /></p>
<p>Cette commande supprime les branches sauf les branches principales exclues avec <code>grep -v</code></p>
<h3>Optimiser le stockage des fichiers git</h3>
<pre>
find ~/works/ -name '*.git' \
-execdir sh -c 'echo && cd {} \
&& pwd && git gc && git prune' \;
</pre>
<p><br /></p>
<p><code>find</code> trouve tous les répertoires dans le dossier <code>~/works/</code> qui contiennent eux-mêmes un dossier <code>.git</code> et lance les opérations de nettoyage.</p>
<h3>Récupérer le nom de la branche (sans les tirets) dans le presse-papier</h3>
<pre>
git rev-parse --abbrev-ref HEAD | tr "-" " " \
| xsel --clipboard
</pre>Avoir une URL publique via un tunnel HTTPS vers son environnement localurn:md5:79a96824995b689cb9a1fb2cbc07861c2021-12-20T14:04:00+01:002021-12-20T14:14:06+01:00Alexis LefebvrelinuxPHPtutoriel<p><a href="https://ngrok.com/" hreflang="en" title="ngrok - secure introspectable tunnels to localhost">ngrok</a> est un outil simple d'utilisation qui permet de créer un tunnel afin par exemple de rendre accessible un site en local via une URL en HTTPS.</p>
<p>Cela permet notamment de tester des services qui utilisent des <em>callbacks</em>.</p> <ol>
<li><a href="https://dashboard.ngrok.com/login" hreflang="en" title="ngrok - secure introspectable tunnels to localhost">Créer un compte ou se connecter</a></li>
<li>Installer <a href="https://dashboard.ngrok.com/get-started/setup" hreflang="en" title="Setup - ngrok">ngrok</a></li>
<li>Lancer ngrok en indiquant le type de service et le numéro de port: <code>ngrok http 8000</code></li>
</ol>
<p><br /></p>
<p>On voit alors que ngrok a créé des URLs pour accéder à notre environnement local :</p>
<pre>
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Account Alexis Lefebvre (Plan: Free)
Version 2.3.40
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://[…].ngrok.io -> http://localhost:8000
Forwarding https://[…].ngrok.io -> http://localhost:8000
Connections ttl opn rt1 rt5 p50 p90
7 0 0.00 0.01 65.02 111.99
HTTP Requests
-------------
GET /test 200 OK
</pre>Run PhotoPrism on another computerurn:md5:04be2799869af85fbc85c86dd01ee36a2021-12-17T23:54:00+01:002021-12-18T00:15:40+01:00Alexis Lefebvredockerlinuxtutoriel<p>I was able to launch a <a href="https://photoprism.app/" hreflang="en" title="Browse Your Life in Pictures – PhotoPrism">PhotoPrism</a> container on another computer by following these steps.</p> <p>Let's say that you have 2 computers, the <strong>server</strong> is the one that already run PhotoPrism, we'll use our local computer as a <strong>client</strong> to run PhotoPrism.</p>
<h3>⚠️ Prerequisites:</h3>
<ul>
<li>you have Docker on both computers, you start PhotoPrism with <code>docker-compose</code></li>
<li>the folders mounted in the photoprism container are mounted on your other computer (I use Samba for this):
<ul>
<li>the folder(s) with your media content</li>
<li>the <code>storage</code> folder</li>
</ul></li>
<li>the storage folder is writable by the client too</li>
<li>you understand every step below</li>
</ul>
<h3>On your server:</h3>
<ol>
<li>Do a backup just in case</li>
<li>Stop the <code>photoprism</code> container (we don't want parallel accesses to the same database)</li>
<li>Open the port for the database by updating <code>docker-compose.yml</code>, my local network is on the 192.168.1.X range so I use it to not open the port to Internet:</li>
</ol>
<pre> photoprism-db:
# …
ports:
- 192.168.1.6:13306:3306</pre>
<p><br /></p>
<p>Restart the <code>photoprism-db</code> container: <code>docker-compose up --detach photoprism-db</code></p>
<h3>On your client:</h3>
<p>We have to run PhotoPrism and it needs to access to the same paths than when it's running on the server.</p>
<ol>
<li>Copy the <code>docker-compose.yml</code> file, keep only the <code>photoprism</code> service</li>
<li>Remove the network</li>
<li>Update the <code>PHOTOPRISM_DATABASE_DSN</code> variable to use the database on the server</li>
<li>Update the <code>volumes</code>:
<ol>
<li>the part before <code>:</code> has to be updated and correspond to the paths that were mounted in the container</li>
<li>the part after <code>:</code> is kept as is</li>
</ol></li>
</ol>
<p><br /></p>
<p>You should have something like this:</p>
<pre>
version: '3.7'
services:
photoprism:
# …
environment:
# …
PHOTOPRISM_DATABASE_DSN: "photoprism:photoprism@tcp(192.168.1.6:13306)/photoprism?charset=utf8mb4,utf8&parseTime=true"
volumes:
- "/mnt/nas/photos/:/photoprism/originals/"
- "/mnt/nas/photoprism/storage/:/photoprism/storage" # keep database files
</pre>
<p><br /></p>
<p>Start the <code>photoprism</code> container: <code>docker-compose up --detach photoprism</code>.</p>
<p>Access to the PhotoPrism instance through the port you defined. You should see the same media than before.</p>
<hr />
<p>I didn't do any benchmark, but the network may be the bottleneck with this setup.</p>Upgrade from Intel Core i5 2500K to 3770K on Gigabyte Z78MA-D2H-B3urn:md5:572b79585b603528387b0d70ec3324762021-04-17T22:29:00+02:002022-08-31T14:32:13+02:00Alexis Lefebvrehardwaretutoriel<p>I wanted to upgrade my computer without having to change the CPU, the motherboard and the RAM (prices are currently high because of shortages). So I looked what CPU I could use with my 10-years-old motherboard in order to replace the <a href="https://ark.intel.com/content/www/us/en/ark/products/52210/intel-core-i5-2500k-processor-6m-cache-up-to-3-70-ghz.html" hreflang="en" title="Intel® Core™ i5-2500K Processor (6M Cache, up to 3.70 GHz) Product Specifications">2500K</a>.</p>
<p>And the answer was the <a href="https://ark.intel.com/content/www/us/en/ark/products/65523/intel-core-i7-3770k-processor-8m-cache-up-to-3-90-ghz.html" hreflang="en" title="Intel® Core™ i7-3770K Processor (8M Cache, up to 3.90 GHz) Product Specifications">3770K</a> that is similar to the 2500K but double the number of threads from to 4 to 8 (<a href="https://ark.intel.com/content/www/us/en/ark/compare.html?productIds=52210,65523" hreflang="en" title="Intel® Product Specification Comparison">see Intel's comparison</a>).</p>
<p>I found a 3770K at a decent price on eBay. But changing from the 2500K CPU to the 3770K was not an easy task. Here is how I did it.</p> <h3>Switch to 3770K</h3>
<p>The 3770K was released after the motherboard, and use the Ivy Bridge architecture instead of the Sandy Bridge architecture of the 2500K. The BIOS required a new version F10 to allow the motherboard to recognize that <em>new</em> CPU.</p>
<p>Thanks Gigabyte for still providing <a href="https://www.gigabyte.com/Motherboard/GA-Z68MA-D2H-B3-rev-10/support#support-dl-bios" hreflang="en" title="GA-Z68MA-D2H-B3 (rev. 1.0) Support ">drivers and BIOS</a> for the 10-years-old Z68MA-D2H-B3 rev 1.0!</p>
<p>It was easy to upgrade the BIOS by putting the F10 file on a USB stick then using the tool provided with the BIOS (QFlash) to load the file and update the BIOS.</p>
<p>The 3770K was detected and worked perfectly.</p>
<p>Then I tried to overclock it but the BIOS didn't allow to choose values over 3.9 GHz. Things started to be more complicated.</p>
<h3>Overclock the 3770K</h3>
<p>Gigabyte provide the U1C (UEFI BIOS) but a warning written in red says that it's a "Beta BIOS" and that "When updating from legacy to UEFI, use only the utility attached to your BIOS file". This sounded a little bit scary.</p>
<p>But some people have been able to use that beta UEFI <a href="https://www.tonymacx86.com/threads/guide-ga-z68ma-d2h-b3-uefi-bios-all-working-dsdt-not-required.62950/#post413702" hreflang="en" title="GUIDE: GA-Z68MA-D2H-B3 UEFI BIOS - ALL WORKING, DSDT not required! | tonymacx86.com">without issue</a> and I saw that it would allow the overclocking.</p>
<p>So I followed <a href="https://forum.giga-byte.co.uk/index.php?topic=2441.msg89013#msg89013" hreflang="en" title="How Do I Update My BIOS?">this guide</a> to install FreeDOS and update from BIOS to UEFI.</p>
<p>Once I booted on the USB stick, I had to type <code>FLASHEFI.EXE Z8MAD2H3.U1C</code>, press enter and wait.</p>
<p>It failed the first time then worked the second time!</p>
<p>I was finally able to boot on the UEFI "BIOS", push the 3.9 GHz limit and overclock the 3770K to 4.4 GHz.</p>
<h3>Results</h3>
<p>I had crashes at 4.5 GHz but it worked perfectly since I lowered the overclocking to 4.4 GHz.</p>
<p>The improvements are noticeable in the Multi-Core Score of Geekbench:</p>
<ul>
<li>Intel Core i5-2500K @ 4.50 GHz = 3200</li>
<li>Intel Core i7-3770K @ 4.40 GHz = 3900</li>
</ul>
<p>This matched with the <a href="https://cpu.userbenchmark.com/Compare/Intel-Core-i7-3770K-vs-Intel-Core-i5-2500K/1317vs619" hreflang="en" title="UserBenchmark: Intel Core i5-2500K vs i7-3770K">expected results</a>.</p>
<p><br /></p>
<p>The Single-Core Score (about 1000) is slightly better because of improvements on the CPU architecture, but the lower frequency reduces this.</p>Trouver et traiter des images en doublon sur Linux avec findimagedupesurn:md5:d6480652ee773ee47bd02ca6926808e72020-05-31T17:02:00+02:002021-01-17T00:10:20+01:00Alexis Lefebvrelinuxtutoriel<p>Cela est possible grâce au paquet <a href="https://packages.ubuntu.com/focal/findimagedupes" hreflang="fr" title="Ubuntu – Détails du paquet findimagedupes dans focal">findimagedupes</a></p> <p>Installer findimagedupes :</p>
<pre>
$ sudo apt install findimagedupes
</pre>
<p>Lancer l'analyse des images dans le dossier en argument en utilisant <a href="https://packages.ubuntu.com/focal/eog" hreflang="fr" title="Ubuntu – Détails du paquet eog dans focal">eog</a> afin de visualiser les images :</p>
<pre>
$ findimagedupes --program=/usr/bin/eog ~/Images/
</pre>
<p>Une fois les images analysées, <code>eog</code> affichera automatiquement la sélection des images qui sont proches. On peut alors supprimer une ou des images, puis fermer <code>eog</code> pour passer au lot suivant.</p>Bashful, un gestionnaire pour vos commandesurn:md5:7fa382c641b0dee962257fe5e1edc2392018-10-04T23:58:00+02:002018-10-04T23:07:31+02:00Alexis Lefebvreshelltutoriel<p>J'ai commencé à utiliser récemment <a href="https://github.com/wagoodman/bashful" hreflang="en" title="wagoodman/bashful: Use a yaml file to stitch together commands and bash snippits and run them with a bit of style. Why? Because your bash script should be quiet and shy-like (...and not such a loud mouth).">bashful</a>, un outil pour lancer des commandes, scripts, etc. en fournissant un affichage agréable.</p> <p>J'utilise plusieurs outils d'analyse de code dans mon flux de travail, je les lancais les uns à la suite des autres mais l'affichage manque de clarté. Avec bashful, on peut lancer des commandes à la chaîne, en parallèle, etc. grâce à une configuration écrite dans un fichier YAML.</p>
<p>Voici la configuration que j'utilise afin de lancer 2 outils d'analyse de code PHP en parallèle, je la place dans le fichier <code>~/scripts/phpqa.yaml</code> :</p>
<pre>
tasks:
- name: phpqa
parallel-tasks:
- name: PHP-CS-Fixer
cmd: docker run -t -v $PWD:/project -w /project jakzal/phpqa ci/src/php-cs-fixer 1>&2
- name: PHPStan
cmd: docker run -t -v $PWD:/project -w /project jakzal/phpqa:alpine phpstan analyse --no-progress --level 6 -c phpstan.neon src 1>&2
</pre>
<p>Les outils d'analyse proviennent de <a href="https://github.com/jakzal/phpqa" hreflang="en" title="jakzal/phpqa: Docker image that provides static analysis tools for PHP">l'image Docker jakzal/phpqa</a>.</p>
<p><code>1>&2</code> sert à rediriger la sortie standard <code>stderr</code> vers la sortie d'erreur <code>stderr</code> afin que la sortie des scripts s'affiche en cas d'erreur.</p>
<p>Je lance le script : <code>bashful run ~/scripts/phpqa.yaml</code></p>
<p>Voici le résultat, les analyses de code n'ont détecté aucune erreur:</p>
<p><a href="https://blog.alexislefebvre.com/public/images/bashful.png" title="bashful.png"><img src="https://blog.alexislefebvre.com/public/images/.bashful_m.png" alt="bashful.png" style="display:table; margin:0 auto;" title="bashful.png, oct. 2018" /></a></p>Créer des fichiers de logs pour les tâches cronurn:md5:26bb77a941b9c3bfabecfa879d13aac42018-07-23T23:11:00+02:002018-09-26T23:19:41+02:00Alexis Lefebvrecronshelltutoriel<p>Les tâches cron peuvent échouer pour de nombreuses raisons (erreur de syntaxe, commande non disponible dans le contexte de cron, etc.), l'enregistrement de la sortie des commandes permet d'historiser et d'identifier les erreurs afin de les corriger.</p> <p>La commande <code>date</code> accepte des arguments afin d'afficher différentes parties d'une date, par exemple :</p>
<p><code>$ date '+%Y-%m'</code></p>
<p>Retourne cette valeur :</p>
<p><code>2018-07</code></p>
<p>On peut se servir de cette commande afin d'obtenir la date courante au format que l'on souhaite.</p>
<p>Par exemple pour une tâche exécutée toutes les heures, on déclare une variable <code>date</code> qui stocke la date actuelle et qui sera utilisée pour créer un fichier contenant l'année et le numéro du mois :</p>
<p><code>0 * * * * date=$(date '+\%Y-\%m') ; echo "test" >> ~/${date}_test.log 2>&1"'</code>
.
Cela créera un fichier <code>~/2017-07_test.log</code>.</p>
<p>On peut également ajouter les heures, minutes et secondes</p>
<p><code>0 * * * * datetime=$(date '+\%Y-\%m-\%d_\%H-\%M-\%S') ; echo "test" >> ~/${datetime}_test.log 2>&1"'</code></p>
<p>Cela créera un fichier <code>~/2017-07-23_23-17-54_test.log</code>.</p>
<p><strong>Mise à jour du 30 juillet 2018</strong> : ajout d'antislash <code>\</code> afin d'échapper les signes pourcent <code>%</code>, l'échappement est nécessaire dans une ligne <code>cron</code>.</p>Fix Wi-Fi bug with Ubuntu 16.04 LTS on MSI GP62MVR laptopurn:md5:fe2eb080d65fc81d50b0af4813f9bf282017-09-29T22:23:00+02:002017-09-29T23:21:53+02:00Alexis Lefebvrelinuxtutorielubuntu <p>The default kernel installed with Ubuntu 16.04 didn't recognized my Wi-Fi card. I found the solution on AskUbuntu: <a href="https://askubuntu.com/a/907894/229365" hreflang="en" title="16.04 - How do I get an Intel Wireless 3168 802.11ac wireless card to work? - Ask Ubuntu">How do I get an Intel Wireless 3168 802.11ac wireless card to work?</a>.</p>
<p>The solution is also documented in <a href="https://wiki.ubuntu.com/Kernel/LTSEnablementStack#Ubuntu_16.04_LTS_-_Xenial_Xerus" hreflang="en" title="Kernel/LTSEnablementStack - Ubuntu Wiki">Ubuntu's documentation</a> and consist in installing an up-to-date kernel on the LTS Ubuntu release:</p>
<ol>
<li>Install the new kernel: <code>sudo apt-get install linux-generic-hwe-16.04 xserver-xorg-hwe-16.04 --install-recommends</code></li>
<li>Reboot</li>
</ol>
<p>Then I was able to configure and use the Wi-Fi connection.</p>Activer la sortie HDMI 1080p60 sur le décodeur TV Livebox 4urn:md5:7c57e36f538f2d2dccd43c1835d4be2d2016-11-26T00:14:00+01:002018-02-04T18:25:54+01:00Alexis Lefebvretutoriel<p>Le mode 1080p à 60 Hz du décodeur TV <a href="https://boutique.orange.fr/internet/nouveautes-livebox-4" hreflang="fr" title="Tout sur la meilleure box internet d'Orange, la Nouvelle Livebox">Livebox 4</a> n'est pas disponible dans les paramètres de la Livebox 4.</p>
<p>Il faut passer par le menu Maintenance pour avoir cette option :</p> <ol>
<li>Sur le décodeur TV, appuyer 5 secondes sur la touche <code>TV -</code> (un signe moins dans une télé) : <a href="https://blog.alexislefebvre.com/public/images/livebox_4/decodeur-4-face-avant-bouton-tv-moins_screenshot.png" title="decodeur-4-face-avant-bouton-tv-moins_screenshot.png"><img src="https://blog.alexislefebvre.com/public/images/livebox_4/.decodeur-4-face-avant-bouton-tv-moins_screenshot_m.png" alt="decodeur-4-face-avant-bouton-tv-moins_screenshot.png" style="display:table; margin:0 auto;" title="decodeur-4-face-avant-bouton-tv-moins_screenshot.png, nov. 2016" /></a></li>
<li>Afin d'arriver au menu d'assistance : <a href="https://blog.alexislefebvre.com/public/images/livebox_4/decodeur-tv-4-menu-maintenance-disque-dur_screenshot.jpg" title="decodeur-tv-4-menu-maintenance-disque-dur_screenshot.jpg"><img src="https://blog.alexislefebvre.com/public/images/livebox_4/.decodeur-tv-4-menu-maintenance-disque-dur_screenshot_m.jpg" alt="decodeur-tv-4-menu-maintenance-disque-dur_screenshot.jpg" style="display:table; margin:0 auto;" title="decodeur-tv-4-menu-maintenance-disque-dur_screenshot.jpg, nov. 2016" /></a></li>
<li>Avec la télécommande :
<ol>
<li>Sélectionner l'option <em>audio / vidéo</em></li>
<li>Appuyer sur la touche <code>1</code></li>
<li>Sélectionner le mode <em>1920 X 1080 P60</em></li>
<li>Confirmer avec la touche <code>OK</code></li>
<li>Si l'affichage est correct, sélectionner l'option <em>conserver cette résolution</em> puis valider avec la touche <code>OK</code></li>
<li>Sélectionner l'option ''quitter'</li>
<li>Appuyer avec la touche <code>OK</code></li>
</ol></li>
</ol>
<p><a href="https://assistance.orange.fr/tv-decodeur/tous-les-decodeurs/installer-et-utiliser/brancher-ou-debrancher-votre-materiel/l-enregistreur-tv/enregistreur-tv-formater-le-disque-dur-du-decodeur-tv-4_194415-739429" hreflang="fr" title="Enregistreur TV : formater le disque dur du décodeur TV 4 - Assistance Orange">Source</a> qui m'a permis de découvrir l'existence du menu <em>assistance</em>.</p>Accélérer les tests de Symfony en stockant le cache et les logs en mémoire et en utilisant SQLiteurn:md5:bb140e18f078e2eba097dfe2f9e26a392016-11-24T20:21:00+01:002017-07-23T23:14:10+02:00Alexis Lefebvrecronlinuxsymfonyteststutoriel<p>Lors du développement et du lancement des tests de Symfony, l'écriture et la lecture du cache peuvent prendre un temps important à cause des nombreux accès disques. Voici comment stocker ces fichiers dans la mémoire, bien plus rapide qu'un disque (y compris SSD) et comment utiliser une base de données <a href="https://fr.wikipedia.org/wiki/SQLite" hreflang="fr" title="SQLite — Wikipédia">SQLite</a> lors des tests.</p> <h3>Stocker les fichiers dans la mémoire</h3>
<p>Sous Linux, le dossier <code>/run/shm</code> est un <a href="https://fr.wikipedia.org/wiki/Tmpfs" hreflang="fr" title="tmpfs — Wikipédia">système de fichier temporaire</a>, créé dans la mémoire (RAM).</p>
<p>Créer les répertoires dans la mémoire :</p>
<pre>
mkdir -p /run/shm/projet/cache /run/shm/projet/logs
</pre>
<p>Se déplacer dans le répertoire du projet, puis dans <code>app/</code> avec Symfony 2 ou <code>var/</code> avec Symfony 3 :</p>
<pre>
cd projet/app/
</pre>
<p>Supprimer les dossiers <code>app</code> et <code>cache</code> :</p>
<pre>
rm -rf app/ cache/
</pre>
<p>Créer les liens symboliques afin que les répertoires <code>app</code> et <code>cache</code> pointent vers les dossiers créés au début :</p>
<pre>
ln -s /run/shm/projet/cache cache
ln -s /run/shm/projet/logs logs
</pre>
<p>Ajouter cette ligne dans le <code>crontab</code> afin de créer ces dossiers au démarrage de la machine :</p>
<pre>
@reboot mkdir -p /run/shm/projet/cache /run/shm/projet/logs && chmod 777 -R /run/shm/projet/
</pre>
<h3>Utiliser une base de données SQLite</h3>
<p>Comme cela est <a href="https://github.com/liip/LiipFunctionalTestBundle#tips-for-fixture-loading-tests" hreflang="en" title="liip/LiipFunctionalTestBundle: Some helper classes for writing functional tests in Symfony">décrit dans la documentation deLiipFunctionalTestBundle</a>, il est possible d'utiliser une base SQLite lors des tests :</p>
<pre>
# app/config/config_test.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_sqlite
path: %kernel.cache_dir%/test.db
</pre>
<h3>Comparaison</h3>
<p>Afin de comparer l'impact de ces modifications sur les performances, j'ai lancé un scénario d'un test Behat avec les différents configurations.</p>
<p>Le cache a été <em>pré-chauffé</em> avant chaque test : <code>app/console cache:warmup --env=test</code></p>
<h4>Résultats</h4>
<pre>
+--------+---------------------+----------------------+
| X | cache sur le disque | cache dans /run/shm/ |
+--------+---------------------+----------------------+
| MySQL | 23,36 s | 22,22 s |
| SQLite | 10,90 s | 8,82 s |
+--------+---------------------+----------------------+
</pre>
<h3>Conclusion</h3>
<p>Comme le montrent les résultats ci-dessus, l'utilisation de la RAM et d'une base de données SQLite peuvent diviser par 3 le temps d'un test.</p>Afficher la branche git dans le prompt du shell fishurn:md5:38c0b0a09adb72b0855ee33d201fad152016-11-14T19:37:00+01:002016-11-14T19:44:14+01:00Alexis Lefebvrefishgitlinuxshelltutorielubuntu<p>Par défaut, le shell <a href="https://fishshell.com/" hreflang="en" title="fish shell">fish</a> n'affiche pas la branche git actuelle :</p>
<p><a href="https://blog.alexislefebvre.com/public/images/fish_sans_branche_git.png"><img src="https://blog.alexislefebvre.com/public/images/fish_sans_branche_git.png" alt="" style="display:table; margin:0 auto;" title="fish_sans_branche_git.png, nov. 2016" /></a>
Voici comment l'afficher.</p> <p>Il faut placer le code suivant dans le fichier <code>~/.config/fish/config.fish</code> :</p>
<pre>
set fish_git_dirty_color red
set fish_git_not_dirty_color green
function parse_git_branch
set -l branch (git branch 2> /dev/null | grep -e '\* ' | sed 's/^..\(.*\)/\1/')
set -l git_diff (git diff)
if test -n "$git_diff"
echo (set_color $fish_git_dirty_color)$branch(set_color normal)
else
echo (set_color $fish_git_not_dirty_color)$branch(set_color normal)
end
end
function fish_prompt
set -l git_dir (git rev-parse --git-dir 2> /dev/null)
if test -n "$git_dir"
printf '%s@%s %s%s%s (%s)> ' (whoami) (hostname|cut -d . -f 1) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal) (parse_git_branch)
else
printf '%s@%s %s%s%s> ' (whoami) (hostname|cut -d . -f 1) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal)
end
end
</pre>
<p>La branche s'affiche alors en vert ou en rouge si des changements n'ont pas été sauvegardés :</p>
<p><a href="https://blog.alexislefebvre.com/public/images/fish_avec_branche_git.png" title="fish_avec_branche_git.png"><img src="https://blog.alexislefebvre.com/public/images/fish_avec_branche_git.png" alt="fish_avec_branche_git.png" style="display:table; margin:0 auto;" title="fish_avec_branche_git.png, nov. 2016" /></a></p>
<p><a href="http://zogovic.com/post/37906589287/showing-git-branch-in-fish-shell-prompt" hreflang="en" title="Showing git branch in fish shell prompt - Milovan Zogovic">Source</a>.</p>Administrer un serveur sous Linux (Ubuntu)urn:md5:265db63eba16c607ac468dc09a225c732012-05-02T21:09:00+02:002012-05-02T20:35:23+02:00Alexis Lefebvrecronlinuxshelltutorielubuntu<p>Voici quelques outils qui m'aident à administrer le PC sous Ubuntu (actuellement la version 12.04) qui me sert de serveur de fichier / <a href="http://fr.wikipedia.org/wiki/Serveur_de_stockage_en_r%C3%A9seau" hreflang="fr">NAS</a>.</p> <h3>aptitude</h3>
<p>Ce gestionnaire de paquets fonctionne en mode console à la manière d'un logiciel graphique, il est peu intuitif à cause des raccourcis clavier imposés pour son utilisation mais reste très pratique pour visualiser un paquet et ses dépendances.</p>
<h3>fail2ban</h3>
<p>Ce service qui surveille les connexions aux processus : serveur SSH, Web, FTP, etc. Il peut être configuré pour par exemple bannir une adresse IP après 3 tentatives infructueuses de connexion via SSH.</p>
<h3>logwatch</h3>
<p>C'est un logiciel qui envoie un rapport d'activité du serveur :</p>
<ul>
<li>les tentatives de connexion en SSH : quelles adresses IP ont tenté de se connecter au serveur, j'observe entre 2 et 10 essais chaque jour</li>
<li>les nombre de bannissements ordonnés par fail2ban</li>
<li>l'espace disque restant sur les différentes partitions</li>
</ul>
<h3>apticron</h3>
<p>Ce programme envoie un email lorsque le gestionnaire de paquets, qui est lancé automatiquement plusieurs fois par jour, détecte que des paquets peuvent être mis à jour. Cela permet de ne pas oublier d'appliquer les mises à jour de sécurité sur le serveur.</p>
<h3>postfix</h3>
<p>L'envoi des emails est géré par postfix qui utilise le serveur SMTP de mon fournisseur d'accès, j'avais utilisé <a href="http://doc.ubuntu-fr.org/postfix_systeme_satellite" hreflang="fr">ce tutoriel</a> pour configurer le programme.</p>
<p>Le service <a href="http://dyn.com/dns/" hreflang="en">DynDNS</a> est utilisé pour fournir un nom de machine lors de l'envoi des emails.</p>Les raccourcis claviers indispensables pour OpenOffice.org Writerurn:md5:66f93effd4d9ad9dc91b358595d2a65a2010-10-03T17:07:00+02:002012-02-08T21:46:00+01:00Alexis Lefebvrebureautiquerédactiontutoriel<p>Pour ne plus avoir à explorer les <a href="http://wiki.services.openoffice.org/wiki/FR/Documentation/Writer_Guide/Raccourcis_clavier_Writer" hreflang="fr">listes complètes</a> <a href="http://wiki.services.openoffice.org/wiki/FR/Documentation/Writer_Guide/Touches_fonction" hreflang="fr">des raccourcis</a>, voici les raccourcis indispensables (selon moi) pour pouvoir utiliser le traitement de texte d'OpenOffice.org (Writer) en évitant les aller-retours dans les menus avec la souris.</p> <h3>F12</h3>
<p>Activer la numérotation, insérer une liste ordonnée :</p>
<ol>
<li>1</li>
<li>2</li>
<li>3</li>
</ol>
<h3>Maj+F12</h3>
<p>Insérer une liste non ordonnée :</p>
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
<h3>Ctrl+Maj+F12</h3>
<p>Désactiver les listes.</p>
<h3>Ctrl+F12</h3>
<p>Insérer un tableau :</p>
<table rules="all" border="1">
<thead><tr><th>A</th><th>B</th></tr></thead>
<tbody>
<tr><td>V</td><td>W</td></tr>
<tr><td>X</td><td>Y</td></tr>
</tbody>
</table>
<h3>Ctrl+Maj+P</h3>
<p>Mettre en exposant : X<sup>exposant</sup></p>
<h3>Ctrl+Maj+B</h3>
<p>Mettre en indice : X<sub>indice</sub> (cet exemple peut ne pas apparaître selon le style de ce blog)</p>
<h3>Ctrl+(1, 2 ou 3)</h3>
<p>Appliquer le style de paragraphe Titre 1, 2 ou 3 :</p>
<h2>Titre 1</h2>
<h3>Titre 2</h3>
<h4>Titre 3</h4>
<h3>Ctrl+Maj+Espace</h3>
<p>Insérer un <a href="http://fr.wikipedia.org/wiki/Espace_ins%C3%A9cable" hreflang="fr">espace insécable</a>.</p>
<h3>Ctrl+Entrée</h3>
<p>Insérer un saut de page manuel.</p>
<h3>F11</h3>
<p>(Dés)Activer la fenêtre Styles et formatage où l'on peut définir les interlignes des paragraphes, les tailles des polices des titres, etc.</p>Personnaliser l'invite de bashurn:md5:b8b9a3e0c0e32a1012d493fea948ad242010-09-08T21:21:00+02:002010-10-04T17:46:44+02:00Alexis Lefebvrelinuxshelltutoriel<p>Les cours de Systèmes que je suis actuellement sont dispensés dans des salles informatiques où les ordinateurs ne disposent pas de <a href="https://blog.alexislefebvre.com/post/2009/05/24/Installer-fish%2C-un-shell-interactif-agr%C3%A9able">fish</a>, mon <em>shell</em> de prédilection. Je ne peux utiliser que le classique bash, souvent le <em>shell</em> par défaut, dont l'utilisation est rendue pénible par l'absence de couleurs :</p>
<p><a href="https://blog.alexislefebvre.com/public/images/bash_sans_couleurs.png" title="Bash sans couleurs"><img src="https://blog.alexislefebvre.com/public/images/.bash_sans_couleurs_m.jpg" alt="Bash sans couleurs" style="display:block; margin:0 auto;" title="Bash sans couleurs, sept. 2010" /></a></p>
<p>Sans couleurs, il est difficile de distinguer les commandes et leurs résultats. Heureusement, bash peut être configuré pour ressembler à fish.</p> <h3>Modifier la configuration de bash</h3>
<p>La configuration de bash se fait dans le fichier <code>~/.bashrc</code>, c'est à dire le fichier <code>.bashrc</code> situé à la racine du répertoire personnel de l'utilisateur.</p>
<p>Ouvrons ce fichier :</p>
<pre>nano ~/.bashrc</pre>
<p>nano est un éditeur de texte utilisable depuis un terminal. Une fois le fichier édité, il faut appuyer sur Ctrl + O puis <Entrée> pour sauvegarder le fichier puis sur Ctrl + X pour fermer nano. Le fichier peut aussi être édité en mode graphique en utilisant <code>gedit</code> à la place de <code>nano</code>.</p>
<p>La commande <code>ls</code> liste le contenu d'un répertoire, il est très pratique de colorer les différents fichiers en appelant automatiquement l'argument <code>--color</code>. Par défaut la commande <code>ls</code> affiche seulement les noms des dossiers et fichiers, en pratique on ne l'utilise quasiment jamais telle quelle. Avec l'option <code>-l</code> la commande <code>ls</code> affiche davantage d'informations utiles. Pour éviter d'avoir à taper systématiquement <code>ls -l</code>, je crée l'alias <code>ll</code> qui exécutera la commande <code>ls -l</code>. J'ajoute les lignes suivantes dans le fichier <code>~/.bashrc</code> :</p>
<pre>alias ls="ls --color"
alias ll="ls -l"</pre>
<p>La coloration est aussi possible avec grep :</p>
<pre>alias grep="grep --color"</pre>
<p>Enfin, la coloration de l'invite, le texte s'affichant lorsque le terminal attend les commandes, fait ressortir ces dernières :</p>
<pre>export PS1="\u@\[\e[0;34m\]\h\[\e[m\]:\[\e[0;32m\]\w\[\e[m\]\$ "</pre>
<p><code>\u</code> est le nom d'utilisateur (<q lang="en">user</q>), <code>\h</code> le nom de la machine (<q lang="en">host</q>) et <code>\w</code> le chemin du répertoire courtant (<q lang="en">working directory</q>). La coloration est réalisée entre les balises <code>\e[0;34m</code> et <code>\e[m</code>, les codes couleurs sont présentés dans les liens connexes. Les balises <code>[</code> et <code>]</code> évitent que bash interprète ce code comme du texte, sans ça bash tronque la ligne de commande ce qui perturbe l'affichage des longues lignes de commandes.</p>
<h3>Aperçu</h3>
<p>Il faut ouvrir un nouveau terminal pour voir le résultat de ces modifications :</p>
<p><a href="https://blog.alexislefebvre.com/public/images/bash_avec_couleurs.png" title="Bash avec des couleurs"><img src="https://blog.alexislefebvre.com/public/images/.bash_avec_couleurs_m.jpg" alt="Bash avec des couleurs" style="display:block; margin:0 auto;" title="Bash avec des couleurs, sept. 2010" /></a></p>
<p>Le nom de la machine (<code>lieu</code>) est coloré en bleu alors que le répertoire courant (<code>~/Exos_systeme</code>) est coloré en vert, ce qui permet de repérer plus facilement les lignes de commandes. Le raccourci <code>ll</code> affiche le dossier et les fichiers en utilisant plusieurs couleurs. Enfin, <code>grep</code> met en valeur en rouge la chaîne recherchée dans les lignes. Il est à noter que la commande <code>tail -n 5</code> utilisée pour limiter le résultat à 5 lignes supprime la coloration, c'est pourquoi il faut exécuter une seconde fois la commande <code>grep Toulouse</code>.</p>
<h3>Notes</h3>
<p>Ces modifications rendent l'utilisation du terminal bien plus confortable. Selon les différents fichiers par défaut inhérents aux versions des logiciels, il est possible que votre fichier <code>~/.bashrc</code> contienne déjà les alias des commandes, dans ce cas il suffit de décommenter les lignes (retirer les signes <code>#</code> en début de ligne) pour créer les alias.</p>
<p>J'ai utilisé les articles suivants pour modifier mon invite de commandes :</p>
<ul>
<li><a href="http://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/" hreflang="en">BASH Shell change the color of my shell prompt under Linux or UNIX</a></li>
<li><a href="http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html" hreflang="en">How to: Change / Setup bash custom prompt (PS1)</a></li>
</ul>
<h3>Mise à jour du 04-10-2010</h3>
<p>Dotclear interprétait les caractères de coloration de l'invite, le code a été corrigé pour s'afficher correctement.</p>Installer fish, un shell interactif agréableurn:md5:ab18616b27ad2d1d7a86f8569800bc132009-05-24T19:02:00+02:002019-08-11T15:37:50+02:00Alexis Lefebvrefishlinuxshelltutorielubuntu<p>J'utilise la distribution Linux <a href="http://www.ubuntu.com/" hreflang="en" title="Ubuntu Home Page | Ubuntu">Ubuntu</a> depuis environ 3 ans. J'utilisais le shell par défaut <code>bash</code> sans savoir qu'on pouvait en utiliser un autre. J'ai découvert le shell <strong>fish</strong> par hasard en lisant les commentaires d'une nouvelle sur <a href="http://linuxfr.org/comments/1018518.html#1018518" hreflang="fr" title="DLFP: fil de discussion numéro 1018518">LinuxFr.org</a>, je l'ai installé et l'ai adopté.</p> <p><a href="https://blog.alexislefebvre.com/public/images/fish.png"><img src="https://blog.alexislefebvre.com/public/images/.fish_m.jpg" alt="Exemple d'utilisation du shell fish" style="display:table; margin:0 auto;" title="Exemple d'utilisation du shell fish, mai 2009" /></a>
(cliquez sur l'image pour la voir à taille réelle)</p>
<p>En plus de mettre en valeur les commandes avec de la couleur, fish détaille les commandes disponibles avec <code>apt-get</code> en fournissant une courte description et liste les fichiers présents dans le répertoire <code>~/.config/fish/</code> en affichant leur taille. Ceci se fait en pressant la touche de tabulation.</p>
<h3>Installation</h3>
<p>Installer fish se fait très facilement :</p>
<pre>sudo apt-get install fish</pre>
<p>Ensuite, il faut taper <code>fish</code> dans un terminal pour le lancer et le tester.</p>
<p>Pour en faire son shell par défaut, il faut utiliser la commande <code>chsh</code> :</p>
<pre>alexis@ubuntu:~$ chsh
Mot de passe :
Changement d'interpréteur de commandes initial pour alexis
Entrez la nouvelle valeur ou « Entrée » pour conserver la valeur proposée
Interpréteur de commandes initial [/bin/bash]:</pre>
<p>On entre <code>/usr/bin/fish</code> et fish devient le shell par défaut, j'ai dû redémarrer mon ordinateur pour que le changement soit effectif, peut-être qu'un redémarrage du serveur graphique suffit à l'appliquer.</p>
<h3>Aller plus loin</h3>
<p>Là où bash utilise le fichier de configuration <code>~/.bashrc</code>, fish utilise le fichier <code>~/.config/fish/config.fish</code> qui n'existe pas par défaut. C'est lui qui permet de personnaliser le shell de l'utilisateur, je me suis servi de la <a href="http://www.fishshell.org/user_doc/index.html" hreflang="en" title="fish user documentation">documentation de fish</a> pour l'écrire.</p>
<p>nano se chargera de créer le fichier :</p>
<pre>nano ~/.config/fish/config.fish</pre>
<p>Dans ce fichier, j'ajoute un code d'accueil qui donne l'heure courante :</p>
<pre>cowsay "Bonjour $USER, nous sommes le "(date +'%A %e %B %Y')" et il est "(date +'%H')":"(date +'%M')":"(date +'%S')</pre>
<p>Cette commande affiche ceci lors de l'ouverture d'un shell :</p>
<pre> _________________________________________
/ Bonjour alexis, nous sommes le dimanche \
\ 24 mai 2009 et il est 18:38:24 /
-----------------------------------------
\ <sup>__</sup>
\ (oo)\_<strong></strong>__
(__)\ )\/\
||<del></del>w |
|| ||</pre>
<p>J'insère aussi une fonction pour que <code>grep</code> ajoute des couleurs aux résultats qu'il retourne :</p>
<pre>function grep
grep --color $argv
end</pre>
<p>J'enregistre le fichier et quand je redémarre un shell, la vache de <code>cowsay</code> me dit bonjour et le résultat d'un <code>diff</code> est coloré.</p>
<p>Logiciel utilisé :</p>
<ul>
<li><a href="https://fishshell.com/" hreflang="en" title="fish shell">fish</a></li>
</ul>