diff --git a/.gitignore b/.gitignore index aee6bf3..5516293 100644 --- a/.gitignore +++ b/.gitignore @@ -288,3 +288,5 @@ TSWLatexianTemp* # Uncomment the next line to have this generated file ignored. #*Notes.bib +chapitres/ +markdown/.vscode/ diff --git a/Images/capture_schtasks_cocktail.png b/Images/capture_schtasks_cocktail.png new file mode 100644 index 0000000..5ce227e Binary files /dev/null and b/Images/capture_schtasks_cocktail.png differ diff --git a/main.tex b/main.tex index ff06eff..f08656c 100755 --- a/main.tex +++ b/main.tex @@ -1,4 +1,4 @@ -\documentclass[14pt]{book} +\documentclass{book} \input{structure.tex} \begin{document} @@ -22,11 +22,11 @@ ~\vfill \thispagestyle{empty} -\noindent Certains droits réservés \copyright\ 2021 Je valide ça, par François Pelletier\\ +\noindent Certains droits réservés \copyright\ 2021 Je valide ça,\\par François Pelletier\\ \noindent \url{https://jevalide.ca}\\ -\noindent Cette œuvre est mise à disposition sous licence Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International. Pour voir une copie de cette licence, visitez http://creativecommons.org/licenses/by-nc-sa/4.0/ ou écrivez à Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.\\ +\noindent Cette œuvre est mise à disposition sous licence Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International. Pour voir une copie de cette licence, visitez \url{https://creativecommons.org/licenses/by-nc-sa/4.0/} ou écrivez à Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.\\ \noindent \textit{Publié le 12 juillet 2021} @@ -45,71 +45,28 @@ \chapterimage{chapter-cover-ebook-guide-preparation-vacances.pdf} -\chapter{Scripter les tâches récurrentes} -\section{Paragraphe 1-1} - -\lipsum[1-5] - -\chapter{Rediriger ses alertes courriel} -\section{Paragraphe 2-1} - -\lipsum[1-5] - -\chapter{Tester ses sauvegardes} -\section{Paragraphe 3-1} - -\lipsum[1-5] - -\chapter{Faire ses mises à jour} -\section{Paragraphe 4-1} - -\lipsum[1-5] +\input{chapitres/chapitre_1_1} +\input{chapitres/chapitre_1_2} +\input{chapitres/chapitre_1_3} +\input{chapitres/chapitre_1_4} %section 2 \part{Un séjour en autohébergement simple} -\chapterimage{chapter-cover-ebook-guide-preparation-vacances.pdf} - -\chapter{Classer ses photos de voyage} -\section{Paragraphe 1-2} - -\lipsum[1-5] -\chapter{Rassembler les recettes exotiques} -\section{Paragraphe 2-2} - -\lipsum[1-5] -\chapter{Tracer un parcours touristique} -\section{Paragraphe 3-2} - -\lipsum[1-5] -\chapter{Faire un journal de visite} -\section{Paragraphe 4-2} - -\lipsum[1-5] +\input{chapitres/chapitre_2_1} +\input{chapitres/chapitre_2_2} +\input{chapitres/chapitre_2_3} +\input{chapitres/chapitre_2_4} %section 3 \part{De l'analyse à la détente} -\chapterimage{chapter-cover-ebook-guide-preparation-vacances.pdf} - -\chapter{Optimiser ses dépenses} -\section{Paragraphe 1-3} - -\lipsum[1-5] -\chapter{Identifier les meilleures sorties} -\section{Paragraphe 2-3} - -\lipsum[1-5] -\chapter{Choisir un restaurant} -\section{Paragraphe 3-3} - -\lipsum[1-5] -\chapter{Éviter les travaux routiers} -\section{Paragraphe 4-3} - -\lipsum[1-5] +\input{chapitres/chapitre_3_1} +\input{chapitres/chapitre_3_2} +\input{chapitres/chapitre_3_3} +\input{chapitres/chapitre_3_4} \phantomsection diff --git a/markdown/chapitre_1_1.md b/markdown/chapitre_1_1.md new file mode 100644 index 0000000..973c22a --- /dev/null +++ b/markdown/chapitre_1_1.md @@ -0,0 +1,180 @@ +# Automatiser les tâches récurrentes + +## Utiliser le langage de ligne de commande Bash + +Mon outil préféré pour scripter des tâches que j'ai à effectuer de façon récurrente est Bash. C'est un langage de script qui est principalement utilisé sur les systèmes d'exploitation GNU/Linux et macOS. + +Il est aussi possible d'installer [MSYS2](https://www.msys2.org/) sur Windows pour obtenir accès à une multitude de logiciels créés initialement pour GNU/Linux, dont Bash. + +Parmi les fonctionnalités les plus fréquemment utilisées du langage de script Bash, on retrouve: + +- Appeler des logiciels +- La manipulation de fichiers +- Les tubes (*pipes* en anglais), +- Les boucles + +Allons plus en détail sur chacune d'entre elles avec des exemples! + +### L'appel de logiciels + +Le langage de script Bash permet d'interagir avec tous les logiciels présents sur votre environnement de travail. Il permet surtout de créer des séquences de tâches exécutées les unes après les autres en suivant des conditions spécifiques. Bref, c'est un moyen de faire travailler notre ordinateur à notre place! + +Un exemple d'appel de logiciels que j'utilise souvent, c'est un court programme qui est écrit dans le langage Ruby qui permet de convertir récursivement en minuscules des noms des répertoires et des fichiers. Il est très utile pour s'assurer que les fichiers musicaux que je souhaite mettre sur mon téléphone Android soient bien reconnus. + +Il peut être appelé depuis Bash comme suit: + +```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"} +mon_code="Dir['*'].each { |p| File.rename(p, p.downcase) }" +ruby -e ${mon_code} +``` + +- Le script Bash écrit la chaîne de caractère qui contient le code Ruby dans la variable `mon_code`. +- Ensuite, il envoie le contenu de `mon_code` à l'interpréteur du langage Ruby + +### La manipulation de fichiers + +Au lieu d'utiliser des fichiers complexes tels que ceux produits par les suites bureautiques tel que Microsoft Office, les environnements en ligne de commande préfèrent les fichiers simples au format texte. Ils excellent dans la manipulation de ceux-ci. + +Souvent, les logiciels conçus pour la ligne de commande ont une interface très simple: ils reçoivent du texte, souvent par l'intermédiaire d'un fichier, et vont retourner du texte, souvent aussi dans un fichier. Dans les autres cas, le texte va voyager d'un programme à l'autre via les tubes. + +Un exemple fréquent de manipulation de fichiers est la concaténation de fichiers pdf. On veut fusionner plusieurs fichiers ensemble en un seul document. Le logiciel pdftk permet de faire cette opération comme suit: + +```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"} +pdftk \ +page_couverture.pdf \ +table_matieres.pdf \ +chapitre_1.pdf \ +chapitre_2.pdf \ +conclusion.pdf \ +cat output mon_ebook.pdf +``` + +- On lance le logiciel `pdftk` +- Ensuite, on énumère dans l'ordre tous les fichiers à concaténer +- On spécifie l'action. Le mot `cat` est souvent utilisé pour la concaténation. +- On spécifie le fichier de sortie après `output`. Ici, c'est `mon_ebook.pdf` + +Petite note: la barre oblique `\` c'est pour couper les lignes pour les rendre plus faciles à lire ! + +### Les tubes + +Les tubes permettent d'utiliser la sortie d'un programme directement dans l'entrée d'un autre programme, sans devoir écrire un fichier. Ils sont représentés par la barre verticale `|`. + +Un exemple fréquent que j'utilise est pour effectuer la recherche de fichiers. + +Le logiciel le plus courant sur GNU/Linux qui permet de listes tous les fichiers d'un répertoire se nomme `find`. Sa tâche est de listes tous les fichiers qui répondent à certaines conditions, par exemple une extension précise comme `.pdf` pour les fichiers PDF. Si je veux filtrer plus précisément cette liste de fichiers avec d'autres attributs, je vais utilise le logiciel grep qui filtre le texte qu'on lui fournis en entrée selon une expression régulière, qui est une syntaxe fréquemment utilisée dans la recherche de texte. + +Par exemple, si je veux trouver tous les livres sur le logiciel Spark qui se trouvent dans ma bibliothèque Nextcloud, la commande Bash correspondante prend la forme suivante: + +```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"} +find "nextcloud/Livres" -type f | \ +grep -i "voyage|travel" +``` + +- Le premier argument de find est le répertoire de recherche, ici c'est `nextcloud/Livres/Technical`. +- Le premier paramètre est `type`, avec comme valeur `f`, pour rechercher uniquement les fichiers. +- Ensuite, il y a un tube vers la commande `grep` +- `grep` a un paramètre, `-i` qui spécifie que ce qui suit n'est pas sensible à la casse (an anglais *case insentitive*) +- Enfin, il y a l'expression de recherche `voyage|travel` qui va retourner tous les noms de fichiers qui contiennent soit le mot `voyage`, soit le mot `travel` + +### Les boucles + +Les boucles sont des mécanismes simples et puissants qui permettent de répéter des tâches identiques ou très similaires pour de multiples entrées. Par exemple, si vous voulez produire un document quasi identique pour chaque jour de la semaine, vous pouvez le faire de cette façon. L'élément de code qui permet de répéter du code un nombre déterminé de fois est nommé `for`. Il existe aussi les boucles `while` et `until` qui sont basées sur une condition. Celles-ci sont utiles lorsque le nombre de répétitions n'est pas connu à l'avance. + +### Un exemple pratique + +Pour créer ce guide, j'utilise le langage [Markdown](https://www.markdownguide.org/) ainsi que le langage [\LaTeX](https://www.latex-project.org/), deux systèmes de conception de documents. Le premier est davantage utilisé pour le contenu texte et le code informatique, alors que le second est davantage pour la mise en page et les graphiques. Comme je dois souvent convertir les fichier Markdown en \LaTeX, puis en PDF pour avoir un aperçu du document, alors j'utilise Bash et les logiciel `pandoc` et `pdflatex`. + +Ce guide comprend 3 sections composées chacunes de 4 chapitres. Pour chaque chapitre, j'ai un fichier Markdown distinct. Je veux convertir chacun d'eux vers le format \LaTeX. Je vais donc faire une boucle pour chacune des sections, puis à l'intérieur de celle-ci, faire un boucle pour chacun des chapitres. Mon code sera donc exécuté 12 fois. + +Ensuite, j'utilise le logiciel `pdflatex` pour créer le document PDF que vous êtes actuellement en train de feuilleter. + +```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"} +#!/bin/bash + +for section in {1..3} +do + for chapitre in {1..4} + do + pandoc \ + -f markdown \ + -t latex \ + --listings \ + --top-level-division=chapter \ + -i chapitre_${section}_${chapitre}.md \ + -o ../chapitres/chapitre_${section}_${chapitre}.tex + done +done + +cd ../ # je change de repertoire, les fichiers pour LaTeX sont un niveau plus haut dans mon dossier de travail ! +pdflatex -synctex=1 -interaction=nonstopmode main.tex +cd markdown # je reviens au repertoire d'origine +``` + +Note: [Pandoc](https://pandoc.org/) est un logiciel vraiment utile pour les créateurs de contenu, il permet de tout faire en Markdown (qui est facile à maîtriser), puis de publier sous une multitude de formats. Je vous conseille fortement d'y jeter un oeil. + +## Programmer l'exécution de scripts + +Nous avons maintenant créé le script parfait qui exécute les tâches ennuyantes que nous faisions auparavant manuellement. Maintenant, puisque nous planifions partir en vacances, il faut dire à notre système quand exécuter le script et à quelle fréquence. C'est ce que `cron` permet de faire sur GNU/Linux et macOS. Sur Windows, c'est le planificateur de tâches `schtasks.exe`. + +Notez qu'il existe aussi des applications graphiques pour chacun de ces systèmes. Mais, vous êtes ici pour voir un peu de code non ? + +### cron sur Linux et macOS + +Le logiciel cron est inclus par défaut sur la majorité des systèmes macOS et GNU/Linux. Il n'y a donc rien à faire pour l'obtenir. Cependant, il est possible qu'il nécessite des accès additionnels pour bien fonctionner sur macOS. + +Les instructions pour cron sont inscrites dans un fichier spécial au format `crontab` dans le répertoire `/etc/cron.d`. Il est aussi possible de mettre le script à exécuter dans un des 4 répertoires suivants + +```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"} +/etc/cron.daily +/etc/cron.hourly +/etc/cron.monthly +/etc/cron.weekly +``` + +Le format des instructions dans un fichier `crontab` est défini comme dans cette illustration: + +```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"} +* * * * * * script_a_executer.sh +| | | | | | +| | | | | +--- nom utilisateur +| | | | +----- jour de la semaine (0-6) (Dimanche=0) +| | | +------- mois (1-12) +| | +--------- jour du mois (1-31) +| +----------- heure (0-23) ++------------- minutes (0-59) +``` + +Le comportement par défaut est d'exécuter le script à chaque minute. Ensuite, si on veut réduire la fréquence, on spécifie à quel moment exécuter le script. + +Par exemple, pour exécuter un script `cocktail_aleatoire.sh` qui nous envoie une recette de cocktail au hasard à 16h30 chaque vendredi, on configure comme suit. + +```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"} +30 16 * * 5 jevalideca /home/jevalideca/cocktail_aleatoire.sh +``` + +### Planificateur de tâches sur Windows + +Sur Windows, l'ensemble des tâches peuvent être planifiées depuis le Planificateur de tâches. En exécutant une commande batch, il est possible de configurer une tâche similaire à la précédente. + +À partir d'un invite de commandes Windows, la ligne suivante configurera l'exécution du programme `cocktail_aleatoire.bat` à 16:30 chaque vendredi. + +```{.batch linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"} +schtasks.exe /create /tn cocktail-aleatoire /sc weekly /D FRI /st 16:30 /tr "C:\Users\jevalideca\scripts\cocktail_aleatoire.bat" +``` + +Une fois la commande exécutée, nous obtenons cette réponse: + +```{.batch linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"} +Opération réussie : la tâche planifiée "cocktail-aleatoire" a été créée. +``` + +Nous pouvons valider le résultat dans la fenêtre du Planificateur de tâches + +![Capture d'écran du planificateur de tâches](capture_schtasks_cocktail.png) + +## Conclusion + +J'ai présenté deux techniques qui permettent de scripter et de configurer l'exécution automatique de tâches. + +Il est maintenant possible de faire travailler ton ordinateur durant tes vacances ! diff --git a/markdown/chapitre_1_2.md b/markdown/chapitre_1_2.md new file mode 100644 index 0000000..bbafe47 --- /dev/null +++ b/markdown/chapitre_1_2.md @@ -0,0 +1 @@ +# Rediriger ses alertes courriel diff --git a/markdown/chapitre_1_3.md b/markdown/chapitre_1_3.md new file mode 100644 index 0000000..e63df8a --- /dev/null +++ b/markdown/chapitre_1_3.md @@ -0,0 +1 @@ +# Tester ses sauvegardes diff --git a/markdown/chapitre_1_4.md b/markdown/chapitre_1_4.md new file mode 100644 index 0000000..a0a792b --- /dev/null +++ b/markdown/chapitre_1_4.md @@ -0,0 +1 @@ +# Faire ses mises à jour diff --git a/markdown/chapitre_2_1.md b/markdown/chapitre_2_1.md new file mode 100644 index 0000000..5de6f5d --- /dev/null +++ b/markdown/chapitre_2_1.md @@ -0,0 +1 @@ +# Classer ses photos de voyage diff --git a/markdown/chapitre_2_2.md b/markdown/chapitre_2_2.md new file mode 100644 index 0000000..e5e179c --- /dev/null +++ b/markdown/chapitre_2_2.md @@ -0,0 +1 @@ +# Cuisiner des recettes exotiques diff --git a/markdown/chapitre_2_3.md b/markdown/chapitre_2_3.md new file mode 100644 index 0000000..81c231a --- /dev/null +++ b/markdown/chapitre_2_3.md @@ -0,0 +1 @@ +# Définir un parcours touristique diff --git a/markdown/chapitre_2_4.md b/markdown/chapitre_2_4.md new file mode 100644 index 0000000..4aaaadc --- /dev/null +++ b/markdown/chapitre_2_4.md @@ -0,0 +1 @@ +# Rédiger son journal de voyage diff --git a/markdown/chapitre_3_1.md b/markdown/chapitre_3_1.md new file mode 100644 index 0000000..dfec4f0 --- /dev/null +++ b/markdown/chapitre_3_1.md @@ -0,0 +1 @@ +# Optimiser ses dépenses \ No newline at end of file diff --git a/markdown/chapitre_3_2.md b/markdown/chapitre_3_2.md new file mode 100644 index 0000000..8486a50 --- /dev/null +++ b/markdown/chapitre_3_2.md @@ -0,0 +1 @@ +# Identifier les meilleures sorties diff --git a/markdown/chapitre_3_3.md b/markdown/chapitre_3_3.md new file mode 100644 index 0000000..7bd5063 --- /dev/null +++ b/markdown/chapitre_3_3.md @@ -0,0 +1 @@ +# Choisir un bon resto diff --git a/markdown/chapitre_3_4.md b/markdown/chapitre_3_4.md new file mode 100644 index 0000000..3b3ba11 --- /dev/null +++ b/markdown/chapitre_3_4.md @@ -0,0 +1 @@ +# Éviter les travaux routiers diff --git a/markdown/creer-chapitres-markdown.sh b/markdown/creer-chapitres-markdown.sh new file mode 100644 index 0000000..7f64ff3 --- /dev/null +++ b/markdown/creer-chapitres-markdown.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +for section in {1..3} +do + for chapitre in {1..4} + do + touch chapitre_${section}_${chapitre}.md + done +done \ No newline at end of file diff --git a/markdown/creer-fichiers-tex.sh b/markdown/creer-fichiers-tex.sh new file mode 100644 index 0000000..9d5fae3 --- /dev/null +++ b/markdown/creer-fichiers-tex.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +for section in {1..3} +do + for chapitre in {1..4} + do + pandoc -F pandoc-minted -f markdown+fenced_code_attributes -t latex --listings --top-level-division=chapter -i chapitre_${section}_${chapitre}.md -o ../chapitres/chapitre_${section}_${chapitre}.tex + done +done + +cd ../ +pdflatex --shell-escape -synctex=1 -interaction=nonstopmode main.tex +cd markdown + diff --git a/structure.tex b/structure.tex index 5c0c19f..26f78ab 100755 --- a/structure.tex +++ b/structure.tex @@ -1,4 +1,9 @@ \usepackage[utf8]{inputenc} + +\usepackage[defaultmono]{droidsansmono} +\usepackage[defaultsans]{droidsans} +\usepackage[default]{droidserif} + \usepackage[T1]{fontenc} \usepackage[french]{babel} % Césure en français @@ -11,6 +16,7 @@ \usepackage{enumitem} \usepackage{booktabs} \usepackage{xcolor} +\usepackage[chapter]{minted} \definecolor{turquoisefonce}{RGB}{3, 152, 158} \definecolor{vertdeau}{RGB}{0, 194, 203} @@ -25,11 +31,11 @@ \geometry{ paper=a5paper, top=10mm, - bottom=5mm, - left=5mm, - right=5mm, + bottom=10mm, + left=15mm, + right=15mm, headheight=8pt, - footskip=5mm, + footskip=10mm, headsep=8pt, } @@ -102,9 +108,9 @@ {} {} \titlecontents{lsubsection} - [.5em] % Left indentation + [1em] % Left indentation {\sffamily\footnotesize} % Spacing and font options for subsections - {\contentslabel[\thecontentslabel]{0.5cm}} + {\contentslabel[\thecontentslabel]{1cm}} {} {} @@ -130,6 +136,7 @@ \renewcommand{\sectionmark}[1]{\markright{\sffamily\normalsize\thesection\hspace{5pt}#1}{}} \fancyhf{} +\setlength{\headheight}{15pt} \fancyhead[LE,RO]{\sffamily\normalsize\thepage} \fancyhead[LO]{\rightmark} \fancyhead[RE]{\leftmark} @@ -180,7 +187,7 @@ \newlength\esp \setlength\esp{4pt} \newlength\ecart -\setlength\ecart{1.2cm-\esp} +\setlength\ecart{1cm-\esp} \newcommand{\thepartimage}{}% \newcommand{\partimage}[1]{\renewcommand{\thepartimage}{#1}}% \def\@part[#1]#2{% @@ -242,8 +249,8 @@ \node at (current page.north west) {\begin{tikzpicture}[remember picture,overlay] \node[anchor=north west,inner sep=0pt] at (0,0) {\ifusechapterimage\includegraphics[width=\paperwidth]{\thechapterimage}\fi}; -\draw[anchor=west] (\Gm@lmargin,-2.25cm) node [line width=2pt,rounded corners=10pt,draw=turquoisefonce,fill=white,fill opacity=0.6,inner sep=15pt]{\strut\makebox[15cm]{}}; -\draw[anchor=west] (\Gm@lmargin+.5cm,-2.35cm) node {\huge\sffamily\bfseries\color{black}\thechapter\autodot~#1\strut}; +\draw[anchor=west] (\Gm@lmargin-1cm,-1.75cm) node [line width=2pt,rounded corners=10pt,draw=turquoisefonce,fill=white,fill opacity=0.6,inner sep=15pt]{\strut\makebox[15cm]{}}; +\draw[anchor=west] (\Gm@lmargin-.5cm,-1.85cm) node {\Large\sffamily\bfseries\color{black}\thechapter\autodot~#1\strut}; \end{tikzpicture}}; \end{tikzpicture} \else @@ -293,3 +300,8 @@ addtohook={% \fi } } + +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + +\newcommand{\passthrough}[1]{\lstset{mathescape=false}#1\lstset{mathescape=true}}