Outils pour utilisateurs

Outils du site


issue99:javascript

Table des matières

1

Last time, we covered the installation of node.js and we implemented a basic random number generator which we used for generating lotto numbers. In this part, I thought it would be good to see how linux commands, like yes, word count, or cat, can be implemented in JavaScript using node.js. In this part I will cover the yes command (https://en.wikipedia.org/wiki/Yes_(Unix)). First let’s see the code (right) and I will explain the details afterwards. The first line of the file is simple and, if you have ever written a bash script, you know what is it for; it gives a hint to the command line what app to use for executing the script. In this case, I wrote to use node from /usr/bin. After that, I have a description of the app and what it should do, the description is taken from the man page of the command.

La dernière fois, nous avons couvert l'installation de node.js et nous avons implémenté un générateur basique de nombres aléatoires que nous avons utilisé pour générer des numéros du loto.

Dans cette partie, je pensais que ce serait bien de voir comment les commandes Linux, comme « word count » (nombre de mots), ou « cat » (concaténer), peuvent être implémentées en Javascript en utilisant node.js. Dans cette partie, je vais couvrir la commande yes (oui) décrite par exemple sur https://en.wikipedia.org/wiki/Yes_(Unix). D'abord nous allons voir le code (à droite) et je vais vous expliquer les détails par la suite.

La première ligne du fichier est simple et, si vous avez déjà écrit un script bash, vous savez à quoi elle sert ; elle indique à la ligne de commande quelle application utiliser pour exécuter le script. Dans ce cas, j'ai indiqué d'utiliser node dans /usr/bin.

Après cela, j'ai une description de l'application et ce qu'elle devrait faire, la description est tirée de la page man de la commande.

2

I defined two constants, DEFAULT_TEXT and CUSTOM_TEXT. The DEFAULT_TEXT is used to write out the y character and a newline. The CUSTOM_TEXT will contain the text which the user wants to repeat. Then, I define three functions (printUsage, writeDefaultText, writeCustomText), their names are self-explanatory, but their content might need some attention. In node, using the process.sdtout object means that we can access any outgoing stream and we can write to it. For example, if you want to add the output of the yes command to a file using this command: ./yes.js » resultTextFile.txt, then this should work without any problem. The most important part comes now; in the application, I subscribe to the signal SIGINT (which is usually triggered on all operating systems when the user presses CTRL+C keys) using the process.on(…) function. When the signal is sent, I clear the repetition setup of the functions writeDefaultText() and writeCustomText(). I know we have not set up the repetition of these yet, but it will come shortly. I set up the repetition of a method (either writeDefaultText() or writeCustomText()) using the setInterval(…) function. With the repeated execution of writeCustomText() or writeDefaultText() methods, I manage to repeat the same output many times.

J'ai défini deux constantes, DEFAULT_TEXT et CUSTOM_TEXT. DEFAULT_TEXT est utilisée pour écrire le caractère y et un saut de ligne. CUSTOM_TEXT contiendra le texte que l'utilisateur veut répéter.

Ensuite, j'ai défini trois fonctions (printUsage, writeDefaultText, writeCustomText), leurs noms sont explicites, mais leur contenu pourrait nécessiter un peu d'attention. Dans node, utiliser l'objet process.sdtout signifie que nous pouvons accéder à n'importe quel flux sortant et pouvons écrire dedans. Par exemple, si vous souhaitez ajouter la sortie de la commande « yes » à un fichier en utilisant cette commande : ./yes.js » fichierResultat.txt, alors cela devrait fonctionner sans aucun problème.

La partie la plus importante arrive maintenant ; dans l'application, je m'abonne au signal SIGINT (qui est généralement déclenché sur tous les systèmes d'exploitation lorsque l'utilisateur appuie sur les touches Ctrl + C) en utilisant la fonction process.on(…). Lorsque le signal est envoyé, j'efface la configuration de la répétition des fonctions writeDefaultText() et writeCustomText(). Je sais que nous n'avons pas encore configuré la répétition de celles-ci, mais ça va venir sous peu. Je configure la répétition d'une méthode (writeDefaultText() ou writeCustomText()) en utilisant la fonction setInterval(…). Avec l'exécution répétée des méthodes writeCustomText() ou writeDefaultText(), je parviens à répéter plusieurs fois la même sortie.

3

Next, I check if the process was started with or without parameters. If it was started without parameters (process.argv.length == 2)**, it means that I need to set the writeDefaultText() method to be repeated until the user sends a SIGINT signal and the application will stop. The repetition is set up using the code: setInterval(writeDefaultText, 2). The setInterval() function takes two parameters; the first one is the method which needs to be executed and the second is the interval when that method (parameter #1) needs to be run. The second parameter needs to be a number and it represents milliseconds; in this case the writeDefaultText() will be invoked every two milliseconds. In case the program was started with three parameters (process.argv.length == 3)**, it means that the user passed in a custom text which he/she wants to be repeated, so, I set the writeCustomText() method to be executed every two milliseconds, but before that I do an extra check and see if the text provided by the user has a newline at the end or not. If it does not have a newline character, then I will add the newline character.

NOTE POUR LE SCRIBEUR : il faut enlever ci-dessous les balises nowiki (4 balises à enlever) si tu passes par l'édition de la page (si tu fais juste du copier/coller tu ne verras pas ces balises donc pas besoin de les enlever)

Ensuite, je vérifie si le processus a été lancé avec ou sans paramètres. S'il a été démarré sans paramètres (process.argv.length == 2)**, cela signifie que je dois définir la méthode writeDefaultText () pour être répété jusqu'à ce que l'utilisateur envoie un signal SIGINT qui arrêtera l'application. La répétition est mise en place en utilisant le code suivant : setInterval(writeDefaultText, 2). La fonction setInterval() prend deux paramètres ; le premier est la méthode qui doit être exécutée et le second est l'intervalle de répétition de l'exécution de cette méthode (paramètre n° 1). Le second paramètre doit être un nombre et il représente des millisecondes ; dans ce cas writeDefaultText() sera invoqué tous les deux millisecondes.

Dans le cas où le programme a été lancé avec trois paramètres (process.argv.length == 3)**, cela signifie que l'utilisateur a passé un texte personnalisé qu'il/elle veut répéter, donc je règle la méthode writeCustomText() pour être exécutée tous les deux millisecondes, mais avant je fais une vérification supplémentaire pour voir si le texte fourni par l'utilisateur contient un saut de ligne à la fin ou non. Si ce n'est pas le cas, alors je vais ajouter le caractère de nouvelle ligne.

4

In case the number of process arguments is not two or three, I invoke the printUsage() method which prints to the user how to use the program. You could ask why did I set the interval to two milliseconds and not to one. The answer is simple, if I set the interval to one millisecond, then the app will not be able to receive the SIGINT event when the user presses CTRL+C keys. This is just one implementation of the yes command; there are other ways to do it, but I've chosen to do it this way because I could use signals and intervals, plus had to take into account the number of parameters passed to the program. In the next part, I will implement word count (wc) using node.js. Till then try to do another implementation of the yes command, or any other linux command, and please send it to me, I will put it in the next article and highlight pros and cons of the implementation.

Dans le cas où le nombre d'arguments traités n'est pas deux ou trois, j'invoque la méthode printUsage() qui explique à l'utilisateur comment utiliser le programme.

Vous pourriez demander pourquoi j'ai réglé l'intervalle à deux millisecondes et non à une seule. La réponse est simple, si je mets une milliseconde, l'application ne pourra pas recevoir l'événement SIGINT lorsque l'utilisateur appuie sur des touches CTRL + C.

Ceci est juste une mise en œuvre de la commande « yes » ; il y a d'autres façons de le faire, mais j'ai choisi de faire ainsi parce que je pouvais utiliser les signaux et les intervalles, et j'avais aussi à prendre en compte le nombre de paramètres passés au programme. Dans la prochaine partie, je vais mettre en œuvre « word count » (wc) en utilisant node.js. Jusque-là, essayez de faire une autre mise en œuvre de la commande « yes », ou toute autre commande Linux, et s'il vous plaît envoyez-les moi, je les mettrai dans l'article en mettant en évidence les avantages et inconvénients de vos implémentations.

5

** According to the node documentation (https://nodejs.org/api/process.html#process_process_argv) the first item in argv array is the word “node”, the second is the name of the JavaScript file which is executed.

NOTE POUR LE SCRIBEUR : il faut enlever ci-dessous les 2 balises nowiki si tu passes par l'édition de la page (si tu fais juste du copier/coller tu ne verras pas ces balises donc pas besoin de les enlever)

** Selon la documentation de node (https://nodejs.org/api/process.html#process_process_argv) le premier élément du tableau argv est le mot « node », le second est le nom du fichier JavaScript qui est exécuté.

issue99/javascript.txt · Dernière modification : 2015/08/15 14:58 de andre_domenech