<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Noob to Root]]></title><description><![CDATA[Noob to Root]]></description><link>https://blog.noobtoroot.xyz/</link><image><url>https://blog.noobtoroot.xyz/favicon.png</url><title>Noob to Root</title><link>https://blog.noobtoroot.xyz/</link></image><generator>Ghost 5.2</generator><lastBuildDate>Sun, 01 Mar 2026 12:11:34 GMT</lastBuildDate><atom:link href="https://blog.noobtoroot.xyz/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Road to DevOps]]></title><description><![CDATA[<p>Cet article a pour but de d&#xE9;tailler mon cheminement quant &#xE0; mon apprentissage des technologies en lien avec le DevOps. Je partagerais donc avec vous les diff&#xE9;rentes &#xE9;tapes qui m&apos;am&#xE8;nent &#xE0; me former sur le sujet. Cet article servira de squelette</p>]]></description><link>https://blog.noobtoroot.xyz/road-to-devops/</link><guid isPermaLink="false">62c44ba7827d1900012df4fd</guid><category><![CDATA[DevOps]]></category><dc:creator><![CDATA[Bertrand Janvoie]]></dc:creator><pubDate>Tue, 05 Jul 2022 15:30:32 GMT</pubDate><media:content url="https://blog.noobtoroot.xyz/content/images/2022/07/roadtodevops.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.noobtoroot.xyz/content/images/2022/07/roadtodevops.png" alt="Road to DevOps"><p>Cet article a pour but de d&#xE9;tailler mon cheminement quant &#xE0; mon apprentissage des technologies en lien avec le DevOps. Je partagerais donc avec vous les diff&#xE9;rentes &#xE9;tapes qui m&apos;am&#xE8;nent &#xE0; me former sur le sujet. Cet article servira de squelette et vous redirigera vers les diff&#xE9;rents articles abordant les technologies utilis&#xE9; au cours de ce voyage vers la ma&#xEE;trise de la philosophie DevOps.</p><!--kg-card-begin: markdown--><h2 id="quest-ce-que-le-devops">Qu&apos;est-ce que le DevOps?</h2>
<p>Le DevOps est avant tout un mouvement, une philosophie en ing&#xE9;nierie informatique qui unifie le d&#xE9;veloppement logiciel (dev) avec l&apos;administration syst&#xE8;me et r&#xE9;seaux (ops).</p>
<p>Il est aujourd&apos;hui, de par sa nature compliqu&#xE9;e de d&#xE9;finir avec exactitude ce que repr&#xE9;sente le DevOps tant celui-ci se transforme &#xE0; mesure que de nouvelles technologies s&apos;offrent &#xE0; nous.</p>
<p>Cependant, si nous devions d&#xE9;finir le DevOps dans sa vision la plus globale, celui-ci tendrait vers la promotion de l&apos;automatisation et du monitoring de toutes les &#xE9;tapes de la cr&#xE9;ation d&apos;un logiciel. En l&apos;occurrence, nous pourrions d&#xE9;couper ces &#xE9;tapes en 5.</p>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/07/drawio-4-.png" alt="Road to DevOps" loading="lazy"></p>
<p>Chaque &#xE9;tape pourrait &#xEA;tre divis&#xE9;e en sous-cat&#xE9;gories et forme dans sa globalit&#xE9;, la cha&#xEE;ne du CI/CD pour Continuous Int&#xE9;gration/ Continuous Deployment (int&#xE9;gration et D&#xE9;ploiement Continue) ou plus commun&#xE9;ment appeler un Pipeline.</p>
<p>Si l&apos;on devait r&#xE9;sumer en d&apos;autres mots ce qu&apos;est le DevOps et son pipeline nous pourrions dire de par l&apos;automatisation et la standardisation qu&apos;il apporte, qu&apos;il s&apos;agit de l&apos;entr&#xE9;e dans l&apos;aire de l&apos;industrialisation de l&apos;IT, une aire ou la cr&#xE9;ation artisanal d&apos;une infrastructure s&apos;effectue de mani&#xE8;re industrielle, comme le furent les industries Ford &#xE0; l&apos;&#xE9;poque.</p>
<h3 id="pour-qui">Pour qui?</h3>
<p>Le DevOps s&apos;adresse aussi bien aux d&#xE9;veloppeurs soucieux d&apos;en comprendre plus sur la cha&#xEE;ne de d&#xE9;veloppement d&apos;une application en adoptant une vision plus globale du SI que des administrateurs f&#xE9;ru d&apos;automatisation et de nouvelles technologies.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="les-m%C3%A9thodes">Les m&#xE9;thodes</h2>
<h3 id="scrum">Scrum</h3>
<p>Scrum est un m&#xE9;thode agile destin&#xE9; &#xE0; contr&#xF4;ler les projets informatiques, facilitant la communication et les virages en temps opportun. Aujourd&apos;hui, c&apos;est une m&#xE9;thode privil&#xE9;gi&#xE9; en entreprise  afin d&apos;adopter l&apos;approche dite &quot;agile&quot;. Forte de son succ&#xE8;s dans le monde de l&apos;informatique, elle s&apos;impose aujourd&apos;hui comme une nouvelle organisation d&apos;entreprise en &#xAB; mode projet &#xBB;.</p>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/07/Artboard-1-1.png" alt="Road to DevOps" loading="lazy"></p>
<h3 id="agile">Agile</h3>
<p>La m&#xE9;thode agile est quant &#xE0; elle bas&#xE9; sur le manifest agile qui prone quatre valeurs fondamentales : l&#x2019;individu et interactions plut&#xF4;t que processus. Les fonctionnalit&#xE9;s op&#xE9;rationnelles plut&#xF4;t que documentation exhaustive. La Collaboration avec le client plut&#xF4;t que la contractualisation des relations. L&#x2019;Acceptation du changement plut&#xF4;t que la conformit&#xE9; aux plans.</p>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/07/schemaagile.png" alt="Road to DevOps" loading="lazy"></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="boite-%C3%A0-outils">Boite &#xE0; outils</h2>
<p>Un administrateur syst&#xE8;me DevOps n&apos;est pas n&#xE9;cessairement oblig&#xE9; de connaitre chaques technologies sur le bout des doigts, il doit avant tout &#xEA;tre capable de piocher dans une boite &#xE0; outil et connaitre &#xE0; minima un outil pour travailler sur chaques &#xE9;tapes du pipeline devops. En l&apos;occurence, nous pourrions d&#xE9;finir qu&apos;un DevOps &#xE0; besoins de maitriser sommairement des outils comme:</p>
<ul>
<li>un orchestrateur</li>
<li>un ordonnanceur de t&#xE2;ches</li>
<li>des outils de gestion de d&#xE9;p&#xF4;ts</li>
<li>des outils de test unitaires</li>
<li>des outils de monitoring</li>
<li>avoir des connaissances en virtualisation (conteneurs, cloud, hyperviseur...)</li>
<li>poss&#xE9;der des notions de base de donn&#xE9;es</li>
</ul>
<p>Dans notre cas, si nous reprenons notre sh&#xE9;ma de pipeline, voici les outils sur lesquelles nous allons nous concentrer durant ce tutoriel.</p>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/07/drawio-5-.png" alt="Road to DevOps" loading="lazy"></p>
<p>(Des outils se rajouterons &#xE0; ce sh&#xE9;ma au fur &#xE0; mesure du temps)</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="git-flow">Git flow</h2>
<p>Il est important de comprendre la notion de git flow car celle-ci va d&#xE9;finir les diff&#xE9;rents serveurs qui vont r&#xE9;gir notre pipeline devops, notamment via un serveur de dev, de test, et de production.</p>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/07/2a5d5c1d5f42a3d0fd712ae7e4b23824.png" alt="Road to DevOps" loading="lazy"></p>
<p>Je vous invite &#xE0; vous int&#xE9;resser &#xE0; git, notamment au travers du sheet cheat git en lien ci-dessous qui ne rentre pas dans les details de comment fonctionne git mais vous pr&#xE9;sente sommairement les diff&#xE9;rentes commandes et leur utilit&#xE9;e.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.noobtoroot.xyz/cheat-sheet-git/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cheat sheet - Git</div><div class="kg-bookmark-description">W = working zone;S = staging zone;C = commit zone;B(*) = Branche *;H(*) = Header *; Initialisation Configuration $ git config --global user.email &#x201C;email@domain.com&#x201D; $ git config --global user.name &#x201C;Denis Brogniart&#x201D; Working zone Demarrer un d&#xE9;pot GIT #W $ git init Cloner un d&#xE9;pot&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.noobtoroot.xyz/content/images/size/w256h256/2022/05/icontr.png" alt="Road to DevOps"><span class="kg-bookmark-author">Noob to Root</span><span class="kg-bookmark-publisher">Bertrand Janvoie</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.noobtoroot.xyz/content/images/2022/06/cheatsheetgit.png" alt="Road to DevOps"></div></a></figure><!--kg-card-begin: markdown--><h2 id="infrastructure">Infrastructure</h2>
<p>Notre intrastructure sera compos&#xE9; de 6 serveurs:</p>
<ul>
<li>Serveur jenkins : jenkins / docker / docker-compose / ansible</li>
<li>Serveur gitlab</li>
<li>Serveur BDD : postgresql</li>
<li>Serveur dev : debian 11</li>
<li>Serveur stage : debian 11</li>
<li>Serveur prod : debian 11</li>
</ul>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/07/drawio-8-.png" alt="Road to DevOps" loading="lazy"></p>
<h3 id="installation-de-linfrastructure-avec-vagrant">Installation de l&apos;infrastructure avec Vagrant</h3>
<p>Vagrant est un logiciel libre et open-source permmant la cr&#xE9;ation et la configuration d&apos;envrionnements de d&#xE9;veloppement virtuels. En l&apos;occurence, celui-ci nous servira &#xE0; generer les diff&#xE9;rentes VM (sur VirtualBox) afin de mettre en place l&apos;infrastructure qui recevra notre pipeline.</p>
<p>Installation de virtualbox<br>
<code>sudo apt install virtualbox</code></p>
<p>Installation de vagrant</p>
<pre><code>wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg

echo &quot;deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main&quot; | sudo tee /etc/apt/sources.list.d/hashicorp.list

sudo apt update &amp;&amp; sudo apt install vagrant
</code></pre>
<p><strong>Commandes &#xE0; retenir:</strong></p>
<ul>
<li>vagrant up : t&#xE9;l&#xE9;charge et lance l&apos;image</li>
<li>vagrant up <serveur> : telecharge et lance l&apos;image <serveur> d&#xE9;finit dans le vagrant file.</serveur></serveur></li>
<li>vagrant snapshot push : fait un snapshot de la VM</li>
<li>vagrant snapshot list : listes les snapshots</li>
<li>vagrant snapshot pop : charge le snapshot</li>
<li>vagrant halt : arr&#xEA;te la ou les machines</li>
<li>vagrant destroy : d&#xE9;truit la ou les machines</li>
<li>vagrant status : listes les machines</li>
<li>cat Vagrantfile | grep -ri &quot;ip&quot; : liste les ips des machines</li>
<li>Documentation : <a href="https://www.vagrantup.com/docs">https://www.vagrantup.com/docs</a></li>
</ul>
<h4 id="installation-des-vms">Installation des VMs</h4>
<ol>
<li>Serveur Jenkins, Dev, Stage, Prod:<br>
<a href="https://git.noobtoroot.xyz/bertrandjve/Pipeline-DevOps/src/branch/master/1-vagrant-srv">(Git) Configuration Vagrant - Serveur Jenkins, Dev, Stage, Prod</a></li>
<li>Serveur DDB</li>
</ol>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Cheat sheet - Git]]></title><description><![CDATA[<figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://blog.noobtoroot.xyz/content/images/2022/06/git_project.png" width="600" height="533" loading="lazy" alt srcset="https://blog.noobtoroot.xyz/content/images/2022/06/git_project.png 600w"></div><div class="kg-gallery-image"><img src="https://blog.noobtoroot.xyz/content/images/2022/06/git_workflow.png" width="600" height="417" loading="lazy" alt srcset="https://blog.noobtoroot.xyz/content/images/2022/06/git_workflow.png 600w"></div></div></div></figure><p>W = working zone;<br>S = staging zone;<br>C = commit zone;<br>B(*) = Branche *; <br><em>H(*</em>) = Header *;</p><!--kg-card-begin: markdown--><h2 id="initialisation">Initialisation</h2>
<h5 id="configuration">Configuration</h5>
<p><code>$ git config --global user.email &quot;email@domain.com&quot;</code><br>
<code>$ git config --global user.name &quot;Denis Brogniart&quot;</code></p>
<h2 id="working-zone">Working zone</h2>
<h5 id="demarrer-un-d%C3%A9pot-git-w">Demarrer un d&#xE9;pot GIT #W</h5>
<p><code>$ git init</code></p>
<h5 id="cloner-un-d%C3%A9pot-existant-c%E2%9E%9Cw">Cloner un d&#xE9;pot</h5>]]></description><link>https://blog.noobtoroot.xyz/cheat-sheet-git/</link><guid isPermaLink="false">629fb78091d7d7000193461e</guid><category><![CDATA[Git]]></category><category><![CDATA[Sheetcheat]]></category><dc:creator><![CDATA[Bertrand Janvoie]]></dc:creator><pubDate>Tue, 07 Jun 2022 21:19:41 GMT</pubDate><media:content url="https://blog.noobtoroot.xyz/content/images/2022/06/cheatsheetgit.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://blog.noobtoroot.xyz/content/images/2022/06/git_project.png" width="600" height="533" loading="lazy" alt="Cheat sheet - Git" srcset="https://blog.noobtoroot.xyz/content/images/2022/06/git_project.png 600w"></div><div class="kg-gallery-image"><img src="https://blog.noobtoroot.xyz/content/images/2022/06/git_workflow.png" width="600" height="417" loading="lazy" alt="Cheat sheet - Git" srcset="https://blog.noobtoroot.xyz/content/images/2022/06/git_workflow.png 600w"></div></div></div></figure><img src="https://blog.noobtoroot.xyz/content/images/2022/06/cheatsheetgit.png" alt="Cheat sheet - Git"><p>W = working zone;<br>S = staging zone;<br>C = commit zone;<br>B(*) = Branche *; <br><em>H(*</em>) = Header *;</p><!--kg-card-begin: markdown--><h2 id="initialisation">Initialisation</h2>
<h5 id="configuration">Configuration</h5>
<p><code>$ git config --global user.email &quot;email@domain.com&quot;</code><br>
<code>$ git config --global user.name &quot;Denis Brogniart&quot;</code></p>
<h2 id="working-zone">Working zone</h2>
<h5 id="demarrer-un-d%C3%A9pot-git-w">Demarrer un d&#xE9;pot GIT #W</h5>
<p><code>$ git init</code></p>
<h5 id="cloner-un-d%C3%A9pot-existant-c%E2%9E%9Cw">Cloner un d&#xE9;pot existant #C&#x279C;W</h5>
<p><code>$ git clone [url]</code></p>
<h5 id="indexer-des-fichiers-existants-w%E2%9E%9Cs">Indexer des fichiers existants #W&#x279C;S</h5>
<p><code>$ git add [file]</code><br>
<code>$ git add</code></p>
<h2 id="staging-zone">Staging zone</h2>
<h5 id="v%C3%A9rifier-l%C3%A9tat-du-fichier-s">V&#xE9;rifier l&apos;&#xE9;tat du fichier #S</h5>
<p><code>$ git status</code></p>
<h5 id="copier-un-fichier-du-d%C3%A9pot-vers-la-zone-de-staging-c%E2%9E%9Cs">Copier un fichier du d&#xE9;pot vers la zone de staging #C&#x279C;S</h5>
<p><code>$ git reset</code></p>
<h5 id="visualiser-les-modifications-non-index%C3%A9s-s">Visualiser les modifications non-index&#xE9;s #S</h5>
<p><code>$ git diff</code></p>
<h2 id="commit">Commit</h2>
<h5 id="validation-des-modifications-s%E2%9E%9Cc">Validation des modifications #S&#x279C;C</h5>
<p><code>$ git commit -m &quot;message de validation&quot;</code></p>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/06/git_graph.gif" alt="Cheat sheet - Git" loading="lazy"></p>
<h5 id="historique-des-modifications-logc">Historique des modifications #log(C)</h5>
<p><code>$ git log</code></p>
<blockquote>
<pre><code class="language-$">commit 67d6a5214ad4b259407ec7836b9d729f9f7de731
Author: Bertrand
Date:   Fri Jul 5 10:45:50 2013 +0200

   create reminders admin module

commit 05ca141b9e982c7d04100c37300da4209305b900
Author: Bertrand
Date:   Fri Jul 5 10:29:56 2013 +0200

   Create user admin module

commit 0fb74654c708a01bfaec8d552437e9f655bd325d
Author: Thibault 
Date:   Thu Jul 4 15:46:34 2013 +0200

   upgrade pymill version

&#x2026;
</code></pre>
</blockquote>
<h5 id="visualiser-un-d%C3%A9pot-sp%C3%A9cifique-cid">Visualiser un d&#xE9;pot sp&#xE9;cifique #C(id)</h5>
<p><code>$ git show &lt;commit&gt;</code></p>
<h5 id="marquer-un-etat-du-d%C3%A9pot-tagc">Marquer un etat du d&#xE9;pot #tag(C)</h5>
<p><code>git tag &lt;mon_tag&gt;</code> # ex: stable</p>
<h5 id="annuler-ccid">Annuler #C(*)=C(id)</h5>
<p><code>$ git revert &lt;commit_ID&gt;</code></p>
<h2 id="branch-head">Branch &amp; Head</h2>
<h5 id="cr%C3%A9ation-dune-branche-bmaster%E2%9E%9Cnew%E2%9E%9Cbtest">Cr&#xE9;ation d&apos;une branche #B(master)&#x279C;NEW&#x279C;B(test)</h5>
<p><code>$ git branch test </code></p>
<h5 id="deplacer-head-sur-une-branche-hmaster%E2%9E%9Chtest">Deplacer head sur une branche #H(master)&#x279C;H(test)</h5>
<p><code>$ git checkout test  # D&#xE9;place HEAD sur &quot;test&quot;</code></p>
<h5 id="cr%C3%A9ation-dune-branche-et-d%C3%A9placement-du-head-alias">Cr&#xE9;ation d&apos;une branche et d&#xE9;placement du head #Alias</h5>
<p><code>$ git checkout -b test</code> #B(master)&#x279C;NEW&#x279C;B(test)+H(master)&#x279C;H(test)</p>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/06/git_work_branch.gif" alt="Cheat sheet - Git" loading="lazy"></p>
<h5 id="merge-deux-branches-htest%E2%9E%9Chmasterbtestbmaster">Merge deux branches #H(test)&#x279C;H(master)+B(test)=B(master)</h5>
<p><code>$ git checkout master #Deplacement sur branch master</code><br>
<code>$ git merge test #Deplacement du commit test vers master</code></p>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/06/git_merge.gif" alt="Cheat sheet - Git" loading="lazy"></p>
<h5 id="visualiser-les-branches-existances-ball">Visualiser les branches existances #B(all)</h5>
<p><code>$ git branch</code></p>
<blockquote>
<ul>
<li>master<br>
test</li>
</ul>
</blockquote>
<h5 id="supprimer-une-branche-b%E2%9E%9Cdelete">Supprimer une branche #B(*)&#x279C;DELETE</h5>
<p><code>$ git branch -d &lt;branch&gt;</code></p>
<h5 id="git-checkout-details">Git checkout: details</h5>
<p><code>$ git checkout &lt;commit ou branche&gt;  # 1) Avec un identifiant de commit</code><br>
<code>$ git checkout  &lt;commit ou branche&gt; &lt;repertoire ou fichier &gt;   # 2) Avec un fichier / r&#xE9;pertoire en plus</code><br>
<code>$ git checkout  &lt;repertoire ou fichier&gt; # &#xC9;quivalent &#xE0; git checkout HEAD &lt;repertoire ou branche&gt;</code><br>
<code>$ git checkout  # &#xC9;quivalent &#xE0; git checkout HEAD</code></p>
<h5 id="deplacer-la-r%C3%A9f%C3%A9rence-de-la-branche-courante-hcc">Deplacer la r&#xE9;f&#xE9;rence de la branche courante #(H+C)=C(*)</h5>
<p><code>$ git reset &lt;commit id&gt; #Plusieurs param&#xE8;tres disponible, cf sch&#xE9;ma</code></p>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/06/git_reset.gif" alt="Cheat sheet - Git" loading="lazy"></p>
<h2 id="d%C3%A9pots">D&#xE9;pots</h2>
<h5 id="ajout-dun-d%C3%A9pot">Ajout d&apos;un d&#xE9;pot</h5>
<p><code>$ git remote add &lt;alias&gt; &lt;url&gt;</code> (ex: origin master)</p>
<h5 id="suppression-dun-d%C3%A9pot">Suppression d&apos;un d&#xE9;pot</h5>
<p><code>$ git remote remove &lt;alias&gt;</code></p>
<h5 id="synchroniser-le-d%C3%A9pot-principal-en-locale">Synchroniser le d&#xE9;pot principal en locale</h5>
<p><code>$ git fetch &lt;alias&gt; &lt;branch&gt;</code></p>
<h5 id="ajoute-les-modifications-local-en-haut-de-la-liste-des-modifications-%C3%A0-effectuer">Ajoute les modifications local en haut de la liste des modifications &#xE0; effectuer</h5>
<p><code>$ git pull</code><br>
<code>$ git pull --rebase &lt;alias&gt; =&gt; upload</code></p>
<h5 id="telecharger-les-modifications-sur-git">Telecharger les modifications sur git</h5>
<p><code>$ git push &lt;alias&gt;</code><br>
<code>$ git push &lt;alias&gt; &lt;branch&gt;</code></p>
<h5 id="ignorer-des-fichiers">Ignorer des fichiers</h5>
<p>il faut cr&#xE9;er un fichiers:<code>.gitignore</code></p>
<table>
<thead>
<tr>
<th style="text-align:left">Exemple</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>*.a</code></td>
<td style="text-align:left">pas de fichier .a</td>
</tr>
<tr>
<td style="text-align:left"><code>!lib.a</code></td>
<td style="text-align:left">suivre lib.a malgr&#xE9; la r&#xE8;gle pr&#xE9;c&#xE9;dente</td>
</tr>
<tr>
<td style="text-align:left"><code>/TODO</code></td>
<td style="text-align:left">ignorer uniquement le fichier TODO &#xE0; la racine du projet</td>
</tr>
<tr>
<td style="text-align:left"><code>build/</code></td>
<td style="text-align:left">ignorer tous les fichiers dans le r&#xE9;pertoire build</td>
</tr>
<tr>
<td style="text-align:left"><code>doc/*.txt</code></td>
<td style="text-align:left">ignorer doc/notes.txt, mais pas doc/server/arch.txt</td>
</tr>
<tr>
<td style="text-align:left"><code>doc/**/*.txt</code></td>
<td style="text-align:left">ignorer tous les fichiers .txt sous le r&#xE9;pertoire doc/</td>
</tr>
</tbody>
</table>
<h5 id="supprimer-un-git">Supprimer un git</h5>
<p><code>$ git rm</code></p>
<h1 id="git-rebase-incoming">GIT REBASE INCOMING</h1>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Installer cockpit sur son serveur Linux + Configuration de Nginx]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="quest-ce-que-cockpit">Qu&apos;est-ce que cockpit ?</h2>
<p>Cockpit est une interface graphique via navigateur web, open-source, destin&#xE9; aux n&#xE9;ophyte de linux comme aux administrateurs aguerris permettant d&apos;administrer son serveur sous linux &#xE0; distance. Celui-ci offre une mani&#xE8;re d&apos;effectuer des t&#xE2;ches simples</p>]]></description><link>https://blog.noobtoroot.xyz/installer-cockpit-sur-son-serveur-linux/</link><guid isPermaLink="false">629e4f7c72b6240001828b38</guid><category><![CDATA[Linux]]></category><category><![CDATA[Cockpit]]></category><category><![CDATA[Webserver]]></category><category><![CDATA[Nginx]]></category><category><![CDATA[Webserveur]]></category><dc:creator><![CDATA[Bertrand Janvoie]]></dc:creator><pubDate>Mon, 30 May 2022 22:16:15 GMT</pubDate><media:content url="https://blog.noobtoroot.xyz/content/images/2022/05/bannercockpit.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="quest-ce-que-cockpit">Qu&apos;est-ce que cockpit ?</h2>
<img src="https://blog.noobtoroot.xyz/content/images/2022/05/bannercockpit.png" alt="Installer cockpit sur son serveur Linux + Configuration de Nginx"><p>Cockpit est une interface graphique via navigateur web, open-source, destin&#xE9; aux n&#xE9;ophyte de linux comme aux administrateurs aguerris permettant d&apos;administrer son serveur sous linux &#xE0; distance. Celui-ci offre une mani&#xE8;re d&apos;effectuer des t&#xE2;ches simples d&apos;administration.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/cockpit.JPG" width="1867" height="973" loading="lazy" alt="Installer cockpit sur son serveur Linux + Configuration de Nginx" srcset="https://blog.noobtoroot.xyz/content/images/size/w600/2022/05/cockpit.JPG 600w, https://blog.noobtoroot.xyz/content/images/size/w1000/2022/05/cockpit.JPG 1000w, https://blog.noobtoroot.xyz/content/images/size/w1600/2022/05/cockpit.JPG 1600w, https://blog.noobtoroot.xyz/content/images/2022/05/cockpit.JPG 1867w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/cockpit2.JPG" width="1875" height="1002" loading="lazy" alt="Installer cockpit sur son serveur Linux + Configuration de Nginx" srcset="https://blog.noobtoroot.xyz/content/images/size/w600/2022/05/cockpit2.JPG 600w, https://blog.noobtoroot.xyz/content/images/size/w1000/2022/05/cockpit2.JPG 1000w, https://blog.noobtoroot.xyz/content/images/size/w1600/2022/05/cockpit2.JPG 1600w, https://blog.noobtoroot.xyz/content/images/2022/05/cockpit2.JPG 1875w" sizes="(min-width: 720px) 720px"></div></div></div></figure><!--kg-card-begin: markdown--><p>Il est notamment possible gr&#xE2;ce &#xE0; Cockpit de g&#xE9;rer les services, les comptes utilisateurs, le pare-feu, arr&#xEA;ter ou red&#xE9;marrer son syst&#xE8;me, g&#xE9;rer ses p&#xE9;riph&#xE9;riques ou bien encore, utiliser directement un terminal dans l&apos;interface graphique.</p>
<p>Si le projet vous int&#xE9;resse, je vous invite &#xE0; vous rendre sur la documentation officielle qui vous permettra d&apos;approfondir toutes les possibilit&#xE9;s offertes par Cockpit.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="installation-de-cockpit">Installation de Cockpit</h2>
<p>Pour installer Cockpit, celui-ci est nativement g&#xE9;r&#xE9; par la plupart des gestionnaires de paquet.</p>
<p>Sur des distributions bas&#xE9;es sur Debian, ouvrer un terminal est entr&#xE9; la commande suivante :</p>
<p><code>sudo apt install cockpit</code></p>
<p>Vous pouvez v&#xE9;rifier que celui-ci est bien install&#xE9; avec la commande :</p>
<p><code>systemctl is-active cockpit</code></p>
<p>Si celui-ci n&apos;est pas activ&#xE9;, il faut d&#xE9;marrer le service &#xE0; l&apos;aide de la commande :</p>
<p><code>systemctl start cockpit </code></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="acc%C3%A8s-%C3%A0-linterface-web-de-cockpit">Acc&#xE8;s &#xE0; l&apos;interface web de Cockpit</h2>
<p>Si le service de cockpit est actif, il vous suffit maintenant de taper l&apos;adresse IP de votre serveur suivi du port 9090 (port par d&#xE9;faut de Cockpit).</p>
<p><code>http://&lt;adresse.ip.du.serveur&gt;:9090 =&gt; http://192.168.1.10:9090</code></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="configuration-de-nginx-pour-acc%C3%A9der-%C3%A0-cockpit-via-%C3%A0-sous-domaine">Configuration de Nginx pour acc&#xE9;der &#xE0; Cockpit via &#xE0; sous-domaine</h2>
<p>Pour acc&#xE9;der &#xE0; Cockpit depuis une adresse web, il faudra configurer nginx afin de diriger le traffic provenant du port 80 (ou 443 en HTTPS) vers le port 9090.</p>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Il faut penser &#xE0; cr&#xE9;er une redir&#xE9;ctionDNS de type A vers votre adresse IP publique.</div></div><!--kg-card-begin: markdown--><p>Pour cela, il faut ajouter une redirection &#xE0; Nginx.</p>
<p><code>sudo touch /etc/nginx/sites-available/cockpit.votresousdomaine.ext</code></p>
<p><code>sudo nano /etc/nginx/sites-available/cockpit.votresousdomaine.ext</code></p>
<p>Configuration de cockpit.votresousdomaine.ext &#xE0; copier/coller :</p>
<pre><code>
server {

listen 80;

listen [::]:80;


#cockpit.votresousdomaine.ext &#xE0; remplacer pas votre domaine.

server_name cockpit.votresousdomaine.ext;

access_log /var/log/nginx/cockpit.log;

location / {

# Required to proxy the connexion to Cockpit

proxy_pass http://127.0.0.1:9090;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-Proto $scheme;

# Required for web sockets to function

proxy_http_version 1.1;

proxy_buffering off;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection &quot;upgrade&quot;;

# Pass ETag header from Cockpit to clients.

# See: https://github.com/cockpit-project/cockpit/issues/5239

gzip off;

}

}

</code></pre>
<p>Il vous faut ensuite &#xE0; cr&#xE9;er un fichier de configuration (si celui-ci n&apos;existe pas d&#xE9;j&#xE0;) pour cockpit &#xE0; l&apos;emplacement suivant <code>/etc/cockpit/cockpit.conf</code> et de copier la configuration suivante :</p>
<pre><code>
[WebService]

Origins = https://cockpit.votresousdomaine.ext wss://cockpit.votresousdomaine.ext

ProtocolHeader = X-Forwarded-Proto

</code></pre>
<p>Enfin, il ne vous reste qu&apos;&#xE0; cr&#xE9;e un lien symbolique de votre fichier de configuration nginx depuis /etc/nginx/sites-available vers /etc/nginx/sites-enable et red&#xE9;marrer nginx.</p>
<p><code>ln -s /etc/nginx/sites-available/cockpit.votresousdomaine.ext /etc/nginx/sites-enabled/</code></p>
<p><code>systemctl restart nginx</code></p>
<p>Vous devriez normalement avoir acc&#xE8;s &#xE0; cockpit depuis votre nom de domaine.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="optionnel-securiser-cockpit-avec-un-acc%C3%A8s-https">(Optionnel) Securiser Cockpit avec un acc&#xE8;s HTTPS</h2>
<p>Si vous voulez acc&#xE9;der &#xE0; Cockpit de mani&#xE8;re s&#xE9;curis&#xE9;e, il est n&#xE9;cessaire de signer un certificat SSL avec Lets Encrypt. Pour cela, je vous conseille d&apos;installer Certbot:</p>
<p><code>sudo apt install certbot python3-certbot-nginx</code></p>
<p>Et signer votre certificat avec la commande suivante :</p>
<p><code>sudo certbot --nginx -d /etc/nginx/sites-available/cockpit.votresousdomaine.ext</code></p>
<p>Et voil&#xE0;, votre Cockpit est maintenant accessible et s&#xE9;curis&#xE9;.</p>
<p>Bonne administration &#xE0; vous!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Cheat to Sheet - Bash]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="raccourcis-clavier-du-terminal">Raccourcis clavier du terminal</h2>
<table>
<thead>
<tr>
<th style="text-align:center">Commandes</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>ctrl + l</code></td>
<td style="text-align:left">&#xE9;quivalent de <code>clear</code></td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + d</code></td>
<td style="text-align:left">&#xE9;quivalent de <code>exit</code></td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + r</code></td>
<td style="text-align:left">recherche dans l&apos;historique des commandes</td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + c</code></td>
<td style="text-align:left">stop l&apos;op&#xE9;ration en cours</td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + a</code></td>
<td style="text-align:left">curseur au d&#xE9;but de la ligne</td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + e</code></td>
<td style="text-align:left">curseur</td></tr></tbody></table>]]></description><link>https://blog.noobtoroot.xyz/cheat-to-sheet-bash/</link><guid isPermaLink="false">629e4f7c72b6240001828b37</guid><category><![CDATA[Sheetcheat]]></category><category><![CDATA[Bash]]></category><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Bertrand Janvoie]]></dc:creator><pubDate>Tue, 24 May 2022 20:19:46 GMT</pubDate><media:content url="https://blog.noobtoroot.xyz/content/images/2022/05/cheatsheetbash2.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="raccourcis-clavier-du-terminal">Raccourcis clavier du terminal</h2>
<table>
<thead>
<tr>
<th style="text-align:center">Commandes</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>ctrl + l</code></td>
<td style="text-align:left">&#xE9;quivalent de <code>clear</code></td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + d</code></td>
<td style="text-align:left">&#xE9;quivalent de <code>exit</code></td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + r</code></td>
<td style="text-align:left">recherche dans l&apos;historique des commandes</td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + c</code></td>
<td style="text-align:left">stop l&apos;op&#xE9;ration en cours</td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + a</code></td>
<td style="text-align:left">curseur au d&#xE9;but de la ligne</td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + e</code></td>
<td style="text-align:left">curseur &#xE0; la fin de la ligne</td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + u</code></td>
<td style="text-align:left">supprime &#xE0; gauche du curseur</td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + k</code></td>
<td style="text-align:left">supprime &#xE0; droite du curseur</td>
</tr>
<tr>
<td style="text-align:center"><code>ctrl + w</code></td>
<td style="text-align:left">supprime le mot &#xE0; gauche du curseur</td>
</tr>
</tbody>
</table>
<h2 id="commandes-de-terminal-basique">Commandes de terminal basique</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">Arguments/Details</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>ls</code></td>
<td style="text-align:left">liste les fichier d&apos;un dossier</td>
<td style="text-align:left"><code>-a</code> <em>all</em> fichier cach&#xE9;s; <code>-l</code> liste detaill&#xE9;; <code>-h</code> <em>human readable</em>; <code>-R</code> <em>recursive</em></td>
</tr>
<tr>
<td style="text-align:left"><code>cd</code></td>
<td style="text-align:left"><em>&quot;change directory&quot;</em> naviguer entre r&#xE9;pertoire</td>
<td style="text-align:left"><code>cd ~</code> home; <code>cd /</code> root; <code>cd /chemin/de/mon/dossier</code>; <code>cd ..</code> dossier parent</td>
</tr>
<tr>
<td style="text-align:left"><code>du</code></td>
<td style="text-align:left"><em>&quot;disk usage&quot;</em> pr&#xE9;cise l&apos;espace disque</td>
<td style="text-align:left"><code>-h</code> human readable; <code>-d [x]</code> niveau de sous dossier; <code>-a</code> fichiers; <code>-s</code> taille seulement</td>
</tr>
<tr>
<td style="text-align:left"><code>pwd</code></td>
<td style="text-align:left"><em>&quot;print working directory&quot;</em> affiche le chemin absolu du dossier courant</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>ssh</code></td>
<td style="text-align:left"><em>&quot;secure shell&quot;</em> se connecter &#xE0; un shell distant</td>
<td style="text-align:left"><code>ssh login@ip</code> ou <code>ssh nom d&apos;hote</code>; <code>-D [x]</code> redirige vers un port pr&#xE9;difini</td>
</tr>
<tr>
<td style="text-align:left"><code>for</code></td>
<td style="text-align:left">instruction de boucle</td>
<td style="text-align:left"><code>for [x] in [x] do [x] done</code></td>
</tr>
<tr>
<td style="text-align:left"><code>man</code></td>
<td style="text-align:left"><em>&quot;manuel&quot;</em> affiche le manuel</td>
<td style="text-align:left"><code>man [cmd]</code></td>
</tr>
<tr>
<td style="text-align:left"><code>!!</code></td>
<td style="text-align:left">relancer la derni&#xE8;re commande</td>
<td style="text-align:left"></td>
</tr>
</tbody>
</table>
<h2 id="op%C3%A9rations-sur-les-fichiers">Op&#xE9;rations sur les fichiers</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">Arguments/Details</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>cat</code></td>
<td style="text-align:left">lire le contenu d&apos;un fichier</td>
<td style="text-align:left"><code>cat monfichier.txt</code></td>
</tr>
<tr>
<td style="text-align:left"><code>less</code></td>
<td style="text-align:left">similaire &#xE0; cat mais affiche page par page</td>
<td style="text-align:left"><code>less monfichier.txt</code></td>
</tr>
<tr>
<td style="text-align:left"><code>head</code></td>
<td style="text-align:left">affiche l&apos;ent&#xEA;te d&apos;un fichier</td>
<td style="text-align:left"><code>-n [x]</code> nb de lignes</td>
</tr>
<tr>
<td style="text-align:left"><code>tail</code></td>
<td style="text-align:left">affiche la queue du fichier</td>
<td style="text-align:left"><code>n [x]</code> nb de lignes; <code>-f</code> <em>follow</em> actualise en temps r&#xE9;el</td>
</tr>
<tr>
<td style="text-align:left"><code>touch</code></td>
<td style="text-align:left">cr&#xE9;er ou horodate un fichier</td>
<td style="text-align:left"><code>touch monfichier.txt</code></td>
</tr>
<tr>
<td style="text-align:left"><code>mkdir</code></td>
<td style="text-align:left"><em>make directory</em>, cr&#xE9;er un nouveau dossier</td>
<td style="text-align:left"><code>mkdir nom_du_dossier</code></td>
</tr>
<tr>
<td style="text-align:left"><code>cp</code></td>
<td style="text-align:left"><em>&quot;copy&quot;</em> copie d&apos;un fichier</td>
<td style="text-align:left"><code>cp fichier_original copie_du_fichier</code>; <code>-R</code> <em>recursive</em> copie des dossier entiers</td>
</tr>
<tr>
<td style="text-align:left"><code>mv</code></td>
<td style="text-align:left"><em>&quot;move&quot;</em> deplacer fichiers/dossier + renomme</td>
<td style="text-align:left"><code>mv fichier.txt /chemin/destination</code> deplace; <code>mv fichier.txt fichier2.txt</code> renomme</td>
</tr>
<tr>
<td style="text-align:left"><code>rm</code></td>
<td style="text-align:left"><em>&quot;remove&quot;</em> supprime un fichier</td>
<td style="text-align:left"><code>rm fichier.txt</code>; <code>-i</code> confirmation; <code>-f</code> force; <code>-r</code> dossier</td>
</tr>
<tr>
<td style="text-align:left"><code>ln</code></td>
<td style="text-align:left"><em>&quot;link&quot;</em> cr&#xE9;er un lien</td>
<td style="text-align:left"><code>ln fichier1 fichier2</code>; <code>-s</code> lien symbolique</td>
</tr>
<tr>
<td style="text-align:left"><code>wc</code></td>
<td style="text-align:left"><em>&quot;word count&quot;</em> compter mots, ligne, caract&#xE8;res</td>
<td style="text-align:left"><code>-l</code> lignes; <code>-w</code> words; <code>-m</code> lettres; <code>-c</code> taille fichier en bits</td>
</tr>
</tbody>
</table>
<h2 id="recherche-de-fichiersdossiers">Recherche de fichier(s)/dossier(s)</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">Arguments/Details</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>locate</code></td>
<td style="text-align:left">recherche le contenu de tous les fichiers</td>
<td style="text-align:left"><code>locate [text/filename]</code></td>
</tr>
<tr>
<td style="text-align:left"><code>sudo updatedb</code></td>
<td style="text-align:left">met &#xE0; jour la base de donn&#xE9;e des fichier</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>find</code></td>
<td style="text-align:left">recherche le contenu de tous les fichiers</td>
<td style="text-align:left"><code>find -name &quot;[filename]&quot;</code>; <code>-size</code> <code>+</code>/<code>-</code> <code>[x]</code> <code>M</code>/<code>K</code>/<code>G</code> taille; <code>-atime</code> <code>-</code>/<code>+</code>/<code>=[x] </code> derni&#xE8;re acc&#xE8;s; <code>type</code> <code>-d</code>/<code>-f</code> directory/files; <code>exec [cmd] {} \;</code> execute la [cmd] sur les fichiers trouv&#xE9;s</td>
</tr>
<tr>
<td style="text-align:left"><code>find [path]</code></td>
<td style="text-align:left">recherche dans un chemin d&#xE9;finis</td>
<td style="text-align:left"></td>
</tr>
</tbody>
</table>
<h2 id="expression-r%C3%A9guli%C3%A8re">Expression r&#xE9;guli&#xE8;re</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">Exemple</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>^</code></td>
<td style="text-align:left">debut de ligne</td>
<td style="text-align:left"><code>^toto</code> <strong>toto</strong> est &#xE0; la maison</td>
</tr>
<tr>
<td style="text-align:left"><code>$</code></td>
<td style="text-align:left">fin de ligne</td>
<td style="text-align:left"><code>tata$</code> demande &#xE0; <strong>tata</strong></td>
</tr>
<tr>
<td style="text-align:left"><code>.</code></td>
<td style="text-align:left">caract&#xE8;re quelconque</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>[liste_de_caract&#xE8;res]</code></td>
<td style="text-align:left">caract&#xE8;re cit&#xE9; dans la liste</td>
<td style="text-align:left"><code>[AB]</code> contient A ou B; <code>[A-Z]</code> contient un caract&#xE8;re entre A et Z; <code>[0-9]</code> entre 0 et 9;</td>
</tr>
<tr>
<td style="text-align:left"><code>[^liste_de_caract&#xE8;res]</code></td>
<td style="text-align:left">caract&#xE8;re qui n&apos;est pas cit&#xE9; dans la liste</td>
<td style="text-align:left"><code>[^A-D]</code> ne contient pas de caract&#xE8;re entre A et D</td>
</tr>
<tr>
<td style="text-align:left"><code>*</code></td>
<td style="text-align:left">0 &#xE0; n fois le caract&#xE8;re pr&#xE9;cedant</td>
<td style="text-align:left"><code>A*</code>AAAA</td>
</tr>
<tr>
<td style="text-align:left"><code>/&lt;expression</code></td>
<td style="text-align:left">d&#xE9;but d&apos;un mot</td>
<td style="text-align:left"><code>/&lt;config</code> <strong>config</strong>uration</td>
</tr>
<tr>
<td style="text-align:left"><code>expression&gt;/</code></td>
<td style="text-align:left">fin d&apos;un mot</td>
<td style="text-align:left"><code>tion&gt;/</code> configura<strong>tion</strong></td>
</tr>
<tr>
<td style="text-align:left"><code>\</code></td>
<td style="text-align:left">emp&#xEA;che l&apos;interpr&#xE9;tation sp&#xE9;cial d&apos;un meta caract&#xE8;re</td>
<td style="text-align:left"><code>\.</code> point</td>
</tr>
</tbody>
</table>
<h2 id="extraction-classement-et-filtre-de-la-donn%C3%A9e">Extraction, classement et filtre de la donn&#xE9;e</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">Arguments/Details</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>grep</code></td>
<td style="text-align:left">filtre</td>
<td style="text-align:left"><code>grep [text]</code>; <code>-c</code> nb de lignes; <code>-i</code> pas de diff&#xE9;rence maj/min; <code>-n</code> num&#xE9;ro de ligne; <code>-l</code> nom du fichier;<code>-v</code> affiche ligne qui <strong>ne contient pas</strong></td>
</tr>
<tr>
<td style="text-align:left"><code>grep [text] [filename]</code></td>
<td style="text-align:left">cherche du texte dans un fichier</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>grep -r [text] [foldername]/</code></td>
<td style="text-align:left">cherche les occurences dans un dossier</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>sort</code></td>
<td style="text-align:left">classe les fichier par ordre alphab&#xE9;tique</td>
<td style="text-align:left"><code>sort [filename]</code>; <code>-o [file] [output file]</code> &#xE9;crit le r&#xE9;sultat dans un fichier; <code>-r</code> <em>reverse</em>; <code>-R</code> <em>Randomly</em>; <code>-n</code> <em>number</em></td>
</tr>
<tr>
<td style="text-align:left"><code>cut</code></td>
<td style="text-align:left">couper dans un fichier texte</td>
<td style="text-align:left"><code>-c [x]</code> nombre de charact&#xE8;res;  <code>-d [y]</code> d&#xE9;limitateur ex: &quot;;&quot; et <code>-f [x]</code> champs</td>
</tr>
</tbody>
</table>
<h2 id="programme-en-arri%C3%A8re-plan">Programme en arri&#xE8;re-plan</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">Arguments/Details</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>&amp;</code></td>
<td style="text-align:left">ex&#xE9;cute le programme en arri&#xE8;re plan</td>
<td style="text-align:left"><code>cp exemple.txt /r&#xE9;pertoire &amp;</code></td>
</tr>
<tr>
<td style="text-align:left"><code>nohup</code></td>
<td style="text-align:left">laisse le programme tourner m&#xEA;me lorsque l&apos;on ferme la console</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>jobs</code></td>
<td style="text-align:left">montre les programmes qui tournent en arri&#xE8;re plan</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>fg</code></td>
<td style="text-align:left"><em>&quot;forground&quot;</em> met le programme en arri&#xE8;re plan au premier plan</td>
<td style="text-align:left"><code>fg</code> processus 1; <code>fg%2</code> processus 2; etc...</td>
</tr>
</tbody>
</table>
<h2 id="gestion-des-processus">Gestion des processus</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">Arguments/Details</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>w</code></td>
<td style="text-align:left">qui est connect&#xE9; et que fait-il?</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>tload</code></td>
<td style="text-align:left">repr&#xE9;sentation graphique de la consommation</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>ps</code></td>
<td style="text-align:left">affiche les processus visible</td>
<td style="text-align:left"><code>-e</code> en arri&#xE8;re plan; <code>-H</code> hierarchie; <code>-u</code> utilisateur courant</td>
</tr>
<tr>
<td style="text-align:left"><code>top</code></td>
<td style="text-align:left">Liste dynamique des processus</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>htop</code></td>
<td style="text-align:left">Alternative - Liste dynamique des processus</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>kill</code></td>
<td style="text-align:left">tue le processus</td>
<td style="text-align:left"><code>kill [PID]</code></td>
</tr>
<tr>
<td style="text-align:left"><code>killall</code></td>
<td style="text-align:left">tue de multiples processus</td>
<td style="text-align:left"></td>
</tr>
</tbody>
</table>
<h2 id="permission-des-fichiersdossiers">Permission des fichiers/dossiers</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">Arguments/Details</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>chmod</code></td>
<td style="text-align:left">changer les permissions lecture, ecriture execution pour le user, group et invit&#xE9;</td>
<td style="text-align:left"><code>chmod [qui]+[permission]</code> = <code>u</code> user,<code>g</code> group,<code>o</code> other,<code>a</code> all <code>+</code>/<code>-</code> <code>r</code> read, <code>w</code> write, <code>x</code> execution ; <code>chmod u+x</code></td>
</tr>
<tr>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"><code>chmod 777</code> = User/groupe/other r(4) w(2) x(1) ex: <code>chmod 754 fichier.txt</code> = user peut RWX, group peut RW et other peut R</td>
</tr>
<tr>
<td style="text-align:left"><code>chown</code></td>
<td style="text-align:left">change le propri&#xE9;taire</td>
<td style="text-align:left"><code>chown bertrand:bob fichier.txt</code>; <code>-R</code> <em>recursive</em></td>
</tr>
</tbody>
</table>
<h2 id="gestion-des-utilisateurs-et-groupes">Gestion des utilisateurs et groupes</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">Arguments/Details</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>sudo adduser</code></td>
<td style="text-align:left">ajoute un utilisateur</td>
<td style="text-align:left"><code>sudo adduser toto</code></td>
</tr>
<tr>
<td style="text-align:left"><code>sudo passwd [username]</code></td>
<td style="text-align:left">change le mot de passe d&apos;un utilisateur</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left"><code>sudo deluser [username]</code></td>
<td style="text-align:left">supprime l&apos;utilisateur</td>
<td style="text-align:left"><code>sudo deluser toto</code></td>
</tr>
<tr>
<td style="text-align:left"><code>addgroup [name]</code></td>
<td style="text-align:left">cr&#xE9;er un groupe</td>
<td style="text-align:left"><code>addgroupe admin</code></td>
</tr>
<tr>
<td style="text-align:left"><code>delgroup [name] </code></td>
<td style="text-align:left">supprime le groupe</td>
<td style="text-align:left"><code>delgroup admin</code></td>
</tr>
<tr>
<td style="text-align:left"><code>usermod -g [group] [user]</code></td>
<td style="text-align:left">ajouter un utilisateur au groupe</td>
<td style="text-align:left"><code>usermod -g admin toto</code></td>
</tr>
<tr>
<td style="text-align:left"><code>usermod -g [username] [username]</code></td>
<td style="text-align:left">changer le nom d&apos;utilisateur</td>
<td style="text-align:left"><code>usermod -g toto tata</code></td>
</tr>
<tr>
<td style="text-align:left"><code>usermod -Ag [group] [user]</code></td>
<td style="text-align:left">remplace l&apos;utilisateur dans le groupe si d&#xE9;j&#xE0; pr&#xE9;sent</td>
<td style="text-align:left"><code>usermod -Ag admin toto</code></td>
</tr>
</tbody>
</table>
<h2 id="flux-de-redirection">Flux de redirection</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>&gt;</code></td>
<td style="text-align:left">renvoie le r&#xE9;sultat dans un fichier cr&#xE9;e</td>
</tr>
<tr>
<td style="text-align:left"><code>&gt;&gt;</code></td>
<td style="text-align:left">renvoie &#xE0; la fin d&apos;un fichier</td>
</tr>
<tr>
<td style="text-align:left"><code>2&gt;</code></td>
<td style="text-align:left">cr&#xE9;er un fichier pour les erreurs</td>
</tr>
<tr>
<td style="text-align:left"><code>2&gt;&amp;1</code></td>
<td style="text-align:left">r&#xE9;dirige les erreur dans le fichier standard</td>
</tr>
<tr>
<td style="text-align:left">`</td>
<td style="text-align:left">`</td>
</tr>
</tbody>
</table>
<h2 id="gestion-des-services">Gestion des services</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">Arguments/Details</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>systemctl</code></td>
<td style="text-align:left">affiche la liste des services et unit&#xE9;s</td>
<td style="text-align:left"><code>--type service </code> ; <code>start &lt;service&gt;</code> ; <code>stop &lt;service&gt;</code> ; <code>status &lt;service&gt;</code>; <code>restart &lt;service&gt;</code>; <code>reload &lt;service&gt;</code>; <code>kill &lt;service&gt;</code>; <code>is-active &lt;service&gt;</code>; <code>edit &lt;service&gt;</code>;</td>
</tr>
</tbody>
</table>
<h2 id="nano">Nano</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Commandes</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Gestion du fichier</strong></td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Ctrl+S</td>
<td style="text-align:left">Sauvegarder le fichier</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+X</td>
<td style="text-align:left">Quitter et sauvegarder Y/N</td>
</tr>
<tr>
<td style="text-align:left"><strong>Edition</strong></td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Ctrl+K</td>
<td style="text-align:left">Couper la ligne</td>
</tr>
<tr>
<td style="text-align:left">Alt+6</td>
<td style="text-align:left">Copier la ligne</td>
</tr>
<tr>
<td style="text-align:left">Alt+t</td>
<td style="text-align:left">Couper jusqu&apos;&#xE0; la fin</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+U</td>
<td style="text-align:left">Coller</td>
</tr>
<tr>
<td style="text-align:left">Alt+U</td>
<td style="text-align:left">Undo</td>
</tr>
<tr>
<td style="text-align:left">Alt+E</td>
<td style="text-align:left">Redo</td>
</tr>
<tr>
<td style="text-align:left">Alt+3</td>
<td style="text-align:left">Commenter/Decommenter la ligne</td>
</tr>
<tr>
<td style="text-align:left"><strong>Rechcher</strong></td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Ctrl+Q</td>
<td style="text-align:left">Recherche avant</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+W</td>
<td style="text-align:left">Recherche apr&#xE8;s</td>
</tr>
<tr>
<td style="text-align:left">Alt+Q</td>
<td style="text-align:left">Occurence suivante</td>
</tr>
<tr>
<td style="text-align:left">Alt+W</td>
<td style="text-align:left">Occurence pr&#xE9;cedente</td>
</tr>
<tr>
<td style="text-align:left">Alt+R</td>
<td style="text-align:left">Prochaine occurence</td>
</tr>
<tr>
<td style="text-align:left"><strong>Suppression</strong></td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Ctrl+H</td>
<td style="text-align:left">Supprimer avant le curseur</td>
</tr>
<tr>
<td style="text-align:left">Ctrl+D</td>
<td style="text-align:left">Supprimer apr&#xE8;s le curseur</td>
</tr>
<tr>
<td style="text-align:left">Alt+Del</td>
<td style="text-align:left">Supprimer la ligne</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Cheat to Sheet - Java]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="les-variables"><strong>LES VARIABLES</strong></h2>
<pre><code class="language-java">// --------- TYPES NUMERIQUES ------------- //

    byte temperature; // -128 +127
     temperature = 64;

    short vitesseMax; // -32768 +32767
    vitesseMax = 32000;

    int temperatureSoleil; // -2*109 +2*109
    temperatureSoleil = 15600000; // kelvins
    
    long anneeLumiere; // -9*10^18 +9*10^18
    anneeLumiere = 9460700000000000L; // L &#xE0; la fin
    
    float pi;
    pi = 3.141592653f;
    
    float nombre; // Nombre rond</code></pre>]]></description><link>https://blog.noobtoroot.xyz/cheat-to-sheet-java-1/</link><guid isPermaLink="false">629e4f7c72b6240001828b32</guid><category><![CDATA[Sheetcheat]]></category><category><![CDATA[Java]]></category><category><![CDATA[Markdown]]></category><category><![CDATA[NoobtoRoot]]></category><dc:creator><![CDATA[Bertrand Janvoie]]></dc:creator><pubDate>Sat, 21 May 2022 18:39:46 GMT</pubDate><media:content url="https://blog.noobtoroot.xyz/content/images/2022/05/cheatsheetjava-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="les-variables"><strong>LES VARIABLES</strong></h2>
<pre><code class="language-java">// --------- TYPES NUMERIQUES ------------- //

    byte temperature; // -128 +127
     temperature = 64;

    short vitesseMax; // -32768 +32767
    vitesseMax = 32000;

    int temperatureSoleil; // -2*109 +2*109
    temperatureSoleil = 15600000; // kelvins
    
    long anneeLumiere; // -9*10^18 +9*10^18
    anneeLumiere = 9460700000000000L; // L &#xE0; la fin
    
    float pi;
    pi = 3.141592653f;
    
    float nombre; // Nombre rond = x.Of 
    nombre = 2.0f;
    
    double division; // Pareil que Float, sauf que + de chiffres apr&#xE8;s la virgule
    division = 0.333333333333333333333333333333333333333333334d;

// --------- TYPES CARACTERE ------------- //

    char caractere;
    caractere = &apos;A&apos;;

// --------- TYPES BOOLEEN ------------- //
    
    boolean question;
    question = true;

// --------- TYPES STRING ------------- //  

    String phrase;
    phrase = &quot;Titi et Grosminet&quot;;
    // OU 
    String str = new String();
    str = &quot;Une autre cha&#xEE;ne de caract&#xE8;res&quot;;
    // OU
    String string = &quot;Une autre cha&#xEE;ne&quot;;
    // OU
    String chaine = new String(&quot;Et une de plus !&quot;);

// --------------------- CONVERSION ------------------------------ // 
		
    int i = 123;
    float j = (float)i;
    
    int a = 123;
    double b = (double)i;
    
    double c = 1.23;
    double d = 2.9999999;
    int k = (int)c;        //k vaut 1
    k = (int)d;            //k vaut 2
		
// ------------------------------------------------------ //
// ----------------- ENTREE CLAVIER --------------------- //
// ------------------------------------------------------ //
		
    Scanner sc = new Scanner(System.in);
    System.out.println(&quot;Veuillez saisir un mot :&quot;);
    String saisi = sc.nextLine();
    System.out.println(&quot;Vous avez saisi : &quot; + saisi);

    Scanner test = new Scanner(System.in);
    int a1 = sc.nextInt();
    double b1 = sc.nextDouble();
    long c1 = sc.nextLong();
    byte d1 = sc.nextByte();
    //Etc.

</code></pre>
<hr>
<h2 id="les-conditions"><strong>LES CONDITIONS</strong></h2>
<pre><code class="language-Java">// --------------------------------------------------- //	 
// ------------------ OPERATEURS --------------------- //	
// --------------------------------------------------- //
	
    &#xAB; == &#xBB; : permet de tester l&apos;&#xE9;galit&#xE9;.

    &#xAB; != &#xBB; : permet de tester l&#x2019;in&#xE9;galit&#xE9;.

    &#xAB; &lt; &#xBB; : strictement inf&#xE9;rieur.

    &#xAB; &lt;= &#xBB; : inf&#xE9;rieur ou &#xE9;gal.

    &#xAB; &gt; &#xBB; : strictement sup&#xE9;rieur.

    &#xAB; &gt;= &#xBB; : sup&#xE9;rieur ou &#xE9;gal.

    &#xAB; &amp;&amp; &#xBB; : l&apos;op&#xE9;rateur ET. Il permet de pr&#xE9;ciser une condition

    &#xAB; || &#xBB; : le OU. M&#xEA;me combat que le pr&#xE9;c&#xE9;dent.

    &#xAB;  ? : &#xBB; : l&apos;op&#xE9;rateur ternaire. Pour celui-ci, vous comprendrez mieux avec un exemple qui sera donn&#xE9; vers la fin de ce chapitre.
</code></pre>
<pre><code class="language-Java">// --------------------------------------------------- //	 
// ------------------ CONDITIONS --------------------- //	
// --------------------------------------------------- //	 

// -------- IF &gt; ELSE || IF &gt; ELSE IF &gt; ELSE ----------//

if(condition)
	{
//Ex&#xE9;cution des instructions si la condition est remplie
	}
else
	{
//Ex&#xE9;cution des instructions si la condition n&apos;est pas remplie
	}
	
int i = 0; // Initialisaton de i &#xE0; 0
    
if (i &lt; 0)      // Si i inf&#xE9;rieur &#xE0; 0
	System.out.println(&quot;Ce nombre est n&#xE9;gatif !&quot;);      
		  
else if(i &gt; 0)  // Sinon si i sup&#xE9;rieur &#xE0; 0
	System.out.println(&quot;Ce nombre est positif !&quot;);           
		 
else            // Sinon 
	System.out.println(&quot;Ce nombre est nul !&quot;);
	
// IF AVEC OPERATEURS
		
int j = 58;
if(j &gt; 50 &amp;&amp; j &lt; 100) 
	System.out.println(&quot;Le nombre est bien dans l&apos;intervalle.&quot;);
else
	System.out.println(&quot;Le nombre n&apos;est pas dans l&apos;intervalle.&quot;);
	
		
// --------------------- SWITCH --------------------//
	
int note = 0; //On imagine que la note maximale est 20
switch (note)
	{
	case 0:
		System.out.println(&quot;Ouch !&quot;);
	break;
	case 10:
		System.out.println(&quot;Vous avez juste la moyenne.&quot;);
	break;
	case 20:
		System.out.println(&quot;Parfait !&quot;);
	break;
	default:
		System.out.println(&quot;Il faut davantage travailler.&quot;);
	}
	
String chaine = &quot;Bonjour&quot;;
switch(chaine)
        {
	case &quot;Bonjour&quot;:
	    System.out.println(&quot;Bonjour monsieur !&quot;);
	break;
	case &quot;Bonsoir&quot;:
		System.out.println(&quot;Bonsoir monsieur !&quot;);
	break;
	default:
		System.out.println(&quot;Bonjoir ! :p&quot;);
	}
	
// ---------- CONDITION TERNAIRE ---------------- //
		
	int x = 10, y = 20;
	int max = (x &lt; y) ? y : x ; //Maintenant, max vaut 20
    // Si condition renvoie true, la condition &quot;? y&quot; est affect&#xE9;e, sinon, &quot;: x&quot; est affect&#xE9;e.
</code></pre>
<hr>
<h2 id="les-boucles"><strong>LES BOUCLES</strong></h2>
<pre><code class="language-java">//-------------------------------------------------------------------------------//
//------------------------------ WHILE ------------------------------------------//
//-------------------------------------------------------------------------------//
		

    String prenom;          // Une variable vide
    char reponse = &apos;O&apos;;     // On initialise celle-ci &#xE0; O pour oui

    Scanner sc = new Scanner(System.in);    // Notre objet Scanner, n&apos;oubliez pas l&apos;import de java.util.Scanner !
    while (reponse == &apos;O&apos;)                  // Tant que la r&#xE9;ponse donn&#xE9;e est &#xE9;gale &#xE0; oui&#x2026;
	    {
	    System.out.println(&quot;Donnez un pr&#xE9;nom : &quot;);                          // On affiche une instruction
	    prenom = sc.nextLine();                                             // On r&#xE9;cup&#xE8;re le pr&#xE9;nom saisi
            System.out.println(&quot;Bonjour &quot; +prenom+ &quot;, comment vas-tu ?&quot;);       // On affiche notre phrase avec le pr&#xE9;nom
            System.out.println(&quot;Voulez-vous r&#xE9;essayer ? (O/N)&quot;);	        // On demande si la personne veut faire un autre essai
            reponse = sc.nextLine().charAt(0);                                  // On r&#xE9;cup&#xE8;re la r&#xE9;ponse de l&apos;utilisateur
	    }
    System.out.println(&quot;Au revoir&#x2026;&quot;);
		
// Fin de la boucle
// On peut observer dans cette exemple que si l&apos;on ne rentre pas &quot;O&quot; pour oui, celui ci sort de la boucle
		
		
//----------------------------- WHILE IMBRIQUE ----------------------------------//
				
    String prenom;
    char reponse = &apos;O&apos;; // Besoin d&apos;initialiser pour rentrer dans la boucle
	
    Scanner sc = new Scanner(System.in);
	
    while (reponse == &apos;O&apos;)
        {
        System.out.println(&quot;Donnez un pr&#xE9;nom : &quot;);
        prenom = sc.nextLine();
        System.out.println(&quot;Bonjour &quot; +prenom+ &quot;, comment vas-tu ?&quot;);                        
		
        reponse = &apos; &apos;; // Sans &#xE7;a, nous n&apos;entrerions pas dans la deuxi&#xE8;me boucle
		    
        while(reponse != &apos;O&apos; &amp;&amp; reponse != &apos;N&apos;) // Tant que la r&#xE9;ponse n&apos;est pas O ou N, on repose la question
            {
            System.out.println(&quot;Voulez-vous r&#xE9;essayer ? (O/N)&quot;); // On demande si la personne veut faire un autre essai
            reponse = sc.nextLine().charAt(0);
            }  
        }
    System.out.println(&quot;Au revoir&#x2026;&quot;);
		
// On peut utiliser la boucle DO... While (); pour ne pas avoir &#xE0; reinitialiser r&#xE9;ponse1. 
		
//-------------------------------------------------------------------------------//
//----------------------------------DO WHILE-------------------------------------//
//-------------------------------------------------------------------------------//
		
    String prenom = new String();
    char reponse = &apos; &apos;; //Pas besoin d&apos;initialiser : on entre au moins une fois dans la boucle !

    Scanner sc = new Scanner(System.in);
		 
    do{ // FAIT BOUCLE 1 (entr&#xE9;e dans la premi&#xE8;re boucle)
        System.out.println(&quot;Donnez un pr&#xE9;nom : &quot;);
        prenom = sc.nextLine();
        System.out.println(&quot;Bonjour &quot; +prenom+ &quot;, comment vas-tu ?&quot;);
		       
        do{ // FAIT BOUCLE 2 (entr&#xE9;e dans la deuxieme boucle)
            System.out.println(&quot;Voulez-vous r&#xE9;essayer ? (O/N)&quot;);
            reponse = sc.nextLine().charAt(0);
        }while(reponse != &apos;O&apos; &amp;&amp; reponse != &apos;N&apos;); // TANT QUE BOUCLE 2 (fin de la deuxieme boucle)
    
    }while (reponse == &apos;O&apos;); // TANT QUE BOUCLE 1 (fin de la premi&#xE8;re boucle)
    System.out.println(&quot;Au revoir&#x2026;&quot;);
		
//-------------------------------------------------------------------------------//
//-------------------------------------FOR---------------------------------------//
//-------------------------------------------------------------------------------//	
		
    for(int i = 0, j = 2; (i &lt; 10 &amp;&amp; j &lt; 6); i++, j+=2){ // Pour i = 0 et j = 2, tant que i &lt; 10 et j &gt; 6 alors, i+1 et J+2 
	     System.out.println(&quot;i = &quot; + i + &quot;, j = &quot; + j);
		}
		
//-------------------------------------------------------------------------------//
//----------------------------PRIORITE OPERATEUR---------------------------------//
//-------------------------------------------------------------------------------//
    int a = 1, b = 15;
    while (a++ &lt; b)
        System.out.println(&quot;coucou &quot; +a+ &quot; fois !!&quot;); // Affiche 15 fois &quot;coucou x fois!&quot;
	
    System.out.println(&quot;FIN&quot;); 
		
    int c = 1, d = 15;
    while (++c &lt; d)
        System.out.println(&quot;coucou &quot; +c+ &quot; fois !!&quot;); // Affiche 14 fois &quot;coucou x fois!&quot;
		
// a &lt; b &#xE0; la priorit&#xE9; sur l&apos;op&#xE9;rateur a++ 
// ++c &#xE0; la priorit&#xE9; sur l&apos;op&#xE9;rateur c &lt; d 
</code></pre>
<hr>
<h2 id="les-tableaux"><strong>LES TABLEAUX</strong></h2>
<pre><code class="language-java">
int tableauEntier[] = {0,1,2,3,4,5,6,7,8,9};
double tableauDouble[] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0};
int tableauEntier1[] = new int[6]; // Tableau vide
//Ou encore
int[] tableauEntier2 = new int[6];
String tableauChaine[] = {&quot;chaine1&quot;, &quot;chaine2&quot;, &quot;chaine3&quot; , &quot;chaine4&quot;};

// -------------------------------------------------------------- // 

char tableauCaractere[] = {&apos;a&apos;,&apos;b&apos;,&apos;c&apos;,&apos;d&apos;,&apos;e&apos;,&apos;f&apos;,&apos;g&apos;};
		
    for(int i = 0; i &lt; tableauCaractere.length; i++)
        {
        System.out.println(&quot;&#xC0; l&apos;emplacement &quot; + i +&quot; du tableau nous avons = &quot; + tableauCaractere[i]);
        }
		
// -------------------------------------------------------------- // 
		
int premiersNombres[][] = { {0,2,4,6,8},{1,3,5,7,9} }, i = 0, j = 0;
// premiersNombres [0][2] = 4 
// premiersNombres [1][1] = 3 
		
System.out.println(&quot;La valeur du tableau est &quot; + premiersNombres[0][2]+&quot;.&quot;);
			       
    while (i &lt; 2) //P1// i = [O] //P2// i = [1]
        {
        j = 0; 
        while(j &lt; 5) //P1// [i][j] = [0][0,1,2,3,4] //P2// [i][j] = [1][0,1,2,3,4]
            {
            System.out.print(premiersNombres[i][j]); //P1// 02468 //P2// 13579
            j++; 
            }
        System.out.println(&quot;&quot;);
        i++;
        }
		
// Pareil avec for
for(int i = 0; i &lt; 2; i++)
    {    
    for(int j = 0; j &lt; 5; j++)
        {
        System.out.print(premiersNombres[i][j]);       
        }
    System.out.println(&quot;&quot;);     
    }
		
// -------------------------------------------------------------- // 
		
String tab[] = {&quot;toto&quot;, &quot;titi&quot;, &quot;tutu&quot;, &quot;tete&quot;, &quot;tata&quot;};
	 
    for(String str : tab)
        System.out.println(str);
		
		
String tab[][]={{&quot;toto&quot;, &quot;titi&quot;, &quot;tutu&quot;, &quot;tete&quot;, &quot;tata&quot;}, {&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;}};
int i = 0, j = 0;
		 
    for(String sousTab[] : tab) // La valeur de tab est mise dans sousTab
        {
        j = 0;
        for(String str : sousTab)
            {     
            System.out.println(&quot;La valeur de la nouvelle boucle est  : &quot; + str);
            System.out.println(&quot;La valeur du tableau &#xE0; l&apos;indice [&quot;+i+&quot;][&quot;+j+&quot;] est : &quot; + tab1[i][j]);
            j++;
            }
        i++;
</code></pre>
<hr>
<h2 id="les-methodes"><strong>LES METHODES</strong></h2>
<img src="https://blog.noobtoroot.xyz/content/images/2022/05/cheatsheetjava-1.png" alt="Cheat to Sheet - Java"><p>Par convention, les m&#xE9;todes s&apos;ecrive avec un miniscule au d&#xE9;part, et majuscule ensuite, ex: getDate<br>
On peut appeler une m&#xE9;thode d&apos;instance pour un objet instanci&#xE9; d&apos;une classe.<br>
ex:</p>
<pre><code class="language-java">Voiture voiture1 = new Voiture();   // (Cr&#xE9;ation d&apos;une instance de la classe Voiture)
voiture1.getCouleur                 // On appelle la m&#xE9;thode getCouleur (qui est aussi un accesseur)
</code></pre>
<pre><code class="language-java">public static int somme(int nombre1, int nombre2) //somme est une m&#xE9;thode
{return (nombre1 + nombre2);
}
</code></pre>
<h2 id="la-portee"><strong>LA PORTEE</strong></h2>
<ul>
<li>Aucun mot cle: accessible par les classes du m&#xEA;me paquetage ou package.</li>
<li>Public: accessible par toutes les classes.</li>
<li>Protected: accessibles par toutes les classes h&#xE9;rit&#xE9;es et les classes du m&#xEA;me paquetage, inaccessible aux autres.</li>
<li>Private: inaccessible par toutes les autres classes.</li>
<li>Static:</li>
<li>Abstract:</li>
</ul>
<h2 id="classes-et-objets"><strong>CLASSES ET OBJETS</strong></h2>
<p>Par conventions les classes ont une majuscules.</p>
<p>Les variables de classes sont inchangeable, d&apos;ou le <strong>static</strong>.</p>
<pre><code class="language-java">public class Point{

    public static double dimension = 2;     //VARIABLE DE CLASSE
    private double x;                       //VARIABLE D&apos;INSTANCE
    private double y;                       //VARIABLE D&apos;INSTANCE

    public Point(){                         //CONSTRUCTEUR PAR DEFAULT
        this(0,0);
    }

    public Point(double x, double y){       //CONSTRUCTEUR AVEC ARGUMENT
        this.setX(x);
        this.setY(y);
    }

    public double getX(){                   //ACCESSEURS X (METHODE)
        return this.x;
    }
    public double setX(double x){           //Point.setX(3) donne x = 3
        this.x = x; 
    }
     public double getY(){                   //ACCESSEURS Y (METHODE)
        return this.x;
    }
    public double setY(double y){           //Point.setY(6) donne y = 6
        this.y = y; 
    }
}</code></pre>
<!--kg-card-end: markdown--><hr><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.noobtoroot.xyz/cheat-to-sheet/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cheat to Sheet - Summary</div><div class="kg-bookmark-description">Cheat to Sheet - Java #1JAVA LES VARIABLES // --------- TYPES NUMERIQUES ------------- // byte temperature; // -128 +127 temperature &amp;#x3D; 64; short vitesseMax; // -32768 +32767 vitesseMax &amp;#x3D; 32000; int temperatureSoleil; // -2*109 +2*109 temperatureSoleil &amp;#x3D; 15600000; // kelvins long annee&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.noobtoroot.xyz/favicon.png" alt="Cheat to Sheet - Java"><span class="kg-bookmark-author">Noob to Root</span><span class="kg-bookmark-publisher">Bertrand jve</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/cheatsheet-4.png" alt="Cheat to Sheet - Java"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Raspberry pi to Web server]]></title><description><![CDATA[<p>Si vous faites preuve d&apos;un sacr&#xE9; sens de l&apos;observation (indice: le nom de l&apos;article &#x1F643;) vous pourriez vous doutez que ce site est auto-h&#xE9;berg&#xE9; non pas sur un serveur appartenant &#xE0; un tiers mais bien sur un Raspberry Pi, tranquillement</p>]]></description><link>https://blog.noobtoroot.xyz/rbpitows/</link><guid isPermaLink="false">629e4f7c72b6240001828b31</guid><category><![CDATA[Network]]></category><category><![CDATA[Reseau]]></category><category><![CDATA[Tuto]]></category><category><![CDATA[Raspberry Pi]]></category><category><![CDATA[Web Server]]></category><dc:creator><![CDATA[Bertrand Janvoie]]></dc:creator><pubDate>Fri, 20 May 2022 08:36:07 GMT</pubDate><media:content url="https://blog.noobtoroot.xyz/content/images/2022/05/banner-2-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.noobtoroot.xyz/content/images/2022/05/banner-2-1.png" alt="Raspberry pi to Web server"><p>Si vous faites preuve d&apos;un sacr&#xE9; sens de l&apos;observation (indice: le nom de l&apos;article &#x1F643;) vous pourriez vous doutez que ce site est auto-h&#xE9;berg&#xE9; non pas sur un serveur appartenant &#xE0; un tiers mais bien sur un Raspberry Pi, tranquillement branch&#xE9; &#xE0; ma box internet de la maison. <br>En attendant le jour o&#xF9; celui-ci implosera lorsque plus de 3 personnes essaieront de se connecter au m&#xEA;me moment sur ce site, je m&apos;en vais vous r&#xE9;diger un tutoriel sur comment h&#xE9;berger un serveur web sur un Raspberry Pi &#xE0; la maison. Bonne lecture!</p><!--kg-card-begin: markdown--><h2 id="pourquoi-un-raspberry-pi">Pourquoi un Raspberry Pi?</h2>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Le <b>Raspberry Pi</b> est un nano-ordinateur monocarte &#xE0; processeur ARM de la taille d&apos;une carte de cr&#xE9;dit.</div></div><p>Avant d&apos;entamer les hostilit&#xE9;s, il est selon moi important d&apos;expliquer en quelques mots les raisons qui justifient ce choix. Il s&apos;av&#xE8;re que je poss&#xE8;de des Raspberry Pi depuis fort longtemps.</p><p>En l&#x2019;occurrence, ma premi&#xE8;re exp&#xE9;rience avec un Raspberry Pi fut avec le mod&#xE8;le 1B commercialis&#xE9; en 2011. Celui-ci, glorieusement dot&#xE9; pour l&#x2019;&#xE9;poque de 512 Mo de RAM et d&apos;un CPU ARM cadenc&#xE9; &#xE0; 700Mhz me fut acquis apr&#xE8;s une longue bataille aupr&#xE8;s de ma g&#xE9;nitrice &#xE0; vanter les bienfaits et les possibilit&#xE9;s quasi illimit&#xE9;s que pouvait offrir un Raspberry Pi. La victoire me vint gr&#xE2;ce au projet de transformer le Raspberry Pi en serveur multim&#xE9;dia sous XBMC (aujourd&apos;hui renomm&#xE9; KODI) gr&#xE2;ce &#xE0; la distribution gnu/linux OpenElec. Le projet &#xE9;tait de pouvoir lire des films dans le salon depuis l&apos;unique PC familial directement depuis le r&#xE9;seau via le protocole UPnP (spoiler: celui-ci &#xE0; finit dans ma chambre).</p><figure class="kg-card kg-image-card"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/raw2-1.png" class="kg-image" alt="Raspberry pi to Web server" loading="lazy" width="1273" height="770" srcset="https://blog.noobtoroot.xyz/content/images/size/w600/2022/05/raw2-1.png 600w, https://blog.noobtoroot.xyz/content/images/size/w1000/2022/05/raw2-1.png 1000w, https://blog.noobtoroot.xyz/content/images/2022/05/raw2-1.png 1273w" sizes="(min-width: 720px) 720px"></figure><p>Seulement, avec l&#x2019;av&#xE8;nement des services de streaming, l&apos;id&#xE9;e d&apos;un serveur multim&#xE9;dia peut aujourd&apos;hui sembler anecdotique. Le Raspberry Pi a lentement mais surement commenc&#xE9; &#xE0; prendre la poussi&#xE8;re sous le meuble t&#xE9;l&#xE9;vision en attendant sagement une seconde vie.</p><p>Ma deuxi&#xE8;me exp&#xE9;rience avec un Raspberry Pi fut cette fois ci &#xE0; l&apos;aide d&apos;un Raspberry Pi mod&#xE8;le 3B commercialis&#xE9; en 2016 dot&#xE9; d&apos;un CPU quad c&#x153;ur cadenc&#xE9; &#xE0; 1,2Ghz et dot&#xE9; de 1Gb de RAM. Celui-ci fut impliqu&#xE9; dans diff&#xE9;rents projets d&apos;apprentissage notamment syst&#xE8;me, &#xE0; l&apos;aide de la distribution gnu/linux Raspbian, d&#xE9;riv&#xE9; de la tr&#xE8;s connu distribution Debian, mais &#xE9;galement dans des projets plus ax&#xE9;s r&#xE9;seaux avec l&apos;installation d&apos;OpenWRT, distribution gnu/linux historiquement con&#xE7;u pour remplacer le firmware de diff&#xE9;rents routeurs.</p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/Raspbian_2019.04_application_menu-1.jpg" width="1280" height="800" loading="lazy" alt="Raspberry pi to Web server" srcset="https://blog.noobtoroot.xyz/content/images/size/w600/2022/05/Raspbian_2019.04_application_menu-1.jpg 600w, https://blog.noobtoroot.xyz/content/images/size/w1000/2022/05/Raspbian_2019.04_application_menu-1.jpg 1000w, https://blog.noobtoroot.xyz/content/images/2022/05/Raspbian_2019.04_application_menu-1.jpg 1280w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/luci4ppp_1-1.jpg" width="968" height="596" loading="lazy" alt="Raspberry pi to Web server" srcset="https://blog.noobtoroot.xyz/content/images/size/w600/2022/05/luci4ppp_1-1.jpg 600w, https://blog.noobtoroot.xyz/content/images/2022/05/luci4ppp_1-1.jpg 968w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption><b>&#x25C4; Raspbian et OpenWRT &#x25BA;</b></figcaption></figure><p>Pour conclure cette partie, les Raspberry Pi sont de formidable outils qu&apos;il s&apos;agissent d&apos;apprendre ou pour des projets plus cons&#xE9;quents. Je vous invite donc vivement &#xE0; vous y int&#xE9;ressez plus amplement si vous ne connaissiez pas l&apos;existence de ces petites machines, les articles parlant des milles et une fa&#xE7;ons d&apos;exploiter son Raspberry Pi sont l&#xE9;gions sur internet.<br>De mon c&#xF4;t&#xE9;, l&apos;id&#xE9;e de r&#xE9;diger un blog &#xE9;tant un projet de longue date, coupl&#xE9; avec mon attrait naturel pour les syst&#xE8;mes et r&#xE9;seaux en font un support id&#xE9;al car peut consommateur d&apos;&#xE9;nergie pour en apprendre plus sur les serveur web, et une superbe occasion de m&#xEA;l&#xE9;e l&apos;utile &#xE0; l&apos;agr&#xE9;able.</p><!--kg-card-begin: markdown--><p><em>Petit disclaimer : le raspberry Pi est un micro-ordinateur, n&apos;esp&#xE9;rer donc pas pouvoir heberger un site web ayant le traffic du p&#xE9;riph&#xE9;rique de Paris en heure de pointe. Celui-ci imploserait sur place. Si vous comptez heberger une application web subissant de lourds traitement, je vous invite &#xE0; vous dirigez vers des services professionnels, ou d&apos;heberger votre solution sur un ordinateur d&#xE9;di&#xE9; ayant la puissance requise pour ce type de traitement.</em></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="pr%C3%A9-requis">Pr&#xE9;-requis:</h2>
<ul>
<li>Un Raspberry Pi (mod&#xE8;le 3B minimum recommand&#xE9;)</li>
<li>Une carte SD (avec Raspbian ou Ubuntu Serveur)</li>
<li>Une connexion Internet (privil&#xE9;gi&#xE9; le filiaire ethernet RJ45)</li>
<li>Une connexion &#xE9;lectrique</li>
<li>(Optionnel) Un nom de domaine</li>
<li>(Optionnel) Une addresse IP publique</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="architecture">Architecture</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/shematrans-2.png" class="kg-image" alt="Raspberry pi to Web server" loading="lazy" width="1054" height="768" srcset="https://blog.noobtoroot.xyz/content/images/size/w600/2022/05/shematrans-2.png 600w, https://blog.noobtoroot.xyz/content/images/size/w1000/2022/05/shematrans-2.png 1000w, https://blog.noobtoroot.xyz/content/images/2022/05/shematrans-2.png 1054w" sizes="(min-width: 720px) 720px"><figcaption>Le raspberry Pi est connect&#xE9; au routeur internet. Celui-ci est configur&#xE9; pour renvoy&#xE9; le flux de donn&#xE9;e passant par le port 443 (HTTPS) et 22(SSH) vers l&apos;addresse IP du Raspberry PI.</figcaption></figure><!--kg-card-begin: markdown--><h2 id="etape-1installation-de-los">Etape 1 - Installation de l&apos;OS</h2>
<p>La premi&#xE8;re &#xE9;tape consiste &#xE0; installer le syst&#xE8;me d&apos;exploitation de votre Raspberry Pi sur votre carte SD.<br>
Heureusement, cette &#xE9;tape est largement simplifi&#xE9; par la superbe &#xE9;quipe de la Raspberry Pi Fundation. Il vous suffit de vous rendre sur le <a href="https://www.raspberrypi.com/software/">site officiel</a> de Raspberry Pi et d&apos;y telecharger leur utilitaire d&apos;installation d&apos;ISO.</p>
<p>Une fois celui-ci installer, il vous suffit de selectionner votre carte SD fraichement ins&#xE9;r&#xE9; dans votre lecteur et d&apos;y choisir l&apos;OS de votre choix.<br>
Dans mon cas, j&apos;ai choisis <strong>Ubuntu Server 64bits sans interface graphique</strong> pour des raisons de compatibilit&#xE9;s avec le CMS Open Source Ghost et afin d&apos;alleger le serveur d&apos;une interface graphique encombrante en terme de ressources utilis&#xE9;s, libre &#xE0; vous d&apos;installer l&apos;interface graphique, mais pour le reste de ce tutoriel, je passerai par SSH afin d&apos;administrer le serveur.</p>
<p>Une fois l&apos;installation de votre OS sur votre carte SD termin&#xE9;, il vous sera peut-&#xEA;tre n&#xE9;cessaire de configurer le r&#xE9;seau wifi avant d&apos;inserer la carte SD dans le raspberry pi. Si vous comptez vous brancher en filiaire ethernet, vous pouvez passer &#xE0; l&apos;&#xE9;tape suivante.<br>
Pour cela, il vous suffit d&apos;editer le fichier <strong>network-config</strong> localis&#xE9; &#xE0; la racine de votre carte SD et d&apos;y ajouter le nom de votre r&#xE9;seau wifi (&quot;home network) ainsi que la cl&#xE9; de s&#xE9;curit&#xE9; (&quot;123456789&quot;).</p>
<pre><code>wifis:
  wlan0:
    dhcp4: true
    optional: true
    access-points:
      &quot;home network&quot;:
        password: &quot;123456789&quot;
</code></pre>
<p>Il vous suffit maintenant d&apos;inserer votre carte SD dans votre Raspberry Pi et d&apos;allumer celui-ci.</p>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Si vous n&apos;avez pas configurer d&apos;adresse IP fixe, pour l&apos;&#xE9;tape suivante, vous devrez avoir acc&#xE8;s &#xE0; un &#xE9;cran, un clavier et une souris branch&#xE9;s sur votre Raspberry afin de mettre en place le SSH. Par le suite, vous pourrez vous connectez directement sur votre Raspberry &#xE0; distance en r&#xE9;seau local. <br>Vous pouvez &#xE9;galement recuperer l&apos;addresse IP attribu&#xE9; &#xE0; Raspberry Pi depuis l&apos;interface de votre box internet et vous connectez directement en ssh via la commande: <br>ssh ubuntu@&lt;IP&gt;</div></div><!--kg-card-begin: markdown--><h2 id="etape-2configuration-de-base-du-serveur">Etape 2 - Configuration de base du serveur</h2>
<p>Vous voici donc sur un Ubuntu Serveur fraichement install&#xE9;.<br>
Par defaut, l&apos;utilisateur &apos;<em>root</em>&apos; est d&#xE9;sactiv&#xE9; sur Ubuntu. Le compte par default sur Ubuntu Serveur est l&apos;<strong>utilisateur</strong> &apos;<em><strong>ubuntu</strong></em>&apos; et son <strong>mot de passe</strong> est &apos;<em><strong>ubuntu</strong></em>&apos;.</p>
<p>Il convient donc en premier lieu, pour des raisons de s&#xE9;curit&#xE9;, de modifier le mot de passe de l&apos;utilisateur ubuntu. Pour cela, il faudra rentrer la commande suivante:<br>
<code>sudo passwd ubuntu</code><br>
Je ne saurais que fortement vous recommandez d&apos;utiliser un mot de passe fort (8 charact&#xE8;res minimum, majuscules, minuscules, caract&#xE8;res Sp&#xE9;ciaux, aucun mot entier) car votre Raspberry Pi sera expos&#xE9; sur internet et donc potentielle proie de bots ou hackeurs malveillants.</p>
<p>La seconde etape consiste &#xE0; mettre &#xE0; jour votre raspberry pi &#xE0; l&apos;aide de la commande suivante:<br>
<code>sudo apt update &amp;&amp; sudo apt upgrade</code></p>
<p>Votre serveur est maintenant configur&#xE9; et &#xE0; jour. Si vous utilisez votre Raspberry Pi directement depuis un &#xE9;cran, nous allons maintenant voir comment mettre en place le SSH pour nous connecter sur la console depuis un autre ordinateur.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="etape-3installation-du-ssh">Etape 3 - Installation du SSH</h2>
<p>Pour les n&#xE9;ophyte, le SSH est est &#xE0; la fois un programme informatique et un protocole de communication s&#xE9;curis&#xE9; qui permet aux utilisateurs de contr&#xF4;ler et de modifier leurs serveurs distants sur Internet.</p>
<p>Le SSH pour Secure Shell devrait th&#xE9;oriquement &#xEA;tre install&#xE9; par d&#xE9;faut sur votre serveur, n&#xE9;anmoins, il convient de verifier si c&apos;est le cas. Pour cela, vous pouvez utiliser la commande suivante:<br>
<code>systemctl status ssh.service</code><br>
ou<br>
<code>systemctl is-active ssh.service</code></p>
<p>Si le serveur SSH est actif et install&#xE9;, vous devriez obtenir le resultat suivant:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/Capture-3.PNG" width="1227" height="122" loading="lazy" alt="Raspberry pi to Web server" srcset="https://blog.noobtoroot.xyz/content/images/size/w600/2022/05/Capture-3.PNG 600w, https://blog.noobtoroot.xyz/content/images/size/w1000/2022/05/Capture-3.PNG 1000w, https://blog.noobtoroot.xyz/content/images/2022/05/Capture-3.PNG 1227w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/Capture2-1.PNG" width="530" height="86" loading="lazy" alt="Raspberry pi to Web server"></div></div></div></figure><!--kg-card-begin: markdown--><p>Dans le cas contraire, il vous faudra install&#xE9; un serveur SSH. Dans ce cas, utilisez la commande suivante dans le terminal:<br>
<code>sudo apt install openssh-server</code></p>
<p>Si le SSH est correctement install&#xE9;, il vous suffit maintenant d&apos;obtenir l&apos;addresse IP attribu&#xE9; &#xE0; votre Raspberry Pi.</p>
<p>Pour cela utilis&#xE9; la commande: <code>ip a</code><br>
<img src="https://blog.noobtoroot.xyz/content/images/2022/05/ipa.png" alt="Raspberry pi to Web server" loading="lazy"></p>
<p>Le resultat de notre commande nous renvoie 3 r&#xE9;seaux:</p>
<ul>
<li>Lo &gt; Localhost, signifiant cet ordinateur, moi-m&#xEA;me.</li>
<li>Eth0 &gt; Ethernet, r&#xE9;seau par cable Ethernet.</li>
<li>Wlan0 &gt; Wireless, r&#xE9;seau par wifi.</li>
</ul>
<p>Noter l&apos;adresse IP attribu&#xE9; (Eth ou Wlan). Elle vous permettra de vous connectez sur votre serveur depuis votre r&#xE9;seau local.<br>
Pour cela, il vous suffit de taper la commande suivante depuis un autre PC de votre r&#xE9;seau local.<br>
<code>ssh ubuntu@&lt;votre-addresse-ip&gt;</code></p>
<p>Il ne vous reste qu&apos;&#xE0; rentrer le mot de passe utilis&#xE9; lors de l&apos;etape 2 et vous voila maintenant connecter en SSH sur votre serveur Raspberry Pi.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="etape-4installation-de-nginx">Etape 4 - Installation de Nginx</h2>
<p>Maintenant que votre Raspberry Pi est accessible, il est maintenat n&#xE9;cessaire d&apos;installer un logiciel de serveur web.<br>
Pour les n&#xE9;ophytes, un serveur web est un ordinateur qui stocke les fichiers qui composent un site web et qui s&apos;occupe de renvoyer ses &#xE9;l&#xE9;ments &#xE0; l&apos;utilisateur qui visite le site.<br>
En r&#xE8;gle g&#xE9;n&#xE9;rale, on associe un domaine (ex: blog.noobtoroot.xyz) au serveur web.</p>
<p>Pour transformer votre Raspberry Pi en serveur Web, il vous faut donc installer un logiciel afin de transformer votre Raspberry Pi en serveur web.<br>
Il en existe une multitude, les plus utilis&#xE9;s aujourd&apos;hui sont:</p>
<ul>
<li>Apache</li>
<li>ISS</li>
<li>Nginx</li>
</ul>
<p>Dans notre cas, nous utiliserons Nginx qui est selon moi, plus simple d&apos;utilisation.</p>
<p>Pour installer nginx, il suffit d&apos;utiliser le gestionnaire de package:<br>
<code>sudo apt install nginx</code></p>
<p>Nginx est maintenant install&#xE9; sur votre serveur. Vous pouvez essayer d&apos;entrer l&apos;addresse IP de votre Rasperry Pi dans un navigateur en reseau local. Vous devriez voir apparaitre la page suivante:<br>
<img src="https://blog.noobtoroot.xyz/content/images/2022/05/welcome-screen-e1450116630667.png" alt="Raspberry pi to Web server" loading="lazy"></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Noob to IPv4 #1]]></title><description><![CDATA[<p>Premi&#xE8;re partie pour tout apprendre sur l&apos;IPv4, dans cette partie nous verrons comment traduire une adresse IP en binaire, comprendre les masques de sous-r&#xE9;seaux et enfin d&#xE9;terminer l&apos;adresse de sous-r&#xE9;seaux afin d&apos;en d&#xE9;duire l&</p>]]></description><link>https://blog.noobtoroot.xyz/noobtoipv4-1/</link><guid isPermaLink="false">629e4f7c72b6240001828b2d</guid><category><![CDATA[Tuto]]></category><category><![CDATA[Network]]></category><category><![CDATA[Reseau]]></category><category><![CDATA[IPv4]]></category><dc:creator><![CDATA[Bertrand Janvoie]]></dc:creator><pubDate>Mon, 16 May 2022 21:50:45 GMT</pubDate><media:content url="https://blog.noobtoroot.xyz/content/images/2022/05/pngaaa.com-182479.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.noobtoroot.xyz/content/images/2022/05/pngaaa.com-182479.png" alt="Noob to IPv4 #1"><p>Premi&#xE8;re partie pour tout apprendre sur l&apos;IPv4, dans cette partie nous verrons comment traduire une adresse IP en binaire, comprendre les masques de sous-r&#xE9;seaux et enfin d&#xE9;terminer l&apos;adresse de sous-r&#xE9;seaux afin d&apos;en d&#xE9;duire l&apos;adresse de broadcast ainsi que son nombre d&apos;h&#xF4;tes disponibles.</p><!--kg-card-begin: markdown--><h2 id="quest-ce-quune-ip">Qu&apos;est-ce qu&apos;une IP ?</h2>
<p>L&apos;adresse IP pour Internet Protocol d&#xE9;signe un num&#xE9;ro unique attribu&#xE9; de mani&#xE8;re durable ou temporaire &#xE0; un periph&#xE9;rique connect&#xE9; &#xE0; un r&#xE9;seau informatique.</p>
<p>Not&#xE9; l&apos;utilisation du terme &quot;p&#xE9;riph&#xE9;rique&quot;, en effet aujourd&apos;hui, tout objet connect&#xE9; &#xE0; un r&#xE9;seau, de votre r&#xE9;frig&#xE9;rateur connect&#xE9; en passant &#xE9;videmment par votre ordinateur poss&#xE8;de une adresse IP.</p>
<p>Format d&apos;une adresse IPv4 :</p>
<ul>
<li>
<p>192.168.1.1</p>
</li>
<li>
<p>10.0.10.20</p>
</li>
<li>
<p>172.16.200.5</p>
</li>
</ul>
<p>Une adresse IPv4 est compos&#xE9;e de quatre octets de huit bits.</p>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Petit rappel : un octet &#xE9;quivaut &#xE0; huit bits. Un bit, lui, est l&apos;unit&#xE9; &#xE9;gale au binaire, elle ne peut prendre que deux valeurs, les chiffres 0 ou 1. Le binaire &#xE9;tant le seul langage que comprend l&apos;ordinateur.</div></div><!--kg-card-begin: markdown--><p>Prenons la premi&#xE8;re adresse IP de notre liste ci-dessus (192.168.1.1) en traduite en binaire, celle-ci &#xE9;quivaut &#xE0; 11000000.10101000.00000001.00000001.</p>
<p>Il existe une multitude de fa&#xE7;ons de convertir un nombre d&#xE9;cimal en binaire, aujourd&apos;hui nombre de calculateurs pullules sur internet, mais comme la simplicit&#xE9; n&apos;est pas &#xE0; l&apos;ordre du jour, nous allons voir dans la prochaine partie comment traduire une adresse IP en binaire.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="comment-traduire-laddresse-ip-en-binaire">Comment traduire l&apos;addresse IP en binaire ?</h2>
<p>Dans cette partie nous verrons deux m&#xE9;thodes pour convertir notre IP en binaire.</p>
<p>La premi&#xE8;re, plus alg&#xE9;brique, transforme un nombre d&#xE9;cimal (base 10) en binaire (base 2), la seconde quant &#xE0; elle, use d&apos;un tableau et de quelques additions ou soustractions.</p>
<h3 id="methode-1conversion-par-division">Methode 1 - Conversion par division</h3>
<p>La premi&#xE8;re m&#xE9;thode se base sur une division par deux et du reste pour la conversion en binaire. Dans les faits, nous prenons le nombre entier que nous divisons par deux, si le r&#xE9;sultat est un nombre entier, le bit sera &#xE0; 0. Dans le cas ou le r&#xE9;sultat retourne un nombre d&#xE9;cimal, le bit sera &#xE0; 1.</p>
<p>Prenons comme exemple le nombre 42.</p>
<p>Lorsque l&apos;on divise celui-ci par 2, le r&#xE9;sultat nous donne 21. Le dernier bit sera donc &#xE0; 0. Divisons maintenant 21, le r&#xE9;ultat est cette fois ci de 10,5. L&apos;avant dernier bit sera &#xE0; 1. Il faut ensuite r&#xE9;p&#xE9;ter l&apos;op&#xE9;ration avec 10 (sans compter la d&#xE9;cimal restante) et ainsi de suite jusqu&apos;&#xE0; arriver &#xE0; 0.</p>
<blockquote>
<p>42 / 2 = 21+0<br>
21 / 2 = 10+1<br>
10 / 2 =  5+0<br>
5  / 2 =  2+1<br>
2  / 2 =  1+0<br>
1  / 2 =  0+1<br>
<strong>Attention, il faut bien lire de bas en haut !</strong></p>
</blockquote>
<p>Le resultat en binaire est <strong>101010</strong>.</p>
<h3 id="methode-2conversion-%C3%A0-laide-dun-tableau">Methode 2 - Conversion &#xE0; l&apos;aide d&apos;un tableau</h3>
<p>La deuxi&#xE8;me m&#xE9;thode se base sur un tableau des puissances de deux pour effectuer une addition ou une soustraction de notre nombre d&#xE9;cimal afin d&apos;obtenir notre binaire.</p>
<p>Cette m&#xE9;thode, bien que plus longue &#xE0; mettre en place, &#xE0; l&apos;avantage d&apos;&#xEA;tre assez visuelle. De plus, celle-ci est plus adapt&#xE9; aux prochaines &#xE9;tapes qui nous attendent, pour la suite du tutoriel nous allons continuer d&apos;utiliser cette m&#xE9;thode.</p>
<p>Une image vaut mille mots, nous allons directement passer par un exemple pour comprendre cette m&#xE9;thode, celle-ci parlant d&apos;elle-m&#xEA;me.</p>
<p>Prenons l&apos;adresse IP suivante:</p>
<p><strong>236.192.0.1</strong></p>
<p>Nous aurons besoin de ce tableau pour proc&#xE9;der &#xE0; la m&#xE9;thode:</p>
<table>
<thead>
<tr>
<th></th>
<th>128 (2^7)</th>
<th>64 (2^6)</th>
<th>32 (2^5)</th>
<th>16 (2^4)</th>
<th>8 (2^3)</th>
<th>4 (2^2)</th>
<th>2 (2^1)</th>
<th>1 (2^0)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Octet</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
</tbody>
</table>
<p>Deux possibilit&#xE9;s s&apos;offrent &#xE0; nous, l&apos;addition ou la soustraction.</p>
<p>Dans la cadre de l&apos;addition, il faut arriver aux r&#xE9;sultatsd&#xE9;cimaux pour chaque octet de notre IP &#xE0; l&apos;aide de notre tableau des puissances de 2.</p>
<p>Dans le cas pr&#xE9;sent,voici le r&#xE9;sultat:</p>
<blockquote>
<ul>
<li>236 = 128 + 64 + 32 + 8 + 1</li>
<li>192 = 128 + 64</li>
<li>0 = 0</li>
<li>1 = 1</li>
</ul>
</blockquote>
<p>Pour la soustraction, il faut soustraire &#xE0; notre nombre d&#xE9;cimal les puissances de deux jusqu&apos;&#xE0; arriver &#xE0; 0 et ajouter les bits au tableau. Si une soustraction retourne un nombre n&#xE9;gatif, on consid&#xE8;re le bit &#xE0; 0 et le nombre d&#xE9;cimal doit &#xEA;tre d&#xE9;port&#xE9; &#xE0; la prochaine puissance de deux qui retourne un nombre positif.</p>
<blockquote>
<ul>
<li>236<br>
(236 - 128 = 108) =&gt; 1<br>
(108 - 64 = 44) =&gt;  1<br>
(44 - 32 = 12) =&gt; 1<br>
(12 - 16 = -4) =&gt; 0<br>
(12 - 8 = 4) =&gt; 1<br>
(4 - 4 = 0) =&gt; 1<br>
(0 - 2 = -2) =&gt; 0<br>
(0 - 1 = -1) =&gt; 0<br>
R&#xE9;sultat de 236 = 11101100.</li>
<li>192<br>
(192 - 128 = 64) =&gt; 1<br>
(64 - 64 = 0) =&gt; 1<br>
Arriv&#xE9; &#xE0; 0, donc tous les bits suivant seront n&#xE9;gatif.<br>
R&#xE9;sultat de 192 = 11000000.</li>
<li>0<br>
Aucun bit ne sera positif.<br>
R&#xE9;sultat de 0 = 00000000.</li>
<li>1<br>
Seul la puissance 2^1 sera positif.<br>
R&#xE9;sultat de 1 = 00000001.</li>
</ul>
</blockquote>
<p>Le traduction binaire sera 11101100.11000000.00000000.00000001.</p>
<table>
<thead>
<tr>
<th></th>
<th>128 (2^7)</th>
<th>64 (2^6)</th>
<th>32 (2^5)</th>
<th>16 (2^4)</th>
<th>8 (2^3)</th>
<th>4 (2^2)</th>
<th>2 (2^1)</th>
<th>1 (2^0)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>236</strong></td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td><strong>192</strong></td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td><strong>0</strong></td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td><strong>1</strong></td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="quest-ce-que-le-masque-de-sous-r%C3%A9seaux">Qu&apos;est-ce que le masque de sous r&#xE9;seaux ?</h2>
<p>Le masque de sous r&#xE9;seaux permet de d&#xE9;couper notre IP en r&#xE9;seaux et h&#xF4;tes (ou machines).</p>
<p>C&apos;est-&#xE0;-dire qu&apos;une partie de l&apos;adresse IP sera r&#xE9;serv&#xE9; afin de segmenter plusieurs sous-r&#xE9;seaux dans lesquelles nous pourrons attribuer des machines.</p>
<p><img src="https://blog.noobtoroot.xyz/content/images/2022/05/Sans-titre-2.png" alt="Noob to IPv4 #1" loading="lazy"></p>
<p>Aujourd&apos;hui, une adresse IPv4 peut-utiliser deux notations :</p>
<ul>
<li>
<p>D&#xE9;cimale : 255.255.255.255, 255.0.0.0, 255.255.248.0, etc.</p>
</li>
<li>
<p>CIDR (Classless Inter Domain Routing) : /8, /16, /22, /24, etc.</p>
</li>
</ul>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Le /x pour x correspondant aux nombre de bits &#xE0; un du masque de sous r&#xE9;seau traduit en binaire.</div></div><!--kg-card-begin: markdown--><p>En l&apos;occurence, la notation CIDR comprend l&apos;adresse IP et son masque de sous r&#xE9;seau.</p>
<p>Exemple: &apos;192.168.0.1/24&apos; = &apos;192.168.0.1, 255.255.255.0&apos;</p>
<p>S&apos;il vous prend de calculer le masque de sous-r&#xE9;seau en binaire, celui-ci se convertit de la m&#xEA;me mani&#xE8;re qu&apos;une adresse IP.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/Untitled-Diagram-1-.png" class="kg-image" alt="Noob to IPv4 #1" loading="lazy" width="706" height="323" srcset="https://blog.noobtoroot.xyz/content/images/size/w600/2022/05/Untitled-Diagram-1-.png 600w, https://blog.noobtoroot.xyz/content/images/2022/05/Untitled-Diagram-1-.png 706w"><figcaption>Sch&#xE9;ma d&apos;un r&#xE9;seau. La partie de l&apos;adresse en bleu correspond aux r&#xE9;seaux, celui-ci est fixe. La partie en verte, elle, correspond aux h&#xF4;tes. En l&apos;occurence, CIDR /24 signifie que le masque de sous r&#xE9;seau correspond &#xE0; 255.255.255.0 et qu&apos;il y en a donc 255 - 2 = 253 h&#xF4;tes possibles</figcaption></figure><!--kg-card-begin: markdown--><h2 id="classe-dadresse-dip-publique-et-priv%C3%A9e">Classe d&apos;adresse d&apos;IP publique et priv&#xE9;e</h2>
<p>Maintenant que le terme de masque de sous-r&#xE9;seau a &#xE9;t&#xE9; abord&#xE9;, il est important de d&#xE9;finir ce que repr&#xE9;sente une adresse IP publique et priv&#xE9;e.</p>
<p>Lorsque l&apos;on parle d&apos;adresse IP publique, celle-ci se d&#xE9;coupe en classe. En tout cinq classes d&apos;adresses IP sont d&#xE9;finis, mais nous en verrons que trois dans le cadre de ce cours.</p>
<table>
<thead>
<tr>
<th>Classe</th>
<th>Masque r&#xE9;seau</th>
<th>Adresses r&#xE9;seau</th>
<th>Nombre de r&#xE9;seaux</th>
<th>Nombre d&apos;h&#xF4;tes par r&#xE9;seau</th>
</tr>
</thead>
<tbody>
<tr>
<td>A</td>
<td>255.0.0.0</td>
<td>1.0.0.0 - 126.255.255.255</td>
<td>126</td>
<td>16777214</td>
</tr>
<tr>
<td>B</td>
<td>255.255.0.0</td>
<td>128.0.0.0 - 191.255.255.255</td>
<td>16384</td>
<td>65534</td>
</tr>
<tr>
<td>C</td>
<td>255.255.255.0</td>
<td>192.0.0.0 - 223.255.255.255</td>
<td>2097152</td>
<td>254</td>
</tr>
</tbody>
</table>
<p>En observant le tableau, on peut constater qu&apos;il ya une forte disparit&#xE9; entre les trois classes d&apos;adresse IP.</p>
<p>Prenons l&apos;exemple de la classe A. Si l&apos;on convertit une adresse IP de classe A en binaire (R=R&#xE9;seau;O=Ordinateur : RRRRRRRR.OOOOOOOO.OOOOOOOO.OOOOOOOO) vous pouvez facilement observer que la majorit&#xE9; des octets de l&apos;adresse IP sont r&#xE9;serv&#xE9;s aux machines h&#xF4;tes (ordinateur) et non aux r&#xE9;seaux. L&apos;adresse IP de type B (RRRRRRRR.RRRRRRRR.OOOOOOOO.OOOOOOOO) elle semble plus &#xE9;quilibr&#xE9;. Quant aux machines de classes C, le nombre de machines h&#xF4;tes est tr&#xE8;s limit&#xE9;.</p>
<p>Ce d&#xE9;coupage hasardeux &#xE0; entrain&#xE9; bon nombre d&apos;assignation d&apos;adresse IP publique de classe A (donc 16 millions d&apos;adresses IP potentielles) &#xE0; des entreprises qui n&apos;en ont pas de r&#xE9;el besoins, entrainant d&#xE9;sormais une p&#xE9;nurie d&apos;adresse IPv4 sur internet.</p>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&quot;4 294 967 296&quot; C&apos;est le nombre maximum d&apos;adresse IPv4 possible. Si l&apos;on compte un ordinateur + t&#xE9;l&#xE9;phone pour un &#xEA;tre humain sur terre, on arrive vite &#xE0; un probl&#xE8;me de taille.</div></div><!--kg-card-begin: markdown--><p>En plus du nombre d&apos;adresse IP publique maximum limit&#xE9;, ajout&#xE9; &#xE0; cette liste des <strong>adresses r&#xE9;serv&#xE9;s</strong> afin d&apos;&#xEA;tre utilis&#xE9; dans des r&#xE9;seaux priv&#xE9;s.</p>
<ul>
<li>127.0.0.1 &gt; Loopback</li>
<li>172.16.0.0 - 172.31.255.255 &gt; Local</li>
<li>10.0.0.0 - 10.255.255.255 &gt; Local</li>
<li>192.168.0.0 - 192.168.255.255 &gt; Local</li>
</ul>
<p>Aujourd&apos;hui, plusieurs solutions ont &#xE9;t&#xE9; adopt&#xE9;es afin de palier &#xE0; ce probl&#xE8;me, notamment le NAT (Network Addresse Translation) et l&apos;IPv6 qu&apos;on abordera dans un tutoriel ult&#xE9;rieur.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="comment-d%C3%A9terminer-ladresse-de-sous-r%C3%A9seau">Comment d&#xE9;terminer l&apos;adresse de sous r&#xE9;seau ?</h2>
<p>Pour d&#xE9;terminer le r&#xE9;seau d&apos;une adresse IP nous avons besoin de l&apos;adresse IP et du masque de sous r&#xE9;seau traduit en binaire.</p>
<p>Pour cela nous allons utiliser un nouveau tableau qui va superposer l&apos;IP et le masque de sous r&#xE9;seau et remplir par un <strong>ET logique</strong> la derni&#xE8;re rang&#xE9;e du tableau. Les r&#xE8;gles sont donc :</p>
<blockquote>
<p>R = (IP) AND (M)</p>
<ul>
<li>1+1=1</li>
<li>1+0=0</li>
<li>0+1=0</li>
<li>0+0=0</li>
</ul>
</blockquote>
<p>Exemple:</p>
<p>192.168.1.1/24</p>
<table>
<thead>
<tr>
<th></th>
<th>128</th>
<th>64</th>
<th>32</th>
<th>16</th>
<th>8</th>
<th>4</th>
<th>2</th>
<th>1</th>
<th>128</th>
<th>64</th>
<th>32</th>
<th>16</th>
<th>8</th>
<th>4</th>
<th>2</th>
<th>1</th>
<th>128</th>
<th>64</th>
<th>32</th>
<th>16</th>
<th>8</th>
<th>4</th>
<th>2</th>
<th>1</th>
<th>128</th>
<th>64</th>
<th>32</th>
<th>16</th>
<th>8</th>
<th>4</th>
<th>2</th>
<th>1</th>
</tr>
</thead>
<tbody>
<tr>
<td>IP</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>Mask</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Reseau</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>L&apos;adresse du r&#xE9;seau 192.168.1.1/24 est 192.168.1.0/24.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="comment-calculer-ladresse-de-broadcast">Comment calculer l&apos;adresse de broadcast ?</h2>
<p>Pour calculer l&apos;adresse de broadcast, nous avons besoin de l&apos;adresse du r&#xE9;seau ainsi que du masque de sous r&#xE9;seau que l&apos;on inversera.</p>
<p>Nous allons utiliser une nouvelle fois le tableau pr&#xE9;c&#xE8;dent, mais en superposant cette fois-ci l&apos;adresse du r&#xE9;seau et le masque de sous r&#xE9;seau invers&#xE9; et proc&#xE9;d&#xE9; &#xE0; un <strong>OU logique</strong>. Les r&#xE8;gles sont donc :</p>
<blockquote>
<p>B = R OR !(M)  &lt;- !(M) = Masque de r&#xE9;seau invers&#xE9;.</p>
<ul>
<li>1 +1 = 1</li>
<li>1 + 0 = 1</li>
<li>0 + 1 = 1</li>
<li>0 + 0 = 0</li>
</ul>
</blockquote>
<p>192.168.1.0/24</p>
<table>
<thead>
<tr>
<th></th>
<th>128</th>
<th>64</th>
<th>32</th>
<th>16</th>
<th>8</th>
<th>4</th>
<th>2</th>
<th>1</th>
<th>128</th>
<th>64</th>
<th>32</th>
<th>16</th>
<th>8</th>
<th>4</th>
<th>2</th>
<th>1</th>
<th>128</th>
<th>64</th>
<th>32</th>
<th>16</th>
<th>8</th>
<th>4</th>
<th>2</th>
<th>1</th>
<th>128</th>
<th>64</th>
<th>32</th>
<th>16</th>
<th>8</th>
<th>4</th>
<th>2</th>
<th>1</th>
</tr>
</thead>
<tbody>
<tr>
<td>Reseau</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>!(Mask)</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>Broadcast</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
</tbody>
</table>
<p>L&apos;addresse de broadcast du r&#xE9;seau 192.168.1.0/24 est 192.168.1.255.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="comment-d%C3%A9terminer-le-nombre-dh%C3%B4tes-dun-r%C3%A9seau">Comment d&#xE9;terminer le nombre d&apos;h&#xF4;tes d&apos;un r&#xE9;seau ?</h2>
<p>Afin de calculer le nombre d&apos;h&#xF4;te sur un r&#xE9;seau, nous devons d&#xE9;terminer l&apos;adresse IP de notre r&#xE9;seaux et inverser le binaire des bits utiliser par le masque de sous r&#xE9;seaux.</p>
<p>Exemple :</p>
<p>192.168.1.0/20</p>
<p>&apos;/20&apos; correspond &#xE0; 11111111.11111111.11110000.00000000. (=255.255.240.0)</p>
<p>Si l&apos;on inverse le masque de sous r&#xE9;seaux, cela nous donne.</p>
<p>00000000.00000000.00001111.11111111</p>
<ul>
<li>
<p>00001111 : 8+4+2+1 = 15</p>
</li>
<li>
<p>11111111 : 128+64+32+16+8+4+2+1 = 255</p>
</li>
</ul>
<p>R&#xE9;sultat : 270 h&#xF4;tes.</p>
<p>Mais il nous manque un petit quelque chose... <strong>L&apos;adresse du r&#xE9;seau</strong> et <strong>l&apos;adresse de broadcast.</strong></p>
<p>En l&apos;occurrence, 192.168.1.0 est 192.168.1.255. En effet, ces deux adresses sont r&#xE9;serv&#xE9;es afin de d&#xE9;finir le r&#xE9;seau avec 192.168.1.0 et envoyer un message en broadcast (diffuser &#xE0; tout le monde sur le r&#xE9;seau) au 192.168.1.255.</p>
<p>Il y a donc <strong>268 h&#xF4;tes</strong> possible sur notre r&#xE9;seau 192.168.1.0/20.</p>
<!--kg-card-end: markdown--><hr><div class="kg-card kg-button-card kg-align-center"><a href="https://blog.noobtoroot.xyz/noob-to-network/" class="kg-btn kg-btn-accent">Noob to IPv4 #2 (Prochainement)</a></div><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://blog.noobtoroot.xyz/noob-to-network/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Noob to Network</div><div class="kg-bookmark-description">Noob to IPv4 #1Premi&#xE8;re partie pour tout apprendre sur l&#x2019;IPv4, dans cette partie nous verrons comment traduire une addresse IP en binaire, comprendre les masques de sous-r&#xE9;seaux et enfin determiner l&#x2019;addresse de sous-r&#xE9;seaux afin d&#x2019;en d&#xE9;duire l&#x2019;addresse de broadcast ainsi que son nombre d&#x2019;h&#xF4;tes disp&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://blog.noobtoroot.xyz/favicon.png" alt="Noob to IPv4 #1"><span class="kg-bookmark-author">Noob to Root</span><span class="kg-bookmark-publisher">Bertrand jve</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://blog.noobtoroot.xyz/content/images/2022/05/Fond-Powershell_WithoutLogo-3.png" alt="Noob to IPv4 #1"></div></a></figure>]]></content:encoded></item></channel></rss>