\documentclass[10pt,a4paper,oneside]{article}
\usepackage{ae,lmodern} % ou seulement l'un, ou l'autre, ou times etc.
\usepackage[french]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{array} %list of figures
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{makeidx}
\usepackage{graphicx}
\usepackage{hyperref}
\hypersetup{hidelinks} %cache les encadrés en couleur de liens
\usepackage{xcolor} %Pour les couleurs
\usepackage{listings}
\usepackage{color}
\usepackage[top=2cm,right=1cm,left=1cm,bottom=2cm]{geometry}

\definecolor{selection}{HTML}{1e843e}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{HTML}{820210}

\lstset{
%frame=bt,
backgroundcolor=\color{lightgray},
language=bash,
aboveskip=3mm,
belowskip=3mm,
showstringspaces=false,
escapeinside={\$*}{*)},
columns=flexible,
basicstyle={\small\ttfamily},
numbers=none,
numberstyle=\tiny\color{gray},
keywordstyle=\color{blue},
commentstyle=\color{selection},
stringstyle=\color{mauve},
breaklines=true,
breakatwhitespace=false,tabsize=3,
}

\begin{document}
\title{Compilation de commandes utiles régulièrement, ou pas\\}
\date{}
\maketitle
\begin{small}
\noindent Ce document est réalisé à partir de mes expériences diverses sur GNU/Linux, principalement Debian et depuis peu avec Awesome WM.\\
Beaucoup de documentation existe sur le sujet, je ne vais donc pas réécrire ce qui existe déjà en mieux, mais plutôt partager des informations spécifiques qui m'ont demandé un peu de temps de recherche.\\
\end{small}
\newpage
\tableofcontents
\newpage
\noindent
\section{Commandes usuelles}
Si l'on utilise pas quotidiennement son terminal, on se retrouve régulièrement à avoir à rechercher des commandes usuelles sur internet car on les a oubliées.\\
L'objectif de cette page est donc de regrouper quelques commandes qui reviennent assez souvent.\\

\textbf{Pour une vraie documentation/présentation de ces commandes, je conseille la très bonne page : \url{https://linuxpedia.fr/doku.php/commande/commande}}.

\subsubsection*{Pipe ou envoyer le résultat d'une commande dans une autre}

Le signe | permet de renvoyer le résultat d'une commande dans la suivante au lieu de l'afficher dans le terminal :
\begin{lstlisting}
commande1 | commande2
\end{lstlisting}

Le résultat de la commande1 est utilisé comme argument de commande2.

\subsubsection*{Cat ou afficher le contenu d'un fichier}

La commande cat permet d'afficher le contenu d'un fichier grâce  à :
\begin{lstlisting}
cat fichier.txt
\end{lstlisting}

\subsubsection*{Télécharger une page internet}

La commande \texttt{curl exemple.com} affichera dans votre terminal le contenu de la page demandée.\\

La commande \texttt{wget exemple.com} téléchargera ce contenu dans un fichier html. Il est possible de l'utiliser récursivement pour télécharger tout un site.

\subsubsection*{Ajouter du contenu dans un fichier}

Pour ajouter du contenu dans un fichier sans avoir à l'ouvrir, on peut utiliser \texttt{>>}.

Ainsi \texttt{echo nouvelle ligne >> fichier.txt} ajoutera "nouvelle ligne" dans fichier.txt.

On peut aussi l'utiliser avec une commande, par exemple :
\begin{lstlisting}
curl exemple.com >> fichier.txt
\end{lstlisting}
permettra d'ajouter le contenu de exemple.com dans fichier.txt, et crée le fichier si il n'existe pas.

\subsubsection*{Trouver des caractères ou des fichiers}

Pour ces tâches on utilisera les commandes \texttt{grep} et \texttt{find}, la première pour trouver des caractères/mots/lignes dans un fichier et la deuxième pour trouver des fichiers dans un répertoire selon leur nom ou extension par exemple.\\



\section{Installations}
\subsection{Système}
\subsubsection{Créer une clé USB Bootable}
\textbf{Attention, cette commande nécessite de savoir précisément l'identification de votre clé usb, sinon vous risquez de perdre toutes vos données en formattant votre disque dur.}\\
Pour plus d'informations : \url{https://doc.ubuntu-fr.org/live_usb#en_ligne_de_commandes}\\
\begin{lstlisting}
sudo dd bs=4M status=progress if=votre.iso of=/dev/sdX && sync
\end{lstlisting}
\subsubsection{Créer une clé USB live avec plusieurs ISOs}
Il est également possible d'utiliser plusieurs images dans une seule clé. Pour cela on peut installer \texttt{multibootusb} (\url{http://multibootusb.org/page_download/}). Pour l'installer :\\
\begin{lstlisting}
sudo dpkg -i python3-multibootusb_9.2.0-1_all.deb
\end{lstlisting}
Si vous rencontrez des problèmes de dépendances non satisfaites, relevez les noms de ces paquets, installez les puis répétez la commande ci-dessus.\\
Exécutez ensuite le programme avec \texttt{sudo multibootusb}.\\
\subsubsection{Vérification d'ISO}
\noindent
La vérification d'iso consiste à vérifier l'authenticité et l'intégrité des images téléchargées. La méthode exacte sera spécifique à chaque .iso car les fichiers et signatures ne seront pas la même, cette partie présentera donc des commandes usuelles mais ne permet pas de réaliser toutes les étapes sans regarder la documentation spécifique à la vérification souhaitée.\\
\textsc{Tentative d'explication :} l'authenticité permet de vérifier que le fichier téléchargé a bien été créé par la personne qui dit l'avoir signée. L'intégrité permet de vérifier que le fichier n'a pas été modifié par une personne tiers. Ces méthodes \textbf{ne peut pas prouver que le fichier n'est pas malicieux}, on doit donc choisir de nous-même si l'on fait confiance aux personnes qui ont créé ces fichiers.
Tout d'abord, télécharger dans le même fichier le .iso (ou autre format, mais le fichier de l'image logiciel) et les fichiers de signature SHA256sum.txt et SHA256sum.txt.gpg (de même, les extensions de fichier peuvent varier).\\
Il faut ensuite générer le SHA256sum de l'iso téléchargé afin de le comparer au fichier téléchargé.
Générer le SHA256sum :
\begin{lstlisting}
sha256sum -b *.iso
\end{lstlisting}
Il faut ensuite comparer la signature obtenue à celle contenue dans SHA256sum.txt. Une méthode permet de le faire à partir d'une ligne de commande : 
\begin{lstlisting}
sha256sum --ignore-missing -c sha256sum.txt
\end{lstlisting}
\textbf{Vérification d'authenticité}\\

Pour vérifier l'authenticité de SHA256sum.txt il faut vérifier la signature de SHA256sum.txt.gpg.\\
Il faut tout d'abord importer la clé de signature du système d'exploitation, pour \emph{Debian} :
\begin{lstlisting}
gpg --keyserver keyring.debian.org --recv-keys 0xDEADBEEF
gpg --verify sha256sum.txt.gpg sha256sum.txt
\end{lstlisting}
\subsubsection{Retirer le bip du clavier}
Il arrive qu'après une nouvelle installation le clavier \emph{bip} en cas d'entrée vide.
Pour l'enlever :\\
\begin{lstlisting}
echo "blacklist pcspkr" | sudo tee /etc/modprobe.d/nobeep.conf
\end{lstlisting}
Le bruit aura disparu après un redémarrage.
\subsubsection{Tâches exécutées à un moment (heure, date, jour) précis}
Le programme \texttt{cron} sert à ce genre de tâches.\\
Il faut modifier le fichier \texttt{/etc/crontab}, selon ce format :
\begin{lstlisting}
MM HH DD OO WW command
\end{lstlisting}
MM: Minute, 0-59
HH: 24-hour hour
DD: Day of month
OO: Month
WW: Day of Week (Sunday is 0, Monday is 1)
Par exemple :
\begin{lstlisting}
30 23 * * * root shutdown -h now
\end{lstlisting}
Cela fera que l'ordinateur s'éteindra tous les jours à 23h30.
\subsubsection{Faire apparaître GRUB au démarrage}
Après une nouvelle installation de Manjaro, je n'avais pas accès à GRUB au démarrage et je ne pouvais pas changer de noyau. Cela était dû au fait que GRUB était configuré comme caché. On peut le modifier dans son fichier de configuration : \texttt{/etc/default/grub}.
Il suffit de changer
\begin{lstlisting}
GRUB_TIMEOUT_STYLE="hidden"
\end{lstlisting}
en
\begin{lstlisting}
GRUB_TIMEOUT_STYLE="menu"
\end{lstlisting}
Il est aussi possible de changer le temps d'affichage de GRUB avec la variable \texttt{GRUB\_TIMEOUT}.\\
Pour que les changements soient pris en compte :
\begin{lstlisting}
sudo update-grub
\end{lstlisting}
\subsection{Terminal}
\subsubsection{Changer de shell - Zsh}
Le shell par défaut des principales distributions Linux est \emph{bash}, un autre shell populaire offrant de nombreuses fonctionnalités est \emph{zsh} et son extension populaire \texttt{oh-my-zsh}.
Pour l'utiliser il faut d'abord l'installer :\\
\begin{lstlisting}
sudo apt install zsh
\end{lstlisting}
pour Arch Linux ou Manjaro :
\begin{lstlisting}
sudo pacman -S zsh
\end{lstlisting}
On peut vérifier qu'il est bien installé avec : 
\begin{lstlisting}
zsh --version
\end{lstlisting}
Pour changer de shell par défaut et pour passer à zsh :
\begin{lstlisting}
chsh -s $(which zsh)
\end{lstlisting}
Il faut ensuite se déconnecter pour mettre à jour le changement.\\

\noindent \textbf{Installer oh-my-zsh}
\begin{lstlisting}
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
\end{lstlisting}
Wiki : \url{https://github.com/ohmyzsh/ohmyzsh/wiki}\\

\noindent Il est maintenant possible de configurer à nos souhaits ce shell via le fichier \texttt{.zshrc}.\\

\noindent Deux vidéos intéressantes pour comprendre les fonctionnalités disponibles et comment les utiliser :\\
\url{https://www.youtube.com/watch?v=4KBuPCeF9Gc}\\
\url{https://www.youtube.com/watch?v=soAwUq2cQHQ}
\subsubsection{Ajouter des plugins facilement dans Vim}
\url{https://github.com/VundleVim/Vundle.vim}
\subsubsection{Colorer les codes couleurs html/rgb etc}
Un plugin pour surligner de la couleur correspondante les codes couleurs dans Vim :\\
\url{https://github.com/gko/vim-coloresque}
\subsubsection{Copier des liens symboliques en ligne de commande}
Documentation : \url{https://www.lostsaloon.com/technology/how-to-copy-symbolic-links-in-linux/}
\subsection{Disques chiffrés}
\subsubsection{Créer un disque chiffré}
Voir ici : \url{https://blog.tinned-software.net/create-a-luks-encrypted-partition-on-linux-mint/}
\subsubsection{Monter un disque chiffré en ligne de commande}
Monter un disque chiffré ne requiert pas les mêmes commandes que pour un disque normal, mais c'est finalement assez simple.\\
Tout d'abord vous devez bien entendu avoir \texttt{cryptsetup} d'installé sur votre système.\\
\begin{lstlisting}
sudo apt install cryptsetup
\end{lstlisting}
Ensuite on aura ces opérations à réaliser :
\begin{lstlisting}
sudo cryptsetup luksOpen /dev/sdc1 cryptdrive
sudo mkdir /media/MONDISQUE
sudo mount /dev/mapper/cryptdrive /media/MONDISQUE/
\end{lstlisting}
Le \texttt{/dev/sdc1} donne l'information de la \textbf{partition} que vous voulez monter, et \texttt{cryptdrive} est le \emph{mapper} que vous nommez pour que le système reconnaisse le disque.\\
La deuxième ligne est optionnelle si l'emplacement de montage souhaité existe déjà.\\
La dernière commande est la commande habituelle de montage : identification du disque à monter et l'emplacement où le monter.\\
\subsubsection{Monter un disque chiffré automatiquement au démarrage}
Il est possible de monter automatique le disque chiffré sans avoir à renseigner la phrase de déchiffrement si vous configurez un fichier "clé" et l'utilisez au démarrage.\\
\textbf{Mon "tuto" est seulement un rappel des commandes nécessaires, sans grandes explications car tout est bien détaillé dans la source que j'ai utilisé. Si cela ne fonctionne pas parfaitement il y a plus de détails dans l'article source.}
Source : \url{https://blog.tinned-software.net/automount-a-luks-encrypted-volume-on-system-start/}\\
On commence par créer un fichier \texttt{disksecretkey} rempli aléatoirement qui servira à contenir la clé de déchiffrement. Il faudra peut être créer le dossier \texttt{luks-keys} si il n'existe pas.
\begin{lstlisting}
dd if=/dev/urandom of=/etc/luks-keys/disksecretkey bs=512 count=8
\end{lstlisting}
On peut ensuite lier ce fichier à notre disque et sa phrase de déchiffrement :
\begin{lstlisting}
sudo cryptsetup -v luksAddKey /dev/sdb1 /etc/luks-keys/disksecretkey
\end{lstlisting}
Cela vous demandera la phrase de déchiffrement de votre disque (attention à bien renseigner votre partition à la place de sdb1).\\
Ensuite on récupère le UUID du disque pour l'utiliser dans les règles au démarrage :
\begin{lstlisting}
sudo cryptsetup luksDump /dev/sdb1 | grep "UUID"
\end{lstlisting}
On ajoute une règle dans le fichier \texttt{/etc/crypttab} :
\begin{lstlisting}
sdb1-crypt UUID=2a2375bf-2262-413c-a6a8-fbeb14659c85 /etc/luks-keys/disksecretkey luks 
\end{lstlisting}
Enfin, pour qu'il soit monté au démarrage on ajoute une ligne au fichier dédié : \texttt{/etc/fstab}
\begin{lstlisting}
/dev/mapper/sdb1-crypt /media/gerhard/Daten ext4    defaults   0       2
\end{lstlisting}
Pour des règles plus spécifiques consultez la page dédiée à \texttt{fstab} : \url{http://man7.org/linux/man-pages/man5/fstab.5.html}
\subsection{Customisation, paramétrage}
\subsubsection{Installer une police au format fichier .ttf}
\noindent
Pour l'installer seulement pour l'utilisateur·ice :
\begin{lstlisting}
cp exemple.ttf .fonts
\end{lstlisting}
Pour l'installer sur tout le système :
\begin{lstlisting}
cp exemple.ttf /usr/share/fonts
\end{lstlisting}
\subsubsection{Changer l'image de grub (écran de démarrage)}
Il est possible de changer l'image d'arrière plan de GRUB, l'utilitaire de démarrage de Debian (et d'autres distribution) qui permet de choisir quelle distribution lancer.\\
L'image utilisée doit cependant respecter un format spécifique, elles peuvent être png, jpg/jpeg ou tga mais avec ces caractéristiques :\\
\begin{enumerate}
\item les images doivent être 8-bits (256 couleurs)
\item les images doivent être non-indexées, RGB
\end{enumerate}
Des convertisseurs d'images pour les transformer sous ces caractéristiques sont trouvables sur \emph{internet}.\\
Par défaut, si le paquet \emph{desktop-base} est installé les images utilisables sont trouvables dans le répertoire \verb+/usr/share/images/desktop-base/+.\\
GRUB va chercher l'image à afficher selon un ordre particulier présenté ici par ordre de priorité :\\
\begin{enumerate}
\item la ligne \verb+GRUB_BACKGROUND+ dans \verb+/etc/default/grub+
\item la première image trouvée dans \verb+/boot/grub/+
\item l'image spécifiée dans \verb+/usr/share/desktop-base/grub_background.sh+
\item le fichier listé à la ligne WALLPAPER dans \verb+/etc/grub.d/05_debian_theme+
\end{enumerate}
Le plus simple étant donc de modifier ou créer la ligne \verb+GRUB_BACKGROUND=+ dans 
\verb+/etc/default/grub+ en ajoutant le chemin du fichier derrière le \verb+=+. \emph{pour modifier ce fichier, il est nécessaire d'avoir les droits administrateur}.
\textbf{Pour avoir la modification effective, il faut utiliser la commande :}\\
\verb+update-grub+\\
\textsc{Changer les couleurs du texte :}\\
On peut également changer les couleurs du texte grâce aux 3 options suivantes : 
\begin{enumerate}
\item \verb+menu_color_highlight+ : la couleur de l'entrée menu surlignée et son fond à l'intérieur du menu.
\item \verb+menu_color_normal+ : la couleur de l'entrée menu non-sélectionnée et son fond
\item \verb+color_normal+ : la couleur du texte et son fond à l'extérieur du menu.
\end{enumerate}
La syntaxe à utiliser est la suivante :
\verb+menu_color_highlight=fg-color/bg-color+
Et la liste des couleurs supportées est : \\
black \\ 
blue\\
brown\\
cyan\\
dark-gray\\
green\\
light-cyan\\
light-blue\\
light-green\\
light-gray\\
light-magenta\\
light-red\\
magenta\\
red\\
white\\
yellow\\
Pour changer les couleurs, il faut ensuite ouvrir \verb+/etc/grub.d/05_debian_theme+ et trouver la ligne :
\begin{lstlisting}
if [ -z "${2}" ] && [ -z "${3}" ]; then
                echo "  true"
fi
\end{lstlisting}
Et la remplacer par :
\begin{lstlisting}
if [ -z "${2}" ] && [ -z "${3}" ]; then
    # echo "  true"
    echo "    set color_highlight=red/green"
    echo "    set color_normal=light-cyan/black"
fi
\end{lstlisting}
\textbf{Ne pas changer le "black"} dans \verb+color_normal+ sinon l'image ne sera pas transparente à l'endroit où le menu est affiché.\\
\textbf{Pour avoir la modification effective et la visualiser, il faut utiliser la commande suivante et redémarrer}\\
\verb+update-grub+\\

Il est également possible d'expérimenter en "live" au démarrage en arrêtant le compte à rebours (en tapant n'importe quelle touche) et en tapant "C" pour entrer dans la ligne de commande GRUB.\\
Vous pouvez alors expérimenter à votre souhait :
\begin{lstlisting}
grub> set color_highlight=red/green
grub> set color_normal=light-cyan/black
\end{lstlisting}
Pressez ESC pour voir les modifications et recommencez si cela ne vous convient pas.\\
\subsubsection{Utiliser le pavé numérique comme souris}
Il est possible d'utiliser le pavé numérique comme une souris ! Pour l'activer de manière non permanente il suffit d'utiliser :
\begin{lstlisting}
setxkbmap -option keypad:pointerkeys 
\end{lstlisting}
Ensuite pour l'utiliser il faut utiliser la combinaison \textbf{Shift+NumLock} et le pavé numérique fonctionnera comme une souris avec des raccourcis spécifiques.\\
Pour se déplacer :
\begin{itemize}
	\item 7, 8, 9 pour un déplacement vers le haut
	\item 4, 6 pour gauche et droite
	\item 1, 2, 3 pour le bas
\end{itemize}
Pour cliquer c'est légèrement compliqué :
\begin{itemize}
	\item / sélectionne le clic gauche (appuyer deux fois pour un double clic, trois fois pour un triple)
	\item * sélectionne le clic du milieu
	\item - sélectionne le clic droit
\end{itemize}
Une fois que le clic est sélectionné il est seulement \textbf{actif} et il faut donc utiliser une autre touche pour l'utiliser :
\begin{itemize}
	\item 5 ou + pour réellement cliquer
	\item 0 / ins pour cliquer et garder actif (pour faire glisser)
	\item . / Del pour libérer
\end{itemize}
Pour garder cette configuration au redémarrage il faut ajouter l'option dans le fichier de configuration, ou le créer si besoin :\\
\texttt{/etc/X11/xorg.conf.d/00-keyboard.conf}
\begin{lstlisting}
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbOptions" "keypad:pointerkeys"
EndSection
\end{lstlisting}
\textsc{Source :} \url{https://linuxreviews.org/HOWTO_use_the_numeric_keyboard_keys_as_mouse_in_XOrg}
\subsubsection{Luminosité}
Pour régler la luminosité en ligne de commande, on utilise \textbf{xrandr}.\\
Tout d'abord on cherche l'écran que l'on veut paramétrer :
\begin{lstlisting}
~$ xrandr
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS-1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis)
\end{lstlisting}
On voit donc que l'écran connecté est LVDS-1. Pour le baisser à 50\% de luminosité : 
\begin{lstlisting}
xrandr --output LVDS-1 --brightness 0.5
\end{lstlisting}
Pour toute autre valeur on ajuste le nombre renseigné (1  pour avoir 100\%, 0.1 pour 10\% etc).\\

J'ai trouvé une manière de changer la luminosité après quelques recherches, c'est probablement une manière beaucoup trop compliquée de faire mais c'est pratique pour apprendre les commandes et ça fonctionne.\\
J'ai fait trois scripts différents, un pour augmenter de 10\% la luminosité, un pour la baisser et un dernier pour juste afficher la luminosité actuelle en pourcentage.\\
Ces scripts sont composés de seulement une ligne mais avec plusieurs commandes dedans. Ainsi, celle-ci permet de baisser la luminosité de 10\% :\\
\begin{lstlisting}
xrandr --output eDP-1 --brightness $(echo "$(xrandr --current --verbose|grep -i Brightness | sed s/"Brightness: "//g)-.1" | bc)
\end{lstlisting}
On retrouve la commande de départ avec le \texttt{--output} avec le nom de votre écran puis \texttt{--brightness} qui prend la valeur en décimale qu'on veut pour l'écran (1.0 pour 100\% et 0.1 pour 10\%). On cherche d'abord la luminosité actuelle.\\
\begin{lstlisting}
xrandr --current --verbose|grep -i Brightness
\end{lstlisting}
Donne quelque chose comme :
\begin{lstlisting}
Brightness: 1.0
\end{lstlisting}
On utilise alors :
\begin{lstlisting}
| sed s/"Brightness: "//g
\end{lstlisting}
\emph{Le signe \texttt{|} permet d'envoyer le résultat de la commande à gauche dans la commande à droite.}\\
Cela permet de récupérer seulement la valeur décimale.
Puis on utilise \texttt{-.1} pour enlever 10\% à la valeur trouvée.\\

En \textbf{bash} on ne peut pas faire du calcul en décimal puisque les valeurs sont considérés comme des chaînes de caractères. Il faut alors utiliser \textbf{bc} : \url{http://jlbicquelet.free.fr/unix/bc.php}.\\
\textbf{bc} prend comme argument la valeur de la parenthèse (à l'aide du signe \texttt{\$}) et fait le calcul, qui nous rend donc la valeur actuelle de la luminosité moins 10\%.\\ 


De la même manière, on a la commande pour augmenter de 10\% :\\
\begin{lstlisting}
xrandr --output eDP-1 --brightness $(echo "$(xrandr --current --verbose|grep -i Brightness | sed s/"Brightness: "//g)+.1" | bc)
\end{lstlisting}

Enfin, j'ai fait une commande pour récupérer la valeur actuelle de la luminosité et la convertir en pourcentage :\\
\begin{lstlisting}
echo $(xrandr --current --verbose|grep -i Brightness | sed s/"Brightness: "//g)*100 | bc
\end{lstlisting}
On retrouve la même base sauf que le calcul est seulement une multiplication par 100 de la valeur actuelle. Cette commande est utilisée pour mon widget de luminosité.\\
\subsubsection{Changement image de profil}
\noindent Pour modifier l'image affichée sur l'écran de connexion.
\begin{lstlisting}
sudo nano /etc/lightdm/lightdm-gtk-greeter.conf 
\end{lstlisting}
Le paquet accountsservice résoud une dépendance et permet d'utiliser mugshot qui définit la photo de profil du compte.\\
\subsection{Chercher et supprimer des fichiers en doublon}
On utilise le paquet fdupes :\\
\begin{lstlisting}
fdupes [options] DIRECTORY
\end{lstlisting}
Pour chercher les doublons récursivement dans un dossier et les supprimer :\\
\begin{lstlisting}
fdupes -r -d DIRECTORY
\end{lstlisting}
\textsc{Sources :} : \url{https://linux.die.net/man/1/fdupes}\\

Une autre solution est d'utiliser fslint :
\begin{lstlisting}
sudo apt install fslint
\end{lstlisting}
\subsection{Compresser des images en ligne de commande}
sudo apt-get install jpegoptim
\subsection{Image ISO personnalisée pour debian}
Liens ressources :\\
Live Build : création d'une image iso live personnalisée \url{https://debian-facile.org/utilisateurs:abdelqahar:tutos:live-build}\\
Comment construire un Live Debian : \url{https://arpinux.developpez.com/construire-un-live-debian/}\\
Création d'une image live Debian bootable : \url{https://wiki.csnu.org/index.php/Cr%C3%A9ation_d%27une_image_debian_bootable_(syst%C3%A8me_de_rescue,_live_system)#Pour_debian_stretch_:}
\section{Manjaro - Arch Linux}
\subsection{Ressources diverses}
Post-Installation :\\
\url{https://www.youtube.com/watch?v=jl4nyEA-F-o}
\url{https://wiki.archlinux.org/index.php/Xfce#Use_a_different_window_manager}
\url{https://wiki.archlinux.org/index.php/Uniform_look_for_Qt_and_GTK_applications}

\section{Awesome WM et la customisation avancée}
La plupart des distributions utilisent par défaut des gestionnaires de fenêtres "flottantes" : XFCE, MATE, GNOME, etc. Il existe cependant des gestionnaires en mosaïque (Tiling managers) qui permettent de gérer plus précisément ses fenêtres et tout son environnement graphique (à condition de bien vouloir y passer quelques heures de configuration). J'en ai rapidement testé plusieurs mais \emph{Awesome} est celui dont j'ai le mieux réussi la prise en main et donc que j'utilise en ce moment.\\
En parallèle de ce gestionnaire j'utilise : kitty en terminal, vim en éditeur, compton pour la transparence, ranger pour les fichiers et conky pour mon affichage de données en continu sur le bureau.
\subsection{Où sont les fichiers ?}
Souvent, l'emplacement des fichiers de configuration est "évidente" pour les personnes partageant leurs codes sur internet, et pourtant\ldots\\

J'essaye d'utiliser \emph{Vim} pour éditer mes fichiers. Parce que apparemmment c'est la référence pour être efficace et qu'il est configurable pour avoir de la saisie semi-automatique dans LateX. Il est dur de prise en main mais super pratique quand on (commence) à s'y faire.\\
Pour l'édition des thèmes il est presque indispensable grâce à l'extension que j'ai installée qui surligne les codes des couleurs par leur couleur correspondante.\\
\begin{lstlisting}
~/.vim/
~/.vimrc
\end{lstlisting}
Pour les raccourcis : \url{https://vim.rtorr.com/}
Pour le gestionnaire de fichier j'utilise au maximum ranger qui permet d'afficher les fichiers textes sans avoir à les ouvrir, très pratique pour explorer les dossier de code. Il s'utilise au clavier et peut être super rapide et pratique une fois qu'on s'y fait.\\
J'utilise : \url{https://ranger.github.io/cheatsheet.png} pour les raccourcis. Les fichiers de configurations sont dans :
\begin{lstlisting}
~/.config/ranger/
\end{lstlisting}
Ici les modifications sont le fait d'afficher les fichiers cachés et d'activer l'affichage des images directement dans kitty.\\

Pour le terminal, j'utilise kitty. Il est sobre et permet d'afficher les images en utilisant ranger.
\begin{lstlisting}
~/.config/kitty/
\end{lstlisting}
Contient le thème dans \emph{theme.conf} basé sur mon thème actuel.\\

J'ai installé et configuré Conky pour avoir un affichage permanent de pas mal de données sur le Bureau.
Tout est dans un fichier \emph{.conkyrc} dans le dossier utilisateur·ice. Il utilise une image dans \emph{Images/ImagesConfig/}. Il dépend surtout des polices installées et les données sur le réseau utilise le nom d'interface réseau qui peut être différente selon les ordinateurs (pour l'ethernet comme pour le wifi).\\

Pour la \textbf{transparence}, j'utilise compton et son fichier de configuration \emph{.config/compton.conf}. Il permet de choisir la transparence des fenêtres actives/inactives, les exclusions, et "l'ombre" sur les fenêtres inactives.\\


Pour les thèmes, les fichiers sont à trouver et/où copier ici :
\begin{lstlisting}
~/.themes/
~/.fonts/
~/.icons/
\end{lstlisting}

Pour Awesome j'utilise du code trouvé sur internet, et plusieurs dossiers de dépendances pour les widgets. Le fichier \textbf{rc.lua} sert à définir le fonctionnement global (comportement des fenêtres, programmes au démarrage, par défaut, raccourcis clavier, etc) puis dans le dossier \textbf{themes} on trouve tout ce qui est esthétique.\\
Le dossier où tout se passe est ici :
\begin{lstlisting}
~/.config/awesome/
\end{lstlisting}
\subsection{Dépendances}
\begin{lstlisting}
sudo apt install awesome awesome-extra i3lock conky compton kitty vim-runtime ranger lxappearance pulsemixer papirus-icon-theme numix-icon-theme
\end{lstlisting}

J'utilise pulsemixer parce que j'ai réussi à le configurer dans mes raccourcis clavier pour qu'il soit compatible avec mon casque bluetooth.

Lxappearance est nécessaire pour changer le thème utilisé. En effet le programme de xfce ne fonctionne pas dans Awesome (les modifications ne sont pas prises en compte).

J'utilise kitty parce que c'est un terminal très épuré, il a aussi l'avantage de pouvoir afficher les images en étant dans ranger (gestionnaire de fichiers intégré au terminal, avec beaucoup de raccourcis clavier, les mêmes que Vim).

Vim est la référence apparemment pour éditer le code grâce à ses dizaines de raccourcis clavier, je l'ai pas mal configuré pour pouvoir écrire plus facilement du Latex. Et j'utilise un plugin très pratique qui affiche les couleurs du code (les codes couleurs RVB et HTML sont surlignés de la couleur correspondante, très pratique pour l'édition des thèmes).

Sur GitHub :
i3lock-fancy
\section{Yunohost, Brique Internet et autres serveur-like tips}
\subsection{Brique Internet sur clé 4G}
Le projet \url{labriqueinter.net} permet d'installer un mini-serveur sur une carte ARM ou Rasberry (ou autre) avec la particularité de créer un réseau wifi lié à un VPN. Tous les appareils connectés sont alors \emph{protégés} par le VPN si ils se connectent à ce réseau plutôt qu'à celui de la box. Le projet est basé sur \url{yunohost.org} lui même basé sur Debian, permettant de faciliter l'installation et l'utilisation d'un serveur pour les non-initié·es.\\

Mon cas est particulier pour deux raisons :
\begin{enumerate}
	\item J'utilise une carte OLIMEX LIME 1, pour laquelle il n'y a pas d'images pour la dernière version du projet, il faut donc réaliser une migration après avoir installé la version précédente.
	\item J'utilise une clé 4G Huawei pour me connecter et non un câble ethernet, il faut donc configurer la carte pour qu'elle se connecte sur cette clé au démarrage.\\
\end{enumerate}

Ces deux particularités m'ont causé pas mal de soucis avant de finalement réussir une installation. Une réinstallation est maintenant l'occasion pour moi de documenter les opérations nécessaires.\\
\subsubsection{Installation, post-installation}
J'ai utilisé le programme disponible sur \url{install.labriqueinter.net} pour générer mon fichier \texttt{install.hypercube}. Il faut ensuite utiliser le script fourni \texttt{install-sd.sh} pour installer les fichiers sur la carte sd. Comme il manque la dernière version de l'image pour la LIME1 il y a une erreur à l'exécution.\\
Deux solutions sont alors possibles : installer via une image brique internet Jessie puis faire la migration vers Stretch, ou faire une image brique internet à partir d'une image Yunohost. La première option n'a pas fonctionné pour moi et elle prend énormément de temps avec toutes les mises à jour à faire.\\
On préfèrera donc la méthode :\\
\begin{itemize}
	\item Télécharger une image Yunohost pour LIME1 : \url{https://yunohost.org/#/images}
	\item Créer l'image Brique internet à l'aide du script fourni ici : \url{https://github.com/labriqueinternet/build.labriqueinter.net/}
	\item Utiliser le script d'installation sur carte SD avec l'image créée.\\
\end{itemize}
Ma commande d'exécution est celle-ci :
\begin{lstlisting}
bash install-sd.sh -y install.hypercube -f internetcube-stretch-3.4.2-lime-stable.img
\end{lstlisting}
L'option \texttt{-s} permet de préciser quel périphérique utiliser si vous savez déjà l'emplacement de celui-ci. 
Vous avez besoin d'avoir arp-scan pour la suite :
\begin{lstlisting}
sudo apt install arp-scan
bash install-sd.sh -l
\end{lstlisting}
La deuxième commande permet de scanner le réseau pour détecter la brique en cours d'installation. Cela vous donnera l'adresse IP de la brique pour suivre l'avancement de l'installation.\\
\subsubsection{Monter la clé 4G au démarrage comme interface réseau}
J'utilise une clé Huawei E3372h, j'ai suivi des tutoriels pour la passer de \emph{hilink} à \emph{stick} mais \textbf{je ne suis pas certain que cela soit nécessaire finalement, je vous conseille d'essayer d'abord les commandes suivantes avant d'essayer de faire le changement de mode.}\\
Je partage cependant les liens qui m'ont permis de réaliser ce changement (cela m'a nécessité l'utilisation de linux mais aussi windows) :\\
\url{https://www.0xf8.org/2017/01/flashing-a-huawei-e3372h-4g-lte-stick-from-hilink-to-stick-mode/}\\
\url{http://blog.asiantuntijakaveri.fi/2015/07/convert-huawei-e3372h-153-from.html}\\
\url{https://markus.relix.de/index.php/Set_Huawei_E3372h_from_hilink_to_stick_mode}\\

\noindent Lors de mes premiers tests j'ai testé plusieurs méthodes souvent sans résultats, la solution vient finalement de ce post : \url{https://askubuntu.com/questions/755570/how-to-enable-broadband-connection-with-huawei-e3372h-on-ubuntu-server}\\
Ces explications permettent pour mon cas d'ajouter deux lignes dans \texttt{/etc/rc.local} permettant de démarrer la brique en utilisant la clé 4G comme interface réseau. Ce fichier est celui qui permet de lancer des commandes au démarrage.\\
\textbf{rc.local}
\begin{lstlisting}
#!/bin/sh -e
# 
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
echo -e "AT^NDISDUP=1,1,\"websfr\"\r" > /dev/ttyUSB0
dhclient wwan0
exit 0
\end{lstlisting}
Le \texttt{websfr} doit être modifié pour correspondre à l'\textbf{APN} de votre opérateur.\\

À la suite de ma réinstallation éditer ce fichier est tout ce qu'il m'a fallu faire pour que cela fonctionne.\\
\subsection{Utilisation de deux serveurs avec un domaine principal et un sous-domaine}
J'utilise deux serveur, un comme brique internet sur clé 4G, et un autre en serveur principal pour les gros services. Ils ont donc deux adresses IP publiques différentes.\\
Il me fallait donc bien configurer mes enregistrements DNS pour renvoyer mon sous-domaine dédié à la brique internet vers son adresse IP publique, ainsi que pouvoir lui installer un certificat SSL (pour l'https).\\
Il y a donc deux champs à rajouter aux enregistrements DNS :\\
\begin{itemize}
	\item Un enregistrement \textbf{A} pour rediriger vers l'ip \url{https://docs.gandi.net/en/domain_names/faq/record_types/a_record.html}
	\item Un enregistrement \textbf{CAA} pour la création de certificat SSL \url{https://docs.gandi.net/en/domain_names/faq/record_types/caa_record.html#caa-records}
\end{itemize}
En suivant ces documentations on a donc :
\begin{lstlisting}
brique 1800 IN A votre.ip
brique.votredomaine.com 3600 IN CAA 128 issue "letsencrypt.org"
\end{lstlisting}
\subsubsection{Enlever le bouton Yunohost permanent dans les applications}
Certaines applications affiche par défaut en bas à droite un lien avec le logo de yunohost. Pour l'enlever il faut modifier la configuration de \texttt{nginx} pour chaque application.\\
Il suffit de commenter la ligne : 
\begin{lstlisting}
include conf.d/yunohost_panel.conf.inc
\end{lstlisting}
Les fichiers de config sont dans : \texttt{/etc/nginx/conf.d/} (cela peut varier).\\
Pour info le script appelé est le suivant :
\begin{lstlisting}
# Insert YunoHost button + portal overlay
sub_filter </head> '<script type="text/javascript" src="/ynh_portal.js"></script><link type="text/css" rel="stylesheet" href="/ynh_overlay.css"></link><script type="text/javascript" src="/ynhtheme/custom_portal.js"></script><link type="text/css" rel="stylesheet" href="/ynhtheme/custom_overlay.css"></link></head>';
sub_filter_once on;
# Apply to other mime types than text/html
sub_filter_types application/xhtml+xml;
# Prevent YunoHost panel files from being blocked by specific app rules
location ~ (ynh_portal.js|ynh_overlay.css|ynh_userinfo.json) {
}
\end{lstlisting}
\textbf{Pour voir les changements il faut recharger nginx}\\
\begin{lstlisting}
sudo systemctl restart nginx
\end{lstlisting}
\subsection{Migration de serveur mail}
Documentation : \url{https://yunohost.org/#/email_migration}
\subsection{Mettre en place un service de VPN}
Script d'installation pour WireGuard : \url{https://github.com/angristan/wireguard-install}
\subsection{Serveur chiffré avec déchiffrement distant}
Documentation : \url{https://wiki.faimaison.net/doku.php?id=debian-fde-dropbear}
\section{Sauvegardes}
\subsection{Serveur Yunohost}
\url{https://yunohost.org/#/backup}
\subsection{Android - Utilisation de adb}
\noindent
Installation :
\begin{lstlisting}
sudo apt-get install android-tools-adb android-tools-fastboot
\end{lstlisting}
Détection :
\begin{lstlisting}
adb devices
\end{lstlisting}
Sauvegarde :
\begin{lstlisting}
adb backup -apk -shared -all -f backup.ab
\end{lstlisting}
Restaurer :
\begin{lstlisting}
adb restore backup.ab
\end{lstlisting}
\subsection{GNU-Linux}
\subsubsection{Le paquet rsync}
\noindent
Le paquet \emph{rsync} permet de sauvegarder ses données par copies. Il copie tous les fichiers sources vers la destination que vous avez choisie. Ensuite, il ne mettra à jour que ceux qui ont été modifiés ou ajoutés. D'où un gain de temps. De plus, rsync peut aussi être utilisé à travers un réseau.\\

\noindent \textsc{Syntaxe de base} : \textbf{rsync [option] /source /destination}\\

\noindent Copier un dossier intégralement
\begin{lstlisting}
rsync -av /source /destination
\end{lstlisting}
Copier seulement son contenu
\begin{lstlisting}
rsync -av /source/ /destination
\end{lstlisting}
\textbf{Transfert via SSH, avec un port spécifique}
\begin{lstlisting}
rsync -avzh -e "ssh -p $PORT" --progress /source/ user@domain.net:/destination/
\end{lstlisting}
Lors d'un téléchargement distant par ssh, en cas de coupure
\begin{lstlisting}
rsync --partial --progress --rsh=ssh [source] [user]@[host]:[destination]
\end{lstlisting}
L'option \textbf{--partial} relance depuis le point d'arrêt, \textbf{--progress} affiche la progression et \textbf{--rsh=ssh} sécurise le transfert.\\

\noindent \textbf{Exemple} : 
\begin{lstlisting}
rsync -r -t -x -v -n --progress -l -s --filter "- /.cache/" --filter "- /.thumbnails/" --filter "+ jeVeuxCeluiCi.txt" /home/utilisateur/ /media/DisqueExterne/repertoire_sauvegarde/ | more
\end{lstlisting}
-r fait une copie récursive\\
-S,                          traite les fichiers à trous efficacement\\
-x,                          ne traverse pas les limites du système de fichiers\\
-n,                          simule la sauvegarde sans ne rien faire réellement\\
--progress                   affiche la progression\\
--filter                     permet de désigner les dossiers que l'on ne veut pas sauvegarder (signe -) ou que l'on veut ajouter à la liste (signe +)\\
\emph{enlever le -n et |more pour que la sauvegarde se fasse une fois satisfait.}\\

\noindent
\textbf{Interfaces graphiques disponibles} : grsync et luckybackup\\

\noindent
\textsc{Documentation :} \url{https://debian-facile.org/doc:reseau:rsync}\\
\subsubsection{Sauvegarde complète de Debian avec un script}
À l'aide du paquet présenté ci-dessus il est possible de créer un ou des scripts qui sauvegarderont vos données sur un disque externe ou même sur le réseau. Je décris ici la méthode pour une sauvegarde de la racine (fichier de configuration, paquets, réglages des paquets, etc) et des fichiers personnels.\\
\emph{Cette partie demande de connaître l'organisation des fichiers dans un système GNU/Linux et comment les contrôler dans un terminal.}\\
\textbf{Cette partie demande en particulier des précautions car elle consiste à modifier ses fichiers avec un contrôle \emph{root} et cela n'est pas sans risques.}\\
\textbf{Il faut en particulier adapter les noms des partitions de ce guide à son propre système.}\\
Pour identifier ses disques, tapez (\emph{en root}) :
\begin{lstlisting}
:~# fdisk -l
\end{lstlisting}
Vérifiez que vous n'avez aucun périphérique usb branché, éteignez et débranchez votre ordinateur, rallumez pour identifier votre disque source. Remettez hors tension, branchez le ou les disques externes, rallumez et identifiez les disques en root.
Si vous utilisez un seul disque externe vous devriez trouver :\\
\verb+/dev/sda    ### disque source+\\
\verb+/dev/sdb    ### disque des sauvegardes+\\ 
\noindent
\textsc{Documentation :} \url{https://wiki.debian-fr.xyz/Sauvegarder_sa_Debian_en_vue_d\%27une_R\%C3\%A9installation_ou_Reconstruction_-_Racine_et_Home_s\%C3\%A9par\%C3\%A9s}
\subsection{Copier des fichiers entre machines distantes via SSH}
Syntaxe :
\begin{lstlisting}
scp source destination
\end{lstlisting}
Pour copier un fichier de B à A en étant connecté sur B :
\begin{lstlisting}
scp /path/to/file username@a:/path/to/destination
\end{lstlisting}
Pour copier un fichier de B à A en étant connecté sur A :
\begin{lstlisting}
scp username@b:/path/to/file /path/to/destination
\end{lstlisting}
\section{Logiciels}
\subsection{Themes}
Un logiciel pour générer des thèmes GTK, Oomox : \url{https://github.com/themix-project/oomox}\\
Syntaxe utile et comment faire un thème XFCE : \url{https://wiki.xfce.org/howto/xfwm4_theme}\\
\subsection{Lister les paquets installés}
\begin{lstlisting}
dpkg-query -l
\end{lstlisting}
\textsc{Documentation :} \url{https://wiki.debian.org/fr/ListInstalledPackages}
\subsection{Gestionnaire de tâches graphique dans le terminal}
Gotop : \url{https://www.linuxuprising.com/2019/01/gotop-graphical-system-monitor-for.html}
\subsection{Graphisme}
Logiciels utiles :
\begin{enumerate}
\item Dessin vectoriel : \textbf{Inkscape}
\item Édition basique d'images : \textbf{gthumb}
\end{enumerate}
\section{Développement Web}
\subsection{HTML}
\subsubsection{Centrer une image}
Centrer une image dépendra de son conteneur, je transcris ici la version simple (dans un paragraphe) et ma source détaille différents cas de figure.\\
Le code dans le corps de la page :
\begin{lstlisting}
<p class="aligncenter">
    <img src="image.jpg" alt="centered image" />
</p>
\end{lstlisting}
Ce code appelle donc la classe \texttt{aligncenter} définie comme :
\begin{lstlisting}
<style>
.aligncenter {
    text-align: center;
}
</style>
\end{lstlisting}
\textsc{Source :} \url{https://html-online.com/articles/image-align-center/}
\subsubsection{Faire un fond de page web qui change aléatoirement de couleur}
Ce code permet de changer toutes les 5 secondes la couleur du fond de la page. Il utilise 10 couleurs qui peuvent être modifiée, et on peut rajouter plus de couleurs en rajoutant des choix et en changeant à la bonne valeur la gamme de génération d'entier aléatoire.\\
\begin{lstlisting}
<!-- this script got from www.htmlbestcodes.com-Coded by: Krishna Eydat -->
<html>
<head>
<script type="text/javascript">
      function setbackground()
      {
      window.setTimeout( "setbackground()", 5000); // 5000 milliseconds delay
      
      var index = Math.round(Math.random() * 9);
      
      var ColorValue = "FFFFFF"; // default color - white (index = 0)
      
      if(index == 1)
      ColorValue = "FFCCCC"; //peach
      if(index == 2)
      ColorValue = "CCAFFF"; //violet
      if(index == 3)
      ColorValue = "A6BEFF"; //lt blue
      if(index == 4)
      ColorValue = "99FFFF"; //cyan
      if(index == 5)
      ColorValue = "D5CCBB"; //tan
      if(index == 6)
      ColorValue = "99FF99"; //lt green
      if(index == 7)
      ColorValue = "FFFF99"; //lt yellow
      if(index == 8)
      ColorValue = "FFCC99"; //lt orange
      if(index == 9)
      ColorValue = "CCCCCC"; //lt grey
      
      document.getElementsByTagName("body")[0].style.backgroundColor = "#" + ColorValue;
      }
</script>
</head>
<body onload="setbackground();">
</body>
</html>
\end{lstlisting}
\textsc{Source :} \url{https://www.htmlbestcodes.com/Set_background_color_randomly.htm}
\subsubsection{Générateur de code pour colorer du texte}
Ici : \url{https://www.stuffbydavid.com/textcolorizer}
\section{Internet}
\subsection{Flux RSS}
Les flux RSS permettent de suivre les publications de la majorité des sites internet sur une plateforme dédiée, il existe une multitude de services dédiés (Firefox intègre d'ailleurs un lecteur de flux).\\
Un aspect pratique des flux RSS est que cela fonctionne pour s'abonner à des \textbf{Chaînes YouTube} et cela sans compte, certains lecteurs de flux peuvent même afficher la vidéo et donc vous n'avez pas à aller sur YouTube en soi.\\
\textsc{S'abonner à une chaîne YouTube}\\
URL : \verb+https://www.youtube.com/feeds/videos.xml?user=+\textbf{nom de user ou code trouvable dans l'URL sur Youtube}\\

\textsc{S'abonner à une Playlist}\\
URL : \verb+https://www.youtube.com/feeds/videos.xml?playlist_id=+\textbf{nom de playlist ou id de l'URL}
\subsection{Multimédia}
\subsubsection{youtube-dl}
\noindent
Installation :
\begin{lstlisting}
sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl
sudo apt-get install ffmpeg
\end{lstlisting}

Mettre à jour
\begin{lstlisting}
youtube-dl -U
\end{lstlisting}
Options :
\begin{lstlisting}
youtube-dl [OPTIONS] URL
-i, --ignore-errors
--playlist-start NUMBER
--playlist-end NUMBER
\end{lstlisting}
Metadata
\begin{lstlisting}
--write-description Write video description to a .description file
--write-info-json Write video metadata to a .info.json file
--write-annotations Write video annotations to a .annotations.xml file
--write-thumbnail Write thumbnail image to disk
--write-sub
--all-subs
\end{lstlisting}
Audio
\begin{lstlisting}
-x, --extract-audio Convert video files to audio-only files (requires ffmpeg or avconv and ffprobe or avprobe)
--add-metadata Write metadata to the video file
--metadata-from-title "%(artist)s - %(title)s"
\end{lstlisting}
\textsc{Documentation :} \url{https://github.com/rg3/youtube-dl/blob/master/README.md}
\subsubsection{Spotify pour Debian 9}
\begin{lstlisting}
sudo apt instal dirmngr
# 1. Add the Spotify repository signing keys to be able to verify downloaded packages
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 931FF8E79F0876134EDDBDCCA87FF9DF48BF1C90

# 2. Add the Spotify repository
echo deb http://repository.spotify.com stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list

# 3. Update list of available packages
sudo apt-get update

# 4. Install Spotify
sudo apt-get install spotify-client
\end{lstlisting}
\subsubsection{Télécharger des playlists Spotify}
J'utilise : \url{https://github.com/SwapnilSoni1999/spotify-dl}\\
\begin{lstlisting}
sudo npm install -g spotify-dl
\end{lstlisting}
Il peut être nécessaire d'installer \textbf{npm} avec un simple apt install.\\
\section{Vie privée}
\subsection{Utiliser le VPN Riseup Black}
\begin{enumerate}
\item Créer un compte black.riseup.net
\item Installer \textbf{Bitmask}
\item Ouvrir Bitmask et se connecter
\end{enumerate}
\textbf{Installation de Bitmask pour Debian Stretch}\\
\textsc{Documentation :} \url{https://dl.bitmask.net/linux/}\\
Il y a besoin d'autoriser les stretch-backports pour installer le dernier paquet leap-archive-keyring\\
\emph{Ne pas faire cette étape si stretch-backports est déjà activé}
\begin{lstlisting}
sudo echo "deb http://deb.debian.org/debian stretch-backports main" > /etc/apt/sources.list.d/stretch-backports.list
sudo apt update && sudo apt install -t stretch-backports leap-archive-keyring
\end{lstlisting}
\begin{lstlisting}
sudo sh -c 'echo "deb http://deb.leap.se/client release stretch" > /etc/apt/sources.list.d/bitmask.list'
sudo apt update && sudo apt install bitmask
\end{lstlisting}
\textbf{\textsc{Résolution de problème}}
\subsection{Changer son adresse mac}
Installer macchanger :
\begin{lstlisting}
sudo apt-get install macchanger
\end{lstlisting}
On peut ensuite connaître son adresse MAC pour la noter :
\begin{lstlisting}
macchanger eth0
ou
macchanger wlan0
ou
macchanger wlp3s0
\end{lstlisting}
Créer le fichier de configuration :
\begin{lstlisting}
sudo nano /etc/init/macchanger.conf

# macchanger - set MAC addresses
#
# Set the MAC addresses for the network interfaces.

description     "change mac addresses"

start on starting network-manager

pre-start script
        /usr/bin/macchanger -A wlan0
        /usr/bin/macchanger -A eth0
        /usr/bin/macchanger -A wmaster0
        /usr/bin/macchanger -A pan0
        #/usr/bin/logger wlan0 `/usr/bin/macchanger -s wlan0`
        #/usr/bin/logger eth0 `/usr/bin/macchanger -s eth0`
end script
\end{lstlisting}
\textbf{Attention à rajouter le nom de votre interface si elle n'est ni wlan0 ni eth0 (c'était wlp3s0 pour moi).}\\
Créer le fichier \textbf{/etc/network/if-post-down.d/random-mac} à partir de :
\begin{lstlisting}
#!/bin/sh

MACCHANGER=/usr/bin/macchanger

[ "$IFACE" != "lo" ] || exit 0

# Bring down interface (for wireless cards that are up to scan for networks), change MAC address to a random vendor address, bring up the interface
/sbin/ifconfig "$IFACE" down
macchanger -A "$IFACE"
\end{lstlisting}
Il reste à rendre le script exécutable et à redémarrer le network manager :
\begin{lstlisting}
sudo chmod +x /etc/network/if-post-down.d/random-mac 
sudo service network-manager restart
\end{lstlisting}
 
\emph{Sources} : \url{https://riseup.net/fr/security/network-security/mac-address}

\subsection{Liens de ressources}
Cookieviz, une dataviz en temps réel du tracking de votre navigation : \url{https://linc.cnil.fr/fr/cookieviz-une-dataviz-en-temps-reel-du-tracking-de-votre-navigation}\\
The smart girl’s guide to privacy, practical tips for staying safe online \url{https://we.riseup.net/assets/355960/smartgirlsguidetoprivacy.pdf}\\
Comment les métadonnées permettent de vous surveiller : \url{https://www.dailymotion.com/video/x2u0rj1}\\
Thunderbird, Enigmail and OpenPGP for Linux - Secure Email : \url{https://securityinabox.org/fr/guide/thunderbird/linux/}\\
GPG et le chiffrement pour tous : \url{https://ungeek.fr/gpg-et-le-chiffrement-pour-tous/}
\section{Bugs divers}
\subsection{Bugs après une installation}
\subsubsection{Driver wifi - Debian x bcm43xx}
\noindent
\textbf{Pour connaître les composants connectés au bus PCI, on utilise la commande} \verb+lspci+\\

Version raccourcie pour les réseaux :
\begin{lstlisting}
~$ lspci -nn | grep Network
03:00.0 Network controller [0280]: Intel Corporation PRO/Wireless 3945ABG Network Connection [8086:4227] (rev 02)
\end{lstlisting}
\emph{Présentation ici d'un cas particulier mais la méthode peut être adaptée à d'autres modèles de drivers.}\\
Ajouter \verb+contrib non-free+ à la ligne du fichier \verb+/etc/apt/sources.list+ puis mettre à jour les sources :
\begin{lstlisting}
# Debian 9 "stretch"
deb http://deb.debian.org/debian/ stretch main contrib non-free
apt-get update
\end{lstlisting}
Installer le bon firmware selon le driver\\

\noindent
BCM4306 revision 3, BCM4311, BCM4318, BCM4321 ou BCM4322 :\\
\verb+firmware-b43-installer+\\
BCM4312 LP-PHY :\\
\verb+firmware-b43-installer+\\
BCM4301 chip ou BCM4306 revision 2 :\\
\verb+firmware-b43legacy-installer+\\

\noindent
\textsc{Source :} \url{https://wiki.debian.org/bcm43xx}
\subsection{Bugs dans le terminal}
\subsubsection{./configure say no compiler found}
\noindent Erreur
\begin{lstlisting}
configure: error: no acceptable C compiler found in $PATH
\end{lstlisting}
Solution
\begin{lstlisting}
sudo apt-get install build-essential
\end{lstlisting}
\textsc{Source :} \url{https://stackoverflow.com/questions/18076157/why-does-configure-say-no-c-compiler-found-when-gcc-is-installed}
\section{Divers}
\subsection{Wallabako - synchronisation wallabag et kobo}
Si vous avez une instance Wallabag et une liseuse Kobo, il existe un programme permettant de synchroniser les articles non-lus en les téléchargeant en ePUB sur votre liseuse.\\

La documentation et les fichiers sont ici : \url{https://gitlab.com/anarcat/wallabako}
\subsection{Contrôler son téléphone Android - scrpy}
Ce programme permet à un téléphone Android d'être entièrement contrôlé via l'ordinateur auquel il est branché. L'écran est simplement en miroir sur une fenêtre flottante et permet d'utiliser le clavier et la souris de l'ordinateur.\\
Il est disponible sur les principales distributions : \url{https://github.com/Genymobile/scrcpy}
\subsection{Stylet, PC tablette, etc}
Pour installer les drivers du stylet dans Arch Linux (nécessite un redémarrage) :
\begin{lstlisting}
sudo pacman -S xf86-input-wacom
\end{lstlisting}
Pour activer la reconnaissance automatique de l'orientation et changer celle de l'écran et de la souris en même temps, installer les programmes suivants (disponibles en AUR) :
\begin{lstlisting}
iio-sensor-proxy-git screenrotator-git
\end{lstlisting}
Ressources : \url{https://wiki.archlinux.org/index.php/Tablet_PC#Stylus}
\subsubsection{Activer le clic droit du stylet}
D'abord, trouver l'id du stylet avec :
\begin{lstlisting}
xinput --list
\end{lstlisting}
\begin{lstlisting}
xsetwacom set <id> button 2 3
\end{lstlisting}
\textbf{Nécessite d'être relancé à chaque démarrage.}
\subsection{ASCII art generator}
Convertir une image en texte ASCII : \url{https://github.com/uvipen/ASCII-generator}
\subsection{Comment créer un livre électronique au format ePub avec LibreOffice}
Tuto : \url{https://framablog.org/2013/10/11/creer-epub-libreoffice-logiciel-libre/}
\subsection{Taper le point median sur Linux}
En fonction de votre disposition voici des combinaisons de touches à utiliser :
\begin{lstlisting}

- AltGr + Maj + ;

- AltGr + Maj + 1 

- AltGr + :

- AltGr + .

- Maj + AltGr +
\end{lstlisting}
Plus d'informations : \url{https://rebellyon.info/Comment-taper-facilement-le-point-median-16767}
\subsection{Shell Linux sur Iphone}
\url{https://ish.app/}
\section{Windows}
\noindent
Clé Windows : \verb+sudo cat /sys/firmware/acpi/tables/MSDM+
\section{Réparation}
\subsection{Téléphones}
Il est possible de tenter des récupérations de données sur les cartes mères de téléphones avec beaucoup de motivation : \url{https://www.youtube.com/watch?v=ny82c3wLOFo}
\section{Annexes - Scripts}
\textbf{Attention, ces scripts sont des scripts que j'ai réalisé il y a parfois longtemps et souvent pour une utilisation unique. Il sont donc non-optimisés et potentiellement cassés. Ils ont fonctionné pour moi et fonctionnent probablement encore mais je conseille de les utiliser avec prudence pour éviter toute perte de fichiers.}
\subsection{Trier des fichiers par année}
J'avais un gros dossier en vrac de vieilles photos, que je voulais garder mais en créant des dossiers par année pour les retrouver plus facilement. Il se trouve que l'on ne peut pas trouver dans les métadonnées la date de création mais seulement de dernière modification. J'ai reproduit ici ce script comme exemple de script simple et pour qu'il soit réutilisable.
\begin{lstlisting}
#!/bin/bash
echo "Chemin du dossier a trier :"
read chemin
cd $chemin
ls
#Teste chaque fichier du dossier chemin
for i in *; do
        if [ -d "$i" ]; then
        #-d est l'option pour savoir si un dossier existe, ici on teste si il est utile de l'analyser ou pas
                echo "C'est un dossier"
        else
                annee=`stat -c '%y' "$i" | awk -F - '{print $1}'`
                #Sort l'annee de derniere modification
                #-c utilise le format precise plutot que celui par defaut. '%y' date de la derniere modification d'etat en format lisible.
                #awk -F - precise que le separateur est le tiret et pas un espace
                #'{print $1}' s'arrete d'afficher au premier separateur
                #"$i" entre guillement pour eviter les erreurs avec les espaces dans les noms

                if [ -d $annee ]; then
                        mv "$i" $annee
                else
                        mkdir $annee
                        mv "$i" $annee
                fi
        fi
done
\end{lstlisting}
\subsection{Post-Installation automatique}
Quand on veut réinstaller son ordinateur on sait généralement déjà de quoi on a besoin/envie. Et la force de GNU/Linux est de pouvoir réaliser de nombreuses étapes de post-installation automatiquement.\\
Celui-ci permet surtout d'installer les quelques programmes non-installés par défaut mais utiles comme les paquets pour lire les fichiers d'un téléphone android. Il permet aussi d'installer les librairies qui permettent de lire les DVD.\\
Si les lignes correspondantes sont décommentées, il permet d'installer VirtualBox.\\
Enfin, il peut être utilisé pour copier les fichiers de configuration que vous avez déjà, sous réserve de quelques modifications/ajouts pour les lignes commençants par \texttt{cp -r}.\\
\textbf{Il nécessite bien entendu d'être exécuté en root ou avec sudo}.
\begin{lstlisting}
#!/bin/sh
#echo "Dossier des fichiers de config"
#read dossier
#echo "nom utilisateur/trice"
#read id
echo "Verifier que sudo est bien installe, sinon le script ne pourra pas fonctionner [O/n]"
read answer
if [ $answer = "O" ]; then
        sudo apt update
        #Utiles et dependances
        sudo apt install curl ffmpeg accountsservice git tree rsync apt-transport-https numix-gtk-theme numix-icon-theme
        #Android
        sudo apt install android-tools-adb android-tools-fastboot gvfs-backends jmtpfs libmtp-common
        #Bureautique et multimedia
        sudo apt install gthumb inkscape texmaker handbrake vlc
        #Utilitaires
        sudo apt install keepassx gnome-disk-utility
        #Internet 
        sudo apt install thunderbird transmission pidgin

        #cp -r $dossier/.config /home/$id/
        #cp -r $dossier/.theme home/$id/
        #cp -r $dossier/.mozilla home/$id/

        #Install libdvdcss (necessite apt-transport-https)
        wget -O - https://download.videolan.org/pub/debian/videolan-apt.asc | sudo apt-key add - && echo "deb https://download.videolan.org/pub/debian/stable/ /" | sudo tee /etc/apt/sources.list.d/videolan.list
        echo "deb-src https://download.videolan.org/pub/debian/stable/ /" | sudo tee /etc/apt/sources.list.d/videolan.list

        #Install youtube-dl
        sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
        sudo chmod a+rx /usr/local/bin/youtube-dl

        #Install VirtualBox
        #wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
        #wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
        #echo "deb https://download.virtualbox.org/virtualbox/debian stretch contrib" |sudo tee -a /etc/apt/sources.list.d/virtualbox.list

        sudo apt update
        #sudo apt-get install virtualbox-6.0
        sudo apt install libdvdcss2
        #echo "URL de telechargement VMware : https://my.vmware.com/fr/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/12_0"
        #echo "Pour installer, utiliser la commande sudo bash VMware-xxxx.bundle"       
        #Dependances VMware
        #sudo apt install libx11-6 libx11-dev x-window-system-core x-window-system xorg-docs libxtst6 psmisc build-essential
        echo "Installation finie"
else
        exit
fi
\end{lstlisting}

\subsection{Compression de PDF}
Ce script permet de compresser des PDF sans avoir à passer par un utilitaire tiers.\\
\emph{Note : je n'ai plus aucun souvenirs de comment je l'ai créé, je l'ai juste testé avant de le reproduire ici et il fonctionne.}
\begin{lstlisting}
#!/bin/bash
echo "Nom et chemin du fichier a compresser, sans l'extension .pdf"
read chemin
echo "Nom et chemin du fichier de sortie, sans l'extension .pdf"
read sortie

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$sortie.pdf $chemin.pdf
\end{lstlisting}

\subsection{Écrire soit-même des \texttt{fortunes} en semi-automatique}
Les \texttt{fortunes} sont les fichiers permettant d'afficher des citations aléatoires dans un terminal ou dans certains widgets. Il en existe de nombreuses versions mais on peut aussi les créer nous-même, comme c'est un peu fastidieux, j'avais fait un script pour l'occasion. \textbf{Attention il nécessite d'être exécuté en \texttt{root} car il écrit des fichiers dans des répertoires protégés en écriture}.\\
\begin{lstlisting}
#!/bin/bash
#Ce script a pour but de faciliter la mise a jour des fichiers fortune.
echo -e "\033[1;45;41m Ce script necessite les droits d'administrateur pour fonctionner \033[0m"
echo -e "\033[1;44m Bienvenue dans ce script de mise a jour de fortune \033[0m"
#Creation d'un fichier texte avec la liste des fichiers fortune (1 par ligne)
cd /usr/share/games/fortunes
ls -I "*.dat" -I "*.u8"
echo -e "\033[1;44mTaper le nom du fichier a modifier, ou" "\033[1;42mNouveau\033[0m""\033[1;44m pour un nouveau fichier\033[0m"
#cree la variable fichier en lui assignant la valeur tapee
read num
if [ $num = Nouveau ]; then
	echo -e "\033[1;42mEntrer un nom pour le nouveau fichier\033[0m"
	read fichier
else
	for i in *
	do
		if [ $num = $i ]; then
			fichier=$i
		fi
	done
fi

if [ -z "$fichier" ]; then
	echo "Le fichier n'existe pas"
else
	echo -e "\033[1;45;41mModification avec nano ou avec le script ?\033[0m"
	echo -e "\033[1;45;31mNano : 1\033[0m"
	echo -e "\033[1;45;34mScript : 2\033[0m"
	read choix
	if [ $choix = 1 ]; then
		nano /usr/share/games/fortunes/$fichier
		echo -e "\033[1;45;41mFin de la modification\033[0m"
	elif [ $choix = 2 ]; then
		#initialise la variable rep a 0 pour la boucle while
		rep=o
		while [ $rep = o ] 
			#boucle while : tant que la variable rep reste a "o" on peut continuer a rajouter des lignes.
			#on demande donc a chaque insertion si l'on continue ou pas, si une autre valeur que o est renseignee, le script sort de la boucle while
			do
			echo "Entrer la citation a ajouter et appuyer sur [ENTREE]"
			#assigne la variable ligne a l'insertion au clavier
			read ligne
			#ajoute apres la derniere ligne du fichier la variable  ligne
			echo $ligne >> /usr/share/games/fortunes/$fichier
			#rajoute une nouvelle ligne avec un %
			echo % >> /usr/share/games/fortunes/$fichier
			echo "Continuer ? [o/n]"
			#enregistre la reponse pour continuer dans rep
			read rep
		done
	fi
	#mets a jour les autres fichiers fortune
	strfile /usr/share/games/fortunes/$fichier /usr/share/games/fortunes/$fichier.u8
	strfile /usr/share/games/fortunes/$fichier /usr/share/games/fortunes/$fichier.dat
fi

exit 0;
\end{lstlisting}
\subsection{Convertir une archive Youtube en dossier de favoris}
Ce projet répondait à un besoin spécifique de récupérer mes playlists Youtube avant de supprimer mon compte. Youtube permet de récupérer une archive de toutes ses données, mais les donne sous forme de fichier \texttt{.json} qui est complètement inutilisable tel quel.\\
Mon idée était de récupérer toutes les données et d'en faire un \texttt{.html} exploitable par firefox comme une sauvegarde de favoris et donc en faire un dossier avec par exemple toutes mes vidéos "À voir"ou mes playlists.\\
Ce script utilise des fichiers annexes \texttt{header.txt} et \texttt{prog.sed} pour fonctionner et écrit plusieurs fichiers dans le dossier \texttt{tmp}. Il faut les supprimer à chaque nouvelle utilisation. Pour cela vous pouvez utiliser le script \texttt{rm.sh}.\\
\begin{lstlisting}
#!/bin/bash
#Conversion .json to id and title
echo -e "name of .json :"
read path
#.json file gives the video id under "videoId" : "example",
#.json file gives the video title under "title" : "example"
#For each entry videoId is given twice
#Remove every lines without "videoId" : " and writes the results in a temp file
sed '''/"videoId" : "/!d''' $path &>> /tmp/tmpIds
#Same thing with titles
sed '''/"title" : "/!d''' $path &>> /tmp/Titles
#There is two lines for each Id but one ends with ", so it removes all those lines
sed '''/",/d''' /tmp/tmpIds &>> /tmp/Ids
#We replace "videoId" by the HTML
sed '''s/      "videoId" : "/\<DT\>\<A HREF="https:\/\/www\.youtube\.com\/watch?v=/g''' /tmp/Ids &>> /tmp/Ids2

while read line
do
        echo "${line/%\"/</A>}" &>> /tmp/Titles2
done < /tmp/Titles
sed '''s/"title" : "/>/g''' /tmp/Titles2 &>> /tmp/Titles3

paste -d "" /tmp/Ids2 /tmp/Titles3 &>> links.html

sed -f prog.sed links.html &>> linksdone.html

cat header.txt linksdone.html >autobookmarks.html

echo -e \<\/DL\>\<p\> &>> autobookmarks.html
echo -e \<\/DL\>\<p\> &>> autobookmarks.html
cp autobookmarks $path.html
\end{lstlisting}
\subsubsection{prog.sed}
\begin{lstlisting}
i\ \<DL\>\<p\>
a\ \<\/DL\>\<p\>
\end{lstlisting}
\subsubsection{header.txt}
\begin{lstlisting}
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!-- This is an automatically generated file.
     It will be read and overwritten.
     DO NOT EDIT! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
\end{lstlisting}
\subsubsection{rm.sh}
\begin{lstlisting}
#!/bin/bash
rm /tmp/Titles
rm /tmp/Titles2
rm /tmp/Titles3
rm /tmp/Ids
rm /tmp/Ids2
rm /tmp/tmpIds
rm autobookmarks.html
rm links.html
rm linksdone.html
rm linksdone2.html
rm linkstmp
\end{lstlisting}
\end{document}
