<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>@Pr0l0g33k</title>
    <link>https://talaria-formation.github.io/</link>
    <atom:link href="https://talaria-formation.github.io//feed.xml" rel="self" type="application/rss+xml" />
    <description>@cccp.education feeds</description>
    <language>fr-fr</language>
    <pubDate>jeu., 26 sept. 2024 09:26:36 +0200</pubDate>
    <lastBuildDate>jeu., 26 sept. 2024 09:26:36 +0200</lastBuildDate>

    <item>
      <title>Installer Pandoc</title>
      <link>https://talaria-formation.github.io//blog/2024/0070_installer_pandoc_post.html</link>
      <pubDate>mar., 30 janv. 2024 00:00:00 +0100</pubDate>
      <guid isPermaLink="false">blog/2024/0070_installer_pandoc_post.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;&lt;em&gt;Temps de lecture : 3 min&lt;/em&gt;&lt;/div&gt;
&lt;p&gt;Pandoc un convertisseur universel de document&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pandoc est un logiciel de traitement de texte open source qui peut être utilisé pour convertir des documents entre différents formats.
Il existe plusieurs façons d&amp;#8217;installer Pandoc.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_installation_à_partir_de_la_page_de_téléchargement&quot;&gt;&lt;strong&gt;Installation à partir de la page de téléchargement&lt;/strong&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour installer Pandoc à partir de la page de téléchargement, procédez comme suit :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Accédez à la page de téléchargement de Pandoc : &lt;a href=&quot;https://pandoc.org/installing.html/&quot;&gt;https://pandoc.org/installing.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Téléchargez l&amp;#8217;installateur de package pour votre système d&amp;#8217;exploitation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exécutez l&amp;#8217;installateur pour installer Pandoc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Installation à partir d&amp;#8217;un fichier zip&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour installer Pandoc à partir d&amp;#8217;un fichier zip, procédez comme suit :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Téléchargez le fichier zip contenant les binaires de Pandoc et la documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Décompressez le fichier zip.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Déplacez les binaires vers un répertoire de votre choix.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Installation à l&amp;#8217;aide de Chocolatey&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour installer Pandoc à l&amp;#8217;aide de Chocolatey, procédez comme suit :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Ouvrez une invite de commande.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exécutez la commande suivante :&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-powershell hljs&quot; data-lang=&quot;powershell&quot;&gt;choco install pandoc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Installation à l&amp;#8217;aide de winget&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour installer Pandoc à l&amp;#8217;aide de winget, procédez comme suit :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Ouvrez une invite de commande.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exécutez la commande suivante :&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-powershell hljs&quot; data-lang=&quot;powershell&quot;&gt;winget install --source winget --exact --id JohnMacFarlane.Pandoc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Recommandations&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Par défaut, Pandoc crée des PDFs à l&amp;#8217;aide de LaTeX.
Il est recommandé d&amp;#8217;installer LaTeX via MiKTeX.
Avec l&amp;#8217;option &lt;code&gt;--pdf-engine&lt;/code&gt;, vous pouvez toutefois spécifier d&amp;#8217;autres programmes pour cette tâche.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Mise en garde&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;utilisation de plusieurs méthodes d&amp;#8217;installation peut entraîner deux installations distinctes de Pandoc.
Il est recommandé de désinstaller correctement Pandoc avant de passer à une méthode d&amp;#8217;installation alternative.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Installation sur linux par WSL&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vérifiez si la version de pandoc dans votre gestionnaire de paquets n&amp;#8217;est pas obsolète.
Pandoc se trouve dans les dépôts de Debian, Ubuntu, Slackware, Arch, Fedora, NixOS, openSUSE, gentoo et Void.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour obtenir la dernière version, nous proposons un paquet binaire pour l&amp;#8217;architecture amd64 sur la page de téléchargement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;exécutable est lié statiquement et n&amp;#8217;a pas de dépendances dynamiques ni de dépendances sur des fichiers de données externes.
Remarque : en raison du lien statique, le binaire pandoc de ce paquet ne peut pas utiliser les filtres lua qui nécessitent des modules lua externes écrits en C.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Un tarball et un installateur deb sont fournis.
Pour installer le deb :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;sudo dpkg -i $DEB&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple au moment de l&amp;#8217;écriture :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;wget https://github.com/jgm/pandoc/releases/download/3.1.11.1/pandoc-3.1.11.1-1-amd64.deb&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;sudo dpkg -i pandoc-3.1.11.1-1-amd64.deb&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;où &lt;code&gt;$DEB&lt;/code&gt; est le chemin vers le deb téléchargé.
Cela installera l&amp;#8217;exécutable &lt;code&gt;pandoc&lt;/code&gt; et la page de manuel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si vous utilisez une distribution basée sur RPM, vous pourrez peut-être installer le deb de notre page de téléchargement à l&amp;#8217;aide d&amp;#8217;alien.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sur n&amp;#8217;importe quelle distribution, vous pouvez installer à partir du tarball dans &lt;code&gt;$DEST&lt;/code&gt; (par exemple, &lt;code&gt;/usr/local/&lt;/code&gt; ou &lt;code&gt;$HOME/.local&lt;/code&gt;) en faisant :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;tar xvzf $TGZ --strip-components 1 -C $DEST&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;où &lt;code&gt;$TGZ&lt;/code&gt; est le chemin vers le tarball zippé téléchargé.
Pour les versions de Pandoc antérieures à 2.0, qui ne fournissent pas de tarball, essayez plutôt :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;ar p $DEB data.tar.gz | tar xvz --strip-components 2 -C $DEST&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous pouvez également installer à partir de la source, en utilisant les instructions ci-dessous sous &lt;code&gt;Compilation à partir de la source&lt;/code&gt;.
Notez que la plupart des distributions ont la plate-forme Haskell dans leurs dépôts de paquets.
Par exemple, sur Debian/Ubuntu, vous pouvez l&amp;#8217;installer avec &lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;apt-get install haskell-platform&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Par défaut, Pandoc crée des PDFs à l&amp;#8217;aide de LaTeX.
Nous vous recommandons d&amp;#8217;installer TeX Live via votre gestionnaire de paquets.
(Sur Debian/Ubuntu, &lt;code&gt;apt-get install texlive&lt;/code&gt;).
Avec l&amp;#8217;option &lt;code&gt;--pdf-engine&lt;/code&gt;, vous pouvez toutefois spécifier d&amp;#8217;autres programmes pour cette tâche.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Mémo Python</title>
      <link>https://talaria-formation.github.io//blog/2023/0066_memo_python_post.html</link>
      <pubDate>dim., 19 nov. 2023 00:00:00 +0100</pubDate>
      <guid isPermaLink="false">blog/2023/0066_memo_python_post.html</guid>
      	<description>
	&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_install_python_on_windows&quot;&gt;Install python on windows&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://ninite.com/pythonx3/&quot;&gt;python on windows&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://python-docs.readthedocs.io/en/latest/starting/install3/win.html&quot; class=&quot;bare&quot;&gt;https://python-docs.readthedocs.io/en/latest/starting/install3/win.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://python-docs.readthedocs.io/en/latest/dev/virtualenvs.html#virtualenvironments-ref&quot; class=&quot;bare&quot;&gt;https://python-docs.readthedocs.io/en/latest/dev/virtualenvs.html#virtualenvironments-ref&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_running_python&quot;&gt;Running python&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Réference :&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;cd mon_projet

python -m venv mon_venv

source mon_venv/bin/activate

# Sur windows
mon_venv\Scripts\activate

deactivate&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_install_requirement&quot;&gt;install requirement&lt;/h3&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_initiation&quot;&gt;initiation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://python.doctor/page-apprendre-programmation-orientee-objet-poo-classes-python-cours-debutants&quot;&gt;python POO&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_design_patterns_du_gof_en_python&quot;&gt;Design Patterns du GoF en Python&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/whikwon/python-patterns/&quot;&gt;implementation 1&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Sean-Bradley/Design-Patterns-In-Python&quot;&gt;implementation 2&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://sbcode.net/python/&quot;&gt;complete book&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les design patterns du GoF sont un ensemble de 23 design patterns qui ont été décrits dans le livre &quot;Design Patterns: Elements of Reusable Object-Oriented Software&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;caption class=&quot;title&quot;&gt;Table 1. Voici une liste des design patterns du GoF&lt;/caption&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 66.6667%;&quot;&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Nom&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Factory Method&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Crée des objets sans spécifier la classe exacte à instancier.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Abstract Factory&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Crée des familles d&amp;#8217;objets liés ou dépendants sans spécifier leur classe concrète.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Builder&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Sépare la construction d&amp;#8217;un objet complexe de sa représentation afin que le même processus de construction puisse créer différentes représentations.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Prototype&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Crée de nouveaux objets en copiant un prototype existant.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Singleton&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Restreint l&amp;#8217;instanciation d&amp;#8217;une classe à un seul objet.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Adapter&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Convertit l&amp;#8217;interface d&amp;#8217;une classe en une autre interface que le client attend.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Bridge&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Découple une abstraction de son implémentation afin que les deux puissent varier indépendamment.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Composite&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Compose des objets dans des structures d&amp;#8217;arborescence pour représenter des hiérarchies de partie-tout.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Decorator&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Attache dynamiquement des responsabilités supplémentaires à un objet.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Facade&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Fournit une interface unifiée à un ensemble d&amp;#8217;interfaces dans un sous-système.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Flyweight&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Réduit le coût de création et d&amp;#8217;utilisation d&amp;#8217;objets légers.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Proxy&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Fournit un substitut ou un espace réservé pour un autre objet afin de contrôler l&amp;#8217;accès à celui-ci.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Chain of Responsibility&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Permet à plus d&amp;#8217;un objet de traiter une demande.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Command&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Encapsule une demande dans un objet, permettant ainsi de paramétrer des clients avec différentes demandes, files d&amp;#8217;attente ou journaux, et de supporter des opérations annulables.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Interpreter&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Donne une représentation de la grammaire d&amp;#8217;une langue et utilise cette représentation pour interpréter des phrases dans cette langue.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Iterator&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Fournit un moyen de parcourir séquentiellement les éléments d&amp;#8217;un objet agrégé sans exposer sa représentation sous-jacente.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Mediator&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Permet de réduire les dépendances complexes entre les objets en les faisant communiquer uniquement via un objet médiateur.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Memento&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Fournit la capacité de restaurer un objet à son état précédent (sans violer l&amp;#8217;encapsulation).&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Observer&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Définit une dépendance un-à-plusieurs entre les objets de sorte que lorsqu&amp;#8217;un objet change d&amp;#8217;état, tous ses dépendants sont notifiés et mis à jour automatiquement.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;State&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Permet à un objet de changer de comportement lorsqu&amp;#8217;il change d&amp;#8217;état interne.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Strategy&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Définit une famille d&amp;#8217;algorithmes, encapsule chacun d&amp;#8217;eux et les rend interchangeables.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Template Method&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Définit le squelette d&amp;#8217;un algorithme dans une méthode, reportant certaines étapes aux sous-classes.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Visitor&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Permet de définir une nouvelle opération à effectuer sur une structure d&amp;#8217;objets sans changer les classes des objets sur lesquels elle opère.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_functional_programming&quot;&gt;Functional programming&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 16.6666%;&quot;&gt;
&lt;col style=&quot;width: 27.7777%;&quot;&gt;
&lt;col style=&quot;width: 55.5557%;&quot;&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Bibliothèque&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;URL&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Description&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;PyMonad&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://github.com/jasondelaat/pymonad&quot; class=&quot;bare&quot;&gt;https://github.com/jasondelaat/pymonad&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;PyMonad est une implémentation de structures de données monadiques en Python basée sur des langages de programmation tels que Haskell et F# avec des implémentations pour les types de monades les plus couramment utilisés en programmation fonctionnelle. &lt;a href=&quot;https://www.miguelfarrajota.com/2021/06/monads-in-python-with-pymonad/&quot;&gt;article&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;PyFunctional&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://github.com/EntilZha/PyFunctional/&quot; class=&quot;bare&quot;&gt;https://github.com/EntilZha/PyFunctional/&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;PyFunctional est une bibliothèque Python pour la programmation fonctionnelle qui fournit des outils pour travailler avec des fonctions pures et des itérables.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Toolz&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://toolz.readthedocs.io/en/latest/&quot; class=&quot;bare&quot;&gt;https://toolz.readthedocs.io/en/latest/&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Toolz est une bibliothèque Python pour la programmation fonctionnelle qui fournit des outils pour travailler avec des fonctions pures et des itérables.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Fn.py&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://github.com/kachayev/fn.py&quot; class=&quot;bare&quot;&gt;https://github.com/kachayev/fn.py&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Fn.py est une bibliothèque Python pour la programmation fonctionnelle qui fournit des outils pour travailler avec des fonctions pures et des itérables.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Coconut&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://coconut-lang.org/&quot; class=&quot;bare&quot;&gt;https://coconut-lang.org/&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Coconut ajoute plusieurs fonctionnalités à Python pour la programmation fonctionnelle, y compris le pattern matching. &lt;a href=&quot;https://stackoverflow.com/questions/11909681/are-there-pattern-matching-functions-in-python-like-this&quot;&gt;conversation sof&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_side_effects&quot;&gt;side effects&lt;/h3&gt;

&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_loops&quot;&gt;loops&lt;/h3&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-python hljs&quot; data-lang=&quot;python&quot;&gt;# impérative way
result = []
for i in inputs:
    x = f(g(i))
    result.append(x)

# idiomatic way
result = map(comp(f,g), inputs)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Mémo Typescript</title>
      <link>https://talaria-formation.github.io//blog/2023/0063_memo_ts_post.html</link>
      <pubDate>sam., 19 août 2023 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">blog/2023/0063_memo_ts_post.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;github repository: &lt;a href=&quot;https://github.com/cccp-education/ts-codebase&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ts-codebase&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#ts_types&quot;&gt;Les types en typescript&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#fonctions&quot;&gt;Fonctions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#data_struct&quot;&gt;Structure de données&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#enums_tuples&quot;&gt;Enums et tuples&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#void_never&quot;&gt;Void et Never&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#class_interface&quot;&gt;Classes et interfaces&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#tsconfig&quot;&gt;Le fichier tsconfig.json&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#modules&quot;&gt;Modules&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#promesses&quot;&gt;Promesses&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#async-await&quot;&gt;async/await&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#generiques&quot;&gt;Génériques&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;index.html&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;fr&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    Intro typescript
    &amp;lt;script src=&quot;01_types.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;02_data_structure.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;03_enums_tuples.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ts_types&quot;&gt;Les types en typescript&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;01_types.ts&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-typescript hljs&quot; data-lang=&quot;typescript&quot;&gt;/**
 * Les types en typescript
 */

//quand le type n&apos;est pas defini des le debut,
// alors il est réassignable
// c&apos;est le type Any qui est attribué par défaut
let my_var;
my_var = &quot;username&quot;;
console.assert(my_var === &quot;username&quot;);
my_var = 11;
console.assert(my_var === 11);
my_var = true;
console.assert(my_var === true);

let age = 1;
console.assert(age === 1);
age = 2;
// age=&quot;trois&quot; c&apos;est impossible
// car l&apos;inference de type a attribué le type number
console.assert(age === 2);

// Déclaration explicite de type
let pi: Number = 3.14;
console.assert(typeof pi === &quot;number&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;fonctions&quot;&gt;Fonctions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les fonctions sont des blocs de code réutilisables.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple de cote :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-typescript hljs&quot; data-lang=&quot;typescript&quot;&gt;const add = (a: number, b: number): number =&amp;gt; a + b;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;data_struct&quot;&gt;Structure de données&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;02_data_structure.ts&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-typescript hljs&quot; data-lang=&quot;typescript&quot;&gt;/***
 * Structure de données:
 * Avec le type any on peut changer
 * le type de la variable à tout instruction
 * Lorsque l&apos;on fixe le type
 * alors il n&apos;est plus possible de le changer
 * lors d&apos;une assignation
 */

// Arrays
let buddies: any[] = [
    &quot;@CCCP.education&quot;,
    &quot;imrandeh&quot;,
    &quot;issoudeh&quot;,
    &quot;soumi92&quot;
]

console.assert(buddies[0] === &quot;@CCCP.education&quot;);
console.assert(buddies[1] === &quot;imrandeh&quot;);
console.assert(buddies[2] === &quot;issoudeh&quot;);
console.assert(buddies[3] === &quot;soumi92&quot;);
// Déclaré en type any, l&apos;inference de type
// a bien réaligné en type string
console.assert(typeof buddies[0] === &quot;string&quot;);
console.assert(typeof buddies[1] === &quot;string&quot;);
console.assert(typeof buddies[2] === &quot;string&quot;);
console.assert(typeof buddies[3] === &quot;string&quot;);



let writers: (String | String | String | Number)[][] = [
    [&quot;Chrétien&quot;, &quot;de Troyes&quot;, &quot;fr&quot;, 12],
    [&quot;François&quot;, &quot;Rabelais&quot;, &quot;fr&quot;, 16],
    [&quot;René&quot;, &quot;Descartes&quot;, &quot;fr&quot;, 17],
    [&quot;Jean-Jacques&quot;, &quot;Rousseau&quot;, &quot;fr&quot;, 18],
    [&quot;Georg&quot;, &quot;Hegel&quot;, &quot;de&quot;, 19],
    [&quot;Karl&quot;, &quot;Marx&quot;, &quot;de&quot;, 19],
    [&quot;Friedrich&quot;, &quot;Engels&quot;, &quot;de&quot;, 19],
    [&quot;Victor&quot;, &quot;Hugo&quot;, &quot;fr&quot;, 19],
    [&quot;Paul&quot;, &quot;Verlaine&quot;, &quot;fr&quot;, 19],
    [&quot;Arthur&quot;, &quot;Rimbaud&quot;, &quot;fr&quot;, 19],
    [&quot;Gérard&quot;, &quot;de Nerval&quot;, &quot;fr&quot;, 19],
    [&quot;Georg&quot;, &quot;Lukacs&quot;, &quot;hu&quot;, 20],
    [&quot;Franz&quot;, &quot;Kafka&quot;, &quot;hu&quot;, 20],
    [&quot;Antonio&quot;, &quot;Gramsci&quot;, &quot;it&quot;, 20],
    [&quot;Domenico&quot;,&quot;Losurdo&quot;,&quot;it&quot;,20],
];

// console.table(writers);


// Objects
let author: {
    first_name: String,
    last_name: String,
    lang: String,
    century: Number
} = {
    // slice(-1) renvoie le dernier élèment
    first_name: writers.slice(-1)[0][0] as String,
    last_name: writers.slice(-1)[0][1] as String,
    lang: writers.slice(-1)[0][2] as String,
    century: writers.slice(-1)[0][3] as Number,
}


// assertion sur la valeur en accés par encapsulation(dot)
console.assert(author.first_name === &quot;Antonio&quot;)
console.assert(author.last_name === &quot;Gramsci&quot;)
console.assert(author.lang === &quot;it&quot;)
console.assert(author.century === 20);

// assertion sur le type en accès par index
console.assert(typeof author[&quot;first_name&quot;] === &quot;string&quot;)
console.assert(typeof author[&quot;last_name&quot;] === &quot;string&quot;)
console.assert(typeof author[&quot;lang&quot;] === &quot;string&quot;)
console.assert(typeof author[&quot;century&quot;] === &quot;number&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;enums_tuples&quot;&gt;Enums et tuples&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;03_enums_tuples.ts&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-typescript hljs&quot; data-lang=&quot;typescript&quot;&gt;/**
 * Enums et Tuples
 *
 * Enum: il existe les enums numérique
 * et les enums chaine de caracteres.
 *
 * Tuple: similaire aux arrays mais ne peut
 * contenir qu&apos;une valeur de type spécifié.
 *
 */

//Enum numérique
// l&apos;index par de debut défaut est 0
// ici on le place a 1
enum Week {
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
    Sunday = 7,
};

console.assert(Week.Monday == 1);
console.assert(Week.Tuesday == 2);
console.assert(Week.Wednesday == 3);
console.assert(Week.Thursday == 4);
console.assert(Week.Friday == 5);
console.assert(Week.Saturday == 6);
console.assert(Week.Sunday == 7);

console.assert(Week[1] === &quot;Monday&quot;);
console.assert(Week[2] === &quot;Tuesday&quot;);
console.assert(Week[3] === &quot;Wednesday&quot;);
console.assert(Week[4] === &quot;Thursday&quot;);
console.assert(Week[5] === &quot;Friday&quot;);
console.assert(Week[6] === &quot;Saturday&quot;);
console.assert(Week[7] === &quot;Sunday&quot;);

let motd_arr_fr: String[] = [
    &quot;Associé à la Lune&quot;,
    &quot;Du dieu Tiw, associé à Mars&quot;,
    &quot;Du dieu germanique Odin&quot;,
    &quot;Du dieu germanique du tonnerre Thor&quot;,
    &quot;De la déesse germanique Frigga associée à Vénus&quot;,
    &quot;Associé à Saturne&quot;,
    &quot;Associé au Soleil&quot;,
];

let motd_arr_en: String[] = [
    &quot;associated with the Moon&quot;,
    &quot;from the god Tiw, associated with Mars&quot;,
    &quot;from Germanic god Odin&quot;,
    &quot;from Germanic god of thunder Thor&quot;,
    &quot;from Germanic goddess Frigga associated with Venus&quot;,
    &quot;associated with Saturn&quot;,
    &quot;associated with the Sun&quot;,
];

// Un tuple (triple)
let monday_triple_fr: [
    Number,
    String,
    String
] = [
        Week.Monday,
        Week[Week.Monday],
        motd_arr_fr[0],
    ];


console.assert(monday_triple_fr[0] === 1);
console.assert(monday_triple_fr[1] === &quot;Monday&quot;);
console.assert(monday_triple_fr[2] === &quot;Associé à la Lune&quot;);


let monday_triple_en: [
    Number,
    String,
    String
] = [
        Week.Monday,
        Week[Week.Monday],
        motd_arr_en[0],
    ];

console.assert(monday_triple_en[0] === 1);
console.assert(monday_triple_en[1] === &quot;Monday&quot;);
console.assert(monday_triple_en[2] === &quot;associated with the Moon&quot;);


// On se fait un type pour ajouter le nom de la langue
type Meaning_of_the_day = {
    lang: String,
    meaning: (Week | String)[][],
};

//fonction d&apos;affichage du type Meaning_of_the_day
const display_motd = (motd: Meaning_of_the_day) =&amp;gt; {
    motd.meaning.forEach(day =&amp;gt;
        console.table(`${Week[day[0] as Week]}: ${day[1]}.(${motd.lang})`)
    )
};

//fonction d&apos;assertion sur le type Meaning_of_the_day
// afin de verifier la concordance du contenu avec
// motd_arr_#lang#
const test_motd = (
    motd: Meaning_of_the_day,
    motd_arr: String[]
) =&amp;gt; {
    console.assert(motd.lang.length === 2)
    for (const [i, value] of motd.meaning.entries()) {
        console.assert(value[1] === motd_arr[i]);
    }
};


let motd_fr: Meaning_of_the_day = {
    lang: &quot;fr&quot;,
    meaning: [
        [Week.Monday, motd_arr_fr[0]],
        [Week.Tuesday, motd_arr_fr[1]],
        [Week.Wednesday, motd_arr_fr[2]],
        [Week.Thursday, motd_arr_fr[3]],
        [Week.Friday, motd_arr_fr[4]],
        [Week.Saturday, motd_arr_fr[5]],
        [Week.Sunday, motd_arr_fr[6]],
    ],
}

console.log(&quot;---------&quot;);
console.log(&quot;display_motd(motd_fr):&quot;);
display_motd(motd_fr);
test_motd(motd_fr, motd_arr_fr)


let motd_en: Meaning_of_the_day = {
    lang: &quot;en&quot;,
    meaning: [
        [Week.Monday, motd_arr_en[0]],
        [Week.Tuesday, motd_arr_en[1]],
        [Week.Wednesday, motd_arr_en[2]],
        [Week.Thursday, motd_arr_en[3]],
        [Week.Friday, motd_arr_en[4]],
        [Week.Saturday, motd_arr_en[5]],
        [Week.Sunday, motd_arr_en[6]],
    ],
}

console.log(&quot;---------&quot;);
console.log(&quot;display_motd(motd_en):&quot;);
display_motd(motd_en);
console.log(&quot;---------&quot;);
test_motd(motd_en, motd_arr_en);

// Un tuple (triple) utilisant le type
// Meaning_of_the_day pour peupler le meaning
let motd_triple: [
    Number,
    String,
    String
] = [
        Week.Monday,
        Week[Week.Monday],
        motd_fr.meaning[0][1] as String
    ];

console.assert(motd_triple[0] === 1);
console.assert(motd_triple[1] === &quot;Monday&quot;);
console.assert(motd_triple[2] === &quot;Associé à la Lune&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;void_never&quot;&gt;Void et Never&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;04_void_never_types.ts&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-typescript hljs&quot; data-lang=&quot;typescript&quot;&gt;// Le type void est l&apos;opposé du type any
// c&apos;est l&apos;absence de type.
function verify_writers_length(): void {
    console.assert(writers.length &amp;gt; 0);
}

verify_writers_length();

const verify_writers_length_arrow = (): void =&amp;gt;
    console.assert(writers.length &amp;gt; 0);

verify_writers_length_arrow();

//Type of et never
let value = 30;
console.assert(typeof value === &quot;number&quot;);

//never: qqchs qui n&apos;arrive jamais
function foo(x: String | Number): Boolean {
    if (typeof x === &quot;string&quot;) {
        return true;
    } else if (typeof x === &quot;number&quot;) {
        return false;
    }
    return fail(&quot;Error!&quot;)
}

function fail(message: String): never {
    throw new Error(message as string);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;class_interface&quot;&gt;Classes et interfaces&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;04_void_never_types.ts&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-typescript hljs&quot; data-lang=&quot;typescript&quot;&gt;/**
 * Les classes:
 * members,
 * visibility,
 * nommage,
 * accesseurs
 * scope identifier: static,private,protected
 *
 * convention de nommage :
 * Les membres private sont préfixés avec un _ *
 */

class Member {
    username: String = &quot;&quot;;
    email: String = &quot;&quot;;
    private _password: String = &quot;&quot;;
    readonly signup_date: Date = new Date(Date.now());

    constructor(username: String, email: String) {
        this.username = username;
        this.email = email;
    }

    get password(): String {
        return this._password;
    }

    set password(new_password: String) {
        this._password = new_password;
    }

    /**
     * Une fonction static qui initilise un member,
     * à partir d&apos;un author
     */
    static fromAuthor(author: {
        first_name: String,
        last_name: String,
        lang: String,
        century: Number
    }): Member {
        return new Member(
            `${author.first_name}.${author.last_name}`,
            `${author.first_name}.${author.last_name}@acme.com`,
        );
    }
};


let domenico = Member.fromAuthor(author);
domenico.password = &quot;test&quot;;

console.assert(domenico.email === &quot;Domenico.Losurdo@acme.com&quot;);
console.assert(domenico.password === &quot;test&quot;);


// Héritage
enum Forms {
    Undefined = 0,
    Polygones = 1,
    Circle = 2,
    Straight = 3,
    Segment = 4,
};

class Form {
    type: Forms = Forms.Undefined;
};

class Rectangle extends Form {
    h: Number = 0;
    w: Number = 0;
};

class Square extends Rectangle {
    side: Number = 0;
};


/**
 * Interface donne un contrat à un type.
 * Les interfaces permettent de définir la structure d&apos;un objet.
 */

interface IPerson {
    username: String;
    email: String;
    readonly signup_date: Date;
}

const user1: IPerson = {
    username: Member.fromAuthor(author)[&quot;username&quot;],
    email: Member.fromAuthor(author)[&quot;email&quot;],
    signup_date: Member.fromAuthor(author)[&quot;signup_date&quot;],
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;tsconfig&quot;&gt;Le fichier tsconfig.json&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;tsconfig.json&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-json hljs&quot; data-lang=&quot;json&quot;&gt;{
  /* Visit https://aka.ms/tsconfig to read more about this file */
  &quot;compileOnSave&quot;: true,

  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;es2016&quot;,
    &quot;module&quot;: &quot;CommonJS&quot;,
    &quot;noEmitOnError&quot;: true,
    &quot;strict&quot;: true,
    &quot;noImplicitAny&quot;: true,
    &quot;esModuleInterop&quot;: true
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;modules&quot;&gt;Modules&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les modules permettent d&amp;#8217;organiser le code en plusieurs fichiers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple de cote :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-typescript hljs&quot; data-lang=&quot;typescript&quot;&gt;// Dans un fichier math.ts
export const add = (a: number, b: number): number =&amp;gt; a + b;

// Dans un autre fichier
import { add } from &apos;./math&apos;;
let result = add(2, 3);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;promesses&quot;&gt;Promesses&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les promesses sont utilisées pour effectuer des opérations asynchrones.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple de cote :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-typescript hljs&quot; data-lang=&quot;typescript&quot;&gt;const promise = new Promise&amp;lt;string&amp;gt;((resolve) =&amp;gt; {
    // Code asynchrone ici
    resolve(&quot;Succès&quot;);
});

promise.then((result) =&amp;gt; {
    console.log(result);
});&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;async-await&quot;&gt;async/await&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;async/await simplifie la gestion des promesses.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple de cote :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-typescript hljs&quot; data-lang=&quot;typescript&quot;&gt;const fetchData = async (): Promise&amp;lt;void&amp;gt; =&amp;gt; {
    const result = await someAsyncFunction();
    console.log(result);
};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_ts&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro typescript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;generiques&quot;&gt;Génériques&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les génériques permettent de créer des composants réutilisables avec des types dynamiques.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple de cote :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-typescript hljs&quot; data-lang=&quot;typescript&quot;&gt;const identity = &amp;lt;T&amp;gt;(arg: T): T =&amp;gt; arg;

const output = identity&amp;lt;string&amp;gt;(&quot;hello&quot;);
console.log(output);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Mémo CSS</title>
      <link>https://talaria-formation.github.io//blog/2023/0062_memo_css_post.html</link>
      <pubDate>lun., 14 août 2023 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">blog/2023/0062_memo_css_post.html</guid>
      	<description>
	&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;toc&quot;&gt;Table des matieres&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#good_links&quot;&gt;Bon liens&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#repo&quot;&gt;Répository et code sample&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;good_links&quot;&gt;Bon liens&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;Table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;repo&quot;&gt;Répository et code sample&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;github repository: &lt;a href=&quot;https://github.com/cccp-education/css-codebase&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;css-codebase&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#début_intro&quot;&gt;Intro &amp;amp; Mise en place&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#début_texts&quot;&gt;Les textes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#début_background&quot;&gt;Background&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#début_boxes&quot;&gt;Les boites (boxes)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#début_flexbox&quot;&gt;Flexbox&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#début_grid&quot;&gt;Grid&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#début_abs_pos&quot;&gt;Position absolute&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#début_responsive&quot;&gt;Le responsive&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#début_conclusion&quot;&gt;Débug &amp;amp; Conclusion&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;Table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;début_intro&quot;&gt;Intro &amp;amp; Mise en place&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Intro basé sur cette vidéo:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/iSWjmVcfQGg?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;github repository: &lt;a href=&quot;https://github.com/cccp-education/css-codebase/début_css/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;début css&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;memo source:&lt;br&gt;
index.html&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;fr&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Cours CSS&amp;lt;/title&amp;gt;

    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;Les bases de CSS&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;main&amp;gt;
      &amp;lt;div class=&quot;flexbox&quot;&amp;gt;
        &amp;lt;h2&amp;gt;Flexbox&amp;lt;/h2&amp;gt;
        &amp;lt;ul&amp;gt;
          &amp;lt;li&amp;gt;boite 1&amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;boite 2&amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;boite 3&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div class=&quot;grid&quot;&amp;gt;
        &amp;lt;h2&amp;gt;Grid&amp;lt;/h2&amp;gt;
        &amp;lt;div class=&quot;grid-container&quot;&amp;gt;
          &amp;lt;img src=&quot;./assets/img/css-logo.png&quot; alt=&quot;logo css&quot; /&amp;gt;

          &amp;lt;form action=&quot;&quot;&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;firstname&quot; placeholder=&quot;Prénom&quot; /&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;surname&quot; placeholder=&quot;Nom&quot; /&amp;gt;
            &amp;lt;textarea
              cols=&quot;30&quot;
              rows=&quot;10&quot;
              placeholder=&quot;Ici votre message&quot;
            &amp;gt;&amp;lt;/textarea&amp;gt;
            &amp;lt;input type=&quot;submit&quot; value=&quot;Valider&quot; id=&quot;btn-submit&quot; /&amp;gt;
          &amp;lt;/form&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div class=&quot;absolute&quot;&amp;gt;
        &amp;lt;h2&amp;gt;Absolute&amp;lt;/h2&amp;gt;
        &amp;lt;span id=&quot;circle1&quot;&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span id=&quot;circle2&quot;&amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/main&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Relier le fichier style.css à la page html:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;/head&amp;gt;
  &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&amp;gt;
&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;début_texts&quot;&gt;Les textes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-css hljs&quot; data-lang=&quot;css&quot;&gt;/* import remote de font sur l&apos;ensemble de la feuille*/
@import url(&quot;https://fonts.googleapis.com/css2?family=Oswald:wght@500&amp;amp;display=swap&quot;);

/* import local de font */
@font-face {
  font-family: &quot;DMSerif&quot;;
  src: url(./assets/fonts/DMSerifDisplay-Regular.ttf);
}

/*
body est le parent de toutes les balises,
qu&apos;il contient, donc je le déclare avant,
pour la logique de précédence de parent
*/
body {
  /* si DMSerif n&apos;est pas trouvé alors il se rabat sur Verdana*/
  font-family: &quot;DMSerif&quot;, Verdana;
}

/* va styliser toutes les balises h1,
celles de body sont surchargés,
par la déclaration présente */
h1 {
  text-transform: uppercase;
  /* espacement entre les lettres en pixel*/
  letter-spacing: 3px;
  /* alignement du texte*/
  text-align: center;
  /* Les tailles de polices doivent être en REM  (rem = root em).
  Le REM se base pas sur l&apos;élément parent pour obtenir sa taille mais sur l&apos;élément racine. Ainsi 1rem prendra sa valeur de la font-size de votre document (body ou html).*/
  font-size: 2.5rem;
  /* ombrage du texte */
  text-shadow:
  3px /* offset-x */
  3px /* offset-y */
  8px /* blur-radius */
  #00000042/* color */;
  /* couleur du texte */
  color: #ab0ef4;
  /*attibuer les polices(font): liste, ordonnée par priorité, de polices à utiliser pour mettre en forme le texte de l&apos;élément ciblé.*/
  font-family: &quot;Oswald&quot;, sans-serif;
  /* surligner le text*/
  text-decoration: underline;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;début_background&quot;&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-css hljs&quot; data-lang=&quot;css&quot;&gt;@import url(&quot;https://fonts.googleapis.com/css2?family=Oswald:wght@500&amp;amp;display=swap&quot;);

@font-face {
  font-family: &quot;DMSerif&quot;;
  src: url(./assets/fonts/DMSerifDisplay-Regular.ttf);
}

body {
  font-family: &quot;DMSerif&quot;, Verdana;
  /* image comme background*/
  background: url(./assets/img/bg.jpg) center/cover;
  /* 100VH = 100% de la taille de l&apos;écran (viewport height)
  min afin de ne pas bloquer la possibilité d&apos;avoir un plus grand */
  min-height: 100vh;
}

h1 {
  text-transform: uppercase;
  letter-spacing: 3px;
  text-align: center;
  font-size: 2.5rem;
  text-shadow: 3px 3px 8px #00000042;
  color: #ab0ef4;
  font-family: &quot;Oswald&quot;, sans-serif;
  text-decoration: underline;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;début_boxes&quot;&gt;Les boites (boxes)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-css hljs&quot; data-lang=&quot;css&quot;&gt;@import url(&quot;https://fonts.googleapis.com/css2?family=Oswald:wght@500&amp;amp;display=swap&quot;);

@font-face {
  font-family: &quot;DMSerif&quot;;
  src: url(./assets/fonts/DMSerifDisplay-Regular.ttf);
}

/* *: létoile donne du style a tous les éléments.
Ensuite remettre un à un les parametres par defaut afin d&apos;eviter les stylisation inattendu.*/
* {
  /* surcharge de base tous les elements à padding 0*/
  margin: 0;
  /* surcharge de base tous les elements à padding 0*/
  padding: 0;
}

body {
  font-family: &quot;DMSerif&quot;, Verdana;
  /* image comme background*/
  background: url(./assets/img/bg.jpg) center/cover;
  min-height: 100vh;
}

h1 {
  text-transform: uppercase;
  letter-spacing: 3px;
  text-align: center;
  font-size: 2.5rem;
  text-shadow: 3px 3px 8px #00000042;
  color: #ab0ef4;
  font-family: &quot;Oswald&quot;, sans-serif;
  text-decoration: underline;
}

main {
  background: rgba(245, 245, 245, 0.9);
  min-height: 500px;
  /* quelque soit la taille de l&apos;écran,
  la boite fait toujours 90% de la taille de la page,
  les 10% restant sont une marge à droite,
  pour avoir 5% de chaque coté on ajoute une margin, tel que [0, auto]*/
  width: 90%;
  /* haut bas prend 0, et  gauche droite prend auto(center cad meme de chaque cotés)*/
  margin: 0 auto;
  /* on ajoute des bords a notre boite*/
  border: 2px solid rgb(0, 140, 255);
  /* on arrondis les coins de la boite*/
  border-radius: 20px 20px 0 0;
  /* ombrage sur la boite*/
  box-shadow: 0px 0px 20px 4px #81cfc6;
  /* marge interrieure de la boite sur tous les cotés*/
  padding: 15px;
}

h2 {
  /* afin de recuprer le comportement par defaut qui a ete surchargé par l&apos;operateur étoile*/
  margin: 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;fr&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Cours CSS&amp;lt;/title&amp;gt;

    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;Les bases de CSS&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;main&amp;gt;
      &amp;lt;div class=&quot;flexbox&quot;&amp;gt;
        &amp;lt;h2&amp;gt;Flexbox&amp;lt;/h2&amp;gt;
        &amp;lt;ul&amp;gt;
          &amp;lt;li&amp;gt;boite 1&amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;boite 2&amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;boite 3&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/main&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;début_flexbox&quot;&gt;Flexbox&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-css hljs&quot; data-lang=&quot;css&quot;&gt;@import url(&quot;https://fonts.googleapis.com/css2?family=Oswald:wght@500&amp;amp;display=swap&quot;);

@font-face {
  font-family: &quot;DMSerif&quot;;
  src: url(./assets/fonts/DMSerifDisplay-Regular.ttf);
}

body {
  font-family: &quot;DMSerif&quot;, Verdana;
  background: url(./assets/img/bg.jpg) center/cover;
  min-height: 100vh;
}

h1 {
  text-transform: uppercase;
  letter-spacing: 3px;
  text-align: center;
  font-size: 2.5rem;
  text-shadow: 3px 3px 8px #00000042;
  color: #ab0ef4;
  font-family: &quot;Oswald&quot;, sans-serif;
  text-decoration: underline;
}

main {
  background: rgba(245, 245, 245, 0.9);
  min-height: 500px;
  width: 90%;
  margin: 0 auto;
  border: 2px solid rgb(0, 140, 255);
  border-radius: 20px 20px 0 0;
  box-shadow: 0px 0px 20px 4px #81cfc6;
  padding: 15px;
}

h2 {
  margin: 0;
}

/* le point permet d&apos;acceder à la classe d&apos;un composant*/
.flexbox {
  border: 2px solid skyblue;
  border-radius: 10px;
  padding: 10px;
  margin-top: 20px;
  min-height: 150px;
}

/* FLEXBOX */
/* Sert à répartir équitablement des éléments sur la page */
.flexbox ul {
  padding: 0;
  /* aligne les éléments enfants de ul(les li)*/
  display: flex;
  /* reparti convenablement(équitablement les li sur la page) */
  justify-content: space-around;
}
/* ce style concerne les li de la classe,
flexbox des balises qui y font referencent*/
.flexbox li {
  /* suprime les boules des éléments de la list li*/
  list-style: none;
  height: 160px;
  width: 160px;
  margin: 10px;
  background: turquoise;
  /* Centrer un unique élément verticalement et horizontalement */
  display: flex;
  justify-content: center;
  align-items: center;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;fr&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Cours CSS&amp;lt;/title&amp;gt;

    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;Les bases de CSS&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;main&amp;gt;
      &amp;lt;div class=&quot;flexbox&quot;&amp;gt;
        &amp;lt;h2&amp;gt;Flexbox&amp;lt;/h2&amp;gt;
        &amp;lt;ul&amp;gt;
          &amp;lt;li&amp;gt;boite 1&amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;boite 2&amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;boite 3&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/main&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;début_grid&quot;&gt;Grid&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour répartir des éléments de maniere un peu plus complexe qu&amp;#8217;avec les flexbox, avec un systeme de grille entre autres.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-css hljs&quot; data-lang=&quot;css&quot;&gt;@import url(&quot;https://fonts.googleapis.com/css2?family=Oswald:wght@500&amp;amp;display=swap&quot;);

@font-face {
  font-family: &quot;DMSerif&quot;;
  src: url(./assets/fonts/DMSerifDisplay-Regular.ttf);
}

body {
  font-family: &quot;DMSerif&quot;, Verdana;
  background: url(./assets/img/bg.jpg) center/cover;
  min-height: 100vh;
}

h1 {
  text-transform: uppercase;
  letter-spacing: 3px;
  text-align: center;
  font-size: 2.5rem;
  text-shadow: 3px 3px 8px #00000042;
  color: #ab0ef4;
  font-family: &quot;Oswald&quot;, sans-serif;
  text-decoration: underline;
}

main {
  background: rgba(245, 245, 245, 0.9);
  min-height: 500px;
  width: 90%;
  margin: 0 auto;
  border: 2px solid rgb(0, 140, 255);
  border-radius: 20px 20px 0 0;
  box-shadow: 0px 0px 20px 4px #81cfc6;
  padding: 15px;
}

h2 {
  margin: 0;
}

.flexbox,
.grid {
  border: 2px solid skyblue;
  border-radius: 10px;
  padding: 10px;
  margin-top: 20px;
  min-height: 150px;
}

.flexbox ul {
  padding: 0;
  display: flex;
  justify-content: space-around;
}

.flexbox li {
  list-style: none;
  height: 160px;
  width: 160px;
  margin: 10px;
  background: turquoise;
  display: flex;
  justify-content: center;
  align-items: center;
}

/* GRID */
.grid-container {
  display: grid;
  /* séparatuion de la grille en deux(à ses deux enfants),
  avec à gauche 30% pour l&apos;image
  et à droite 70% pour le formulaire*/
  grid-template-columns: 30% 70%;
}

/* sizing de l&apos;image css-logo
contenu dans la classe grid
qui est dans le parent grid-container*/
.grid img {
  /* l&apos;image remplt 80% de part de grille*/
  width: 80%;
  margin: 20px auto;
  display: block;
}

form {
  display: grid;
  /* deux colonnes de chacune 1 fraction*/
  grid-template-columns: 1fr 1fr;
  /* trois rangés de chacune 1 fraction*/
    grid-template-rows: 1fr 1fr 1fr;
    /* structuration sous forme de template
    de notre repartition des composants
    enfants de la forme*/
  grid-template-areas:
    &quot;i1 i2&quot;/* i1: input1, i2:input2*/
    &quot;ta ta&quot;/*ta: text area */
    &quot;vi bt&quot;/*vi:, bt: bouton */;
}

/* on donne du style sur deux éléments
en meme temps en les listant
avant les parentheses*/
input,
textarea {
  margin: 5px;
  border: 1px solid darkblue;
  padding: 10px;
  font-size: 1.1rem;
  font-family: &quot;DMSerif&quot;;
  border-radius: 5px;
}

/* donner du style uniquement la textearea*/
textarea {
  /* renseigner le nommage pour le grid template area*/
  grid-area: ta;
  height: 40px;
  /* empeche le cassage du style de la page
  en empechant le resizing de la textarea
  du formulaire*/
  resize: none;
}
/* pour pointer un id d&apos;élément html
on utilise la notation préfixe # */
#btn-submit {
  /* renseigner le nommage*/
  grid-area: bt;
  /* change le le symbole de curseur
  souris quand il survole sur le bouton*/
  cursor: pointer;
  background: cyan;
  transition: 0.2s;
}

/* au survole(hover) de la souris
le bouton change de comportement*/
#btn-submit:hover {
  background: darkblue;
  /* couleur de text du bouton devient blanc*/
  color: white;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;fr&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Cours CSS&amp;lt;/title&amp;gt;

    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
        &amp;lt;h1&amp;gt;Les bases de CSS&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;main&amp;gt;
        &amp;lt;div class=&quot;flexbox&quot;&amp;gt;
            &amp;lt;h2&amp;gt;Flexbox&amp;lt;/h2&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li&amp;gt;boite 1&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;boite 2&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;boite 3&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;grid&quot;&amp;gt;
            &amp;lt;h2&amp;gt;Grid&amp;lt;/h2&amp;gt;
            &amp;lt;div class=&quot;grid-container&quot;&amp;gt;
                &amp;lt;img src=&quot;./assets/img/css-logo.png&quot; alt=&quot;logo css&quot; /&amp;gt;

                &amp;lt;form action=&quot;&quot;&amp;gt;
                    &amp;lt;input type=&quot;text&quot; id=&quot;firstname&quot; placeholder=&quot;Prénom&quot; /&amp;gt;
                    &amp;lt;input type=&quot;text&quot; id=&quot;surname&quot; placeholder=&quot;Nom&quot; /&amp;gt;
                    &amp;lt;textarea cols=&quot;30&quot; rows=&quot;10&quot; placeholder=&quot;Ici votre message&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
                    &amp;lt;input type=&quot;submit&quot; value=&quot;Valider&quot; id=&quot;btn-submit&quot; /&amp;gt;
                &amp;lt;/form&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;début_abs_pos&quot;&gt;Position absolute&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-css hljs&quot; data-lang=&quot;css&quot;&gt;@import url(&quot;https://fonts.googleapis.com/css2?family=Oswald:wght@500&amp;amp;display=swap&quot;);

@font-face {
  font-family: &quot;DMSerif&quot;;
  src: url(./assets/fonts/DMSerifDisplay-Regular.ttf);
}

body {
  font-family: &quot;DMSerif&quot;, Verdana;
  background: url(./assets/img/bg.jpg) center/cover;
  min-height: 100vh;
}

h1 {
  text-transform: uppercase;
  letter-spacing: 3px;
  text-align: center;
  font-size: 2.5rem;
  text-shadow: 3px 3px 8px #00000042;
  color: #ab0ef4;
  font-family: &quot;Oswald&quot;, sans-serif;
  text-decoration: underline;
}

main {
  background: rgba(245, 245, 245, 0.9);
  min-height: 500px;
  width: 90%;
  margin: 0 auto;
  border: 2px solid rgb(0, 140, 255);
  border-radius: 20px 20px 0 0;
  box-shadow: 0px 0px 20px 4px #81cfc6;
  padding: 15px;
}

h2 {
  margin: 0;
}

.flexbox,
.grid,
.absolute {
  border: 2px solid skyblue;
  border-radius: 10px;
  padding: 10px;
  margin-top: 20px;
  min-height: 150px;
}

.flexbox ul {
  padding: 0;
  display: flex;
  justify-content: space-around;
}

.flexbox li {
  list-style: none;
  height: 160px;
  width: 160px;
  margin: 10px;
  background: turquoise;
  display: flex;
  justify-content: center;
  align-items: center;
}

.grid-container {
  display: grid;
  grid-template-columns: 30% 70%;
}

.grid img {
  width: 80%;
  margin: 20px auto;
  display: block;
}

form {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr;
  grid-template-areas: &quot;i1 i2&quot; &quot;ta ta&quot; &quot;vi bt&quot;;
}

input,
textarea {
  margin: 5px;
  border: 1px solid darkblue;
  padding: 10px;
  font-size: 1.1rem;
  font-family: &quot;DMSerif&quot;;
  border-radius: 5px;
}

textarea {
  grid-area: ta;
  height: 40px;
  resize: none;
}

#btn-submit {
  grid-area: bt;
  cursor: pointer;
  background: cyan;
  transition: 0.2s;
}

#btn-submit:hover {
  background: darkblue;
  color: white;
}

/* ABSOLUTE  */
/* Sans élément en Relative, de base, l&apos;élément en absolute l&apos;est par rapport au Body  */
/* Il faut mettre une position relative au parent pour contraindre l&apos;élément en absolute dans ses frontières  */
.absolute {
  /* position relative par rapport à son parent,
  donc contenu dans les frontieres de son parents*/
  position: relative;
}


#circle1 {
  height: 80px;
  width: 80px;
  background: skyblue;
  position: absolute;
  border-radius: 150px;
  top: -20px;
  right: -20px;
}

#circle2 {
  height: 40px;
  width: 40px;
  border-radius: 150px;
  background: teal;
  position: absolute;
  left: 50%;
  transform:
  /*traslate de 50% de la taille du cercle,
  pour etre centré par rapport au centre du cercle,
  plutot que sur son bord gauche par défaut.*/
  translateX(-50%);
  top: 100px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;fr&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Cours CSS&amp;lt;/title&amp;gt;

    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
        &amp;lt;h1&amp;gt;Les bases de CSS&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;main&amp;gt;
        &amp;lt;div class=&quot;flexbox&quot;&amp;gt;
            &amp;lt;h2&amp;gt;Flexbox&amp;lt;/h2&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li&amp;gt;boite 1&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;boite 2&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;boite 3&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;grid&quot;&amp;gt;
            &amp;lt;h2&amp;gt;Grid&amp;lt;/h2&amp;gt;
            &amp;lt;div class=&quot;grid-container&quot;&amp;gt;
                &amp;lt;img src=&quot;./assets/img/css-logo.png&quot; alt=&quot;logo css&quot; /&amp;gt;

                &amp;lt;form action=&quot;&quot;&amp;gt;
                    &amp;lt;input type=&quot;text&quot; id=&quot;firstname&quot; placeholder=&quot;Prénom&quot; /&amp;gt;
                    &amp;lt;input type=&quot;text&quot; id=&quot;surname&quot; placeholder=&quot;Nom&quot; /&amp;gt;
                    &amp;lt;textarea cols=&quot;30&quot; rows=&quot;10&quot; placeholder=&quot;Ici votre message&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
                    &amp;lt;input type=&quot;submit&quot; value=&quot;Valider&quot; id=&quot;btn-submit&quot; /&amp;gt;
                &amp;lt;/form&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;absolute&quot;&amp;gt;
            &amp;lt;h2&amp;gt;Absolute&amp;lt;/h2&amp;gt;
            &amp;lt;span id=&quot;circle1&quot;&amp;gt;&amp;lt;/span&amp;gt;
            &amp;lt;span id=&quot;circle2&quot;&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;début_responsive&quot;&gt;Le responsive&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-css hljs&quot; data-lang=&quot;css&quot;&gt;@import url(&quot;https://fonts.googleapis.com/css2?family=Oswald:wght@500&amp;amp;display=swap&quot;);

@font-face {
  font-family: &quot;DMSerif&quot;;
  src: url(./assets/fonts/DMSerifDisplay-Regular.ttf);
}

body {
  font-family: &quot;DMSerif&quot;, Verdana;
  background: url(./assets/img/bg.jpg) center/cover;
  min-height: 100vh;
}

h1 {
  text-transform: uppercase;
  letter-spacing: 3px;
  text-align: center;
  /* pour etre plus responsive on peut passer la taille en vw(view port width) pour qu&apos;elle s&apos;adapte à la taille de l&apos;ecran*/
  font-size: 2.5rem;
  text-shadow: 3px 3px 8px #00000042;
  color: #ab0ef4;
  font-family: &quot;Oswald&quot;, sans-serif;
  text-decoration: underline;
}

main {
  background: rgba(245, 245, 245, 0.9);
  min-height: 500px;
  width: 90%;
  margin: 0 auto;
  border: 2px solid rgb(0, 140, 255);
  border-radius: 20px 20px 0 0;
  box-shadow: 0px 0px 20px 4px #81cfc6;
  padding: 15px;
}

h2 {
  margin: 0;
}

.flexbox,
.grid,
.absolute {
  border: 2px solid skyblue;
  border-radius: 10px;
  padding: 10px;
  margin-top: 20px;
  min-height: 150px;
}

.flexbox ul {
  padding: 0;
  display: flex;
  justify-content: space-around;
}

.flexbox li {
  list-style: none;
  height: 160px;
  width: 160px;
  margin: 10px;
  background: turquoise;
  display: flex;
  justify-content: center;
  align-items: center;
}

.grid-container {
  display: grid;
  grid-template-columns: 30% 70%;
}

.grid img {
  width: 80%;
  margin: 20px auto;
  /* permet en media query de la centrer en petit écran*/
  display: block;
}

form {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr;
  grid-template-areas: &quot;i1 i2&quot; &quot;ta ta&quot; &quot;vi bt&quot;;
}

input,
textarea {
  margin: 5px;
  border: 1px solid darkblue;
  padding: 10px;
  font-size: 1.1rem;
  font-family: &quot;DMSerif&quot;;
  border-radius: 5px;
}

textarea {
  grid-area: ta;
  height: 40px;
  resize: none;
}

#btn-submit {
  grid-area: bt;
  cursor: pointer;
  background: cyan;
  transition: 0.2s;
}

#btn-submit:hover {
  background: darkblue;
  color: white;
}

.absolute {
  position: relative;
}


#circle1 {
  height: 80px;
  width: 80px;
  background: skyblue;
  position: absolute;
  border-radius: 150px;
  top: -20px;
  right: -20px;
}

#circle2 {
  height: 40px;
  width: 40px;
  border-radius: 150px;
  background: teal;
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  top: 100px;
}

/* RESPONSIVE:
a partir des tailles d&apos;ecran permet de surcharger les reglages definis plus haut
*/
@media screen and (max-width: 900px) {
  .grid-container {
    display: block;
  }
  .grid-container img {
    width: 40%;
  }
}

@media screen and (max-width: 610px) {
  .flexbox ul {
    flex-direction: column;
    align-items: center;
  }

  form {
    grid-template-columns: 1fr;
    grid-template-rows: 1fr;
    grid-template-areas:
      &quot;i1&quot;
      &quot;i2&quot;
      &quot;ta&quot;
      &quot;bt&quot;;
  }
  input,
  textarea {
    font-size: 0.8rem;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;fr&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Cours CSS&amp;lt;/title&amp;gt;

    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
        &amp;lt;h1&amp;gt;Les bases de CSS&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;main&amp;gt;
        &amp;lt;div class=&quot;flexbox&quot;&amp;gt;
            &amp;lt;h2&amp;gt;Flexbox&amp;lt;/h2&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li&amp;gt;boite 1&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;boite 2&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;boite 3&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;grid&quot;&amp;gt;
            &amp;lt;h2&amp;gt;Grid&amp;lt;/h2&amp;gt;
            &amp;lt;div class=&quot;grid-container&quot;&amp;gt;
                &amp;lt;img src=&quot;./assets/img/css-logo.png&quot; alt=&quot;logo css&quot; /&amp;gt;

                &amp;lt;form action=&quot;&quot;&amp;gt;
                    &amp;lt;input type=&quot;text&quot; id=&quot;firstname&quot; placeholder=&quot;Prénom&quot; /&amp;gt;
                    &amp;lt;input type=&quot;text&quot; id=&quot;surname&quot; placeholder=&quot;Nom&quot; /&amp;gt;
                    &amp;lt;textarea cols=&quot;30&quot; rows=&quot;10&quot; placeholder=&quot;Ici votre message&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
                    &amp;lt;input type=&quot;submit&quot; value=&quot;Valider&quot; id=&quot;btn-submit&quot; /&amp;gt;
                &amp;lt;/form&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;absolute&quot;&amp;gt;
            &amp;lt;h2&amp;gt;Absolute&amp;lt;/h2&amp;gt;
            &amp;lt;span id=&quot;circle1&quot;&amp;gt;&amp;lt;/span&amp;gt;
            &amp;lt;span id=&quot;circle2&quot;&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;début_conclusion&quot;&gt;Débug &amp;amp; Conclusion&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-css hljs&quot; data-lang=&quot;css&quot;&gt;/* all elements:
supprime les comportements par défaut*/
* {
  /* les marges à zéro*/
  margin: 0;
  /* les parge internes(padding) à zéro*/
  padding: 0;
  /* tous les bords avec un cadre rouge de 2px.
  qui est ou et qui fait quoi...*/
  border: 2px solid red;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_début&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Début CSS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Mémo HTML</title>
      <link>https://talaria-formation.github.io//blog/2023/0061_memo_html_post.html</link>
      <pubDate>dim., 13 août 2023 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">blog/2023/0061_memo_html_post.html</guid>
      	<description>
	&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;toc&quot;&gt;Table des matieres&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#good_links&quot;&gt;Bon liens&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#repo&quot;&gt;Répository et code sample&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;good_links&quot;&gt;Bon liens&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://htmlcheatsheet.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;htmlcheatsheet.com&lt;/a&gt;: HTML Cheatsheet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://fontawesome.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;fontawesome.com&lt;/a&gt;: bibliothèque d&amp;#8217;icones&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.toptal.com/designers/htmlarrows/symbols/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;toptal.com/designers/htmlarrows/symbols&lt;/a&gt;: Icones natives en HTML&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;Table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;repo&quot;&gt;Répository et code sample&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;github repository: &lt;a href=&quot;https://github.com/cccp-education/html-codebase&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;html-codebase&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;memo source:&lt;br&gt;
index.html&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;fr&quot;&amp;gt;

&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
  &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
  &amp;lt;!-- Le titre de la page  --&amp;gt;
  &amp;lt;title&amp;gt;Cours HTML&amp;lt;/title&amp;gt;
  &amp;lt;!-- Icone de l&apos;onglet --&amp;gt;
  &amp;lt;link rel=&quot;shortcut icon&quot; href=&quot;html-logo.png&quot; /&amp;gt;
  &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://use.fontawesome.com/releases/v5.8.2/css/all.css&quot; /&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
  &amp;lt;header&amp;gt;
    &amp;lt;h1&amp;gt;Texte - Titre H1&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;
      &amp;lt;em&amp;gt;em pour mettre en italique&amp;lt;/em&amp;gt;,
      &amp;lt;strong&amp;gt;strong pour mettre en gras&amp;lt;/strong&amp;gt;
      &amp;lt;span&amp;gt;L&apos;élement en span ne revient pas à la ligne&amp;lt;/span&amp;gt;.
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;
      Lorem ipsum dolor sit amet consectetur adipisicing elit. Exercitationem
      cumque ratione veniam officiis nulla a debitis at facilis sed
      dignissimos.
    &amp;lt;/p&amp;gt;
  &amp;lt;/header&amp;gt;

  &amp;lt;section&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;h2&amp;gt;Photo - Titre H2&amp;lt;/h2&amp;gt;
      &amp;lt;img src=&quot;./img-1.jpg&quot; alt=&quot;image-arbre&quot; height=&quot;200&quot; /&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div&amp;gt;
      &amp;lt;h3&amp;gt;Liste - Titre H3&amp;lt;/h3&amp;gt;
      &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;UL = unordered list&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;UL = unordered list&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;UL = unordered list&amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;
      &amp;lt;ol&amp;gt;
        &amp;lt;li&amp;gt;OL = ordered list&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;OL = ordered list&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;OL = ordered list&amp;lt;/li&amp;gt;
      &amp;lt;/ol&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div&amp;gt;
      &amp;lt;h4&amp;gt;Tableaux - Titre H4&amp;lt;/h4&amp;gt;
      &amp;lt;table border=&quot;4&quot; cellpadding=&quot;10&quot; cellspacing=&quot;4&quot; style=&quot;text-align: center&quot;&amp;gt;
        &amp;lt;thead&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;th&amp;gt;Col 1&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Col 2&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Col 3&amp;lt;/th&amp;gt;
          &amp;lt;/tr&amp;gt;
        &amp;lt;/thead&amp;gt;
        &amp;lt;tbody&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;td rowspan=&quot;2&quot;&amp;gt;Row 1 Cell 1&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;Row 1 Cell 2&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;Row 1 Cell 3&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;Row 2 Cell 2&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;Row 2 Cell 3&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;td colspan=&quot;3&quot;&amp;gt;Row 3 Cell 1&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
        &amp;lt;/tbody&amp;gt;
      &amp;lt;/table&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div&amp;gt;
      &amp;lt;h5&amp;gt;&amp;lt;span&amp;gt;&amp;amp;#9814;&amp;lt;/span&amp;gt; Liens - Titre H5&amp;lt;/h5&amp;gt;
      &amp;lt;a href=&quot;https://htmlcheatsheet.com/&quot; target=&quot;_blank&quot;&amp;gt;HTML Cheatsheet&amp;lt;/a&amp;gt;
      &amp;lt;br /&amp;gt;
      &amp;lt;a href=&quot;https://www.toptal.com/designers/htmlarrows/symbols/&quot; target=&quot;_blank&quot;&amp;gt;Icones natifs en HTML&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div&amp;gt;
      &amp;lt;h6&amp;gt;&amp;lt;i class=&quot;fas fa-video&quot;&amp;gt;&amp;lt;/i&amp;gt; Vidéo - Titre H6&amp;lt;/h6&amp;gt;
      &amp;lt;video src=&quot;video.mp4&quot; height=&quot;150&quot; autoplay loop muted&amp;gt;&amp;lt;/video&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/section&amp;gt;
  &amp;lt;br /&amp;gt;
  &amp;lt;!-- Formulaires en HTML --&amp;gt;
  &amp;lt;section&amp;gt;
    &amp;lt;h2&amp;gt;Formulaire&amp;lt;/h2&amp;gt;
    &amp;lt;form action=&quot;/action.php&quot; method=&quot;post&quot;&amp;gt;
      &amp;lt;label for=&quot;name&quot;&amp;gt;Nom&amp;lt;/label&amp;gt;
      &amp;lt;input id=&quot;name&quot; type=&quot;text&quot; placeholder=&quot;Entrez votre nom&quot; /&amp;gt;&amp;lt;br /&amp;gt;

      &amp;lt;label for=&quot;number&quot;&amp;gt;Entrez votre age&amp;lt;/label&amp;gt;
      &amp;lt;input type=&quot;number&quot; id=&quot;number-age&quot; value=&quot;15&quot; oninput=&quot;document.getElementById(&apos;range-age&apos;).value=this.value&quot;&amp;gt;
      &amp;lt;input type=&quot;range&quot; id=&quot;range-age&quot; min=&quot;0&quot; max=&quot;100&quot;
        oninput=&quot;document.getElementById(&apos;number-age&apos;).value=this.value&quot;&amp;gt;&amp;lt;br /&amp;gt;

      &amp;lt;!-- Input select --&amp;gt;
      &amp;lt;label for=&quot;gender&quot;&amp;gt;Genre&amp;lt;/label&amp;gt;
      &amp;lt;select id=&quot;gender&quot;&amp;gt;
        &amp;lt;option selected=&quot;selected&quot; value=&quot;Homme&quot;&amp;gt;Homme&amp;lt;/option&amp;gt;
        &amp;lt;option value=&quot;Femme&quot;&amp;gt;Femme&amp;lt;/option&amp;gt;
      &amp;lt;/select&amp;gt;&amp;lt;br /&amp;gt;

      &amp;lt;!-- Input radio --&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;input type=&quot;radio&quot; name=&quot;type&quot; id=&quot;human&quot; checked /&amp;gt;
        &amp;lt;label for=&quot;human&quot;&amp;gt;Humain&amp;lt;/label&amp;gt;

        &amp;lt;input type=&quot;radio&quot; name=&quot;type&quot; id=&quot;dog&quot; /&amp;gt;
        &amp;lt;label for=&quot;dog&quot;&amp;gt;Chien&amp;lt;/label&amp;gt;

        &amp;lt;input type=&quot;radio&quot; name=&quot;type&quot; id=&quot;cat&quot; /&amp;gt;
        &amp;lt;label for=&quot;cat&quot;&amp;gt;Chat&amp;lt;/label&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;textarea cols=&quot;20&quot; rows=&quot;5&quot; placeholder=&quot;Votre message...&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br /&amp;gt;

      &amp;lt;!-- Input Checkbox --&amp;gt;
      &amp;lt;label&amp;gt;&amp;lt;input type=&quot;checkbox&quot; /&amp;gt;Accepter les CGV&amp;lt;/label&amp;gt; &amp;lt;br /&amp;gt;
      &amp;lt;input type=&quot;submit&quot; value=&quot;Submit&quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
  &amp;lt;/section&amp;gt;
  &amp;lt;br /&amp;gt;
  &amp;lt;!-- Mail &amp;amp; envoi de fichiers --&amp;gt;
  &amp;lt;footer&amp;gt;
    &amp;lt;a href=&quot;mailto:fs@gmail.com&quot;&amp;gt;Ecrivez-moi !&amp;lt;/a&amp;gt;
    &amp;lt;br /&amp;gt;
    &amp;lt;a href=&quot;notice.txt&quot; download=&quot;nom-du-fichier&quot;&amp;gt;Télécharger la notice&amp;lt;/a&amp;gt;
    &amp;lt;details&amp;gt;
      &amp;lt;summary&amp;gt;Plus d&apos;infos&amp;lt;/summary&amp;gt;
      &amp;lt;p&amp;gt;
        Lorem ipsum dolor, sit amet consectetur adipisicing elit. Harum,
        repellendus.
      &amp;lt;/p&amp;gt;
    &amp;lt;/details&amp;gt;
  &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;Table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Mémo Javascript</title>
      <link>https://talaria-formation.github.io//blog/2023/0060_memo_js_post.html</link>
      <pubDate>ven., 4 août 2023 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">blog/2023/0060_memo_js_post.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;github repository: &lt;a href=&quot;https://github.com/cccp-education/js-codebase&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;js-codebase&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#start&quot;&gt;Variables, opérateurs arithmétiques et chaines de caractères&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#arrays&quot;&gt;Les arrays&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#functions&quot;&gt;Les fonctions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#param_x_scope&quot;&gt;Paramètres et scopes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#objects&quot;&gt;Les objects&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#loops&quot;&gt;Les boucles&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#const_var_let&quot;&gt;Const, var et let&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#rest_and_spread_operators&quot;&gt;Rest et spread operators&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#destructuring&quot;&gt;Destructuring&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#import_export&quot;&gt;Import et export de modules&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#classes&quot;&gt;Utilisation des classes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;index.html&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;fr&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    index
    &amp;lt;script src=&quot;01_start.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;02_arrays.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;03_functions.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;04_param_x_scope.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;05_objects.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;06_loops.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;07_const_var_let.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;08_rest_and_spread_operators.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;09_destructuring.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;10_module_import_export.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;start&quot;&gt;Variables, opérateurs arithmétiques et chaines de caractères&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;01_start.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;/**
 * Variables
 */
//une variable stupide
var my_variable = &quot;dummy variable&quot;;
console.log(my_variable);

//assertion
console.assert(my_variable === &quot;dummy variable&quot;);

var username = &quot;@CCCP.education&quot;;
console.log(username);
console.assert(username === &quot;@CCCP.education&quot;);

//concaténation de string
console.assert(username === &quot;cher&quot; + &quot;oliv&quot;);

/**
 *  Opérateur arithmétique: + - * / %
 */
//integer
var x = 10;
var y = 5;
var z = 20;

console.log(x + y);
console.assert(x + y === 15);

console.log(x + y - z);
console.assert(x + y - z === -5);


console.log(x - y);
console.assert(x - y === 5);


console.log(x * y);
console.assert(x * y === 50);

console.log(x / y);
console.assert(x / y === 2);


console.log(&quot;---------&quot;);

x = 20;
y = 10;

console.log(x + y);
console.assert(x + y === 30);

console.log(x + y - z);
console.assert(x + y - z === 10);


console.log(x - y);
console.assert(x - y === 10);

console.log(x * y);
console.assert(x * y === 200);

console.log(x / z);
console.assert(x / z === 1);


//Littéraux de gabarits pour string avec backstick `
//Template literals (Template strings)
console.assert(`typeof z: ${typeof z}` === &quot;typeof z: number&quot;);

console.log(`x is type of : ${typeof x}`);
console.log(`y is type of : ${typeof y}`);
console.log(`z is type of : ${typeof z}`);

//typeof: donne le type de la variable
console.assert(typeof x === &quot;number&quot;);
console.assert(typeof y === &quot;number&quot;);
console.assert(typeof z === &quot;number&quot;);


console.log(&quot;---------&quot;);
/**
 * Incrémenation/décrémentation
 */
//incrémantation/décrémentation préfixe
console.log(++x) //incrémenté puis affiché: 21
console.log(x) //la valeur incrémenté: 21

//incrémantation/décrémentation suffixe
console.log(y++) //affiche la valeur sans incrémenation puis incrémente: 10
console.log(y) //la valeur incrémenté: 11

//décrémentation
x--;
y--;
console.assert(x === 20);
console.assert(y === 10);


/**
 * String: chaine de caractères
 */
console.log(`username: ${username}`);

//taille de la string
console.log(`username.length: ${username.length}`);
console.assert(username.length === 8);
console.assert(username.length === &quot;@CCCP.education&quot;.length);
console.log(&quot;---------&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;arrays&quot;&gt;Les arrays&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;02_arrays.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;/**
 * Les arrays
 */
// auteurs [[&quot;nom &quot;, &quot;prénom&quot;, &quot;pays&quot;]]
var writers = [
    [&quot;Karl&quot;, &quot;Marx&quot;, &quot;de&quot;],
    [&quot;Jean-Jacques&quot;, &quot;Rousseau&quot;, &quot;fr&quot;],
    [&quot;Victor&quot;, &quot;Hugo&quot;, &quot;fr&quot;],
    [&quot;René&quot;, &quot;Descartes&quot;, &quot;fr&quot;],
    [&quot;Paul&quot;, &quot;Verlaine&quot;, &quot;fr&quot;],
    [&quot;Antonio&quot;, &quot;Gramsci&quot;, &quot;it&quot;],
    [&quot;Georg&quot;, &quot;Lukacs&quot;, &quot;hu&quot;],
    [&quot;Franz&quot;, &quot;Kafka&quot;, &quot;hu&quot;],
    [&quot;Arthur&quot;, &quot;Rimbaud&quot;, &quot;fr&quot;],
    [&quot;Gérard&quot;, &quot;de Nerval&quot;, &quot;fr&quot;],
    [&quot;Chrétien&quot;, &quot;de Troyes&quot;, &quot;fr&quot;],
    [&quot;François&quot;, &quot;Rabelais&quot;, &quot;fr&quot;],
    [&quot;Georg&quot;, &quot;Hegel&quot;, &quot;de&quot;],
    [&quot;Friedrich&quot;, &quot;Engels&quot;, &quot;de&quot;],
]

console.table(writers);

// accés aux élèments du tableau
console.log(writers[0]);
console.log(`${writers[0][0]}, ${writers[0][1]} (${writers[0][2]})`);
console.assert(&quot;Karl, Marx (de)&quot; === `${writers[0][0]}, ${writers[0][1]} (${writers[0][2]})`);

//sauvegarder la valeur du prénom de Marx
var karl = writers[0][0]

//éditer un élement du tableau, le prénom de Marx
writers[0][0] = &quot;Karlito&quot;

console.log(`${writers[0][0]}, ${writers[0][1]} (${writers[0][2]})`);
console.assert(&quot;Karlito, Marx (de)&quot; === `${writers[0][0]}, ${writers[0][1]} (${writers[0][2]})`);

console.assert(&quot;Karl&quot; === karl);

//remettre la valeur initale du prénom de Marx
writers[0][0] = karl;

console.assert(`${karl}, Marx (de)` === `${writers[0][0]}, ${writers[0][1]} (${writers[0][2]})`);

console.log(&quot;---------&quot;);

/**
 *  Arrays: map/forEach/pop/push/slice/sort/shift/unshift
 */

var numbers = [1, 5, 4, 3, 2];

console.log(&quot;Iterate with forEach&quot;);
// parcourir avec array.forEach
numbers.forEach((it) =&amp;gt; console.log(it));
console.log(&quot;---------&quot;);

console.log(&quot;Iterate with map&quot;);
// parcourir avec array.map
numbers.map((it) =&amp;gt; console.log(it));
console.log(&quot;---------&quot;);

//afficher les éléments sur une ligne
//génère la string avec le formatage des nombres
const numbersString = (numberArray) =&amp;gt; {
    var consoleOutput = new String();
    numberArray.forEach(number =&amp;gt; consoleOutput += `${number}, `);
    return consoleOutput = consoleOutput.substring(0, consoleOutput.length - 2);
};

//affiche la chaine entre crochets dans la console
const displayNumbers = (numbersStr) =&amp;gt; {
    console.log(`[${numbersString(numbersStr)}]`);
};

console.log(&quot;orginal number array&quot;)
displayNumbers(numbers);
console.log(&quot;---------&quot;);


//push: ajoute à la fin
console.log(&quot;push&quot;);
numbers.push(6);
displayNumbers(numbers);
console.log(&quot;---------&quot;);

//pop: suprime le dernier
console.log(&quot;pop&quot;);
numbers.pop();
displayNumbers(numbers);
console.log(&quot;---------&quot;);

//unshift: ajouter le parametre au debut de l&apos;array
console.log(&quot;unshift&quot;);
numbers.unshift(0);
displayNumbers(numbers);
console.log(&quot;---------&quot;);

//shift: supprime le premier element de l&apos;array
console.log(&quot;shift&quot;);
numbers.shift();
displayNumbers(numbers);
console.log(&quot;---------&quot;);

//slice: renvoi l&apos;array entre les positions en argument
console.log(&quot;slice&quot;);
var sliceNumbersResult = numbers.slice(2, 4);
displayNumbers(sliceNumbersResult);
console.log(&quot;---------&quot;);

//sort asc
console.log(&quot;sort asc&quot;);
var ascSort = numbers.sort((a, b) =&amp;gt; a - b);
displayNumbers(ascSort);
console.log(&quot;---------&quot;);

//sort desc
console.log(&quot;sort desc&quot;);
var descSort = numbers.sort((a, b) =&amp;gt; b - a);
displayNumbers(descSort);
console.log(&quot;---------&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;functions&quot;&gt;Les fonctions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;03_functions.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;/**
 *  Les fonctions
 */

//function style legacy
function sayHelloWorldLegacy() {
    console.log(&quot;Hello world legacy!&quot;);
}
sayHelloWorldLegacy();

function sayHelloLegacy(firstName, lastName, style) {
    console.log(`Hello ${firstName}, ${lastName} (${style})`);
}
sayHelloLegacy(&quot;Cher&quot;, &quot;Oliv&quot;, &quot;legacy&quot;);

console.log(&quot;---------&quot;);

//function style arrow
const sayHelloWorld = () =&amp;gt; console.log(&quot;Hello world!&quot;);
sayHelloWorld();

const sayHello = (firstName, lastName) =&amp;gt;
    console.log(`Hello ${firstName}, ${lastName}`);
sayHello(&quot;Cher&quot;, &quot;Oliv&quot;);

console.log(&quot;---------&quot;);

var authors = [
    [&quot;Chrétien&quot;, &quot;de Troyes&quot;, &quot;fr&quot;],
    [&quot;François&quot;, &quot;Rabelais&quot;, &quot;fr&quot;],
    [&quot;René&quot;, &quot;Descartes&quot;, &quot;fr&quot;],
    [&quot;Jean-Jacques&quot;, &quot;Rousseau&quot;, &quot;fr&quot;],
    [&quot;Georg&quot;, &quot;Hegel&quot;, &quot;de&quot;],
    [&quot;Karl&quot;, &quot;Marx&quot;, &quot;de&quot;],
    [&quot;Friedrich&quot;, &quot;Engels&quot;, &quot;de&quot;],
    [&quot;Victor&quot;, &quot;Hugo&quot;, &quot;fr&quot;],
    [&quot;Paul&quot;, &quot;Verlaine&quot;, &quot;fr&quot;],
    [&quot;Antonio&quot;, &quot;Gramsci&quot;, &quot;it&quot;],
    [&quot;Georg&quot;, &quot;Lukacs&quot;, &quot;hu&quot;],
    [&quot;Franz&quot;, &quot;Kafka&quot;, &quot;hu&quot;],
    [&quot;Arthur&quot;, &quot;Rimbaud&quot;, &quot;fr&quot;],
    [&quot;Gérard&quot;, &quot;de Nerval&quot;, &quot;fr&quot;],
]


const displayAuthors = (authorsArray) =&amp;gt; authorsArray.forEach(author =&amp;gt;
    console.log(`${author[0]} ${author[1]}, (${author[2]})`)
);

displayAuthors(authors);

console.log(&quot;---------&quot;);

/**
 * valeur par défaut des parametres d&apos;une fonctions
 */
const add = (a = 0, b = 0) =&amp;gt; a + b;
console.assert(add() === 0)
console.assert(add(1) === 1)
console.assert(add(1, 1) === 2)

console.log(&quot;---------&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;param_x_scope&quot;&gt;Paramètres et scopes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;04_param_x_scope.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;//global scope: visible partout, dans et hors functions
var global;

const foo = () =&amp;gt; {
    //local scope: visible uniquement dans la fonction foo
    var bar = &quot;bar&quot;
    console.log(bar)
}

foo();
console.log(&quot;---------&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;objects&quot;&gt;Les objects&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;05_objects.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;/**
 * Les objects
 */
var authors = [
    [&quot;Chrétien&quot;, &quot;de Troyes&quot;, &quot;fr&quot;],
    [&quot;François&quot;, &quot;Rabelais&quot;, &quot;fr&quot;],
    [&quot;René&quot;, &quot;Descartes&quot;, &quot;fr&quot;],
    [&quot;Jean-Jacques&quot;, &quot;Rousseau&quot;, &quot;fr&quot;],
    [&quot;Georg&quot;, &quot;Hegel&quot;, &quot;de&quot;],
    [&quot;Karl&quot;, &quot;Marx&quot;, &quot;de&quot;],
    [&quot;Friedrich&quot;, &quot;Engels&quot;, &quot;de&quot;],
    [&quot;Victor&quot;, &quot;Hugo&quot;, &quot;fr&quot;],
    [&quot;Paul&quot;, &quot;Verlaine&quot;, &quot;fr&quot;],
    [&quot;Antonio&quot;, &quot;Gramsci&quot;, &quot;it&quot;],
    [&quot;Georg&quot;, &quot;Lukacs&quot;, &quot;hu&quot;],
    [&quot;Franz&quot;, &quot;Kafka&quot;, &quot;hu&quot;],
    [&quot;Arthur&quot;, &quot;Rimbaud&quot;, &quot;fr&quot;],
    [&quot;Gérard&quot;, &quot;de Nerval&quot;, &quot;fr&quot;],
];

var hugo = {
    firstName: authors[7][0],
    lastName: authors[7][1],
    country: authors[7][2],
};

var book = {
    author: hugo,
    title: &quot;Les misérables&quot;
};
console.log(hugo);
console.log(book);

//accéder à un membre de l&apos;objet par point
console.log(hugo.country);

//accéder à un membre de l&apos;objet par crochet
console.log(book[&quot;title&quot;]);

console.log(book.author.lastName);

console.log(book[&quot;author&quot;][&quot;firstName&quot;]);

//ajouter une clé a un objet
hugo.gender = &quot;non binary&quot;;
console.assert(hugo.gender === &quot;non binary&quot;);


//mettre à jour une clé
hugo.gender = &quot;male&quot;;
console.assert(hugo.gender !== &quot;non binary&quot;);
console.assert(hugo[&quot;gender&quot;] === &quot;male&quot;);

//supprimer une clé
delete hugo.gender;


//verfier que l&apos;objet ne contient pas la clé gender
console.assert(!Object.keys(hugo).includes(&quot;gender&quot;));


console.log(&quot;---------&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;loops&quot;&gt;Les boucles&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;06_loops.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;/**
 * Les boucles: Itérer sur arrays et objets.
 */

console.log(&quot;for loop over array&quot;);

var numbers = [12, 10, 8, 6, 4, 2, 0];

for (number of numbers) {
    console.log(number);
}

console.log(&quot;---------&quot;);

console.log(&quot;for loop over object key&quot;);

var obj = { a: 1, b: 2, c: 3, d: 4 };

for (key in obj) {
    console.log(key);
}

console.log(&quot;---------&quot;);

console.log(&quot;for loop over object value&quot;);

for (value in obj) {
    console.log(obj[value]);
}

console.log(&quot;---------&quot;);

console.log(&quot;another for loop over authors array&quot;)

var authors = [
    [&quot;Chrétien&quot;, &quot;de Troyes&quot;, &quot;fr&quot;],
    [&quot;François&quot;, &quot;Rabelais&quot;, &quot;fr&quot;],
    [&quot;René&quot;, &quot;Descartes&quot;, &quot;fr&quot;],
    [&quot;Jean-Jacques&quot;, &quot;Rousseau&quot;, &quot;fr&quot;],
    [&quot;Georg&quot;, &quot;Hegel&quot;, &quot;de&quot;],
    [&quot;Karl&quot;, &quot;Marx&quot;, &quot;de&quot;],
    [&quot;Friedrich&quot;, &quot;Engels&quot;, &quot;de&quot;],
    [&quot;Victor&quot;, &quot;Hugo&quot;, &quot;fr&quot;],
    [&quot;Paul&quot;, &quot;Verlaine&quot;, &quot;fr&quot;],
    [&quot;Antonio&quot;, &quot;Gramsci&quot;, &quot;it&quot;],
    [&quot;Georg&quot;, &quot;Lukacs&quot;, &quot;hu&quot;],
    [&quot;Franz&quot;, &quot;Kafka&quot;, &quot;hu&quot;],
    [&quot;Arthur&quot;, &quot;Rimbaud&quot;, &quot;fr&quot;],
    [&quot;Gérard&quot;, &quot;de Nerval&quot;, &quot;fr&quot;],
];

for (const [i, value] of authors.entries()) {
    console.log(`${value[0]}, ${value[1]} (${value[2]})`);
}

console.log(&quot;---------&quot;);

console.log(&quot;while loop over array&quot;)

var i = 0
while (i &amp;lt; authors.length) {
    console.log(`${authors[i][0]}, ${authors[i][1]} (${authors[i][2]})`);
    i++;
}

console.log(&quot;---------&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;const_var_let&quot;&gt;Const, var et let&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;07_const_var_let.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;/**
 * const X var X let
 */
//var x du if n&apos;est pas confiné au scope du if
const varTest = () =&amp;gt; {
    var x = 1;
    console.log(x);
    console.assert(x === 1);
    if (true) {
        var x = 2;
        console.log(x);
        console.assert(x === 2);
    }
    console.log(x);
    console.assert(x !== 1);
    console.assert(x === 2);
}
varTest();

console.log(&quot;---------&quot;);

//var x est global à tous les fichier js
//chargés dans la page html
//var x issue du fichier 1_start.js
//ligne 46
console.log(x);
console.assert(x === 20);

console.log(&quot;---------&quot;);

//premier let x est confiné au scope de la fonction
//le let x du if est confiné au scope du if
const letTest = () =&amp;gt; {
    let x = 1;
    console.log(x);
    console.assert(x === 1);
    if (true) {
        let x = 2;
        console.log(x);
        console.assert(x === 2);
    }
    console.log(x);
    console.assert(x === 1);
    console.assert(x !== 2);
}
letTest();

console.log(&quot;---------&quot;);

/**
 * const: déclare un emplacement mémoire non réattribuable
 * c&apos;est modifiable pour un array,
 * mais non réinitialisable;
 * ex:
 * const arr = [25, 27, 29]
 * arr = [5, 7] //impossible
 * arr[0]=20 // possible
 * ex:
 * const n = 1;
 * n = 3; //impossible
 */
const arr = [25, 27, 29]
console.table(arr);
arr[0] = 20 // possible
console.table(arr);

arr.pop()
console.table(arr);
console.log(&quot;---------&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;rest_and_spread_operators&quot;&gt;Rest et spread operators&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;08_rest_and_spread_operators.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;/**
 * Opérateur de rest:
 * const add = (...operandes) =&amp;gt; a + b;
 * ou avec parametres avec valeur par défaut
 * const add = (a=0, b=0, ...operandes) =&amp;gt; a + b;
 */

/**
 * spread opérateur:
 * récupère l&apos;ensemble des elements d&apos;une collection,
 * dans un array
 */
const user_ages = [25, 56, 12, 58, 41, 62, 26];

const max_user_age = Math.max(...user_ages);
const min_user_age = Math.min(...user_ages);

console.assert(max_user_age == 62);
console.assert(min_user_age == 12);

console.log(&quot;---------&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;destructuring&quot;&gt;Destructuring&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;09_destructuring.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;/**
 * L&apos;affectation par décomposition (destructuring)
 */

const user = {
    first_name: &quot;@CCCP&quot;,
    last_name: &quot;.education&quot;,
    nick_name: &quot;@CCCP.education&quot;,
    gender: &quot;male&quot;,
    is_adult: true
};
console.log(user);

//première façon d&apos;initaliser des variables sans destructuration
let first_name_legacy = user.first_name;
let last_name_legacy = user.last_name;
let nick_name_legacy = user.nick_name;
let gender_legacy = user.gender;
let is_adult_legacy = user.is_adult;

console.assert(&quot;CCCP&quot; === first_name_legacy);
console.assert(&quot;.education&quot; === last_name_legacy);
console.assert(&quot;@CCCP.education&quot; === nick_name_legacy);
console.assert(&quot;male&quot; === gender_legacy);
console.assert(true === is_adult_legacy);
console.log(&quot;---------&quot;);
/**
 * Initialisation par déstructuration
 */
const {
    first_name,
    last_name,
    nick_name,
    gender,
    is_adult
} = user;

console.assert(user.first_name === first_name);
console.assert(user.last_name === last_name);
console.assert(user.nick_name === nick_name);
console.assert(user.gender === gender);
console.assert(user.is_adult === is_adult);

/**
 * Intialisation par déstructuration des arrays
 */
//cible explicite
const [a1, a2] = [15, 25, 17, 81, 51, 46];
console.assert(a1 === 15);
console.assert(a2 === 25);

//cible avec position par rapport aux index par virgules
//je veux b3 à 46
const [b1, b2, , , , b3] = [15, 25, 17, 81, 51, 46];
console.assert(b1 === 15);
console.assert(b2 === 25);
console.assert(b3 === 46);

//déstructuration avec operateur de rest
// je contruit un autre avec avec les elements
// à partir du premier élèment non destructuré
const [c1, c2, ...sub_arr] = [15, 25, 17, 81, 51, 46];
console.assert(b1 === 15);
console.assert(b2 === 25);
console.assert(sub_arr.length === 4);
console.assert(sub_arr[0] === 17);
console.assert(sub_arr[1] === 81);
console.assert(sub_arr[2] === 51);
console.assert(sub_arr[3] === 46);


// Une boucle pour comparer le resultat attendu
for (const [i, value] of[15, 25, 17, 81, 51, 46].entries()) {
    //on reconstruit le tableau à chaque iteration
    console.assert([c1, c2].concat(sub_arr)[i] === value);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;import_export&quot;&gt;Import et export de modules&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;10_module_import_export.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;/**
 * Import et export de module
 *
 * Dans le fichier html
 * au niveau de la balise d&apos;import de script
 * spécifier le type module
 *
 * 1er technique: import nommé des fonctions:
 * import { sum, minus, times, div, rem } from &quot;./dummy_math_functions.js&quot;;
 *
 * 2eme technique: import global des fonction avec l&apos;asterisque(*)
 * en préfixant l&apos;import par un nommage du fichier importé:
 * import * as math from &quot;./dummy_math_functions.js&quot;;
 *
 * 3eme technique: import par alias avec le mot clé &quot;as&quot;
 * import {
 *     sum as add,
 *     minus as substract,
 *     times as multiply,
 *     div as divide,
 *     rem as modulo
 * } from &quot;./dummy_math_functions.js&quot;;
 */

import {
    sum,
    minus,
    times,
    div,
    rem
} from &quot;./dummy_math_functions.js&quot;;

console.assert(sum(1, 1) === 2);
console.assert(minus(4, 2) === 2);
console.assert(times(2, 2) === 4);
console.assert(div(4, 2) === 2);
console.assert(rem(4, 2) === 0);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;dummy_math_functions.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;//sum
const sum = (x, y) =&amp;gt; x + y;

// subtraction
const minus = (x, y) =&amp;gt; x - y;

// multiplication
const times = (x, y) =&amp;gt; x * y;

// division
const div = (x, y) =&amp;gt; x / y;

// remainder: reste de la division euclidiene
const rem = (x, y) =&amp;gt; x % y;

// log sum
const sum_log = (x, y) =&amp;gt; console.log(sum(x, y));

// log subtraction
const minus_log = (x, y) =&amp;gt; console.log(minus(x, y));

// log multiplication
const times_log = (x, y) =&amp;gt; console.log(times(x, y));

// log division
const div_log = (x, y) =&amp;gt; console.log(div(x, y));

// log remainder
const rem_log = (x, y) =&amp;gt; console.log(rem(x, y));

export {
    sum,
    minus,
    times,
    div,
    rem,
    sum_log,
    minus_log,
    times_log,
    div_log,
    rem_log
};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;classes&quot;&gt;Utilisation des classes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;11_classes.js&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-javascript hljs&quot; data-lang=&quot;javascript&quot;&gt;/**
 * Utilisation des classes
 */
//creation d&apos;un objet
class Account {
    constructor(username) {
        this.username = username;
    }
};

const acc1 = new Account(&quot;@CCCP.education&quot;);
console.table(acc1);
console.assert(acc1.username === &quot;@CCCP.education&quot;);

console.log(&quot;---------&quot;);

//création d&apos;un objet et ajout de getter et setter(accesseurs)
class AccountInfo {
    constructor(username) {
        this._username = username;
    }

    get username() {
        return this._username;
    }

    /**
     * @param {(arg0: string) =&amp;gt; void} new_username
     */
    set new_username(new_username) {
        this._username = new_username;
    }
};

const acc_info1 = new AccountInfo(&quot;@CCCP.education&quot;);
console.table(acc_info1);
//accés au membre _username avec le getter username()
console.assert(acc_info1.username === &quot;@CCCP.education&quot;);

//update la valeur username de acc_info1 avec le setter
acc_info1.new_username = &quot;imrandeh&quot;;
console.assert(acc_info1.username === &quot;imrandeh&quot;);

console.log(&quot;---------&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc_js&quot;&gt;&lt;span class=&quot;underline&quot;&gt;Intro Javascript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Mémo Kotlin</title>
      <link>https://talaria-formation.github.io//blog/2022/0053_memo_kotlin_post.html</link>
      <pubDate>dim., 29 mai 2022 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">blog/2022/0053_memo_kotlin_post.html</guid>
      	<description>
	&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_good_links&quot;&gt;Good links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://play.kotlinlang.org/&quot;&gt;kotlinlang playground&lt;/a&gt;&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://arrow-kt.io/&quot;&gt;arrow.kt&lt;/a&gt;&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://arkivanov.github.io/MVIKotlin/&quot;&gt;MVI:Model View Intent&lt;/a&gt;&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/arkivanov/Essenty&quot;&gt;Essenty&lt;/a&gt;&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://arkivanov.github.io/Decompose/&quot;&gt;Decompose&lt;/a&gt;&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_bout_de_code_divers&quot;&gt;Bout de code divers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_map_reduce&quot;&gt;map reduce&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Convertir une list de bite vers une list de string et résumer la list de string&lt;br&gt;
dans une string contenant la concatenation.
Comment logger la request envoyé(requestBodyContent:byte[])&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;log.info(
    requestBodyContent!!.map { it.toInt().toChar().toString() }
        .reduce { request: String, s: String -&amp;gt; request + s }
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_enum_et_sealed_classes&quot;&gt;enum et sealed classes&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;post: &lt;a href=&quot;0038_training_kotlin_enum_sealed_class_post&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;training kotlin enum sealed class&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_functionnal_interface_et_method_reference&quot;&gt;functionnal interface et method reference&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On peut transformer une entité en model domain de dto avec un methode reference(functionnal style- java 8)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;fun findAllByLoginNot(
        pageable:Pageable,
        login:String)
    :Page&amp;lt;UserDto&amp;gt; {
    return userDao.findAllByLoginNot(
                    pageable,
                    login).map(::fromEntity)
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;une &lt;a href=&quot;https://stackoverflow.com/a/22245383/837404&quot;&gt;bonne explication&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_capturer_la_sortie_standard&quot;&gt;Capturer la sortie standard&lt;/h3&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;package functional

import java.io.ByteArrayOutputStream
import java.io.PrintStream
import java.lang.System.out
import java.lang.System.setOut
import kotlin.test.AfterTest
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertEquals


class BasicsHOF {
    private val standardOut: PrintStream? = out
    private val outputStreamCaptor = ByteArrayOutputStream()

    @BeforeTest
    fun setUp() = setOut(PrintStream(outputStreamCaptor))

    @AfterTest
    fun tearDown() = setOut(standardOut)

    @Test
    fun `three times dope`() {

        3.times { println(&quot;Hello&quot;) }

        assertEquals(
            buildString {
                repeat(3) { append(&quot;Hello\n&quot;) }
                deleteAt(length - 1)
            }, outputStreamCaptor
                .toString()
                .trim()
        )
    }

    fun Int.times(fn: () -&amp;gt; Unit) = (1..this).forEach { _ -&amp;gt; fn() }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_quelle_est_la_différence_en_kotlin_entre_apply_run_let_also_use_et_with&quot;&gt;Quelle est la différence en kotlin entre apply, run, let, also, use et with ?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Comparaison des fonctions Kotlin et Utilisation des Formes Lambda Reference&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Introduction&lt;/div&gt;
&lt;p&gt;Les fonctions Kotlin &lt;code&gt;apply&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt;, &lt;code&gt;also&lt;/code&gt;, &lt;code&gt;use&lt;/code&gt;, et &lt;code&gt;with&lt;/code&gt; offrent des moyens différents de traiter les objets. Chacune a ses propres cas d&amp;#8217;utilisation et comportements. En outre, les formes lambda reference permettent de rendre le code plus lisible et réutilisable en faisant référence à des fonctions lambda existantes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_apply&quot;&gt;apply&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La fonction &lt;code&gt;apply&lt;/code&gt; est utilisée pour configurer un objet pendant sa création. Elle retourne l&amp;#8217;objet sur lequel elle est appelée.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda reference :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;val someObject = SomeClass().apply(::configureObject)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;val someObject = SomeClass().apply {
// configuration des propriétés de someObject
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_run&quot;&gt;run&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La fonction &lt;code&gt;run&lt;/code&gt; est utilisée pour exécuter un bloc de code sur un objet et retourne le résultat du bloc de code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda reference :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;val result = someObject.run(::someFunction)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;val result = someObject.run {
// bloc de code à exécuter sur someObject
// la dernière expression est renvoyée
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_let&quot;&gt;let&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La fonction &lt;code&gt;let&lt;/code&gt; est utilisée pour exécuter un bloc de code sur un objet et retourne le résultat du bloc de code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda reference :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;val result = someObject.let(::processObject)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;val result = someObject.let {
// bloc de code à exécuter sur someObject
// la dernière expression est renvoyée
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_also&quot;&gt;also&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La fonction &lt;code&gt;also&lt;/code&gt; est utilisée pour effectuer une action additionnelle sur un objet et retourne l&amp;#8217;objet sur lequel elle est appelée.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda reference :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;someObject.also(::performAdditionalAction)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;someObject.also {
// action additionnelle sur someObject
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_use&quot;&gt;use&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La fonction &lt;code&gt;use&lt;/code&gt; est utilisée pour travailler avec des ressources qui doivent être fermées après utilisation. Elle appelle automatiquement la fonction &lt;code&gt;close&lt;/code&gt; à la fin du bloc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda reference :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;someResource.use(::useResource)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;someResource.use {
// travailler avec la ressource
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_with&quot;&gt;with&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La fonction &lt;code&gt;with&lt;/code&gt; est utilisée pour appeler plusieurs méthodes sur un objet sans répéter son nom et retourne le résultat de la dernière expression.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda reference :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;val result = with(someObject, ::processWithObject)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exemple avec lambda :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;val result = with(someObject) {
// appeler des méthodes sur someObject
// la dernière expression est renvoyée
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En utilisant les formes lambda reference ou les blocs &lt;code&gt;{}&lt;/code&gt;, vous pouvez encapsuler la logique dans des fonctions distinctes, améliorant ainsi la lisibilité et la réutilisabilité du code.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_let_function_en_kotlin&quot;&gt;let Function en Kotlin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Est-ce que let renvoi l&amp;#8217;objet avec les effets de bord opérés dessus ou dans l&amp;#8217;état initiale d&amp;#8217;entré en fonction(let) ?&lt;/div&gt;
&lt;p&gt;La fonction &lt;code&gt;let&lt;/code&gt; en Kotlin est utilisée pour effectuer des opérations sur un objet et renvoyer un résultat différent. Cependant, il est important de noter que la fonction &lt;code&gt;let&lt;/code&gt; ne modifie pas l&amp;#8217;état initial de l&amp;#8217;objet sur lequel elle est appelée.&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 100%;&quot;&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;strong&gt;Signature&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;inline fun &amp;lt;T, R&amp;gt; T.let(block: (T) &amp;#8594; R): R&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 100%;&quot;&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;strong&gt;Usage&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;La fonction &lt;code&gt;let&lt;/code&gt; est couramment utilisée pour appliquer des transformations à un objet et obtenir un résultat basé sur ces transformations.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 100%;&quot;&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;strong&gt;Résultat&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;La valeur renvoyée par la fonction &lt;code&gt;let&lt;/code&gt; est le résultat de l&amp;#8217;expression lambda passée en argument, généralement le résultat des opérations effectuées sur l&amp;#8217;objet.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 100%;&quot;&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;strong&gt;Effets de Bord&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Bien que la fonction &lt;code&gt;let&lt;/code&gt; puisse avoir des effets de bord sur l&amp;#8217;objet lorsqu&amp;#8217;elle est utilisée dans l&amp;#8217;expression lambda, elle ne modifie pas l&amp;#8217;état initial de l&amp;#8217;objet lui-même.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ainsi, la fonction &lt;code&gt;let&lt;/code&gt; est une façon élégante d&amp;#8217;effectuer des opérations sur un objet tout en obtenant un résultat dérivé, tout en préservant l&amp;#8217;intégrité de l&amp;#8217;objet d&amp;#8217;origine.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Mémo JVM</title>
      <link>https://talaria-formation.github.io//blog/2022/0052_memo_jvm_post.html</link>
      <pubDate>sam., 28 mai 2022 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">blog/2022/0052_memo_jvm_post.html</guid>
      	<description>
	&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;toc&quot;&gt;table des matieres&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#char&quot;&gt;chaines de caractères et caractères&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#math&quot;&gt;nombres et math&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#date&quot;&gt;dates et heures&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#java8date&quot;&gt;dates et heures java8&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#arrCol&quot;&gt;tableaux et collections&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#sysProp&quot;&gt;System.Properties&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#threads&quot;&gt;Threads&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#regex&quot;&gt;Expressions Régulières&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;char&quot;&gt;chaines de caractères et caractères&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;import java.text.Collator
import java.util.*
import kotlin.test.*

class StringsTest {
    @Test
    fun `chaines de caractères et caractères`() {
        //inférence de type
        val s = &quot;C&apos;est&quot;
        assertEquals(&quot;C&apos;est&quot;, s)

        //concaténation
        val t: String = s + &quot; le moment.&quot;
        assertEquals(&quot;C&apos;est le moment.&quot;, t)

        // StringBuilder
        val t1: String = s + buildString { append(&quot; le moment.&quot;) }
        assertEquals(&quot;C&apos;est le moment.&quot;, t1)

        //interpolation
        val t2 = &quot;$s le moment.&quot;
        assertEquals(&quot;C&apos;est le moment.&quot;, t2)

        //multiligne chaine de caractères
        val t3 = &quot;&quot;&quot;$s le moment.&quot;&quot;&quot;
        assertEquals(&quot;C&apos;est le moment.&quot;, t3)

        //conversion de type
        val t4 = t + &quot; &quot; + 23.4
        assertEquals(&quot;C&apos;est le moment. 23.4&quot;, t4)

        val t5 = &apos;C&apos;.toString()
        assertEquals(&quot;C&quot;, t5)

        //taille de la chaine de caractères
        assertEquals(16, t.length)

        //sous-chaine d&apos;une chaine de caractères

        //retourne une chaine de caractères contenant,
        //les caractères aux positions x à y-1
        //sub = t.substring(x, y)

        //t = &quot;C&apos;est le moment.&quot;
        //retourne les caractères 6 et 7
        var sub = t.substring(6, 8)
        assertEquals(&quot;le&quot;, sub)

        //retourne les caractères 0 à 4
        sub = t.substring(0, 5)
        assertEquals(&quot;C&apos;est&quot;, sub)

        //la longueur d&apos;une sous-chaine est toujours égale (y-x)
        val numChars = sub.length
        assertEquals(5 - 0, numChars)

        //extraction des caractères d&apos;une chaine
        assertEquals(&apos;e&apos;, t.elementAt(2))
        assertEquals(&apos;e&apos;, t.get(2))
        assertEquals(&apos;e&apos;, t[2])

        //conversion d&apos;une chaine en tableau de caractères
        val ca = t.toCharArray()
        assertEquals(t.length, ca.size)
        t.mapIndexed { index, char -&amp;gt; assertEquals(char, ca[index]) }

        //place les 4 premiers caractères de t1
        //dans le tableau ca a la position 2
        (t as java.lang.String).getChars(
            /* srcBegin = */ 0,
            /* srcEnd = */ 3,
            /* dst = */ ca,
            /* dstBegin = */ 1
        )
        assertEquals(&quot;CC&apos;et le moment.&quot;, String(ca))
        //colle tous les caractères dans un meme string
        assertEquals(&quot;CC&apos;et le moment.&quot;, ca.concatToString())

        //to lower case
        assertEquals(&quot;c&apos;est le moment.&quot;, t.toLowerCase())
        assertEquals(&quot;c&apos;est le moment.&quot;, t.lowercase())

        //to upper case
        assertEquals(&quot;C&apos;EST LE MOMENT.&quot;, t.toUpperCase())
        assertEquals(&quot;C&apos;EST LE MOMENT.&quot;, t.uppercase())

        //comparaison de chaines de caractères
        //t = &quot;C&apos;est le moment.&quot;
        assertFalse(t.equals(&quot;hello&quot;))
        assertFalse(t == &quot;hello&quot;)

        //ignore la casse
        assertTrue(t.equalsIgnoreCase(&quot;C&apos;EST LE MOMENT.&quot;))
        assertTrue(t.equals(&quot;C&apos;EST LE MOMENT.&quot;, ignoreCase = true))

        //démarre par
        assertTrue(t.startsWith(&quot;C&apos;est&quot;))
        //se finit par
        assertTrue(t.endsWith(&quot;le moment.&quot;))

        //compareTo
        //retourne une valeur &amp;lt; 0, car s est
        //alphabétiquement avant &quot;N&apos;est&quot;
        val r1: Int = s.compareTo(&quot;N&apos;est&quot;)
        assertTrue(r1 &amp;lt; 0)

        //variante ignorant la casse
        val r1Prime: Int = (s as java.lang.String).compareToIgnoreCase(&quot;n&apos;est&quot;)
        assertTrue(r1Prime &amp;lt; 0)

        //retourne 0 si les chaines sont equivalente
        val r2: Int = s.compareTo(&quot;C&apos;est&quot;)
        assertEquals(0, r2)

        //retourne une valeur &amp;gt; 0 car s vient apres &quot;B&apos;est&quot;
        val r3: Int = s.compareTo(&quot;B&apos;est&quot;)
        assertTrue(r3 &amp;gt; 0)

        //Recherche de caractères et de sous-chaines de caractères

        //recherche de caractères
        //position du premier caractères &apos;t&apos;
        var pos = t.indexOf(&apos;t&apos;)
        assertEquals(4, pos)

        //position du suivant
        pos = t.indexOf(&apos;t&apos;, pos + 1)
        assertEquals(14, pos)

        //retour d&apos;érreur -1 si absence de suivant
        pos = t.indexOf(&apos;t&apos;, pos + 1)
        assertEquals(-1, pos)

        //position du dernier &apos;t&apos; dans la chaine: 14
        pos = t.lastIndexOf(&apos;t&apos;)
        assertEquals(14, pos)

        //recherche de &apos;t&apos; vers l&apos;arrière a partir du caractères 13
        pos = t.lastIndexOf(&apos;t&apos;, pos - 1)
        assertEquals(4, pos)

        //recherche de sous-chaines
        //retourne 2
        pos = t.indexOf(&quot;est&quot;)
        assertEquals(2, pos)

        //&quot;est&quot; n&apos;apparait qu&apos;une seule fois: retourne -1
        pos = t.indexOf(&quot;est&quot;, pos + 1)
        assertEquals(-1, pos)

        //recherche d&apos;une sous-chaine depuis l&apos;arrière
        //t = &quot;C&apos;est le moment.&quot;
        //retourne 6
        pos = t.lastIndexOf(&quot;le &quot;)
        assertEquals(6, pos)

        //extrait depuis la position 9,
        //renvoi toute la chaine après &quot;le &quot;
        val noun = t.substring(pos + 3)
        assertEquals(-1, noun.indexOf(&quot;le &quot;))

        //remplacement de toutes les instances d&apos;un caractère
        //par un autre caractère
        //ne fonctionne que avec les caractères, pas les chaines
        val exclaim: String = t.replace(&apos;.&apos;, &apos;!&apos;)
        assertEquals(&apos;!&apos;, exclaim.get(exclaim.length - 1))
        assertEquals(exclaim.length - 1, exclaim.indexOf(&apos;!&apos;))
        assertEquals(-1, exclaim.indexOf(&apos;.&apos;))

        //suppression des espaces blancs
        //au début et à la fin d&apos;une chaine
        val noextraspaces = t.trim()
        assertNotEquals(&apos; &apos;, noextraspaces.get(0))
        assertNotEquals(&apos; &apos;, noextraspaces.get(noextraspaces.length - 1))

        //extraction des instances uniques de chaines de caractères
        //avec intern()
        val s1 = s.intern()
        assertEquals(s, s1)
        val s2 = &quot;C&apos;est&quot;.intern()
        assertEquals(&quot;C&apos;est&quot;, s2)
        assertEquals(s1, s2)

        //StringBuilder pour manipuler les caractères d&apos;une chaine de caractères
        //crée un tampon StringBuilder à partir d&apos;une chaine de caractères
        val b = StringBuilder(&quot;N&apos;est&quot;)

        //extrait et définit des caractères individuel du tampon StringBuilder
        //le caractères à l&apos;index 0
        val c: Char = b.get(0)
        assertEquals(&apos;N&apos;, c)

        //modifier le premier caractère de la chaine
        b.setCharAt(0, &apos;C&apos;)
        assertEquals(s, b.toString())

        //ajouter des données à un StringBuilder
        b.append(&apos; &apos;)
        b.append(&quot;le moment.&quot;)
        b.append(23)

        //insère des chaines de caractères ou autre dans le StringBuilder
        b.insert(6, &quot;pas &quot;)
        assertEquals(&quot;C&apos;est pas le moment.23&quot;, b.toString())

        //remplace un sous ensemble de caractères
        //avec une chaine de caractères donnée
        b.replace(2, 9, &quot;est&quot;)
        assertEquals(&quot;C&apos;est le moment.23&quot;, b.toString())

        //supprime les caractères
        b.delete(15, 18)
        assertEquals(&quot;C&apos;est le moment&quot;, b.toString())
        b.deleteCharAt(2)
        assertEquals(&quot;C&apos;st le moment&quot;, b.toString())

        //insert à la postion 2 et décale reste à droite(sans perte de données)
        b.insert(2, &apos;e&apos;)

        //tronque la taille de la donnée
        b.setLength(5)
        assertEquals(&quot;C&apos;est&quot;, b.toString())

        //inverse les caractères de la chaine
        b.reverse()
        assertEquals(&quot;tse&apos;C&quot;, b.toString())

        //écrase le StringBuilder, pret à etre réutilisé
        b.setLength(0)
        assertEquals(&quot;&quot;, b.toString())

        //java.util.StringTokenizer pour fragmenter une chaine
        //de caractères en un ensemble de mots
        var st = StringTokenizer(t)
        //nb d&apos;items encore présentent dans la file
        assertEquals(3, st.countTokens())

        //est ce que il y a encore des items dans la file
        assertTrue(st.hasMoreTokens())

        //récupérer le token courrant
        assertEquals(&quot;C&apos;est&quot;, st.nextToken())
        assertEquals(&quot;le&quot;, st.nextToken())
        assertEquals(&quot;moment.&quot;, st.nextToken())
        assertFalse(st.hasMoreTokens())
        assertEquals(0, st.countTokens())

        //extraire des occurences de mots délimités
        //par des caractères autres que des expaces.
        val str = &quot;a:b:c:d&quot;
        st = StringTokenizer(str, &quot;:&quot;)
        assertEquals(4, st.countTokens())
        assertTrue(st.hasMoreTokens())
        assertEquals(&quot;a&quot;, st.nextToken())
        assertEquals(&quot;b&quot;, st.nextToken())
        assertEquals(&quot;c&quot;, st.nextToken())
        assertEquals(&quot;d&quot;, st.nextToken())
        assertFalse(st.hasMoreTokens())
        assertEquals(0, st.countTokens())


        //text=&quot;C&apos;est le moment.&quot;
        val text = t.toCharArray()
        var p = 0

        //sauter les espaces de tete
        //pour ramener p à la position du premier caractère imprimable
        while ((p &amp;lt; text.size) &amp;amp;&amp;amp;
            (Character.isWhitespace(text[p]))
        ) p++
        assertEquals(0, p)
        assertEquals(&quot;C&apos;est le moment.&quot;, text.concatToString())

        //met le premier mot du texte en majuscule
        while (p &amp;lt; text.size &amp;amp;&amp;amp; Character.isLetter(text[p])) {
            text[p] = Character.toUpperCase(text[p])
            p++
        }
        assertEquals(1, p)
        assertEquals(&apos;C&apos;, text[0])
        assertTrue(Character.isUpperCase(text[0]))
        assertFalse(Character.isLetter(text[1]))

        //comparer des chaines de caractères
        // avec les contrainte la locale système
        val col = Collator.getInstance()
        //le résulat est négatif car chica
        //est avant chico dans l&apos;ordre alphabétique
        assertTrue(col.compare(&quot;chica&quot;, &quot;chico&quot;) &amp;lt; 0)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;math&quot;&gt;nombres et math&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;import java.math.BigInteger
import java.security.SecureRandom
import java.text.NumberFormat
import java.util.*
import kotlin.test.*

class NumbersMathTest {
    @Test
    fun `Nombres et Math`() {
        //Constantes utiles
        Byte.MIN_VALUE
        Byte.MAX_VALUE
        Short.MIN_VALUE
        Short.MAX_VALUE
        Float.MIN_VALUE
        Float.MAX_VALUE
        Math.PI
        Math.E
        val s = &quot;-42&quot;
        //conversion de chaine de caractères
        //vers un nombre, si possible.
        var b: Byte = java.lang.Byte.parseByte(s)
        var sh: Short = java.lang.Short.parseShort(s)
        var i: Int = java.lang.Integer.parseInt(s)
        var l: Long = java.lang.Long.parseLong(s)
        var f: Float = java.lang.Float.parseFloat(s)
        var d: Double = java.lang.Double.parseDouble(s)

        //valeur exacte
        val f_exac = java.lang.Float.valueOf(s)
        val d_exac = java.lang.Double.valueOf(s)

        //les routines de conversions entière gérent
        //les nombres dans diverses bases.
        //1011 en binare est égal a 11 en base dix
        b = java.lang.Byte.parseByte(&quot;1011&quot;, 2)
        assertEquals(11, b)
        //ff en base 16(hexa) est égal à 255 en base dix.
        sh = java.lang.Short.parseShort(&quot;ff&quot;, 16)
        assertEquals(255, sh)

        //la méthode valueOf() peut gérer des bases arbitraires.
        i = java.lang.Integer.valueOf(&quot;egg&quot;, 17).toInt()
        assertEquals(4334, i)

        //la méthode decode() gére les representations octale,
        //décimal, hexadécimal, en fonction du préfixe numérique
        //de la chaine de caractères
        //un 0 de tete signifie base 8
        //un 0x de tete signifie base 16
        //les autres sont en base 10
        val sho = java.lang.Short.decode(&quot;0377&quot;)

        //la classe Integer peut convertir les nombres
        //en diverses chaines de caractères.
        val decimal = java.lang.Integer.toString(42)
        assertEquals(&quot;42&quot;, decimal)

        val decimal_ = 42.toString()
        assertEquals(&quot;42&quot;, decimal_)

        val binary = java.lang.Integer.toBinaryString(42)
        assertEquals(&quot;101010&quot;, binary)

        val octal = java.lang.Integer.toOctalString(42)
        assertEquals(&quot;52&quot;, octal)

        val hex = java.lang.Integer.toHexString(42)
        assertEquals(&quot;2a&quot;, hex)

        val base36 = java.lang.Integer.toString(42, 36)
        assertEquals(&quot;16&quot;, base36)

        val base36_ = 42.toString(36)
        assertEquals(&quot;16&quot;, base36_)

        //java.text.NumberFormat effectue la conversion
        // d&apos;une maniere spécifique aux parametres locaux
        //sans parametre prend la local systeme comme reference
        val nf = NumberFormat.getNumberInstance(Locale.FRANCE)
        val formatted_number = nf.format(9876543.21)
        assertNotEquals(&quot;9876543.21&quot;, formatted_number)

        //parse la chaine de caractères en fonction des parametres locaux(fr)
        val n = nf.parse(&quot;1234567,89&quot;)
        assertEquals(1234567.89, n)

        //les valeurs monétaires sont parfois formaté
        // d&apos;une maniere differente des nombres
        val money_format = NumberFormat.getCurrencyInstance(Locale.FRANCE)
        assertEquals(&quot;123,40 €&quot;, money_format.format(1234.56))

        //java.lang.Math
        d = Math.toRadians(27.0)
        d = Math.cos(d)
        d = Math.sqrt(d)
        d = Math.log(d)
        d = Math.exp(d)
        d = Math.pow(10.0, d)
        d = Math.atan(d)
        d = Math.toDegrees(d)
        //arrondi au dessus
        val up = Math.ceil(d)
        //arrondi au dessous
        val down = Math.floor(d)
        //arrondi au plus près
        val nearest = Math.round(d)

        //java.lang.Math.Random()
        val r = Math.random()
        assertTrue(r &amp;gt;= 0.0 &amp;amp;&amp;amp; r &amp;lt; 1.0)

        //créé un nouvel objet Random, en l&apos;initialisant
        //avec l&apos;heure courante
        val generator = java.util.Random(System.currentTimeMillis())

        //prochaine valeur aléatoire de taille double
        d = generator.nextDouble()
        assertTrue((d &amp;gt;= 0.0) &amp;amp;&amp;amp; (d &amp;lt; 1.0))


        //prochaine valeur aléatoire de taille float
        f = generator.nextFloat()
        assertTrue((f &amp;gt;= 0.0) &amp;amp;&amp;amp; (f &amp;lt; 1.0))


        //prochaine valeur aléatoire de taille long
        l = generator.nextLong()
        assertTrue(
            (Math.abs(l) &amp;lt;= Long.MAX_VALUE) &amp;amp;&amp;amp;
                    (Math.abs(l) &amp;gt;= 0)
        )


        //prochaine valeur aléatoire de taille int
        i = generator.nextInt()
        assertTrue(
            (Math.abs(i) &amp;lt;= java.lang.Integer.MAX_VALUE) &amp;amp;&amp;amp;
                    (Math.abs(i) &amp;gt;= 0)
        )

        val limit = 100
        //prochaine valeur aléatoire de taille int
        //la limit max du ramdom est ramené à limit
        //et la limit min est 0
        i = generator.nextInt(limit)
        assertTrue(i in 0 until limit)


        //prochaine valeur aléatoire de taille booléen
        val bool = generator.nextBoolean()
        assertNotNull(bool)


        //valeur moyenne 0.0, déviation standard 1.0
        d = generator.nextGaussian()


        //randoms bytes
        //rempli un tableau avec des valeurs byte aléatoires
        val b_arr = ByteArray(128)
        generator.nextBytes(b_arr)
        b_arr.iterator().forEachRemaining {
            assertTrue(
                it &amp;lt;= Byte.MAX_VALUE &amp;amp;&amp;amp;
                        it &amp;gt;= Byte.MIN_VALUE
            )
        }

        //java.security.SecureRandom pour les nombres aléatoires
        //utilisé en cryptographie
        val secure_generator = SecureRandom()
        //le générateur génère sa propre tete de liste sur 16 octets
        secure_generator.setSeed(secure_generator.generateSeed(16))
        val sec_b_arr = ByteArray(128)
        secure_generator.nextBytes(sec_b_arr)
        sec_b_arr.iterator().forEachRemaining {
            assertTrue(
                it &amp;lt;= java.lang.Byte.MAX_VALUE &amp;amp;&amp;amp;
                        it &amp;gt;= java.lang.Byte.MIN_VALUE
            )
        }

        //java.math.BigDecimal java.math.BigInteger
        //pour travailler sur des grandes valeurs.
        //calcule de la factorielle de 1000
        var total = BigInteger.valueOf(1)
        (2..1000).forEach {
            total = total.multiply(BigInteger.valueOf(it.toLong()))
        }
        assertTrue(total.toString().length == 2568)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;date&quot;&gt;dates et heures&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;import java.text.DateFormat
import java.text.SimpleDateFormat
import java.time.Instant
import java.util.*
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue

class DatesHoursTest {
    @Test
    fun `Dates et heures`() {
        //l&apos;heure courante en millisecondes
        val t0 = System.currentTimeMillis()
        //une autre représentation de la meme information
        val now = java.util.Date()
        //converti un objet java.util.Date en une valeur long.
        val t1 = now.getTime()
        assertTrue(t1 &amp;gt; Instant.EPOCH.toEpochMilli())
        //kotlin property access syntaxe style
        val t1_prime = now.time

        //java.text.DateFormat
        //affiche la date d&apos;aujourd&apos;hui en utilisant le format
        //par défaut des parametres locaux
        val defaultDateFormat = DateFormat.getDateInstance()
        //personnalisation du formatage et de la locale
        val df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE)
        val localeFormattedDate = df.format(Date())

        //constantes pour les styles de pattern de formatage
        assertEquals(0, DateFormat.FULL)
        assertEquals(1, DateFormat.LONG)
        assertEquals(2, DateFormat.MEDIUM)
        assertEquals(3, DateFormat.SHORT)
        assertEquals(2, DateFormat.DEFAULT)

        //utilise pour l&apos;heure un format abrégé avec
        //des parametres personnalisés
        val tf = DateFormat.getTimeInstance(
            DateFormat.SHORT,
            Locale.FRANCE
        )
        //affiche l&apos;heure en utilisant le format de tf
        val shortTime = tf.format(Date())
        assertTrue(shortTime.contains(&apos;:&apos;))

        //affiche la date et l&apos;heure en utilisant
        //un format détaillé
        val longTimeStamp = DateFormat.getDateTimeInstance(
            DateFormat.FULL,
            DateFormat.FULL,
        )
        assert(longTimeStamp.format(Date()).isNotEmpty())

        //utilisez java.text.SimpleDateFormat
        //pour définir votre propre modele de formatage
        val customFormat = SimpleDateFormat(&quot;yyyy.MM.dd&quot;)
        assertEquals(10, customFormat.format(Date()).length)

        //DateFormat peut également parser les date contenu dans des chaines
        val kotlinAnnounceDate = customFormat.parse(&quot;2019.05.08&quot;)

        //la class Date et sa représentation en millisecondes
        //n&apos;autorise qu&apos;une forme trés simple d&apos;arithmétique
        //on ajoute 3 600 000 millisecondes à l&apos;heure courante
        val anHourFromNow = now.getTime() + (60 * 60 * 1000)
        assert(anHourFromNow &amp;gt; now.getTime())

        //java.util.Calendar
        //pour manipuler les dates et heures de facon plus sophistiquée
        //instanciation selon les parametres locaux
        //et le fuseau horaire local
        val calendar = Calendar.getInstance()
        //initialisation du calendrier à la date de maintenant
        calendar.setTime(now)
        //détermine le jour de l&apos;année auquel correspond la date courante
        val dayOfYear = calendar.get(Calendar.DAY_OF_YEAR)
        assert(dayOfYear &amp;lt; 366)
        //réinitialisation de la date courante
        calendar.set(2019, Calendar.MAY, 8)
        assertEquals(4, calendar.get(Calendar.DAY_OF_WEEK))

        //à quel jour du mois correspond le deuxieme mercredi de mai 2019
        //set(key,value)
        calendar.set(Calendar.YEAR, 2019)
        calendar.set(Calendar.MONTH, Calendar.MAY)
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY)
        //defini à quel (n=2) semaine du mois est la date
        calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2)
        //extrait le jour du mois
        val dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH)
        assertEquals(8, dayOfMonth)

        calendar.setTime(kotlinAnnounceDate)
        //ajoute 30j à la date
        calendar.add(Calendar.DATE, 30)
        val monthAfter = calendar.getTime()
        //date est elle avant ou apres?
        assertTrue(monthAfter.after(kotlinAnnounceDate))
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;java8date&quot;&gt;dates et heures java8&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 8 introduit le nouveau package &lt;strong&gt;&lt;em&gt;java.time&lt;/em&gt;&lt;/strong&gt;, qui contient les classes de base qui&lt;br&gt;
la plupart des développeurs travaillent avec.
Il contient également quatre sous-packages:&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;java.time.chrono&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Chronologies alternatives que les développeurs utilisant des systèmes de calendrier qui ne&lt;br&gt;
suivre la norme ISO va interagir avec.
Un exemple serait un cal japonais&lt;br&gt;
système endurant.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;java.time.format&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Contient le DateTimeFormatter utilisé pour convertir les objets de date et d&amp;#8217;heure&lt;br&gt;
dans une chaîne et également pour analyser les chaînes dans les objets de données et de temps.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;java.time.temporal&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Contient les interfaces requises par les classes de date et d&amp;#8217;heure de base et également&lt;br&gt;
des abstractions (telles que des requêtes et des ajusteurs) pour des opérations avancées avec des dates.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;java.time.zone&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Classes utilisées pour les règles de fuseau horaire sous-jacentes;&lt;br&gt;
la plupart des développeurs n&amp;#8217;auront pas besoin ce paquet.&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;../../img/java8-date-time.png&quot; alt=&quot;java8 date time&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;import java.time.LocalDate
import java.time.Month
import java.time.Period
import java.time.YearMonth
import java.time.temporal.*
import java.util.HashMap
import java.util.stream.Collectors
import kotlin.test.Test

class DatesHoursJava8Test {
    class BirthdayDiary {
        private val birthdays: MutableMap&amp;lt;String, LocalDate&amp;gt;

        init {
            birthdays = HashMap()
        }

        fun addBirthday(
            name: String, day: Int, month: Int,
            year: Int
        ): LocalDate {
            val birthday: LocalDate = LocalDate.of(year, month, day)
            birthdays[name] = birthday
            return birthday
        }

        fun getBirthdayFor(name: String): LocalDate? {
            return birthdays[name]
        }

        fun getAgeInYear(name: String, year: Int): Int {
            val period: Period = Period.between(
                birthdays[name],
                birthdays[name]!!.withYear(year)
            )
            return period.getYears()
        }

        fun getFriendsOfAgeIn(age: Int, year: Int): Set&amp;lt;String&amp;gt; {
            return birthdays.keys.stream()
                .filter { p: String -&amp;gt; getAgeInYear(p, year) == age }
                .collect(Collectors.toSet())
        }

        fun getDaysUntilBirthday(name: String): Int {
            val period: Period = Period.between(
                LocalDate.now(),
                birthdays[name]
            )
            return period.getDays()
        }

        fun getBirthdaysIn(month: Month): Set&amp;lt;String&amp;gt; {
            return birthdays.entries.stream()
                .filter { (_, value): Map.Entry&amp;lt;String, LocalDate&amp;gt; -&amp;gt; value.getMonth() === month }
                .map&amp;lt;String&amp;gt; { (key): Map.Entry&amp;lt;String, LocalDate&amp;gt; -&amp;gt; key }
                .collect(Collectors.toSet())
        }

        val birthdaysInCurrentMonth: Set&amp;lt;String&amp;gt;
            get() = getBirthdaysIn(LocalDate.now().getMonth())
        val totalAgeInYears: Int
            get() = birthdays.keys.stream()
                .mapToInt { p: String -&amp;gt;
                    getAgeInYear(
                        p,
                        LocalDate.now().getYear()
                    )
                }
                .sum()
    }

    //Les ajusteurs modifient les objets de date et d&apos;heure. Supposons, par exemple, que nous voulions
    //renvoie le premier jour d&apos;un trimestre qui contient un horodatage particulier :
    class FirstDayOfQuarter : TemporalAdjuster {
        override fun adjustInto(temporal: Temporal): Temporal? {
            val currentQuarter: Int = YearMonth.from(temporal)
                .get(IsoFields.QUARTER_OF_YEAR)
            return when (currentQuarter) {
                1 -&amp;gt; LocalDate.from(temporal)
                    .with(TemporalAdjusters.firstDayOfYear())

                2 -&amp;gt; LocalDate.from(temporal)
                    .withMonth(Month.APRIL.value)
                    .with(TemporalAdjusters.firstDayOfMonth())

                3 -&amp;gt; LocalDate.from(temporal)
                    .withMonth(Month.JULY.value)
                    .with(TemporalAdjusters.firstDayOfMonth())

                4 -&amp;gt; LocalDate.from(temporal)
                    .withMonth(Month.OCTOBER.value)
                    .with(TemporalAdjusters.firstDayOfMonth())

                else -&amp;gt; null
            }
        }
    }

    enum class Quarter {
        FIRST, SECOND, THIRD, FOURTH
    }

    //Dans quel trimestre de l&apos;année cette date se situe-t-elle ?
    class QuarterOfYearQuery : TemporalQuery&amp;lt;Quarter&amp;gt; {
        override fun queryFrom(temporal: TemporalAccessor): Quarter {
            val now = LocalDate.from(temporal)
            return if (now.isBefore(now.with(Month.APRIL).withDayOfMonth(1)))
                Quarter.FIRST
            else if (now.isBefore(
                    now.with(Month.JULY)
                        .withDayOfMonth(1)
                )
            ) Quarter.SECOND else if (now.isBefore(
                    now.with(Month.NOVEMBER)
                        .withDayOfMonth(1)
                )
            ) Quarter.THIRD else Quarter.FOURTH
        }
    }

    @Test
    fun `Dates et heures après java 8`() {
        val today = LocalDate.now()
        val currentMonth = today.month
        val firstMonthOfQuarter = currentMonth.firstMonthOfQuarter()

        val q = QuarterOfYearQuery()
        // Direct
        var quarter: Quarter? = q.queryFrom(LocalDate.now())
        println(quarter)
        // Indirect
        quarter = LocalDate.now().query(q)
        println(quarter)


        val now = LocalDate.now()
        val fdoq: Temporal = now.with(FirstDayOfQuarter())
        println(fdoq)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;arrCol&quot;&gt;tableaux et collections&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;../../img/collections_classes_inheritance.png&quot; alt=&quot;Classes de collections et héritage&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;package playground.programming

import java.util.*
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertTrue

class ArrayCollectionTest {
    @Test
    fun `Tableaux, collections`() {
        //Tableau
        //java.util.Arrays définit d&apos;utiles méthodes de manipulation de tableaux,
        //y compris de tri et de recherche au sein d&apos;un tableau
        val intArray = arrayOf(10, 5, 7, -3)
        //tri le tableau
        Arrays.sort(intArray)
        var pos = Arrays.binarySearch(intArray, 7)
        //la valeur 7 est trouvé a l&apos;index 2
        assertEquals(2, pos)
        //12 pas trouvé retourne une valeur negative
        assert(Arrays.binarySearch(intArray, 12) &amp;lt; 0)

        //les tableaux peuvent également etre triés
        //et faire l&apos;objet d&apos;une recherche
        val stringArray = arrayOf(&quot;le&quot;, &quot;moment&quot;, &quot;c&apos;est&quot;)
        assertEquals(&quot;c&apos;est&quot;, stringArray[2])
        assertEquals(&quot;le&quot;, stringArray[0])
        assertEquals(&quot;moment&quot;, stringArray[1])
        Arrays.sort(stringArray)
        assertEquals(&quot;c&apos;est&quot;, stringArray[0])
        assertEquals(&quot;le&quot;, stringArray[1])
        assertEquals(&quot;moment&quot;, stringArray[2])

        //Arrays.equals() compare tous les éléments de deux tableaux
        //Arrays.clone() copie tous les elements du tableau dans un autre
        stringArray.forEachIndexed { i, it -&amp;gt; assertEquals(it, stringArray.clone()[i]) }

        val data = ByteArray(100)
        //Arrays.fill() initialise tous les éléments des deux tableaux
        //initalise tous les éléments à -1
        Arrays.fill(data, -1)
        data.forEach { assertEquals(-1, it) }

        //attribue aux éléments 5, 6, 7, 8 et 9 la valeur -2
        Arrays.fill(data, 5, 10, -2)
        ((5 until (10 - 1))).forEach { assertEquals(-2, data[it]) }

        //récupère le type de data
        val type = data::class.java
        //est ce que data est un tableau?
        assertTrue(type.isArray())
        //est ce que data est un tableau de byte
        assertEquals(Byte::class.java, type.getComponentType())

        //Collection
        val s = java.util.HashSet&amp;lt;String&amp;gt;()
        s.add(&quot;test&quot;)
        assertTrue(s.contains(&quot;test&quot;))
        assertFalse(s.contains(&quot;test2&quot;))
        s.remove(&quot;test&quot;)
        assertFalse(s.contains(&quot;test&quot;))

        val ss = TreeSet&amp;lt;String&amp;gt;()
        ss.add(&quot;b&quot;)
        ss.add(&quot;a&quot;)
        ss.iterator().forEach { assertTrue(it == &quot;a&quot; || it == &quot;b&quot;) }

        //liste doublement chainée
        var dll: List&amp;lt;String&amp;gt; = LinkedList&amp;lt;String&amp;gt;()

        //plus efficace
        val l = java.util.ArrayList&amp;lt;String&amp;gt;()
        l.addAll(ss)
        l.addAll(1, ss)

        val obj = l.get(1)
        val obj_prime = l[1]
        assertEquals(obj, obj_prime)

        l.set(3, &quot;nouvel élément&quot;)
        l.add(&quot;test&quot;)
        l.add(0, &quot;test2&quot;)
        l.removeAt(1)
        l.remove(&quot;a&quot;)
        assertFalse(l.contains(&quot;a&quot;))
        l.removeAll(ss)
        assertFalse(l.containsAll(ss))
        assertFalse(l.isEmpty())
        assertTrue(l.isNotEmpty())


        val sublist = l.subList(1, 3)
        val elements = l.toArray()
        l.clear()

        val m = HashMap&amp;lt;String, Integer&amp;gt;()
        m.put(&quot;clé&quot;, Integer(42))
        m[&quot;clé&quot;] = Integer(42)
        val value: Integer = m.get(&quot;clé&quot;)!!
        assertEquals(Integer(42), value)
        m.remove(&quot;clé&quot;)
        assertTrue(m.isEmpty())
        val keys = m.keys
        assertTrue(keys.isEmpty())


        val set = HashSet&amp;lt;String&amp;gt;()
        set.add(&quot;key_1&quot;)
        set.add(&quot;key_2&quot;)
        set.add(&quot;key_3&quot;)
        val members = set.toArray()
        assertEquals(3, members.size)
        val list = ArrayList&amp;lt;String&amp;gt;()
        list.add(&quot;items1&quot;)
        list.add(&quot;items2&quot;)
        list.add(&quot;items3&quot;)
        val items = list.toArray()
        assertEquals(3, items.size)

        //trie et recherche d&apos;éléments sur les collections
        list.add(&quot;clé&quot;)
        //en premier on trie
        Collections.sort(list)
        //en kotlin
        list.sort()
        //en deuxieme on cherche
        //retourne l&apos;index du premier trouvé sinon -1
        pos = Collections.binarySearch(list, &quot;clé&quot;)
        assertEquals(0, pos)
        val list1 = mutableListOf(1, 2, 3, 4, 5)
        val list2 = mutableListOf&amp;lt;Int&amp;gt;(0, 0, 0, 0, 0)

        //d&apos;autres méthodes intéressantes concernant Collections

        //copie list1 dans list2, 2e parametre dans 1er parametre
        Collections.copy(list2, list1)
        //comparaison de la copy avec filter
        assertTrue(list1.filterIndexed { i: Int, it: Int -&amp;gt; it != list2[i] }.isEmpty())
        //comparaison de la copy avec map
        list1.mapIndexed { index: Int, it: Int -&amp;gt; assertEquals(it, list2[index]) }

        //rempli avec des 0
        Collections.fill(list2, 0)
        assertTrue(list2.none { it != 0 })

        //le maximum
        assertEquals(5, Collections.max(list1))

        //le minimum
        assertEquals(1, Collections.min(list1))

        //renverse
        Collections.reverse(list)
        listOf(&quot;items3&quot;, &quot;items2&quot;, &quot;items1&quot;, &quot;clé&quot;).mapIndexed { i: Int, it: String -&amp;gt; assertEquals(it, list[i]) }

        //mélange la list
        Collections.shuffle(list)

        //retourne un ensemble immuable possédant un seul élément 0
        Collections.singleton(0)
        //renvoi un emballage immuable autour d&apos;une liste
        Collections.unmodifiableList(list)
        //renvoi un emballage synchronisé autour d&apos;une map, ensemble clé valeur
        Collections.synchronizedMap(m)

        //java.util.Properties un est objet key value
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;sysProp&quot;&gt;System.Properties&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html&quot;&gt;System.Properties doc officielle&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;voici un tableau de quelques propriétés intéressantes&lt;br&gt;
Ces propriétés sont intéressantes pour avoir des informations&lt;br&gt;
sur le système hôte de la JVM.&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 50%;&quot;&gt;
&lt;col style=&quot;width: 50%;&quot;&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Key&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Meaning&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;file.separator&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Character that separates components of a file path. This is &quot;/&quot; on UNIX and &quot;\&quot; on Windows.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;java.class.path&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Path used to find directories and JAR archives containing class files. Elements of the class path are separated by a platform-specific character specified in the path.separator property.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;java.home&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Installation directory for Java Runtime Environment (JRE)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;java.vendor&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;JRE vendor name&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;java.vendor.url&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;JRE vendor URL&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;java.version&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;JRE version number&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;line.separator&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Sequence used by operating system to separate lines in text files&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;os.arch&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Operating system architecture&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;os.name&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Operating system name&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;os.version&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Operating system version&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;path.separator&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Path separator character used in java.class.path&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;user.dir&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;User working directory&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;user.home&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;User home directory&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;user.name&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;User account name&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;threads&quot;&gt;Threads&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;import java.text.DateFormat
import java.util.*
import kotlin.test.Test

class ThreadsTest {

    @Test
    fun `threads test`() {
        //java.lang.Thread représente le thread fondamentale de l&apos;API java
        //il existe deux manière de définir un thread
        //1) étendre la classe Thread ou une lambda en kotlin
        //2) implémenter l&apos;interface Runnable,
        //      puis passer une instance de cet objet Runnable au constructeur de Thread.

        val list1: List&amp;lt;Int&amp;gt; = List(
            size = 45,
            init = { (1..31).random() }
        )
        println(&quot;list1$list1&quot;)
        //facon 1
        val t = Thread {
            Collections.sort(list1)
            println(&quot;list1 sorted$list1&quot;)
        }
        t.start()

        val list2 = List(
            size = 45,
            init = { (1..31).random() }
        )
        println(&quot;list2$list2&quot;)
        //facon 2
        val sorter = BackgroundSorter(list2)
        sorter.start()

        //priorité des threads
        //tant qu&apos;un thread de niveau de priorité supérieure n&apos;est pas fini
        //alors celui de niveau inférieur ne peut s&apos;exécuter

        //on définit un thread avec une priorité inférieur à la normale
        t.setPriority(Thread.NORM_PRIORITY - 1)

        //ici on définit un thread avec une priorité inférieur à la priorité
        //du thread courant
        t.setPriority(Thread.currentThread().getPriority() - 1)

        //Thread.yield() fait une pause pour laisser les autres threads de meme priorité s&apos;exécuter
    }

    class BackgroundSorter(private val l: List&amp;lt;Int&amp;gt;) : Thread() {
        override fun run() {
            Collections.sort(l)
            println(&quot;list2 sorted$l&quot;)
        }
    }

    //pour l&apos;arrêt du thread, plutôt qu&apos;utiliser la fonction Thread.stop()
    // qui laisse la memoire dans un état non controlé.
    //utiliser la méthode tel que l&apos;exemple pleaseStop()
    class DummyClock(
        private val df: DateFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM),
        private var keepRunning: Boolean = true
    ) : Thread() {
        init {
            isDaemon = true
            start()
        }

        override fun run() {
            while (keepRunning) {
                println(df.format(Date()))
                try {
                    sleep(1000)
                } catch (e: InterruptedException) {
                    println(e.message)
                }
            }
        }

        fun pleaseStop() {
            keepRunning = false
        }
    }

    //java.util.Timer
    //java.util.TimerTask
    //ces classes permettent l&apos;exécution de taches répétitives
    @Test
    fun `Timer et TimerTask test`() {
        DummyClock()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;#toc&quot;&gt;table des matieres&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;regex&quot;&gt;Expressions Régulières&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;import java.util.*
import java.util.regex.Matcher
import java.util.regex.Pattern
import java.util.stream.Collectors
import kotlin.test.Test
import kotlin.test.assertEquals

class RegularExpressionsTest {
    @Test
    fun `expressions régulières`() {
        val p: Pattern = Pattern.compile(&quot;honou?r&quot;)
        val caesarUK = &quot;For Brutus is an honourable man&quot;
        val mUK: Matcher = p.matcher(caesarUK)
        assertEquals(true, mUK.find(), &quot;Should matches UK spelling&quot;)
        val caesarUS = &quot;For Brutus is an honorable man&quot;
        val mUS: Matcher = p.matcher(caesarUS)
        assertEquals(true, mUS.find(), &quot;Should matches US spelling&quot;)
    }

    @Test
    fun `expressions régulières plus complexes`() {
        //Notez que nous devons utiliser \\ car nous avons besoin d&apos;un littéral \
        //et Java utilise un seul \ comme caractère d&apos;échappement
        var pStr = &quot;\\d&quot; // Un chiffre numérique

        var text = &quot;Apollo 13&quot;
        var p = Pattern.compile(pStr)
        var m = p.matcher(text)
        print(pStr + &quot; matches &quot; + text + &quot;? &quot; + m.find())
        println(&quot; ; match: &quot; + m.group())
        pStr = &quot;[a..zA..Z]&quot; //N&apos;importe quelle lettre

        p = Pattern.compile(pStr)
        m = p.matcher(text)
        print(pStr + &quot; matches &quot; + text + &quot;? &quot; + m.find())
        println(&quot; ; match: &quot; + m.group())

        //N&apos;importe quel nombre de lettres, qui doivent toutes être comprises entre &apos;a&apos; et &apos;j&apos;
        //mais peut-être en majuscule ou en minuscule.
        pStr = &quot;([a..jA..J]*)&quot;
        p = Pattern.compile(pStr)
        m = p.matcher(text)
        print(pStr + &quot; matches &quot; + text + &quot;? &quot; + m.find())
        println(&quot; ; match: &quot; + m.group())
        text = &quot;abacab&quot;
        //&apos;a&apos; suivi de quatre caractères quelconques, suivi de &apos;b&apos;
        pStr = &quot;a....b&quot;
        p = Pattern.compile(pStr)
        m = p.matcher(text)
        print(pStr + &quot; matches &quot; + text + &quot;? &quot; + m.find())
        println(&quot; ; match: &quot; + m.group())
    }

    @Test
    fun `Quelles chaînes correspondent à la regex ?`() {
        val pStr = &quot;\\d&quot; // Un chiffre numérique
        val p = Pattern.compile(pStr)
        val ls: List&amp;lt;String&amp;gt; = Arrays.asList(&quot;Cat&quot;, &quot;Dog&quot;, &quot;Ice-9&quot;, &quot;99 Luftballoons&quot;)
        val containDigits: List&amp;lt;String&amp;gt; = ls.stream()
            .filter(p.asPredicate())
            .collect(Collectors.toList())
        assert(containDigits.contains(&quot;Ice-9&quot;))
        assert(containDigits.contains(&quot;99 Luftballoons&quot;))
        assertEquals(2, containDigits.size)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_tableau_regex_metacharacters&quot;&gt;Tableau regex metacharacters&lt;/h3&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3334%;&quot;&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Metacharacter&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;fonctionnalité&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Notes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;?&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Caractère facultatif—zéro ou une instance&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;*&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Zéro ou plus du caractère précédent&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;+&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Un ou plusieurs des caractères précédents&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;{M,N}&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Entre M et N instances du caractère précédent&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;\d&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Un chiffre&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;\D&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Un caractère non numérique&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;\w&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Un caractère de mot&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Chiffres, lettres et _&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;\W&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Un caractère sans mot&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;\s&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Un caractère d&amp;#8217;espacement&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;\S&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Un caractère non blanc&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;\n&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Caractère de saut de ligne&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;\t&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Caractère de tabulation&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;.&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Un caractère n&amp;#8217;importe lequel&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;N&amp;#8217;inclut pas la nouvelle ligne en Java&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;[ ]&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Tout caractère contenu entre crochets&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Appelé une classe de caractères&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;[^ ]&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Tout caractère non contenu entre crochets&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Appelé une classe de caractères inversée&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;( )&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Construire un groupe d&amp;#8217;éléments de motif&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Appelé un groupe (ou groupe de capture)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;|&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Définir des possibilités alternatives&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Implémente le OU logique&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;^&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Début de chaîne $ Fin de chaîne&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;compléter &lt;a href=&quot;https://www.codeurjava.com/2015/05/les-expressions-regulieres-avec-regex.html&quot;&gt;avec&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Mémo Gradle</title>
      <link>https://talaria-formation.github.io//blog/2022/0047_memo_gradle_post.html</link>
      <pubDate>lun., 23 mai 2022 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">blog/2022/0047_memo_gradle_post.html</guid>
      	<description>
	&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Afficher l&amp;#8217;aide&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;./gradlew --help&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Définir la propriété système de la JVM : &lt;code&gt;-D, --system-prop&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;./gradlew -Dmyprop=myvalue
#ou
./gradlew --system-prop myvalue&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Définir la propriété du projet pour le build script : &lt;code&gt;-Pmyprop=myvalue&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;./gradlew -Pmyprop=myvalue
#ou
./gradlew --project-prop myvalue&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Spécifie le répertoire de démarrage de Gradle. La valeur par défaut est le répertoire actuel.&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;./gradlew -p ~/src/next_startup
#ou
./gradlew --project-dir ~/src/next_startup&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Surcharger la property &apos;param_component&apos; par la ligne de commande :&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;./gradlew -Pparam_component=CUSTOM_VALUE&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Ajouter un dossier à un source-set dans un projet normal avec le kotlin dsl&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;sourceSets {
    getByName(&quot;test&quot;){
        java.srcDir(&quot;src/scripts/groovy&quot;)
    }
    getByName(&quot;test&quot;){
        java.srcDir(&quot;src/scripts/kscript&quot;)
    }
    getByName(&quot;test&quot;){
        java.srcDir(&quot;src/test/javascript&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Ajouter un dossier à un source-set dans un projet android avec le groovy dsl&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;android {
    sourceSets {
        main.java.srcDirs += &quot;src/main/../../../../ceelo/domain/src/main/java/&quot;
        test.java.srcDirs += &quot;src/test/../../../../ceelo/domain/src/test/java/&quot;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Éviter de construire et tester un sous module&lt;/div&gt;
&lt;p&gt;gradle build -x :excluded-module:check -x :excluded-module:assemble -x :excluded-module:build&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Déplacer des fichiers&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;tasks.register(&quot;moveWebappNode&quot;) {
    doLast {
        ant.withGroovyBuilder {
            &quot;move&quot;(
                &quot;webapp/node_modules&quot; to &quot;$rootDir/webapp-src/node_modules&quot;,
            )
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Tar un dossier&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;tasks.register&amp;lt;Tar&amp;gt;(&quot;tarWebapp&quot;) {
    dependsOn(&quot;moveWebappNpm&quot;)
    group = WEBAPP
    description = &quot;tar webapp&quot;
    doLast {
        setOf(
            &quot;build&quot;,
            &quot;target&quot;,
            &quot;node_modules&quot;
        ).forEach { dir -&amp;gt; exclude { it.name .dir } }
        archiveFileName.set(&quot;webapp.tar&quot;)
        destinationDirectory.set(File(&quot;${rootDir.absolutePath}$sep$WEBAPP_SRC&quot;))
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Afficher les dépendances d&amp;#8217;un build&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;tasks.register(&quot;printDependencies&quot;) {
    description = &quot;print project dependencies&quot;
    group = WEBAPP
    doLast {
        println(&quot;${project.name} dependencies&quot;)
        mutableMapOf&amp;lt;String, Map&amp;lt;String, String&amp;gt;&amp;gt;(
            &quot;buildDependencies&quot; to buildDependencies,
            &quot;domainDeps&quot; to domainDeps,
            &quot;domainTestDeps&quot; to domainTestDeps,
        ).apply { putAll(appModules) }
            .forEach { module -&amp;gt;
                if (module.value.isNotEmpty()) {
                    println(&quot;${module.key}:&quot;)
                    module.value.forEach { println(dependency(it)) }
                    println()
                }
            }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Exemple d&amp;#8217;utilisation de reduce : concaténation d&amp;#8217;une list dans un string&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-kotlin hljs&quot; data-lang=&quot;kotlin&quot;&gt;tasks.register(&quot;printWebappSrc&quot;) {
    description = &quot;print webapp sources&quot;
    group = WEBAPP
    doLast {
        webAppSrc
            .reduce { acc, s -&amp;gt; &quot;$acc\n\t$s&quot; }
            .run { println(&quot;$WEBAPP_SRC: $this\n&quot;) }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Récupérer la description d&amp;#8217;une tache en particulier&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;.\gradlew.bat -q help --task foo&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Pour lancer une tache depuis le workingDir root, alors préfixer la tache pas un &lt;code&gt;:&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;.\gradlew.bat :foo&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>

  </channel> 
</rss>
