{"id":17681342,"url":"https://github.com/madeindjs/evaluation-node1","last_synced_at":"2025-03-12T14:31:10.056Z","repository":{"id":96108981,"uuid":"150606607","full_name":"madeindjs/evaluation-node1","owner":"madeindjs","description":"Evalutaion IT-Akademy pour le module de Node.js 1","archived":true,"fork":false,"pushed_at":"2018-09-27T15:13:27.000Z","size":16,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-05T21:41:53.267Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/madeindjs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-27T15:13:01.000Z","updated_at":"2023-06-29T20:00:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"c904c12e-28fe-4e75-aeeb-50a0940c5147","html_url":"https://github.com/madeindjs/evaluation-node1","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeindjs%2Fevaluation-node1","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeindjs%2Fevaluation-node1/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeindjs%2Fevaluation-node1/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeindjs%2Fevaluation-node1/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/madeindjs","download_url":"https://codeload.github.com/madeindjs/evaluation-node1/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243234477,"owners_count":20258473,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-24T09:10:52.217Z","updated_at":"2025-03-12T14:31:10.034Z","avatar_url":"https://github.com/madeindjs.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Node 1\n\nToute documentation autorisée.\n\nLe rendu de votre travail s'effectuera sous la forme d'un repository git, par exemple sur Github.\nEnvoyer un lien vers le repository à : [eric@rixo.fr](mailto:eric@rixo.fr).\n\nLa date butoir pour le rendu est jeudi 27 sept. à 18h.\n\n## Consignes générales\n\nUne (petite) partie de la note est basée sur la propreté du code rendu, selon les critères\nsuivants :\n\n- La consistence dans les choix de style de code (coding style).\n- Une indentation correcte.\n- Pas de \"cochonnerie\", comme du code mort (inutilisé) ou de l'ancien code en commentaire (commented out, les commentaires normaux sont bien entendu autorisés). Supprimez ce qui ne sert à rien, utilisez git à bon escient si vous souhaitez faire des tentatives.\n\nDans chacun des exercices, on vous donne le nom du fichier à créer pour l'exercice. Ce nom est imposé, cependant vous n'êtes obligés de mettre tout le code pour l'exercice dans le fichier en question -- vous avez la liberté de créer des fichiers supplémentaires si vous le souhaitez.\n\nÀ savoir : les exercices rapportent de moins en moins de points par rapport à leur difficulté. Conseil : faites les dans l'ordre.\n\nConseil git : faites un commit dès que vous avez quelque chose qui semble valoir des points\nqui marche. L'historique des commits n'est pas pris en compte dans la notation. N'essayez pas\nde faire un merge avec des conflits 20 min avant la fin (il y en a qui ont essayé, il a eu des\nproblèmes...). Autrement dit : si vous n'êtes pas hyper à l'aise avec git, ne tentez rien avec des\nbranches, restez sur master, commitez souvent. Si vous êtes plusieurs, mergez tôt, mergez\nsouvent.\n\n## 1. Mise en route\n\nÀ partir d'un repository git vierge, initialiser un projet Node.js en installant les dépendances\nsuivantes pour le développement :\n\n- [nodemon](https://www.npmjs.com/package/nodemon)\n- [browser-sync](https://www.npmjs.com/package/browser-sync)\n\nPensez à remplir correctement le fichier .gitignore.\n\nCommit.\n\n## 2. Is ready2.1. Programme\n\nDans un fichier `is-ready.js`, utilisez la fonction fs.stat ou la fonction fs.exists pour déterminer si le répertoire `node_modules` est présent à la racine de votre projet.\n\nSi le répertoire n'est pas présent, afficher \"not ready\" en rouge et sortir du programme avec un\nexit code de 255.\n\nSi le répertoire est présent, afficher \"maybe\" en jaune et sortir du programme avec un exit\ncode de 0.\n\n### Notes :\n\n- Le programme **doit** fonctionner lorsqu'il est lancé à partir d'un répertoire arbitraire, pas seulement à partir du répertoire du projet.\n- Vous devez utiliser soit la fonction `fs.stat`, soit `fs.exists` (autrement dit, `fs.existsSync` interdite par exemple).\n- `fs.exists` est deprecated depuis longtemps mais encore présente... et son\nfonctionnement est plus simple à comprendre.\n    - Si vous souhaitez utilisez `fs.stat`, sachez que lorsque le fichier/dossier cible n'existe par alors on obtient une erreur. Il faut alors interpréter cette erreur pour s'assurer qu'elle signifie que la cible n'existe pas, en testant son code, ainsi : `err.code === 'ENOENT'`. Sinon, c'est qu'il s'agit d'une autre erreur qu'il convient de traiter comme une vraie erreur.\n\nPour les couleurs dans le terminal, vous pouvez utilisez le module chalk ou autre\nméthode de votre choix.\n\n## 2.2. Lib\n\nDans le fichier is-ready.js, exportez une fonction qui retourne une Promise. Cette Promise doit resolve à true si le dossier node_modules existe (selon les critères de la partie 2.1), ou false si le dossier n'existe pas. (La Promise peut, par ailleurs, être rejected si une erreur survient.)\n\nVous pouvez refactorer le code produit à la partie précédente, ou bien le copier-coller si vous préférez (la duplication de code n'est pas pénalisée ici).\n\nCréez également un fichier is-ready-test.js, qui utilise la fonction que vous venez d'ajouter, et qui log le résultat de la Promise résolue.\n\n## 2.3. Are ready\n\nCréez un nouveau fichier are-ready.js et réimplémentez le même programme qu'à l'étape 2.1, à l'exception que vous devez tester en parallèle l'existence des 2 cibles suivantes :\n\n- le dossier node_modules\n- ET un fichier README.md\n\nDans cette partie, vous êtes libre d'utiliser ou non des Promise. Vous êtes libre de réutiliser (importer) du code des parties précédentes ou non.Vous devez effectuer le test pour les 2 cibles en parallèle.\n\n### 3. Count Server\n\nDans un fichier http-count.js, utilisez le package express pour implémentez un programme\navec les spécifications suivantes :\n\n- Au démarrage, lancer un serveur HTTP qui écoute sur un port passé en argument de la façon suivante : node `http-count.js -p PORT` (par exemple : `node http-count.js - p 8000`).\n- Si le programme est lancé avec tout autre argument que celui indiqué (i.e. \"-p PORT\"), alors afficher un message d'erreur et sortir du programme avec un code non zéro.\n- Lorsque le serveur est lancé, afficher le message suivant : \"Listening on port PORT...\" (bien entendu, remplacer PORT par le port utilisé).\n    - Conseil : utilisez la callback de la méthode `App#listen` d'express (cf. \u003chttps://expressjs.com/en/4x/api.html#app.listen\u003e). Lorsque cette callback est appelée, cela signifie que le serveur est prêt. La callback est appelée sans aucun argument -- en cas d'erreur, la callback ne sera pas appelée.\n- Compteur \"current\" : le serveur conserve (en mémoire vive) un compteur qui est incrémenté pour chaque requête que le serveur reçoit. Autrement dit, un compteur du nombre de requête depuis que le serveur est lancé.\n- Compteur \"all time\" : le serveur conserve, de manière persistante (solution libre pour la persistence), un compteur du nombre de requête depuis toujours (ou plus précisément depuis le dernier reset).\n    - Important : les compteurs \"all time\" ne doivent compter que les requêtes pour un port donné. Par exemple, si vous lancez un serveur sur le port 8000 et un autre sur le port 8001, alors les comptes sont séparés. Si ensuite vous couper ces 2 serveurs, puis en relancez un sur le port 8000, alors ce dernier reprend le compteur propre au port 8000.\n- Lorsque l'on accède à la racine du site (i.e. path '/'), renvoyer une page HTML avec :\n    - Du style -- CSS, à partir d'un fichier CSS (style inline ne compte pas)\n    - L'affichage de la valeur actuelle des 2 compteurs de requêtes (current et all- time), avec des labels permettant de comprendre ce qui est quoi. Cette information n'a pas besoin d'être mise à jour tant que la page n'est pas rechargée.\n    - Un formulaire tel que décrit ci-dessous\n- Le formulaire sur la page d'accueil doit contenir :\n    - Une checkbox avec un label \"Current\"\n    - Une checkbox avec un label \"All time\"\n    - Un bouton avec un label \"RESET\"\n- Lorsque le formulaire est envoyé (bouton \"RESET\") :\n    - Si la checkbox \"Current\" était cochée, alors remettre le compteur \"current\" à 0.\n    - Si la checkbox \"All time\" était cochée, alors remettre le compteur \"all time\" du port concerné à 0.\n- Ajouter une URL (de votre choix) qui permet d'obtenir les données des 2 compteurs au format JSON.\n    - Mettre un lien vers cette URL sur la page d'accueil du site.\n- Prêtez attention à :\n    - La gestion des erreurs.\n    - Ne pas coincer l'utilisateur dans un coin du site (c'est à dire une page qui n'offrirait pas, au moins, de retourner sur la page d'accueil)...\n\n## 4. Count Juggler\n\nDans un fichier `count-juggler.js`, implémenter un programme avec les spécifications suivantes :\n\n- Au démarrage du programme, il doit lancer 2 instances du programme précédent (http-count.js) sur des ports différents.\n    - Vous pouvez hardcoder les ports utilisés dans le programme -- mais choisissez des ports \u003e 1024 (sinon il faudra être root pour lancer votre program).\n    - Vous êtes autorisés à faire une copie du programme http-count.js dans un autre fichier, et à utiliser cette copie dans le cadre du présent exercice. Cela peut s'avérer utile si vous sentez que l'autre programme (le serveur) aurait besoin d'un refactor pour permettre de réaliser les fonctionnalités demandées ici et que vous ne souhaitez pas courir le risque de tout casser votre exercice précédent...\n    - Vous n'avez pas besoin d'essayer de cacher les outputs de l'autre programme (le serveur).\n- Lorsque les 2 instances de count servers sont prêtes (i.e. attachées à leur port respectif), alors afficher un message \"All servers ready\" puis passer à l'étape suivante.\n- Lorsque les serveurs sont prêts, alors afficher toutes les secondes une ligne au format DATE N1 + N2 = (N1 + N2), où :\n    - DATE est la date du moment (vous pouvez utilisez String(new Date()) par\nexemple)\n    - N1 et N2 sont les valeurs des compteurs \"current\" respectifs des 2 serveurs qui\nont été lancés au début du programme\n(N1 + N2) doit être remplacé par le résultat réel de l'addition des 2 compteurs\n- Pour obtenir les valeurs à jour des compteurs, vous devez effectuer une requête HTTP\nvers chacun des 2 serveurs.\n\n### Notes\n\nPour exécuter une fonction toutes les secondes, vous pouvez utilisez la fonction JS\n`setInterval`. Exemple:\n\n~~~javascript\nconst delay = 1000 // ms\nconst handler = function() { console.log('tick') }\n// will log 'tick' every second\nsetInterval(handler, delay)\n~~~\n\n- Il vous est conseillé d'utiliser une lib existante pour effectuer les requêtes HTTP à partir\nde node. Comme par exemple :\n    - [axios](https://github.com/axios/axios (https://github.com/axios/axios) (promise)\n    - [request](https://github.com/request/request (https://github.com/request/request) (callback)\n    - [node-fetch](https://www.npmjs.com/package/node-fetch (https://www.npmjs.com/package/node-fetch) qui permet d'utiliser dans node la même API fetch que dans le browser\n\nSi vous utilisez fetch, votre requête devrait ressembler à ça:\n\n~~~javascript\nfetch('http://localhost:8000/count.json')\n.then(res =\u003e res.json())\n.then(json =\u003e console.log(json));\n~~~\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmadeindjs%2Fevaluation-node1","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmadeindjs%2Fevaluation-node1","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmadeindjs%2Fevaluation-node1/lists"}