Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue58:c_c [2012/03/14 15:15] – [to do] frangi | issue58:c_c [2012/03/17 10:16] (Version actuelle) – auntiee |
---|
** | ** |
| |
Je me rends compte que beaucoup de nos lecteurs sont des étudiants (comme je le suis). Selon le pays, un nouveau semestre vient de commencer, est sur le point de commencer, ou, dans le cas de l'Allemagne, est presque terminé. C'est souvent une bonne idée de garder une liste (seul ou en collaboration avec vos collègues) de questions, et leurs réponses, portant sur les cours que vous prenez. | Je me rends compte que beaucoup de nos lecteurs sont des étudiants (comme je le suis). Selon le pays, un nouveau semestre vient de commencer, est sur le point de commencer, ou, dans le cas de l'Allemagne, est presque terminé. C'est souvent une bonne idée de garder une liste (seul ou en collaboration avec vos collègues) de questions, et leurs réponses, portant sur les cours que vous suivez. |
| |
Si vous avez l'habitude de le faire (ou si vous êtes résolu à le faire), alors le script suivant vous aidera à faire vos révisions beaucoup plus facilement. Ce script a été écrit par un professeur d'université (et lecteur de FCM) qui aime se faire appeler «Magic Banana». Vous pouvez le trouver sur son site Internet: http://dcc.ufmg.br/~lcerf/en/utilities.html#trivialibre | Si vous avez l'habitude de le faire (ou si vous êtes résolu à le faire), alors le script suivant vous aidera à réviser beaucoup plus facilement. Ce script a été écrit par un professeur d'université (et lecteur du FCM) qui aime se faire appeler « Magic Banana ». Vous pouvez le trouver sur son site Internet: http://dcc.ufmg.br/~lcerf/en/utilities.html#trivialibre. |
| |
Il a pour but de poser des questions, organisés en catégories, dans un ordre aléatoire, et vous permet de définir un délai fixe pour répondre à chacune de ces questions. Il est nommé «Trivialibre», parce qu'il a été initialement écrit pour poser des questions d'un jeu éponyme (voir: http://trivialibre.humanoidz.org), qui est une variante du célèbre «Trivial Pursuit» pour les amateurs de logiciels libres. Le script est intéressant dans ses diverses utilisations des tests du shell, Zenity, de la commande assez nouvelle «shuf» et de «sed». | Il a pour but de poser des questions, organisées par catégorie, dans un ordre aléatoire, et vous permet de définir un délai fixe pour répondre à chacune de ces questions. Il s'appelle « Trivialibre » parce qu'il a été initialement écrit pour poser des questions d'un jeu éponyme (voir: http://trivialibre.humanoidz.org), qui est une variante, pour les amateurs de logiciels libre, du célèbre « Trivial Pursuit ». Le script est intéressant dans ses diverses utilisations des tests du shell, Zenity, de la commande assez récente « shuf » et de « sed ». |
| |
** | ** |
** | ** |
| |
Je vais discuter brièvement de la fonctionnalité du script, et ensuite expliquer pourquoi chaque commande est utilisée (y compris une explication des usages dans le script). | Je vais discuter brièvement de la fonctionnalité du script et ensuite expliquer pourquoi chaque commande est utilisée (y compris une explication des usages dans le script). |
| |
Que fait-il ? | Que fait-il ? |
| |
Ce script shell prend les questions dans des fichiers du dossier des catégories, et les pose (au hasard) dans une fenêtre GUI formée par Zenity. Il affiche la question, attend, puis affiche la bonne réponse (un peu comme le font les flashcards). | Ce script shell prend les questions dans des fichiers du dossier des catégories et les pose (au hasard) dans une fenêtre GUI formée par Zenity. Il affiche la question, attend, puis affiche la bonne réponse (un peu comme le font les flashcards). |
| |
Comment ça marche? | Comment ça marche? |
Il utilise shuf pour prendre les fichiers du dossier catégories, mélange le contenu, puis l'enregistre dans le dossier $XDG_DATA_HOME/trivialibre (de sorte que les questions en suspens peuvent être enregistrées quelque part sans en perdre). | Il utilise shuf pour prendre les fichiers du dossier catégories, mélange le contenu, puis l'enregistre dans le dossier $XDG_DATA_HOME/trivialibre (de sorte que les questions en suspens peuvent être enregistrées quelque part sans en perdre). |
| |
Une fois que cela est pris en charge, une fenêtre Zenity demande alors à l'utilisateur de choisir une catégorie (vous pouvez en choisir une en particulier, ou laisser le script en choisir une au hasard). | Une fois cela fait, une fenêtre Zenity demande alors à l'utilisateur de choisir une catégorie (vous pouvez en choisir une en particulier, ou laisser le script en choisir une au hasard). |
| |
Une fenêtre Zenity pose la question suivante en attente dans la catégorie choisie. Cette fenêtre contient une barre de progression qui atteint 100% après un délai choisi par le joueur (le seul argument du script), ou 20 s par défaut. Une fois une catégorie épuisée, elle est ensuite à nouveau mélangés et déplacée vers le dossier $XDG_DATA_HOME/trivialibre. | Une fenêtre Zenity pose la question suivante en attente dans la catégorie choisie. Cette fenêtre contient une barre de progression qui atteint 100 % après un délai choisi par le joueur (le seul argument du script), ou 20 secondes par défaut. Une fois une catégorie épuisée, elle est ensuite à nouveau mélangée et déplacée vers le dossier $XDG_DATA_HOME/trivialibre. |
| |
| |
** | ** |
| |
Conditions: | Conditions : |
| |
Tout au long du script, les conditions sont utilisées pour naviguer dans les différentes branches du dossier. Elles sont utilisées dans les instructions if, while, et for. | Tout au long du script, les conditions sont utilisées pour naviguer dans les différentes branches du dossier. Elles sont utilisées dans les instructions if, while, et for. |
16. if [-n "$1"] | 16. if [-n "$1"] |
| |
Cette instruction if vérifie si l'argument $1 N'est PAS vide (-n signifie «longueur non nulle"), de sorte que le délai pour la barre de progression peut être réglé sur autre chose que les 20s par défaut. | Cette instruction if vérifie si l'argument $1 n'est PAS vide (-n signifie « longueur non nulle »), de sorte que le délai pour la barre de progression peut être réglé sur autre chose que les 20 secondes par défaut. |
| |
23. if [-z "$XDG_DATA_HOME"] | 23. if [-z "$XDG_DATA_HOME"] |
| |
C'est l'exact opposé de la ligne 16, où vous vérifiez si $XDG_DATA_HOME est vide (-z est synonyme de "longueur zéro"). Dans ce cas, vous définissez alors la variable à "$HOME/.local/share" (qui est la valeur qu'il devrait être). | C'est l'exact opposé de la ligne 16, où vous vérifiez si $XDG_DATA_HOME est vide (-z est synonyme de "longueur zéro"). Dans ce cas, vous définissez alors la variable à "$HOME/.local/share" (qui est la valeur qu'il devrait avoir). |
| |
28. if [ ! -d $XDG_DATA_HOME/trivialibre ] | 28. if [ ! -d $XDG_DATA_HOME/trivialibre ] |
39. while [ -n "$categoryName" ] | 39. while [ -n "$categoryName" ] |
| |
Ici, nous utilisons la condition que nous avons utilisé à la ligne 16, mais dans une instruction while. Cela signifie que la boucle va continuer de tourner jusqu'à ce que la variable soit vide (ce qui arrive quand le joueur clique sur le bouton «Annuler»). Une fois que la variable est vide, le programme se ferme vraiment. | Ici, nous utilisons la condition que nous avons utilisée à la ligne 16, mais dans une instruction while. Cela signifie que la boucle va continuer de tourner jusqu'à ce que la variable soit vide (ce qui arrive quand le joueur clique sur le bouton « Annuler »). Une fois que la variable est vide, le programme se ferme. |
| |
42. if [ "$categoryName" = 'Random!' ] | 42. if [ "$categoryName" = 'Random!' ] |
| |
Il s'agit d'une simple comparaison de chaînes, où nous vérifions si l'utilisateur a choisi le hasard! (En tant que catégorie) ou non. | Il s'agit d'une simple comparaison de chaînes, où nous vérifions si l'utilisateur a choisi « Random! » (le hasard) (en tant que catégorie) ou pas. |
| |
48. if [ ! -s "$questionList" ] | 48. if [ ! -s "$questionList" ] |
| |
Habituellement -s est utilisé pour vérifier si un fichier existe et n'est pas vide. Puisque nous prenons le contraire (le «!»), nous vérifions en fait si le fichier est vide, c'est à dire si les questions relevant de la catégorie sont épuisées. Si c'est le cas, alors la prochaine étape consiste à re-remplir le fichier. | Habituellement -s est utilisé pour vérifier si un fichier existe et n'est pas vide. Puisque nous prenons le contraire (le « ! »), nous vérifions en fait si le fichier est vide, c'est-à-dire si les questions relevant de la catégorie sont épuisées. Si c'est le cas, alors la prochaine étape consiste à re-remplir le fichier. |
| |
| |
Shuf: | Shuf: |
| |
Shuf est un programme inclus dans le paquetage coreutils, et crée des permutations (variations) des lignes dans un fichier. Il est utilisé selon les manières suivantes dans le script (les numéros avant les commandes sont les numéros de ligne): | Shuf est un programme inclus dans le paquet coreutils et crée des permutations (variations) des lignes dans un fichier. Il est utilisé comme suit dans le script (les numéros avant les commandes sont les numéros de ligne) : |
| |
33. shuf -o "$XDG_DATA_HOME/trivialibre/$category" "$category" | 33. shuf -o "$XDG_DATA_HOME/trivialibre/$category" "$category" |
| |
Dans ce cas, shuf prend le contenu du fichier (dont le nom est enregistré dans la variable «category»), crée une permutation, puis l'enregistre dans $XDG_DATA_HOME/trivialibre sous le même nom. Cette permutation est alors celle qui est utilisée dans le script. | Dans ce cas, shuf prend le contenu du fichier (dont le nom est enregistré dans la variable « category »), crée une permutation, puis l'enregistre dans $XDG_DATA_HOME/trivialibre sous le même nom. Cette permutation est alors celle qui est utilisée dans le script. |
| |
44. `shuf -n 1 -e *` | 44. `shuf -n 1 -e *` |
| |
Dans ce cas, shuf affiche seulement la première ligne de la permutation («-n 1»), et accepte comme argument le contenu du fichier («-e»). Cela signifie qu'il prend la liste des catégories, crée une permutation, et sélectionne la première. Cette fonction est utilisée lorsque «Random» est choisi comme catégorie. | Dans ce cas, shuf affiche seulement la première ligne de la permutation (« -n 1 ») et accepte comme argument le contenu du fichier (« -e »). Cela signifie qu'il prend la liste des catégories, crée une permutation et sélectionne la première. Cette fonction est utilisée lorsque « Random » est choisi comme catégorie. |
| |
50. shuf -o "$XDG_DATA_HOME/trivialibre/$categoryName" "$categoryName" | 50. shuf -o "$XDG_DATA_HOME/trivialibre/$categoryName" "$categoryName" |
** | ** |
| |
Zenity: | Zenity : |
| |
«Zenity est un programme qui affiche des boîtes de dialogues de type GTK+, et qui retourne un code (soit par retour dans le script, soit à l'écran) dépendant de l'action de l'utilisateur. Il vous permet d'afficher des informations, de demander des saisies aux utilisateurs, etc. à partir de scripts shell.» (Extrait de la page de manuel Zenity). | « Zenity est un programme qui affiche des boîtes de dialogues de type GTK+ et qui retourne un code (soit par retour dans le script, soit à l'écran) dépendant de l'action de l'utilisateur. Il vous permet d'afficher des informations, de demander des saisies aux utilisateurs, etc., à partir de scripts shell. » (Extrait de la page de manuel Zenity.) |
| |
11. zenity --list --radiolist --window-icon=../token.png --height=247 --title='Trivialibre' --text='Choose a category in the list below or cancel to quit\n(the same questions will not be asked again next time).' --hide-header --column='' --column='' | 11. zenity --list --radiolist --window-icon=../token.png --height=247 --title='Trivialibre' --text='Choose a category in the list below or cancel to quit\n(the same questions will not be asked again next time).' --hide-header --column='' --column='' |
| |
Ceci crée une fenêtre GTK avec une liste de boutons «radio», en utilisant le fichier token.png comme icône de fenêtre. Il comprend également le titre de la fenêtre, le texte (en dehors du bouton radio), et offre quelques configurations (comme la géométrie). Les boutons radio sont labelisés en redirigeant la sortie de ls -1 à sed, puis à zenity. Sed est utilisé pour formater la sortie ls sorte que Zenity puisse l'utiliser. Il convient de noter que Zenity s'attend à ce que chaque chaîne soit précédée par un TRUE ou FALSE, qui désigne quelle chaîne est le choix par défaut (la ligne marquée TRUE). | Ceci crée une fenêtre GTK avec une liste de boutons « radio », en utilisant le fichier token.png comme icône de fenêtre. Il comprend également le titre de la fenêtre, le texte (en dehors du bouton radio) et offre quelques configurations (comme la géométrie). Les boutons radio sont labellisés en redirigeant la sortie de ls -1 à sed, puis à Zenity. Sed est utilisé pour formater la sortie ls de sorte que Zenity puisse l'utiliser. Il convient de noter que Zenity s'attend à ce que chaque chaîne soit précédée par un TRUE ou FALSE, qui désigne quelle chaîne est le choix par défaut (la ligne marquée TRUE). |
| |
** | ** |
64. zenity --info --window-icon=../token.png --title='Answer' --text="The answer is:\n\n$answer" | 64. zenity --info --window-icon=../token.png --title='Answer' --text="The answer is:\n\n$answer" |
| |
Une fois que la barre de progression a atteint 100% et que l'utilisateur a cliqué sur le bouton OK, cette commande est ensuite appelée, fournissant la réponse à la question. Elle sera également affichée si l'utilisateur clique sur le bouton «Annuler», interrompant la barre de progression et affichant la réponse. | Une fois que la barre de progression a atteint 100 % et que l'utilisateur a cliqué sur le bouton OK, cette commande est ensuite appelée, fournissant la réponse à la question. Elle sera également affichée si l'utilisateur clique sur le bouton « Annuler », interrompant la barre de progression et affichant la réponse. |
| |
Pour une meilleure introduction à Zenity, vous pouvez consulter mon article dans le FCM 46. | Pour une meilleure introduction à Zenity, vous pouvez consulter mon article dans le FCM n° 46. |
| |
| |
** | ** |
| |
Sed: | Sed : |
| |
Sed est une commande qui vous permet d'utiliser des expressions régulières en vue de modifier le texte que vous pouvez entrer. Je vais écrire un article à la fois sur sed et awk dans un proche avenir. | Sed est une commande qui vous permet d'utiliser des expressions régulières en vue de modifier le texte que vous pouvez entrer. Je vais écrire un article à la fois sur sed et awk dans un proche avenir. |
11. sed iFALSE | 11. sed iFALSE |
| |
Ceci est utilisé après la commande «ls -1», et insère (d'où le «i») le mot «FAUX» devant chaque ligne, de sorte que Zenity peut formater correctement les données dans la liste des boutons radio. | Ceci est utilisé après la commande « ls -1 », et insère (d'où le «i») le mot « FALSE » (faux) devant chaque ligne, de sorte que Zenity peut formater correctement les données dans la liste des boutons radio. |
| |
62. sed -i 1d "$questionList" | 62. sed -i 1d "$questionList" |
| |
Ici, sed modifie la liste des questions sur place («-i») et supprime tout simplement la première ligne du fichier, retirant ainsi effectivement la question qui vient d'être posée. | Ici, sed modifie la liste des questions sur place (« -i ») et supprime tout simplement la première ligne du fichier, retirant ainsi la question qui vient d'être posée. |
| |
** | ** |
Comment puis-je ajouter des catégories? | Comment puis-je ajouter des catégories? |
| |
Vous pouvez ajouter des catégories à l'aide LibreOffice Calc (ou tout autre programme qui peut créer des fichiers CSV (Comma Separated Values [NDT: dont les champs sont séparés par des virgules]). Au lieu de virgules, une tabulation devrait être utilisée comme séparateur, et rien d'autre pour séparer le texte. Assurez-vous de donner au fichier le nom de la catégorie que vous voulez qu'il représente. | Vous pouvez ajouter des catégories à l'aide de LibreOffice Calc (ou tout autre programme qui peut créer des fichiers CSV (Comma Separated Values [Ndt : dont les champs sont séparés par des virgules]). Au lieu de virgules, une tabulation devrait être utilisée comme séparateur et rien d'autre pour séparer le texte. Assurez-vous de donner au fichier le nom de la catégorie que vous voulez qu'il représente. |
| |
J'espère que vous avez trouvé cet article intéressant (et le script utile). Je tiens à remercier encore une fois Magic Banana pour avoir fourni le script et avoir été extrêmement utile lors de l'organisation de cet article. Si quelqu'un a des questions, des suggestions ou demandes, n'hésitez pas à m'envoyer un e-mail à lswest34@gmail.com. N'oubliez pas d'inclure «C&C» ou «FCM» dans le titre, de sorte que je ne le manque pas. | J'espère que vous avez trouvé cet article intéressant (et le script utile). Je tiens à remercier encore une fois Magic Banana pour avoir fourni le script et avoir été extrêmement utile lors de l'organisation de cet article. Si quelqu'un a des questions, des suggestions ou demandes, n'hésitez pas à m'envoyer un e-mail à lswest34@gmail.com. N'oubliez pas d'inclure « C&C » ou « FCM » dans le titre, de sorte que je ne le manque pas. |
| |
Pour aller plus loin: | Pour aller plus loin : |
| |
• "Linux Shell Scripting avec Bash" - Ken Burtch O. (Developer's Library) | • « Linux Shell Scripting avec Bash », Ken Burtch O. (Developer's Library). |
| |
• Les pages de manuel correspondantes | • Les pages de manuel correspondantes. |
| |
• Le FCM n° 46 de FCM (pour Zenity) | • Le FCM n° 46 (pour Zenity). |
| |
• info coreutils 'test invocation' | • info coreutils « test invocation ». |
| |
• info coreutils 'shuf' | • info coreutils « shuf ». |
| |
• info sed | • info sed. |
| |
| |