<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Florian Barbet, auteur/autrice sur EKITE</title>
	<atom:link href="https://ekite.info/author/florianbarbet/feed/" rel="self" type="application/rss+xml" />
	<link>https://ekite.info</link>
	<description>Vos défis, notre passion</description>
	<lastBuildDate>Mon, 21 Aug 2023 12:05:55 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://ekite.info/wp-content/uploads/2023/06/cropped-favicon2-150x150.png</url>
	<title>Florian Barbet, auteur/autrice sur EKITE</title>
	<link>https://ekite.info</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Abstract Data Types</title>
		<link>https://ekite.info/2023/03/15/abstract-data-types/</link>
					<comments>https://ekite.info/2023/03/15/abstract-data-types/#respond</comments>
		
		<dc:creator><![CDATA[Florian Barbet]]></dc:creator>
		<pubDate>Wed, 15 Mar 2023 11:12:20 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=1008</guid>

					<description><![CDATA[<p>Les types abstraits, ou pourquoi vous devez utiliser Optional En tant que développeur, nous cherchons souvent des moyens d’améliorer nos applications. Les rendre plus robustes, plus normées, ou encore anéantir les potentiels effets de bord. La montée des langages fonctionnels a pu faire réapparaître certains concepts mathématiques pour améliorer tout ça. C’est le cas des [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2023/03/15/abstract-data-types/">Abstract Data Types</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2 style="text-align: justify;">Les types abstraits, ou pourquoi vous devez utiliser Optional</h2>
<div class="extract">
<p style="text-align: justify;">En tant que développeur, nous cherchons souvent des moyens d’améliorer nos applications. Les rendre plus robustes, plus normées, ou encore anéantir les potentiels effets de bord. La montée des langages fonctionnels a pu faire réapparaître certains concepts mathématiques pour améliorer tout ça. C’est le cas des types abstraits (en anglais, abstract data type ou ADT). Au-delà des gains cités, certains ADT permettent d’améliorer la gestion de certains langages.</p>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/common/abstract-data-types//henry_1.png" alt="image" /></p>
<p style="text-align: justify;">L’illustre Henri, qui aime tant les mathématiques, semble être très intéressé par le sujet, mais surtout parce qu’il existe un ADT pour optimiser <a href="https://ekite.tech/articles/front-end/algebraic-structure/">son application du plus fort cailloux</a>. Cela permettra d’illustrer les explications qui suivent.</p>
<h2 id="définitions" style="text-align: justify;">Définitions</h2>
<p style="text-align: justify;">Pour créer un type de donnée il faut réunir un ensemble de valeurs et des opérations à appliquer sur cet ensemble. On peut prendre exemple sur les nombres entiers (int, integer). Il est possible d’appliquer une multitude d’opérations sur les entiers : additions, soustractions, multiplications, etc.</p>
<p style="text-align: justify;">Une des analogies les plus reprises en informatique des types de données sont les primitives, comme les entiers, les booléens, ou les float par exemple. N.B : Les types primitifs sont nativement gérés par le langage, qui stocke directement les valeurs des variables en mémoire, parfois dans une zone mémoire dédiée (la stack).</p>
<p style="text-align: justify;">L’évolution d’un type de donnée, ce sont les types de données définis par utilisateur. Pour vulgariser il s’agit d’une structure nommée et composée de type de données. Il est possible de les représenter par des structures, des énumérations ou encore des unions. Pour illustrer la représentation d’un point est un type de données définies par utilisateur : Point(int x, int y).</p>
<p style="text-align: justify;">Les types de données défini par utilisateur ne sont pas définis par la machine contrairement aux primitives. Les opérations sous-jacentes de ce type de données sont elles aussi définies par l’utilisateur (le développeur).</p>
<p style="text-align: justify;">Un type abstrait peut être représenté comme le moule d’un type de données définis par utilisateur à la différence près que ce type doit amener une certaine robustesse dans l’écriture de types. Ce type de données doit répondre à trois contraintes pour subsister dans un système de type. Il doit être capable de définir des types sommes, produits et récursifs.</p>
<h2 id="pré-requis-du-système-de-type-pour-faire-des-adt" style="text-align: justify;">Pré-requis du système de type pour faire des ADT</h2>
<p style="text-align: justify;">1 &#8211; Le type somme (tagged-union, variant) c’est la capacité de définir un type pouvant se définir par un sous-ensemble fini de types. En Java cela correspond aux sealed-interface, en OCaml ce sont les variants, en Rust les enum. Exemple en OCaml :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java">type month_type = 
  | PLEIN 
  | CREUX 
  | BIS of int</pre>
<p style="text-align: justify;">2 &#8211; Le type produit (record) correspond à la capacité de créer des structures dans un langage. En Java, on peut créer des objets ou des records, en Rust ou en C on peut créer des structures (struct).</p>
<p style="text-align: justify;">3 &#8211; Le type récursif correspond à la capacité pour un type de s’appeler lui-même. Exemple avec les variants :</p>
<div class="highlighter-rouge" style="text-align: justify;">
<div class="highlight">
<pre class="EnlighterJSRAW" data-enlighter-language="java"> type List = 
  | Item of int * List
  | Empty

Item (1, Item (2, Item ( 3, Empty)))</pre>
<p>Voici une liste de quelques langages permettant de faire des ADT :</p>
</div>
</div>
<ul style="text-align: justify;">
<li>Caml</li>
<li>Rust</li>
<li>Haskell</li>
<li>Java 17+</li>
<li>Typescript</li>
<li>Python</li>
<li>Scala</li>
<li>Kotlin</li>
</ul>
<h5 id="cas-dutilisations" style="text-align: justify;">Cas d’utilisations</h5>
<p style="text-align: justify;">Les types de données abstraits permettent d’acquérir de la robustesse applicative ET conceptuelle. Cela permet également de pouvoir créer des <a href="https://ekite.tech/articles/other/design-pattern/">design pattern</a> purs et de simplifier la mise en place de machine à état. Enfin les ADT permettent de rapprocher les données d’un programme lié aux <a href="https://ekite.tech/articles/front-end/algebraic-structure/">structures algébriques</a>.</p>
<p style="text-align: justify;">Voici une liste de quelques types abstraits connus, liés aux structures algébriques:</p>
<ul style="text-align: justify;">
<li>La présence de valeur (Option)</li>
<li>La réussite d’un programme (Try)</li>
<li>La réussite ou l’erreur d’un programme (Result)</li>
<li>La possibilité d’afficher une donnée (Show)</li>
</ul>
<p style="text-align: justify;">Henri a préparé quelques cartes que vous pourrez trouver <a href="https://docs.google.com/presentation/u/0/d/1P06bSfyXNix0k740iRl1LyyqNyRibcAOsTWn9lomjUo/edit">ici</a> !</p>
<h5 id="la-parole-à-henri" style="text-align: justify;">La parole à Henri</h5>
<p style="text-align: justify;">Henri nous rappelle que son application a été codée en Java 17. La gestion d’erreur dans certains langages peut-être très gourmande en termes de ressources. Ce <a href="https://www.infoworld.com/article/2076868/how-the-java-virtual-machine-handles-exceptions.html">lien</a> explique en détails le bytecode derrière un try-catch. Pour résumer, lorsqu’une exception survient il faut pouvoir dire à la machine de revenir en arrière et exécuter le code dans la partie “catch”. Plusieurs années se sont écoulées depuis et Henri trouve que son application est obsolète Il demande à son ami de faire évoluer son application, mais se retrouve depuis quelques temps confronté à une multitude de problème qu’il ne comprend pas :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java">java.lang.IllegalArgumentException: D20160229 is not a Caillou</pre>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/common/abstract-data-types//henry_2.png" alt="image" /></p>
<p style="text-align: justify;">Henri est venu nous voir en nous expliquant qu’il a ce problème à chaque fois qu’il enregistre un de ses cailloux un 29 février. Cela fait déjà 6 ans qu’Henri n’arrive pas à enregistrer son caillou préféré. Prenons notes de l’existant :</p>
<ul style="text-align: justify;">
<li>Les fonctionnalités sont rétro-compatibles avec l’ancien modèle.</li>
<li>La structure de données d’un caillou a changé comme suit :
<ul>
<li>Un caractère et 8 chiffres. Nous décidons de corriger l’ensemble tel qu’il soit constitué d’un caractère et d’une date au format yyyyMMdd. (Cela corrigera en parti les problèmes de la nouvelle application d’Henri) Nous ne pouvons donc plus nous fier à l’ensemble CPH (Cailloux Potentiels d’Henri), nous sommes sur un ensemble différent que nous nommerons NCPH (Nouveaux Cailloux Potentiels d’Henri) . Notons que cet ensemble est composé de l’ensemble CPH et de toute chaîne de caractères avec les caractéristiques susmentionnées (nommons cet ensemble CPGH pour Cailloux Potentiels du Grand Henri). On obtient donc CPGH = CPH + NPCH.</li>
</ul>
</li>
</ul>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/common/abstract-data-types//henry_3.png" alt="image" /></p>
<p style="text-align: justify;">Malgré notre précédente correction Henri nous a remonté qu’il subsiste quelques lenteurs et nous fait part de ses besoins :<br />
1 &#8211; Il veut pouvoir basculer sur son ancien modèle à tout moment.<br />
2 &#8211; Faire en sorte que son application ne subisse plus de lenteurs / erreurs incompréhensibles.<br />
Pour le premier point nous verrons une prochaine fois l’application de la théorie des catégories (plus particulièrement la flèche). Pour le second ça tombe bien, car nous avons investigué et sommes tombé sur quelques imbrications de try-catch dignes d’une <a href="https://en.wikipedia.org/wiki/Defensive_programming">bonne programmation défensive</a>. Cela s’explique par le fait de devoir convertir les éléments de CPH vers CPGH. /!\ N’oublions pas qu’Henri procède à des millions d’enregistrements de cailloux par jour.</p>
<p style="text-align: justify;">La solution au problème <img decoding="async" src="https://ekite.tech/articles/common/abstract-data-types//henry_4.png" alt="image" /></p>
<pre class="EnlighterJSRAW" data-enlighter-language="java">static Result&lt;Caillou, Exception&gt; create(String name){
    var letter = name.charAt(0);
    if(letter &lt; 65 || letter &gt; 90) {
        throw new IllegalArgumentException(format("%s is not a Cailloux", name));
    }

    var dayOfYear = Integer.parseInt(name.substring(1));
    if(dayOfYear &lt; 0 || dayOfYear &gt; 365) {
        throw new IllegalArgumentException(format("%s is not a Cailloux", name));
    }

    return new Caillou(letter, dayOfYear);
}

void handleCreate(String input){
    try {
        var result = create(input);
        doSomethingWithCaillou(result);
    }catch(Exception error){
    log(error);
    }
}</pre>
<p style="text-align: justify;">(L’ancien code.)</p>
<p style="text-align: justify;">Ces imbrications nous privent de précieuses performances. Une des solutions à ce problème c’est l’ADT Result. Malheureusement pour Henri en Java 17 il n’existe pas d’implémentation de Result. Cependant il y a eu une grande avancée permettant de créer ce genre de typage :</p>
<ul style="text-align: justify;">
<li>Les interfaces scellées</li>
<li>Les records</li>
<li>Le switch-pattern-matching Voici comment on pourrait représenter le Result en Java 17</li>
</ul>
<div class="language-java highlighter-rouge" style="text-align: justify;">
<div class="highlight">
<pre class="EnlighterJSRAW" data-enlighter-language="java">sealed interface Result&lt;T,E&gt; permits Result.Ok, Result.Err {
    record Ok&lt;T,E&gt;(T ok) implements Result&lt;T,E&gt; {
        public Ok {
            java.util.Objects.requireNonNull(ok);
        }
    } 
    record Err&lt;T,E&gt;(E error) implements Result&lt;T,E&gt; {
        public Err {
            java.util.Objects.requireNonNull(error);
        }
    }
    public static&lt;T&gt; Ok ok(T ok){
        return new Ok(ok);
    }
    public static&lt;E&gt; Err err(E error){
        return new Err(error);
    }
}</pre>
<p>source : <a style="font-family: 'Open Sans', Arial, sans-serif;" href="https://oteku.github.io/">Thomas Haesslé</a></p>
</div>
</div>
<p style="text-align: justify;">Voici comment Henri l’utilise aujourd’hui :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java">static Result&lt;Caillou, Exception&gt; create(String name){
    var letter = name.charAt(0);
    if(letter &lt; 65 || letter &gt; 90) {
        return Result.err(new IllegalArgumentException(format("%s is not a Cailloux", name)));
    }

    var dayOfYear = Integer.parseInt(name.substring(1));
    if(dayOfYear &lt; 0 || dayOfYear &gt; 365) {
        return Result.err(new IllegalArgumentException(format("%s is not a Cailloux", name)));
    }

    return Result.ok(new Caillou(letter, dayOfYear));
}

void handleCreate(String input){
    switch (create(input)){
        case Result.Err&lt;Caillou, Exception&gt; result -&gt; log(result.error);
        case Result.Ok&lt;Caillou, Exception&gt; result -&gt; doSomethingWithCaillou(result.ok);
    }
}</pre>
<p style="text-align: justify;">(Le nouveau code)</p>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/common/abstract-data-types//henry_5.png" alt="image" /></p>
<p style="text-align: justify;">Maintenant Henri est heureux, il propose pour conclure quelques cartes pour mémoriser certains ADT et leurs particularités.</p>
<p style="text-align: justify;">Sources</p>
<ul>
<li style="text-align: justify;"><a href="https://en.wikipedia.org/wiki/Tagged_union">https://en.wikipedia.org/wiki/Tagged_union</a></li>
<li style="text-align: justify;"><a href="https://fr.wikipedia.org/wiki/Structure_de_donn%C3%A9es">https://fr.wikipedia.org/wiki/Structure_de_donn%C3%A9es</a></li>
<li style="text-align: justify;"><a href="https://fr.wikipedia.org/wiki/Type_abstrait">https://fr.wikipedia.org/wiki/Type_abstrait</a></li>
<li style="text-align: justify;"><a href="https://dev.realworldocaml.org/variants.html">https://dev.realworldocaml.org/variants.html</a></li>
<li style="text-align: justify;"><a href="https://jpintelli.com/2020/12/28/adt-with-java-sealed-classes-pattern-matching-records/">https://jpintelli.com/2020/12/28/adt-with-java-sealed-classes-pattern-matching-records/</a></li>
<li style="text-align: justify;"><a href="https://en.wikipedia.org/wiki/Record_(computer_science)">https://en.wikipedia.org/wiki/Record_(computer_science)</a></li>
<li style="text-align: justify;"><a href="https://fr.wikipedia.org/wiki/Type_r%C3%A9cursif">https://fr.wikipedia.org/wiki/Type_r%C3%A9cursif</a></li>
<li style="text-align: justify;"><a href="https://blog.shangjiaming.com/vavr-introduction/">https://blog.shangjiaming.com/vavr-introduction/</a></li>
<li style="text-align: justify;"><a href="https://www.vavr.io/">https://www.vavr.io/</a></li>
<li style="text-align: justify;"><a href="https://v2.ocaml.org/manual/gadts-tutorial.html">https://v2.ocaml.org/manual/gadts-tutorial.html</a></li>
<li style="text-align: justify;"><a href="https://cs.wellesley.edu/~cs251/s12/handouts/modules.pdf">https://cs.wellesley.edu/~cs251/s12/handouts/modules.pdf</a></li>
<li style="text-align: justify;"><a href="https://medium.com/@aoturan/commonly-used-abstract-data-types-d9470b14f864">https://medium.com/@aoturan/commonly-used-abstract-data-types-d9470b14f864</a></li>
</ul>
</div>
<p>L’article <a href="https://ekite.info/2023/03/15/abstract-data-types/">Abstract Data Types</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ekite.info/2023/03/15/abstract-data-types/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1008</post-id>	</item>
		<item>
		<title>Boostez vos applis web avec Web Assembly !</title>
		<link>https://ekite.info/2022/10/06/boostez-vos-applis-web-avec-web-assembly/</link>
					<comments>https://ekite.info/2022/10/06/boostez-vos-applis-web-avec-web-assembly/#respond</comments>
		
		<dc:creator><![CDATA[Laurent Duchaussoy]]></dc:creator>
		<pubDate>Thu, 06 Oct 2022 10:28:27 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=1004</guid>

					<description><![CDATA[<p>Web Assembly (ou WASM) est un standard du World Wide Web consistant en un bytecode exécuté côté navigateur dans un environnement dédié (sandbox) en complément du Javascript (JS). Ce code bas niveau étant interprété côté navigateur peut être écrit dans différents langages comme le C, C++, RUST, x86 etc. L’interprétation du Web Assembly se fait [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2022/10/06/boostez-vos-applis-web-avec-web-assembly/">Boostez vos applis web avec Web Assembly !</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="post-header" style="text-align: justify;">Web Assembly (ou WASM) est un standard du World Wide Web consistant en un bytecode exécuté côté navigateur dans un environnement dédié (sandbox) en complément du Javascript (JS).</p>
<div class="extract">
<p style="text-align: justify;">Ce code bas niveau étant interprété côté navigateur peut être écrit dans différents langages comme le C, C++, RUST, x86 etc.</p>
<p style="text-align: justify;">L’interprétation du Web Assembly se fait plus bas-niveau que celle du Javascript. Web Assembly utilise de manière plus efficace et directe les ressources disponibles sur la machine sur laquelle il s’exécute (CPU/Mémoire), et permet donc d’atteindre un haut niveau de performances.</p>
<p style="text-align: justify;">Ces performances accrues permettent alors de développer des applications qui n’étaient pas envisageables en Javascript. Par exemple du traitement vidéo en temps réel, comme le floutage d’arrière plan en visio-conférence, ou encore des jeux vidéo.</p>
<p style="text-align: justify;">Pour résumer, WASM a été créé pour tirer parti de la puissance des langages de bas niveau, couplé à la flexibilité de Javascript afin de créer des applications Web plus performantes.</p>
<h2 id="un-peu-de-contexte" style="text-align: justify;">Un peu de contexte</h2>
<p style="text-align: justify;">WASM fut officiellement lancé en 2015 pour la première fois sous forme d’une démonstration faite sous Unity (moteur de jeu multi plateforme) afin de démontrer les performances et les possibilités de l’outil.</p>
<p style="text-align: justify;">Mozilla a sorti asm.js, le 21 mars 2013, un sous-ensemble du langage JS pour améliorer les performances grâce à une couche de traitement binaire. Google et Lars Bak ont mis en place un moteur JS V8, le 2 septembre 2008, qui peut compiler nativement vers de l’assembleur. Ces deux derniers événements sont surtout des améliorations liées à la gestion du langage.</p>
<h2 id="objectifs" style="text-align: justify;">Objectifs</h2>
<p style="text-align: justify;">Les objectifs du WASM sont:</p>
<ul style="text-align: justify;">
<li><b>la rapidité</b> : avoir des performances proches des applications natives (C/C++/Rust) tout en fonctionnant sur un navigateur Web..</li>
<li><b>la portabilité</b> : WebAssembly est conçu de manière à s’associer aux autres technologies web mais aussi de garantir une rétro compatibilité ascendante entre les différentes versions.<br />
Il existe aussi des polyfills pour les navigateurs plus anciens.</li>
<li><b>la sécurité</b> : l’environnement dédié permet de garantir une isolation totale du code et de la machine de l’utilisateur. Par exemple, la partie entrée / sortie (réseau et fichier) est totalement inaccessible (en dehors du module qui l’embarque).</li>
</ul>
<h2 id="la-compilation" style="text-align: justify;">La compilation</h2>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/front-end/web-assembly//image-1.jpg" alt="image" /></p>
<p style="text-align: justify;">Fig: Le processus de compilation Web Assembly</p>
<p style="text-align: justify;">Afin d’exécuter du Web Assembly dans une page web, il faut compiler du code écrit dans un langage source (écrit en C, C++, Rust ou autre) vers un code intermédiaire (le bytecode WASM). Le bytecode est situé entre le code d’un langage source et le code machine (binaire). Cela est rendu possible grâce à une infrastructure de compilation <a href="https://ekite.tech/articles/front-end/web-assembly/#llvm">LLVM</a>, qui implémente la traduction d’un AST (<a href="https://ekite.tech/articles/front-end/web-assembly/#syntaxeTree">arbre de syntaxe abstraite</a>) en bytecode WASM.<br />
Le fichier ainsi compilé aura pour extension ‘.wasm’.</p>
<p style="text-align: justify;">L’utilisation d’une LLVM permet d’isoler et d’uniformiser la compilation de tous les langages sources supportés vers ce format. Pour ajouter le support d’un langage, il suffit d’implémenter un programme capable de lire un AST pour le transmettre à la LLVM (transpilateur).<br />
Il est donc possible de créer des compilateurs pour n’importe quel langage. (une liste des langages principaux déjà supportés par WASM se trouve sur le Discord de sa communauté.)</p>
<p style="text-align: justify;">Fonctionnement général du Web Assembly</p>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/front-end/web-assembly//image-2.jpg" alt="image" /></p>
<p style="text-align: justify;">Le code initialement écrit dans un langage haut-niveau est donc compilé dans en un module web-assembly. La compilation produit un fichier binaire ‘.wasm’ contenant le bytecode devant être exécuté dans le navigateur web de l’utilisateur. Les fichiers ‘.wasm’ peuvent alors être distribués aux utilisateurs comme le reste des ressources statiques d’une application web.</p>
<p style="text-align: justify;">Lorsqu’un utilisateur consulte l’application web, les ressources statiques (HTML, CSS, Images) sont téléchargées par son navigateur, ainsi que le code Javascript et les binaires ‘.wasm’. Le navigateur se charge de décoder, compiler et exécuter le code WASM, en parallèle du code Javascript habituel.</p>
<h2 id="les-concepts" style="text-align: justify;">Les concepts</h2>
<ul style="text-align: justify;">
<li>Intégration sur le web WebAssembly est conçu de manière à facilement s’associer aux autres technologies web et de garantir une rétrocompatibilité.</li>
<li>Le fichier compilé est téléchargé, l’exécution est faite nativement sur le poste de l’utilisateur et la mémoire est gérée de manière linéaire.</li>
<li>Bien que l’exécution ait lieu sur le poste de l’utilisateur, WASM ne permet pas l’accès à certains composants du <a href="https://ekite.tech/articles/front-end/web-assembly/#kernel">kernel</a> : Il existe une limite sur la gestion des entrées/sorties. (pour des raisons de sécurité)</li>
<li>Mémoire linéaire La mémoire linéaire est une seule plage d’adresse mémoire sur laquelle on peut agir au fil de l’eau. Vu l’abstraction du sujet, il est mieux de pouvoir se représenter tout ça. Voici un parallèle entre la manière dont est gérée la mémoire en Java (de Jakob Jenkov) et un schéma de la mémoire linéaire (de Meghalee Goswami) :</li>
</ul>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/front-end/web-assembly//image-3.jpg" alt="image" /></p>
<p style="text-align: justify;">Avant d’aller à la suite un petit aparté : WASM a mis en place un traducteur du fichier compilé nommé <a href="https://developer.mozilla.org/en-US/docs/WebAssembly/Understanding_the_text_format">Web Assembly Text (WAT)</a>. Le fichier compilé est donc lisible</p>
<ul style="text-align: justify;">
<li>Module Représente un binaire WASM qui a été compilé en code exécutable par le navigateur.</li>
<li>Table Représente un tableau typé de référence ne pouvant être stocké de manière brute en mémoire (pour des raisons de sécurité et de portabilité).</li>
<li>Instance Représente un module associé ainsi que ses états (la mémoire, la table ainsi qu’un ensemble de données importées).</li>
</ul>
<h2 id="les-cas-dusage-de-wasm" style="text-align: justify;">Les cas d’usage de WASM</h2>
<p style="text-align: justify;">Comme expliqué en introduction, WASM permet un haut niveau de performances impossible en Javascript. Ces performances ouvrent la possibilité d’implémenter de nouveaux cas d’usage. Certains de ces cas d’usage sont concrets et déjà mis en place dans certaines applications et jeux. D’autres cas d’usage sont plutôt de l’ordre du POC (Proof Of Concept) ou de la démo :</p>
<ul style="text-align: justify;">
<li>Server-side rendering</li>
<li>OCI (Open Container Initiative)</li>
<li>3D Web View Rendering</li>
<li>Étendre des fonctions JS</li>
<li>Extensions navigateurs (ublock origin)</li>
<li>Utilisation de la 3D</li>
</ul>
<p style="text-align: justify;">Voici des exemples d’applications connues faites à l’aide de WASM :<br />
<a href="https://www.figma.com/fr/blog/webassembly-cut-figmas-load-time-by-3x/">Figma</a>, <a href="https://madewithwebassembly.com/showcase/google-earth">Google Earth</a>, <a href="https://madewithwebassembly.com/showcase/unity">Unity</a>, <a href="https://madewithwebassembly.com/showcase/tensorflow">Unity</a>, etc.</p>
<h3 id="pros" style="text-align: justify;">Pros</h3>
<ul style="text-align: justify;">
<li>Performance</li>
<li>Cross platform</li>
<li>Sécurisation</li>
<li>multiples langages Rust / C++ / C etc.</li>
<li>Portabilité</li>
</ul>
<h3 id="cons" style="text-align: justify;">Cons</h3>
<ul style="text-align: justify;">
<li>Communauté faible</li>
<li>Beaucoups de concepts complexe à appréhender avant de pouvoir faire la moindre chose</li>
<li>N’a pas encore percé malgré son “âge”</li>
<li>Installation plus ou moins aisée en fonction de la plateforme de développement</li>
<li>Pas “user friendly”</li>
</ul>
<h2 id="conclusion" style="text-align: justify;">Conclusion</h2>
<p style="text-align: justify;">Le principal but de WASM est d’apporter un enrichissement de la stack technique de Javascript avec un haut niveau de performances. La plus grande difficulté de WASM reste d’assimiler ses différents principes et concepts généraux</p>
<ul style="text-align: justify;">
<li>devoir utiliser un langage de bas niveau</li>
<li>utiliser un compilateur</li>
<li>avoir affaire à une communauté de niche</li>
<li>assez complexe à appréhender Malgré une adoption encore faible, il n’en reste pas moins fiable que ce soit en termes de sécurité, de performance, de lisibilité et dans certains domaines la seule solution possible afin de garantir un haut niveau de performance sur une application Web.</li>
</ul>
<h2 id="lexique" style="text-align: justify;">Lexique</h2>
<ul style="text-align: justify;">
<li><b><a name="bytecode"></a>bytecode:</b> En informatique, le bytecode (terme anglais signifiant « code en bytes ») est un code intermédiaire entre les instructions machines et le code source, qui n’est pas directement exécutable. Le bytecode (également appelé code portable ou p-code) peut être créé à la volée et résider en mémoire (compilation à la volée, JIT en anglais) ou bien résider dans un fichier, généralement binaire qui représente le programme, tout comme un fichier de code objet produit par un compilateur. <a href="https://fr.wikipedia.org/wiki/Bytecode">Source</a></li>
<li><b><a name="syntaxeTree"></a>Arbre de syntaxe abstraite:</b> Un arbre de syntaxe abstraite (AST) est une manière de représenter la syntaxe d’un langage de programmation sous la forme d’une structure arborescente hiérarchique. Cette structure est utilisée pour générer des tables de symboles pour les compilateurs et la génération de code ultérieure. L’arbre représente toutes les constructions du langage et leurs règles ultérieures. <a href="https://definir-tech.com/arbre-de-syntaxe-abstraite-ast/">Source</a></li>
<li><b><a name="llvm"></a>LLVM:</b> LLVM (anciennement appelé Low Level Virtual Machine en français : « machine virtuelle de bas niveau ») est une infrastructure de compilateur conçue pour l’optimisation du code à la compilation, à l’édition de liens, voire à l’exécution ou durant les « temps morts » d’un programme, quel que soit le langage d’origine. LLVM permet de créer une machine virtuelle pour des langages similaires à Java et sa JVM, un générateur de code pour une architecture matérielle spécifique, et des optimiseurs de compilation indépendants de toute plate-forme et de tout langage. <a href="https://fr.wikipedia.org/wiki/LLVM">Source</a></li>
<li><b><a name="kernel"></a>Kernel:</b> terme anglais signifiant « noyau ». Il constitue le cœur du système qui exploite un ordinateur. Il établit la communication entre la partie matérielle et la partie logicielle de l’appareil. <a href="https://www.jedha.co/blog/kernel-definition-utilite">Source</a></li>
</ul>
<h2 id="sources" style="text-align: justify;">Sources</h2>
<p style="text-align: justify;">The state of WebAssembly (2022)</p>
<ul>
<li style="text-align: justify;"><a href="https://tech.mozfr.org/post/2017/03/08/D-ou-vient-la-rapidite-de-WebAssembly">https://tech.mozfr.org/post/2017/03/08/D-ou-vient-la-rapidite-de-WebAssembly</a></li>
<li style="text-align: justify;"><a href="https://developer.mozilla.org/fr/docs/">https://developer.mozilla.org/fr/docs/</a></li>
<li style="text-align: justify;"><a href="https://emscripten.org/">https://emscripten.org/</a></li>
<li style="text-align: justify;"><a href="https://developer.mozilla.org/fr/docs/">https://developer.mozilla.org/fr/docs/</a></li>
<li style="text-align: justify;"><a href="https://jenkov.com/tutorials/java-concurrency/java-memory-model.html">https://jenkov.com/tutorials/java-concurrency/java-memory-model.html</a></li>
<li style="text-align: justify;"><a href="https://www.youtube.com/watch?v=hSeB9I_mK6A&amp;t=4s">Angry Bots Démo</a></li>
<li style="text-align: justify;"><a href="https://discord.gg/3B8QFXkYTc">lien discord Wasm</a></li>
<li style="text-align: justify;"><a href="https://madewithwebassembly.com/">Applications faite en WASM</a></li>
<li style="text-align: justify;"><a href="https://radu-matei.com/blog/wasm-to-oci/">OCI (Open Container Initiative)</a></li>
<li style="text-align: justify;"><a href="https://study.com/academy/lesson/what-is-the-linear-memory-model-definition-constraints.html">schéma mémoire linéaire de Meghalee Goswami</a></li>
</ul>
</div>
<p>L’article <a href="https://ekite.info/2022/10/06/boostez-vos-applis-web-avec-web-assembly/">Boostez vos applis web avec Web Assembly !</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ekite.info/2022/10/06/boostez-vos-applis-web-avec-web-assembly/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1004</post-id>	</item>
		<item>
		<title>Les structures algébriques</title>
		<link>https://ekite.info/2022/05/18/les-structures-algebriques/</link>
					<comments>https://ekite.info/2022/05/18/les-structures-algebriques/#respond</comments>
		
		<dc:creator><![CDATA[Florian Barbet]]></dc:creator>
		<pubDate>Wed, 18 May 2022 11:52:51 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=998</guid>

					<description><![CDATA[<p>Les premiers algorithmes ont été réalisés bien avant que le premier ordinateur ne soit conceptualisé. Le tout premier algorithme connu a été écrit en -300 avant notre ère par Euclide (PGCD). Aujourd’hui les mathématiques font rêver, font peur et semblent parfois inaccessibles. Une chose est sûre, elles sont partout. Comptables, développeurs, boulangers ou même politiques, [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2022/05/18/les-structures-algebriques/">Les structures algébriques</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="post-header" style="text-align: justify;">Les premiers algorithmes ont été réalisés bien avant que le premier ordinateur ne soit conceptualisé.</div>
<div class="extract">
<p style="text-align: justify;">Le tout premier algorithme connu a été écrit en -300 avant notre ère par Euclide (PGCD).<br />
Aujourd’hui les mathématiques font rêver, font peur et semblent parfois inaccessibles. Une chose est sûre, elles sont partout.<br />
Comptables, développeurs, boulangers ou même politiques, tous utilisent les mathématiques : le langage suit un ensemble de règles mathématiques.<br />
Les structures du langage sont réalisées par l’application d’un arbre de la syntaxe abstraite.</p>
<p style="text-align: justify;">Les structures algébriques font partie des bases des mathématiques. C’est un socle sur lequel de nombreuses règles sont construites.<br />
En particulier, pour réaliser des applications robustes, performantes et maintenables. Elles peuvent apporter une aide précieuse.</p>
<h2 id="définition" style="text-align: justify;">Définition</h2>
<p style="text-align: justify;">Les structures algébriques sont un ensemble d’entités basées sur des axiomes initiaux à partir desquels il est possible de démontrer un certain nombre de lois.<br />
L’objectif de ces structures est d’assurer, après avoir vérifié des axiomes simples, la déduction de lois dont il est possible de tirer des conclusions utiles.<br />
Les premières structures à étudier, les plus simples, sont les magmas et les monoïdes.</p>
<h2 id="les-magmas" style="text-align: justify;">Les magmas</h2>
<p style="text-align: justify;">Les magmas sont les fondations des structures algébriques, le premier niveau. Ils permettent de définir le contexte.<br />
Cependant, n’ayant que très peu de contraintes, ils ne donnent pas la possibilité d’en déduire beaucoup de lois.</p>
<p style="text-align: justify;"><b>Recette miracle:</b><br />
<b>Pour créer un magma, il faut réunir un ensemble et une loi de composition interne.</b></p>
<p style="text-align: justify;">Un ensemble est constitué d’éléments en nombre fini ou non et peut être constitué de différents types d’éléments.<br />
Par exemple, l’univers est un ensemble contenant des sous-ensembles de planètes, d’étoiles, de trou noirs, etc.</p>
<p style="text-align: justify;">Une loi de composition interne est une opération entre deux éléments de l’ensemble qui renvoie un élément de ce même ensemble.<br />
L’opération consistant à mélanger deux pots de peinture crée un autre pot de peinture avec une couleur potentiellement différente.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">CH	 	 	 	 
C056	B084	M083	C189	M356</pre>
<p style="text-align: justify;">Henri a 8 ans, adore les cailloux et ses amis (Charles, Bertrand et Marie), il est aussi un spécialiste des mathématiques.</p>
<p style="text-align: justify;">Henri possède 5 cailloux et une manière très spéciale de les nommer. Cependant Henri ne donne pas de noms aléatoires. Ses cailloux ont un nom relatif à l’endroit et au jour où ils les trouvent.<br />
Par exemple Henri a trouvé C056 dans le jardin de son ami Charles, le 56ème jour de l’année.</p>
<p style="text-align: justify;">CH est un sous-ensemble d’un ensemble. Il est caractérisé par la concaténation d’une lettre et d’une série de chiffres allant de 000 à 365 ; appelons cet ensemble CPH (Cailloux potentiels d’Henri).</p>
<p style="text-align: justify;">Henri est confronté à un problème, il veut savoir quel est son caillou le plus fort. Il va donc pour cela créer une opération pour lui permettre de s’y retrouver.</p>
<p style="text-align: justify;">Voici en quoi consiste son opération (selon ses propres mots) :</p>
<ol style="text-align: justify;">
<li>Calculer le poids de chaque caillou.</li>
<li>Multiplier la position dans l’alphabet de la lettre par le numéro du jour de l’année. Comparer lequel est le plus gros, si les deux sont égalités le poids de la lettre l’emporte.</li>
</ol>
<p style="text-align: justify;">Le résultat de l’opération d’Henri a créé ce tableau :</p>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/front-end/algebraic-structure//img-1.jpg" alt="image" /></p>
<p style="text-align: justify;">Henri ne le sait pas mais il vient de créer un Magma sur l’ensemble CH.</p>
<p style="text-align: justify;"><b>L’application du plus fort Caillou v0.1.0</b></p>
<p><b>Configuration requise:</b><br />
Un magma, ne possédant aucune autre propriété que celles susmentionnées, permet deux choses essentielles.</p>
<ol>
<li>Contrôler les limites des entrées</li>
<li>Mettre en pratique une analyse séquentielle via une opération (LCI).</li>
</ol>
<p>Classiquement (sans savoir que c’est un magma) une simple analyse syntaxique sur une chaîne de caractère suffit :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java">public static String stronger(List&lt;String&gt; cailloux){
    var inputFormat = "[A-Z]([0-2][0-9][0-9]|3([0-5][0-9]|6[0-5]))";
    ToIntFunction&lt;String&gt; letter = word -&gt; word.charAt(0) - 64;
    String result = null;
    for(var aCaillou : cailloux){
        if(!aCaillou.matches(inputFormat)){
            throw new IllegalArgumentException("is not a Caillou");
        }
        if(result == null || result.trim().isEmpty()){
            result = aCaillou;
            continue;
        }
       var weightResult = (result.charAt(0) - 64) * Integer.parseInt(result.substring(1));
         var weightACaillou = (aCaillou.charAt(0) - 64) * Integer.parseInt(aCaillou.substring(1));

        if(weightResult &lt; weightACaillou
            || (weightACaillou == weightResult &amp;&amp;
                letter.applyAsInt(result) &lt; letter.applyAsInt(aCaillou))
        ){
            result = aCaillou;
        }
    }
    return result;
}
</pre>
<p>Ici les cailloux potentiels d’Henri ont une forme très spécifique. Voici le résultat avec un magma :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java">record Caillou(
        char letter,
        int dayOfYear
) {
    Caillou{
        if (dayOfYear &lt; 0 || dayOfYear &gt; 365)
            throw new IllegalArgumentException("is not a Caillou");
        if (letter &lt; 65 || letter &gt; 90)
            throw new IllegalArgumentException("is not a Caillou");
    }

    int weight() {
        return ((letter - 64) * dayOfYear);
    }

    Caillou strongest(Caillou other){
        if(other.weight() &gt; this.weight()
            || (other.weight() == this.weight()
                &amp;&amp; other.letter &gt; this.letter)) {
            return other;
        }
        return this;
    }

    public static Caillou stronger(Caillou a, Caillou b){
        return a.strongest(b);
    }

    public static Caillou of(String name){
        return new Caillou(name.charAt(0), Integer.parseInt(name.substring(1)));
    }
}
Optional&lt;Caillou&gt; henrisCaillou(List&lt;String&gt; inputList){
  return inputList
    .stream()
    .map(Caillou::of)
    .reduce(Caillou::stronger);
}

</pre>
<p><b>Le magma permet de définir le cadre de travail :</b></p>
<ul style="text-align: justify;">
<li>Connaître l’ensemble des éléments sur lesquels les actions sont réalisées.</li>
<li>Connaître l’opération qui sera utilisée en s’assurant que le résultat fait partie de l’ensemble Aucune autre conclusion ne peut être déduite de ce cadre de travail. Il s’agit de structurer la pensée mais pour aller plus loin et faciliter les traitements, il est nécessaire de définir un cadre légèrement plus contraint.</li>
</ul>
<p style="text-align: justify;">Aucune autre conclusion ne peut être déduite de ce cadre de travail. Il s’agit de structurer la pensée mais pour aller plus loin et faciliter les traitements, il est nécessaire de définir un cadre légèrement plus contraint.</p>
<h2 id="les-monoïdes" style="text-align: justify;">Les monoïdes</h2>
<p style="text-align: justify;">Les monoïdes proviennent d’un terme allemand, mal-traduit, signifiant “Individu”.<br />
Les monoïdes sont, comme toutes les structures algébriques, des magmas respectant des axiomes supplémentaires. Ces axiomes permettent de démontrer des propriétés qui peuvent s’avérer très utiles.</p>
<p style="text-align: justify;"><b>Recette miracle</b> <b>Pour créer un monoïde nous avons besoin d’un magma unifère et associatif.</b></p>
<p style="text-align: justify;">Unifère signifie que l’ensemble contient un élément neutre vis-à-vis de l’opération du magma. Cet élément neutre n’impacte pas le résultat si on réalise l’opération avec n’importe quel élément. <code class="highlighter-rouge">(n+0 = n et 0+m = m; 0 est un élément neutre pour l’opération '+' dans l’ensemble des entiers)</code>.<br />
Associatif signifie qu’une chaîne d’opération peut être réalisée dans n’importe quel ordre sans que le résultat s’en trouve modifié. <code class="highlighter-rouge">(a+b+c = (a+b)+c = a+(b+c); la somme est associative)</code>.</p>
<p style="text-align: justify;">Associatif signifie qu’une chaîne d’opération peut être réalisée dans n’importe quel ordre sans que le résultat s’en trouve modifié. <code class="highlighter-rouge">(a+b+c = (a+b)+c = a+(b+c); la somme est associative)</code>.</p>
<p style="text-align: justify;">Ces deux propriétés du monoïde permettent de démontrer une loi très intéressante pour les traitements informatiques : les calculs parallèles. Sans faire la démonstration, un exemple permet de s’imaginer cette propriété en utilisant le monoïde précédemment utilisé : l’ensemble des entiers munis de la somme.</p>
<p style="text-align: justify;">L’opération consiste à réaliser <code class="highlighter-rouge">1+2+3+4+5+6</code>. L’associativité permet de réaliser les opérations sous la forme <code class="highlighter-rouge">(1+2)+(3+4)+(5+6) = 3+7+11 = 10+11 = 21</code>. Pour réaliser les cinq opérations <code class="highlighter-rouge">(nombre de signes ‘+’)</code>, trois séries de calculs ont été nécessaires <code class="highlighter-rouge">(nombre de '=')</code> en parallélisant trois opérations dans la première étape. Cela est mathématiquement permis uniquement dans le cadre du monoïde.</p>
<h2 id="exemple--le-monoïde-derrière-le-magma-dhenri" style="text-align: justify;">Exemple : Le Monoïde derrière le Magma d’Henri</h2>
<p style="text-align: justify;">Précédemment, Henri a créé un magma, il a également créé un monoïde sur l’ensemble CPH (Cailloux potentiels d’Henri). Comment Henri a réussi à construire ce monoïde ?</p>
<p style="text-align: justify;"><b>Associativité</b> Il faut démontrer l’associativité de l’opération stronger(), visuellement sur l’ensemble CH on peut le voir (effet miroir) :</p>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/front-end/algebraic-structure//img-1.jpg" alt="image" /></p>
<p style="text-align: justify;">Il s’agit d’appliquer ces vérifications sur l’ensemble CPH. En mathématiques il est coutûme de démontrer par formulation que tout élément respecte l’associativité. Naïvement c’est possible (un élément à la fois). Cet ensemble est présent dans 2 autres ensembles : L’alphabet et les chiffres allant de 0 à 365.</p>
<p style="text-align: justify;">Il est possible de décomposer et se placer dans un ensemble commun :</p>
<p style="text-align: justify;">Il existe une étape intermédiaire : le calcul du poids. Le calcul du poids est un entiers allant de <code class="highlighter-rouge">0 à 9 125 (25 (Z) * 365)</code> . Nous appliquons ensuite une comparaison au maximum. Cette étape intermédiaire se place dans un sous-ensemble d’un ensemble très connu : les entiers naturels contenant 0. De plus, l’associativité des extremums (calcul maximum et minimum) a été démontrée sur cet ensemble.</p>
<p style="text-align: justify;"><ins>Unifère</ins></p>
<p style="text-align: justify;">Il faut prouver l’existence d’ un élément neutre. Selon les critères d’Henri le poids d’un cailloux est relatif à sa position dans l’alphabet puis agrégé au jour de l’année où Henri l’a trouvé (sauf exception en cas d’égalité : la lettre l’emporte). Cela veut dire que le poids minimum qui est de 0 (représenté par le cailloux potentiel d’Henri A000) est le cailloux le plus faible possible dans cet ensemble. 0 étant le nombre le plus petit des entiers naturels contenant 0, cela fait de lui un élément neutre dans le calcul du maximum :</p>
<ul style="text-align: justify;">
<li><code class="highlighter-rouge">Pour tout x dans N; tel que x &gt;= 0 alors x</code>.</li>
</ul>
<p style="text-align: justify;">Le classement est ingénieux, à quoi peuvent servir ces axiomes ?</p>
<p style="text-align: justify;">L’associativité permet de dire que peu importe le sens d’une opération elle aura le même résultat. Si on l’applique en première ou en dernière, rien ne change !<br />
L’élément neutre permet de mettre en place une forme d’initialisation pour le cas où un jour Henri oublie de mettre le nom de tous ses cailloux dans son application par exemple.</p>
<p style="text-align: justify;">Henri aimerait vraiment que son application soit plus performante car il en a encore une centaine…. de milliers de cailloux à traiter.</p>
<p style="text-align: justify;"><b>L’application du plus fort Caillou v0.1.1</b></p>
<p>L’associativité permet de mettre en place du multi-threading.<br />
L’élément neutre a un rôle d’initialisation/valeur par défaut.</p>
<p>Classiquement la mise en place d’une certaine parallélisation est enclin à de nombreux doutes. Pour continuer l’exemple, il faut mettre ces doutes de côté.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java">public static String stronger(List&lt;String&gt; cailloux){
    var inputFormat = "[A-Z]([0-2][0-9][0-9]|3([0-5][0-9]|6[0-5]))";
    ToIntFunction&lt;String&gt; letter = word -&gt; word.charAt(0) - 64;
    AtomicReference&lt;String&gt; atomicResult = new AtomicReference&lt;&gt;("A000");
    var pool = new ForkJoinPool();

    for(var aCaillou : cailloux) {
        pool.execute(() -&gt; {
            if(!aCaillou.matches(inputFormat)){
                throw new IllegalArgumentException("is not a Caillou");
            }
            var result = atomicResult.get();
            var weightResult = (result.charAt(0) - 64) * Integer.parseInt(result.substring(1));
            var weightACaillou = (aCaillou.charAt(0) - 64) * Integer.parseInt(aCaillou.substring(1));

            if(weightResult &lt; weightACaillou
                    || (weightACaillou == weightResult &amp;&amp;
                    letter.applyAsInt(result) &lt; letter.applyAsInt(aCaillou))
            ){
                atomicResult.set(aCaillou);
            }
        });
    }
    return atomicResult.get();
}
</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="java">Result : Y364
Time: 78 ms over 250000 iterations ; CPU usage (%): 4.438960808734625 %</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="java">Avant : Y364
Time: 235 ms over 250000 iterations ; CPU usage (%): 4.438960808734625 %
</pre>
<p>Voici le résultat avec la réflexion sur les monoïdes :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java">record Caillou :
….
public static Caillou neutral(){
    return new Caillou('A', 0);
}
….
Optional&lt;Caillou&gt; henrisCailloux(List&lt;String&gt; inputList){
  return inputList
    .parallelStream()
    .map(Caillou::of)
    .reduce(Caillou.neutral(), Caillou::stronger);
}
</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="java">Result: Optional[Caillou[letter=Y, dayOfYear=364]]
Time: 8 ms over 250000 iterations ; CPU usage (%): 4.438960808734625 %
</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="java">Avant : Optional[Caillou[letter=Y, dayOfYear=364]]
Time: 12 ms over 250000 iterations ; CPU usage (%): 4.438960808734625 %
</pre>
<p style="text-align: justify;">Le monoïde permet d’apporter de nouvelles propriétés utiles pour une meilleure conception :</p>
<ul style="text-align: justify;">
<li>Une chaîne d’opération peut être parallélisée en garantissant le résultat</li>
<li>Une valeur par défaut peut être utilisée pour éviter les erreurs de traitement Cette structure est la première à apporter des propriétés utiles aux conceptions en informatique. Il en existe beaucoup d’autres, plus ou moins complexes à identifier, pour obtenir divers avantages. Ainsi, en vérifiant des propriétés sur un ensemble et une opération, il est possible de déduire de nombreuses lois qui facilitent ou optimisent les traitements.</li>
</ul>
<h2 id="ce-quon-doit-en-retenir" style="text-align: justify;">Ce qu’on doit en retenir</h2>
<p style="text-align: justify;">Bien sûr il ne faut pas forcément coder comme un grand mathématicien avec son tableau rempli de formule (quoique en dehors des formules ?).<br />
Comme l’a dit un grand sage “apprendre à coder via des structures et seulement des structures est un comportement élitiste”.<br />
Ce même grand sage a dit qu’il est préférable d’apprendre à les identifier.<br />
Identifier leurs forces, leurs faiblesses, le contexte le plus adéquat à leur utilisation. Une fois qu’on arrive à les cerner, une porte s’ouvre vers une autre manière de développer des applications qualitatives.<br />
La multitude de structures algébriques qui existent n’est pas exposée ici. Nous vous avons fait vivre les aventures d’Henri pour ouvrir une perspective sur ce monde et dans l’espoir que vous puissiez vous y faire votre propre avis.<br />
Sans les mathématiques, tout est faisable, mais avec les mathématiques, tout est structuré.</p>
<h2 id="sources-" style="text-align: justify;">Sources</h2>
<ul>
<li style="text-align: justify;">https://blog.derniercri.io/observons-une-premiere-structure-algebrique-appliquee-a-linformatique-le-monoide/</li>
<li style="text-align: justify;">https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_cat%C3%A9gories#Morphismes &#8211; Xavier Van de Woestyne</li>
<li style="text-align: justify;">Thomas Haesslé &#8211; Cours et discussions (https://oteku.github.io/)</li>
<li style="text-align: justify;">Lambda Lille &#8211; conférences (https://twitter.com/lambdalille)</li>
<li style="text-align: justify;">https://www.youtube.com/watch?v=RaqlxOihGxw&amp;list=PLNefH6S6myiMFlgsEIGHb8KZaLKE2eAZQ &#8211; micmaths</li>
<li style="text-align: justify;">https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_cat%C3%A9gories#Morphismes</li>
<li style="text-align: justify;">https://fr.wikipedia.org/wiki/Structure_alg%C3%A9brique</li>
</ul>
</div>
<p>L’article <a href="https://ekite.info/2022/05/18/les-structures-algebriques/">Les structures algébriques</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ekite.info/2022/05/18/les-structures-algebriques/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">998</post-id>	</item>
		<item>
		<title>Micro Front End</title>
		<link>https://ekite.info/2022/03/02/micro-front-end/</link>
					<comments>https://ekite.info/2022/03/02/micro-front-end/#respond</comments>
		
		<dc:creator><![CDATA[Laurent Duchaussoy]]></dc:creator>
		<pubDate>Wed, 02 Mar 2022 13:05:26 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://ekite.info/?p=997</guid>

					<description><![CDATA[<p>Inspiré par les architectures microservices Back-End, le principe du micro-front end se résume en une agrégation de composants web « isolées ». Voyez la page finale comme un puzzle où chaque morceau serait un composant MFE. Ces composants peuvent être une barre de navigation, un bouton ou tout simplement un texte. Cette découpe apporte en [&#8230;]</p>
<p>L’article <a href="https://ekite.info/2022/03/02/micro-front-end/">Micro Front End</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="post-header" style="text-align: justify;">Inspiré par les architectures microservices Back-End, le principe du micro-front end se résume en une agrégation de composants web « isolées ».</div>
<div class="extract">
<p style="text-align: justify;">Voyez la page finale comme un puzzle où chaque morceau serait un composant MFE. Ces composants peuvent être une barre de navigation, un bouton ou tout simplement un texte. Cette découpe apporte en quelque sorte de la “liberté”.<br />
Ce type d’architecture permet de choisir son framework Front, d’être autonome sur sa livraison et de séparer les projets par équipes au lieu de travailler sur un monolith commun. Le but du MFE est de simplifier la gestion, la maintenabilité, la conception et le découpage des interfaces utilisateurs.<br />
Garantir le bon fonctionnement de la page Web finale demandera de la rigueur et un travail commun.<br />
Il existe une multitude de façon de faire du micro-front end notamment en utilisant des technologies HTML (Iframe) ou un agrégateur en Back End (type Node Js, Java etc..)…</p>
<h2 id="origine" style="text-align: justify;">Origine</h2>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/front-end/micro-front-end//image_1.jpg" alt="image" /></p>
<p style="text-align: justify;">Le terme est apparu dans les RADAR techniques de Thoughtworks en 2016 mais c’est en 2019 que les micro-front end commencent à émerger.</p>
<h2 id="thoughtworks--qui-sont-ils-" style="text-align: justify;">Thoughtworks : qui sont-ils ?</h2>
<p style="text-align: justify;">C’est un organisme public qui se concentre sur la mise en place de concept technologique.<br />
Ils mettent à disposition la conception et participe à la livraison de logiciels, d’outils, ils proposent également un service de conseil informatique.</p>
<h2 id="que-sest-il-passé-entre-lapparition-du-terme-et-sa-réelle-émergence-" style="text-align: justify;">Que s’est-il passé entre l’apparition du terme et sa réelle émergence ?</h2>
<p style="text-align: justify;">Thoughtworks a mis à disposition une recherche réalisée dans leurs équipes. Cette recherche porte sur la mise en place des micro-services au niveau de l’UI. Thoughtworks a partagé l’évolution conceptuelle des micro-front end. En Novembre 2016, arrivent les premières idées à propos de ce type d’architecture (des idées mais aussi des POC et des phases d’évaluation).</p>
<p style="text-align: justify;">Les ingénieurs de Thoughtworks pensent qu’il serait intéressant d’appliquer un système de micro-services au niveau de l’UI afin d’éviter les monolithes. Ils mettent en avant le fait que l’approche BFF (back-for-front : couche permettant la communication entre le back-end et le front-end) en serait largement bénéficiaire.</p>
<p style="text-align: justify;">S’ensuit une communication en Mai 2018 (lors de la phase d’essai), celle-ci nous informe que des équipes ont mis en place des structures monolithiques au niveau des services back. Ils font un petit rappel afin d’expliquer l’objectif des micro-front end : obtenir des composants/pages isolés et indépendants les uns des autres et qui appartiennent à différentes équipes.</p>
<p style="text-align: justify;">En Avril 2019 débute la phase d’émergence, à ce stade, Thoughtworks pense que la mise en place des micro-front end représente un bénéfice certain pour les équipes de développement. A partir de ce moment ils commencent à informer et à conseiller sur les implémentations liées aux micro-front end.</p>
<h2 id="et-si-jai-rien-compris--petit-résumé" style="text-align: justify;">“Et si j’ai rien compris ?”: Petit Résumé</h2>
<p style="text-align: justify;">Le processus lié à ce concept, dans un format de type release/actualisation semble venir de la frustration de certaines équipes vis-à-vis des monolithes.</p>
<p style="text-align: justify;">Les “assessments” donne pour définition des structures monolithiques Front : « large and sprawling browser applications that are as difficult to maintain and evolve as the monolithic server-side applications we’ve abandoned »</p>
<p style="text-align: justify;">Soit en français : « Des applications “navigateurs” volumineuses et entremêlées étant aussi difficiles à maintenir et à faire évoluer que des applications back monolithiques déjà abandonnées. »</p>
<h2 id="mise-en-place" style="text-align: justify;">Mise en place</h2>
<h3 id="--la-gouvernance" style="text-align: justify;">&#8211; La Gouvernance</h3>
<p style="text-align: justify;">La gouvernance est un élément indispensable lors de l’initialisation d’un projet micro-front end. La liberté provenant de ce type d’architecture est à double tranchant. Une plus grande liberté permet de réaliser plus facilement un ensemble de tâches mais c’est aussi un moyen de surcharger votre application.</p>
<p style="text-align: justify;">Voici 3 axes de réflexions afin de mieux comprendre la problématique :</p>
<h3 id="--le-premier--déterminer-le-scope" style="text-align: justify;">&#8211; Le premier : déterminer le scope</h3>
<p style="text-align: justify;">Réfléchissez à la taille de vos composants (comme ce qui est fait pour les briques dans un modèle microservice en back-end). Cela permet ainsi de réfléchir à la taille de vos équipes et le nombre de ressources à mobiliser. (Votre budget vous remerciera.)</p>
<h3 id="--le-second--il-en-faut-un-pour-les-gouverner-tous" style="text-align: justify;">&#8211; Le second : il en faut un pour les gouverner tous.</h3>
<p style="text-align: justify;">L’indépendance des composants peut faire perdre de vue l’objectif commun: la réalisation d’une interface graphique pour une application. Cette application a des attentes en termes d’objectifs, de performances, ou encore d’image (marketing etc…).<br />
Il faut, par exemple, veiller à avoir une équipe responsable du partage de la connaissance et de la culture afin de ne pas diviser “pour mieux régner” mais plutôt de “réunir pour mieux réussir”. Il est également important d’imaginer la mise en place de tests d’intégrations globaux au niveau du plus haut parent de la famille des composants.<br />
(Imaginez une application dont chaque composant possède sa propre charte graphique façon sapin de noël..)</p>
<p style="text-align: justify;">Une solution commune dite “Core” se matérialise par une équipe gérant le noyau du site, elle régit les librairies de bases, la création, la gestion des outils (e.g.. Eventbus), la charte graphique etc.<br />
Les composants “enfants” hériteront de tout ce qui aura été prévu et partagé par le noyau applicatif.</p>
<h3 id="--la-troisième--comment-bien-séquiper-pour-la-performance-" style="text-align: justify;">&#8211; La troisième : comment bien s’équiper pour la performance ?</h3>
<p style="text-align: justify;">Il faut distinguer deux aspects lorsque l’on pense à la qualité des MFE : la performance de chacun d’entre eux mais également du site global en termes d’affichage et de rendu. Avoir de multiples composants, c’est accepter d’avoir un possible laps de temps au moment de la création/initialisation de chacun.<br />
Il faut également penser au démarrage et à l’intégration de nouveaux MFE dans l’architecture globale, que ce soit en termes de cohérence, de qualité de code, de sécurité, de chaîne d’intégration et de déploiement.<br />
Pour éviter cela, il faut mettre en relation des experts techniques (architectes, leader, etc.) capables de trouver des solutions performantes et de partager les bonnes pratiques à tous ces différents niveaux.</p>
<p style="text-align: justify;"><b>Point d’attention : le runtime</b><br />
Plus il y a de frameworks, plus il y aura de runtimes et donc plus de risques que le poids de la page soit augmenté et sa performance dégradée.<br />
Il faudra limiter la diversité des frameworks utilisés.</p>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/front-end/micro-front-end//image_2.jpg" alt="image" /></p>
<p style="text-align: justify;">Ce graphique montre la consommation en runtime pour chaque build avec le runtime Svelte. On dénote qu’avec à peine 10 composants on consomme moins qu’un Angular pour ne citer que lui.</p>
<h2 id="que-doit-on-retenir-" style="text-align: justify;">Que doit-on retenir ?</h2>
<p style="text-align: justify;">Pour résumer en un seul mot : “Communiquez !”<br />
L’indépendance apportée par les MFE peut desservir, chaque équipe faisant ses composants de manière “isolée”, si personne ne s’assure de la cohérence globale cela peut rapidement devenir néfaste.<br />
Sans communication et gouvernance, la page finale peut vite se retrouver alourdie (du au fait d’un ensemble de technologies mélangées et de la multiplicité des frameworks utilisés) ou chartée de façon bien différente et donc perdre de la cohérence (notamment via le design).<br />
Tous ces risques peuvent vite amener à regretter les monolithes.</p>
<p style="text-align: justify;"><b>Schéma d’archi<br />
</b></p>
<p style="text-align: justify;">Voici un exemple qui schématise une architecture micro front avec trois MFE. Chaque composant est développé avec une techno différente (Vue, Angular, React) et géré par une équipe spécifique, possédant ses outils de CI/CD, de tests, etc.</p>
<p style="text-align: justify;"><img decoding="async" src="https://ekite.tech/articles/front-end/micro-front-end//image_3.jpg" alt="image" /></p>
<h2 id="framework-technos-et-outils" style="text-align: justify;">Framework, technos et outils</h2>
<p style="text-align: justify;">Une pluralité de frameworks qui vont vous faciliter le développement des micro frontend est disponible : chacun a sa propre philosophie dans la manière d’aborder les concepts liés aux micro frontend.<br />
Parmi les plus connus on peut citer Single-spa, Bit, Qiankun, Open components …</p>
<h2 id="proscons" style="text-align: justify;">Pros/Cons</h2>
<p style="text-align: justify;">De grandes entreprises ont choisi de se lancer dans les micro frontend, comme IKEA sur son magasin en ligne, Spotify avec son application desktop ou encore Leroy Merlin avec son site Web et Kobi.</p>
<p style="text-align: justify;">Pour chacune de ces applications, des bénéfices se sont rapidement fait sentir, par exemple à travers leur vie dans les différentes plateformes, à travers l’expérience de l’utilisateur ou encore sur une meilleure réalisation des développements grâce à des équipes plus réduite mais concentrées sur une seule feature.</p>
<p style="text-align: justify;"><b>Les avantages et inconvénients des MFE sont fortement liés.</b></p>
<p style="text-align: justify;">Le découpage du code</p>
<ul style="text-align: justify;">
<li><b>Pros</b> : plus simple, plus léger, c’est un vrai bonus de lisibilité et de maintenabilité.</li>
<li><b>Cons</b> : même si la compréhension unitaire des composants est plus simple, la complexité globale de l’application peut en revanche être plus floue.</li>
</ul>
<p style="text-align: justify;">La liberté des choix technologiques</p>
<ul style="text-align: justify;">
<li><b>Pros</b> : plus de technologies disponibles implique plus de possibilités.</li>
<li><b>Cons</b> : cela peut induire des problèmes de performances, de compatibilité voire de maintenabilité.</li>
</ul>
<p style="text-align: justify;">L’indépendance et l’autonomie des équipes</p>
<ul style="text-align: justify;">
<li><b>Pros</b> : cet aspect améliore les conditions et la qualité de développement.</li>
<li><b>Cons</b> : la relation inter-équipes ne doit pas être négligée. Le risque étant de s’éloigner de l’objectif principal, d’avoir des demandes de refontes (e.g : ne correspond pas à l’attente des composants consommateurs) et même des migrations d’outils.</li>
</ul>
<p style="text-align: justify;">L’indépendance des livraisons</p>
<ul style="text-align: justify;">
<li><b>Pros</b> : le choix des outils d’intégration et de déploiement continue est possible. Cela permet de livrer uniquement certaines parties de l’application.</li>
<li><b>Cons</b> : mais cela implique une gestion de la qualité, du release management ou software delivery global plus complexe à mettre en place.</li>
</ul>
<p style="text-align: justify;">Il est nécessaire de mettre en place une gouvernance forte pour garantir une cohérence dans les choix pris lors du développement des différents composants. (Objectif : assurer une qualité et maintenabilité globale).</p>
<p style="text-align: justify;">Links : https://www.infoq.com/news/2019/04/real-world-framework-benchmark/</p>
</div>
<p>L’article <a href="https://ekite.info/2022/03/02/micro-front-end/">Micro Front End</a> est apparu en premier sur <a href="https://ekite.info">EKITE</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ekite.info/2022/03/02/micro-front-end/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">997</post-id>	</item>
	</channel>
</rss>
