tag:linuxfr.org,2005:/sections/javascript LinuxFr.org : les dépêches de JavaScript 2026-03-10T18:36:34+01:00 /favicon.png tag:linuxfr.org,2005:News/42926 2026-03-10T18:36:34+01:00 2026-03-10T18:36:34+01:00 Sortie de µJS, une bibliothèque JavaScript légère pour dynamiser un site sans framework Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>µJS est une bibliothèque JavaScript open source (licence MIT) qui permet de rendre un site web dynamique sans recourir à un framework frontend lourd. Elle s’inspire de pjax, Turbo et HTMX, avec pour objectif d’être plus simple et plus légère.</p> <h3 id="toc-principe-de-fonctionnement">Principe de fonctionnement</h3> <p>µJS intercepte les clics sur les liens et les soumissions de formulaires pour charger les pages via AJAX, au lieu de déclencher un rechargement complet du navigateur. Le contenu récupéré remplace tout ou partie de la page courante. Le résultat : une navigation fluide, sans rechargement visible, sans écrire une seule ligne de JavaScript.</p> <p>Aucune étape de build, aucune dépendance, compatible avec n’importe quel backend (PHP, Python, Go, Ruby…).</p> </div><ul><li>lien nᵒ 1 : <a title="https://mujs.org" hreflang="en" href="https://linuxfr.org/redirect/117149">Site officiel</a></li><li>lien nᵒ 2 : <a title="https://mujs.org/playground" hreflang="en" href="https://linuxfr.org/redirect/117150">Playground interactif</a></li><li>lien nᵒ 3 : <a title="https://github.com/Digicreon/muJS" hreflang="en" href="https://linuxfr.org/redirect/117151">Dépôt GitHub</a></li><li>lien nᵒ 4 : <a title="https://www.geek-directeur-technique.com/2026/03/06/%c2%b5js-rendre-un-site-web-dynamique-sans-framework-front" hreflang="fr" href="https://linuxfr.org/redirect/117152">Article de blog</a></li></ul><div><h3 id="toc-fonctionnalités-principales">Fonctionnalités principales</h3> <ul> <li>Mode patch : mettre à jour plusieurs fragments du DOM en une seule requête, via des attributs <code>mu-patch-target</code> dans la réponse HTML du serveur</li> <li>SSE : mises à jour en temps réel via Server-Sent Events</li> <li>DOM morphing : préservation de l’état du DOM (focus, scroll, transitions CSS) via idiomorph</li> <li>View Transitions : animations fluides entre les états de page, via l’API native du navigateur</li> <li>Prefetch : préchargement de la page cible au survol d’un lien</li> <li>Polling : rafraîchissement automatique d’un fragment à intervalle régulier</li> <li>Verbes HTTP complets : GET, POST, PUT, PATCH, DELETE sur n’importe quel élément</li> <li>Barre de progression : intégrée, sans dépendance externe</li> </ul> <h3 id="toc-installation">Installation</h3> <p>Via CDN :</p> <pre><code class="html"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">"https://cdn.jsdelivr.net/npm/@digicreon/mujs/dist/mu.min.js"</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span><span class="nx">mu</span><span class="p">.</span><span class="nx">init</span><span class="p">();&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></code></pre> <p>Via npm :</p> <pre><code class="shell">npm install @digicreon/mujs</code></pre> <h3 id="toc-exemple-1--navigation-ajax-sans-configuration">Exemple 1 : navigation AJAX sans configuration</h3> <p>Par défaut, tous les liens internes sont interceptés automatiquement. Le <code>&lt;body&gt;</code> de la page cible remplace le <code>&lt;body&gt;</code> courant.</p> <pre><code class="html"><span class="cp">&lt;!DOCTYPE html&gt;</span> <span class="p">&lt;</span><span class="nt">html</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Mon site<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">nav</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"/"</span><span class="p">&gt;</span>Accueil<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"/articles"</span><span class="p">&gt;</span>Articles<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"/contact"</span><span class="p">&gt;</span>Contact<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">nav</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">main</span> <span class="na">id</span><span class="o">=</span><span class="s">"contenu"</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Contenu de la page.<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">"https://cdn.jsdelivr.net/npm/@digicreon/mujs/dist/mu.min.js"</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span><span class="nx">mu</span><span class="p">.</span><span class="nx">init</span><span class="p">();&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span></code></pre> <p>Aucun attribut supplémentaire. Les boutons retour/avant du navigateur fonctionnent, l’URL est mise à jour, le titre de la page aussi.</p> <p>Pour ne remplacer qu’un fragment de la page plutôt que le <code>&lt;body&gt;</code> entier :</p> <pre><code class="html"><span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"/articles"</span> <span class="na">mu-target</span><span class="o">=</span><span class="s">"#contenu"</span> <span class="na">mu-source</span><span class="o">=</span><span class="s">"#contenu"</span><span class="p">&gt;</span>Articles<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span></code></pre> <p>Dans ce cas, µJS va récupérer la page <code>/articles</code>, va extraire l’élément <code>#contenu</code> de la réponse, et remplace l’élément <code>#contenu</code> courant avec.</p> <p>Si tous les changements de pages se font dans l’élément <code>#contenu</code>, on peut généraliser dans la configuration (pour éviter d’avoir à mettre des attributs <code>mu-target</code> et <code>mu-source</code> sur tous les liens) :</p> <pre><code class="html"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span> <span class="nx">mu</span><span class="p">.</span><span class="nx">init</span><span class="p">({</span> <span class="nx">target</span><span class="o">:</span> <span class="s2">"#contenu"</span><span class="p">,</span> <span class="nx">source</span><span class="o">:</span> <span class="s2">"#contenu"</span> <span class="p">});</span> <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></code></pre> <h3 id="toc-exemple-2--recherche-en-direct-avec-debounce">Exemple 2 : recherche en direct avec debounce</h3> <pre><code class="html"><span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">"text"</span> <span class="na">name</span><span class="o">=</span><span class="s">"q"</span> <span class="na">mu-trigger</span><span class="o">=</span><span class="s">"change"</span> <span class="na">mu-debounce</span><span class="o">=</span><span class="s">"300"</span> <span class="na">mu-url</span><span class="o">=</span><span class="s">"/recherche"</span> <span class="na">mu-target</span><span class="o">=</span><span class="s">"#resultats"</span> <span class="na">mu-source</span><span class="o">=</span><span class="s">"#resultats"</span> <span class="na">mu-mode</span><span class="o">=</span><span class="s">"update"</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">"resultats"</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span></code></pre> <p>Le serveur reçoit une requête GET vers <code>/recherche?q=...</code> et retourne un fragment HTML. µJS l'injecte dans <code>#resultats</code>. Aucun JavaScript à écrire côté client.</p> <h3 id="toc-exemple-3--mise-à-jour-de-plusieurs-fragments-en-une-seule-requête-patch-mode">Exemple 3 : mise à jour de plusieurs fragments en une seule requête (patch mode)</h3> <p>Côté HTML :</p> <pre><code class="html"><span class="p">&lt;</span><span class="nt">form</span> <span class="na">action</span><span class="o">=</span><span class="s">"/commentaire/ajouter"</span> <span class="na">method</span><span class="o">=</span><span class="s">"post"</span> <span class="na">mu-mode</span><span class="o">=</span><span class="s">"patch"</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">textarea</span> <span class="na">name</span><span class="o">=</span><span class="s">"contenu"</span><span class="p">&gt;&lt;/</span><span class="nt">textarea</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">"submit"</span><span class="p">&gt;</span>Envoyer<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">form</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">ul</span> <span class="na">id</span><span class="o">=</span><span class="s">"commentaires"</span><span class="p">&gt;</span> <span class="c">&lt;!-- liste des commentaires --&gt;</span> <span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">span</span> <span class="na">id</span><span class="o">=</span><span class="s">"compteur"</span><span class="p">&gt;</span>3 commentaires<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span></code></pre> <p>Le serveur retourne plusieurs fragments HTML dans une seule réponse. Chaque fragment indique sa cible via <code>mu-patch-target</code> :</p> <pre><code class="html"><span class="c">&lt;!-- Ajoute le nouveau commentaire à la liste --&gt;</span> <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">"commentaire"</span> <span class="na">mu-patch-target</span><span class="o">=</span><span class="s">"#commentaires"</span> <span class="na">mu-patch-mode</span><span class="o">=</span><span class="s">"append"</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Le nouveau commentaire<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span> <span class="c">&lt;!-- Met à jour le compteur --&gt;</span> <span class="p">&lt;</span><span class="nt">span</span> <span class="na">mu-patch-target</span><span class="o">=</span><span class="s">"#compteur"</span><span class="p">&gt;</span>4 commentaires<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span> <span class="c">&lt;!-- Réinitialise le formulaire --&gt;</span> <span class="p">&lt;</span><span class="nt">form</span> <span class="na">action</span><span class="o">=</span><span class="s">"/commentaire/ajouter"</span> <span class="na">method</span><span class="o">=</span><span class="s">"post"</span> <span class="na">mu-patch-target</span><span class="o">=</span><span class="s">"form"</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">textarea</span> <span class="na">name</span><span class="o">=</span><span class="s">"contenu"</span><span class="p">&gt;&lt;/</span><span class="nt">textarea</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">"submit"</span><span class="p">&gt;</span>Envoyer<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">form</span><span class="p">&gt;</span></code></pre> <p>Une seule requête HTTP, trois fragments mis à jour simultanément. Le serveur garde le contrôle total sur ce qui est mis à jour et comment.</p> </div><div><a href="https://linuxfr.org/news/sortie-de-js-une-bibliotheque-javascript-legere-pour-dynamiser-un-site-sans-framework.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/142565/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/sortie-de-js-une-bibliotheque-javascript-legere-pour-dynamiser-un-site-sans-framework#comments">ouvrir dans le navigateur</a> </p> Amaury Bouchard Ysabeau 🧶 https://linuxfr.org/nodes/142565/comments.atom tag:linuxfr.org,2005:News/42513 2025-05-16T10:27:15+02:00 2025-05-17T11:10:04+02:00 QuickJS version 2025-04-26 et QuickJS-NG version 0.10 Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Finalement Fabrice Bellard est comme tout le monde, lui aussi numérote ses versions avec des dates, c'est plus simple. Voici donc la version annuelle de <strong>QuickJS</strong> (licence MIT), son moteur JavaScript incorporable et compact (le binaire Linux 64 bits fait 757 kiB). QuickJS est compatible avec ECMAScript 2023 — sauf pour les appels <code>tails</code> que <a href="https://bellard.org/quickjs/quickjs.html#ES2023-support">les auteurs ne trouvent pas indispensables</a> — et passe presque toute <a href="https://test262.fyi/">la suite de tests ECMAScript (en sélectionnant ES2023)</a>.</p> <p>En 2023, pour revivifier un développement un peu dormant, la fourche <strong>QuickJS-NG</strong> a été lancée (par un des contributeurs de Jitsi). <em>QuickJS-NG est intéressant pour ceux qui veulent utiliser cmake et compiler le projet sous Windows avec le compilateur C Microsoft. Il intègre aussi le support de quelques fonctionnalités récentes de la norme JavaScript que QuickJS ne supporte pas encore.</em> (Je cite Fabrice Bellard). <a href="https://test262.fyi/#%7Cqjs,qjs_ng">Les différences ne sont pas énormes</a>. La version 0.10 est toute neuve.</p> <p>Ci-après, Fabrice Bellard m'a très gentiment expliqué les principaux changements de QuickJS.</p> </div><ul><li>lien nᵒ 1 : <a title="https://bellard.org/quickjs/quickjs.html" hreflang="en" href="https://linuxfr.org/redirect/115642">Documentation QuickJS Javascript Engine</a></li><li>lien nᵒ 2 : <a title="https://bellard.org/quickjs/" hreflang="en" href="https://linuxfr.org/redirect/115643">Page de QuickJS chez Fabrice Bellard</a></li><li>lien nᵒ 3 : <a title="https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg" hreflang="en" href="https://linuxfr.org/redirect/115644">Démo dans la machine virtuelle JSLinux</a></li><li>lien nᵒ 4 : <a title="https://github.com/bellard/quickjs" hreflang="en" href="https://linuxfr.org/redirect/115661">QuickJS sur Github</a></li><li>lien nᵒ 5 : <a title="https://quickjs-ng.github.io/quickjs/" hreflang="en" href="https://linuxfr.org/redirect/115662">Documentation de QuickJS-NG</a></li><li>lien nᵒ 6 : <a title="https://github.com/quickjs-ng/quickjs" hreflang="en" href="https://linuxfr.org/redirect/115663">QuickJS-NG sur Github (avec les notes de version)</a></li></ul><div><h2 id="toc-changements-les-plus-importants-dans-quickjs-2025-04-26">Changements les plus importants dans QuickJS 2025-04-26</h2> <p>Les explications viennent de Fabrice Bellard :</p> <ul> <li>La suppression d'extensions non standardisées que j'avais ajoutées pour avoir des nombres flottants en précision arbitraire et la surcharge des opérateurs. Précision historique : j'ai créé QuickJS au début afin d'avoir une calculatrice avec une syntaxe compatible JavaScript. L'idée était de pouvoir manipuler des entiers ou des nombres flottants en précision arbitraire, des polynômes ou des matrices tout en utilisant une syntaxe familière. D'où des extensions au langage JavaScript présentes dans QuickJS. Mais ces extensions étaient compliquées et source de bugs, donc j'ai décidé de les supprimer. La calculatrice est maintenant <a href="https://bellard.org/libbf">un projet à part</a><sup id="fnref1"><a href="#fn1">1</a></sup>.</li> <li>L'implémentation des BigInt se reposait sur la librairie libbf que j'ai supprimée avec les extensions non standardisées. Il y a donc une nouvelle implémentation des BigInt, plus rapide et plus simple.</li> <li>La réimplémentation des "weak references" avec le support de fonctions présentes dans ES2023. QuickJS-NG les supportait déjà mais avec une implémentation qui utilise plus de mémoire, est moins efficace et surtout potentiellement incorrecte en présence de cycles.</li> <li>La concaténation de petites chaînes de caractères est plus rapide grâce à l'utilisation de "ropes". Beaucoup de programmes fabriquent de longues chaînes de caractères en concaténant des petites chaînes de caractères avec une grosse <code>s = ""; for(i=0;i&lt;n;i++) s += "a"</code>. C'est une méthode déconseillée car inefficace, mais les moteurs JavaScript comme <a href="https://fr.wikipedia.org/wiki/V8_(moteur_JavaScript)">V8</a>, <a href="https://fr.wikipedia.org/wiki/SpiderMonkey">SpiderMonkey</a> ou <a href="https://fr.wikipedia.org/wiki/JavaScriptCore">JavaScriptCore</a> l'optimisent donc elle est très utilisée.</li> <li>Ajout des numéros de colonne dans les erreurs. QuickJS-NG le faisait déjà mais la méthode ne me convenait pas. Celle utilisée dans QuickJS est plus simple et (normalement) plus précise.</li> <li>Les nombres flottants sont maintenant analysés et convertis en chaînes de caractères sans utiliser la librairie C. Cela est nécessaire pour être complètement compatible avec la norme JavaScript et accroître la portabilité du code.</li> </ul> <h2 id="toc-principaux-changements-de-quickjs-ng-010">Principaux changements de QuickJS-NG 0.10</h2> <ul> <li>Implémentation de <code>Array.fromAsync</code> </li> <li>supporte <code>os.Worker</code> sur Windows</li> <li>ajout du mode de <em>build</em> <code>parserless</code> </li> <li>ajout de <code>os.exePath()</code> </li> <li>ajouts des hooks <code>Promise</code> </li> <li>correction des <code>Promise</code> non gérés</li> <li>nouvelle implémentation de BigInt par Fabrice Bellard (voir ci-dessus)</li> <li>et divers…</li> </ul> <h2 id="toc-sous-projets">Sous-projets</h2> <p>QuickJS héberge des bibliothèque C qu'on peut utiliser pour d'autres projets :</p> <ul> <li> <code>libregexp</code> : une bibliothèque <a href="https://fr.wikipedia.org/wiki/Regexp" title="Définition Wikipédia">Regexp</a> petite et rapide, totalement conforme aux spécifications Javascript ES2023.</li> <li> <code>libunicode</code> : une petite bibliothèque <a href="https://fr.wikipedia.org/wiki/Unicode" title="Définition Wikipédia">Unicode</a> supportant les conversions de casse, la normalisation unicode, les requêtes unicode scriptées, les requêtes unicode de catégorie générale et toutes les propriétés unicode binaires.</li> <li> <code>dtoa</code> : une petite bibliothèque pour l'impression et l'analyse syntaxique en float64.</li> </ul> <h2 id="toc-téléchargements">Téléchargements</h2> <p>Les binaires sont dispos avec <em>jsvu</em> (JavaScript Version Updater, de Google) ou <em>esvu</em> (ECMAScript Version Updater, projet communautaire), ainsi qu'en téléchargement depuis les sites respectifs. Fabrice Bellard a aussi préparé des binaires QuickJS construits avec <a href="https://github.com/jart/cosmopolitan">la Libc Cosmopolitan</a> pour Linux, Mac, Windows, FreeBSD, OpenBSD, NetBSD tant sur les architectures ARM64 que x86_64.</p> <div class="footnotes"> <hr> <ol> <li id="fn1"> <p><a href="http://numcalc.com/">NumCalc</a> n'est pas encore indépendant de QuickJS, mais c'est le but. Pour l'instant la nouvelle calculatrice (<code>bfcalc</code>) n'est disponible qu'en ligne de commande. <a href="#fnref1">↩</a></p> </li> </ol> </div> </div><div><a href="https://linuxfr.org/news/quickjs-version-2025-04-26-et-quickjs-ng-version-0-10.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/139139/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/quickjs-version-2025-04-26-et-quickjs-ng-version-0-10#comments">ouvrir dans le navigateur</a> </p> orfenor palm123 Benoît Sibaud cli345 https://linuxfr.org/nodes/139139/comments.atom tag:linuxfr.org,2005:News/42193 2024-12-04T08:25:54+01:00 2024-12-04T08:25:54+01:00 Deno 2.0 est là Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Le temps où Node.js régnait en maître comme la solution incontournable pour exécuter du code JavaScript côté serveur est-il révolu ? En tout cas, il a aujourd’hui des challengers de taille comme Bun (qui pourrait lui aussi mériter une dépêche) ou Deno. C'est donc de ce dernier qu'il sera question dans cette dépêche, à l'occasion de la sortie de sa version 2.0</p> </div><ul><li>lien nᵒ 1 : <a title="https://deno.com/blog/v2.0" hreflang="en" href="https://linuxfr.org/redirect/114668">Annonce sur le blog officiel</a></li><li>lien nᵒ 2 : <a title="https://deno.com/" hreflang="en" href="https://linuxfr.org/redirect/114765">Site officiel de Deno</a></li><li>lien nᵒ 3 : <a title="https://jsr.io/" hreflang="en" href="https://linuxfr.org/redirect/114845">JSR</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li> <ul> <li><a href="#toc-pour-rappel">Pour rappel</a></li> <li><a href="#toc-la-mascotte">La mascotte !</a></li> <li><a href="#toc-deno-1x-des-d%C3%A9buts-difficiles">Deno 1.x, des débuts difficiles !</a></li> <li><a href="#toc-les-nouveaut%C3%A9s-de-la-version-20">Les nouveautés de la version 2.0</a></li> <li><a href="#toc-autour-du-projet-deno-javascript-registry-jsr-un-d%C3%A9p%C3%B4t-de-paquets-javascript-universel">Autour du projet Deno, JavaScript Registry (JSR) un dépôt de paquets JavaScript universel !</a></li> <li> <a href="#toc-performances-du-runtime">Performances du runtime</a><ul> <li> <a href="#toc-test-sur-un-macbook-pro-26-ghz-intel-core-i7-6c%C5%93urs-amd-radeon-pro5300m-4-go-inteluhd-graphics630-1536-mo-16-go-2667-mhz-ddr4-sous-macos-sonoma">Test sur un MacBook Pro (2,6 GHz Intel Core i7 6 cœurs, AMD Radeon Pro 5300M 4 Go Intel UHD Graphics 630 1536 Mo, 16 Go 2667 MHz DDR4) sous macOS Sonoma</a><ul> <li><a href="#toc-node-le-temps-moyen-pour-ex%C3%A9cuter-le-test-de-126-millisecondes">Node: Le temps moyen pour exécuter le test de 126 millisecondes</a></li> <li><a href="#toc-deno-le-temps-moyen-pour-ex%C3%A9cuter-le-test-de-93-millisecondes">Deno: Le temps moyen pour exécuter le test de 93 millisecondes</a></li> </ul> </li> </ul> </li> <li><a href="#toc-performances-du-gestionnaire-de-paquets">Performances du gestionnaire de paquets</a></li> <li><a href="#toc-deno-21-est-l%C3%A0">Deno 2.1 est là</a></li> <li><a href="#toc-conclusion">Conclusion</a></li> </ul> </li> </ul> <p><img src="//img.linuxfr.org/img/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f636f6d6d6f6e732f632f63332f44656e6f5f4c6f676f5f323032342e737667/Deno_Logo_2024.svg" alt="Titre de l'image" title="Source : https://upload.wikimedia.org/wikipedia/commons/c/c3/Deno_Logo_2024.svg"></p> <h3 id="toc-pour-rappel">Pour rappel</h3> <p>Deno est un <em>runtime</em> JavaScript et TypeScript. Il a vu le jour suite au constat de Ryan Dahl (créateur aussi de Node.js), que Node avait des problèmes de conceptions, et qu'il était nécessaire de repartir de zéro en tenant compte de l'expérience de Node pour ne pas refaire les mêmes erreurs. Il imagine Deno comme un <em>runtime</em> avec un modèle de sécurité par défaut plus strict. Les programmes Deno n'ont pas accès au système de fichiers, au réseau ou à l'environnement, sauf si on leur accorde explicitement ces permissions. Deno est écrit en Rust, et se base sur le moteur JavaScript V8 de Google. Deno se distingue également de Node en offrant la possibilité d'importer les dépendances via des URL, mettant en cache chaque module lors de l’importation pour améliorer la vitesse d’exécution.</p> <h3 id="toc-la-mascotte">La mascotte !</h3> <p>La première chose notable quand on passe de Node.js à Deno, c'est sa mascotte ! En effet, même si Node.js possède bien une <a href="https://nodejs.org/en/about/branding#branding-of-nodejs">petite tortue comme mascotte</a>, celle-ci n'est utilisée nulle part ! Personnellement, j'ai toujours trouvé bien plus chouettes les projets qui ont des petites bestioles comme mascotte (Mozilla, Tux …). Et chez Deno, le dinosaure mascotte est omniprésent sur tout le site. Et en plus, à l'occasion de la version 2.0, on peut habiller notre dino sur la <a href="https://deno.com/">home page</a> du projet ! Et ça c'est cool ! Voici le mien, qui est en compagnie de Ferris, la mascotte officieuse de Rust ! </p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f692e6962622e636f2f57794d797a68472f6d792d64696e6f2e706e67/my-dino.png" alt="Mon dino" title="Source : https://i.ibb.co/WyMyzhG/my-dino.png"></p> <p>Bon, comme je ne suis pas sûr que tout le monde partage ma passion pour les mascottes, on va passer au côté plus technique ! 🤣</p> <h3 id="toc-deno-1x-des-débuts-difficiles">Deno 1.x, des débuts difficiles !</h3> <p>La version 1.0 sortie en mai 2020 a du mal à se faire une place et reste dans l'ombre de son grand frère. En effet, même si Deno offre un grand lot de nouveautés et est plus sécurisé par défaut, la très large adoption de Node et le fait que les projets développés pour Node ne sont pas forcément compatibles avec Deno rend l’adoption de ce dernier difficile. De plus, l'utilisation de CDN plutôt que d'installer les dépendances localement (dans le répertoire <code>node_modules</code>) a certes de nombreux avantages, mais cela rend votre projet dépendant de disponibilité du réseau ou peut entraîner des problèmes de performances si le CDN est éloigné géographiquement.</p> <h3 id="toc-les-nouveautés-de-la-version-20">Les nouveautés de la version 2.0</h3> <p>Deno est désormais 100% compatible avec Node.js, et un gestionnaire de paquets officiel a vu le jour. Vous pouvez maintenant utiliser <code>deno add</code> et <code>deno remove</code>pour ajouter ou retirer un paquet à votre projet.</p> <h3 id="toc-autour-du-projet-deno-javascript-registry-jsr-un-dépôt-de-paquets-javascript-universel">Autour du projet Deno, JavaScript Registry (JSR) un dépôt de paquets JavaScript universel !</h3> <p>Le registre NPM s'est construit autour de Node.js afin de gérer facilement les dépendances de nos projets. Il a donc été développé pour Node.js à une époque où Node était la seule solution pour exécuter du code JavaScript côté serveur. En près de 15 ans, le registre NPM a rassemblé un peu moins de 3 millions de paquets et a très largement rempli sa mission toutes ces années. Mais aujourd'hui, la situation a changé, il existe plusieurs runtimes pouvant exécuter du code JavaScript (ou TypeScript) côté serveur. Et du côté front-end, les frameworks se sont multipliés et sont devenus de plus en plus complexes et nécessitent aussi l'utilisation d'un gestionnaire de paquets. Un registre de paquets fondé autour de Node.js uniquement est donc beaucoup moins pertinent qu'en 2010.<br> C'est donc pourquoi, à l'initiative du projet Deno, un nouveau registre de paquets JavaScript et TypeScript universel pointe aujourd'hui le bout de son nez. Il s'agit donc de <a href="https://jsr.io/">JSR (JavaScript Registry)</a>.</p> <p>Dans JSR, quand on va sur la page d'un paquet, en haut à droite, on a les logos des environnements compatibles avec le paquet : </p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f692e706f7374696d672e63632f36717a423235444d2f53637265656e73686f742d323032342d31312d31322d61742d30392d34322d31322d74732d7265782d6263727970742d4a53522e706e67/Screenshot-2024-11-12-at-09-42-12-ts-rex-bcrypt-JSR.png" alt="Titre de l'image" title="Source : https://i.postimg.cc/6qzB25DM/Screenshot-2024-11-12-at-09-42-12-ts-rex-bcrypt-JSR.png"></p> <h3 id="toc-performances-du-runtime">Performances du runtime</h3> <p>Niveau performance, ça donne quoi ?</p> <p>On voit souvent l'affirmation que Deno serait plus rapide que Node.js. Mais ça donne quoi en réalité ?</p> <p>J'ai voulu faire un petit test sans prétentions pour voir ce que ça donne. Je voulais faire des tests plus poussés sur différents systèmes d'exploitation et architectures, mais par manque de temps, le test sera donc fait sur un seul système et un seul ordinateur et il s'agit d'un Mac… Un comble pour LinuxFr.org, mais c'est l'ordinateur que j'avais à disposition à ce moment-là. Mais sinon, je ne porte pas spécialement Apple dans mon cœur, bien au contraire !</p> <p>J'ai testé l’exécution d'une même API sur Node. et Deno pour voir les différences de performance entre ces solutions. Pour ce test, j'ai utilisé une API Rest que j'ai développée pour le site de la société <a href="https://www.audiosoft.fr/#/">AudioSoft</a>. J'ai fait la même requête POST 10 fois sur la même route avec les mêmes données. Il est important de préciser que c'est la première fois que je fais ce genre de tests, et que je ne fais peut-être pas tout dans les règles de l'art. Il y a des éléments extérieurs à Node et Deno qui peuvent influencer les scores. Notamment, la base de données utilisée pour le test était accessible via Internet, et des différences de débit ont pu fausser les tests.</p> <h4 id="toc-test-sur-un-macbook-pro-26-ghz-intel-core-i7-6cœurs-amd-radeon-pro5300m-4-go-inteluhd-graphics630-1536-mo-16-go-2667-mhz-ddr4-sous-macos-sonoma">Test sur un MacBook Pro (2,6 GHz Intel Core i7 6 cœurs, AMD Radeon Pro 5300M 4 Go Intel UHD Graphics 630 1536 Mo, 16 Go 2667 MHz DDR4) sous macOS Sonoma</h4> <h5 id="toc-node-le-temps-moyen-pour-exécuter-le-test-de-126-millisecondes">Node: Le temps moyen pour exécuter le test de 126 millisecondes</h5> <h5 id="toc-deno-le-temps-moyen-pour-exécuter-le-test-de-93-millisecondes">Deno: Le temps moyen pour exécuter le test de 93 millisecondes</h5> <h3 id="toc-performances-du-gestionnaire-de-paquets">Performances du gestionnaire de paquets</h3> <p>Comme dit précédemment, Deno c'est aussi un gestionnaire de paquets. J'ai donc trouvé intéressant de tester les principaux gestionnaires de paquets sur différents environnements.<br> Pour ce test je me base sur la même API Rest que pour le test précédant, les dépendances à installer pour cette API sont : bcrypt, body-parser, dotenv, express, jsonwebtoken, mariadb, multer, mysql2, nodemailer, et sequelize. Le test a été fait sur un MacBook Pro. Pour effectuer ce test, le cache des gestionnaires de paquets ont été nettoyés et les fichiers-verrous supprimés.</p> <p>Avec NPM, l'installation a mis 10 secondes.</p> <p>Avec Deno, l'installation a mis 1 seconde.</p> <p>Avec Bun, l'installation a mis 3 secondes.</p> <p>On voit très clairement que NPM est beaucoup plus lent que ses deux concurrents. L'écart est plus faible entre Deno et Bun. Mais Deno est bien le plus rapide des trois.</p> <p>Avant de réaliser ce test, j'en ai effectué un en oubliant de nettoyer le cache et de supprimer package-lock.json. Les résultats étaient alors 8 secondes pour NPM, 5 secondes pour Deno et 4 secondes pour Bun. Il est logique de constater que NPM est plus rapide, en revanche, je trouve surprenant que Deno et Bun aient été ralentis. Il est possible que les gestionnaires de paquets aient parcouru package-lock.json pour garder les versions présentes dans ce fichier, ce qui les aurait tous les trois ralentis. Et NPM a peut-être pu bénéficier de son cache (car je l'utilise bien plus que les deux autres sur mon ordinateur), Deno et Bun eux n'avaient peut-être pas grand-chose dans leurs caches, ont donc été ralentis. Il est donc important de supprimer les <em>lockfile</em> en cas de migration d'un projet.</p> <p>Comme je le disais plus haut, c'est la première fois que j'effectue ce genre de test comparatif. Si vous avez des conseils sur les bonnes méthodes pour faire des tests plus fiables, ça m’intéresse !</p> <h3 id="toc-deno-21-est-là">Deno 2.1 est là</h3> <p>Étant donné que j'ai mis environ un siècle pour rédiger cette dépêche, Deno 2.1 est sortie entre temps ! 🤣<br> Je vous liste donc les principales nouveautés apportées à la version 2.1 sans les commenter 😉</p> <ul> <li>Support natif de WebAssembly (Wasm) : Il est désormais possible d'importer directement des modules Wasm, simplifiant leur utilisation et améliorant les performances.</li> <li>Version Long Term Support (LTS) : Deno 2.1 inaugure la première version LTS, garantissant des correctifs de bugs et des améliorations de performance pendant… Six mois… On n'est pas encore aux 30 mois des versions LTS de Node.js… Cela viendra peut-être plus tard. 🙂</li> <li>Commande deno init --npm vite : Cette commande simplifie la création de nouveaux projets en utilisant des outils comme Vite, en automatisant l'initialisation et en réduisant la configuration manuelle.</li> <li>Gestion des dépendances : Introduction de la commande deno outdated pour gérer les mises à jour des dépendances JSR et npm.</li> </ul> <h3 id="toc-conclusion">Conclusion</h3> <p>Si vous êtes développeur Node.js, je vous conseille de vous intéresser à Deno, et même à Bun. Je ne sais pas si ces deux runtime sont totalement prêts pour des projets en production (par exemple, Deno 2.1 n'a que 6 mois de durée de vie, ce qui est plutôt contraignant pour les serveurs.). Mais peut-être que dans un futur proche, il sera cohérent de migrer vers l'un de ces deux-là.</p> </div><div><a href="https://linuxfr.org/news/deno-2-0-est-la.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/137022/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/deno-2-0-est-la#comments">ouvrir dans le navigateur</a> </p> sbillois Benoît Sibaud cli345 FrancoisA30 gnoucat2 Julien Jorge Pierre Tramal Arkem bobble bubble orfenor Pierre-Alain TORET https://linuxfr.org/nodes/137022/comments.atom tag:linuxfr.org,2005:News/41224 2022-10-11T10:17:11+02:00 2022-10-11T10:17:11+02:00 WebDAV Manager, un client WebDAV ultra-léger en JS Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>À l’occasion de mon travail sur l’intégration du protocole <a href="https://fr.m.wikipedia.org/wiki/WebDAV">WebDAV</a> au gestionnaire d’association <a href="https://garradin.eu/">Garradin</a> j’ai développé un petit client WebDAV JavaScript permettant avec son navigateur web d’envoyer et télécharger des fichiers, gérer les répertoires, prévisualiser les images et autres fichiers, mais aussi éditer directement des fichiers textes.</p> </div><ul><li>lien nᵒ 1 : <a title="https://github.com/kd2org/webdav-manager.js" hreflang="en" href="https://linuxfr.org/redirect/111168">WebDAV Manager</a></li><li>lien nᵒ 2 : <a title="https://camo.githubusercontent.com/7f9bb906b50779cd2adbd02edf2fba454f981601a8e0de8171d4a6b82bf70fc0/68747470733a2f2f6b64326f72672e6769746875622e696f2f7765626461762d6d616e616765722e6a732f7363725f322e6a7067" hreflang="en" href="https://linuxfr.org/redirect/111169">Capture d&#39;écran</a></li><li>lien nᵒ 3 : <a title="https://kd2org.github.io/webdav-manager.js/demo.html" hreflang="en" href="https://linuxfr.org/redirect/111170">Démo (ne fonctionne qu&#39;avec un serveur WebDAV autorisant les accès JavaScript distants)</a></li></ul><div><p>L’utilisation principale est d’intégrer directement ce client à votre serveur WebDAV pour proposer une interface web agréable, mais il peut aussi permettre d’utiliser n’importe quel serveur WebDAV depuis son navigateur, sans rien installer (à condition que le serveur WebDAV l’autorise, via les entêtes <a href="https://en.m.wikipedia.org/wiki/Cross-origin_resource_sharing">CORS</a> adéquats, voir la documentation).</p> <p>Le client permet :</p> <ul> <li>création et suppression de répertoires</li> <li>suppression de fichiers</li> <li>création et édition de fichiers textes</li> <li>renommer et déplacer les fichiers et répertoires</li> <li>envoi de fichier depuis le navigateur</li> <li>envoi de fichier par copier/coller</li> <li>envoi de fichier par glisser et déposer</li> <li>prévisualisation dans le navigateur des images, textes, vidéos, fichiers audio, du MarkDown et des PDF</li> <li><a href="https://kd2org.github.io/webdav-manager.js/scr_1.jpg">prévisualisation du MarkDown lors de l’édition</a></li> <li>téléchargement des fichiers</li> <li>dispo en anglais et français</li> </ul> <p>Le client ne fait que 8 Ko de JavaScript (gzippé), et n’a besoin d’aucune dépendance, pas de <a href="https://fr.m.wikipedia.org/wiki/Npm">NPM</a> ni rien, juste un fichier JS et un fichier CSS à déposer.</p> <p>Il a été testé avec mod_dav et NextCloud avec succès.</p> </div><div><a href="https://linuxfr.org/news/webdav-manager-un-client-webdav-ultra-leger-en-js.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/128982/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/webdav-manager-un-client-webdav-ultra-leger-en-js#comments">ouvrir dans le navigateur</a> </p> BohwaZ palm123 Ysabeau 🧶 https://linuxfr.org/nodes/128982/comments.atom tag:linuxfr.org,2005:News/39855 2020-05-15T18:57:53+02:00 2020-05-15T23:08:02+02:00 Sortie de Deno 1.0 Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Deno est un possible successeur à Node.js. Ryan Dahl, qui est l’auteur à l’origine de Node.js, a présenté lors d’une conférence il y a deux ans une liste de dix choses qu’il regrette à propos de Node.js. À partir de cette liste, il a voulu créer un nouveau moteur d’exécution de script qui tourne en dehors du navigateur mais qui en reprend les conventions. Le projet s’appelle Deno et il vient d’atteindre la version 1.0.</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f61766174617273312e67697468756275736572636f6e74656e742e636f6d2f752f3432303438393135/42048915" alt="Logo de Deno" title="Source : https://avatars1.githubusercontent.com/u/42048915"></p> </div><ul><li>lien nᵒ 1 : <a title="https://deno.land/v1" hreflang="en" href="https://linuxfr.org/redirect/106305">Annonce de la sortie de la v1</a></li><li>lien nᵒ 2 : <a title="https://github.com/denoland" hreflang="en" href="https://linuxfr.org/redirect/106306">Le code source de Deno sur GitHub</a></li><li>lien nᵒ 3 : <a title="https://www.youtube.com/watch?v=M3BM9TB-8yA" hreflang="en" href="https://linuxfr.org/redirect/106307">Présentation des dix choses que Ryan Dahl regrette à propos de Node.js</a></li></ul><div><p>D’un point de vue technique, Deno est codé en Rust et repose toujours sur V8. Le code exécuté est désormais du <a href="https://fr.wikipedia.org/wiki/TypeScript" title="Définition Wikipédia">TypeScript</a> et le fonctionnement est plus proche d’un navigateur Web. Par exemple, il utilise les mêmes API que celles fournies par les navigateurs quand cela fait sens, plutôt que de proposer des API propres (p. ex. <code>fetch</code> plutôt que le <code>http.get</code> de Node.js pour faire des requêtes HTTP).</p> <p>Avant d’aller plus loin, voici le très attendu exemple de serveur Web qui répond avec un <em>Hello World</em> :</p> <pre><code class="ts"><span class="kr">import</span> <span class="p">{</span> <span class="nx">serve</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">"https://deno.land/[email protected]/http/server.ts"</span><span class="p">;</span> <span class="k">for</span> <span class="nx">await</span> <span class="p">(</span><span class="kr">const</span> <span class="nx">req</span> <span class="nx">of</span> <span class="nx">serve</span><span class="p">({</span> <span class="nx">port</span>: <span class="kt">8000</span> <span class="p">}))</span> <span class="p">{</span> <span class="nx">req</span><span class="p">.</span><span class="nx">respond</span><span class="p">({</span> <span class="nx">body</span><span class="o">:</span> <span class="s2">"Hello World\n"</span> <span class="p">});</span> <span class="p">}</span></code></pre> <p>On peut tout de suite remarquer que Deno prend le même chemin que Go pour la gestion des dépendances, à savoir une approche décentralisée et qui ne nécessite pas d’outils tiers comme <em>npm</em>. On peut directement importer un fichier TypeScript venant d’Internet.</p> <p>Pour celles et ceux que ça ferait bondir sur leur chaise vis‑à‑vis de la sécurité, la réponse tient en deux parties :</p> <ol> <li>Deno a une approche bac à sable par défaut : par défaut, un script ne peut pas accéder au système de fichiers ou à Internet (un peu comme dans un navigateur), et l’utilisateur doit explicitement passer une option comme <code>--allow-net</code> pour donner la permission ;</li> <li>Deno a un système de cache qui fait que l’on peut faire fonctionner un script en téléchargeant une première fois les dépendances, en les vérifiant, et elles ne bougeront plus ensuite tant que les URL du script ne bougeront pas ; il est également possible de faire du <em>vendoring</em> facilement (il suffit de republier les dépendances sur un serveur Web que l’on contrôle).</li> </ol> <p>Dans les différences avec Node.js, on peut également citer l’utilisation des <code>Promise</code> à la place des <em>callbacks</em>, souvent utilisées via <em>async/await</em>. Cela va notamment régler le problème de <em>back‑pressure</em> qui avait conduit à rendre complexe les API de Node.js (<code>EventEmitter</code>, fonction <code>pause</code> à appeler manuellement, etc.).</p> <p>Ryan Dahl liste quelques limitations connues de Deno :</p> <ul> <li>Deno est encore très jeune (2 ans) et va continuer à évoluer assez rapidement (là où Node.js est beaucoup plus stable) ;</li> <li>Deno fournit un module TypeScript de comptabilité avec les API de Node.js pour aider au portage, mais ce module est encore loin d’être complet et n’est pas suffisant en l’état pour profiter des nombreux paquets npm qui dépendent souvent de ces API ;</li> <li>les performances du serveur HTTP ne dépassent pas celles de Node.js (légèrement moins de requêtes par seconde mais une meilleure latence moyenne) ;</li> <li>le typage statique de TypeScript est très lent (une piste évoquée est de réécrire <code>tsc</code> en Rust) ;</li> <li>il n’y a pas encore d’interface stable pour permettre l’écriture de greffons ou d’extensions ;</li> <li>enfin, les usages et bonnes pratiques autour de Deno restent à découvrir.</li> </ul> </div><div><a href="https://linuxfr.org/news/sortie-de-deno-1-0.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/120439/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/sortie-de-deno-1-0#comments">ouvrir dans le navigateur</a> </p> Bruno Michel Davy Defaud ted Ysabeau 🧶 https://linuxfr.org/nodes/120439/comments.atom tag:linuxfr.org,2005:News/39835 2020-05-04T15:50:44+02:00 2020-05-07T17:58:09+02:00 Les travaux de Marijn Haverbeke Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Marijn Haverbeke est un développeur que j’apprécie beaucoup. Ses projets sont pour la plupart écrits en JavaScript, langage que j’apprécie habituellement que moyennement, mais la qualité de son code le rend plaisant à lire. Et c’est toujours très bien documenté ! Comme ses travaux n’ont pas encore eu beaucoup d’échos sur <em>LinuxFr.org</em>, je me propose de vous les présenter.</p> </div><ul><li>lien nᵒ 1 : <a title="https://marijnhaverbeke.nl/" hreflang="en" href="https://linuxfr.org/redirect/106228">La page personnelle de Marijn Haverbeke</a></li><li>lien nᵒ 2 : <a title="https://eloquentjavascript.net/" hreflang="en" href="https://linuxfr.org/redirect/106229">Eloquent JavaScript</a></li><li>lien nᵒ 3 : <a title="https://prosemirror.net/" hreflang="en" href="https://linuxfr.org/redirect/106230">ProseMirror</a></li><li>lien nᵒ 4 : <a title="https://codemirror.net/" hreflang="en" href="https://linuxfr.org/redirect/106231">CodeMirror</a></li><li>lien nᵒ 5 : <a title="https://lezer.codemirror.net/" hreflang="en" href="https://linuxfr.org/redirect/106232">Lezer</a></li><li>lien nᵒ 6 : <a title="https://marijnhaverbeke.nl/fund/" hreflang="en" href="https://linuxfr.org/redirect/106233">Financer ses travaux</a></li></ul><div><p>Commençons par <em><a href="https://eloquentjavascript.net/">Eloquent JavaScript</a></em>. C’est un ouvrage, dont la version en ligne est gratuite, qui enseigne le JavaScript. Il est régulièrement cité comme étant ce qui se fait de mieux pour les débutants qui veulent apprendre le JS.</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f61766174617273302e67697468756275736572636f6e74656e742e636f6d2f752f31333635393436313f733d31303026763d34/13659461?s=100&amp;v=4" alt="Logo de ProseMirror" title="Source : https://avatars0.githubusercontent.com/u/13659461?s=100&amp;v=4"></p> <p>ProseMirror est une boîte à outils pour construire des éditeurs Web de texte riche. En particulier, il inclut les fondations permettant de faire de l’édition collaborative. J’ai découvert ce projet lors du développement de cozy-notes (<em>cf.</em> la dépêche <a href="//linuxfr.org/news/des-nouvelles-de-cozy#toc-vos-id%C3%A9es-sont-pr%C3%A9cieuses-notezles">des nouvelles de Cozy</a>) et j’ai été impressionné par la qualité : <a href="https://prosemirror.net/docs/guide/">les concepts de base</a> sont bien expliqués, le code est modulaire et bien organisé, on sent une grande maîtrise du sujet, aussi bien sur les manipulations du DOM dans le navigateur que sur les aspects algorithmiques pour l’intégration automatique des changements lors de l’édition collaborative.</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f636f64656d6972726f722e6e65742f646f632f6c6f676f2e706e67/logo.png" alt="Logo de CodeMirror" title="Source : https://codemirror.net/doc/logo.png"></p> <p>CodeMirror est le pendant de ProseMirror pour le code : c’est un éditeur de code en ligne, avec coloration syntaxique, thèmes, auto‐complétion, recherche, intégration d’outils de « <em>lint</em> », etc. Il est utilisé par les outils de développement de votre navigateur et <a href="https://codemirror.net/doc/realworld.html">par beaucoup d’autres projets</a>.</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f6c657a65722e636f64656d6972726f722e6e65742f6373732f6c6f676f2e706e67/logo.png" alt="Logo de Lezer" title="Source : https://lezer.codemirror.net/css/logo.png"></p> <p>En parlant de CodeMirror, la version actuelle est la 5 et la version 6, en cours de développement, sera une réécriture complète. Parmi les nouveautés, il y aura une meilleure accessibilité, une prise en charge améliorée des écrans tactiles et une meilleure analyse du contenu. Pour cela, le projet Lezer a été développé. C’est un outil pour écrire des analyseurs (<em>parsers</em>).</p> <p>Vous vous souvenez peut‑être de Lex et Yacc. Là, c’est la même chose mais avec des objectifs liés à CodeMirror : déjà, le <em>parser</em> va être en JavaScript. Ensuite, on charge à minimiser le poids à télécharger pour le <em>parser</em>. Le <em>parser</em> doit également être rapide et pouvoir travailler de manière incrémentale. Enfin, il doit être tolérant aux erreurs : si une personne est en train de taper du code dans CodeMirror, ce serait dommage qu’elle ne puisse pas profiter de la coloration syntaxique tant qu’elle n’a pas fini l’instruction ou le bloc en cours.</p> <p>Lezer permet d’écrire un fichier <code>.grammar</code> qui représente la grammaire à analyser, avec des points d’entrée pour brancher du code JavaScript. Tout cela est ensuite transformé en analyseur JS qui pourra être utilisé dans CodeMirror ou ailleurs. À titre d’exemple, voici à quoi ressemble le fichier <code>.grammar</code> pour décrire la syntaxe JSON :</p> <pre><code class="ragel"><span class="o">@</span><span class="nv">top</span><span class="w"> </span><span class="nv">JsonText</span><span class="w"> </span><span class="p">{</span><span class="x"> value </span><span class="p">}</span><span class="w"></span> <span class="nv">value</span><span class="w"> </span><span class="p">{</span><span class="x"> True | False | Null | Number | String | Object | Array </span><span class="p">}</span><span class="w"></span> <span class="nv">String</span><span class="w"> </span><span class="p">{</span><span class="x"> string </span><span class="p">}</span><span class="w"></span> <span class="nv">Object</span><span class="w"> </span><span class="p">{</span><span class="x"> "{" list&lt;Property&gt;? "}" </span><span class="p">}</span><span class="w"></span> <span class="nv">Array</span><span class="w"> </span><span class="p">{</span><span class="x"> "[" list&lt;value&gt;? "]" </span><span class="p">}</span><span class="w"></span> <span class="nv">Property</span><span class="w"> </span><span class="p">{</span><span class="x"> PropertyName ":" value </span><span class="p">}</span><span class="w"></span> <span class="nv">PropertyName</span><span class="w"> </span><span class="p">{</span><span class="x"> string </span><span class="p">}</span><span class="w"></span> <span class="o">@</span><span class="nv">tokens</span><span class="w"> </span><span class="p">{</span><span class="x"></span> <span class="x"> True </span><span class="p">{</span><span class="x"> "true" </span><span class="p">}</span><span class="x"></span> <span class="x"> False </span><span class="p">{</span><span class="x"> "false" </span><span class="p">}</span><span class="x"></span> <span class="x"> Null </span><span class="p">{</span><span class="x"> "null" </span><span class="p">}</span><span class="x"></span> <span class="x"> Number </span><span class="p">{</span><span class="x"> '-'? int frac? exp? </span><span class="p">}</span><span class="x"></span> <span class="x"> int </span><span class="p">{</span><span class="x"> '0' | $[1-9] std.digit* </span><span class="p">}</span><span class="x"></span> <span class="x"> frac </span><span class="p">{</span><span class="x"> '.' std.digit+ </span><span class="p">}</span><span class="x"></span> <span class="x"> exp </span><span class="p">{</span><span class="x"> $[eE] $[+\-]? std.digit+ </span><span class="p">}</span><span class="x"></span> <span class="x"> string </span><span class="p">{</span><span class="x"> '"' char* '"' </span><span class="p">}</span><span class="x"></span> <span class="x"> char </span><span class="p">{</span><span class="x"> $[\u</span><span class="p">{</span><span class="x">20</span><span class="p">}</span><span class="x">\u</span><span class="p">{</span><span class="x">21</span><span class="p">}</span><span class="x">\u</span><span class="p">{</span><span class="x">23</span><span class="p">}</span><span class="x">-\u</span><span class="p">{</span><span class="x">5b</span><span class="p">}</span><span class="x">\u</span><span class="p">{</span><span class="x">5d</span><span class="p">}</span><span class="x">-\u</span><span class="p">{</span><span class="x">10ffff</span><span class="p">}</span><span class="x">] | "\" esc }</span> <span class="x"> esc { $["\/bfnrt] | "u" hex hex hex hex </span><span class="p">}</span><span class="x"></span> <span class="x"> hex </span><span class="p">{</span><span class="x"> $[0-9a-fA-F] </span><span class="p">}</span><span class="x"></span> <span class="x"> whitespace </span><span class="p">{</span><span class="x"> $[ \n\r\t] </span><span class="p">}</span><span class="x"></span> <span class="p">}</span><span class="w"></span> <span class="o">@</span><span class="nv">skip</span><span class="w"> </span><span class="p">{</span><span class="x"> whitespace </span><span class="p">}</span><span class="w"></span> <span class="nv">list</span><span class="err">&lt;</span><span class="nv">item</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="x"> item ("," item)* </span><span class="p">}</span><span class="w"></span> <span class="o">@</span><span class="nv">detectDelim</span><span class="w"></span></code></pre> <p>Pour finir, si vous appréciez comme moi les travaux de Marijn Haverbeke, vous pouvez financer leur maintenance via un don sur <a href="https://marijnhaverbeke.nl/fund/">https://marijnhaverbeke.nl/fund/</a>.</p> </div><div><a href="https://linuxfr.org/news/les-travaux-de-marijn-haverbeke.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/120300/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/les-travaux-de-marijn-haverbeke#comments">ouvrir dans le navigateur</a> </p> Bruno Michel Xavier Teyssier Davy Defaud https://linuxfr.org/nodes/120300/comments.atom tag:linuxfr.org,2005:News/38953 2019-01-08T18:44:06+01:00 2019-01-08T18:44:06+01:00 Illico Editor : rétrospective 2017-2018 Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>En quelques mots, <strong>Illico Editor</strong> est un <em>couteau suisse de la qualification de données</em> qui :</p> <ul> <li>s’adresse à tous et à toutes (pas uniquement à des experts en informatique) ;</li> <li>simplifie le nettoyage de données (corriger, restructurer des données issues d’un tableur, d’une base de données, d’une application métier) ;</li> <li>simplifie leur exploitation (indicateurs statistiques simples ou complexes, lister, filtrer, enrichir ou croiser avec d’autres sources, etc.).</li> </ul> <p>L’application a été entièrement revisitée en 2017 et 2018 pour créer une nouvelle expérience utilisateur…</p> </div><ul><li>lien nᵒ 1 : <a title="http://illico.tuxfamily.org/" hreflang="fr" href="https://linuxfr.org/redirect/103248">Site officiel</a></li><li>lien nᵒ 2 : <a title="https://linuxfr.org/news/oui-illico" hreflang="fr" href="https://linuxfr.org/redirect/103298">Dépêche LinuxFr.org d’avril 2017 : présentation détaillée et usages</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li><a href="#toc-philosophie">Philosophie</a></li> <li><a href="#toc-les-nouveaut%C3%A9s">Les nouveautés</a></li> <li> <a href="#toc-1-interface-utilisateur">1. Interface utilisateur</a><ul> <li><a href="#toc-11-concepts">1.1 Concepts</a></li> <li> <a href="#toc-12-pour-illustrer">1.2 Pour illustrer</a><ul> <li><a href="#toc-menu-et-chargement-de-csv">Menu et chargement de CSV</a></li> <li><a href="#toc-recherche-de-doublons">Recherche de doublons</a></li> </ul> </li> <li><a href="#toc-13-exportations">1.3 Exportations</a></li> <li><a href="#toc-14-journal-de-bord">1.4 Journal de bord</a></li> <li> <a href="#toc-15-restitutions-dans-de-nouveaux-onglets">1.5 Restitutions dans de nouveaux onglets</a><ul> <li><a href="#toc-exportation-de-donn%C3%A9es">Exportation de données</a></li> <li><a href="#toc-tableaux-de-synth%C3%A8se">Tableaux de synthèse</a></li> </ul> </li> </ul> </li> <li><a href="#toc-2-accessibilit%C3%A9-du-code-source">2. Accessibilité du code source</a></li> <li><a href="#toc-3-documentation-utilisateur-et-tutoriels">3. Documentation utilisateur et tutoriels</a></li> <li> <a href="#toc-4-nouvelles-transformations">4. Nouvelles transformations</a><ul> <li> <a href="#toc-colonnes">Colonnes</a><ul> <li><a href="#toc-recr%C3%A9er-une-filiation-relation-parentenfant">Recréer une filiation (relation parent‐enfant)</a></li> </ul> </li> <li> <a href="#toc-lignes">Lignes</a><ul> <li><a href="#toc-compacter-les-lignes-agr%C3%A9gats-calculs-listes">Compacter les lignes (agrégats : calculs, listes)</a></li> <li><a href="#toc-d%C3%A9caler-vers-le-haut-ou-le-bas">Décaler vers le haut ou le bas</a></li> </ul> </li> <li> <a href="#toc-valeurs-en-liste-agr%C3%A9gats-et-combinaisons">Valeurs en liste : agrégats et combinaisons</a><ul> <li><a href="#toc-calculer-un-ratio-de-similarit%C3%A9-entre-deux-listes-de-valeurs">Calculer un ratio de similarité entre deux listes de valeurs</a></li> </ul> </li> <li> <a href="#toc-agr%C3%A9gats">Agrégats</a><ul> <li><a href="#toc-conversion-dans-un-syst%C3%A8me-de-comptage-mixte">Conversion dans un système de comptage mixte</a></li> </ul> </li> <li> <a href="#toc-intervalles">Intervalles</a><ul> <li><a href="#toc-recherche-dune-valeur-dans-un-intervalle">Recherche d’une valeur dans un intervalle</a></li> <li><a href="#toc-combiner-deux-intervalles">Combiner deux intervalles</a></li> </ul> </li> </ul> </li> <li><a href="#toc-autre-nouveaut%C3%A9-nouvelle-ann%C3%A9e">Autre nouveauté : nouvelle année…</a></li> </ul> <h2 id="toc-philosophie">Philosophie</h2> <p>Illico…</p> <ul> <li>suit la philosophie ASAP (<em>As Simple As Possible</em>) ;</li> <li>mixe <em>HTML 5</em>, <em>JS</em>, <em>CSS 3</em> ;</li> <li>ne requiert ni installation, ni code tiers, ni serveur Web ou de base de données ;</li> <li>est publié sous licence GPL.</li> </ul> <p>et s’utilise :</p> <ul> <li>en ligne sur le site officiel : <a href="http://illico.tuxfamily.org">http://illico.tuxfamily.org</a> ;</li> <li>en local, en téléchargeant un ZIP (qui contient la copie du site Web).</li> </ul> <h2 id="toc-les-nouveautés">Les nouveautés</h2> <p>Depuis la précédente dépêche d’avril 2017, plus de vingt versions d’Illico ont été publiées.</p> <p>Les améliorations portent sur trois aspects majeurs :</p> <ul> <li> <strong>l’interface utilisateur</strong> ;</li> <li> <strong>la performance et accessibilité</strong> (couverture documentaire) du code ;</li> <li> <strong>l’aide aux utilisateurs</strong> : qualité de la documentation utilisateur et des tutoriels.</li> </ul> <p>En plus du périmètre fonctionnel :</p> <ul> <li> <strong>nouvelles fonctionnalités ou transformations de données</strong> ;</li> <li>corrections ;</li> <li>nouvelles options et paramètres.</li> </ul> <p>Les aspects majeurs et les nouvelles fonctionnalités sont présentés ci‐dessous.</p> <h2 id="toc-1-interface-utilisateur">1. Interface utilisateur</h2> <h3 id="toc-11-concepts">1.1 Concepts</h3> <p>L’interface utilisateur a été réécrite pour :</p> <ul> <li> <strong>s’adapter à la généralisation des écrans de plus grande taille</strong> : présentation plus claire des paramètres : <ul> <li>libellés des paramètres,</li> <li>positionnement des champs et paramètres ;</li> </ul> </li> <li> <strong>regrouper les fonctionnalités de manière cohérente</strong> : <ul> <li>chargements de données,</li> <li>transformations et fonctions d’analyse,</li> <li>préférences utilisateur ;</li> </ul> </li> <li> <strong>préférer des mécanismes standards HTML/JS/CSS</strong> pour alléger le code et simplifier la maintenance : <ul> <li>info-bulles,</li> <li>règles CSS,</li> <li>réduire l’usage des tableaux HTML ;</li> </ul> </li> <li> <strong>faciliter la navigation de l’IHM vers la documentation</strong> : <ul> <li>pour chaque groupe de transformation, un lien pointe vers la documentation correspondante ;</li> </ul> </li> <li> <strong>utiliser un thème visuel plus agréable</strong>.</li> </ul> <h3 id="toc-12-pour-illustrer">1.2 Pour illustrer</h3> <h4 id="toc-menu-et-chargement-de-csv">Menu et chargement de CSV</h4> <p><img src="//img.linuxfr.org/img/687474703a2f2f696c6c69636f2e74757866616d696c792e6f72672f63617074757265732f6368617267656d656e742e706e67/chargement.png" alt="Menu et chargement de CSV" title="Source : http://illico.tuxfamily.org/captures/chargement.png"></p> <h4 id="toc-recherche-de-doublons">Recherche de doublons</h4> <p><img src="//img.linuxfr.org/img/687474703a2f2f696c6c69636f2e74757866616d696c792e6f72672f63617074757265732f646f75626c6f6e732e706e67/doublons.png" alt="rechercher des doublons" title="Source : http://illico.tuxfamily.org/captures/doublons.png"></p> <h3 id="toc-13-exportations">1.3 Exportations</h3> <p>Les exportations — <em>nom de l’onglet ou nom du fichier</em> — sont désormais systématiquement horodatées.</p> <h3 id="toc-14-journal-de-bord">1.4 Journal de bord</h3> <p>Le journal de bord consigne toutes les transformations avec leurs paramètres et les résultats : nombre de valeurs modifiées, nouveau nombre de colonnes, etc.</p> <p>Désormais, le journal de bord consigne également le nom des exportations CSV, ce qui permet d’un coup d’œil d’évaluer l’état des données de telle ou telle exportation ou sauvegarde.</p> <p><img src="//img.linuxfr.org/img/687474703a2f2f696c6c69636f2e74757866616d696c792e6f72672f63617074757265732f686973746f72697175652e706e67/historique.png" alt="Journal de bord" title="Source : http://illico.tuxfamily.org/captures/historique.png"></p> <h3 id="toc-15-restitutions-dans-de-nouveaux-onglets">1.5 Restitutions dans de nouveaux onglets</h3> <p>Le visuel a été retravaillé pour :</p> <ul> <li>le journal de bord ;</li> <li>les exportations de données ;</li> <li>les exportations de tableaux de synthèse.</li> </ul> <h4 id="toc-exportation-de-données">Exportation de données</h4> <p><img src="//img.linuxfr.org/img/687474703a2f2f696c6c69636f2e74757866616d696c792e6f72672f63617074757265732f6578706f72745f68746d6c2e706e67/export_html.png" alt="Exportation de données" title="Source : http://illico.tuxfamily.org/captures/export_html.png"> <em>Numérotation des lignes et colonnes + guide visuel sous le curseur (ligne grisée)</em></p> <h4 id="toc-tableaux-de-synthèse">Tableaux de synthèse</h4> <p>Ce module est équivalent au fait d’enchaîner plusieurs tableaux croisés dynamiques.</p> <p><img src="//img.linuxfr.org/img/687474703a2f2f696c6c69636f2e74757866616d696c792e6f72672f63617074757265732f6578706c6f726174696f6e5f646f6e6e25633325613965732e706e67/exploration_donn%c3%a9es.png" alt="exploration de données" title="Source : http://illico.tuxfamily.org/captures/exploration_donn%c3%a9es.png"> <em>Les boutons (=&gt;) permettent de récupérer le tableau de synthèse (données agrégées) ou les données détaillées.</em></p> <h2 id="toc-2-accessibilité-du-code-source">2. Accessibilité du code source</h2> <p>Plusieurs revues de code ont permis d’améliorer :</p> <ul> <li>la <strong>documentation JSDoc</strong> : en moyenne 100 lignes d’instructions strictes (sans compter les lignes vides) sont expliquées par 24 lignes de commentaires ; soit en moyenne une ligne de commentaire toutes les quatre LOC ;</li> <li>les <strong>algorithmes</strong> : simplification ;</li> <li> <strong>les conventions de nommage</strong> : noms de variables et des fonctions ;</li> <li> <strong>l’empreinte mémoire</strong> : minimisation la taille des variables intermédiaires ;</li> <li> <strong>l’utilisation de mécanismes natifs CSS</strong> : remplacement de code JS par du code CSS lorsque c’était possible ;</li> <li>la <strong>gestion de jeu de données volumineux</strong> : exportations de données via l’objet JS <code>Blob</code>.</li> </ul> <p><em>Pour rappel, les indicateurs de qualité (JSLint, longueurs des fonctions, etc.) sont recalculés à chaque version et consultables au chapitre <strong>Architecture</strong>.</em></p> <h2 id="toc-3-documentation-utilisateur-et-tutoriels">3. Documentation utilisateur et tutoriels</h2> <p>Les textes et captures d’écran de la documentation utilisateur ont été revus et corrigés en cohérence avec la nouvelle interface graphique. Les tutoriels ont été relus/réécrits/corrigés.</p> <h2 id="toc-4-nouvelles-transformations">4. Nouvelles transformations</h2> <h3 id="toc-colonnes">Colonnes</h3> <h4 id="toc-recréer-une-filiation-relation-parentenfant">Recréer une filiation (relation parent‐enfant)</h4> <p>Dans un jeu de données avec deux colonnes <em>parent‐enfant</em> : retrace <em>une</em> filiation parent, grands‐parents, etc., pour chaque enfant.</p> <h3 id="toc-lignes">Lignes</h3> <h4 id="toc-compacter-les-lignes-agrégats-calculs-listes">Compacter les lignes (agrégats : calculs, listes)</h4> <p>Résume à une seule ligne plusieurs lignes qui ont un même identifiant. En fonction des options, les données sont soit écrasées (celles de la première occurrence prévaut) soit agrégées (somme, liste de valeurs, etc.).</p> <h4 id="toc-décaler-vers-le-haut-ou-le-bas">Décaler vers le haut ou le bas</h4> <p>Décale toutes les valeurs d’une colonne vers le haut ou le bas, en suivant (selon l’option sélectionnée) une autre colonne d’identifiants. Comportement proche de la fonction <em>LAG</em> du logiciel SAS.</p> <h3 id="toc-valeurs-en-liste-agrégats-et-combinaisons">Valeurs en liste : agrégats et combinaisons</h3> <h4 id="toc-calculer-un-ratio-de-similarité-entre-deux-listes-de-valeurs">Calculer un ratio de similarité entre deux listes de valeurs</h4> <p>Pour deux colonnes décrivant à chaque ligne des listes de valeurs (séparées par un espace, une virgule, etc.), indique le ratio de similarité. Par exemple, « 4/6 » indique que sur six éléments, quatre éléments sont en communs, indépendamment de leur ordre.</p> <h3 id="toc-agrégats">Agrégats</h3> <h4 id="toc-conversion-dans-un-système-de-comptage-mixte">Conversion dans un système de comptage mixte</h4> <p>Convertit les valeurs d’une colonne dans un système de comptage (jusqu’à sept niveaux). Par exemple :</p> <ul> <li>convertir des secondes en : nombre de semaines + nombre de jours + nombre d’heures, etc. ;</li> <li>convertir un stock en : nombre de palettes, de caisses, de camions, etc.</li> </ul> <h3 id="toc-intervalles">Intervalles</h3> <h4 id="toc-recherche-dune-valeur-dans-un-intervalle">Recherche d’une valeur dans un intervalle</h4> <p>Pour deux colonnes décrivant un intervalle et une colonne de données, indique à chaque ligne si la donnée est située avant, après ou incluse dans l’intervalle.</p> <h4 id="toc-combiner-deux-intervalles">Combiner deux intervalles</h4> <p>Produit une combinaison de deux intervalles :</p> <ul> <li>union : intervalle englobant les deux ;</li> <li>intersection : plus petit intervalle commun.</li> </ul> <h2 id="toc-autre-nouveauté-nouvelle-année">Autre nouveauté : nouvelle année…</h2> <p>Bonne et heureuse année 2019 !</p> </div><div><a href="https://linuxfr.org/news/illico-editor-retrospective-2017-2018.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/115930/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/illico-editor-retrospective-2017-2018#comments">ouvrir dans le navigateur</a> </p> asky Davy Defaud palm123 Pierre Jarillon https://linuxfr.org/nodes/115930/comments.atom tag:linuxfr.org,2005:News/37896 2017-04-10T10:22:39+02:00 2017-04-10T14:48:07+02:00 Oui, Illico ! Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><blockquote> <p><em>Toute ressemblance avec des personnes existantes ou ayant existé est purement fortuite.</em><br> &gt; Dis Arnaud, tu n’aurais pas un outil magique pour m’aider à nettoyer mes données et m’éviter d’y passer <s>ma journée</s> <s>ma soirée</s> mon week‐end ? :(<br> &gt; Si, Illico !</p> </blockquote> <p>En très court, Illico propose un catalogue de fonctionnalités prêtes à l’emploi, génériques (paramétrables) pour <a href="https://fr.wikipedia.org/wiki/Nettoyage_de_donn%C3%A9es">améliorer la qualité des données</a>.</p> <h2 id="et-en-une-minute-illico-cest-quoi">Et en une minute, Illico, c’est quoi ?</h2> <p><strong>Illico Editor</strong> est un couteau suisse de la qualification de données, en JS/HTML, publié sous licence GPL v3. L’outil s’adresse à tous et toutes (et pas uniquement à des expert·e·s informatiques) et permet de manipuler, corriger, re‐structurer des données en quelques clics. Par exemple, des données issues d’un tableur, d’une base de données, d’une application métier, etc., que l’on souhaite corriger ou pour lesquelles on souhaite établir des indicateurs statistiques simples ou complexes, lister et filtrer ces données, les enrichir avec d’autres sources, etc.</p></div><ul><li>lien nᵒ 1 : <a title="http://illico.tuxfamily.org" hreflang="fr" href="https://linuxfr.org/redirect/99516">site Web</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li> <a href="#questce-que-%C3%A7a-peut-mapporter">Qu’est‐ce que ça peut m’apporter ?</a><ul> <li><a href="#durant-la-phase-dexploration-de-donn%C3%A9es-analyse">durant la phase d'exploration de données (analyse)</a></li> <li><a href="#durant-la-phase-de-correction">durant la phase de correction</a></li> <li><a href="#durant-la-phase-de-restitution">durant la phase de restitution</a></li> <li><a href="#en-g%C3%A9n%C3%A9ral-exemples">en général (exemples)</a></li> </ul> </li> <li> <a href="#pourquoi-un-outil-de-plus">Pourquoi un outil de plus ?</a><ul> <li><a href="#le-constat">le constat</a></li> <li><a href="#la-solution-th%C3%A9orique">la solution théorique</a></li> <li><a href="#illico--un-outil-ou-une-approche">Illico : un outil ou une approche ?</a></li> </ul> </li> <li> <a href="#en-pratique-%C3%A7a-se-passe-comment">En pratique, ça se passe comment ?</a><ul> <li><a href="#livr%C3%A9-cl%C3%A9-en-main">livré clé en main</a></li> <li><a href="#le-moins-d%C3%A9tapes-possibles">le moins d'étapes possibles</a></li> <li><a href="#un-petit-aper%C3%A7u">un petit aperçu</a></li> </ul> </li> <li> <a href="#illico-en-r%C3%A9sum%C3%A9">Illico, en résumé</a><ul> <li><a href="#fonctionnalit%C3%A9s-utilisateur">fonctionnalités utilisateur</a></li> <li><a href="#code-source">code source</a></li> <li><a href="#%C3%A0-propos-du-code-source-js">à propos du code-source JS</a></li> </ul> </li> <li> <a href="#cas-concrets-dutilisation">Cas concrets d'utilisation</a><ul> <li><a href="#tableaux-crois%C3%A9s-dynamiques">tableaux croisés dynamiques</a></li> <li><a href="#donn%C3%A9es-dannuaire">données d'annuaire</a></li> <li><a href="#normalisation"> normalisation</a></li> <li><a href="#v%C3%A9rifier-des-donn%C3%A9es-avant-de-les-charger-en-base">vérifier des données avant de les charger en base</a></li> <li><a href="#pr%C3%A9parer-des-jointures">préparer des jointures</a></li> <li><a href="#pr%C3%A9parer-des-donn%C3%A9es-multi-lignes">préparer des données multi-lignes</a></li> </ul> </li> </ul><h2 id="questce-que-ça-peut-mapporter">Qu’est‐ce que ça peut m’apporter ?</h2> <p>À l’usage, les gains de temps observés se situent à plusieurs niveaux :</p> <h3 id="durant-la-phase-dexploration-de-données-analyse">durant la phase d'exploration de données (analyse)</h3> <p>Les acteurs métiers (comptabilité, RH, administratif, etc.) sont autonomes durant cette phase ; sans Illico, les collègues de l'informatique devaient jusqu'à présent leur développer des routines (macro, scripts, programme dédié) de corrections de données ou de transformation de la structure des données comme des pivots de colonnes/lignes.<br> Ces développements sont souvent trop en lien avec la structure des données ou avec le langage de programmation fétiche du développeur et à chaque nouveau chantier qualité de données il fallait re-développer (parfois dans une autre techno).</p> <p>Généralement juste ajouter une nouvelle colonne imposait de vérifier toutes les routines : c'était très sensible aux données et au final assez laborieux.</p> <p>S'il s'agit d'un projet de reprise de données (exemple : export d'une base de données, nettoyage puis ré-importation), des fonctionnalités très typées <em>base de données</em> (champs null, valeurs uniques, longueurs des champs, normalisation selon Merise, etc.) sont présentes dans Illico.</p> <h3 id="durant-la-phase-de-correction">durant la phase de correction</h3> <p>Les acteurs métiers peuvent corriger en masse dans Illico et le résultat sera exporté dans un fichier CSV (ou par un copier-coller global vers un tableur). On évite ainsi de manipuler des données de production et aussi de devoir créer un environnement de test juste pour permettre aux utilisateurs de vérifier/corriger leurs données.</p> <p>Illico produit un journal de bord, une sorte de documentation auto-générée par l'outil.<br> Une fois que les acteurs métiers ont réalisé un premier nettoyage et que des équipes informatiques doivent implémenter/automatiser les mêmes étapes (dans un ETL, un sas de nettoyage de données, etc.), Illico et le journal de bord deviennent une aide précieuse pour tester rapidement la qualité de l'implémentation.</p> <h3 id="durant-la-phase-de-restitution">durant la phase de restitution</h3> <p>Illico permet de produire des tableaux de synthèse (exemple tableaux croisés dynamiques à plusieurs niveaux de profondeur), </p> <h3 id="en-général-exemples">en général (exemples)</h3> <p>Vous connaissez sûrement ces situations :</p> <ul> <li>pour un nouveau projet informatique, on a besoin de transformer des données d'un format à un autre dans la phase de chargement initial de données ;</li> <li>pour tout projet de refonte d'application avec reprise des données, on cherche à passer d'un format source à un format cible (exemple : la structure de la base de données relationnelles est différente) ;</li> <li>dans le cas de préparation d'un annuaire ou d'une liste d'individus à contacter (préparation d'un publipostage, ou mass-mailing), on veut harmoniser la présentation des informations (majuscules etc.) ;</li> <li>dans les métiers supports (administratif, RH, compta, etc.), on souhaite créer une liste d'individus (liste des promouvables, liste des personnes à évaluer, liste des personnes éligibles, etc.) en appliquant successivement plusieurs règles métiers d'ajout/soustraction : <ul> <li>liste de départ : <em>tout le monde</em> ;</li> <li>on filtre : on conserve <em>ceux qui ont droit</em> ;</li> <li>on soustrait : <em>ceux qui ont déjà eu</em> ;</li> <li>on ajoute : <em>ceux qui n'ont pas pu avoir</em> ;</li> <li>on soustrait : <em>ceux qui partiront avant la date d'effet</em> ;</li> <li>on rajoute : <em>ceux qui arriveront d'ici la date d'effet</em>.</li> </ul> </li> </ul><p>Sans outil, ce type de gymnastique peut devenir très chronophage.</p> <h2 id="pourquoi-un-outil-de-plus">Pourquoi un outil de plus ?</h2> <h3 id="le-constat">le constat</h3> <p>Quel que soit votre métier et votre besoin, il vous faudra une excellente connaissance des données ET un outil particulièrement accessible et souple. Mais quel outil ? un tableur, une base de données, une base du type Access, Kexi ou FileMaker, un script, une nouvelle application dédiée ? …<br> Existe-il un outil qui couvre tous les types d'actions ? ou un-e collègue qui connaisse tous les outils/techno qui pourrait servir ici ? et qui soit disponible pour vous aider ?</p> <p>Faut-il faire monter en compétence les acteurs métiers à des outils techniques (SQL ? macro VBA ?) ou former les programmeurs à des problématiques métiers ? À l'exception des administrateurs technico-fonctionnels, avoir une double expertise ne semble pas très pertinent (surtout si l'expert-comptable ne se sert du SQL que 2 fois dans l'année).</p> <p>Est-ce un problème insoluble ?</p> <h3 id="la-solution-théorique">la solution théorique</h3> <p>La solution paraît simple sur le papier :</p> <ul> <li>apporter un outil <strong>accessible aux utilisateurs métiers</strong> pour s'affranchir d'un coût d'apprentissage technique très conséquent ;</li> <li>(pour faire simple) que cet outil soit aussi <strong>efficace</strong> qu'un développeur/adminDB.</li> </ul><h3 id="illico--un-outil-ou-une-approche">Illico : un outil ou une approche ?</h3> <p>Il existe actuellement des outils très pertinents pour aider au nettoyage des données. Certains peuvent s'avérer assez lourds (licence, techno, machine puissante, dépendances) ou juste inconnus/hors de portée des acteurs métiers qui en ont besoin.</p> <p>Illico tente de pallier à cela dans une approche originale où toutes les fonctionnalités se présentent de la même manière et demandent (selon les paramètres, et en moyenne) entre 2 et 4 clics.</p> <p>Par exemple, les actions suivantes se réalisent de la même façon :</p> <ul> <li>faire un pivot complexe ;</li> <li>mixer des colonnes A et B avec une règle spécifique (exemple : prendre la valeur de B quand celle de A est vide sinon prendre celle de A) ;</li> <li>visualiser un tableau croisé dynamique ;</li> <li>traiter des données en liste (dans une même cellule/case) ;</li> <li>faire un pivot ou mettre une colonne en majuscule ;</li> <li>supprimer les lignes vides.</li> </ul><p>Il n'y a en réalité pas de raison pour que mettre une colonne en minuscule soit plus simple à <em>programmer</em> que faire une <a href="https://fr.wikipedia.org/wiki/Diff%C3%A9rence_sym%C3%A9trique">différence symétrique</a> entre deux sources de données. À l'oral, il faut 2-3 secondes de plus pour l'exprimer ? eh bien dans Illico, ce sera 2-3 clics supplémentaires, pas plus !</p> <h2 id="en-pratique-ça-se-passe-comment">En pratique, ça se passe comment ?</h2> <h3 id="livré-clé-en-main">livré clé en main</h3> <p>Vous pouvez tester ou utiliser la version en ligne (les données ne quittent pas votre poste) ou la télécharger en local :</p> <ol> <li>téléchargez ;</li> <li>décompressez ;</li> <li>ouvrez la page index.html (c'est une copie conforme du site officiel qui inclut la documentation et le tutoriel de prise en main) ;</li> <li>cliquez sur « accès direct », vous y êtes.</li> </ol><p>Vous pouvez consulter la documentation utilisateur complète avec des exemples ou tout simplement suivre le tutoriel de prise en main (qui comprend un fichier d'exemple).</p> <h3 id="le-moins-détapes-possibles">le moins d'étapes possibles</h3> <p>Dans Illico, il n'y a pas d'étapes préliminaires de description du format de la source de données (nombre de colonnes, types de données, etc.).</p> <ol> <li>Vous copier-collez vos données depuis un tableur ou vous importez un fichier CSV et dans les deux cas le séparateur de colonne est automatiquement détecté (vous pouvez le forcer au besoin) ;</li> <li>vous appliquez une transformation ;</li> <li>vous analysez le nouvel état des données ;</li> <li>vous exportez, annulez ou poursuivez avec une autre transformation.</li> </ol><h3 id="un-petit-aperçu">un petit aperçu</h3> <p><strong>le domaine de valeur</strong></p> <p>Équivalent à un tableau croisé dynamique sur 1 dimension avec total et ratio… en 1 clic.</p> <p><img src="//img.linuxfr.org/img/687474703a2f2f696c6c69636f2e74757866616d696c792e6f72672f63617074757265732f646f6d61696e655f76616c6575722e706e67/domaine_valeur.png" alt="domaine de valeur sur une liste d'individus" title="Source : http://illico.tuxfamily.org/captures/domaine_valeur.png"></p> <p>Le tableau de synthèse est exportable au format HTML ou CSV.</p> <p><strong>l'analyse et traitement des doublons</strong></p> <p><img src="//img.linuxfr.org/img/687474703a2f2f696c6c69636f2e74757866616d696c792e6f72672f63617074757265732f646f75626c6f6e732e706e67/doublons.png" alt="plusieurs traitements possibles : filtrer, exclure, marquer, analyser" title="Source : http://illico.tuxfamily.org/captures/doublons.png"></p> <p>Il est possible d'identifier les doublons sur plusieurs colonnes (le même nom, les mêmes nom et prénom, les mêmes nom et prénom et email, etc.).</p> <p>Au choix, le traitement des doublons sera de les :</p> <ul> <li>filtrer (conserver) ;</li> <li>exclure (suppression) ;</li> <li>marquer (ajoute une colonne en début de tableau avec un identifiant pour chaque groupe de doublons) ;</li> <li>marquer et filtrer ;</li> <li>analyser (tableau de synthèse).</li> </ul><p><strong>exploration de données</strong></p> <p>Enchaînements de tableaux croisés dynamiques</p> <p>On compte le nombre de vacations :</p> <ul> <li>par service (axe <em>service</em>) ;</li> <li>puis lorsque l'on clique sur le service, un second tableau la répartition des vacations par individu (axe <em>contact</em>).</li> </ul><p>À chaque tableau de synthèse, le jeu de données correspondant est exportable HTML ou CSV ainsi que le tableau de synthèse.</p> <p><img src="//img.linuxfr.org/img/687474703a2f2f696c6c69636f2e74757866616d696c792e6f72672f63617074757265732f6578706c6f726174696f6e5f646f6e6e25633325613965732e706e67/exploration_donn%c3%a9es.png" alt="liste de vacations indiquant le service et la personne" title="Source : http://illico.tuxfamily.org/captures/exploration_donn%c3%a9es.png"></p> <h2 id="illico-en-résumé">Illico, en résumé</h2> <h3 id="fonctionnalités-utilisateur">fonctionnalités utilisateur</h3> <ul> <li>import CSV : UTF-8 ou ISO-8859-1 ;</li> <li>export CSV : UTF-8 (+ BOM) ;</li> <li>import/export par copier-coller ;</li> <li>possibilité d'annuler la dernière transformation ;</li> <li>journal de bord intégré (qui indique aussi les actions annulées) ;</li> <li>plus de 100 transformations de données : <ul> <li>analyser : formats de données, tri à plat ;</li> <li>croiser, enrichir ou exclure depuis deux sources ;</li> <li>modifier en masse ou selon des conditions ;</li> <li>opérations sur des listes (plusieurs valeurs dans une même cellule/case) ;</li> <li>convertir des formats ;</li> <li>rapprocher : accents, suppression des "blancs" (trim), distance d'édition ;</li> <li>filtrer, dédoublonner, échantillonner ;</li> <li>agréger, explorer : tableaux croisés dynamiques ;</li> <li>pivoter, transposer ;</li> <li>et bien d'autres !</li> </ul> </li> </ul><h3 id="code-source">code source</h3> <ul> <li>environ 10 000 lignes de LOC strictes (HTML/JS) ;</li> <li>code-source JS principal = 1/3 de commentaires, 2/3 d'instructions ;</li> <li>environ 280 fonctions JS ;</li> <li>0 dépendance/bibliothèque/code-tiers ;</li> <li>le code est vérifié sous JSHint.</li> </ul><h3 id="à-propos-du-code-source-js">à propos du code-source JS</h3> <ul> <li>rares dépendances entre les fonctions (limite les effets de bord) ;</li> <li>la quasi-totalité des algorithmes sont basés sur des parcours de tableaux ;</li> <li>le code-source JS suit une convention de nommage des variables en fonction de leur usage (i j k pour un compteur, v pour une valeur du tableau de données (String), t pour un texte plutôt long, n pour un nombre, e pour un élément HTML, a pour un array, etc.).</li> </ul><pre><code>// quand on lit a[i] // a représente un array simple (i est un numérique) </code></pre> <pre><code>// quand on lit a[v] // a représente un array associatif (v est une chaîne). </code></pre> <p>Ce qui permet à la lecture de toujours savoir sur quel type d'objet on est.</p> <p>Et les variables les moins utilisées ont des noms plus explicites.</p> <p>Les algorithmes assez courts + la convention de nommage + des fonctions cloisonnées permettent de visualiser les 3/4 des fonctions dans la hauteur de l'écran sans scroller (40 LOC pour un 15").</p> <p><em>Nota bene</em> : les revues de code sont l'occasion soit de clarifier la convention soit de rectifier les noms des variables dans le code source respecter au mieux la convention.</p> <p>La convention est indiquée dans la rubrique <a href="http://illico.tuxfamily.org/doc/build/html/dev/archi.html">architecture</a> de la documentation.</p> <h2 id="cas-concrets-dutilisation">Cas concrets d'utilisation</h2> <h3 id="tableaux-croisés-dynamiques">tableaux croisés dynamiques</h3> <p>Un logiciel métier RH (ressources humaines) exporte un listing des situations des agents mais d'une façon qui ne permet pas d'utiliser des tableaux croisés dynamiques ;<br> Illico permet de basculer des colonnes, des groupes de colonnes en autant de lignes (pivot) pour se retrouver sur un format plus facile à utiliser.</p> <h3 id="données-dannuaire">données d'annuaire</h3> <p>Un export d'un annuaire fournit des coordonnées sous la forme</p> <pre><code>Mr X | téléphone : 0123456789, fax : 032165478 Mme Y | email : [email protected], téléphone : 0546789123 </code></pre> <p>Illico permet, en une opération, de transformer les coordonnées en trois colonnes : téléphone, fax, email, quelque soit l'ordre des informations qui y figuraient.</p> <h3 id="normalisation"> normalisation</h3> <p>Pour préparer une base de données relationnelles, on a au départ un grand fichier de données et il faut créer les identifiants (clé primaire/étrangère) pour les relations entre les deux tables. Illico va <a href="https://fr.wikipedia.org/wiki/Forme_normale_(bases_de_donn%C3%A9es_relationnelles)">normaliser</a> (normalisation <a href="https://fr.wikipedia.org/wiki/Merise_(informatique)">Merise</a>) les données et préparer un identifiant).</p> <p>En une opération, Illico remplace les valeurs par les identifiants et affiche la table de correspondance.</p> <h3 id="vérifier-des-données-avant-de-les-charger-en-base">vérifier des données avant de les charger en base</h3> <p>Avant de charger un csv dans une base de données, on cherche souvent à vérifier la longueur des champs, si les valeurs sont uniques, si le type alpha ou numérique est bien respecté, les valeurs minimum et maximum pour des numériques, etc. Illico permet de vérifier cela en un seul clic.</p> <p>Une autre fonctionnalité supprime les lignes qui ne contiennent aucune valeur pour certaines colonnes. Cela évite de charger des données en base de données et d'avoir des rejets lors de l'import ou plus exactement, cela permet de détecter <strong>en amont de l'import</strong> toutes les lignes qui vont être rejetées.</p> <h3 id="préparer-des-jointures">préparer des jointures</h3> <p>Lors d'une jointure (croisement) entre deux sources de données A et B par exemple deux tables d'une base de données relationnelle, il est difficile de connaître rapidement les données de A qui ne sont pas dans B et en même temps celles de B qui ne sont pas dans A.</p> <p>À partir de deux fichiers CSV (A et B), Illico produit un tableau de synthèse avec ces informations et permet de choisir la jointure que l'on souhaite réaliser.</p> <p>Cela permet aussi de détecter <strong>avant la jointure</strong> les cardinalités entre les deux sources. Par exemple on s'attend à trouver uniquement du 1-1 entre deux sources. Et quand on simule, on observe avec la simulation du 1-0 (des valeurs de A sont absentes de B), du 1-1 (des valeurs de A se retrouvent dans B) et du 1-n (des valeurs de A se retrouvent à plusieurs reprises dans B).</p> <h3 id="préparer-des-données-multi-lignes">préparer des données multi-lignes</h3> <p>Pour constituer un annuaire agréable à consulter, on peut partir d'une liste d'individus avec en colonne : le nom, le prénom, la fonction, les coordonnées et l'email et d'autres données.</p> <p>Pour des raisons esthétiques, on souhaite présenter les données autrement avec, pour une même ligne du tableau, regrouper dans la même cellule/case du tableau les informations suivantes</p> <blockquote> <p>NOM Prénom<br> fonction (en rouge)<br> coordonnées<br> email (lien cliquable)</p> <p>NOM Prénom<br> fonction (en rouge)<br> coordonnées<br> email (lien cliquable)</p> </blockquote> <p>Comme Illico repose sur HTML/JS, il est facile d'intégrer des balises HTML de mise en forme (couleur, gras, a/href) et un saut de ligne <code>BR</code> et de les récupérer par copier-coller vers un tableur ou un traitement de texte.</p> <p>Ici, il y a trois étapes :</p> <ol> <li>la couleur ;</li> <li>la balise a/href pour l'email ;</li> <li>la concaténation de 5 colonnes.</li> </ol><p><em>Nota bene</em> : des transformations sont disponibles pour le gras, l'italique, le barré, augmenter/diminuer la taille, mettre en couleur, ou enlever la mise en forme. Des options permettent à tout moment d'interpréter ou au contraire de rendre apparente/visible ces balises/mises en forme HTML sans les interpréter.</p></div><div><a href="https://linuxfr.org/news/oui-illico.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/111546/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/oui-illico#comments">ouvrir dans le navigateur</a> </p> Arnaud ZeroHeure Nils Ratusznik Nÿco Davy Defaud Benoît Sibaud Xavier Teyssier palm123 Anonyme https://linuxfr.org/nodes/111546/comments.atom tag:linuxfr.org,2005:News/37548 2016-09-19T13:43:19+02:00 2016-09-19T15:43:55+02:00 Angular 2 est en version finale, Ninja Squad vous met le pied à l’étrier Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Ninja Squad proposait un <em>e‐book</em> sur Angular 2 quand ce <em>framework</em> n’était alors qu’en bêta (<em>cf.</em> la dépêche précédente <a href="/news/deviens-un-ninja-avec-angular-2-un-ebook-sans-drm-a-prix-libre-et-en-soutien-a-l-eff"><em>Deviens un Ninja avec Angular 2 : un e‐book sans DRM à prix libre et en soutien à l’EFF</em></a>). <br> Cette semaine, Angular 2 est — enfin — passé en version finale. Ce qui signifie qu’il est utilisable sans trop de crainte en production (plus de changements incompatibles) et qu’il est donc temps de s’y mettre sérieusement.</p> <p>Après l’<em>e‐book</em> (à jour de la dernière version), Ninja Squad propose désormais un « pack pro », proposant de mettre en pratique la théorie apprise dans l’<em>e‐book</em> en construisant pas à pas une application complète, avec une batterie de tests fournie couvrant le code produit à 100 % : à chaque étape, on soumet sa solution, dont la qualité est analysée ; un score est donné ; on peut alors améliorer son implémentation, ou sauter les trois exercices suivants, ou même tricher en consultant la solution fournie respectant les bonnes pratiques et l’état de l’art ; on suit ainsi sa progression dans la trentaine d’exercices proposés (entre 3 et 5 jours de travail).</p> <p>Cela devrait faire gagner des heures sur vos projets personnels et professionnels, en ayant toujours sous la main du code fonctionnel et à jour des dernières versions couvrant l’essentiel des cas d’usage d’une application d’entreprise (les mises à jour sont évidemment gratuites).</p> <p>Tarif normal : 199 €.<br> Code de réduction pour les lecteurs de <em>LinuxFr.org</em> : <code>LinuxFrRocks</code>, -30 % pour les 20 premiers acheteurs.</p> <p>La plate‐forme est testable gratuitement sur les six premiers exercices : <a href="https://angular2-exercises.ninja-squad.com/">https://angular2-exercises.ninja-squad.com/</a>.</p> <p><strong>N. D. M. :</strong> la licence de l’<em>e‐book</em> (201 pages A4) interdit explicitement la vente, l’utilisation commerciale et la redistribution. Le site annonce actuellement environ 2 800 acheteurs et 114 packs pro, ayant généré 6 452 € de dons à l’<a href="https://www.eff.org/">EFF</a>.</p></div><ul><li>lien nᵒ 1 : <a title="https://angular2-exercises.ninja-squad.com/" hreflang="en" href="https://linuxfr.org/redirect/98150">Angular 2 Pro Pack Platform by Ninja Squad</a></li><li>lien nᵒ 2 : <a title="https://books.ninja-squad.com/angular2#propack" hreflang="fr" href="https://linuxfr.org/redirect/98151">Site de vente du Pack Pro Angular 2 par Ninja Squad</a></li></ul><div></div><div><a href="https://linuxfr.org/news/angular-2-est-en-version-finale-ninja-squad-vous-met-le-pied-a-l-etrier.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/110051/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/angular-2-est-en-version-finale-ninja-squad-vous-met-le-pied-a-l-etrier#comments">ouvrir dans le navigateur</a> </p> clacote Benoît Sibaud Davy Defaud https://linuxfr.org/nodes/110051/comments.atom tag:linuxfr.org,2005:News/37297 2016-05-14T11:22:28+02:00 2016-05-14T11:23:17+02:00 Sortie de Electron 1.0 Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Electron permet de construire des applications de bureau multi-plateformes avec les technologies du web (HTML, CSS et JS). Il était initialement développé par Github pour son éditeur de texte <a href="https://atom.io/">Atom</a> et est maintenant un projet à part entière. Il vient d'atteindre la version 1.0, signe d'une certaine maturité.</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f636c6f75642e67697468756275736572636f6e74656e742e636f6d2f6173736574732f3337383032332f31353030373335322f33313566356565612d313231332d313165362d393834652d3231663564616233313236372e706e67/315f5eea-1213-11e6-984e-21f5dab31267.png" alt="Electron 1.0" title="Source : https://cloud.githubusercontent.com/assets/378023/15007352/315f5eea-1213-11e6-984e-21f5dab31267.png"></p></div><ul><li>lien nᵒ 1 : <a title="http://electron.atom.io/blog/2016/05/11/electron-1-0" hreflang="en" href="https://linuxfr.org/redirect/97174">Annonce de la sortie de la version 1.0 d&#39;Electron</a></li><li>lien nᵒ 2 : <a title="http://electron.atom.io/" hreflang="en" href="https://linuxfr.org/redirect/97175">Site officiel d&#39;Electron</a></li><li>lien nᵒ 3 : <a title="https://github.com/sindresorhus/awesome-electron" hreflang="en" href="https://linuxfr.org/redirect/97187">Awesome Electron, une compilation de liens sur Electron</a></li></ul><div><p>D'un point de vue technique, une application Electron se compose de 2 parties : un processus principal et une (ou plusieurs) fenêtre(s). Le processus principal est un node.js et il sert à contrôler l'application. Il peut lancer une ou plusieurs fenêtres, qui ne sont rien d'autres que le navigateur Chromium dépouillé de son interface. Les processus peuvent communiquer entre eux via un système d'IPC.</p> <p>Electron offre une intégration avec les trois principaux systèmes d'exploitation (Linux, OSX et Windows), que ce soit pour les icônes de lancement, la <em>tray icon</em>, les notifications, la gestion de l'énergie, etc. Il vient également avec certains outils. On peut citer devtron, un complément à l'inspecteur de Chromium qui simplifie le développement, spectron, un framework de tests, ou encore electron-builder pour faire des installeurs et mises à jour automatiques.</p> <p>Electron souffre toutefois de certaines limitations. Embarquer Chromium et Node.js veut dire que la moindre application pèse plus de 100 Mo. L'intégration avec les différents systèmes d'exploitation est encore incomplète et fonctionne parfois de manière déroutante (la <em>tray icon</em> qui ne s'affiche pas dans certains environnements par exemple). Electron-builder est très compliqué à mettre en place pour de la cross compilation. Espérons que Github continuera à travailler pour améliorer tout ça.</p> <p>Il existe déjà de belles applications avec Electron :</p> <ul> <li>J'ai cité <a href="https://atom.io/">Atom</a>, l'éditeur de texte de Github.</li> <li>Dans un style très proche, Microsoft a utilisé Electron pour <a href="https://code.visualstudio.com/">Visual Studio Code</a>.</li> <li> <a href="https://www.nylas.com/">Nylas N1</a> est un client de courriel.</li> <li> <a href="https://webtorrent.io/desktop">Web Torrent Desktop</a> permet de visionner des films depuis un torrent en cours de téléchargement (c'est un portage de la version web qui permet également de faire passerelle entre les deux).</li> <li> <a href="https://github.com/shockone/black-screen">Black Screen</a> est un terminal pour le 21<sup>e</sup> siècle.</li> </ul><p>Et j'espère pouvoir vous parler d'une autre <a href="https://github.com/cozy-labs/cozy-desktop">application</a> Electron bientôt.</p></div><div><a href="https://linuxfr.org/news/sortie-de-electron-1-0.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/108963/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/sortie-de-electron-1-0#comments">ouvrir dans le navigateur</a> </p> Bruno Michel Benoît Sibaud bubar🦥 https://linuxfr.org/nodes/108963/comments.atom tag:linuxfr.org,2005:News/37288 2016-05-12T10:20:13+02:00 2016-05-12T16:10:54+02:00 Node.js passe la sixième vitesse Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Node.js est la principale implémentation du langage JavaScript côté serveur. Elle utilise V8, le moteur JavaScript de Google Chrome, et vient d’atteindre la version 6.0.0 le 26 avril 2016.</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f6e6f6465626c6f672e66696c65732e776f726470726573732e636f6d2f323031312f30372f6e6f64656a732e706e67/nodejs.png" alt="Logo Node.js" title="Source : https://nodeblog.files.wordpress.com/2011/07/nodejs.png"></p> <p>La montée de version de V8 vers la version 5.0 a d'ailleurs permis une meilleure prise en charge d'ES6, avec 93 % des fonctionnalités couvertes. Parmi les autres nouveautés, on trouve des performances accrues (notamment pour le chargement des modules), une meilleure stabilité et utilisabilité des API JavaScript (notamment <em>Buffer</em> et <em>File System</em>).</p> <p>Peu de temps après la sortie de la version 6.0.0, des failles OpenSSL ont été annoncées, ce qui a conduit à la sortie d'une version 6.1.0.</p></div><ul><li>lien nᵒ 1 : <a title="https://nodejs.org/en/blog/release/v6.0.0/" hreflang="en" href="https://linuxfr.org/redirect/97135">Annonce de la sortie de node.js 6.0.0</a></li><li>lien nᵒ 2 : <a title="https://nodejs.org/en/" hreflang="en" href="https://linuxfr.org/redirect/97136">Le site officiel de node.js</a></li><li>lien nᵒ 3 : <a title="https://nodejs.org/en/blog/vulnerability/openssl-may-2016/" hreflang="en" href="https://linuxfr.org/redirect/97137">Mise à jour de sécurité suite aux failles OpenSSL</a></li><li>lien nᵒ 4 : <a title="http://node.green/" hreflang="en" href="https://linuxfr.org/redirect/97138">Prise en charge d&#39;ES6 par les différentes versions de node.js</a></li><li>lien nᵒ 5 : <a title="https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html" hreflang="en" href="https://linuxfr.org/redirect/97139">Une présentation d&#39;async/await</a></li><li>lien nᵒ 6 : <a title="http://geekforbrains.com/post/after-a-year-of-nodejs-in-production" hreflang="en" href="https://linuxfr.org/redirect/97140">Retour d&#39;expérience sur un an d&#39;utilisation de node.js</a></li></ul><div><h3 id="les-différentes-versions">Les différentes versions</h3> <p>Ce n'est pas facile de suivre les différentes branches de node.js suite au fork io.js, qui a ensuite refusionné avec node.js. Toutefois, la situation n'est que temporaire et on devrait y voir plus clair d'ici la fin de l'année. En attendant, voici un petit résumé :</p> <ul> <li>node.js 0.10 : une vieille version, qui est toujours celle <a href="https://packages.debian.org/search?keywords=nodejs">packagée par Debian</a> notamment, est en phase de maintenance jusqu'à octobre 2016 (ensuite, ce sera les oubliettes)</li> <li>node.js 0.12 : pareil, mais la phase de maintenance durera jusque décembre 2016</li> <li>node.js 4 : c'est la version LTS actuelle. Elle sera en <em>LTS Active</em> jusqu'avril 2017, puis passera en phase de maintenance pour une année supplémentaire</li> <li>node.js 5 : c'est juste une version de développement et elle s'arrêtera dans 2 mois</li> <li>node.js 6 : c'est également une version de développement (<em>current</em>) et deviendra une version LTS en octobre 2016. D'ici là, il pourra encore y avoir des changements assez conséquents (montée de version de V8 notamment).</li> </ul><p>Donc, pour le moment, il est recommandé d'utiliser node.js 4 en production et de commencer à faire tourner des tests avec node.js 6 dans les environnements d'intégration continue pour détecter les régressions. À noter que pas mal de modules npm compilés sont en train d'être corrigés pour node.js 6.</p> <h3 id="npm3">Npm3</h3> <p>Node.js 5 et 6 viennent avec npm3 et non plus npm2. Ce changement est majeur.</p> <p>Avec npm2, les dépendances d'une dépendance s'installaient dans le répertoire <code>node_modules</code> de la dépendance. Et donc, on pouvait avoir un même module avec deux versions différentes au sein d'un même projet, si deux dépendances incluaient ce module dans des versions différentes. Avec npm3, ce n'est plus le cas. Toutes les dépendances (directes et indirectes) sont installées dans le <code>node_modules</code> du projet.</p> <p>Ce changement a permis de régler pas mal de problèmes sous Windows, où les dépendances de dépendances de dépendances de… (vous voyez l'idée) avaient des chemins très longs, trop longs pour Windows. Il permet également de s'assurer qu'un module n'est installé qu'une seule fois par projet, ce qui est très utile pour les projets front-end qui utilisent npm.</p> <p>Par contre, le passage à npm3 n'a pas que des bons côtés. Ce changement a introduit pas mal de régressions et la situation commence juste à se stabiliser. Npm3 est également de façon notoire bien plus lent que npm2.</p> <h3 id="es6-es7-et-la-suite">ES6, ES7 et la suite</h3> <p>ES6, ou ES2015, la version actuelle du standard qui décrit le langage JavaScript est le fruit d'un long travail et les implémentations des moteurs JavaScript supportent la plupart des fonctionnalités. Que ce soit chez Google, Mozilla, Microsoft ou Apple, on est proche des 100 %, avec jusque quelques bugs sur des cas très particuliers ou la volonté de ne pas implémenter les <em>Tail Calls Optimisation</em> (car ils posent des problèmes).</p> <p>Pour autant, tout n'est pas rose. Les nouvelles fonctionnalités ne sont pas aussi optimisées que le reste. Les benchmarks montrent qu'il est fréquent que du code ES6 soit entre un et trois ordres de grandeur plus lent que son équivalent en ES5. Les moteurs vont combler ces différences mais cela risque de prendre encore quelques mois ou années.</p> <p>Autre point noir : les modules d'ES6. L'équipe derrière node.js a fait <a href="https://github.com/nodejs/node-eps/blob/master/002-es6-modules.md">une proposition pour prendre en charge les modules d'ES6</a> (en disant que s'ils vont faire les modules d'ES6, ce sera de cette façon, mais il se peut aussi qu'ils ne fassent rien car ils considèrent que les modules d'ES6 sont une mauvaise chose et que le standard devrait étudier à nouveau cette question). Cette proposition n'a pas plu à une partie de la communauté car elle introduit l'extension <code>.mjs</code>, ce qui va poser problème pour les modules qui seront utilisables à la fois par node.js et les navigateurs. On a donc eu le droit à <a href="https://github.com/dherman/defense-of-dot-js/blob/master/proposal.md">une contre-proposition</a> et les noms d'oiseau ont volé une nouvelle fois sur Twitter. La situation semble enlisée pour le moment.</p> <p>ES7, ou ES2016, est beaucoup plus léger. C'est principalement l'arrivée de l'opérateur <code>**</code> pour calculer des puissances et de <code>Array.prototype.includes</code> pour savoir si un élément fait partie d'un tableau.</p> <p>Par contre, on attend toujours <code>async/await</code>. Cette solution devrait permettre d'écrire du code asynchrone de manière beaucoup plus propre et est même décrite comme la solution miracle depuis plusieurs années. Seul problème, aucun moteur JS ne l'a implémentée pour le moment.</p></div><div><a href="https://linuxfr.org/news/node-js-passe-la-sixieme-vitesse.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/108933/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/node-js-passe-la-sixieme-vitesse#comments">ouvrir dans le navigateur</a> </p> Bruno Michel M5oul Florent Zara palm123 Benoît Sibaud https://linuxfr.org/nodes/108933/comments.atom tag:linuxfr.org,2005:News/37147 2016-03-04T15:59:51+01:00 2016-03-06T13:43:01+01:00 Et si JavaScript allait droit dans le mur ? Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Cette dépêche pose la question de l’avenir du JavaScript. Celui‐-ci continue de gagner en popularité, mais aussi en complexité. L’auteur du journal a étudié d’autres langages encore peu connus (Elixir, Elm, Pony, Oden et Crystal) et ceux‐ci lui ont fait sauter aux yeux les défauts du JavaScript. Il s’interroge donc sur le futur de ce langage.</p> <p>Dans les commentaires du journal, de nombreux développeurs ont fait un retour sur leur expérience. Certains apprécient le JavaScript (souvent, un sous‐ensemble de ce langage qui va à l’encontre des dernières nouveautés). D’autres, souhaiteraient fortement s’en débarrasser, mais quasiment tous sont d’accord sur le fait qu’il va rester grâce à son monopole sur les navigateurs).</p> <p>Certains ont encouragé à essayer leur langage de prédilection : <a href="https://golang.org/">Go</a>, <a href="https://ocaml.org/">OCaml</a>, <a href="https://github.com/clojure/clojurescript">ClojureScript</a>, etc.</p> <p>Enfin, on peut également retrouver un certain espoir avec <a href="https://hacks.mozilla.org/2015/12/compiling-to-webassembly-its-happening/">WebAssembly</a> (le successeur d’<em>asm.js</em>), qui permettrait à de nombreux langages d’être compilés vers la plate‐forme Web.</p></div><ul><li>lien nᵒ 1 : <a title="http://linuxfr.org/users/nono/journaux/et-si-javascript-allait-droit-dans-le-mur" hreflang="fr" href="https://linuxfr.org/redirect/96585">Journal à l’origine de la dépêche</a></li><li>lien nᵒ 2 : <a title="http://crystal-lang.org/" hreflang="en" href="https://linuxfr.org/redirect/96586">Crystal</a></li><li>lien nᵒ 3 : <a title="http://www.ponylang.org/" hreflang="en" href="https://linuxfr.org/redirect/96587">Pony</a></li><li>lien nᵒ 4 : <a title="http://oden-lang.org/" hreflang="en" href="https://linuxfr.org/redirect/96588">Oden</a></li><li>lien nᵒ 5 : <a title="http://elm-lang.org/" hreflang="en" href="https://linuxfr.org/redirect/96589">Elm</a></li><li>lien nᵒ 6 : <a title="http://elixir-lang.org/" hreflang="fr" href="https://linuxfr.org/redirect/96590">Elixir</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li><a href="#lasynchrone">L’asynchrone</a></li> <li><a href="#la-confiance-dans-le-code">La confiance dans le code</a></li> <li><a href="#les-outils">Les outils</a></li> <li><a href="#un-%C3%A9cosyst%C3%A8me-verdoyant">Un écosystème verdoyant</a></li> <li><a href="#la-complexit%C3%A9-du-langage">La complexité du langage</a></li> </ul><blockquote> <p><em>Always bet on JS</em> — Brendan Eich</p> </blockquote> <p>Je me pose pas mal de questions sur l’avenir du JavaScript. D’un côté, il semble plus fort que jamais et ses surcouches (CoffeeScript, PureScript, etc.) ne sont plus à la mode. De l’autre, ses défauts me sautent de plus en plus aux yeux.</p> <p>Je passe pas mal de temps à regarder de nouveaux langages de programmation. La plupart resteront expérimentaux, mais de temps à autre, un langage perce. Ce fut par exemple le cas de Go, il y a quelques années. Ceci dit, ma motivation principale quand j’étudie ces nouveaux langages n’est pas tant de trouver le futur langage qui deviendra à la mode que d’apprendre de nouvelles façons de penser et de programmer. Voici un petit tour très très succinct des derniers langages qui ont retenu mon attention :</p> <ul> <li> <a href="http://crystal-lang.org/">Crystal</a> est un langage dont la syntaxe s’inspire très fortement du Ruby, mais qui est compilé et non pas interprété. Cela lui donne des performances bien plus avantageuses et offre le filet de sécurité qu’est le typage statique (sans avoir à ne jamais écrire le moindre type !) ;</li> <li> <a href="http://www.ponylang.org/">Pony</a> est un langage orienté objets, avec un modèle d’<em>actors</em> (similaire à celui d’Erlang ou Akka) et un système de capacités (<em>capabilities</em>) très intéressant. La syntaxe est très agréable et on retrouve de nombreuses structures tirées des langages fonctionnels (<em>pattern matching</em>, application partielle d’une fonction) ;</li> <li> <a href="http://oden-lang.org/">Oden</a> est un langage qui vise à profiter de l’écosystème <em>golang</em>, mais avec un langage plus fonctionnel. On retrouve ainsi du typage statique, avec la prise en charge du polymorphisme, ainsi qu’une syntaxe plus épurée que le Go ;</li> <li> <a href="http://elm-lang.org/">Elm</a> est un langage fonctionnel pour écrire des applications dans un navigateur. Prenez React, Redux, Immutuable.js, enlevez beaucoup de bruit pour ne garder que l’essentiel, poussez le concept un peu plus loin, et Elm pourrait bien être ce que vous obtenez ;</li> <li> <a href="http://elixir-lang.org/">Elixir</a> est déjà plus établi que les langages précédents. C’est un langage qui permet de profiter de la machinerie d’Erlang quand on est allergique à sa syntaxe. Au passage, on gagne aussi des outils bien pratiques.</li> </ul><p>Bien sûr, il y aurait beaucoup plus à dire sur chacun de ses langages, mais ce qui m’intéresse ici est qu’ils apportent beaucoup de mécanismes qui me manquent cruellement quand je code en JavaScript.</p> <h2 id="lasynchrone">L’asynchrone</h2> <p>JavaScript, avec son <em>Event Loop</em> et ses <em>callbacks</em> dans tous les sens, était à la pointe de la gestion de l’asynchrone il y a quinze ou vingt ans. Maintenant, <a href="https://fr.wikipedia.org/wiki/Communicating_sequential_processes">CSP</a> est devenu populaire, et à juste titre.</p> <p>JavaScript n’est pas resté immobile. On a vu apparaître les <em>Promise</em>, puis certains ont détourné les générateurs. On parle beaucoup d’<a href="https://tc39.github.io/ecmascript-asyncawait/"><em>async/await</em></a>. Il n’empêche, on est toujours dans un bourbier, coincé entre des API qui utilisent parfois des <em>callbacks</em>, parfois des <em>promises</em>.</p> <p><em>Async/await</em> est présenté comme une solution miracle depuis un bout de temps mais n’avance que très lentement. Il n’a pas été intégré à ES6, il ne passera pas dans ES2016 et ça semble mal parti pour ES2017. Et pour cause, aucun moteur JavaScript des principaux navigateur n’a d’implémentation pour lui. Côté <em>Node.js</em>, pas mieux, on attend sur V8 et il n’y aura pas de version LTS qui prendra en charge <em>async/await</em> avant un paquet de temps. On peut jouer avec Babel en attendant, mais ça reste un jeu, pas quelque chose que l’on peut espérer utiliser en production et encore moins dans un projet libre.</p> <h2 id="la-confiance-dans-le-code">La confiance dans le code</h2> <p>La confiance dans le code passe naturellement par les tests. Mais ceux‐ci ne sont pas parfaits et ne devraient en aucun cas être notre seul moyen d’avoir confiance dans le code que l’on écrit. D’ailleurs, les autres langages précédemment cités sont très riches en enseignements de ce côté‐là.</p> <p>Il y a bien sûr l’immutabilité (on ne modifie jamais un objet ou une valeur, on en crée un nouveau avec les informations mises à jour). Côté JS, <code>const</code> permet juste d’éviter de réassigner une valeur à une variable, mais si cette valeur est un objet ou un tableau, il est toujours possible de le modifier. On a également <code>Object.freeze</code> et <code>Object.seal</code>, mais, franchement, vous avez déjà vu des gens recommander d’utiliser ça à une large échelle ? Non, c’est trop compliqué en pratique, surtout quand on utilise des dépendances externes.</p> <p>Le typage statique est également très intéressant pour détecter des erreurs. Et <a href="http://elm-lang.org/blog/compilers-as-assistants">Elm en fait un usage très instructif</a> : non seulement, il détecte les erreurs, mais il explique pourquoi et permet d’apprendre certaines subtilités du langage (parfois, on gagne juste un temps fou en détectant une typo).</p> <p>Ici, l’héritage du JavaScript pèse lourd dans la balance. Il y a <a href="http://www.wtfjs.com/">trop de pièges</a>, trop de comportements qui demandent une attention permanente (perdre le <code>this</code>, se tromper dans la portée d’une variable).</p> <h2 id="les-outils">Les outils</h2> <p>J’en ai parlé au‐dessus : le compilateur d’Elm fait des merveilles. Elixir a également des outils très solides. Plusieurs des langages ci‐dessus ont des <code>fmt</code>, à la manière de <a href="https://golang.org/cmd/gofmt/"><em>gofmt</em></a>, pour formater le code d’une manière standard. Je ne suis pas un utilisateur d’<a href="https://fr.wikipedia.org/w/index.php?title=Environnement_de_d%C3%A9veloppement&amp;redirect=no" title="Environnement de développement intégré">EDI</a>, mon <a href="https://neovim.io/">Neovim</a> me convient bien, mais ça ne veut pas dire que je refuse l’aide d’outils pour m’aider dans mes activités de codage.</p> <p>Et là encore, JavaScript est à la traîne. Oh, il ne manque pas d’outils ! C’est même l’inverse, on croule sous les gulp, grunt, broccoli, brunch, webpack, browserify, rollup, babel, estlint, jslint, jscs, jshint, etc. Et on s’y perd. D’un projet à l’autre, ce n’est jamais la même chose, jamais les mêmes règles pour le <em>lint</em>. Un coup, ce sont des <code>require</code> CommonJS, l’autre des <code>import/export</code> d’ES6. Et je ne parle même pas du temps fou qu’il faut passer pour réussir à les compiler. Et quand vous avez un outil qui marche, vous pouvez être sûr que dans quelques mois, ses greffons pour faire du <a href="https://fr.wikipedia.org/wiki/Sass_%28langage%29" title="Syntactically Awesome Stylesheets">Sass</a> ou générer des <em>sprites</em> ne seront plus maintenus. Ce n’est pas pour rien que l’expression <em>JavaScript fatigue</em> est très à la mode.</p> <h2 id="un-écosystème-verdoyant">Un écosystème verdoyant</h2> <p>On parle souvent du nombre impressionnant de paquets publiés sur <a href="https://www.npmjs.com/"><em>npmjs.com</em></a>. Pourtant, quand on y regarde de plus près, c’est loin d’être reluisant. On trouve des tonnes de paquets qui sont des expérimentations qui n’ont jamais dépassé le stade de la version 0.0.<em>x</em>. Ensuite, il y a tous ces greffons d’intégration d’un outil avec l’autre (<a href="https://www.npmjs.com/package/sails-generate-backend-gulp-webpack"><em>sails-generate-backend-gulp-webpack</em></a> pour donner un exemple du ridicule que l’on atteint).</p> <p>La bibliothèque standard de JavaScript me désole toujours autant. Il y a bien <em>lodash</em>, mais, franchement, j’aimerais bien avoir <a href="https://lodash.com/docs#pick"><em>pick</em></a> ou <a href="https://lodash.com/docs#debounce"><em>debounce</em></a> dans la bibliothèque standard.</p> <p><em>Node.js</em> ne fait pas mieux. Il faut toujours installer un paquet pour faire un <code>mkdir -p</code>, ou un <code>rm -rf</code> (d’ailleurs, vous risquez de vous retrouver avec <a href="https://www.npmjs.com/package/rimraf"><em>rimraf</em></a> et <a href="https://www.npmjs.com/package/del"><em>del</em></a> si vous ne faites pas attention).</p> <p>Enfin, certaines entreprises ont les dents longues et il n’est pas rare d’en venir aux « drames » pour parfois faire avancer les choses. On se rappelle du <em>fork</em> <em>io.js</em> pour soustraire <em>Node.js</em> de l’emprise de Joyent. Plus récemment, c’est le principal contributeur d’<em>express</em> qui a jeté l’éponge (et même deux fois) pour des raisons similaires. On peut aussi s’amuser de <a href="https://twitter.com/jashkenas/status/704399369051770880">GitHub transformé en bac à sable</a>. Mais, ce qui est sûr, c’est qu’il y a bien des progrès à faire dans ce domaine.</p> <h2 id="la-complexité-du-langage">La complexité du langage</h2> <p>Dernier point, avec ES6 et les versions futures, je trouve le langage de plus en plus complexe. Mais surtout cette complexité ne répond pas à mes besoins. C’est sûrement très bien d’avoir des <a href="https://github.com/wycats/javascript-decorators/blob/master/README.md">décorateurs</a> des <a href="https://github.com/zenparsing/es-observable">observables</a> et des <a href="https://github.com/medikoo/es6-symbol">symboles</a>. Mais je trouve déjà les styles de code JavaScript très disparates et je ne pense pas qu’ajouter de nouvelles fonctionnalités comme celles‐ci apportent vraiment quelque chose de suffisamment intéressant pour compenser la complexité induite.</p> <p>Au final, je suis de plus en plus déçu. Il y a sûrement certains points qui me sont personnels et d’autres qui sont partagés par la communauté. En tout cas, je vois cela comme une grosse faiblesse du JavaScript, et comme je ne vois pas les choses changer dans les prochains mois ou années, j’ai l’impression que le JavaScript va droit dans le mur. Je vais bien sûr continuer à utiliser du JavaScript au quotidien. Sa place dans les navigateurs en fait quelque chose de trop difficile à éviter. Mais je vais aussi continuer à regarder ce qui se fait ailleurs et probablement finir par détester le JavaScript.</p> <p>Et vous, quels sont vos langages du moment ? Et que font‐ils mieux que JavaScript ?</p></div><div><a href="https://linuxfr.org/news/et-si-javascript-allait-droit-dans-le-mur.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/108365/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/et-si-javascript-allait-droit-dans-le-mur#comments">ouvrir dans le navigateur</a> </p> Bruno Michel Davy Defaud patrick_g Pierre Jarillon https://linuxfr.org/nodes/108365/comments.atom tag:linuxfr.org,2005:News/37112 2016-02-20T10:46:48+01:00 2016-02-20T10:46:48+01:00 Sortie de iTowns v1.0 : framework web pour la donnée géographique 3D Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Le projet iTowns est heureux d'annoncer la sortie de la première version OpenSource de iTowns, un nouveau <strong>framework de visualisation de données 3D géospatiales</strong>.</p> <p>iTowns est un <strong>framework web</strong> écrit en Javascript/WebGL basé sur <a href="http://threejs.org">THREE.js</a> pour la visualisation de <strong>données géographiques 3D</strong>, permettant également des mesures précises en 3D. Son premier but est la visualisation d'images type "street view" et de nuages de points LIDAR terrestre, mais il supporte bien d'autres types de données.</p> <p><img src="//img.linuxfr.org/img/687474703a2f2f69746f776e732e6769746875622e696f2f696d616765732f73616d706c655f69746f776e732e6a7067/sample_itowns.jpg" alt="Aperçu de iTowns" title="Source : http://itowns.github.io/images/sample_itowns.jpg"></p> <p>La version 1.0 est la première version OpenSource de iTowns, publiée sous license CeCILL-B. Il s'agit du cœur de l'application originelle iTowns développée ces dernières années au laboratoire de recherche MATIS de l'<a href="http://www.ign.fr">IGN</a>. L'IGN a travaillé ces derniers mois sur la transition de cet outil depuis un logiciel interne vers un projet ouvert et libre.</p></div><ul><li>lien nᵒ 1 : <a title="https://itowns.github.io" hreflang="en" href="https://linuxfr.org/redirect/96454">Site web iTowns</a></li><li>lien nᵒ 2 : <a title="https://vimeo.com/154052505" hreflang="en" href="https://linuxfr.org/redirect/96455">Vidéo de démonstration</a></li><li>lien nᵒ 3 : <a title="http://itowns.github.io/itowns-sample-data/" hreflang="en" href="https://linuxfr.org/redirect/96456">Démo avec données IGN</a></li><li>lien nᵒ 4 : <a title="https://github.com/iTowns/itowns/releases/tag/v1.0" hreflang="fr" href="https://linuxfr.org/redirect/96457">Télécharger la version 1</a></li><li>lien nᵒ 5 : <a title="https://github.com/iTowns/itowns/" hreflang="fr" href="https://linuxfr.org/redirect/96458">iTowns sur GitHub</a></li></ul><div><p>Vidéo de démonstration : <a href="https://vimeo.com/154052505">https://vimeo.com/154052505</a><br> Cette version est une "technology preview" et fournit les fonctionnalités suivantes :</p> <ul> <li>Chargement et projection d'<strong>images orientées</strong> sur un mesh (cube ou modèle de batiment)</li> <li>Chargement et affichage d'<strong>images panoramiques</strong> </li> <li>Chargement d'<strong>images de profondeur panoramiques</strong> et rendu en 3D</li> <li>Chargement de <strong>multipolygones 2D</strong> avec hauteur ( empreinte de bati) depuis un <a href="https://fr.wikipedia.org/wiki/Web_Feature_Service">WFS</a> ou un fichier local, et triangulation pour créer des modèles de batiments. Ce mesh peut alors être utilisé pour projeter des textures.</li> <li> <strong>Navigation dans les données</strong> avec mécanisme de "click &amp; go"</li> <li>Chargement et affichage de <strong>nuages de points</strong> à partir de fichiers PLY</li> <li>Chargement et affichage de <strong>modèles 3D texturés</strong> ( B3D, 3DS)</li> <li> <strong>API simple</strong> de programmation</li> </ul><p>Pour l'occasion <a href="http://itowns.github.io">un nouveau site web</a> a été mis en place et l'IGN a fourni un jeu de données qui peut être <a href="http://itowns.github.io/itowns-sample-data">visualisé dans la démo en ligne</a>. Vous pouvez <a href="https://github.com/iTowns/itowns/releases/tag/v1.0">télécharger iTowns Version 1.0</a> sur github.</p> <h2 id="opensource">OpenSource</h2> <p>iTowns est une <strong>organisation Opensource</strong> informelle, qui délivre des composants logiciels pour la visualisation de données géospatiales 3D sur le web. Le projet iTowns est ouvert aux contributions de toute personne de la communauté. Vous pouvez forker le project sur GitHub et envoyer des Pull Requests, et nous aurons plaisir à les intégrer. N'hésitez pas à consulter le wiki iTowns pour des informations générales sur comment contribuer.</p> <h2 id="collaboration">Collaboration</h2> <p>Les 3 et 4 février 2016 dernier a eu lieu un <strong>codesprint iTowns</strong>, hébergé par <a href="http://ignfab.ign.fr">IGNFab</a> à Paris. Il a rassemblé environ 15 développeurs et a permis de finaliser la version 1.0, de travailler sur l'organisation du projet, la documentation et les démos, ainsi que la conception de la prochaine génération du framework. Un PSC ("Project Steering Comittee") a été formé avec Alexandre Devaux (IGN) comme président.</p> <p>Cette collaboration a été efficace, et un bon démarrage pour tous les développeurs désireux de travailler ensemble sur la visualisation de données 3D. N'hésitez pas à rentrer en contact avec les développeurs si vous êtes intéressés pour collaborer sur le projet.</p> <h2 id="remerciements">Remerciements</h2> <p>iTowns est issue de travaux originaux du laboratoire MATIS de l'IGN. Il a été financé par divers programmes de recherche impliquant l'ANR, Cap Digital, UPMC, Mines ParisTec, CNRS, LCPC.</p></div><div><a href="https://linuxfr.org/news/sortie-de-itowns-v1-0-framework-web-pour-la-donnee-geographique-3d.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/108243/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/sortie-de-itowns-v1-0-framework-web-pour-la-donnee-geographique-3d#comments">ouvrir dans le navigateur</a> </p> Vincent P bubar🦥 palm123 https://linuxfr.org/nodes/108243/comments.atom tag:linuxfr.org,2005:News/37058 2016-01-24T15:32:23+01:00 2016-01-26T10:00:05+01:00 Deviens un Ninja avec Angular 2 : un ebook sans DRM à prix libre et en soutien à l'EFF Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Deviens un Ninja avec Angular 2 : un ebook sans DRM à prix libre et en soutien à l'Electronic Frontier Fondation (EFF).</p> <p><a href="http://ninja-squad.fr">Ninja Squad</a> propose un livre permettant d'apprendre à maîtriser le framework web <a href="https://angular.io/">Angular 2</a>. Sur le modèle des Humble Bundle, cet ebook est proposé à prix libre, et en soutien optionnel à une association : l'EFF, qui défend un Internet libre dans le monde.</p> <p>Si Angular 2 est encore en beta, cet ebook vous donnera toutes les clés pour connaître ses prérequis (ECMAScript 6, TypeScript, Web Components), découvrir sa philosophie (ce qui a évolué depuis la version précédente AngularJS), et construire une véritable application.</p> <p>Les mises à jour de l'ebook seront fournies gratuitement.</p> <p><strong>NdM:</strong> la licence interdit explicitement la vente, l'utilisation commerciale et la redistribution.</p></div><ul><li>lien nᵒ 1 : <a title="https://books.ninja-squad.com/angular2" hreflang="fr" href="https://linuxfr.org/redirect/96250">Deviens un Ninja avec Angular 2</a></li></ul><div></div><div><a href="https://linuxfr.org/news/deviens-un-ninja-avec-angular-2-un-ebook-sans-drm-a-prix-libre-et-en-soutien-a-l-eff.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/107972/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/deviens-un-ninja-avec-angular-2-un-ebook-sans-drm-a-prix-libre-et-en-soutien-a-l-eff#comments">ouvrir dans le navigateur</a> </p> clacote Benoît Sibaud Nÿco Xavier Teyssier https://linuxfr.org/nodes/107972/comments.atom tag:linuxfr.org,2005:News/36544 2015-06-29T09:09:14+02:00 2015-06-29T09:09:14+02:00 ECMAScript 2015 est approuvé Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>La spécification ECMAScript 6<sup>e</sup> édition a été approuvée le 17 juin 2015 sous le nom ECMAScript 2015.</p> <p>Parmi les nouveautés, il faut noter l'arrivée des classes, des modules, des fonctions fléchées, des boucles <code>for-of</code>, des générateurs, des proxies et de plusieurs nouvelles méthodes.</p></div><ul><li>lien nᵒ 1 : <a title="http://www.ecma-international.org/publications/standards/Ecma-262.htm" hreflang="en" href="https://linuxfr.org/redirect/94488">Standard ECMA-262</a></li><li>lien nᵒ 2 : <a title="http://es6-features.org" hreflang="en" href="https://linuxfr.org/redirect/94489">ECMAScript 6 — New Features</a></li><li>lien nᵒ 3 : <a title="https://fr.wikipedia.org/wiki/ECMAScript" hreflang="fr" href="https://linuxfr.org/redirect/94490">ECMAScript sur Wikipédia</a></li><li>lien nᵒ 4 : <a title="https://developer.mozilla.org/fr/docs/Web/JavaScript/Nouveaut%C3%A9s_et_historique_de_JavaScript/Support_ECMAScript_6_par_Mozilla" hreflang="fr" href="https://linuxfr.org/redirect/94491">Support d&#39;ECMAScript 6 par Mozilla</a></li><li>lien nᵒ 5 : <a title="http://kangax.github.io/compat-table/es6/" hreflang="en" href="https://linuxfr.org/redirect/94510">Le tableau de compatibilité (de Kangax)</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li><ul> <li><a href="#constante-et-variable">Constante et variable</a></li> <li><a href="#classe">Classe</a></li> <li><a href="#fonction-fl%C3%A9ch%C3%A9e">Fonction fléchée</a></li> <li> <a href="#affecter-par-d%C3%A9composition">Affecter par décomposition</a><ul> <li><a href="#d%C3%A9composition-dun-tableau">Décomposition d'un tableau</a></li> <li><a href="#d%C3%A9composition-dun-objet">Décomposition d'un objet</a></li> <li><a href="#op%C3%A9rateur-de-d%C3%A9composition">Opérateur de décomposition</a></li> </ul> </li> <li> <a href="#param%C3%A8tres">Paramètres</a><ul> <li><a href="#d%C3%A9composition">Décomposition</a></li> </ul> </li> <li> <a href="#nouvelles-notations">Nouvelles notations</a><ul> <li><a href="#raccourcis-pour-les-noms-de-propri%C3%A9t%C3%A9s">Raccourcis pour les noms de propriétés</a></li> <li><a href="#raccourcis-pour-les-noms-de-m%C3%A9thodes">Raccourcis pour les noms de méthodes</a></li> <li><a href="#noms-calcul%C3%A9s-pour-les-propri%C3%A9t%C3%A9s">Noms calculés pour les propriétés</a></li> </ul> </li> <li><a href="#it%C3%A9rateur">Itérateur</a></li> <li><a href="#g%C3%A9n%C3%A9rateur">Générateur</a></li> <li><a href="#promise">Promise</a></li> <li> <a href="#module">Module</a><ul> <li><a href="#import">Import</a></li> <li><a href="#export">Export</a></li> </ul> </li> <li> <a href="#r%C3%A9flexion">Réflexion</a><ul> <li><a href="#proxy">Proxy</a></li> <li><a href="#reflect">Reflect</a></li> </ul> </li> <li> <a href="#nouvelles-m%C3%A9thodes">Nouvelles méthodes</a><ul> <li><a href="#object">Object</a></li> <li><a href="#array">Array</a></li> <li><a href="#string">String</a></li> <li><a href="#number">Number</a></li> </ul> </li> <li><a href="#autres-fonctionnalit%C3%A9s">Autres fonctionnalités</a></li> <li> <a href="#conversion">Conversion</a><ul> <li><a href="#compilateur">Compilateur</a></li> <li><a href="#api">API</a></li> </ul> </li> </ul></li> </ul><p>Cette nouvelle édition permet de rattraper le retard face au <a href="https://fr.wikipedia.org/wiki/JavaScript" title="Définition Wikipédia">JavaScript</a> déjà implémenté dans les navigateurs. De ce fait, l'arrivée des mots clés <code>const</code> et <code>let</code> n'est pas si nouvelle. Par contre, la spécification ne correspond pas toujours aux implémentations, et certaines fonctionnalités devront être revues.</p> <h3 id="constante-et-variable">Constante et variable</h3> <p>La déclaration <code>const</code> permet de créer une constante nommée accessible uniquement en lecture.</p> <pre><code class="Javascript"><span class="kr">const</span> <span class="nx">PI</span> <span class="o">=</span> <span class="mf">3.141593</span><span class="p">;</span> <span class="nx">PI</span> <span class="o">&gt;</span> <span class="mf">3.0</span><span class="p">;</span></code></pre> <p>L'instruction <code>let</code> permet de déclarer une variable dont la portée est celle du bloc courant, éventuellement en initialisant sa valeur.</p> <pre><code class="Javascript"><span class="kd">function</span> <span class="nx">letTest</span><span class="p">()</span> <span class="p">{</span> <span class="kd">let</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">31</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="kc">true</span><span class="p">)</span> <span class="p">{</span> <span class="kd">let</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">71</span><span class="p">;</span> <span class="c1">// c'est une variable différente</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span> <span class="c1">// 71</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span> <span class="c1">// 31</span> <span class="p">}</span></code></pre> <h3 id="classe">Classe</h3> <p>Durant le développement de la spécification, plusieurs propositions ont été élaborées pour la gestion des classes. La solution retenue est plutôt minimale. La classe contient un constructeur et des méthodes. L'héritage simple est géré. À cela s'ajoutent des méthodes <code>get</code> et <code>set</code>, et des membres statiques.</p> <pre><code class="Javascript"><span class="kr">class</span> <span class="nx">Fruit</span> <span class="p">{</span> <span class="nx">constructor</span> <span class="p">(</span><span class="nx">couleur</span><span class="p">)</span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">couleur</span> <span class="o">=</span> <span class="nx">couleur</span><span class="p">;</span> <span class="p">}</span> <span class="kr">static</span> <span class="nx">choisirCouleur</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="p">[</span><span class="s1">'rouge'</span><span class="p">,</span> <span class="s1">'jaune'</span><span class="p">,</span> <span class="s1">'bleu'</span><span class="p">,</span> <span class="s1">'vert'</span><span class="p">,</span> <span class="s1">'orange'</span><span class="p">,</span> <span class="s1">'mauve'</span><span class="p">];</span> <span class="p">}</span> <span class="nx">toString</span> <span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="s2">"fruit"</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kr">class</span> <span class="nx">Pomme</span> <span class="kr">extends</span> <span class="nx">Fruit</span> <span class="p">{</span> <span class="nx">constructor</span> <span class="p">(</span><span class="nx">couleur</span><span class="p">,</span> <span class="nx">sorte</span><span class="p">)</span> <span class="p">{</span> <span class="kr">super</span><span class="p">(</span><span class="nx">couleur</span><span class="p">);</span> <span class="k">this</span><span class="p">.</span><span class="nx">sorte</span> <span class="o">=</span> <span class="nx">sorte</span><span class="p">;</span> <span class="p">}</span> <span class="nx">get</span> <span class="nx">saveur</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">sorte</span> <span class="o">+</span> <span class="s2">" "</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">couleur</span><span class="p">;</span> <span class="p">}</span> <span class="nx">toString</span> <span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="kr">super</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span> <span class="o">+</span> <span class="s2">" : pomme"</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="kd">let</span> <span class="nx">maPomme</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Pomme</span><span class="p">(</span><span class="s1">'jaune'</span><span class="p">,</span> <span class="s1">'Délicieuse'</span><span class="p">);</span></code></pre> <h3 id="fonction-fléchée">Fonction fléchée</h3> <p>Une expression de fonction fléchée (arrow function en anglais) permet d'avoir une syntaxe plus courte que les expressions de fonction et permet de lier la valeur <code>this</code> de façon lexicale. Les fonctions fléchées sont obligatoirement anonymes.</p> <p>Les fonction fléchées peuvent être utilisées suivant deux syntaxes différentes :</p> <pre><code class="Javascript"><span class="nx">param</span> <span class="o">=&gt;</span> <span class="nx">expression</span></code></pre> <p>qui est équivalente à</p> <pre><code class="Javascript"><span class="kd">function</span><span class="p">(</span><span class="nx">param</span><span class="p">)</span> <span class="p">{</span><span class="k">return</span> <span class="nx">param</span><span class="p">.</span><span class="nx">expression</span><span class="p">}</span></code></pre> <p>ou sous la forme </p> <pre><code class="Javascript"><span class="p">([</span><span class="nx">param</span><span class="p">]</span> <span class="p">[,</span> <span class="nx">param</span><span class="p">])</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="nx">instructions</span><span class="p">}</span></code></pre> <p>qui est équivalente à</p> <pre><code class="Javascript"><span class="kd">function</span><span class="p">([</span><span class="nx">param</span><span class="p">]</span> <span class="p">[,</span> <span class="nx">param</span><span class="p">])</span> <span class="p">{</span> <span class="nx">instructions</span> <span class="p">}</span></code></pre> <p>Bien que la fonction fléchée soit nécessairement anonyme elle-même, elle peut néanmoins être mappée sur une variable.</p> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">simple</span> <span class="o">=</span> <span class="nx">a</span> <span class="o">=&gt;</span> <span class="nx">a</span> <span class="o">&gt;</span> <span class="mi">15</span> <span class="o">?</span> <span class="mi">15</span> <span class="o">:</span> <span class="nx">a</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">complexe</span> <span class="o">=</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">&gt;</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">a</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">b</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span></code></pre> <p>Une fonction fléchée ne définit pas son propre <code>this</code>. Elle utilise celui disponible dans son contexte.</p> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">robert</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">_nom</span><span class="o">:</span> <span class="s2">"Robert"</span><span class="p">,</span> <span class="nx">_amis</span><span class="o">:</span> <span class="p">[],</span> <span class="nx">imprimerAmis</span><span class="p">()</span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">_amis</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">f</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_nom</span> <span class="o">+</span> <span class="s2">" connaît "</span> <span class="o">+</span> <span class="nx">f</span><span class="p">));</span> <span class="p">}</span> <span class="p">}</span></code></pre> <h3 id="affecter-par-décomposition">Affecter par décomposition</h3> <p>L'affectation par décomposition (<em>destructuring</em> en anglais) est une expression qui permet d'extraire des données d'un tableau ou d'un objet grâce à une syntaxe dont la forme ressemble à la structure du tableau ou de l'objet. La syntaxe est semblable à ce qu'offre <a href="https://www.perl.org/">Perl</a> ou <a href="https://www.python.org/">Python</a>.</p> <h4 id="décomposition-dun-tableau">Décomposition d'un tableau</h4> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">list</span> <span class="o">=</span> <span class="p">[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span> <span class="p">];</span> <span class="kd">var</span> <span class="p">[</span> <span class="nx">a</span><span class="p">,</span> <span class="p">,</span> <span class="nx">b</span> <span class="p">]</span> <span class="o">=</span> <span class="nx">list</span><span class="p">;</span> <span class="p">[</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">a</span> <span class="p">]</span> <span class="o">=</span> <span class="p">[</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span> <span class="p">];</span></code></pre> <h4 id="décomposition-dun-objet">Décomposition d'un objet</h4> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">o</span> <span class="o">=</span> <span class="p">{</span><span class="nx">p</span><span class="o">:</span> <span class="mi">42</span><span class="p">,</span> <span class="nx">q</span><span class="o">:</span> <span class="kc">true</span><span class="p">};</span> <span class="kd">var</span> <span class="p">{</span><span class="nx">p</span><span class="p">,</span> <span class="nx">q</span><span class="p">}</span> <span class="o">=</span> <span class="nx">o</span><span class="p">;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">p</span><span class="p">);</span> <span class="c1">// 42</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">q</span><span class="p">);</span> <span class="c1">// true </span> <span class="kd">var</span> <span class="p">{</span><span class="nx">p</span><span class="o">:</span> <span class="nx">toto</span><span class="p">,</span> <span class="nx">q</span><span class="o">:</span> <span class="nx">truc</span><span class="p">}</span> <span class="o">=</span> <span class="nx">o</span><span class="p">;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">toto</span><span class="p">);</span> <span class="c1">// 42</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">truc</span><span class="p">);</span> <span class="c1">// true</span></code></pre> <h4 id="opérateur-de-décomposition">Opérateur de décomposition</h4> <p>L'opérateur de décomposition permet de développer une expression lorsque plusieurs arguments ou plusieurs éléments sont nécessaires.</p> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">params</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"salut"</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="mi">7</span> <span class="p">];</span> <span class="kd">var</span> <span class="nx">other</span> <span class="o">=</span> <span class="p">[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">...</span><span class="nx">params</span> <span class="p">];</span> <span class="c1">// [ 1, 2, "salut", true, 7 ]</span> <span class="nx">f</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">...</span><span class="nx">params</span><span class="p">)</span> <span class="o">===</span> <span class="mi">9</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">str</span> <span class="o">=</span> <span class="s2">"foo"</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">chars</span> <span class="o">=</span> <span class="p">[</span> <span class="p">...</span><span class="nx">str</span> <span class="p">];</span> <span class="c1">// [ "f", "o", "o" ]</span></code></pre> <h3 id="paramètres">Paramètres</h3> <p>Un paramètre du reste permet de représenter un nombre indéfini d'arguments sous forme d'un tableau.</p> <pre><code class="Javascript"><span class="kd">function</span> <span class="nx">f</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="p">...</span><span class="nx">a</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">)</span> <span class="o">*</span> <span class="nx">a</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="p">}</span> <span class="nx">f</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">"salut"</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span> <span class="o">===</span> <span class="mi">9</span><span class="p">;</span></code></pre> <p>Un paramètre par défaut permet d'initialiser des paramètres lors de l'appel de la fonction si la valeur passée est nulle (au sens où il n'y a aucune valeur de passée) ou undefined.</p> <pre><code class="Javascript"><span class="kd">function</span> <span class="nx">f</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span> <span class="o">=</span> <span class="mi">7</span><span class="p">,</span> <span class="nx">z</span> <span class="o">=</span> <span class="mi">42</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span> <span class="o">+</span> <span class="nx">z</span><span class="p">;</span> <span class="p">}</span> <span class="nx">f</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">===</span> <span class="mi">50</span><span class="p">;</span></code></pre> <h4 id="décomposition">Décomposition</h4> <p>Les valeurs des tableaux et les propriétés des objets passés en paramètre à une fonction seront décomposées.</p> <pre><code class="Javascript"><span class="kd">function</span> <span class="nx">f</span> <span class="p">([</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">val</span> <span class="p">])</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">val</span><span class="p">);</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">g</span> <span class="p">({</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">n</span><span class="p">,</span> <span class="nx">val</span><span class="o">:</span> <span class="nx">v</span> <span class="p">})</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">n</span><span class="p">,</span> <span class="nx">v</span><span class="p">);</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">h</span> <span class="p">({</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">val</span> <span class="p">})</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">val</span><span class="p">);</span> <span class="p">}</span> <span class="nx">f</span><span class="p">([</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="mi">42</span> <span class="p">]);</span> <span class="nx">g</span><span class="p">({</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">"foo"</span><span class="p">,</span> <span class="nx">val</span><span class="o">:</span> <span class="mi">7</span> <span class="p">});</span> <span class="nx">h</span><span class="p">({</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="nx">val</span><span class="o">:</span> <span class="mi">42</span> <span class="p">});</span></code></pre> <h3 id="nouvelles-notations">Nouvelles notations</h3> <h4 id="raccourcis-pour-les-noms-de-propriétés">Raccourcis pour les noms de propriétés</h4> <p>Une notation raccourcie permet de créer une propriété qui porte le nom de sa variable d'origine.</p> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="s2">"toto"</span><span class="p">,</span> <span class="nx">b</span> <span class="o">=</span> <span class="mi">42</span><span class="p">,</span> <span class="nx">c</span> <span class="o">=</span> <span class="p">{};</span> <span class="kd">var</span> <span class="nx">o</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span> <span class="p">};</span></code></pre> <h4 id="raccourcis-pour-les-noms-de-méthodes">Raccourcis pour les noms de méthodes</h4> <p>Une notation raccourcie permet de ne plus utiliser le mot-clé <code>function</code>.</p> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">o</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">property</span><span class="p">([</span><span class="nx">parameters</span><span class="p">])</span> <span class="p">{},</span> <span class="nx">get</span> <span class="nx">property</span><span class="p">()</span> <span class="p">{},</span> <span class="nx">set</span> <span class="nx">property</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{},</span> <span class="o">*</span> <span class="nx">generator</span><span class="p">()</span> <span class="p">{}</span> <span class="p">};</span></code></pre> <h4 id="noms-calculés-pour-les-propriétés">Noms calculés pour les propriétés</h4> <p>Une expression entre crochets [] peut être calculée en tant que nom d'une propriété.</p> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">prop</span> <span class="o">=</span> <span class="s2">"toto"</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">o</span> <span class="o">=</span> <span class="p">{</span> <span class="p">[</span><span class="nx">prop</span><span class="p">]</span><span class="o">:</span> <span class="s2">"hey"</span><span class="p">,</span> <span class="p">[</span><span class="s2">"tr"</span> <span class="o">+</span> <span class="s2">"uc"</span><span class="p">]</span><span class="o">:</span> <span class="s2">"ho"</span> <span class="p">};</span></code></pre> <h3 id="itérateur">Itérateur</h3> <p>L'instruction <code>for-of</code> permet de créer une boucle qui parcourt un objet itérable.</p> <pre><code class="Javascript"><span class="kd">let</span> <span class="nx">fibonacci</span> <span class="o">=</span> <span class="p">{</span> <span class="p">[</span><span class="nx">Symbol</span><span class="p">.</span><span class="nx">iterator</span><span class="p">]()</span> <span class="p">{</span> <span class="kd">let</span> <span class="nx">pre</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">cur</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="k">return</span> <span class="p">{</span> <span class="nx">next</span> <span class="p">()</span> <span class="p">{</span> <span class="p">[</span> <span class="nx">pre</span><span class="p">,</span> <span class="nx">cur</span> <span class="p">]</span> <span class="o">=</span> <span class="p">[</span> <span class="nx">cur</span><span class="p">,</span> <span class="nx">pre</span> <span class="o">+</span> <span class="nx">cur</span> <span class="p">];</span> <span class="k">return</span> <span class="p">{</span> <span class="nx">done</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">cur</span> <span class="p">};</span> <span class="p">}</span> <span class="p">};</span> <span class="p">}</span> <span class="p">}</span> <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">n</span> <span class="nx">of</span> <span class="nx">fibonacci</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">n</span> <span class="o">&gt;</span> <span class="mi">1000</span><span class="p">)</span> <span class="k">break</span><span class="p">;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">n</span><span class="p">);</span> <span class="p">}</span></code></pre> <h3 id="générateur">Générateur</h3> <p>Un générateur est une fonction qu'il est possible de quitter puis de reprendre. Le contexte d'un générateur (les liaisons avec ses variables) est sauvegardé entre les reprises successives.</p> <pre><code class="Javascript"><span class="kd">function</span><span class="o">*</span> <span class="nx">range</span> <span class="p">(</span><span class="nx">start</span><span class="p">,</span> <span class="nx">end</span><span class="p">,</span> <span class="nx">step</span><span class="p">)</span> <span class="p">{</span> <span class="k">while</span> <span class="p">(</span><span class="nx">start</span> <span class="o">&lt;</span> <span class="nx">end</span><span class="p">)</span> <span class="p">{</span> <span class="k">yield</span> <span class="nx">start</span><span class="p">;</span> <span class="nx">start</span> <span class="o">+=</span> <span class="nx">step</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="nx">of</span> <span class="nx">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span> <span class="c1">// 0, 2, 4, 6, 8</span> <span class="p">}</span></code></pre> <h3 id="promise">Promise</h3> <p>L'objet <code>Promise</code> (pour « promesse ») est utilisé pour réaliser des opérations de façon asynchrone. Une promesse est dans un de ces états :</p> <ul> <li> <em>en attente</em> : état initial, la promesse n'est ni remplie, ni rompue ;</li> <li> <em>tenue</em> : l'opération a réussi ;</li> <li> <em>rompue</em> : l'opération a échoué ;</li> <li> <em>acquittée</em> : la promesse est tenue ou rompue mais elle n'est plus en attente.</li> </ul><p>Le constructeur de l'objet <code>Promise</code> prend en argument une fonction avec deux paramètres : <code>resolve</code> et <code>reject</code>. Si la promesse est tenue, on appelle la fonction <code>resolve()</code> avec le résultat. Si elle est rompue, on appelle la fonction <code>reject()</code> avec la raison.</p> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">p1</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Promise</span><span class="p">((</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="nx">setTimeout</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="nx">resolve</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="mi">1000</span><span class="p">);</span> <span class="p">});</span></code></pre> <p>La méthode <code>then()</code> prend deux arguments qui sont deux fonctions <em>callback</em> à utiliser en cas de complétion ou d'échec de la <code>Promise</code>. Elle renvoie une <code>Promise</code>, on peut donc facilement enchaîner plusieurs appels à cette méthode.</p> <pre><code class="Javascript"><span class="nx">p1</span><span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">valeur</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">valeur</span><span class="p">);</span> <span class="c1">// 1</span> <span class="k">return</span> <span class="nx">valeur</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}).</span><span class="nx">then</span><span class="p">((</span><span class="nx">valeur</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">valeur</span><span class="p">);</span> <span class="c1">// 2</span> <span class="p">});</span></code></pre> <h3 id="module">Module</h3> <p>Les modules permettent de créer de nouveaux espaces de noms, et ainsi limiter la pollution de l'espace de nom global.</p> <h4 id="import">Import</h4> <pre><code class="Javascript"><span class="c1">// someApp.js</span> <span class="kr">import</span> <span class="o">*</span> <span class="nx">as</span> <span class="nx">math</span> <span class="nx">from</span> <span class="s2">"lib/math"</span><span class="p">;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"2π = "</span> <span class="o">+</span> <span class="nx">math</span><span class="p">.</span><span class="nx">sum</span><span class="p">(</span><span class="nx">math</span><span class="p">.</span><span class="nx">pi</span><span class="p">,</span> <span class="nx">math</span><span class="p">.</span><span class="nx">pi</span><span class="p">));</span></code></pre> <h4 id="export">Export</h4> <pre><code class="Javascript"><span class="c1">// lib/math.js</span> <span class="kr">export</span> <span class="kd">function</span> <span class="nx">sum</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span> <span class="p">};</span> <span class="kr">export</span> <span class="kd">var</span> <span class="nx">pi</span> <span class="o">=</span> <span class="mf">3.141593</span><span class="p">;</span></code></pre> <h3 id="réflexion">Réflexion</h3> <h4 id="proxy">Proxy</h4> <p>L'objet <code>Proxy</code> est utilisé afin de définir un comportement sur mesure pour certaines opérations fondamentales (par exemple, l'accès aux propriétés, les affectations, les énumérations, les appels de fonctions, etc.).</p> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">handler</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">get</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">cible</span><span class="p">,</span> <span class="nx">nom</span><span class="p">){</span> <span class="k">return</span> <span class="nx">nom</span> <span class="k">in</span> <span class="nx">cible</span> <span class="o">?</span> <span class="nx">cible</span><span class="p">[</span><span class="nx">nom</span><span class="p">]</span> <span class="o">:</span> <span class="mi">37</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Proxy</span><span class="p">({},</span> <span class="nx">handler</span><span class="p">);</span> <span class="nx">p</span><span class="p">.</span><span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">p</span><span class="p">.</span><span class="nx">b</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span> <span class="nx">p</span><span class="p">.</span><span class="nx">a</span> <span class="o">===</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">p</span><span class="p">.</span><span class="nx">b</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">;</span> <span class="s1">'c'</span> <span class="k">in</span> <span class="nx">p</span> <span class="o">===</span> <span class="kc">false</span><span class="p">;</span> <span class="nx">p</span><span class="p">.</span><span class="nx">c</span> <span class="o">===</span> <span class="mi">37</span><span class="p">;</span></code></pre> <h4 id="reflect">Reflect</h4> <p><code>Reflect</code> est un objet natif qui fournit des méthodes pour les opérations qui peuvent être interceptées (via les proxies). Reflect n'est pas une fonction (y compris pour construire un objet).</p> <pre><code class="Javascript"><span class="kd">let</span> <span class="nx">obj</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">a</span><span class="o">:</span> <span class="mi">1</span> <span class="p">};</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">,</span> <span class="p">{</span> <span class="nx">value</span><span class="o">:</span> <span class="mi">2</span> <span class="p">});</span> <span class="nx">obj</span><span class="p">[</span><span class="nx">Symbol</span><span class="p">(</span><span class="s2">"c"</span><span class="p">)]</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="nx">Reflect</span><span class="p">.</span><span class="nx">ownKeys</span><span class="p">(</span><span class="nx">obj</span><span class="p">);</span> <span class="c1">// [ "a", "b", Symbol(c) ]</span></code></pre> <h3 id="nouvelles-méthodes">Nouvelles méthodes</h3> <p>Voici quelques exemples de nouvelles méthodes qui ont été ajoutées aux objets standards.</p> <h4 id="object">Object</h4> <p>La méthode <code>Object.assign()</code> est utilisée afin de copier les valeurs de toutes les propriétés directes (non héritées) d'un objet qui sont énumérables sur un autre objet cible.</p> <pre><code class="Javascript"><span class="kd">var</span> <span class="nx">dst</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">quux</span><span class="o">:</span> <span class="mi">0</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">src1</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">foo</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">bar</span><span class="o">:</span> <span class="mi">2</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">src2</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">foo</span><span class="o">:</span> <span class="mi">3</span><span class="p">,</span> <span class="nx">baz</span><span class="o">:</span> <span class="mi">4</span> <span class="p">};</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">assign</span><span class="p">(</span><span class="nx">dst</span><span class="p">,</span> <span class="nx">src1</span><span class="p">,</span> <span class="nx">src2</span><span class="p">);</span></code></pre> <p>La méthode <code>Object.setPrototypeOf()</code> définit le prototype d'un objet donné avec un autre objet ou null.</p> <pre><code class="Javascript"><span class="kd">function</span> <span class="nx">Parent</span><span class="p">(){}</span> <span class="kd">function</span> <span class="nx">Child</span><span class="p">(){}</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">setPrototypeOf</span><span class="p">(</span><span class="nx">Child</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="nx">Parent</span><span class="p">.</span><span class="nx">prototype</span><span class="p">);</span> <span class="k">new</span> <span class="nx">Child</span> <span class="k">instanceof</span> <span class="nx">Child</span><span class="p">;</span> <span class="c1">// true</span> <span class="k">new</span> <span class="nx">Child</span> <span class="k">instanceof</span> <span class="nx">Parent</span><span class="p">;</span> <span class="c1">// true</span></code></pre> <h4 id="array">Array</h4> <p>La méthode <code>find()</code> renvoie une valeur contenue dans le tableau si un élément du tableau respecte une condition donnée par la fonction de test passée en argument.</p> <pre><code class="Javascript"><span class="p">[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">2</span> <span class="p">].</span><span class="nx">find</span><span class="p">(</span><span class="nx">x</span> <span class="o">=&gt;</span> <span class="nx">x</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">);</span> <span class="c1">// 4</span></code></pre> <h4 id="string">String</h4> <p>Les méthodes <code>startsWith()</code>, <code>endsWith()</code> et <code>includes()</code> renvoient un booléen indiquant, respectivement, si la chaîne de caractères commence par, se termine par ou contient la deuxième chaîne de caractères fournie en argument.</p> <pre><code class="Javascript"><span class="s2">"hello"</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s2">"ello"</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="c1">// true</span> <span class="s2">"hello"</span><span class="p">.</span><span class="nx">endsWith</span><span class="p">(</span><span class="s2">"hell"</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span> <span class="c1">// true</span> <span class="s2">"hello"</span><span class="p">.</span><span class="nx">includes</span><span class="p">(</span><span class="s2">"ell"</span><span class="p">);</span> <span class="c1">// true</span> <span class="s2">"hello"</span><span class="p">.</span><span class="nx">includes</span><span class="p">(</span><span class="s2">"ell"</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="c1">// true</span> <span class="s2">"hello"</span><span class="p">.</span><span class="nx">includes</span><span class="p">(</span><span class="s2">"ell"</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span> <span class="c1">// false</span></code></pre> <p>La méthode <code>repeat()</code> construit et renvoie une nouvelle chaîne de caractères qui contient le nombre de copies demandées de la chaîne de caractères sur laquelle la méthode a été appelée, concaténées les unes aux autres.</p> <pre><code class="Javascript"><span class="s2">" "</span><span class="p">.</span><span class="nx">repeat</span><span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="nx">depth</span><span class="p">);</span> <span class="s2">"foo"</span><span class="p">.</span><span class="nx">repeat</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span></code></pre> <h4 id="number">Number</h4> <p>La méthode <code>Number.isSafeInteger()</code> permet de déterminer si la valeur, passée en argument, est un entier représentable correctement en ECMAScript (c'est-à-dire un nombre compris entre -(2<sup>53</sup> -1) et 2<sup>53</sup> -1).</p> <pre><code class="Javascript"><span class="nb">Number</span><span class="p">.</span><span class="nx">isSafeInteger</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> <span class="o">===</span> <span class="kc">true</span><span class="p">;</span> <span class="nb">Number</span><span class="p">.</span><span class="nx">isSafeInteger</span><span class="p">(</span><span class="mi">9007199254740992</span><span class="p">)</span> <span class="o">===</span> <span class="kc">false</span><span class="p">;</span></code></pre> <h3 id="autres-fonctionnalités">Autres fonctionnalités</h3> <ul> <li>Les nombres octaux et binaires sous une forme littérale</li> <li>Les tableaux typés</li> <li>Les gabarits de chaînes de caractères</li> <li>Les objets Map et Set et leurs équivalents avec références faibles</li> <li>Amélioration de la gestion de l'Unicode pour les chaînes de caractères et les expressions rationnelles</li> </ul><p>Il ne reste plus qu'à attendre que toutes ces nouveautés arrivent jusqu'à votre navigateur préféré.</p> <h3 id="conversion">Conversion</h3> <p>La conversion des nouveautés du ECMAScript 2015 vers le langage compris par les précédentes implémentations peut se faire à l'aide d'outils. Plusieurs nouveautés peuvent être implémentées par ECMAScript lui-même.</p> <h4 id="compilateur">Compilateur</h4> <p>Il est possible de faire appel à un compilateur pour convertir les nouvelles fonctionnalités du langage vers du code compatible avec les anciennes implémentations. Il est plus facile de compiler le code depuis le serveur et envoyer seulement le résultat au client.</p> <p><strong><a href="https://babeljs.io/">Babel</a></strong> est un de ces compilateurs. Tous les exemples proposés ici compilent avec <strong>Babel</strong>. Une application Web permet de tester ses connaissances depuis un navigateur sans installer quoi que ce soit. Par contre, elle ne traduit pas les nouvelles méthodes. Il faut faire appel à d'autres outils pour avoir une application fonctionnelle.</p> <h4 id="api">API</h4> <p>Des bibliothèques sont disponibles pour l'implémentation des nouvelles API.</p> <p><strong><a href="https://github.com/zloirock/core-js">core-js</a></strong> implémente les nouveaux objets et les nouvelles méthodes du langage. Elle s'utilise en complément d'un compilateur comme <strong>Babel</strong>.</p></div><div><a href="https://linuxfr.org/news/ecmascript-2015-est-approuve.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/106156/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/ecmascript-2015-est-approuve#comments">ouvrir dans le navigateur</a> </p> supergab palm123 BAud Kaane ZeroHeure DontShootMe https://linuxfr.org/nodes/106156/comments.atom tag:linuxfr.org,2005:News/36373 2015-04-29T08:11:56+02:00 2015-04-29T15:09:23+02:00 RapydScript, le JavaScript qui se déguise en Python Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>RapydScript est un langage qui se compile en JavaScript, avec une syntaxe et des fonctionnalités qui se veulent proches de Python. Pour ceux qui connaissent coffeeScript, RapydScript est pareil mais inspiré par la lisibilité de Python. Il ne s'agit pas d'une nouvelle tentative de faire tourner Python dans le navigateur, comme par exemple Pyjamas. RapydScript reste du JavaScript, il n'introduit aucune limitation ni surcoût. Il paraît juste plus propre et donne l'impression d'écrire du Python. </p> <p>Ses quelques fonctionnalités :</p> <ul> <li>comme CoffeeScript, RapydScript répare les incohérences et inconsistances de JavaScript ;</li> <li>un <a href="https://github.com/atsepkov/rapydscript#classes">système de classes</a> similaire à Python ;</li> <li>support des <a href="http://fr.wikipedia.org/wiki/Liste_en_compr%C3%A9hension">listes en compréhensions</a> ;</li> <li>des <a href="https://github.com/atsepkov/rapydscript#exception-handling">exceptions</a> comme en Python ;</li> <li>des <a href="https://github.com/atsepkov/rapydscript#modules">modules, plus flexibles</a> que les modules Python ;</li> <li>des arguments optionnels pour les fonctions, comme en Python ;</li> <li>des décorateurs (sans arguments) ;</li> <li>un système d'héritage plus puissant que celui de Python et plus clair que celui de JavaScript ;</li> <li>le support d'objets (dictionnaires) avec fonctions anonymes, comme en JavaScript ;</li> <li>la possibilité d’appeler n'importe quelle fonction, méthode, code JavaScript ou appel au DOM de n'importe quel framework, sans syntaxe spéciale ;</li> <li>le choix entre les méthodes et fonctions à la Python ou leurs équivalents JavaScript ;</li> <li>RapydScript s'auto-compile, c'est à dire que le compilateur est lui-même écrit en RapydScript et compile en JavaScript.</li> </ul></div><ul><li>lien nᵒ 1 : <a title="https://www.rapydscript.com/" hreflang="en" href="https://linuxfr.org/redirect/93900">Site officiel</a></li><li>lien nᵒ 2 : <a title="https://www.rapydscript.com/full-manual/" hreflang="en" href="https://linuxfr.org/redirect/93901">Le manuel entier</a></li><li>lien nᵒ 3 : <a title="https://www.reddit.com/r/Python/comments/2xcjht/new_website_for_rapydscript_the_pythonic/" hreflang="en" href="https://linuxfr.org/redirect/93902">Une discussion Reddit</a></li><li>lien nᵒ 4 : <a title="https://github.com/atsepkov/RapydScript" hreflang="en" href="https://linuxfr.org/redirect/93903">Github</a></li><li>lien nᵒ 5 : <a title="http://groups.google.com/group/rapydscript" hreflang="en" href="https://linuxfr.org/redirect/93904">Le groupe de discussion</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li><a href="#installation">Installation</a></li> <li><a href="#biblioth%C3%A8que-standard">Bibliothèque standard</a></li> <li> <a href="#exemples">Exemples</a><ul> <li><a href="#appel-%C3%A0-javascript">Appel à JavaScript</a></li> <li><a href="#d%C3%A9finir-des-fonctions">Définir des fonctions</a></li> <li><a href="#example-%C3%A9crire-une-cha%C3%AEne-de-callbacks">Example: écrire une chaîne de callbacks</a></li> </ul> </li> <li> <a href="#autres-outils">Autres outils</a><ul> <li><a href="#un-d%C3%A9-compileur-javascript-rapydscript">un dé-compileur JavaScript-&gt;RapydScript :</a></li> <li><a href="#rapydfiddle-pour-partager-du-code-en-ligne">RapydFiddle pour partager du code en ligne</a></li> <li><a href="#gulp">gulp</a></li> <li><a href="#grunt">grunt</a></li> <li><a href="#extension-pour-django">extension pour Django</a></li> <li><a href="#adaptation-%C3%A0-django-pipeline">adaptation à Django-pipeline</a></li> <li><a href="#mode-emacs">mode emacs</a></li> <li><a href="#vim">vim</a></li> <li><a href="#atom">atom</a></li> </ul> </li> <li><a href="#conclusion">Conclusion</a></li> </ul><p>Voici un court exemple qui utilise JQuery :</p> <pre><code class="python"><span class="k">class</span> <span class="nc">Popup</span><span class="p">:</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">containterId</span><span class="p">):</span> <span class="c"># pop-up class will give us absolute position, high z-index and center the container</span> <span class="bp">self</span><span class="o">.</span><span class="err">$</span><span class="n">popup</span> <span class="o">=</span> <span class="err">$</span><span class="p">(</span><span class="s">'#'</span> <span class="o">+</span> <span class="n">containerId</span><span class="p">)</span><span class="o">.</span><span class="n">addClass</span><span class="p">(</span><span class="s">'pop-up'</span><span class="p">)</span><span class="o">.</span><span class="n">mouseout</span><span class="p">(</span><span class="n">def</span><span class="p">():</span> <span class="bp">self</span><span class="o">.</span><span class="n">hide</span><span class="p">()</span> <span class="c"># unlike 'this', 'self' will reference the object itself</span> <span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_</span><span class="err">$</span><span class="n">darkbg</span> <span class="o">=</span> <span class="err">$</span><span class="p">(</span><span class="s">'#dark-bg'</span><span class="p">)</span> <span class="c"># overlays background with a dim layer to draw focus to the pop-up</span> <span class="k">def</span> <span class="nf">show</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_</span><span class="err">$</span><span class="n">darkbg</span><span class="o">.</span><span class="n">show</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="err">$</span><span class="n">popup</span><span class="o">.</span><span class="n">show</span><span class="p">()</span> <span class="k">def</span> <span class="nf">hide</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_</span><span class="err">$</span><span class="n">darkbg</span><span class="o">.</span><span class="n">hide</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="err">$</span><span class="n">popup</span><span class="o">.</span><span class="n">hide</span><span class="p">()</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">Popup</span><span class="p">(</span><span class="s">'my-popup'</span><span class="p">)</span> <span class="n">msg</span><span class="o">.</span><span class="n">show</span><span class="p">()</span></code></pre> <p>Notons toutefois quelques limitations :</p> <ul> <li>le source mapping n'est pas implémenté, mais l'auteur compte le faire ;</li> <li>pas shell (repl) non plus, mais l'auteur le souhaite également ;</li> <li>RapydScript a <a href="https://github.com/atsepkov/rapydscript#quirks">quelques bugs connus</a>.</li> </ul><h2 id="installation">Installation</h2> <p>Comme d'habitude avec les applications Node.js, on utilise npm :<br><code><br> npm install rapydscript -g<br></code></p> <h2 id="bibliothèque-standard">Bibliothèque standard</h2> <p>Il est assez facile de faire tourner un code Python existant dans le navigateur car RapydScript a ré-implenté quelques bibliothèques standard de Python. Par exemple si vous utilisez <code>range</code>, <code>print</code>, ou <code>list.append</code>, il vous suffit d'importer la <code>stdlib.js</code> de rapydscript. Soit par un import explicite dans votre HTML, soit par la ligne <code>import stlib</code> dans votre code <code>.pyj</code>. </p> <p>Il existe aussi le module <code>math</code>, <code>re</code>, <code>unittest</code>, <code>random</code> et <code>yql</code>.</p> <p>Mais si vous écrivez du nouveau code, il est conseillé de se baser sur les bibliothèques JavaScript existantes, plus fournies.</p> <h2 id="exemples">Exemples</h2> <h3 id="appel-à-javascript">Appel à JavaScript</h3> <p>Si jamais vous devez appeler directement du JavaScript à cause d'une limitation de RapydScript, vous pouvez le faire avec la fonction <code>JS</code> :<br><code><br> JS('module').exports # meilleur équivalent à JS('module.exports') <br></code></p> <h3 id="définir-des-fonctions">Définir des fonctions</h3> <p>Une fonction tout à fait classique en RapydScript :</p> <pre><code class="python"><span class="c">#regular</span> <span class="k">def</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span> <span class="k">elif</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="mi">1</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">fibinacci</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fibinacci</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="n">a</span> <span class="o">=</span> <span class="n">fibinacci</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span></code></pre> <p>L'équivalent en JavaScript :</p> <pre><code class="javascript"><span class="kd">function</span> <span class="nx">fibonacci</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">n</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">n</span> <span class="o">===</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">fibinacci</span><span class="p">(</span><span class="nx">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nx">fibinacci</span><span class="p">(</span><span class="nx">n</span> <span class="o">-</span> <span class="mi">2</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="nx">a</span> <span class="o">=</span> <span class="nx">fibonacci</span><span class="p">(</span><span class="mi">8</span><span class="p">);</span></code></pre> <p>Utiliser des fonctions anonymes :</p> <pre><code class="python"><span class="c"># anonymous</span> <span class="n">math</span> <span class="o">=</span> <span class="p">{</span> <span class="n">add</span><span class="p">:</span> <span class="n">def</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="k">return</span> <span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="p">;,</span> <span class="n">sub</span><span class="p">:</span> <span class="n">def</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="k">return</span> <span class="n">a</span><span class="o">-</span><span class="n">b</span><span class="p">;,</span> <span class="n">mul</span><span class="p">:</span> <span class="n">def</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="k">return</span> <span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="p">;,</span> <span class="n">div</span><span class="p">:</span> <span class="n">def</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span> <span class="k">return</span> <span class="n">a</span><span class="o">/</span><span class="n">b</span><span class="p">;,</span> <span class="n">roots</span><span class="p">:</span> <span class="n">def</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span> <span class="n">r</span> <span class="o">=</span> <span class="n">Math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">b</span><span class="o">*</span><span class="n">b</span> <span class="o">-</span> <span class="mi">4</span><span class="o">*</span><span class="n">a</span><span class="o">*</span><span class="n">c</span><span class="p">)</span> <span class="n">d</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">a</span> <span class="k">return</span> <span class="p">(</span><span class="o">-</span><span class="n">b</span> <span class="o">+</span> <span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">d</span><span class="p">,</span> <span class="p">(</span><span class="o">-</span><span class="n">b</span> <span class="o">-</span> <span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">d</span> <span class="p">}</span></code></pre> <p>Des arguments optionnels comme en Python :</p> <pre><code class="python"><span class="c"># with optional arguments</span> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">quantity</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">quantity</span><span class="p">)]</span> <span class="n">a</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s">'hammer'</span><span class="p">)</span> <span class="n">b</span> <span class="o">=</span> <span class="n">get</span><span class="p">(</span><span class="s">'nail'</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span></code></pre> <p>Ce qui produit le JavaScript suivant :</p> <pre><code class="javascript"><span class="kd">function</span> <span class="nx">get</span><span class="p">(</span><span class="nx">item</span><span class="p">,</span> <span class="nx">quantity</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">quantity</span> <span class="o">===</span> <span class="s2">"undefined"</span><span class="p">)</span> <span class="nx">quantity</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="k">return</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">_$rapyd$_Iter</span> <span class="o">=</span> <span class="nx">range</span><span class="p">(</span><span class="nx">quantity</span><span class="p">),</span> <span class="nx">_$rapyd$_Result</span> <span class="o">=</span> <span class="p">[],</span> <span class="nx">i</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">_$rapyd$_Index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">_$rapyd$_Index</span> <span class="o">&lt;</span> <span class="nx">_$rapyd$_Iter</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">_$rapyd$_Index</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="nx">i</span> <span class="o">=</span> <span class="nx">_$rapyd$_Iter</span><span class="p">[</span><span class="nx">_$rapyd$_Index</span><span class="p">];</span> <span class="nx">_$rapyd$_Result</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">item</span><span class="p">);</span> <span class="p">}</span> <span class="k">return</span> <span class="nx">_$rapyd$_Result</span><span class="p">;</span> <span class="p">})();</span> <span class="p">}</span> <span class="nx">a</span> <span class="o">=</span> <span class="nx">get</span><span class="p">(</span><span class="s2">"hammer"</span><span class="p">);</span> <span class="nx">b</span> <span class="o">=</span> <span class="nx">get</span><span class="p">(</span><span class="s2">"nail"</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span> <span class="c1">// les deux fonctions utilitaires créées:</span> <span class="kd">function</span> <span class="nx">range</span><span class="p">(</span><span class="nx">start</span><span class="p">,</span> <span class="nx">stop</span><span class="p">,</span> <span class="nx">step</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="nx">stop</span> <span class="o">=</span> <span class="nx">start</span> <span class="o">||</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">start</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> <span class="nx">step</span> <span class="o">=</span> <span class="nx">arguments</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">||</span> <span class="mi">1</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">length</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">max</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">ceil</span> <span class="p">((</span><span class="nx">stop</span> <span class="o">-</span> <span class="nx">start</span><span class="p">)</span> <span class="o">/</span> <span class="nx">step</span><span class="p">)</span> <span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">idx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">range</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="p">(</span><span class="nx">length</span><span class="p">);</span> <span class="k">while</span> <span class="p">(</span><span class="nx">idx</span> <span class="o">&lt;</span> <span class="nx">length</span><span class="p">)</span> <span class="p">{</span> <span class="nx">range</span><span class="p">[</span><span class="nx">idx</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="nx">start</span><span class="p">;</span> <span class="nx">start</span> <span class="o">+=</span> <span class="nx">step</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="nx">range</span><span class="p">;</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">_$rapyd$_print</span><span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">args</span><span class="p">,</span> <span class="nx">output</span><span class="p">;</span> <span class="nx">args</span> <span class="o">=</span> <span class="p">[].</span><span class="nx">slice</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">arguments</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="nx">output</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">args</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="s2">"console"</span> <span class="k">in</span> <span class="nb">window</span><span class="p">)</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">output</span><span class="p">.</span><span class="nx">substr</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">output</span><span class="p">.</span><span class="nx">length</span><span class="o">-</span><span class="mi">2</span><span class="p">));</span> <span class="p">}</span></code></pre> <p>L'usage de décorateurs (sans arguments) :</p> <pre><code class="python"><span class="c"># and finally, decorated</span> <span class="k">def</span> <span class="nf">makebold</span><span class="p">(</span><span class="n">fn</span><span class="p">):</span> <span class="k">return</span> <span class="n">def</span><span class="p">():</span> <span class="k">return</span> <span class="s">"&lt;b&gt;"</span> <span class="o">+</span> <span class="n">fn</span><span class="p">()</span> <span class="o">+</span> <span class="s">"&lt;/b&gt;"</span> <span class="k">def</span> <span class="nf">makeitalic</span><span class="p">(</span><span class="n">fn</span><span class="p">):</span> <span class="k">return</span> <span class="n">def</span><span class="p">():</span> <span class="k">return</span> <span class="s">"&lt;i&gt;"</span> <span class="o">+</span> <span class="n">fn</span><span class="p">()</span> <span class="o">+</span> <span class="s">"&lt;/i&gt;"</span> <span class="nd">@makebold</span> <span class="nd">@makeitalic</span> <span class="k">def</span> <span class="nf">hello</span><span class="p">():</span> <span class="k">return</span> <span class="s">"hello world"</span></code></pre> <h3 id="example-écrire-une-chaîne-de-callbacks">Example: écrire une chaîne de callbacks</h3> <p>On fait souvent appel à une suite de callbacks en JavaScript. C'est tout à fait facile en RapydScript :</p> <pre><code class="python"><span class="n">params</span> <span class="o">=</span> <span class="p">{</span> <span class="n">width</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span> <span class="n">height</span><span class="p">:</span> <span class="mi">30</span><span class="p">,</span> <span class="n">onclick</span><span class="p">:</span> <span class="n">def</span><span class="p">(</span><span class="n">event</span><span class="p">):</span> <span class="n">alert</span><span class="p">(</span><span class="s">"you clicked me"</span><span class="p">),</span> <span class="n">onmouseover</span><span class="p">:</span> <span class="n">def</span><span class="p">(</span><span class="n">event</span><span class="p">):</span> <span class="err">$</span><span class="p">(</span><span class="n">this</span><span class="p">)</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">'background'</span><span class="p">,</span> <span class="s">'red'</span><span class="p">)</span> <span class="p">,</span> <span class="n">onmouseout</span><span class="p">:</span> <span class="n">def</span><span class="p">(</span><span class="n">event</span><span class="p">):</span> <span class="c"># reset the background</span> <span class="err">$</span><span class="p">(</span><span class="n">this</span><span class="p">)</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s">'background'</span><span class="p">,</span> <span class="s">''</span><span class="p">)</span> <span class="p">}</span></code></pre> <p>Pour plus de détails, voyez "<a href="https://github.com/atsepkov/rapydscript#chaining-blocks">chaining blocks</a>" dans la documentation.</p> <h2 id="autres-outils">Autres outils</h2> <p>RapydScript est assez jeune et n'a pas autant d'outils que, par exemple, CoffeeScript, mais on commence à voir des extensions pour Django ou d'autres outils Node, comme Gulp ou Grunt, ce qui permet de l'intégrer facilement à son projet AngularJS ou autre.</p> <h3 id="un-dé-compileur-javascript-rapydscript">un dé-compileur JavaScript-&gt;RapydScript :</h3> <p><a href="https://github.com/charleslaw/RapydScript-Decompiler">https://github.com/charleslaw/RapydScript-Decompiler</a></p> <h3 id="rapydfiddle-pour-partager-du-code-en-ligne">RapydFiddle pour partager du code en ligne</h3> <p><a href="http://rapydscript.pyjeon.com/">http://rapydscript.pyjeon.com/</a> (cliquer sur "démo")</p> <h3 id="gulp">gulp</h3> <p><a href="https://github.com/vindarel/gulp-rapyd">https://github.com/vindarel/gulp-rapyd</a> (utilisable mais pas fini)</p> <h3 id="grunt">grunt</h3> <p><a href="https://github.com/loolmeh/grunt-rapydscript">https://github.com/loolmeh/grunt-rapydscript</a></p> <h3 id="extension-pour-django">extension pour Django</h3> <p><a href="https://github.com/pztrick/DjScript">https://github.com/pztrick/DjScript</a></p> <h3 id="adaptation-à-django-pipeline">adaptation à Django-pipeline</h3> <p><a href="https://github.com/traverseda/django-pipeline-rapydscript">https://github.com/traverseda/django-pipeline-rapydscript</a></p> <h3 id="mode-emacs">mode emacs</h3> <p><a href="https://gitlab.com/emacs-stuff/rapyd-mode">https://gitlab.com/emacs-stuff/rapyd-mode</a></p> <h3 id="vim">vim</h3> <p><a href="https://github.com/atsepkov/vim-rapydscript">https://github.com/atsepkov/vim-rapydscript</a> (la configuration de l'auteur)</p> <h3 id="atom">atom</h3> <p><a href="https://atom.io/packages/language-rapydscript">https://atom.io/packages/language-rapydscript</a></p> <h2 id="conclusion">Conclusion</h2> <p>Nous n'avons pas expliqué tout le fonctionnement de RapydScript, pour cela il y a la bonne documentation. Nous espérons vous avoir fait miroiter de nouveau ce vieux rêve: écrire une application web dans un seul langage, en Python. </p></div><div><a href="https://linuxfr.org/news/rapydscript-le-javascript-qui-se-deguise-en-python.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/105578/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/rapydscript-le-javascript-qui-se-deguise-en-python#comments">ouvrir dans le navigateur</a> </p> dzecniv Nils Ratusznik palm123 Nÿco Ontologia ZeroHeure bubar🦥 https://linuxfr.org/nodes/105578/comments.atom tag:linuxfr.org,2005:News/35864 2014-11-05T22:44:18+01:00 2014-11-05T23:34:23+01:00 Worldwide Meteor 1.0 Day le 6 novembre 2014 chez Numa (Paris) Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Rejoignez nous à Paris jeudi 6 novembre vers 18h30 chez <a href="https://www.numa.paris/">Numa</a> pour un événement unique : le Worldwide Meteor 1.0 Day ! Meteor est une plate‐forme <em>open source</em> facilitant le développement d’applications modernes Internet et mobiles en JavaScript.</p> <p>Toute la communauté Meteor organise des meetups simultanément à travers le monde le 6 novembre ; ouvert à tous ceux qui sont intéressés à en apprendre plus sur la plate-forme Meteor.</p> <p>Vous aurez la chance de rencontrer des développeurs d'applications réalisées avec Meteor, jouer avec les nouveaux exemples et tutoriels ainsi que de participer à une session de questions/réponses via Hangouts avec un développeur du Meteor Development Group et d'experts de la communauté.</p></div><ul><li>lien nᵒ 1 : <a title="http://www.meetup.com/Meteor-Paris/events/209630542/" hreflang="fr" href="https://linuxfr.org/redirect/92174">Worldwide Meteor 1.0 Day - Paris</a></li><li>lien nᵒ 2 : <a title="http://linuxfr.org/news/meteor-1-0" hreflang="fr" href="https://linuxfr.org/redirect/92175">Dépêche LinuxFR sur la sortie de Meteor 1.0</a></li><li>lien nᵒ 3 : <a title="http://www.morea.fr" hreflang="fr" href="https://linuxfr.org/redirect/92176">Morea</a></li><li>lien nᵒ 4 : <a title="http://aws.amazon.com/fr/" hreflang="en" href="https://linuxfr.org/redirect/92177">Amazon AWS</a></li><li>lien nᵒ 5 : <a title="https://www.numa.paris/" hreflang="fr" href="https://linuxfr.org/redirect/92178">Numa</a></li><li>lien nᵒ 6 : <a title="http://www.meteor.com" hreflang="en" href="https://linuxfr.org/redirect/92179">Meteor</a></li><li>lien nᵒ 7 : <a title="http://meteorday.com/" hreflang="en" href="https://linuxfr.org/redirect/92180">Worldwide Meteor 1.0 Day</a></li></ul><div><p>Avec le soutien de <a href="http://www.morea.fr">Morea</a> et d’<a href="http://aws.amazon.com/fr/">Amazon AWS</a> nous aurons des bonus à distribuer aux plus méritants d'entre-vous. N'oubliez pas d'apporter vos ordinateurs portables pour tester et développer ensemble en Meteor pendant la soirée.</p> <p><img src="//img.linuxfr.org/img/68747470733a2f2f7062732e7477696d672e636f6d2f6d656469612f4231735230766b494d4141346e79582e6a70673a736d616c6c/B1sR0vkIMAA4nyX.jpg:small" alt="Worldwide Meteor 1.0 Day - Paris" title="Source : https://pbs.twimg.com/media/B1sR0vkIMAA4nyX.jpg:small"></p> <p>Si vous avez développé une application Meteor, n'hésitez pas à nous contacter afin de la présenter pendant la session “Show &amp; Tell”. Cela peut être tout type de projet, petit ou grand, une application complexe ou juste quelque chose que vous avez fait rapidement un week-end.</p> <h3 id="lieu-">Lieu :</h3> <p>Numa, 39 rue du Caire, Paris</p> <h3 id="planning-">Planning :</h3> <ul> <li>18h30 - Ouverture des portes.</li> <li>19h00 - Introduction à Meteor. Présentation des nouveaux tutoriels et exemples.</li> <li>19h30 - Install party. L’occasion pour tout le monde d’installer Meteor et déployer un des exemples.</li> <li>19h59 - Courte pause. Prenez une photo de groupe et tweetez la. :)</li> <li>20h00 - Q &amp; A. Hangout en direct avec la core team de Meteor ou des experts de la communauté Meteor (préparez vos questions à l’avance).</li> <li>20h30 - Lunch</li> <li>20h45 - Show &amp; Tell. Vous avez développé une application avec Meteor ? Nous voulons la voir ! Courtes démos informelles ou courtes présentations des développeurs Meteor Français.</li> <li>vers 21h00 - Ouverture du co-programmation / networking. Objectif: Construire quelque chose de cool avec ce que vous venez d'apprendre.</li> </ul></div><div><a href="https://linuxfr.org/news/worldwide-meteor-1-0-day-le-6-novembre-2014-chez-numa-paris.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/103865/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/worldwide-meteor-1-0-day-le-6-novembre-2014-chez-numa-paris#comments">ouvrir dans le navigateur</a> </p> Pascal Richier ZeroHeure Benoît Sibaud https://linuxfr.org/nodes/103865/comments.atom tag:linuxfr.org,2005:News/35838 2014-10-31T09:01:36+01:00 2014-10-31T11:50:16+01:00 Meteor 1.0 Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>Meteor est une plate‐forme <em>open source</em> facilitant le développement d’applications modernes Internet et mobiles en JavaScript. Il offre des fonctions de mise à jour automatique des interfaces permettant le travail collaboratif temps réel et des interfaces intuitives assurant la même expérience utilisateur qu’une application de bureau. Ces applications peuvent s’exécuter dans un navigateur Web, ainsi que sur tous les appareils mobiles (applications natives avec Cordova/PhoneGap).</p> <p>Meteor 1.0 est sorti hier soir, annoncé par Matt DeBergalis du MDG (<em>Meteor Developpement Group</em>). Cette version assure la stabilité de l’API, qui jusqu’alors évoluait fortement entre chaque version.</p> <p>Voyez sa description en seconde partie de l’article…</p></div><ul><li>lien nᵒ 1 : <a title="https://www.meteor.com/blog/2014/10/28/meteor-1-0" hreflang="en" href="https://linuxfr.org/redirect/92090">La dépêche sur le blog de Meteor</a></li><li>lien nᵒ 2 : <a title="http://france.meteor.com" hreflang="fr" href="https://linuxfr.org/redirect/92091">Meteor France</a></li><li>lien nᵒ 3 : <a title="http://www.meteor.com" hreflang="en" href="https://linuxfr.org/redirect/92092">Le site officiel de Meteor</a></li><li>lien nᵒ 4 : <a title="http://docs.meteor.com" hreflang="en" href="https://linuxfr.org/redirect/92093">La documentation officielle</a></li><li>lien nᵒ 5 : <a title="https://www.meteor.com/install" hreflang="en" href="https://linuxfr.org/redirect/92094">Le tutoriel officiel</a></li><li>lien nᵒ 6 : <a title="https://www.meteor.com/projects" hreflang="en" href="https://linuxfr.org/redirect/92095">L’architecture Meteor</a></li><li>lien nᵒ 7 : <a title="https://atmospherejs.com/" hreflang="en" href="https://linuxfr.org/redirect/92096">Les greffons de la communauté</a></li><li>lien nᵒ 8 : <a title="http://www.meetup.com/Meteor-Paris/" hreflang="fr" href="https://linuxfr.org/redirect/92097">Meetup Meteor-Paris</a></li><li>lien nᵒ 9 : <a title="https://meteorhacks.com/profiling-a-meteor-app-telescope.html" hreflang="en" href="https://linuxfr.org/redirect/92098">Une analyse des performances de Meteor côté serveur (NodeJS)</a></li></ul><div><p>Meteor est composé d’une poignée de greffons noyau (<em>core packages</em>) développés par le MDG et de plus de 2 400 greffons développés par la communauté, dont des membres de <a href="http://france.meteor.com/">Meteor France</a>. Afin de comprendre comment est constituée l’architecture logicielle de Meteor, nous vous invitons à consulter <a href="https://www.meteor.com/projects">l’explication sur le site de Meteor</a>.</p> <p>Nouveau avec Meteor ? Les trois pistes suivantes devraient vous aider :</p> <ul> <li><p>tout d’abord, un nouveau tutoriel décrivant le développement pas à pas d’un outil collaboratif et introduisant chaque élément composant Meteor ;</p></li> <li><p>ensuite, de nouveaux exemples d’applications ont aussi fait leur apparition, afin que vous puissiez consulter leur architecture. La première est une application de « À faire » (<em>TODO</em>) avec des tâches privées et partagées. La deuxième est une application de marché local avec partage de photos, utilisées par des commerces de proximité afin de créer une véritable communauté autour de leur activité. Agrémentée d’une authentification Twitter et de la prise en charge des appareils photo sur mobile, cette application totalise moins de 1 000 lignes de pur JavaScript ;</p></li> <li><p>enfin, pour célébrer la sortie de la version 1.0, les responsables de <em>Discover Meteor</em> ont lancé une édition gratuite de leur excellent livre en ligne. Vous avez huit jours pour <a href="https://book.discovermeteor.com/starter">profiter de cette offre</a>.</p></li> </ul><p>Meteor reçoit en France un soutien important de <a href="http://www.morea.fr">Morea</a> et d’<a href="http://aws.amazon.com/fr/">Amazon AWS</a> qui sont les sponsors principaux des événements organisés par Meteor France via leur groupe Meetup <a href="http://www.meetup.com/Meteor-Paris/">Meteor Paris</a>.</p></div><div><a href="https://linuxfr.org/news/meteor-1-0.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/103782/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/meteor-1-0#comments">ouvrir dans le navigateur</a> </p> Pascal Davy Defaud BAud Nils Ratusznik palm123 Pierre Jarillon https://linuxfr.org/nodes/103782/comments.atom tag:linuxfr.org,2005:News/35642 2014-09-04T14:13:52+02:00 2014-09-04T14:13:52+02:00 Un ebook sur AngularJS à prix libre et pour une bonne cause Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p><em>Devenez un Ninja avec AngularJS</em> : un ebook à prix libre et en soutien à une association caritative.</p> <p>Ninja Squad <a href="https://books.ninja-squad.com">propose un livre</a> permettant de découvrir ou d'approfondir ses connaissances du framework web <a href="https://angularjs.org/">AngularJS</a>. Sur le modèle des <a href="https://www.humblebundle.com/">Humble Bundle</a>, cet ebook est proposé à prix libre, et en soutien optionnel à une association caritative : <a href="http://www.docteursouris.fr/">Docteur Souris</a>, qui fournit des ordinateurs et des accès internet sécurisés pour les enfants hospitalisés.</p> <p>Si AngularJS est un framework web extrêmement puissant, il est aussi très exigeant. Il permet d'atteindre des vitesses de développement inégalées, pour peu que l'on prenne le temps de le maîtriser.<br> Ce livre devrait vous permettre de comprendre en détails tous les principes et pratiques d'AngularJS, des bases aux dernières nouveautés introduites par la version 1.3.</p></div><ul><li>lien nᵒ 1 : <a title="https://books.ninja-squad.com" hreflang="fr" href="https://linuxfr.org/redirect/91383">Devenez un Ninja avec AngularJS</a></li></ul><div></div><div><a href="https://linuxfr.org/news/un-ebook-sur-angularjs-a-prix-libre-et-pour-une-bonne-cause.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/103186/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/un-ebook-sur-angularjs-a-prix-libre-et-pour-une-bonne-cause#comments">ouvrir dans le navigateur</a> </p> Benoît Sibaud https://linuxfr.org/nodes/103186/comments.atom tag:linuxfr.org,2005:News/35527 2014-07-05T11:15:41+02:00 2014-07-07T09:19:36+02:00 Intercooler.js Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p><em>Intercooler.js</em> est une énième, mais nouvelle bibliothèque JavaScript pour les sites web orientés client lourd.</p> <p>Elle propose un mécanisme déclaratif assez intéressant : le comportement de l'interface est codé dans les attributs de balises HTML standard.<br> Elle simplifie la vie du développeur en évitant de devoir intégrer des évènements sur des sélecteurs JQuery (ou ses concurrents) : celui-ci a le choix de provoquer un appel AJAX ou un appel interne sur une fonction javascript, de manière déclarative dans le code HTML.</p> <p>Intercooler est basé sur le concept de Partial View Controller. Dans cette approche, le serveur renvoi des fragments de HTML à intégrer dans l'interface.</p></div><ul><li>lien nᵒ 1 : <a title="http://intercoolerjs.org/" hreflang="en" href="https://linuxfr.org/redirect/91028">Le site du framework</a></li><li>lien nᵒ 2 : <a title="http://intercoolerjs.org/intro.html" hreflang="en" href="https://linuxfr.org/redirect/91029">Introduction rapide au framework</a></li><li>lien nᵒ 3 : <a title="http://intercoolerjs.org/extending.html" hreflang="en" href="https://linuxfr.org/redirect/91030">API</a></li></ul><div><p>Quelques exemples valent mieux qu'un long discours :</p> <p>Cet exemple montre comment provoquer un appel AJAX lors d'un clic dans une div.</p> <pre><code class="html"><span class="nt">&lt;div</span> <span class="na">ic-src=</span><span class="s">"/example/click"</span><span class="nt">&gt;</span> You have not yet clicked the button <span class="nt">&lt;/div&gt;</span> <span class="nt">&lt;button</span> <span class="na">class=</span><span class="s">"btn btn-primary"</span> <span class="na">ic-post-to=</span><span class="s">"/example/click"</span><span class="nt">&gt;</span> Click Me! <span class="nt">&lt;/button&gt;</span></code></pre> <p>Si l'utilisateur clique sur le bouton, le contenu de la div ayant l'attribut <code>ic-src="/example/click"</code> sera remplacé par le retour de l'appel AJAX en POST à l'URL <code>/example/click</code>.</p> <p>Mais grâce à la fonction <code>addURLHandler(handler)</code>, on peut faire en sorte que l'URL <code>/example</code> soit captée en interne :</p> <pre><code class="javascript"><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">clicks</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">Intercooler</span><span class="p">.</span><span class="nx">addURLHandler</span><span class="p">({</span> <span class="s1">'url'</span><span class="o">:</span> <span class="s1">'/example/click'</span><span class="p">,</span> <span class="s1">'get'</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="s1">'You have clicked the button '</span> <span class="o">+</span> <span class="nx">clicks</span> <span class="o">+</span> <span class="s1">' times'</span> <span class="p">},</span> <span class="s1">'post'</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span> <span class="nx">clicks</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="p">});</span> <span class="p">})();</span></code></pre> <p>Bref, cette bibliothèque offre des possibilités affriolantes, même si elle est encore jeune.<br> Elle permettrait même à un webdesigner peu versé dans le développement de rajouter un peu d'interactivité dans ses pages.</p></div><div><a href="https://linuxfr.org/news/intercooler-js.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/102700/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/intercooler-js#comments">ouvrir dans le navigateur</a> </p> Ontologia Benoît Sibaud https://linuxfr.org/nodes/102700/comments.atom tag:linuxfr.org,2005:News/35494 2014-06-20T12:46:12+02:00 2014-06-20T16:35:41+02:00 Proxy HTTP(s) gatejs <div><p>gatejs est un nouveau mandataire/proxy HTTP(s) (<em>forward &amp; reverse</em>) qui a pour vocation de remplacer squid, nginx, varnish ou encore apache, dans leurs fonctions de proxy (<em>forward &amp; reverse</em>). Il est publié sous licence GPLv3.</p> <p>Il est développé en JavaScript (2/3) et en C++ (1/3). Il est prévu que la proportion de C++ se réduise au fil du temps. Ce proxy utilise le moteur Javascript V8 et nodejs.</p> <p>Il a été initialement conçu pour offrir plus de flexibilité sur l'interception et le traitement d'informations en HTTP.</p> <p>Pour ceux qui ne sont pas pro-JavaScript, il est important de préciser que les performances de gatejs sont proches, voire dans certains cas, supérieures à nginx.</p> <p>De plus, l'utilisation de Javascript permet d'augmenter la lisibilité des codes, de les factoriser et de renforcer la sécurité, surtout pour des opérations complexes.</p> <p>Les configurations sont écrites au moyen de la notation d'objets Javascript (JSON).</p></div><ul><li>lien nᵒ 1 : <a title="https://github.com/binarysec/gate" hreflang="en" href="https://linuxfr.org/redirect/90897">gatejs sur Github</a></li><li>lien nᵒ 2 : <a title="https://github.com/binarysec/gate/wiki" hreflang="en" href="https://linuxfr.org/redirect/90898">Wiki gatejs sur Github</a></li></ul><div><p>Ci-dessous une liste de fonctionnalités déjà implémentées :</p> <ul> <li>gestion de HTTP 0.9, 1.0, 1.1, Websocket, quic, spdy ;</li> <li>gestion de <em>SSL forward &amp; reverse</em> + SNI ;</li> <li> <em>reverse proxy</em>, <em>stream primary &amp; secondary</em>, pondération, détection de panne, <em>load-sharing iphash</em> / round-robin ;</li> <li>le <em>forward proxy</em> peut transmettre les requêtes en utilisant le champ <strong>Host</strong> HTTP, mais peut aussi utiliser l'adresse de destination directement ;</li> <li>implémentation généralisée de TPROXY qui permet de spoofer les adresses IP (source ou destination) pour une utilisation totalement transparente ;</li> <li>système de cache ACN (Associative Cache Network) qui permet de mettre en cache les données <em>HTTP forward</em> et/ou <em>reverse</em> et de les partager entre différents serveurs via du <em>multicast</em> ;</li> <li>gestionnaire de greffons très simple mais scalable à souhait ;</li> <li>traitement des requêtes HTTP par un système de pipeline et d'opcodes ;</li> <li>gestion de l'exécution parallèle de plusieurs workers autonomes ;</li> <li>gestion de l'utilisation simultanée des options forward et reverse proxy.</li> </ul><p>Les sources de gatejs étaient fermées pendant plusieurs années, mais différentes raisons ont amené ses créateurs à rendre ouvert ce travail.</p> <p>Aujourd'hui, gatejs est utilisable en production, les codes initiaux ont déjà vécu et vivent encore en production depuis plusieurs années.</p> <p>Nous aimerions maintenant pousser gatejs plus loin avec une communauté de développeurs et utilisateurs fidèles.</p></div><div><a href="https://linuxfr.org/news/proxy-http-s-gatejs.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/102569/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/proxy-http-s-gatejs#comments">ouvrir dans le navigateur</a> </p> mykii Xavier Teyssier Benoît Sibaud Pierre Jarillon rootix https://linuxfr.org/nodes/102569/comments.atom tag:linuxfr.org,2005:News/35461 2014-06-15T11:33:49+02:00 2014-06-15T13:22:55+02:00 Retour d'expérience sur sql.js Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>J'aimerais parler ici de mon expérience lors du développement de <a href="https://github.com/lovasoa/sql.js">sql.js</a>, un port de <a href="http://sqlite.org">SQLite</a> en JavaScript. Pour ceux qui ne s’intéressent pas aux technologies du web, la deuxième partie de cette dépêche pourrait quand même vous intéresser, on va parler de SQLite.</p> <p>Note : cette dépêche a initialement été postée <a href="//linuxfr.org/users/lovasoa/journaux/web-moderne-bases-de-donnees-et-beaute-logiciel-libre">en tant que journal</a>.</p></div><ul><li>lien nᵒ 1 : <a title="https://github.com/lovasoa/sql.js" hreflang="en" href="https://linuxfr.org/redirect/90784">Page GitHub du Projet</a></li><li>lien nᵒ 2 : <a title="http://lovasoa.github.io/sql.js/GUI" hreflang="en" href="https://linuxfr.org/redirect/90785">Démonstation, qui permet d’exécuter du SQL, mais aussi de lire, modifier, puis sauvegarder des bases</a></li><li>lien nᵒ 3 : <a title="http://emscripten.org" hreflang="en" href="https://linuxfr.org/redirect/90786">Page officielle de emscripten</a></li><li>lien nᵒ 4 : <a title="http://sqlite.org" hreflang="en" href="https://linuxfr.org/redirect/90787">SQLite, le SGBD le plus cool qui soit</a></li></ul><div><h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li><a href="#web-moderne">Web moderne</a></li> <li><a href="#sqlite">SQLite</a></li> <li> <a href="#quand-on-m%C3%A9lange-les-deux">Quand on mélange les deux…</a><ul> <li><a href="#sqljs-avant">sql.js, avant</a></li> <li><a href="#sqljs-maintenant">sql.js, maintenant</a></li> <li><a href="#comment-%C3%A7a-marche">Comment ça marche</a></li> </ul> </li> <li><a href="#conclusion">Conclusion</a></li> </ul><h2 id="web-moderne">Web moderne</h2> <p>Ceux d'entre vous qui s'intéressent aux technologies modernes du web ont certainement entendu parler d’<a href="http://emscripten.org">emscripten</a> et d’<a href="http://asmjs.org">asm.js</a>.</p> <p>Emscripten est un compilateur de bytecode LLVM en JavaScript. Il permet de compiler du code C ou C++ en JavaScript, très simplement. Le code JavaScript généré n’est bien sûr pas aussi rapide que le code natif équivalent, mais les performances sont assez bonnes. Sur Firefox, avec asm.js, le code tourne à peu près deux fois plus lentement que la version native. Le principal inconvénient que je trouve à emscripten est qu'il faut, pour l'utiliser sous Linux, télécharger et compiler <a href="https://github.com/kripken/emscripten-fastcomp">sa propre version de LLVM et de clang</a>, ce qui est long et pas pratique à mettre à jour.</p> <p><a href="http://asmjs.org">asm.js</a>, quant à lui, est un sous-ensemble de JavaScript conçu pour être facile à optimiser, et ainsi pouvoir s'exécuter rapidement. La syntaxe est <a href="http://asmjs.org/spec/latest/#putting-it-all-together">dégueulasse</a>, mais c'est pas grave, emscripten génère du code asm.js pour nous.</p> <h2 id="sqlite">SQLite</h2> <p>Vous connaissez certainement déjà <a href="https://fr.wikipedia.org/wiki/Sqlite">SQLite3</a>, le moteur de bases de données le plus utilisé au monde. Si vous vous y êtes déjà un peu intéressé, vous connaissez sûrement ses caractéristiques, qui le rendent unique :</p> <ul> <li>Une base de données est stockée dans un seul fichier.</li> <li>Le binaire SQLite est minuscule (moins d'un Mo), et la bibliothèque SQLite peut être liée statiquement dans votre programme. Tout le code source tient dans un fichier <code>sqlite3.c</code> de 5 Mo.</li> <li>Le code a été placé dans le domaine public.</li> <li>Les données sont typées dynamiquement. Une même colonne peut contenir un entier, un nombre à virgule flottante, et une chaîne de caractères, par exemple.</li> </ul><p>Par contre, vous ne connaissez peut-être pas <a href="http://sqlite.org/src4/doc/trunk/www/design.wiki">SQLite4</a>, une évolution de SQLite3 (par les mêmes développeurs), qui n’a pas encore de version stable (et que j’ai aussi <a href="https://github.com/lovasoa/sql.js/tree/sqlite4">porté en JavaScript</a>). Cette version apporte de bien meilleures performances, et surtout, elle utilise un système de base de données de type clef-valeur, que l'on peut changer à la volée.</p> <p>Et ça, c’est génial ! Cela signifie que l'on pourra bientôt profiter de tous les avantages de SQLite même pour de grosses bases de données. Il suffira d’utiliser un système de base de données clef-valeur qui supporte les grands ensembles de données, comme <a href="http://leveldb.googlecode.com/svn/trunk/doc/index.html">LevelDB</a>.</p> <h2 id="quand-on-mélange-les-deux">Quand on mélange les deux…</h2> <h3 id="sqljs-avant">sql.js, avant</h3> <p><code>sql.js</code>, un port de SQLite en JavaScript, était au départ un projet de <a href="https://github.com/kripken">kripken</a>, le créateur et principal mainteneur d’emscripten, qui date de début 2012. Le port fonctionnait, mais question fonctionnalités, on restait un peu sur sa faim : une seule méthode <code>db.exec</code>, qui exécutait du SQL et retournait les résultats dans un format pas pratique. Les données étaient toujours converties en chaînes de caractères avant d’être retournées. Le projet n’avait aucun test unitaire, le dernier commit date d’il y a plus d’un an, et l’auteur ne répond plus sur le bugtracker… (NdM.: voir le commentaire indiquant que l'auteur <a href="//linuxfr.org/news/retour-d-experience-sur-sql-js#comment-1543841">a depuis incorporé la contribution</a>)</p> <p>Pourtant, le projet semble avoir des utilisateurs. 104 forks et 883 <em>stars</em> sur github, et plusieurs téléchargements par jour sur <a href="https://www.npmjs.org/package/node-sqlite-purejs">npm</a> à l’heure où j’écris ces lignes.</p> <h3 id="sqljs-maintenant">sql.js, maintenant</h3> <p>Je suis étudiant, et lors d’un TD, j’ai eu besoin de pouvoir tester des commandes en SQL, sur un ordi avec rien du tout d’installé. Je ne connaissais pas encore <a href="http://sqlfiddle.com/">SQLfiddle</a>, mais j’avais déjà entendu parler de sql.js, donc j’ai utilisé sa <a href="http://kripken.github.io/sql.js/test/demo.html">démonstration en ligne</a>.</p> <p>Le soir, en rentrant chez moi, très agaçé des petits défauts de la démonstration que j'avais utilisée, j'ai <em>forké</em> le projet, et commencé à travailler sur une meilleure interface graphique. Quand j'ai été content de moi, j’ai fait une <em>pull request</em>. Comme l’auteur tardait à répondre, j’ai commencé à bidouiller le reste du code. Et de fil en aiguille, j'ai fini par réécrire tout le code, à changer l’API pour avoir quelque chose de facile à utiliser, à ajouter des tests, de la documentation… Et je suis assez fier de l’état du projet aujourd’hui.</p> <p>Il est utilisable sans modification à la fois depuis node.js, dans le navigateur, et en tant que web worker. Il est <a href="https://npmjs.org/package/sql.js">disponible sur npm</a>, et s’utilise avec un simple :</p> <pre><code class="javascript"><span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'sql.js'</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">db</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">Database</span><span class="p">();</span></code></pre> <p>Il retourne les données dans leur format original, y-compris les BLOBs, retournés sous forme de tableau d’octets :</p> <pre><code class="javascript"><span class="kd">var</span> <span class="nx">res</span> <span class="o">=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="s2">"SELECT * FROM table1; SELECT * FROM table2"</span><span class="p">);</span> <span class="c1">// Ce qui peut retourner:</span> <span class="p">[</span> <span class="p">{</span><span class="nx">columns</span><span class="o">:</span><span class="p">[</span><span class="s1">'a'</span><span class="p">,</span><span class="s1">'b'</span><span class="p">],</span> <span class="nx">values</span><span class="o">:</span><span class="p">[[</span><span class="mi">0</span><span class="p">,</span><span class="s1">'hello'</span><span class="p">],[</span><span class="mi">1</span><span class="p">,</span><span class="s1">'world'</span><span class="p">]]},</span> <span class="c1">//Le contenu de table1</span> <span class="p">{</span><span class="nx">columns</span><span class="o">:</span><span class="p">[</span><span class="s1">'c'</span><span class="p">,</span><span class="s1">'d'</span><span class="p">],</span> <span class="nx">values</span><span class="o">:</span><span class="p">[[</span><span class="kc">null</span><span class="p">,[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]],[</span><span class="mi">42</span><span class="p">,</span><span class="s1">'blabla'</span><span class="p">],[</span><span class="mi">666</span><span class="p">,</span><span class="mi">666</span><span class="p">]]}</span> <span class="c1">//Celui de table2</span> <span class="c1">// Et oui, la colonne d contient des données de types différents. C’est possible grâce à SQLite. C’est impossible avec presque tous les autres SGBD</span> <span class="p">]</span></code></pre> <p>Et il permet d'utiliser des requêtes préparées (<em>prepared statements</em>), auxquelles on associe les paramètres que l'on veut, sans risquer de vilaines injections SQL :</p> <pre><code class="javascript"><span class="nx">db</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="s2">"INSERT INTO table1 VALUES (?,?)"</span><span class="p">,</span> <span class="p">[</span><span class="mi">3</span><span class="p">,[</span><span class="mi">121</span><span class="p">,</span><span class="mi">111</span><span class="p">,</span><span class="mi">117</span><span class="p">,</span><span class="mi">99</span><span class="p">,</span><span class="mi">114</span><span class="p">,</span><span class="mi">97</span><span class="p">,</span><span class="mi">99</span><span class="p">,</span><span class="mi">107</span><span class="p">,</span><span class="mi">101</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">105</span><span class="p">,</span><span class="mi">116</span><span class="p">]]);</span></code></pre> <p>Mais aussi :</p> <pre><code class="javascript"><span class="kd">var</span> <span class="nx">stmt</span> <span class="o">=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">prepare</span><span class="p">(</span><span class="s2">"SELECT * FROM table1 WHERE a=$aval AND b=$bval"</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">result</span> <span class="o">=</span> <span class="nx">stmt</span><span class="p">.</span><span class="nx">getAsObject</span><span class="p">({</span><span class="nx">$aval</span> <span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">$bval</span> <span class="o">:</span> <span class="s1">'world'</span><span class="p">});</span> <span class="c1">// result contient maintenant:</span> <span class="p">{</span><span class="nx">a</span><span class="o">:</span><span class="mi">1</span><span class="p">,</span> <span class="nx">b</span><span class="o">:</span><span class="s1">'world'</span><span class="p">}</span></code></pre> <h3 id="comment-ça-marche">Comment ça marche</h3> <p>SQLite est distribué sous différentes formes, dont une qui est particulièrement pratique : l’<em>amalgamation</em>. C’est un unique fichier <code>.c</code> de 5Mo qui contient tout le code, et que l’on peut compiler sans aucune bibliothèque externe:</p> <p><code>gcc -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_THREADSAFE=0 -c sqlite3.c</code></p> <p>Et on peut aussi le compiler, sans aucune modification, avec emscripten. Il suffit de remplacer <code>gcc</code> par <code>emcc</code> dans la commande précédente, et le tour est joué.</p> <p>Vous allez peut-être trouver bizarre que ça <em>juste marche</em>. En effet, le code de SQLite fait plein de trucs que l’on ne peut pas faire de base en JavaScript dans un navigateur, comme par exemple ouvrir des fichiers, ou simplement accéder à la mémoire à partir de pointeurs.</p> <p>Heureusement, emscripten s’occupe de tout ça pour nous. Il fabrique un grand tableau d’entiers en JavaScript qui contiendra toute la mémoire de notre programme. Les performances ne sont pas trop mauvaises grâce aux <em>[typed arrays (<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays</a>)</em>. Les pointeurs ne sont dès lors plus que des index dans ce tableau. Il implémente également les fonctions <code>fopen</code>, <code>fwrite</code>, etc. en émulant un système de fichiers entièrement en mémoire. L’inconvénient étant bien sûr que l’on a beaucoup moins de place pour stocker ses données.</p> <p>Mon travail consiste alors uniquement à définir les bonnes options de compilation, et à écrire le code qui va faire l’interface entre les programmes en JavaScript et le code compilé, en JavaScript lui aussi. En effet, appeler directement le code résultant de la compilation par emscripten serait terriblement rebutant : ça parle de pointeurs partout, il faut allouer et désallouer de la mémoire dès que l’on veut faire des trucs compliqués, on n’a accès qu’à une série de fonctions, et pas à des objets qui contiennent des méthodes…</p> <p>Pour avoir un code un peu plus léger, j’ai choisi le <a href="http://coffeescript.org">CoffeeScript</a>, langage par excellence du web moderne.</p> <p>Pour vous donner un exemple du genre de code qui fait l’interface, voilà la fonction <code>prepare</code>, qui permet de créer une requête préparée :</p> <pre><code class="coffeescript"> <span class="s">'prepare'</span><span class="o">:</span> <span class="nf">(sql, params) -&gt;</span> <span class="nx">setValue</span> <span class="nx">apiTemp</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s">'i32'</span> <span class="nx">@handleError</span> <span class="nx">sqlite3_prepare_v2</span> <span class="nx">@db</span><span class="p">,</span> <span class="nx">sql</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="nx">apiTemp</span><span class="p">,</span> <span class="nx">NULL</span> <span class="nv">pStmt = </span><span class="nx">getValue</span> <span class="nx">apiTemp</span><span class="p">,</span> <span class="s">'i32'</span> <span class="c1"># pointer to a statement, or null</span> <span class="k">if</span> <span class="nx">pStmt</span> <span class="o">is</span> <span class="nx">NULL</span> <span class="k">then</span> <span class="k">throw</span> <span class="s">'Nothing to prepare'</span> <span class="nv">stmt = </span><span class="k">new</span> <span class="nx">Statement</span> <span class="nx">pStmt</span><span class="p">,</span> <span class="k">this</span> <span class="k">if</span> <span class="nx">params</span><span class="o">?</span> <span class="k">then</span> <span class="nx">stmt</span><span class="p">.</span><span class="nx">bind</span> <span class="nx">params</span> <span class="nx">@statements</span><span class="p">.</span><span class="nx">push</span> <span class="nx">stmt</span> <span class="k">return</span> <span class="nx">stmt</span></code></pre> <p>On voit bien que tout le vrai travail est fait par les fonctions compilées de SQLite, mon code se contentant de la gestion des erreurs, de la mémoire, et de la conversion des données dans un format utile au programmeur JavaScript.</p> <h2 id="conclusion">Conclusion</h2> <p>Aujourd’hui, on fait tout ce qu’on veut sur le web, et bientôt, ce sera encore mieux. Les trucs funs qui sont pour bientôt : <a href="http://tc39wiki.calculist.org/es6/">ECMASCRIPT 6, aka Harmony</a>, <a href="https://github.com/kripken/emscripten/wiki/Emscripten-SDK">emscripten SDK</a> pour Linux, <a href="https://github.com/lovasoa/sql.js/tree/sqlite4">sqlite4.js</a>…</p></div><div><a href="https://linuxfr.org/news/retour-d-experience-sur-sql-js.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/102471/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/retour-d-experience-sur-sql-js#comments">ouvrir dans le navigateur</a> </p> lovasoa Nÿco ZeroHeure palm123 Benoît Sibaud Nils Ratusznik https://linuxfr.org/nodes/102471/comments.atom tag:linuxfr.org,2005:News/35417 2014-05-28T15:54:44+02:00 2014-05-28T15:54:44+02:00 Atelier Back to Basics : Javascript Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr <div><p>L’association <a href="http://www.silexlabs.org/">Silex Labs</a> propose une série de quatre ateliers pour travailler ensemble avec des outils devenus incontournables et partager des retours d’expériences sur les bonnes pratiques d’organisation et de travail collaboratif. Le prochain aura lieu le mercredi 28 mai de 19h à 21h à l’IESA Multimédia (Paris) sur le thème Javascript (après ceux sur HTML5 et CSS3, et avant celui sur Node.js le 18 juin).</p> <p><img src="//img.linuxfr.org/img/687474703a2f2f7777772e73696c65786c6162732e6f72672f77702d636f6e74656e742f75706c6f6164732f323031342f30342f622d746f2d622d30332d6a617661736372697074322e706e67/b-to-b-03-javascript2.png" alt="Titre de l'image" title="Source : http://www.silexlabs.org/wp-content/uploads/2014/04/b-to-b-03-javascript2.png"></p> <p><abbr title="Note des modérateurs">NdM</abbr> : l'inscription coûte 15 € (ou une adhésion annuelle à Silex Labs couvrant tous les ateliers).</p></div><ul><li>lien nᵒ 1 : <a title="http://www.silexlabs.org/201975/the-blog/blog-silex-labs/ateliers-b-to-b-back-to-basics-3-utilisation-de-javascript/" hreflang="fr" href="https://linuxfr.org/redirect/90640">Ateliers B to B (Back to Basics) #3 : Utilisation de JavaScript</a></li><li>lien nᵒ 2 : <a title="http://www.silexlabs.org/201977/the-blog/blog-silex-labs/ateliers-b-to-b-back-to-basics-4-debuter-node-js/" hreflang="fr" href="https://linuxfr.org/redirect/90641">Ateliers B to B (Back to Basics) #4 : Débuter Node.js</a></li></ul><div><p>Chaque atelier commencera par une courte partie théorique sur la technologie présentée et sera suivie d’exercices pratiques. Au fur et à mesure des ateliers, les participants créeront leur site "CV" contenant leur parcours professionnel ainsi qu’un formulaire de contact. À la fin du cycle, les participants connaîtront les principaux langages du développement web et des ressources seront mises à leur disposition afin d’approfondir leurs connaissances.</p> <p><strong>Au programme de cet atelier</strong></p> <p>JavaScript est un langage qui est lu et exécuté par votre navigateur – le client – (donc directement sur votre ordinateur) et qui permet de créer des réactions en réponse à des événements sur la page ou à des actions de l’utilisateur. Par exemple :</p> <ul> <li>un clic sur un lien qui affiche un texte masqué progressivement ;</li> <li>un compteur qui défile ;</li> <li>l’apparition renouvelée d’actualités sans que le navigateur ne demande à nouveau la page au serveur ;</li> <li>etc.</li> </ul><p><strong>La théorie :</strong></p> <ul> <li>pourquoi du JavaScript ?</li> <li>l'invention du JS.</li> </ul><p><strong>La pratique :</strong></p> <ul> <li>créer un fichier de code JavaScript ;</li> <li>lier son JavaScript à son site ;</li> <li>afficher un message dans le navigateur (par exemple une alerte) ;</li> <li>faire des additions en JS ;</li> <li>utiliser des variables ;</li> <li>créer des fonctions ;</li> <li>valider son formulaire avec JavaScript ;</li> <li>interagir avec son site (DOM) pour afficher des messages d’erreur.</li> </ul><p>Cet atelier sera animé par Yannick Dominguez, développeur de web app depuis 2008, utilisateur de git et github depuis 2011 et principal contributeur de la bibliothèque Cocktail (Haxe)</p> <p><strong>Date et lieu</strong></p> <p>Réservez votre mercredi 28 mai de 19h à 21h et venez à l’IESA Multimédia 5 rue Saint-Augustin, 75002 Paris.</p> <p><a href="http://www.silexlabs.org/201975/the-blog/blog-silex-labs/ateliers-b-to-b-back-to-basics-3-utilisation-de-javascript/">Inscrivez-vous vite !</a></p> <p><strong>A propos des ateliers "Industrial Workflow"</strong></p> <p>L’association Silex Labs est composée des communautés des projets open source que nous soutenons (Silex, Haxe, amfphp). Elle regroupe les différents métiers du numérique des designers aux développeurs en passant par des intégrateurs, des chefs de projets …</p> <p>Dans le domaine du développement, les outils sont en constante évolution. Il est donc important de permettre à chacun de se mettre à la page pour gagner en productivité et en compétence.</p> <p>C’est pourquoi, Silex Labs a décidé d’organiser une série d’ateliers pour travailler ensemble avec des outils devenus incontournables et ainsi partager des retours d’expériences sur les bonnes pratiques d’organisation et de travail collaboratif.</p></div><div><a href="https://linuxfr.org/news/atelier-back-to-basics-javascript.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/102332/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/atelier-back-to-basics-javascript#comments">ouvrir dans le navigateur</a> </p> silexlabs Benoît Sibaud Nils Ratusznik Nÿco Florent Zara https://linuxfr.org/nodes/102332/comments.atom tag:linuxfr.org,2005:News/34441 2013-07-22T16:00:34+02:00 2013-07-22T16:00:34+02:00 La troisième rencontre de la communauté JavaScript de Lille - Jeudi 25 juillet 2013 Licence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr <div><p>Tous les passionnés de JavaScript ont rendez-vous au CoworkingLille pour discuter de JavaScript. L'accueil des participants se fera dès 19H30 au CoworkingLille au 10 rue de la Piquerie 59000 Lille.</p> <p>Dans la communauté JavaScript les <em>promises</em> (en français, promesse, engagement) font l'actualité. Selon le Wiki CommonJS, une promise, en JavaScript, est un objet représentant une valeur qui pourrait être retournée par l'exécution d'une opération unique (souvent asynchrone). Nicolas Froidure nous fera, lors de cette rencontre, une présentation de cette nouvelle techno et de son expérience acquise pendant le développement de <a href="https://github.com/nfroidure/Liar">Liar</a>.</p> <p>Vous pouvez trouver sur ce lien la <a href="https://github.com/slightlyoff/Promises">spécification des <em>promises</em> (<em>polyfill inside</em>)</a>.</p> <p>Cette présentation sera suivie d'une table ronde sur NodeJS, la production et les outils existants. Nous aborderons les différentes approches :</p> <ul> <li> <a href="https://github.com/nodejitsu/forever">approche basique</a> ;</li> <li> <a href="https://github.com/Unitech/pm2">approche prometteuse</a> ;</li> <li> <a href="https://github.com/kommander/vost">une autre approche</a> ;</li> <li> <a href="http://stackoverflow.com/questions/5009324/node-js-nginx-and-now">approche Nginx</a>.</li> </ul><p>Tous les retours d'expériences sont les bienvenus avec des exemples d'application en production à l'appui.</p> <p>ChtiJS sur Twitter : <a href="http://twitter.com/chtijs">@chtijs</a></p></div><ul><li>lien nᵒ 1 : <a title="http://doodle.com/rhan5tvkszzex4nc" hreflang="fr" href="https://linuxfr.org/redirect/87160">Inscription</a></li></ul><div></div><div><a href="https://linuxfr.org/news/la-troisieme-rencontre-de-la-communaute-javascript-de-lille-jeudi-25-juillet-2013.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/99159/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/la-troisieme-rencontre-de-la-communaute-javascript-de-lille-jeudi-25-juillet-2013#comments">ouvrir dans le navigateur</a> </p> Benoît Sibaud NeoX Nils Ratusznik Nÿco Xavier Teyssier https://linuxfr.org/nodes/99159/comments.atom tag:linuxfr.org,2005:News/34410 2013-07-08T22:24:40+02:00 2013-07-08T22:24:40+02:00 Apéro Web à Nancy Licence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr <div><p>Après Bash, un nouvel <em>Apéro Web</em> se déroulera à Nancy le 18 Juillet 2013 au Classico (1 Rue Général Hoche) à 19h. Le but de ces évènements est de partager, discuter sur ces thèmes autour du Web, dans une ambiance agréable. Le thème de la soirée du 18/07 sera Node.js :</p> <p>« JavaScript sort de son navigateur pour vous en mettre plein les yeux avec Node.js. Plus qu'un serveur web de nouvelle de génération, Node.js est une plateforme avec une communauté et des outils autant destinés au serveur qu'au client.</p> <p>Durant cette introduction, les spécificités de Node.js seront décortiquées : event-driven model, non-blocking I/O, CommonJs, packages, etc. Puis, nous vous présenterons un des outils de l'univers node: Grunt.js, le task-runner sortira de son terrier pour vous aider à automatiser vos projets Javascript. »</p></div><ul><li>lien nᵒ 1 : <a title="https://plus.google.com/events/c9sb8r17o89kbmhtl90rnum5uq4?authkey=CIi_9bm9n9CehgE" hreflang="fr" href="https://linuxfr.org/redirect/87039">Event sur Google +</a></li><li>lien nᵒ 2 : <a title="http://www.openstreetmap.org/?mlat=48.684648&amp;mlon=6.169698&amp;zoom=18&amp;layers=M" hreflang="fr" href="https://linuxfr.org/redirect/87040">Plan d&#39;accès</a></li></ul><div></div><div><a href="https://linuxfr.org/news/apero-web-a-nancy.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/99011/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/news/apero-web-a-nancy#comments">ouvrir dans le navigateur</a> </p> claudex Benoît Sibaud Nÿco https://linuxfr.org/nodes/99011/comments.atom