<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - Open source et architecture logicielle par autran</title>
		<link>https://www.developpez.net/forums/blogs/863457-autran/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Tue, 08 Sep 2026 21:03:45 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - Open source et architecture logicielle par autran</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/</link>
		</image>
		<item>
			<title>Utilitaires Java pour le Hardening : Sauvegarde de fichiers de configuration</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9354/utilitaires-java-hardening-sauvegarde-fichiers-configuration/</link>
			<pubDate>Sun, 10 May 2020 17:00:57 GMT</pubDate>
			<description>Je reprends un peu le cours...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Je reprends un peu le cours de mon fil sur le hardening et l’audit de sécurité.<br />
Sur un hardening de serveur il sera nécessaire de modifier certains fichiers de configuration du serveur cible (par exemple httpd.conf) pour remédier les vulnérabilités détectées<br />
Mais nous devrons au préalable faire une sauvegarde des fichiers modifiés.<br />
J’ai donc créé une classe Fichier dont je me sers fréquemment pour ce type d’opération.<br />
Cette classe prend en paramètre (de son constructeur) le nom du fichier à sauvegarder et le recherche récursivement depuis le répertoire courant.<br />
Elle possède une méthode mCreateBackup pour faire la sauvegarde dans le même répertoire que le fichier en rajoutant sufixe .old  <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Fichier <span class="br0">&#123;</span>
	<span style="color: #0000ff;">private</span> File pFile;
&nbsp;
	<span style="color: #0000ff;">public</span> Fichier<span class="br0">&#40;</span>String name<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		File currentDirectory = <span style="color: #0000ff;">new</span> File<span class="br0">&#40;</span>System.getProperty<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;user.dir&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		String absoluteName = <span style="color: #0000ff;">this</span>.mFindByName<span class="br0">&#40;</span>currentDirectory, name<span class="br0">&#41;</span>;
		pFile = <span style="color: #0000ff;">new</span> File<span class="br0">&#40;</span>absoluteName<span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">private</span> String mFindByName<span class="br0">&#40;</span>File folder, String filename<span class="br0">&#41;</span><span class="br0">&#123;</span>
	    String path = <span style="color: #0000ff;">null</span>;
	    <span style="color: #0000ff;">if</span><span class="br0">&#40;</span>folder.isDirectory<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
	        List&lt;File&gt; files = Arrays.asList<span class="br0">&#40;</span>folder.listFiles<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
	        Iterator&lt;File&gt; fileIterator = files.iterator<span class="br0">&#40;</span><span class="br0">&#41;</span>;
	        <span style="color: #0000ff;">while</span><span class="br0">&#40;</span>fileIterator.hasNext<span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp;  path==<span style="color: #0000ff;">null</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
	            path = mFindByName<span class="br0">&#40;</span>fileIterator.next<span class="br0">&#40;</span><span class="br0">&#41;</span>, filename<span class="br0">&#41;</span>;
	        <span class="br0">&#125;</span>
	    <span class="br0">&#125;</span> 
	    <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>folder.getName<span class="br0">&#40;</span><span class="br0">&#41;</span>.compareTo<span class="br0">&#40;</span>filename<span class="br0">&#41;</span> == <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	            path = folder.getAbsolutePath<span class="br0">&#40;</span><span class="br0">&#41;</span>;
	    <span class="br0">&#125;</span>
	    <span style="color: #0000ff;">return</span> path;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> mCreateBackUp<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">boolean</span> result = <span style="color: #0000ff;">false</span>;
		FileInputStream sourceFile=<span style="color: #0000ff;">null</span>;
        FileOutputStream destinationFile=<span style="color: #0000ff;">null</span>;
        String destinationName = pFile.getAbsolutePath<span class="br0">&#40;</span><span class="br0">&#41;</span>.concat<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;.old&quot;</span><span class="br0">&#41;</span>;
        <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
                File destination = <span style="color: #0000ff;">new</span> File<span class="br0">&#40;</span>destinationName<span class="br0">&#41;</span>;
&nbsp;
                sourceFile = <span style="color: #0000ff;">new</span> java.io.FileInputStream<span class="br0">&#40;</span>pFile<span class="br0">&#41;</span>;
                destinationFile = <span style="color: #0000ff;">new</span> java.io.FileOutputStream<span class="br0">&#40;</span>destination<span class="br0">&#41;</span>;
&nbsp;
                <span style="color: #808080;">// Lecture par segment de 0.5Mo </span>
                <span style="color: #0000ff;">byte</span> buffer<span class="br0">&#91;</span><span class="br0">&#93;</span>=<span style="color: #0000ff;">new</span> <span style="color: #0000ff;">byte</span><span class="br0">&#91;</span><span style="color: #cc66cc;">512</span>*<span style="color: #cc66cc;">1024</span><span class="br0">&#93;</span>;
                <span style="color: #0000ff;">int</span> nbLecture;
&nbsp;
                <span style="color: #0000ff;">while</span><span class="br0">&#40;</span> <span class="br0">&#40;</span>nbLecture = sourceFile.read<span class="br0">&#40;</span>buffer<span class="br0">&#41;</span><span class="br0">&#41;</span> != <span style="color: #cc66cc;">-1</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
                        destinationFile.write<span class="br0">&#40;</span>buffer, <span style="color: #cc66cc;">0</span>, nbLecture<span class="br0">&#41;</span>;
                <span class="br0">&#125;</span> 
&nbsp;
                <span style="color: #808080;">// Copie r&eacute;ussie</span>
                result = <span style="color: #0000ff;">true</span>;
        <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span><span class="br0">&#40;</span>FileNotFoundException f <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span><span class="br0">&#40;</span>IOException e <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="br0">&#125;</span> <span style="color: #0000ff;">finally</span> <span class="br0">&#123;</span>
                <span style="color: #808080;">// Quoi qu'il arrive, on ferme les flux</span>
                <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
                        sourceFile.close<span class="br0">&#40;</span><span class="br0">&#41;</span>;
                <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span><span class="br0">&#40;</span>Exception e<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>
                <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
                        destinationFile.close<span class="br0">&#40;</span><span class="br0">&#41;</span>;
                <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span><span class="br0">&#40;</span>Exception e<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>
        <span class="br0">&#125;</span> 
        <span style="color: #0000ff;">return</span> result ;
&nbsp;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> File getpFile<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> pFile;
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Je tenterai dans un prochain post de vous faire une démonstration d’un audit de serveur, pour être plus concret. <br />
D’ici là, si vous êtes intéressé, dites-moi si vous préférez plutôt que je fasses la démo d’un audit en bash (langage qu’affectionnent les devOps) ; Sinon je continu en Java.</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9354/utilitaires-java-hardening-sauvegarde-fichiers-configuration/</guid>
		</item>
		<item>
			<title>Utilisation de java pour le Pentest</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9323/utilisation-java-pentest/</link>
			<pubDate>Mon, 04 May 2020 16:48:02 GMT</pubDate>
			<description>Pour faire suite à ce billet...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pour faire suite à ce <a href="https://www.developpez.net/forums/blogs/863457-autran/b9257/capturer-reponse-serveur-web-java/" target="_blank">billet</a>, je vous montre aujourd’hui comment utiliser l’objet WebPage pour résoudre un défi de CTF. Le Défi consiste à générer un hash MD5 en un temps record (moins de 5 s) <br />
Voici la page obtenue pour ce défi :<br />
<img src="https://www.developpez.net/forums/attachments/p562846d1588610474/c-cpp/c/allocation-dynamique-realloc-malloc-dimensions/htbmd5.png/" border="0" alt="Nom : htbMD5.png
Affichages : 1450
Taille : 21,9 Ko"  style="float: CONFIG" /><br />
Inutile de dire que : [prendre la chaine en clair et en faire un hash à la main sur un site dédié – copier/coller le hash dans la zone de texte de la page – et cliquer sur <i>submit</i>] nous prendra plus de 5 s.<br />
Il faut donc automatiser ce processus. Pour cela, 6 actions doivent être réalisées :<br />
  1/ Extraire de la page HTML la chaine de caractère<br />
  2/ Hasher cette chaine avec l’algorithme MD5<br />
  3/ créer un JSON de réponse<br />
  4/ Obtenir le/les cookies de session envoyé initialement par le serveur PHP afin qu’il sache que le hash calculé correspond à celui du chalenge.<br />
  5/ Renvoyer le formulaire<br />
  6/ capturer le flag en retour (seconde réponse du serveur) pour marquer les points<br />
<br />
Je ne vous offrirai ici que les 4 premières étapes et dans la 4ème je ne vous donnerez que le cookie PHPSESSID envoyé par le serveur PHP pour sécuriser la session. Néanmoins pour réaliser tout aussi facilement les parties 5 et 6, je pourrai dans un prochain billet ajouter un constructeur à la classe WebPage afin de renvoyer un formulaire (requête de type POST).<br />
Pour le reste, il faudra me le demander si vous êtes intéressé et je fournirai le « write-up » complet une fois que le chalenge sera « retired » du site HTB (éthique oblige).<br />
Voici le résultat attendu pour notre petit défi (étape 1 à 3) :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code html :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
D&eacute;but de CTF -- mini-chalenge --
Voici la page &agrave; traiter : 
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">html</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">head</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">title</span><span style="color: #0000ff;">&gt;</span></span>emdee five for life<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">title</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">head</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">body</span> <span style="color: #0080ff;">style</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;background-color:powderblue;&quot;</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">h1</span> <span style="color: #0080ff;">align</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">'center'</span><span style="color: #0000ff;">&gt;</span></span>MD5 encrypt this string<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">h1</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">h3</span> <span style="color: #0080ff;">align</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">'center'</span><span style="color: #0000ff;">&gt;</span></span>9BpkJPYlOF69D4uN9Gjv<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">h3</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">center</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">form</span> <span style="color: #0080ff;">action</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;"><span style="color: #FF0000;">&quot;&quot;</span></span> <span style="color: #0080ff;">method</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;post&quot;</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">input</span> <span style="color: #0080ff;">type</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;text&quot;</span> <span style="color: #0080ff;">name</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;hash&quot;</span> <span style="color: #0080ff;">placeholder</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;MD5&quot;</span> <span style="color: #0080ff;">align</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">'center'</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">input</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">br</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">input</span> <span style="color: #0080ff;">type</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;submit&quot;</span> <span style="color: #0080ff;">value</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;Submit&quot;</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">input</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">form</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">center</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">body</span><span style="color: #0000ff;">&gt;</span></span>
<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">html</span><span style="color: #0000ff;">&gt;</span></span>
----------------------------------------------------
La chaine en clair = 9BpkJPYlOF69D4uN9Gjv
Le hash = f58271057951dd0470593b0083176956
Les param&egrave;tres &agrave; passer dans la prochaine requ&ecirc;te post = {&quot; hash &quot;:&quot;f58271057951dd0470593b0083176956&quot;}
le cookie envoy&eacute; par le serveur pour rester dans la session : [PHPSESSID=6c0etptg15a85n87uceo53r8b3; path=/]
Fin de CTF -- mini-chalenge --</pre></td></tr></table></pre>
</div>Je vais détailler les étapes 1 et 4 car elles illustrent l’intérêt d’utiliser JAVA et cette classe dans les pentests en particulier et la sécurité en général<br />
<br />
<b><u>Etape 1 : Extraire la chaine de caractère à hasher</u></b><br />
La chaine se trouve ici dans la page :<i> &lt;h3 align='center'&gt;<b>9BpkJPYlOF69D4uN9Gjv</b>&lt;/h3&gt;&lt;center&gt;&lt;form action=&quot;&quot; method=&quot;post&quot;&gt;. Il faudra à l’aide des expressions régulières prendre la chaine entre &lt;h3 align='center'&gt; et &lt;/h3&gt;</i><br />
<br />
<b><u>Etape 4 : Capture du Cookie de session</u></b><br />
Le cookie de session est dans la propriété header de ma classe. Ce header est une liste (Map) et la clé (index) du cookie est « set-cookie ». <br />
Voici le code source pour résoudre ce chalenge<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Test <span class="br0">&#123;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main<span class="br0">&#40;</span>String<span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;D&eacute;but de CTF -- mini-chalenge --&quot;</span><span class="br0">&#41;</span>;
		WebPage page = <span style="color: #0000ff;">new</span> WebPage<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;http://docker.hackthebox.eu:30832/&quot;</span><span class="br0">&#41;</span>;
		String body = page.getBody<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Voici la page &agrave; traiter : <span style="color: #800000;">\n</span>&quot;</span> + body<span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;----------------------------------------------------&quot;</span><span class="br0">&#41;</span>;
		<span style="color: #808080;">// &eacute;tape 1 : extraction de la chaine &agrave; hasher</span>
		Pattern pattern;
		Matcher matcher;
		pattern = Pattern.compile<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&lt;h3 align='center'&gt;([^&lt;]+)&lt;/h3&gt;&quot;</span><span class="br0">&#41;</span>;
		matcher = pattern.matcher<span class="br0">&#40;</span>body<span class="br0">&#41;</span>;
		String phrase = <span style="color: #0000ff;">null</span>;
		<span style="color: #0000ff;">while</span><span class="br0">&#40;</span>matcher.find<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> phrase = matcher.group<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;
		<span style="color: #808080;">//&eacute;tape 2 : algorithme de hash MD5</span>
		String hash = <span style="color: #0000ff;">null</span>;	
		<span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
			<span style="color: #0000ff;">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span> byteChaine = phrase.getBytes<span class="br0">&#40;</span>StandardCharsets.UTF_8<span class="br0">&#41;</span>;
			MessageDigest md = MessageDigest.getInstance<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;MD5&quot;</span><span class="br0">&#41;</span>;
			<span style="color: #0000ff;">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span> hashInBytes= md.digest<span class="br0">&#40;</span>byteChaine<span class="br0">&#41;</span>;
			StringBuilder sb = <span style="color: #0000ff;">new</span> StringBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>;
	        <span style="color: #0000ff;">for</span> <span class="br0">&#40;</span><span style="color: #0000ff;">byte</span> b : hashInBytes<span class="br0">&#41;</span> <span class="br0">&#123;</span>
	            sb.append<span class="br0">&#40;</span>String.format<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;%02x&quot;</span>, b<span class="br0">&#41;</span><span class="br0">&#41;</span>;
	        <span class="br0">&#125;</span>
	        hash = sb.toString<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>NoSuchAlgorithmException e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			e.printStackTrace<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span class="br0">&#125;</span>
		<span style="color: #808080;">//&eacute;tape 3 : cr&eacute;ation du JSON de r&eacute;ponse</span>
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;La chaine en clair = &quot;</span> + phrase<span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Le hash = &quot;</span> + hash<span class="br0">&#41;</span>;
		String json = <span style="color: #0000ff;">new</span> StringBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>
				.append<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;{&quot;</span><span class="br0">&#41;</span>
                .append<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">\&quot;</span> hash <span style="color: #800000;">\&quot;</span>:<span style="color: #800000;">\&quot;</span>&quot;</span> + hash + <span style="color: #FF0000;">&quot;<span style="color: #800000;">\&quot;</span>&quot;</span><span class="br0">&#41;</span>
                .append<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;}&quot;</span><span class="br0">&#41;</span>.toString<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span style="color: #808080;">//&eacute;tape 4 : capture du cookie de session</span>
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Les param&egrave;tres &agrave; passer dans la prochaine requ&ecirc;te post = &quot;</span> + json<span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;le cookie envoy&eacute; par le serveur pour rester dans la session : &quot;</span> + page.getHeader<span class="br0">&#40;</span><span class="br0">&#41;</span>.get<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;set-cookie&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Fin de CTF -- mini-chalenge --&quot;</span><span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9323/utilisation-java-pentest/</guid>
		</item>
		<item>
			<title>Implémentation de l’algorithme K-Means en java (partie 3)</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9310/implementation-l-algorithme-k-means-java-partie-3/</link>
			<pubDate>Thu, 30 Apr 2020 06:20:26 GMT</pubDate>
			<description>Pour ce dernier volet voici...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pour ce dernier volet voici la classe DataSet qui porte la structure et les méthodes à invoquer pour réaliser l’algorithme K-Means.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> DataSet <span class="br0">&#123;</span>
	<span style="color: #0000ff;">private</span> List&lt;Point&gt; population;
	<span style="color: #0000ff;">private</span> List&lt;Centroide&gt; centroides;
	<span style="color: #0000ff;">private</span>  <span style="color: #0000ff;">double</span> EPSILON = <span style="color: #cc66cc;">0.1</span>;
&nbsp;
	<span style="color: #0000ff;">public</span> DataSet<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.population = <span style="color: #0000ff;">new</span> ArrayList&lt;Point&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">this</span>.centroides = <span style="color: #0000ff;">new</span> ArrayList&lt;Centroide&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> addData<span class="br0">&#40;</span>Point p<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.population.add<span class="br0">&#40;</span>p<span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> addCentroide<span class="br0">&#40;</span>Centroide e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.centroides.add<span class="br0">&#40;</span>e<span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> List&lt;Point&gt; getPopulation<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> population;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> List&lt;Centroide&gt; getCentroides<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> centroides;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> assignation<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.getCentroides<span class="br0">&#40;</span><span class="br0">&#41;</span>.forEach<span class="br0">&#40;</span>element -&gt; element.empty<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">for</span> <span class="br0">&#40;</span>Point point : <span style="color: #0000ff;">this</span>.getPopulation<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			List&lt;Double&gt; distances = <span style="color: #0000ff;">new</span> ArrayList&lt;Double&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;
			<span style="color: #0000ff;">for</span> <span class="br0">&#40;</span>Centroide cent : <span style="color: #0000ff;">this</span>.getCentroides<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				distances.add<span class="br0">&#40;</span>point.getDistance<span class="br0">&#40;</span>cent.getCenter<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
			<span class="br0">&#125;</span>
			Double minimum = distances.stream<span class="br0">&#40;</span><span class="br0">&#41;</span>.mapToDouble<span class="br0">&#40;</span>v-&gt;v<span class="br0">&#41;</span>.min<span class="br0">&#40;</span><span class="br0">&#41;</span>.orElseThrow<span class="br0">&#40;</span>NoSuchElementException::<span style="color: #0000ff;">new</span><span class="br0">&#41;</span>;
			<span style="color: #0000ff;">this</span>.getCentroides<span class="br0">&#40;</span><span class="br0">&#41;</span>.get<span class="br0">&#40;</span>distances.indexOf<span class="br0">&#40;</span>minimum<span class="br0">&#41;</span><span class="br0">&#41;</span>.add<span class="br0">&#40;</span>point<span class="br0">&#41;</span>;
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> variation<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">boolean</span> flag = <span style="color: #0000ff;">false</span>;
		<span style="color: #0000ff;">for</span> <span class="br0">&#40;</span>Centroide cent : <span style="color: #0000ff;">this</span>.getCentroides<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			Point newCenter = cent.getBarycenter<span class="br0">&#40;</span><span class="br0">&#41;</span>;
			<span style="color: #0000ff;">if</span><span class="br0">&#40;</span>cent.getCenter<span class="br0">&#40;</span><span class="br0">&#41;</span>.getDistance<span class="br0">&#40;</span>newCenter<span class="br0">&#41;</span> &gt; EPSILON<span class="br0">&#41;</span> <span class="br0">&#123;</span>
				flag = <span style="color: #0000ff;">true</span>;
				cent.setCenter<span class="br0">&#40;</span>newCenter<span class="br0">&#41;</span>;
			<span class="br0">&#125;</span>
		<span class="br0">&#125;</span>
		<span style="color: #0000ff;">return</span> flag;
	<span class="br0">&#125;</span>
	<span style="color: #339933;">@Override</span>
	<span style="color: #0000ff;">public</span> String toString<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;DataSet [population=&quot;</span> + population + <span style="color: #FF0000;">&quot;, centroides=&quot;</span> + centroides + <span style="color: #FF0000;">&quot;]&quot;</span>;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> kMeans<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">do</span> <span class="br0">&#123;</span>
			<span style="color: #0000ff;">this</span>.assignation<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span class="br0">&#125;</span> <span style="color: #0000ff;">while</span><span class="br0">&#40;</span><span style="color: #0000ff;">this</span>.variation<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Et voici quelques explications de ce code simple :<br />
<br />
<b><u>1/ Les propriétés de l’objet</u></b><br />
On trouve 2 collections :<br />
-	<i>population </i>(le dataset des indidividus cible) <br />
-	<i>centroïdes </i>(les centroïdes choisi pour le traitement)<br />
J’ai choisi de prendre des ArrayList pour sa convivialité pour des raisons de performances puisqu’ils seront toujours accédés de façon linéaire.<br />
On y trouve aussi une variable numérique EPSILON que j’ai fixé arbitrairement à 0.1<br />
Epsilon et la variation des positions requises des centroïde en dessous de laquelle l’itération s’arrête. En toute rigueur j’aurai également du ajouter comme critère de convergence pour l’arrêt de l’itération le nombre de boucles. <br />
<br />
<b><u>2/ Les méthodes de l’objet </u></b><br />
<b>1.1/ La méthode assignation</b><br />
Cette méthode permet de d’attribuer un centroïde à chaque individu du cluster. A chaque exécution de cette fonction, les clusters de tout les centroïdes sont vidés, puis remplis avec les individus recalculés. J’avoue avoir eu recours une dernière fois aux lambdas pour trouver la distance minimum en une ligne plutôt qu’en 10, pour montrer la puissance du côté fonctionnel du code (pour les jeunes jedi non encore convertis).<br />
<br />
<b>2.2/ La méthode variation</b><br />
Cette méthode calcule le barycentre de chaque cluster et le compare à la valeur du centroïde. Si cette valeur est supérieure à EPSILON alors elle repositionne le centroïde et donne le feu vert pour la prochaine itération. Sinon elle signale que l’algorithme a convergé.<br />
<br />
<b>2.3/ La méthode kMeans</b><br />
Il s’agit de la boucle qui modélise la doctrine macroscopique de l’algorithme K-Means.<br />
Peut être que j’aurais simplement dû la placer dans le main() mais mon cerveau doit être trop tordu et j’ai souhaité que ma classe DataSet soit totalement autoporteuse de l’algorithme. De plus j’ai appliqué le principe du couplage lâche partout ou des atomes étaient remplaçables (Point notamment), et mettre cette méthode dans la classe DataSet ne me semblait pas être antagoniste de cette doctrine.</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9310/implementation-l-algorithme-k-means-java-partie-3/</guid>
		</item>
		<item>
			<title>Implémentation de l’algorithme K-Means en java (partie 2)</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9296/implementation-l-algorithme-k-means-java-partie-2/</link>
			<pubDate>Wed, 29 Apr 2020 06:22:26 GMT</pubDate>
			<description>Pour faire suite à la partie...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pour faire suite à la partie 1 voici mon implémentation des objets Point et Centroïde <br />
<br />
<b><u>1/ Point</u></b><br />
Cet objet permet de stocker les coordonnées 2D d’un individu et de mesurer sa distance à un autre point. J’aurais pu spécialiser la classe abstraite Point2D du package AWT, mais seule la méthode getDistance() nous servira. D’autant que dans un souci de généricité et à l’aide des patrons de conceptions nous pourrons à terme remplacer Point par une unité de stockage de dimension plus importante ou dont les métrique reposent sur des échelles discrètes. Mais pour cette série de d’article je me limiterai à un plan euclidien afin de pouvoir étendre le spectre étudié jusqu’à la représentation graphique en Swing/javaFX voire, s’il y a un public intéressé, à la visualisation web.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Point <span class="br0">&#123;</span>
&nbsp;
	<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">double</span> x;
	<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">double</span> y;
&nbsp;
	<span style="color: #0000ff;">public</span> Point<span class="br0">&#40;</span><span style="color: #0000ff;">double</span> x, <span style="color: #0000ff;">double</span> y<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.x = x;
		<span style="color: #0000ff;">this</span>.y = y;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">double</span> getDistance<span class="br0">&#40;</span>Point P<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">double</span> dist = Math.sqrt<span class="br0">&#40;</span>Math.pow<span class="br0">&#40;</span>P.getX<span class="br0">&#40;</span><span class="br0">&#41;</span> - <span style="color: #0000ff;">this</span>.getX<span class="br0">&#40;</span><span class="br0">&#41;</span>,  <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> + Math.pow<span class="br0">&#40;</span>P.getY<span class="br0">&#40;</span><span class="br0">&#41;</span> - <span style="color: #0000ff;">this</span>.getY<span class="br0">&#40;</span><span class="br0">&#41;</span>,  <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">return</span> dist;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">double</span> getX<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> x;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">double</span> getY<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> y;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #339933;">@Override</span>
	<span style="color: #0000ff;">public</span> String toString<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;Point [x=&quot;</span> + x + <span style="color: #FF0000;">&quot;, y=&quot;</span> + y + <span style="color: #FF0000;">&quot;]&quot;</span>;
	<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><b><u>2/ Centroïde </u></b><br />
Cet objet est structurellement composé de ses propres coordonnées et du cluster de points dont il est le plus proche, soit respectivement :<br />
-	<b>Center</b> &#61664; un objet de type Point<br />
-	<b>Sector</b> &#61664; une collection de points<br />
Le Centroïde à vocation à renouveler son cluster à chaque itération de l’étape d’assignation. C’est la raison pour laquelle il existe une méthode de vidage du cluster empty(). <br />
Le centroïde possède également une méthode qui retourne le barycentre de son cluster. J’ai volontairement écrit cette méthode en invoquant sur les collections des méthodes utilisant les lambda-expressions introduite depuis Java 8. L’intérêt pour moi est de faire passer sur ce code source mon transpiler qui converti le Java en JS et ainsi pouvoir pré-mâcher le portage de cette mini-appli java vers ce que je pratique au quotidien (Angular Node). Et l’intérêt pour les lecteurs est de découvrir cette approche fonctionnelle du code. Mais je m’y engage, je ferai les prochaines classes en Java 5 traditionnel si cher au cœur des développeurs JEE. N’hésitez pas à me demander si vous souhaitez une version traditionnelle de cette méthode… ou si au contraire vous plébiscitez cette notation.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Centroide <span class="br0">&#123;</span>
&nbsp;
	<span style="color: #0000ff;">private</span> List&lt;Point&gt; sector;
	<span style="color: #0000ff;">private</span> Point center;
&nbsp;
	<span style="color: #0000ff;">public</span> Centroide<span class="br0">&#40;</span>Point center<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.center = center;
		<span style="color: #0000ff;">this</span>.sector = <span style="color: #0000ff;">new</span> ArrayList&lt;Point&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> Point getCenter<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> center;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setCenter<span class="br0">&#40;</span>Point center<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.center = center;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> List&lt;Point&gt; getSector<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> sector;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> empty<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.sector.clear<span class="br0">&#40;</span><span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> add <span class="br0">&#40;</span>Point p<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.sector.add<span class="br0">&#40;</span>p<span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> Point getBarycenter<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>	
		<span style="color: #0000ff;">double</span> Abs = <span style="color: #0000ff;">this</span>.sector.stream<span class="br0">&#40;</span><span class="br0">&#41;</span>.map<span class="br0">&#40;</span>element -&gt; element.getX<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.reduce<span class="br0">&#40;</span>Double.valueOf<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>subtotal, element<span class="br0">&#41;</span> -&gt; subtotal + element<span class="br0">&#41;</span>/<span style="color: #0000ff;">this</span>.sector.size<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">double</span> Ord = <span style="color: #0000ff;">this</span>.sector.stream<span class="br0">&#40;</span><span class="br0">&#41;</span>.map<span class="br0">&#40;</span>element -&gt; element.getY<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.reduce<span class="br0">&#40;</span>Double.valueOf<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>subtotal, element<span class="br0">&#41;</span> -&gt; subtotal + element<span class="br0">&#41;</span>/<span style="color: #0000ff;">this</span>.sector.size<span class="br0">&#40;</span><span class="br0">&#41;</span>;	
		Point p = <span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span>Abs, Ord<span class="br0">&#41;</span>;
		<span style="color: #0000ff;">return</span> p;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #339933;">@Override</span>
	<span style="color: #0000ff;">public</span> String toString<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;Centroide [sector=&quot;</span> + sector + <span style="color: #FF0000;">&quot;, center=&quot;</span> + center + <span style="color: #FF0000;">&quot;]&quot;</span>;
	<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
Dans la partie 3 je vous livrerai la dernière classe <b>DataSet </b>et peut être une autre si je découvre qu’elle n’est pas suffisante pour totalement implémenter l'algorithme</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9296/implementation-l-algorithme-k-means-java-partie-2/</guid>
		</item>
		<item>
			<title>Judo et développement même combat ?</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9292/judo-developpement-meme-combat/</link>
			<pubDate>Tue, 28 Apr 2020 16:53:16 GMT</pubDate>
			<description>Je remarque que les judokas...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Je remarque que les judokas qui exercent leur activité professionnelle dans le développement sont particulièrement recherchés. Je remarque également qu’ils restent assez longtemps dans la même entreprise et s’y épanouissent. Je fais ce constat sur la base de mon carnet d’adresses personnel et cela n’a en rien valeur de statistique. Mais ce constat me pousse à me demander si des synergies ou les similitudes existent entre ces 2 activités.<br />
<br />
En premier lieu, je tiens à souligner que le judo est un sport puisqu’il est au programme des JO, mais également un art martial. Et à ce titre, il ne se résume pas à une activité physique monolithique mais possède une dimension intellectuelle non négligeable.<br />
<br />
Bien entendu, l’analyse doit être réalisée sur des échantillons représentatifs. Un développeur est un professionnel de la production de code qui maitrise un ou plusieurs langages et évolue majoritairement dans une équipe en mode projet. Il est généralement titulaire d’un diplôme (master ingénieur) pour les plus jeunes ou d’une solide expérience pour les plus séniors<br />
Et dans le même souci de rigueur, on définira un judoka est un pratiquant de judo qui maitrise les techniques de son art dans suffisamment de secteurs (debout -sol…) pour y être reconnu comme tel. Nous limiterons donc notre étude aux ceintures noires.<br />
<br />
Quelles sont les qualités que l’on demande à un bon développeur :<br />
-	Produire un code propre et efficace<br />
-	S’intégrer dans une équipe<br />
-	S’adapter aux difficultés et trouver des solutions pour les surmonter<br />
<br />
Pour y parvenir, il devra s’entrainer et apprendre les techniques de programmation, ne pas redouter de sortir de sa zone de confort et se lancer sur des technologies nouvelles.<br />
Le judoka doit montrer des qualités similaires pour obtenir un judo efficace. Il doit répéter les mêmes mouvements à l’entrainement pendant de longues heures pour que son geste soit précis et rapide. Il doit disposer d’un arsenal varié de techniques qui seront adaptés à différents types d’adversaires (petits grand gaucher droitier attaquant contreur..).<br />
Et pour illustration de mon propos, ne parle-t-on pas couramment dans le domaine du code de (dojo – kata – randori…)<br />
<br />
Je ne parlerai pas du respect et de la maitrise de soi qui sont autant de valeurs piliers du judo et qui sont probablement très appréciées chez un développeur en équipe.</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9292/judo-developpement-meme-combat/</guid>
		</item>
		<item>
			<title>Implémentation de l’algorithme K-Means en java (partie 1)</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9284/implementation-l-algorithme-k-means-java-partie-1/</link>
			<pubDate>Tue, 28 Apr 2020 09:14:46 GMT</pubDate>
			<description>Pierre Schwartz vient de...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pierre Schwartz vient de publier sur Developpez.com <a href="https://khayyam.developpez.com/articles/data-science/clustering/k-means/" target="_blank">un article sur l’algorithme K-Means</a> qui est passionnant et qui vulgarise cette méthode de partitionnement des données de façon magistrale. Aussi j’ai souhaité implémenter son algorithme en Java.<br />
Le périmètre se limite à une population dont les individus sont caractérisés par 2 grandeurs ce qui permet de rester dans un plan euclidien.<br />
En première intention je vois l’utilisation de 3 objets :<br />
- <b>DataSet </b>(la population) qui possèdera toutes les méthodes de l’algorithme K-Means<br />
- <b>Point </b>(un individu)<br />
- <b>Centroide </b>(le centre d’un cluster)<br />
<br />
Le test devrait s’effectuer de cette facon :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Test <span class="br0">&#123;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main<span class="br0">&#40;</span>String<span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;D&eacute;but de l'algo K-Means&quot;</span><span class="br0">&#41;</span>;
		<span style="color: #808080;">//cr&eacute;ation du dataset</span>
                DataSet dataset = <span style="color: #0000ff;">new</span> DataSet<span class="br0">&#40;</span><span class="br0">&#41;</span>; 
                <span style="color: #808080;">//injection de la population dans le dataset</span>
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">2</span>,<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">4</span>,<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">-1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">-2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">-2</span>,<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">-4</span>,<span style="color: #cc66cc;">-1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">5</span>,<span style="color: #cc66cc;">-1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">7</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">-2</span>,<span style="color: #cc66cc;">-8</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addData<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">-4</span>,<span style="color: #cc66cc;">6</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		<span style="color: #808080;">//initialisation de 3 centroides</span>
		dataset.addCentroide<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Centroide<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">-1</span>,<span style="color: #cc66cc;">-2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addCentroide<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Centroide<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">4</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		dataset.addCentroide<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Centroide<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> Point<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		<span style="color: #808080;">//l&#146;algo k-means</span>
		dataset.kMeans<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Fin de l'algo K-Means&quot;</span><span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Et si nous mettions dans l’algo un espion d’affichage des valeurs des centroides pour chaque étape nous obtiendrions :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">
Début de l'algo K-Means
Centroide étape 1 : [center=Point [x=-1.0, y=-2.0], center=Point [x=1.0, y=4.0], center=Point [x=0.0, y=1.0]]
Centroide étape 2 : [center=Point [x=-1.0, y=-3.0], center=Point [x=-0.3333333333333333, y=5.0], center=Point [x=1.8, y=1.0]]
Centroide étape 3 : [center=Point [x=-1.6666666666666667, y=-3.6666666666666665], center=Point [x=-1.6666666666666667, y=5.0], center=Point [x=2.3333333333333335, y=0.6666666666666666]]
Centroide étape 4 : [center=Point [x=-3.0, y=-4.5], center=Point [x=-1.6666666666666667, y=5.0], center=Point [x=2.142857142857143, y=0.2857142857142857]]
Fin de l'algo K-Means</pre></td></tr></table></pre>
</div>Je laisse les lecteurs vérifier que mes valeurs sont correctes. <br />
Je pars du principe que l’algo K-Means est composé de 3 étapes :<br />
1/ Initialisation des centroïdes <br />
2/ Assignation d’un cluster à chaque centroïde<br />
3/ Recalcul des coordonnées de chaque centroïde pour le positionner en barycentre de son cluster <br />
<br />
On boucle sur les 2 dernières étapes tant que calcul de barycentration ne converge pas.<br />
<br />
Je proposerai dans un prochain billet (la partie 2) les objets <b>Point </b>et <b>Centroide</b>.</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9284/implementation-l-algorithme-k-means-java-partie-1/</guid>
		</item>
		<item>
			<title><![CDATA[Capturer la réponse d'un serveur web en Java]]></title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9257/capturer-reponse-d-serveur-web-java/</link>
			<pubDate>Wed, 22 Apr 2020 15:54:35 GMT</pubDate>
			<description>Lors d’un pentest web il est...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Lors d’un pentest web il est intéressant de voir le contenu de ce qui est échangé entre le serveur et le navigateur. Pas uniquement le body mais également le header et le statut de la réponse du serveur. Et pour tout ceux qui aiment le Java plus que les fenêtres de Burp, il est intéressant de pouvoir mettre toute ces données dans un objet Java. <br />
Il ainsi possible de faire directement en java des directement traitements sur le contenu (body et header) et de développer (dans un langage propre) une batterie d’outils pour de la crypto ou de la stegano.<br />
<br />
Dans ce premier billet je vous propose de poser les bases d’une classe Java que l’on construit avec l’URL du site à évaluer et qui stocke les paramètres de la réponse du serveur dans un format exploitable : <br />
 - String pour le Body<br />
 - Int pour le StatusCode<br />
 - Et une collection pour les composants du header<br />
<br />
En réalité, cette classe s’appuie sur la nouvelle API HTTP du JDK en standard depuis java 11 :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> WebPage <span class="br0">&#123;</span>
	<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> statusCode;
	<span style="color: #0000ff;">private</span> Map&lt;String,List&lt;String&gt;&gt; header;
	<span style="color: #0000ff;">private</span> String body;
	<span style="color: #0000ff;">private</span> String url;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> getStatusCode<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> statusCode;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> Map&lt;String, List&lt;String&gt;&gt; getHeader<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> header;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> String getBody<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> body;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> WebPage<span class="br0">&#40;</span>String URL<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.url = URL;
		HttpClient httpClient = HttpClient.newHttpClient<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		HttpRequest request = HttpRequest.newBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>.uri<span class="br0">&#40;</span>URI.create<span class="br0">&#40;</span><span style="color: #0000ff;">this</span>.url<span class="br0">&#41;</span><span class="br0">&#41;</span>.GET<span class="br0">&#40;</span><span class="br0">&#41;</span>.build<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		HttpResponse response;
		<span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
			response = httpClient.send<span class="br0">&#40;</span>request, BodyHandlers.ofString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
			<span style="color: #0000ff;">this</span>.statusCode = response.statusCode<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		    header = response.headers<span class="br0">&#40;</span><span class="br0">&#41;</span>.map<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		    body = response.body<span class="br0">&#40;</span><span class="br0">&#41;</span>.toString<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>IOException | InterruptedException e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		      e.printStackTrace<span class="br0">&#40;</span><span class="br0">&#41;</span>;
	    <span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Elle s’exploite de cette façon :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Test <span class="br0">&#123;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main<span class="br0">&#40;</span>String<span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;D&eacute;but de traitement&quot;</span><span class="br0">&#41;</span>;
		WebPage page = <span style="color: #0000ff;">new</span> WebPage<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;https://marcautran.developpez.com/&quot;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Status  : &quot;</span> + page.getStatusCode<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Headers : &quot;</span> + page.getHeader<span class="br0">&#40;</span><span class="br0">&#41;</span>.get<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;last-modified&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Body    : &quot;</span> + page.getBody<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Fin de traitement&quot;</span><span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Conformément à l’éthique je me limite au hack sur mes propres pages et sur mes propres serveurs.<br />
Mais plus sérieusement on peut voir que j’ai choisi d’afficher le body (le code HTML de la page) et la date de dernière modification de cette page sur le serveur. Dans un prochain billet, je montrerai comment enrichir cette classe pour construire une requête vers le serveur. Et oui, Burp ne nous apporte que sa couche graphique… oui un peu plus si on prend Burp Suite pro</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9257/capturer-reponse-d-serveur-web-java/</guid>
		</item>
		<item>
			<title><![CDATA[Modélisation d'une pandémie en JAVA]]></title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9188/modelisation-d-pandemie-java/</link>
			<pubDate>Sun, 12 Apr 2020 16:15:30 GMT</pubDate>
			<description>En réaction à cette actualité...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">En réaction à cette actualité <a href="https://www.developpez.net/forums/d2058243-10/club-professionnels-informatique/actualites/pourquoi-projet-francais-d-application-stopcovid-fera-tres-probablement-ide/" target="_blank">https://www.developpez.net/forums/d2...bablement-ide/</a>  , il me semble intéressant de connaitre comment le gouvernement modélise la pandémie. Car on ne connait pas grand-chose sur ce COVID19. En effet, on ne sait pas s’il se transmet autrement que par les postillons. On ne connait pas la durée d’immunisation après une guérison….<br />
J’ai donc rassemblé les informations que j’avais et j’ai tenté une modélisation naïve en JAVA. Je me suis dit que comme JAVA était un langage enseigné depuis maintenant 25 ans, la plupart des lecteurs de DVP sauraient le comprendre.<br />
Mon idée est de modéliser un individu (caractéristiques + comportement) et la façon dont son interaction avec les autres propage le virus. Pour ce qui nous concerne je suis partie d’une classe Individu qui possède un nom et un sexe ainsi qu’un statut sérologique vis avis du virus.<br />
Les caractéristiques sérologiques sont :<br />
•	Possède-t-il des antigènes<br />
•	Possède-t-il des anticorps<br />
S’il possède des antigènes (avec ou sans anticorps) il est alors malade et contagieux<br />
S’il possède des anticorps et pas d’antigènes il est guéri, donc immunisé et non contagieux<br />
S’il ne possède ni antigène ni anticorps il n’est pas malade ni immunisé mais pas contagieux<br />
J’ai également ajouté une propriété (et ses getter/setter) pour le port du masque<br />
La méthode toString() que j’ai surchargée permettra à l’objet de ce décrire et la méthode healthReport() donnera le statut de l’individu vis-à-vis de la maladie.<br />
Quant aux interactions, elles sont modélisées par la méthode approachOther() qui invoquera chez les individus concernés, par cette transmission possible du virus, la méthode contaminate()<br />
Mon scenario de test est le suivant :<br />
Je crée 3 individus :<br />
2 hommes qui n’ont jamais été contaminés<br />
1 femme malade.<br />
La femme sans masque approche un homme sans masque et le contamine<br />
La femme avec un masque approche l’autre homme mais porte un masque donc ne le contamine pas.<br />
L’homme contaminé gueri et approche l’autre homme et ne le contamine pas (bien que ne portant pas de masque tous les 2)<br />
Voice le scenario en java :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> main<span class="br0">&#40;</span>String<span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;D&eacute;but simulation COVID19&quot;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;homme1 non contamin&eacute;&quot;</span><span class="br0">&#41;</span>;
		Individu homme1 = <span style="color: #0000ff;">new</span> Individu<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Homme1&quot;</span>, <span style="color: #0000ff;">true</span>, <span style="color: #0000ff;">false</span>, <span style="color: #0000ff;">false</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme1.toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme1.healthReport<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;femme1 malade&quot;</span><span class="br0">&#41;</span>;
		Individu femme1 = <span style="color: #0000ff;">new</span> Individu<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Femme1&quot;</span>, <span style="color: #0000ff;">false</span>, <span style="color: #0000ff;">true</span>, <span style="color: #0000ff;">true</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>femme1.toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>femme1.healthReport<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;homme2 non contamin&eacute;&quot;</span><span class="br0">&#41;</span>;
		Individu homme2 = <span style="color: #0000ff;">new</span> Individu<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Homme2&quot;</span>, <span style="color: #0000ff;">true</span>, <span style="color: #0000ff;">false</span>, <span style="color: #0000ff;">false</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme2.toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme2.healthReport<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;femme1 rencontre homme1&quot;</span><span class="br0">&#41;</span>;
		femme1.approachOther<span class="br0">&#40;</span>homme1<span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme1.toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme1.healthReport<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;femme1 met un masque&quot;</span><span class="br0">&#41;</span>;
		femme1.setWearMask<span class="br0">&#40;</span><span style="color: #0000ff;">true</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;femme1 rencontre homme2&quot;</span><span class="br0">&#41;</span>;	
		femme1.approachOther<span class="br0">&#40;</span>homme2<span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme2.toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme2.healthReport<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;homme1 gueri&quot;</span><span class="br0">&#41;</span>;
		homme1.setAntigene<span class="br0">&#40;</span><span style="color: #0000ff;">false</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme1.toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme1.healthReport<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;homme1 rencontre homme2&quot;</span><span class="br0">&#41;</span>;
		homme1.approachOther<span class="br0">&#40;</span>homme2<span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme2.toString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span>homme2.healthReport<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Fin simulation COVID19&quot;</span><span class="br0">&#41;</span>;
	<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Qui donne le résultat suivant :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td valign="top"><pre style="margin: 0"> 
Début simulation COVID19
homme1 non contaminé
Individu [name=Homme1, male=true, antigene=false, anticorps=false, wearMask=false]
non contaminé non immunisé
femme1 malade
Individu [name=Femme1, male=false, antigene=true, anticorps=true, wearMask=false]
malade
homme2 non contaminé
Individu [name=Homme2, male=true, antigene=false, anticorps=false, wearMask=false]
non contaminé non immunisé
femme1 rencontre homme1
Individu [name=Homme1, male=true, antigene=true, anticorps=true, wearMask=false]
malade
femme1 met un masque
femme1 rencontre homme2
Individu [name=Homme2, male=true, antigene=false, anticorps=false, wearMask=false]
non contaminé non immunisé
homme1 gueri
Individu [name=Homme1, male=true, antigene=false, anticorps=true, wearMask=false]
immunisé
homme1 rencontre homme2
Individu [name=Homme2, male=true, antigene=false, anticorps=false, wearMask=false]
non contaminé non immunisé
Fin simulation COVID19</pre></td></tr></table></pre>
</div>Et voici maintenant la classe individu : <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Individu <span class="br0">&#123;</span>
	<span style="color: #0000ff;">private</span> String name;
	<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">boolean</span> male;
	<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">boolean</span> antigene;
	<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">boolean</span> anticorps;
	<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">boolean</span> wearMask;
	<span style="color: #0000ff;">public</span> Individu<span class="br0">&#40;</span>String pName, <span style="color: #0000ff;">boolean</span> pMale, <span style="color: #0000ff;">boolean</span> pAntigene, <span style="color: #0000ff;">boolean</span> pAnticorps<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.name = pName;
		<span style="color: #0000ff;">this</span>.male = pMale;
		<span style="color: #0000ff;">this</span>.anticorps = pAnticorps;
		<span style="color: #0000ff;">this</span>.antigene = pAntigene;
		<span style="color: #0000ff;">this</span>.wearMask = <span style="color: #0000ff;">false</span>;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> approachOther<span class="br0">&#40;</span>Individu person<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		person.contaminate<span class="br0">&#40;</span><span style="color: #0000ff;">this</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">this</span>.contaminate<span class="br0">&#40;</span>person<span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> contaminate<span class="br0">&#40;</span>Individu person<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>!<span class="br0">&#40;</span><span style="color: #0000ff;">this</span>.isAnticorps<span class="br0">&#40;</span><span class="br0">&#41;</span> || <span style="color: #0000ff;">this</span>.isAntigene<span class="br0">&#40;</span><span class="br0">&#41;</span> || <span style="color: #0000ff;">this</span>.isWearMask<span class="br0">&#40;</span><span class="br0">&#41;</span> || person.isWearMask<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>person.isAntigene<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span style="color: #0000ff;">this</span>.setAntigene<span class="br0">&#40;</span><span style="color: #0000ff;">true</span><span class="br0">&#41;</span>;
				<span style="color: #0000ff;">this</span>.setAnticorps<span class="br0">&#40;</span><span style="color: #0000ff;">true</span><span class="br0">&#41;</span>;
			<span class="br0">&#125;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #339933;">@Override</span>
	<span style="color: #0000ff;">public</span> String toString<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;Individu [name=&quot;</span> + name + <span style="color: #FF0000;">&quot;, male=&quot;</span> + male + <span style="color: #FF0000;">&quot;, antigene=&quot;</span> + antigene + <span style="color: #FF0000;">&quot;, anticorps=&quot;</span> + anticorps
				+ <span style="color: #FF0000;">&quot;, wearMask=&quot;</span> + wearMask + <span style="color: #FF0000;">&quot;]&quot;</span>;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> String healthReport<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">this</span>.isAntigene<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span><span style="color: #FF0000;">&quot;malade&quot;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0000ff;">this</span>.isAnticorps<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;immunis&eacute;&quot;</span>;
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;non contamin&eacute; non immunis&eacute;&quot;</span>;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> isAntigene<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> antigene;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setAntigene<span class="br0">&#40;</span><span style="color: #0000ff;">boolean</span> antigene<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.antigene = antigene;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> isAnticorps<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> anticorps;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setAnticorps<span class="br0">&#40;</span><span style="color: #0000ff;">boolean</span> anticorps<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.anticorps = anticorps;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> isMale<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> male;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> isWearMask<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> wearMask;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setWearMask<span class="br0">&#40;</span><span style="color: #0000ff;">boolean</span> wearMask<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">this</span>.wearMask = wearMask;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> String getName<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">return</span> name;
	<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div>Si vous jugez que les bases de cette modélisation sont erronées, n’hésitez pas à me le dire, et je corrigerai le modèle. Je prévois de poursuivre cette simulation en ajoutant des facteurs de guérison (age – sexe..) et de randomiser la séroconversion avec d’autres propriétés que j’ajouterai à la classe individu comme la sensibilisation aux gestes barrière…<br />
Si le JAVA vous dérange et que vous préférez que je fasse la simulation sous Excel avec un peu de VBA faites moi signe également, je serai toujours heureux de travailler en équipe avec des gens intéressés.<br />
<br />
Aidons les soignant – Restons confiné – Appliquons les gestes barrière</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9188/modelisation-d-pandemie-java/</guid>
		</item>
		<item>
			<title>Traitement d’un fichier de configuration mixte en java Partie 3</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9163/traitement-d-fichier-configuration-mixte-java-partie-3/</link>
			<pubDate>Mon, 06 Apr 2020 17:43:06 GMT</pubDate>
			<description>Ce billet va montrer comment...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Ce billet va montrer comment exploiter un ficher de configuration httpd.conf.properties obtenu dans le post précédant.<br />
Voici le fichier :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td valign="top"><pre style="margin: 0">
ThreadsPerChild=250
MaxRequestsPerChild= 0
Listen=80
ServerRoot=&quot;/www/Apache22&quot;
DocumentRoot=&quot;/THDL/thdl-site&quot;
ServerName=localhost:80
ServerAdmin=admin@localhost
ErrorLog=logs/error.log
LogLevel=error
LoadModule=alias_module modules/mod_alias.so
LoadModule=authz_host_module modules/mod_authz_host.so
LoadModule=autoindex_module modules/mod_autoindex.so
LoadModule=dir_module modules/mod_dir.so
LoadModule=log_config_module modules/mod_log_config.so
LoadModule=mime_module modules/mod_mime.so
LoadModule=rewrite_module modules/mod_rewrite.so
LoadModule=setenvif_module modules/mod_setenvif.so
DefaultType=text/plain
IndexIgnore=.htaccess
Redirect=/thdl http://localhost
Include=conf/extra/httpd-autoindex.conf
Include=conf/extra/httpd-languages.conf
Include=conf/extra/httpd-info.conf
Include=conf/extra/httpd-manual.conf
Include=conf/extra/httpd-default.conf
Include=conf/Suite-extra/components.conf
LoadFile=&quot;C:/www/php5/php5ts.dll&quot;
LoadModule=php5_module &quot;C:/www/php5/php5apache2.dll&quot;</pre></td></tr></table></pre>
</div>On remarque immédiatement un problème de clé qui sont mentionées pmusieurs fois avec es valeur différentes. Ce sont les clés Include et LoadModule. En effet on peut charger plusieurs modules et inclure plusieurs fichiers. Nous devons mettre toutes les valeurs dans une seule clé afin d’obtenir le fichier suivant :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td valign="top"><pre style="margin: 0">
ThreadsPerChild=250
MaxRequestsPerChild= 0
Listen=80
ServerRoot=&quot;/www/Apache22&quot;
DocumentRoot=&quot;/THDL/thdl-site&quot;
ServerName=localhost:80
ServerAdmin=admin@localhost
ErrorLog=logs/error.log
LogLevel=error
DefaultType=text/plain
IndexIgnore=.htaccess
Redirect=/thdl http://localhost
LoadFile=&quot;C:/www/php5/php5ts.dll&quot;
Include=conf/extra/httpd-autoindex.confconf/extra/httpd-languages.confconf/extra/httpd-info.confconf/extra/httpd-manual.confconf/extra/httpd-default.confconf/Suite-extra/components.conf
LoadModule=alias_module modules/mod_alias.soauthz_host_module modules/mod_authz_host.soautoindex_module modules/mod_autoindex.sodir_module modules/mod_dir.solog_config_module modules/mod_log_config.somime_module modules/mod_mime.sorewrite_module modules/mod_rewrite.sosetenvif_module modules/mod_setenvif.sophp5_module &quot;C:/www/php5/php5apache2.dll&quot;</pre></td></tr></table></pre>
</div>Pour cela nous rajoutons une méthode à notre classe utilitaire (Util) qui prend en paramètre le nom du fichier à synthétiser<br />
Rentrons maintenant dans le vif du sujet, nous avons besoin d’une classe qui charge depuis ce fichier de propriétés les valeurs de paramétrage :<br />
<ul><li style="">ThreadsPerChild</li><li style="">MaxRequestsPerChild</li><li style="">Listen</li><li style="">ServerRoot</li><li style="">DocumentRoot</li><li style="">….</li><li style="">LoadModule</li></ul><br />
Rien ne sera plus simple avec la core library de java (java.util) et sa classes Properties<br />
La classe portera le nom de Configuration et sera utilisable de cette facon :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
		Configuration conf = <span style="color: #0000ff;">new</span> Configuration<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;httpd.conf.properties&quot;</span><span class="br0">&#41;</span>;
		System.out.println<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;les modules charg&eacute;es sont : &quot;</span> + conf.getLoadModule<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>On construit une instance de cette classe en passant à son constructeur le nom du fichier de conf et on appelle les propriétés que l’on souhaite afficher. Voici le code source de cette classe limité à une propriété pour ne pas être trop verbeux.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Configuration <span class="br0">&#123;</span>
 <span style="color: #0000ff;">private</span> String loadModule;
 <span style="color: #0000ff;">public</span> Configuration<span class="br0">&#40;</span>String fileName<span class="br0">&#41;</span> <span class="br0">&#123;</span>
	 Properties prop = <span style="color: #0000ff;">new</span> Properties<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
			FileInputStream inputStream = <span style="color: #0000ff;">new</span> FileInputStream<span class="br0">&#40;</span>fileName<span class="br0">&#41;</span>;
			prop.load<span class="br0">&#40;</span>inputStream<span class="br0">&#41;</span>;
			<span style="color: #0000ff;">this</span>.loadModule = prop.getProperty<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;LoadModule&quot;</span><span class="br0">&#41;</span>;
		<span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>IOException e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			e.printStackTrace<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span class="br0">&#125;</span>
 <span class="br0">&#125;</span>
 <span style="color: #0000ff;">public</span> String getLoadModule<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span style="color: #0000ff;">return</span> loadModule;
 <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9163/traitement-d-fichier-configuration-mixte-java-partie-3/</guid>
		</item>
		<item>
			<title>Traitement d’un fichier de configuration mixte en java Partie 2</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9158/traitement-d-fichier-configuration-mixte-java-partie-2/</link>
			<pubDate>Sun, 05 Apr 2020 16:32:03 GMT</pubDate>
			<description>dans ce post...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">dans ce <a href="https://www.developpez.net/forums/blogs/863457-autran/b9156/parser-fichiers-configuration-mixtes/" target="_blank">post</a>, nous avions besoin d’analyser le contenu d’un fichier de configuration qui est écrit en XML, mais qui contient également des classiques pairs de clé/valeur. Et comme notre analyse pourrait être menée sur une ferme de serveurs (par exemple dans le cadre d’un audit de sécurité) il n’est pas question de le faire à la main. ce Billet va donc montrer comment faire ce job automatiquement en Java.<br />
Pour illustrer mon propos je vais faire la démonstration sur un fichier de configuration Apache (le fameux <i>httpd.conf</i>). Voici à quoi il ressemble :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br /></div></td><td valign="top"><pre style="margin: 0">
###*********************************************************
###*  Secured configuration                                *
###*  Apache configuration file                            *
###*  No need 4 hardening                                  *
###*  v1.95-httpd22-ssl                                    *
###*********************************************************


ThreadsPerChild 250
MaxRequestsPerChild  0

Listen 80

ServerRoot &quot;/www/Apache22&quot;
DocumentRoot &quot;/THDL/thdl-site&quot;
## was /www/webroot

ServerName localhost:80
ServerAdmin admin@localhost

ErrorLog logs/error.log
LogLevel error

###
# Note that the following LoadModule lines only represent the minimum 'Web-Developer' Suite configuration.
#
# Also note that some of the following LoadModule lines, which are commented out, are still loaded under…
# confSuite-extra*.conf
# confextra*.conf
# …configuration files -- for modular reasons.
# 
# For example:
# mod_deflate is loaded under confSuite-extramod_deflate_logio.conf and NOT under httpd.conf
# status_module is loaded under confextrahttpd-info.conf and NOT under httpd.conf
#
# Check last part of httpd.conf for the Apache base and 'Web-Developer' *.conf files that are included.
###

#LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
#LoadModule asis_module modules/mod_asis.so
#LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_default_module modules/mod_authn_default.so
#LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_default_module modules/mod_authz_default.so
#LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
#LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule cern_meta_module modules/mod_cern_meta.so
#LoadModule cgi_module modules/mod_cgi.so
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
#LoadModule env_module modules/mod_env.so
#LoadModule expires_module modules/mod_expires.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule headers_module modules/mod_headers.so
#LoadModule imagemap_module modules/mod_imagemap.so
#LoadModule include_module modules/mod_include.so
#LoadModule info_module modules/mod_info.so
#LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule negotiation_module modules/mod_negotiation.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule status_module modules/mod_status.so
#LoadModule unique_id_module modules/mod_unique_id.so
#LoadModule userdir_module modules/mod_userdir.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
&lt;IfDefine SSL&gt;
	LoadModule ssl_module modules/mod_ssl.so
&lt;/IfDefine&gt;


DefaultType text/plain

&lt;IfModule dir_module&gt;
    DirectoryIndex index.html index.php index.aspx
&lt;/IfModule&gt;

IndexIgnore .htaccess
&lt;FilesMatch &quot;^.ht&quot;&gt;
    Order allow,deny
    Deny from all
&lt;/FilesMatch&gt;


Redirect /thdl http://localhost

&lt;Directory /&gt;
    Options FollowSymLinks
    AllowOverride all
    Order deny,allow
    Allow from all
    Satisfy all
&lt;/Directory&gt;

## was /www/webroot
&lt;Directory &quot;/THDL/thdl-site&quot;&gt;
    Options Indexes FollowSymLinks
    AllowOverride all
    Order allow,deny
    Allow from all
&lt;/Directory&gt;

&lt;IfModule mime_module&gt;
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
&lt;/IfModule&gt;


# Apache base configuration
#
# The configuration files in the conf/extra/ directory can be 
# included to add extra features or to modify the default configuration of 
# the server.

# Server-pool management (MPM specific)
#Include conf/extra/httpd-mpm.conf

# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf

# Fancy directory listings
Include conf/extra/httpd-autoindex.conf

# Language settings
Include conf/extra/httpd-languages.conf

# User home directories
#Include conf/extra/httpd-userdir.conf

# Real-time info on requests and configuration
Include conf/extra/httpd-info.conf

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

# Local access to the Apache HTTP Server Manual
Include conf/extra/httpd-manual.conf

# Distributed authoring and versioning (WebDAV)
#Include conf/extra/httpd-dav.conf

# Various default settings
Include conf/extra/httpd-default.conf


# DeveloperSide.NET Server-Suite Configuration
#
# The configuration files in the conf/Suite-extra/ directory can be 
# included to add extra features or to modify the default configuration of 
# the server.
#
# The specifics are loaded under components.conf…

Include conf/Suite-extra/components.conf


# Security check -- if no php5 module is loaded, Apache should return 'permissions denied' on php5 all URL requests
&lt;IfModule !php5_module&gt;
	&lt;Location /&gt;
		&lt;FilesMatch &quot;.php5$&quot;&gt;
			Order allow,deny
			Deny from all
		&lt;/FilesMatch&gt;
	&lt;/Location&gt;
&lt;/IfModule&gt;

#For PHP5
LoadFile &quot;C:/www/php5/php5ts.dll&quot;
LoadModule php5_module &quot;C:/www/php5/php5apache2.dll&quot;

&lt;IfModule php5_module&gt;
	#PHPIniDir &quot;C:/Windows&quot;

	&lt;Location /&gt;
		AddType text/html .php .phps
		AddHandler application/x-httpd-php .php
		AddHandler application/x-httpd-php-source .phps
	&lt;/Location&gt;

&lt;/IfModule&gt;

&lt;IfModule ssl_module&gt;
	Include conf/extra/httpd-ssl.conf
	SSLRandomSeed startup builtin
	SSLRandomSeed connect builtin
&lt;/IfModule&gt;

## Added for MYsql/PMA based on guide.
&lt;IfModule mod_alias.c&gt;
     Alias /phpMyAdmin &quot;C:/www/phpMyAdmin&quot;
&lt;/IfModule&gt;

&lt;Directory &quot;C:/www/phpMyAdmin&quot;&gt;
     Options None
     AllowOverride None
     order deny,allow
     deny from all
     allow from 127.0.0.1
&lt;/Directory&gt;</pre></td></tr></table></pre>
</div>Dans un premier temps je vais le transformer en un fichier XML et un fichier traditionnel du siècle précédent .properties. Je dois donc transformer mon fichier httpd.conf en un fichier <i>httpd.conf.xml</i> et un fichier <i>httpd.conf.properties</i><br />
J’ai choisi ce fichier qui me semble assez significatif de ce que l’on peut trouver. On y remarque 3 choses :<br />
-	Il y a beaucoup de commentaires verbeux autant qu’inutiles et que l’on peut repérer facilement puisqu’il commence par un #<br />
-	Les ligne clé/valeur sont sur le modèle clé + un espace + valeur et il commence sans indentation<br />
-	Les ligne XML (plutôt bien formées) sont facilement repérables car ils comprennent une balise du style &lt;maBalise&gt;  ou commencent par un espace (voire une tabulation)<br />
Je vais donc créer une classe utilitaire (Util) avec 3 méthodes (Static) permettant de générer depuis un nom de fichier passé en paramètre :<br />
-	Un fichier sans commentaires <br />
-	Un fichier uniquement XML<br />
-	Un fichier clé valeur<br />
<br />
<u>1/ La méthode de nettoyage des commentaires :</u><br />
On remarque que l’on peut choisir le caractère de début d’une ligne de commentaires<br />
On profite également de cette opération de nettoyage pour se débarrasser des lignes vides<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> removeComments<span class="br0">&#40;</span>String fileName, String beginComments<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		File inputFile = <span style="color: #0000ff;">new</span> File<span class="br0">&#40;</span>fileName<span class="br0">&#41;</span>;
		File clearFile = <span style="color: #0000ff;">new</span> File<span class="br0">&#40;</span>fileName+<span style="color: #FF0000;">&quot;.clear&quot;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
			BufferedReader reader = <span style="color: #0000ff;">new</span> BufferedReader<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> FileReader<span class="br0">&#40;</span>inputFile<span class="br0">&#41;</span><span class="br0">&#41;</span>;
			BufferedWriter writer = <span style="color: #0000ff;">new</span> BufferedWriter<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> FileWriter<span class="br0">&#40;</span>clearFile<span class="br0">&#41;</span><span class="br0">&#41;</span>;
			String content = <span style="color: #FF0000;">&quot;&quot;</span>;
			<span style="color: #0000ff;">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>content = reader.readLine<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> != <span style="color: #0000ff;">null</span><span class="br0">&#41;</span>  <span class="br0">&#123;</span>
				<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>content.length<span class="br0">&#40;</span><span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span> &amp;&amp; !content.contains<span class="br0">&#40;</span>beginComments<span class="br0">&#41;</span> &amp;&amp; content != <span style="color: #FF0000;">&quot;&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
					writer.write<span class="br0">&#40;</span>content<span class="br0">&#41;</span>;
					writer.write<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>&quot;</span><span class="br0">&#41;</span>;
				<span class="br0">&#125;</span>
			<span class="br0">&#125;</span>
			reader.close<span class="br0">&#40;</span><span class="br0">&#41;</span>;
			writer.close<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>IOException e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			e.printStackTrace<span class="br0">&#40;</span><span class="br0">&#41;</span>;
			<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;
		<span class="br0">&#125;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span>;
	<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><u>2/ La méthode de génération du fichier XML</u> <br />
On prendra comme fichier d’entrée un fichier expurgé des commentaires <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> file2Xml<span class="br0">&#40;</span>String fileName<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		File inputFile = <span style="color: #0000ff;">new</span> File<span class="br0">&#40;</span>fileName<span class="br0">&#41;</span>;
		File clearFile = <span style="color: #0000ff;">new</span> File<span class="br0">&#40;</span>fileName+<span style="color: #FF0000;">&quot;.xml&quot;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
			BufferedReader reader = <span style="color: #0000ff;">new</span> BufferedReader<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> FileReader<span class="br0">&#40;</span>inputFile<span class="br0">&#41;</span><span class="br0">&#41;</span>;
			BufferedWriter writer = <span style="color: #0000ff;">new</span> BufferedWriter<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> FileWriter<span class="br0">&#40;</span>clearFile<span class="br0">&#41;</span><span class="br0">&#41;</span>;
			String content = <span style="color: #FF0000;">&quot;&quot;</span>;
			<span style="color: #0000ff;">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>content = reader.readLine<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> != <span style="color: #0000ff;">null</span><span class="br0">&#41;</span>  <span class="br0">&#123;</span>
					<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>content.contains<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&lt;&quot;</span><span class="br0">&#41;</span> &amp;&amp; content.contains<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&gt;&quot;</span><span class="br0">&#41;</span> || content.charAt<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> == <span style="color: #FF0000;">' '</span> || content.charAt<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> == <span style="color: #FF0000;">'<span style="color: #800000;">\t</span>'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
						writer.write<span class="br0">&#40;</span>content<span class="br0">&#41;</span>;
						writer.write<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>&quot;</span><span class="br0">&#41;</span>;
					<span class="br0">&#125;</span>
			<span class="br0">&#125;</span>
			reader.close<span class="br0">&#40;</span><span class="br0">&#41;</span>;
			writer.close<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>IOException e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			e.printStackTrace<span class="br0">&#40;</span><span class="br0">&#41;</span>;
			<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;
		<span class="br0">&#125;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span>;
	<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
<u>3/ La méthode de génération du fichier de propriétés</u> <br />
<br />
On prendra toujours le même fichier en entrée<br />
Mais on le mettra sous la forme clé : valeur afin qu’il puisse automatiquement être chargé par l’API core de Java <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span> file2Prop<span class="br0">&#40;</span>String fileName<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		File inputFile = <span style="color: #0000ff;">new</span> File<span class="br0">&#40;</span>fileName<span class="br0">&#41;</span>;
		File clearFile = <span style="color: #0000ff;">new</span> File<span class="br0">&#40;</span>fileName+<span style="color: #FF0000;">&quot;.properties&quot;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">try</span> <span class="br0">&#123;</span>
			BufferedReader reader = <span style="color: #0000ff;">new</span> BufferedReader<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> FileReader<span class="br0">&#40;</span>inputFile<span class="br0">&#41;</span><span class="br0">&#41;</span>;
			BufferedWriter writer = <span style="color: #0000ff;">new</span> BufferedWriter<span class="br0">&#40;</span><span style="color: #0000ff;">new</span> FileWriter<span class="br0">&#40;</span>clearFile<span class="br0">&#41;</span><span class="br0">&#41;</span>;
			String content = <span style="color: #FF0000;">&quot;&quot;</span>;
			<span style="color: #0000ff;">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>content = reader.readLine<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> != <span style="color: #0000ff;">null</span><span class="br0">&#41;</span>  <span class="br0">&#123;</span>
					<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>!content.contains<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&lt;&quot;</span><span class="br0">&#41;</span> &amp;&amp; !content.contains<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&gt;&quot;</span><span class="br0">&#41;</span> &amp;&amp; content.charAt<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> != <span style="color: #FF0000;">' '</span> &amp;&amp; content.charAt<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> != <span style="color: #FF0000;">'<span style="color: #800000;">\t</span>'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
						<span style="color: #0000ff;">int</span> index = content.indexOf<span class="br0">&#40;</span><span style="color: #FF0000;">&quot; &quot;</span><span class="br0">&#41;</span>;
						String resultString = content.substring<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, index<span class="br0">&#41;</span> + <span style="color: #FF0000;">&quot;:&quot;</span> + content.substring<span class="br0">&#40;</span>index+<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>;
						writer.write<span class="br0">&#40;</span>resultString<span class="br0">&#41;</span>;
						writer.write<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>&quot;</span><span class="br0">&#41;</span>;
					<span class="br0">&#125;</span>
			<span class="br0">&#125;</span>
			reader.close<span class="br0">&#40;</span><span class="br0">&#41;</span>;
			writer.close<span class="br0">&#40;</span><span class="br0">&#41;</span>;
		<span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span> <span class="br0">&#40;</span>IOException e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			e.printStackTrace<span class="br0">&#40;</span><span class="br0">&#41;</span>;
			<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;
		<span class="br0">&#125;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span>;
	<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
Nous verrons dans un prochain billet comment traiter ces 2 fichiers en java pour évaluer la configuration de sécurité de la cible (le serveur)</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9158/traitement-d-fichier-configuration-mixte-java-partie-2/</guid>
		</item>
		<item>
			<title><![CDATA[Parser des fichiers de configuration "mixtes"]]></title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b9156/parser-fichiers-configuration-mixtes/</link>
			<pubDate>Sat, 04 Apr 2020 20:30:15 GMT</pubDate>
			<description>Au début du siècle, les...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Au début du siècle, les fichiers de configuration étaient encore une collection de clé/valeur<br />
Dans les années 2010 le XML s’est progressivement imposé comme format standard de configuration. C’est en particulier vrai dans le monde des serveurs JEE où les fichiers ont d’ailleurs une extension.xml<br />
En ce début de décennie, il apparait comme important de pouvoir exploiter automatiquement ces fichiers de configurations. En effet le DEVOPS et l’offre Cloud imposent de pouvoir les lire et les modifier à travers des outils. Sur ce point de nombreux outils graphiques d’orchestration (déploiement – monitoring…) permettent de configurer et lire les fichiers de configuration XML.<br />
<br />
Malheureusement, tout n’est pas si droit de l’œil et certains fichiers, s’ils ont adopté le balisage XML n’en pont pas pour autant renoncé à le mélanger avec les listes de propriétés et leurs valeurs. Un bon exemple de ces déviants est le fichier de configuration Apache httpd.conf<br />
Pour beaucoup d’acteurs du DEVOPS ils se contentent de ne lire et configurer que les fichiers XML en partant du principe que qu’ils surchargent les fichiers historiques. Et pour bien d’autres, ils n’exploitent que la portion répondant à la syntaxe XML de ces fichiers. Et d’un point de vue purement fonctionnel, ce comportement semble à première vue payant puisque les serveurs d’applications ainsi configurées fonctionnent avec les performances exigées et les facilités d’exploitation attendues.<br />
Néanmoins, ces fichiers mixtes sont des sources de vulnérabilités exploitables par des cyber-attaquants. Un exemple, toujours dans le fichier httpd.conf, est la valeur attribuée derrière la directive Include. La Valeur * devant être bannie pour éviter le hijacking.<br />
Il devient donc utile de pouvoir lire et modifier ces fichiers mixtes afin de réaliser des audits et des hardenings. Ces vulnérabilités sont aujourd’hui trackées et remédiées manuellement, mais le SecDevOps impose de pouvoir le faire automatiquement.<br />
L’objet de ce billet sera donc de poser les bases de l’exploitation de ces fichiers mixtes. Deux questions prégnantes se posent : <br />
1/Quelle méthode adopter pour parser ces fichiers ?<br />
2/Quel(s) langage(s) utiliser ?<br />
<br />
1/ L’idée de manœuvre pour le parsing<br />
De nombreux langages offrent la possibilité de traiter facilement un DOM XML mais également de traiter une liste de propriétés. Malheureusement les bibliothèques ne sont pas les mêmes, et les fichiers doivent être pur XML ou pur clé/valeur<br />
L’idée serait alors de spliter le fichier à analyser en deux sous fichiers, en expurgeant l’original du XML pour l’un et des lignes clé valeur pour l’autre. On serait ainsi en mesure de mener un parsing sur des fichiers uniformes.<br />
<br />
2/ Les Langages<br />
Traditionnellement les langages utilisés pour écrire des outils d’audit et de hardening sont dépendant des plate-formes à analyser. On retrouve donc traditionnellement du Bash sur les systèmes Unix et du PowerShell sur les serveurs Windows. Cette dichotomie possède l’avantage de pouvoir executer systématiquement car tous les unix possèderont un interpréteur shell (Bash KornShell…) et les Windows un interpréteur Powershell. En revanche le traitement du XML pur en Bash est difficile car il se fera à grands coups de sed ou hawk sans certitude de bien analyser la syntaxe XML. De plus, cela impose de développer 2 fois un outil si le serveur d’application est réparti sur des Unix et des Windows. Pour cette raison, certains ont opté pour des scripts python. Mais le python va requérir que l’interpréteur soit ajouté à la configuration du serveur.<br />
On voit que l’idéal serait d’utiliser un langage unique sur les 2 plateforme mais déjà présent nativement. Pour cette raison, si on suppose que les serveurs d’application sont JEE ou.Net, il parait intéressant de développer les scripts avec les langages qui portent ces technologies. Par exemple, pour les serveurs d’application JEE, le langage Java permettra de faire le job quel que soit l’OS support et on aura la garantie que la JVM sera toujours présente.<br />
<br />
Aussi dans le prochain post, je vais parser un fichier httpd.conf en java afin de valider l’efficacité de la méthode naïve décrite d’une part, et la capacité de Java pour ce genre de tache dans une optique d’industrialisation d’autre part.</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b9156/parser-fichiers-configuration-mixtes/</guid>
		</item>
		<item>
			<title>Consultant en cybersécurité : Un métier d’avenir pour les développeurs juniors.</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b7361/consultant-cybersecurite-metier-d-avenir-developpeurs-juniors/</link>
			<pubDate>Sun, 21 Apr 2019 13:12:29 GMT</pubDate>
			<description>Aujourd’hui un développeur...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Aujourd’hui un développeur junior à 2 choix d’évolution de carrière en France :<br />
•	Rester développeur à des tarifs inférieurs à ce que la décence exige.<br />
•	Devenir chef de projet et abandonner la technique.<br />
<br />
Mais peu de développeurs savent qu’une troisième voie existe pour échapper à cette fatalité typiquement française : devenir consultant en cybersécurité.<br />
<br />
Je me limite volontairement à la population des développeurs juniors (c’est-à-dire des Bac+5 avec moins de 8 ans d’expérience.<br />
Il est entendu qu’un lead developer maitrisant de nombreuses technologies ou un core API developer évoluera sur des salaires beaucoup plus confortables.<br />
<br />
En effet un développeur junior qui possède plus de 2 ans d’expérience en développement (quel que soit le langage) est un asset qui maitrise les bases techniques de l’informatique (Tout n’est que code source).<br />
Il est donc quasiment prêt à réaliser des missions de cybersécurité. Les premières missions seront conduites sous la bienveillance d’un consultant sénior, le temps que le junior s’imprègne de la culture cybersécurité et des référentiels. <br />
<br />
Ce métier permet au consultant de rester dans le domaine technique (auditeur de code source – expert sécurité DEVOPS – Pentester applicatif), tout en évoluant vers un statut et un salaire immédiatement supérieur. Et dans un deuxième temps, il pourra s’essayer à des missions de gouvernance et d’analyse de risque tout en gardant la possibilité de revenir sur le domaine technique.</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b7361/consultant-cybersecurite-metier-d-avenir-developpeurs-juniors/</guid>
		</item>
		<item>
			<title>Recruter des professeurs de mathématiques</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b4693/recruter-professeurs-mathematiques/</link>
			<pubDate>Mon, 12 Feb 2018 16:58:13 GMT</pubDate>
			<description>Je profite de la publication...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Je profite de la publication du rapport Villani sur l’enseignement des mathématiques pour proposer une piste de réflexion qui permettrait de sortir d’une impasse purement française : l’éducation nationale ne parvient pas à recruter de professeurs de mathématiques.<br />
Ce billet n’a pas vocation à rappeler les 21 mesures (de bon sens) que propose notre médaillé Fields. D’autres médias français se sont déjà livrés à cet exercice dans le détail.<br />
Néanmoins on constate que la notoriété (légitime) de notre mathématicien lui permet de faire évoluer les mentalités du plus pléthorique et préhistorique des ministères de l’état. Alors profitons de cette dynamique pour proposer des mesures modernes.<br />
<br />
La problématique semble simple, les « matheux » français ne veulent pas devenir professeur de mathématiques. Les 2 principaux freins au recrutement sont :<br />
<ul><li style="">La rémunération faible d’un professeur de mathématiques (Physique..)</li><li style="">Le manque de valorisation des mathématiques et des matières scientifiques, en particulier au collège.</li></ul><br />
Depuis 20 ans l’éducation nationale s’entête sur la rémunération des professeurs de mathématiques sans jamais remettre en cause son modèle basé sur le fonctionnariat. La problématique est pourtant simple, on propose aujourd’hui à des jeunes diplômés de devenir fonctionnaires (de travailler beaucoup moins que dans le privé) donc de coûter cher au contribuable mais de gagner peu. Alors que ces mêmes diplômés ne rêvent que de travailler plus et de gagner plus, mais ne souhaitent pas devenir fonctionnaires. La meilleure preuve en est qu’ils partent tous dans le privé pour des emplois d’ingénieurs ou développeurs. Pourquoi imposer cette idée que pour être un bon (voire un grand) professeur il faut impérativement être fonctionnaire. Non, Enseignement n’est pas un synonyme de fonction publique !<br />
Une solution serait de faire appel à des sociétés de services intellectuels qui dispenseraient des enseignements de mathématiques dans les collèges et lycées. <br />
Ce modèle est viable et fonctionne depuis des décennies dans l’informatique. Nombreux sont les ministères et collectivités territoriales qui font appel à des SSII pour développer et opérer leurs systèmes d’information. Ce système permettrait de mieux rémunérer les enseignants externalisés dans la mesure ou l’état ne serait pas dans l’obligation de leur financer 3 mois et demi de vacances ni une retraite de la fonction publique.<br />
Bien entendu, les programmes seraient respectés puisqu’ils constituaient le cahier des charges contractuels entre les SSI et le ministère de l’éducation. Ce processus serait même vertueux au point de promouvoir le corps des inspecteurs au rang d’assistance à maîtrise d’ouvrage pour vérifier la bonne réalisation de la prestation et la conformité aux programmes nationaux.<br />
Cette solution permettrait également d’adresser le dévalorisation des mathématiques (surtout au collège) qui exclu de l’équipe enseignante bon nombre de professeurs de mathématiques. En faisant simplement disparaître le problème. En effet, de cette façon les enseignants scientifiques ne cohabitent plus sous le même statut avec les professeurs de Musique - Dessin  - Education Manuelle et Technique..) <br />
<br />
Et vous, qu'elles solutions pour recruter des prof de maths ?</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b4693/recruter-professeurs-mathematiques/</guid>
		</item>
		<item>
			<title>Charger des objets en Python depuis un fichier XML</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b2709/charger-objets-python-fichier-xml/</link>
			<pubDate>Sat, 01 Apr 2017 10:30:28 GMT</pubDate>
			<description>Dans ce billet, je vous...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Dans ce billet, je vous propose un petit composant que j'ai écrit sous la forme d'une classe très courte pour charger un catalogue d'objets depuis un fichier XML.<br />
<br />
J'ai pris le parti d'utiliser la bibliothèque standard de manipulation XML lxml pour me faciliter la tâche. Cette librairie s'installe directement avec la commande <i>pip install lxml</i> depuis toute station Unix ou Windows connectée à internet (nano PC de type raspberry compris).<br />
Voici le fichier XML que je vais parser&nbsp;: <div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code xml :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #009900;"><span style="color: #0000ff;">&lt;?xml</span> <span style="color: #339933;">version</span>=<span style="color: #FF0000;">&quot;1.0&quot;</span> <span style="color: #339933;">encoding</span>=<span style="color: #FF0000;">&quot;UTF-8&quot;</span><span style="color: #0000ff;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #0000ff;">&lt;clients<span style="color: #0000ff;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #0000ff;">&lt;client<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;nom<span style="color: #0000ff;">&gt;</span></span></span>
            Ponsable
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/nom<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;prenom<span style="color: #0000ff;">&gt;</span></span></span>
            Th&eacute;r&egrave;se
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/prenom<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;email<span style="color: #0000ff;">&gt;</span></span></span>
            &quot;therese.ponsable@dumatos.org&quot;
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/email<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;tel<span style="color: #0000ff;">&gt;</span></span></span>
            &quot;01020304&quot;
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/tel<span style="color: #0000ff;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #0000ff;">&lt;/client<span style="color: #0000ff;">&gt;</span></span></span>
     <span style="color: #009900;"><span style="color: #0000ff;">&lt;client<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;nom<span style="color: #0000ff;">&gt;</span></span></span>
            Rambo
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/nom<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;prenom<span style="color: #0000ff;">&gt;</span></span></span>
            John
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/prenom<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;email<span style="color: #0000ff;">&gt;</span></span></span>
            &quot;rambo@biscotos.org&quot;
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/email<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;tel<span style="color: #0000ff;">&gt;</span></span></span>
            &quot;12356498&quot;
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/tel<span style="color: #0000ff;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #0000ff;">&lt;/client<span style="color: #0000ff;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #0000ff;">&lt;client<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;nom<span style="color: #0000ff;">&gt;</span></span></span>
            Rocky
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/nom<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;prenom<span style="color: #0000ff;">&gt;</span></span></span>
            Balboa
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/prenom<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;email<span style="color: #0000ff;">&gt;</span></span></span>
            &quot;Rocky@baston.org&quot;
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/email<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;tel<span style="color: #0000ff;">&gt;</span></span></span>
            &quot;12356498&quot;
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/tel<span style="color: #0000ff;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #0000ff;">&lt;/client<span style="color: #0000ff;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #0000ff;">&lt;client<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;nom<span style="color: #0000ff;">&gt;</span></span></span>
            Starsky
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/nom<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;prenom<span style="color: #0000ff;">&gt;</span></span></span>
            David
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/prenom<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;email<span style="color: #0000ff;">&gt;</span></span></span>
            &quot;david.starsky@guignols.org&quot;
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/email<span style="color: #0000ff;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;tel<span style="color: #0000ff;">&gt;</span></span></span>
            &quot;12356498&quot;
        <span style="color: #009900;"><span style="color: #0000ff;">&lt;/tel<span style="color: #0000ff;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #0000ff;">&lt;/client<span style="color: #0000ff;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #0000ff;">&lt;/clients<span style="color: #0000ff;">&gt;</span></span></span></pre></td></tr></table></pre>
</div>On remarque que le catalogue de clients est sous le tag &lt;clients&gt; et que chaque client possède un <i>nom</i>, un <i>prenom</i>, un <i>email</i> et un <i>telephone</i>. J'ai choisi de composer des entités XML à partir d'Element XML, mais j'aurais tout aussi bien pu utiliser des attributs. La discussion autour du choix entre attribut et élément restera en dehors du scope de ce billet.<br />
L'objectif de mon chargeur est de créer une liste d'objets Client depuis cette source XML.<br />
Voici le code source de ma classe Client&nbsp;: <div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code python :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Client :
    rang = <span style="color: #cc66cc;">0</span>
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self, nom, prenom, email, tel<span class="br0">&#41;</span>:
        Client.rang += <span style="color: #cc66cc;">1</span>
        self.ident = Client.rang
        self.nom = nom
        self.prenom = prenom
        self.email = email
        self.tel = tel
&nbsp;
    <span style="color: #0000ff;">def</span> afficher<span class="br0">&#40;</span>self<span class="br0">&#41;</span>:
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>str<span class="br0">&#40;</span>self.ident<span class="br0">&#41;</span> + <span style="color: #FF0000;">&quot; &quot;</span> + self.nom + <span style="color: #FF0000;">&quot; &quot;</span> + self.prenom + <span style="color: #FF0000;">&quot; &quot;</span> + self.email + <span style="color: #FF0000;">&quot; &quot;</span> + self.tel<span class="br0">&#41;</span></pre></td></tr></table></pre>
</div>J'ai logiquement ajouté à cet objet une méthode qui lui permet de s'afficher. Je l'ai également équipé d'un attribut static <i>rang</i> initialisé à 0 qui s'incrémente à la construction de chaque nouvelle instance, pour servir d'index dans ma collection.<br />
Voici enfin le code source de mon composant&nbsp;: <div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code python :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Carnet :
    <span style="color: #0000ff;">def</span>  <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self<span class="br0">&#41;</span>:
        self.clients = list<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">def</span> ajouter<span class="br0">&#40;</span>self, client<span class="br0">&#41;</span>:
        self.clients.append<span class="br0">&#40;</span>client<span class="br0">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">def</span> afficher<span class="br0">&#40;</span>self<span class="br0">&#41;</span>:
        <span style="color: #0000ff;">for</span> client <span style="color: #0000ff;">in</span> self.clients:
            client.afficher<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">def</span> charger<span class="br0">&#40;</span>self, nomFichier<span class="br0">&#41;</span>:
        tree = etree.parse<span class="br0">&#40;</span>nomFichier<span class="br0">&#41;</span>
        <span style="color: #0000ff;">for</span> client <span style="color: #0000ff;">in</span> tree.xpath<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;/clients/client&quot;</span><span class="br0">&#41;</span>:
            self.ajouter<span class="br0">&#40;</span>Client<span class="br0">&#40;</span>client.find<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;nom&quot;</span><span class="br0">&#41;</span>.text, client.find<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;prenom&quot;</span><span class="br0">&#41;</span>.text, client.find<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;email&quot;</span><span class="br0">&#41;</span>.text, client.find<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;tel&quot;</span><span class="br0">&#41;</span>.text<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div>Je n'utilise qu'un objet de la bibliothèque lxml&nbsp;: la classe <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">etree</span> qui me permet de parser un fichier XML et de mapper l'ensemble des éléments de mon fichier XML dans une collection Python, comme le font les langages modernes (pour feignants) tels que PowerShell.<br />
Pour le test, il suffit de charger le fichier et de l'afficher de cette façon&nbsp;:<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code python :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">carnet = Carnet<span class="br0">&#40;</span><span class="br0">&#41;</span>
carnet.charger<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;clients.xml&quot;</span><span class="br0">&#41;</span>
carnet.afficher<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div>Attention, cette petite classe est un composant de dev à modifier pour les besoins de chacun, mais ne constitue en aucun cas une source utilisable en production. En effet, aucun test de validité des valeurs du fichier XML n'est réalisé au chargement.</blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b2709/charger-objets-python-fichier-xml/</guid>
		</item>
		<item>
			<title>Créer un tableau interactif en python avec Tkinter</title>
			<link>https://www.developpez.net/forums/blogs/863457-autran/b2665/creer-tableau-interactif-python-tkinter/</link>
			<pubDate>Sun, 26 Mar 2017 21:10:46 GMT</pubDate>
			<description>Beaucoup de développeurs...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Beaucoup de développeurs Python se plaignent qu'il n'y ai pas de tableaux en Tkinter.<br />
Il faut reconnaître que Python est un beau produit très léger qui permet nativement de développer des IHM pour Windows comme UNIX. Ce qui est bien pratique pour développer sur des nano PC comme raspberry. Alors je propose cette classe qui sera adaptable sur le principe comme un composant enfichable sur une IHM Tk.<br />
Je l'utilise couramment pour charger les tableaux que j'ai chargés depuis Excel ou XML, car Python le gère très bien également et quasiment nativement.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code python :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> IHM<span class="br0">&#40;</span>Frame<span class="br0">&#41;</span>:
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self, fenetre, height, width<span class="br0">&#41;</span>:
        Frame.<span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self, fenetre<span class="br0">&#41;</span>
        self.numberLines = height
        self.numberColumns = width
        self.pack<span class="br0">&#40;</span>fill=BOTH<span class="br0">&#41;</span>
        self.data = list<span class="br0">&#40;</span><span class="br0">&#41;</span>
        <span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range<span class="br0">&#40;</span>self.numberLines<span class="br0">&#41;</span>:
            line = list<span class="br0">&#40;</span><span class="br0">&#41;</span>
            <span style="color: #0000ff;">for</span> j <span style="color: #0000ff;">in</span> range<span class="br0">&#40;</span>self.numberColumns<span class="br0">&#41;</span>:
                cell = Entry<span class="br0">&#40;</span>self<span class="br0">&#41;</span>
                cell.insert<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>
                line.append<span class="br0">&#40;</span>cell<span class="br0">&#41;</span>
                cell.grid<span class="br0">&#40;</span>row = i, column = j<span class="br0">&#41;</span>
            self.data.append<span class="br0">&#40;</span>line<span class="br0">&#41;</span>
&nbsp;
        self.results = list<span class="br0">&#40;</span><span class="br0">&#41;</span>
        <span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range<span class="br0">&#40;</span>self.numberColumns<span class="br0">&#41;</span>:
            cell = Entry<span class="br0">&#40;</span>self<span class="br0">&#41;</span>
            cell.insert<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>
            cell.grid<span class="br0">&#40;</span>row = self.numberLines, column = i<span class="br0">&#41;</span>
            self.results.append<span class="br0">&#40;</span>cell<span class="br0">&#41;</span>
        self.buttonSum =  Button<span class="br0">&#40;</span>self, text=<span style="color: #FF0000;">&quot;somme des colonnes&quot;</span>, fg=<span style="color: #FF0000;">&quot;red&quot;</span>, command=self.sumCol<span class="br0">&#41;</span>
        self.buttonSum.grid<span class="br0">&#40;</span>row = self.numberLines, column = self.numberColumns<span class="br0">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">def</span> sumCol<span class="br0">&#40;</span>self<span class="br0">&#41;</span>:
        <span style="color: #0000ff;">for</span> j <span style="color: #0000ff;">in</span> range<span class="br0">&#40;</span>self.numberColumns<span class="br0">&#41;</span>:
            result = int<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>
            <span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range<span class="br0">&#40;</span>self.numberLines<span class="br0">&#41;</span>:
                result += int<span class="br0">&#40;</span>self.data<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j<span class="br0">&#93;</span>.get<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
            self.results<span class="br0">&#91;</span>j<span class="br0">&#93;</span>.delete<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, END<span class="br0">&#41;</span>
            self.results<span class="br0">&#91;</span>j<span class="br0">&#93;</span>.insert<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, result<span class="br0">&#41;</span></pre></td></tr></table></pre>
</div>Cette classe permet de créer un tableau dynamique de dimensions variables. J'expose également une méthode pour obtenir en pied de colonne les sommes. Cet objet est hérité de la classe Frame bien connue des développeurs Tkinter. Elle prend en paramètre de construction la fenêtre dans laquelle elle viendra s’insérer ainsi que les dimensions du tableau de données.<br />
Donc dans le main on la lancerait de la façon suivante&nbsp;:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code python :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">fenetre = Tk<span class="br0">&#40;</span><span class="br0">&#41;</span>
interface = IHM<span class="br0">&#40;</span>fenetre, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>
interface.mainloop<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>autran</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/863457-autran/b2665/creer-tableau-interactif-python-tkinter/</guid>
		</item>
	</channel>
</rss>
