Outch ! Je peux vous assurer qu'entre la programmation asynchrone, les générateurs, les itérateurs, les call-backs imbriqué et le mot-clef yield (qui à mon sens est un goto déguisé), cela va être de plus en plus compliqué d'appréhender JS pour le chaland.
Il faut vraiment s'y mettre maintenant, dans deux ans il sera trop tard.
J'ai repris certains points comme les DNS de FDN, merci Seb.
Le petit rappel qui va bien :
NodeJS c'est quoi ?
NodeJS est une machine virtuelle capable d'exécuter des applications écrites en JavaScript côté serveur ; avec la capacité de démarrer un serveur web, de se connecter à une base de données, d'écrire sur le disque, etc. NodeJS est basé sur le moteur JavaScript développé pour WebKit et fournit sa propre implémentation du standard ECMAScript 6 (aka. ES2016), c'est-à-dire la dernière version standardisée de JavaScript en ce début 2017.
NPM c'est quoi ?
NPM est le gestionnaire de dépendances/paquets de NodeJS. Il est founi avec l'installation de NodeJS et utilisé par les développeurs pour télécharger, installer et exécuter l'ensemble des dépendances transitives de leurs projets JavaScript.
NPM peut :
- Gérer les dépendances pour les librairies s'exécutant côté client.
- Gérer les dépendances pour les librairies s'exécutant côté serveur.
- Exécuter des commandes dans la syntaxe du shell courant (et donc toutes les commandes figurant dans le path du-dit shell).
Comment qu'on setup toussa ?
1) Télécharger la dernière version (stable de préférence) de NodeJS
- La dernière version LTS (pour Long Term Support) est disponible ICI.
- Veillez à choisir la version compatible avec votre système, c'est-à-dire OS + architecture (32 ou 64 bits).
2) Installer NodeJS
Décompresser le tar.gz téléchargé dans un répertoire dédié, par exemple /tools/apps/nodejs-6.9.1.
Modifier votre fichier ~/.profile ou au choix ~/.bashrc comme suit :
- Créer la variable d'environnement $NODE_HOME
export NODE_HOME="/tools/apps/nodejs-6.9.1"
- Ajouter le sous-répertoire $NODE_HOME/bin/ dans votre path système :
export PATH="$PATH:$NODE_HOME/bin"
- Veillez à bien enregistrer les changements et redémarrer votre console si vous avez modifié le fichier ~/.bashrc et votre session pour le fichier ~/.profile.
- Hop vous avez à présent NPM et NodeJS disponible sous les commandes npm et node depuis un shell.
3) Configurer NPM
N.B : Dans la suite, le répertoire /tools/repositories peut en réalité être celui de votre choix. Moi je stocke tout dans /tools (en fait dans /opt/tools mais on s'en fiche).
- Nous allons dire à NPM où stocker les versions zippées des librairies qu'il a téléchargé, pour cela il faut ajouter/modifier la ligne suivante dans le fichier ~/.npmrc.
cache="/tools/repositories/npm/cache"
- Ensuite nous allons indiquer à NPM où décompresser les librairies télécharger au point précédent en ajoutant au fichier ~/.npmrc
prefix="/tools/repositories/npm/modules"
- Modifier votre fichier ~/.profile ou au choix ~/.bashrc comme suit :
export NPM_MODULES="/tools/repositories/npm/modules" export PATH="$PATH:$NPM_MODULES/bin"
- Et encore une fois veillez à bien enregistrer les changements et redémarrer votre console si vous avez modifié le fichier ~/.bashrc et votre session pour le fichier ~/.profile.
4) Dis-nous comment ça marche en moins de 60 secondes ?
## Télécharger un outil et l'installer dans le répertoire global contenant les modules, par exemple Gulp :
npm install -g gulp
## Exécuter Gulp en tapant
gulp --version
## Télécharger un outil et l'installer uniquement pour votre projet (i.e dans le sous-répertoire ./node_modules):
npm install --save-dev gulp
## Exécuter Gulp en tapant
./node_modules/gulp/bin/gulp --version
## NDR : des fois il faut taper ceci à la place
node ./node_modules/gulp/bin/gulp.js --version
## Installer une librairie en tant que dépendance de votre projet (elle sera mise dans le répertoire ./node_modules).
npm install -save aurelia-framework
## Installer une librairie qui ne sera pas livrée avec votre projet (par exemple un framework de test) :
npm install --save-dev jasmine
Et voilà en prime le lien vers le site officiel de NPM :D
Pourquoi ce tuto ?
Grosso-modo je dois apprendre comment reproduire un build Maven mais en JS avec les outils JS qui vont bien ; et qui soient plus ou moins les standards de facto du moment (i.e en ce début 2017).
Définitions :
À quoi sert quel outil dans ce gloubi-boulga d'outils tous plus hypes les uns que les autres ?
NodeJS :
C'est une machine virtuelle qui permet de faire tourner du JavaScript côté serveur.
NPM :
C'est le gestionnaire de paquets permettant de récupérer les dépendances transitives de vos projets (façon Maven). Certains disent que NPM signifie Node Package Manager mais l'auteur atteste que non.
Yarn :
NPM c'est top, mais ça possède trois inconvénients :
- La ligne de commande pu des fesses.
- NPM ne sait pas mettre les paquets dans un répo local (comme le fait a contrario Maven), donc NPM passe son temps à re-télécharger les dépendances qu'il a déjà téléchargé pour le projet précédent.
- NPM ne gère pas le build concurrent (il n'est pas multi-threadé) donc le build rame (enfin tout est relatif #CompilationC++).
Yarn est un outils qui réponds à ces trois problématiques avec un chat tout mimi en guise de logo.
TypeScript :
C'est à la fois un langage mais également un compilateur éponyme. En gros, les mecs de Microchiotte se sont dits que JavaScript ça ne sentait pas bon des fesses (comme la ligne de commande de NPM) et qu'il valait mieux coder avec de vraies classes, des vrais namespaces, de vraies visibilités (public, private, etc) et une fois que tout ceci était correctement codé en TypeScript, ont transpile ce code en du JavaScript ; autrement dit on convertir le code du TypeScript dans une syntaxe cohérente et fortement typée, vers du JS (incohérent et faiblement typé) ; et comme cela plus besoin de se prendre la tête à connaître tous les hacks de ce langage merdique (une référence ici sur la merdicitude de JS et une autre là sur la retard community - ces deux articles sont pour toi Lenny).
Jasmine :
C'est un framework permettant d'écrire des tests en JavaScript. Ces derniers peuvent être au niveau unitaire (façon JUnit) ou fonctionnel / intégration (façon Cucumber). En général Jasmine est considéré comme faisant partie des framework destinés au BDD (mais bon, je ne suis pas d'accord).
Karma :
Un outil permettant de charger une suite de tests écrits en Jasmine ou en tout autre chose. Le concurrent le plus sérieux est MochaJS qui est une sorte de medley entre Karma et Jasmine, mais comme je n'ai pas encore eu le temps de l'étudier,que Karma à l'avantage d'être soutenu par les développeurs Google qui bossent sur Angular 2 et que j'ai déjà utilisé Jasmine par le passé... Bah Karma & Jasmine.
PhantomJS :
NodeJS permet d'exécuter du JavaScript côté serveur, et bien PhantomJS est un navigateur sans interface graphique permettant d'exécuter du JavaScript dans une console afin de le tester (ndr. en s'appuyant sur Jasmine et Karma). Vous vous doutez bien qu'un navigateur sans IHM est un navigateur ultra-rapide pour faire tourner du JS (sous-entendu parfait pour avoir des phases de run de TU rapides durant nos builds).
Webpack :
Webpack peut quasiment tout faire à l'aide de ses plugins mais l'idée ici est de s'en servir pour trois choses :
- Packager l'ensemble du JS dans un seul fichier qui soit unique.
- Minifier au taquet ce fichier packagé.
- Ne pas inclure dans le package minifié le code mort, c'est-à-dire les classes qui ne sont jamais chargées directement ou transitivement par la classe Main.
Et donc dans tout ça ? Et bien dans tout cela vous aurez donc un build JS qui va chercher les dépendances tout seul, qui respecte le cycle de vie de Maven, qui assure la séparation du code à livrer (les sources) du code à ne pas livrer (les plugins du build et le code des tests), qui centralise la production des binaires en un seul endroit et qui soit capable de releaser votre build (i.e fabriquer des tags et incrémenter le numéro de version). Pas mal hein ?
La suite des posts à lire figure ici (en cours de complétion) :
Je précise ici que je cherche à reproduire l'architecture de dossier et le life-cycle de Maven mais pour un projet NodeJS / Aurelia. Nous allons donc avoir ce type de dossiers :
. (root folder) # La racine du répo
|__ node_modules/ # Le répertoire des éléments téléchargés par NPM
|
|__ src/ # Le répertoire contenant les sources
| |__ main/ # Les sources qui seront livrées
| | |__ js/
| |
| |__ test/ # Les sources qui ne seront jamais livrées (les tests)
| |__ js/
|
|__ target/ # Le répertoire contenant les éléments générés lors de build
|
|_ karma.conf.js # Le fichier de configuration de Karma (le générateur de suite de tests)
|_ package.js # Le fichier de configuration de Yarn (le build manager)
|_ tsconfig.json # Le fichier de configuration de TypeScript (le transpilateur)
|_ webpack.config.js # Le fichier de configuration de Webpack (le packager / minifier)
- Comment installer et configurer NodeJS & NPM
- Comment installer et configurer le transpilateur TypeScript ?
C'est partiiii #JoueLaCommeBarnabé
Voici ma configuration pour le compilateur TypeScript à mettre dans le fichier tsconfig.json. La première à destination de la production (avec beaucoup de check et de contraintes) et la seconde à destination du mode développeur (qui autorise plus de chose afin d'exécuter les tests en continue) :
PROD configuration :
{
"compilerOptions": {
// BUILD GLOBAL OPTIONS :
"module": "commonjs",
"outDir": "./target/js",
"sourceMap": true,
"target": "ES5", // The aimed JS version (ES5, ES2016, ES2017 or ESNext
// BUILD OUTPUT :
"diagnostics": true,
"pretty": true,
// ENCODING
"charset": "utf8", // The targeted file encoding
"newLine": "lf", // File will use Line Feed as EOL character (Unix format)
// COMPILER BEHAVIOR :
"allowJs" : false, // Allow JS syntax
"preserveConstEnums": true, // 'const enum' are kept in generated code
"removeComments": true, // Comment removed from transpiled code
// COMPILER ENFORCING :
"noImplicitAny": true, // 'any' type is mandatory
"noImplicitThis": true, // Forbien to mix 'any' and 'this' in the same expression
"noImplicitReturns": true, // Raise error is a 'return' is missing in part of a function
"noUnusedLocals": true, // Report errors on unused locals
"noUnusedParameters": true // Report error on unused parameters
},
"include": [
"./src/main/**/*"
]
}
DEV configuration :
{
"compilerOptions": {
// BUILD GLOBAL OPTIONS :
"module": "commonjs",
"outDir": "./target/js",
"sourceMap": true,
"target": "ES5", // The aimed JS version (ES5, ES2016, ES2017 or ESNext
// BUILD OUTPUT :
"diagnostics": true,
"pretty": true,
// ENCODING
"charset": "utf8", // The targeted file encoding
"newLine": "lf", // File will use Line Feed as EOL character (Unix format)
// COMPILER BEHAVIOR :
"allowJs" : false, // Allow JS syntax
"preserveConstEnums": true, // 'const enum' are kept in generated code
"removeComments": true, // Comment removed from transpiled code
// COMPILER ENFORCING :
"noImplicitAny": true, // 'any' type is mandatory
"noImplicitThis": true, // Forbien to mix 'any' and 'this' in the same expression
"noImplicitReturns": true // Raise error is a 'return' is missing in part of a function
},
"include": [
"./src/main/js/**/*"
]
}
Je cite :
En principe, le prélèvement fiscal de 21 % doit être effectué par la société dans tous les cas dès lors que l’associé est une personne physique.
Toutefois, il est prévu que les associés qui appartiennent à un foyer dont le revenu fiscal de référence de l’avant-dernière année est inférieur à 50.000 € (contribuables célibataires, veufs ou divorcés), ou à 75.000 € (couples soumis à imposition commune), peuvent demander, sous leur responsabilité, à être dispensés du prélèvement fiscal de 21 %.
A cet effet, ils doivent remettre chaque année à la société, avant le 30 novembre de l’année précédant celle du paiement, une demande de dispense de ce prélèvement.
A noter : seuls peuvent donc être exemptés du prélèvement fiscal de 21 % cette année, les associés qui ont remis à la société une dispense de paiement de ce prélèvement avant le 30 novembre 2014.
En pratique, cette demande doit prendre la forme d’une attestation sur l’honneur dont nous vous proposons le modèle suivant :
Par exemple :
Pour les dividendes :
- De l'exercice fiscal 2016
- A se verser en 2017
Si mon revenu fiscal de référence de 2015 est :
- Inférieur à 50 000 € pour une personne seule.
- Inférieur à 75 000 € pour un coupe.
Alors je dois remettre une attestation sur l'honneur à ma société exprimant le fait que je suis exempté de verser l'accompte de 21%.
=> Le modèle est disponible ici.
Ils y sont tous ou presque ! Ceux du GoF, ceux d'Avalon, ceux de JEE, ce orientés SOA et MSOA. Quel travail !
Le liens direct dans la page : http://java-design-patterns.com/patterns/
Un autre lien utile : https://github.com/kamranahmedse/design-patterns-for-humans/blob/master/README.md
Un tuto pour faire du NPM + WebPack + TypeScript + React. Je ferai un résumé de la conf plus tard (si j'ai le temps).
Un descriptif de quelques modules NodeJS très sympa
Un tuto très sympa et très facile à comprendre (pour Roudoudoutte)
Pour toi Animal, chose dont nous parlions il y a quelques temps.
Comment définir la taille des blocs de vos partitions EXT4.
je cite :
Si vous utilisez la plupart du temps de gros fichiers, il sera probablement très profitable de formatter vos partitions avec des blocs de taille plus importante. En effet, Linux utilise par défaut des taille de blocs de 1024 octets. Vous pouvez changer avec des tailles de 4096 avec la commande mke2fs -b 4096 /dev/..., qui utilise des blocs de 4k au lieu de 1k. Cela va notamment réduire la fragmentation et réduire le temps de vérification lors d'un fsck.
Le lien propose toute une tripoté d'autres optimisations.
Un tuto d'optimisation des lectures écriture d'un OS installé sur clef usb
Tout plein d'effets en CSS pour se passer de JavaScript (inutile pour la chose depuis un moment, c'est vrai)
Un tuto Docker montrant comment monter un LAMP en récupérant des images depuis le répo Docker (qui je le rappelle ne devrait pas être utiliser en entreprise mais bon).
Voici l'une de mes bonnes résolutions de l'année : faire des articles se servant de la mise en forme Markdown de mon Shaarli. Celui-ci sera la première partie - de ce qui je l'espère - sera d'une longue lignée.
NPM C'est quoi donc ?
NPM c'est d'abord un acronyme signifiant Node Package Manager ce que l'on peut traduire par "gestionnaire de package de Node JS".
Le fichier 'package.json' c'est quoi donc ?
Tout comme il existe chez Maven, un fichier pom.xml qui décrit un projet, il existe un fichier package.json qui fait la même chose en Node JS.
Ok donc dois-je me servir de NPM comme outil de build ?
Eh bien non, désolé. En réalité vous pourriez, cependant JavaScript étant ce qu'il est, l'écosystème bouge tellement vite que la norme à adopter c'est YARN.
Ok mais qu'est-ce que YARN aurait de plus que NPM et justifiant son usage ?
Pour comprendre cela, il faut comprendre ce que fait NPM
- NPM va d'une part gérer (c'est-à-dire télécharger et mettre à jour) vos dépendances et les dépendances de vos dépendances. Nous parlerons alors de *gestion transitive des dépendances.
- NPM est également en mesure d'exécuter des commandes que vous lui aurez indiquer. Cela vous permettre par exemple de transpiler une application, de la packager ou encore de la déployer.
Parfait mais qu'est-ce que ne fait pas NPM alors ?
Eh bien deux choses :
1) Il ne met rien en cache, c'est-à-dire que NPM va retélécharger encore et toujours chacune des librairies que vous avez utilisé dans vos projets ; contrairement à Maven qui stocke dans le répertoire
$HOME/.m2/repository
l'ensemble des librairies dont vous vous êtes servi au moins une fois.
2) Il gère votre build de manière séquentielle, ce qui est dommageable en termes de performances étant donné que nos processeurs sont tous multi-cœurs voire multi-cœurs et hyper-threads à ce jour.
Et YARN est une surcouche de NPM qui répond tout simplement à ces deux besoins.
Un lien pour Chlouchloutte qui porte sur SCRUM. En espérant que cela puisse t'aider durant tes prochaines phases de coaching.
Un tutoriel sur le design pattern builder du GoF où les différentes complexité d'implémentation de ce design pattern sont illustrés. Félicitation à l'auteur, très bon article.
Comme certains le savent bien, je code sous NetBeans pour mes applis en Java et NetBeans a cette fichue manie de nous forcer à utiliser le logger embarqué dans Java (qui est une belle saloperie soit dit en passant). Bref, aucun moyen d'utiliser une macro pour générer le code de déclaration de ce logger dans la configuration par défaut. Sauf que je viens de trouver comment faire !!! Et c'était tellement facile que je regrette de ne pas avoir cherché la solution avant.
Voici la manipulation :
1) Aller dans le menu Tools > Options > Editor > Code Templates
2) Cliquer sur New et entrer psfl pour "Public Static Final Logger"
3) Ajouter le code suivant dans l'onglet "Expanded Text"
${no-format}private static final ${loggerType type="org.slf4j.Logger" default="Logger" editable="false"} LOGGER = ${LoggerFactoryType type="org.slf4j.LoggerFactory" default="LoggerFactory" editable="false"}.getLogger(${CLASS editable="false" currClassName}.class.getCanonicalName());${cursor}
4) Appliquer et fermer la fenêtre.
Comment s'en servir ensuite ?
1) Quelque par dans votre classe taper : psfl puis TAB (ou la touche d'expansion que vous avez défini) et NetBeans générera le code suivant :
// Avec les imports qui vont bien évidemment :D
private static final Logger LOGGER = LoggerFactory.getLogger(MaClass.class.getCanonicalName());
Explications :
- ${no-format} : Demande à NetBeans de ne pas formatter la ligne générée
- ${loggerType type="org.slf4j.Logger" default="Logger" editable="false"} : Demande à NetBeans d'importer la classe Logger et de la définir comme type de la variable
- ${CLASS editable="false" currClassName} : Demande à NetBeans d'écrire à cet emplacement le nom de la classe courante
- ${cursor} : Demande à NetBeans de positionner le cuseur d'édition à cet emplacement à la fin de la génération
Une liste de tuto sur le site http://programming-motherfucker.com
La thématique est assez énorme : le client ne veut pas du Scrum, de l'XP, de l'Agile, des procédures de tests... Non le client veut et à besoin DE CODE. Donc à tous ses problèmes nous répondons "programming motherfucker".