version avec contenu complété mais non corrigé
This commit is contained in:
parent
8fe69cfebf
commit
a3f7e35b26
22 changed files with 341 additions and 176 deletions
Binary file not shown.
BIN
Images/carte_restomontreal.png
Normal file
BIN
Images/carte_restomontreal.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
Binary file not shown.
BIN
Images/cout_moyen_transport.png
Normal file
BIN
Images/cout_moyen_transport.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
BIN
Images/firefox_developper_copier_interieur_html.png
Normal file
BIN
Images/firefox_developper_copier_interieur_html.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 110 KiB |
BIN
Images/travaux_routiers_leaflet.png
Normal file
BIN
Images/travaux_routiers_leaflet.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 302 KiB |
|
@ -2,7 +2,7 @@
|
|||
|
||||
## 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.
|
||||
Mon outil préféré pour scripter des tâches que j'ai à effectuer de façon récurrente est [Bash](https://fr.wikipedia.org/wiki/Bourne-Again_shell). 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.
|
||||
|
||||
|
@ -21,40 +21,13 @@ Le langage de script Bash permet d'interagir avec tous les logiciels présents s
|
|||
|
||||
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 !
|
||||
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.
|
||||
|
||||
### Les tubes
|
||||
|
||||
|
@ -62,20 +35,9 @@ Les tubes permettent d'utiliser la sortie d'un programme directement dans l'entr
|
|||
|
||||
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.
|
||||
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.
|
||||
|
||||
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`
|
||||
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.
|
||||
|
||||
### Les boucles
|
||||
|
||||
|
@ -90,25 +52,17 @@ Ce guide comprend 3 sections composées chacunes de 4 chapitres. Pour chaque cha
|
|||
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
|
||||
mkdir -p ./chapitres
|
||||
|
||||
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
|
||||
pandoc -F pandoc-minted -f markdown+fenced_code_attributes+tex_math_dollars -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
|
||||
pdflatex --shell-escape -synctex=1 -interaction=nonstopmode main.tex
|
||||
```
|
||||
|
||||
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.
|
||||
|
|
|
@ -4,18 +4,11 @@ Nous avons maintenant créé le script parfait qui exécute les tâches ennuyant
|
|||
|
||||
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
|
||||
## 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
|
||||
```
|
||||
Les instructions pour cron sont inscrites dans un fichier spécial au format `crontab` dans le répertoire `/etc/cron.d`.
|
||||
|
||||
Le format des instructions dans un fichier `crontab` est défini comme dans cette illustration:
|
||||
|
||||
|
@ -30,15 +23,13 @@ Le format des instructions dans un fichier `crontab` est défini comme dans cett
|
|||
+------------- 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
|
||||
## 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 PowerShell, il est possible de configurer une tâche similaire à la précédente.
|
||||
|
||||
|
@ -50,14 +41,6 @@ $trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Friday -At 4:30pm
|
|||
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "cocktail-aleatoire"
|
||||
```
|
||||
|
||||
Une fois la commande exécutée, nous obtenons cette réponse:
|
||||
|
||||
```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
TaskPath TaskName State
|
||||
-------- -------- -----
|
||||
\ cocktail-aleatoire Ready
|
||||
```
|
||||
|
||||
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)
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
# Faire ses sauvegardes (et les tester)
|
||||
# Sauvegarder ses données
|
||||
|
||||
## Poste de travail: rsync
|
||||
## Sauvegarder son poste de travail: rsync
|
||||
|
||||
### Disponibilité du logiciel
|
||||
Pour sauvegarder l'ensemble du contenu important de mon poste de travail, j'utilise un disque dur externe. C'est une méthode abordable qui respecte un des principes d'une bonne sauvegarde: être hors-ligne.
|
||||
|
||||
Pour sauvegarder l'ensemble du contenu important de mon poste de travail, j'utilise un disque dur externe. C'est une méthode abordable qui respecte un des principes d'une bonne sauvegarde: être hors-ligne. Pour transférer mes fichiers vers ce disque, j'utilise un logiciel en ligne de commande qui fait exactement ça, des copies. C'est rsync (pour Remote Sync). Il est disponible sur macOS et sur GNU/Linux sans installation additionnelle.
|
||||
Pour transférer mes fichiers vers ce disque, j'utilise un logiciel en ligne de commande qui fait exactement ça, des copies. C'est `rsync` (pour Remote Sync). Il est disponible sur macOS et sur GNU/Linux sans installation additionnelle.
|
||||
|
||||
### Installation sur Windows
|
||||
|
||||
|
@ -38,27 +38,7 @@ Voici le détail des options:
|
|||
|
||||
rsync est un outil puissant et rapide qui ne pardonne pas les erreurs. Un conseil d'ami: toujours tester ses commandes rsync avec une exécution d'essai via l'option --dry-run, que l'on ajoute à la commande.
|
||||
|
||||
```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
rsync -av \
|
||||
--dry-run \
|
||||
--progress \
|
||||
--delete \
|
||||
/source/mondossier \
|
||||
/destination/mondossier
|
||||
```
|
||||
|
||||
### Fin de l'exécution
|
||||
|
||||
Lorsque la commande est terminée, ça va produire un sommaire comme suit:
|
||||
|
||||
```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
sent 391,414,597 bytes received 16,270 bytes 46,050,690.24 bytes/sec
|
||||
total size is 391,253,238 speedup is 1.00
|
||||
```
|
||||
|
||||
Afin de valider que la sauvegarde est bien réussie, il suffit d'exécuter à nouveau la commande. Si aucun fichier n'est synchronisé, alors c'est le cas !
|
||||
|
||||
## Projets en cours et contenu: Nextcloud
|
||||
## Sauvegarder son contenu: Nextcloud
|
||||
|
||||
Pour garder des copies de sauvegarde de tous mes projets en cours et de mes contenus pour le web, j'utilise Nextcloud, qui est installé sur mon serveur en autohébergement.
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Sur GNU/Linux, il n'y a pas de mécanisme uniforme pour effectuer les mises à j
|
|||
|
||||
### Debian
|
||||
|
||||
Sur Debian, les mises à jour sont effectuées en deux étapes:
|
||||
Sur Debian, les mises à jour sont effectuées en deux étapes:
|
||||
|
||||
- mettre à jour l'index des paquetages
|
||||
- installer les nouvelles versions disponibles des paquetages
|
||||
|
@ -21,15 +21,14 @@ Il est possible de combiner ces deux actions avec cette commande:
|
|||
sudo apt update && sudo apt upgrade
|
||||
```
|
||||
|
||||
Si on veut aller plus loin dans l'automatisation, il est possible de programmer les mises à jour de sécurité avec UnattendedUpgrades pour qu'elles s'effectuent en arrière-plan selon un calendrier précis sans avoir à s'en occuper.
|
||||
Si on veut aller plus loin dans l'automatisation, il est possible de programmer les mises à jour de sécurité avec `UnattendedUpgrades` pour qu'elles s'effectuent en arrière-plan selon un calendrier précis sans avoir à s'en occuper.
|
||||
|
||||
### Arch
|
||||
|
||||
Sur Arch, il y a deux systèmes de gestion de paquetages:
|
||||
- `pacman`, pour ce qui est officiellement supporté
|
||||
- AUR, pour ce qui est développé par la communauté
|
||||
|
||||
Il y a plusieurs clients disponibles pour AUR, mais ce que je préfère utiliser, c'est `yay`, qui a exactement la même syntaxe que `pacman`. Vous avez déjà vu ce dernier précédemment, car c'est aussi `pacman` qui est utilisé dans MSYS2 sur Windows.
|
||||
- `pacman`, pour ce qui est officiellement supporté. Vous avez déjà vu ce dernier précédemment, car c'est aussi `pacman` qui est utilisé dans MSYS2 sur Windows.
|
||||
- AUR, pour ce qui est développé par la communauté, avec le client `yay`, qui a exactement la même syntaxe que `pacman`.
|
||||
|
||||
Pour faire une mise à jour avec un de ces deux utilitaires, les commandes sont les suivantes:
|
||||
|
||||
|
@ -46,13 +45,7 @@ Il est possible d'activer les mises à jour automatiques dans les préférences
|
|||
|
||||
Sur Windows, il faut installer une petite extension à PowerShell pour avoir accès aux fonctionnalités de mises à jour. Cette extension se nomme `PSWindowsUpdate`.
|
||||
|
||||
Voici le code pour installer cette extension
|
||||
|
||||
```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
Install-Module PSWindowsUpdate
|
||||
```
|
||||
|
||||
Une fois installée, vous pouvez obtenir la liste des mises à jour à installer comme suit:
|
||||
vous pouvez obtenir la liste des mises à jour à installer comme suit:
|
||||
|
||||
```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
Get-WindowsUpdate
|
||||
|
@ -64,20 +57,10 @@ Et pour les installer, c'est comme suit (les commandes ont le mérite d'avoir de
|
|||
Install-WindowsUpdate
|
||||
```
|
||||
|
||||
Si vous voulez automatiser le tout (sur Windows c'est beuacoup moins risqué comme les mises à jour ne sont que pour le système d'exploitation), alors il suffit de dire à l'ordinateur de tout accepter et qu'il peut redémarrer au besoin (important de faire les mises à jour la nuit alors !)
|
||||
Si vous voulez automatiser le tout (sur Windows c'est beaucoup moins risqué, comme les mises à jour ne sont que pour le système d'exploitation), alors il suffit de tout accepter et de redémarrer au besoin. C'est important de **faire les mises à jour la nuit** dans ce cas!
|
||||
|
||||
```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
Get-WindowsUpdate -AcceptAll -Install -AutoReboot
|
||||
```
|
||||
|
||||
Plus qu'à utiliser ce que tu as vu au chapitre 1 et mettre cette tâche dans le planificateur de tâches. Nous allons configurer les mises à jour pour qu'elles s'installent chaque jour à 2h du matin.
|
||||
|
||||
```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
$action = New-ScheduledTaskAction -Execute 'Get-WindowsUpdate -AcceptAll -Install -AutoReboot'
|
||||
$trigger = New-ScheduledTaskTrigger -Daily -At 2am
|
||||
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "mise-a-jour-nocturne"
|
||||
```
|
||||
|
||||
## Conclusion
|
||||
|
||||
~~ TODO ~~
|
||||
Plus qu'à utiliser ce que nous avons vu au chapitre 1 et mettre cette tâche dans le planificateur de tâches !
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# Planifier ses journées et faire un journal
|
||||
|
||||
Pour planifier ses journées, il est pratique d'utiliser un calendrier dans Nextcloud Agenda. Chaque visite peut se voir attribuer une journée, une heure, une section de notes et des pièces jointes, comme les tickets pour l'entrée d'une attraction. Tout ce contenu sera synchronisé avec l'application de calendrier de votre téléphone intelligent, qui vous enverra des rappels pour ne rien manquer !
|
||||
Pour planifier ses journées, il est pratique d'utiliser un calendrier dans Nextcloud Agenda. Chaque visite peut se voir attribuer une journée, une heure, une section de notes et des pièces jointes, comme les tickets pour l'entrée d'une attraction. Tout ce contenu sera synchronisé en utilisant DAVx5 avec l'application de calendrier de votre téléphone intelligent, qui vous enverra des rappels pour ne rien manquer !
|
||||
|
||||
![Capture d'écran d'un calendrier de Nextcloud Agenda (Horaire du Festival web de Création de Contenu)](Images/nextcloud_agenda_mode_liste.png)
|
||||
|
||||
|
|
|
@ -1 +1,63 @@
|
|||
# Optimiser ses dépenses
|
||||
# Optimiser ses dépenses
|
||||
|
||||
Il existe plusieurs moyens d'optimiser ses dépenses en vacances ou en voyage.
|
||||
|
||||
Premièrement, on voudra économiser sur les déplacements. Est-ce qu'on voyage en voiture ou en transports publics ? Dans le premier cas, il faut considérer le coût de l'essence, du stationnement, et si vous allez dans une grande ville comme Montréal, prévoir un budget pour une contravention de stationnement (ils sont impitoyables).
|
||||
|
||||
Si vous utilisez le transport public, il faut examiner s'il y a des offres sur les billets, si nous sommes prêts à faire des transferts, et les horaires.
|
||||
|
||||
Ensuite, il faut penser à l'hébergement: Hôtel, AirBnB ou chez des amis ? Il faut considérer le coût, les services offerts ainsi que la proximité avec les attrations que l'on souhaite visiter.
|
||||
|
||||
Bref, tout ça peut rapidement devenir un casse-tête.
|
||||
|
||||
C'est à ce moment là que l'analyse de données peut nous rendre service.
|
||||
|
||||
## Exemple: Choisir le moyen de transport le moins cher
|
||||
|
||||
Je souhaite savoir, selon le kilométrage à parcourir, s'il est mieux de me déplacer à pied, en transport en commun ou en voiture.
|
||||
|
||||
Prenons la mise en situation suivante pour faire notre analyse:
|
||||
|
||||
- À vélo, le coût est nul
|
||||
- En transport en commun, le coût est fixe à 3$
|
||||
- En voiture, le coût de la voiture est 10\$ /heure et le stationnement est 8\$
|
||||
|
||||
Le temps est calculé comme suit:
|
||||
|
||||
- En voiture, on va à 50km/h
|
||||
- En transport, on va à 20 km/h et on doit attendre 6 minutes
|
||||
- À vélo, on va à 10 km/h
|
||||
|
||||
De plus, nous sommes prêts à dépenser 10$ pour sauver 1h de déplacement. C'est notre coût d'option.
|
||||
|
||||
### Faisons un peu de mathématiques
|
||||
|
||||
Le coût total par kilomètre se calcule comme suit, où $K$ est le nombre de kilomètres:
|
||||
|
||||
$$
|
||||
P(K) = K*C_0 + (4+0.5*K)*C_1 + (8+0,4*K)*C_2
|
||||
$$
|
||||
|
||||
Nous cherchons les bonnes valeurs des paramètres $C_0,C_1,C_2$, qui représentent chacun le choix d'un des trois modes de transport
|
||||
|
||||
$$
|
||||
C_0,C_1,C_2 \in \lbrace 0,1 \rbrace \\
|
||||
C_0+C_1+C_2=1 \\
|
||||
$$
|
||||
|
||||
On minimise donc la fonction suivante:
|
||||
|
||||
$$
|
||||
argmin_{(C_0,C_1,C_2)} (P(K))
|
||||
$$
|
||||
|
||||
### À la recherche de solutions
|
||||
|
||||
À l'aide de la librairie `lpSolve` en R, on peut définir un problème d'optimisation de coût en quelques lignes et ensuite générer des scénarios.
|
||||
|
||||
En définissant le problème à optimiser sous la forme d'une équiation linéaire à minimiser et en calculant la solution pour toutes les distances de 1 à 50 kilomètres, nous apprendrons que:
|
||||
|
||||
- Avec moins de 8 kilomètres, il est préférable de prendre le vélo que tout autre mode de transport.
|
||||
- À partir de 40 kilomètres, il est recommandé de prendre la voiture au lieu du transport en commun.
|
||||
|
||||
![Graphique du coût par kilomètre](Images/cout_moyen_transport.png)
|
||||
|
|
|
@ -1 +1,48 @@
|
|||
# Identifier les meilleures sorties
|
||||
# Localiser les nouveaux restaurants à Montréal
|
||||
|
||||
Le site web [RestoMontreal](https://www.restomontreal.ca/) permet de rechercher parmi les nouveaux restaurants qui sont ouverts dans cette ville. Les données apparaîssent sur la forme d'une liste ainsi que d'une carte. Cependant, la carte d'est pas exploitable, car elle est incluse dans la page. Afin d'utiliser ces données pour créer notre propre carte, nous allons extraire l'information de celle-ci qui est dissimulée dans le code JavaScript de la page.
|
||||
|
||||
![Carte de RestoMontreal](Images/carte_restomontreal.png)
|
||||
|
||||
Pour ce faire, nous téléchargeons le code de la page web contenant la carte sur notre ordinateur depuis les outils de développement de notre navigateur (touche F12).
|
||||
|
||||
![Sélectionner le script depuis les outils de développement](Images/firefox_developper_copier_interieur_html.png)
|
||||
|
||||
Nous sauvegardons le contenu dans un fichier à l'aide d'un éditeur de texte (Bloc-notes). Puis, à l'aide de l'éditeur en ligne de commande `sed`, nous ajoutons des sauts de ligne dans le code afin de faciliter l'extraction des variables d'intérêt.
|
||||
|
||||
La variable `contentString` contient les informations sur le restaurant et la variable `popupOptions` contient les coordonnées géographiques du restaurant.
|
||||
|
||||
```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
sed 's/var/\n&/g' javascript-nouveaux-restos-montreal.js | \
|
||||
grep "contentString=" > \
|
||||
javascript-nouveaux-restos-montreal-contentstring.js
|
||||
|
||||
sed 's/var/\n&/g' javascript-nouveaux-restos-montreal.js | \
|
||||
grep "popupOptions=" > \
|
||||
javascript-nouveaux-restos-montreal-popupoptions.js
|
||||
```
|
||||
|
||||
Astuce: Il n'est pas toujours facile d'extraire les coordonnées géographiques d'une page qui contient une carte, mais ces données sont d'une très grande utilité, alors ça vaut souvent la peine de s'y attarder. Les coordonnées prennent généralement la forme d'une paire latitude-longitude.
|
||||
|
||||
Ici, dans le contenu de la variable `popupOptions`, nous pouvons observer ceci:
|
||||
|
||||
```{.js linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
L.marker([45.541091,-73.638153],{icon:restoIcon,alt:'La Quinta',bouncingExclusif:true})
|
||||
```
|
||||
|
||||
Ce sont les informations que nous recherchons: le nom du restaurant et sa localisation. À l'aide des librairies stringr et sf, il est maintenant possible d'extraire celles-ci dans une table au format géospatial. Nous affichons ici les 5 premières lignes
|
||||
|
||||
```{.r linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
Simple feature collection with 5 features and 1 field
|
||||
Attribute-geometry relationship: 1 constant, 0 aggregate, 0 identity
|
||||
Geometry type: POINT
|
||||
Dimension: XY
|
||||
Bounding box: xmin: -74.0026 ymin: 45.40418 xmax: -73.54002 ymax: 45.77691
|
||||
Geodetic CRS: WGS 84
|
||||
nom_restaurant geometry
|
||||
1 La Quinta POINT (-73.63815 45.54109)
|
||||
2 SHAKER Cuisine & Mixologie POINT (-74.0026 45.77691)
|
||||
3 Canard Café POINT (-73.54002 45.55249)
|
||||
4 Chiki Churros POINT (-73.62334 45.46642)
|
||||
5 Casamigos POINT (-73.95365 45.40418)
|
||||
```
|
||||
|
|
|
@ -1 +1,15 @@
|
|||
# Choisir un bon resto
|
||||
# Identifier un bon endroit de baignade sur le fleuve
|
||||
|
||||
Le gouvernement du Québec rend disponible des données sur la qualité des sites de baignade le long du fleuve Saint-Laurent.
|
||||
|
||||
Ces données sont situées sur le portail de [Données Québec](https://www.donneesquebec.ca/recherche/dataset/suivi-bacteriologique-fleuve-sites-potentiels-baignade/resource/0623e4c7-114c-4fa2-8125-a18b0a4e2e88)
|
||||
|
||||
Comme vous pourrez constater, le lien pour récupérer les données utilise le protocole FTP, qui est plutôt désuet et n'est plus supporté nativement par la plupart des navigateurs. L'outil `wget` permet de récupérer de fichier facilement.
|
||||
|
||||
Elles sont récupérables dans un format compressé, ce qui requiert de les décompresser avant de les utiliser. Comme elles sont déjà au format GeoJSON, elles sont directement utilisables dans les différents logiciels d'analyse géospatiale.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1 +1,11 @@
|
|||
# Éviter les travaux routiers
|
||||
|
||||
De plus en plus, les autorités gouvernementales en transport rendent disponibles des données ouvertes sur les travaux routiers et les entraves à la circulation sur leur site web.
|
||||
|
||||
Nous pouvons utiliser ces données, souvent disponibles au format GeoJSON, pour concevoir une carte personnalisée pour notre parcours de voyage et pouvoir les éviter le plus possible sur notre parcours. Le téléchargement peut aisément se faire sur une base quotidienne avec `bash`, tel que nous l'avons vu précédemment.
|
||||
|
||||
Pour manipuler ces données, le langage de programmation R et sa puissante librairie géospatiale `sf` contiennent tout ce qu'il faut pour effectuer le traitement des données.
|
||||
|
||||
Ensuite, pour produire une carte, la librairie `leaflet` contient tout ce qu'il faut pour produire une carte interactive qui fonctionnera même hors-ligne !
|
||||
|
||||
![Une carte Leaflet personnalisée avec les travaux routiers du Québec créée avec R](Images/travaux_routiers_leaflet.png)
|
||||
|
|
11
conclusion.md
Normal file
11
conclusion.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Conclusion
|
||||
|
||||
J'espère de tout coeur que tu as apprécié ce guide de préparation de vacances. Je souhaite que ces différentes utilisations de la technologie pour augmenter son autonomie en informatique te rejoignent.
|
||||
|
||||
Tu souhaites obtenir davantage de contenu similaire ? N'hésite surtout pas à t'abonner à la liste de courriel de Je valide ça.
|
||||
|
||||
[C'est ici pour s'abonner !](https://jevalide.ca/abonnement)
|
||||
|
||||
Merci et à la prochaine !
|
||||
|
||||
François
|
|
@ -6,4 +6,7 @@ do
|
|||
do
|
||||
touch chapitre_${section}_${chapitre}.md
|
||||
done
|
||||
done
|
||||
done
|
||||
|
||||
touch introduction.md
|
||||
touch conclusion.md
|
|
@ -6,9 +6,14 @@ 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"
|
||||
pandoc -F pandoc-minted -f markdown+fenced_code_attributes+tex_math_dollars -t latex --listings --top-level-division=chapter -i "chapitre_${section}_${chapitre}.md" -o "./chapitres/chapitre_${section}_${chapitre}.tex"
|
||||
done
|
||||
done
|
||||
|
||||
pandoc -F pandoc-minted -f markdown+fenced_code_attributes+tex_math_dollars -t latex --listings --top-level-division=chapter -i "introduction.md" -o "./chapitres/introduction.tex"
|
||||
pandoc -F pandoc-minted -f markdown+fenced_code_attributes+tex_math_dollars -t latex --listings --top-level-division=chapter -i "conclusion.md" -o "./chapitres/conclusion.tex"
|
||||
|
||||
bibtex main.aux
|
||||
makeindex main.idx
|
||||
pdflatex --shell-escape -synctex=1 -interaction=nonstopmode main.tex
|
||||
|
||||
|
|
7
introduction.md
Normal file
7
introduction.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Introduction
|
||||
|
||||
L'objectif de ce guide de préparation de vacances est de données des exemples concrets, validés dans la vraie vie, d'utilisation des technologie de script, d'auto-hébergement et d'analyse de données. Mon objectif est d'attiser votre curiosité et vous inviter à vouloir en découvrir davantage. Tu retrouveras, tout au long du texte, de nombreux liens de référence vers les technologies que j'utilise.
|
||||
|
||||
Bonne lecture !
|
||||
|
||||
François
|
69
main.tex
69
main.tex
|
@ -16,29 +16,13 @@
|
|||
\vfill
|
||||
\endgroup
|
||||
|
||||
%colophon
|
||||
|
||||
\newpage
|
||||
~\vfill
|
||||
\thispagestyle{empty}
|
||||
|
||||
\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 \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}
|
||||
|
||||
%table des matières
|
||||
|
||||
\usechapterimagefalse
|
||||
\pagestyle{empty}
|
||||
\tableofcontents
|
||||
\cleardoublepage
|
||||
\pagestyle{fancy}
|
||||
\usechapterimagetrue
|
||||
|
||||
\frontmatter
|
||||
\input{chapitres/introduction}
|
||||
|
||||
\mainmatter
|
||||
%section 1
|
||||
|
||||
\part{Bash: Le script pour passer au pilote automatique}
|
||||
|
@ -68,26 +52,49 @@
|
|||
\input{chapitres/chapitre_3_3}
|
||||
\input{chapitres/chapitre_3_4}
|
||||
|
||||
\phantomsection
|
||||
% conclusion
|
||||
\backmatter
|
||||
|
||||
\chapter*{Bibliographie}
|
||||
\addcontentsline{toc}{chapter}{\textcolor{turquoisefonce}{Références}}
|
||||
\printbibliography[heading=bibempty]
|
||||
\part{Conclusion et annexes}
|
||||
|
||||
\section*{Livres}
|
||||
\addcontentsline{toc}{section}{Articles}
|
||||
\printbibliography[heading=bibempty,type=books]
|
||||
\input{chapitres/conclusion}
|
||||
|
||||
\section*{Sites web}
|
||||
\addcontentsline{toc}{section}{Sites web}
|
||||
\printbibliography[heading=bibempty,type=web]
|
||||
%\phantomsection
|
||||
|
||||
\cleardoublepage
|
||||
%\chapter*{Bibliographie}
|
||||
%\addcontentsline{toc}{chapter}{\textcolor{turquoisefonce}{Références}}
|
||||
%\printbibliography[heading=bibempty]
|
||||
|
||||
%\section*{Livres}
|
||||
%\addcontentsline{toc}{section}{Articles}
|
||||
%\printbibliography[heading=bibempty,type=books]
|
||||
|
||||
%\section*{Sites web}
|
||||
%\addcontentsline{toc}{section}{Sites web}
|
||||
%\printbibliography[heading=bibempty,type=web]
|
||||
|
||||
%\cleardoublepage
|
||||
|
||||
\phantomsection
|
||||
\setlength{\columnsep}{0.75cm}
|
||||
\addcontentsline{toc}{chapter}{\textcolor{turquoisefonce}{Index}}
|
||||
\printindex
|
||||
|
||||
%colophon
|
||||
|
||||
\newpage
|
||||
~\vfill
|
||||
\thispagestyle{empty}
|
||||
|
||||
\noindent Certains droits réservés \copyright\ 2021 Je valide ça, par François Pelletier\\
|
||||
|
||||
\noindent Visitez notre site web au \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 \url{https://creativecommons.org/licenses/by-nc-sa/4.0/} ou écrivez à Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.\\
|
||||
|
||||
\noindent Publié le 12 juillet 2021
|
||||
|
||||
\noindent Mise en page effectuée avec \LaTeX
|
||||
|
||||
\end{document}
|
||||
|
||||
|
|
110
overflow/overflow.md
Normal file
110
overflow/overflow.md
Normal file
|
@ -0,0 +1,110 @@
|
|||
### L'appel de logiciels
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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`
|
||||
|
||||
### cron sur Linux et macOS
|
||||
|
||||
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 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.
|
||||
|
||||
### Planificateur de tâches sur Windows
|
||||
|
||||
Une fois la commande exécutée, nous obtenons cette réponse:
|
||||
|
||||
```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
TaskPath TaskName State
|
||||
-------- -------- -----
|
||||
\ cocktail-aleatoire Ready
|
||||
```
|
||||
|
||||
### Tester avant d'exécuter
|
||||
|
||||
```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
rsync -av \
|
||||
--dry-run \
|
||||
--progress \
|
||||
--delete \
|
||||
/source/mondossier \
|
||||
/destination/mondossier
|
||||
```
|
||||
|
||||
### Fin de l'exécution
|
||||
|
||||
Lorsque la commande est terminée, ça va produire un sommaire comme suit:
|
||||
|
||||
```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
sent 391,414,597 bytes received 16,270 bytes 46,050,690.24 bytes/sec
|
||||
total size is 391,253,238 speedup is 1.00
|
||||
```
|
||||
|
||||
Afin de valider que la sauvegarde est bien réussie, il suffit d'exécuter à nouveau la commande. Si aucun fichier n'est synchronisé, alors c'est le cas !
|
||||
|
||||
## Sur Windows
|
||||
|
||||
Voici le code pour installer cette extension
|
||||
|
||||
```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
Install-Module PSWindowsUpdate
|
||||
```
|
||||
|
||||
Une fois installée,
|
||||
|
||||
Nous allons configurer les mises à jour pour qu'elles s'installent chaque jour à 2h du matin.
|
||||
|
||||
```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
|
||||
$action = New-ScheduledTaskAction -Execute 'Get-WindowsUpdate -AcceptAll -Install -AutoReboot'
|
||||
$trigger = New-ScheduledTaskTrigger -Daily -At 2am
|
||||
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "mise-a-jour-nocturne"
|
||||
```
|
|
@ -39,6 +39,8 @@
|
|||
headsep=8pt,
|
||||
}
|
||||
|
||||
\setlength{\parskip}{10pt}
|
||||
|
||||
\usepackage{avant}
|
||||
\usepackage{mathptmx}
|
||||
\usepackage{microtype}
|
||||
|
@ -59,7 +61,7 @@
|
|||
% styles de titres
|
||||
\titlecontents{part}
|
||||
[0cm]
|
||||
{\addvspace{5pt}\bfseries}
|
||||
{\addvspace{0pt}\bfseries}
|
||||
{}
|
||||
{}
|
||||
{}
|
||||
|
@ -147,13 +149,7 @@
|
|||
\fancypagestyle{plain}{\fancyhead{}\renewcommand{\headrulewidth}{0pt}}
|
||||
|
||||
\makeatletter
|
||||
\renewcommand{\cleardoublepage}{
|
||||
\clearpage\ifodd\c@page\else
|
||||
\hbox{}
|
||||
\vspace*{\fill}
|
||||
\thispagestyle{empty}
|
||||
\newpage
|
||||
\fi}
|
||||
\renewcommand{\cleardoublepage}{\clearpage}
|
||||
|
||||
\makeatletter
|
||||
\renewcommand{\@seccntformat}[1]{\llap{\textcolor{turquoisefonce}{\csname the#1\endcsname}\hspace{1em}}}
|
||||
|
@ -175,8 +171,8 @@
|
|||
{\normalfont\small\sffamily\bfseries}}
|
||||
|
||||
\newcommand{\@mypartnumtocformat}[2]{%
|
||||
\setlength\fboxsep{0pt}%
|
||||
\noindent\colorbox{turquoisefonce!20}{\strut\parbox[c][.7cm]{\ecart}{\color{turquoisefonce!70}\Large\sffamily\bfseries\centering#1}}\hskip\esp\colorbox{turquoisefonce!40}{\strut\parbox[c][.7cm]{\linewidth-\ecart-\esp}{\Large\sffamily\centering#2}}%
|
||||
\setlength\fboxsep{2pt}%
|
||||
\noindent\colorbox{turquoisefonce!20}{\strut\parbox[c][1.25cm]{\ecart}{\color{turquoisefonce!70}\Large\sffamily\bfseries\centering#1}}\hskip\esp\colorbox{turquoisefonce!40}{\strut\parbox[c][1.5cm]{\linewidth-\ecart-\esp}{\Large\sffamily\centering#2}}%
|
||||
}
|
||||
|
||||
\newcommand{\@myparttocformat}[1]{%
|
||||
|
@ -225,13 +221,6 @@
|
|||
\noindent\protect\colorbox{turquoisefonce!40}{\strut\protect\parbox[c][.7cm]{\linewidth}{\Large\sffamily\protect\centering #1\quad\mbox{}}}}{#1}}%
|
||||
\@endpart}
|
||||
\def\@endpart{\vfil\newpage
|
||||
\if@twoside
|
||||
\if@openright
|
||||
\null
|
||||
\thispagestyle{empty}%
|
||||
\newpage
|
||||
\fi
|
||||
\fi
|
||||
\if@tempswa
|
||||
\twocolumn
|
||||
\fi}
|
||||
|
|
Loading…
Reference in a new issue